@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,135 @@
1
+ // Dialect/vocabulary registry and the keyword behavior interface (DESIGN.md
2
+ // D2, §3): keywords are identified by URI, a vocabulary is a named map of
3
+ // keyword behaviors, a dialect is an ordered set of vocabularies. Built-in
4
+ // drafts and user extensions use the same mechanism — nothing here is
5
+ // privileged.
6
+ /** Identifier syntax for the 2020-12 dialect: `$id`/`$anchor`/`$dynamicAnchor`. */
7
+ export const identifiers2020 = (node) => ({
8
+ ...(typeof node.$id === "string" ? { baseId: node.$id } : {}),
9
+ ...(typeof node.$anchor === "string" ? { anchors: [node.$anchor] } : {}),
10
+ ...(typeof node.$dynamicAnchor === "string"
11
+ ? { dynamicAnchor: node.$dynamicAnchor }
12
+ : {}),
13
+ });
14
+ /** Identifier syntax for the 2019-09 dialect: `$id`/`$anchor`/boolean `$recursiveAnchor`. */
15
+ export const identifiers2019 = (node) => ({
16
+ ...(typeof node.$id === "string" ? { baseId: node.$id } : {}),
17
+ ...(typeof node.$anchor === "string" ? { anchors: [node.$anchor] } : {}),
18
+ ...(node.$recursiveAnchor === true ? { recursiveAnchor: true } : {}),
19
+ });
20
+ /**
21
+ * Identifier syntax for legacy draft-07/06 dialects: a schema object
22
+ * containing `$ref` has no identifiers at all (the suite's "`$ref` prevents
23
+ * a sibling `$id` from changing the base uri"), and a plain-fragment `$id`
24
+ * is an anchor rather than a base change.
25
+ */
26
+ export const identifiersLegacy = (node) => {
27
+ if (Object.hasOwn(node, "$ref"))
28
+ return {};
29
+ const id = node.$id;
30
+ if (typeof id !== "string")
31
+ return {};
32
+ if (id.startsWith("#")) {
33
+ return id.length > 1 ? { anchors: [id.slice(1)] } : {};
34
+ }
35
+ return { baseId: id };
36
+ };
37
+ /** Thrown when a dialect or vocabulary URI has no registered entry. */
38
+ export class UnknownDialectError extends Error {
39
+ }
40
+ /** Thrown when a `$vocabulary` URI is required but not registered. */
41
+ export class UnknownVocabularyError extends Error {
42
+ }
43
+ /** Thrown when a registry snapshot (a read-only view) is asked to register. */
44
+ export class ReadOnlyRegistryError extends Error {
45
+ }
46
+ /** Registry of vocabularies and the dialects assembled from them. */
47
+ export class DialectRegistry {
48
+ vocabularies = new Map();
49
+ dialects = new Map();
50
+ // Snapshots share these maps copy-on-write: the source copies them before
51
+ // its first registration after a snapshot, so views stay frozen for free.
52
+ shared = false;
53
+ readOnly = false;
54
+ /**
55
+ * A read-only view of the current registrations. Later registrations on
56
+ * this registry are invisible to the view, and registering into the view
57
+ * throws {@link ReadOnlyRegistryError}. A compiled artifact binds to one
58
+ * so that a compilation boundary cannot change dialect lookups.
59
+ */
60
+ snapshot() {
61
+ const view = new DialectRegistry();
62
+ view.vocabularies = this.vocabularies;
63
+ view.dialects = this.dialects;
64
+ view.readOnly = true;
65
+ this.shared = true;
66
+ return view;
67
+ }
68
+ mutable() {
69
+ if (this.readOnly) {
70
+ throw new ReadOnlyRegistryError("a registry snapshot is read-only");
71
+ }
72
+ if (!this.shared)
73
+ return;
74
+ this.vocabularies = new Map(this.vocabularies);
75
+ this.dialects = new Map(this.dialects);
76
+ this.shared = false;
77
+ }
78
+ /** Registers a vocabulary's keyword behaviors under its URI. */
79
+ registerVocabulary(uri, keywords) {
80
+ this.mutable();
81
+ this.vocabularies.set(uri, keywords);
82
+ }
83
+ /**
84
+ * Assembles a dialect from already-registered vocabularies.
85
+ * @throws UnknownDialectError if a listed vocabulary is not registered.
86
+ */
87
+ registerDialect(uri, vocabularyUris, options = {}) {
88
+ this.mutable();
89
+ const keywords = new Map();
90
+ for (const vocabularyUri of vocabularyUris) {
91
+ const vocab = this.vocabularies.get(vocabularyUri);
92
+ if (!vocab) {
93
+ throw new UnknownDialectError(`dialect '${uri}' requires unregistered vocabulary '${vocabularyUri}'`);
94
+ }
95
+ for (const [name, behavior] of Object.entries(vocab)) {
96
+ keywords.set(name, { name, behavior, vocabularyUri });
97
+ }
98
+ }
99
+ const entries = [...keywords.values()];
100
+ const ordered = [
101
+ ...entries.filter((k) => (k.behavior.phase ?? 0) === 0),
102
+ ...entries.filter((k) => k.behavior.phase === 1),
103
+ ];
104
+ this.dialects.set(uri, {
105
+ uri,
106
+ keywords,
107
+ ordered,
108
+ vocabularyUris: [...vocabularyUris],
109
+ allowUnknownKeywords: options.allowUnknownKeywords ?? true,
110
+ identifiers: options.identifiers ?? identifiers2020,
111
+ refIgnoresSiblings: options.refIgnoresSiblings ?? false,
112
+ });
113
+ }
114
+ /**
115
+ * Looks up a registered dialect by URI.
116
+ * @throws UnknownDialectError if the URI has no registered dialect.
117
+ */
118
+ getDialect(uri) {
119
+ const dialect = this.dialects.get(uri);
120
+ if (!dialect)
121
+ throw new UnknownDialectError(`unknown dialect '${uri}'`);
122
+ return dialect;
123
+ }
124
+ /** True if a dialect is registered under this URI. */
125
+ hasDialect(uri) {
126
+ return this.dialects.has(uri);
127
+ }
128
+ /** True if a vocabulary is registered under this URI. */
129
+ hasVocabulary(uri) {
130
+ return this.vocabularies.has(uri);
131
+ }
132
+ }
133
+ /** Behavior id for annotations from keywords the dialect doesn't know. */
134
+ export const unknownKeywordId = (name) => `urn:jse:keyword:unknown#${name}`;
135
+ //# sourceMappingURL=dialect.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dialect.js","sourceRoot":"","sources":["../src/dialect.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,203 @@
1
+ import { JsonValue } from "./json.js";
2
+ import { Cursor } from "./cursor.js";
3
+ import { SchemaRef } from "./ref.js";
4
+ import { ErrorParams } from "./dialect.js";
5
+ import { SchemaRegistry } from "./registry.js";
6
+ import { RegexCache } from "./regex.js";
7
+ /** Thrown when a schema is re-entered at the same instance location (D8/cycle guard). */
8
+ export declare class InfiniteLoopError extends Error {
9
+ }
10
+ /** Thrown when a dialect disallows unknown keywords and one is present. */
11
+ export declare class UnknownKeywordError extends Error {
12
+ }
13
+ /** Thrown when a keyword reads a dependency behavior id it never declared via `analyze().consumes`. */
14
+ export declare class UndeclaredConsumptionError extends Error {
15
+ }
16
+ /** Thrown when a keyword produces dependency data without declaring its own id via `analyze().produces`. */
17
+ export declare class UndeclaredProductionError extends Error {
18
+ }
19
+ /** Thrown when a keyword reports an error through `ctx.error()` yet accepts the input. */
20
+ export declare class KeywordContractError extends Error {
21
+ }
22
+ /**
23
+ * Annotation elision (D5/M5.5): when set, an annotation record is recorded
24
+ * only if this returns true, and dependency records are recorded only for
25
+ * behavior ids some registered keyword consumes. Applies at every output
26
+ * level: a deselected keyword's annotation is never rendered, relevant or
27
+ * not.
28
+ */
29
+ export type RecordPredicate = (behaviorId: string, keywordName: string, vocabularyUri: string | null) => boolean;
30
+ /**
31
+ * Evaluation-path node: one pre-escaped segment, parent-linked, materialized
32
+ * only when a unit escapes to output.
33
+ */
34
+ export interface PathNode {
35
+ readonly parent: PathNode | null;
36
+ readonly segment: string;
37
+ }
38
+ /** Materializes a path node chain into its JSON Pointer string. */
39
+ export declare function materializePath(node: PathNode | null): string;
40
+ /**
41
+ * An annotation (DESIGN.md §4): application-facing output whose value is
42
+ * the keyword's own value (draft-03 §12.9). The only record kind renderers
43
+ * accept.
44
+ */
45
+ export interface AnnotationRecord {
46
+ readonly kind: "annotation";
47
+ behaviorId: string;
48
+ keywordName: string;
49
+ /** `null` for unknown keywords. */
50
+ vocabularyUri: string | null;
51
+ schemaRef: SchemaRef;
52
+ /** Path of the schema object; the keyword segment is appended on render. */
53
+ pathNode: PathNode | null;
54
+ cursor: Cursor;
55
+ value: unknown;
56
+ }
57
+ /**
58
+ * Dependency information (DESIGN.md §4; draft-03 Appendix D): computed data
59
+ * one keyword communicates to another through the channel. Never rendered.
60
+ */
61
+ export interface DependencyRecord {
62
+ readonly kind: "dependency";
63
+ behaviorId: string;
64
+ keywordName: string;
65
+ schemaRef: SchemaRef;
66
+ /** Path of the schema object the producing keyword belongs to. */
67
+ pathNode: PathNode | null;
68
+ cursor: Cursor;
69
+ data: unknown;
70
+ }
71
+ /** One assertion failure. */
72
+ export interface ErrorRecord {
73
+ /** `null` when the schema itself failed (boolean `false`). */
74
+ keywordName: string | null;
75
+ /** `null` when the schema itself failed (boolean `false`). */
76
+ vocabularyUri: string | null;
77
+ schemaRef: SchemaRef;
78
+ pathNode: PathNode | null;
79
+ cursor: Cursor;
80
+ message: string;
81
+ params?: ErrorParams;
82
+ }
83
+ /** One channel frame: the records of an in-flight schema application. */
84
+ export interface Frame {
85
+ annotations: AnnotationRecord[];
86
+ dependencies: DependencyRecord[];
87
+ }
88
+ /** One keyword evaluation within a traced schema application. */
89
+ export interface KeywordTrace {
90
+ name: string;
91
+ valid: boolean;
92
+ }
93
+ /**
94
+ * One schema application, recorded only when tracing (structured outputs):
95
+ * the structured renderers need application boundaries, per-branch
96
+ * validity, and each keyword's verdict in evaluation order (draft-03 Verbose
97
+ * renders one node per keyword), which the flat error list cannot
98
+ * reconstruct.
99
+ */
100
+ export interface TraceNode {
101
+ schemaRef: SchemaRef;
102
+ pathNode: PathNode | null;
103
+ cursor: Cursor;
104
+ valid: boolean;
105
+ /** keyword evaluations of this application, in order (structural keywords excluded) */
106
+ keywords: KeywordTrace[];
107
+ children: TraceNode[];
108
+ }
109
+ /** Mutable state for one evaluation run: frames, errors, dynamic scope, and tracing. */
110
+ export declare class EvalState {
111
+ registry: SchemaRegistry;
112
+ shouldRecord: RecordPredicate | null;
113
+ regexCache: RegexCache;
114
+ maxDepth: number;
115
+ frames: Frame[];
116
+ /** Relevant errors, in encounter order (rule 6). */
117
+ errors: ErrorRecord[];
118
+ droppedErrors: ErrorRecord[] | null;
119
+ dynamicScope: string[];
120
+ traceRoot: TraceNode | null;
121
+ allAnnotations: AnnotationRecord[] | null;
122
+ allDependencies: DependencyRecord[] | null;
123
+ depth: number;
124
+ private traceStack;
125
+ private active;
126
+ constructor(registry: SchemaRegistry, tracing?: boolean, shouldRecord?: RecordPredicate | null, regexCache?: RegexCache, maxDepth?: number);
127
+ /** True when tracing is active for this run. */
128
+ get tracing(): boolean;
129
+ /** Removes the errors pushed since `mark`: rejecting sub-evaluations of a keyword that accepted (rule 6). */
130
+ dropErrorsFrom(mark: number): void;
131
+ /** Opens a trace node for a schema application and links it under the current one. */
132
+ traceEnter(schemaRef: SchemaRef, pathNode: PathNode | null, cursor: Cursor): TraceNode;
133
+ /** Closes the current trace node with its final validity. */
134
+ traceExit(node: TraceNode, valid: boolean): void;
135
+ /** Records one keyword evaluation's verdict on the current trace node. */
136
+ traceKeyword(name: string, valid: boolean): void;
137
+ /** The innermost open frame. */
138
+ get frame(): Frame;
139
+ /** Annotations surviving at the root frame — the annotation result before retention filtering. */
140
+ get rootAnnotations(): AnnotationRecord[];
141
+ /** Dependency records surviving at the root frame. */
142
+ get rootDependencies(): DependencyRecord[];
143
+ /**
144
+ * Records entry into a schema application for cycle detection.
145
+ * @throws InfiniteLoopError if this schema is already active at this cursor.
146
+ */
147
+ enter(schemaRef: SchemaRef, cursor: Cursor): void;
148
+ /** Records exit from a schema application, releasing its cycle-detection entry. */
149
+ exit(schemaRef: SchemaRef, cursor: Cursor): void;
150
+ }
151
+ /**
152
+ * Applies one schema to one instance cursor: pushes a frame, evaluates the
153
+ * dialect's keywords in order, merges or discards the frame per DESIGN.md §4.
154
+ * @throws InfiniteLoopError if the schema is already active at this cursor.
155
+ * @throws UnknownKeywordError if the dialect disallows an unknown keyword present in the schema.
156
+ */
157
+ export declare function applySchema(state: EvalState, schemaRef: SchemaRef, cursor: Cursor, pathNode: PathNode | null): boolean;
158
+ /** Evaluates an instance against a registered root schema, returning validity and final state. */
159
+ export declare function runEvaluation(registry: SchemaRegistry, schemaUri: string, instance: JsonValue, tracing?: boolean, shouldRecord?: RecordPredicate | null, regexCache?: RegexCache, maxDepth?: number): {
160
+ valid: boolean;
161
+ state: EvalState;
162
+ };
163
+ /** Options for {@link evaluateFragment}: state pre-seeded by a compiled caller. */
164
+ export interface FragmentOptions {
165
+ /** dynamic scope inherited from the caller's path, outermost first (D8) */
166
+ dynamicScope?: readonly string[];
167
+ /** evaluation-path prefix for output locations */
168
+ pathNode?: PathNode | null;
169
+ /** depth already consumed by the caller's nesting (D20 combined budget) */
170
+ depth?: number;
171
+ /** annotation elision predicate (D5); null records everything */
172
+ shouldRecord?: RecordPredicate | null;
173
+ regexCache?: RegexCache;
174
+ maxDepth?: number;
175
+ /**
176
+ * Record the trace: every branch runs (a trace is verbose demand, ADR
177
+ * 0003) and the irrelevant records are retained, so a compiled evaluator
178
+ * can graft the fragment under its own located tree.
179
+ */
180
+ tracing?: boolean;
181
+ }
182
+ /**
183
+ * Evaluates one schema fragment with pre-seeded state: the compiled tier's
184
+ * trampoline into the interpreter (M6), used for dynamic islands and for
185
+ * fallback units alike. Returns the fragment's verdict, its errors, and its
186
+ * root frame's surviving annotation and dependency records — cursor
187
+ * identities intact, so a compiled caller can merge them under channel rule
188
+ * 3 and filter under rule 4 exactly as an interpreted parent would. With
189
+ * `tracing`, also the trace and the retained irrelevant records.
190
+ */
191
+ export declare function evaluateFragment(registry: SchemaRegistry, target: SchemaRef, cursor: Cursor, options?: FragmentOptions): {
192
+ valid: boolean;
193
+ errors: ErrorRecord[];
194
+ annotations: AnnotationRecord[];
195
+ dependencies: DependencyRecord[];
196
+ /** the fragment's application tree; null unless `tracing` */
197
+ traceRoot: TraceNode | null;
198
+ /** errors dropped by an accepting keyword, in drop order; empty unless `tracing` */
199
+ droppedErrors: ErrorRecord[];
200
+ /** every annotation recorded, relevant or not; empty unless `tracing` */
201
+ allAnnotations: AnnotationRecord[];
202
+ };
203
+ //# sourceMappingURL=engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../src/engine.ts"],"names":[],"mappings":"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"}