Options
All
  • Public
  • Public/Protected
  • All
Menu

build npm version codecov publish to npm registry

TypeScript validator

Validate your value.

How to use

  • Basic usage: validate individual values using factory
  • Application: Create checkable interface, for example
  • Advanced: Create your own validator (and PR!)

install

yarn add @cm-madlabs/ts-validator

Validate individual values using factory

Factory is utility function-kit to validate your value.

import * as tv from '@cm-madlabs/ts-validator';

const age = '22a';
const result = tv.Factory.numberFormatValidator(
    'age',
    age,
    1,
    3,
).validate();

console.log(JSON.stringify(result));
// {"isValid":false,"report":{"rawValue":"22a","attribute":"age","expected":"pattern: /^[0-9]+$/","actual":"22a"}}


// We can applicate to throw error, for example.
if (!result.isValid) {
    throw new Error(JSON.stringify(result.report));
}
// Error: {"rawValue":"22a","attribute":"age","expected":"pattern: /^[0-9]+$/","actual":"22a"}
//       at Object.<anonymous>

In application usage

In your application, we recommend you to define a validatable domain object -- embedding this validators.

examples/user-domain.ts

import * as v from '@cm-madlabs/ts-validator';
import { Validator } from '@cm-madlabs/ts-validator';
import { ValidationResult } from '@cm-madlabs/ts-validator';

export abstract class Checkable {
    readonly validator: v.Validator;

    protected constructor(validator: Validator) {
        this.validator = validator;
    }

    check(): v.ValidationResult {
        return this.validator.validate();
    }
}

export class Name extends Checkable {
    static readonly key = 'name';

    constructor(readonly value: string) {
        super(v.Factory.lengthValidator(Name.key, value, 1, 100));
        this.value = value;
    }
}

export class LoginStatus extends Checkable {
    static readonly key = 'login_status';
    static readonly possibleValue = ['LoggedIn', 'Logout'];

    constructor(readonly value: string) {
        super(
            v.Factory.containsValidator(
                LoginStatus.key,
                value,
                LoginStatus.possibleValue,
            ),
        );
        this.value = value;
    }
}

export class UserDomainObject {
    name: Name;
    type: LoginStatus;

    static of({
        name,
        status,
    }: {
        name: string;
        status: string;
    }): UserDomainObject {
        const obj = new UserDomainObject();
        obj.name = new Name(name);
        obj.type = new LoginStatus(status);
        return obj;
    }

    validateAll(): ValidationResult[] {
        return Object.values(this).map((checkable: Checkable) =>
            checkable.check(),
        );
    }
}

const user = UserDomainObject.of({
    name: 'waddy',
    status: '',
});

const validateResult: ValidationResult[] = user.validateAll();
const invalids = validateResult.filter((r) => !r.isValid);
if (invalids.length) {
    const report = JSON.stringify(invalids.map((r) => r.report));
    console.error(report);
    throw new Error(JSON.stringify(report));
} else {
    // do your stuff
    console.log('do your stuff');
}

yarn ts-node examples/user-domain.ts will raise exception.

Advanced: Create your own validator

You can define your own validator and factory.

1. Define factory

If our repository validator make sense, your task is only to define composite factory. For example, length 5 or 7 postal code validator:

import {
    CompositeValidator,
    MaxLengthValidator,
    MinLengthValidator,
    OrCompositeValidator,
    Validator,
} from '@cm-madlabs/ts-validator';

export function postalCodeValidator(value: string): Validator {
    const key = 'postal_code';
    const minFive = new MinLengthValidator(key, value, 5);
    const maxFive = new MaxLengthValidator(key, value, 5);

    const minSeven = new MinLengthValidator(key, value, 7);
    const maxSeven = new MaxLengthValidator(key, value, 7);

    const five = new CompositeValidator(minFive, maxFive);
    const seven = new CompositeValidator(minSeven, maxSeven);

    return new OrCompositeValidator(five, seven);
}

2. Define validator

Otherwise, you can also define your own Validator:

export class SjisZenkakuValidator implements Validator {
    readonly name: string;
    readonly value: string;
    readonly patternSjis: RegExp = new RegExp('^[81-9f|e0-fc]+$');

    constructor(name: string, value: string) {
        this.name = name;
        this.value = value;
    }

    validate(): ValidationResult {
        const pattern = this.patternSjis;

        function check(v: string): boolean {

            const buffer = Buffer.from(v);
            const sjisBytes = encoding.convert(buffer, 'SJIS');

            // bytes
            const byteLength = sjisBytes.length;

            // get first
            const leftByte = (sjisBytes[0] & 0xff).toString(16);

            // mulibytes && character is valid
            return byteLength === 2 && pattern.test(leftByte);
        }

        const isValid = this.value
            .split('')
            .map(check)
            .reduce((pre, cur) => pre && cur, true);

        return {
            isValid,
            report: {
                attribute: this.name,
                rawValue: this.value,
                expected: `sjis pattern: ${this.patternSjis}`,
                actual: this.value,
            },
        };
    }
}

Index

Type aliases

Report

Report: { actual: string; attribute: string; expected: string; rawValue: string }

Type declaration

  • actual: string
  • attribute: string
  • expected: string
  • rawValue: string

ValidationResult

ValidationResult: { isValid: boolean; report: Report }

Type declaration

  • isValid: boolean
  • report: Report

Variables

Const AlphanumericLowerReqExp

AlphanumericLowerReqExp: RegExp = new RegExp('^[0-9a-z]*$')

lower alpha.

Const AlphanumericReqExp

AlphanumericReqExp: RegExp = new RegExp('^[a-zA-Z0-9]*$')

alphanumeric regex.

Const AsciiRegExp

AsciiRegExp: RegExp = new RegExp('^[\\u0020-\\u007E]+$')

Ascii

Const CfnStackNameRegExp

CfnStackNameRegExp: RegExp = new RegExp('^[A-Za-z][A-Za-z0-9-]*$')

AWS CloudFormation stack name regex.

Const HtmlColorRegExp

HtmlColorRegExp: RegExp = /(#(?:[0-9a-f]{2}){2,4}$|(#[0-9a-f]{3}$)|(rgb|hsl)a?\((-?\d+%?[,\s]+){2,3}\s*[\d.]+%?\)$|black$|silver$|gray$|whitesmoke$|maroon$|red$|purple$|fuchsia$|green$|lime$|olivedrab$|yellow$|navy$|blue$|teal$|aquamarine$|orange$|aliceblue$|antiquewhite$|aqua$|azure$|beige$|bisque$|blanchedalmond$|blueviolet$|brown$|burlywood$|cadetblue$|chartreuse$|chocolate$|coral$|cornflowerblue$|cornsilk$|crimson$|currentcolor$|darkblue$|darkcyan$|darkgoldenrod$|darkgray$|darkgreen$|darkgrey$|darkkhaki$|darkmagenta$|darkolivegreen$|darkorange$|darkorchid$|darkred$|darksalmon$|darkseagreen$|darkslateblue$|darkslategray$|darkslategrey$|darkturquoise$|darkviolet$|deeppink$|deepskyblue$|dimgray$|dimgrey$|dodgerblue$|firebrick$|floralwhite$|forestgreen$|gainsboro$|ghostwhite$|goldenrod$|gold$|greenyellow$|grey$|honeydew$|hotpink$|indianred$|indigo$|ivory$|khaki$|lavenderblush$|lavender$|lawngreen$|lemonchiffon$|lightblue$|lightcoral$|lightcyan$|lightgoldenrodyellow$|lightgray$|lightgreen$|lightgrey$|lightpink$|lightsalmon$|lightseagreen$|lightskyblue$|lightslategray$|lightslategrey$|lightsteelblue$|lightyellow$|limegreen$|linen$|mediumaquamarine$|mediumblue$|mediumorchid$|mediumpurple$|mediumseagreen$|mediumslateblue$|mediumspringgreen$|mediumturquoise$|mediumvioletred$|midnightblue$|mintcream$|mistyrose$|moccasin$|navajowhite$|oldlace$|olive$|orangered$|orchid$|palegoldenrod$|palegreen$|paleturquoise$|palevioletred$|papayawhip$|peachpuff$|peru$|pink$|plum$|powderblue$|rosybrown$|royalblue$|saddlebrown$|salmon$|sandybrown$|seagreen$|seashell$|sienna$|skyblue$|slateblue$|slategray$|slategrey$|snow$|springgreen$|steelblue$|tan$|thistle$|tomato$|transparent$|turquoise$|violet$|wheat$|white$|yellowgreen$|rebeccapurple$)/i

HTML Color: #FFF, #121212

Const NumberRegExp

NumberRegExp: RegExp = new RegExp('^[0-9]+$')

number regex.

Const UUIDv4RegExp

UUIDv4RegExp: RegExp = new RegExp('[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}',)

UUIDv4 regex.

Const Utf8ZenkakuAndReturnRegExp

Utf8ZenkakuAndReturnRegExp: RegExp = new RegExp('^[^ -~。-゚]+$')

not control character nor half-width kana.

Functions

alphanumericValidator

  • alphanumericValidator(name: string, value: string, minLength: number, maxLength: number): Validator

and

containsValidator

  • containsValidator(name: string, value: string, master: string[]): Validator
  • Same as Array.includes. But we can get validation report.

    Parameters

    • name: string
    • value: string
    • master: string[]

    Returns Validator

emptyStringValidator

  • emptyStringValidator(name: string, value: string): Validator

falseValidator

  • falseValidator(name: string, value?: any): Validator

formatValidator

  • formatValidator(__namedParameters: { format: undefined | RegExp; maxLength: undefined | number; minLength: undefined | number; name: string; value: string }): Validator
  • general purpose and validator.

    Parameters

    • __namedParameters: { format: undefined | RegExp; maxLength: undefined | number; minLength: undefined | number; name: string; value: string }
      • format: undefined | RegExp
      • maxLength: undefined | number
      • minLength: undefined | number
      • name: string

        parameter name

      • value: string

        parameter value

    Returns Validator

isoDateValidator

  • isoDateValidator(name: string, value: string): Validator

lengthValidator

  • lengthValidator(name: string, value: string, minLength: number, maxLength: number): Validator
  • NotEmpty && MinLength && MaxLength

    Parameters

    • name: string
    • value: string
    • minLength: number
    • maxLength: number

    Returns Validator

literalCheckValidator

  • literalCheckValidator(name: string, value: string, ...literalTypes: string[]): Validator

notEmptyValidator

  • notEmptyValidator(name: string, value?: undefined | string): Validator

numberFormatValidator

  • numberFormatValidator(name: string, value: string, minLength: number, maxLength: number): Validator

numberRangeValidator

  • numberRangeValidator(name: string, value: string, min: number, max: number): Validator

or

uuidV4CheckValidator

  • uuidV4CheckValidator(name: string, value?: undefined | string): Validator