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 +57 -36
- package/build/index.cjs.map +1 -1
- package/build/index.d.ts +2 -1
- package/build/index.js +54 -36
- package/build/index.js.map +1 -1
- package/package.json +7 -7
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 :
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
|
108
|
+
return parseInt(`${parseFloat(amount) * MULTIPLIERS[unit] / conversionFactor}`);
|
|
104
109
|
}
|
|
105
|
-
return
|
|
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) :
|
|
108
|
-
array: (value, delimiter)=>value?.split?.(delimiter) ??
|
|
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
|
|
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
|
|
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
|
-
|
|
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)
|
|
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
|
-
|
|
172
|
-
|
|
173
|
-
|
|
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)
|
|
176
|
-
|
|
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
|
-
|
|
184
|
-
const ${valueAlias} = ${valuePath}
|
|
185
|
-
const ${registryAlias} = ctx.registry[${index}]
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
if (
|
|
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
|
-
|
|
195
|
-
|
|
196
|
-
|
|
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}) => {
|
|
204
|
-
code.push(
|
|
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
|
-
|
|
219
|
-
|
|
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} =
|
|
228
|
-
|
|
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} =
|
|
239
|
-
|
|
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
|
`;
|
package/build/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["abstract class Operator<T> {\n constructor(public readonly schemas: Schema<T>[]) {\n if (schemas.length === 0) {\n throw new TypeError(`Operation schema ${this.constructor.name} must have at least one element`);\n }\n }\n}\n\nexport const $keys = Symbol.for('@@keys');\nexport const $values = Symbol.for('@@values');\nexport const $strict = Symbol.for('@@strict');\n\nexport type Schema<T> =\n T extends Record<string | number | symbol, unknown>\n ? { [K in keyof T]?: Schema<T[K]> | unknown } & { [$keys]?: Schema<keyof T> } & { [$values]?: Schema<T[keyof T]> } & { [$strict]?: boolean }\n : T extends Array<infer A>\n ? Schema<A>[] | unknown\n : unknown;\n\nclass Or<T> extends Operator<T> {}\nexport const or = <T>(...schemas: Schema<T>[]) => new Or(schemas);\n\nclass And<T> extends Operator<T> {}\nexport const and = <T>(...schemas: Schema<T>[]) => new And(schemas);\n\nclass Optional<T> extends Operator<T> {\n constructor(schema: Schema<T>) {\n super([schema]);\n }\n}\nexport const optional = <T>(schema: Schema<T>) => new Optional(schema);\n\nclass Tuple<T> extends Operator<T> {}\nexport const tuple = <T>(...schemas: Schema<T>[]) => new Tuple(schemas);\n\nexport const fromBase64 = typeof Buffer === 'undefined' ? (value: string) => atob(value) : (value: string) => Buffer.from(value, 'base64').toString('utf-8');\n\nconst MULTIPLIERS = {\n ms: 1,\n s: 1000,\n m: 60000,\n h: 3600000,\n d: 86400000,\n w: 604800000,\n};\n\nexport const as = {\n string: (value: string | undefined): 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":";;;;;;;;;;;IAQaA,KAAK;eAALA;;IAEAC,OAAO;eAAPA;;IADAC,OAAO;eAAPA;;IAcAC,GAAG;eAAHA;;IAuBAC,EAAE;eAAFA;;IA+NAC,SAAS;eAATA;;IAPAC,OAAO;eAAPA;;IA7KAC,WAAW;eAAXA;;IAtDAC,UAAU;eAAVA;;IALAC,QAAQ;eAARA;;IAVAC,EAAE;eAAFA;;IAaAC,KAAK;eAALA;;;AAjCb,MAAeC;;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;AAEO,MAAMjB,QAAQkB,OAAOC,GAAG,CAAC;AACzB,MAAMjB,UAAUgB,OAAOC,GAAG,CAAC;AAC3B,MAAMlB,UAAUiB,OAAOC,GAAG,CAAC;AASlC,MAAMC,WAAcR;AAAa;AAC1B,MAAMF,KAAK,CAAI,GAAGI,UAAyB,IAAIM,GAAGN;AAEzD,MAAMO,YAAeT;AAAa;AAC3B,MAAMT,MAAM,CAAI,GAAGW,UAAyB,IAAIO,IAAIP;AAE3D,MAAMQ,iBAAoBV;IACxBC,YAAYU,MAAiB,CAAE;QAC7B,KAAK,CAAC;YAACA;SAAO;IAChB;AACF;AACO,MAAMd,WAAW,CAAIc,SAAsB,IAAID,SAASC;AAE/D,MAAMC,cAAiBZ;AAAa;AAC7B,MAAMD,QAAQ,CAAI,GAAGG,UAAyB,IAAIU,MAAMV;AAExD,MAAMN,aAAa,OAAOiB,WAAW,cAAc,CAACC,QAAkBC,KAAKD,SAAS,CAACA,QAAkBD,OAAOG,IAAI,CAACF,OAAO,UAAUG,QAAQ,CAAC;AAEpJ,MAAMC,cAAc;IAClBC,IAAI;IACJC,GAAG;IACHC,GAAG;IACHC,GAAG;IACHC,GAAG;IACHC,GAAG;AACL;AAEO,MAAMhC,KAAK;IAChBiC,QAAQ,CAACX;QACP,OAAO,OAAOA,UAAU,WAAWA,QAASY;IAC9C;IACAC,QAAQ,CAACb;QACP,MAAMc,SAASC,WAAWf;QAC1B,OAAOgB,OAAOC,QAAQ,CAACH,UAAUA,SAAUF;IAC7C;IACAM,MAAM,CAAClB;QACL,MAAMc,SAASK,KAAKC,KAAK,CAACpB;QAC1B,OAAOgB,OAAOC,QAAQ,CAACH,UAAU,IAAIK,KAAKL,UAAWF;IACvD;IACAS,MAAM,CAACrB;QACL,MAAMsB,UAAUtB,OAAOuB,MAAM;QAC7B,IAAID,SAAS;YACX,MAAM,GAAGE,QAAQC,OAAO,IAAI,CAAC,GAAGH;YAChC,OAAOI,SAASF,QAAQ,MAAMpB,WAAW,CAACqB,KAAiC;QAC7E;QACA,OAAOb;IACT;IACAe,SAAS,CAAC3B,QACR,uCAAuC4B,IAAI,CAAC5B,SAAmB,sBAAsB4B,IAAI,CAAC5B,SAAoBY;IAChHiB,OAAO,CAAC7B,OAA2B8B,YAAgC9B,OAAO+B,QAAQD,cAAelB;IACjGoB,MAAM,CAAahC;QACjB,IAAI;YACF,OAAOiC,KAAKb,KAAK,CAACpB;QACpB,EAAE,OAAOkC,GAAG;YACV,OAAOtB;QACT;IACF;IACAuB,QAAQ,CAACnC;QACP,IAAI;YACF,OAAOlB,WAAWkB;QACpB,EAAE,OAAOkC,GAAG;YACV,OAAOtB;QACT;IACF;AACF;AAMO,MAAM/B,cAA8B,CAACmB,OAAOoC,UAAUC,MAAMC,UACjE,CAAC,QAAQ,EAAEA,QAAQ,CAAC,EAAEL,KAAKM,SAAS,CAACvC,OAAO,UAAU,EAAEqC,KAAK,WAAW,EAAED,SAAS,CAAC,CAAC;AAEvF,MAAMI;IACYC,WAAsB,EAAE,CAAC;IACjCC,WAAW,EAAE;IAErBC,SAAS3C,KAAc,EAAU;QAC/B,IAAI,CAAC,IAAI,CAACyC,QAAQ,CAACG,QAAQ,CAAC5C,QAAQ;YAClC,IAAI,CAACyC,QAAQ,CAACI,IAAI,CAAC7C;QACrB;QACA,OAAO,IAAI,CAACyC,QAAQ,CAACK,OAAO,CAAC9C;IAC/B;IAEA+C,OAAOC,MAAc,EAAE;QACrB,OAAO,CAAC,EAAEA,OAAO,EAAE,EAAE,IAAI,CAACN,QAAQ,GAAG,CAAC;IACxC;AACF;AAEA,MAAMO,UAAU,CAAIpD,QAAmBqD,SAAkBC,WAAmBd;IAC1E,IAAIxC,kBAAkBF,KAAK;QACzB,MAAMyD,aAAaF,QAAQH,MAAM,CAAC;QAClC,MAAMM,cAAcH,QAAQH,MAAM,CAAC;QACnC,MAAMO,OAAOzD,OAAOT,OAAO,CAACmE,GAAG,CAAC,CAACjD,IAAM,CAAC,MAAM,EAAE2C,QAAQ3C,GAAG4C,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,IAAIxD,kBAAkBH,IAAI;QAC/B,MAAM0D,aAAaF,QAAQH,MAAM,CAAC;QAClC,MAAMM,cAAcH,QAAQH,MAAM,CAAC;QACnC,MAAMO,OAAOzD,OAAOT,OAAO,CACxBmE,GAAG,CAAC,CAACjD,IAAM2C,QAAQ3C,GAAG4C,SAASE,YAAYf,OAC3CoB,WAAW,CAAC,CAAC3C,QAAQwC,OAAS,CAAC,KAAK,EAAEA,KAAK,aAAa,EAAED,YAAY,iBAAiB,EAAEvC,OAAO,CAAC,CAAC,EAAE,CAAC,oBAAoB,EAAEuC,YAAY,cAAc,CAAC;QACzJ,OAAO,CAAC;MACN,EAAEA,YAAY;MACd,EAAED,WAAW,GAAG,EAAED,UAAU;AAClC,EAAEG,KAAK;IACH,CAAC;IACH,OAAO,IAAIzD,kBAAkBD,UAAU;QACrC,MAAMwD,aAAaF,QAAQH,MAAM,CAAC;QAClC,OAAO,CAAC;MACN,EAAEK,WAAW,GAAG,EAAED,UAAU;IAC9B,EAAEC,WAAW,kBAAkB,EAAEA,WAAW,aAAa,EAAEH,QAAQpD,OAAOT,OAAO,CAAC,EAAE,EAAE8D,SAASE,YAAYf,MAAM;AACrH,CAAC;IACC,OAAO,IAAIxC,kBAAkBC,OAAO;QAClC,MAAMsD,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,EAAEvD,OAAOT,OAAO,CAACC,MAAM,CAAC,kDAAkD,EAAE+D,WAAW,mBAAmB,EAAEf,KAAK,YAAY,EAAExC,OAAOT,OAAO,CAACC,MAAM,CAAC,OAAO,CAAC;eACtLQ,OAAOT,OAAO,CAACmE,GAAG,CACnB,CAACjD,GAAGoD,MAAQ,CAAC,MAAM,EAAET,QAAQ3C,GAAG4C,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,OAAO3D,WAAW,YAAY;QACvC,MAAM8D,QAAQT,QAAQP,QAAQ,CAAC9C;QAC/B,MAAMuD,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,EAAExC,QAAQN,KAAK;WACxN,EAAE6D,WAAW,iBAAiB,EAAEA,WAAW,kBAAkB,EAAEQ,cAAc,0CAA0C,EAAER,WAAW,+BAA+B,EAAEf,KAAK,iBAAiB,EAAExC,QAAQN,KAAK;AACrN,CAAC;IACC,OAAO,IAAIsE,MAAMC,OAAO,CAACjE,SAAS;QAChC,MAAMuD,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,IAAIxC,OAAOR,MAAM,GAAG,GAAG;YACrB,MAAMW,QAAQkD,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,IACJhD,OAAO0D,GAAG,CACX,CAACjD,IACC,CAAC,EAAE8C,WAAW,UAAU,EAAEpD,MAAM,CAAC,EAAE+D,IAAI,aAAa,EAAEd,QAAQ3C,GAAG4C,SAASlD,OAAO,CAAC,EAAEqC,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,OAAO3D,WAAW,YAAYA,WAAW,MAAM;QACxD,IAAIA,kBAAkBmE,QAAQ;YAC5B,MAAMZ,aAAaF,QAAQH,MAAM,CAAC;YAClC,OAAO,CAAC;MACR,EAAEK,WAAW,GAAG,EAAED,UAAU;KAC7B,EAAEtD,OAAOM,QAAQ,GAAG,WAAW,EAAEiD,WAAW,4CAA4C,EAAEA,WAAW,YAAY,EAAEf,KAAK,qBAAqB,EAAExC,OAAOM,QAAQ,GAAG;AACtK,CAAC;QACG,OAAO;YACL,MAAMiD,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,IAAI/D,SAASuB,QAAQ;gBACnB,MAAMoE,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,QAAQpD,MAAM,CAACvB,MAAM,EAAE4E,SAASgB,QAAQ,CAAC,EAAE7B,KAAK,IAAI,EAAE6B,OAAO,EAAE,CAAC,EAAE;IAC7H,EAAEb,YAAY,qCAAqC,EAAEA,YAAY;AACrE,CAAC;YACK;YACA,IAAI7E,WAAWqB,QAAQ;gBACrB,MAAMsE,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,QAAQpD,MAAM,CAACrB,QAAQ,EAAE0E,SAASiB,QAAQ,CAAC,EAAE9B,KAAK,IAAI,EAAE6B,OAAO,EAAE,CAAC,EAAE;IAChJ,EAAEb,YAAY,qCAAqC,EAAEA,YAAY;AACrE,CAAC;YACK;YACA,IAAI9E,WAAWsB,UAAUA,MAAM,CAACtB,QAAQ,EAAE;gBACxC,MAAM0F,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,EAAEhC,KAAKM,SAAS,CAAC+B,OAAOC,IAAI,CAAC1E,SAAS,EAAE,CAAC;gBACjFyD,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,CAAC3E,QAAQ0D,GAAG,CAAC,CAAC,CAACQ,KAAKzD,EAAE,GAAK2C,QAAQ3C,GAAG4C,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,OAAO3D,WAAW,UAAU;QACrC,MAAM8D,QAAQT,QAAQP,QAAQ,CAAC9C;QAC/B,MAAMuD,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,EAAExC,OAAOM,QAAQ,GAAG;IACxJ,CAAC;IACH,OAAO,IAAIN,WAAW,QAAQA,WAAWe,WAAW;QAClD,MAAMwC,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,MAAM/C,QAAQkD,QAAQH,MAAM,CAAC;QAC7B,OAAO,CAAC;MACN,EAAEK,WAAW,GAAG,EAAED,UAAU;MAC5B,EAAEnD,MAAM,GAAG,EAAEiC,KAAKM,SAAS,CAAC1C,QAAQ;WAC/B,EAAEuD,WAAW,MAAM,EAAE,OAAOvD,OAAO,kDAAkD,EAAEuD,WAAW,YAAY,EAAEf,KAAK,YAAY,EAAE,OAAOxC,OAAO;IACxJ,EAAEuD,WAAW,KAAK,EAAEpD,MAAM,wCAAwC,EAAEiC,KAAKM,SAAS,CAACa,YAAY,WAAW,EAAEf,KAAK,YAAY,EAAEJ,KAAKM,SAAS,CAAC1C,QAAQ;AAC1J,CAAC;IACC;AACF;AAEO,MAAMjB,UAAU,CAAIiB,QAAmB4E;IAC5C,MAAMvB,UAAU,IAAIV;IACpB,MAAMc,OAAOL,QAAQpD,QAAQqD,SAAS,QAAQuB;IAC9C,MAAMC,YAAY,IAAIC,SAAS,OAAO,QAAQrB;IAC9C,OAAO,CAACsB,OAAYF,UAAUxB,SAAS0B;AACzC;AAEO,MAAMjG,YAAY,CAAIkB,QAAmB+E,MAASH,WAAW,QAAQ;IAC1E7F,QAAQiB,QAAQ4E,UAAUG;AAC5B"}
|
|
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 :
|
|
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.
|
|
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
|
-
|
|
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
|
|
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
|
|
57
|
+
return parseInt(`${parseFloat(amount) * MULTIPLIERS[unit] / conversionFactor}`);
|
|
56
58
|
}
|
|
57
|
-
return
|
|
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) :
|
|
60
|
-
array: (value, delimiter)=>value?.split?.(delimiter) ??
|
|
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
|
|
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
|
|
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
|
-
|
|
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)
|
|
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
|
-
|
|
124
|
-
|
|
125
|
-
|
|
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)
|
|
128
|
-
|
|
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
|
-
|
|
136
|
-
const ${valueAlias} = ${valuePath}
|
|
137
|
-
const ${registryAlias} = ctx.registry[${index}]
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
if (
|
|
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
|
-
|
|
147
|
-
|
|
148
|
-
|
|
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}) => {
|
|
156
|
-
code.push(
|
|
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
|
-
|
|
171
|
-
|
|
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} =
|
|
180
|
-
|
|
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} =
|
|
191
|
-
|
|
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
|
`;
|
package/build/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["abstract class Operator<T> {\n constructor(public readonly schemas: Schema<T>[]) {\n if (schemas.length === 0) {\n throw new TypeError(`Operation schema ${this.constructor.name} must have at least one element`);\n }\n }\n}\n\nexport const $keys = Symbol.for('@@keys');\nexport const $values = Symbol.for('@@values');\nexport const $strict = Symbol.for('@@strict');\n\nexport type Schema<T> =\n T extends Record<string | number | symbol, unknown>\n ? { [K in keyof T]?: Schema<T[K]> | unknown } & { [$keys]?: Schema<keyof T> } & { [$values]?: Schema<T[keyof T]> } & { [$strict]?: boolean }\n : T extends Array<infer A>\n ? Schema<A>[] | unknown\n : unknown;\n\nclass Or<T> extends Operator<T> {}\nexport const or = <T>(...schemas: Schema<T>[]) => new Or(schemas);\n\nclass And<T> extends Operator<T> {}\nexport const and = <T>(...schemas: Schema<T>[]) => new And(schemas);\n\nclass Optional<T> extends Operator<T> {\n constructor(schema: Schema<T>) {\n super([schema]);\n }\n}\nexport const optional = <T>(schema: Schema<T>) => new Optional(schema);\n\nclass Tuple<T> extends Operator<T> {}\nexport const tuple = <T>(...schemas: Schema<T>[]) => new Tuple(schemas);\n\nexport const fromBase64 = typeof Buffer === 'undefined' ? (value: string) => atob(value) : (value: string) => Buffer.from(value, 'base64').toString('utf-8');\n\nconst MULTIPLIERS = {\n ms: 1,\n s: 1000,\n m: 60000,\n h: 3600000,\n d: 86400000,\n w: 604800000,\n};\n\nexport const as = {\n string: (value: string | undefined): string => {\n return typeof value === 'string' ? value : (undefined as unknown as string);\n },\n number: (value: string | undefined): number => {\n const result = parseFloat(value as string);\n return Number.isFinite(result) ? result : (undefined as unknown as number);\n },\n date: (value: string | undefined): Date => {\n const result = Date.parse(value as string);\n return Number.isFinite(result) ? new Date(result) : (undefined as unknown as Date);\n },\n time: (value: string | undefined): number => {\n const matches = value?.match(/^(\\d+)(ms|s|m|h|d|w)?$/);\n if (matches) {\n const [, amount, unit = 'ms'] = matches;\n return parseInt(amount, 10) * MULTIPLIERS[unit as keyof typeof MULTIPLIERS];\n }\n return undefined as unknown as number;\n },\n boolean: (value: string | undefined): boolean =>\n /^(0|1|true|false|enabled|disabled)$/i.test(value as string) ? /^(1|true|enabled)$/i.test(value as string) : (undefined as unknown as boolean),\n array: (value: string | undefined, delimiter: string): string[] => value?.split?.(delimiter) ?? (undefined as unknown as string[]),\n json: <T = object>(value: string | undefined): T => {\n try {\n return JSON.parse(value as string);\n } catch (e) {\n return undefined as unknown as T;\n }\n },\n base64: (value: string | undefined): string => {\n try {\n return fromBase64(value as string);\n } catch (e) {\n return undefined as unknown as string;\n }\n },\n};\n\nexport interface ErrorFormatter {\n (value: unknown, expected: unknown, path: string, subject: string): string;\n}\n\nexport const formatError: ErrorFormatter = (value, expected, path, subject) =>\n `Invalid ${subject} ${JSON.stringify(value)} for path ${path}, expected ${expected}.`;\n\nclass Context {\n public readonly registry: unknown[] = [];\n private varIndex = 0;\n\n register(value: unknown): number {\n if (!this.registry.includes(value)) {\n this.registry.push(value);\n }\n return this.registry.indexOf(value);\n }\n\n unique(prefix: string) {\n return `${prefix}$$${this.varIndex++}`;\n }\n}\n\nconst codeGen = <T>(schema: Schema<T>, context: Context, valuePath: string, path: string): string => {\n if (schema instanceof And) {\n const valueAlias = context.unique('v');\n const errorsAlias = context.unique('err');\n const code = schema.schemas.map((s) => `try { ${codeGen(s, context, valueAlias, path)} } catch (e) { ${errorsAlias}.push(e.message); }`).join('\\n');\n return `// And\n const ${errorsAlias} = [];\n const ${valueAlias} = ${valuePath};\n ${code}\n if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }\n`;\n } else if (schema instanceof Or) {\n const valueAlias = context.unique('v');\n const errorsAlias = context.unique('err');\n const code = schema.schemas\n .map((s) => codeGen(s, context, valueAlias, path))\n .reduceRight((result, code) => `try {${code}} catch (e) {${errorsAlias}.push(e.message);${result}}`, `throw new TypeError(${errorsAlias}.join('\\\\n'));`);\n return `// Or\nconst ${errorsAlias} = [];\nconst ${valueAlias} = ${valuePath};\n${code}\n `;\n } else if (schema instanceof Optional) {\n const valueAlias = context.unique('v');\n return `// Optional\nconst ${valueAlias} = ${valuePath};\nif (${valueAlias} !== undefined && ${valueAlias} !== null) { ${codeGen(schema.schemas[0], context, valueAlias, path)} }\n`;\n } else if (schema instanceof Tuple) {\n const valueAlias = context.unique('v');\n const errorsAlias = context.unique('err');\n const code: string[] = [\n '// Tuple',\n `const ${valueAlias} = ${valuePath};`,\n `const ${errorsAlias} = [];`,\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`,\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected an instance of Array\\`); }`,\n `if (!Array.isArray(${valueAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}.constructor?.name} for path \"${path}\", expected an instance of Array.\\`); }`,\n `if (${valueAlias}.length > ${schema.schemas.length}) { throw new TypeError(\\`Invalid tuple length \\${${valueAlias}.length} for path \"${path}\", expected ${schema.schemas.length}.\\`); }`,\n ...schema.schemas.map(\n (s, idx) => `try { ${codeGen(s, context, `${valueAlias}[${idx}]`, `${path}[${idx}]`)} } catch (e) { ${errorsAlias}.push(e.message); }`,\n ),\n `if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }`,\n ];\n return code.join('\\n');\n } else if (typeof schema === 'function') {\n const index = context.register(schema);\n const valueAlias = context.unique('v');\n const registryAlias = context.unique('r');\n return `\nconst ${valueAlias} = ${valuePath};\nconst ${registryAlias} = ctx.registry[${index}];\nif (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }\nif (typeof ${valueAlias} === 'object' && !(${valueAlias} instanceof ${registryAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}?.constructor?.name} for path \"${path}\", expected an instance of ${schema?.name}\\`); }\nif (typeof ${valueAlias} !== 'object' && ${valueAlias}?.constructor !== ${registryAlias}) { throw new TypeError(\\`Invalid type \\${${valueAlias}?.constructor?.name} for path \"${path}\", expected type ${schema?.name}\\`); }\n`;\n } else if (Array.isArray(schema)) {\n const valueAlias = context.unique('v');\n const code: string[] = [\n `const ${valueAlias} = ${valuePath};`,\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`,\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected an instance of Array.\\`); }`,\n `if (!Array.isArray(${valueAlias})) { throw new TypeError(\\`Invalid instance of \\${${valueAlias}.constructor?.name} for path \"${path}\", expected an instance of Array.\\`); }`,\n ];\n if (schema.length > 0) {\n const value = context.unique('val');\n const key = context.unique('key');\n const errorsAlias = context.unique('err');\n code.push(`const ${errorsAlias} = [];`);\n code.push(\n ...schema.map(\n (s) =>\n `${valueAlias}.forEach((${value},${key}) => { try { ${codeGen(s, context, value, `${path}[\\${${key}}]`)} } catch(e){ ${errorsAlias}.push(e.message); } });`,\n ),\n );\n\n code.push(`if (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }`);\n }\n return code.join('\\n');\n } else if (typeof schema === 'object' && schema !== null) {\n if (schema instanceof RegExp) {\n const valueAlias = context.unique('v');\n return `\nconst ${valueAlias} = ${valuePath};\nif (!${schema.toString()}.test('' + ${valueAlias})) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected to match ${schema.toString()}\\`); }\n`;\n } else {\n const valueAlias = context.unique('v');\n const code: string[] = [\n `const ${valueAlias} = ${valuePath};`,\n `if (${valueAlias} === null || ${valueAlias} === undefined) { throw new TypeError(\\`Invalid value \\${${valueAlias}} for path \"${path}\", expected non-nullable.\\`); }`,\n `if (typeof ${valueAlias} !== 'object') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected type is object.\\`); }`,\n ];\n if ($keys in schema) {\n const keysAlias = context.unique('k');\n const errorsAlias = context.unique('err');\n const kAlias = context.unique('k');\n code.push(`\nconst ${keysAlias} = Object.keys(${valueAlias});\nconst ${errorsAlias} = ${keysAlias}.map(${kAlias} => { try { ${codeGen(schema[$keys], context, kAlias, `${path}[\\${${kAlias}}]`)} } catch (e) { return e.message; } }).filter(Boolean);\nif (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }\n`);\n }\n if ($values in schema) {\n const vAlias = context.unique('val');\n const kAlias = context.unique('k');\n const entriesAlias = context.unique('en');\n const errorsAlias = context.unique('err');\n code.push(`\nconst ${entriesAlias} = Object.entries(${valueAlias});\nconst ${errorsAlias} = ${entriesAlias}.map(([${kAlias},${vAlias}]) => { try { ${codeGen(schema[$values], context, vAlias, `${path}[\\${${kAlias}}]`)} } catch (e) { return e.message; } }).filter(Boolean);\nif (${errorsAlias}.length !== 0) { throw new TypeError(${errorsAlias}.join('\\\\n')); }\n`);\n }\n if ($strict in schema && schema[$strict]) {\n const keysAlias = context.unique('k');\n const kAlias = context.unique('k');\n const extraAlias = context.unique('ex');\n code.push(`const ${keysAlias} = new Set(${JSON.stringify(Object.keys(schema))});`);\n code.push(`const ${extraAlias} = Object.keys(${valueAlias}).filter(${kAlias} => !${keysAlias}.has(${kAlias}));`);\n code.push(`if (${extraAlias}.length !== 0) { throw new TypeError(\\`Extra properties: \\${${extraAlias}}, are not allowed for path \"${path}\"\\`); }`);\n }\n code.push(...Object.entries(schema).map(([key, s]) => codeGen(s, context, `${valueAlias}['${key}']`, `${path}.${key}`)));\n return `${code.join('\\n')}`;\n }\n } else if (typeof schema === 'symbol') {\n const index = context.register(schema);\n const valueAlias = context.unique('v');\n const registryAlias = context.unique('r');\n\n return `\nconst ${valueAlias} = ${valuePath};\nconst ${registryAlias} = ctx.registry[${index}];\nif (typeof ${valueAlias} !== 'symbol') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for \"path\", expected symbol\\`); }\nif (${valueAlias} !== ${registryAlias}) { throw new TypeError(\\`Invalid value \\${${valueAlias}.toString()} for path \"${path}\", expected ${schema.toString()}\\`); }\n `;\n } else if (schema === null || schema === undefined) {\n const valueAlias = context.unique('v');\n return `\nconst ${valueAlias} = ${valuePath};\nif (${valueAlias} !== null && ${valueAlias} !== undefined ) { throw new TypeError(\\`Invalid value ${valueAlias} for path \"${path}\", expected nullable\\`); }\n `;\n } else {\n const valueAlias = context.unique('v');\n const value = context.unique('val');\n return `\nconst ${valueAlias} = ${valuePath};\nconst ${value} = ${JSON.stringify(schema)};\nif (typeof ${valueAlias} !== '${typeof schema}') { throw new TypeError(\\`Invalid type \\${typeof ${valueAlias}} for path \"${path}\", expected ${typeof schema}\\`); }\nif (${valueAlias} !== ${value}) { throw new TypeError(\\`Invalid value ${JSON.stringify(valueAlias)} for path \"${path}\", expected ${JSON.stringify(schema)}\\`); }\n`;\n }\n};\n\nexport const compile = <T>(schema: Schema<T>, rootName: string) => {\n const context = new Context();\n const code = codeGen(schema, context, 'data', rootName);\n const validator = new Function('ctx', 'data', code);\n return (data: T) => validator(context, data);\n};\n\nexport const ascertain = <T>(schema: Schema<T>, data: T, rootName = '[root]') => {\n compile(schema, rootName)(data);\n};\n"],"names":["Operator","constructor","schemas","length","TypeError","name","$keys","Symbol","for","$values","$strict","Or","or","And","and","Optional","schema","optional","Tuple","tuple","fromBase64","Buffer","value","atob","from","toString","MULTIPLIERS","ms","s","m","h","d","w","as","string","undefined","number","result","parseFloat","Number","isFinite","date","Date","parse","time","matches","match","amount","unit","parseInt","boolean","test","array","delimiter","split","json","JSON","e","base64","formatError","expected","path","subject","stringify","Context","registry","varIndex","register","includes","push","indexOf","unique","prefix","codeGen","context","valuePath","valueAlias","errorsAlias","code","map","join","reduceRight","idx","index","registryAlias","Array","isArray","key","RegExp","keysAlias","kAlias","vAlias","entriesAlias","extraAlias","Object","keys","entries","compile","rootName","validator","Function","data","ascertain"],"mappings":"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"}
|
|
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
|
|
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.
|
|
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.
|
|
46
|
-
"@typescript-eslint/eslint-plugin": "^7.
|
|
47
|
-
"@typescript-eslint/parser": "^7.
|
|
48
|
-
"eslint": "^9.
|
|
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.
|
|
57
|
+
"prettier": "^3.3.3",
|
|
58
58
|
"ts-node": "^10.9.2",
|
|
59
59
|
"typescript": "^5.5.3"
|
|
60
60
|
},
|