@cfworker/json-schema 4.1.1 → 4.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commonjs/deep-compare-strict.d.ts +1 -0
- package/dist/commonjs/deep-compare-strict.d.ts.map +1 -0
- package/dist/commonjs/deep-compare-strict.js +10 -4
- package/dist/commonjs/deep-compare-strict.js.map +1 -0
- package/dist/commonjs/dereference.d.ts +1 -0
- package/dist/commonjs/dereference.d.ts.map +1 -0
- package/dist/commonjs/dereference.js +4 -2
- package/dist/commonjs/dereference.js.map +1 -0
- package/dist/commonjs/format.d.ts +1 -0
- package/dist/commonjs/format.d.ts.map +1 -0
- package/dist/commonjs/format.js +26 -9
- package/dist/commonjs/format.js.map +1 -0
- package/dist/commonjs/index.d.ts +1 -0
- package/dist/commonjs/index.d.ts.map +1 -0
- package/dist/commonjs/index.js +1 -0
- package/dist/commonjs/index.js.map +1 -0
- package/dist/commonjs/package.json +2 -1
- package/dist/commonjs/pointer.d.ts +1 -0
- package/dist/commonjs/pointer.d.ts.map +1 -0
- package/dist/commonjs/pointer.js +1 -0
- package/dist/commonjs/pointer.js.map +1 -0
- package/dist/commonjs/types.d.ts +1 -0
- package/dist/commonjs/types.d.ts.map +1 -0
- package/dist/commonjs/types.js +1 -0
- package/dist/commonjs/types.js.map +1 -0
- package/dist/commonjs/ucs2-length.d.ts +1 -0
- package/dist/commonjs/ucs2-length.d.ts.map +1 -0
- package/dist/commonjs/ucs2-length.js +1 -0
- package/dist/commonjs/ucs2-length.js.map +1 -0
- package/dist/commonjs/validate.d.ts +1 -0
- package/dist/commonjs/validate.d.ts.map +1 -0
- package/dist/commonjs/validate.js +51 -25
- package/dist/commonjs/validate.js.map +1 -0
- package/dist/commonjs/validator.d.ts +1 -0
- package/dist/commonjs/validator.d.ts.map +1 -0
- package/dist/commonjs/validator.js +1 -0
- package/dist/commonjs/validator.js.map +1 -0
- package/dist/esm/deep-compare-strict.d.ts +1 -0
- package/dist/esm/deep-compare-strict.d.ts.map +1 -0
- package/dist/esm/deep-compare-strict.js +10 -4
- package/dist/esm/deep-compare-strict.js.map +1 -0
- package/dist/esm/dereference.d.ts +1 -0
- package/dist/esm/dereference.d.ts.map +1 -0
- package/dist/esm/dereference.js +4 -2
- package/dist/esm/dereference.js.map +1 -0
- package/dist/esm/format.d.ts +1 -0
- package/dist/esm/format.d.ts.map +1 -0
- package/dist/esm/format.js +26 -9
- package/dist/esm/format.js.map +1 -0
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/package.json +2 -1
- package/dist/esm/pointer.d.ts +1 -0
- package/dist/esm/pointer.d.ts.map +1 -0
- package/dist/esm/pointer.js +1 -0
- package/dist/esm/pointer.js.map +1 -0
- package/dist/esm/types.d.ts +1 -0
- package/dist/esm/types.d.ts.map +1 -0
- package/dist/esm/types.js +1 -0
- package/dist/esm/types.js.map +1 -0
- package/dist/esm/ucs2-length.d.ts +1 -0
- package/dist/esm/ucs2-length.d.ts.map +1 -0
- package/dist/esm/ucs2-length.js +1 -0
- package/dist/esm/ucs2-length.js.map +1 -0
- package/dist/esm/validate.d.ts +1 -0
- package/dist/esm/validate.d.ts.map +1 -0
- package/dist/esm/validate.js +51 -25
- package/dist/esm/validate.js.map +1 -0
- package/dist/esm/validator.d.ts +1 -0
- package/dist/esm/validator.d.ts.map +1 -0
- package/dist/esm/validator.js +1 -0
- package/dist/esm/validator.js.map +1 -0
- package/package.json +13 -10
- package/src/deep-compare-strict.ts +9 -4
- package/src/dereference.ts +3 -2
- package/src/format.ts +27 -9
- package/src/types.ts +1 -7
- package/src/validate.ts +67 -31
- package/src/deep-compare-strict.d.ts +0 -1
- package/src/dereference.d.ts +0 -12
- package/src/format.d.ts +0 -2
- package/src/index.d.ts +0 -8
- package/src/pointer.d.ts +0 -2
- package/src/types.d.ts +0 -79
- package/src/ucs2-length.d.ts +0 -1
- package/src/validate.d.ts +0 -13
- package/src/validator.d.ts +0 -14
package/dist/esm/validate.js
CHANGED
|
@@ -3,6 +3,36 @@ import { dereference } from './dereference.js';
|
|
|
3
3
|
import { format } from './format.js';
|
|
4
4
|
import { encodePointer } from './pointer.js';
|
|
5
5
|
import { ucs2length } from './ucs2-length.js';
|
|
6
|
+
function hasOwnProperty(instance, key) {
|
|
7
|
+
return Object.prototype.hasOwnProperty.call(instance, key);
|
|
8
|
+
}
|
|
9
|
+
function decimalInteger(value) {
|
|
10
|
+
const coefficientAndExponent = Math.abs(value).toString().split('e');
|
|
11
|
+
const coefficient = coefficientAndExponent[0];
|
|
12
|
+
const exponent = coefficientAndExponent[1] ?? '0';
|
|
13
|
+
const point = coefficient.indexOf('.');
|
|
14
|
+
const fractionLength = point === -1 ? 0 : coefficient.length - point - 1;
|
|
15
|
+
return [
|
|
16
|
+
BigInt(coefficient.replace('.', '')),
|
|
17
|
+
Number(exponent) - fractionLength
|
|
18
|
+
];
|
|
19
|
+
}
|
|
20
|
+
function isMultipleOf(instance, divisor) {
|
|
21
|
+
if (!Number.isFinite(instance) || !Number.isFinite(divisor) || divisor <= 0) {
|
|
22
|
+
return false;
|
|
23
|
+
}
|
|
24
|
+
const [instanceCoefficient, instanceExponent] = decimalInteger(instance);
|
|
25
|
+
const [divisorCoefficient, divisorExponent] = decimalInteger(divisor);
|
|
26
|
+
const exponentDifference = instanceExponent - divisorExponent;
|
|
27
|
+
if (exponentDifference >= 0) {
|
|
28
|
+
return ((instanceCoefficient * 10n ** BigInt(exponentDifference)) %
|
|
29
|
+
divisorCoefficient ===
|
|
30
|
+
0n);
|
|
31
|
+
}
|
|
32
|
+
return (instanceCoefficient %
|
|
33
|
+
(divisorCoefficient * 10n ** BigInt(-exponentDifference)) ===
|
|
34
|
+
0n);
|
|
35
|
+
}
|
|
6
36
|
export function validate(instance, schema, draft = '2019-09', lookup = dereference(schema), shortCircuit = true, recursiveAnchor = null, instanceLocation = '#', schemaLocation = '#', evaluated = Object.create(null)) {
|
|
7
37
|
if (schema === true) {
|
|
8
38
|
return { valid: true, errors: [] };
|
|
@@ -184,8 +214,7 @@ export function validate(instance, schema, draft = '2019-09', lookup = dereferen
|
|
|
184
214
|
const keywordLocation = `${schemaLocation}/anyOf`;
|
|
185
215
|
const errorsLength = errors.length;
|
|
186
216
|
let anyValid = false;
|
|
187
|
-
for (
|
|
188
|
-
const subSchema = $anyOf[i];
|
|
217
|
+
for (const [i, subSchema] of $anyOf.entries()) {
|
|
189
218
|
const subEvaluated = Object.create(evaluated);
|
|
190
219
|
const result = validate(instance, subSchema, draft, lookup, shortCircuit, $recursiveAnchor === true ? recursiveAnchor : null, instanceLocation, `${keywordLocation}/${i}`, subEvaluated);
|
|
191
220
|
errors.push(...result.errors);
|
|
@@ -210,8 +239,7 @@ export function validate(instance, schema, draft = '2019-09', lookup = dereferen
|
|
|
210
239
|
const keywordLocation = `${schemaLocation}/allOf`;
|
|
211
240
|
const errorsLength = errors.length;
|
|
212
241
|
let allValid = true;
|
|
213
|
-
for (
|
|
214
|
-
const subSchema = $allOf[i];
|
|
242
|
+
for (const [i, subSchema] of $allOf.entries()) {
|
|
215
243
|
const subEvaluated = Object.create(evaluated);
|
|
216
244
|
const result = validate(instance, subSchema, draft, lookup, shortCircuit, $recursiveAnchor === true ? recursiveAnchor : null, instanceLocation, `${keywordLocation}/${i}`, subEvaluated);
|
|
217
245
|
errors.push(...result.errors);
|
|
@@ -290,7 +318,7 @@ export function validate(instance, schema, draft = '2019-09', lookup = dereferen
|
|
|
290
318
|
if (instanceType === 'object') {
|
|
291
319
|
if ($required !== undefined) {
|
|
292
320
|
for (const key of $required) {
|
|
293
|
-
if (!(key
|
|
321
|
+
if (!hasOwnProperty(instance, key)) {
|
|
294
322
|
errors.push({
|
|
295
323
|
instanceLocation,
|
|
296
324
|
keyword: 'required',
|
|
@@ -335,10 +363,10 @@ export function validate(instance, schema, draft = '2019-09', lookup = dereferen
|
|
|
335
363
|
if ($dependentRequired !== undefined) {
|
|
336
364
|
const keywordLocation = `${schemaLocation}/dependantRequired`;
|
|
337
365
|
for (const key in $dependentRequired) {
|
|
338
|
-
if (key
|
|
366
|
+
if (hasOwnProperty(instance, key)) {
|
|
339
367
|
const required = $dependentRequired[key];
|
|
340
368
|
for (const dependantKey of required) {
|
|
341
|
-
if (!(dependantKey
|
|
369
|
+
if (!hasOwnProperty(instance, dependantKey)) {
|
|
342
370
|
errors.push({
|
|
343
371
|
instanceLocation,
|
|
344
372
|
keyword: 'dependentRequired',
|
|
@@ -351,10 +379,10 @@ export function validate(instance, schema, draft = '2019-09', lookup = dereferen
|
|
|
351
379
|
}
|
|
352
380
|
}
|
|
353
381
|
if ($dependentSchemas !== undefined) {
|
|
354
|
-
for (const key
|
|
382
|
+
for (const [key, dependentSchema] of Object.entries($dependentSchemas)) {
|
|
355
383
|
const keywordLocation = `${schemaLocation}/dependentSchemas`;
|
|
356
|
-
if (key
|
|
357
|
-
const result = validate(instance,
|
|
384
|
+
if (hasOwnProperty(instance, key)) {
|
|
385
|
+
const result = validate(instance, dependentSchema, draft, lookup, shortCircuit, recursiveAnchor, instanceLocation, `${keywordLocation}/${encodePointer(key)}`, evaluated);
|
|
358
386
|
if (!result.valid) {
|
|
359
387
|
errors.push({
|
|
360
388
|
instanceLocation,
|
|
@@ -369,11 +397,11 @@ export function validate(instance, schema, draft = '2019-09', lookup = dereferen
|
|
|
369
397
|
if ($dependencies !== undefined) {
|
|
370
398
|
const keywordLocation = `${schemaLocation}/dependencies`;
|
|
371
399
|
for (const key in $dependencies) {
|
|
372
|
-
if (key
|
|
400
|
+
if (hasOwnProperty(instance, key)) {
|
|
373
401
|
const propsOrSchema = $dependencies[key];
|
|
374
402
|
if (Array.isArray(propsOrSchema)) {
|
|
375
403
|
for (const dependantKey of propsOrSchema) {
|
|
376
|
-
if (!(dependantKey
|
|
404
|
+
if (!hasOwnProperty(instance, dependantKey)) {
|
|
377
405
|
errors.push({
|
|
378
406
|
instanceLocation,
|
|
379
407
|
keyword: 'dependencies',
|
|
@@ -401,14 +429,15 @@ export function validate(instance, schema, draft = '2019-09', lookup = dereferen
|
|
|
401
429
|
let stop = false;
|
|
402
430
|
if ($properties !== undefined) {
|
|
403
431
|
const keywordLocation = `${schemaLocation}/properties`;
|
|
404
|
-
for (const key
|
|
405
|
-
if (!(key
|
|
432
|
+
for (const [key, propertySchema] of Object.entries($properties)) {
|
|
433
|
+
if (!hasOwnProperty(instance, key)) {
|
|
406
434
|
continue;
|
|
407
435
|
}
|
|
408
436
|
const subInstancePointer = `${instanceLocation}/${encodePointer(key)}`;
|
|
409
|
-
const result = validate(instance[key],
|
|
437
|
+
const result = validate(instance[key], propertySchema, draft, lookup, shortCircuit, recursiveAnchor, subInstancePointer, `${keywordLocation}/${encodePointer(key)}`);
|
|
438
|
+
thisEvaluated[key] = true;
|
|
410
439
|
if (result.valid) {
|
|
411
|
-
evaluated[key] =
|
|
440
|
+
evaluated[key] = true;
|
|
412
441
|
}
|
|
413
442
|
else {
|
|
414
443
|
stop = shortCircuit;
|
|
@@ -425,17 +454,17 @@ export function validate(instance, schema, draft = '2019-09', lookup = dereferen
|
|
|
425
454
|
}
|
|
426
455
|
if (!stop && $patternProperties !== undefined) {
|
|
427
456
|
const keywordLocation = `${schemaLocation}/patternProperties`;
|
|
428
|
-
for (const pattern
|
|
457
|
+
for (const [pattern, subSchema] of Object.entries($patternProperties)) {
|
|
429
458
|
const regex = new RegExp(pattern, 'u');
|
|
430
|
-
const subSchema = $patternProperties[pattern];
|
|
431
459
|
for (const key in instance) {
|
|
432
460
|
if (!regex.test(key)) {
|
|
433
461
|
continue;
|
|
434
462
|
}
|
|
435
463
|
const subInstancePointer = `${instanceLocation}/${encodePointer(key)}`;
|
|
436
464
|
const result = validate(instance[key], subSchema, draft, lookup, shortCircuit, recursiveAnchor, subInstancePointer, `${keywordLocation}/${encodePointer(pattern)}`);
|
|
465
|
+
thisEvaluated[key] = true;
|
|
437
466
|
if (result.valid) {
|
|
438
|
-
evaluated[key] =
|
|
467
|
+
evaluated[key] = true;
|
|
439
468
|
}
|
|
440
469
|
else {
|
|
441
470
|
stop = shortCircuit;
|
|
@@ -619,9 +648,7 @@ export function validate(instance, schema, draft = '2019-09', lookup = dereferen
|
|
|
619
648
|
if (contained >= ($minContains || 0)) {
|
|
620
649
|
errors.length = errorsLength;
|
|
621
650
|
}
|
|
622
|
-
if ($minContains === undefined &&
|
|
623
|
-
$maxContains === undefined &&
|
|
624
|
-
contained === 0) {
|
|
651
|
+
if ($minContains === undefined && contained === 0) {
|
|
625
652
|
errors.splice(errorsLength, 0, {
|
|
626
653
|
instanceLocation,
|
|
627
654
|
keyword: 'contains',
|
|
@@ -747,9 +774,7 @@ export function validate(instance, schema, draft = '2019-09', lookup = dereferen
|
|
|
747
774
|
}
|
|
748
775
|
}
|
|
749
776
|
if ($multipleOf !== undefined) {
|
|
750
|
-
|
|
751
|
-
if (Math.abs(0 - remainder) >= 1.1920929e-7 &&
|
|
752
|
-
Math.abs($multipleOf - remainder) >= 1.1920929e-7) {
|
|
777
|
+
if (!isMultipleOf(instance, $multipleOf)) {
|
|
753
778
|
errors.push({
|
|
754
779
|
instanceLocation,
|
|
755
780
|
keyword: 'multipleOf',
|
|
@@ -800,3 +825,4 @@ export function validate(instance, schema, draft = '2019-09', lookup = dereferen
|
|
|
800
825
|
}
|
|
801
826
|
return { valid: errors.length === 0, errors };
|
|
802
827
|
}
|
|
828
|
+
//# sourceMappingURL=validate.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../src/validate.ts"],"names":[],"mappings":"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","sourcesContent":["import { deepCompareStrict } from './deep-compare-strict.js';\nimport { dereference } from './dereference.js';\nimport { format } from './format.js';\nimport { encodePointer } from './pointer.js';\nimport {\n InstanceType,\n OutputUnit,\n Schema,\n SchemaDraft,\n ValidationResult\n} from './types.js';\nimport { ucs2length } from './ucs2-length.js';\n\nexport type Evaluated = Record<string | number, boolean>;\n\nfunction hasOwnProperty(instance: object, key: PropertyKey): boolean {\n return Object.prototype.hasOwnProperty.call(instance, key);\n}\n\nfunction decimalInteger(\n value: number\n): [coefficient: bigint, exponent: number] {\n const coefficientAndExponent = Math.abs(value).toString().split('e');\n const coefficient = coefficientAndExponent[0]!;\n const exponent = coefficientAndExponent[1] ?? '0';\n const point = coefficient.indexOf('.');\n const fractionLength = point === -1 ? 0 : coefficient.length - point - 1;\n return [\n BigInt(coefficient.replace('.', '')),\n Number(exponent) - fractionLength\n ];\n}\n\nfunction isMultipleOf(instance: number, divisor: number): boolean {\n if (!Number.isFinite(instance) || !Number.isFinite(divisor) || divisor <= 0) {\n return false;\n }\n\n const [instanceCoefficient, instanceExponent] = decimalInteger(instance);\n const [divisorCoefficient, divisorExponent] = decimalInteger(divisor);\n const exponentDifference = instanceExponent - divisorExponent;\n\n if (exponentDifference >= 0) {\n return (\n (instanceCoefficient * 10n ** BigInt(exponentDifference)) %\n divisorCoefficient ===\n 0n\n );\n }\n\n return (\n instanceCoefficient %\n (divisorCoefficient * 10n ** BigInt(-exponentDifference)) ===\n 0n\n );\n}\n\nexport function validate(\n instance: any,\n schema: Schema | boolean,\n draft: SchemaDraft = '2019-09',\n lookup: Record<string, Schema | boolean> = dereference(schema),\n shortCircuit = true,\n recursiveAnchor: Schema | null = null,\n instanceLocation = '#',\n schemaLocation = '#',\n evaluated: Evaluated = Object.create(null)\n): ValidationResult {\n if (schema === true) {\n return { valid: true, errors: [] };\n }\n\n if (schema === false) {\n return {\n valid: false,\n errors: [\n {\n instanceLocation,\n keyword: 'false',\n keywordLocation: instanceLocation,\n error: 'False boolean schema.'\n }\n ]\n };\n }\n\n const rawInstanceType = typeof instance;\n let instanceType: Exclude<InstanceType, 'integer'>;\n switch (rawInstanceType) {\n case 'boolean':\n case 'number':\n case 'string':\n instanceType = rawInstanceType;\n break;\n case 'object':\n if (instance === null) {\n instanceType = 'null';\n } else if (Array.isArray(instance)) {\n instanceType = 'array';\n } else {\n instanceType = 'object';\n }\n break;\n default:\n // undefined, bigint, function, symbol\n throw new Error(\n `Instances of \"${rawInstanceType}\" type are not supported.`\n );\n }\n\n const {\n $ref,\n $recursiveRef,\n $recursiveAnchor,\n type: $type,\n const: $const,\n enum: $enum,\n required: $required,\n not: $not,\n anyOf: $anyOf,\n allOf: $allOf,\n oneOf: $oneOf,\n if: $if,\n then: $then,\n else: $else,\n\n format: $format,\n\n properties: $properties,\n patternProperties: $patternProperties,\n additionalProperties: $additionalProperties,\n unevaluatedProperties: $unevaluatedProperties,\n minProperties: $minProperties,\n maxProperties: $maxProperties,\n propertyNames: $propertyNames,\n dependentRequired: $dependentRequired,\n dependentSchemas: $dependentSchemas,\n dependencies: $dependencies,\n\n prefixItems: $prefixItems,\n items: $items,\n additionalItems: $additionalItems,\n unevaluatedItems: $unevaluatedItems,\n contains: $contains,\n minContains: $minContains,\n maxContains: $maxContains,\n minItems: $minItems,\n maxItems: $maxItems,\n uniqueItems: $uniqueItems,\n\n minimum: $minimum,\n maximum: $maximum,\n exclusiveMinimum: $exclusiveMinimum,\n exclusiveMaximum: $exclusiveMaximum,\n multipleOf: $multipleOf,\n\n minLength: $minLength,\n maxLength: $maxLength,\n pattern: $pattern,\n\n __absolute_ref__,\n __absolute_recursive_ref__\n } = schema;\n\n const errors: OutputUnit[] = [];\n\n if ($recursiveAnchor === true && recursiveAnchor === null) {\n recursiveAnchor = schema;\n }\n\n if ($recursiveRef === '#') {\n const refSchema =\n recursiveAnchor === null\n ? (lookup[__absolute_recursive_ref__!] as Schema)\n : recursiveAnchor;\n const keywordLocation = `${schemaLocation}/$recursiveRef`;\n const result = validate(\n instance,\n recursiveAnchor === null ? schema : recursiveAnchor,\n draft,\n lookup,\n shortCircuit,\n refSchema,\n instanceLocation,\n keywordLocation,\n evaluated\n );\n if (!result.valid) {\n errors.push(\n {\n instanceLocation,\n keyword: '$recursiveRef',\n keywordLocation,\n error: 'A subschema had errors.'\n },\n ...result.errors\n );\n }\n }\n\n if ($ref !== undefined) {\n const uri = __absolute_ref__ || $ref;\n const refSchema = lookup[uri];\n if (refSchema === undefined) {\n let message = `Unresolved $ref \"${$ref}\".`;\n if (__absolute_ref__ && __absolute_ref__ !== $ref) {\n message += ` Absolute URI \"${__absolute_ref__}\".`;\n }\n message += `\\nKnown schemas:\\n- ${Object.keys(lookup).join('\\n- ')}`;\n throw new Error(message);\n }\n const keywordLocation = `${schemaLocation}/$ref`;\n const result = validate(\n instance,\n refSchema,\n draft,\n lookup,\n shortCircuit,\n recursiveAnchor,\n instanceLocation,\n keywordLocation,\n evaluated\n );\n if (!result.valid) {\n errors.push(\n {\n instanceLocation,\n keyword: '$ref',\n keywordLocation,\n error: 'A subschema had errors.'\n },\n ...result.errors\n );\n }\n if (draft === '4' || draft === '7') {\n return { valid: errors.length === 0, errors };\n }\n }\n\n if (Array.isArray($type)) {\n let length = $type.length;\n let valid = false;\n for (let i = 0; i < length; i++) {\n if (\n instanceType === $type[i] ||\n ($type[i] === 'integer' &&\n instanceType === 'number' &&\n instance % 1 === 0 &&\n instance === instance)\n ) {\n valid = true;\n break;\n }\n }\n if (!valid) {\n errors.push({\n instanceLocation,\n keyword: 'type',\n keywordLocation: `${schemaLocation}/type`,\n error: `Instance type \"${instanceType}\" is invalid. Expected \"${$type.join(\n '\", \"'\n )}\".`\n });\n }\n } else if ($type === 'integer') {\n if (instanceType !== 'number' || instance % 1 || instance !== instance) {\n errors.push({\n instanceLocation,\n keyword: 'type',\n keywordLocation: `${schemaLocation}/type`,\n error: `Instance type \"${instanceType}\" is invalid. Expected \"${$type}\".`\n });\n }\n } else if ($type !== undefined && instanceType !== $type) {\n errors.push({\n instanceLocation,\n keyword: 'type',\n keywordLocation: `${schemaLocation}/type`,\n error: `Instance type \"${instanceType}\" is invalid. Expected \"${$type}\".`\n });\n }\n\n if ($const !== undefined) {\n if (instanceType === 'object' || instanceType === 'array') {\n if (!deepCompareStrict(instance, $const)) {\n errors.push({\n instanceLocation,\n keyword: 'const',\n keywordLocation: `${schemaLocation}/const`,\n error: `Instance does not match ${JSON.stringify($const)}.`\n });\n }\n } else if (instance !== $const) {\n errors.push({\n instanceLocation,\n keyword: 'const',\n keywordLocation: `${schemaLocation}/const`,\n error: `Instance does not match ${JSON.stringify($const)}.`\n });\n }\n }\n\n if ($enum !== undefined) {\n if (instanceType === 'object' || instanceType === 'array') {\n if (!$enum.some(value => deepCompareStrict(instance, value))) {\n errors.push({\n instanceLocation,\n keyword: 'enum',\n keywordLocation: `${schemaLocation}/enum`,\n error: `Instance does not match any of ${JSON.stringify($enum)}.`\n });\n }\n } else if (!$enum.some(value => instance === value)) {\n errors.push({\n instanceLocation,\n keyword: 'enum',\n keywordLocation: `${schemaLocation}/enum`,\n error: `Instance does not match any of ${JSON.stringify($enum)}.`\n });\n }\n }\n\n if ($not !== undefined) {\n const keywordLocation = `${schemaLocation}/not`;\n const result = validate(\n instance,\n $not,\n draft,\n lookup,\n shortCircuit,\n recursiveAnchor,\n instanceLocation,\n keywordLocation /*,\n evaluated*/\n );\n if (result.valid) {\n errors.push({\n instanceLocation,\n keyword: 'not',\n keywordLocation,\n error: 'Instance matched \"not\" schema.'\n });\n }\n }\n\n let subEvaluateds: Array<Evaluated> = [];\n\n if ($anyOf !== undefined) {\n const keywordLocation = `${schemaLocation}/anyOf`;\n const errorsLength = errors.length;\n let anyValid = false;\n for (const [i, subSchema] of $anyOf.entries()) {\n const subEvaluated: Evaluated = Object.create(evaluated);\n const result = validate(\n instance,\n subSchema,\n draft,\n lookup,\n shortCircuit,\n $recursiveAnchor === true ? recursiveAnchor : null,\n instanceLocation,\n `${keywordLocation}/${i}`,\n subEvaluated\n );\n errors.push(...result.errors);\n anyValid = anyValid || result.valid;\n if (result.valid) {\n subEvaluateds.push(subEvaluated);\n }\n }\n if (anyValid) {\n errors.length = errorsLength;\n } else {\n errors.splice(errorsLength, 0, {\n instanceLocation,\n keyword: 'anyOf',\n keywordLocation,\n error: 'Instance does not match any subschemas.'\n });\n }\n }\n\n if ($allOf !== undefined) {\n const keywordLocation = `${schemaLocation}/allOf`;\n const errorsLength = errors.length;\n let allValid = true;\n for (const [i, subSchema] of $allOf.entries()) {\n const subEvaluated: Evaluated = Object.create(evaluated);\n const result = validate(\n instance,\n subSchema,\n draft,\n lookup,\n shortCircuit,\n $recursiveAnchor === true ? recursiveAnchor : null,\n instanceLocation,\n `${keywordLocation}/${i}`,\n subEvaluated\n );\n errors.push(...result.errors);\n allValid = allValid && result.valid;\n if (result.valid) {\n subEvaluateds.push(subEvaluated);\n }\n }\n if (allValid) {\n errors.length = errorsLength;\n } else {\n errors.splice(errorsLength, 0, {\n instanceLocation,\n keyword: 'allOf',\n keywordLocation,\n error: `Instance does not match every subschema.`\n });\n }\n }\n\n if ($oneOf !== undefined) {\n const keywordLocation = `${schemaLocation}/oneOf`;\n const errorsLength = errors.length;\n const matches = $oneOf.filter((subSchema, i) => {\n const subEvaluated: Evaluated = Object.create(evaluated);\n const result = validate(\n instance,\n subSchema,\n draft,\n lookup,\n shortCircuit,\n $recursiveAnchor === true ? recursiveAnchor : null,\n instanceLocation,\n `${keywordLocation}/${i}`,\n subEvaluated\n );\n errors.push(...result.errors);\n if (result.valid) {\n subEvaluateds.push(subEvaluated);\n }\n return result.valid;\n }).length;\n if (matches === 1) {\n errors.length = errorsLength;\n } else {\n errors.splice(errorsLength, 0, {\n instanceLocation,\n keyword: 'oneOf',\n keywordLocation,\n error: `Instance does not match exactly one subschema (${matches} matches).`\n });\n }\n }\n\n if (instanceType === 'object' || instanceType === 'array') {\n Object.assign(evaluated, ...subEvaluateds);\n }\n\n if ($if !== undefined) {\n const keywordLocation = `${schemaLocation}/if`;\n const conditionResult = validate(\n instance,\n $if,\n draft,\n lookup,\n shortCircuit,\n recursiveAnchor,\n instanceLocation,\n keywordLocation,\n evaluated\n ).valid;\n if (conditionResult) {\n if ($then !== undefined) {\n const thenResult = validate(\n instance,\n $then,\n draft,\n lookup,\n shortCircuit,\n recursiveAnchor,\n instanceLocation,\n `${schemaLocation}/then`,\n evaluated\n );\n if (!thenResult.valid) {\n errors.push(\n {\n instanceLocation,\n keyword: 'if',\n keywordLocation,\n error: `Instance does not match \"then\" schema.`\n },\n ...thenResult.errors\n );\n }\n }\n } else if ($else !== undefined) {\n const elseResult = validate(\n instance,\n $else,\n draft,\n lookup,\n shortCircuit,\n recursiveAnchor,\n instanceLocation,\n `${schemaLocation}/else`,\n evaluated\n );\n if (!elseResult.valid) {\n errors.push(\n {\n instanceLocation,\n keyword: 'if',\n keywordLocation,\n error: `Instance does not match \"else\" schema.`\n },\n ...elseResult.errors\n );\n }\n }\n }\n\n if (instanceType === 'object') {\n if ($required !== undefined) {\n for (const key of $required) {\n if (!hasOwnProperty(instance, key)) {\n errors.push({\n instanceLocation,\n keyword: 'required',\n keywordLocation: `${schemaLocation}/required`,\n error: `Instance does not have required property \"${key}\".`\n });\n }\n }\n }\n\n const keys = Object.keys(instance);\n\n if ($minProperties !== undefined && keys.length < $minProperties) {\n errors.push({\n instanceLocation,\n keyword: 'minProperties',\n keywordLocation: `${schemaLocation}/minProperties`,\n error: `Instance does not have at least ${$minProperties} properties.`\n });\n }\n\n if ($maxProperties !== undefined && keys.length > $maxProperties) {\n errors.push({\n instanceLocation,\n keyword: 'maxProperties',\n keywordLocation: `${schemaLocation}/maxProperties`,\n error: `Instance does not have at least ${$maxProperties} properties.`\n });\n }\n\n if ($propertyNames !== undefined) {\n const keywordLocation = `${schemaLocation}/propertyNames`;\n for (const key in instance) {\n const subInstancePointer = `${instanceLocation}/${encodePointer(key)}`;\n const result = validate(\n key,\n $propertyNames,\n draft,\n lookup,\n shortCircuit,\n recursiveAnchor,\n subInstancePointer,\n keywordLocation\n );\n if (!result.valid) {\n errors.push(\n {\n instanceLocation,\n keyword: 'propertyNames',\n keywordLocation,\n error: `Property name \"${key}\" does not match schema.`\n },\n ...result.errors\n );\n }\n }\n }\n\n if ($dependentRequired !== undefined) {\n const keywordLocation = `${schemaLocation}/dependantRequired`;\n for (const key in $dependentRequired) {\n if (hasOwnProperty(instance, key)) {\n const required = $dependentRequired[key] as string[];\n for (const dependantKey of required) {\n if (!hasOwnProperty(instance, dependantKey)) {\n errors.push({\n instanceLocation,\n keyword: 'dependentRequired',\n keywordLocation,\n error: `Instance has \"${key}\" but does not have \"${dependantKey}\".`\n });\n }\n }\n }\n }\n }\n\n if ($dependentSchemas !== undefined) {\n for (const [key, dependentSchema] of Object.entries($dependentSchemas)) {\n const keywordLocation = `${schemaLocation}/dependentSchemas`;\n if (hasOwnProperty(instance, key)) {\n const result = validate(\n instance,\n dependentSchema,\n draft,\n lookup,\n shortCircuit,\n recursiveAnchor,\n instanceLocation,\n `${keywordLocation}/${encodePointer(key)}`,\n evaluated\n );\n if (!result.valid) {\n errors.push(\n {\n instanceLocation,\n keyword: 'dependentSchemas',\n keywordLocation,\n error: `Instance has \"${key}\" but does not match dependant schema.`\n },\n ...result.errors\n );\n }\n }\n }\n }\n\n if ($dependencies !== undefined) {\n const keywordLocation = `${schemaLocation}/dependencies`;\n for (const key in $dependencies) {\n if (hasOwnProperty(instance, key)) {\n const propsOrSchema = $dependencies[key] as Schema | string[];\n if (Array.isArray(propsOrSchema)) {\n for (const dependantKey of propsOrSchema) {\n if (!hasOwnProperty(instance, dependantKey)) {\n errors.push({\n instanceLocation,\n keyword: 'dependencies',\n keywordLocation,\n error: `Instance has \"${key}\" but does not have \"${dependantKey}\".`\n });\n }\n }\n } else {\n const result = validate(\n instance,\n propsOrSchema,\n draft,\n lookup,\n shortCircuit,\n recursiveAnchor,\n instanceLocation,\n `${keywordLocation}/${encodePointer(key)}`\n );\n if (!result.valid) {\n errors.push(\n {\n instanceLocation,\n keyword: 'dependencies',\n keywordLocation,\n error: `Instance has \"${key}\" but does not match dependant schema.`\n },\n ...result.errors\n );\n }\n }\n }\n }\n }\n\n const thisEvaluated = Object.create(null);\n\n let stop = false;\n\n if ($properties !== undefined) {\n const keywordLocation = `${schemaLocation}/properties`;\n for (const [key, propertySchema] of Object.entries($properties)) {\n if (!hasOwnProperty(instance, key)) {\n continue;\n }\n const subInstancePointer = `${instanceLocation}/${encodePointer(key)}`;\n const result = validate(\n instance[key],\n propertySchema,\n draft,\n lookup,\n shortCircuit,\n recursiveAnchor,\n subInstancePointer,\n `${keywordLocation}/${encodePointer(key)}`\n );\n // Covered by \"properties\" whether or not it is valid, so \"additionalProperties\"\n // must not apply to it. Only a valid result is an annotation for \"unevaluatedProperties\".\n thisEvaluated[key] = true;\n if (result.valid) {\n evaluated[key] = true;\n } else {\n stop = shortCircuit;\n errors.push(\n {\n instanceLocation,\n keyword: 'properties',\n keywordLocation,\n error: `Property \"${key}\" does not match schema.`\n },\n ...result.errors\n );\n if (stop) break;\n }\n }\n }\n\n if (!stop && $patternProperties !== undefined) {\n const keywordLocation = `${schemaLocation}/patternProperties`;\n for (const [pattern, subSchema] of Object.entries($patternProperties)) {\n const regex = new RegExp(pattern, 'u');\n for (const key in instance) {\n if (!regex.test(key)) {\n continue;\n }\n const subInstancePointer = `${instanceLocation}/${encodePointer(\n key\n )}`;\n const result = validate(\n instance[key],\n subSchema,\n draft,\n lookup,\n shortCircuit,\n recursiveAnchor,\n subInstancePointer,\n `${keywordLocation}/${encodePointer(pattern)}`\n );\n // Covered by \"patternProperties\" whether or not it is valid; see \"properties\" above.\n thisEvaluated[key] = true;\n if (result.valid) {\n evaluated[key] = true;\n } else {\n stop = shortCircuit;\n errors.push(\n {\n instanceLocation,\n keyword: 'patternProperties',\n keywordLocation,\n error: `Property \"${key}\" matches pattern \"${pattern}\" but does not match associated schema.`\n },\n ...result.errors\n );\n }\n }\n }\n }\n\n if (!stop && $additionalProperties !== undefined) {\n const keywordLocation = `${schemaLocation}/additionalProperties`;\n for (const key in instance) {\n if (thisEvaluated[key]) {\n continue;\n }\n const subInstancePointer = `${instanceLocation}/${encodePointer(key)}`;\n const result = validate(\n instance[key],\n $additionalProperties,\n draft,\n lookup,\n shortCircuit,\n recursiveAnchor,\n subInstancePointer,\n keywordLocation\n );\n if (result.valid) {\n evaluated[key] = true;\n } else {\n stop = shortCircuit;\n errors.push(\n {\n instanceLocation,\n keyword: 'additionalProperties',\n keywordLocation,\n error: `Property \"${key}\" does not match additional properties schema.`\n },\n ...result.errors\n );\n }\n }\n } else if (!stop && $unevaluatedProperties !== undefined) {\n const keywordLocation = `${schemaLocation}/unevaluatedProperties`;\n for (const key in instance) {\n if (!evaluated[key]) {\n const subInstancePointer = `${instanceLocation}/${encodePointer(\n key\n )}`;\n const result = validate(\n instance[key],\n $unevaluatedProperties,\n draft,\n lookup,\n shortCircuit,\n recursiveAnchor,\n subInstancePointer,\n keywordLocation\n );\n if (result.valid) {\n evaluated[key] = true;\n } else {\n errors.push(\n {\n instanceLocation,\n keyword: 'unevaluatedProperties',\n keywordLocation,\n error: `Property \"${key}\" does not match unevaluated properties schema.`\n },\n ...result.errors\n );\n }\n }\n }\n }\n } else if (instanceType === 'array') {\n if ($maxItems !== undefined && instance.length > $maxItems) {\n errors.push({\n instanceLocation,\n keyword: 'maxItems',\n keywordLocation: `${schemaLocation}/maxItems`,\n error: `Array has too many items (${instance.length} > ${$maxItems}).`\n });\n }\n\n if ($minItems !== undefined && instance.length < $minItems) {\n errors.push({\n instanceLocation,\n keyword: 'minItems',\n keywordLocation: `${schemaLocation}/minItems`,\n error: `Array has too few items (${instance.length} < ${$minItems}).`\n });\n }\n\n const length: number = instance.length;\n let i = 0;\n let stop = false;\n\n if ($prefixItems !== undefined) {\n const keywordLocation = `${schemaLocation}/prefixItems`;\n const length2 = Math.min($prefixItems.length, length);\n for (; i < length2; i++) {\n const result = validate(\n instance[i],\n $prefixItems[i]!,\n draft,\n lookup,\n shortCircuit,\n recursiveAnchor,\n `${instanceLocation}/${i}`,\n `${keywordLocation}/${i}`\n );\n evaluated[i] = true;\n if (!result.valid) {\n stop = shortCircuit;\n errors.push(\n {\n instanceLocation,\n keyword: 'prefixItems',\n keywordLocation,\n error: `Items did not match schema.`\n },\n ...result.errors\n );\n if (stop) break;\n }\n }\n }\n\n if ($items !== undefined) {\n const keywordLocation = `${schemaLocation}/items`;\n if (Array.isArray($items)) {\n const length2 = Math.min($items.length, length);\n for (; i < length2; i++) {\n const result = validate(\n instance[i],\n $items[i]!,\n draft,\n lookup,\n shortCircuit,\n recursiveAnchor,\n `${instanceLocation}/${i}`,\n `${keywordLocation}/${i}`\n );\n evaluated[i] = true;\n if (!result.valid) {\n stop = shortCircuit;\n errors.push(\n {\n instanceLocation,\n keyword: 'items',\n keywordLocation,\n error: `Items did not match schema.`\n },\n ...result.errors\n );\n if (stop) break;\n }\n }\n } else {\n for (; i < length; i++) {\n const result = validate(\n instance[i],\n $items,\n draft,\n lookup,\n shortCircuit,\n recursiveAnchor,\n `${instanceLocation}/${i}`,\n keywordLocation\n );\n evaluated[i] = true;\n if (!result.valid) {\n stop = shortCircuit;\n errors.push(\n {\n instanceLocation,\n keyword: 'items',\n keywordLocation,\n error: `Items did not match schema.`\n },\n ...result.errors\n );\n if (stop) break;\n }\n }\n }\n\n if (!stop && $additionalItems !== undefined) {\n const keywordLocation = `${schemaLocation}/additionalItems`;\n for (; i < length; i++) {\n const result = validate(\n instance[i],\n $additionalItems,\n draft,\n lookup,\n shortCircuit,\n recursiveAnchor,\n `${instanceLocation}/${i}`,\n keywordLocation\n );\n evaluated[i] = true;\n if (!result.valid) {\n stop = shortCircuit;\n errors.push(\n {\n instanceLocation,\n keyword: 'additionalItems',\n keywordLocation,\n error: `Items did not match additional items schema.`\n },\n ...result.errors\n );\n }\n }\n }\n }\n\n if ($contains !== undefined) {\n if (length === 0 && $minContains === undefined) {\n errors.push({\n instanceLocation,\n keyword: 'contains',\n keywordLocation: `${schemaLocation}/contains`,\n error: `Array is empty. It must contain at least one item matching the schema.`\n });\n } else if ($minContains !== undefined && length < $minContains) {\n errors.push({\n instanceLocation,\n keyword: 'minContains',\n keywordLocation: `${schemaLocation}/minContains`,\n error: `Array has less items (${length}) than minContains (${$minContains}).`\n });\n } else {\n const keywordLocation = `${schemaLocation}/contains`;\n const errorsLength = errors.length;\n let contained = 0;\n for (let j = 0; j < length; j++) {\n const result = validate(\n instance[j],\n $contains,\n draft,\n lookup,\n shortCircuit,\n recursiveAnchor,\n `${instanceLocation}/${j}`,\n keywordLocation\n );\n if (result.valid) {\n evaluated[j] = true;\n contained++;\n } else {\n errors.push(...result.errors);\n }\n }\n\n if (contained >= ($minContains || 0)) {\n errors.length = errorsLength;\n }\n\n if ($minContains === undefined && contained === 0) {\n errors.splice(errorsLength, 0, {\n instanceLocation,\n keyword: 'contains',\n keywordLocation,\n error: `Array does not contain item matching schema.`\n });\n } else if ($minContains !== undefined && contained < $minContains) {\n errors.push({\n instanceLocation,\n keyword: 'minContains',\n keywordLocation: `${schemaLocation}/minContains`,\n error: `Array must contain at least ${$minContains} items matching schema. Only ${contained} items were found.`\n });\n } else if ($maxContains !== undefined && contained > $maxContains) {\n errors.push({\n instanceLocation,\n keyword: 'maxContains',\n keywordLocation: `${schemaLocation}/maxContains`,\n error: `Array may contain at most ${$maxContains} items matching schema. ${contained} items were found.`\n });\n }\n }\n }\n\n if (!stop && $unevaluatedItems !== undefined) {\n const keywordLocation = `${schemaLocation}/unevaluatedItems`;\n for (i; i < length; i++) {\n if (evaluated[i]) {\n continue;\n }\n const result = validate(\n instance[i],\n $unevaluatedItems,\n draft,\n lookup,\n shortCircuit,\n recursiveAnchor,\n `${instanceLocation}/${i}`,\n keywordLocation\n );\n evaluated[i] = true;\n if (!result.valid) {\n errors.push(\n {\n instanceLocation,\n keyword: 'unevaluatedItems',\n keywordLocation,\n error: `Items did not match unevaluated items schema.`\n },\n ...result.errors\n );\n }\n }\n }\n\n if ($uniqueItems) {\n for (let j = 0; j < length; j++) {\n const a = instance[j];\n const ao = typeof a === 'object' && a !== null;\n for (let k = 0; k < length; k++) {\n if (j === k) {\n continue;\n }\n const b = instance[k];\n const bo = typeof b === 'object' && b !== null;\n if (a === b || (ao && bo && deepCompareStrict(a, b))) {\n errors.push({\n instanceLocation,\n keyword: 'uniqueItems',\n keywordLocation: `${schemaLocation}/uniqueItems`,\n error: `Duplicate items at indexes ${j} and ${k}.`\n });\n j = Number.MAX_SAFE_INTEGER;\n k = Number.MAX_SAFE_INTEGER;\n }\n }\n }\n }\n } else if (instanceType === 'number') {\n if (draft === '4') {\n if (\n $minimum !== undefined &&\n (($exclusiveMinimum === true && instance <= $minimum) ||\n instance < $minimum)\n ) {\n errors.push({\n instanceLocation,\n keyword: 'minimum',\n keywordLocation: `${schemaLocation}/minimum`,\n error: `${instance} is less than ${\n $exclusiveMinimum ? 'or equal to ' : ''\n } ${$minimum}.`\n });\n }\n if (\n $maximum !== undefined &&\n (($exclusiveMaximum === true && instance >= $maximum) ||\n instance > $maximum)\n ) {\n errors.push({\n instanceLocation,\n keyword: 'maximum',\n keywordLocation: `${schemaLocation}/maximum`,\n error: `${instance} is greater than ${\n $exclusiveMaximum ? 'or equal to ' : ''\n } ${$maximum}.`\n });\n }\n } else {\n if ($minimum !== undefined && instance < $minimum) {\n errors.push({\n instanceLocation,\n keyword: 'minimum',\n keywordLocation: `${schemaLocation}/minimum`,\n error: `${instance} is less than ${$minimum}.`\n });\n }\n if ($maximum !== undefined && instance > $maximum) {\n errors.push({\n instanceLocation,\n keyword: 'maximum',\n keywordLocation: `${schemaLocation}/maximum`,\n error: `${instance} is greater than ${$maximum}.`\n });\n }\n if ($exclusiveMinimum !== undefined && instance <= $exclusiveMinimum) {\n errors.push({\n instanceLocation,\n keyword: 'exclusiveMinimum',\n keywordLocation: `${schemaLocation}/exclusiveMinimum`,\n error: `${instance} is less than ${$exclusiveMinimum}.`\n });\n }\n if ($exclusiveMaximum !== undefined && instance >= $exclusiveMaximum) {\n errors.push({\n instanceLocation,\n keyword: 'exclusiveMaximum',\n keywordLocation: `${schemaLocation}/exclusiveMaximum`,\n error: `${instance} is greater than or equal to ${$exclusiveMaximum}.`\n });\n }\n }\n if ($multipleOf !== undefined) {\n if (!isMultipleOf(instance, $multipleOf)) {\n errors.push({\n instanceLocation,\n keyword: 'multipleOf',\n keywordLocation: `${schemaLocation}/multipleOf`,\n error: `${instance} is not a multiple of ${$multipleOf}.`\n });\n }\n }\n } else if (instanceType === 'string') {\n const length =\n $minLength === undefined && $maxLength === undefined\n ? 0\n : ucs2length(instance);\n if ($minLength !== undefined && length < $minLength) {\n errors.push({\n instanceLocation,\n keyword: 'minLength',\n keywordLocation: `${schemaLocation}/minLength`,\n error: `String is too short (${length} < ${$minLength}).`\n });\n }\n if ($maxLength !== undefined && length > $maxLength) {\n errors.push({\n instanceLocation,\n keyword: 'maxLength',\n keywordLocation: `${schemaLocation}/maxLength`,\n error: `String is too long (${length} > ${$maxLength}).`\n });\n }\n if ($pattern !== undefined && !new RegExp($pattern, 'u').test(instance)) {\n errors.push({\n instanceLocation,\n keyword: 'pattern',\n keywordLocation: `${schemaLocation}/pattern`,\n error: `String does not match pattern.`\n });\n }\n if (\n $format !== undefined &&\n format[$format] &&\n !format[$format](instance)\n ) {\n errors.push({\n instanceLocation,\n keyword: 'format',\n keywordLocation: `${schemaLocation}/format`,\n error: `String does not match format \"${$format}\".`\n });\n }\n }\n\n return { valid: errors.length === 0, errors };\n}\n"]}
|
package/dist/esm/validator.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.d.ts","sourceRoot":"","sources":["../../src/validator.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnE,qBAAa,SAAS;IAIlB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,YAAY;IAL/B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAiC;IAExD,YACmB,MAAM,EAAE,MAAM,GAAG,OAAO,EACxB,KAAK,GAAE,WAAuB,EAC9B,YAAY,UAAO,EAGrC;IAEM,QAAQ,CAAC,QAAQ,EAAE,GAAG,GAAG,gBAAgB,CAQ/C;IAEM,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAKlD;CACF"}
|
package/dist/esm/validator.js
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validator.js","sourceRoot":"","sources":["../../src/validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,MAAM,OAAO,SAAS;IAID,MAAM;IACN,KAAK;IACL,YAAY;IALd,MAAM,CAAiC;IAExD,YACmB,MAAwB,EACxB,KAAK,GAAgB,SAAS,EAC9B,YAAY,GAAG,IAAI;sBAFnB,MAAM;qBACN,KAAK;4BACL,YAAY;QAE7B,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC;IACpC,CAAC;IAEM,QAAQ,CAAC,QAAa;QAC3B,OAAO,QAAQ,CACb,QAAQ,EACR,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,KAAK,EACV,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,YAAY,CAClB,CAAC;IACJ,CAAC;IAEM,SAAS,CAAC,MAAc,EAAE,EAAW;QAC1C,IAAI,EAAE,EAAE,CAAC;YACP,MAAM,GAAG,EAAE,GAAG,MAAM,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;QAClC,CAAC;QACD,WAAW,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IACnC,CAAC;CACF","sourcesContent":["import { dereference } from './dereference.js';\nimport { Schema, SchemaDraft, ValidationResult } from './types.js';\nimport { validate } from './validate.js';\n\nexport class Validator {\n private readonly lookup: ReturnType<typeof dereference>;\n\n constructor(\n private readonly schema: Schema | boolean,\n private readonly draft: SchemaDraft = '2019-09',\n private readonly shortCircuit = true\n ) {\n this.lookup = dereference(schema);\n }\n\n public validate(instance: any): ValidationResult {\n return validate(\n instance,\n this.schema,\n this.draft,\n this.lookup,\n this.shortCircuit\n );\n }\n\n public addSchema(schema: Schema, id?: string): void {\n if (id) {\n schema = { ...schema, $id: id };\n }\n dereference(schema, this.lookup);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cfworker/json-schema",
|
|
3
|
-
"version": "4.1.
|
|
3
|
+
"version": "4.1.4",
|
|
4
4
|
"description": "A JSON schema validator that will run on Cloudflare workers. Supports drafts 4, 7, 2019-09, and 2020-12.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"json-schema",
|
|
@@ -44,22 +44,25 @@
|
|
|
44
44
|
],
|
|
45
45
|
"scripts": {
|
|
46
46
|
"prepare": "tshy",
|
|
47
|
-
"build": "
|
|
48
|
-
"
|
|
47
|
+
"build": "tshy",
|
|
48
|
+
"pretypecheck": "node --experimental-import-meta-resolve suite-gen.mjs",
|
|
49
|
+
"typecheck": "tsc --project tsconfig.json",
|
|
50
|
+
"clean": "tsc --build tsconfig.build.json --clean",
|
|
49
51
|
"pretest": "node --experimental-import-meta-resolve suite-gen.mjs && esbuild test/test.ts --target=esnext --bundle --format=esm --conditions=worker,browser --outdir=dist-test --ignore-annotations",
|
|
50
52
|
"test": "node ../../test.mjs"
|
|
51
53
|
},
|
|
52
54
|
"devDependencies": {
|
|
53
|
-
"@types/chai": "^5.
|
|
55
|
+
"@types/chai": "^5.2.3",
|
|
54
56
|
"@types/mocha": "^10.0.10",
|
|
55
|
-
"chai": "^
|
|
56
|
-
"
|
|
57
|
-
"
|
|
58
|
-
"mocha": "^
|
|
59
|
-
"typescript": "^
|
|
60
|
-
"wrangler": "^
|
|
57
|
+
"chai": "^6.3.0",
|
|
58
|
+
"esbuild": "^0.28.2",
|
|
59
|
+
"json-schema-test-suite": "git+https://github.com/json-schema-org/JSON-Schema-Test-Suite.git#89e83a7",
|
|
60
|
+
"mocha": "^12.0.3",
|
|
61
|
+
"typescript": "^7.0.2",
|
|
62
|
+
"wrangler": "^4.156.0"
|
|
61
63
|
},
|
|
62
64
|
"tshy": {
|
|
65
|
+
"project": "./tsconfig.build.json",
|
|
63
66
|
"exports": {
|
|
64
67
|
"./package.json": "./package.json",
|
|
65
68
|
".": "./src/index.ts"
|
|
@@ -3,10 +3,12 @@ export function deepCompareStrict(a: any, b: any): boolean {
|
|
|
3
3
|
if (typeofa !== typeof b) {
|
|
4
4
|
return false;
|
|
5
5
|
}
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
const aIsArray = Array.isArray(a);
|
|
7
|
+
const bIsArray = Array.isArray(b);
|
|
8
|
+
if (aIsArray !== bIsArray) {
|
|
9
|
+
return false;
|
|
10
|
+
}
|
|
11
|
+
if (aIsArray) {
|
|
10
12
|
const length = a.length;
|
|
11
13
|
if (length !== b.length) {
|
|
12
14
|
return false;
|
|
@@ -29,6 +31,9 @@ export function deepCompareStrict(a: any, b: any): boolean {
|
|
|
29
31
|
return false;
|
|
30
32
|
}
|
|
31
33
|
for (const k of aKeys) {
|
|
34
|
+
if (!Object.prototype.hasOwnProperty.call(b, k)) {
|
|
35
|
+
return false;
|
|
36
|
+
}
|
|
32
37
|
if (!deepCompareStrict(a[k], b[k])) {
|
|
33
38
|
return false;
|
|
34
39
|
}
|
package/src/dereference.ts
CHANGED
|
@@ -43,6 +43,7 @@ export const ignoredKeyword: Record<string, boolean> = {
|
|
|
43
43
|
enum: true,
|
|
44
44
|
const: true,
|
|
45
45
|
required: true,
|
|
46
|
+
dependentRequired: true,
|
|
46
47
|
type: true,
|
|
47
48
|
maximum: true,
|
|
48
49
|
minimum: true,
|
|
@@ -81,7 +82,7 @@ export function dereference(
|
|
|
81
82
|
basePointer = ''
|
|
82
83
|
): Record<string, Schema | boolean> {
|
|
83
84
|
if (schema && typeof schema === 'object' && !Array.isArray(schema)) {
|
|
84
|
-
const id: string = schema.$id || schema
|
|
85
|
+
const id: string = schema.$id || schema['id'];
|
|
85
86
|
if (id) {
|
|
86
87
|
const url = new URL(id, baseURI.href);
|
|
87
88
|
if (url.hash.length > 1) {
|
|
@@ -101,7 +102,7 @@ export function dereference(
|
|
|
101
102
|
|
|
102
103
|
// compute the schema's URI and add it to the mapping.
|
|
103
104
|
const schemaURI = baseURI.href + (basePointer ? '#' + basePointer : '');
|
|
104
|
-
if (lookup[schemaURI] !== undefined) {
|
|
105
|
+
if (lookup[schemaURI] !== undefined && lookup[schemaURI] !== schema) {
|
|
105
106
|
throw new Error(`Duplicate schema URI "${schemaURI}".`);
|
|
106
107
|
}
|
|
107
108
|
lookup[schemaURI] = schema;
|
package/src/format.ts
CHANGED
|
@@ -109,15 +109,22 @@ function date(str: string) {
|
|
|
109
109
|
const matches = str.match(DATE);
|
|
110
110
|
if (!matches) return false;
|
|
111
111
|
|
|
112
|
-
const
|
|
113
|
-
const
|
|
114
|
-
const
|
|
112
|
+
const yearPart = matches[1];
|
|
113
|
+
const monthPart = matches[2];
|
|
114
|
+
const dayPart = matches[3];
|
|
115
|
+
if (!yearPart || !monthPart || !dayPart) return false;
|
|
116
|
+
|
|
117
|
+
const year = +yearPart;
|
|
118
|
+
const month = +monthPart;
|
|
119
|
+
const day = +dayPart;
|
|
120
|
+
const maxDay = month == 2 && isLeapYear(year) ? 29 : DAYS[month];
|
|
115
121
|
|
|
116
122
|
return (
|
|
117
123
|
month >= 1 &&
|
|
118
124
|
month <= 12 &&
|
|
119
125
|
day >= 1 &&
|
|
120
|
-
|
|
126
|
+
maxDay !== undefined &&
|
|
127
|
+
day <= maxDay
|
|
121
128
|
);
|
|
122
129
|
}
|
|
123
130
|
|
|
@@ -125,9 +132,14 @@ function time(full: boolean, str: string) {
|
|
|
125
132
|
const matches = str.match(TIME);
|
|
126
133
|
if (!matches) return false;
|
|
127
134
|
|
|
128
|
-
const
|
|
129
|
-
const
|
|
130
|
-
const
|
|
135
|
+
const hourPart = matches[1];
|
|
136
|
+
const minutePart = matches[2];
|
|
137
|
+
const secondPart = matches[3];
|
|
138
|
+
if (!hourPart || !minutePart || !secondPart) return false;
|
|
139
|
+
|
|
140
|
+
const hour = +hourPart;
|
|
141
|
+
const minute = +minutePart;
|
|
142
|
+
const second = +secondPart;
|
|
131
143
|
const timeZone = !!matches[5];
|
|
132
144
|
return (
|
|
133
145
|
((hour <= 23 && minute <= 59 && second <= 59) ||
|
|
@@ -139,8 +151,14 @@ function time(full: boolean, str: string) {
|
|
|
139
151
|
const DATE_TIME_SEPARATOR = /t|\s/i;
|
|
140
152
|
function date_time(str: string) {
|
|
141
153
|
// http://tools.ietf.org/html/rfc3339#section-5.6
|
|
142
|
-
const
|
|
143
|
-
return
|
|
154
|
+
const [datePart, timePart, extra] = str.split(DATE_TIME_SEPARATOR);
|
|
155
|
+
return (
|
|
156
|
+
datePart !== undefined &&
|
|
157
|
+
timePart !== undefined &&
|
|
158
|
+
extra === undefined &&
|
|
159
|
+
date(datePart) &&
|
|
160
|
+
time(true, timePart)
|
|
161
|
+
);
|
|
144
162
|
}
|
|
145
163
|
|
|
146
164
|
const NOT_URI_FRAGMENT = /\/|:/;
|
package/src/types.ts
CHANGED
|
@@ -7,13 +7,7 @@ export const enum OutputFormat {
|
|
|
7
7
|
}
|
|
8
8
|
|
|
9
9
|
export type InstanceType =
|
|
10
|
-
| '
|
|
11
|
-
| 'boolean'
|
|
12
|
-
| 'integer'
|
|
13
|
-
| 'null'
|
|
14
|
-
| 'number'
|
|
15
|
-
| 'object'
|
|
16
|
-
| 'string';
|
|
10
|
+
'array' | 'boolean' | 'integer' | 'null' | 'number' | 'object' | 'string';
|
|
17
11
|
|
|
18
12
|
export interface Schema {
|
|
19
13
|
$id?: string;
|