@valkyriestudios/validator
Version: 
A lightweight configurable javascript validator
148 lines (147 loc) • 7.04 kB
TypeScript
import { isArray, isNeArray } from '@valkyriestudios/utils/array';
import { isBoolean } from '@valkyriestudios/utils/boolean';
import { isDate } from '@valkyriestudios/utils/date';
import { isFormData } from '@valkyriestudios/utils/formdata';
import { isFn, isAsyncFn } from '@valkyriestudios/utils/function';
import { isNum, isInt } from '@valkyriestudios/utils/number';
import { isObject, isNeObject } from '@valkyriestudios/utils/object';
import { isString, isNeString } from '@valkyriestudios/utils/string';
import { equal } from '@valkyriestudios/utils/equal';
import * as VR from './functions/index';
import { type DeepMutable, type GenericObject, type RulesRaw, type RuleExtension, type RuleFn, type ValidationResult, type InferredSchema, type MergeExtensions, type MappedExtensions, type TV } from './internalTypes';
declare const RULE_STORE: {
    readonly alpha_num_spaces: typeof VR.vAlphaNumSpaces;
    readonly alpha_num_spaces_multiline: typeof VR.vAlphaNumSpacesMultiline;
    readonly array: typeof isArray;
    readonly array_ne: typeof isNeArray;
    readonly base64: typeof VR.vBase64;
    readonly between: typeof VR.vBetween;
    readonly between_inc: typeof VR.vBetweenInclusive;
    readonly blob: typeof VR.vBlob;
    readonly boolean: typeof isBoolean;
    readonly color_hex: typeof VR.vColorHex;
    readonly continent: typeof VR.vContinent;
    readonly country: typeof VR.vCountry;
    readonly country_alpha3: typeof VR.vCountryAlpha3;
    readonly cron: typeof VR.vCron;
    readonly date: typeof isDate;
    readonly date_day: typeof VR.vDateDay;
    readonly date_iso: typeof VR.vDateISO;
    readonly date_string: typeof VR.vDateString;
    readonly ean: typeof VR.vEAN;
    readonly ean_8: typeof VR.vEAN8;
    readonly ean_13: typeof VR.vEAN13;
    readonly email: typeof VR.vEmail;
    readonly equal_to: typeof equal;
    readonly false: typeof VR.vFalse;
    readonly file: typeof VR.vFile;
    readonly formdata: typeof isFormData;
    readonly function: typeof isFn;
    readonly async_function: typeof isAsyncFn;
    readonly geo_latitude: typeof VR.vGeoLatitude;
    readonly geo_longitude: typeof VR.vGeoLongitude;
    readonly greater_than: typeof VR.vGreaterThan;
    readonly greater_than_or_equal: typeof VR.vGreaterThanOrEqual;
    readonly guid: typeof VR.vGuid;
    readonly in: typeof VR.vIn;
    readonly integer: typeof isInt;
    readonly isbn: typeof VR.vISBN;
    readonly isbn_10: typeof VR.vISBN10;
    readonly isbn_13: typeof VR.vISBN13;
    readonly less_than: typeof VR.vLessThan;
    readonly less_than_or_equal: typeof VR.vLessThanOrEqual;
    readonly literal: typeof VR.vLiteral;
    readonly max: typeof VR.vLessThanOrEqual;
    readonly min: typeof VR.vGreaterThanOrEqual;
    readonly null: typeof VR.vNull;
    readonly number: typeof isNum;
    readonly object: typeof isObject;
    readonly object_ne: typeof isNeObject;
    readonly phone: typeof VR.vPhone;
    readonly size: typeof VR.vSize;
    readonly ssn: typeof VR.vSSN;
    readonly string: typeof isString;
    readonly string_ne: typeof isNeString;
    readonly sys_mac: typeof VR.vSysMac;
    readonly sys_ipv4: typeof VR.vSysIPv4;
    readonly sys_ipv6: typeof VR.vSysIPv6;
    readonly sys_ipv4_or_v6: typeof VR.vSysIPv4_or_v6;
    readonly sys_port: typeof VR.vSysPort;
    readonly time_zone: typeof VR.vTimeZone;
    readonly true: typeof VR.vTrue;
    readonly ulid: typeof VR.vUlid;
    readonly url: typeof VR.vUrl;
    readonly url_noquery: typeof VR.vUrlNoQuery;
    readonly url_img: typeof VR.vUrlImage;
    readonly url_vid: typeof VR.vUrlVideo;
    readonly url_aud: typeof VR.vUrlAudio;
    readonly url_med: typeof VR.vUrlMedia;
    readonly uuid: typeof VR.vUuid;
    readonly uuid_v1: typeof VR.vUuidV1;
    readonly uuid_v2: typeof VR.vUuidV2;
    readonly uuid_v3: typeof VR.vUuidV3;
    readonly uuid_v4: typeof VR.vUuidV4;
    readonly uuid_v5: typeof VR.vUuidV5;
    readonly gt: typeof VR.vGreaterThan;
    readonly gte: typeof VR.vGreaterThanOrEqual;
    readonly lt: typeof VR.vLessThan;
    readonly lte: typeof VR.vLessThanOrEqual;
    readonly eq: typeof equal;
    readonly '?': typeof VR.vUndefined;
};
type CustomRuleDictionary = Record<string, RuleFn>;
type RuleDictionary = typeof RULE_STORE & CustomRuleDictionary;
type CombinedRules<Extensions = {}> = typeof RULE_STORE & Extensions;
export interface IValidator<Extensions extends Record<string, unknown> = {}> {
    new <T extends GenericObject, TypedValidator = TV<T>>(schema: TypedValidator): Validator<T, Extensions>;
    readonly rules: Readonly<CombinedRules<Extensions>>;
    extend<NewExtensions extends Record<string, RuleExtension>>(extensions: NewExtensions): IValidator<MergeExtensions<Extensions, MappedExtensions<NewExtensions, typeof RULE_STORE>>>;
    create<const TSchema extends RulesRaw>(schema: TSchema): Validator<InferredSchema<TSchema, CombinedRules<Extensions>>>;
}
declare class Validator<T extends GenericObject, Extensions = {}, TypedValidator = TV<T>> {
    #private;
    constructor(schema: TypedValidator);
    /**
     * Getter for configured schema.
     * @note Using this with typeof (eg: typeof myValidator.schema) returns the type of the store
     */
    get schema(): DeepMutable<T>;
    /**
     * Checks if the provided data is valid against the validator's rules
     *
     * @param {GenericObject|FormData} raw - Raw object or FormData instance to check
     */
    check(raw: unknown): raw is typeof this['schema'];
    /**
     * Checks if a FormData instance is valid against the validator and returns its parsed
     * content as an object if it is
     *
     * @param {FormData} raw - FormData instance to check
     */
    checkForm(raw: FormData): false | this["schema"];
    /**
     * Fully validates the provided data against the validator's rules
     *
     * @param {GenericObject|FormData} raw - Raw object or FormData instance to check
     */
    validate<K extends GenericObject | FormData>(raw: K): ValidationResult;
    /**
     * Getter for the rules object on the validator
     */
    static get rules(): Readonly<RuleDictionary>;
    /**
     * Extend the Validator
     *
     * Example:
     *  Validator.extend({
     *      is_fruit: ['apple', 'pear', 'orange'],
     *      ...
     *  });
     *
     * @param {Record<string, RuleExtension>} obj - KV Map of rule extensions
     */
    static extend<const NewExtensions extends Record<string, RuleExtension>>(obj: NewExtensions): IValidator<MergeExtensions<{}, MappedExtensions<NewExtensions, typeof Validator['rules']>>>;
    static create<const TSchema extends RulesRaw | readonly RulesRaw[]>(schema: TSchema): Validator<TSchema extends readonly RulesRaw[] ? InferredSchema<TSchema[number], typeof Validator['rules']> : InferredSchema<TSchema, typeof Validator['rules']>>;
    static create<const TValidators extends readonly Validator<any>[]>(validators: TValidators): Validator<TValidators[number] extends Validator<infer U, any, any> ? U : never>;
}
export { Validator, Validator as default };