@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
package/CHANGELOG.md ADDED
@@ -0,0 +1,15 @@
1
+ # @lapidist/dtif-parser changelog
2
+
3
+ ## 0.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#55](https://github.com/bylapidist/dtif/pull/55) [`df44ed8`](https://github.com/bylapidist/dtif/commit/df44ed8cc76d22e6780b6b4b4e6965ff42c76130) Thanks [@brettdorrans](https://github.com/brettdorrans)! - Introduce the canonical DTIF parser package with the full pipeline from loading
8
+ and decoding through schema validation, normalisation, graph construction, and
9
+ resolution. Ship the `dtif-parse` CLI, document and cache integrations,
10
+ configurable resolver depth limits, and plugin hooks that surface extension
11
+ results and resolved-token transforms alongside structured diagnostics.
12
+
13
+ All notable changes to this project will be documented in this file.
14
+
15
+ Release notes are generated from Changesets during publishing.
package/README.md ADDED
@@ -0,0 +1,50 @@
1
+ # @lapidist/dtif-parser
2
+
3
+ Canonical parser and runtime for the Design Token Interchange Format (DTIF). The
4
+ package provides the reference pipeline for loading, validating, normalising,
5
+ and resolving DTIF documents while emitting structured diagnostics for tooling
6
+ and automation workflows.
7
+
8
+ > Documentation: [Using the DTIF parser](https://dtif.lapidist.net/guides/dtif-parser/)
9
+
10
+ ## Installation
11
+
12
+ ```bash
13
+ npm install @lapidist/dtif-parser
14
+ ```
15
+
16
+ The package targets modern Node runtimes (v18+) and is published as a native ESM
17
+ module.
18
+
19
+ ## Usage
20
+
21
+ ```ts
22
+ import { parseDocument } from '@lapidist/dtif-parser';
23
+
24
+ const result = await parseDocument('tokens.json');
25
+
26
+ for (const diagnostic of result.diagnostics) {
27
+ console.error(`${diagnostic.severity}: ${diagnostic.message}`);
28
+ }
29
+
30
+ const resolved = result.resolver?.resolve('#/color/brand/primary');
31
+ console.log(resolved?.value);
32
+ ```
33
+
34
+ Create a session with `createSession` to reuse caches, install custom document
35
+ loaders, register plugins, or parse multiple collections with shared state.
36
+
37
+ ## Command line interface
38
+
39
+ The workspace publishes a `dtif-parse` binary for quick inspection and CI
40
+ pipelines:
41
+
42
+ ```bash
43
+ dtif-parse tokens/base.tokens.json --resolve "#/color/brand/primary"
44
+ ```
45
+
46
+ Use `dtif-parse --help` for the full list of options and output formats.
47
+
48
+ ## License
49
+
50
+ MIT © Lapidist
@@ -0,0 +1,73 @@
1
+ import type { JsonPointer, SourceSpan } from '../types.js';
2
+ export interface AstField<T> {
3
+ readonly value: T;
4
+ readonly pointer: JsonPointer;
5
+ readonly span?: SourceSpan;
6
+ }
7
+ export interface DeprecatedMetadata {
8
+ readonly active: boolean;
9
+ readonly replacement?: AstField<string>;
10
+ }
11
+ export interface NodeMetadata {
12
+ readonly description?: AstField<string>;
13
+ readonly extensions?: AstField<Readonly<Record<string, unknown>>>;
14
+ readonly deprecated?: AstField<DeprecatedMetadata>;
15
+ readonly lastModified?: AstField<string>;
16
+ readonly lastUsed?: AstField<string>;
17
+ readonly usageCount?: AstField<number>;
18
+ readonly author?: AstField<string>;
19
+ readonly tags?: AstField<readonly string[]>;
20
+ readonly hash?: AstField<string>;
21
+ }
22
+ export interface BaseNode {
23
+ readonly kind: 'collection' | 'token' | 'alias';
24
+ readonly name: string;
25
+ readonly pointer: JsonPointer;
26
+ readonly span?: SourceSpan;
27
+ readonly metadata: NodeMetadata;
28
+ }
29
+ export interface CollectionNode extends BaseNode {
30
+ readonly kind: 'collection';
31
+ readonly children: readonly DocumentChildNode[];
32
+ }
33
+ export interface TokenNode extends BaseNode {
34
+ readonly kind: 'token';
35
+ readonly type?: AstField<string>;
36
+ readonly value?: AstField<unknown>;
37
+ }
38
+ export interface AliasNode extends BaseNode {
39
+ readonly kind: 'alias';
40
+ readonly type: AstField<string>;
41
+ readonly ref: AstField<string>;
42
+ }
43
+ export type DocumentChildNode = CollectionNode | TokenNode | AliasNode;
44
+ export interface OverrideFallbackNode {
45
+ readonly kind: 'fallback';
46
+ readonly pointer: JsonPointer;
47
+ readonly span?: SourceSpan;
48
+ readonly ref?: AstField<string>;
49
+ readonly value?: AstField<unknown>;
50
+ readonly fallback?: readonly OverrideFallbackNode[];
51
+ }
52
+ export interface OverrideNode {
53
+ readonly kind: 'override';
54
+ readonly pointer: JsonPointer;
55
+ readonly span?: SourceSpan;
56
+ readonly token: AstField<string>;
57
+ readonly when: AstField<Readonly<Record<string, unknown>>>;
58
+ readonly ref?: AstField<string>;
59
+ readonly value?: AstField<unknown>;
60
+ readonly fallback?: readonly OverrideFallbackNode[];
61
+ }
62
+ export interface DocumentAst {
63
+ readonly kind: 'document';
64
+ readonly uri: URL;
65
+ readonly pointer: JsonPointer;
66
+ readonly span?: SourceSpan;
67
+ readonly schema?: AstField<string>;
68
+ readonly version?: AstField<string>;
69
+ readonly metadata: NodeMetadata;
70
+ readonly children: readonly DocumentChildNode[];
71
+ readonly overrides: readonly OverrideNode[];
72
+ }
73
+ //# sourceMappingURL=nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../src/ast/nodes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=nodes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodes.js","sourceRoot":"","sources":["../../src/ast/nodes.ts"],"names":[],"mappings":""}
@@ -0,0 +1,22 @@
1
+ import type { ExtensionCollector, ExtensionEvaluation } from '../../plugins/index.js';
2
+ import type { Diagnostic, JsonPointer, RawDocument, SourceSpan } from '../../types.js';
3
+ import type { DocumentAst } from '../nodes.js';
4
+ export interface NormaliserOptions {
5
+ readonly extensions?: {
6
+ createExtensionCollector(document: RawDocument, diagnostics: Diagnostic[]): ExtensionCollector | undefined;
7
+ };
8
+ }
9
+ export interface NormaliserContext {
10
+ readonly document: RawDocument;
11
+ readonly diagnostics: Diagnostic[];
12
+ readonly extensions?: ExtensionCollector;
13
+ }
14
+ export interface NormaliserResult {
15
+ readonly ast?: DocumentAst;
16
+ readonly diagnostics: readonly Diagnostic[];
17
+ readonly extensions: readonly ExtensionEvaluation[];
18
+ }
19
+ export declare function createNormaliserContext(document: RawDocument, options: NormaliserOptions): NormaliserContext;
20
+ export declare function finalizeNormalisation(context: NormaliserContext, ast?: DocumentAst): NormaliserResult;
21
+ export declare function getSourceSpan(context: NormaliserContext, pointer: JsonPointer): SourceSpan | undefined;
22
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../../../src/ast/normaliser/context.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACvF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,UAAU,CAAC,EAAE;QACpB,wBAAwB,CACtB,QAAQ,EAAE,WAAW,EACrB,WAAW,EAAE,UAAU,EAAE,GACxB,kBAAkB,GAAG,SAAS,CAAC;KACnC,CAAC;CACH;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,CAAC;IACnC,QAAQ,CAAC,UAAU,CAAC,EAAE,kBAAkB,CAAC;CAC1C;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,GAAG,CAAC,EAAE,WAAW,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,SAAS,UAAU,EAAE,CAAC;IAC5C,QAAQ,CAAC,UAAU,EAAE,SAAS,mBAAmB,EAAE,CAAC;CACrD;AAKD,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,WAAW,EACrB,OAAO,EAAE,iBAAiB,GACzB,iBAAiB,CASnB;AAED,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,iBAAiB,EAC1B,GAAG,CAAC,EAAE,WAAW,GAChB,gBAAgB,CAYlB;AAED,wBAAgB,aAAa,CAC3B,OAAO,EAAE,iBAAiB,EAC1B,OAAO,EAAE,WAAW,GACnB,UAAU,GAAG,SAAS,CAExB"}
@@ -0,0 +1,26 @@
1
+ const EMPTY_DIAGNOSTICS = Object.freeze([]);
2
+ const EMPTY_EXTENSION_RESULTS = Object.freeze([]);
3
+ export function createNormaliserContext(document, options) {
4
+ const diagnostics = [];
5
+ const extensions = options.extensions?.createExtensionCollector?.(document, diagnostics);
6
+ return {
7
+ document,
8
+ diagnostics,
9
+ extensions
10
+ };
11
+ }
12
+ export function finalizeNormalisation(context, ast) {
13
+ const diagnostics = context.diagnostics.length === 0
14
+ ? EMPTY_DIAGNOSTICS
15
+ : Object.freeze(context.diagnostics.map((diagnostic) => Object.freeze(diagnostic)));
16
+ const extensions = context.extensions?.results() ?? EMPTY_EXTENSION_RESULTS;
17
+ return {
18
+ ast,
19
+ diagnostics,
20
+ extensions
21
+ };
22
+ }
23
+ export function getSourceSpan(context, pointer) {
24
+ return context.document.sourceMap.pointers.get(pointer);
25
+ }
26
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../../../src/ast/normaliser/context.ts"],"names":[],"mappings":"AAyBA,MAAM,iBAAiB,GAA0B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AACnE,MAAM,uBAAuB,GAAmC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAElF,MAAM,UAAU,uBAAuB,CACrC,QAAqB,EACrB,OAA0B;IAE1B,MAAM,WAAW,GAAiB,EAAE,CAAC;IACrC,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,wBAAwB,EAAE,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IAEzF,OAAO;QACL,QAAQ;QACR,WAAW;QACX,UAAU;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,OAA0B,EAC1B,GAAiB;IAEjB,MAAM,WAAW,GACf,OAAO,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC;QAC9B,CAAC,CAAC,iBAAiB;QACnB,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;IACxF,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,EAAE,OAAO,EAAE,IAAI,uBAAuB,CAAC;IAE5E,OAAO;QACL,GAAG;QACH,WAAW;QACX,UAAU;KACX,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,aAAa,CAC3B,OAA0B,EAC1B,OAAoB;IAEpB,OAAO,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,4 @@
1
+ import type { DocumentAst } from '../nodes.js';
2
+ import type { NormaliserContext } from './context.js';
3
+ export declare function buildDocumentAst(context: NormaliserContext): DocumentAst | undefined;
4
+ //# sourceMappingURL=document.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.d.ts","sourceRoot":"","sources":["../../../src/ast/normaliser/document.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAqB,WAAW,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAOtD,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,GAAG,WAAW,GAAG,SAAS,CA4CpF"}
@@ -0,0 +1,49 @@
1
+ import { DiagnosticCodes } from '../../diagnostics/codes.js';
2
+ import { JSON_POINTER_ROOT, appendJsonPointer } from '../../utils/json-pointer.js';
3
+ import { readOptionalStringField } from './fields.js';
4
+ import { getSourceSpan } from './context.js';
5
+ import { extractMetadata } from './metadata.js';
6
+ import { normalizeNode } from './nodes.js';
7
+ import { normalizeOverrides } from './overrides.js';
8
+ import { freezeDocumentAst, isPlainObject } from './utils.js';
9
+ export function buildDocumentAst(context) {
10
+ const { document } = context;
11
+ const data = document.data;
12
+ if (!isPlainObject(data)) {
13
+ context.diagnostics.push({
14
+ code: DiagnosticCodes.normaliser.INVALID_ROOT,
15
+ message: 'DTIF document root must be a JSON object.',
16
+ severity: 'error',
17
+ pointer: JSON_POINTER_ROOT,
18
+ span: getSourceSpan(context, JSON_POINTER_ROOT)
19
+ });
20
+ return undefined;
21
+ }
22
+ const metadata = extractMetadata(context, data, JSON_POINTER_ROOT);
23
+ const schemaField = readOptionalStringField(context, data, '$schema', JSON_POINTER_ROOT);
24
+ const versionField = readOptionalStringField(context, data, '$version', JSON_POINTER_ROOT);
25
+ const overrides = normalizeOverrides(context, data, JSON_POINTER_ROOT);
26
+ const children = [];
27
+ for (const [name, value] of Object.entries(data)) {
28
+ if (name.startsWith('$')) {
29
+ continue;
30
+ }
31
+ const pointer = appendJsonPointer(JSON_POINTER_ROOT, name);
32
+ const node = normalizeNode(context, name, value, pointer);
33
+ if (node) {
34
+ children.push(node);
35
+ }
36
+ }
37
+ return freezeDocumentAst({
38
+ kind: 'document',
39
+ uri: document.uri,
40
+ pointer: JSON_POINTER_ROOT,
41
+ span: getSourceSpan(context, JSON_POINTER_ROOT),
42
+ schema: schemaField,
43
+ version: versionField,
44
+ metadata,
45
+ children,
46
+ overrides
47
+ });
48
+ }
49
+ //# sourceMappingURL=document.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"document.js","sourceRoot":"","sources":["../../../src/ast/normaliser/document.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEnF,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAEtD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE9D,MAAM,UAAU,gBAAgB,CAAC,OAA0B;IACzD,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAC7B,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC;IAE3B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;YACvB,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,YAAY;YAC7C,OAAO,EAAE,2CAA2C;YACpD,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,iBAAiB;YAC1B,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,iBAAiB,CAAC;SAChD,CAAC,CAAC;QACH,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC;IACnE,MAAM,WAAW,GAAG,uBAAuB,CAAC,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,iBAAiB,CAAC,CAAC;IACzF,MAAM,YAAY,GAAG,uBAAuB,CAAC,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,iBAAiB,CAAC,CAAC;IAC3F,MAAM,SAAS,GAAG,kBAAkB,CAAC,OAAO,EAAE,IAAI,EAAE,iBAAiB,CAAC,CAAC;IAEvE,MAAM,QAAQ,GAAwB,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACzB,SAAS;QACX,CAAC;QAED,MAAM,OAAO,GAAG,iBAAiB,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC;QAC3D,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC1D,IAAI,IAAI,EAAE,CAAC;YACT,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IAED,OAAO,iBAAiB,CAAC;QACvB,IAAI,EAAE,UAAU;QAChB,GAAG,EAAE,QAAQ,CAAC,GAAG;QACjB,OAAO,EAAE,iBAAiB;QAC1B,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,iBAAiB,CAAC;QAC/C,MAAM,EAAE,WAAW;QACnB,OAAO,EAAE,YAAY;QACrB,QAAQ;QACR,QAAQ;QACR,SAAS;KACV,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,7 @@
1
+ import type { JsonPointer } from '../../types.js';
2
+ import type { AstField } from '../nodes.js';
3
+ import type { NormaliserContext } from './context.js';
4
+ export declare function readOptionalStringField(context: NormaliserContext, value: Record<string, unknown>, key: string, pointer: JsonPointer): AstField<string> | undefined;
5
+ export declare function readRequiredStringField(context: NormaliserContext, value: Record<string, unknown>, key: string, pointer: JsonPointer): AstField<string> | undefined;
6
+ export declare function readOverrideConditions(context: NormaliserContext, value: Record<string, unknown>, pointer: JsonPointer): AstField<Readonly<Record<string, unknown>>> | undefined;
7
+ //# sourceMappingURL=fields.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.d.ts","sourceRoot":"","sources":["../../../src/ast/normaliser/fields.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAItD,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,GACnB,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAoB9B;AAED,wBAAgB,uBAAuB,CACrC,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,WAAW,GACnB,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAY9B;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,WAAW,GACnB,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAS,CAsCzD"}
@@ -0,0 +1,71 @@
1
+ import { DiagnosticCodes } from '../../diagnostics/codes.js';
2
+ import { appendJsonPointer } from '../../utils/json-pointer.js';
3
+ import { getSourceSpan } from './context.js';
4
+ import { createField, freezeRecord, isPlainObject } from './utils.js';
5
+ export function readOptionalStringField(context, value, key, pointer) {
6
+ if (!(key in value)) {
7
+ return undefined;
8
+ }
9
+ const fieldPointer = appendJsonPointer(pointer, key);
10
+ const raw = value[key];
11
+ if (typeof raw !== 'string') {
12
+ context.diagnostics.push({
13
+ code: DiagnosticCodes.normaliser.INVALID_MEMBER_TYPE,
14
+ message: `${key} must be a string.`,
15
+ severity: 'error',
16
+ pointer: fieldPointer,
17
+ span: getSourceSpan(context, fieldPointer)
18
+ });
19
+ return undefined;
20
+ }
21
+ return createField(context, raw, fieldPointer);
22
+ }
23
+ export function readRequiredStringField(context, value, key, pointer) {
24
+ const field = readOptionalStringField(context, value, key, pointer);
25
+ if (!field) {
26
+ context.diagnostics.push({
27
+ code: DiagnosticCodes.normaliser.MISSING_REQUIRED_MEMBER,
28
+ message: `Override entries must declare ${key}.`,
29
+ severity: 'error',
30
+ pointer,
31
+ span: getSourceSpan(context, pointer)
32
+ });
33
+ }
34
+ return field;
35
+ }
36
+ export function readOverrideConditions(context, value, pointer) {
37
+ if (!('$when' in value)) {
38
+ context.diagnostics.push({
39
+ code: DiagnosticCodes.normaliser.MISSING_REQUIRED_MEMBER,
40
+ message: 'Override entries must declare $when conditions.',
41
+ severity: 'error',
42
+ pointer,
43
+ span: getSourceSpan(context, pointer)
44
+ });
45
+ return undefined;
46
+ }
47
+ const fieldPointer = appendJsonPointer(pointer, '$when');
48
+ const raw = value['$when'];
49
+ if (!isPlainObject(raw)) {
50
+ context.diagnostics.push({
51
+ code: DiagnosticCodes.normaliser.INVALID_MEMBER_TYPE,
52
+ message: '$when must be an object containing at least one condition.',
53
+ severity: 'error',
54
+ pointer: fieldPointer,
55
+ span: getSourceSpan(context, fieldPointer)
56
+ });
57
+ return undefined;
58
+ }
59
+ if (Object.keys(raw).length === 0) {
60
+ context.diagnostics.push({
61
+ code: DiagnosticCodes.normaliser.INVALID_OVERRIDE,
62
+ message: '$when must declare at least one condition.',
63
+ severity: 'error',
64
+ pointer: fieldPointer,
65
+ span: getSourceSpan(context, fieldPointer)
66
+ });
67
+ }
68
+ const frozen = freezeRecord(raw);
69
+ return createField(context, frozen, fieldPointer);
70
+ }
71
+ //# sourceMappingURL=fields.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fields.js","sourceRoot":"","sources":["../../../src/ast/normaliser/fields.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ import type { JsonPointer } from '../../types.js';
2
+ import type { NodeMetadata } from '../nodes.js';
3
+ import type { NormaliserContext } from './context.js';
4
+ export declare function extractMetadata(context: NormaliserContext, value: Record<string, unknown>, pointer: JsonPointer): NodeMetadata;
5
+ //# sourceMappingURL=metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.d.ts","sourceRoot":"","sources":["../../../src/ast/normaliser/metadata.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAY,YAAY,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAmBtD,wBAAgB,eAAe,CAC7B,OAAO,EAAE,iBAAiB,EAC1B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,OAAO,EAAE,WAAW,GACnB,YAAY,CAiNd"}
@@ -0,0 +1,201 @@
1
+ import { DiagnosticCodes } from '../../diagnostics/codes.js';
2
+ import { appendJsonPointer } from '../../utils/json-pointer.js';
3
+ import { getSourceSpan } from './context.js';
4
+ import { createField, EMPTY_METADATA, freezeRecord, isPlainObject } from './utils.js';
5
+ import { readOptionalStringField } from './fields.js';
6
+ const EXTENSION_KEY_PATTERN = /^[a-z0-9]+(?:\.[a-z0-9]+)+$/u;
7
+ export function extractMetadata(context, value, pointer) {
8
+ const metadata = {};
9
+ if ('$description' in value) {
10
+ const description = readOptionalStringField(context, value, '$description', pointer);
11
+ if (description) {
12
+ metadata.description = description;
13
+ }
14
+ }
15
+ if ('$extensions' in value) {
16
+ const fieldPointer = appendJsonPointer(pointer, '$extensions');
17
+ const raw = value['$extensions'];
18
+ if (!isPlainObject(raw)) {
19
+ context.diagnostics.push({
20
+ code: DiagnosticCodes.normaliser.INVALID_MEMBER_TYPE,
21
+ message: '$extensions must be an object keyed by reverse-DNS identifiers.',
22
+ severity: 'error',
23
+ pointer: fieldPointer,
24
+ span: getSourceSpan(context, fieldPointer)
25
+ });
26
+ }
27
+ else {
28
+ const invalidKey = Object.keys(raw).find((key) => !EXTENSION_KEY_PATTERN.test(key));
29
+ if (invalidKey) {
30
+ context.diagnostics.push({
31
+ code: DiagnosticCodes.normaliser.INVALID_EXTENSIONS,
32
+ message: `Extension namespace "${invalidKey}" must use lower-case reverse-DNS format.`,
33
+ severity: 'error',
34
+ pointer: appendJsonPointer(fieldPointer, invalidKey),
35
+ span: getSourceSpan(context, appendJsonPointer(fieldPointer, invalidKey))
36
+ });
37
+ }
38
+ const frozen = freezeRecord(raw);
39
+ metadata.extensions = createField(context, frozen, fieldPointer);
40
+ if (context.extensions) {
41
+ for (const [namespace, extensionValue] of Object.entries(frozen)) {
42
+ const entryPointer = appendJsonPointer(fieldPointer, namespace);
43
+ context.extensions.handle({
44
+ namespace,
45
+ pointer: entryPointer,
46
+ span: getSourceSpan(context, entryPointer),
47
+ value: extensionValue
48
+ });
49
+ }
50
+ }
51
+ }
52
+ }
53
+ if ('$deprecated' in value) {
54
+ const fieldPointer = appendJsonPointer(pointer, '$deprecated');
55
+ const raw = value['$deprecated'];
56
+ if (typeof raw === 'boolean') {
57
+ metadata.deprecated = createField(context, { active: raw }, fieldPointer);
58
+ }
59
+ else if (isPlainObject(raw) && '$replacement' in raw) {
60
+ const replacementField = readOptionalStringField(context, raw, '$replacement', fieldPointer);
61
+ if (replacementField) {
62
+ metadata.deprecated = createField(context, { active: true, replacement: replacementField }, fieldPointer);
63
+ }
64
+ }
65
+ else {
66
+ context.diagnostics.push({
67
+ code: DiagnosticCodes.normaliser.INVALID_MEMBER_TYPE,
68
+ message: '$deprecated must be a boolean or an object containing $replacement.',
69
+ severity: 'error',
70
+ pointer: fieldPointer,
71
+ span: getSourceSpan(context, fieldPointer)
72
+ });
73
+ }
74
+ }
75
+ if ('$lastModified' in value) {
76
+ const lastModified = readOptionalStringField(context, value, '$lastModified', pointer);
77
+ if (lastModified) {
78
+ metadata.lastModified = lastModified;
79
+ }
80
+ }
81
+ if ('$lastUsed' in value) {
82
+ const lastUsed = readOptionalStringField(context, value, '$lastUsed', pointer);
83
+ if (lastUsed) {
84
+ metadata.lastUsed = lastUsed;
85
+ }
86
+ }
87
+ if ('$usageCount' in value) {
88
+ const fieldPointer = appendJsonPointer(pointer, '$usageCount');
89
+ const raw = value['$usageCount'];
90
+ if (typeof raw !== 'number' || !Number.isInteger(raw) || raw < 0) {
91
+ context.diagnostics.push({
92
+ code: DiagnosticCodes.normaliser.INVALID_MEMBER_TYPE,
93
+ message: '$usageCount must be a non-negative integer.',
94
+ severity: 'error',
95
+ pointer: fieldPointer,
96
+ span: getSourceSpan(context, fieldPointer)
97
+ });
98
+ }
99
+ else {
100
+ metadata.usageCount = createField(context, raw, fieldPointer);
101
+ }
102
+ }
103
+ if ('$author' in value) {
104
+ const author = readOptionalStringField(context, value, '$author', pointer);
105
+ if (author) {
106
+ metadata.author = author;
107
+ }
108
+ }
109
+ if ('$tags' in value) {
110
+ const fieldPointer = appendJsonPointer(pointer, '$tags');
111
+ const raw = value['$tags'];
112
+ if (!Array.isArray(raw)) {
113
+ context.diagnostics.push({
114
+ code: DiagnosticCodes.normaliser.INVALID_MEMBER_TYPE,
115
+ message: '$tags must be an array of unique strings.',
116
+ severity: 'error',
117
+ pointer: fieldPointer,
118
+ span: getSourceSpan(context, fieldPointer)
119
+ });
120
+ }
121
+ else {
122
+ const tags = [];
123
+ const seen = new Set();
124
+ raw.forEach((entry, index) => {
125
+ if (typeof entry !== 'string') {
126
+ const tagPointer = appendJsonPointer(fieldPointer, String(index));
127
+ context.diagnostics.push({
128
+ code: DiagnosticCodes.normaliser.INVALID_MEMBER_TYPE,
129
+ message: '$tags entries must be strings.',
130
+ severity: 'error',
131
+ pointer: tagPointer,
132
+ span: getSourceSpan(context, tagPointer)
133
+ });
134
+ return;
135
+ }
136
+ const trimmed = entry.trim();
137
+ if (trimmed.length === 0) {
138
+ const tagPointer = appendJsonPointer(fieldPointer, String(index));
139
+ context.diagnostics.push({
140
+ code: DiagnosticCodes.normaliser.INVALID_MEMBER_TYPE,
141
+ message: '$tags entries must not be empty.',
142
+ severity: 'error',
143
+ pointer: tagPointer,
144
+ span: getSourceSpan(context, tagPointer)
145
+ });
146
+ return;
147
+ }
148
+ if (seen.has(trimmed)) {
149
+ const tagPointer = appendJsonPointer(fieldPointer, String(index));
150
+ context.diagnostics.push({
151
+ code: DiagnosticCodes.normaliser.INVALID_MEMBER_TYPE,
152
+ message: `Duplicate tag "${trimmed}" detected.`,
153
+ severity: 'error',
154
+ pointer: tagPointer,
155
+ span: getSourceSpan(context, tagPointer)
156
+ });
157
+ return;
158
+ }
159
+ seen.add(trimmed);
160
+ tags.push(trimmed);
161
+ });
162
+ metadata.tags = createField(context, Object.freeze(tags), fieldPointer);
163
+ }
164
+ }
165
+ if ('$hash' in value) {
166
+ const hash = readOptionalStringField(context, value, '$hash', pointer);
167
+ if (hash) {
168
+ metadata.hash = hash;
169
+ }
170
+ }
171
+ if (metadata.lastUsed && metadata.usageCount && metadata.usageCount.value <= 0) {
172
+ context.diagnostics.push({
173
+ code: DiagnosticCodes.normaliser.INVALID_METADATA_COMBINATION,
174
+ message: '$lastUsed requires a positive $usageCount.',
175
+ severity: 'error',
176
+ pointer: metadata.lastUsed.pointer,
177
+ span: metadata.lastUsed.span
178
+ });
179
+ }
180
+ if (metadata.lastUsed && !metadata.usageCount) {
181
+ context.diagnostics.push({
182
+ code: DiagnosticCodes.normaliser.INVALID_METADATA_COMBINATION,
183
+ message: '$lastUsed must be accompanied by $usageCount.',
184
+ severity: 'error',
185
+ pointer: metadata.lastUsed.pointer,
186
+ span: metadata.lastUsed.span
187
+ });
188
+ }
189
+ if (metadata.usageCount && metadata.usageCount.value > 0 && !metadata.lastUsed) {
190
+ context.diagnostics.push({
191
+ code: DiagnosticCodes.normaliser.INVALID_METADATA_COMBINATION,
192
+ message: '$usageCount greater than zero must be accompanied by $lastUsed.',
193
+ severity: 'error',
194
+ pointer: metadata.usageCount.pointer,
195
+ span: metadata.usageCount.span
196
+ });
197
+ }
198
+ const hasMetadata = Object.keys(metadata).length > 0;
199
+ return hasMetadata ? Object.freeze(metadata) : EMPTY_METADATA;
200
+ }
201
+ //# sourceMappingURL=metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metadata.js","sourceRoot":"","sources":["../../../src/ast/normaliser/metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAIhE,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACtF,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AActD,MAAM,qBAAqB,GAAG,8BAA8B,CAAC;AAE7D,MAAM,UAAU,eAAe,CAC7B,OAA0B,EAC1B,KAA8B,EAC9B,OAAoB;IAEpB,MAAM,QAAQ,GAAwB,EAAE,CAAC;IAEzC,IAAI,cAAc,IAAI,KAAK,EAAE,CAAC;QAC5B,MAAM,WAAW,GAAG,uBAAuB,CAAC,OAAO,EAAE,KAAK,EAAE,cAAc,EAAE,OAAO,CAAC,CAAC;QACrF,IAAI,WAAW,EAAE,CAAC;YAChB,QAAQ,CAAC,WAAW,GAAG,WAAW,CAAC;QACrC,CAAC;IACH,CAAC;IAED,IAAI,aAAa,IAAI,KAAK,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;QACjC,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;gBACvB,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,mBAAmB;gBACpD,OAAO,EAAE,iEAAiE;gBAC1E,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,YAAY;gBACrB,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC;aAC3C,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACpF,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;oBACvB,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,kBAAkB;oBACnD,OAAO,EAAE,wBAAwB,UAAU,2CAA2C;oBACtF,QAAQ,EAAE,OAAO;oBACjB,OAAO,EAAE,iBAAiB,CAAC,YAAY,EAAE,UAAU,CAAC;oBACpD,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,iBAAiB,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC;iBAC1E,CAAC,CAAC;YACL,CAAC;YACD,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;YACjC,QAAQ,CAAC,UAAU,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;YACjE,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;gBACvB,KAAK,MAAM,CAAC,SAAS,EAAE,cAAc,CAAC,IAAI,MAAM,CAAC,OAAO,CACtD,MAAiC,CAClC,EAAE,CAAC;oBACF,MAAM,YAAY,GAAG,iBAAiB,CAAC,YAAY,EAAE,SAAS,CAAC,CAAC;oBAChE,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC;wBACxB,SAAS;wBACT,OAAO,EAAE,YAAY;wBACrB,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC;wBAC1C,KAAK,EAAE,cAAc;qBACtB,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,aAAa,IAAI,KAAK,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;QAEjC,IAAI,OAAO,GAAG,KAAK,SAAS,EAAE,CAAC;YAC7B,QAAQ,CAAC,UAAU,GAAG,WAAW,CAAC,OAAO,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,EAAE,YAAY,CAAC,CAAC;QAC5E,CAAC;aAAM,IAAI,aAAa,CAAC,GAAG,CAAC,IAAI,cAAc,IAAI,GAAG,EAAE,CAAC;YACvD,MAAM,gBAAgB,GAAG,uBAAuB,CAAC,OAAO,EAAE,GAAG,EAAE,cAAc,EAAE,YAAY,CAAC,CAAC;YAC7F,IAAI,gBAAgB,EAAE,CAAC;gBACrB,QAAQ,CAAC,UAAU,GAAG,WAAW,CAC/B,OAAO,EACP,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,gBAAgB,EAAE,EAC/C,YAAY,CACb,CAAC;YACJ,CAAC;QACH,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;gBACvB,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,mBAAmB;gBACpD,OAAO,EAAE,qEAAqE;gBAC9E,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,YAAY;gBACrB,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC;aAC3C,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,IAAI,eAAe,IAAI,KAAK,EAAE,CAAC;QAC7B,MAAM,YAAY,GAAG,uBAAuB,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,CAAC,CAAC;QACvF,IAAI,YAAY,EAAE,CAAC;YACjB,QAAQ,CAAC,YAAY,GAAG,YAAY,CAAC;QACvC,CAAC;IACH,CAAC;IAED,IAAI,WAAW,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,QAAQ,GAAG,uBAAuB,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAC/E,IAAI,QAAQ,EAAE,CAAC;YACb,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,IAAI,aAAa,IAAI,KAAK,EAAE,CAAC;QAC3B,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QAC/D,MAAM,GAAG,GAAG,KAAK,CAAC,aAAa,CAAC,CAAC;QAEjC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;YACjE,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;gBACvB,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,mBAAmB;gBACpD,OAAO,EAAE,6CAA6C;gBACtD,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,YAAY;gBACrB,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC;aAC3C,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,QAAQ,CAAC,UAAU,GAAG,WAAW,CAAC,OAAO,EAAE,GAAG,EAAE,YAAY,CAAC,CAAC;QAChE,CAAC;IACH,CAAC;IAED,IAAI,SAAS,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,MAAM,GAAG,uBAAuB,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;QAC3E,IAAI,MAAM,EAAE,CAAC;YACX,QAAQ,CAAC,MAAM,GAAG,MAAM,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;QACrB,MAAM,YAAY,GAAG,iBAAiB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACzD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;QAC3B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;YACxB,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;gBACvB,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,mBAAmB;gBACpD,OAAO,EAAE,2CAA2C;gBACpD,QAAQ,EAAE,OAAO;gBACjB,OAAO,EAAE,YAAY;gBACrB,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,YAAY,CAAC;aAC3C,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,MAAM,IAAI,GAAa,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;YAC/B,GAAG,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBAC3B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC9B,MAAM,UAAU,GAAG,iBAAiB,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAClE,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;wBACvB,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,mBAAmB;wBACpD,OAAO,EAAE,gCAAgC;wBACzC,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,UAAU;wBACnB,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC;qBACzC,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC7B,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACzB,MAAM,UAAU,GAAG,iBAAiB,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAClE,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;wBACvB,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,mBAAmB;wBACpD,OAAO,EAAE,kCAAkC;wBAC3C,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,UAAU;wBACnB,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC;qBACzC,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,IAAI,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;oBACtB,MAAM,UAAU,GAAG,iBAAiB,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBAClE,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;wBACvB,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,mBAAmB;wBACpD,OAAO,EAAE,kBAAkB,OAAO,aAAa;wBAC/C,QAAQ,EAAE,OAAO;wBACjB,OAAO,EAAE,UAAU;wBACnB,IAAI,EAAE,aAAa,CAAC,OAAO,EAAE,UAAU,CAAC;qBACzC,CAAC,CAAC;oBACH,OAAO;gBACT,CAAC;gBACD,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;gBAClB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACrB,CAAC,CAAC,CAAC;YACH,QAAQ,CAAC,IAAI,GAAG,WAAW,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,YAAY,CAAC,CAAC;QAC1E,CAAC;IACH,CAAC;IAED,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,uBAAuB,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QACvE,IAAI,IAAI,EAAE,CAAC;YACT,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;QACvB,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QAC/E,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;YACvB,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,4BAA4B;YAC7D,OAAO,EAAE,4CAA4C;YACrD,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO;YAClC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,IAAI,QAAQ,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;QAC9C,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;YACvB,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,4BAA4B;YAC7D,OAAO,EAAE,+CAA+C;YACxD,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO;YAClC,IAAI,EAAE,QAAQ,CAAC,QAAQ,CAAC,IAAI;SAC7B,CAAC,CAAC;IACL,CAAC;IAED,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,CAAC,KAAK,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC/E,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC;YACvB,IAAI,EAAE,eAAe,CAAC,UAAU,CAAC,4BAA4B;YAC7D,OAAO,EAAE,iEAAiE;YAC1E,QAAQ,EAAE,OAAO;YACjB,OAAO,EAAE,QAAQ,CAAC,UAAU,CAAC,OAAO;YACpC,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI;SAC/B,CAAC,CAAC;IACL,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACrD,OAAO,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC;AAChE,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { JsonPointer } from '../../types.js';
2
+ import type { DocumentChildNode } from '../nodes.js';
3
+ import type { NormaliserContext } from './context.js';
4
+ export declare function normalizeNode(context: NormaliserContext, name: string, value: unknown, pointer: JsonPointer): DocumentChildNode | undefined;
5
+ //# sourceMappingURL=nodes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodes.d.ts","sourceRoot":"","sources":["../../../src/ast/normaliser/nodes.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAGV,iBAAiB,EAGlB,MAAM,aAAa,CAAC;AACrB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAMtD,wBAAgB,aAAa,CAC3B,OAAO,EAAE,iBAAiB,EAC1B,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,OAAO,EACd,OAAO,EAAE,WAAW,GACnB,iBAAiB,GAAG,SAAS,CAsB/B"}