@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.
- package/CHANGELOG.md +15 -0
- package/README.md +50 -0
- package/dist/ast/nodes.d.ts +73 -0
- package/dist/ast/nodes.d.ts.map +1 -0
- package/dist/ast/nodes.js +2 -0
- package/dist/ast/nodes.js.map +1 -0
- package/dist/ast/normaliser/context.d.ts +22 -0
- package/dist/ast/normaliser/context.d.ts.map +1 -0
- package/dist/ast/normaliser/context.js +26 -0
- package/dist/ast/normaliser/context.js.map +1 -0
- package/dist/ast/normaliser/document.d.ts +4 -0
- package/dist/ast/normaliser/document.d.ts.map +1 -0
- package/dist/ast/normaliser/document.js +49 -0
- package/dist/ast/normaliser/document.js.map +1 -0
- package/dist/ast/normaliser/fields.d.ts +7 -0
- package/dist/ast/normaliser/fields.d.ts.map +1 -0
- package/dist/ast/normaliser/fields.js +71 -0
- package/dist/ast/normaliser/fields.js.map +1 -0
- package/dist/ast/normaliser/metadata.d.ts +5 -0
- package/dist/ast/normaliser/metadata.d.ts.map +1 -0
- package/dist/ast/normaliser/metadata.js +201 -0
- package/dist/ast/normaliser/metadata.js.map +1 -0
- package/dist/ast/normaliser/nodes.d.ts +5 -0
- package/dist/ast/normaliser/nodes.d.ts.map +1 -0
- package/dist/ast/normaliser/nodes.js +108 -0
- package/dist/ast/normaliser/nodes.js.map +1 -0
- package/dist/ast/normaliser/overrides.d.ts +7 -0
- package/dist/ast/normaliser/overrides.d.ts.map +1 -0
- package/dist/ast/normaliser/overrides.js +156 -0
- package/dist/ast/normaliser/overrides.js.map +1 -0
- package/dist/ast/normaliser/utils.d.ts +12 -0
- package/dist/ast/normaliser/utils.d.ts.map +1 -0
- package/dist/ast/normaliser/utils.js +45 -0
- package/dist/ast/normaliser/utils.js.map +1 -0
- package/dist/ast/normaliser.d.ts +5 -0
- package/dist/ast/normaliser.d.ts.map +1 -0
- package/dist/ast/normaliser.js +25 -0
- package/dist/ast/normaliser.js.map +1 -0
- package/dist/cli/args.d.ts +3 -0
- package/dist/cli/args.d.ts.map +1 -0
- package/dist/cli/args.js +202 -0
- package/dist/cli/args.js.map +1 -0
- package/dist/cli/io.d.ts +3 -0
- package/dist/cli/io.d.ts.map +1 -0
- package/dist/cli/io.js +65 -0
- package/dist/cli/io.js.map +1 -0
- package/dist/cli/output.d.ts +5 -0
- package/dist/cli/output.d.ts.map +1 -0
- package/dist/cli/output.js +113 -0
- package/dist/cli/output.js.map +1 -0
- package/dist/cli/parse.d.ts +4 -0
- package/dist/cli/parse.d.ts.map +1 -0
- package/dist/cli/parse.js +134 -0
- package/dist/cli/parse.js.map +1 -0
- package/dist/cli/serialize.d.ts +12 -0
- package/dist/cli/serialize.d.ts.map +1 -0
- package/dist/cli/serialize.js +92 -0
- package/dist/cli/serialize.js.map +1 -0
- package/dist/cli/types.d.ts +118 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +2 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/diagnostics/bag.d.ts +26 -0
- package/dist/diagnostics/bag.d.ts.map +1 -0
- package/dist/diagnostics/bag.js +101 -0
- package/dist/diagnostics/bag.js.map +1 -0
- package/dist/diagnostics/codes.d.ts +72 -0
- package/dist/diagnostics/codes.d.ts.map +1 -0
- package/dist/diagnostics/codes.js +94 -0
- package/dist/diagnostics/codes.js.map +1 -0
- package/dist/diagnostics/severity.d.ts +8 -0
- package/dist/diagnostics/severity.d.ts.map +1 -0
- package/dist/diagnostics/severity.js +35 -0
- package/dist/diagnostics/severity.js.map +1 -0
- package/dist/graph/builder/context.d.ts +23 -0
- package/dist/graph/builder/context.d.ts.map +1 -0
- package/dist/graph/builder/context.js +29 -0
- package/dist/graph/builder/context.js.map +1 -0
- package/dist/graph/builder/nodes.d.ts +6 -0
- package/dist/graph/builder/nodes.d.ts.map +1 -0
- package/dist/graph/builder/nodes.js +85 -0
- package/dist/graph/builder/nodes.js.map +1 -0
- package/dist/graph/builder/overrides.d.ts +5 -0
- package/dist/graph/builder/overrides.d.ts.map +1 -0
- package/dist/graph/builder/overrides.js +62 -0
- package/dist/graph/builder/overrides.js.map +1 -0
- package/dist/graph/builder/references.d.ts +7 -0
- package/dist/graph/builder/references.d.ts.map +1 -0
- package/dist/graph/builder/references.js +93 -0
- package/dist/graph/builder/references.js.map +1 -0
- package/dist/graph/builder.d.ts +5 -0
- package/dist/graph/builder.d.ts.map +1 -0
- package/dist/graph/builder.js +30 -0
- package/dist/graph/builder.js.map +1 -0
- package/dist/graph/nodes.d.ts +60 -0
- package/dist/graph/nodes.d.ts.map +1 -0
- package/dist/graph/nodes.js +2 -0
- package/dist/graph/nodes.js.map +1 -0
- package/dist/index.d.ts +26 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +14 -0
- package/dist/index.js.map +1 -0
- package/dist/io/decoder/encoding.d.ts +4 -0
- package/dist/io/decoder/encoding.d.ts.map +1 -0
- package/dist/io/decoder/encoding.js +36 -0
- package/dist/io/decoder/encoding.js.map +1 -0
- package/dist/io/decoder/errors.d.ts +4 -0
- package/dist/io/decoder/errors.d.ts.map +1 -0
- package/dist/io/decoder/errors.js +7 -0
- package/dist/io/decoder/errors.js.map +1 -0
- package/dist/io/decoder/source-map.d.ts +4 -0
- package/dist/io/decoder/source-map.d.ts.map +1 -0
- package/dist/io/decoder/source-map.js +106 -0
- package/dist/io/decoder/source-map.js.map +1 -0
- package/dist/io/decoder/yaml.d.ts +8 -0
- package/dist/io/decoder/yaml.d.ts.map +1 -0
- package/dist/io/decoder/yaml.js +28 -0
- package/dist/io/decoder/yaml.js.map +1 -0
- package/dist/io/decoder.d.ts +4 -0
- package/dist/io/decoder.d.ts.map +1 -0
- package/dist/io/decoder.js +19 -0
- package/dist/io/decoder.js.map +1 -0
- package/dist/io/document-cache.d.ts +15 -0
- package/dist/io/document-cache.d.ts.map +1 -0
- package/dist/io/document-cache.js +101 -0
- package/dist/io/document-cache.js.map +1 -0
- package/dist/io/document-loader.d.ts +37 -0
- package/dist/io/document-loader.d.ts.map +1 -0
- package/dist/io/document-loader.js +255 -0
- package/dist/io/document-loader.js.map +1 -0
- package/dist/plugins/index.d.ts +7 -0
- package/dist/plugins/index.d.ts.map +1 -0
- package/dist/plugins/index.js +6 -0
- package/dist/plugins/index.js.map +1 -0
- package/dist/plugins/registry.d.ts +20 -0
- package/dist/plugins/registry.d.ts.map +1 -0
- package/dist/plugins/registry.js +136 -0
- package/dist/plugins/registry.js.map +1 -0
- package/dist/plugins/types.d.ts +48 -0
- package/dist/plugins/types.d.ts.map +1 -0
- package/dist/plugins/types.js +2 -0
- package/dist/plugins/types.js.map +1 -0
- package/dist/resolver/document-resolver.d.ts +29 -0
- package/dist/resolver/document-resolver.d.ts.map +1 -0
- package/dist/resolver/document-resolver.js +551 -0
- package/dist/resolver/document-resolver.js.map +1 -0
- package/dist/resolver/index.d.ts +3 -0
- package/dist/resolver/index.d.ts.map +1 -0
- package/dist/resolver/index.js +2 -0
- package/dist/resolver/index.js.map +1 -0
- package/dist/resolver/internal/constants.d.ts +12 -0
- package/dist/resolver/internal/constants.d.ts.map +1 -0
- package/dist/resolver/internal/constants.js +8 -0
- package/dist/resolver/internal/constants.js.map +1 -0
- package/dist/resolver/internal/context.d.ts +8 -0
- package/dist/resolver/internal/context.d.ts.map +1 -0
- package/dist/resolver/internal/context.js +43 -0
- package/dist/resolver/internal/context.js.map +1 -0
- package/dist/resolver/internal/helpers.d.ts +16 -0
- package/dist/resolver/internal/helpers.d.ts.map +1 -0
- package/dist/resolver/internal/helpers.js +53 -0
- package/dist/resolver/internal/helpers.js.map +1 -0
- package/dist/resolver/internal/resolved-token.d.ts +24 -0
- package/dist/resolver/internal/resolved-token.d.ts.map +1 -0
- package/dist/resolver/internal/resolved-token.js +26 -0
- package/dist/resolver/internal/resolved-token.js.map +1 -0
- package/dist/resolver/types.d.ts +51 -0
- package/dist/resolver/types.d.ts.map +1 -0
- package/dist/resolver/types.js +2 -0
- package/dist/resolver/types.js.map +1 -0
- package/dist/session/internal/options.d.ts +16 -0
- package/dist/session/internal/options.d.ts.map +1 -0
- package/dist/session/internal/options.js +30 -0
- package/dist/session/internal/options.js.map +1 -0
- package/dist/session/types.d.ts +16 -0
- package/dist/session/types.d.ts.map +1 -0
- package/dist/session/types.js +2 -0
- package/dist/session/types.js.map +1 -0
- package/dist/session.d.ts +19 -0
- package/dist/session.d.ts.map +1 -0
- package/dist/session.js +210 -0
- package/dist/session.js.map +1 -0
- package/dist/types.d.ts +75 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/json-pointer.d.ts +13 -0
- package/dist/utils/json-pointer.d.ts.map +1 -0
- package/dist/utils/json-pointer.js +89 -0
- package/dist/utils/json-pointer.js.map +1 -0
- package/dist/utils/source.d.ts +21 -0
- package/dist/utils/source.d.ts.map +1 -0
- package/dist/utils/source.js +125 -0
- package/dist/utils/source.js.map +1 -0
- package/dist/validation/schema-guard.d.ts +20 -0
- package/dist/validation/schema-guard.d.ts.map +1 -0
- package/dist/validation/schema-guard.js +205 -0
- package/dist/validation/schema-guard.js.map +1 -0
- 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 @@
|
|
|
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
|