ascertain 1.0.4 → 1.2.0

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
@@ -24,6 +24,9 @@ _export(exports, {
24
24
  as: function() {
25
25
  return as;
26
26
  },
27
+ asError: function() {
28
+ return asError;
29
+ },
27
30
  ascertain: function() {
28
31
  return ascertain;
29
32
  },
@@ -84,40 +87,42 @@ const MULTIPLIERS = {
84
87
  d: 86400000,
85
88
  w: 604800000
86
89
  };
90
+ const asError = (message)=>new TypeError(message);
87
91
  const as = {
88
92
  string: (value)=>{
89
- return typeof value === 'string' ? value : undefined;
93
+ return typeof value === 'string' ? value : asError(`Invalid value "${value}", expected a string`);
90
94
  },
91
95
  number: (value)=>{
92
96
  const result = parseFloat(value);
93
- return Number.isFinite(result) ? result : undefined;
97
+ return Number.isNaN(result) ? asError(`Invalid value ${value}, expected a valid number`) : result;
94
98
  },
95
99
  date: (value)=>{
96
100
  const result = Date.parse(value);
97
- return Number.isFinite(result) ? new Date(result) : undefined;
101
+ const date = new Date(result);
102
+ return Number.isNaN(date.valueOf()) ? asError(`Invalid value "${value}", expected a valid date format`) : date;
98
103
  },
99
- time: (value)=>{
100
- 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)?$/);
101
106
  if (matches) {
102
107
  const [, amount, unit = 'ms'] = matches;
103
- return parseInt(amount, 10) * MULTIPLIERS[unit];
108
+ return parseInt(`${parseFloat(amount) * MULTIPLIERS[unit] / conversionFactor}`);
104
109
  }
105
- return undefined;
110
+ return asError(`Invalid value ${value}, expected a valid time format`);
106
111
  },
107
- boolean: (value)=>/^(0|1|true|false|enabled|disabled)$/i.test(value) ? /^(1|true|enabled)$/i.test(value) : undefined,
108
- array: (value, delimiter)=>value?.split?.(delimiter) ?? undefined,
112
+ boolean: (value)=>/^(0|1|true|false|enabled|disabled)$/i.test(value) ? /^(1|true|enabled)$/i.test(value) : asError(`Invalid value ${value}, expected a boolean like`),
113
+ array: (value, delimiter)=>value?.split?.(delimiter) ?? asError(`Invalid value ${value}, expected an array`),
109
114
  json: (value)=>{
110
115
  try {
111
116
  return JSON.parse(value);
112
117
  } catch (e) {
113
- return undefined;
118
+ return asError(`Invalid value ${value}, expected a valid JSON string`);
114
119
  }
115
120
  },
116
121
  base64: (value)=>{
117
122
  try {
118
123
  return fromBase64(value);
119
124
  } catch (e) {
120
- return undefined;
125
+ return asError(`Invalid value ${value}, expected a valid base64 string`);
121
126
  }
122
127
  }
123
128
  };
@@ -135,6 +140,12 @@ class Context {
135
140
  return `${prefix}$$${this.varIndex++}`;
136
141
  }
137
142
  }
143
+ const codeGenCollectErrors = (errorsAlias, code, extra = '')=>`try {${code}} catch (e) {${errorsAlias}.push(e.message);${extra}}`;
144
+ const codeGenExpectNoErrors = (errorsAlias)=>`if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\n')); }`;
145
+ const codeGenExpectNonError = (valueAlias, path)=>`if (${valueAlias} instanceof Error) { throw new TypeError(\`\${${valueAlias}.message} for path "${path}".\`); }`;
146
+ const codeGenExpectNonNullable = (valueAlias, path)=>`if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\`Invalid value \${${valueAlias}} for path "${path}", expected non-nullable.\`); }`;
147
+ const codeGenExpectObject = (valueAlias, path, instanceOf)=>`if (typeof ${valueAlias} !== 'object') { throw new TypeError(\`Invalid type \${typeof ${valueAlias}} for path "${path}", expected an instance of ${instanceOf}\`); }`;
148
+ const codeGenExpectArray = (valueAlias, path)=>`if (!Array.isArray(${valueAlias})) { throw new TypeError(\`Invalid instance of \${${valueAlias}.constructor?.name} for path "${path}", expected an instance of Array.\`); }`;
138
149
  const codeGen = (schema, context, valuePath, path)=>{
139
150
  if (schema instanceof And) {
140
151
  const valueAlias = context.unique('v');
@@ -144,12 +155,12 @@ const codeGen = (schema, context, valuePath, path)=>{
144
155
  const ${errorsAlias} = [];
145
156
  const ${valueAlias} = ${valuePath};
146
157
  ${code}
147
- if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\n')); }
158
+ ${codeGenExpectNoErrors(errorsAlias)}
148
159
  `;
149
160
  } else if (schema instanceof Or) {
150
161
  const valueAlias = context.unique('v');
151
162
  const errorsAlias = context.unique('err');
152
- const code = schema.schemas.map((s)=>codeGen(s, context, valueAlias, path)).reduceRight((result, code)=>`try {${code}} catch (e) {${errorsAlias}.push(e.message);${result}}`, `throw new TypeError(${errorsAlias}.join('\\n'));`);
163
+ const code = schema.schemas.map((s)=>codeGen(s, context, valueAlias, path)).reduceRight((result, code)=>codeGenCollectErrors(errorsAlias, code, result), codeGenExpectNoErrors(errorsAlias));
153
164
  return `// Or
154
165
  const ${errorsAlias} = [];
155
166
  const ${valueAlias} = ${valuePath};
@@ -168,40 +179,44 @@ if (${valueAlias} !== undefined && ${valueAlias} !== null) { ${codeGen(schema.sc
168
179
  '// Tuple',
169
180
  `const ${valueAlias} = ${valuePath};`,
170
181
  `const ${errorsAlias} = [];`,
171
- `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\`Invalid value \${${valueAlias}} for path "${path}", expected non-nullable.\`); }`,
172
- `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\`Invalid type \${typeof ${valueAlias}} for path "${path}", expected an instance of Array\`); }`,
173
- `if (!Array.isArray(${valueAlias})) { throw new TypeError(\`Invalid instance of \${${valueAlias}.constructor?.name} for path "${path}", expected an instance of Array.\`); }`,
182
+ codeGenExpectNonNullable(valueAlias, path),
183
+ codeGenExpectObject(valueAlias, path, 'Array'),
184
+ codeGenExpectArray(valueAlias, path),
174
185
  `if (${valueAlias}.length > ${schema.schemas.length}) { throw new TypeError(\`Invalid tuple length \${${valueAlias}.length} for path "${path}", expected ${schema.schemas.length}.\`); }`,
175
- ...schema.schemas.map((s, idx)=>`try { ${codeGen(s, context, `${valueAlias}[${idx}]`, `${path}[${idx}]`)} } catch (e) { ${errorsAlias}.push(e.message); }`),
176
- `if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\n')); }`
186
+ ...schema.schemas.map((s, idx)=>codeGenCollectErrors(errorsAlias, codeGen(s, context, `${valueAlias}[${idx}]`, `${path}[${idx}]`))),
187
+ codeGenExpectNoErrors(errorsAlias)
177
188
  ];
178
189
  return code.join('\n');
179
190
  } else if (typeof schema === 'function') {
180
191
  const index = context.register(schema);
181
192
  const valueAlias = context.unique('v');
182
193
  const registryAlias = context.unique('r');
183
- return `
184
- const ${valueAlias} = ${valuePath};
185
- const ${registryAlias} = ctx.registry[${index}];
186
- if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\`Invalid value \${${valueAlias}} for path "${path}", expected non-nullable.\`); }
187
- 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}\`); }
188
- if (typeof ${valueAlias} !== 'object' && ${valueAlias}?.constructor !== ${registryAlias}) { throw new TypeError(\`Invalid type \${${valueAlias}?.constructor?.name} for path "${path}", expected type ${schema?.name}\`); }
189
- `;
194
+ const code = [
195
+ `const ${valueAlias} = ${valuePath};`,
196
+ `const ${registryAlias} = ctx.registry[${index}];`,
197
+ codeGenExpectNonNullable(valueAlias, path)
198
+ ];
199
+ if (schema !== Error && !(schema?.prototype instanceof Error)) {
200
+ code.push(codeGenExpectNonError(valueAlias, path));
201
+ }
202
+ code.push(`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}\`); }`, `if (typeof ${valueAlias} !== 'object' && ${valueAlias}?.constructor !== ${registryAlias}) { throw new TypeError(\`Invalid type \${${valueAlias}?.constructor?.name} for path "${path}", expected type ${schema?.name}\`); }`, `if (Number.isNaN(${valueAlias}?.valueOf?.())) { throw new TypeError(\`Invalid value \${${valueAlias}} for path "${path}", expected a valid ${schema?.name}\`); }`);
203
+ return code.join('\n');
190
204
  } else if (Array.isArray(schema)) {
191
205
  const valueAlias = context.unique('v');
192
206
  const code = [
193
207
  `const ${valueAlias} = ${valuePath};`,
194
- `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\`Invalid value \${${valueAlias}} for path "${path}", expected non-nullable.\`); }`,
195
- `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\`Invalid type \${typeof ${valueAlias}} for path "${path}", expected an instance of Array.\`); }`,
196
- `if (!Array.isArray(${valueAlias})) { throw new TypeError(\`Invalid instance of \${${valueAlias}.constructor?.name} for path "${path}", expected an instance of Array.\`); }`
208
+ codeGenExpectNonNullable(valueAlias, path),
209
+ codeGenExpectNonError(valueAlias, path),
210
+ codeGenExpectObject(valueAlias, path, 'Array'),
211
+ codeGenExpectArray(valueAlias, path)
197
212
  ];
198
213
  if (schema.length > 0) {
199
214
  const value = context.unique('val');
200
215
  const key = context.unique('key');
201
216
  const errorsAlias = context.unique('err');
202
217
  code.push(`const ${errorsAlias} = [];`);
203
- code.push(...schema.map((s)=>`${valueAlias}.forEach((${value},${key}) => { try { ${codeGen(s, context, value, `${path}[\${${key}}]`)} } catch(e){ ${errorsAlias}.push(e.message); } });`));
204
- code.push(`if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\n')); }`);
218
+ code.push(...schema.map((s)=>`${valueAlias}.forEach((${value},${key}) => { ${codeGenCollectErrors(errorsAlias, codeGen(s, context, value, `${path}[\${${key}}]`))} });`));
219
+ code.push(codeGenExpectNoErrors(errorsAlias));
205
220
  }
206
221
  return code.join('\n');
207
222
  } else if (typeof schema === 'object' && schema !== null) {
@@ -209,14 +224,17 @@ if (typeof ${valueAlias} !== 'object' && ${valueAlias}?.constructor !== ${regist
209
224
  const valueAlias = context.unique('v');
210
225
  return `
211
226
  const ${valueAlias} = ${valuePath};
227
+ ${codeGenExpectNonNullable(valueAlias, path)}
228
+ ${codeGenExpectNonError(valueAlias, path)}
212
229
  if (!${schema.toString()}.test('' + ${valueAlias})) { throw new TypeError(\`Invalid value \${${valueAlias}} for path "${path}", expected to match ${schema.toString()}\`); }
213
230
  `;
214
231
  } else {
215
232
  const valueAlias = context.unique('v');
216
233
  const code = [
217
234
  `const ${valueAlias} = ${valuePath};`,
218
- `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\`Invalid value \${${valueAlias}} for path "${path}", expected non-nullable.\`); }`,
219
- `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\`Invalid type \${typeof ${valueAlias}} for path "${path}", expected type is object.\`); }`
235
+ codeGenExpectNonNullable(valueAlias, path),
236
+ codeGenExpectObject(valueAlias, path, 'Object'),
237
+ codeGenExpectNonError(valueAlias, path)
220
238
  ];
221
239
  if ($keys in schema) {
222
240
  const keysAlias = context.unique('k');
@@ -224,8 +242,9 @@ if (!${schema.toString()}.test('' + ${valueAlias})) { throw new TypeError(\`Inva
224
242
  const kAlias = context.unique('k');
225
243
  code.push(`
226
244
  const ${keysAlias} = Object.keys(${valueAlias});
227
- const ${errorsAlias} = ${keysAlias}.map(${kAlias} => { try { ${codeGen(schema[$keys], context, kAlias, `${path}[\${${kAlias}}]`)} } catch (e) { return e.message; } }).filter(Boolean);
228
- if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\n')); }
245
+ const ${errorsAlias} = [];
246
+ ${keysAlias}.forEach(${kAlias} => { ${codeGenCollectErrors(errorsAlias, codeGen(schema[$keys], context, kAlias, `${path}[\${${kAlias}}]`))} });
247
+ ${codeGenExpectNoErrors(errorsAlias)}
229
248
  `);
230
249
  }
231
250
  if ($values in schema) {
@@ -235,8 +254,9 @@ if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\n'
235
254
  const errorsAlias = context.unique('err');
236
255
  code.push(`
237
256
  const ${entriesAlias} = Object.entries(${valueAlias});
238
- const ${errorsAlias} = ${entriesAlias}.map(([${kAlias},${vAlias}]) => { try { ${codeGen(schema[$values], context, vAlias, `${path}[\${${kAlias}}]`)} } catch (e) { return e.message; } }).filter(Boolean);
239
- if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\n')); }
257
+ const ${errorsAlias} = [];
258
+ ${entriesAlias}.forEach(([${kAlias},${vAlias}]) => { ${codeGenCollectErrors(errorsAlias, codeGen(schema[$values], context, vAlias, `${path}[\${${kAlias}}]`))} });
259
+ ${codeGenExpectNoErrors(errorsAlias)}
240
260
  `);
241
261
  }
242
262
  if ($strict in schema && schema[$strict]) {
@@ -272,6 +292,7 @@ if (${valueAlias} !== null && ${valueAlias} !== undefined ) { throw new TypeErro
272
292
  return `
273
293
  const ${valueAlias} = ${valuePath};
274
294
  const ${value} = ${JSON.stringify(schema)};
295
+ ${codeGenExpectNonError(valueAlias, path)}
275
296
  if (typeof ${valueAlias} !== '${typeof schema}') { throw new TypeError(\`Invalid type \${typeof ${valueAlias}} for path "${path}", expected ${typeof schema}\`); }
276
297
  if (${valueAlias} !== ${value}) { throw new TypeError(\`Invalid value ${JSON.stringify(valueAlias)} for path "${path}", expected ${JSON.stringify(schema)}\`); }
277
298
  `;
@@ -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): 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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"}
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
@@ -28,11 +28,12 @@ declare class Tuple<T> extends Operator<T> {
28
28
  }
29
29
  export declare const tuple: <T>(...schemas: Schema<T>[]) => Tuple<T>;
30
30
  export declare const fromBase64: (value: string) => string;
31
+ export declare const asError: <T>(message: string) => T;
31
32
  export declare const as: {
32
33
  string: (value: string | undefined) => string;
33
34
  number: (value: string | undefined) => number;
34
35
  date: (value: string | undefined) => Date;
35
- time: (value: string | undefined) => number;
36
+ time: (value: string | undefined, conversionFactor?: number) => number;
36
37
  boolean: (value: string | undefined) => boolean;
37
38
  array: (value: string | undefined, delimiter: string) => string[];
38
39
  json: <T = object>(value: string | undefined) => T;
package/build/index.js CHANGED
@@ -36,40 +36,42 @@ const MULTIPLIERS = {
36
36
  d: 86400000,
37
37
  w: 604800000
38
38
  };
39
+ export const asError = (message)=>new TypeError(message);
39
40
  export const as = {
40
41
  string: (value)=>{
41
- return typeof value === 'string' ? value : undefined;
42
+ return typeof value === 'string' ? value : asError(`Invalid value "${value}", expected a string`);
42
43
  },
43
44
  number: (value)=>{
44
45
  const result = parseFloat(value);
45
- return Number.isFinite(result) ? result : undefined;
46
+ return Number.isNaN(result) ? asError(`Invalid value ${value}, expected a valid number`) : result;
46
47
  },
47
48
  date: (value)=>{
48
49
  const result = Date.parse(value);
49
- return Number.isFinite(result) ? new Date(result) : undefined;
50
+ const date = new Date(result);
51
+ return Number.isNaN(date.valueOf()) ? asError(`Invalid value "${value}", expected a valid date format`) : date;
50
52
  },
51
- time: (value)=>{
52
- 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)?$/);
53
55
  if (matches) {
54
56
  const [, amount, unit = 'ms'] = matches;
55
- return parseInt(amount, 10) * MULTIPLIERS[unit];
57
+ return parseInt(`${parseFloat(amount) * MULTIPLIERS[unit] / conversionFactor}`);
56
58
  }
57
- return undefined;
59
+ return asError(`Invalid value ${value}, expected a valid time format`);
58
60
  },
59
- boolean: (value)=>/^(0|1|true|false|enabled|disabled)$/i.test(value) ? /^(1|true|enabled)$/i.test(value) : undefined,
60
- array: (value, delimiter)=>value?.split?.(delimiter) ?? undefined,
61
+ boolean: (value)=>/^(0|1|true|false|enabled|disabled)$/i.test(value) ? /^(1|true|enabled)$/i.test(value) : asError(`Invalid value ${value}, expected a boolean like`),
62
+ array: (value, delimiter)=>value?.split?.(delimiter) ?? asError(`Invalid value ${value}, expected an array`),
61
63
  json: (value)=>{
62
64
  try {
63
65
  return JSON.parse(value);
64
66
  } catch (e) {
65
- return undefined;
67
+ return asError(`Invalid value ${value}, expected a valid JSON string`);
66
68
  }
67
69
  },
68
70
  base64: (value)=>{
69
71
  try {
70
72
  return fromBase64(value);
71
73
  } catch (e) {
72
- return undefined;
74
+ return asError(`Invalid value ${value}, expected a valid base64 string`);
73
75
  }
74
76
  }
75
77
  };
@@ -87,6 +89,12 @@ class Context {
87
89
  return `${prefix}$$${this.varIndex++}`;
88
90
  }
89
91
  }
92
+ const codeGenCollectErrors = (errorsAlias, code, extra = '')=>`try {${code}} catch (e) {${errorsAlias}.push(e.message);${extra}}`;
93
+ const codeGenExpectNoErrors = (errorsAlias)=>`if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\n')); }`;
94
+ const codeGenExpectNonError = (valueAlias, path)=>`if (${valueAlias} instanceof Error) { throw new TypeError(\`\${${valueAlias}.message} for path "${path}".\`); }`;
95
+ const codeGenExpectNonNullable = (valueAlias, path)=>`if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\`Invalid value \${${valueAlias}} for path "${path}", expected non-nullable.\`); }`;
96
+ const codeGenExpectObject = (valueAlias, path, instanceOf)=>`if (typeof ${valueAlias} !== 'object') { throw new TypeError(\`Invalid type \${typeof ${valueAlias}} for path "${path}", expected an instance of ${instanceOf}\`); }`;
97
+ const codeGenExpectArray = (valueAlias, path)=>`if (!Array.isArray(${valueAlias})) { throw new TypeError(\`Invalid instance of \${${valueAlias}.constructor?.name} for path "${path}", expected an instance of Array.\`); }`;
90
98
  const codeGen = (schema, context, valuePath, path)=>{
91
99
  if (schema instanceof And) {
92
100
  const valueAlias = context.unique('v');
@@ -96,12 +104,12 @@ const codeGen = (schema, context, valuePath, path)=>{
96
104
  const ${errorsAlias} = [];
97
105
  const ${valueAlias} = ${valuePath};
98
106
  ${code}
99
- if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\n')); }
107
+ ${codeGenExpectNoErrors(errorsAlias)}
100
108
  `;
101
109
  } else if (schema instanceof Or) {
102
110
  const valueAlias = context.unique('v');
103
111
  const errorsAlias = context.unique('err');
104
- const code = schema.schemas.map((s)=>codeGen(s, context, valueAlias, path)).reduceRight((result, code)=>`try {${code}} catch (e) {${errorsAlias}.push(e.message);${result}}`, `throw new TypeError(${errorsAlias}.join('\\n'));`);
112
+ const code = schema.schemas.map((s)=>codeGen(s, context, valueAlias, path)).reduceRight((result, code)=>codeGenCollectErrors(errorsAlias, code, result), codeGenExpectNoErrors(errorsAlias));
105
113
  return `// Or
106
114
  const ${errorsAlias} = [];
107
115
  const ${valueAlias} = ${valuePath};
@@ -120,40 +128,44 @@ if (${valueAlias} !== undefined && ${valueAlias} !== null) { ${codeGen(schema.sc
120
128
  '// Tuple',
121
129
  `const ${valueAlias} = ${valuePath};`,
122
130
  `const ${errorsAlias} = [];`,
123
- `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\`Invalid value \${${valueAlias}} for path "${path}", expected non-nullable.\`); }`,
124
- `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\`Invalid type \${typeof ${valueAlias}} for path "${path}", expected an instance of Array\`); }`,
125
- `if (!Array.isArray(${valueAlias})) { throw new TypeError(\`Invalid instance of \${${valueAlias}.constructor?.name} for path "${path}", expected an instance of Array.\`); }`,
131
+ codeGenExpectNonNullable(valueAlias, path),
132
+ codeGenExpectObject(valueAlias, path, 'Array'),
133
+ codeGenExpectArray(valueAlias, path),
126
134
  `if (${valueAlias}.length > ${schema.schemas.length}) { throw new TypeError(\`Invalid tuple length \${${valueAlias}.length} for path "${path}", expected ${schema.schemas.length}.\`); }`,
127
- ...schema.schemas.map((s, idx)=>`try { ${codeGen(s, context, `${valueAlias}[${idx}]`, `${path}[${idx}]`)} } catch (e) { ${errorsAlias}.push(e.message); }`),
128
- `if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\n')); }`
135
+ ...schema.schemas.map((s, idx)=>codeGenCollectErrors(errorsAlias, codeGen(s, context, `${valueAlias}[${idx}]`, `${path}[${idx}]`))),
136
+ codeGenExpectNoErrors(errorsAlias)
129
137
  ];
130
138
  return code.join('\n');
131
139
  } else if (typeof schema === 'function') {
132
140
  const index = context.register(schema);
133
141
  const valueAlias = context.unique('v');
134
142
  const registryAlias = context.unique('r');
135
- return `
136
- const ${valueAlias} = ${valuePath};
137
- const ${registryAlias} = ctx.registry[${index}];
138
- if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\`Invalid value \${${valueAlias}} for path "${path}", expected non-nullable.\`); }
139
- 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}\`); }
140
- if (typeof ${valueAlias} !== 'object' && ${valueAlias}?.constructor !== ${registryAlias}) { throw new TypeError(\`Invalid type \${${valueAlias}?.constructor?.name} for path "${path}", expected type ${schema?.name}\`); }
141
- `;
143
+ const code = [
144
+ `const ${valueAlias} = ${valuePath};`,
145
+ `const ${registryAlias} = ctx.registry[${index}];`,
146
+ codeGenExpectNonNullable(valueAlias, path)
147
+ ];
148
+ if (schema !== Error && !(schema?.prototype instanceof Error)) {
149
+ code.push(codeGenExpectNonError(valueAlias, path));
150
+ }
151
+ code.push(`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}\`); }`, `if (typeof ${valueAlias} !== 'object' && ${valueAlias}?.constructor !== ${registryAlias}) { throw new TypeError(\`Invalid type \${${valueAlias}?.constructor?.name} for path "${path}", expected type ${schema?.name}\`); }`, `if (Number.isNaN(${valueAlias}?.valueOf?.())) { throw new TypeError(\`Invalid value \${${valueAlias}} for path "${path}", expected a valid ${schema?.name}\`); }`);
152
+ return code.join('\n');
142
153
  } else if (Array.isArray(schema)) {
143
154
  const valueAlias = context.unique('v');
144
155
  const code = [
145
156
  `const ${valueAlias} = ${valuePath};`,
146
- `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\`Invalid value \${${valueAlias}} for path "${path}", expected non-nullable.\`); }`,
147
- `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\`Invalid type \${typeof ${valueAlias}} for path "${path}", expected an instance of Array.\`); }`,
148
- `if (!Array.isArray(${valueAlias})) { throw new TypeError(\`Invalid instance of \${${valueAlias}.constructor?.name} for path "${path}", expected an instance of Array.\`); }`
157
+ codeGenExpectNonNullable(valueAlias, path),
158
+ codeGenExpectNonError(valueAlias, path),
159
+ codeGenExpectObject(valueAlias, path, 'Array'),
160
+ codeGenExpectArray(valueAlias, path)
149
161
  ];
150
162
  if (schema.length > 0) {
151
163
  const value = context.unique('val');
152
164
  const key = context.unique('key');
153
165
  const errorsAlias = context.unique('err');
154
166
  code.push(`const ${errorsAlias} = [];`);
155
- code.push(...schema.map((s)=>`${valueAlias}.forEach((${value},${key}) => { try { ${codeGen(s, context, value, `${path}[\${${key}}]`)} } catch(e){ ${errorsAlias}.push(e.message); } });`));
156
- code.push(`if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\n')); }`);
167
+ code.push(...schema.map((s)=>`${valueAlias}.forEach((${value},${key}) => { ${codeGenCollectErrors(errorsAlias, codeGen(s, context, value, `${path}[\${${key}}]`))} });`));
168
+ code.push(codeGenExpectNoErrors(errorsAlias));
157
169
  }
158
170
  return code.join('\n');
159
171
  } else if (typeof schema === 'object' && schema !== null) {
@@ -161,14 +173,17 @@ if (typeof ${valueAlias} !== 'object' && ${valueAlias}?.constructor !== ${regist
161
173
  const valueAlias = context.unique('v');
162
174
  return `
163
175
  const ${valueAlias} = ${valuePath};
176
+ ${codeGenExpectNonNullable(valueAlias, path)}
177
+ ${codeGenExpectNonError(valueAlias, path)}
164
178
  if (!${schema.toString()}.test('' + ${valueAlias})) { throw new TypeError(\`Invalid value \${${valueAlias}} for path "${path}", expected to match ${schema.toString()}\`); }
165
179
  `;
166
180
  } else {
167
181
  const valueAlias = context.unique('v');
168
182
  const code = [
169
183
  `const ${valueAlias} = ${valuePath};`,
170
- `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\`Invalid value \${${valueAlias}} for path "${path}", expected non-nullable.\`); }`,
171
- `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\`Invalid type \${typeof ${valueAlias}} for path "${path}", expected type is object.\`); }`
184
+ codeGenExpectNonNullable(valueAlias, path),
185
+ codeGenExpectObject(valueAlias, path, 'Object'),
186
+ codeGenExpectNonError(valueAlias, path)
172
187
  ];
173
188
  if ($keys in schema) {
174
189
  const keysAlias = context.unique('k');
@@ -176,8 +191,9 @@ if (!${schema.toString()}.test('' + ${valueAlias})) { throw new TypeError(\`Inva
176
191
  const kAlias = context.unique('k');
177
192
  code.push(`
178
193
  const ${keysAlias} = Object.keys(${valueAlias});
179
- const ${errorsAlias} = ${keysAlias}.map(${kAlias} => { try { ${codeGen(schema[$keys], context, kAlias, `${path}[\${${kAlias}}]`)} } catch (e) { return e.message; } }).filter(Boolean);
180
- if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\n')); }
194
+ const ${errorsAlias} = [];
195
+ ${keysAlias}.forEach(${kAlias} => { ${codeGenCollectErrors(errorsAlias, codeGen(schema[$keys], context, kAlias, `${path}[\${${kAlias}}]`))} });
196
+ ${codeGenExpectNoErrors(errorsAlias)}
181
197
  `);
182
198
  }
183
199
  if ($values in schema) {
@@ -187,8 +203,9 @@ if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\n'
187
203
  const errorsAlias = context.unique('err');
188
204
  code.push(`
189
205
  const ${entriesAlias} = Object.entries(${valueAlias});
190
- const ${errorsAlias} = ${entriesAlias}.map(([${kAlias},${vAlias}]) => { try { ${codeGen(schema[$values], context, vAlias, `${path}[\${${kAlias}}]`)} } catch (e) { return e.message; } }).filter(Boolean);
191
- if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\n')); }
206
+ const ${errorsAlias} = [];
207
+ ${entriesAlias}.forEach(([${kAlias},${vAlias}]) => { ${codeGenCollectErrors(errorsAlias, codeGen(schema[$values], context, vAlias, `${path}[\${${kAlias}}]`))} });
208
+ ${codeGenExpectNoErrors(errorsAlias)}
192
209
  `);
193
210
  }
194
211
  if ($strict in schema && schema[$strict]) {
@@ -224,6 +241,7 @@ if (${valueAlias} !== null && ${valueAlias} !== undefined ) { throw new TypeErro
224
241
  return `
225
242
  const ${valueAlias} = ${valuePath};
226
243
  const ${value} = ${JSON.stringify(schema)};
244
+ ${codeGenExpectNonError(valueAlias, path)}
227
245
  if (typeof ${valueAlias} !== '${typeof schema}') { throw new TypeError(\`Invalid type \${typeof ${valueAlias}} for path "${path}", expected ${typeof schema}\`); }
228
246
  if (${valueAlias} !== ${value}) { throw new TypeError(\`Invalid value ${JSON.stringify(valueAlias)} for path "${path}", expected ${JSON.stringify(schema)}\`); }
229
247
  `;
@@ -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): 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":"AAAA,MAAeA;;IACbC,YAAY,AAAgBC,OAAoB,CAAE;aAAtBA,UAAAA;QAC1B,IAAIA,QAAQC,MAAM,KAAK,GAAG;YACxB,MAAM,IAAIC,UAAU,CAAC,iBAAiB,EAAE,IAAI,CAACH,WAAW,CAACI,IAAI,CAAC,+BAA+B,CAAC;QAChG;IACF;AACF;AAEA,OAAO,MAAMC,QAAQC,OAAOC,GAAG,CAAC,UAAU;AAC1C,OAAO,MAAMC,UAAUF,OAAOC,GAAG,CAAC,YAAY;AAC9C,OAAO,MAAME,UAAUH,OAAOC,GAAG,CAAC,YAAY;AAS9C,MAAMG,WAAcX;AAAa;AACjC,OAAO,MAAMY,KAAK,CAAI,GAAGV,UAAyB,IAAIS,GAAGT,SAAS;AAElE,MAAMW,YAAeb;AAAa;AAClC,OAAO,MAAMc,MAAM,CAAI,GAAGZ,UAAyB,IAAIW,IAAIX,SAAS;AAEpE,MAAMa,iBAAoBf;IACxBC,YAAYe,MAAiB,CAAE;QAC7B,KAAK,CAAC;YAACA;SAAO;IAChB;AACF;AACA,OAAO,MAAMC,WAAW,CAAID,SAAsB,IAAID,SAASC,QAAQ;AAEvE,MAAME,cAAiBlB;AAAa;AACpC,OAAO,MAAMmB,QAAQ,CAAI,GAAGjB,UAAyB,IAAIgB,MAAMhB,SAAS;AAExE,OAAO,MAAMkB,aAAa,OAAOC,WAAW,cAAc,CAACC,QAAkBC,KAAKD,SAAS,CAACA,QAAkBD,OAAOG,IAAI,CAACF,OAAO,UAAUG,QAAQ,CAAC,SAAS;AAE7J,MAAMC,cAAc;IAClBC,IAAI;IACJC,GAAG;IACHC,GAAG;IACHC,GAAG;IACHC,GAAG;IACHC,GAAG;AACL;AAEA,OAAO,MAAMC,KAAK;IAChBC,QAAQ,CAACZ;QACP,OAAO,OAAOA,UAAU,WAAWA,QAASa;IAC9C;IACAC,QAAQ,CAACd;QACP,MAAMe,SAASC,WAAWhB;QAC1B,OAAOiB,OAAOC,QAAQ,CAACH,UAAUA,SAAUF;IAC7C;IACAM,MAAM,CAACnB;QACL,MAAMe,SAASK,KAAKC,KAAK,CAACrB;QAC1B,OAAOiB,OAAOC,QAAQ,CAACH,UAAU,IAAIK,KAAKL,UAAWF;IACvD;IACAS,MAAM,CAACtB;QACL,MAAMuB,UAAUvB,OAAOwB,MAAM;QAC7B,IAAID,SAAS;YACX,MAAM,GAAGE,QAAQC,OAAO,IAAI,CAAC,GAAGH;YAChC,OAAOI,SAASF,QAAQ,MAAMrB,WAAW,CAACsB,KAAiC;QAC7E;QACA,OAAOb;IACT;IACAe,SAAS,CAAC5B,QACR,uCAAuC6B,IAAI,CAAC7B,SAAmB,sBAAsB6B,IAAI,CAAC7B,SAAoBa;IAChHiB,OAAO,CAAC9B,OAA2B+B,YAAgC/B,OAAOgC,QAAQD,cAAelB;IACjGoB,MAAM,CAAajC;QACjB,IAAI;YACF,OAAOkC,KAAKb,KAAK,CAACrB;QACpB,EAAE,OAAOmC,GAAG;YACV,OAAOtB;QACT;IACF;IACAuB,QAAQ,CAACpC;QACP,IAAI;YACF,OAAOF,WAAWE;QACpB,EAAE,OAAOmC,GAAG;YACV,OAAOtB;QACT;IACF;AACF,EAAE;AAMF,OAAO,MAAMwB,cAA8B,CAACrC,OAAOsC,UAAUC,MAAMC,UACjE,CAAC,QAAQ,EAAEA,QAAQ,CAAC,EAAEN,KAAKO,SAAS,CAACzC,OAAO,UAAU,EAAEuC,KAAK,WAAW,EAAED,SAAS,CAAC,CAAC,CAAC;AAExF,MAAMI;IACYC,WAAsB,EAAE,CAAC;IACjCC,WAAW,EAAE;IAErBC,SAAS7C,KAAc,EAAU;QAC/B,IAAI,CAAC,IAAI,CAAC2C,QAAQ,CAACG,QAAQ,CAAC9C,QAAQ;YAClC,IAAI,CAAC2C,QAAQ,CAACI,IAAI,CAAC/C;QACrB;QACA,OAAO,IAAI,CAAC2C,QAAQ,CAACK,OAAO,CAAChD;IAC/B;IAEAiD,OAAOC,MAAc,EAAE;QACrB,OAAO,CAAC,EAAEA,OAAO,EAAE,EAAE,IAAI,CAACN,QAAQ,GAAG,CAAC;IACxC;AACF;AAEA,MAAMO,UAAU,CAAIzD,QAAmB0D,SAAkBC,WAAmBd;IAC1E,IAAI7C,kBAAkBH,KAAK;QACzB,MAAM+D,aAAaF,QAAQH,MAAM,CAAC;QAClC,MAAMM,cAAcH,QAAQH,MAAM,CAAC;QACnC,MAAMO,OAAO9D,OAAOd,OAAO,CAAC6E,GAAG,CAAC,CAACnD,IAAM,CAAC,MAAM,EAAE6C,QAAQ7C,GAAG8C,SAASE,YAAYf,MAAM,eAAe,EAAEgB,YAAY,mBAAmB,CAAC,EAAEG,IAAI,CAAC;QAC9I,OAAO,CAAC;QACJ,EAAEH,YAAY;QACd,EAAED,WAAW,GAAG,EAAED,UAAU;EAClC,EAAEG,KAAK;MACH,EAAED,YAAY,qCAAqC,EAAEA,YAAY;AACvE,CAAC;IACC,OAAO,IAAI7D,kBAAkBL,IAAI;QAC/B,MAAMiE,aAAaF,QAAQH,MAAM,CAAC;QAClC,MAAMM,cAAcH,QAAQH,MAAM,CAAC;QACnC,MAAMO,OAAO9D,OAAOd,OAAO,CACxB6E,GAAG,CAAC,CAACnD,IAAM6C,QAAQ7C,GAAG8C,SAASE,YAAYf,OAC3CoB,WAAW,CAAC,CAAC5C,QAAQyC,OAAS,CAAC,KAAK,EAAEA,KAAK,aAAa,EAAED,YAAY,iBAAiB,EAAExC,OAAO,CAAC,CAAC,EAAE,CAAC,oBAAoB,EAAEwC,YAAY,cAAc,CAAC;QACzJ,OAAO,CAAC;MACN,EAAEA,YAAY;MACd,EAAED,WAAW,GAAG,EAAED,UAAU;AAClC,EAAEG,KAAK;IACH,CAAC;IACH,OAAO,IAAI9D,kBAAkBD,UAAU;QACrC,MAAM6D,aAAaF,QAAQH,MAAM,CAAC;QAClC,OAAO,CAAC;MACN,EAAEK,WAAW,GAAG,EAAED,UAAU;IAC9B,EAAEC,WAAW,kBAAkB,EAAEA,WAAW,aAAa,EAAEH,QAAQzD,OAAOd,OAAO,CAAC,EAAE,EAAEwE,SAASE,YAAYf,MAAM;AACrH,CAAC;IACC,OAAO,IAAI7C,kBAAkBE,OAAO;QAClC,MAAM0D,aAAaF,QAAQH,MAAM,CAAC;QAClC,MAAMM,cAAcH,QAAQH,MAAM,CAAC;QACnC,MAAMO,OAAiB;YACrB;YACA,CAAC,MAAM,EAAEF,WAAW,GAAG,EAAED,UAAU,CAAC,CAAC;YACrC,CAAC,MAAM,EAAEE,YAAY,MAAM,CAAC;YAC5B,CAAC,IAAI,EAAED,WAAW,aAAa,EAAEA,WAAW,yDAAyD,EAAEA,WAAW,YAAY,EAAEf,KAAK,+BAA+B,CAAC;YACrK,CAAC,WAAW,EAAEe,WAAW,8DAA8D,EAAEA,WAAW,YAAY,EAAEf,KAAK,sCAAsC,CAAC;YAC9J,CAAC,mBAAmB,EAAEe,WAAW,kDAAkD,EAAEA,WAAW,8BAA8B,EAAEf,KAAK,uCAAuC,CAAC;YAC7K,CAAC,IAAI,EAAEe,WAAW,UAAU,EAAE5D,OAAOd,OAAO,CAACC,MAAM,CAAC,kDAAkD,EAAEyE,WAAW,mBAAmB,EAAEf,KAAK,YAAY,EAAE7C,OAAOd,OAAO,CAACC,MAAM,CAAC,OAAO,CAAC;eACtLa,OAAOd,OAAO,CAAC6E,GAAG,CACnB,CAACnD,GAAGsD,MAAQ,CAAC,MAAM,EAAET,QAAQ7C,GAAG8C,SAAS,CAAC,EAAEE,WAAW,CAAC,EAAEM,IAAI,CAAC,CAAC,EAAE,CAAC,EAAErB,KAAK,CAAC,EAAEqB,IAAI,CAAC,CAAC,EAAE,eAAe,EAAEL,YAAY,mBAAmB,CAAC;YAExI,CAAC,IAAI,EAAEA,YAAY,qCAAqC,EAAEA,YAAY,gBAAgB,CAAC;SACxF;QACD,OAAOC,KAAKE,IAAI,CAAC;IACnB,OAAO,IAAI,OAAOhE,WAAW,YAAY;QACvC,MAAMmE,QAAQT,QAAQP,QAAQ,CAACnD;QAC/B,MAAM4D,aAAaF,QAAQH,MAAM,CAAC;QAClC,MAAMa,gBAAgBV,QAAQH,MAAM,CAAC;QACrC,OAAO,CAAC;MACN,EAAEK,WAAW,GAAG,EAAED,UAAU;MAC5B,EAAES,cAAc,gBAAgB,EAAED,MAAM;IAC1C,EAAEP,WAAW,aAAa,EAAEA,WAAW,yDAAyD,EAAEA,WAAW,YAAY,EAAEf,KAAK;WACzH,EAAEe,WAAW,mBAAmB,EAAEA,WAAW,YAAY,EAAEQ,cAAc,kDAAkD,EAAER,WAAW,+BAA+B,EAAEf,KAAK,2BAA2B,EAAE7C,QAAQX,KAAK;WACxN,EAAEuE,WAAW,iBAAiB,EAAEA,WAAW,kBAAkB,EAAEQ,cAAc,0CAA0C,EAAER,WAAW,+BAA+B,EAAEf,KAAK,iBAAiB,EAAE7C,QAAQX,KAAK;AACrN,CAAC;IACC,OAAO,IAAIgF,MAAMC,OAAO,CAACtE,SAAS;QAChC,MAAM4D,aAAaF,QAAQH,MAAM,CAAC;QAClC,MAAMO,OAAiB;YACrB,CAAC,MAAM,EAAEF,WAAW,GAAG,EAAED,UAAU,CAAC,CAAC;YACrC,CAAC,IAAI,EAAEC,WAAW,aAAa,EAAEA,WAAW,yDAAyD,EAAEA,WAAW,YAAY,EAAEf,KAAK,+BAA+B,CAAC;YACrK,CAAC,WAAW,EAAEe,WAAW,8DAA8D,EAAEA,WAAW,YAAY,EAAEf,KAAK,uCAAuC,CAAC;YAC/J,CAAC,mBAAmB,EAAEe,WAAW,kDAAkD,EAAEA,WAAW,8BAA8B,EAAEf,KAAK,uCAAuC,CAAC;SAC9K;QACD,IAAI7C,OAAOb,MAAM,GAAG,GAAG;YACrB,MAAMmB,QAAQoD,QAAQH,MAAM,CAAC;YAC7B,MAAMgB,MAAMb,QAAQH,MAAM,CAAC;YAC3B,MAAMM,cAAcH,QAAQH,MAAM,CAAC;YACnCO,KAAKT,IAAI,CAAC,CAAC,MAAM,EAAEQ,YAAY,MAAM,CAAC;YACtCC,KAAKT,IAAI,IACJrD,OAAO+D,GAAG,CACX,CAACnD,IACC,CAAC,EAAEgD,WAAW,UAAU,EAAEtD,MAAM,CAAC,EAAEiE,IAAI,aAAa,EAAEd,QAAQ7C,GAAG8C,SAASpD,OAAO,CAAC,EAAEuC,KAAK,IAAI,EAAE0B,IAAI,EAAE,CAAC,EAAE,aAAa,EAAEV,YAAY,uBAAuB,CAAC;YAIjKC,KAAKT,IAAI,CAAC,CAAC,IAAI,EAAEQ,YAAY,qCAAqC,EAAEA,YAAY,gBAAgB,CAAC;QACnG;QACA,OAAOC,KAAKE,IAAI,CAAC;IACnB,OAAO,IAAI,OAAOhE,WAAW,YAAYA,WAAW,MAAM;QACxD,IAAIA,kBAAkBwE,QAAQ;YAC5B,MAAMZ,aAAaF,QAAQH,MAAM,CAAC;YAClC,OAAO,CAAC;MACR,EAAEK,WAAW,GAAG,EAAED,UAAU;KAC7B,EAAE3D,OAAOS,QAAQ,GAAG,WAAW,EAAEmD,WAAW,4CAA4C,EAAEA,WAAW,YAAY,EAAEf,KAAK,qBAAqB,EAAE7C,OAAOS,QAAQ,GAAG;AACtK,CAAC;QACG,OAAO;YACL,MAAMmD,aAAaF,QAAQH,MAAM,CAAC;YAClC,MAAMO,OAAiB;gBACrB,CAAC,MAAM,EAAEF,WAAW,GAAG,EAAED,UAAU,CAAC,CAAC;gBACrC,CAAC,IAAI,EAAEC,WAAW,aAAa,EAAEA,WAAW,yDAAyD,EAAEA,WAAW,YAAY,EAAEf,KAAK,+BAA+B,CAAC;gBACrK,CAAC,WAAW,EAAEe,WAAW,8DAA8D,EAAEA,WAAW,YAAY,EAAEf,KAAK,iCAAiC,CAAC;aAC1J;YACD,IAAIvD,SAASU,QAAQ;gBACnB,MAAMyE,YAAYf,QAAQH,MAAM,CAAC;gBACjC,MAAMM,cAAcH,QAAQH,MAAM,CAAC;gBACnC,MAAMmB,SAAShB,QAAQH,MAAM,CAAC;gBAC9BO,KAAKT,IAAI,CAAC,CAAC;MACb,EAAEoB,UAAU,eAAe,EAAEb,WAAW;MACxC,EAAEC,YAAY,GAAG,EAAEY,UAAU,KAAK,EAAEC,OAAO,YAAY,EAAEjB,QAAQzD,MAAM,CAACV,MAAM,EAAEoE,SAASgB,QAAQ,CAAC,EAAE7B,KAAK,IAAI,EAAE6B,OAAO,EAAE,CAAC,EAAE;IAC7H,EAAEb,YAAY,qCAAqC,EAAEA,YAAY;AACrE,CAAC;YACK;YACA,IAAIpE,WAAWO,QAAQ;gBACrB,MAAM2E,SAASjB,QAAQH,MAAM,CAAC;gBAC9B,MAAMmB,SAAShB,QAAQH,MAAM,CAAC;gBAC9B,MAAMqB,eAAelB,QAAQH,MAAM,CAAC;gBACpC,MAAMM,cAAcH,QAAQH,MAAM,CAAC;gBACnCO,KAAKT,IAAI,CAAC,CAAC;MACb,EAAEuB,aAAa,kBAAkB,EAAEhB,WAAW;MAC9C,EAAEC,YAAY,GAAG,EAAEe,aAAa,OAAO,EAAEF,OAAO,CAAC,EAAEC,OAAO,cAAc,EAAElB,QAAQzD,MAAM,CAACP,QAAQ,EAAEiE,SAASiB,QAAQ,CAAC,EAAE9B,KAAK,IAAI,EAAE6B,OAAO,EAAE,CAAC,EAAE;IAChJ,EAAEb,YAAY,qCAAqC,EAAEA,YAAY;AACrE,CAAC;YACK;YACA,IAAInE,WAAWM,UAAUA,MAAM,CAACN,QAAQ,EAAE;gBACxC,MAAM+E,YAAYf,QAAQH,MAAM,CAAC;gBACjC,MAAMmB,SAAShB,QAAQH,MAAM,CAAC;gBAC9B,MAAMsB,aAAanB,QAAQH,MAAM,CAAC;gBAClCO,KAAKT,IAAI,CAAC,CAAC,MAAM,EAAEoB,UAAU,WAAW,EAAEjC,KAAKO,SAAS,CAAC+B,OAAOC,IAAI,CAAC/E,SAAS,EAAE,CAAC;gBACjF8D,KAAKT,IAAI,CAAC,CAAC,MAAM,EAAEwB,WAAW,eAAe,EAAEjB,WAAW,SAAS,EAAEc,OAAO,KAAK,EAAED,UAAU,KAAK,EAAEC,OAAO,GAAG,CAAC;gBAC/GZ,KAAKT,IAAI,CAAC,CAAC,IAAI,EAAEwB,WAAW,4DAA4D,EAAEA,WAAW,6BAA6B,EAAEhC,KAAK,OAAO,CAAC;YACnJ;YACAiB,KAAKT,IAAI,IAAIyB,OAAOE,OAAO,CAAChF,QAAQ+D,GAAG,CAAC,CAAC,CAACQ,KAAK3D,EAAE,GAAK6C,QAAQ7C,GAAG8C,SAAS,CAAC,EAAEE,WAAW,EAAE,EAAEW,IAAI,EAAE,CAAC,EAAE,CAAC,EAAE1B,KAAK,CAAC,EAAE0B,IAAI,CAAC;YACrH,OAAO,CAAC,EAAET,KAAKE,IAAI,CAAC,MAAM,CAAC;QAC7B;IACF,OAAO,IAAI,OAAOhE,WAAW,UAAU;QACrC,MAAMmE,QAAQT,QAAQP,QAAQ,CAACnD;QAC/B,MAAM4D,aAAaF,QAAQH,MAAM,CAAC;QAClC,MAAMa,gBAAgBV,QAAQH,MAAM,CAAC;QAErC,OAAO,CAAC;MACN,EAAEK,WAAW,GAAG,EAAED,UAAU;MAC5B,EAAES,cAAc,gBAAgB,EAAED,MAAM;WACnC,EAAEP,WAAW,8DAA8D,EAAEA,WAAW;IAC/F,EAAEA,WAAW,KAAK,EAAEQ,cAAc,2CAA2C,EAAER,WAAW,uBAAuB,EAAEf,KAAK,YAAY,EAAE7C,OAAOS,QAAQ,GAAG;IACxJ,CAAC;IACH,OAAO,IAAIT,WAAW,QAAQA,WAAWmB,WAAW;QAClD,MAAMyC,aAAaF,QAAQH,MAAM,CAAC;QAClC,OAAO,CAAC;MACN,EAAEK,WAAW,GAAG,EAAED,UAAU;IAC9B,EAAEC,WAAW,aAAa,EAAEA,WAAW,uDAAuD,EAAEA,WAAW,WAAW,EAAEf,KAAK;IAC7H,CAAC;IACH,OAAO;QACL,MAAMe,aAAaF,QAAQH,MAAM,CAAC;QAClC,MAAMjD,QAAQoD,QAAQH,MAAM,CAAC;QAC7B,OAAO,CAAC;MACN,EAAEK,WAAW,GAAG,EAAED,UAAU;MAC5B,EAAErD,MAAM,GAAG,EAAEkC,KAAKO,SAAS,CAAC/C,QAAQ;WAC/B,EAAE4D,WAAW,MAAM,EAAE,OAAO5D,OAAO,kDAAkD,EAAE4D,WAAW,YAAY,EAAEf,KAAK,YAAY,EAAE,OAAO7C,OAAO;IACxJ,EAAE4D,WAAW,KAAK,EAAEtD,MAAM,wCAAwC,EAAEkC,KAAKO,SAAS,CAACa,YAAY,WAAW,EAAEf,KAAK,YAAY,EAAEL,KAAKO,SAAS,CAAC/C,QAAQ;AAC1J,CAAC;IACC;AACF;AAEA,OAAO,MAAMiF,UAAU,CAAIjF,QAAmBkF;IAC5C,MAAMxB,UAAU,IAAIV;IACpB,MAAMc,OAAOL,QAAQzD,QAAQ0D,SAAS,QAAQwB;IAC9C,MAAMC,YAAY,IAAIC,SAAS,OAAO,QAAQtB;IAC9C,OAAO,CAACuB,OAAYF,UAAUzB,SAAS2B;AACzC,EAAE;AAEF,OAAO,MAAMC,YAAY,CAAItF,QAAmBqF,MAASH,WAAW,QAAQ;IAC1ED,QAAQjF,QAAQkF,UAAUG;AAC5B,EAAE"}
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.0.4",
3
+ "version": "1.2.0",
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",
@@ -39,13 +39,13 @@
39
39
  "homepage": "https://github.com/3axap4eHko/ascertain#readme",
40
40
  "devDependencies": {
41
41
  "@eslint/eslintrc": "^3.1.0",
42
- "@eslint/js": "^9.6.0",
42
+ "@eslint/js": "^9.7.0",
43
43
  "@swc/jest": "^0.2.36",
44
44
  "@types/jest": "^29.5.12",
45
- "@types/node": "^20.14.9",
46
- "@typescript-eslint/eslint-plugin": "^7.15.0",
47
- "@typescript-eslint/parser": "^7.15.0",
48
- "eslint": "^9.6.0",
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",
49
49
  "eslint-config-airbnb-base": "^15.0.0",
50
50
  "eslint-config-prettier": "^9.1.0",
51
51
  "eslint-plugin-import": "^2.29.1",
@@ -54,7 +54,7 @@
54
54
  "inop": "^0.7.4",
55
55
  "jest": "^29.7.0",
56
56
  "overtake": "^0.1.1",
57
- "prettier": "^3.3.2",
57
+ "prettier": "^3.3.3",
58
58
  "ts-node": "^10.9.2",
59
59
  "typescript": "^5.5.3"
60
60
  },