npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

fluid-validator

v0.0.3

Published

An object validator for handling entity validations

Downloads

2

Readme

Fluid Validator

A library for specifying object validation. Please note, this library is still under construction and is not stable yet.

Installation and Usage

Installation

npm i fluid-validator

Usage

Fluid Validator is a library that is intended to facilitate validating well defined objects. Validation is done through an opt-in approach so you only have to write validations for what you want on your object. For the best experience, use with a Typescript project since the validator properties can infer the property names and types.

ES6

import {Validator} from 'fluid-validator';

interface User {
  firstName: string;
  lastName?: string;
  age: number;
}

const user: User = {
  firstName: 'hello',
  lastName: 'world',
  age: 28,
};

const userValidator = new Validator<User>()
  .property('firstName', (firstName) => firstName.maxLength(30).minLength())
  .property('lastName', (lastName) => lastName.isUndefined())
  .property('age', (age) => age.greaterThanOrEqual(18))
  .build();

const result = userValidator.validate(user);

Validator Methods

property(propertyName: string, (propertyValue) => void) Defines a property to begin writing validation rules. The property name in the first argument must correspond to a property that exists on the object. The second argument is a lambda which provides access to the value associated with that property in order to call the appropriate validation method(s). The name of the argument in the lambda does not need to correspond with the property name.

new Validator<User>().property('firstName', (fn) => fn.maxLength(4));

build() Acts as a method that blocks any additional rules from being specified. This method is provided to allow creating a validation lambda which can "lock" the validator from further modification in order to only allow the validate method to be called after. This is done to allow a single validator instance to be used multiple times.

const userValidator = new Validator<User>()
  .property('firstName', (fn) => fn.maxLength(50))
  .build();
const result = userValidator.validate(someUser);

validate(instanceToValidate: T, throwOnError?: boolean): ValidationResult Runs the validation of an instance which corresponds to the type allowed in the validator. This method may be called after any 'property()' call or after the 'build()' call. The validator returns an object containing a list of errors, if any, along with a shortcut property to specify if the object validated had errors or not.

const userValidator = new Validator<User>()
  .property('firstName', (fn) => fn.maxLength(50))
  .build();
const {isValid, errors} = userValidator.validate(someUser);

if (!isValid) {
  throw new Error(errors);
}
...

The second argument, 'throwOnError', is intended to allow throwing an error if any validation errors occur instead of failing silently with the errors returned.

try {
  userValidator.validate(someUser, true);
} catch (e) {
  // handle error
}

Property Validation methods

Common Validations

isNull(message?: string) Checks if a properties value is null.

prop.isNull('property was not null');

isNotNull(message?: string) Checks if a properties value is not null.

prop.isNotNull('property was null');

isUndefined(message?: string) Checks if a properties value is undefined.

prop.isUndefined('property was not undefined');

isNotUndefined(message?: string) Checks if a properties value is not undefined.

prop.isNotUndefined('property was undefined');

isCustom((propertyValue: T, context: U) => ValidationError | null) Allows the creation of a custom validation rule if custom logic is required. A lambda is required to be defined which returns a ValidationError dependent on your own custom rules. The first property of the lambda provided is the raw value of the property being validated. The second property of the lambda gives access to the entire object being validated if it is required that there is some dependent values in which you need access to.

prop.custom((value) => {
  if (value === 'hello world') {
    return {
      error: 'custom',
      property: 'prop',
      value,
      description: 'property did not equal \'hello world\'',
    };
  }
})

String Validations

maxLength(expected: number, message?: string) Checks the maximum length of a string inclusively. Can be used within any 'property()' method, as well as the arra 'forEach()' method.

prop.maxLength(20, 'string can be no more than 20 characters')

minLength(expected: number, message?: string) Checks the minimum length of a string inclusively. Can be used within any 'property()'.

prop.minLength(1, 'string can be no less than 1 character');

regex(expected: RegExp, message?: string) Checks a string against a given regular expression.

prop.regex(RegExp(/(abc)+/g), 'string did not match the given regular expression');

More to come...

Number

equal(value: number, message?: string) Checks if a number is equal in value.

prop.equal(5, 'number did not equal 5');

greaterThan(value: number, message?: string) Checks if a number is greater than a value.

prop.greaterThan(5, 'number was not greater than 5');

greaterThanOrEqual(value: number, message?: string) Checks if a number is greater than or equal to a value.

prop.greaterThan(5, 'number was not greater than or equal to 5');

lessThan(value: number, message?: string) Checks if a number is less than a value.

prop.lessThan(5, 'number was not less than 5');

lessThanOrEqual(value: number, message?: string) Checks if a number is less than or equal to a value.

prop.lessThanOrEqual(5, 'number was not less than or equal to 5');

Boolean

isTrue(message?: string) Checks if a boolean property value is true.

prop.isTrue('value should have been true');

isFalse(message?: string) Checks if a boolean property value is false.

prop.isFalse('value should have been false');

Object

property(propertyName: string, (propertyValue) => void) Defines a property to begin writing validation rules on nested properties of an object. The property name in the first argument must correspond to a property that exists on the object. The second argument is a lambda which provides access to the value associated with that property in order to call the appropriate validation method(s). The name of the argument in the lambda does not need to correspond with the property name.

outerProp.property('innerProperty', (fn) => fn.maxLength(4));

This property method is used in exactly the same manner as the one available on the Validator class directly.

Array

isEmpty(message?: string) Checks if an array is empty.

prop.isEmpty('array should have been empty');

forEach((element: T) => void, message?: string) Checks each item of an array and runs the given validation against each item. If any of the items fail validation, a validation error is generated. All validation methods are available to be used on the argument passed in from the labmda and the type is inferred.

prop.forEach((elem) => elem.maxLength(5));

Unknown

If the type cannot be inferred, such as the case when a property is unknown, there are some validation methods available as a backup. They are those found in the common section above.

Date

Coming soon...

License

GPLv3