semantifold 0.3.0 → 0.4.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 +58 -15
- package/build/index.d.ts +48 -2
- package/build/index.d.ts.map +1 -1
- package/build/index.js +57 -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/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 +154 -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 +23 -0
- package/build/src/backends/kotlin.d.ts.map +1 -0
- package/build/src/backends/kotlin.js +136 -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 +81 -0
- package/build/src/backends/program.d.ts.map +1 -0
- package/build/src/backends/program.js +1308 -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 +2158 -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 +235 -4
- package/build/src/backends/writer.d.ts.map +1 -1
- package/build/src/backends/writer.js +468 -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 +167 -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 +2952 -202
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +688 -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/architecture.md +45 -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 +231 -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 +15 -7
- package/docs/standard-library-portability.md +39 -8
- package/docs/swift.md +44 -0
- package/docs/testing.md +366 -4
- package/docs/webassembly.md +52 -0
- package/index.js +63 -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/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 +160 -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 +141 -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 +1407 -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 +2304 -124
- 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 +520 -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 +172 -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 +765 -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,339 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { isDenseArray } from "./array.js";
|
|
3
|
+
import { isSafeArtifactPath } from "./artifact-path.js";
|
|
4
|
+
import { SemantifoldDiagnostic } from "./diagnostic.js";
|
|
5
|
+
import { languageRegistry } from "./language-registry.js";
|
|
6
|
+
import { listStdlibModules, parseStdlibVersion, parseStdlibVersionRange, protectedEntryName, resolveStdlibModule } from "./semantic/stdlib.js";
|
|
7
|
+
export { protectedEntryName } from "./semantic/stdlib.js";
|
|
8
|
+
/**
|
|
9
|
+
* @typedef StdlibProviderRecord
|
|
10
|
+
* @property {{mediaType: string, path: string}} artifact - Generated provider artifact declaration.
|
|
11
|
+
* @property {readonly {module: string, range: string}[]} dependencies - Canonical module dependencies with declared ranges.
|
|
12
|
+
* @property {string} identity - Stable provider identity rooted at the target.
|
|
13
|
+
* @property {Readonly<Record<string, string>>} nativeEntries - Operation to protected native entry name.
|
|
14
|
+
* @property {readonly {module: string, operations: string[], version: string}[]} provides - Exactly one provided canonical module.
|
|
15
|
+
* @property {string} runtimeProfile - Closed target runtime/provider profile.
|
|
16
|
+
* @property {string} target - Adopted target language identity.
|
|
17
|
+
*/
|
|
18
|
+
/**
|
|
19
|
+
* @typedef StdlibProviderRegistry
|
|
20
|
+
* @property {readonly StdlibProviderRecord[]} records - Registered provider records in stable order.
|
|
21
|
+
* @property {{(target: string, module: string, version: string): readonly StdlibProviderRecord[]}} providersFor - Exact provider lookup.
|
|
22
|
+
*/
|
|
23
|
+
const providerIdentityPrefix = "semantifold.provider.";
|
|
24
|
+
/** @type {Readonly<Record<string, string>>} */
|
|
25
|
+
const targetExtensions = Object.freeze({
|
|
26
|
+
javascript: "js",
|
|
27
|
+
java: "java",
|
|
28
|
+
php: "php",
|
|
29
|
+
ruby: "rb",
|
|
30
|
+
typescript: "ts"
|
|
31
|
+
});
|
|
32
|
+
const builtinProviderTargets = Object.freeze(["php", "ruby", "javascript", "typescript", "java"]);
|
|
33
|
+
const probeIdentity = "semantifold.task034.resource-probe";
|
|
34
|
+
const probeOperations = Object.freeze(["probeEffect", "probeAcquire", "probeRead", "probeClose", "probeTrace"]);
|
|
35
|
+
const recordKeys = Object.freeze(["artifact", "dependencies", "identity", "nativeEntries", "provides", "runtimeProfile", "target"]);
|
|
36
|
+
const task037ProviderModules = Object.freeze([
|
|
37
|
+
Object.freeze({ dependencies: [], identity: "semantifold.resource", operations: ["v1_close"] }),
|
|
38
|
+
Object.freeze({ dependencies: [{ module: "semantifold.resource", range: "1" }], identity: "semantifold.socket-client", operations: ["v1_connect"] }),
|
|
39
|
+
Object.freeze({ dependencies: [{ module: "semantifold.resource", range: "1" }], identity: "semantifold.text-stream", operations: ["v1_read_line"] }),
|
|
40
|
+
Object.freeze({ dependencies: [], identity: "semantifold.output", operations: ["v1_write_line"] })
|
|
41
|
+
]);
|
|
42
|
+
/** @type {Readonly<Record<string, string>>} */
|
|
43
|
+
const legacyRuntimeProfiles = Object.freeze({
|
|
44
|
+
javascript: "node24-core-v1",
|
|
45
|
+
java: "java17-core-v1",
|
|
46
|
+
php: "php82-core-v1",
|
|
47
|
+
ruby: "ruby3-core-v1",
|
|
48
|
+
typescript: "node24-typescript7-core-v1"
|
|
49
|
+
});
|
|
50
|
+
/**
|
|
51
|
+
* Creates the versioned target host stdlib provider registry.
|
|
52
|
+
* @param {unknown} records - Ordered provider records; built-in providers by default.
|
|
53
|
+
* @returns {Readonly<StdlibProviderRegistry>} Frozen registry.
|
|
54
|
+
*/
|
|
55
|
+
export function createStdlibProviderRegistry(records = builtinProviderRecords()) {
|
|
56
|
+
if (!isDenseArray(records))
|
|
57
|
+
invalidProvider("Provider records must be an ordered dense array.");
|
|
58
|
+
/** @type {StdlibProviderRecord[]} */
|
|
59
|
+
const validated = [];
|
|
60
|
+
/** @type {Set<string>} */
|
|
61
|
+
const identities = new Set();
|
|
62
|
+
for (const candidate of records) {
|
|
63
|
+
const record = validateProviderRecord(candidate);
|
|
64
|
+
if (identities.has(record.identity))
|
|
65
|
+
invalidProvider(`Duplicate stdlib provider identity '${record.identity}'.`);
|
|
66
|
+
identities.add(record.identity);
|
|
67
|
+
validated.push(record);
|
|
68
|
+
}
|
|
69
|
+
const frozenRecords = deepFreeze(validated);
|
|
70
|
+
return Object.freeze(/** @type {Readonly<StdlibProviderRegistry>} */ ({
|
|
71
|
+
records: frozenRecords,
|
|
72
|
+
providersFor(target, module, version) {
|
|
73
|
+
if (typeof target != "string" || typeof module != "string" || typeof version != "string")
|
|
74
|
+
return Object.freeze([]);
|
|
75
|
+
return Object.freeze(frozenRecords.filter((record) => record.target == target && record.provides[0].module == module && record.provides[0].version == version));
|
|
76
|
+
}
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Lists the built-in target host providers for the probe contract in stable target order.
|
|
81
|
+
* @returns {readonly StdlibProviderRecord[]} Frozen provider records.
|
|
82
|
+
*/
|
|
83
|
+
export function listStdlibProviders() {
|
|
84
|
+
return builtinProviderRegistry().records;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Authoritative built-in provider lookup keyed by exact target, module, and version.
|
|
88
|
+
* @type {{providersFor(target: string, module: string, version: string): readonly StdlibProviderRecord[]}}
|
|
89
|
+
*/
|
|
90
|
+
export const stdlibProviderRegistry = {
|
|
91
|
+
providersFor(target, module, version) {
|
|
92
|
+
return builtinProviderRegistry().providersFor(target, module, version);
|
|
93
|
+
}
|
|
94
|
+
};
|
|
95
|
+
/**
|
|
96
|
+
* Validates one provider record against the target roles and canonical contract registry.
|
|
97
|
+
* @param {unknown} candidate - Candidate record.
|
|
98
|
+
* @returns {StdlibProviderRecord} Detached frozen record.
|
|
99
|
+
*/
|
|
100
|
+
function validateProviderRecord(candidate) {
|
|
101
|
+
if (!isPlainObject(candidate))
|
|
102
|
+
invalidProvider("Every stdlib provider record must be a plain object.");
|
|
103
|
+
if (Object.keys(candidate).sort().join(",") != recordKeys.join(",")) {
|
|
104
|
+
invalidProvider("Every stdlib provider record declares the exact provider record fields.");
|
|
105
|
+
}
|
|
106
|
+
const target = /** @type {string} */ (candidate.target);
|
|
107
|
+
if (typeof target != "string" || !providerTargetRegistered(target)) {
|
|
108
|
+
invalidProvider(`Stdlib provider target '${String(target)}' is not an adopted target host provider.`);
|
|
109
|
+
}
|
|
110
|
+
const identity = /** @type {string} */ (candidate.identity);
|
|
111
|
+
const identityPrefix = providerIdentityPrefix + target + ".";
|
|
112
|
+
if (typeof identity != "string" || !identity.startsWith(identityPrefix) || identity.length == identityPrefix.length) {
|
|
113
|
+
invalidProvider(`Stdlib provider identity '${String(identity)}' must be rooted at '${identityPrefix}'.`);
|
|
114
|
+
}
|
|
115
|
+
const provides = /** @type {unknown} */ (candidate.provides);
|
|
116
|
+
if (!isDenseArray(provides) || provides.length != 1)
|
|
117
|
+
invalidProvider("Every stdlib provider provides exactly one canonical module.");
|
|
118
|
+
const provision = /** @type {unknown} */ (provides[0]);
|
|
119
|
+
if (!isPlainObject(provision) || Object.keys(provision).sort().join(",") != "module,operations,version") {
|
|
120
|
+
invalidProvider("Every stdlib provider provision declares the exact provision fields.");
|
|
121
|
+
}
|
|
122
|
+
const module = /** @type {string} */ (provision.module);
|
|
123
|
+
if (typeof module != "string" || !/^[a-z][a-z0-9.-]*$/u.test(module)) {
|
|
124
|
+
invalidProvider(`Stdlib provider module '${String(module)}' is not a canonical identity.`);
|
|
125
|
+
}
|
|
126
|
+
const version = /** @type {string} */ (provision.version);
|
|
127
|
+
if (parseStdlibVersion(version) === null) {
|
|
128
|
+
throw new SemantifoldDiagnostic({
|
|
129
|
+
code: "STDLIB_VERSION_MALFORMED",
|
|
130
|
+
language: target,
|
|
131
|
+
message: `Stdlib provider version '${String(version)}' is not a strict semantic version.`
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
const operations = /** @type {unknown} */ (provision.operations);
|
|
135
|
+
if (!isDenseArray(operations) || operations.length == 0 || !operations.every((operation) => typeof operation == "string" && /^[A-Za-z_][A-Za-z0-9_]*$/u.test(operation)) ||
|
|
136
|
+
new Set(/** @type {string[]} */ (operations)).size != operations.length) {
|
|
137
|
+
invalidProvider(`Stdlib provider '${identity}' declares invalid operations.`);
|
|
138
|
+
}
|
|
139
|
+
const operationList = /** @type {string[]} */ (operations);
|
|
140
|
+
if (moduleKnown(module))
|
|
141
|
+
validateProvision(module, version, operationList);
|
|
142
|
+
const nativeEntries = /** @type {unknown} */ (candidate.nativeEntries);
|
|
143
|
+
if (!isPlainObject(nativeEntries) || Object.keys(nativeEntries).sort().join(",") !=
|
|
144
|
+
[...operationList].sort().join(",")) {
|
|
145
|
+
invalidProvider(`Stdlib provider '${identity}' native entries must match its operations exactly.`);
|
|
146
|
+
}
|
|
147
|
+
for (const operation of operationList) {
|
|
148
|
+
const expectedEntry = module == probeIdentity
|
|
149
|
+
? protectedEntryName(target, operation)
|
|
150
|
+
: protectedEntryName(target, module, operation);
|
|
151
|
+
if ( /** @type {string} */(nativeEntries[operation]) != expectedEntry) {
|
|
152
|
+
invalidProvider(`Stdlib provider '${identity}' declares an invalid protected native entry.`);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
const artifact = /** @type {unknown} */ (candidate.artifact);
|
|
156
|
+
if (!isPlainObject(artifact) || Object.keys(artifact).sort().join(",") != "mediaType,path") {
|
|
157
|
+
invalidProvider(`Stdlib provider '${identity}' declares an invalid artifact.`);
|
|
158
|
+
}
|
|
159
|
+
const mediaType = /** @type {string} */ (artifact.mediaType);
|
|
160
|
+
const path = /** @type {string} */ (artifact.path);
|
|
161
|
+
const derivedPath = `providers/${target}/${module.replaceAll(".", "/")}.${targetExtensions[target]}`;
|
|
162
|
+
if (typeof mediaType != "string" || mediaType.length == 0 || typeof path != "string" ||
|
|
163
|
+
path != derivedPath || !isSafeArtifactPath(path)) {
|
|
164
|
+
invalidProvider(`Stdlib provider '${identity}' artifact must be generated at '${derivedPath}'.`);
|
|
165
|
+
}
|
|
166
|
+
const dependencies = /** @type {unknown} */ (candidate.dependencies);
|
|
167
|
+
if (!isDenseArray(dependencies))
|
|
168
|
+
invalidProvider(`Stdlib provider '${identity}' dependencies must be a dense array.`);
|
|
169
|
+
/** @type {{module: string, range: string}[]} */
|
|
170
|
+
const validatedDependencies = [];
|
|
171
|
+
for (const dependency of dependencies) {
|
|
172
|
+
if (!isPlainObject(dependency) || Object.keys(dependency).sort().join(",") != "module,range") {
|
|
173
|
+
invalidProvider(`Stdlib provider '${identity}' declares an invalid dependency.`);
|
|
174
|
+
}
|
|
175
|
+
const dependencyModule = /** @type {string} */ (dependency.module);
|
|
176
|
+
const dependencyRange = /** @type {string} */ (dependency.range);
|
|
177
|
+
if (typeof dependencyModule != "string" || !/^[a-z][a-z0-9.-]*$/u.test(dependencyModule) ||
|
|
178
|
+
parseStdlibVersionRange(dependencyRange) === null) {
|
|
179
|
+
throw new SemantifoldDiagnostic({
|
|
180
|
+
code: "STDLIB_VERSION_MALFORMED",
|
|
181
|
+
language: target,
|
|
182
|
+
message: `Stdlib provider dependency range '${String(dependencyRange)}' is not a canonical version range.`
|
|
183
|
+
});
|
|
184
|
+
}
|
|
185
|
+
validatedDependencies.push({ module: dependencyModule, range: /** @type {string} */ (dependencyRange) });
|
|
186
|
+
}
|
|
187
|
+
const runtimeProfile = /** @type {string} */ (candidate.runtimeProfile);
|
|
188
|
+
if (typeof runtimeProfile != "string" || !/^[a-z][a-z0-9-]*-v[1-9][0-9]*$/u.test(runtimeProfile)) {
|
|
189
|
+
invalidProvider(`Stdlib provider '${identity}' declares an invalid runtime profile.`);
|
|
190
|
+
}
|
|
191
|
+
if (module != probeIdentity && (target != "php" || runtimeProfile != "php82-core-streams-v1")) {
|
|
192
|
+
invalidProvider(`Stdlib provider '${identity}' does not use the Task 037 PHP 8.2 core-streams profile.`);
|
|
193
|
+
}
|
|
194
|
+
return deepFreeze(/** @type {StdlibProviderRecord} */ ({
|
|
195
|
+
artifact: { mediaType, path },
|
|
196
|
+
dependencies: validatedDependencies,
|
|
197
|
+
identity,
|
|
198
|
+
nativeEntries: Object.freeze(Object.fromEntries(operationList.map((operation) => [
|
|
199
|
+
operation,
|
|
200
|
+
/** @type {string} */ (nativeEntries[operation])
|
|
201
|
+
]))),
|
|
202
|
+
provides: [{ module, operations: operationList, version: /** @type {string} */ (version) }],
|
|
203
|
+
runtimeProfile,
|
|
204
|
+
target
|
|
205
|
+
}));
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Checks the provisioned module version and operations against the canonical contract registry.
|
|
209
|
+
* @param {string} module - Canonical module identity.
|
|
210
|
+
* @param {string} version - Strict provider version.
|
|
211
|
+
* @param {string[]} operations - Provided operations.
|
|
212
|
+
* @returns {void}
|
|
213
|
+
*/
|
|
214
|
+
function validateProvision(module, version, operations) {
|
|
215
|
+
const listed = listStdlibModules().find(({ identity }) => identity == module);
|
|
216
|
+
if (!listed || !listed.versions.includes(version)) {
|
|
217
|
+
invalidProvider(`Stdlib provider version '${version}' is not registered for module '${module}'.`);
|
|
218
|
+
}
|
|
219
|
+
const declared = new Set(resolveStdlibModule(module, version).operations.map(({ name }) => name));
|
|
220
|
+
for (const operation of operations) {
|
|
221
|
+
if (!declared.has(operation)) {
|
|
222
|
+
throw new SemantifoldDiagnostic({
|
|
223
|
+
code: "STDLIB_OPERATION_UNDECLARED",
|
|
224
|
+
language: module,
|
|
225
|
+
message: `Operation '${operation}' is not declared by canonical module '${module}'.`
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Reports whether a target is registered with the provider role.
|
|
232
|
+
* @param {unknown} target - Candidate target identity.
|
|
233
|
+
* @returns {boolean} Whether the target adopts the provider role.
|
|
234
|
+
*/
|
|
235
|
+
function providerTargetRegistered(target) {
|
|
236
|
+
if (typeof target != "string")
|
|
237
|
+
return false;
|
|
238
|
+
try {
|
|
239
|
+
return languageRegistry.record(target).provider === true;
|
|
240
|
+
}
|
|
241
|
+
catch {
|
|
242
|
+
return false;
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Reports whether a module identity is known to the built-in canonical contract registry.
|
|
247
|
+
* @param {string} module - Canonical module identity.
|
|
248
|
+
* @returns {boolean} Whether the identity resolves.
|
|
249
|
+
*/
|
|
250
|
+
function moduleKnown(module) {
|
|
251
|
+
try {
|
|
252
|
+
resolveStdlibModule(module);
|
|
253
|
+
return true;
|
|
254
|
+
}
|
|
255
|
+
catch {
|
|
256
|
+
return false;
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
/**
|
|
260
|
+
* Builds the built-in provider records for the adopted targets.
|
|
261
|
+
* @returns {unknown[]} Unvalidated built-in records.
|
|
262
|
+
*/
|
|
263
|
+
function builtinProviderRecords() {
|
|
264
|
+
const probeProviders = builtinProviderTargets.map((target) => ({
|
|
265
|
+
artifact: {
|
|
266
|
+
mediaType: /** @type {string} */ (languageRegistry.record(target).mediaType),
|
|
267
|
+
path: `providers/${target}/${probeIdentity.replaceAll(".", "/")}.${targetExtensions[target]}`
|
|
268
|
+
},
|
|
269
|
+
dependencies: [],
|
|
270
|
+
identity: `semantifold.provider.${target}.${probeIdentity}`,
|
|
271
|
+
nativeEntries: Object.fromEntries(probeOperations.map((operation) => [operation, protectedEntryName(target, operation)])),
|
|
272
|
+
provides: [{ module: probeIdentity, operations: [...probeOperations], version: "1.0.0" }],
|
|
273
|
+
runtimeProfile: legacyRuntimeProfiles[target],
|
|
274
|
+
target
|
|
275
|
+
}));
|
|
276
|
+
const task037Providers = task037ProviderModules.map((module) => ({
|
|
277
|
+
artifact: {
|
|
278
|
+
mediaType: /** @type {string} */ (languageRegistry.record("php").mediaType),
|
|
279
|
+
path: `providers/php/${module.identity.replaceAll(".", "/")}.php`
|
|
280
|
+
},
|
|
281
|
+
dependencies: module.dependencies,
|
|
282
|
+
identity: `semantifold.provider.php.${module.identity}`,
|
|
283
|
+
nativeEntries: Object.fromEntries(module.operations.map((operation) => [
|
|
284
|
+
operation,
|
|
285
|
+
protectedEntryName("php", module.identity, operation)
|
|
286
|
+
])),
|
|
287
|
+
provides: [{ module: module.identity, operations: module.operations, version: "1.0.0" }],
|
|
288
|
+
runtimeProfile: "php82-core-streams-v1",
|
|
289
|
+
target: "php"
|
|
290
|
+
}));
|
|
291
|
+
return [...probeProviders, ...task037Providers];
|
|
292
|
+
}
|
|
293
|
+
/** @type {Readonly<StdlibProviderRegistry> | null} */
|
|
294
|
+
let builtinProviderRegistryValue = null;
|
|
295
|
+
/**
|
|
296
|
+
* Lazily materializes the built-in provider registry after language-registry initialization.
|
|
297
|
+
* @returns {Readonly<StdlibProviderRegistry>} Built-in registry.
|
|
298
|
+
*/
|
|
299
|
+
function builtinProviderRegistry() {
|
|
300
|
+
if (builtinProviderRegistryValue === null) {
|
|
301
|
+
builtinProviderRegistryValue = createStdlibProviderRegistry(builtinProviderRecords());
|
|
302
|
+
}
|
|
303
|
+
return builtinProviderRegistryValue;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Throws a normalized provider-registry diagnostic.
|
|
307
|
+
* @param {string} message - Failure detail.
|
|
308
|
+
* @returns {never} Always throws.
|
|
309
|
+
*/
|
|
310
|
+
function invalidProvider(message) {
|
|
311
|
+
throw new SemantifoldDiagnostic({ code: "STDLIB_PROVIDER_INVALID", language: "stdlib", message });
|
|
312
|
+
}
|
|
313
|
+
/**
|
|
314
|
+
* Checks for an ordinary string-keyed object.
|
|
315
|
+
* @param {unknown} value - Candidate value.
|
|
316
|
+
* @returns {value is Record<string, unknown>} Whether the value is a plain object.
|
|
317
|
+
*/
|
|
318
|
+
function isPlainObject(value) {
|
|
319
|
+
if (typeof value != "object" || value === null)
|
|
320
|
+
return false;
|
|
321
|
+
const prototype = Object.getPrototypeOf(value);
|
|
322
|
+
return prototype === Object.prototype || prototype === null;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Deep-freezes a detached value.
|
|
326
|
+
* @template T
|
|
327
|
+
* @param {T} value - Detached value.
|
|
328
|
+
* @returns {Readonly<T>} Frozen value.
|
|
329
|
+
*/
|
|
330
|
+
function deepFreeze(value) {
|
|
331
|
+
if (typeof value != "object" || value === null || Object.isFrozen(value))
|
|
332
|
+
return /** @type {Readonly<T>} */ (value);
|
|
333
|
+
Object.freeze(value);
|
|
334
|
+
for (const property of Object.getOwnPropertyNames(value)) {
|
|
335
|
+
deepFreeze(/** @type {unknown} */ (/** @type {Record<string, unknown>} */ (value)[property]));
|
|
336
|
+
}
|
|
337
|
+
return /** @type {Readonly<T>} */ (value);
|
|
338
|
+
}
|
|
339
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RkbGliLXByb3ZpZGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zdGRsaWItcHJvdmlkZXJzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsWUFBWSxFQUFDLE1BQU0sWUFBWSxDQUFBO0FBQ3ZDLE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLG9CQUFvQixDQUFBO0FBQ3JELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ3JELE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHdCQUF3QixDQUFBO0FBQ3ZELE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsa0JBQWtCLEVBQ2xCLHVCQUF1QixFQUN2QixrQkFBa0IsRUFDbEIsbUJBQW1CLEVBQ3BCLE1BQU0sc0JBQXNCLENBQUE7QUFFN0IsT0FBTyxFQUFDLGtCQUFrQixFQUFDLE1BQU0sc0JBQXNCLENBQUE7QUFFdkQ7Ozs7Ozs7OztHQVNHO0FBRUg7Ozs7R0FJRztBQUVILE1BQU0sc0JBQXNCLEdBQUcsdUJBQXVCLENBQUE7QUFDdEQsK0NBQStDO0FBQy9DLE1BQU0sZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUNyQyxVQUFVLEVBQUUsSUFBSTtJQUNoQixJQUFJLEVBQUUsTUFBTTtJQUNaLEdBQUcsRUFBRSxLQUFLO0lBQ1YsSUFBSSxFQUFFLElBQUk7SUFDVixVQUFVLEVBQUUsSUFBSTtDQUNqQixDQUFDLENBQUE7QUFDRixNQUFNLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUFLLEVBQUUsTUFBTSxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQTtBQUNqRyxNQUFNLGFBQWEsR0FBRyxvQ0FBb0MsQ0FBQTtBQUMxRCxNQUFNLGVBQWUsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxFQUFFLGNBQWMsRUFBRSxX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LENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQztRQUFFLE9BQU8sMEJBQTBCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNuSCxNQUFNLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBRXBCLEtBQUssTUFBTSxRQUFRLElBQUksTUFBTSxDQUFDLG1CQUFtQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7UUFDekQsVUFBVSxDQUFDLHNCQUFzQixDQUFDLENBQUUsc0NBQXNDLENBQUMsQ0FBQyxLQUFLLENBQUUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUE7SUFDakcsQ0FBQztJQUNELE9BQU8sMEJBQTBCLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQTtBQUMzQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7aXNEZW5zZUFycmF5fSBmcm9tIFwiLi9hcnJheS5qc1wiXG5pbXBvcnQge2lzU2FmZUFydGlmYWN0UGF0aH0gZnJvbSBcIi4vYXJ0aWZhY3QtcGF0aC5qc1wiXG5pbXBvcnQge1NlbWFudGlmb2xkRGlhZ25vc3RpY30gZnJvbSBcIi4vZGlhZ25vc3RpYy5qc1wiXG5pbXBvcnQge2xhbmd1YWdlUmVnaXN0cnl9IGZyb20gXCIuL2xhbmd1YWdlLXJlZ2lzdHJ5LmpzXCJcbmltcG9ydCB7XG4gIGxpc3RTdGRsaWJNb2R1bGVzLFxuICBwYXJzZVN0ZGxpYlZlcnNpb24sXG4gIHBhcnNlU3RkbGliVmVyc2lvblJhbmdlLFxuICBwcm90ZWN0ZWRFbnRyeU5hbWUsXG4gIHJlc29sdmVTdGRsaWJNb2R1bGVcbn0gZnJvbSBcIi4vc2VtYW50aWMvc3RkbGliLmpzXCJcblxuZXhwb3J0IHtwcm90ZWN0ZWRFbnRyeU5hbWV9IGZyb20gXCIuL3NlbWFudGljL3N0ZGxpYi5qc1wiXG5cbi8qKlxuICogQHR5cGVkZWYgU3RkbGliUHJvdmlkZXJSZWNvcmRcbiAqIEBwcm9wZXJ0eSB7e21lZGlhVHlwZTogc3RyaW5nLCBwYXRoOiBzdHJpbmd9fSBhcnRpZmFjdCAtIEdlbmVyYXRlZCBwcm92aWRlciBhcnRpZmFjdCBkZWNsYXJhdGlvbi5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkge21vZHVsZTogc3RyaW5nLCByYW5nZTogc3RyaW5nfVtdfSBkZXBlbmRlbmNpZXMgLSBDYW5vbmljYWwgbW9kdWxlIGRlcGVuZGVuY2llcyB3aXRoIGRlY2xhcmVkIHJhbmdlcy5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBpZGVudGl0eSAtIFN0YWJsZSBwcm92aWRlciBpZGVudGl0eSByb290ZWQgYXQgdGhlIHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj59IG5hdGl2ZUVudHJpZXMgLSBPcGVyYXRpb24gdG8gcHJvdGVjdGVkIG5hdGl2ZSBlbnRyeSBuYW1lLlxuICogQHByb3BlcnR5IHtyZWFkb25seSB7bW9kdWxlOiBzdHJpbmcsIG9wZXJhdGlvbnM6IHN0cmluZ1tdLCB2ZXJzaW9uOiBzdHJpbmd9W119IHByb3ZpZGVzIC0gRXhhY3RseSBvbmUgcHJvdmlkZWQgY2Fub25pY2FsIG1vZHVsZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBydW50aW1lUHJvZmlsZSAtIENsb3NlZCB0YXJnZXQgcnVudGltZS9wcm92aWRlciBwcm9maWxlLlxuICogQHByb3BlcnR5IHtzdHJpbmd9IHRhcmdldCAtIEFkb3B0ZWQgdGFyZ2V0IGxhbmd1YWdlIGlkZW50aXR5LlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgU3RkbGliUHJvdmlkZXJSZWdpc3RyeVxuICogQHByb3BlcnR5IHtyZWFkb25seSBTdGRsaWJQcm92aWRlclJlY29yZFtdfSByZWNvcmRzIC0gUmVnaXN0ZXJlZCBwcm92aWRlciByZWNvcmRzIGluIHN0YWJsZSBvcmRlci5cbiAqIEBwcm9wZXJ0eSB7eyh0YXJnZXQ6IHN0cmluZywgbW9kdWxlOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHJlYWRvbmx5IFN0ZGxpYlByb3ZpZGVyUmVjb3JkW119fSBwcm92aWRlcnNGb3IgLSBFeGFjdCBwcm92aWRlciBsb29rdXAuXG4gKi9cblxuY29uc3QgcHJvdmlkZXJJZGVudGl0eVByZWZpeCA9IFwic2VtYW50aWZvbGQucHJvdmlkZXIuXCJcbi8qKiBAdHlwZSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj59ICovXG5jb25zdCB0YXJnZXRFeHRlbnNpb25zID0gT2JqZWN0LmZyZWV6ZSh7XG4gIGphdmFzY3JpcHQ6IFwianNcIixcbiAgamF2YTogXCJqYXZhXCIsXG4gIHBocDogXCJwaHBcIixcbiAgcnVieTogXCJyYlwiLFxuICB0eXBlc2NyaXB0OiBcInRzXCJcbn0pXG5jb25zdCBidWlsdGluUHJvdmlkZXJUYXJnZXRzID0gT2JqZWN0LmZyZWV6ZShbXCJwaHBcIiwgXCJydWJ5XCIsIFwiamF2YXNjcmlwdFwiLCBcInR5cGVzY3JpcHRcIiwgXCJqYXZhXCJdKVxuY29uc3QgcHJvYmVJZGVudGl0eSA9IFwic2VtYW50aWZvbGQudGFzazAzNC5yZXNvdXJjZS1wcm9iZVwiXG5jb25zdCBwcm9iZU9wZXJhdGlvbnMgPSBPYmplY3QuZnJlZXplKFtcInByb2JlRWZmZWN0XCIsIFwicHJvYmVBY3F1aXJlXCIsIFwicHJvYmVSZWFkXCIsIFwicHJvYmVDbG9zZVwiLCBcInByb2JlVHJhY2VcIl0pXG5jb25zdCByZWNvcmRLZXlzID0gT2JqZWN0LmZyZWV6ZShbXCJhcnRpZmFjdFwiLCBcImRlcGVuZGVuY2llc1wiLCBcImlkZW50aXR5XCIsIFwibmF0aXZlRW50cmllc1wiLCBcInByb3ZpZGVzXCIsIFwicnVudGltZVByb2ZpbGVcIiwgXCJ0YXJnZXRcIl0pXG5jb25zdCB0YXNrMDM3UHJvdmlkZXJNb2R1bGVzID0gT2JqZWN0LmZyZWV6ZShbXG4gIE9iamVjdC5mcmVlemUoe2RlcGVuZGVuY2llczogW10sIGlkZW50aXR5OiBcInNlbWFudGlmb2xkLnJlc291cmNlXCIsIG9wZXJhdGlvbnM6IFtcInYxX2Nsb3NlXCJdfSksXG4gIE9iamVjdC5mcmVlemUoe2RlcGVuZGVuY2llczogW3ttb2R1bGU6IFwic2VtYW50aWZvbGQucmVzb3VyY2VcIiwgcmFuZ2U6IFwiMVwifV0sIGlkZW50aXR5OiBcInNlbWFudGlmb2xkLnNvY2tldC1jbGllbnRcIiwgb3BlcmF0aW9uczogW1widjFfY29ubmVjdFwiXX0pLFxuICBPYmplY3QuZnJlZXplKHtkZXBlbmRlbmNpZXM6IFt7bW9kdWxlOiBcInNlbWFudGlmb2xkLnJlc291cmNlXCIsIHJhbmdlOiBcIjFcIn1dLCBpZGVudGl0eTogXCJzZW1hbnRpZm9sZC50ZXh0LXN0cmVhbVwiLCBvcGVyYXRpb25zOiBbXCJ2MV9yZWFkX2xpbmVcIl19KSxcbiAgT2JqZWN0LmZyZWV6ZSh7ZGVwZW5kZW5jaWVzOiBbXSwgaWRlbnRpdHk6IFwic2VtYW50aWZvbGQub3V0cHV0XCIsIG9wZXJhdGlvbnM6IFtcInYxX3dyaXRlX2xpbmVcIl19KVxuXSlcbi8qKiBAdHlwZSB7UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nPj59ICovXG5jb25zdCBsZWdhY3lSdW50aW1lUHJvZmlsZXMgPSBPYmplY3QuZnJlZXplKHtcbiAgamF2YXNjcmlwdDogXCJub2RlMjQtY29yZS12MVwiLFxuICBqYXZhOiBcImphdmExNy1jb3JlLXYxXCIsXG4gIHBocDogXCJwaHA4Mi1jb3JlLXYxXCIsXG4gIHJ1Ynk6IFwicnVieTMtY29yZS12MVwiLFxuICB0eXBlc2NyaXB0OiBcIm5vZGUyNC10eXBlc2NyaXB0Ny1jb3JlLXYxXCJcbn0pXG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgdmVyc2lvbmVkIHRhcmdldCBob3N0IHN0ZGxpYiBwcm92aWRlciByZWdpc3RyeS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gcmVjb3JkcyAtIE9yZGVyZWQgcHJvdmlkZXIgcmVjb3JkczsgYnVpbHQtaW4gcHJvdmlkZXJzIGJ5IGRlZmF1bHQuXG4gKiBAcmV0dXJucyB7UmVhZG9ubHk8U3RkbGliUHJvdmlkZXJSZWdpc3RyeT59IEZyb3plbiByZWdpc3RyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0ZGxpYlByb3ZpZGVyUmVnaXN0cnkocmVjb3JkcyA9IGJ1aWx0aW5Qcm92aWRlclJlY29yZHMoKSkge1xuICBpZiAoIWlzRGVuc2VBcnJheShyZWNvcmRzKSkgaW52YWxpZFByb3ZpZGVyKFwiUHJvdmlkZXIgcmVjb3JkcyBtdXN0IGJlIGFuIG9yZGVyZWQgZGVuc2UgYXJyYXkuXCIpXG5cbiAgLyoqIEB0eXBlIHtTdGRsaWJQcm92aWRlclJlY29yZFtdfSAqL1xuICBjb25zdCB2YWxpZGF0ZWQgPSBbXVxuICAvKiogQHR5cGUge1NldDxzdHJpbmc+fSAqL1xuICBjb25zdCBpZGVudGl0aWVzID0gbmV3IFNldCgpXG5cbiAgZm9yIChjb25zdCBjYW5kaWRhdGUgb2YgcmVjb3Jkcykge1xuICAgIGNvbnN0IHJlY29yZCA9IHZhbGlkYXRlUHJvdmlkZXJSZWNvcmQoY2FuZGlkYXRlKVxuXG4gICAgaWYgKGlkZW50aXRpZXMuaGFzKHJlY29yZC5pZGVudGl0eSkpIGludmFsaWRQcm92aWRlcihgRHVwbGljYXRlIHN0ZGxpYiBwcm92aWRlciBpZGVudGl0eSAnJHtyZWNvcmQuaWRlbnRpdHl9Jy5gKVxuICAgIGlkZW50aXRpZXMuYWRkKHJlY29yZC5pZGVudGl0eSlcbiAgICB2YWxpZGF0ZWQucHVzaChyZWNvcmQpXG4gIH1cbiAgY29uc3QgZnJvemVuUmVjb3JkcyA9IGRlZXBGcmVlemUodmFsaWRhdGVkKVxuXG4gIHJldHVybiBPYmplY3QuZnJlZXplKC8qKiBAdHlwZSB7UmVhZG9ubHk8U3RkbGliUHJvdmlkZXJSZWdpc3RyeT59ICovICh7XG4gICAgcmVjb3JkczogZnJvemVuUmVjb3JkcyxcbiAgICBwcm92aWRlcnNGb3IodGFyZ2V0LCBtb2R1bGUsIHZlcnNpb24pIHtcbiAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ICE9IFwic3RyaW5nXCIgfHwgdHlwZW9mIG1vZHVsZSAhPSBcInN0cmluZ1wiIHx8IHR5cGVvZiB2ZXJzaW9uICE9IFwic3RyaW5nXCIpIHJldHVybiBPYmplY3QuZnJlZXplKFtdKVxuICAgICAgcmV0dXJuIE9iamVjdC5mcmVlemUoZnJvemVuUmVjb3Jkcy5maWx0ZXIoKHJlY29yZCkgPT5cbiAgICAgICAgcmVjb3JkLnRhcmdldCA9PSB0YXJnZXQgJiYgcmVjb3JkLnByb3ZpZGVzWzBdLm1vZHVsZSA9PSBtb2R1bGUgJiYgcmVjb3JkLnByb3ZpZGVzWzBdLnZlcnNpb24gPT0gdmVyc2lvbikpXG4gICAgfVxuICB9KSlcbn1cblxuLyoqXG4gKiBMaXN0cyB0aGUgYnVpbHQtaW4gdGFyZ2V0IGhvc3QgcHJvdmlkZXJzIGZvciB0aGUgcHJvYmUgY29udHJhY3QgaW4gc3RhYmxlIHRhcmdldCBvcmRlci5cbiAqIEByZXR1cm5zIHtyZWFkb25seSBTdGRsaWJQcm92aWRlclJlY29yZFtdfSBGcm96ZW4gcHJvdmlkZXIgcmVjb3Jkcy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGxpc3RTdGRsaWJQcm92aWRlcnMoKSB7XG4gIHJldHVybiBidWlsdGluUHJvdmlkZXJSZWdpc3RyeSgpLnJlY29yZHNcbn1cblxuLyoqXG4gKiBBdXRob3JpdGF0aXZlIGJ1aWx0LWluIHByb3ZpZGVyIGxvb2t1cCBrZXllZCBieSBleGFjdCB0YXJnZXQsIG1vZHVsZSwgYW5kIHZlcnNpb24uXG4gKiBAdHlwZSB7e3Byb3ZpZGVyc0Zvcih0YXJnZXQ6IHN0cmluZywgbW9kdWxlOiBzdHJpbmcsIHZlcnNpb246IHN0cmluZyk6IHJlYWRvbmx5IFN0ZGxpYlByb3ZpZGVyUmVjb3JkW119fVxuICovXG5leHBvcnQgY29uc3Qgc3RkbGliUHJvdmlkZXJSZWdpc3RyeSA9IHtcbiAgcHJvdmlkZXJzRm9yKHRhcmdldCwgbW9kdWxlLCB2ZXJzaW9uKSB7XG4gICAgcmV0dXJuIGJ1aWx0aW5Qcm92aWRlclJlZ2lzdHJ5KCkucHJvdmlkZXJzRm9yKHRhcmdldCwgbW9kdWxlLCB2ZXJzaW9uKVxuICB9XG59XG5cbi8qKlxuICogVmFsaWRhdGVzIG9uZSBwcm92aWRlciByZWNvcmQgYWdhaW5zdCB0aGUgdGFyZ2V0IHJvbGVzIGFuZCBjYW5vbmljYWwgY29udHJhY3QgcmVnaXN0cnkuXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZSAtIENhbmRpZGF0ZSByZWNvcmQuXG4gKiBAcmV0dXJucyB7U3RkbGliUHJvdmlkZXJSZWNvcmR9IERldGFjaGVkIGZyb3plbiByZWNvcmQuXG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvdmlkZXJSZWNvcmQoY2FuZGlkYXRlKSB7XG4gIGlmICghaXNQbGFpbk9iamVjdChjYW5kaWRhdGUpKSBpbnZhbGlkUHJvdmlkZXIoXCJFdmVyeSBzdGRsaWIgcHJvdmlkZXIgcmVjb3JkIG11c3QgYmUgYSBwbGFpbiBvYmplY3QuXCIpXG4gIGlmIChPYmplY3Qua2V5cyhjYW5kaWRhdGUpLnNvcnQoKS5qb2luKFwiLFwiKSAhPSByZWNvcmRLZXlzLmpvaW4oXCIsXCIpKSB7XG4gICAgaW52YWxpZFByb3ZpZGVyKFwiRXZlcnkgc3RkbGliIHByb3ZpZGVyIHJlY29yZCBkZWNsYXJlcyB0aGUgZXhhY3QgcHJvdmlkZXIgcmVjb3JkIGZpZWxkcy5cIilcbiAgfVxuICBjb25zdCB0YXJnZXQgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGNhbmRpZGF0ZS50YXJnZXQpXG5cbiAgaWYgKHR5cGVvZiB0YXJnZXQgIT0gXCJzdHJpbmdcIiB8fCAhcHJvdmlkZXJUYXJnZXRSZWdpc3RlcmVkKHRhcmdldCkpIHtcbiAgICBpbnZhbGlkUHJvdmlkZXIoYFN0ZGxpYiBwcm92aWRlciB0YXJnZXQgJyR7U3RyaW5nKHRhcmdldCl9JyBpcyBub3QgYW4gYWRvcHRlZCB0YXJnZXQgaG9zdCBwcm92aWRlci5gKVxuICB9XG4gIGNvbnN0IGlkZW50aXR5ID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChjYW5kaWRhdGUuaWRlbnRpdHkpXG4gIGNvbnN0IGlkZW50aXR5UHJlZml4ID0gcHJvdmlkZXJJZGVudGl0eVByZWZpeCArIHRhcmdldCArIFwiLlwiXG5cbiAgaWYgKHR5cGVvZiBpZGVudGl0eSAhPSBcInN0cmluZ1wiIHx8ICFpZGVudGl0eS5zdGFydHNXaXRoKGlkZW50aXR5UHJlZml4KSB8fCBpZGVudGl0eS5sZW5ndGggPT0gaWRlbnRpdHlQcmVmaXgubGVuZ3RoKSB7XG4gICAgaW52YWxpZFByb3ZpZGVyKGBTdGRsaWIgcHJvdmlkZXIgaWRlbnRpdHkgJyR7U3RyaW5nKGlkZW50aXR5KX0nIG11c3QgYmUgcm9vdGVkIGF0ICcke2lkZW50aXR5UHJlZml4fScuYClcbiAgfVxuICBjb25zdCBwcm92aWRlcyA9IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGNhbmRpZGF0ZS5wcm92aWRlcylcblxuICBpZiAoIWlzRGVuc2VBcnJheShwcm92aWRlcykgfHwgcHJvdmlkZXMubGVuZ3RoICE9IDEpIGludmFsaWRQcm92aWRlcihcIkV2ZXJ5IHN0ZGxpYiBwcm92aWRlciBwcm92aWRlcyBleGFjdGx5IG9uZSBjYW5vbmljYWwgbW9kdWxlLlwiKVxuICBjb25zdCBwcm92aXNpb24gPSAvKiogQHR5cGUge3Vua25vd259ICovIChwcm92aWRlc1swXSlcblxuICBpZiAoIWlzUGxhaW5PYmplY3QocHJvdmlzaW9uKSB8fCBPYmplY3Qua2V5cyhwcm92aXNpb24pLnNvcnQoKS5qb2luKFwiLFwiKSAhPSBcIm1vZHVsZSxvcGVyYXRpb25zLHZlcnNpb25cIikge1xuICAgIGludmFsaWRQcm92aWRlcihcIkV2ZXJ5IHN0ZGxpYiBwcm92aWRlciBwcm92aXNpb24gZGVjbGFyZXMgdGhlIGV4YWN0IHByb3Zpc2lvbiBmaWVsZHMuXCIpXG4gIH1cbiAgY29uc3QgbW9kdWxlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwcm92aXNpb24ubW9kdWxlKVxuXG4gIGlmICh0eXBlb2YgbW9kdWxlICE9IFwic3RyaW5nXCIgfHwgIS9eW2Etel1bYS16MC05Li1dKiQvdS50ZXN0KG1vZHVsZSkpIHtcbiAgICBpbnZhbGlkUHJvdmlkZXIoYFN0ZGxpYiBwcm92aWRlciBtb2R1bGUgJyR7U3RyaW5nKG1vZHVsZSl9JyBpcyBub3QgYSBjYW5vbmljYWwgaWRlbnRpdHkuYClcbiAgfVxuICBjb25zdCB2ZXJzaW9uID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChwcm92aXNpb24udmVyc2lvbilcblxuICBpZiAocGFyc2VTdGRsaWJWZXJzaW9uKHZlcnNpb24pID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICBjb2RlOiBcIlNURExJQl9WRVJTSU9OX01BTEZPUk1FRFwiLFxuICAgICAgbGFuZ3VhZ2U6IHRhcmdldCxcbiAgICAgIG1lc3NhZ2U6IGBTdGRsaWIgcHJvdmlkZXIgdmVyc2lvbiAnJHtTdHJpbmcodmVyc2lvbil9JyBpcyBub3QgYSBzdHJpY3Qgc2VtYW50aWMgdmVyc2lvbi5gXG4gICAgfSlcbiAgfVxuICBjb25zdCBvcGVyYXRpb25zID0gLyoqIEB0eXBlIHt1bmtub3dufSAqLyAocHJvdmlzaW9uLm9wZXJhdGlvbnMpXG5cbiAgaWYgKCFpc0RlbnNlQXJyYXkob3BlcmF0aW9ucykgfHwgb3BlcmF0aW9ucy5sZW5ndGggPT0gMCB8fCAhb3BlcmF0aW9ucy5ldmVyeSgob3BlcmF0aW9uKSA9PlxuICAgIHR5cGVvZiBvcGVyYXRpb24gPT0gXCJzdHJpbmdcIiAmJiAvXltBLVphLXpfXVtBLVphLXowLTlfXSokL3UudGVzdChvcGVyYXRpb24pKSB8fFxuICAgIG5ldyBTZXQoLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKG9wZXJhdGlvbnMpKS5zaXplICE9IG9wZXJhdGlvbnMubGVuZ3RoKSB7XG4gICAgaW52YWxpZFByb3ZpZGVyKGBTdGRsaWIgcHJvdmlkZXIgJyR7aWRlbnRpdHl9JyBkZWNsYXJlcyBpbnZhbGlkIG9wZXJhdGlvbnMuYClcbiAgfVxuICBjb25zdCBvcGVyYXRpb25MaXN0ID0gLyoqIEB0eXBlIHtzdHJpbmdbXX0gKi8gKG9wZXJhdGlvbnMpXG5cbiAgaWYgKG1vZHVsZUtub3duKG1vZHVsZSkpIHZhbGlkYXRlUHJvdmlzaW9uKG1vZHVsZSwgdmVyc2lvbiwgb3BlcmF0aW9uTGlzdClcbiAgY29uc3QgbmF0aXZlRW50cmllcyA9IC8qKiBAdHlwZSB7dW5rbm93bn0gKi8gKGNhbmRpZGF0ZS5uYXRpdmVFbnRyaWVzKVxuXG4gIGlmICghaXNQbGFpbk9iamVjdChuYXRpdmVFbnRyaWVzKSB8fCBPYmplY3Qua2V5cyhuYXRpdmVFbnRyaWVzKS5zb3J0KCkuam9pbihcIixcIikgIT1cbiAgICBbLi4ub3BlcmF0aW9uTGlzdF0uc29ydCgpLmpvaW4oXCIsXCIpKSB7XG4gICAgaW52YWxpZFByb3ZpZGVyKGBTdGRsaWIgcHJvdmlkZXIgJyR7aWRlbnRpdHl9JyBuYXRpdmUgZW50cmllcyBtdXN0IG1hdGNoIGl0cyBvcGVyYXRpb25zIGV4YWN0bHkuYClcbiAgfVxuICBmb3IgKGNvbnN0IG9wZXJhdGlvbiBvZiBvcGVyYXRpb25MaXN0KSB7XG4gICAgY29uc3QgZXhwZWN0ZWRFbnRyeSA9IG1vZHVsZSA9PSBwcm9iZUlkZW50aXR5XG4gICAgICA/IHByb3RlY3RlZEVudHJ5TmFtZSh0YXJnZXQsIG9wZXJhdGlvbilcbiAgICAgIDogcHJvdGVjdGVkRW50cnlOYW1lKHRhcmdldCwgbW9kdWxlLCBvcGVyYXRpb24pXG5cbiAgICBpZiAoLyoqIEB0eXBlIHtzdHJpbmd9ICovIChuYXRpdmVFbnRyaWVzW29wZXJhdGlvbl0pICE9IGV4cGVjdGVkRW50cnkpIHtcbiAgICAgIGludmFsaWRQcm92aWRlcihgU3RkbGliIHByb3ZpZGVyICcke2lkZW50aXR5fScgZGVjbGFyZXMgYW4gaW52YWxpZCBwcm90ZWN0ZWQgbmF0aXZlIGVudHJ5LmApXG4gICAgfVxuICB9XG4gIGNvbnN0IGFydGlmYWN0ID0gLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoY2FuZGlkYXRlLmFydGlmYWN0KVxuXG4gIGlmICghaXNQbGFpbk9iamVjdChhcnRpZmFjdCkgfHwgT2JqZWN0LmtleXMoYXJ0aWZhY3QpLnNvcnQoKS5qb2luKFwiLFwiKSAhPSBcIm1lZGlhVHlwZSxwYXRoXCIpIHtcbiAgICBpbnZhbGlkUHJvdmlkZXIoYFN0ZGxpYiBwcm92aWRlciAnJHtpZGVudGl0eX0nIGRlY2xhcmVzIGFuIGludmFsaWQgYXJ0aWZhY3QuYClcbiAgfVxuICBjb25zdCBtZWRpYVR5cGUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGFydGlmYWN0Lm1lZGlhVHlwZSlcbiAgY29uc3QgcGF0aCA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoYXJ0aWZhY3QucGF0aClcbiAgY29uc3QgZGVyaXZlZFBhdGggPSBgcHJvdmlkZXJzLyR7dGFyZ2V0fS8ke21vZHVsZS5yZXBsYWNlQWxsKFwiLlwiLCBcIi9cIil9LiR7dGFyZ2V0RXh0ZW5zaW9uc1t0YXJnZXRdfWBcblxuICBpZiAodHlwZW9mIG1lZGlhVHlwZSAhPSBcInN0cmluZ1wiIHx8IG1lZGlhVHlwZS5sZW5ndGggPT0gMCB8fCB0eXBlb2YgcGF0aCAhPSBcInN0cmluZ1wiIHx8XG4gICAgcGF0aCAhPSBkZXJpdmVkUGF0aCB8fCAhaXNTYWZlQXJ0aWZhY3RQYXRoKHBhdGgpKSB7XG4gICAgaW52YWxpZFByb3ZpZGVyKGBTdGRsaWIgcHJvdmlkZXIgJyR7aWRlbnRpdHl9JyBhcnRpZmFjdCBtdXN0IGJlIGdlbmVyYXRlZCBhdCAnJHtkZXJpdmVkUGF0aH0nLmApXG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jaWVzID0gLyoqIEB0eXBlIHt1bmtub3dufSAqLyAoY2FuZGlkYXRlLmRlcGVuZGVuY2llcylcblxuICBpZiAoIWlzRGVuc2VBcnJheShkZXBlbmRlbmNpZXMpKSBpbnZhbGlkUHJvdmlkZXIoYFN0ZGxpYiBwcm92aWRlciAnJHtpZGVudGl0eX0nIGRlcGVuZGVuY2llcyBtdXN0IGJlIGEgZGVuc2UgYXJyYXkuYClcbiAgLyoqIEB0eXBlIHt7bW9kdWxlOiBzdHJpbmcsIHJhbmdlOiBzdHJpbmd9W119ICovXG4gIGNvbnN0IHZhbGlkYXRlZERlcGVuZGVuY2llcyA9IFtdXG5cbiAgZm9yIChjb25zdCBkZXBlbmRlbmN5IG9mIGRlcGVuZGVuY2llcykge1xuICAgIGlmICghaXNQbGFpbk9iamVjdChkZXBlbmRlbmN5KSB8fCBPYmplY3Qua2V5cyhkZXBlbmRlbmN5KS5zb3J0KCkuam9pbihcIixcIikgIT0gXCJtb2R1bGUscmFuZ2VcIikge1xuICAgICAgaW52YWxpZFByb3ZpZGVyKGBTdGRsaWIgcHJvdmlkZXIgJyR7aWRlbnRpdHl9JyBkZWNsYXJlcyBhbiBpbnZhbGlkIGRlcGVuZGVuY3kuYClcbiAgICB9XG4gICAgY29uc3QgZGVwZW5kZW5jeU1vZHVsZSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVwZW5kZW5jeS5tb2R1bGUpXG4gICAgY29uc3QgZGVwZW5kZW5jeVJhbmdlID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChkZXBlbmRlbmN5LnJhbmdlKVxuXG4gICAgaWYgKHR5cGVvZiBkZXBlbmRlbmN5TW9kdWxlICE9IFwic3RyaW5nXCIgfHwgIS9eW2Etel1bYS16MC05Li1dKiQvdS50ZXN0KGRlcGVuZGVuY3lNb2R1bGUpIHx8XG4gICAgICBwYXJzZVN0ZGxpYlZlcnNpb25SYW5nZShkZXBlbmRlbmN5UmFuZ2UpID09PSBudWxsKSB7XG4gICAgICB0aHJvdyBuZXcgU2VtYW50aWZvbGREaWFnbm9zdGljKHtcbiAgICAgICAgY29kZTogXCJTVERMSUJfVkVSU0lPTl9NQUxGT1JNRURcIixcbiAgICAgICAgbGFuZ3VhZ2U6IHRhcmdldCxcbiAgICAgICAgbWVzc2FnZTogYFN0ZGxpYiBwcm92aWRlciBkZXBlbmRlbmN5IHJhbmdlICcke1N0cmluZyhkZXBlbmRlbmN5UmFuZ2UpfScgaXMgbm90IGEgY2Fub25pY2FsIHZlcnNpb24gcmFuZ2UuYFxuICAgICAgfSlcbiAgICB9XG4gICAgdmFsaWRhdGVkRGVwZW5kZW5jaWVzLnB1c2goe21vZHVsZTogZGVwZW5kZW5jeU1vZHVsZSwgcmFuZ2U6IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyAoZGVwZW5kZW5jeVJhbmdlKX0pXG4gIH1cbiAgY29uc3QgcnVudGltZVByb2ZpbGUgPSAvKiogQHR5cGUge3N0cmluZ30gKi8gKGNhbmRpZGF0ZS5ydW50aW1lUHJvZmlsZSlcblxuICBpZiAodHlwZW9mIHJ1bnRpbWVQcm9maWxlICE9IFwic3RyaW5nXCIgfHwgIS9eW2Etel1bYS16MC05LV0qLXZbMS05XVswLTldKiQvdS50ZXN0KHJ1bnRpbWVQcm9maWxlKSkge1xuICAgIGludmFsaWRQcm92aWRlcihgU3RkbGliIHByb3ZpZGVyICcke2lkZW50aXR5fScgZGVjbGFyZXMgYW4gaW52YWxpZCBydW50aW1lIHByb2ZpbGUuYClcbiAgfVxuICBpZiAobW9kdWxlICE9IHByb2JlSWRlbnRpdHkgJiYgKHRhcmdldCAhPSBcInBocFwiIHx8IHJ1bnRpbWVQcm9maWxlICE9IFwicGhwODItY29yZS1zdHJlYW1zLXYxXCIpKSB7XG4gICAgaW52YWxpZFByb3ZpZGVyKGBTdGRsaWIgcHJvdmlkZXIgJyR7aWRlbnRpdHl9JyBkb2VzIG5vdCB1c2UgdGhlIFRhc2sgMDM3IFBIUCA4LjIgY29yZS1zdHJlYW1zIHByb2ZpbGUuYClcbiAgfVxuICByZXR1cm4gZGVlcEZyZWV6ZSgvKiogQHR5cGUge1N0ZGxpYlByb3ZpZGVyUmVjb3JkfSAqLyAoe1xuICAgIGFydGlmYWN0OiB7bWVkaWFUeXBlLCBwYXRofSxcbiAgICBkZXBlbmRlbmNpZXM6IHZhbGlkYXRlZERlcGVuZGVuY2llcyxcbiAgICBpZGVudGl0eSxcbiAgICBuYXRpdmVFbnRyaWVzOiBPYmplY3QuZnJlZXplKE9iamVjdC5mcm9tRW50cmllcyhvcGVyYXRpb25MaXN0Lm1hcCgob3BlcmF0aW9uKSA9PiBbXG4gICAgICBvcGVyYXRpb24sXG4gICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8gKG5hdGl2ZUVudHJpZXNbb3BlcmF0aW9uXSlcbiAgICBdKSkpLFxuICAgIHByb3ZpZGVzOiBbe21vZHVsZSwgb3BlcmF0aW9uczogb3BlcmF0aW9uTGlzdCwgdmVyc2lvbjogLyoqIEB0eXBlIHtzdHJpbmd9ICovICh2ZXJzaW9uKX1dLFxuICAgIHJ1bnRpbWVQcm9maWxlLFxuICAgIHRhcmdldFxuICB9KSlcbn1cblxuLyoqXG4gKiBDaGVja3MgdGhlIHByb3Zpc2lvbmVkIG1vZHVsZSB2ZXJzaW9uIGFuZCBvcGVyYXRpb25zIGFnYWluc3QgdGhlIGNhbm9uaWNhbCBjb250cmFjdCByZWdpc3RyeS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGUgLSBDYW5vbmljYWwgbW9kdWxlIGlkZW50aXR5LlxuICogQHBhcmFtIHtzdHJpbmd9IHZlcnNpb24gLSBTdHJpY3QgcHJvdmlkZXIgdmVyc2lvbi5cbiAqIEBwYXJhbSB7c3RyaW5nW119IG9wZXJhdGlvbnMgLSBQcm92aWRlZCBvcGVyYXRpb25zLlxuICogQHJldHVybnMge3ZvaWR9XG4gKi9cbmZ1bmN0aW9uIHZhbGlkYXRlUHJvdmlzaW9uKG1vZHVsZSwgdmVyc2lvbiwgb3BlcmF0aW9ucykge1xuICBjb25zdCBsaXN0ZWQgPSBsaXN0U3RkbGliTW9kdWxlcygpLmZpbmQoKHtpZGVudGl0eX0pID0+IGlkZW50aXR5ID09IG1vZHVsZSlcblxuICBpZiAoIWxpc3RlZCB8fCAhbGlzdGVkLnZlcnNpb25zLmluY2x1ZGVzKHZlcnNpb24pKSB7XG4gICAgaW52YWxpZFByb3ZpZGVyKGBTdGRsaWIgcHJvdmlkZXIgdmVyc2lvbiAnJHt2ZXJzaW9ufScgaXMgbm90IHJlZ2lzdGVyZWQgZm9yIG1vZHVsZSAnJHttb2R1bGV9Jy5gKVxuICB9XG4gIGNvbnN0IGRlY2xhcmVkID0gbmV3IFNldChyZXNvbHZlU3RkbGliTW9kdWxlKG1vZHVsZSwgdmVyc2lvbikub3BlcmF0aW9ucy5tYXAoKHtuYW1lfSkgPT4gbmFtZSkpXG5cbiAgZm9yIChjb25zdCBvcGVyYXRpb24gb2Ygb3BlcmF0aW9ucykge1xuICAgIGlmICghZGVjbGFyZWQuaGFzKG9wZXJhdGlvbikpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjb2RlOiBcIlNURExJQl9PUEVSQVRJT05fVU5ERUNMQVJFRFwiLFxuICAgICAgICBsYW5ndWFnZTogbW9kdWxlLFxuICAgICAgICBtZXNzYWdlOiBgT3BlcmF0aW9uICcke29wZXJhdGlvbn0nIGlzIG5vdCBkZWNsYXJlZCBieSBjYW5vbmljYWwgbW9kdWxlICcke21vZHVsZX0nLmBcbiAgICAgIH0pXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUmVwb3J0cyB3aGV0aGVyIGEgdGFyZ2V0IGlzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcHJvdmlkZXIgcm9sZS5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdGFyZ2V0IC0gQ2FuZGlkYXRlIHRhcmdldCBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSB0YXJnZXQgYWRvcHRzIHRoZSBwcm92aWRlciByb2xlLlxuICovXG5mdW5jdGlvbiBwcm92aWRlclRhcmdldFJlZ2lzdGVyZWQodGFyZ2V0KSB7XG4gIGlmICh0eXBlb2YgdGFyZ2V0ICE9IFwic3RyaW5nXCIpIHJldHVybiBmYWxzZVxuICB0cnkge1xuICAgIHJldHVybiBsYW5ndWFnZVJlZ2lzdHJ5LnJlY29yZCh0YXJnZXQpLnByb3ZpZGVyID09PSB0cnVlXG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbi8qKlxuICogUmVwb3J0cyB3aGV0aGVyIGEgbW9kdWxlIGlkZW50aXR5IGlzIGtub3duIHRvIHRoZSBidWlsdC1pbiBjYW5vbmljYWwgY29udHJhY3QgcmVnaXN0cnkuXG4gKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlIC0gQ2Fub25pY2FsIG1vZHVsZSBpZGVudGl0eS5cbiAqIEByZXR1cm5zIHtib29sZWFufSBXaGV0aGVyIHRoZSBpZGVudGl0eSByZXNvbHZlcy5cbiAqL1xuZnVuY3Rpb24gbW9kdWxlS25vd24obW9kdWxlKSB7XG4gIHRyeSB7XG4gICAgcmVzb2x2ZVN0ZGxpYk1vZHVsZShtb2R1bGUpXG4gICAgcmV0dXJuIHRydWVcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuLyoqXG4gKiBCdWlsZHMgdGhlIGJ1aWx0LWluIHByb3ZpZGVyIHJlY29yZHMgZm9yIHRoZSBhZG9wdGVkIHRhcmdldHMuXG4gKiBAcmV0dXJucyB7dW5rbm93bltdfSBVbnZhbGlkYXRlZCBidWlsdC1pbiByZWNvcmRzLlxuICovXG5mdW5jdGlvbiBidWlsdGluUHJvdmlkZXJSZWNvcmRzKCkge1xuICBjb25zdCBwcm9iZVByb3ZpZGVycyA9IGJ1aWx0aW5Qcm92aWRlclRhcmdldHMubWFwKCh0YXJnZXQpID0+ICh7XG4gICAgYXJ0aWZhY3Q6IHtcbiAgICAgIG1lZGlhVHlwZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChsYW5ndWFnZVJlZ2lzdHJ5LnJlY29yZCh0YXJnZXQpLm1lZGlhVHlwZSksXG4gICAgICBwYXRoOiBgcHJvdmlkZXJzLyR7dGFyZ2V0fS8ke3Byb2JlSWRlbnRpdHkucmVwbGFjZUFsbChcIi5cIiwgXCIvXCIpfS4ke3RhcmdldEV4dGVuc2lvbnNbdGFyZ2V0XX1gXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IFtdLFxuICAgIGlkZW50aXR5OiBgc2VtYW50aWZvbGQucHJvdmlkZXIuJHt0YXJnZXR9LiR7cHJvYmVJZGVudGl0eX1gLFxuICAgIG5hdGl2ZUVudHJpZXM6IE9iamVjdC5mcm9tRW50cmllcyhwcm9iZU9wZXJhdGlvbnMubWFwKChvcGVyYXRpb24pID0+IFtvcGVyYXRpb24sIHByb3RlY3RlZEVudHJ5TmFtZSh0YXJnZXQsIG9wZXJhdGlvbildKSksXG4gICAgcHJvdmlkZXM6IFt7bW9kdWxlOiBwcm9iZUlkZW50aXR5LCBvcGVyYXRpb25zOiBbLi4ucHJvYmVPcGVyYXRpb25zXSwgdmVyc2lvbjogXCIxLjAuMFwifV0sXG4gICAgcnVudGltZVByb2ZpbGU6IGxlZ2FjeVJ1bnRpbWVQcm9maWxlc1t0YXJnZXRdLFxuICAgIHRhcmdldFxuICB9KSlcbiAgY29uc3QgdGFzazAzN1Byb3ZpZGVycyA9IHRhc2swMzdQcm92aWRlck1vZHVsZXMubWFwKChtb2R1bGUpID0+ICh7XG4gICAgYXJ0aWZhY3Q6IHtcbiAgICAgIG1lZGlhVHlwZTogLyoqIEB0eXBlIHtzdHJpbmd9ICovIChsYW5ndWFnZVJlZ2lzdHJ5LnJlY29yZChcInBocFwiKS5tZWRpYVR5cGUpLFxuICAgICAgcGF0aDogYHByb3ZpZGVycy9waHAvJHttb2R1bGUuaWRlbnRpdHkucmVwbGFjZUFsbChcIi5cIiwgXCIvXCIpfS5waHBgXG4gICAgfSxcbiAgICBkZXBlbmRlbmNpZXM6IG1vZHVsZS5kZXBlbmRlbmNpZXMsXG4gICAgaWRlbnRpdHk6IGBzZW1hbnRpZm9sZC5wcm92aWRlci5waHAuJHttb2R1bGUuaWRlbnRpdHl9YCxcbiAgICBuYXRpdmVFbnRyaWVzOiBPYmplY3QuZnJvbUVudHJpZXMobW9kdWxlLm9wZXJhdGlvbnMubWFwKChvcGVyYXRpb24pID0+IFtcbiAgICAgIG9wZXJhdGlvbixcbiAgICAgIHByb3RlY3RlZEVudHJ5TmFtZShcInBocFwiLCBtb2R1bGUuaWRlbnRpdHksIG9wZXJhdGlvbilcbiAgICBdKSksXG4gICAgcHJvdmlkZXM6IFt7bW9kdWxlOiBtb2R1bGUuaWRlbnRpdHksIG9wZXJhdGlvbnM6IG1vZHVsZS5vcGVyYXRpb25zLCB2ZXJzaW9uOiBcIjEuMC4wXCJ9XSxcbiAgICBydW50aW1lUHJvZmlsZTogXCJwaHA4Mi1jb3JlLXN0cmVhbXMtdjFcIixcbiAgICB0YXJnZXQ6IFwicGhwXCJcbiAgfSkpXG5cbiAgcmV0dXJuIFsuLi5wcm9iZVByb3ZpZGVycywgLi4udGFzazAzN1Byb3ZpZGVyc11cbn1cblxuLyoqIEB0eXBlIHtSZWFkb25seTxTdGRsaWJQcm92aWRlclJlZ2lzdHJ5PiB8IG51bGx9ICovXG5sZXQgYnVpbHRpblByb3ZpZGVyUmVnaXN0cnlWYWx1ZSA9IG51bGxcblxuLyoqXG4gKiBMYXppbHkgbWF0ZXJpYWxpemVzIHRoZSBidWlsdC1pbiBwcm92aWRlciByZWdpc3RyeSBhZnRlciBsYW5ndWFnZS1yZWdpc3RyeSBpbml0aWFsaXphdGlvbi5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxTdGRsaWJQcm92aWRlclJlZ2lzdHJ5Pn0gQnVpbHQtaW4gcmVnaXN0cnkuXG4gKi9cbmZ1bmN0aW9uIGJ1aWx0aW5Qcm92aWRlclJlZ2lzdHJ5KCkge1xuICBpZiAoYnVpbHRpblByb3ZpZGVyUmVnaXN0cnlWYWx1ZSA9PT0gbnVsbCkge1xuICAgIGJ1aWx0aW5Qcm92aWRlclJlZ2lzdHJ5VmFsdWUgPSBjcmVhdGVTdGRsaWJQcm92aWRlclJlZ2lzdHJ5KGJ1aWx0aW5Qcm92aWRlclJlY29yZHMoKSlcbiAgfVxuICByZXR1cm4gYnVpbHRpblByb3ZpZGVyUmVnaXN0cnlWYWx1ZVxufVxuXG4vKipcbiAqIFRocm93cyBhIG5vcm1hbGl6ZWQgcHJvdmlkZXItcmVnaXN0cnkgZGlhZ25vc3RpYy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBtZXNzYWdlIC0gRmFpbHVyZSBkZXRhaWwuXG4gKiBAcmV0dXJucyB7bmV2ZXJ9IEFsd2F5cyB0aHJvd3MuXG4gKi9cbmZ1bmN0aW9uIGludmFsaWRQcm92aWRlcihtZXNzYWdlKSB7XG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe2NvZGU6IFwiU1RETElCX1BST1ZJREVSX0lOVkFMSURcIiwgbGFuZ3VhZ2U6IFwic3RkbGliXCIsIG1lc3NhZ2V9KVxufVxuXG4vKipcbiAqIENoZWNrcyBmb3IgYW4gb3JkaW5hcnkgc3RyaW5nLWtleWVkIG9iamVjdC5cbiAqIEBwYXJhbSB7dW5rbm93bn0gdmFsdWUgLSBDYW5kaWRhdGUgdmFsdWUuXG4gKiBAcmV0dXJucyB7dmFsdWUgaXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj59IFdoZXRoZXIgdGhlIHZhbHVlIGlzIGEgcGxhaW4gb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpc1BsYWluT2JqZWN0KHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlXG4gIGNvbnN0IHByb3RvdHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSlcblxuICByZXR1cm4gcHJvdG90eXBlID09PSBPYmplY3QucHJvdG90eXBlIHx8IHByb3RvdHlwZSA9PT0gbnVsbFxufVxuXG4vKipcbiAqIERlZXAtZnJlZXplcyBhIGRldGFjaGVkIHZhbHVlLlxuICogQHRlbXBsYXRlIFRcbiAqIEBwYXJhbSB7VH0gdmFsdWUgLSBEZXRhY2hlZCB2YWx1ZS5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxUPn0gRnJvemVuIHZhbHVlLlxuICovXG5mdW5jdGlvbiBkZWVwRnJlZXplKHZhbHVlKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgIT0gXCJvYmplY3RcIiB8fCB2YWx1ZSA9PT0gbnVsbCB8fCBPYmplY3QuaXNGcm96ZW4odmFsdWUpKSByZXR1cm4gLyoqIEB0eXBlIHtSZWFkb25seTxUPn0gKi8gKHZhbHVlKVxuICBPYmplY3QuZnJlZXplKHZhbHVlKVxuXG4gIGZvciAoY29uc3QgcHJvcGVydHkgb2YgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpKSB7XG4gICAgZGVlcEZyZWV6ZSgvKiogQHR5cGUge3Vua25vd259ICovICgoLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gKi8gKHZhbHVlKSlbcHJvcGVydHldKSlcbiAgfVxuICByZXR1cm4gLyoqIEB0eXBlIHtSZWFkb25seTxUPn0gKi8gKHZhbHVlKVxufVxuIl19
|
|
@@ -1,10 +1,22 @@
|
|
|
1
1
|
export declare const canonicalToolchains: {
|
|
2
|
+
dart: {
|
|
3
|
+
canonicalCommand: string;
|
|
4
|
+
overrideEnvironmentVariable: string;
|
|
5
|
+
supportedVersion: RegExp;
|
|
6
|
+
versionArguments: string[];
|
|
7
|
+
};
|
|
2
8
|
php: {
|
|
3
9
|
canonicalCommand: string;
|
|
4
10
|
overrideEnvironmentVariable: string;
|
|
5
11
|
supportedVersion: RegExp;
|
|
6
12
|
versionArguments: string[];
|
|
7
13
|
};
|
|
14
|
+
php82: {
|
|
15
|
+
canonicalCommand: string;
|
|
16
|
+
overrideEnvironmentVariable: string;
|
|
17
|
+
supportedVersion: RegExp;
|
|
18
|
+
versionArguments: string[];
|
|
19
|
+
};
|
|
8
20
|
ruby: {
|
|
9
21
|
canonicalCommand: string;
|
|
10
22
|
overrideEnvironmentVariable: string;
|
|
@@ -35,6 +47,18 @@ export declare const canonicalToolchains: {
|
|
|
35
47
|
supportedVersion: RegExp;
|
|
36
48
|
versionArguments: string[];
|
|
37
49
|
};
|
|
50
|
+
java25: {
|
|
51
|
+
canonicalCommand: string;
|
|
52
|
+
overrideEnvironmentVariable: string;
|
|
53
|
+
supportedVersion: RegExp;
|
|
54
|
+
versionArguments: string[];
|
|
55
|
+
};
|
|
56
|
+
kotlinc: {
|
|
57
|
+
canonicalCommand: string;
|
|
58
|
+
overrideEnvironmentVariable: string;
|
|
59
|
+
supportedVersion: RegExp;
|
|
60
|
+
versionArguments: string[];
|
|
61
|
+
};
|
|
38
62
|
python: {
|
|
39
63
|
canonicalCommand: string;
|
|
40
64
|
overrideEnvironmentVariable: string;
|
|
@@ -65,6 +89,36 @@ export declare const canonicalToolchains: {
|
|
|
65
89
|
supportedVersion: RegExp;
|
|
66
90
|
versionArguments: string[];
|
|
67
91
|
};
|
|
92
|
+
rustc: {
|
|
93
|
+
canonicalCommand: string;
|
|
94
|
+
overrideEnvironmentVariable: string;
|
|
95
|
+
supportedVersion: RegExp;
|
|
96
|
+
versionArguments: string[];
|
|
97
|
+
};
|
|
98
|
+
cargo: {
|
|
99
|
+
canonicalCommand: string;
|
|
100
|
+
overrideEnvironmentVariable: string;
|
|
101
|
+
supportedVersion: RegExp;
|
|
102
|
+
versionArguments: string[];
|
|
103
|
+
};
|
|
104
|
+
swiftc: {
|
|
105
|
+
canonicalCommand: string;
|
|
106
|
+
overrideEnvironmentVariable: string;
|
|
107
|
+
supportedVersion: RegExp;
|
|
108
|
+
versionArguments: string[];
|
|
109
|
+
};
|
|
110
|
+
"wasm-validate": {
|
|
111
|
+
canonicalCommand: string;
|
|
112
|
+
overrideEnvironmentVariable: string;
|
|
113
|
+
supportedVersion: RegExp;
|
|
114
|
+
versionArguments: string[];
|
|
115
|
+
};
|
|
116
|
+
chromium: {
|
|
117
|
+
canonicalCommand: string;
|
|
118
|
+
overrideEnvironmentVariable: string;
|
|
119
|
+
supportedVersion: RegExp;
|
|
120
|
+
versionArguments: string[];
|
|
121
|
+
};
|
|
68
122
|
};
|
|
69
123
|
/**
|
|
70
124
|
* Discovers one repository-declared canonical toolchain.
|
|
@@ -84,7 +138,7 @@ export declare function discoverCanonicalToolchain(id: keyof typeof canonicalToo
|
|
|
84
138
|
* @param {Readonly<Record<string, string | undefined>>} [input.environment] - Explicit discovery environment.
|
|
85
139
|
* @param {string} input.id - Toolchain ID.
|
|
86
140
|
* @param {string} [input.override] - Configured absolute executable path.
|
|
87
|
-
* @param {RegExp} [input.supportedVersion] - Full
|
|
141
|
+
* @param {RegExp} [input.supportedVersion] - Full selected-stream version policy.
|
|
88
142
|
* @param {number} [input.timeoutMs] - Version command timeout.
|
|
89
143
|
* @param {string[]} input.versionArguments - Exact version argument array.
|
|
90
144
|
* @returns {Promise<import("./semantic/types.js").DiscoveredToolchain>} Discovered tool.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"toolchains.d.ts","sourceRoot":"","sources":["../../src/toolchains.js"],"names":[],"mappings":"AAYA,eAAO,MAAM,mBAAmB;;
|
|
1
|
+
{"version":3,"file":"toolchains.d.ts","sourceRoot":"","sources":["../../src/toolchains.js"],"names":[],"mappings":"AAYA,eAAO,MAAM,mBAAmB;;0BAmLA,MAAM;qCAA+B,MAAM;0BAAoB,MAAM;0BAAoB,MAAM,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA5J/H,CAAA;AAEF;;;;;GAKG;AACH,wBAAsB,0BAA0B,CAAC,EAAE,EAJxC,MAAM,OAAO,mBAI2B,EAAE,OAAO,AAHzD,CACA,EADQ;IAAC,WAAW,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAG5C,GAFpD,OAAO,CAAC,OAAO,qBAAqB,EAAE,mBAAmB,CAAC,CA+BtE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,iBAAiB,CAAC,KAAK,EAT1C;IAAsB,gBAAgB,EAA9B,MAAM,CACd;IAA6D,WAAW,AAAxE,CACA,EADQ,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CACpD;IAAsB,EAAE,EAAhB,MAAM,CACd;IAAuB,QAAQ,AAA/B,CACA,EADQ,MAAM,CACd;IAAuB,gBAAgB,AAAvC,CACA,EADQ,MAAM,CACd;IAAuB,SAAS,AAAhC,CACA,EADQ,MAAM,CACd;IAAwB,gBAAgB,EAAhC,MAAM,EAAE,CAChB;CAE0C,GAFhC,OAAO,CAAC,OAAO,qBAAqB,EAAE,mBAAmB,CAAC,CAmGtE;AA+HD;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,WAAW,GAHzC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAGqB,GAF9D,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAqB5C"}
|