@sinclair/typebox 0.34.10 → 0.34.11
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.
|
@@ -13,10 +13,11 @@ const index_8 = require("../type/registry/index");
|
|
|
13
13
|
const index_9 = require("../type/keyof/index");
|
|
14
14
|
const extends_undefined_1 = require("../type/extends/extends-undefined");
|
|
15
15
|
const index_10 = require("../type/never/index");
|
|
16
|
+
const index_11 = require("../type/ref/index");
|
|
16
17
|
// ------------------------------------------------------------------
|
|
17
18
|
// ValueGuard
|
|
18
19
|
// ------------------------------------------------------------------
|
|
19
|
-
const
|
|
20
|
+
const index_12 = require("../value/guard/index");
|
|
20
21
|
// ------------------------------------------------------------------
|
|
21
22
|
// TypeGuard
|
|
22
23
|
// ------------------------------------------------------------------
|
|
@@ -211,17 +212,17 @@ var TypeCompiler;
|
|
|
211
212
|
function* FromArray(schema, references, value) {
|
|
212
213
|
yield `Array.isArray(${value})`;
|
|
213
214
|
const [parameter, accumulator] = [CreateParameter('value', 'any'), CreateParameter('acc', 'number')];
|
|
214
|
-
if ((0,
|
|
215
|
+
if ((0, index_12.IsNumber)(schema.maxItems))
|
|
215
216
|
yield `${value}.length <= ${schema.maxItems}`;
|
|
216
|
-
if ((0,
|
|
217
|
+
if ((0, index_12.IsNumber)(schema.minItems))
|
|
217
218
|
yield `${value}.length >= ${schema.minItems}`;
|
|
218
219
|
const elementExpression = CreateExpression(schema.items, references, 'value');
|
|
219
220
|
yield `${value}.every((${parameter}) => ${elementExpression})`;
|
|
220
|
-
if ((0, type_1.IsSchema)(schema.contains) || (0,
|
|
221
|
+
if ((0, type_1.IsSchema)(schema.contains) || (0, index_12.IsNumber)(schema.minContains) || (0, index_12.IsNumber)(schema.maxContains)) {
|
|
221
222
|
const containsSchema = (0, type_1.IsSchema)(schema.contains) ? schema.contains : (0, index_10.Never)();
|
|
222
223
|
const checkExpression = CreateExpression(containsSchema, references, 'value');
|
|
223
|
-
const checkMinContains = (0,
|
|
224
|
-
const checkMaxContains = (0,
|
|
224
|
+
const checkMinContains = (0, index_12.IsNumber)(schema.minContains) ? [`(count >= ${schema.minContains})`] : [];
|
|
225
|
+
const checkMaxContains = (0, index_12.IsNumber)(schema.maxContains) ? [`(count <= ${schema.maxContains})`] : [];
|
|
225
226
|
const checkCount = `const count = value.reduce((${accumulator}, ${parameter}) => ${checkExpression} ? acc + 1 : acc, 0)`;
|
|
226
227
|
const check = [`(count > 0)`, ...checkMinContains, ...checkMaxContains].join(' && ');
|
|
227
228
|
yield `((${parameter}) => { ${checkCount}; return ${check}})(${value})`;
|
|
@@ -237,15 +238,15 @@ var TypeCompiler;
|
|
|
237
238
|
}
|
|
238
239
|
function* FromBigInt(schema, references, value) {
|
|
239
240
|
yield `(typeof ${value} === 'bigint')`;
|
|
240
|
-
if ((0,
|
|
241
|
+
if ((0, index_12.IsBigInt)(schema.exclusiveMaximum))
|
|
241
242
|
yield `${value} < BigInt(${schema.exclusiveMaximum})`;
|
|
242
|
-
if ((0,
|
|
243
|
+
if ((0, index_12.IsBigInt)(schema.exclusiveMinimum))
|
|
243
244
|
yield `${value} > BigInt(${schema.exclusiveMinimum})`;
|
|
244
|
-
if ((0,
|
|
245
|
+
if ((0, index_12.IsBigInt)(schema.maximum))
|
|
245
246
|
yield `${value} <= BigInt(${schema.maximum})`;
|
|
246
|
-
if ((0,
|
|
247
|
+
if ((0, index_12.IsBigInt)(schema.minimum))
|
|
247
248
|
yield `${value} >= BigInt(${schema.minimum})`;
|
|
248
|
-
if ((0,
|
|
249
|
+
if ((0, index_12.IsBigInt)(schema.multipleOf))
|
|
249
250
|
yield `(${value} % BigInt(${schema.multipleOf})) === 0`;
|
|
250
251
|
}
|
|
251
252
|
function* FromBoolean(schema, references, value) {
|
|
@@ -256,36 +257,37 @@ var TypeCompiler;
|
|
|
256
257
|
}
|
|
257
258
|
function* FromDate(schema, references, value) {
|
|
258
259
|
yield `(${value} instanceof Date) && Number.isFinite(${value}.getTime())`;
|
|
259
|
-
if ((0,
|
|
260
|
+
if ((0, index_12.IsNumber)(schema.exclusiveMaximumTimestamp))
|
|
260
261
|
yield `${value}.getTime() < ${schema.exclusiveMaximumTimestamp}`;
|
|
261
|
-
if ((0,
|
|
262
|
+
if ((0, index_12.IsNumber)(schema.exclusiveMinimumTimestamp))
|
|
262
263
|
yield `${value}.getTime() > ${schema.exclusiveMinimumTimestamp}`;
|
|
263
|
-
if ((0,
|
|
264
|
+
if ((0, index_12.IsNumber)(schema.maximumTimestamp))
|
|
264
265
|
yield `${value}.getTime() <= ${schema.maximumTimestamp}`;
|
|
265
|
-
if ((0,
|
|
266
|
+
if ((0, index_12.IsNumber)(schema.minimumTimestamp))
|
|
266
267
|
yield `${value}.getTime() >= ${schema.minimumTimestamp}`;
|
|
267
|
-
if ((0,
|
|
268
|
+
if ((0, index_12.IsNumber)(schema.multipleOfTimestamp))
|
|
268
269
|
yield `(${value}.getTime() % ${schema.multipleOfTimestamp}) === 0`;
|
|
269
270
|
}
|
|
270
271
|
function* FromFunction(schema, references, value) {
|
|
271
272
|
yield `(typeof ${value} === 'function')`;
|
|
272
273
|
}
|
|
273
274
|
function* FromImport(schema, references, value) {
|
|
274
|
-
const
|
|
275
|
-
|
|
276
|
-
|
|
275
|
+
const members = globalThis.Object.getOwnPropertyNames(schema.$defs).reduce((result, key) => {
|
|
276
|
+
return [...result, schema.$defs[key]];
|
|
277
|
+
}, []);
|
|
278
|
+
yield* Visit((0, index_11.Ref)(schema.$ref), [...references, ...members], value);
|
|
277
279
|
}
|
|
278
280
|
function* FromInteger(schema, references, value) {
|
|
279
281
|
yield `Number.isInteger(${value})`;
|
|
280
|
-
if ((0,
|
|
282
|
+
if ((0, index_12.IsNumber)(schema.exclusiveMaximum))
|
|
281
283
|
yield `${value} < ${schema.exclusiveMaximum}`;
|
|
282
|
-
if ((0,
|
|
284
|
+
if ((0, index_12.IsNumber)(schema.exclusiveMinimum))
|
|
283
285
|
yield `${value} > ${schema.exclusiveMinimum}`;
|
|
284
|
-
if ((0,
|
|
286
|
+
if ((0, index_12.IsNumber)(schema.maximum))
|
|
285
287
|
yield `${value} <= ${schema.maximum}`;
|
|
286
|
-
if ((0,
|
|
288
|
+
if ((0, index_12.IsNumber)(schema.minimum))
|
|
287
289
|
yield `${value} >= ${schema.minimum}`;
|
|
288
|
-
if ((0,
|
|
290
|
+
if ((0, index_12.IsNumber)(schema.multipleOf))
|
|
289
291
|
yield `(${value} % ${schema.multipleOf}) === 0`;
|
|
290
292
|
}
|
|
291
293
|
function* FromIntersect(schema, references, value) {
|
|
@@ -327,22 +329,22 @@ var TypeCompiler;
|
|
|
327
329
|
}
|
|
328
330
|
function* FromNumber(schema, references, value) {
|
|
329
331
|
yield Policy.IsNumberLike(value);
|
|
330
|
-
if ((0,
|
|
332
|
+
if ((0, index_12.IsNumber)(schema.exclusiveMaximum))
|
|
331
333
|
yield `${value} < ${schema.exclusiveMaximum}`;
|
|
332
|
-
if ((0,
|
|
334
|
+
if ((0, index_12.IsNumber)(schema.exclusiveMinimum))
|
|
333
335
|
yield `${value} > ${schema.exclusiveMinimum}`;
|
|
334
|
-
if ((0,
|
|
336
|
+
if ((0, index_12.IsNumber)(schema.maximum))
|
|
335
337
|
yield `${value} <= ${schema.maximum}`;
|
|
336
|
-
if ((0,
|
|
338
|
+
if ((0, index_12.IsNumber)(schema.minimum))
|
|
337
339
|
yield `${value} >= ${schema.minimum}`;
|
|
338
|
-
if ((0,
|
|
340
|
+
if ((0, index_12.IsNumber)(schema.multipleOf))
|
|
339
341
|
yield `(${value} % ${schema.multipleOf}) === 0`;
|
|
340
342
|
}
|
|
341
343
|
function* FromObject(schema, references, value) {
|
|
342
344
|
yield Policy.IsObjectLike(value);
|
|
343
|
-
if ((0,
|
|
345
|
+
if ((0, index_12.IsNumber)(schema.minProperties))
|
|
344
346
|
yield `Object.getOwnPropertyNames(${value}).length >= ${schema.minProperties}`;
|
|
345
|
-
if ((0,
|
|
347
|
+
if ((0, index_12.IsNumber)(schema.maxProperties))
|
|
346
348
|
yield `Object.getOwnPropertyNames(${value}).length <= ${schema.maxProperties}`;
|
|
347
349
|
const knownKeys = Object.getOwnPropertyNames(schema.properties);
|
|
348
350
|
for (const knownKey of knownKeys) {
|
|
@@ -378,9 +380,9 @@ var TypeCompiler;
|
|
|
378
380
|
}
|
|
379
381
|
function* FromRecord(schema, references, value) {
|
|
380
382
|
yield Policy.IsRecordLike(value);
|
|
381
|
-
if ((0,
|
|
383
|
+
if ((0, index_12.IsNumber)(schema.minProperties))
|
|
382
384
|
yield `Object.getOwnPropertyNames(${value}).length >= ${schema.minProperties}`;
|
|
383
|
-
if ((0,
|
|
385
|
+
if ((0, index_12.IsNumber)(schema.maxProperties))
|
|
384
386
|
yield `Object.getOwnPropertyNames(${value}).length <= ${schema.maxProperties}`;
|
|
385
387
|
const [patternKey, patternSchema] = Object.entries(schema.patternProperties)[0];
|
|
386
388
|
const variable = CreateVariable(`${new RegExp(patternKey)}`);
|
|
@@ -392,29 +394,25 @@ var TypeCompiler;
|
|
|
392
394
|
function* FromRef(schema, references, value) {
|
|
393
395
|
const target = (0, index_5.Deref)(schema, references);
|
|
394
396
|
// Reference: If we have seen this reference before we can just yield and return the function call.
|
|
395
|
-
// If this isn't the case we defer to visit to generate and set the
|
|
396
|
-
|
|
397
|
-
// enable self referential types to terminate. This needs to be refactored.
|
|
398
|
-
const recursiveEnd = `_recursion_end_for_${schema.$ref}`;
|
|
399
|
-
if (state.functions.has(recursiveEnd))
|
|
397
|
+
// If this isn't the case we defer to visit to generate and set the function for subsequent passes.
|
|
398
|
+
if (state.functions.has(schema.$ref))
|
|
400
399
|
return yield `${CreateFunctionName(schema.$ref)}(${value})`;
|
|
401
|
-
state.functions.set(recursiveEnd, ''); // terminate recursion here by setting the name.
|
|
402
400
|
yield* Visit(target, references, value);
|
|
403
401
|
}
|
|
404
402
|
function* FromRegExp(schema, references, value) {
|
|
405
403
|
const variable = CreateVariable(`${new RegExp(schema.source, schema.flags)};`);
|
|
406
404
|
yield `(typeof ${value} === 'string')`;
|
|
407
|
-
if ((0,
|
|
405
|
+
if ((0, index_12.IsNumber)(schema.maxLength))
|
|
408
406
|
yield `${value}.length <= ${schema.maxLength}`;
|
|
409
|
-
if ((0,
|
|
407
|
+
if ((0, index_12.IsNumber)(schema.minLength))
|
|
410
408
|
yield `${value}.length >= ${schema.minLength}`;
|
|
411
409
|
yield `${variable}.test(${value})`;
|
|
412
410
|
}
|
|
413
411
|
function* FromString(schema, references, value) {
|
|
414
412
|
yield `(typeof ${value} === 'string')`;
|
|
415
|
-
if ((0,
|
|
413
|
+
if ((0, index_12.IsNumber)(schema.maxLength))
|
|
416
414
|
yield `${value}.length <= ${schema.maxLength}`;
|
|
417
|
-
if ((0,
|
|
415
|
+
if ((0, index_12.IsNumber)(schema.minLength))
|
|
418
416
|
yield `${value}.length >= ${schema.minLength}`;
|
|
419
417
|
if (schema.pattern !== undefined) {
|
|
420
418
|
const variable = CreateVariable(`${new RegExp(schema.pattern)};`);
|
|
@@ -455,9 +453,9 @@ var TypeCompiler;
|
|
|
455
453
|
}
|
|
456
454
|
function* FromUint8Array(schema, references, value) {
|
|
457
455
|
yield `${value} instanceof Uint8Array`;
|
|
458
|
-
if ((0,
|
|
456
|
+
if ((0, index_12.IsNumber)(schema.maxByteLength))
|
|
459
457
|
yield `(${value}.length <= ${schema.maxByteLength})`;
|
|
460
|
-
if ((0,
|
|
458
|
+
if ((0, index_12.IsNumber)(schema.minByteLength))
|
|
461
459
|
yield `(${value}.length >= ${schema.minByteLength})`;
|
|
462
460
|
}
|
|
463
461
|
function* FromUnknown(schema, references, value) {
|
|
@@ -472,17 +470,21 @@ var TypeCompiler;
|
|
|
472
470
|
yield `kind('${schema[index_7.Kind]}', ${instance}, ${value})`;
|
|
473
471
|
}
|
|
474
472
|
function* Visit(schema, references, value, useHoisting = true) {
|
|
475
|
-
const references_ = (0,
|
|
473
|
+
const references_ = (0, index_12.IsString)(schema.$id) ? [...references, schema] : references;
|
|
476
474
|
const schema_ = schema;
|
|
477
475
|
// --------------------------------------------------------------
|
|
478
476
|
// Hoisting
|
|
479
477
|
// --------------------------------------------------------------
|
|
480
|
-
if (useHoisting && (0,
|
|
478
|
+
if (useHoisting && (0, index_12.IsString)(schema.$id)) {
|
|
481
479
|
const functionName = CreateFunctionName(schema.$id);
|
|
482
480
|
if (state.functions.has(functionName)) {
|
|
483
481
|
return yield `${functionName}(${value})`;
|
|
484
482
|
}
|
|
485
483
|
else {
|
|
484
|
+
// Note: In the case of cyclic types, we need to create a 'functions' record
|
|
485
|
+
// to prevent infinitely re-visiting the CreateFunction. Subsequent attempts
|
|
486
|
+
// to visit will be caught by the above condition.
|
|
487
|
+
state.functions.set(functionName, '<deferred>');
|
|
486
488
|
const functionCode = CreateFunction(functionName, schema, references, 'value', false);
|
|
487
489
|
state.functions.set(functionName, functionCode);
|
|
488
490
|
return yield `${functionName}(${value})`;
|
|
@@ -607,7 +609,7 @@ var TypeCompiler;
|
|
|
607
609
|
const functions = [...state.functions.values()];
|
|
608
610
|
const variables = [...state.variables.values()];
|
|
609
611
|
// prettier-ignore
|
|
610
|
-
const checkFunction = (0,
|
|
612
|
+
const checkFunction = (0, index_12.IsString)(schema.$id) // ensure top level schemas with $id's are hoisted
|
|
611
613
|
? `return function check(${parameter})${returns} {\n return ${CreateFunctionName(schema.$id)}(value)\n}`
|
|
612
614
|
: `return ${functionCode}`;
|
|
613
615
|
return [...variables, ...functions, checkFunction].join('\n');
|
|
@@ -616,8 +618,8 @@ var TypeCompiler;
|
|
|
616
618
|
function Code(...args) {
|
|
617
619
|
const defaults = { language: 'javascript' };
|
|
618
620
|
// prettier-ignore
|
|
619
|
-
const [schema, references, options] = (args.length === 2 && (0,
|
|
620
|
-
args.length === 2 && !(0,
|
|
621
|
+
const [schema, references, options] = (args.length === 2 && (0, index_12.IsArray)(args[1]) ? [args[0], args[1], defaults] :
|
|
622
|
+
args.length === 2 && !(0, index_12.IsArray)(args[1]) ? [args[0], [], args[1]] :
|
|
621
623
|
args.length === 3 ? [args[0], args[1], args[2]] :
|
|
622
624
|
args.length === 1 ? [args[0], [], defaults] :
|
|
623
625
|
[null, [], defaults]);
|
|
@@ -9,6 +9,7 @@ import { TypeRegistry, FormatRegistry } from '../type/registry/index.mjs';
|
|
|
9
9
|
import { KeyOfPattern } from '../type/keyof/index.mjs';
|
|
10
10
|
import { ExtendsUndefinedCheck } from '../type/extends/extends-undefined.mjs';
|
|
11
11
|
import { Never } from '../type/never/index.mjs';
|
|
12
|
+
import { Ref } from '../type/ref/index.mjs';
|
|
12
13
|
// ------------------------------------------------------------------
|
|
13
14
|
// ValueGuard
|
|
14
15
|
// ------------------------------------------------------------------
|
|
@@ -264,9 +265,10 @@ export var TypeCompiler;
|
|
|
264
265
|
yield `(typeof ${value} === 'function')`;
|
|
265
266
|
}
|
|
266
267
|
function* FromImport(schema, references, value) {
|
|
267
|
-
const
|
|
268
|
-
|
|
269
|
-
|
|
268
|
+
const members = globalThis.Object.getOwnPropertyNames(schema.$defs).reduce((result, key) => {
|
|
269
|
+
return [...result, schema.$defs[key]];
|
|
270
|
+
}, []);
|
|
271
|
+
yield* Visit(Ref(schema.$ref), [...references, ...members], value);
|
|
270
272
|
}
|
|
271
273
|
function* FromInteger(schema, references, value) {
|
|
272
274
|
yield `Number.isInteger(${value})`;
|
|
@@ -385,13 +387,9 @@ export var TypeCompiler;
|
|
|
385
387
|
function* FromRef(schema, references, value) {
|
|
386
388
|
const target = Deref(schema, references);
|
|
387
389
|
// Reference: If we have seen this reference before we can just yield and return the function call.
|
|
388
|
-
// If this isn't the case we defer to visit to generate and set the
|
|
389
|
-
|
|
390
|
-
// enable self referential types to terminate. This needs to be refactored.
|
|
391
|
-
const recursiveEnd = `_recursion_end_for_${schema.$ref}`;
|
|
392
|
-
if (state.functions.has(recursiveEnd))
|
|
390
|
+
// If this isn't the case we defer to visit to generate and set the function for subsequent passes.
|
|
391
|
+
if (state.functions.has(schema.$ref))
|
|
393
392
|
return yield `${CreateFunctionName(schema.$ref)}(${value})`;
|
|
394
|
-
state.functions.set(recursiveEnd, ''); // terminate recursion here by setting the name.
|
|
395
393
|
yield* Visit(target, references, value);
|
|
396
394
|
}
|
|
397
395
|
function* FromRegExp(schema, references, value) {
|
|
@@ -476,6 +474,10 @@ export var TypeCompiler;
|
|
|
476
474
|
return yield `${functionName}(${value})`;
|
|
477
475
|
}
|
|
478
476
|
else {
|
|
477
|
+
// Note: In the case of cyclic types, we need to create a 'functions' record
|
|
478
|
+
// to prevent infinitely re-visiting the CreateFunction. Subsequent attempts
|
|
479
|
+
// to visit will be caught by the above condition.
|
|
480
|
+
state.functions.set(functionName, '<deferred>');
|
|
479
481
|
const functionCode = CreateFunction(functionName, schema, references, 'value', false);
|
|
480
482
|
state.functions.set(functionName, functionCode);
|
|
481
483
|
return yield `${functionName}(${value})`;
|