@cfworker/json-schema 4.1.0 → 4.1.3

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.
Files changed (81) hide show
  1. package/dist/commonjs/deep-compare-strict.d.ts +1 -0
  2. package/dist/commonjs/deep-compare-strict.d.ts.map +1 -0
  3. package/dist/commonjs/deep-compare-strict.js +10 -4
  4. package/dist/commonjs/deep-compare-strict.js.map +1 -0
  5. package/dist/commonjs/dereference.d.ts +1 -0
  6. package/dist/commonjs/dereference.d.ts.map +1 -0
  7. package/dist/commonjs/dereference.js +4 -2
  8. package/dist/commonjs/dereference.js.map +1 -0
  9. package/dist/commonjs/format.d.ts +1 -0
  10. package/dist/commonjs/format.d.ts.map +1 -0
  11. package/dist/commonjs/format.js +26 -9
  12. package/dist/commonjs/format.js.map +1 -0
  13. package/dist/commonjs/index.d.ts +1 -0
  14. package/dist/commonjs/index.d.ts.map +1 -0
  15. package/dist/commonjs/index.js +1 -0
  16. package/dist/commonjs/index.js.map +1 -0
  17. package/dist/commonjs/package.json +2 -1
  18. package/dist/commonjs/pointer.d.ts +1 -0
  19. package/dist/commonjs/pointer.d.ts.map +1 -0
  20. package/dist/commonjs/pointer.js +1 -0
  21. package/dist/commonjs/pointer.js.map +1 -0
  22. package/dist/commonjs/types.d.ts +1 -0
  23. package/dist/commonjs/types.d.ts.map +1 -0
  24. package/dist/commonjs/types.js +1 -0
  25. package/dist/commonjs/types.js.map +1 -0
  26. package/dist/commonjs/ucs2-length.d.ts +1 -0
  27. package/dist/commonjs/ucs2-length.d.ts.map +1 -0
  28. package/dist/commonjs/ucs2-length.js +1 -0
  29. package/dist/commonjs/ucs2-length.js.map +1 -0
  30. package/dist/commonjs/validate.d.ts +1 -0
  31. package/dist/commonjs/validate.d.ts.map +1 -0
  32. package/dist/commonjs/validate.js +51 -25
  33. package/dist/commonjs/validate.js.map +1 -0
  34. package/dist/commonjs/validator.d.ts +1 -0
  35. package/dist/commonjs/validator.d.ts.map +1 -0
  36. package/dist/commonjs/validator.js +1 -0
  37. package/dist/commonjs/validator.js.map +1 -0
  38. package/dist/esm/deep-compare-strict.d.ts +1 -0
  39. package/dist/esm/deep-compare-strict.d.ts.map +1 -0
  40. package/dist/esm/deep-compare-strict.js +10 -4
  41. package/dist/esm/deep-compare-strict.js.map +1 -0
  42. package/dist/esm/dereference.d.ts +1 -0
  43. package/dist/esm/dereference.d.ts.map +1 -0
  44. package/dist/esm/dereference.js +4 -2
  45. package/dist/esm/dereference.js.map +1 -0
  46. package/dist/esm/format.d.ts +1 -0
  47. package/dist/esm/format.d.ts.map +1 -0
  48. package/dist/esm/format.js +26 -9
  49. package/dist/esm/format.js.map +1 -0
  50. package/dist/esm/index.d.ts +1 -0
  51. package/dist/esm/index.d.ts.map +1 -0
  52. package/dist/esm/index.js +1 -0
  53. package/dist/esm/index.js.map +1 -0
  54. package/dist/esm/package.json +2 -1
  55. package/dist/esm/pointer.d.ts +1 -0
  56. package/dist/esm/pointer.d.ts.map +1 -0
  57. package/dist/esm/pointer.js +1 -0
  58. package/dist/esm/pointer.js.map +1 -0
  59. package/dist/esm/types.d.ts +1 -0
  60. package/dist/esm/types.d.ts.map +1 -0
  61. package/dist/esm/types.js +1 -0
  62. package/dist/esm/types.js.map +1 -0
  63. package/dist/esm/ucs2-length.d.ts +1 -0
  64. package/dist/esm/ucs2-length.d.ts.map +1 -0
  65. package/dist/esm/ucs2-length.js +1 -0
  66. package/dist/esm/ucs2-length.js.map +1 -0
  67. package/dist/esm/validate.d.ts +1 -0
  68. package/dist/esm/validate.d.ts.map +1 -0
  69. package/dist/esm/validate.js +51 -25
  70. package/dist/esm/validate.js.map +1 -0
  71. package/dist/esm/validator.d.ts +1 -0
  72. package/dist/esm/validator.d.ts.map +1 -0
  73. package/dist/esm/validator.js +1 -0
  74. package/dist/esm/validator.js.map +1 -0
  75. package/package.json +13 -10
  76. package/src/deep-compare-strict.ts +9 -4
  77. package/src/dereference.ts +3 -2
  78. package/src/format.ts +27 -9
  79. package/src/types.d.ts +1 -7
  80. package/src/types.ts +1 -7
  81. package/src/validate.ts +67 -31
@@ -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 (let i = 0; i < $anyOf.length; i++) {
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 (let i = 0; i < $allOf.length; i++) {
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 in instance)) {
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 in instance) {
366
+ if (hasOwnProperty(instance, key)) {
339
367
  const required = $dependentRequired[key];
340
368
  for (const dependantKey of required) {
341
- if (!(dependantKey in instance)) {
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 in $dependentSchemas) {
382
+ for (const [key, dependentSchema] of Object.entries($dependentSchemas)) {
355
383
  const keywordLocation = `${schemaLocation}/dependentSchemas`;
356
- if (key in instance) {
357
- const result = validate(instance, $dependentSchemas[key], draft, lookup, shortCircuit, recursiveAnchor, instanceLocation, `${keywordLocation}/${encodePointer(key)}`, evaluated);
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 in instance) {
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 in instance)) {
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 in $properties) {
405
- if (!(key in instance)) {
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], $properties[key], draft, lookup, shortCircuit, recursiveAnchor, subInstancePointer, `${keywordLocation}/${encodePointer(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] = thisEvaluated[key] = true;
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 in $patternProperties) {
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] = thisEvaluated[key] = true;
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
- const remainder = instance % $multipleOf;
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"]}
@@ -8,3 +8,4 @@ export declare class Validator {
8
8
  validate(instance: any): ValidationResult;
9
9
  addSchema(schema: Schema, id?: string): void;
10
10
  }
11
+ //# sourceMappingURL=validator.d.ts.map
@@ -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"}
@@ -21,3 +21,4 @@ export class Validator {
21
21
  dereference(schema, this.lookup);
22
22
  }
23
23
  }
24
+ //# sourceMappingURL=validator.js.map
@@ -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.0",
3
+ "version": "4.1.3",
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": "tsc --build",
48
- "clean": "tsc --build --clean",
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.0.1",
55
+ "@types/chai": "^5.2.3",
54
56
  "@types/mocha": "^10.0.10",
55
- "chai": "^5.1.2",
56
- "json-schema-test-suite": "git+https://github.com/json-schema-org/JSON-Schema-Test-Suite#76b529f",
57
- "esbuild": "^0.24.0",
58
- "mocha": "^11.0.1",
59
- "typescript": "^5.7.2",
60
- "wrangler": "^3.95.0"
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
- if (Array.isArray(a)) {
7
- if (!Array.isArray(b)) {
8
- return false;
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
  }
@@ -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.id;
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 year = +matches[1];
113
- const month = +matches[2];
114
- const day = +matches[3];
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
- day <= (month == 2 && isLeapYear(year) ? 29 : DAYS[month])
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 hour = +matches[1];
129
- const minute = +matches[2];
130
- const second = +matches[3];
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 dateTime = str.split(DATE_TIME_SEPARATOR);
143
- return dateTime.length == 2 && date(dateTime[0]) && time(true, dateTime[1]);
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.d.ts CHANGED
@@ -5,13 +5,7 @@ export declare const enum OutputFormat {
5
5
  Detailed = 4
6
6
  }
7
7
  export type InstanceType =
8
- | 'array'
9
- | 'boolean'
10
- | 'integer'
11
- | 'null'
12
- | 'number'
13
- | 'object'
14
- | 'string';
8
+ 'array' | 'boolean' | 'integer' | 'null' | 'number' | 'object' | 'string';
15
9
  export interface Schema {
16
10
  $id?: string;
17
11
  $anchor?: string;
package/src/types.ts CHANGED
@@ -7,13 +7,7 @@ export const enum OutputFormat {
7
7
  }
8
8
 
9
9
  export type InstanceType =
10
- | 'array'
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;