ascertain 1.1.0 → 1.2.1

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 CHANGED
@@ -101,11 +101,11 @@ const as = {
101
101
  const date = new Date(result);
102
102
  return Number.isNaN(date.valueOf()) ? asError(`Invalid value "${value}", expected a valid date format`) : date;
103
103
  },
104
- time: (value)=>{
105
- const matches = value?.match(/^(\d+)(ms|s|m|h|d|w)?$/);
104
+ time: (value, conversionFactor = 1)=>{
105
+ const matches = value?.match(/^(\d*\.?\d*)(ms|s|m|h|d|w)?$/);
106
106
  if (matches) {
107
107
  const [, amount, unit = 'ms'] = matches;
108
- return parseInt(amount, 10) * MULTIPLIERS[unit];
108
+ return parseInt(`${parseFloat(amount) * MULTIPLIERS[unit] / conversionFactor}`);
109
109
  }
110
110
  return asError(`Invalid value ${value}, expected a valid time format`);
111
111
  },
@@ -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 asError = <T>(message: string) => new TypeError(message) as unknown as T;\n\nexport const as = {\n string: (value: string | undefined): string => {\n return typeof value === 'string' ? value : asError(`Invalid value \"${value}\", expected a string`);\n },\n number: (value: string | undefined): number => {\n const result = parseFloat(value as string);\n return Number.isNaN(result) ? asError(`Invalid value ${value}, expected a valid number`) : result;\n },\n date: (value: string | undefined): Date => {\n const result = Date.parse(value as string);\n const date = new Date(result);\n return Number.isNaN(date.valueOf()) ? asError(`Invalid value \"${value}\", expected a valid date format`) : 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 asError(`Invalid value ${value}, expected a valid time format`);\n },\n boolean: (value: string | undefined): boolean =>\n /^(0|1|true|false|enabled|disabled)$/i.test(value as string)\n ? /^(1|true|enabled)$/i.test(value as string)\n : asError(`Invalid value ${value}, expected a boolean like`),\n array: (value: string | undefined, delimiter: string): string[] => value?.split?.(delimiter) ?? asError(`Invalid value ${value}, expected an array`),\n json: <T = object>(value: string | undefined): T => {\n try {\n return JSON.parse(value as string);\n } catch (e) {\n return asError(`Invalid value ${value}, expected a valid JSON string`);\n }\n },\n base64: (value: string | undefined): string => {\n try {\n return fromBase64(value as string);\n } catch (e) {\n return asError(`Invalid value ${value}, expected a valid base64 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 codeGenCollectErrors = (errorsAlias: string, code: string, extra: string = '') => `try {${code}} catch (e) {${errorsAlias}.push(e.message);${extra}}`;\nconst codeGenExpectNoErrors = (errorsAlias: string) => `if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }`;\nconst codeGenExpectNonError = (valueAlias: string, path: string) =>\n `if (${valueAlias} instanceof Error) { throw new TypeError(\\`\\${${valueAlias}.message} for path \"${path}\".\\`); }`;\nconst codeGenExpectNonNullable = (valueAlias: string, path: string) =>\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`;\nconst codeGenExpectObject = (valueAlias: string, path: string, instanceOf: string) =>\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected an instance of ${instanceOf}\\`); }`;\nconst codeGenExpectArray = (valueAlias: string, path: string) =>\n `if (!Array.isArray(${valueAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}.constructor?.name} for path \"${path}\", expected an instance of Array.\\`); }`;\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 ${codeGenExpectNoErrors(errorsAlias)}\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) => codeGenCollectErrors(errorsAlias, code, result), codeGenExpectNoErrors(errorsAlias));\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 codeGenExpectNonNullable(valueAlias, path),\n codeGenExpectObject(valueAlias, path, 'Array'),\n codeGenExpectArray(valueAlias, path),\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((s, idx) => codeGenCollectErrors(errorsAlias, codeGen(s, context, `${valueAlias}[${idx}]`, `${path}[${idx}]`))),\n codeGenExpectNoErrors(errorsAlias),\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 const code: string[] = [\n `const ${valueAlias} = ${valuePath};`,\n `const ${registryAlias} = ctx.registry[${index}];`,\n codeGenExpectNonNullable(valueAlias, path),\n ];\n if ((schema as unknown) !== Error && !(schema?.prototype instanceof Error)) {\n code.push(codeGenExpectNonError(valueAlias, path));\n }\n\n code.push(\n `if (typeof ${valueAlias} === 'object' && !(${valueAlias} instanceof ${registryAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}?.constructor?.name} for path \"${path}\", expected an instance of ${schema?.name}\\`); }`,\n `if (typeof ${valueAlias} !== 'object' && ${valueAlias}?.constructor !== ${registryAlias}) { throw new TypeError(\\`Invalid type \\${${valueAlias}?.constructor?.name} for path \"${path}\", expected type ${schema?.name}\\`); }`,\n `if (Number.isNaN(${valueAlias}?.valueOf?.())) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected a valid ${schema?.name}\\`); }`,\n );\n return code.join('\\n');\n } else if (Array.isArray(schema)) {\n const valueAlias = context.unique('v');\n const code: string[] = [\n `const ${valueAlias} = ${valuePath};`,\n codeGenExpectNonNullable(valueAlias, path),\n codeGenExpectNonError(valueAlias, path),\n codeGenExpectObject(valueAlias, path, 'Array'),\n codeGenExpectArray(valueAlias, path),\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) => `${valueAlias}.forEach((${value},${key}) => { ${codeGenCollectErrors(errorsAlias, codeGen(s, context, value, `${path}[\\${${key}}]`))} });`,\n ),\n );\n\n code.push(codeGenExpectNoErrors(errorsAlias));\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};\n${codeGenExpectNonNullable(valueAlias, path)}\n${codeGenExpectNonError(valueAlias, path)}\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 codeGenExpectNonNullable(valueAlias, path),\n codeGenExpectObject(valueAlias, path, 'Object'),\n codeGenExpectNonError(valueAlias, path),\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} = [];\n${keysAlias}.forEach(${kAlias} => { ${codeGenCollectErrors(errorsAlias, codeGen(schema[$keys], context, kAlias, `${path}[\\${${kAlias}}]`))} });\n${codeGenExpectNoErrors(errorsAlias)}\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} = [];\n${entriesAlias}.forEach(([${kAlias},${vAlias}]) => { ${codeGenCollectErrors(errorsAlias, codeGen(schema[$values], context, vAlias, `${path}[\\${${kAlias}}]`))} });\n${codeGenExpectNoErrors(errorsAlias)}\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)};\n${codeGenExpectNonError(valueAlias, path)}\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","asError","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","message","string","number","result","parseFloat","Number","isNaN","date","Date","parse","valueOf","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","codeGenCollectErrors","errorsAlias","code","extra","codeGenExpectNoErrors","codeGenExpectNonError","valueAlias","codeGenExpectNonNullable","codeGenExpectObject","instanceOf","codeGenExpectArray","codeGen","context","valuePath","map","join","reduceRight","idx","index","registryAlias","Error","prototype","Array","isArray","key","RegExp","keysAlias","kAlias","vAlias","entriesAlias","extraAlias","Object","keys","entries","undefined","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 asError = <T>(message: string) => new TypeError(message) as unknown as T;\n\nexport const as = {\n string: (value: string | undefined): string => {\n return typeof value === 'string' ? value : asError(`Invalid value \"${value}\", expected a string`);\n },\n number: (value: string | undefined): number => {\n const result = parseFloat(value as string);\n return Number.isNaN(result) ? asError(`Invalid value ${value}, expected a valid number`) : result;\n },\n date: (value: string | undefined): Date => {\n const result = Date.parse(value as string);\n const date = new Date(result);\n return Number.isNaN(date.valueOf()) ? asError(`Invalid value \"${value}\", expected a valid date format`) : date;\n },\n time: (value: string | undefined, conversionFactor = 1): number => {\n const matches = value?.match(/^(\\d*\\.?\\d*)(ms|s|m|h|d|w)?$/);\n if (matches) {\n const [, amount, unit = 'ms'] = matches;\n return parseInt(`${(parseFloat(amount) * MULTIPLIERS[unit as keyof typeof MULTIPLIERS]) / conversionFactor}`);\n }\n return asError(`Invalid value ${value}, expected a valid time format`);\n },\n boolean: (value: string | undefined): boolean =>\n /^(0|1|true|false|enabled|disabled)$/i.test(value as string)\n ? /^(1|true|enabled)$/i.test(value as string)\n : asError(`Invalid value ${value}, expected a boolean like`),\n array: (value: string | undefined, delimiter: string): string[] => value?.split?.(delimiter) ?? asError(`Invalid value ${value}, expected an array`),\n json: <T = object>(value: string | undefined): T => {\n try {\n return JSON.parse(value as string);\n } catch (e) {\n return asError(`Invalid value ${value}, expected a valid JSON string`);\n }\n },\n base64: (value: string | undefined): string => {\n try {\n return fromBase64(value as string);\n } catch (e) {\n return asError(`Invalid value ${value}, expected a valid base64 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 codeGenCollectErrors = (errorsAlias: string, code: string, extra: string = '') => `try {${code}} catch (e) {${errorsAlias}.push(e.message);${extra}}`;\nconst codeGenExpectNoErrors = (errorsAlias: string) => `if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }`;\nconst codeGenExpectNonError = (valueAlias: string, path: string) =>\n `if (${valueAlias} instanceof Error) { throw new TypeError(\\`\\${${valueAlias}.message} for path \"${path}\".\\`); }`;\nconst codeGenExpectNonNullable = (valueAlias: string, path: string) =>\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`;\nconst codeGenExpectObject = (valueAlias: string, path: string, instanceOf: string) =>\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected an instance of ${instanceOf}\\`); }`;\nconst codeGenExpectArray = (valueAlias: string, path: string) =>\n `if (!Array.isArray(${valueAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}.constructor?.name} for path \"${path}\", expected an instance of Array.\\`); }`;\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 ${codeGenExpectNoErrors(errorsAlias)}\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) => codeGenCollectErrors(errorsAlias, code, result), codeGenExpectNoErrors(errorsAlias));\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 codeGenExpectNonNullable(valueAlias, path),\n codeGenExpectObject(valueAlias, path, 'Array'),\n codeGenExpectArray(valueAlias, path),\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((s, idx) => codeGenCollectErrors(errorsAlias, codeGen(s, context, `${valueAlias}[${idx}]`, `${path}[${idx}]`))),\n codeGenExpectNoErrors(errorsAlias),\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 const code: string[] = [\n `const ${valueAlias} = ${valuePath};`,\n `const ${registryAlias} = ctx.registry[${index}];`,\n codeGenExpectNonNullable(valueAlias, path),\n ];\n if ((schema as unknown) !== Error && !(schema?.prototype instanceof Error)) {\n code.push(codeGenExpectNonError(valueAlias, path));\n }\n\n code.push(\n `if (typeof ${valueAlias} === 'object' && !(${valueAlias} instanceof ${registryAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}?.constructor?.name} for path \"${path}\", expected an instance of ${schema?.name}\\`); }`,\n `if (typeof ${valueAlias} !== 'object' && ${valueAlias}?.constructor !== ${registryAlias}) { throw new TypeError(\\`Invalid type \\${${valueAlias}?.constructor?.name} for path \"${path}\", expected type ${schema?.name}\\`); }`,\n `if (Number.isNaN(${valueAlias}?.valueOf?.())) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected a valid ${schema?.name}\\`); }`,\n );\n return code.join('\\n');\n } else if (Array.isArray(schema)) {\n const valueAlias = context.unique('v');\n const code: string[] = [\n `const ${valueAlias} = ${valuePath};`,\n codeGenExpectNonNullable(valueAlias, path),\n codeGenExpectNonError(valueAlias, path),\n codeGenExpectObject(valueAlias, path, 'Array'),\n codeGenExpectArray(valueAlias, path),\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) => `${valueAlias}.forEach((${value},${key}) => { ${codeGenCollectErrors(errorsAlias, codeGen(s, context, value, `${path}[\\${${key}}]`))} });`,\n ),\n );\n\n code.push(codeGenExpectNoErrors(errorsAlias));\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};\n${codeGenExpectNonNullable(valueAlias, path)}\n${codeGenExpectNonError(valueAlias, path)}\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 codeGenExpectNonNullable(valueAlias, path),\n codeGenExpectObject(valueAlias, path, 'Object'),\n codeGenExpectNonError(valueAlias, path),\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} = [];\n${keysAlias}.forEach(${kAlias} => { ${codeGenCollectErrors(errorsAlias, codeGen(schema[$keys], context, kAlias, `${path}[\\${${kAlias}}]`))} });\n${codeGenExpectNoErrors(errorsAlias)}\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} = [];\n${entriesAlias}.forEach(([${kAlias},${vAlias}]) => { ${codeGenCollectErrors(errorsAlias, codeGen(schema[$values], context, vAlias, `${path}[\\${${kAlias}}]`))} });\n${codeGenExpectNoErrors(errorsAlias)}\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)};\n${codeGenExpectNonError(valueAlias, path)}\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","asError","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","message","string","number","result","parseFloat","Number","isNaN","date","Date","parse","valueOf","time","conversionFactor","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","codeGenCollectErrors","errorsAlias","code","extra","codeGenExpectNoErrors","codeGenExpectNonError","valueAlias","codeGenExpectNonNullable","codeGenExpectObject","instanceOf","codeGenExpectArray","codeGen","context","valuePath","map","join","reduceRight","idx","index","registryAlias","Error","prototype","Array","isArray","key","RegExp","keysAlias","kAlias","vAlias","entriesAlias","extraAlias","Object","keys","entries","undefined","rootName","validator","Function","data"],"mappings":"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"}
package/build/index.d.ts CHANGED
@@ -33,7 +33,7 @@ export declare const as: {
33
33
  string: (value: string | undefined) => string;
34
34
  number: (value: string | undefined) => number;
35
35
  date: (value: string | undefined) => Date;
36
- time: (value: string | undefined) => number;
36
+ time: (value: string | undefined, conversionFactor?: number) => number;
37
37
  boolean: (value: string | undefined) => boolean;
38
38
  array: (value: string | undefined, delimiter: string) => string[];
39
39
  json: <T = object>(value: string | undefined) => T;
package/build/index.js CHANGED
@@ -50,11 +50,11 @@ export const as = {
50
50
  const date = new Date(result);
51
51
  return Number.isNaN(date.valueOf()) ? asError(`Invalid value "${value}", expected a valid date format`) : date;
52
52
  },
53
- time: (value)=>{
54
- const matches = value?.match(/^(\d+)(ms|s|m|h|d|w)?$/);
53
+ time: (value, conversionFactor = 1)=>{
54
+ const matches = value?.match(/^(\d*\.?\d*)(ms|s|m|h|d|w)?$/);
55
55
  if (matches) {
56
56
  const [, amount, unit = 'ms'] = matches;
57
- return parseInt(amount, 10) * MULTIPLIERS[unit];
57
+ return parseInt(`${parseFloat(amount) * MULTIPLIERS[unit] / conversionFactor}`);
58
58
  }
59
59
  return asError(`Invalid value ${value}, expected a valid time format`);
60
60
  },
@@ -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 asError = <T>(message: string) => new TypeError(message) as unknown as T;\n\nexport const as = {\n string: (value: string | undefined): string => {\n return typeof value === 'string' ? value : asError(`Invalid value \"${value}\", expected a string`);\n },\n number: (value: string | undefined): number => {\n const result = parseFloat(value as string);\n return Number.isNaN(result) ? asError(`Invalid value ${value}, expected a valid number`) : result;\n },\n date: (value: string | undefined): Date => {\n const result = Date.parse(value as string);\n const date = new Date(result);\n return Number.isNaN(date.valueOf()) ? asError(`Invalid value \"${value}\", expected a valid date format`) : 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 asError(`Invalid value ${value}, expected a valid time format`);\n },\n boolean: (value: string | undefined): boolean =>\n /^(0|1|true|false|enabled|disabled)$/i.test(value as string)\n ? /^(1|true|enabled)$/i.test(value as string)\n : asError(`Invalid value ${value}, expected a boolean like`),\n array: (value: string | undefined, delimiter: string): string[] => value?.split?.(delimiter) ?? asError(`Invalid value ${value}, expected an array`),\n json: <T = object>(value: string | undefined): T => {\n try {\n return JSON.parse(value as string);\n } catch (e) {\n return asError(`Invalid value ${value}, expected a valid JSON string`);\n }\n },\n base64: (value: string | undefined): string => {\n try {\n return fromBase64(value as string);\n } catch (e) {\n return asError(`Invalid value ${value}, expected a valid base64 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 codeGenCollectErrors = (errorsAlias: string, code: string, extra: string = '') => `try {${code}} catch (e) {${errorsAlias}.push(e.message);${extra}}`;\nconst codeGenExpectNoErrors = (errorsAlias: string) => `if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }`;\nconst codeGenExpectNonError = (valueAlias: string, path: string) =>\n `if (${valueAlias} instanceof Error) { throw new TypeError(\\`\\${${valueAlias}.message} for path \"${path}\".\\`); }`;\nconst codeGenExpectNonNullable = (valueAlias: string, path: string) =>\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`;\nconst codeGenExpectObject = (valueAlias: string, path: string, instanceOf: string) =>\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected an instance of ${instanceOf}\\`); }`;\nconst codeGenExpectArray = (valueAlias: string, path: string) =>\n `if (!Array.isArray(${valueAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}.constructor?.name} for path \"${path}\", expected an instance of Array.\\`); }`;\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 ${codeGenExpectNoErrors(errorsAlias)}\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) => codeGenCollectErrors(errorsAlias, code, result), codeGenExpectNoErrors(errorsAlias));\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 codeGenExpectNonNullable(valueAlias, path),\n codeGenExpectObject(valueAlias, path, 'Array'),\n codeGenExpectArray(valueAlias, path),\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((s, idx) => codeGenCollectErrors(errorsAlias, codeGen(s, context, `${valueAlias}[${idx}]`, `${path}[${idx}]`))),\n codeGenExpectNoErrors(errorsAlias),\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 const code: string[] = [\n `const ${valueAlias} = ${valuePath};`,\n `const ${registryAlias} = ctx.registry[${index}];`,\n codeGenExpectNonNullable(valueAlias, path),\n ];\n if ((schema as unknown) !== Error && !(schema?.prototype instanceof Error)) {\n code.push(codeGenExpectNonError(valueAlias, path));\n }\n\n code.push(\n `if (typeof ${valueAlias} === 'object' && !(${valueAlias} instanceof ${registryAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}?.constructor?.name} for path \"${path}\", expected an instance of ${schema?.name}\\`); }`,\n `if (typeof ${valueAlias} !== 'object' && ${valueAlias}?.constructor !== ${registryAlias}) { throw new TypeError(\\`Invalid type \\${${valueAlias}?.constructor?.name} for path \"${path}\", expected type ${schema?.name}\\`); }`,\n `if (Number.isNaN(${valueAlias}?.valueOf?.())) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected a valid ${schema?.name}\\`); }`,\n );\n return code.join('\\n');\n } else if (Array.isArray(schema)) {\n const valueAlias = context.unique('v');\n const code: string[] = [\n `const ${valueAlias} = ${valuePath};`,\n codeGenExpectNonNullable(valueAlias, path),\n codeGenExpectNonError(valueAlias, path),\n codeGenExpectObject(valueAlias, path, 'Array'),\n codeGenExpectArray(valueAlias, path),\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) => `${valueAlias}.forEach((${value},${key}) => { ${codeGenCollectErrors(errorsAlias, codeGen(s, context, value, `${path}[\\${${key}}]`))} });`,\n ),\n );\n\n code.push(codeGenExpectNoErrors(errorsAlias));\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};\n${codeGenExpectNonNullable(valueAlias, path)}\n${codeGenExpectNonError(valueAlias, path)}\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 codeGenExpectNonNullable(valueAlias, path),\n codeGenExpectObject(valueAlias, path, 'Object'),\n codeGenExpectNonError(valueAlias, path),\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} = [];\n${keysAlias}.forEach(${kAlias} => { ${codeGenCollectErrors(errorsAlias, codeGen(schema[$keys], context, kAlias, `${path}[\\${${kAlias}}]`))} });\n${codeGenExpectNoErrors(errorsAlias)}\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} = [];\n${entriesAlias}.forEach(([${kAlias},${vAlias}]) => { ${codeGenCollectErrors(errorsAlias, codeGen(schema[$values], context, vAlias, `${path}[\\${${kAlias}}]`))} });\n${codeGenExpectNoErrors(errorsAlias)}\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)};\n${codeGenExpectNonError(valueAlias, path)}\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","asError","message","as","string","number","result","parseFloat","Number","isNaN","date","Date","parse","valueOf","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","codeGenCollectErrors","errorsAlias","code","extra","codeGenExpectNoErrors","codeGenExpectNonError","valueAlias","codeGenExpectNonNullable","codeGenExpectObject","instanceOf","codeGenExpectArray","codeGen","context","valuePath","map","join","reduceRight","idx","index","registryAlias","Error","prototype","Array","isArray","key","RegExp","keysAlias","kAlias","vAlias","entriesAlias","extraAlias","Object","keys","entries","undefined","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 asError = <T>(message: string) => new TypeError(message) as unknown as T;\n\nexport const as = {\n string: (value: string | undefined): string => {\n return typeof value === 'string' ? value : asError(`Invalid value \"${value}\", expected a string`);\n },\n number: (value: string | undefined): number => {\n const result = parseFloat(value as string);\n return Number.isNaN(result) ? asError(`Invalid value ${value}, expected a valid number`) : result;\n },\n date: (value: string | undefined): Date => {\n const result = Date.parse(value as string);\n const date = new Date(result);\n return Number.isNaN(date.valueOf()) ? asError(`Invalid value \"${value}\", expected a valid date format`) : date;\n },\n time: (value: string | undefined, conversionFactor = 1): number => {\n const matches = value?.match(/^(\\d*\\.?\\d*)(ms|s|m|h|d|w)?$/);\n if (matches) {\n const [, amount, unit = 'ms'] = matches;\n return parseInt(`${(parseFloat(amount) * MULTIPLIERS[unit as keyof typeof MULTIPLIERS]) / conversionFactor}`);\n }\n return asError(`Invalid value ${value}, expected a valid time format`);\n },\n boolean: (value: string | undefined): boolean =>\n /^(0|1|true|false|enabled|disabled)$/i.test(value as string)\n ? /^(1|true|enabled)$/i.test(value as string)\n : asError(`Invalid value ${value}, expected a boolean like`),\n array: (value: string | undefined, delimiter: string): string[] => value?.split?.(delimiter) ?? asError(`Invalid value ${value}, expected an array`),\n json: <T = object>(value: string | undefined): T => {\n try {\n return JSON.parse(value as string);\n } catch (e) {\n return asError(`Invalid value ${value}, expected a valid JSON string`);\n }\n },\n base64: (value: string | undefined): string => {\n try {\n return fromBase64(value as string);\n } catch (e) {\n return asError(`Invalid value ${value}, expected a valid base64 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 codeGenCollectErrors = (errorsAlias: string, code: string, extra: string = '') => `try {${code}} catch (e) {${errorsAlias}.push(e.message);${extra}}`;\nconst codeGenExpectNoErrors = (errorsAlias: string) => `if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }`;\nconst codeGenExpectNonError = (valueAlias: string, path: string) =>\n `if (${valueAlias} instanceof Error) { throw new TypeError(\\`\\${${valueAlias}.message} for path \"${path}\".\\`); }`;\nconst codeGenExpectNonNullable = (valueAlias: string, path: string) =>\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`;\nconst codeGenExpectObject = (valueAlias: string, path: string, instanceOf: string) =>\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected an instance of ${instanceOf}\\`); }`;\nconst codeGenExpectArray = (valueAlias: string, path: string) =>\n `if (!Array.isArray(${valueAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}.constructor?.name} for path \"${path}\", expected an instance of Array.\\`); }`;\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 ${codeGenExpectNoErrors(errorsAlias)}\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) => codeGenCollectErrors(errorsAlias, code, result), codeGenExpectNoErrors(errorsAlias));\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 codeGenExpectNonNullable(valueAlias, path),\n codeGenExpectObject(valueAlias, path, 'Array'),\n codeGenExpectArray(valueAlias, path),\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((s, idx) => codeGenCollectErrors(errorsAlias, codeGen(s, context, `${valueAlias}[${idx}]`, `${path}[${idx}]`))),\n codeGenExpectNoErrors(errorsAlias),\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 const code: string[] = [\n `const ${valueAlias} = ${valuePath};`,\n `const ${registryAlias} = ctx.registry[${index}];`,\n codeGenExpectNonNullable(valueAlias, path),\n ];\n if ((schema as unknown) !== Error && !(schema?.prototype instanceof Error)) {\n code.push(codeGenExpectNonError(valueAlias, path));\n }\n\n code.push(\n `if (typeof ${valueAlias} === 'object' && !(${valueAlias} instanceof ${registryAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}?.constructor?.name} for path \"${path}\", expected an instance of ${schema?.name}\\`); }`,\n `if (typeof ${valueAlias} !== 'object' && ${valueAlias}?.constructor !== ${registryAlias}) { throw new TypeError(\\`Invalid type \\${${valueAlias}?.constructor?.name} for path \"${path}\", expected type ${schema?.name}\\`); }`,\n `if (Number.isNaN(${valueAlias}?.valueOf?.())) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected a valid ${schema?.name}\\`); }`,\n );\n return code.join('\\n');\n } else if (Array.isArray(schema)) {\n const valueAlias = context.unique('v');\n const code: string[] = [\n `const ${valueAlias} = ${valuePath};`,\n codeGenExpectNonNullable(valueAlias, path),\n codeGenExpectNonError(valueAlias, path),\n codeGenExpectObject(valueAlias, path, 'Array'),\n codeGenExpectArray(valueAlias, path),\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) => `${valueAlias}.forEach((${value},${key}) => { ${codeGenCollectErrors(errorsAlias, codeGen(s, context, value, `${path}[\\${${key}}]`))} });`,\n ),\n );\n\n code.push(codeGenExpectNoErrors(errorsAlias));\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};\n${codeGenExpectNonNullable(valueAlias, path)}\n${codeGenExpectNonError(valueAlias, path)}\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 codeGenExpectNonNullable(valueAlias, path),\n codeGenExpectObject(valueAlias, path, 'Object'),\n codeGenExpectNonError(valueAlias, path),\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} = [];\n${keysAlias}.forEach(${kAlias} => { ${codeGenCollectErrors(errorsAlias, codeGen(schema[$keys], context, kAlias, `${path}[\\${${kAlias}}]`))} });\n${codeGenExpectNoErrors(errorsAlias)}\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} = [];\n${entriesAlias}.forEach(([${kAlias},${vAlias}]) => { ${codeGenCollectErrors(errorsAlias, codeGen(schema[$values], context, vAlias, `${path}[\\${${kAlias}}]`))} });\n${codeGenExpectNoErrors(errorsAlias)}\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)};\n${codeGenExpectNonError(valueAlias, path)}\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","asError","message","as","string","number","result","parseFloat","Number","isNaN","date","Date","parse","valueOf","time","conversionFactor","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","codeGenCollectErrors","errorsAlias","code","extra","codeGenExpectNoErrors","codeGenExpectNonError","valueAlias","codeGenExpectNonNullable","codeGenExpectObject","instanceOf","codeGenExpectArray","codeGen","context","valuePath","map","join","reduceRight","idx","index","registryAlias","Error","prototype","Array","isArray","key","RegExp","keysAlias","kAlias","vAlias","entriesAlias","extraAlias","Object","keys","entries","undefined","compile","rootName","validator","Function","data","ascertain"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ascertain",
3
- "version": "1.1.0",
3
+ "version": "1.2.1",
4
4
  "description": "0-Deps, simple, fast, for browser and node js object schema validator",
5
5
  "type": "module",
6
6
  "types": "build/index.d.ts",
@@ -14,6 +14,13 @@
14
14
  "build",
15
15
  "src/index.js"
16
16
  ],
17
+ "scripts": {
18
+ "build": "rm -rf build && NODE_ENV=production inop src/ build -i __tests__ && tsc --declaration --emitDeclarationOnly",
19
+ "lint": "eslint src",
20
+ "test": "NODE_ENV=test jest --bail",
21
+ "test:cov": "CI=1 NODE_ENV=test jest",
22
+ "prepare": "husky"
23
+ },
17
24
  "repository": {
18
25
  "type": "git",
19
26
  "url": "git+https://github.com/3axap4eHko/ascertain.git"
@@ -39,29 +46,24 @@
39
46
  "homepage": "https://github.com/3axap4eHko/ascertain#readme",
40
47
  "devDependencies": {
41
48
  "@eslint/eslintrc": "^3.1.0",
42
- "@eslint/js": "^9.7.0",
49
+ "@eslint/js": "^9.8.0",
43
50
  "@swc/jest": "^0.2.36",
44
51
  "@types/jest": "^29.5.12",
45
- "@types/node": "^20.14.10",
46
- "@typescript-eslint/eslint-plugin": "^7.16.0",
47
- "@typescript-eslint/parser": "^7.16.0",
48
- "eslint": "^9.7.0",
52
+ "@types/node": "^20.14.14",
53
+ "@typescript-eslint/eslint-plugin": "^7.18.0",
54
+ "@typescript-eslint/parser": "^7.18.0",
55
+ "eslint": "^9.8.0",
49
56
  "eslint-config-airbnb-base": "^15.0.0",
50
57
  "eslint-config-prettier": "^9.1.0",
51
58
  "eslint-plugin-import": "^2.29.1",
52
- "eslint-plugin-prettier": "^5.1.3",
53
- "husky": "^9.0.11",
59
+ "eslint-plugin-prettier": "^5.2.1",
60
+ "husky": "^9.1.4",
54
61
  "inop": "^0.7.4",
55
62
  "jest": "^29.7.0",
56
63
  "overtake": "^0.1.1",
57
64
  "prettier": "^3.3.3",
58
65
  "ts-node": "^10.9.2",
59
- "typescript": "^5.5.3"
66
+ "typescript": "^5.5.4"
60
67
  },
61
- "scripts": {
62
- "build": "rm -rf build && NODE_ENV=production inop src/ build -i __tests__ && tsc --declaration --emitDeclarationOnly",
63
- "lint": "eslint src",
64
- "test": "NODE_ENV=test jest --bail",
65
- "test:cov": "CI=1 NODE_ENV=test jest"
66
- }
67
- }
68
+ "packageManager": "pnpm@9.7.0"
69
+ }