ascertain 1.0.3 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/index.cjs.map +1 -1
- package/build/index.d.ts +8 -8
- package/build/index.js.map +1 -1
- package/package.json +1 -1
package/build/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["abstract class Operator<T> {\n constructor(public readonly schemas: Schema<T>[]) {\n if (schemas.length === 0) {\n throw new TypeError(`Operation schema ${this.constructor.name} must have at least one element`);\n }\n }\n}\n\nexport const $keys = Symbol.for('@@keys');\nexport const $values = Symbol.for('@@values');\nexport const $strict = Symbol.for('@@strict');\n\nexport type Schema<T> =\n T extends Record<string | number | symbol, unknown>\n ? { [K in keyof T]?: Schema<T[K]> | unknown } & { [$keys]?: Schema<keyof T> } & { [$values]?: Schema<T[keyof T]> } & { [$strict]?: boolean }\n : T extends Array<infer A>\n ? Schema<A>[] | unknown\n : unknown;\n\nclass Or<T> extends Operator<T> {}\nexport const or = <T>(...schemas: Schema<T>[]) => new Or(schemas);\n\nclass And<T> extends Operator<T> {}\nexport const and = <T>(...schemas: Schema<T>[]) => new And(schemas);\n\nclass Optional<T> extends Operator<T> {\n constructor(schema: Schema<T>) {\n super([schema]);\n }\n}\nexport const optional = <T>(schema: Schema<T>) => new Optional(schema);\n\nclass Tuple<T> extends Operator<T> {}\nexport const tuple = <T>(...schemas: Schema<T>[]) => new Tuple(schemas);\n\nexport const fromBase64 = typeof Buffer === 'undefined' ? (value: string) => atob(value) : (value: string) => Buffer.from(value, 'base64').toString('utf-8');\n\nconst MULTIPLIERS = {\n ms: 1,\n s: 1000,\n m: 60000,\n h: 3600000,\n d: 86400000,\n w: 604800000,\n};\n\nexport const as = {\n string: (value: string | undefined) => {\n return typeof value === 'string' ? value : undefined;\n },\n number: (value: string | undefined) => {\n const result = parseFloat(value as string);\n return Number.isFinite(result) ? result : undefined;\n },\n date: (value: string | undefined) => {\n const result = Date.parse(value as string);\n return Number.isFinite(result) ? new Date(result) : undefined;\n },\n time: (value: string | undefined) => {\n const matches = value?.match(/^(\\d+)(ms|s|m|h|d|w)?$/);\n if (matches) {\n const [, amount, unit = 'ms'] = matches;\n return parseInt(amount, 10) * MULTIPLIERS[unit as keyof typeof MULTIPLIERS];\n }\n return undefined;\n },\n boolean: (value: string | undefined) =>\n /^(0|1|true|false|enabled|disabled)$/i.test(value as string) ? /^(1|true|enabled)$/i.test(value as string) : undefined,\n array: (value: string | undefined, delimiter: string) => value?.split?.(delimiter) ?? undefined,\n json: (value: string | undefined) => {\n try {\n return JSON.parse(value as string);\n } catch (e) {\n return undefined;\n }\n },\n base64: (value: string | undefined) => {\n try {\n return fromBase64(value as string);\n } catch (e) {\n return undefined;\n }\n },\n};\n\nexport interface ErrorFormatter {\n (value: unknown, expected: unknown, path: string, subject: string): string;\n}\n\nexport const formatError: ErrorFormatter = (value, expected, path, subject) =>\n `Invalid ${subject} ${JSON.stringify(value)} for path ${path}, expected ${expected}.`;\n\nclass Context {\n public readonly registry: unknown[] = [];\n private varIndex = 0;\n\n register(value: unknown): number {\n if (!this.registry.includes(value)) {\n this.registry.push(value);\n }\n return this.registry.indexOf(value);\n }\n\n unique(prefix: string) {\n return `${prefix}$$${this.varIndex++}`;\n }\n}\n\nconst codeGen = <T>(schema: Schema<T>, context: Context, valuePath: string, path: string): string => {\n if (schema instanceof And) {\n const valueAlias = context.unique('v');\n const errorsAlias = context.unique('err');\n const code = schema.schemas.map((s) => `try { ${codeGen(s, context, valueAlias, path)} } catch (e) { ${errorsAlias}.push(e.message); }`).join('\\n');\n return `// And\n const ${errorsAlias} = [];\n const ${valueAlias} = ${valuePath};\n ${code}\n if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }\n`;\n } else if (schema instanceof Or) {\n const valueAlias = context.unique('v');\n const errorsAlias = context.unique('err');\n const code = schema.schemas\n .map((s) => codeGen(s, context, valueAlias, path))\n .reduceRight((result, code) => `try {${code}} catch (e) {${errorsAlias}.push(e.message);${result}}`, `throw new TypeError(${errorsAlias}.join('\\\\n'));`);\n return `// Or\nconst ${errorsAlias} = [];\nconst ${valueAlias} = ${valuePath};\n${code}\n `;\n } else if (schema instanceof Optional) {\n const valueAlias = context.unique('v');\n return `// Optional\nconst ${valueAlias} = ${valuePath};\nif (${valueAlias} !== undefined && ${valueAlias} !== null) { ${codeGen(schema.schemas[0], context, valueAlias, path)} }\n`;\n } else if (schema instanceof Tuple) {\n const valueAlias = context.unique('v');\n const errorsAlias = context.unique('err');\n const code: string[] = [\n '// Tuple',\n `const ${valueAlias} = ${valuePath};`,\n `const ${errorsAlias} = [];`,\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`,\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected an instance of Array\\`); }`,\n `if (!Array.isArray(${valueAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}.constructor?.name} for path \"${path}\", expected an instance of Array.\\`); }`,\n `if (${valueAlias}.length > ${schema.schemas.length}) { throw new TypeError(\\`Invalid tuple length \\${${valueAlias}.length} for path \"${path}\", expected ${schema.schemas.length}.\\`); }`,\n ...schema.schemas.map(\n (s, idx) => `try { ${codeGen(s, context, `${valueAlias}[${idx}]`, `${path}[${idx}]`)} } catch (e) { ${errorsAlias}.push(e.message); }`,\n ),\n `if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }`,\n ];\n return code.join('\\n');\n } else if (typeof schema === 'function') {\n const index = context.register(schema);\n const valueAlias = context.unique('v');\n const registryAlias = context.unique('r');\n return `\nconst ${valueAlias} = ${valuePath};\nconst ${registryAlias} = ctx.registry[${index}];\nif (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }\nif (typeof ${valueAlias} === 'object' && !(${valueAlias} instanceof ${registryAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}?.constructor?.name} for path \"${path}\", expected an instance of ${schema?.name}\\`); }\nif (typeof ${valueAlias} !== 'object' && ${valueAlias}?.constructor !== ${registryAlias}) { throw new TypeError(\\`Invalid type \\${${valueAlias}?.constructor?.name} for path \"${path}\", expected type ${schema?.name}\\`); }\n`;\n } else if (Array.isArray(schema)) {\n const valueAlias = context.unique('v');\n const code: string[] = [\n `const ${valueAlias} = ${valuePath};`,\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`,\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected an instance of Array.\\`); }`,\n `if (!Array.isArray(${valueAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}.constructor?.name} for path \"${path}\", expected an instance of Array.\\`); }`,\n ];\n if (schema.length > 0) {\n const value = context.unique('val');\n const key = context.unique('key');\n const errorsAlias = context.unique('err');\n code.push(`const ${errorsAlias} = [];`);\n code.push(\n ...schema.map(\n (s) =>\n `${valueAlias}.forEach((${value},${key}) => { try { ${codeGen(s, context, value, `${path}[\\${${key}}]`)} } catch(e){ ${errorsAlias}.push(e.message); } });`,\n ),\n );\n\n code.push(`if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }`);\n }\n return code.join('\\n');\n } else if (typeof schema === 'object' && schema !== null) {\n if (schema instanceof RegExp) {\n const valueAlias = context.unique('v');\n return `\nconst ${valueAlias} = ${valuePath};\nif (!${schema.toString()}.test('' + ${valueAlias})) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected to match ${schema.toString()}\\`); }\n`;\n } else {\n const valueAlias = context.unique('v');\n const code: string[] = [\n `const ${valueAlias} = ${valuePath};`,\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`,\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected type is object.\\`); }`,\n ];\n if ($keys in schema) {\n const keysAlias = context.unique('k');\n const errorsAlias = context.unique('err');\n const kAlias = context.unique('k');\n code.push(`\nconst ${keysAlias} = Object.keys(${valueAlias});\nconst ${errorsAlias} = ${keysAlias}.map(${kAlias} => { try { ${codeGen(schema[$keys], context, kAlias, `${path}[\\${${kAlias}}]`)} } catch (e) { return e.message; } }).filter(Boolean);\nif (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }\n`);\n }\n if ($values in schema) {\n const vAlias = context.unique('val');\n const kAlias = context.unique('k');\n const entriesAlias = context.unique('en');\n const errorsAlias = context.unique('err');\n code.push(`\nconst ${entriesAlias} = Object.entries(${valueAlias});\nconst ${errorsAlias} = ${entriesAlias}.map(([${kAlias},${vAlias}]) => { try { ${codeGen(schema[$values], context, vAlias, `${path}[\\${${kAlias}}]`)} } catch (e) { return e.message; } }).filter(Boolean);\nif (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }\n`);\n }\n if ($strict in schema && schema[$strict]) {\n const keysAlias = context.unique('k');\n const kAlias = context.unique('k');\n const extraAlias = context.unique('ex');\n code.push(`const ${keysAlias} = new Set(${JSON.stringify(Object.keys(schema))});`);\n code.push(`const ${extraAlias} = Object.keys(${valueAlias}).filter(${kAlias} => !${keysAlias}.has(${kAlias}));`);\n code.push(`if (${extraAlias}.length !== 0) { throw new TypeError(\\`Extra properties: \\${${extraAlias}}, are not allowed for path \"${path}\"\\`); }`);\n }\n code.push(...Object.entries(schema).map(([key, s]) => codeGen(s, context, `${valueAlias}['${key}']`, `${path}.${key}`)));\n return `${code.join('\\n')}`;\n }\n } else if (typeof schema === 'symbol') {\n const index = context.register(schema);\n const valueAlias = context.unique('v');\n const registryAlias = context.unique('r');\n\n return `\nconst ${valueAlias} = ${valuePath};\nconst ${registryAlias} = ctx.registry[${index}];\nif (typeof ${valueAlias} !== 'symbol') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for \"path\", expected symbol\\`); }\nif (${valueAlias} !== ${registryAlias}) { throw new TypeError(\\`Invalid value \\${${valueAlias}.toString()} for path \"${path}\", expected ${schema.toString()}\\`); }\n `;\n } else if (schema === null || schema === undefined) {\n const valueAlias = context.unique('v');\n return `\nconst ${valueAlias} = ${valuePath};\nif (${valueAlias} !== null && ${valueAlias} !== undefined ) { throw new TypeError(\\`Invalid value ${valueAlias} for path \"${path}\", expected nullable\\`); }\n `;\n } else {\n const valueAlias = context.unique('v');\n const value = context.unique('val');\n return `\nconst ${valueAlias} = ${valuePath};\nconst ${value} = ${JSON.stringify(schema)};\nif (typeof ${valueAlias} !== '${typeof schema}') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected ${typeof schema}\\`); }\nif (${valueAlias} !== ${value}) { throw new TypeError(\\`Invalid value ${JSON.stringify(valueAlias)} for path \"${path}\", expected ${JSON.stringify(schema)}\\`); }\n`;\n }\n};\n\nexport const compile = <T>(schema: Schema<T>, rootName: string) => {\n const context = new Context();\n const code = codeGen(schema, context, 'data', rootName);\n const validator = new Function('ctx', 'data', code);\n return (data: T) => validator(context, data);\n};\n\nexport const ascertain = <T>(schema: Schema<T>, data: T, rootName = '[root]') => {\n compile(schema, rootName)(data);\n};\n"],"names":["$keys","$strict","$values","and","as","ascertain","compile","formatError","fromBase64","optional","or","tuple","Operator","constructor","schemas","length","TypeError","name","Symbol","for","Or","And","Optional","schema","Tuple","Buffer","value","atob","from","toString","MULTIPLIERS","ms","s","m","h","d","w","string","undefined","number","result","parseFloat","Number","isFinite","date","Date","parse","time","matches","match","amount","unit","parseInt","boolean","test","array","delimiter","split","json","JSON","e","base64","expected","path","subject","stringify","Context","registry","varIndex","register","includes","push","indexOf","unique","prefix","codeGen","context","valuePath","valueAlias","errorsAlias","code","map","join","reduceRight","idx","index","registryAlias","Array","isArray","key","RegExp","keysAlias","kAlias","vAlias","entriesAlias","extraAlias","Object","keys","entries","rootName","validator","Function","data"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["abstract class Operator<T> {\n constructor(public readonly schemas: Schema<T>[]) {\n if (schemas.length === 0) {\n throw new TypeError(`Operation schema ${this.constructor.name} must have at least one element`);\n }\n }\n}\n\nexport const $keys = Symbol.for('@@keys');\nexport const $values = Symbol.for('@@values');\nexport const $strict = Symbol.for('@@strict');\n\nexport type Schema<T> =\n T extends Record<string | number | symbol, unknown>\n ? { [K in keyof T]?: Schema<T[K]> | unknown } & { [$keys]?: Schema<keyof T> } & { [$values]?: Schema<T[keyof T]> } & { [$strict]?: boolean }\n : T extends Array<infer A>\n ? Schema<A>[] | unknown\n : unknown;\n\nclass Or<T> extends Operator<T> {}\nexport const or = <T>(...schemas: Schema<T>[]) => new Or(schemas);\n\nclass And<T> extends Operator<T> {}\nexport const and = <T>(...schemas: Schema<T>[]) => new And(schemas);\n\nclass Optional<T> extends Operator<T> {\n constructor(schema: Schema<T>) {\n super([schema]);\n }\n}\nexport const optional = <T>(schema: Schema<T>) => new Optional(schema);\n\nclass Tuple<T> extends Operator<T> {}\nexport const tuple = <T>(...schemas: Schema<T>[]) => new Tuple(schemas);\n\nexport const fromBase64 = typeof Buffer === 'undefined' ? (value: string) => atob(value) : (value: string) => Buffer.from(value, 'base64').toString('utf-8');\n\nconst MULTIPLIERS = {\n ms: 1,\n s: 1000,\n m: 60000,\n h: 3600000,\n d: 86400000,\n w: 604800000,\n};\n\nexport const as = {\n string: (value: string | undefined): string => {\n return typeof value === 'string' ? value : (undefined as unknown as string);\n },\n number: (value: string | undefined): number => {\n const result = parseFloat(value as string);\n return Number.isFinite(result) ? result : (undefined as unknown as number);\n },\n date: (value: string | undefined): Date => {\n const result = Date.parse(value as string);\n return Number.isFinite(result) ? new Date(result) : (undefined as unknown as Date);\n },\n time: (value: string | undefined): number => {\n const matches = value?.match(/^(\\d+)(ms|s|m|h|d|w)?$/);\n if (matches) {\n const [, amount, unit = 'ms'] = matches;\n return parseInt(amount, 10) * MULTIPLIERS[unit as keyof typeof MULTIPLIERS];\n }\n return undefined as unknown as number;\n },\n boolean: (value: string | undefined): boolean =>\n /^(0|1|true|false|enabled|disabled)$/i.test(value as string) ? /^(1|true|enabled)$/i.test(value as string) : (undefined as unknown as boolean),\n array: (value: string | undefined, delimiter: string): string[] => value?.split?.(delimiter) ?? (undefined as unknown as string[]),\n json: <T = object>(value: string | undefined): T => {\n try {\n return JSON.parse(value as string);\n } catch (e) {\n return undefined as unknown as T;\n }\n },\n base64: (value: string | undefined): string => {\n try {\n return fromBase64(value as string);\n } catch (e) {\n return undefined as unknown as string;\n }\n },\n};\n\nexport interface ErrorFormatter {\n (value: unknown, expected: unknown, path: string, subject: string): string;\n}\n\nexport const formatError: ErrorFormatter = (value, expected, path, subject) =>\n `Invalid ${subject} ${JSON.stringify(value)} for path ${path}, expected ${expected}.`;\n\nclass Context {\n public readonly registry: unknown[] = [];\n private varIndex = 0;\n\n register(value: unknown): number {\n if (!this.registry.includes(value)) {\n this.registry.push(value);\n }\n return this.registry.indexOf(value);\n }\n\n unique(prefix: string) {\n return `${prefix}$$${this.varIndex++}`;\n }\n}\n\nconst codeGen = <T>(schema: Schema<T>, context: Context, valuePath: string, path: string): string => {\n if (schema instanceof And) {\n const valueAlias = context.unique('v');\n const errorsAlias = context.unique('err');\n const code = schema.schemas.map((s) => `try { ${codeGen(s, context, valueAlias, path)} } catch (e) { ${errorsAlias}.push(e.message); }`).join('\\n');\n return `// And\n const ${errorsAlias} = [];\n const ${valueAlias} = ${valuePath};\n ${code}\n if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }\n`;\n } else if (schema instanceof Or) {\n const valueAlias = context.unique('v');\n const errorsAlias = context.unique('err');\n const code = schema.schemas\n .map((s) => codeGen(s, context, valueAlias, path))\n .reduceRight((result, code) => `try {${code}} catch (e) {${errorsAlias}.push(e.message);${result}}`, `throw new TypeError(${errorsAlias}.join('\\\\n'));`);\n return `// Or\nconst ${errorsAlias} = [];\nconst ${valueAlias} = ${valuePath};\n${code}\n `;\n } else if (schema instanceof Optional) {\n const valueAlias = context.unique('v');\n return `// Optional\nconst ${valueAlias} = ${valuePath};\nif (${valueAlias} !== undefined && ${valueAlias} !== null) { ${codeGen(schema.schemas[0], context, valueAlias, path)} }\n`;\n } else if (schema instanceof Tuple) {\n const valueAlias = context.unique('v');\n const errorsAlias = context.unique('err');\n const code: string[] = [\n '// Tuple',\n `const ${valueAlias} = ${valuePath};`,\n `const ${errorsAlias} = [];`,\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`,\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected an instance of Array\\`); }`,\n `if (!Array.isArray(${valueAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}.constructor?.name} for path \"${path}\", expected an instance of Array.\\`); }`,\n `if (${valueAlias}.length > ${schema.schemas.length}) { throw new TypeError(\\`Invalid tuple length \\${${valueAlias}.length} for path \"${path}\", expected ${schema.schemas.length}.\\`); }`,\n ...schema.schemas.map(\n (s, idx) => `try { ${codeGen(s, context, `${valueAlias}[${idx}]`, `${path}[${idx}]`)} } catch (e) { ${errorsAlias}.push(e.message); }`,\n ),\n `if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }`,\n ];\n return code.join('\\n');\n } else if (typeof schema === 'function') {\n const index = context.register(schema);\n const valueAlias = context.unique('v');\n const registryAlias = context.unique('r');\n return `\nconst ${valueAlias} = ${valuePath};\nconst ${registryAlias} = ctx.registry[${index}];\nif (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }\nif (typeof ${valueAlias} === 'object' && !(${valueAlias} instanceof ${registryAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}?.constructor?.name} for path \"${path}\", expected an instance of ${schema?.name}\\`); }\nif (typeof ${valueAlias} !== 'object' && ${valueAlias}?.constructor !== ${registryAlias}) { throw new TypeError(\\`Invalid type \\${${valueAlias}?.constructor?.name} for path \"${path}\", expected type ${schema?.name}\\`); }\n`;\n } else if (Array.isArray(schema)) {\n const valueAlias = context.unique('v');\n const code: string[] = [\n `const ${valueAlias} = ${valuePath};`,\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`,\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected an instance of Array.\\`); }`,\n `if (!Array.isArray(${valueAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}.constructor?.name} for path \"${path}\", expected an instance of Array.\\`); }`,\n ];\n if (schema.length > 0) {\n const value = context.unique('val');\n const key = context.unique('key');\n const errorsAlias = context.unique('err');\n code.push(`const ${errorsAlias} = [];`);\n code.push(\n ...schema.map(\n (s) =>\n `${valueAlias}.forEach((${value},${key}) => { try { ${codeGen(s, context, value, `${path}[\\${${key}}]`)} } catch(e){ ${errorsAlias}.push(e.message); } });`,\n ),\n );\n\n code.push(`if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }`);\n }\n return code.join('\\n');\n } else if (typeof schema === 'object' && schema !== null) {\n if (schema instanceof RegExp) {\n const valueAlias = context.unique('v');\n return `\nconst ${valueAlias} = ${valuePath};\nif (!${schema.toString()}.test('' + ${valueAlias})) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected to match ${schema.toString()}\\`); }\n`;\n } else {\n const valueAlias = context.unique('v');\n const code: string[] = [\n `const ${valueAlias} = ${valuePath};`,\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`,\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected type is object.\\`); }`,\n ];\n if ($keys in schema) {\n const keysAlias = context.unique('k');\n const errorsAlias = context.unique('err');\n const kAlias = context.unique('k');\n code.push(`\nconst ${keysAlias} = Object.keys(${valueAlias});\nconst ${errorsAlias} = ${keysAlias}.map(${kAlias} => { try { ${codeGen(schema[$keys], context, kAlias, `${path}[\\${${kAlias}}]`)} } catch (e) { return e.message; } }).filter(Boolean);\nif (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }\n`);\n }\n if ($values in schema) {\n const vAlias = context.unique('val');\n const kAlias = context.unique('k');\n const entriesAlias = context.unique('en');\n const errorsAlias = context.unique('err');\n code.push(`\nconst ${entriesAlias} = Object.entries(${valueAlias});\nconst ${errorsAlias} = ${entriesAlias}.map(([${kAlias},${vAlias}]) => { try { ${codeGen(schema[$values], context, vAlias, `${path}[\\${${kAlias}}]`)} } catch (e) { return e.message; } }).filter(Boolean);\nif (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }\n`);\n }\n if ($strict in schema && schema[$strict]) {\n const keysAlias = context.unique('k');\n const kAlias = context.unique('k');\n const extraAlias = context.unique('ex');\n code.push(`const ${keysAlias} = new Set(${JSON.stringify(Object.keys(schema))});`);\n code.push(`const ${extraAlias} = Object.keys(${valueAlias}).filter(${kAlias} => !${keysAlias}.has(${kAlias}));`);\n code.push(`if (${extraAlias}.length !== 0) { throw new TypeError(\\`Extra properties: \\${${extraAlias}}, are not allowed for path \"${path}\"\\`); }`);\n }\n code.push(...Object.entries(schema).map(([key, s]) => codeGen(s, context, `${valueAlias}['${key}']`, `${path}.${key}`)));\n return `${code.join('\\n')}`;\n }\n } else if (typeof schema === 'symbol') {\n const index = context.register(schema);\n const valueAlias = context.unique('v');\n const registryAlias = context.unique('r');\n\n return `\nconst ${valueAlias} = ${valuePath};\nconst ${registryAlias} = ctx.registry[${index}];\nif (typeof ${valueAlias} !== 'symbol') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for \"path\", expected symbol\\`); }\nif (${valueAlias} !== ${registryAlias}) { throw new TypeError(\\`Invalid value \\${${valueAlias}.toString()} for path \"${path}\", expected ${schema.toString()}\\`); }\n `;\n } else if (schema === null || schema === undefined) {\n const valueAlias = context.unique('v');\n return `\nconst ${valueAlias} = ${valuePath};\nif (${valueAlias} !== null && ${valueAlias} !== undefined ) { throw new TypeError(\\`Invalid value ${valueAlias} for path \"${path}\", expected nullable\\`); }\n `;\n } else {\n const valueAlias = context.unique('v');\n const value = context.unique('val');\n return `\nconst ${valueAlias} = ${valuePath};\nconst ${value} = ${JSON.stringify(schema)};\nif (typeof ${valueAlias} !== '${typeof schema}') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected ${typeof schema}\\`); }\nif (${valueAlias} !== ${value}) { throw new TypeError(\\`Invalid value ${JSON.stringify(valueAlias)} for path \"${path}\", expected ${JSON.stringify(schema)}\\`); }\n`;\n }\n};\n\nexport const compile = <T>(schema: Schema<T>, rootName: string) => {\n const context = new Context();\n const code = codeGen(schema, context, 'data', rootName);\n const validator = new Function('ctx', 'data', code);\n return (data: T) => validator(context, data);\n};\n\nexport const ascertain = <T>(schema: Schema<T>, data: T, rootName = '[root]') => {\n compile(schema, rootName)(data);\n};\n"],"names":["$keys","$strict","$values","and","as","ascertain","compile","formatError","fromBase64","optional","or","tuple","Operator","constructor","schemas","length","TypeError","name","Symbol","for","Or","And","Optional","schema","Tuple","Buffer","value","atob","from","toString","MULTIPLIERS","ms","s","m","h","d","w","string","undefined","number","result","parseFloat","Number","isFinite","date","Date","parse","time","matches","match","amount","unit","parseInt","boolean","test","array","delimiter","split","json","JSON","e","base64","expected","path","subject","stringify","Context","registry","varIndex","register","includes","push","indexOf","unique","prefix","codeGen","context","valuePath","valueAlias","errorsAlias","code","map","join","reduceRight","idx","index","registryAlias","Array","isArray","key","RegExp","keysAlias","kAlias","vAlias","entriesAlias","extraAlias","Object","keys","entries","rootName","validator","Function","data"],"mappings":"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"}
|
package/build/index.d.ts
CHANGED
|
@@ -29,14 +29,14 @@ declare class Tuple<T> extends Operator<T> {
|
|
|
29
29
|
export declare const tuple: <T>(...schemas: Schema<T>[]) => Tuple<T>;
|
|
30
30
|
export declare const fromBase64: (value: string) => string;
|
|
31
31
|
export declare const as: {
|
|
32
|
-
string: (value: string | undefined) => string
|
|
33
|
-
number: (value: string | undefined) => number
|
|
34
|
-
date: (value: string | undefined) => Date
|
|
35
|
-
time: (value: string | undefined) => number
|
|
36
|
-
boolean: (value: string | undefined) => boolean
|
|
37
|
-
array: (value: string | undefined, delimiter: string) => string[]
|
|
38
|
-
json: (value: string | undefined) =>
|
|
39
|
-
base64: (value: string | undefined) => string
|
|
32
|
+
string: (value: string | undefined) => string;
|
|
33
|
+
number: (value: string | undefined) => number;
|
|
34
|
+
date: (value: string | undefined) => Date;
|
|
35
|
+
time: (value: string | undefined) => number;
|
|
36
|
+
boolean: (value: string | undefined) => boolean;
|
|
37
|
+
array: (value: string | undefined, delimiter: string) => string[];
|
|
38
|
+
json: <T = object>(value: string | undefined) => T;
|
|
39
|
+
base64: (value: string | undefined) => string;
|
|
40
40
|
};
|
|
41
41
|
export interface ErrorFormatter {
|
|
42
42
|
(value: unknown, expected: unknown, path: string, subject: string): string;
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["abstract class Operator<T> {\n constructor(public readonly schemas: Schema<T>[]) {\n if (schemas.length === 0) {\n throw new TypeError(`Operation schema ${this.constructor.name} must have at least one element`);\n }\n }\n}\n\nexport const $keys = Symbol.for('@@keys');\nexport const $values = Symbol.for('@@values');\nexport const $strict = Symbol.for('@@strict');\n\nexport type Schema<T> =\n T extends Record<string | number | symbol, unknown>\n ? { [K in keyof T]?: Schema<T[K]> | unknown } & { [$keys]?: Schema<keyof T> } & { [$values]?: Schema<T[keyof T]> } & { [$strict]?: boolean }\n : T extends Array<infer A>\n ? Schema<A>[] | unknown\n : unknown;\n\nclass Or<T> extends Operator<T> {}\nexport const or = <T>(...schemas: Schema<T>[]) => new Or(schemas);\n\nclass And<T> extends Operator<T> {}\nexport const and = <T>(...schemas: Schema<T>[]) => new And(schemas);\n\nclass Optional<T> extends Operator<T> {\n constructor(schema: Schema<T>) {\n super([schema]);\n }\n}\nexport const optional = <T>(schema: Schema<T>) => new Optional(schema);\n\nclass Tuple<T> extends Operator<T> {}\nexport const tuple = <T>(...schemas: Schema<T>[]) => new Tuple(schemas);\n\nexport const fromBase64 = typeof Buffer === 'undefined' ? (value: string) => atob(value) : (value: string) => Buffer.from(value, 'base64').toString('utf-8');\n\nconst MULTIPLIERS = {\n ms: 1,\n s: 1000,\n m: 60000,\n h: 3600000,\n d: 86400000,\n w: 604800000,\n};\n\nexport const as = {\n string: (value: string | undefined) => {\n return typeof value === 'string' ? value : undefined;\n },\n number: (value: string | undefined) => {\n const result = parseFloat(value as string);\n return Number.isFinite(result) ? result : undefined;\n },\n date: (value: string | undefined) => {\n const result = Date.parse(value as string);\n return Number.isFinite(result) ? new Date(result) : undefined;\n },\n time: (value: string | undefined) => {\n const matches = value?.match(/^(\\d+)(ms|s|m|h|d|w)?$/);\n if (matches) {\n const [, amount, unit = 'ms'] = matches;\n return parseInt(amount, 10) * MULTIPLIERS[unit as keyof typeof MULTIPLIERS];\n }\n return undefined;\n },\n boolean: (value: string | undefined) =>\n /^(0|1|true|false|enabled|disabled)$/i.test(value as string) ? /^(1|true|enabled)$/i.test(value as string) : undefined,\n array: (value: string | undefined, delimiter: string) => value?.split?.(delimiter) ?? undefined,\n json: (value: string | undefined) => {\n try {\n return JSON.parse(value as string);\n } catch (e) {\n return undefined;\n }\n },\n base64: (value: string | undefined) => {\n try {\n return fromBase64(value as string);\n } catch (e) {\n return undefined;\n }\n },\n};\n\nexport interface ErrorFormatter {\n (value: unknown, expected: unknown, path: string, subject: string): string;\n}\n\nexport const formatError: ErrorFormatter = (value, expected, path, subject) =>\n `Invalid ${subject} ${JSON.stringify(value)} for path ${path}, expected ${expected}.`;\n\nclass Context {\n public readonly registry: unknown[] = [];\n private varIndex = 0;\n\n register(value: unknown): number {\n if (!this.registry.includes(value)) {\n this.registry.push(value);\n }\n return this.registry.indexOf(value);\n }\n\n unique(prefix: string) {\n return `${prefix}$$${this.varIndex++}`;\n }\n}\n\nconst codeGen = <T>(schema: Schema<T>, context: Context, valuePath: string, path: string): string => {\n if (schema instanceof And) {\n const valueAlias = context.unique('v');\n const errorsAlias = context.unique('err');\n const code = schema.schemas.map((s) => `try { ${codeGen(s, context, valueAlias, path)} } catch (e) { ${errorsAlias}.push(e.message); }`).join('\\n');\n return `// And\n const ${errorsAlias} = [];\n const ${valueAlias} = ${valuePath};\n ${code}\n if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }\n`;\n } else if (schema instanceof Or) {\n const valueAlias = context.unique('v');\n const errorsAlias = context.unique('err');\n const code = schema.schemas\n .map((s) => codeGen(s, context, valueAlias, path))\n .reduceRight((result, code) => `try {${code}} catch (e) {${errorsAlias}.push(e.message);${result}}`, `throw new TypeError(${errorsAlias}.join('\\\\n'));`);\n return `// Or\nconst ${errorsAlias} = [];\nconst ${valueAlias} = ${valuePath};\n${code}\n `;\n } else if (schema instanceof Optional) {\n const valueAlias = context.unique('v');\n return `// Optional\nconst ${valueAlias} = ${valuePath};\nif (${valueAlias} !== undefined && ${valueAlias} !== null) { ${codeGen(schema.schemas[0], context, valueAlias, path)} }\n`;\n } else if (schema instanceof Tuple) {\n const valueAlias = context.unique('v');\n const errorsAlias = context.unique('err');\n const code: string[] = [\n '// Tuple',\n `const ${valueAlias} = ${valuePath};`,\n `const ${errorsAlias} = [];`,\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`,\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected an instance of Array\\`); }`,\n `if (!Array.isArray(${valueAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}.constructor?.name} for path \"${path}\", expected an instance of Array.\\`); }`,\n `if (${valueAlias}.length > ${schema.schemas.length}) { throw new TypeError(\\`Invalid tuple length \\${${valueAlias}.length} for path \"${path}\", expected ${schema.schemas.length}.\\`); }`,\n ...schema.schemas.map(\n (s, idx) => `try { ${codeGen(s, context, `${valueAlias}[${idx}]`, `${path}[${idx}]`)} } catch (e) { ${errorsAlias}.push(e.message); }`,\n ),\n `if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }`,\n ];\n return code.join('\\n');\n } else if (typeof schema === 'function') {\n const index = context.register(schema);\n const valueAlias = context.unique('v');\n const registryAlias = context.unique('r');\n return `\nconst ${valueAlias} = ${valuePath};\nconst ${registryAlias} = ctx.registry[${index}];\nif (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }\nif (typeof ${valueAlias} === 'object' && !(${valueAlias} instanceof ${registryAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}?.constructor?.name} for path \"${path}\", expected an instance of ${schema?.name}\\`); }\nif (typeof ${valueAlias} !== 'object' && ${valueAlias}?.constructor !== ${registryAlias}) { throw new TypeError(\\`Invalid type \\${${valueAlias}?.constructor?.name} for path \"${path}\", expected type ${schema?.name}\\`); }\n`;\n } else if (Array.isArray(schema)) {\n const valueAlias = context.unique('v');\n const code: string[] = [\n `const ${valueAlias} = ${valuePath};`,\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`,\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected an instance of Array.\\`); }`,\n `if (!Array.isArray(${valueAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}.constructor?.name} for path \"${path}\", expected an instance of Array.\\`); }`,\n ];\n if (schema.length > 0) {\n const value = context.unique('val');\n const key = context.unique('key');\n const errorsAlias = context.unique('err');\n code.push(`const ${errorsAlias} = [];`);\n code.push(\n ...schema.map(\n (s) =>\n `${valueAlias}.forEach((${value},${key}) => { try { ${codeGen(s, context, value, `${path}[\\${${key}}]`)} } catch(e){ ${errorsAlias}.push(e.message); } });`,\n ),\n );\n\n code.push(`if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }`);\n }\n return code.join('\\n');\n } else if (typeof schema === 'object' && schema !== null) {\n if (schema instanceof RegExp) {\n const valueAlias = context.unique('v');\n return `\nconst ${valueAlias} = ${valuePath};\nif (!${schema.toString()}.test('' + ${valueAlias})) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected to match ${schema.toString()}\\`); }\n`;\n } else {\n const valueAlias = context.unique('v');\n const code: string[] = [\n `const ${valueAlias} = ${valuePath};`,\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`,\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected type is object.\\`); }`,\n ];\n if ($keys in schema) {\n const keysAlias = context.unique('k');\n const errorsAlias = context.unique('err');\n const kAlias = context.unique('k');\n code.push(`\nconst ${keysAlias} = Object.keys(${valueAlias});\nconst ${errorsAlias} = ${keysAlias}.map(${kAlias} => { try { ${codeGen(schema[$keys], context, kAlias, `${path}[\\${${kAlias}}]`)} } catch (e) { return e.message; } }).filter(Boolean);\nif (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }\n`);\n }\n if ($values in schema) {\n const vAlias = context.unique('val');\n const kAlias = context.unique('k');\n const entriesAlias = context.unique('en');\n const errorsAlias = context.unique('err');\n code.push(`\nconst ${entriesAlias} = Object.entries(${valueAlias});\nconst ${errorsAlias} = ${entriesAlias}.map(([${kAlias},${vAlias}]) => { try { ${codeGen(schema[$values], context, vAlias, `${path}[\\${${kAlias}}]`)} } catch (e) { return e.message; } }).filter(Boolean);\nif (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }\n`);\n }\n if ($strict in schema && schema[$strict]) {\n const keysAlias = context.unique('k');\n const kAlias = context.unique('k');\n const extraAlias = context.unique('ex');\n code.push(`const ${keysAlias} = new Set(${JSON.stringify(Object.keys(schema))});`);\n code.push(`const ${extraAlias} = Object.keys(${valueAlias}).filter(${kAlias} => !${keysAlias}.has(${kAlias}));`);\n code.push(`if (${extraAlias}.length !== 0) { throw new TypeError(\\`Extra properties: \\${${extraAlias}}, are not allowed for path \"${path}\"\\`); }`);\n }\n code.push(...Object.entries(schema).map(([key, s]) => codeGen(s, context, `${valueAlias}['${key}']`, `${path}.${key}`)));\n return `${code.join('\\n')}`;\n }\n } else if (typeof schema === 'symbol') {\n const index = context.register(schema);\n const valueAlias = context.unique('v');\n const registryAlias = context.unique('r');\n\n return `\nconst ${valueAlias} = ${valuePath};\nconst ${registryAlias} = ctx.registry[${index}];\nif (typeof ${valueAlias} !== 'symbol') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for \"path\", expected symbol\\`); }\nif (${valueAlias} !== ${registryAlias}) { throw new TypeError(\\`Invalid value \\${${valueAlias}.toString()} for path \"${path}\", expected ${schema.toString()}\\`); }\n `;\n } else if (schema === null || schema === undefined) {\n const valueAlias = context.unique('v');\n return `\nconst ${valueAlias} = ${valuePath};\nif (${valueAlias} !== null && ${valueAlias} !== undefined ) { throw new TypeError(\\`Invalid value ${valueAlias} for path \"${path}\", expected nullable\\`); }\n `;\n } else {\n const valueAlias = context.unique('v');\n const value = context.unique('val');\n return `\nconst ${valueAlias} = ${valuePath};\nconst ${value} = ${JSON.stringify(schema)};\nif (typeof ${valueAlias} !== '${typeof schema}') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected ${typeof schema}\\`); }\nif (${valueAlias} !== ${value}) { throw new TypeError(\\`Invalid value ${JSON.stringify(valueAlias)} for path \"${path}\", expected ${JSON.stringify(schema)}\\`); }\n`;\n }\n};\n\nexport const compile = <T>(schema: Schema<T>, rootName: string) => {\n const context = new Context();\n const code = codeGen(schema, context, 'data', rootName);\n const validator = new Function('ctx', 'data', code);\n return (data: T) => validator(context, data);\n};\n\nexport const ascertain = <T>(schema: Schema<T>, data: T, rootName = '[root]') => {\n compile(schema, rootName)(data);\n};\n"],"names":["Operator","constructor","schemas","length","TypeError","name","$keys","Symbol","for","$values","$strict","Or","or","And","and","Optional","schema","optional","Tuple","tuple","fromBase64","Buffer","value","atob","from","toString","MULTIPLIERS","ms","s","m","h","d","w","as","string","undefined","number","result","parseFloat","Number","isFinite","date","Date","parse","time","matches","match","amount","unit","parseInt","boolean","test","array","delimiter","split","json","JSON","e","base64","formatError","expected","path","subject","stringify","Context","registry","varIndex","register","includes","push","indexOf","unique","prefix","codeGen","context","valuePath","valueAlias","errorsAlias","code","map","join","reduceRight","idx","index","registryAlias","Array","isArray","key","RegExp","keysAlias","kAlias","vAlias","entriesAlias","extraAlias","Object","keys","entries","compile","rootName","validator","Function","data","ascertain"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["abstract class Operator<T> {\n constructor(public readonly schemas: Schema<T>[]) {\n if (schemas.length === 0) {\n throw new TypeError(`Operation schema ${this.constructor.name} must have at least one element`);\n }\n }\n}\n\nexport const $keys = Symbol.for('@@keys');\nexport const $values = Symbol.for('@@values');\nexport const $strict = Symbol.for('@@strict');\n\nexport type Schema<T> =\n T extends Record<string | number | symbol, unknown>\n ? { [K in keyof T]?: Schema<T[K]> | unknown } & { [$keys]?: Schema<keyof T> } & { [$values]?: Schema<T[keyof T]> } & { [$strict]?: boolean }\n : T extends Array<infer A>\n ? Schema<A>[] | unknown\n : unknown;\n\nclass Or<T> extends Operator<T> {}\nexport const or = <T>(...schemas: Schema<T>[]) => new Or(schemas);\n\nclass And<T> extends Operator<T> {}\nexport const and = <T>(...schemas: Schema<T>[]) => new And(schemas);\n\nclass Optional<T> extends Operator<T> {\n constructor(schema: Schema<T>) {\n super([schema]);\n }\n}\nexport const optional = <T>(schema: Schema<T>) => new Optional(schema);\n\nclass Tuple<T> extends Operator<T> {}\nexport const tuple = <T>(...schemas: Schema<T>[]) => new Tuple(schemas);\n\nexport const fromBase64 = typeof Buffer === 'undefined' ? (value: string) => atob(value) : (value: string) => Buffer.from(value, 'base64').toString('utf-8');\n\nconst MULTIPLIERS = {\n ms: 1,\n s: 1000,\n m: 60000,\n h: 3600000,\n d: 86400000,\n w: 604800000,\n};\n\nexport const as = {\n string: (value: string | undefined): string => {\n return typeof value === 'string' ? value : (undefined as unknown as string);\n },\n number: (value: string | undefined): number => {\n const result = parseFloat(value as string);\n return Number.isFinite(result) ? result : (undefined as unknown as number);\n },\n date: (value: string | undefined): Date => {\n const result = Date.parse(value as string);\n return Number.isFinite(result) ? new Date(result) : (undefined as unknown as Date);\n },\n time: (value: string | undefined): number => {\n const matches = value?.match(/^(\\d+)(ms|s|m|h|d|w)?$/);\n if (matches) {\n const [, amount, unit = 'ms'] = matches;\n return parseInt(amount, 10) * MULTIPLIERS[unit as keyof typeof MULTIPLIERS];\n }\n return undefined as unknown as number;\n },\n boolean: (value: string | undefined): boolean =>\n /^(0|1|true|false|enabled|disabled)$/i.test(value as string) ? /^(1|true|enabled)$/i.test(value as string) : (undefined as unknown as boolean),\n array: (value: string | undefined, delimiter: string): string[] => value?.split?.(delimiter) ?? (undefined as unknown as string[]),\n json: <T = object>(value: string | undefined): T => {\n try {\n return JSON.parse(value as string);\n } catch (e) {\n return undefined as unknown as T;\n }\n },\n base64: (value: string | undefined): string => {\n try {\n return fromBase64(value as string);\n } catch (e) {\n return undefined as unknown as string;\n }\n },\n};\n\nexport interface ErrorFormatter {\n (value: unknown, expected: unknown, path: string, subject: string): string;\n}\n\nexport const formatError: ErrorFormatter = (value, expected, path, subject) =>\n `Invalid ${subject} ${JSON.stringify(value)} for path ${path}, expected ${expected}.`;\n\nclass Context {\n public readonly registry: unknown[] = [];\n private varIndex = 0;\n\n register(value: unknown): number {\n if (!this.registry.includes(value)) {\n this.registry.push(value);\n }\n return this.registry.indexOf(value);\n }\n\n unique(prefix: string) {\n return `${prefix}$$${this.varIndex++}`;\n }\n}\n\nconst codeGen = <T>(schema: Schema<T>, context: Context, valuePath: string, path: string): string => {\n if (schema instanceof And) {\n const valueAlias = context.unique('v');\n const errorsAlias = context.unique('err');\n const code = schema.schemas.map((s) => `try { ${codeGen(s, context, valueAlias, path)} } catch (e) { ${errorsAlias}.push(e.message); }`).join('\\n');\n return `// And\n const ${errorsAlias} = [];\n const ${valueAlias} = ${valuePath};\n ${code}\n if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }\n`;\n } else if (schema instanceof Or) {\n const valueAlias = context.unique('v');\n const errorsAlias = context.unique('err');\n const code = schema.schemas\n .map((s) => codeGen(s, context, valueAlias, path))\n .reduceRight((result, code) => `try {${code}} catch (e) {${errorsAlias}.push(e.message);${result}}`, `throw new TypeError(${errorsAlias}.join('\\\\n'));`);\n return `// Or\nconst ${errorsAlias} = [];\nconst ${valueAlias} = ${valuePath};\n${code}\n `;\n } else if (schema instanceof Optional) {\n const valueAlias = context.unique('v');\n return `// Optional\nconst ${valueAlias} = ${valuePath};\nif (${valueAlias} !== undefined && ${valueAlias} !== null) { ${codeGen(schema.schemas[0], context, valueAlias, path)} }\n`;\n } else if (schema instanceof Tuple) {\n const valueAlias = context.unique('v');\n const errorsAlias = context.unique('err');\n const code: string[] = [\n '// Tuple',\n `const ${valueAlias} = ${valuePath};`,\n `const ${errorsAlias} = [];`,\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`,\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected an instance of Array\\`); }`,\n `if (!Array.isArray(${valueAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}.constructor?.name} for path \"${path}\", expected an instance of Array.\\`); }`,\n `if (${valueAlias}.length > ${schema.schemas.length}) { throw new TypeError(\\`Invalid tuple length \\${${valueAlias}.length} for path \"${path}\", expected ${schema.schemas.length}.\\`); }`,\n ...schema.schemas.map(\n (s, idx) => `try { ${codeGen(s, context, `${valueAlias}[${idx}]`, `${path}[${idx}]`)} } catch (e) { ${errorsAlias}.push(e.message); }`,\n ),\n `if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }`,\n ];\n return code.join('\\n');\n } else if (typeof schema === 'function') {\n const index = context.register(schema);\n const valueAlias = context.unique('v');\n const registryAlias = context.unique('r');\n return `\nconst ${valueAlias} = ${valuePath};\nconst ${registryAlias} = ctx.registry[${index}];\nif (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }\nif (typeof ${valueAlias} === 'object' && !(${valueAlias} instanceof ${registryAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}?.constructor?.name} for path \"${path}\", expected an instance of ${schema?.name}\\`); }\nif (typeof ${valueAlias} !== 'object' && ${valueAlias}?.constructor !== ${registryAlias}) { throw new TypeError(\\`Invalid type \\${${valueAlias}?.constructor?.name} for path \"${path}\", expected type ${schema?.name}\\`); }\n`;\n } else if (Array.isArray(schema)) {\n const valueAlias = context.unique('v');\n const code: string[] = [\n `const ${valueAlias} = ${valuePath};`,\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`,\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected an instance of Array.\\`); }`,\n `if (!Array.isArray(${valueAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}.constructor?.name} for path \"${path}\", expected an instance of Array.\\`); }`,\n ];\n if (schema.length > 0) {\n const value = context.unique('val');\n const key = context.unique('key');\n const errorsAlias = context.unique('err');\n code.push(`const ${errorsAlias} = [];`);\n code.push(\n ...schema.map(\n (s) =>\n `${valueAlias}.forEach((${value},${key}) => { try { ${codeGen(s, context, value, `${path}[\\${${key}}]`)} } catch(e){ ${errorsAlias}.push(e.message); } });`,\n ),\n );\n\n code.push(`if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }`);\n }\n return code.join('\\n');\n } else if (typeof schema === 'object' && schema !== null) {\n if (schema instanceof RegExp) {\n const valueAlias = context.unique('v');\n return `\nconst ${valueAlias} = ${valuePath};\nif (!${schema.toString()}.test('' + ${valueAlias})) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected to match ${schema.toString()}\\`); }\n`;\n } else {\n const valueAlias = context.unique('v');\n const code: string[] = [\n `const ${valueAlias} = ${valuePath};`,\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`,\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected type is object.\\`); }`,\n ];\n if ($keys in schema) {\n const keysAlias = context.unique('k');\n const errorsAlias = context.unique('err');\n const kAlias = context.unique('k');\n code.push(`\nconst ${keysAlias} = Object.keys(${valueAlias});\nconst ${errorsAlias} = ${keysAlias}.map(${kAlias} => { try { ${codeGen(schema[$keys], context, kAlias, `${path}[\\${${kAlias}}]`)} } catch (e) { return e.message; } }).filter(Boolean);\nif (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }\n`);\n }\n if ($values in schema) {\n const vAlias = context.unique('val');\n const kAlias = context.unique('k');\n const entriesAlias = context.unique('en');\n const errorsAlias = context.unique('err');\n code.push(`\nconst ${entriesAlias} = Object.entries(${valueAlias});\nconst ${errorsAlias} = ${entriesAlias}.map(([${kAlias},${vAlias}]) => { try { ${codeGen(schema[$values], context, vAlias, `${path}[\\${${kAlias}}]`)} } catch (e) { return e.message; } }).filter(Boolean);\nif (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }\n`);\n }\n if ($strict in schema && schema[$strict]) {\n const keysAlias = context.unique('k');\n const kAlias = context.unique('k');\n const extraAlias = context.unique('ex');\n code.push(`const ${keysAlias} = new Set(${JSON.stringify(Object.keys(schema))});`);\n code.push(`const ${extraAlias} = Object.keys(${valueAlias}).filter(${kAlias} => !${keysAlias}.has(${kAlias}));`);\n code.push(`if (${extraAlias}.length !== 0) { throw new TypeError(\\`Extra properties: \\${${extraAlias}}, are not allowed for path \"${path}\"\\`); }`);\n }\n code.push(...Object.entries(schema).map(([key, s]) => codeGen(s, context, `${valueAlias}['${key}']`, `${path}.${key}`)));\n return `${code.join('\\n')}`;\n }\n } else if (typeof schema === 'symbol') {\n const index = context.register(schema);\n const valueAlias = context.unique('v');\n const registryAlias = context.unique('r');\n\n return `\nconst ${valueAlias} = ${valuePath};\nconst ${registryAlias} = ctx.registry[${index}];\nif (typeof ${valueAlias} !== 'symbol') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for \"path\", expected symbol\\`); }\nif (${valueAlias} !== ${registryAlias}) { throw new TypeError(\\`Invalid value \\${${valueAlias}.toString()} for path \"${path}\", expected ${schema.toString()}\\`); }\n `;\n } else if (schema === null || schema === undefined) {\n const valueAlias = context.unique('v');\n return `\nconst ${valueAlias} = ${valuePath};\nif (${valueAlias} !== null && ${valueAlias} !== undefined ) { throw new TypeError(\\`Invalid value ${valueAlias} for path \"${path}\", expected nullable\\`); }\n `;\n } else {\n const valueAlias = context.unique('v');\n const value = context.unique('val');\n return `\nconst ${valueAlias} = ${valuePath};\nconst ${value} = ${JSON.stringify(schema)};\nif (typeof ${valueAlias} !== '${typeof schema}') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected ${typeof schema}\\`); }\nif (${valueAlias} !== ${value}) { throw new TypeError(\\`Invalid value ${JSON.stringify(valueAlias)} for path \"${path}\", expected ${JSON.stringify(schema)}\\`); }\n`;\n }\n};\n\nexport const compile = <T>(schema: Schema<T>, rootName: string) => {\n const context = new Context();\n const code = codeGen(schema, context, 'data', rootName);\n const validator = new Function('ctx', 'data', code);\n return (data: T) => validator(context, data);\n};\n\nexport const ascertain = <T>(schema: Schema<T>, data: T, rootName = '[root]') => {\n compile(schema, rootName)(data);\n};\n"],"names":["Operator","constructor","schemas","length","TypeError","name","$keys","Symbol","for","$values","$strict","Or","or","And","and","Optional","schema","optional","Tuple","tuple","fromBase64","Buffer","value","atob","from","toString","MULTIPLIERS","ms","s","m","h","d","w","as","string","undefined","number","result","parseFloat","Number","isFinite","date","Date","parse","time","matches","match","amount","unit","parseInt","boolean","test","array","delimiter","split","json","JSON","e","base64","formatError","expected","path","subject","stringify","Context","registry","varIndex","register","includes","push","indexOf","unique","prefix","codeGen","context","valuePath","valueAlias","errorsAlias","code","map","join","reduceRight","idx","index","registryAlias","Array","isArray","key","RegExp","keysAlias","kAlias","vAlias","entriesAlias","extraAlias","Object","keys","entries","compile","rootName","validator","Function","data","ascertain"],"mappings":"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"}
|