@json-schema-engine/core 0.0.1

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 (143) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +50 -0
  3. package/dist/coverage.d.ts +30 -0
  4. package/dist/coverage.d.ts.map +1 -0
  5. package/dist/coverage.js +81 -0
  6. package/dist/coverage.js.map +1 -0
  7. package/dist/cursor.d.ts +16 -0
  8. package/dist/cursor.d.ts.map +1 -0
  9. package/dist/cursor.js +28 -0
  10. package/dist/cursor.js.map +1 -0
  11. package/dist/dialect.d.ts +316 -0
  12. package/dist/dialect.d.ts.map +1 -0
  13. package/dist/dialect.js +135 -0
  14. package/dist/dialect.js.map +1 -0
  15. package/dist/engine.d.ts +203 -0
  16. package/dist/engine.d.ts.map +1 -0
  17. package/dist/engine.js +493 -0
  18. package/dist/engine.js.map +1 -0
  19. package/dist/index.d.ts +182 -0
  20. package/dist/index.d.ts.map +1 -0
  21. package/dist/index.js +370 -0
  22. package/dist/index.js.map +1 -0
  23. package/dist/json.d.ts +49 -0
  24. package/dist/json.d.ts.map +1 -0
  25. package/dist/json.js +128 -0
  26. package/dist/json.js.map +1 -0
  27. package/dist/keywords/applicator.d.ts +57 -0
  28. package/dist/keywords/applicator.d.ts.map +1 -0
  29. package/dist/keywords/applicator.js +789 -0
  30. package/dist/keywords/applicator.js.map +1 -0
  31. package/dist/keywords/core.d.ts +42 -0
  32. package/dist/keywords/core.d.ts.map +1 -0
  33. package/dist/keywords/core.js +139 -0
  34. package/dist/keywords/core.js.map +1 -0
  35. package/dist/keywords/format.d.ts +43 -0
  36. package/dist/keywords/format.d.ts.map +1 -0
  37. package/dist/keywords/format.js +101 -0
  38. package/dist/keywords/format.js.map +1 -0
  39. package/dist/keywords/metaschemas2019.d.ts +3 -0
  40. package/dist/keywords/metaschemas2019.d.ts.map +1 -0
  41. package/dist/keywords/metaschemas2019.js +406 -0
  42. package/dist/keywords/metaschemas2019.js.map +1 -0
  43. package/dist/keywords/metaschemas2020.d.ts +3 -0
  44. package/dist/keywords/metaschemas2020.d.ts.map +1 -0
  45. package/dist/keywords/metaschemas2020.js +441 -0
  46. package/dist/keywords/metaschemas2020.js.map +1 -0
  47. package/dist/keywords/metaschemas6.d.ts +3 -0
  48. package/dist/keywords/metaschemas6.d.ts.map +1 -0
  49. package/dist/keywords/metaschemas6.js +221 -0
  50. package/dist/keywords/metaschemas6.js.map +1 -0
  51. package/dist/keywords/metaschemas7.d.ts +3 -0
  52. package/dist/keywords/metaschemas7.d.ts.map +1 -0
  53. package/dist/keywords/metaschemas7.js +248 -0
  54. package/dist/keywords/metaschemas7.js.map +1 -0
  55. package/dist/keywords/unevaluated.d.ts +14 -0
  56. package/dist/keywords/unevaluated.d.ts.map +1 -0
  57. package/dist/keywords/unevaluated.js +296 -0
  58. package/dist/keywords/unevaluated.js.map +1 -0
  59. package/dist/keywords/validation.d.ts +21 -0
  60. package/dist/keywords/validation.d.ts.map +1 -0
  61. package/dist/keywords/validation.js +332 -0
  62. package/dist/keywords/validation.js.map +1 -0
  63. package/dist/keywords/vocab2019.d.ts +36 -0
  64. package/dist/keywords/vocab2019.d.ts.map +1 -0
  65. package/dist/keywords/vocab2019.js +585 -0
  66. package/dist/keywords/vocab2019.js.map +1 -0
  67. package/dist/keywords/vocab2020.d.ts +20 -0
  68. package/dist/keywords/vocab2020.d.ts.map +1 -0
  69. package/dist/keywords/vocab2020.js +55 -0
  70. package/dist/keywords/vocab2020.js.map +1 -0
  71. package/dist/keywords/vocab7.d.ts +46 -0
  72. package/dist/keywords/vocab7.d.ts.map +1 -0
  73. package/dist/keywords/vocab7.js +305 -0
  74. package/dist/keywords/vocab7.js.map +1 -0
  75. package/dist/loader.d.ts +41 -0
  76. package/dist/loader.d.ts.map +1 -0
  77. package/dist/loader.js +13 -0
  78. package/dist/loader.js.map +1 -0
  79. package/dist/lowering.d.ts +371 -0
  80. package/dist/lowering.d.ts.map +1 -0
  81. package/dist/lowering.js +59 -0
  82. package/dist/lowering.js.map +1 -0
  83. package/dist/output.d.ts +251 -0
  84. package/dist/output.d.ts.map +1 -0
  85. package/dist/output.js +357 -0
  86. package/dist/output.js.map +1 -0
  87. package/dist/records.d.ts +71 -0
  88. package/dist/records.d.ts.map +1 -0
  89. package/dist/records.js +150 -0
  90. package/dist/records.js.map +1 -0
  91. package/dist/ref.d.ts +10 -0
  92. package/dist/ref.d.ts.map +1 -0
  93. package/dist/ref.js +5 -0
  94. package/dist/ref.js.map +1 -0
  95. package/dist/regex.d.ts +45 -0
  96. package/dist/regex.d.ts.map +1 -0
  97. package/dist/regex.js +163 -0
  98. package/dist/regex.js.map +1 -0
  99. package/dist/registry.d.ts +141 -0
  100. package/dist/registry.d.ts.map +1 -0
  101. package/dist/registry.js +407 -0
  102. package/dist/registry.js.map +1 -0
  103. package/dist/result.d.ts +109 -0
  104. package/dist/result.d.ts.map +1 -0
  105. package/dist/result.js +112 -0
  106. package/dist/result.js.map +1 -0
  107. package/dist/uri.d.ts +18 -0
  108. package/dist/uri.d.ts.map +1 -0
  109. package/dist/uri.js +27 -0
  110. package/dist/uri.js.map +1 -0
  111. package/dist/walk.d.ts +25 -0
  112. package/dist/walk.d.ts.map +1 -0
  113. package/dist/walk.js +65 -0
  114. package/dist/walk.js.map +1 -0
  115. package/package.json +32 -0
  116. package/src/coverage.ts +88 -0
  117. package/src/cursor.ts +42 -0
  118. package/src/dialect.ts +428 -0
  119. package/src/engine.ts +741 -0
  120. package/src/index.ts +699 -0
  121. package/src/json.ts +137 -0
  122. package/src/keywords/applicator.ts +895 -0
  123. package/src/keywords/core.ts +168 -0
  124. package/src/keywords/format.ts +143 -0
  125. package/src/keywords/metaschemas2019.ts +410 -0
  126. package/src/keywords/metaschemas2020.ts +443 -0
  127. package/src/keywords/metaschemas6.ts +226 -0
  128. package/src/keywords/metaschemas7.ts +253 -0
  129. package/src/keywords/unevaluated.ts +329 -0
  130. package/src/keywords/validation.ts +627 -0
  131. package/src/keywords/vocab2019.ts +676 -0
  132. package/src/keywords/vocab2020.ts +82 -0
  133. package/src/keywords/vocab7.ts +393 -0
  134. package/src/loader.ts +60 -0
  135. package/src/lowering.ts +414 -0
  136. package/src/output.ts +651 -0
  137. package/src/records.ts +226 -0
  138. package/src/ref.ts +14 -0
  139. package/src/regex.ts +171 -0
  140. package/src/registry.ts +481 -0
  141. package/src/result.ts +252 -0
  142. package/src/uri.ts +35 -0
  143. package/src/walk.ts +88 -0
@@ -0,0 +1,182 @@
1
+ import { JsonValue } from "./json.js";
2
+ import { DialectRegistry, DialectOptions, KeywordBehavior } from "./dialect.js";
3
+ import { SchemaRegistry } from "./registry.js";
4
+ import { RegexCache, RegexEngine } from "./regex.js";
5
+ import { SchemaLoader, SourceLocation, SourceRange } from "./loader.js";
6
+ import { ErrorUnit } from "./output.js";
7
+ import { type EvaluateOptions, type ResultFor } from "./result.js";
8
+ import { type FormatTable } from "./keywords/format.js";
9
+ export type { JsonValue, JsonType } from "./json.js";
10
+ export type { Cursor } from "./cursor.js";
11
+ export { rootCursor, childCursor, instancePointer } from "./cursor.js";
12
+ export type { SchemaRef } from "./ref.js";
13
+ export type { Dialect, DialectKeyword, KeywordBehavior, KeywordContext, StaticFacts, DependencyView, DialectOptions, IdentifierFacts, IdentifierExtractor, } from "./dialect.js";
14
+ export { DialectRegistry, ReadOnlyRegistryError, UnknownDialectError, UnknownVocabularyError, identifiers2020, identifiers2019, identifiersLegacy, } from "./dialect.js";
15
+ export { DEFAULT_MAX_DEPTH, InvalidSchemaError, MaxDepthExceededError, SchemaRegistry, } from "./registry.js";
16
+ export type { DocumentLocation } from "./registry.js";
17
+ export { UnsafeRegexError, detectUnsafeRegex } from "./regex.js";
18
+ export type { RegexEngine, CompiledRegex } from "./regex.js";
19
+ export { UnresolvableRefError } from "./uri.js";
20
+ export { InfiniteLoopError, KeywordContractError, UndeclaredConsumptionError, UndeclaredProductionError, UnknownKeywordError, evaluateFragment, materializePath, runEvaluation, } from "./engine.js";
21
+ export type { AnnotationRecord, DependencyRecord, ErrorRecord, EvalState, Frame, FragmentOptions, KeywordTrace, PathNode, RecordPredicate, TraceNode, } from "./engine.js";
22
+ export { canonicalKey, codePointLength, escapeSegment, firstDuplicatePair, hasDuplicateItems, jsonEqual, unescapeSegment, } from "./json.js";
23
+ export { isMultipleOf } from "./keywords/validation.js";
24
+ export { walkSchema } from "./walk.js";
25
+ export type { SchemaWalkVisit } from "./walk.js";
26
+ export type { AnalyzeContext, ErrorParams, IndexCoverage, NameCoverage, SubschemaApplication, } from "./dialect.js";
27
+ export { lowerIR } from "./lowering.js";
28
+ export { makeRecordPredicate, renderBasic, renderDetailed, renderHierarchical, renderList, renderTrace, renderVerbose, } from "./output.js";
29
+ export { renderAnnotation, renderError, traceToRenderNodes, } from "./records.js";
30
+ export type { MutableRenderNode } from "./records.js";
31
+ export { OutputOptionsError, assembleResult, resolveOutputDemand, } from "./result.js";
32
+ export type { EvaluateOptions, OutputDemand, OutputDocuments, OutputFormat, Result, ResultFor, ResultUnits, } from "./result.js";
33
+ export type { LowerApply, LowerCursor, LowerExpr, LowerHelper, LowerMessage, LowerParams, LowerProduceValue, LowerStmt, LoweringContext, } from "./lowering.js";
34
+ export { foldNameCoverage, foldIndexCoverage, harvestCoverage, } from "./coverage.js";
35
+ export { RegexCache, defaultRegexEngine } from "./regex.js";
36
+ export type { AnnotationSelection, AnnotationUnit, BasicAnnotationUnit, BasicErrorUnit, BasicOutputDocument, DetailedOutputUnit, ErrorUnit, IrrelevantRendering, ListOutputDocument, OutputUnit, RenderInput, RenderNode, TraceUnit, } from "./output.js";
37
+ export type { LoadedDocument, SchemaLoader, SourceLocation, SourcePosition, SourceRange, SourceSpan, } from "./loader.js";
38
+ export { DIALECT_2020_12 } from "./keywords/vocab2020.js";
39
+ export { UnknownFormatError, VOCAB_FORMAT_ASSERTION, assertingFormat, } from "./keywords/format.js";
40
+ export type { FormatDefinition, FormatTable } from "./keywords/format.js";
41
+ export { DIALECT_2019_09 } from "./keywords/vocab2019.js";
42
+ export { DIALECT_DRAFT_07, DIALECT_DRAFT_06 } from "./keywords/vocab7.js";
43
+ /** Thrown by {@link EngineOptions.validateSchemas} when a registered schema fails its metaschema. */
44
+ export declare class SchemaValidationError extends Error {
45
+ readonly errors: readonly ErrorUnit[];
46
+ constructor(message: string, errors: readonly ErrorUnit[]);
47
+ }
48
+ /** Options for {@link Engine}'s constructor. */
49
+ export interface EngineOptions {
50
+ /** dialect for documents without $schema; default 2020-12 */
51
+ defaultDialect?: string;
52
+ /** resource loaders, tried in order (D7) */
53
+ loaders?: readonly SchemaLoader[];
54
+ /**
55
+ * Validate each load/register target against its metaschema when that
56
+ * metaschema is registered as a schema resource. The standard metaschemas
57
+ * for the built-in dialects are bundled; for custom dialects, an
58
+ * unavailable metaschema means "cannot check", not failure — supply a
59
+ * loader for it to get the check.
60
+ */
61
+ validateSchemas?: boolean;
62
+ /**
63
+ * Compile `pattern`/`patternProperties` through this engine instead of the
64
+ * native `RegExp`. Supply a linear-time engine (e.g. RE2) to evaluate
65
+ * untrusted schemas without exposure to catastrophic backtracking (ReDoS).
66
+ * See docs/guide/security.md.
67
+ */
68
+ regexEngine?: RegexEngine;
69
+ /**
70
+ * Reject a schema at registration when a `pattern`/`patternProperties`
71
+ * regex looks exponential-time ({@link detectUnsafeRegex}), throwing
72
+ * {@link UnsafeRegexError}. A conservative static screen, off by default;
73
+ * a linear-time `regexEngine` remains the only hard guarantee.
74
+ */
75
+ rejectUnsafeRegex?: boolean;
76
+ /**
77
+ * Maximum schema-nesting (registration) and schema-application
78
+ * (evaluation) depth before {@link MaxDepthExceededError}. Bounds otherwise
79
+ * unbounded recursion on adversarial input; default
80
+ * {@link DEFAULT_MAX_DEPTH}.
81
+ */
82
+ maxDepth?: number;
83
+ /**
84
+ * Format implementations (M7; \@json-schema-engine/formats supplies standard tables).
85
+ * Enables the format-assertion vocabulary: a `$vocabulary` dialect
86
+ * declaring it gets an asserting `format` that REFUSES unsupported
87
+ * formats at registration ({@link UnknownFormatError}).
88
+ */
89
+ formats?: FormatTable;
90
+ /**
91
+ * Assert recognized formats in the standard dialects (all drafts) —
92
+ * the spec's opt-in assertion configuration. Best effort: formats the
93
+ * table lacks fall back to annotation-only. Requires `formats`.
94
+ */
95
+ assertFormats?: boolean;
96
+ }
97
+ /**
98
+ * \@json-schema-engine/core public API: synchronous evaluation over registered schemas,
99
+ * with the 2020-12 dialect preloaded and async resource loading for
100
+ * `$ref` closures and `$vocabulary`-assembled dialects.
101
+ */
102
+ export declare class Engine {
103
+ readonly dialects: DialectRegistry;
104
+ private schemas;
105
+ private defaultDialect;
106
+ private loaders;
107
+ private validateSchemas;
108
+ private regexCache;
109
+ private maxDepth;
110
+ private formatTable;
111
+ private assembling;
112
+ constructor(options?: EngineOptions);
113
+ /** Registers an additional resource loader, tried after existing ones (D7). */
114
+ addLoader(loader: SchemaLoader): void;
115
+ /**
116
+ * The engine's schema registry — the compiler tier's read surface (M6):
117
+ * resolved refs, per-resource dialects, identifier indexes. Mutations go
118
+ * through the Engine methods, not the registry; `snapshot()` yields the
119
+ * read-only view a compiled artifact binds to.
120
+ */
121
+ get registry(): SchemaRegistry;
122
+ /** The engine's compiled-pattern cache, shared with compiled artifacts (M6). */
123
+ get patternCache(): RegexCache;
124
+ /**
125
+ * The format table backing this engine's asserting `format`, or undefined
126
+ * when none was configured — the compiler tier's read surface for
127
+ * format-assertion lowering (M7). The asserting `format` behaviors close
128
+ * over this same table, so a compiled `formatTest` and the interpreter agree.
129
+ */
130
+ get formats(): FormatTable | undefined;
131
+ /**
132
+ * Register a local schema document synchronously; returns its canonical
133
+ * base URI. References to unregistered resources are not loaded — use
134
+ * loadSchema for that.
135
+ */
136
+ registerSchema(schema: JsonValue, retrievalUri: string, dialectUri?: string, getRange?: (pointer: string) => SourceRange | undefined): string;
137
+ /**
138
+ * Register a schema document and load everything it transitively
139
+ * references through the configured loaders. Loader misses for referenced
140
+ * resources are not errors here; evaluation reports them if the reference
141
+ * is actually followed.
142
+ */
143
+ loadSchema(schema: JsonValue, retrievalUri: string, dialectUri?: string, getRange?: (pointer: string) => SourceRange | undefined): Promise<string>;
144
+ /** Fetch a resource by URI through the loaders and register its closure. */
145
+ load(uri: string): Promise<string>;
146
+ /** Registers a vocabulary's keyword behaviors under its URI. */
147
+ registerVocabulary(uri: string, keywords: Readonly<Record<string, KeywordBehavior>>): void;
148
+ /**
149
+ * Assembles a dialect from already-registered vocabularies.
150
+ * @throws UnknownDialectError if a listed vocabulary is not registered.
151
+ */
152
+ registerDialect(uri: string, vocabularyUris: readonly string[], options?: DialectOptions): void;
153
+ /**
154
+ * Where a schema resource lives within its registered document: the
155
+ * containing document plus the resource root's document-rooted pointer
156
+ * (D17 bridge; see loader.ts), for source-position lookup.
157
+ */
158
+ documentLocation(resourceUri: string): import("./registry.js").DocumentLocation | undefined;
159
+ /**
160
+ * Translates a canonical schema location (`resourceUri#/pointer`) to its
161
+ * document, document-rooted pointer, and — when the document's loader
162
+ * reported positions — source range (D17 bridge; see loader.ts).
163
+ */
164
+ locate(schemaLocation: string): SourceLocation | undefined;
165
+ /**
166
+ * Evaluates an instance against a registered schema. Literal options
167
+ * narrow the result ({@link ResultFor}); an unsupported combination of
168
+ * options throws {@link OutputOptionsError} before evaluating.
169
+ */
170
+ evaluate<O extends EvaluateOptions>(schemaUri: string, instance: JsonValue, options?: O): ResultFor<O>;
171
+ private decorate;
172
+ private fetch;
173
+ /** Fetch + register one resource; undefined when no loader handles it. */
174
+ private loadResource;
175
+ private loadPending;
176
+ private ensureDialectFor;
177
+ private assembleDialect;
178
+ private maybeValidate;
179
+ }
180
+ /** Creates a new {@link Engine}. */
181
+ export declare const createEngine: (options?: EngineOptions) => Engine;
182
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js ADDED
@@ -0,0 +1,370 @@
1
+ // @json-schema-engine/core public API: sync evaluation over registered schemas (D7); the
2
+ // 2020-12 dialect preloaded; custom vocabularies/dialects via the same
3
+ // registry the built-ins use. Resource I/O is the one async boundary:
4
+ // load/loadSchema pull in referenced resources through caller-supplied
5
+ // loaders and assemble dialects from metaschema $vocabulary declarations.
6
+ import { isObject } from "./json.js";
7
+ import { resolveUri, splitFragment, UnresolvableRefError } from "./uri.js";
8
+ import { DialectRegistry, UnknownDialectError, UnknownVocabularyError, } from "./dialect.js";
9
+ import { DEFAULT_MAX_DEPTH, SchemaRegistry } from "./registry.js";
10
+ import { runEvaluation } from "./engine.js";
11
+ import { RegexCache, UnsafeRegexError, detectUnsafeRegex, } from "./regex.js";
12
+ import { makeRecordPredicate } from "./output.js";
13
+ import { assembleResult, resolveOutputDemand, } from "./result.js";
14
+ import { renderError, renderSelected, schemaLocationOf, toRenderNode, } from "./records.js";
15
+ import { DIALECT_2020_12, registerStandardDialects, } from "./keywords/vocab2020.js";
16
+ import { VOCAB_FORMAT_ASSERTION, assertingFormat, } from "./keywords/format.js";
17
+ import { METASCHEMAS_2020_12 } from "./keywords/metaschemas2020.js";
18
+ import { METASCHEMAS_2019_09 } from "./keywords/metaschemas2019.js";
19
+ import { METASCHEMAS_DRAFT_07 } from "./keywords/metaschemas7.js";
20
+ import { METASCHEMAS_DRAFT_06 } from "./keywords/metaschemas6.js";
21
+ import { VOCAB_CORE_2019 } from "./keywords/core.js";
22
+ import { identifiers2019, identifiers2020 } from "./dialect.js";
23
+ export { rootCursor, childCursor, instancePointer } from "./cursor.js";
24
+ export { DialectRegistry, ReadOnlyRegistryError, UnknownDialectError, UnknownVocabularyError, identifiers2020, identifiers2019, identifiersLegacy, } from "./dialect.js";
25
+ export { DEFAULT_MAX_DEPTH, InvalidSchemaError, MaxDepthExceededError, SchemaRegistry, } from "./registry.js";
26
+ export { UnsafeRegexError, detectUnsafeRegex } from "./regex.js";
27
+ export { UnresolvableRefError } from "./uri.js";
28
+ export { InfiniteLoopError, KeywordContractError, UndeclaredConsumptionError, UndeclaredProductionError, UnknownKeywordError, evaluateFragment, materializePath, runEvaluation, } from "./engine.js";
29
+ export { canonicalKey, codePointLength, escapeSegment, firstDuplicatePair, hasDuplicateItems, jsonEqual, unescapeSegment, } from "./json.js";
30
+ export { isMultipleOf } from "./keywords/validation.js";
31
+ export { walkSchema } from "./walk.js";
32
+ export { lowerIR } from "./lowering.js";
33
+ export { makeRecordPredicate, renderBasic, renderDetailed, renderHierarchical, renderList, renderTrace, renderVerbose, } from "./output.js";
34
+ export { renderAnnotation, renderError, traceToRenderNodes, } from "./records.js";
35
+ export { OutputOptionsError, assembleResult, resolveOutputDemand, } from "./result.js";
36
+ export { foldNameCoverage, foldIndexCoverage, harvestCoverage, } from "./coverage.js";
37
+ export { RegexCache, defaultRegexEngine } from "./regex.js";
38
+ export { DIALECT_2020_12 } from "./keywords/vocab2020.js";
39
+ export { UnknownFormatError, VOCAB_FORMAT_ASSERTION, assertingFormat, } from "./keywords/format.js";
40
+ export { DIALECT_2019_09 } from "./keywords/vocab2019.js";
41
+ export { DIALECT_DRAFT_07, DIALECT_DRAFT_06 } from "./keywords/vocab7.js";
42
+ /** Thrown by {@link EngineOptions.validateSchemas} when a registered schema fails its metaschema. */
43
+ export class SchemaValidationError extends Error {
44
+ errors;
45
+ constructor(message, errors) {
46
+ super(message);
47
+ this.errors = errors;
48
+ }
49
+ }
50
+ /**
51
+ * \@json-schema-engine/core public API: synchronous evaluation over registered schemas,
52
+ * with the 2020-12 dialect preloaded and async resource loading for
53
+ * `$ref` closures and `$vocabulary`-assembled dialects.
54
+ */
55
+ export class Engine {
56
+ dialects = new DialectRegistry();
57
+ schemas;
58
+ defaultDialect;
59
+ loaders;
60
+ validateSchemas;
61
+ regexCache;
62
+ maxDepth;
63
+ formatTable;
64
+ // Dialect URIs whose assembly is in progress, to fail metaschema cycles.
65
+ assembling = new Set();
66
+ constructor(options = {}) {
67
+ if (options.assertFormats && !options.formats) {
68
+ throw new TypeError("assertFormats requires a formats table");
69
+ }
70
+ registerStandardDialects(this.dialects, options.assertFormats
71
+ ? {
72
+ format: (id) => assertingFormat(id, options.formats, false),
73
+ }
74
+ : {});
75
+ // The format-assertion vocabulary exists whenever a table is supplied;
76
+ // without one, a dialect requiring it fails with UnknownVocabularyError,
77
+ // which is the correct "cannot honor the assertion promise" answer.
78
+ this.formatTable = options.formats;
79
+ if (options.formats) {
80
+ const table = options.formats;
81
+ this.dialects.registerVocabulary(VOCAB_FORMAT_ASSERTION, {
82
+ format: assertingFormat(`${VOCAB_FORMAT_ASSERTION}#format`, table, true),
83
+ });
84
+ }
85
+ this.defaultDialect = splitFragment(options.defaultDialect ?? DIALECT_2020_12).resource;
86
+ this.regexCache = new RegexCache(options.regexEngine);
87
+ this.maxDepth = options.maxDepth ?? DEFAULT_MAX_DEPTH;
88
+ this.schemas = new SchemaRegistry(this.dialects, this.defaultDialect, this.maxDepth);
89
+ this.loaders = [...(options.loaders ?? [])];
90
+ this.validateSchemas = options.validateSchemas ?? false;
91
+ // Standard metaschemas are registered as ordinary schema resources so
92
+ // that $refs to them resolve without loaders and validateSchemas can
93
+ // check standard-dialect documents. Registered directly (not through
94
+ // registerSchema) so the policy never self-validates them here.
95
+ for (const [uri, doc] of METASCHEMAS_2020_12) {
96
+ this.schemas.register(doc, uri);
97
+ }
98
+ for (const [uri, doc] of METASCHEMAS_2019_09) {
99
+ this.schemas.register(doc, uri);
100
+ }
101
+ for (const [uri, doc] of METASCHEMAS_DRAFT_07) {
102
+ this.schemas.register(doc, uri);
103
+ }
104
+ for (const [uri, doc] of METASCHEMAS_DRAFT_06) {
105
+ this.schemas.register(doc, uri);
106
+ }
107
+ // Installed after the trusted metaschemas register, so the screen applies
108
+ // only to caller schemas (D20).
109
+ if (options.rejectUnsafeRegex) {
110
+ this.schemas.onRegex = (pattern, location) => {
111
+ const verdict = detectUnsafeRegex(pattern);
112
+ if (!verdict.safe) {
113
+ throw new UnsafeRegexError(`unsafe regex at '${location}': ${verdict.reason}`);
114
+ }
115
+ };
116
+ }
117
+ }
118
+ /** Registers an additional resource loader, tried after existing ones (D7). */
119
+ addLoader(loader) {
120
+ this.loaders.push(loader);
121
+ }
122
+ /**
123
+ * The engine's schema registry — the compiler tier's read surface (M6):
124
+ * resolved refs, per-resource dialects, identifier indexes. Mutations go
125
+ * through the Engine methods, not the registry; `snapshot()` yields the
126
+ * read-only view a compiled artifact binds to.
127
+ */
128
+ get registry() {
129
+ return this.schemas;
130
+ }
131
+ /** The engine's compiled-pattern cache, shared with compiled artifacts (M6). */
132
+ get patternCache() {
133
+ return this.regexCache;
134
+ }
135
+ /**
136
+ * The format table backing this engine's asserting `format`, or undefined
137
+ * when none was configured — the compiler tier's read surface for
138
+ * format-assertion lowering (M7). The asserting `format` behaviors close
139
+ * over this same table, so a compiled `formatTest` and the interpreter agree.
140
+ */
141
+ get formats() {
142
+ return this.formatTable;
143
+ }
144
+ /**
145
+ * Register a local schema document synchronously; returns its canonical
146
+ * base URI. References to unregistered resources are not loaded — use
147
+ * loadSchema for that.
148
+ */
149
+ registerSchema(schema, retrievalUri, dialectUri, getRange) {
150
+ const baseUri = this.schemas.register(schema, retrievalUri, dialectUri, getRange);
151
+ this.maybeValidate(baseUri);
152
+ return baseUri;
153
+ }
154
+ /**
155
+ * Register a schema document and load everything it transitively
156
+ * references through the configured loaders. Loader misses for referenced
157
+ * resources are not errors here; evaluation reports them if the reference
158
+ * is actually followed.
159
+ */
160
+ async loadSchema(schema, retrievalUri, dialectUri, getRange) {
161
+ await this.ensureDialectFor(schema, retrievalUri, dialectUri);
162
+ const baseUri = this.schemas.register(schema, retrievalUri, dialectUri, getRange);
163
+ await this.loadPending();
164
+ this.maybeValidate(baseUri);
165
+ return baseUri;
166
+ }
167
+ /** Fetch a resource by URI through the loaders and register its closure. */
168
+ async load(uri) {
169
+ const resource = splitFragment(uri).resource;
170
+ const baseUri = await this.loadResource(resource);
171
+ if (baseUri === undefined) {
172
+ throw new UnresolvableRefError(`no loader provided '${resource}'`);
173
+ }
174
+ await this.loadPending();
175
+ this.maybeValidate(baseUri);
176
+ return baseUri;
177
+ }
178
+ /** Registers a vocabulary's keyword behaviors under its URI. */
179
+ registerVocabulary(uri, keywords) {
180
+ this.dialects.registerVocabulary(uri, keywords);
181
+ }
182
+ /**
183
+ * Assembles a dialect from already-registered vocabularies.
184
+ * @throws UnknownDialectError if a listed vocabulary is not registered.
185
+ */
186
+ registerDialect(uri, vocabularyUris, options) {
187
+ this.dialects.registerDialect(uri, vocabularyUris, options);
188
+ }
189
+ /**
190
+ * Where a schema resource lives within its registered document: the
191
+ * containing document plus the resource root's document-rooted pointer
192
+ * (D17 bridge; see loader.ts), for source-position lookup.
193
+ */
194
+ documentLocation(resourceUri) {
195
+ return this.schemas.documentLocation(resourceUri);
196
+ }
197
+ /**
198
+ * Translates a canonical schema location (`resourceUri#/pointer`) to its
199
+ * document, document-rooted pointer, and — when the document's loader
200
+ * reported positions — source range (D17 bridge; see loader.ts).
201
+ */
202
+ locate(schemaLocation) {
203
+ const { resource, fragment } = splitFragment(schemaLocation);
204
+ const loc = this.schemas.documentLocation(resource);
205
+ if (loc === undefined)
206
+ return undefined;
207
+ const pointer = loc.pointer + (fragment ?? "");
208
+ const range = this.schemas.range(loc.documentUri, pointer);
209
+ return range === undefined
210
+ ? { documentUri: loc.documentUri, pointer }
211
+ : { documentUri: loc.documentUri, pointer, range };
212
+ }
213
+ evaluate(schemaUri, instance, options = {}) {
214
+ const demand = resolveOutputDemand(options);
215
+ const { valid, state } = runEvaluation(this.schemas, schemaUri, instance, demand.tracing, makeRecordPredicate(demand.annotations), this.regexCache, this.maxDepth);
216
+ if (demand.format === "flag")
217
+ return { valid };
218
+ // The flat surface first; its record arrays stay paired with the unit
219
+ // arrays so the located tree can index the units.
220
+ const params = options.errorParams ?? false;
221
+ const records = {
222
+ errors: state.errors,
223
+ droppedErrors: [],
224
+ annotations: [],
225
+ droppedAnnotations: [],
226
+ };
227
+ const errors = state.errors.map((e) => renderError(e, params));
228
+ let annotations = [];
229
+ if (valid && demand.annotations !== false) {
230
+ const selected = renderSelected(state.rootAnnotations, demand.annotations);
231
+ records.annotations = selected.records;
232
+ annotations = selected.units;
233
+ }
234
+ let droppedErrors = [];
235
+ let droppedAnnotations = [];
236
+ if (demand.verbose) {
237
+ records.droppedErrors = state.droppedErrors ?? [];
238
+ droppedErrors = records.droppedErrors.map((e) => renderError(e, params));
239
+ if (demand.annotations !== false) {
240
+ // The relevant annotations are a valid run's root survivors; an
241
+ // invalid run has none (draft-03 §12.2).
242
+ const relevant = new Set(valid ? state.rootAnnotations : []);
243
+ const selected = renderSelected((state.allAnnotations ?? []).filter((a) => !relevant.has(a)), demand.annotations);
244
+ records.droppedAnnotations = selected.records;
245
+ droppedAnnotations = selected.units;
246
+ }
247
+ }
248
+ const root = demand.tracing
249
+ ? toRenderNode(state.traceRoot, records)
250
+ : null;
251
+ const result = assembleResult(demand, valid, { errors, droppedErrors, annotations, droppedAnnotations }, root, schemaLocationOf(this.schemas.rootRef(schemaUri), null), options.trace === true);
252
+ if (options.positions) {
253
+ this.decorate(result.errors);
254
+ this.decorate(result.annotations);
255
+ this.decorate(result.droppedErrors);
256
+ this.decorate(result.droppedAnnotations);
257
+ }
258
+ return result;
259
+ }
260
+ decorate(units) {
261
+ for (const unit of units ?? []) {
262
+ const source = this.locate(unit.schemaLocation);
263
+ if (source !== undefined)
264
+ unit.source = source;
265
+ }
266
+ }
267
+ async fetch(resource) {
268
+ for (const loader of this.loaders) {
269
+ const doc = await loader(resource);
270
+ if (doc !== undefined)
271
+ return doc;
272
+ }
273
+ return undefined;
274
+ }
275
+ /** Fetch + register one resource; undefined when no loader handles it. */
276
+ async loadResource(resource) {
277
+ if (this.schemas.has(resource))
278
+ return resource;
279
+ const doc = await this.fetch(resource);
280
+ if (doc === undefined)
281
+ return undefined;
282
+ await this.ensureDialectFor(doc.value, resource);
283
+ return this.schemas.register(doc.value, resource, undefined, doc.getRange);
284
+ }
285
+ // Drain reference targets collected by registration walks until closure.
286
+ // Each round may register documents whose own walks add new targets.
287
+ async loadPending() {
288
+ for (;;) {
289
+ const missing = this.schemas.takeUnresolved();
290
+ if (missing.length === 0)
291
+ return;
292
+ for (const resource of missing) {
293
+ await this.loadResource(resource);
294
+ }
295
+ }
296
+ }
297
+ // Make the document's dialect exist before registration: known dialects
298
+ // pass through; otherwise the $schema target is loaded as a metaschema and
299
+ // a dialect is assembled from its $vocabulary (spec §8.1).
300
+ async ensureDialectFor(schema, retrievalUri, dialectUri) {
301
+ let effective = splitFragment(dialectUri ?? this.defaultDialect).resource;
302
+ if (isObject(schema) && typeof schema.$schema === "string") {
303
+ effective = splitFragment(resolveUri(schema.$schema, retrievalUri)).resource;
304
+ }
305
+ if (this.dialects.hasDialect(effective))
306
+ return;
307
+ if (this.assembling.has(effective)) {
308
+ throw new UnknownDialectError(`metaschema cycle at '${effective}'`);
309
+ }
310
+ this.assembling.add(effective);
311
+ try {
312
+ const metaBase = await this.loadResource(effective);
313
+ const meta = metaBase === undefined ? undefined : this.schemas.document(metaBase);
314
+ if (meta === undefined) {
315
+ throw new UnknownDialectError(`dialect '${effective}' is not registered and no loader provides its metaschema`);
316
+ }
317
+ this.assembleDialect(effective, meta);
318
+ }
319
+ finally {
320
+ this.assembling.delete(effective);
321
+ }
322
+ }
323
+ assembleDialect(uri, meta) {
324
+ const declared = isObject(meta) ? meta.$vocabulary : undefined;
325
+ if (!isObject(declared)) {
326
+ // The spec leaves $vocabulary-less metaschemas open; the least-surprise
327
+ // reading is the default dialect's vocabulary set and syntax options.
328
+ const base = this.dialects.getDialect(this.defaultDialect);
329
+ this.dialects.registerDialect(uri, base.vocabularyUris, {
330
+ allowUnknownKeywords: base.allowUnknownKeywords,
331
+ identifiers: base.identifiers,
332
+ refIgnoresSiblings: base.refIgnoresSiblings,
333
+ });
334
+ return;
335
+ }
336
+ const uris = [];
337
+ for (const [vocabUri, required] of Object.entries(declared)) {
338
+ if (this.dialects.hasVocabulary(vocabUri)) {
339
+ uris.push(vocabUri);
340
+ }
341
+ else if (required === true) {
342
+ throw new UnknownVocabularyError(`dialect '${uri}' requires unknown vocabulary '${vocabUri}'`);
343
+ }
344
+ // Unknown optional vocabularies are skipped; their keywords fall to
345
+ // unknown-keyword annotation handling (spec MUST for false).
346
+ }
347
+ // Identifier syntax travels with the core vocabulary (D18): a dialect
348
+ // assembled around the 2019-09 core gets 2019-09 identifier handling.
349
+ this.dialects.registerDialect(uri, uris, {
350
+ identifiers: uris.includes(VOCAB_CORE_2019)
351
+ ? identifiers2019
352
+ : identifiers2020,
353
+ });
354
+ }
355
+ maybeValidate(baseUri) {
356
+ if (!this.validateSchemas)
357
+ return;
358
+ const dialectUri = this.schemas.dialectUriFor(baseUri);
359
+ if (!this.schemas.has(dialectUri))
360
+ return; // metaschema document unavailable
361
+ const doc = this.schemas.document(baseUri);
362
+ const result = this.evaluate(dialectUri, doc, { output: "list" });
363
+ if (!result.valid) {
364
+ throw new SchemaValidationError(`schema '${baseUri}' fails its metaschema '${dialectUri}'`, result.errors ?? []);
365
+ }
366
+ }
367
+ }
368
+ /** Creates a new {@link Engine}. */
369
+ export const createEngine = (options) => new Engine(options);
370
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/json.d.ts ADDED
@@ -0,0 +1,49 @@
1
+ /** A JSON-representable value. */
2
+ export type JsonValue = null | boolean | number | string | JsonValue[] | {
3
+ [k: string]: JsonValue;
4
+ };
5
+ /** The seven JSON Schema primitive type names, including the `integer` subtype. */
6
+ export type JsonType = "null" | "boolean" | "number" | "integer" | "string" | "array" | "object";
7
+ /** True for JSON objects, excluding arrays and `null`. */
8
+ export declare const isObject: (v: unknown) => v is Record<string, JsonValue>;
9
+ /**
10
+ * The primitive type of an instance value. `"integer"` is a numeric subtype
11
+ * handled by the `type` keyword and is never returned here.
12
+ */
13
+ export declare function jsonTypeOf(v: JsonValue): Exclude<JsonType, "integer">;
14
+ /**
15
+ * JSON equality per the spec: same type and value, object member order
16
+ * insignificant.
17
+ */
18
+ export declare function jsonEqual(a: JsonValue, b: JsonValue): boolean;
19
+ /**
20
+ * A canonical string key for JSON equality: two values share a key exactly
21
+ * when {@link jsonEqual} holds (object member order made insignificant by
22
+ * sorting keys). Used to bucket values for near-linear duplicate detection;
23
+ * callers confirm bucket collisions with {@link jsonEqual} since distinct
24
+ * values could, in principle, collide on the key.
25
+ */
26
+ export declare function canonicalKey(value: JsonValue): string;
27
+ /** String length in Unicode code points, per `minLength`/`maxLength`. */
28
+ export declare function codePointLength(s: string): number;
29
+ /**
30
+ * Compiles an ECMA-262 regex in unicode mode where possible (required for
31
+ * `\p{...}` property escapes), falling back for patterns invalid under the
32
+ * `u` flag.
33
+ */
34
+ export declare function schemaRegExp(pattern: string): RegExp;
35
+ /** Escapes a JSON Pointer segment (RFC 6901). */
36
+ export declare const escapeSegment: (s: string) => string;
37
+ /** Unescapes a JSON Pointer segment (RFC 6901). */
38
+ export declare const unescapeSegment: (s: string) => string;
39
+ /**
40
+ * The first jsonEqual-duplicate pair in `items` (by ascending index), or
41
+ * `null` when every item is distinct — `uniqueItems`' predicate, shared by
42
+ * both tiers. Buckets by {@link canonicalKey} for near-linear detection; a
43
+ * key collision is confirmed with {@link jsonEqual} so distinct values that
44
+ * happen to share a key are never misreported as duplicates.
45
+ */
46
+ export declare function firstDuplicatePair(items: readonly JsonValue[]): readonly [number, number] | null;
47
+ /** True when `items` contains any jsonEqual-duplicate pair (`uniqueItems`'s compiled-tier predicate). */
48
+ export declare function hasDuplicateItems(items: readonly JsonValue[]): boolean;
49
+ //# sourceMappingURL=json.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.d.ts","sourceRoot":"","sources":["../src/json.ts"],"names":[],"mappings":"AAKA,kCAAkC;AAClC,MAAM,MAAM,SAAS,GACnB,IAAI,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,SAAS,EAAE,GAAG;IAAE,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAE9E,mFAAmF;AACnF,MAAM,MAAM,QAAQ,GAClB,MAAM,GAAG,SAAS,GAAG,QAAQ,GAAG,SAAS,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,CAAC;AAE5E,0DAA0D;AAC1D,eAAO,MAAM,QAAQ,GAAI,GAAG,OAAO,KAAG,CAAC,IAAI,MAAM,CAAC,MAAM,EAAE,SAAS,CACT,CAAC;AAE3D;;;GAGG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CAarE;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,SAAS,GAAG,OAAO,CAmB7D;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAKrD;AAED,yEAAyE;AACzE,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,MAAM,CAQjD;AAED;;;;GAIG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAMpD;AAED,iDAAiD;AACjD,eAAO,MAAM,aAAa,GAAI,GAAG,MAAM,KAAG,MACE,CAAC;AAE7C,mDAAmD;AACnD,eAAO,MAAM,eAAe,GAAI,GAAG,MAAM,KAAG,MACD,CAAC;AAE5C;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,SAAS,EAAE,GAC1B,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAelC;AAED,yGAAyG;AACzG,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,SAAS,SAAS,EAAE,GAAG,OAAO,CAEtE"}