@lapidist/dtif-parser 0.2.0

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 (199) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +50 -0
  3. package/dist/ast/nodes.d.ts +73 -0
  4. package/dist/ast/nodes.d.ts.map +1 -0
  5. package/dist/ast/nodes.js +2 -0
  6. package/dist/ast/nodes.js.map +1 -0
  7. package/dist/ast/normaliser/context.d.ts +22 -0
  8. package/dist/ast/normaliser/context.d.ts.map +1 -0
  9. package/dist/ast/normaliser/context.js +26 -0
  10. package/dist/ast/normaliser/context.js.map +1 -0
  11. package/dist/ast/normaliser/document.d.ts +4 -0
  12. package/dist/ast/normaliser/document.d.ts.map +1 -0
  13. package/dist/ast/normaliser/document.js +49 -0
  14. package/dist/ast/normaliser/document.js.map +1 -0
  15. package/dist/ast/normaliser/fields.d.ts +7 -0
  16. package/dist/ast/normaliser/fields.d.ts.map +1 -0
  17. package/dist/ast/normaliser/fields.js +71 -0
  18. package/dist/ast/normaliser/fields.js.map +1 -0
  19. package/dist/ast/normaliser/metadata.d.ts +5 -0
  20. package/dist/ast/normaliser/metadata.d.ts.map +1 -0
  21. package/dist/ast/normaliser/metadata.js +201 -0
  22. package/dist/ast/normaliser/metadata.js.map +1 -0
  23. package/dist/ast/normaliser/nodes.d.ts +5 -0
  24. package/dist/ast/normaliser/nodes.d.ts.map +1 -0
  25. package/dist/ast/normaliser/nodes.js +108 -0
  26. package/dist/ast/normaliser/nodes.js.map +1 -0
  27. package/dist/ast/normaliser/overrides.d.ts +7 -0
  28. package/dist/ast/normaliser/overrides.d.ts.map +1 -0
  29. package/dist/ast/normaliser/overrides.js +156 -0
  30. package/dist/ast/normaliser/overrides.js.map +1 -0
  31. package/dist/ast/normaliser/utils.d.ts +12 -0
  32. package/dist/ast/normaliser/utils.d.ts.map +1 -0
  33. package/dist/ast/normaliser/utils.js +45 -0
  34. package/dist/ast/normaliser/utils.js.map +1 -0
  35. package/dist/ast/normaliser.d.ts +5 -0
  36. package/dist/ast/normaliser.d.ts.map +1 -0
  37. package/dist/ast/normaliser.js +25 -0
  38. package/dist/ast/normaliser.js.map +1 -0
  39. package/dist/cli/args.d.ts +3 -0
  40. package/dist/cli/args.d.ts.map +1 -0
  41. package/dist/cli/args.js +202 -0
  42. package/dist/cli/args.js.map +1 -0
  43. package/dist/cli/io.d.ts +3 -0
  44. package/dist/cli/io.d.ts.map +1 -0
  45. package/dist/cli/io.js +65 -0
  46. package/dist/cli/io.js.map +1 -0
  47. package/dist/cli/output.d.ts +5 -0
  48. package/dist/cli/output.d.ts.map +1 -0
  49. package/dist/cli/output.js +113 -0
  50. package/dist/cli/output.js.map +1 -0
  51. package/dist/cli/parse.d.ts +4 -0
  52. package/dist/cli/parse.d.ts.map +1 -0
  53. package/dist/cli/parse.js +134 -0
  54. package/dist/cli/parse.js.map +1 -0
  55. package/dist/cli/serialize.d.ts +12 -0
  56. package/dist/cli/serialize.d.ts.map +1 -0
  57. package/dist/cli/serialize.js +92 -0
  58. package/dist/cli/serialize.js.map +1 -0
  59. package/dist/cli/types.d.ts +118 -0
  60. package/dist/cli/types.d.ts.map +1 -0
  61. package/dist/cli/types.js +2 -0
  62. package/dist/cli/types.js.map +1 -0
  63. package/dist/diagnostics/bag.d.ts +26 -0
  64. package/dist/diagnostics/bag.d.ts.map +1 -0
  65. package/dist/diagnostics/bag.js +101 -0
  66. package/dist/diagnostics/bag.js.map +1 -0
  67. package/dist/diagnostics/codes.d.ts +72 -0
  68. package/dist/diagnostics/codes.d.ts.map +1 -0
  69. package/dist/diagnostics/codes.js +94 -0
  70. package/dist/diagnostics/codes.js.map +1 -0
  71. package/dist/diagnostics/severity.d.ts +8 -0
  72. package/dist/diagnostics/severity.d.ts.map +1 -0
  73. package/dist/diagnostics/severity.js +35 -0
  74. package/dist/diagnostics/severity.js.map +1 -0
  75. package/dist/graph/builder/context.d.ts +23 -0
  76. package/dist/graph/builder/context.d.ts.map +1 -0
  77. package/dist/graph/builder/context.js +29 -0
  78. package/dist/graph/builder/context.js.map +1 -0
  79. package/dist/graph/builder/nodes.d.ts +6 -0
  80. package/dist/graph/builder/nodes.d.ts.map +1 -0
  81. package/dist/graph/builder/nodes.js +85 -0
  82. package/dist/graph/builder/nodes.js.map +1 -0
  83. package/dist/graph/builder/overrides.d.ts +5 -0
  84. package/dist/graph/builder/overrides.d.ts.map +1 -0
  85. package/dist/graph/builder/overrides.js +62 -0
  86. package/dist/graph/builder/overrides.js.map +1 -0
  87. package/dist/graph/builder/references.d.ts +7 -0
  88. package/dist/graph/builder/references.d.ts.map +1 -0
  89. package/dist/graph/builder/references.js +93 -0
  90. package/dist/graph/builder/references.js.map +1 -0
  91. package/dist/graph/builder.d.ts +5 -0
  92. package/dist/graph/builder.d.ts.map +1 -0
  93. package/dist/graph/builder.js +30 -0
  94. package/dist/graph/builder.js.map +1 -0
  95. package/dist/graph/nodes.d.ts +60 -0
  96. package/dist/graph/nodes.d.ts.map +1 -0
  97. package/dist/graph/nodes.js +2 -0
  98. package/dist/graph/nodes.js.map +1 -0
  99. package/dist/index.d.ts +26 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +14 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/io/decoder/encoding.d.ts +4 -0
  104. package/dist/io/decoder/encoding.d.ts.map +1 -0
  105. package/dist/io/decoder/encoding.js +36 -0
  106. package/dist/io/decoder/encoding.js.map +1 -0
  107. package/dist/io/decoder/errors.d.ts +4 -0
  108. package/dist/io/decoder/errors.d.ts.map +1 -0
  109. package/dist/io/decoder/errors.js +7 -0
  110. package/dist/io/decoder/errors.js.map +1 -0
  111. package/dist/io/decoder/source-map.d.ts +4 -0
  112. package/dist/io/decoder/source-map.d.ts.map +1 -0
  113. package/dist/io/decoder/source-map.js +106 -0
  114. package/dist/io/decoder/source-map.js.map +1 -0
  115. package/dist/io/decoder/yaml.d.ts +8 -0
  116. package/dist/io/decoder/yaml.d.ts.map +1 -0
  117. package/dist/io/decoder/yaml.js +28 -0
  118. package/dist/io/decoder/yaml.js.map +1 -0
  119. package/dist/io/decoder.d.ts +4 -0
  120. package/dist/io/decoder.d.ts.map +1 -0
  121. package/dist/io/decoder.js +19 -0
  122. package/dist/io/decoder.js.map +1 -0
  123. package/dist/io/document-cache.d.ts +15 -0
  124. package/dist/io/document-cache.d.ts.map +1 -0
  125. package/dist/io/document-cache.js +101 -0
  126. package/dist/io/document-cache.js.map +1 -0
  127. package/dist/io/document-loader.d.ts +37 -0
  128. package/dist/io/document-loader.d.ts.map +1 -0
  129. package/dist/io/document-loader.js +255 -0
  130. package/dist/io/document-loader.js.map +1 -0
  131. package/dist/plugins/index.d.ts +7 -0
  132. package/dist/plugins/index.d.ts.map +1 -0
  133. package/dist/plugins/index.js +6 -0
  134. package/dist/plugins/index.js.map +1 -0
  135. package/dist/plugins/registry.d.ts +20 -0
  136. package/dist/plugins/registry.d.ts.map +1 -0
  137. package/dist/plugins/registry.js +136 -0
  138. package/dist/plugins/registry.js.map +1 -0
  139. package/dist/plugins/types.d.ts +48 -0
  140. package/dist/plugins/types.d.ts.map +1 -0
  141. package/dist/plugins/types.js +2 -0
  142. package/dist/plugins/types.js.map +1 -0
  143. package/dist/resolver/document-resolver.d.ts +29 -0
  144. package/dist/resolver/document-resolver.d.ts.map +1 -0
  145. package/dist/resolver/document-resolver.js +551 -0
  146. package/dist/resolver/document-resolver.js.map +1 -0
  147. package/dist/resolver/index.d.ts +3 -0
  148. package/dist/resolver/index.d.ts.map +1 -0
  149. package/dist/resolver/index.js +2 -0
  150. package/dist/resolver/index.js.map +1 -0
  151. package/dist/resolver/internal/constants.d.ts +12 -0
  152. package/dist/resolver/internal/constants.d.ts.map +1 -0
  153. package/dist/resolver/internal/constants.js +8 -0
  154. package/dist/resolver/internal/constants.js.map +1 -0
  155. package/dist/resolver/internal/context.d.ts +8 -0
  156. package/dist/resolver/internal/context.d.ts.map +1 -0
  157. package/dist/resolver/internal/context.js +43 -0
  158. package/dist/resolver/internal/context.js.map +1 -0
  159. package/dist/resolver/internal/helpers.d.ts +16 -0
  160. package/dist/resolver/internal/helpers.d.ts.map +1 -0
  161. package/dist/resolver/internal/helpers.js +53 -0
  162. package/dist/resolver/internal/helpers.js.map +1 -0
  163. package/dist/resolver/internal/resolved-token.d.ts +24 -0
  164. package/dist/resolver/internal/resolved-token.d.ts.map +1 -0
  165. package/dist/resolver/internal/resolved-token.js +26 -0
  166. package/dist/resolver/internal/resolved-token.js.map +1 -0
  167. package/dist/resolver/types.d.ts +51 -0
  168. package/dist/resolver/types.d.ts.map +1 -0
  169. package/dist/resolver/types.js +2 -0
  170. package/dist/resolver/types.js.map +1 -0
  171. package/dist/session/internal/options.d.ts +16 -0
  172. package/dist/session/internal/options.d.ts.map +1 -0
  173. package/dist/session/internal/options.js +30 -0
  174. package/dist/session/internal/options.js.map +1 -0
  175. package/dist/session/types.d.ts +16 -0
  176. package/dist/session/types.d.ts.map +1 -0
  177. package/dist/session/types.js +2 -0
  178. package/dist/session/types.js.map +1 -0
  179. package/dist/session.d.ts +19 -0
  180. package/dist/session.d.ts.map +1 -0
  181. package/dist/session.js +210 -0
  182. package/dist/session.js.map +1 -0
  183. package/dist/types.d.ts +75 -0
  184. package/dist/types.d.ts.map +1 -0
  185. package/dist/types.js +2 -0
  186. package/dist/types.js.map +1 -0
  187. package/dist/utils/json-pointer.d.ts +13 -0
  188. package/dist/utils/json-pointer.d.ts.map +1 -0
  189. package/dist/utils/json-pointer.js +89 -0
  190. package/dist/utils/json-pointer.js.map +1 -0
  191. package/dist/utils/source.d.ts +21 -0
  192. package/dist/utils/source.d.ts.map +1 -0
  193. package/dist/utils/source.js +125 -0
  194. package/dist/utils/source.js.map +1 -0
  195. package/dist/validation/schema-guard.d.ts +20 -0
  196. package/dist/validation/schema-guard.d.ts.map +1 -0
  197. package/dist/validation/schema-guard.js +205 -0
  198. package/dist/validation/schema-guard.js.map +1 -0
  199. package/package.json +49 -0
@@ -0,0 +1,48 @@
1
+ import type { Diagnostic } from '../types.js';
2
+ import type { JsonPointer, RawDocument, SourceSpan } from '../types.js';
3
+ import type { ResolvedToken } from '../resolver/index.js';
4
+ export interface ExtensionHandlerInput {
5
+ readonly namespace: string;
6
+ readonly pointer: JsonPointer;
7
+ readonly span?: SourceSpan;
8
+ readonly value: unknown;
9
+ readonly document: RawDocument;
10
+ }
11
+ export interface ExtensionHandlerResult {
12
+ readonly normalized?: unknown;
13
+ readonly diagnostics?: readonly Diagnostic[];
14
+ }
15
+ export type ExtensionHandler = (input: ExtensionHandlerInput) => ExtensionHandlerResult | void;
16
+ export interface ExtensionEvaluation {
17
+ readonly plugin: string;
18
+ readonly namespace: string;
19
+ readonly pointer: JsonPointer;
20
+ readonly span?: SourceSpan;
21
+ readonly value: unknown;
22
+ readonly normalized?: unknown;
23
+ readonly diagnostics: readonly Diagnostic[];
24
+ }
25
+ export interface ResolvedTokenTransformContext {
26
+ readonly document: RawDocument;
27
+ }
28
+ export interface ResolvedTokenTransformResult {
29
+ readonly data?: unknown;
30
+ readonly diagnostics?: readonly Diagnostic[];
31
+ }
32
+ export type ResolvedTokenTransform = (token: ResolvedToken, context: ResolvedTokenTransformContext) => ResolvedTokenTransformResult | void;
33
+ export interface ResolvedTokenTransformEvaluation {
34
+ readonly plugin: string;
35
+ readonly pointer: JsonPointer;
36
+ readonly data?: unknown;
37
+ readonly diagnostics: readonly Diagnostic[];
38
+ }
39
+ export interface ParserPlugin {
40
+ readonly name: string;
41
+ readonly extensions?: ReadonlyMap<string, ExtensionHandler> | Readonly<Record<string, ExtensionHandler>>;
42
+ readonly transformResolvedToken?: ResolvedTokenTransform;
43
+ }
44
+ export interface ResolvedTokenTransformEntry {
45
+ readonly plugin: string;
46
+ readonly transform: ResolvedTokenTransform;
47
+ }
48
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACxE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAE1D,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;CAChC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;CAC9C;AAED,MAAM,MAAM,gBAAgB,GAAG,CAAC,KAAK,EAAE,qBAAqB,KAAK,sBAAsB,GAAG,IAAI,CAAC;AAE/F,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,UAAU,CAAC,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;CAChC;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;CAC9C;AAED,MAAM,MAAM,sBAAsB,GAAG,CACnC,KAAK,EAAE,aAAa,EACpB,OAAO,EAAE,6BAA6B,KACnC,4BAA4B,GAAG,IAAI,CAAC;AAEzC,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,EAAE,WAAW,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;CAC7C;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,UAAU,CAAC,EAChB,WAAW,CAAC,MAAM,EAAE,gBAAgB,CAAC,GACrC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;IAC/C,QAAQ,CAAC,sBAAsB,CAAC,EAAE,sBAAsB,CAAC;CAC1D;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;CAC5C"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/plugins/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,29 @@
1
+ import type { JsonPointer } from '../types.js';
2
+ import type { DocumentGraph } from '../graph/nodes.js';
3
+ import type { DocumentResolverOptions, ResolutionResult } from './types.js';
4
+ export declare class DocumentResolver {
5
+ private readonly graph;
6
+ private readonly context;
7
+ private readonly overrides;
8
+ private readonly maxDepth;
9
+ private readonly document?;
10
+ private readonly transforms;
11
+ private readonly cache;
12
+ private readonly pending;
13
+ constructor(graph: DocumentGraph, options?: DocumentResolverOptions);
14
+ resolve(pointer: JsonPointer): ResolutionResult;
15
+ private resolveInternal;
16
+ private resolveBaseNode;
17
+ private resolveTokenNode;
18
+ private resolveAliasNode;
19
+ private applyOverrides;
20
+ private evaluateOverride;
21
+ private doesOverrideApply;
22
+ private resolveOverrideRef;
23
+ private resolveOverrideValue;
24
+ private resolveFallbackChain;
25
+ private resolveFallbackEntry;
26
+ private applyTransforms;
27
+ }
28
+ export declare function createDocumentResolver(graph: DocumentGraph, options?: DocumentResolverOptions): DocumentResolver;
29
+ //# sourceMappingURL=document-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document-resolver.d.ts","sourceRoot":"","sources":["../../src/resolver/document-resolver.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAc,WAAW,EAAe,MAAM,aAAa,CAAC;AACxE,OAAO,KAAK,EACV,aAAa,EAOd,MAAM,mBAAmB,CAAC;AA4B3B,OAAO,KAAK,EACV,uBAAuB,EACvB,gBAAgB,EAOjB,MAAM,YAAY,CAAC;AA+BpB,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgB;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+B;IACvD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyD;IACnF,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAc;IACxC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyC;IACpE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAA2C;IACjE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA0B;gBAEtC,KAAK,EAAE,aAAa,EAAE,OAAO,GAAE,uBAA4B;IASvE,OAAO,CAAC,OAAO,EAAE,WAAW,GAAG,gBAAgB;IAkC/C,OAAO,CAAC,eAAe;IAoEvB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,gBAAgB;IAgCxB,OAAO,CAAC,gBAAgB;IAwExB,OAAO,CAAC,cAAc;IA2CtB,OAAO,CAAC,gBAAgB;IAmExB,OAAO,CAAC,iBAAiB;IAmBzB,OAAO,CAAC,kBAAkB;IAiF1B,OAAO,CAAC,oBAAoB;IA4B5B,OAAO,CAAC,oBAAoB;IA0C5B,OAAO,CAAC,oBAAoB;IA4H5B,OAAO,CAAC,eAAe;CAsCxB;AAED,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,aAAa,EACpB,OAAO,GAAE,uBAA4B,GACpC,gBAAgB,CAElB"}
@@ -0,0 +1,551 @@
1
+ import { DiagnosticCodes } from '../diagnostics/codes.js';
2
+ import { DiagnosticBag } from '../diagnostics/bag.js';
3
+ import { JSON_POINTER_ROOT, normalizeJsonPointer } from '../utils/json-pointer.js';
4
+ import { EMPTY_DIAGNOSTICS, EMPTY_OVERRIDES, EMPTY_TRACE, EMPTY_WARNINGS, EMPTY_TRANSFORM_EVALUATIONS, EMPTY_TRANSFORM_ENTRIES, DEFAULT_MAX_DEPTH } from './internal/constants.js';
5
+ import { finalizeResolution, freezeResultDiagnostics, createTransformFailureDiagnostic, createTraceStep, createFieldSource, createTargetSource, mergeDiagnostics, conditionMatches } from './internal/helpers.js';
6
+ import { normalizeContext, normalizeMaxDepth, indexOverrides, normalizeTransforms } from './internal/context.js';
7
+ import { ResolvedTokenImpl } from './internal/resolved-token.js';
8
+ export class DocumentResolver {
9
+ graph;
10
+ context;
11
+ overrides;
12
+ maxDepth;
13
+ document;
14
+ transforms;
15
+ cache = new Map();
16
+ pending = new Set();
17
+ constructor(graph, options = {}) {
18
+ this.graph = graph;
19
+ this.context = normalizeContext(options.context);
20
+ this.overrides = indexOverrides(graph.overrides);
21
+ this.maxDepth = normalizeMaxDepth(options.maxDepth);
22
+ this.document = options.document;
23
+ this.transforms = normalizeTransforms(options.transforms);
24
+ }
25
+ resolve(pointer) {
26
+ const diagnostics = new DiagnosticBag();
27
+ try {
28
+ const normalized = normalizeJsonPointer(pointer);
29
+ const state = this.resolveInternal(normalized, diagnostics, 0);
30
+ if (!state) {
31
+ return finalizeResolution(undefined, diagnostics);
32
+ }
33
+ const token = new ResolvedTokenImpl({
34
+ pointer: normalized,
35
+ uri: this.graph.uri,
36
+ type: state.type,
37
+ value: state.value,
38
+ source: state.source,
39
+ overrides: state.overrides,
40
+ warnings: state.warnings,
41
+ trace: state.trace
42
+ });
43
+ const transforms = this.applyTransforms(token, diagnostics);
44
+ return finalizeResolution(token, diagnostics, transforms);
45
+ }
46
+ catch (error) {
47
+ diagnostics.add({
48
+ code: DiagnosticCodes.resolver.FAILED,
49
+ message: error instanceof Error ? error.message : 'Failed to resolve token.',
50
+ severity: 'error',
51
+ pointer
52
+ });
53
+ return finalizeResolution(undefined, diagnostics);
54
+ }
55
+ }
56
+ resolveInternal(pointer, diagnostics, depth) {
57
+ if (this.cache.has(pointer)) {
58
+ return this.cache.get(pointer);
59
+ }
60
+ if (this.pending.has(pointer)) {
61
+ diagnostics.add({
62
+ code: DiagnosticCodes.resolver.CYCLE_DETECTED,
63
+ message: `Circular reference detected while resolving "${pointer}".`,
64
+ severity: 'error',
65
+ pointer
66
+ });
67
+ return undefined;
68
+ }
69
+ if (depth > this.maxDepth) {
70
+ diagnostics.add({
71
+ code: DiagnosticCodes.resolver.MAX_DEPTH_EXCEEDED,
72
+ message: `Resolution depth exceeded maximum of ${this.maxDepth} while resolving "${pointer}".`,
73
+ severity: 'error',
74
+ pointer
75
+ });
76
+ return undefined;
77
+ }
78
+ const node = this.graph.nodes.get(pointer);
79
+ if (!node) {
80
+ diagnostics.add({
81
+ code: DiagnosticCodes.resolver.UNKNOWN_POINTER,
82
+ message: `No token exists at pointer "${pointer}".`,
83
+ severity: 'error',
84
+ pointer
85
+ });
86
+ return undefined;
87
+ }
88
+ if (node.kind === 'collection') {
89
+ diagnostics.add({
90
+ code: DiagnosticCodes.resolver.INVALID_NODE_KIND,
91
+ message: `Cannot resolve collection node at pointer "${pointer}".`,
92
+ severity: 'error',
93
+ pointer,
94
+ span: node.span
95
+ });
96
+ return undefined;
97
+ }
98
+ this.pending.add(pointer);
99
+ try {
100
+ const base = this.resolveBaseNode(node, diagnostics, depth);
101
+ if (!base) {
102
+ return undefined;
103
+ }
104
+ const withOverrides = this.applyOverrides(node.pointer, base, diagnostics, depth);
105
+ this.cache.set(pointer, withOverrides);
106
+ return withOverrides;
107
+ }
108
+ finally {
109
+ this.pending.delete(pointer);
110
+ }
111
+ }
112
+ resolveBaseNode(node, diagnostics, depth) {
113
+ switch (node.kind) {
114
+ case 'token':
115
+ return this.resolveTokenNode(node, diagnostics);
116
+ case 'alias':
117
+ return this.resolveAliasNode(node, diagnostics, depth);
118
+ default:
119
+ return undefined;
120
+ }
121
+ }
122
+ resolveTokenNode(node, diagnostics) {
123
+ const trace = Object.freeze([createTraceStep(node.pointer, 'token', node.span)]);
124
+ const valueField = node.value;
125
+ const warnings = [];
126
+ let source;
127
+ let value;
128
+ if (valueField) {
129
+ value = valueField.value;
130
+ source = createFieldSource(valueField, this.graph.uri);
131
+ }
132
+ else {
133
+ diagnostics.add({
134
+ code: DiagnosticCodes.resolver.MISSING_BASE_VALUE,
135
+ message: `Token "${node.pointer}" does not declare a $value.`,
136
+ severity: 'error',
137
+ pointer: node.pointer,
138
+ span: node.span
139
+ });
140
+ value = undefined;
141
+ }
142
+ return {
143
+ pointer: node.pointer,
144
+ type: node.type?.value,
145
+ value,
146
+ source,
147
+ overrides: EMPTY_OVERRIDES,
148
+ warnings: warnings.length === 0 ? EMPTY_WARNINGS : Object.freeze(warnings),
149
+ trace
150
+ };
151
+ }
152
+ resolveAliasNode(node, diagnostics, depth) {
153
+ const tracePrefix = createTraceStep(node.pointer, 'alias', node.span);
154
+ const target = node.ref.value;
155
+ if (target.external) {
156
+ diagnostics.add({
157
+ code: DiagnosticCodes.resolver.EXTERNAL_REFERENCE,
158
+ message: `Alias "${node.pointer}" references external pointer "${target.uri.href}${target.pointer}" which is not yet supported.`,
159
+ severity: 'error',
160
+ pointer: node.pointer,
161
+ span: node.ref.span
162
+ });
163
+ return {
164
+ pointer: node.pointer,
165
+ type: node.type.value,
166
+ value: undefined,
167
+ source: undefined,
168
+ overrides: EMPTY_OVERRIDES,
169
+ warnings: EMPTY_WARNINGS,
170
+ trace: Object.freeze([tracePrefix])
171
+ };
172
+ }
173
+ const targetState = this.resolveInternal(target.pointer, diagnostics, depth + 1);
174
+ if (!targetState) {
175
+ return {
176
+ pointer: node.pointer,
177
+ type: node.type.value,
178
+ value: undefined,
179
+ source: undefined,
180
+ overrides: EMPTY_OVERRIDES,
181
+ warnings: EMPTY_WARNINGS,
182
+ trace: Object.freeze([tracePrefix])
183
+ };
184
+ }
185
+ const type = node.type.value ?? targetState.type;
186
+ if (type && targetState.type && type !== targetState.type) {
187
+ diagnostics.add({
188
+ code: DiagnosticCodes.resolver.TARGET_TYPE_MISMATCH,
189
+ message: `Alias "${node.pointer}" expects type "${type}" but target "${target.pointer}" resolved to type "${targetState.type}".`,
190
+ severity: 'error',
191
+ pointer: node.ref.pointer,
192
+ span: node.ref.span,
193
+ related: [
194
+ {
195
+ message: 'Target token resolved here.',
196
+ pointer: target.pointer,
197
+ span: targetState.source?.span
198
+ }
199
+ ]
200
+ });
201
+ }
202
+ const trace = Object.freeze([tracePrefix, ...targetState.trace]);
203
+ return {
204
+ pointer: node.pointer,
205
+ type,
206
+ value: targetState.value,
207
+ source: targetState.source,
208
+ overrides: targetState.overrides,
209
+ warnings: targetState.warnings,
210
+ trace
211
+ };
212
+ }
213
+ applyOverrides(pointer, base, diagnostics, depth) {
214
+ const overrides = this.overrides.get(pointer);
215
+ if (!overrides || overrides.length === 0) {
216
+ return base;
217
+ }
218
+ let matchedState;
219
+ for (const override of overrides) {
220
+ const evaluation = this.evaluateOverride(override, base, diagnostics, depth);
221
+ for (const diagnostic of evaluation.diagnostics) {
222
+ diagnostics.add(diagnostic);
223
+ }
224
+ if (evaluation.matched && evaluation.state) {
225
+ matchedState = evaluation.state;
226
+ }
227
+ }
228
+ if (!matchedState) {
229
+ return base;
230
+ }
231
+ const prefix = base.trace.length > 0 ? base.trace[0] : createTraceStep(pointer, 'token');
232
+ const trace = Object.freeze([prefix, ...matchedState.trace]);
233
+ const type = base.type ?? matchedState.type;
234
+ const warnings = mergeDiagnostics(base.warnings, matchedState.warnings);
235
+ return {
236
+ pointer: base.pointer,
237
+ type,
238
+ value: matchedState.value,
239
+ source: matchedState.source ?? base.source,
240
+ overrides: matchedState.overrides,
241
+ warnings,
242
+ trace
243
+ };
244
+ }
245
+ evaluateOverride(override, base, diagnostics, depth) {
246
+ if (!this.doesOverrideApply(override)) {
247
+ return { matched: false, diagnostics: EMPTY_DIAGNOSTICS };
248
+ }
249
+ if (override.token.value.external) {
250
+ return {
251
+ matched: true,
252
+ diagnostics: [
253
+ {
254
+ code: DiagnosticCodes.resolver.EXTERNAL_REFERENCE,
255
+ message: `Override "$token" target "${override.token.value.uri.href}${override.token.value.pointer}" is external and not yet supported.`,
256
+ severity: 'error',
257
+ pointer: override.pointer,
258
+ span: override.token.span
259
+ }
260
+ ]
261
+ };
262
+ }
263
+ const traceSteps = [
264
+ createTraceStep(override.pointer, 'override', override.span)
265
+ ];
266
+ const diagnosticsList = [];
267
+ let state;
268
+ if (override.ref) {
269
+ state = this.resolveOverrideRef(override, base, diagnosticsList, traceSteps, depth);
270
+ }
271
+ if (!state && override.value) {
272
+ state = this.resolveOverrideValue(override, traceSteps);
273
+ }
274
+ if (!state && override.fallback) {
275
+ state = this.resolveFallbackChain(override.fallback, base, diagnosticsList, 1, traceSteps, depth + 1);
276
+ }
277
+ if (!state) {
278
+ diagnosticsList.push({
279
+ code: DiagnosticCodes.resolver.OVERRIDE_FAILED,
280
+ message: `Override "${override.pointer}" matched the current context but did not resolve to a value.`,
281
+ severity: 'error',
282
+ pointer: override.pointer,
283
+ span: override.span
284
+ });
285
+ }
286
+ return {
287
+ matched: true,
288
+ state,
289
+ diagnostics: diagnosticsList.length === 0 ? EMPTY_DIAGNOSTICS : Object.freeze(diagnosticsList)
290
+ };
291
+ }
292
+ doesOverrideApply(override) {
293
+ const conditions = override.when.value;
294
+ let recognized = false;
295
+ for (const [key, expected] of Object.entries(conditions)) {
296
+ if (!this.context.has(key)) {
297
+ return false;
298
+ }
299
+ recognized = true;
300
+ const actual = this.context.get(key);
301
+ if (!conditionMatches(expected, actual)) {
302
+ return false;
303
+ }
304
+ }
305
+ return recognized;
306
+ }
307
+ resolveOverrideRef(override, base, diagnostics, trace, depth) {
308
+ const ref = override.ref;
309
+ const target = ref.value;
310
+ if (target.external) {
311
+ diagnostics.push({
312
+ code: DiagnosticCodes.resolver.EXTERNAL_REFERENCE,
313
+ message: `Override "${override.pointer}" references external pointer "${target.uri.href}${target.pointer}" which is not yet supported.`,
314
+ severity: 'error',
315
+ pointer: ref.pointer,
316
+ span: ref.span
317
+ });
318
+ return undefined;
319
+ }
320
+ const targetDiagnostics = new DiagnosticBag();
321
+ const targetState = this.resolveInternal(target.pointer, targetDiagnostics, depth + 1);
322
+ const targetMessages = targetDiagnostics.toArray();
323
+ if (targetMessages.length > 0) {
324
+ diagnostics.push(...targetMessages);
325
+ }
326
+ if (!targetState) {
327
+ diagnostics.push({
328
+ code: DiagnosticCodes.resolver.OVERRIDE_FAILED,
329
+ message: `Override "${override.pointer}" could not resolve target "${target.pointer}".`,
330
+ severity: 'error',
331
+ pointer: ref.pointer,
332
+ span: ref.span
333
+ });
334
+ return undefined;
335
+ }
336
+ const type = base.type ?? targetState.type;
337
+ if (base.type && targetState.type && base.type !== targetState.type) {
338
+ diagnostics.push({
339
+ code: DiagnosticCodes.resolver.TARGET_TYPE_MISMATCH,
340
+ message: `Override "${override.pointer}" expects type "${base.type}" but target "${target.pointer}" resolved to type "${targetState.type}".`,
341
+ severity: 'error',
342
+ pointer: ref.pointer,
343
+ span: ref.span,
344
+ related: [
345
+ {
346
+ message: 'Target token resolved here.',
347
+ pointer: target.pointer,
348
+ span: targetState.source?.span
349
+ }
350
+ ]
351
+ });
352
+ }
353
+ const source = targetState.source ?? createTargetSource(target, ref.span);
354
+ const overrides = Object.freeze([
355
+ ...targetState.overrides,
356
+ Object.freeze({
357
+ pointer: override.pointer,
358
+ span: override.span,
359
+ kind: 'override-ref',
360
+ depth: 0,
361
+ source
362
+ })
363
+ ]);
364
+ const warnings = mergeDiagnostics(targetState.warnings, []);
365
+ const traceSteps = Object.freeze([...trace, ...targetState.trace]);
366
+ return {
367
+ type,
368
+ value: targetState.value,
369
+ source,
370
+ overrides,
371
+ warnings,
372
+ trace: traceSteps
373
+ };
374
+ }
375
+ resolveOverrideValue(override, trace) {
376
+ const valueField = override.value;
377
+ const source = createFieldSource(valueField, this.graph.uri);
378
+ const overrides = Object.freeze([
379
+ Object.freeze({
380
+ pointer: override.pointer,
381
+ span: override.span,
382
+ kind: 'override-value',
383
+ depth: 0,
384
+ source
385
+ })
386
+ ]);
387
+ const traceSteps = Object.freeze([...trace]);
388
+ return {
389
+ value: valueField.value,
390
+ source,
391
+ overrides,
392
+ warnings: EMPTY_WARNINGS,
393
+ trace: traceSteps
394
+ };
395
+ }
396
+ resolveFallbackChain(chain, base, diagnostics, depth, trace, resolutionDepth) {
397
+ if (resolutionDepth > this.maxDepth) {
398
+ diagnostics.push({
399
+ code: DiagnosticCodes.resolver.MAX_DEPTH_EXCEEDED,
400
+ message: `Resolution depth exceeded maximum of ${this.maxDepth} while evaluating fallback chain for "${chain[0]?.pointer ?? base.pointer}".`,
401
+ severity: 'error',
402
+ pointer: chain[0]?.pointer ?? base.pointer
403
+ });
404
+ return undefined;
405
+ }
406
+ for (const entry of chain) {
407
+ const result = this.resolveFallbackEntry(entry, base, diagnostics, depth, trace, resolutionDepth);
408
+ if (result) {
409
+ return result;
410
+ }
411
+ }
412
+ diagnostics.push({
413
+ code: DiagnosticCodes.resolver.FALLBACK_EXHAUSTED,
414
+ message: 'Override fallback chain exhausted without producing a value.',
415
+ severity: 'error',
416
+ pointer: chain[0]?.pointer ?? JSON_POINTER_ROOT
417
+ });
418
+ return undefined;
419
+ }
420
+ resolveFallbackEntry(entry, base, diagnostics, depth, trace, resolutionDepth) {
421
+ if (resolutionDepth > this.maxDepth) {
422
+ diagnostics.push({
423
+ code: DiagnosticCodes.resolver.MAX_DEPTH_EXCEEDED,
424
+ message: `Resolution depth exceeded maximum of ${this.maxDepth} while evaluating fallback entry "${entry.pointer}".`,
425
+ severity: 'error',
426
+ pointer: entry.pointer,
427
+ span: entry.span
428
+ });
429
+ return undefined;
430
+ }
431
+ const fallbackTrace = [...trace, createTraceStep(entry.pointer, 'fallback', entry.span)];
432
+ if (entry.ref) {
433
+ const target = entry.ref.value;
434
+ if (target.external) {
435
+ diagnostics.push({
436
+ code: DiagnosticCodes.resolver.EXTERNAL_REFERENCE,
437
+ message: `Fallback entry "${entry.pointer}" references external pointer "${target.uri.href}${target.pointer}" which is not yet supported.`,
438
+ severity: 'error',
439
+ pointer: entry.ref.pointer,
440
+ span: entry.ref.span
441
+ });
442
+ }
443
+ else {
444
+ const targetDiagnostics = new DiagnosticBag();
445
+ const targetState = this.resolveInternal(target.pointer, targetDiagnostics, resolutionDepth + 1);
446
+ const targetMessages = targetDiagnostics.toArray();
447
+ if (targetMessages.length > 0) {
448
+ diagnostics.push(...targetMessages);
449
+ }
450
+ if (targetState) {
451
+ const type = base.type ?? targetState.type;
452
+ if (base.type && targetState.type && base.type !== targetState.type) {
453
+ diagnostics.push({
454
+ code: DiagnosticCodes.resolver.TARGET_TYPE_MISMATCH,
455
+ message: `Fallback entry "${entry.pointer}" expects type "${base.type}" but target "${target.pointer}" resolved to type "${targetState.type}".`,
456
+ severity: 'error',
457
+ pointer: entry.ref.pointer,
458
+ span: entry.ref.span,
459
+ related: [
460
+ {
461
+ message: 'Target token resolved here.',
462
+ pointer: target.pointer,
463
+ span: targetState.source?.span
464
+ }
465
+ ]
466
+ });
467
+ }
468
+ const source = targetState.source ?? createTargetSource(target, entry.ref.span);
469
+ const overrides = Object.freeze([
470
+ ...targetState.overrides,
471
+ Object.freeze({
472
+ pointer: entry.pointer,
473
+ span: entry.span,
474
+ kind: 'fallback-ref',
475
+ depth,
476
+ source
477
+ })
478
+ ]);
479
+ const warnings = mergeDiagnostics(targetState.warnings, []);
480
+ const traceSteps = Object.freeze([...fallbackTrace, ...targetState.trace]);
481
+ return {
482
+ type,
483
+ value: targetState.value,
484
+ source,
485
+ overrides,
486
+ warnings,
487
+ trace: traceSteps
488
+ };
489
+ }
490
+ }
491
+ }
492
+ if (entry.value) {
493
+ const source = createFieldSource(entry.value, this.graph.uri);
494
+ const overrides = Object.freeze([
495
+ Object.freeze({
496
+ pointer: entry.pointer,
497
+ span: entry.span,
498
+ kind: 'fallback-value',
499
+ depth,
500
+ source
501
+ })
502
+ ]);
503
+ const traceSteps = Object.freeze([...fallbackTrace]);
504
+ return {
505
+ value: entry.value.value,
506
+ source,
507
+ overrides,
508
+ warnings: EMPTY_WARNINGS,
509
+ trace: traceSteps
510
+ };
511
+ }
512
+ if (entry.fallback && entry.fallback.length > 0) {
513
+ return this.resolveFallbackChain(entry.fallback, base, diagnostics, depth + 1, fallbackTrace, resolutionDepth + 1);
514
+ }
515
+ return undefined;
516
+ }
517
+ applyTransforms(token, diagnostics) {
518
+ if (this.transforms.length === 0 || !this.document) {
519
+ return EMPTY_TRANSFORM_EVALUATIONS;
520
+ }
521
+ const evaluations = [];
522
+ for (const entry of this.transforms) {
523
+ try {
524
+ const result = entry.transform(token, { document: this.document });
525
+ const transformDiagnostics = freezeResultDiagnostics(result?.diagnostics);
526
+ if (transformDiagnostics.length > 0) {
527
+ for (const diagnostic of transformDiagnostics) {
528
+ diagnostics.add(diagnostic);
529
+ }
530
+ }
531
+ evaluations.push(Object.freeze({
532
+ plugin: entry.plugin,
533
+ pointer: token.pointer,
534
+ data: result?.data,
535
+ diagnostics: transformDiagnostics
536
+ }));
537
+ }
538
+ catch (error) {
539
+ diagnostics.add(createTransformFailureDiagnostic(entry.plugin, token.pointer, error));
540
+ }
541
+ }
542
+ if (evaluations.length === 0) {
543
+ return EMPTY_TRANSFORM_EVALUATIONS;
544
+ }
545
+ return Object.freeze(evaluations);
546
+ }
547
+ }
548
+ export function createDocumentResolver(graph, options = {}) {
549
+ return new DocumentResolver(graph, options);
550
+ }
551
+ //# sourceMappingURL=document-resolver.js.map