semantifold 0.3.0 → 0.5.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/README.md +61 -15
- package/build/index.d.ts +52 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +60 -8
- package/build/src/artifact-path.d.ts +23 -1
- package/build/src/artifact-path.d.ts.map +1 -1
- package/build/src/artifact-path.js +45 -3
- package/build/src/artifacts.d.ts.map +1 -1
- package/build/src/artifacts.js +66 -1
- package/build/src/backends/android.d.ts +49 -0
- package/build/src/backends/android.d.ts.map +1 -0
- package/build/src/backends/android.js +1274 -0
- package/build/src/backends/c-validation.d.ts.map +1 -1
- package/build/src/backends/c-validation.js +7 -3
- package/build/src/backends/cpp-validation.d.ts.map +1 -1
- package/build/src/backends/cpp-validation.js +7 -3
- package/build/src/backends/csharp.js +7 -1
- package/build/src/backends/dart-runtime.d.ts +2 -0
- package/build/src/backends/dart-runtime.d.ts.map +1 -0
- package/build/src/backends/dart-runtime.js +41 -0
- package/build/src/backends/dart.d.ts +20 -0
- package/build/src/backends/dart.d.ts.map +1 -0
- package/build/src/backends/dart.js +321 -0
- package/build/src/backends/effects.d.ts +60 -0
- package/build/src/backends/effects.d.ts.map +1 -0
- package/build/src/backends/effects.js +746 -0
- package/build/src/backends/go.js +18 -4
- package/build/src/backends/identifiers.d.ts +36 -4
- package/build/src/backends/identifiers.d.ts.map +1 -1
- package/build/src/backends/identifiers.js +160 -10
- package/build/src/backends/index.d.ts.map +1 -1
- package/build/src/backends/index.js +27 -4
- package/build/src/backends/ios.d.ts +68 -0
- package/build/src/backends/ios.d.ts.map +1 -0
- package/build/src/backends/ios.js +1503 -0
- package/build/src/backends/java.d.ts.map +1 -1
- package/build/src/backends/java.js +429 -36
- package/build/src/backends/javascript.d.ts +6 -0
- package/build/src/backends/javascript.d.ts.map +1 -1
- package/build/src/backends/javascript.js +380 -24
- package/build/src/backends/kotlin-runtime.d.ts +3 -0
- package/build/src/backends/kotlin-runtime.d.ts.map +1 -0
- package/build/src/backends/kotlin-runtime.js +29 -0
- package/build/src/backends/kotlin.d.ts +33 -0
- package/build/src/backends/kotlin.d.ts.map +1 -0
- package/build/src/backends/kotlin.js +138 -0
- package/build/src/backends/native-validation.d.ts +2 -2
- package/build/src/backends/native-validation.d.ts.map +1 -1
- package/build/src/backends/native-validation.js +2 -2
- package/build/src/backends/ordered-expressions.d.ts.map +1 -1
- package/build/src/backends/ordered-expressions.js +39 -7
- package/build/src/backends/php-stdlib-support.d.ts +19 -0
- package/build/src/backends/php-stdlib-support.d.ts.map +1 -0
- package/build/src/backends/php-stdlib-support.js +227 -0
- package/build/src/backends/php.d.ts.map +1 -1
- package/build/src/backends/php.js +448 -33
- package/build/src/backends/program.d.ts +83 -0
- package/build/src/backends/program.d.ts.map +1 -0
- package/build/src/backends/program.js +1309 -0
- package/build/src/backends/python.js +7 -1
- package/build/src/backends/ruby.d.ts.map +1 -1
- package/build/src/backends/ruby.js +310 -24
- package/build/src/backends/rust-runtime.d.ts +7 -0
- package/build/src/backends/rust-runtime.d.ts.map +1 -0
- package/build/src/backends/rust-runtime.js +32 -0
- package/build/src/backends/rust-validation.d.ts +9 -0
- package/build/src/backends/rust-validation.d.ts.map +1 -0
- package/build/src/backends/rust-validation.js +78 -0
- package/build/src/backends/rust.d.ts +24 -0
- package/build/src/backends/rust.d.ts.map +1 -0
- package/build/src/backends/rust.js +344 -0
- package/build/src/backends/scalars.d.ts +14 -6
- package/build/src/backends/scalars.d.ts.map +1 -1
- package/build/src/backends/scalars.js +167 -17
- package/build/src/backends/shared.d.ts +23 -4
- package/build/src/backends/shared.d.ts.map +1 -1
- package/build/src/backends/shared.js +2174 -62
- package/build/src/backends/stdlib-support.d.ts +14 -0
- package/build/src/backends/stdlib-support.d.ts.map +1 -0
- package/build/src/backends/stdlib-support.js +237 -0
- package/build/src/backends/swift-runtime.d.ts +3 -0
- package/build/src/backends/swift-runtime.d.ts.map +1 -0
- package/build/src/backends/swift-runtime.js +14 -0
- package/build/src/backends/swift.d.ts +8 -0
- package/build/src/backends/swift.d.ts.map +1 -0
- package/build/src/backends/swift.js +127 -0
- package/build/src/backends/typescript.d.ts.map +1 -1
- package/build/src/backends/typescript.js +344 -24
- package/build/src/backends/wasm.d.ts +43 -0
- package/build/src/backends/wasm.d.ts.map +1 -0
- package/build/src/backends/wasm.js +2164 -0
- package/build/src/backends/writer.d.ts +255 -4
- package/build/src/backends/writer.d.ts.map +1 -1
- package/build/src/backends/writer.js +491 -3
- package/build/src/diagnostic.d.ts +4 -3
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +5 -3
- package/build/src/frontends/c.d.ts.map +1 -1
- package/build/src/frontends/c.js +5 -3
- package/build/src/frontends/cpp.d.ts.map +1 -1
- package/build/src/frontends/cpp.js +5 -3
- package/build/src/frontends/csharp.d.ts.map +1 -1
- package/build/src/frontends/csharp.js +7 -3
- package/build/src/frontends/dart.d.ts +10 -0
- package/build/src/frontends/dart.d.ts.map +1 -0
- package/build/src/frontends/dart.js +913 -0
- package/build/src/frontends/index.d.ts +3 -1
- package/build/src/frontends/index.d.ts.map +1 -1
- package/build/src/frontends/index.js +15 -5
- package/build/src/frontends/java.d.ts +110 -1
- package/build/src/frontends/java.d.ts.map +1 -1
- package/build/src/frontends/java.js +1725 -70
- package/build/src/frontends/javascript-typescript.d.ts +69 -1
- package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
- package/build/src/frontends/javascript-typescript.js +1825 -93
- package/build/src/frontends/kotlin.d.ts +10 -0
- package/build/src/frontends/kotlin.d.ts.map +1 -0
- package/build/src/frontends/kotlin.js +685 -0
- package/build/src/frontends/php.d.ts +118 -1
- package/build/src/frontends/php.d.ts.map +1 -1
- package/build/src/frontends/php.js +1583 -76
- package/build/src/frontends/program.d.ts +74 -0
- package/build/src/frontends/program.d.ts.map +1 -0
- package/build/src/frontends/program.js +989 -0
- package/build/src/frontends/ruby.d.ts +68 -1
- package/build/src/frontends/ruby.d.ts.map +1 -1
- package/build/src/frontends/ruby.js +1446 -101
- package/build/src/frontends/rust-parser.d.ts +11 -0
- package/build/src/frontends/rust-parser.d.ts.map +1 -0
- package/build/src/frontends/rust-parser.js +15 -0
- package/build/src/frontends/rust.d.ts +14 -0
- package/build/src/frontends/rust.d.ts.map +1 -0
- package/build/src/frontends/rust.js +715 -0
- package/build/src/frontends/scalars.d.ts +10 -0
- package/build/src/frontends/scalars.d.ts.map +1 -1
- package/build/src/frontends/scalars.js +28 -2
- package/build/src/frontends/swift.d.ts +10 -0
- package/build/src/frontends/swift.d.ts.map +1 -0
- package/build/src/frontends/swift.js +860 -0
- package/build/src/frontends/types.d.ts +186 -0
- package/build/src/frontends/types.d.ts.map +1 -0
- package/build/src/frontends/types.js +634 -0
- package/build/src/language-registry.d.ts +46 -4
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +177 -13
- package/build/src/mapping.d.ts +2 -2
- package/build/src/mapping.d.ts.map +1 -1
- package/build/src/mapping.js +31 -10
- package/build/src/semantic/capabilities.d.ts +66 -0
- package/build/src/semantic/capabilities.d.ts.map +1 -0
- package/build/src/semantic/capabilities.js +649 -0
- package/build/src/semantic/effects.d.ts +26 -0
- package/build/src/semantic/effects.d.ts.map +1 -0
- package/build/src/semantic/effects.js +764 -0
- package/build/src/semantic/generics.d.ts +23 -0
- package/build/src/semantic/generics.d.ts.map +1 -0
- package/build/src/semantic/generics.js +61 -0
- package/build/src/semantic/lifetime.d.ts +37 -0
- package/build/src/semantic/lifetime.d.ts.map +1 -0
- package/build/src/semantic/lifetime.js +527 -0
- package/build/src/semantic/provenance.d.ts +9 -2
- package/build/src/semantic/provenance.d.ts.map +1 -1
- package/build/src/semantic/provenance.js +462 -20
- package/build/src/semantic/scalars.d.ts +11 -0
- package/build/src/semantic/scalars.d.ts.map +1 -1
- package/build/src/semantic/scalars.js +16 -1
- package/build/src/semantic/stdlib.d.ts +254 -0
- package/build/src/semantic/stdlib.d.ts.map +1 -0
- package/build/src/semantic/stdlib.js +880 -0
- package/build/src/semantic/types.d.ts +3108 -178
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +730 -15
- package/build/src/semantic/validate.d.ts +85 -5
- package/build/src/semantic/validate.d.ts.map +1 -1
- package/build/src/semantic/validate.js +2576 -98
- package/build/src/stdlib-facades.d.ts +304 -0
- package/build/src/stdlib-facades.d.ts.map +1 -0
- package/build/src/stdlib-facades.js +1167 -0
- package/build/src/stdlib-negotiation.d.ts +69 -0
- package/build/src/stdlib-negotiation.d.ts.map +1 -0
- package/build/src/stdlib-negotiation.js +403 -0
- package/build/src/stdlib-providers.d.ts +72 -0
- package/build/src/stdlib-providers.d.ts.map +1 -0
- package/build/src/stdlib-providers.js +339 -0
- package/build/src/toolchains.d.ts +55 -1
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +15 -4
- package/docs/android.md +79 -0
- package/docs/architecture.md +47 -13
- package/docs/dart.md +60 -0
- package/docs/goals.md +3 -3
- package/docs/ios.md +121 -0
- package/docs/kotlin.md +42 -0
- package/docs/language-support.md +238 -26
- package/docs/multi-file-modules.md +52 -0
- package/docs/parser-qualification.md +121 -8
- package/docs/plans/2026-09-05-standard-library-portability.md +10 -10
- package/docs/rust.md +88 -0
- package/docs/source-maps.md +17 -7
- package/docs/specification.md +5 -0
- package/docs/standard-library-portability.md +39 -8
- package/docs/swift.md +44 -0
- package/docs/testing.md +381 -4
- package/docs/webassembly.md +52 -0
- package/index.js +66 -8
- package/node_modules/semantifold-tree-sitter-legacy-internal/README.md +2 -2
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/LICENSE +21 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/README.md +45 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/binding.gyp +30 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding.cc +20 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/binding_test.js +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.d.ts +28 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/bindings/node/index.js +11 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/grammar.js +1630 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/package.json +64 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/darwin-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/linux-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-arm64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/prebuilds/win32-x64/tree-sitter-rust.node +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/highlights.scm +159 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/injections.scm +9 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/queries/tags.scm +60 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/grammar.json +9405 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/node-types.json +5399 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/parser.c +192569 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/scanner.c +393 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/alloc.h +54 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/array.h +290 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/src/tree_sitter/parser.h +266 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter-rust.wasm +0 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/node_modules/tree-sitter-rust/tree-sitter.json +53 -0
- package/node_modules/semantifold-tree-sitter-legacy-internal/package.json +3 -2
- package/node_modules/semantifold-tree-sitter-legacy-internal/src/c.js +5 -4
- package/package.json +5 -2
- package/src/artifact-path.js +47 -2
- package/src/artifacts.js +67 -0
- package/src/backends/android.js +1370 -0
- package/src/backends/c-validation.js +6 -1
- package/src/backends/cpp-validation.js +6 -1
- package/src/backends/csharp.js +3 -0
- package/src/backends/dart-runtime.js +41 -0
- package/src/backends/dart.js +326 -0
- package/src/backends/effects.js +705 -0
- package/src/backends/go.js +14 -2
- package/src/backends/identifiers.js +166 -9
- package/src/backends/index.js +27 -2
- package/src/backends/ios.js +1612 -0
- package/src/backends/java.js +454 -36
- package/src/backends/javascript.js +389 -23
- package/src/backends/kotlin-runtime.js +29 -0
- package/src/backends/kotlin.js +144 -0
- package/src/backends/native-validation.js +1 -1
- package/src/backends/ordered-expressions.js +40 -6
- package/src/backends/php-stdlib-support.js +239 -0
- package/src/backends/php.js +469 -32
- package/src/backends/program.js +1408 -0
- package/src/backends/python.js +3 -0
- package/src/backends/ruby.js +326 -23
- package/src/backends/rust-runtime.js +34 -0
- package/src/backends/rust-validation.js +75 -0
- package/src/backends/rust.js +335 -0
- package/src/backends/scalars.js +141 -16
- package/src/backends/shared.js +2314 -115
- package/src/backends/stdlib-support.js +234 -0
- package/src/backends/swift-runtime.js +14 -0
- package/src/backends/swift.js +132 -0
- package/src/backends/typescript.js +349 -23
- package/src/backends/wasm.js +2208 -0
- package/src/backends/writer.js +545 -2
- package/src/diagnostic.js +4 -2
- package/src/frontends/c.js +4 -2
- package/src/frontends/cpp.js +4 -2
- package/src/frontends/csharp.js +4 -2
- package/src/frontends/dart.js +963 -0
- package/src/frontends/index.js +14 -4
- package/src/frontends/java.js +1977 -69
- package/src/frontends/javascript-typescript.js +2046 -102
- package/src/frontends/kotlin.js +713 -0
- package/src/frontends/php.js +1725 -79
- package/src/frontends/program.js +1062 -0
- package/src/frontends/ruby.js +1624 -98
- package/src/frontends/rust-parser.js +18 -0
- package/src/frontends/rust.js +714 -0
- package/src/frontends/scalars.js +31 -1
- package/src/frontends/swift.js +893 -0
- package/src/frontends/types.js +750 -0
- package/src/language-registry.js +182 -12
- package/src/mapping.js +33 -9
- package/src/semantic/capabilities.js +671 -0
- package/src/semantic/effects.js +737 -0
- package/src/semantic/generics.js +58 -0
- package/src/semantic/lifetime.js +517 -0
- package/src/semantic/provenance.js +412 -19
- package/src/semantic/scalars.js +17 -0
- package/src/semantic/stdlib.js +921 -0
- package/src/semantic/types.js +810 -14
- package/src/semantic/validate.js +2934 -209
- package/src/stdlib-facades.js +1211 -0
- package/src/stdlib-negotiation.js +446 -0
- package/src/stdlib-providers.js +377 -0
- package/src/toolchains.js +16 -3
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export type StdlibContractRegistry = import("./semantic/stdlib.js").StdlibContractRegistry;
|
|
2
|
+
export type StdlibProviderRecord = import("./stdlib-providers.js").StdlibProviderRecord;
|
|
3
|
+
export type VersionRange = import("./semantic/stdlib.js").VersionRange;
|
|
4
|
+
export type StdlibNegotiationRequirement = {
|
|
5
|
+
/**
|
|
6
|
+
* - Canonical module identity.
|
|
7
|
+
*/
|
|
8
|
+
module: string;
|
|
9
|
+
/**
|
|
10
|
+
* - Required canonical operations.
|
|
11
|
+
*/
|
|
12
|
+
operations: string[];
|
|
13
|
+
/**
|
|
14
|
+
* - Declared version range.
|
|
15
|
+
*/
|
|
16
|
+
range?: string | undefined;
|
|
17
|
+
};
|
|
18
|
+
export type StdlibNegotiationResult = {
|
|
19
|
+
/**
|
|
20
|
+
* - Negotiated target language.
|
|
21
|
+
*/
|
|
22
|
+
target: string;
|
|
23
|
+
/**
|
|
24
|
+
* - Linked modules in identity order.
|
|
25
|
+
*/
|
|
26
|
+
modules: readonly {
|
|
27
|
+
identity: string;
|
|
28
|
+
operations: string[];
|
|
29
|
+
version: string;
|
|
30
|
+
}[];
|
|
31
|
+
/**
|
|
32
|
+
* - Selected providers in identity order.
|
|
33
|
+
*/
|
|
34
|
+
providers: readonly {
|
|
35
|
+
identity: string;
|
|
36
|
+
target: string;
|
|
37
|
+
module: string;
|
|
38
|
+
version: string;
|
|
39
|
+
operations: string[];
|
|
40
|
+
nativeEntries: Readonly<Record<string, string>>;
|
|
41
|
+
runtimeProfile: string;
|
|
42
|
+
}[];
|
|
43
|
+
};
|
|
44
|
+
/**
|
|
45
|
+
* @typedef StdlibNegotiationRequirement
|
|
46
|
+
* @property {string} module - Canonical module identity.
|
|
47
|
+
* @property {string[]} operations - Required canonical operations.
|
|
48
|
+
* @property {string | undefined} [range] - Declared version range.
|
|
49
|
+
*/
|
|
50
|
+
/**
|
|
51
|
+
* @typedef StdlibNegotiationResult
|
|
52
|
+
* @property {string} target - Negotiated target language.
|
|
53
|
+
* @property {readonly {identity: string, operations: string[], version: string}[]} modules - Linked modules in identity order.
|
|
54
|
+
* @property {readonly {identity: string, target: string, module: string, version: string, operations: string[], nativeEntries: Readonly<Record<string, string>>, runtimeProfile: string}[]} providers - Selected providers in identity order.
|
|
55
|
+
*/
|
|
56
|
+
/**
|
|
57
|
+
* Negotiates the complete transitive stdlib provider closure for one target.
|
|
58
|
+
* @param {{contracts?: StdlibContractRegistry, providers?: {providersFor(target: string, module: string, version: string): readonly StdlibProviderRecord[]}, requirements: StdlibNegotiationRequirement[], target: string}} input - Negotiation request.
|
|
59
|
+
* @returns {Readonly<StdlibNegotiationResult>} Frozen negotiation result.
|
|
60
|
+
*/
|
|
61
|
+
export declare function negotiateStdlibProviders({ contracts, providers, requirements, target }: {
|
|
62
|
+
contracts?: StdlibContractRegistry;
|
|
63
|
+
providers?: {
|
|
64
|
+
providersFor(target: string, module: string, version: string): readonly StdlibProviderRecord[];
|
|
65
|
+
};
|
|
66
|
+
requirements: StdlibNegotiationRequirement[];
|
|
67
|
+
target: string;
|
|
68
|
+
}): Readonly<StdlibNegotiationResult>;
|
|
69
|
+
//# sourceMappingURL=stdlib-negotiation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdlib-negotiation.d.ts","sourceRoot":"","sources":["../../src/stdlib-negotiation.js"],"names":[],"mappings":"AAcI,YAAiE,sBAAsB,GAA7E,OAAO,sBAAsB,EAAE,sBAAsB,CAAwB;AACvF,YAAgE,oBAAoB,GAA1E,OAAO,uBAAuB,EAAE,oBAAoB,CAAsB;AACpF,YAAuD,YAAY,GAAzD,OAAO,sBAAsB,EAAE,YAAY,CAAc;AAOpE,YAAS,4BAA4B,GACrC;;;;IAAmB,MAAM,EAAd,MAAM,CACjB;;;;IAAqB,UAAU,EAApB,MAAM,EAAE,CACnB;;;;IAAgC,KAAK,AAArC,CACF,EADa,MAAM,GAAG,SAAS,CAC/B;CAAA,CAAA;AAGE,YAAS,uBAAuB,GAChC;;;;IAAmB,MAAM,EAAd,MAAM,CACjB;;;;IAAiF,OAAO,EAA7E,SAAS;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,EAAE,CAC/E;;;;IAA0L,SAAS,EAAxL,SAAS;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,aAAa,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAC,EAAE,CAC1L;CAAA,CAAA;AAZD;;;;;GAKG;AAEH;;;;;GAKG;AAEH;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,EAAC,SAA4B,EAAE,SAAkC,EAAE,YAAY,EAAE,MAAM,EAAC,EAHtH;IAAC,SAAS,CAAC,EAAE,sBAAsB,CAAC;IAAC,SAAS,CAAC,EAAE;QAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,oBAAoB,EAAE,CAAA;KAAC,CAAC;IAAC,YAAY,EAAE,4BAA4B,EAAE,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAGzF,GAFpH,QAAQ,CAAC,uBAAuB,CAAC,CAgN7C"}
|
|
@@ -0,0 +1,403 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { isDenseArray } from "./array.js";
|
|
3
|
+
import { SemantifoldDiagnostic } from "./diagnostic.js";
|
|
4
|
+
import { compareStdlibVersions, createStdlibContractRegistry, intersectStdlibVersionRanges, parseStdlibVersion, parseStdlibVersionRange, stdlibVersionSatisfies } from "./semantic/stdlib.js";
|
|
5
|
+
import { stdlibProviderRegistry } from "./stdlib-providers.js";
|
|
6
|
+
/** @typedef {import("./semantic/stdlib.js").StdlibContractRegistry} StdlibContractRegistry */
|
|
7
|
+
/** @typedef {import("./stdlib-providers.js").StdlibProviderRecord} StdlibProviderRecord */
|
|
8
|
+
/** @typedef {import("./semantic/stdlib.js").VersionRange} VersionRange */
|
|
9
|
+
/** @type {Readonly<VersionRange>} */
|
|
10
|
+
const universalRange = Object.freeze({ lower: /** @type {[number, number, number]} */ (Object.freeze([0, 0, 0])), upper: null });
|
|
11
|
+
const builtinContracts = createStdlibContractRegistry();
|
|
12
|
+
/**
|
|
13
|
+
* @typedef StdlibNegotiationRequirement
|
|
14
|
+
* @property {string} module - Canonical module identity.
|
|
15
|
+
* @property {string[]} operations - Required canonical operations.
|
|
16
|
+
* @property {string | undefined} [range] - Declared version range.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* @typedef StdlibNegotiationResult
|
|
20
|
+
* @property {string} target - Negotiated target language.
|
|
21
|
+
* @property {readonly {identity: string, operations: string[], version: string}[]} modules - Linked modules in identity order.
|
|
22
|
+
* @property {readonly {identity: string, target: string, module: string, version: string, operations: string[], nativeEntries: Readonly<Record<string, string>>, runtimeProfile: string}[]} providers - Selected providers in identity order.
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* Negotiates the complete transitive stdlib provider closure for one target.
|
|
26
|
+
* @param {{contracts?: StdlibContractRegistry, providers?: {providersFor(target: string, module: string, version: string): readonly StdlibProviderRecord[]}, requirements: StdlibNegotiationRequirement[], target: string}} input - Negotiation request.
|
|
27
|
+
* @returns {Readonly<StdlibNegotiationResult>} Frozen negotiation result.
|
|
28
|
+
*/
|
|
29
|
+
export function negotiateStdlibProviders({ contracts = builtinContracts, providers = stdlibProviderRegistry, requirements, target }) {
|
|
30
|
+
if (!isDenseArray(requirements))
|
|
31
|
+
invalidRequirement("Stdlib negotiation requirements must be an ordered dense array.");
|
|
32
|
+
/** @type {Map<string, VersionRange>} */
|
|
33
|
+
const ranges = new Map();
|
|
34
|
+
/** @type {Map<string, string>} */
|
|
35
|
+
const rangeKeys = new Map();
|
|
36
|
+
/** @type {Map<string, Set<string>>} */
|
|
37
|
+
const usedOperations = new Map();
|
|
38
|
+
/**
|
|
39
|
+
* Intersects one declared range into the per-module closure.
|
|
40
|
+
* @param {string} module - Canonical module identity.
|
|
41
|
+
* @param {VersionRange} range - Declared version range.
|
|
42
|
+
* @returns {boolean} Whether the combined range changed.
|
|
43
|
+
*/
|
|
44
|
+
function addRange(module, range) {
|
|
45
|
+
const current = ranges.get(module) ?? universalRange;
|
|
46
|
+
const next = intersectStdlibVersionRanges(current, range);
|
|
47
|
+
if (next === null)
|
|
48
|
+
throw new SemantifoldDiagnostic({
|
|
49
|
+
code: "STDLIB_VERSION_INCOMPATIBLE",
|
|
50
|
+
language: module,
|
|
51
|
+
message: `Canonical module '${module}' has no version satisfying every declared range.`
|
|
52
|
+
});
|
|
53
|
+
const key = rangeKey(next);
|
|
54
|
+
if (rangeKeys.get(module) == key)
|
|
55
|
+
return false;
|
|
56
|
+
ranges.set(module, next);
|
|
57
|
+
rangeKeys.set(module, key);
|
|
58
|
+
return true;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Rejects a module identity absent from the contract registry.
|
|
62
|
+
* @param {string} module - Canonical module identity.
|
|
63
|
+
* @returns {void}
|
|
64
|
+
*/
|
|
65
|
+
function requireModule(module) {
|
|
66
|
+
if (!contracts.modules.some(({ identity }) => identity == module)) {
|
|
67
|
+
throw new SemantifoldDiagnostic({
|
|
68
|
+
code: "STDLIB_MODULE_UNKNOWN",
|
|
69
|
+
language: module,
|
|
70
|
+
message: `Canonical module '${module}' is not registered.`
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
for (const requirement of requirements) {
|
|
75
|
+
if (!isPlainObject(requirement))
|
|
76
|
+
invalidRequirement("Every stdlib negotiation requirement must be a plain object.");
|
|
77
|
+
const module = /** @type {string} */ (requirement.module);
|
|
78
|
+
const operations = /** @type {unknown} */ (requirement.operations);
|
|
79
|
+
if (typeof module != "string") {
|
|
80
|
+
throw new SemantifoldDiagnostic({ code: "STDLIB_MODULE_UNKNOWN", language: String(module), message: "Canonical module identity is missing." });
|
|
81
|
+
}
|
|
82
|
+
if (!isDenseArray(operations) || !operations.every((operation) => typeof operation == "string")) {
|
|
83
|
+
invalidRequirement(`Requirement for module '${module}' declares invalid operations.`);
|
|
84
|
+
}
|
|
85
|
+
if (operations.length == 0)
|
|
86
|
+
continue;
|
|
87
|
+
requireModule(module);
|
|
88
|
+
for (const operation of /** @type {string[]} */ (operations)) {
|
|
89
|
+
const used = usedOperations.get(module) ?? new Set();
|
|
90
|
+
used.add(operation);
|
|
91
|
+
usedOperations.set(module, used);
|
|
92
|
+
}
|
|
93
|
+
if (requirement.range !== undefined) {
|
|
94
|
+
const range = parseStdlibVersionRange(requirement.range);
|
|
95
|
+
if (range === null)
|
|
96
|
+
malformedRange(String(requirement.range));
|
|
97
|
+
addRange(module, range);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
let changed = true;
|
|
101
|
+
while (changed) {
|
|
102
|
+
changed = false;
|
|
103
|
+
for (const module of [...usedOperations.keys()].sort()) {
|
|
104
|
+
const contract = resolveModuleVersion(contracts, module, ranges.get(module) ?? universalRange);
|
|
105
|
+
const declared = new Map(contract.operations.map(({ dependencies, name }) => [name, dependencies]));
|
|
106
|
+
for (const dependency of contract.dependencies) {
|
|
107
|
+
requireModule(dependency.module);
|
|
108
|
+
if (addRange(dependency.module, asVersionRange(dependency.range)))
|
|
109
|
+
changed = true;
|
|
110
|
+
if (!usedOperations.has(dependency.module)) {
|
|
111
|
+
usedOperations.set(dependency.module, new Set());
|
|
112
|
+
changed = true;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
for (const operation of [... /** @type {Set<string>} */(usedOperations.get(module))].sort()) {
|
|
116
|
+
const dependencies = declared.get(operation);
|
|
117
|
+
if (dependencies === undefined)
|
|
118
|
+
undeclaredOperation(module, operation);
|
|
119
|
+
for (const dependency of dependencies) {
|
|
120
|
+
const { module: dependencyModule, operation: dependencyOperation, range } = dependency;
|
|
121
|
+
requireModule(dependencyModule);
|
|
122
|
+
if (addRange(dependencyModule, asVersionRange(range)))
|
|
123
|
+
changed = true;
|
|
124
|
+
const used = usedOperations.get(dependencyModule) ?? new Set();
|
|
125
|
+
if (!used.has(dependencyOperation)) {
|
|
126
|
+
used.add(dependencyOperation);
|
|
127
|
+
usedOperations.set(dependencyModule, used);
|
|
128
|
+
changed = true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/** @type {Map<string, StdlibProviderRecord>} */
|
|
135
|
+
const selectedProviders = new Map();
|
|
136
|
+
let stable = false;
|
|
137
|
+
while (!stable) {
|
|
138
|
+
stable = true;
|
|
139
|
+
selectedProviders.clear();
|
|
140
|
+
for (const module of [...usedOperations.keys()].sort()) {
|
|
141
|
+
const contract = resolveModuleVersion(contracts, module, ranges.get(module) ?? universalRange);
|
|
142
|
+
const candidates = providers.providersFor(target, module, contract.version);
|
|
143
|
+
if (candidates.length == 0) {
|
|
144
|
+
throw new SemantifoldDiagnostic({
|
|
145
|
+
code: "STDLIB_PROVIDER_MISSING",
|
|
146
|
+
language: target,
|
|
147
|
+
message: `No registered provider serves module '${module}' version '${contract.version}'.`
|
|
148
|
+
});
|
|
149
|
+
}
|
|
150
|
+
if (candidates.length > 1) {
|
|
151
|
+
throw new SemantifoldDiagnostic({
|
|
152
|
+
code: "STDLIB_PROVIDER_AMBIGUOUS",
|
|
153
|
+
language: target,
|
|
154
|
+
message: `Multiple registered providers serve module '${module}' version '${contract.version}'.`
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
const provider = /** @type {StdlibProviderRecord} */ (candidates[0]);
|
|
158
|
+
selectedProviders.set(module, provider);
|
|
159
|
+
for (const dependency of provider.dependencies) {
|
|
160
|
+
if (!contracts.modules.some(({ identity }) => identity == dependency.module)) {
|
|
161
|
+
throw new SemantifoldDiagnostic({
|
|
162
|
+
code: "STDLIB_PROVIDER_DEPENDENCY_MISSING",
|
|
163
|
+
language: provider.identity,
|
|
164
|
+
message: `Provider dependency module '${dependency.module}' is not registered.`
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
if (addRange(dependency.module, asVersionRange(dependency.range)))
|
|
168
|
+
stable = false;
|
|
169
|
+
if (!usedOperations.has(dependency.module)) {
|
|
170
|
+
usedOperations.set(dependency.module, new Set());
|
|
171
|
+
stable = false;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
for (const module of [...usedOperations.keys()].sort()) {
|
|
177
|
+
const provider = /** @type {StdlibProviderRecord} */ (selectedProviders.get(module));
|
|
178
|
+
const provided = new Set(provider.provides[0].operations);
|
|
179
|
+
const missing = [... /** @type {Set<string>} */(usedOperations.get(module))].sort()
|
|
180
|
+
.filter((operation) => !provided.has(operation));
|
|
181
|
+
if (missing.length > 0) {
|
|
182
|
+
throw new SemantifoldDiagnostic({
|
|
183
|
+
code: "STDLIB_PROVIDER_MISSING",
|
|
184
|
+
language: target,
|
|
185
|
+
message: `Provider '${provider.identity}' does not provide operation${missing.length > 1 ? "s" : ""} '${missing.join("', '")}' of module '${module}'.`
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
assertAcyclic(contracts, ranges, usedOperations, selectedProviders);
|
|
190
|
+
/** @type {{identity: string, operations: string[], version: string}[]} */
|
|
191
|
+
const modules = [...usedOperations.keys()].sort().map((identity) => {
|
|
192
|
+
const contract = resolveModuleVersion(contracts, identity, ranges.get(identity) ?? universalRange);
|
|
193
|
+
const used = /** @type {Set<string>} */ (usedOperations.get(identity));
|
|
194
|
+
return {
|
|
195
|
+
identity,
|
|
196
|
+
operations: contract.operations.map(({ name }) => name).filter((name) => used.has(name)),
|
|
197
|
+
version: contract.version
|
|
198
|
+
};
|
|
199
|
+
});
|
|
200
|
+
/** @type {{identity: string, target: string, module: string, version: string, operations: string[], nativeEntries: Record<string, string>, runtimeProfile: string}[]} */
|
|
201
|
+
const providerResults = [...selectedProviders.values()].sort((left, right) => left.identity < right.identity ? -1 : left.identity > right.identity ? 1 : 0).map((provider) => {
|
|
202
|
+
const module = provider.provides[0].module;
|
|
203
|
+
const contract = resolveModuleVersion(contracts, module, ranges.get(module) ?? universalRange);
|
|
204
|
+
const used = /** @type {Set<string>} */ (usedOperations.get(module));
|
|
205
|
+
const operations = contract.operations.map(({ name }) => name).filter((name) => used.has(name));
|
|
206
|
+
return {
|
|
207
|
+
identity: provider.identity,
|
|
208
|
+
module,
|
|
209
|
+
nativeEntries: Object.fromEntries(operations.map((operation) => [
|
|
210
|
+
operation,
|
|
211
|
+
/** @type {string} */ (provider.nativeEntries[operation])
|
|
212
|
+
])),
|
|
213
|
+
operations,
|
|
214
|
+
runtimeProfile: provider.runtimeProfile,
|
|
215
|
+
target: provider.target,
|
|
216
|
+
version: provider.provides[0].version
|
|
217
|
+
};
|
|
218
|
+
});
|
|
219
|
+
return deepFreeze(/** @type {StdlibNegotiationResult} */ ({ modules, providers: providerResults, target }));
|
|
220
|
+
}
|
|
221
|
+
/**
|
|
222
|
+
* Resolves the highest registered contract version satisfying one combined range.
|
|
223
|
+
* @param {StdlibContractRegistry} contracts - Canonical contract registry.
|
|
224
|
+
* @param {string} module - Canonical module identity.
|
|
225
|
+
* @param {VersionRange} range - Combined half-open range.
|
|
226
|
+
* @returns {import("./semantic/stdlib.js").StdlibContract} Exact-version contract.
|
|
227
|
+
*/
|
|
228
|
+
function resolveModuleVersion(contracts, module, range) {
|
|
229
|
+
const listed = contracts.modules.find(({ identity }) => identity == module);
|
|
230
|
+
if (!listed) {
|
|
231
|
+
throw new SemantifoldDiagnostic({ code: "STDLIB_MODULE_UNKNOWN", language: module, message: `Canonical module '${module}' is not registered.` });
|
|
232
|
+
}
|
|
233
|
+
/** @type {[number, number, number] | null} */
|
|
234
|
+
let resolved = null;
|
|
235
|
+
for (const version of listed.versions) {
|
|
236
|
+
const tuple = /** @type {[number, number, number]} */ (parseStdlibVersion(version));
|
|
237
|
+
if (stdlibVersionSatisfies(tuple, range) && (resolved === null || compareStdlibVersions(tuple, resolved) > 0)) {
|
|
238
|
+
resolved = tuple;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
if (resolved === null) {
|
|
242
|
+
throw new SemantifoldDiagnostic({
|
|
243
|
+
code: "STDLIB_VERSION_INCOMPATIBLE",
|
|
244
|
+
language: module,
|
|
245
|
+
message: `Canonical module '${module}' has no registered version satisfying the combined range.`
|
|
246
|
+
});
|
|
247
|
+
}
|
|
248
|
+
return contracts.resolveModule(module, `${resolved[0]}.${resolved[1]}.${resolved[2]}`);
|
|
249
|
+
}
|
|
250
|
+
/**
|
|
251
|
+
* Fails deterministically when canonical operation dependencies or selected provider
|
|
252
|
+
* module dependencies cycle.
|
|
253
|
+
* @param {StdlibContractRegistry} contracts - Canonical contract registry.
|
|
254
|
+
* @param {Map<string, VersionRange>} ranges - Combined ranges per module.
|
|
255
|
+
* @param {Map<string, Set<string>>} usedOperations - Used operations per module.
|
|
256
|
+
* @param {Map<string, StdlibProviderRecord>} selectedProviders - Selected provider per module.
|
|
257
|
+
* @returns {void}
|
|
258
|
+
*/
|
|
259
|
+
function assertAcyclic(contracts, ranges, usedOperations, selectedProviders) {
|
|
260
|
+
/** @type {Map<string, string[]>} */
|
|
261
|
+
const edges = new Map();
|
|
262
|
+
for (const module of [...usedOperations.keys()].sort()) {
|
|
263
|
+
const contract = resolveModuleVersion(contracts, module, ranges.get(module) ?? universalRange);
|
|
264
|
+
const declared = new Map(contract.operations.map(({ dependencies, name }) => [name, dependencies]));
|
|
265
|
+
const used = /** @type {Set<string>} */ (usedOperations.get(module));
|
|
266
|
+
for (const operation of [...used].sort()) {
|
|
267
|
+
const nodeKey = `${module}\u0000${operation}`;
|
|
268
|
+
const targets = /** @type {string[]} */ (edges.get(nodeKey) ?? []);
|
|
269
|
+
for (const dependency of /** @type {{module: string, operation: string}[]} */ (declared.get(operation))) {
|
|
270
|
+
targets.push(`${dependency.module}\u0000${dependency.operation}`);
|
|
271
|
+
}
|
|
272
|
+
edges.set(nodeKey, targets.sort());
|
|
273
|
+
}
|
|
274
|
+
const moduleNodeKey = `${module}\u0000\u0000`;
|
|
275
|
+
const moduleTargets = /** @type {string[]} */ (edges.get(moduleNodeKey) ?? []);
|
|
276
|
+
for (const dependency of contract.dependencies)
|
|
277
|
+
moduleTargets.push(`${dependency.module}\u0000\u0000`);
|
|
278
|
+
edges.set(moduleNodeKey, moduleTargets.sort());
|
|
279
|
+
}
|
|
280
|
+
for (const module of [...selectedProviders.keys()].sort()) {
|
|
281
|
+
const provider = /** @type {StdlibProviderRecord} */ (selectedProviders.get(module));
|
|
282
|
+
const nodeKey = `${module}\u0000\u0000`;
|
|
283
|
+
const targets = /** @type {string[]} */ (edges.get(nodeKey) ?? []);
|
|
284
|
+
for (const dependency of provider.dependencies) {
|
|
285
|
+
targets.push(`${dependency.module}\u0000\u0000`);
|
|
286
|
+
}
|
|
287
|
+
edges.set(nodeKey, targets.sort());
|
|
288
|
+
}
|
|
289
|
+
/** @type {Map<string, number>} */
|
|
290
|
+
const colors = new Map();
|
|
291
|
+
/**
|
|
292
|
+
* Walks the dependency edges in deterministic order, rejecting cycles.
|
|
293
|
+
* @param {string} nodeKey - Node key.
|
|
294
|
+
* @returns {void}
|
|
295
|
+
*/
|
|
296
|
+
function visit(nodeKey) {
|
|
297
|
+
colors.set(nodeKey, 1);
|
|
298
|
+
for (const target of /** @type {string[]} */ (edges.get(nodeKey) ?? [])) {
|
|
299
|
+
const color = colors.get(target) ?? 0;
|
|
300
|
+
if (color == 1)
|
|
301
|
+
throw new SemantifoldDiagnostic({
|
|
302
|
+
code: "STDLIB_PROVIDER_CYCLE",
|
|
303
|
+
language: target.split("\u0000")[0],
|
|
304
|
+
message: "Canonical stdlib dependencies form a cycle."
|
|
305
|
+
});
|
|
306
|
+
if (color == 0)
|
|
307
|
+
visit(target);
|
|
308
|
+
}
|
|
309
|
+
colors.set(nodeKey, 2);
|
|
310
|
+
}
|
|
311
|
+
for (const nodeKey of [...edges.keys()].sort()) {
|
|
312
|
+
if ((colors.get(nodeKey) ?? 0) == 0)
|
|
313
|
+
visit(nodeKey);
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
/**
|
|
317
|
+
* Normalizes a declared dependency range, accepting canonical strings or parsed ranges.
|
|
318
|
+
* @param {unknown} value - Candidate range.
|
|
319
|
+
* @returns {VersionRange} Half-open range.
|
|
320
|
+
*/
|
|
321
|
+
function asVersionRange(value) {
|
|
322
|
+
if (typeof value == "string") {
|
|
323
|
+
const parsed = parseStdlibVersionRange(value);
|
|
324
|
+
if (parsed === null)
|
|
325
|
+
malformedRange(value);
|
|
326
|
+
return parsed;
|
|
327
|
+
}
|
|
328
|
+
if (isPlainObject(value) && Array.isArray(value.lower) && value.lower.length == 3 &&
|
|
329
|
+
value.lower.every((part) => Number.isInteger(part)) &&
|
|
330
|
+
(value.upper === null || (Array.isArray(value.upper) && value.upper.length == 3 &&
|
|
331
|
+
value.upper.every((part) => Number.isInteger(part))))) {
|
|
332
|
+
return { lower: /** @type {[number, number, number]} */ (value.lower), upper: value.upper === null ? null : /** @type {[number, number, number]} */ (value.upper) };
|
|
333
|
+
}
|
|
334
|
+
return malformedRange(String(value));
|
|
335
|
+
}
|
|
336
|
+
/**
|
|
337
|
+
* Encodes one half-open range deterministically.
|
|
338
|
+
* @param {VersionRange} range - Half-open range.
|
|
339
|
+
* @returns {string} Stable key.
|
|
340
|
+
*/
|
|
341
|
+
function rangeKey(range) {
|
|
342
|
+
return `${range.lower.join(".")}..${range.upper === null ? "" : range.upper.join(".")}`;
|
|
343
|
+
}
|
|
344
|
+
/**
|
|
345
|
+
* Throws a malformed-version-range diagnostic.
|
|
346
|
+
* @param {string} range - Candidate range.
|
|
347
|
+
* @returns {never} Always throws.
|
|
348
|
+
*/
|
|
349
|
+
function malformedRange(range) {
|
|
350
|
+
throw new SemantifoldDiagnostic({
|
|
351
|
+
code: "STDLIB_VERSION_MALFORMED",
|
|
352
|
+
language: "stdlib",
|
|
353
|
+
message: `Stdlib version range '${range}' is not canonical.`
|
|
354
|
+
});
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* Throws an undeclared-operation diagnostic.
|
|
358
|
+
* @param {string} module - Canonical module identity.
|
|
359
|
+
* @param {string} operation - Missing operation.
|
|
360
|
+
* @returns {never} Always throws.
|
|
361
|
+
*/
|
|
362
|
+
function undeclaredOperation(module, operation) {
|
|
363
|
+
throw new SemantifoldDiagnostic({
|
|
364
|
+
code: "STDLIB_OPERATION_UNDECLARED",
|
|
365
|
+
language: module,
|
|
366
|
+
message: `Operation '${operation}' is not declared by canonical module '${module}'.`
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
/**
|
|
370
|
+
* Throws a requirement-shape diagnostic.
|
|
371
|
+
* @param {string} message - Failure detail.
|
|
372
|
+
* @returns {never} Always throws.
|
|
373
|
+
*/
|
|
374
|
+
function invalidRequirement(message) {
|
|
375
|
+
throw new SemantifoldDiagnostic({ code: "STDLIB_CONTRACT_INVALID", language: "stdlib", message });
|
|
376
|
+
}
|
|
377
|
+
/**
|
|
378
|
+
* Checks for an ordinary string-keyed object.
|
|
379
|
+
* @param {unknown} value - Candidate value.
|
|
380
|
+
* @returns {value is Record<string, unknown>} Whether the value is a plain object.
|
|
381
|
+
*/
|
|
382
|
+
function isPlainObject(value) {
|
|
383
|
+
if (typeof value != "object" || value === null)
|
|
384
|
+
return false;
|
|
385
|
+
const prototype = Object.getPrototypeOf(value);
|
|
386
|
+
return prototype === Object.prototype || prototype === null;
|
|
387
|
+
}
|
|
388
|
+
/**
|
|
389
|
+
* Deep-freezes a detached value.
|
|
390
|
+
* @template T
|
|
391
|
+
* @param {T} value - Detached value.
|
|
392
|
+
* @returns {Readonly<T>} Frozen value.
|
|
393
|
+
*/
|
|
394
|
+
function deepFreeze(value) {
|
|
395
|
+
if (typeof value != "object" || value === null || Object.isFrozen(value))
|
|
396
|
+
return /** @type {Readonly<T>} */ (value);
|
|
397
|
+
Object.freeze(value);
|
|
398
|
+
for (const property of Object.getOwnPropertyNames(value)) {
|
|
399
|
+
deepFreeze(/** @type {unknown} */ (/** @type {Record<string, unknown>} */ (value)[property]));
|
|
400
|
+
}
|
|
401
|
+
return /** @type {Readonly<T>} */ (value);
|
|
402
|
+
}
|
|
403
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLW5lZ290aWF0aW9uLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0ZGxpYi1uZWdvdGlhdGlvbi5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxZQUFZO0FBRVosT0FBTyxFQUFDLFlBQVksRUFBQyxNQUFNLFlBQVksQ0FBQTtBQUN2QyxPQUFPLEVBQUMscUJBQXFCLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQTtBQUNyRCxPQUFPLEVBQ0wscUJBQXFCLEVBQ3JCLDRCQUE0QixFQUM1Qiw0QkFBNEIsRUFDNUIsa0JBQWtCLEVBQ2xCLHVCQUF1QixFQUN2QixzQkFBc0IsRUFDdkIsTUFBTSxzQkFBc0IsQ0FBQTtBQUM3QixPQUFPLEVBQUMsc0JBQXNCLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQTtBQUU1RCw4RkFBOEY7QUFDOUYsMkZBQTJGO0FBQzNGLDBFQUEwRTtBQUUxRSxxQ0FBcUM7QUFDckMsTUFBTSxjQUFjLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFDLEtBQUssRUFBRSx1Q0FBdUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFDLENBQUMsQ0FBQTtBQUM5SCxNQUFNLGdCQUFnQixHQUFHLDRCQUE0QixFQUFFLENBQUE7QUFFdkQ7Ozs7O0dBS0c7QUFFSDs7Ozs7R0FLRztBQUVIOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsd0JBQXdCLENBQUMsRUFBQyxTQUFTLEdBQUcsZ0JBQWdCLEVBQUUsU0FBUyxHQUFHLHNCQUFzQixFQUFFLFlBQVksRUFBRSxNQUFNLEVBQUM7SUFDL0gsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUM7UUFBRSxrQkFBa0IsQ0FBQyxpRUFBaUUsQ0FBQyxDQUFBO0lBQ3RILHdDQUF3QztJQUN4QyxNQUFNLE1BQU0sR0FBRyxJQUFJLEdBQUcsRUFB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SSxPQUFPLEtBQUssSUFBSSxRQUFRLElBQUksS0FBSyxLQUFLLElBQUksSUFBSSxNQUFNLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sMEJBQTBCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNuSCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRXBCLEtBQUssTUFBTSxRQUFRLElBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekQsVUFBVSxDQUFDLHNCQUFzQixDQUFDLENBQUUsc0NBQXNDLENBQUMsQ0FBQyxLQUFLLENBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDakcsQ0FBQztJQUNELE9BQU8sMEJBQTBCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7aXNEZW5zZUFycmF5fSBmcm9tIFwiLi9hcnJheS5qc1wiXG5pbXBvcnQge1NlbWFudGlmb2xkRGlhZ25vc3RpY30gZnJvbSBcIi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge1xuICBjb21wYXJlU3RkbGliVmVyc2lvbnMsXG4gIGNyZWF0ZVN0ZGxpYkNvbnRyYWN0UmVnaXN0cnksXG4gIGludGVyc2VjdFN0ZGxpYlZlcnNpb25SYW5nZXMsXG4gIHBhcnNlU3RkbGliVmVyc2lvbixcbiAgcGFyc2VTdGRsaWJWZXJzaW9uUmFuZ2UsXG4gIHN0ZGxpYlZlcnNpb25TYXRpc2ZpZXNcbn0gZnJvbSBcIi4vc2VtYW50aWMvc3RkbGliLmpzXCJcbmltcG9ydCB7c3RkbGliUHJvdmlkZXJSZWdpc3RyeX0gZnJvbSBcIi4vc3RkbGliLXByb3ZpZGVycy5qc1wiXG5cbi8qKiBAdHlwZWRlZiB7aW1wb3J0KFwiLi9zZW1hbnRpYy9zdGRsaWIuanNcIikuU3RkbGliQ29udHJhY3RSZWdpc3RyeX0gU3RkbGliQ29udHJhY3RSZWdpc3RyeSAqL1xuLyoqIEB0eXBlZGVmIHtpbXBvcnQoXCIuL3N0ZGxpYi1wcm92aWRlcnMuanNcIikuU3RkbGliUHJvdmlkZXJSZWNvcmR9IFN0ZGxpYlByb3ZpZGVyUmVjb3JkICovXG4vKiogQHR5cGVkZWYge2ltcG9ydChcIi4vc2VtYW50aWMvc3RkbGliLmpzXCIpLlZlcnNpb25SYW5nZX0gVmVyc2lvblJhbmdlICovXG5cbi8qKiBAdHlwZSB7UmVhZG9ubHk8VmVyc2lvblJhbmdlPn0gKi9cbmNvbnN0IHVuaXZlcnNhbFJhbmdlID0gT2JqZWN0LmZyZWV6ZSh7bG93ZXI6IC8qKiBAdHlwZSB7W251bWJlciwgbnVtYmVyLCBudW1iZXJdfSAqLyAoT2JqZWN0LmZyZWV6ZShbMCwgMCwgMF0pKSwgdXBwZXI6IG51bGx9KVxuY29uc3QgYnVpbHRpbkNvbnRyYWN0cyA9IGNyZWF0ZVN0ZGxpYkNvbnRyYWN0UmVnaXN0cnkoKVxuXG4vKipcbiAqIEB0eXBlZGVmIFN0ZGxpYk5lZ290aWF0aW9uUmVxdWlyZW1lbnRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBtb2R1bGUgLSBDYW5vbmljYWwgbW9kdWxlIGlkZW50aXR5LlxuICogQHByb3BlcnR5IHtzdHJpbmdbXX0gb3BlcmF0aW9ucyAtIFJlcXVpcmVkIGNhbm9uaWNhbCBvcGVyYXRpb25zLlxuICogQHByb3BlcnR5IHtzdHJpbmcgfCB1bmRlZmluZWR9IFtyYW5nZV0gLSBEZWNsYXJlZCB2ZXJzaW9uIHJhbmdlLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU3RkbGliTmVnb3RpYXRpb25SZXN1bHRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0YXJnZXQgLSBOZWdvdGlhdGVkIHRhcmdldCBsYW5ndWFnZS5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkge2lkZW50aXR5OiBzdHJpbmcsIG9wZXJhdGlvbnM6IHN0cmluZ1tdLCB2ZXJzaW9uOiBzdHJpbmd9W119IG1vZHVsZXMgLSBMaW5rZWQgbW9kdWxlcyBpbiBpZGVudGl0eSBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkge2lkZW50aXR5OiBzdHJpbmcsIHRhcmdldDogc3RyaW5nLCBtb2R1bGU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nLCBvcGVyYXRpb25zOiBzdHJpbmdbXSwgbmF0aXZlRW50cmllczogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj4sIHJ1bnRpbWVQcm9maWxlOiBzdHJpbmd9W119IHByb3ZpZGVycyAtIFNlbGVjdGVkIHByb3ZpZGVycyBpbiBpZGVudGl0eSBvcmRlci5cbiAqL1xuXG4vKipcbiAqIE5lZ290aWF0ZXMgdGhlIGNvbXBsZXRlIHRyYW5zaXRpdmUgc3RkbGliIHByb3ZpZGVyIGNsb3N1cmUgZm9yIG9uZSB0YXJnZXQuXG4gKiBAcGFyYW0ge3tjb250cmFjdHM/OiBTdGRsaWJDb250cmFjdFJlZ2lzdHJ5LCBwcm92aWRlcnM/OiB7cHJvdmlkZXJzRm9yKHRhcmdldDogc3RyaW5nLCBtb2R1bGU6IHN0cmluZywgdmVyc2lvbjogc3RyaW5nKTogcmVhZG9ubHkgU3RkbGliUHJvdmlkZXJSZWNvcmRbXX0sIHJlcXVpcmVtZW50czogU3RkbGliTmVnb3RpYXRpb25SZXF1aXJlbWVudFtdLCB0YXJnZXQ6IHN0cmluZ319IGlucHV0IC0gTmVnb3RpYXRpb24gcmVxdWVzdC5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxTdGRsaWJOZWdvdGlhdGlvblJlc3VsdD59IEZyb3plbiBuZWdvdGlhdGlvbiByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBuZWdvdGlhdGVTdGRsaWJQcm92aWRlcnMoe2NvbnRyYWN0cyA9IGJ1aWx0aW5Db250cmFjdHMsIHByb3ZpZGVycyA9IHN0ZGxpYlByb3ZpZGVyUmVnaXN0cnksIHJlcXVpcmVtZW50cywgdGFyZ2V0fSkge1xuICBpZiAoIWlzRGVuc2VBcnJheShyZXF1aXJlbWVudHMpKSBpbnZhbGlkUmVxdWlyZW1lbnQoXCJTdGRsaWIgbmVnb3RpYXRpb24gcmVxdWlyZW1lbnRzIG11c3QgYmUgYW4gb3JkZXJlZCBkZW5zZSBhcnJheS5cIilcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBWZXJzaW9uUmFuZ2U+fSAqL1xuICBjb25zdCByYW5nZXMgPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmc+fSAqL1xuICBjb25zdCByYW5nZUtleXMgPSBuZXcgTWFwKClcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBTZXQ8c3RyaW5nPj59ICovXG4gIGNvbnN0IHVzZWRPcGVyYXRpb25zID0gbmV3IE1hcCgpXG5cbiAgLyoqXG4gICAqIEludGVyc2VjdHMgb25lIGRlY2xhcmVkIHJhbmdlIGludG8gdGhlIHBlci1tb2R1bGUgY2xvc3VyZS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZSAtIENhbm9uaWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gICAqIEBwYXJhbSB7VmVyc2lvblJhbmdlfSByYW5nZSAtIERlY2xhcmVkIHZlcnNpb24gcmFuZ2UuXG4gICAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBjb21iaW5lZCByYW5nZSBjaGFuZ2VkLlxuICAgKi9cbiAgZnVuY3Rpb24gYWRkUmFuZ2UobW9kdWxlLCByYW5nZSkge1xuICAgIGNvbnN0IGN1cnJlbnQgPSByYW5nZXMuZ2V0KG1vZHVsZSkgPz8gdW5pdmVyc2FsUmFuZ2VcbiAgICBjb25zdCBuZXh0ID0gaW50ZXJzZWN0U3RkbGliVmVyc2lvblJhbmdlcyhjdXJyZW50LCByYW5nZSlcblxuICAgIGlmIChuZXh0ID09PSBudWxsKSB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgIGNvZGU6IFwiU1RETElCX1ZFUlNJT05fSU5DT01QQVRJQkxFXCIsXG4gICAgICBsYW5ndWFnZTogbW9kdWxlLFxuICAgICAgbWVzc2FnZTogYENhbm9uaWNhbCBtb2R1bGUgJyR7bW9kdWxlfScgaGFzIG5vIHZlcnNpb24gc2F0aXNmeWluZyBldmVyeSBkZWNsYXJlZCByYW5nZS5gXG4gICAgfSlcbiAgICBjb25zdCBrZXkgPSByYW5nZUtleShuZXh0KVxuXG4gICAgaWYgKHJhbmdlS2V5cy5nZXQobW9kdWxlKSA9PSBrZXkpIHJldHVybiBmYWxzZVxuICAgIHJhbmdlcy5zZXQobW9kdWxlLCBuZXh0KVxuICAgIHJhbmdlS2V5cy5zZXQobW9kdWxlLCBrZXkpXG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBSZWplY3RzIGEgbW9kdWxlIGlkZW50aXR5IGFic2VudCBmcm9tIHRoZSBjb250cmFjdCByZWdpc3RyeS5cbiAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZSAtIENhbm9uaWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gICAqIEByZXR1cm5zIHt2b2lkfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVxdWlyZU1vZHVsZShtb2R1bGUpIHtcbiAgICBpZiAoIWNvbnRyYWN0cy5tb2R1bGVzLnNvbWUoKHtpZGVudGl0eX0pID0+IGlkZW50aXR5ID09IG1vZHVsZSkpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjb2RlOiBcIlNURExJQl9NT0RVTEVfVU5LTk9XTlwiLFxuICAgICAgICBsYW5ndWFnZTogbW9kdWxlLFxuICAgICAgICBtZXNzYWdlOiBgQ2Fub25pY2FsIG1vZHVsZSAnJHttb2R1bGV9JyBpcyBub3QgcmVnaXN0ZXJlZC5gXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIGZvciAoY29uc3QgcmVxdWlyZW1lbnQgb2YgcmVxdWlyZW1lbnRzKSB7XG4gICAgaWYgKCFpc1BsYWluT2JqZWN0KHJlcXVpcmVtZW50KSkgaW52YWxpZFJlcXVpcmVtZW50KFwiRXZlcnkgc3RkbGliIG5lZ290aWF0aW9uIHJlcXVpcmVtZW50IG11c3QgYmUgYSBwbGFpbiBvYmplY3QuXCIpXG4gICAgY29uc3QgbW9kdWxlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChyZXF1aXJlbWVudC5tb2R1bGUpXG4gICAgY29uc3Qgb3BlcmF0aW9ucyA9IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKHJlcXVpcmVtZW50Lm9wZXJhdGlvbnMpXG5cbiAgICBpZiAodHlwZW9mIG1vZHVsZSAhPSBcInN0cmluZ1wiKSB7XG4gICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtjb2RlOiBcIlNURExJQl9NT0RVTEVfVU5LTk9XTlwiLCBsYW5ndWFnZTogU3RyaW5nKG1vZHVsZSksIG1lc3NhZ2U6IFwiQ2Fub25pY2FsIG1vZHVsZSBpZGVudGl0eSBpcyBtaXNzaW5nLlwifSlcbiAgICB9XG4gICAgaWYgKCFpc0RlbnNlQXJyYXkob3BlcmF0aW9ucykgfHwgIW9wZXJhdGlvbnMuZXZlcnkoKG9wZXJhdGlvbikgPT4gdHlwZW9mIG9wZXJhdGlvbiA9PSBcInN0cmluZ1wiKSkge1xuICAgICAgaW52YWxpZFJlcXVpcmVtZW50KGBSZXF1aXJlbWVudCBmb3IgbW9kdWxlICcke21vZHVsZX0nIGRlY2xhcmVzIGludmFsaWQgb3BlcmF0aW9ucy5gKVxuICAgIH1cbiAgICBpZiAob3BlcmF0aW9ucy5sZW5ndGggPT0gMCkgY29udGludWVcbiAgICByZXF1aXJlTW9kdWxlKG1vZHVsZSlcbiAgICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAob3BlcmF0aW9ucykpIHtcbiAgICAgIGNvbnN0IHVzZWQgPSB1c2VkT3BlcmF0aW9ucy5nZXQobW9kdWxlKSA/PyBuZXcgU2V0KClcblxuICAgICAgdXNlZC5hZGQob3BlcmF0aW9uKVxuICAgICAgdXNlZE9wZXJhdGlvbnMuc2V0KG1vZHVsZSwgdXNlZClcbiAgICB9XG4gICAgaWYgKHJlcXVpcmVtZW50LnJhbmdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbnN0IHJhbmdlID0gcGFyc2VTdGRsaWJWZXJzaW9uUmFuZ2UocmVxdWlyZW1lbnQucmFuZ2UpXG5cbiAgICAgIGlmIChyYW5nZSA9PT0gbnVsbCkgbWFsZm9ybWVkUmFuZ2UoU3RyaW5nKHJlcXVpcmVtZW50LnJhbmdlKSlcbiAgICAgIGFkZFJhbmdlKG1vZHVsZSwgcmFuZ2UpXG4gICAgfVxuICB9XG5cbiAgbGV0IGNoYW5nZWQgPSB0cnVlXG5cbiAgd2hpbGUgKGNoYW5nZWQpIHtcbiAgICBjaGFuZ2VkID0gZmFsc2VcblxuICAgIGZvciAoY29uc3QgbW9kdWxlIG9mIFsuLi51c2VkT3BlcmF0aW9ucy5rZXlzKCldLnNvcnQoKSkge1xuICAgICAgY29uc3QgY29udHJhY3QgPSByZXNvbHZlTW9kdWxlVmVyc2lvbihjb250cmFjdHMsIG1vZHVsZSwgcmFuZ2VzLmdldChtb2R1bGUpID8/IHVuaXZlcnNhbFJhbmdlKVxuICAgICAgY29uc3QgZGVjbGFyZWQgPSBuZXcgTWFwKGNvbnRyYWN0Lm9wZXJhdGlvbnMubWFwKCh7ZGVwZW5kZW5jaWVzLCBuYW1lfSkgPT4gW25hbWUsIGRlcGVuZGVuY2llc10pKVxuXG4gICAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgY29udHJhY3QuZGVwZW5kZW5jaWVzKSB7XG4gICAgICAgIHJlcXVpcmVNb2R1bGUoZGVwZW5kZW5jeS5tb2R1bGUpXG4gICAgICAgIGlmIChhZGRSYW5nZShkZXBlbmRlbmN5Lm1vZHVsZSwgYXNWZXJzaW9uUmFuZ2UoZGVwZW5kZW5jeS5yYW5nZSkpKSBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICBpZiAoIXVzZWRPcGVyYXRpb25zLmhhcyhkZXBlbmRlbmN5Lm1vZHVsZSkpIHtcbiAgICAgICAgICB1c2VkT3BlcmF0aW9ucy5zZXQoZGVwZW5kZW5jeS5tb2R1bGUsIG5ldyBTZXQoKSlcbiAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGZvciAoY29uc3Qgb3BlcmF0aW9uIG9mIFsuLi4vKiogQHR5cGUge1NldDxzdHJpbmc+fSAqLyAodXNlZE9wZXJhdGlvbnMuZ2V0KG1vZHVsZSkpXS5zb3J0KCkpIHtcbiAgICAgICAgY29uc3QgZGVwZW5kZW5jaWVzID0gZGVjbGFyZWQuZ2V0KG9wZXJhdGlvbilcblxuICAgICAgICBpZiAoZGVwZW5kZW5jaWVzID09PSB1bmRlZmluZWQpIHVuZGVjbGFyZWRPcGVyYXRpb24obW9kdWxlLCBvcGVyYXRpb24pXG4gICAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBkZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgICBjb25zdCB7bW9kdWxlOiBkZXBlbmRlbmN5TW9kdWxlLCBvcGVyYXRpb246IGRlcGVuZGVuY3lPcGVyYXRpb24sIHJhbmdlfSA9IGRlcGVuZGVuY3lcblxuICAgICAgICAgIHJlcXVpcmVNb2R1bGUoZGVwZW5kZW5jeU1vZHVsZSlcbiAgICAgICAgICBpZiAoYWRkUmFuZ2UoZGVwZW5kZW5jeU1vZHVsZSwgYXNWZXJzaW9uUmFuZ2UocmFuZ2UpKSkgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICBjb25zdCB1c2VkID0gdXNlZE9wZXJhdGlvbnMuZ2V0KGRlcGVuZGVuY3lNb2R1bGUpID8/IG5ldyBTZXQoKVxuXG4gICAgICAgICAgaWYgKCF1c2VkLmhhcyhkZXBlbmRlbmN5T3BlcmF0aW9uKSkge1xuICAgICAgICAgICAgdXNlZC5hZGQoZGVwZW5kZW5jeU9wZXJhdGlvbilcbiAgICAgICAgICAgIHVzZWRPcGVyYXRpb25zLnNldChkZXBlbmRlbmN5TW9kdWxlLCB1c2VkKVxuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHR5cGUge01hcDxzdHJpbmcsIFN0ZGxpYlByb3ZpZGVyUmVjb3JkPn0gKi9cbiAgY29uc3Qgc2VsZWN0ZWRQcm92aWRlcnMgPSBuZXcgTWFwKClcbiAgbGV0IHN0YWJsZSA9IGZhbHNlXG5cbiAgd2hpbGUgKCFzdGFibGUpIHtcbiAgICBzdGFibGUgPSB0cnVlXG4gICAgc2VsZWN0ZWRQcm92aWRlcnMuY2xlYXIoKVxuXG4gICAgZm9yIChjb25zdCBtb2R1bGUgb2YgWy4uLnVzZWRPcGVyYXRpb25zLmtleXMoKV0uc29ydCgpKSB7XG4gICAgICBjb25zdCBjb250cmFjdCA9IHJlc29sdmVNb2R1bGVWZXJzaW9uKGNvbnRyYWN0cywgbW9kdWxlLCByYW5nZXMuZ2V0KG1vZHVsZSkgPz8gdW5pdmVyc2FsUmFuZ2UpXG4gICAgICBjb25zdCBjYW5kaWRhdGVzID0gcHJvdmlkZXJzLnByb3ZpZGVyc0Zvcih0YXJnZXQsIG1vZHVsZSwgY29udHJhY3QudmVyc2lvbilcblxuICAgICAgaWYgKGNhbmRpZGF0ZXMubGVuZ3RoID09IDApIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgICAgY29kZTogXCJTVERMSUJfUFJPVklERVJfTUlTU0lOR1wiLFxuICAgICAgICAgIGxhbmd1YWdlOiB0YXJnZXQsXG4gICAgICAgICAgbWVzc2FnZTogYE5vIHJlZ2lzdGVyZWQgcHJvdmlkZXIgc2VydmVzIG1vZHVsZSAnJHttb2R1bGV9JyB2ZXJzaW9uICcke2NvbnRyYWN0LnZlcnNpb259Jy5gXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBpZiAoY2FuZGlkYXRlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICAgIGNvZGU6IFwiU1RETElCX1BST1ZJREVSX0FNQklHVU9VU1wiLFxuICAgICAgICAgIGxhbmd1YWdlOiB0YXJnZXQsXG4gICAgICAgICAgbWVzc2FnZTogYE11bHRpcGxlIHJlZ2lzdGVyZWQgcHJvdmlkZXJzIHNlcnZlIG1vZHVsZSAnJHttb2R1bGV9JyB2ZXJzaW9uICcke2NvbnRyYWN0LnZlcnNpb259Jy5gXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjb25zdCBwcm92aWRlciA9IC8qKiBAdHlwZSB7U3RkbGliUHJvdmlkZXJSZWNvcmR9ICovIChjYW5kaWRhdGVzWzBdKVxuXG4gICAgICBzZWxlY3RlZFByb3ZpZGVycy5zZXQobW9kdWxlLCBwcm92aWRlcilcbiAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiBwcm92aWRlci5kZXBlbmRlbmNpZXMpIHtcbiAgICAgICAgaWYgKCFjb250cmFjdHMubW9kdWxlcy5zb21lKCh7aWRlbnRpdHl9KSA9PiBpZGVudGl0eSA9PSBkZXBlbmRlbmN5Lm1vZHVsZSkpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgICAgICAgIGNvZGU6IFwiU1RETElCX1BST1ZJREVSX0RFUEVOREVOQ1lfTUlTU0lOR1wiLFxuICAgICAgICAgICAgbGFuZ3VhZ2U6IHByb3ZpZGVyLmlkZW50aXR5LFxuICAgICAgICAgICAgbWVzc2FnZTogYFByb3ZpZGVyIGRlcGVuZGVuY3kgbW9kdWxlICcke2RlcGVuZGVuY3kubW9kdWxlfScgaXMgbm90IHJlZ2lzdGVyZWQuYFxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFkZFJhbmdlKGRlcGVuZGVuY3kubW9kdWxlLCBhc1ZlcnNpb25SYW5nZShkZXBlbmRlbmN5LnJhbmdlKSkpIHN0YWJsZSA9IGZhbHNlXG4gICAgICAgIGlmICghdXNlZE9wZXJhdGlvbnMuaGFzKGRlcGVuZGVuY3kubW9kdWxlKSkge1xuICAgICAgICAgIHVzZWRPcGVyYXRpb25zLnNldChkZXBlbmRlbmN5Lm1vZHVsZSwgbmV3IFNldCgpKVxuICAgICAgICAgIHN0YWJsZSA9IGZhbHNlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cbiAgZm9yIChjb25zdCBtb2R1bGUgb2YgWy4uLnVzZWRPcGVyYXRpb25zLmtleXMoKV0uc29ydCgpKSB7XG4gICAgY29uc3QgcHJvdmlkZXIgPSAvKiogQHR5cGUge1N0ZGxpYlByb3ZpZGVyUmVjb3JkfSAqLyAoc2VsZWN0ZWRQcm92aWRlcnMuZ2V0KG1vZHVsZSkpXG4gICAgY29uc3QgcHJvdmlkZWQgPSBuZXcgU2V0KHByb3ZpZGVyLnByb3ZpZGVzWzBdLm9wZXJhdGlvbnMpXG4gICAgY29uc3QgbWlzc2luZyA9IFsuLi4vKiogQHR5cGUge1NldDxzdHJpbmc+fSAqLyAodXNlZE9wZXJhdGlvbnMuZ2V0KG1vZHVsZSkpXS5zb3J0KClcbiAgICAgIC5maWx0ZXIoKG9wZXJhdGlvbikgPT4gIXByb3ZpZGVkLmhhcyhvcGVyYXRpb24pKVxuXG4gICAgaWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgIGNvZGU6IFwiU1RETElCX1BST1ZJREVSX01JU1NJTkdcIixcbiAgICAgICAgbGFuZ3VhZ2U6IHRhcmdldCxcbiAgICAgICAgbWVzc2FnZTogYFByb3ZpZGVyICcke3Byb3ZpZGVyLmlkZW50aXR5fScgZG9lcyBub3QgcHJvdmlkZSBvcGVyYXRpb24ke21pc3NpbmcubGVuZ3RoID4gMSA/IFwic1wiIDogXCJcIn0gJyR7bWlzc2luZy5qb2luKFwiJywgJ1wiKX0nIG9mIG1vZHVsZSAnJHttb2R1bGV9Jy5gXG4gICAgICB9KVxuICAgIH1cbiAgfVxuICBhc3NlcnRBY3ljbGljKGNvbnRyYWN0cywgcmFuZ2VzLCB1c2VkT3BlcmF0aW9ucywgc2VsZWN0ZWRQcm92aWRlcnMpXG4gIC8qKiBAdHlwZSB7e2lkZW50aXR5OiBzdHJpbmcsIG9wZXJhdGlvbnM6IHN0cmluZ1tdLCB2ZXJzaW9uOiBzdHJpbmd9W119ICovXG4gIGNvbnN0IG1vZHVsZXMgPSBbLi4udXNlZE9wZXJhdGlvbnMua2V5cygpXS5zb3J0KCkubWFwKChpZGVudGl0eSkgPT4ge1xuICAgIGNvbnN0IGNvbnRyYWN0ID0gcmVzb2x2ZU1vZHVsZVZlcnNpb24oY29udHJhY3RzLCBpZGVudGl0eSwgcmFuZ2VzLmdldChpZGVudGl0eSkgPz8gdW5pdmVyc2FsUmFuZ2UpXG4gICAgY29uc3QgdXNlZCA9IC8qKiBAdHlwZSB7U2V0PHN0cmluZz59ICovICh1c2VkT3BlcmF0aW9ucy5nZXQoaWRlbnRpdHkpKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkZW50aXR5LFxuICAgICAgb3BlcmF0aW9uczogY29udHJhY3Qub3BlcmF0aW9ucy5tYXAoKHtuYW1lfSkgPT4gbmFtZSkuZmlsdGVyKChuYW1lKSA9PiB1c2VkLmhhcyhuYW1lKSksXG4gICAgICB2ZXJzaW9uOiBjb250cmFjdC52ZXJzaW9uXG4gICAgfVxuICB9KVxuICAvKiogQHR5cGUge3tpZGVudGl0eTogc3RyaW5nLCB0YXJnZXQ6IHN0cmluZywgbW9kdWxlOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZywgb3BlcmF0aW9uczogc3RyaW5nW10sIG5hdGl2ZUVudHJpZXM6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4sIHJ1bnRpbWVQcm9maWxlOiBzdHJpbmd9W119ICovXG4gIGNvbnN0IHByb3ZpZGVyUmVzdWx0cyA9IFsuLi5zZWxlY3RlZFByb3ZpZGVycy52YWx1ZXMoKV0uc29ydCgobGVmdCwgcmlnaHQpID0+XG4gICAgbGVmdC5pZGVudGl0eSA8IHJpZ2h0LmlkZW50aXR5ID8gLTEgOiBsZWZ0LmlkZW50aXR5ID4gcmlnaHQuaWRlbnRpdHkgPyAxIDogMCkubWFwKChwcm92aWRlcikgPT4ge1xuICAgIGNvbnN0IG1vZHVsZSA9IHByb3ZpZGVyLnByb3ZpZGVzWzBdLm1vZHVsZVxuICAgIGNvbnN0IGNvbnRyYWN0ID0gcmVzb2x2ZU1vZHVsZVZlcnNpb24oY29udHJhY3RzLCBtb2R1bGUsIHJhbmdlcy5nZXQobW9kdWxlKSA/PyB1bml2ZXJzYWxSYW5nZSlcbiAgICBjb25zdCB1c2VkID0gLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi8gKHVzZWRPcGVyYXRpb25zLmdldChtb2R1bGUpKVxuICAgIGNvbnN0IG9wZXJhdGlvbnMgPSBjb250cmFjdC5vcGVyYXRpb25zLm1hcCgoe25hbWV9KSA9PiBuYW1lKS5maWx0ZXIoKG5hbWUpID0+IHVzZWQuaGFzKG5hbWUpKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkZW50aXR5OiBwcm92aWRlci5pZGVudGl0eSxcbiAgICAgIG1vZHVsZSxcbiAgICAgIG5hdGl2ZUVudHJpZXM6IE9iamVjdC5mcm9tRW50cmllcyhvcGVyYXRpb25zLm1hcCgob3BlcmF0aW9uKSA9PiBbXG4gICAgICAgIG9wZXJhdGlvbixcbiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwcm92aWRlci5uYXRpdmVFbnRyaWVzW29wZXJhdGlvbl0pXG4gICAgICBdKSksXG4gICAgICBvcGVyYXRpb25zLFxuICAgICAgcnVudGltZVByb2ZpbGU6IHByb3ZpZGVyLnJ1bnRpbWVQcm9maWxlLFxuICAgICAgdGFyZ2V0OiBwcm92aWRlci50YXJnZXQsXG4gICAgICB2ZXJzaW9uOiBwcm92aWRlci5wcm92aWRlc1swXS52ZXJzaW9uXG4gICAgfVxuICB9KVxuICByZXR1cm4gZGVlcEZyZWV6ZSgvKiogQHR5cGUge1N0ZGxpYk5lZ290aWF0aW9uUmVzdWx0fSAqLyAoe21vZHVsZXMsIHByb3ZpZGVyczogcHJvdmlkZXJSZXN1bHRzLCB0YXJnZXR9KSlcbn1cblxuLyoqXG4gKiBSZXNvbHZlcyB0aGUgaGlnaGVzdCByZWdpc3RlcmVkIGNvbnRyYWN0IHZlcnNpb24gc2F0aXNmeWluZyBvbmUgY29tYmluZWQgcmFuZ2UuXG4gKiBAcGFyYW0ge1N0ZGxpYkNvbnRyYWN0UmVnaXN0cnl9IGNvbnRyYWN0cyAtIENhbm9uaWNhbCBjb250cmFjdCByZWdpc3RyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGUgLSBDYW5vbmljYWwgbW9kdWxlIGlkZW50aXR5LlxuICogQHBhcmFtIHtWZXJzaW9uUmFuZ2V9IHJhbmdlIC0gQ29tYmluZWQgaGFsZi1vcGVuIHJhbmdlLlxuICogQHJldHVybnMge2ltcG9ydChcIi4vc2VtYW50aWMvc3RkbGliLmpzXCIpLlN0ZGxpYkNvbnRyYWN0fSBFeGFjdC12ZXJzaW9uIGNvbnRyYWN0LlxuICovXG5mdW5jdGlvbiByZXNvbHZlTW9kdWxlVmVyc2lvbihjb250cmFjdHMsIG1vZHVsZSwgcmFuZ2UpIHtcbiAgY29uc3QgbGlzdGVkID0gY29udHJhY3RzLm1vZHVsZXMuZmluZCgoe2lkZW50aXR5fSkgPT4gaWRlbnRpdHkgPT0gbW9kdWxlKVxuXG4gIGlmICghbGlzdGVkKSB7XG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7Y29kZTogXCJTVERMSUJfTU9EVUxFX1VOS05PV05cIiwgbGFuZ3VhZ2U6IG1vZHVsZSwgbWVzc2FnZTogYENhbm9uaWNhbCBtb2R1bGUgJyR7bW9kdWxlfScgaXMgbm90IHJlZ2lzdGVyZWQuYH0pXG4gIH1cbiAgLyoqIEB0eXBlIHtbbnVtYmVyLCBudW1iZXIsIG51bWJlcl0gfCBudWxsfSAqL1xuICBsZXQgcmVzb2x2ZWQgPSBudWxsXG5cbiAgZm9yIChjb25zdCB2ZXJzaW9uIG9mIGxpc3RlZC52ZXJzaW9ucykge1xuICAgIGNvbnN0IHR1cGxlID0gLyoqIEB0eXBlIHtbbnVtYmVyLCBudW1iZXIsIG51bWJlcl19ICovIChwYXJzZVN0ZGxpYlZlcnNpb24odmVyc2lvbikpXG5cbiAgICBpZiAoc3RkbGliVmVyc2lvblNhdGlzZmllcyh0dXBsZSwgcmFuZ2UpICYmIChyZXNvbHZlZCA9PT0gbnVsbCB8fCBjb21wYXJlU3RkbGliVmVyc2lvbnModHVwbGUsIHJlc29sdmVkKSA+IDApKSB7XG4gICAgICByZXNvbHZlZCA9IHR1cGxlXG4gICAgfVxuICB9XG4gIGlmIChyZXNvbHZlZCA9PT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgY29kZTogXCJTVERMSUJfVkVSU0lPTl9JTkNPTVBBVElCTEVcIixcbiAgICAgIGxhbmd1YWdlOiBtb2R1bGUsXG4gICAgICBtZXNzYWdlOiBgQ2Fub25pY2FsIG1vZHVsZSAnJHttb2R1bGV9JyBoYXMgbm8gcmVnaXN0ZXJlZCB2ZXJzaW9uIHNhdGlzZnlpbmcgdGhlIGNvbWJpbmVkIHJhbmdlLmBcbiAgICB9KVxuICB9XG4gIHJldHVybiBjb250cmFjdHMucmVzb2x2ZU1vZHVsZShtb2R1bGUsIGAke3Jlc29sdmVkWzBdfS4ke3Jlc29sdmVkWzFdfS4ke3Jlc29sdmVkWzJdfWApXG59XG5cbi8qKlxuICogRmFpbHMgZGV0ZXJtaW5pc3RpY2FsbHkgd2hlbiBjYW5vbmljYWwgb3BlcmF0aW9uIGRlcGVuZGVuY2llcyBvciBzZWxlY3RlZCBwcm92aWRlclxuICogbW9kdWxlIGRlcGVuZGVuY2llcyBjeWNsZS5cbiAqIEBwYXJhbSB7U3RkbGliQ29udHJhY3RSZWdpc3RyeX0gY29udHJhY3RzIC0gQ2Fub25pY2FsIGNvbnRyYWN0IHJlZ2lzdHJ5LlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBWZXJzaW9uUmFuZ2U+fSByYW5nZXMgLSBDb21iaW5lZCByYW5nZXMgcGVyIG1vZHVsZS5cbiAqIEBwYXJhbSB7TWFwPHN0cmluZywgU2V0PHN0cmluZz4+fSB1c2VkT3BlcmF0aW9ucyAtIFVzZWQgb3BlcmF0aW9ucyBwZXIgbW9kdWxlLlxuICogQHBhcmFtIHtNYXA8c3RyaW5nLCBTdGRsaWJQcm92aWRlclJlY29yZD59IHNlbGVjdGVkUHJvdmlkZXJzIC0gU2VsZWN0ZWQgcHJvdmlkZXIgcGVyIG1vZHVsZS5cbiAqIEByZXR1cm5zIHt2b2lkfVxuICovXG5mdW5jdGlvbiBhc3NlcnRBY3ljbGljKGNvbnRyYWN0cywgcmFuZ2VzLCB1c2VkT3BlcmF0aW9ucywgc2VsZWN0ZWRQcm92aWRlcnMpIHtcbiAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBzdHJpbmdbXT59ICovXG4gIGNvbnN0IGVkZ2VzID0gbmV3IE1hcCgpXG5cbiAgZm9yIChjb25zdCBtb2R1bGUgb2YgWy4uLnVzZWRPcGVyYXRpb25zLmtleXMoKV0uc29ydCgpKSB7XG4gICAgY29uc3QgY29udHJhY3QgPSByZXNvbHZlTW9kdWxlVmVyc2lvbihjb250cmFjdHMsIG1vZHVsZSwgcmFuZ2VzLmdldChtb2R1bGUpID8/IHVuaXZlcnNhbFJhbmdlKVxuICAgIGNvbnN0IGRlY2xhcmVkID0gbmV3IE1hcChjb250cmFjdC5vcGVyYXRpb25zLm1hcCgoe2RlcGVuZGVuY2llcywgbmFtZX0pID0+IFtuYW1lLCBkZXBlbmRlbmNpZXNdKSlcbiAgICBjb25zdCB1c2VkID0gLyoqIEB0eXBlIHtTZXQ8c3RyaW5nPn0gKi8gKHVzZWRPcGVyYXRpb25zLmdldChtb2R1bGUpKVxuXG4gICAgZm9yIChjb25zdCBvcGVyYXRpb24gb2YgWy4uLnVzZWRdLnNvcnQoKSkge1xuICAgICAgY29uc3Qgbm9kZUtleSA9IGAke21vZHVsZX1cXHUwMDAwJHtvcGVyYXRpb259YFxuICAgICAgY29uc3QgdGFyZ2V0cyA9IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChlZGdlcy5nZXQobm9kZUtleSkgPz8gW10pXG5cbiAgICAgIGZvciAoY29uc3QgZGVwZW5kZW5jeSBvZiAvKiogQHR5cGUge3ttb2R1bGU6IHN0cmluZywgb3BlcmF0aW9uOiBzdHJpbmd9W119ICovIChkZWNsYXJlZC5nZXQob3BlcmF0aW9uKSkpIHtcbiAgICAgICAgdGFyZ2V0cy5wdXNoKGAke2RlcGVuZGVuY3kubW9kdWxlfVxcdTAwMDAke2RlcGVuZGVuY3kub3BlcmF0aW9ufWApXG4gICAgICB9XG4gICAgICBlZGdlcy5zZXQobm9kZUtleSwgdGFyZ2V0cy5zb3J0KCkpXG4gICAgfVxuICAgIGNvbnN0IG1vZHVsZU5vZGVLZXkgPSBgJHttb2R1bGV9XFx1MDAwMFxcdTAwMDBgXG4gICAgY29uc3QgbW9kdWxlVGFyZ2V0cyA9IC8qKiBAdHlwZSB7c3RyaW5nW119ICovIChlZGdlcy5nZXQobW9kdWxlTm9kZUtleSkgPz8gW10pXG5cbiAgICBmb3IgKGNvbnN0IGRlcGVuZGVuY3kgb2YgY29udHJhY3QuZGVwZW5kZW5jaWVzKSBtb2R1bGVUYXJnZXRzLnB1c2goYCR7ZGVwZW5kZW5jeS5tb2R1bGV9XFx1MDAwMFxcdTAwMDBgKVxuICAgIGVkZ2VzLnNldChtb2R1bGVOb2RlS2V5LCBtb2R1bGVUYXJnZXRzLnNvcnQoKSlcbiAgfVxuICBmb3IgKGNvbnN0IG1vZHVsZSBvZiBbLi4uc2VsZWN0ZWRQcm92aWRlcnMua2V5cygpXS5zb3J0KCkpIHtcbiAgICBjb25zdCBwcm92aWRlciA9IC8qKiBAdHlwZSB7U3RkbGliUHJvdmlkZXJSZWNvcmR9ICovIChzZWxlY3RlZFByb3ZpZGVycy5nZXQobW9kdWxlKSlcbiAgICBjb25zdCBub2RlS2V5ID0gYCR7bW9kdWxlfVxcdTAwMDBcXHUwMDAwYFxuICAgIGNvbnN0IHRhcmdldHMgPSAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAoZWRnZXMuZ2V0KG5vZGVLZXkpID8/IFtdKVxuXG4gICAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIHByb3ZpZGVyLmRlcGVuZGVuY2llcykge1xuICAgICAgdGFyZ2V0cy5wdXNoKGAke2RlcGVuZGVuY3kubW9kdWxlfVxcdTAwMDBcXHUwMDAwYClcbiAgICB9XG4gICAgZWRnZXMuc2V0KG5vZGVLZXksIHRhcmdldHMuc29ydCgpKVxuICB9XG4gIC8qKiBAdHlwZSB7TWFwPHN0cmluZywgbnVtYmVyPn0gKi9cbiAgY29uc3QgY29sb3JzID0gbmV3IE1hcCgpXG4gIC8qKlxuICAgKiBXYWxrcyB0aGUgZGVwZW5kZW5jeSBlZGdlcyBpbiBkZXRlcm1pbmlzdGljIG9yZGVyLCByZWplY3RpbmcgY3ljbGVzLlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbm9kZUtleSAtIE5vZGUga2V5LlxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIGZ1bmN0aW9uIHZpc2l0KG5vZGVLZXkpIHtcbiAgICBjb2xvcnMuc2V0KG5vZGVLZXksIDEpXG5cbiAgICBmb3IgKGNvbnN0IHRhcmdldCBvZiAvKiogQHR5cGUge3N0cmluZ1tdfSAqLyAoZWRnZXMuZ2V0KG5vZGVLZXkpID8/IFtdKSkge1xuICAgICAgY29uc3QgY29sb3IgPSBjb2xvcnMuZ2V0KHRhcmdldCkgPz8gMFxuXG4gICAgICBpZiAoY29sb3IgPT0gMSkgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgIGNvZGU6IFwiU1RETElCX1BST1ZJREVSX0NZQ0xFXCIsXG4gICAgICAgIGxhbmd1YWdlOiB0YXJnZXQuc3BsaXQoXCJcXHUwMDAwXCIpWzBdLFxuICAgICAgICBtZXNzYWdlOiBcIkNhbm9uaWNhbCBzdGRsaWIgZGVwZW5kZW5jaWVzIGZvcm0gYSBjeWNsZS5cIlxuICAgICAgfSlcbiAgICAgIGlmIChjb2xvciA9PSAwKSB2aXNpdCh0YXJnZXQpXG4gICAgfVxuICAgIGNvbG9ycy5zZXQobm9kZUtleSwgMilcbiAgfVxuXG4gIGZvciAoY29uc3Qgbm9kZUtleSBvZiBbLi4uZWRnZXMua2V5cygpXS5zb3J0KCkpIHtcbiAgICBpZiAoKGNvbG9ycy5nZXQobm9kZUtleSkgPz8gMCkgPT0gMCkgdmlzaXQobm9kZUtleSlcbiAgfVxufVxuXG4vKipcbiAqIE5vcm1hbGl6ZXMgYSBkZWNsYXJlZCBkZXBlbmRlbmN5IHJhbmdlLCBhY2NlcHRpbmcgY2Fub25pY2FsIHN0cmluZ3Mgb3IgcGFyc2VkIHJhbmdlcy5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgcmFuZ2UuXG4gKiBAcmV0dXJucyB7VmVyc2lvblJhbmdlfSBIYWxmLW9wZW4gcmFuZ2UuXG4gKi9cbmZ1bmN0aW9uIGFzVmVyc2lvblJhbmdlKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT0gXCJzdHJpbmdcIikge1xuICAgIGNvbnN0IHBhcnNlZCA9IHBhcnNlU3RkbGliVmVyc2lvblJhbmdlKHZhbHVlKVxuXG4gICAgaWYgKHBhcnNlZCA9PT0gbnVsbCkgbWFsZm9ybWVkUmFuZ2UodmFsdWUpXG4gICAgcmV0dXJuIHBhcnNlZFxuICB9XG4gIGlmIChpc1BsYWluT2JqZWN0KHZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHZhbHVlLmxvd2VyKSAmJiB2YWx1ZS5sb3dlci5sZW5ndGggPT0gMyAmJlxuICAgIHZhbHVlLmxvd2VyLmV2ZXJ5KChwYXJ0KSA9PiBOdW1iZXIuaXNJbnRlZ2VyKHBhcnQpKSAmJlxuICAgICh2YWx1ZS51cHBlciA9PT0gbnVsbCB8fCAoQXJyYXkuaXNBcnJheSh2YWx1ZS51cHBlcikgJiYgdmFsdWUudXBwZXIubGVuZ3RoID09IDMgJiZcbiAgICAgIHZhbHVlLnVwcGVyLmV2ZXJ5KChwYXJ0KSA9PiBOdW1iZXIuaXNJbnRlZ2VyKHBhcnQpKSkpKSB7XG4gICAgcmV0dXJuIHtsb3dlcjogLyoqIEB0eXBlIHtbbnVtYmVyLCBudW1iZXIsIG51bWJlcl19ICovICh2YWx1ZS5sb3dlciksIHVwcGVyOiB2YWx1ZS51cHBlciA9PT0gbnVsbCA/IG51bGwgOiAvKiogQHR5cGUge1tudW1iZXIsIG51bWJlciwgbnVtYmVyXX0gKi8gKHZhbHVlLnVwcGVyKX1cbiAgfVxuICByZXR1cm4gbWFsZm9ybWVkUmFuZ2UoU3RyaW5nKHZhbHVlKSlcbn1cblxuLyoqXG4gKiBFbmNvZGVzIG9uZSBoYWxmLW9wZW4gcmFuZ2UgZGV0ZXJtaW5pc3RpY2FsbHkuXG4gKiBAcGFyYW0ge1ZlcnNpb25SYW5nZX0gcmFuZ2UgLSBIYWxmLW9wZW4gcmFuZ2UuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBTdGFibGUga2V5LlxuICovXG5mdW5jdGlvbiByYW5nZUtleShyYW5nZSkge1xuICByZXR1cm4gYCR7cmFuZ2UubG93ZXIuam9pbihcIi5cIil9Li4ke3JhbmdlLnVwcGVyID09PSBudWxsID8gXCJcIiA6IHJhbmdlLnVwcGVyLmpvaW4oXCIuXCIpfWBcbn1cblxuLyoqXG4gKiBUaHJvd3MgYSBtYWxmb3JtZWQtdmVyc2lvbi1yYW5nZSBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtzdHJpbmd9IHJhbmdlIC0gQ2FuZGlkYXRlIHJhbmdlLlxuICogQHJldHVybnMge25ldmVyfSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiBtYWxmb3JtZWRSYW5nZShyYW5nZSkge1xuICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICBjb2RlOiBcIlNURExJQl9WRVJTSU9OX01BTEZPUk1FRFwiLFxuICAgIGxhbmd1YWdlOiBcInN0ZGxpYlwiLFxuICAgIG1lc3NhZ2U6IGBTdGRsaWIgdmVyc2lvbiByYW5nZSAnJHtyYW5nZX0nIGlzIG5vdCBjYW5vbmljYWwuYFxuICB9KVxufVxuXG4vKipcbiAqIFRocm93cyBhbiB1bmRlY2xhcmVkLW9wZXJhdGlvbiBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZSAtIENhbm9uaWNhbCBtb2R1bGUgaWRlbnRpdHkuXG4gKiBAcGFyYW0ge3N0cmluZ30gb3BlcmF0aW9uIC0gTWlzc2luZyBvcGVyYXRpb24uXG4gKiBAcmV0dXJucyB7bmV2ZXJ9IEFsd2F5cyB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIHVuZGVjbGFyZWRPcGVyYXRpb24obW9kdWxlLCBvcGVyYXRpb24pIHtcbiAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgY29kZTogXCJTVERMSUJfT1BFUkFUSU9OX1VOREVDTEFSRURcIixcbiAgICBsYW5ndWFnZTogbW9kdWxlLFxuICAgIG1lc3NhZ2U6IGBPcGVyYXRpb24gJyR7b3BlcmF0aW9ufScgaXMgbm90IGRlY2xhcmVkIGJ5IGNhbm9uaWNhbCBtb2R1bGUgJyR7bW9kdWxlfScuYFxuICB9KVxufVxuXG4vKipcbiAqIFRocm93cyBhIHJlcXVpcmVtZW50LXNoYXBlIGRpYWdub3N0aWMuXG4gKiBAcGFyYW0ge3N0cmluZ30gbWVzc2FnZSAtIEZhaWx1cmUgZGV0YWlsLlxuICogQHJldHVybnMge25ldmVyfSBBbHdheXMgdGhyb3dzLlxuICovXG5mdW5jdGlvbiBpbnZhbGlkUmVxdWlyZW1lbnQobWVzc2FnZSkge1xuICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtjb2RlOiBcIlNURExJQl9DT05UUkFDVF9JTlZBTElEXCIsIGxhbmd1YWdlOiBcInN0ZGxpYlwiLCBtZXNzYWdlfSlcbn1cblxuLyoqXG4gKiBDaGVja3MgZm9yIGFuIG9yZGluYXJ5IHN0cmluZy1rZXllZCBvYmplY3QuXG4gKiBAcGFyYW0ge3Vua25vd259IHZhbHVlIC0gQ2FuZGlkYXRlIHZhbHVlLlxuICogQHJldHVybnMge3ZhbHVlIGlzIFJlY29yZDxzdHJpbmcsIHVua25vd24+fSBXaGV0aGVyIHRoZSB2YWx1ZSBpcyBhIHBsYWluIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwpIHJldHVybiBmYWxzZVxuICBjb25zdCBwcm90b3R5cGUgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodmFsdWUpXG5cbiAgcmV0dXJuIHByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCBwcm90b3R5cGUgPT09IG51bGxcbn1cblxuLyoqXG4gKiBEZWVwLWZyZWV6ZXMgYSBkZXRhY2hlZCB2YWx1ZS5cbiAqIEB0ZW1wbGF0ZSBUXG4gKiBAcGFyYW0ge1R9IHZhbHVlIC0gRGV0YWNoZWQgdmFsdWUuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8VD59IEZyb3plbiB2YWx1ZS5cbiAqL1xuZnVuY3Rpb24gZGVlcEZyZWV6ZSh2YWx1ZSkge1xuICBpZiAodHlwZW9mIHZhbHVlICE9IFwib2JqZWN0XCIgfHwgdmFsdWUgPT09IG51bGwgfHwgT2JqZWN0LmlzRnJvemVuKHZhbHVlKSkgcmV0dXJuIC8qKiBAdHlwZSB7UmVhZG9ubHk8VD59ICovICh2YWx1ZSlcbiAgT2JqZWN0LmZyZWV6ZSh2YWx1ZSlcblxuICBmb3IgKGNvbnN0IHByb3BlcnR5IG9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKSkge1xuICAgIGRlZXBGcmVlemUoLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoKC8qKiBAdHlwZSB7UmVjb3JkPHN0cmluZywgdW5rbm93bj59ICovICh2YWx1ZSkpW3Byb3BlcnR5XSkpXG4gIH1cbiAgcmV0dXJuIC8qKiBAdHlwZSB7UmVhZG9ubHk8VD59ICovICh2YWx1ZSlcbn1cbiJdfQ==
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
export { protectedEntryName } from "./semantic/stdlib.js";
|
|
2
|
+
export type StdlibProviderRecord = {
|
|
3
|
+
/**
|
|
4
|
+
* - Generated provider artifact declaration.
|
|
5
|
+
*/
|
|
6
|
+
artifact: {
|
|
7
|
+
mediaType: string;
|
|
8
|
+
path: string;
|
|
9
|
+
};
|
|
10
|
+
/**
|
|
11
|
+
* - Canonical module dependencies with declared ranges.
|
|
12
|
+
*/
|
|
13
|
+
dependencies: readonly {
|
|
14
|
+
module: string;
|
|
15
|
+
range: string;
|
|
16
|
+
}[];
|
|
17
|
+
/**
|
|
18
|
+
* - Stable provider identity rooted at the target.
|
|
19
|
+
*/
|
|
20
|
+
identity: string;
|
|
21
|
+
/**
|
|
22
|
+
* - Operation to protected native entry name.
|
|
23
|
+
*/
|
|
24
|
+
nativeEntries: Readonly<Record<string, string>>;
|
|
25
|
+
/**
|
|
26
|
+
* - Exactly one provided canonical module.
|
|
27
|
+
*/
|
|
28
|
+
provides: readonly {
|
|
29
|
+
module: string;
|
|
30
|
+
operations: string[];
|
|
31
|
+
version: string;
|
|
32
|
+
}[];
|
|
33
|
+
/**
|
|
34
|
+
* - Closed target runtime/provider profile.
|
|
35
|
+
*/
|
|
36
|
+
runtimeProfile: string;
|
|
37
|
+
/**
|
|
38
|
+
* - Adopted target language identity.
|
|
39
|
+
*/
|
|
40
|
+
target: string;
|
|
41
|
+
};
|
|
42
|
+
export type StdlibProviderRegistry = {
|
|
43
|
+
/**
|
|
44
|
+
* - Registered provider records in stable order.
|
|
45
|
+
*/
|
|
46
|
+
records: readonly StdlibProviderRecord[];
|
|
47
|
+
/**
|
|
48
|
+
* - Exact provider lookup.
|
|
49
|
+
*/
|
|
50
|
+
providersFor: {
|
|
51
|
+
(target: string, module: string, version: string): readonly StdlibProviderRecord[];
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Creates the versioned target host stdlib provider registry.
|
|
56
|
+
* @param {unknown} records - Ordered provider records; built-in providers by default.
|
|
57
|
+
* @returns {Readonly<StdlibProviderRegistry>} Frozen registry.
|
|
58
|
+
*/
|
|
59
|
+
export declare function createStdlibProviderRegistry(records?: unknown): Readonly<StdlibProviderRegistry>;
|
|
60
|
+
/**
|
|
61
|
+
* Lists the built-in target host providers for the probe contract in stable target order.
|
|
62
|
+
* @returns {readonly StdlibProviderRecord[]} Frozen provider records.
|
|
63
|
+
*/
|
|
64
|
+
export declare function listStdlibProviders(): readonly StdlibProviderRecord[];
|
|
65
|
+
/**
|
|
66
|
+
* Authoritative built-in provider lookup keyed by exact target, module, and version.
|
|
67
|
+
* @type {{providersFor(target: string, module: string, version: string): readonly StdlibProviderRecord[]}}
|
|
68
|
+
*/
|
|
69
|
+
export declare const stdlibProviderRegistry: {
|
|
70
|
+
providersFor(target: string, module: string, version: string): readonly StdlibProviderRecord[];
|
|
71
|
+
};
|
|
72
|
+
//# sourceMappingURL=stdlib-providers.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stdlib-providers.d.ts","sourceRoot":"","sources":["../../src/stdlib-providers.js"],"names":[],"mappings":"AAcA,OAAO,EAAC,kBAAkB,EAAC,MAAM,sBAAsB,CAAA;AAGpD,YAAS,oBAAoB,GAC7B;;;;IAA8C,QAAQ,EAA3C;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAC,CAC5C;;;;IAAuD,YAAY,EAAxD,SAAS;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,EAAE,CACrD;;;;IAAmB,QAAQ,EAAhB,MAAM,CACjB;;;;IAA6C,aAAa,EAA/C,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAC3C;;;;IAA+E,QAAQ,EAA5E,SAAS;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAC,EAAE,CAC7E;;;;IAAmB,cAAc,EAAtB,MAAM,CACjB;;;;IAAmB,MAAM,EAAd,MAAM,CACnB;CAAA,CAAA;AAGE,YAAS,sBAAsB,GAC/B;;;;IAA4C,OAAO,EAAxC,SAAS,oBAAoB,EAAE,CAC1C;;;;IAAiG,YAAY,EAAlG;QAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,oBAAoB,EAAE,CAAA;KAAC,CACjG;CAAA,CAAA;AA8BD;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,OAAO,GAHzC,OAGoE,GAFlE,QAAQ,CAAC,sBAAsB,CAAC,CA2B5C;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,IAFtB,SAAS,oBAAoB,EAAE,CAI3C;AAED;;;GAGG;AACH,eAAO,MAAM,sBAAsB,EAFzB;IAAC,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,SAAS,oBAAoB,EAAE,CAAA;CAMxG,CAAA"}
|