semantifold 0.9.0 → 0.10.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 +6 -3
- package/bin/semantifold.js +6 -0
- package/build/bin/semantifold.d.ts +3 -0
- package/build/bin/semantifold.d.ts.map +1 -0
- package/build/bin/semantifold.js +5 -0
- package/build/index.d.ts +8 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +9 -1
- package/build/src/artifact-path.d.ts +16 -0
- package/build/src/artifact-path.d.ts.map +1 -1
- package/build/src/artifact-path.js +29 -3
- package/build/src/backends/c-check.d.ts +7 -0
- package/build/src/backends/c-check.d.ts.map +1 -0
- package/build/src/backends/c-check.js +65 -0
- package/build/src/backends/check-plan.d.ts +96 -0
- package/build/src/backends/check-plan.d.ts.map +1 -0
- package/build/src/backends/check-plan.js +135 -0
- package/build/src/backends/cpp-check.d.ts +7 -0
- package/build/src/backends/cpp-check.d.ts.map +1 -0
- package/build/src/backends/cpp-check.js +59 -0
- package/build/src/backends/csharp-check.d.ts +7 -0
- package/build/src/backends/csharp-check.d.ts.map +1 -0
- package/build/src/backends/csharp-check.js +125 -0
- package/build/src/backends/csharp.d.ts +1 -0
- package/build/src/backends/csharp.d.ts.map +1 -1
- package/build/src/backends/csharp.js +5 -4
- package/build/src/backends/dart-check.d.ts +7 -0
- package/build/src/backends/dart-check.d.ts.map +1 -0
- package/build/src/backends/dart-check.js +103 -0
- package/build/src/backends/dart.d.ts +2 -0
- package/build/src/backends/dart.d.ts.map +1 -1
- package/build/src/backends/dart.js +5 -5
- package/build/src/backends/go-check.d.ts +7 -0
- package/build/src/backends/go-check.d.ts.map +1 -0
- package/build/src/backends/go-check.js +77 -0
- package/build/src/backends/go.d.ts +1 -0
- package/build/src/backends/go.d.ts.map +1 -1
- package/build/src/backends/go.js +3 -3
- package/build/src/backends/java-check.d.ts +21 -0
- package/build/src/backends/java-check.d.ts.map +1 -0
- package/build/src/backends/java-check.js +73 -0
- package/build/src/backends/javascript-check.d.ts +7 -0
- package/build/src/backends/javascript-check.d.ts.map +1 -0
- package/build/src/backends/javascript-check.js +29 -0
- package/build/src/backends/kotlin-check.d.ts +7 -0
- package/build/src/backends/kotlin-check.d.ts.map +1 -0
- package/build/src/backends/kotlin-check.js +31 -0
- package/build/src/backends/php-check.d.ts +7 -0
- package/build/src/backends/php-check.d.ts.map +1 -0
- package/build/src/backends/php-check.js +21 -0
- package/build/src/backends/program.d.ts +7 -0
- package/build/src/backends/program.d.ts.map +1 -1
- package/build/src/backends/program.js +16 -1
- package/build/src/backends/python-check.d.ts +7 -0
- package/build/src/backends/python-check.d.ts.map +1 -0
- package/build/src/backends/python-check.js +28 -0
- package/build/src/backends/ruby-check.d.ts +7 -0
- package/build/src/backends/ruby-check.d.ts.map +1 -0
- package/build/src/backends/ruby-check.js +21 -0
- package/build/src/backends/rust-check.d.ts +7 -0
- package/build/src/backends/rust-check.d.ts.map +1 -0
- package/build/src/backends/rust-check.js +65 -0
- package/build/src/backends/swift-check.d.ts +7 -0
- package/build/src/backends/swift-check.d.ts.map +1 -0
- package/build/src/backends/swift-check.js +77 -0
- package/build/src/backends/typescript-check.d.ts +7 -0
- package/build/src/backends/typescript-check.d.ts.map +1 -0
- package/build/src/backends/typescript-check.js +33 -0
- package/build/src/backends/zig-check.d.ts +7 -0
- package/build/src/backends/zig-check.d.ts.map +1 -0
- package/build/src/backends/zig-check.js +70 -0
- package/build/src/diagnostic.d.ts +13 -1
- package/build/src/diagnostic.d.ts.map +1 -1
- package/build/src/diagnostic.js +14 -2
- package/build/src/frontends/program.d.ts +6 -0
- package/build/src/frontends/program.d.ts.map +1 -1
- package/build/src/frontends/program.js +9 -1
- package/build/src/language-registry.d.ts +54 -0
- package/build/src/language-registry.d.ts.map +1 -1
- package/build/src/language-registry.js +107 -5
- package/build/src/project-build.d.ts +172 -0
- package/build/src/project-build.d.ts.map +1 -0
- package/build/src/project-build.js +320 -0
- package/build/src/project-cli.d.ts +40 -0
- package/build/src/project-cli.d.ts.map +1 -0
- package/build/src/project-cli.js +145 -0
- package/build/src/project-manifest.d.ts +148 -0
- package/build/src/project-manifest.d.ts.map +1 -0
- package/build/src/project-manifest.js +432 -0
- package/build/src/project-reporter.d.ts +81 -0
- package/build/src/project-reporter.d.ts.map +1 -0
- package/build/src/project-reporter.js +293 -0
- package/build/src/project-snapshot.d.ts +129 -0
- package/build/src/project-snapshot.d.ts.map +1 -0
- package/build/src/project-snapshot.js +362 -0
- package/build/src/project-watch-reporter.d.ts +125 -0
- package/build/src/project-watch-reporter.d.ts.map +1 -0
- package/build/src/project-watch-reporter.js +280 -0
- package/build/src/project-watch.d.ts +133 -0
- package/build/src/project-watch.d.ts.map +1 -0
- package/build/src/project-watch.js +839 -0
- package/build/src/publication.d.ts +69 -5
- package/build/src/publication.d.ts.map +1 -1
- package/build/src/publication.js +246 -57
- package/build/src/semantic/types.d.ts +303 -2
- package/build/src/semantic/types.d.ts.map +1 -1
- package/build/src/semantic/types.js +79 -2
- package/build/src/subprocess.d.ts +8 -0
- package/build/src/subprocess.d.ts.map +1 -1
- package/build/src/subprocess.js +50 -9
- package/build/src/target-check.d.ts +52 -0
- package/build/src/target-check.d.ts.map +1 -0
- package/build/src/target-check.js +796 -0
- package/build/src/toolchains.d.ts.map +1 -1
- package/build/src/toolchains.js +3 -3
- package/docs/architecture.md +3 -1
- package/docs/c.md +4 -0
- package/docs/cpp.md +4 -0
- package/docs/dart.md +4 -0
- package/docs/generated-artifact-publication.md +11 -8
- package/docs/kotlin.md +2 -2
- package/docs/language-support.md +29 -3
- package/docs/project-build-cli.md +147 -0
- package/docs/project-watch.md +60 -0
- package/docs/rust.md +4 -0
- package/docs/swift.md +2 -0
- package/docs/testing.md +70 -3
- package/docs/watch-build-pipeline.md +39 -23
- package/docs/zig.md +2 -0
- package/examples/jsdoc-java-watch/expected-output.txt +3 -0
- package/examples/jsdoc-java-watch/semantifold.json +23 -0
- package/examples/jsdoc-java-watch/src/main.js +21 -0
- package/index.js +8 -0
- package/package.json +6 -1
- package/src/artifact-path.js +31 -2
- package/src/backends/c-check.js +80 -0
- package/src/backends/check-plan.js +147 -0
- package/src/backends/cpp-check.js +73 -0
- package/src/backends/csharp-check.js +139 -0
- package/src/backends/csharp.js +4 -3
- package/src/backends/dart-check.js +117 -0
- package/src/backends/dart.js +4 -4
- package/src/backends/go-check.js +89 -0
- package/src/backends/go.js +2 -2
- package/src/backends/java-check.js +77 -0
- package/src/backends/javascript-check.js +33 -0
- package/src/backends/kotlin-check.js +41 -0
- package/src/backends/php-check.js +23 -0
- package/src/backends/program.js +17 -0
- package/src/backends/python-check.js +30 -0
- package/src/backends/ruby-check.js +23 -0
- package/src/backends/rust-check.js +78 -0
- package/src/backends/swift-check.js +89 -0
- package/src/backends/typescript-check.js +37 -0
- package/src/backends/zig-check.js +81 -0
- package/src/diagnostic.js +9 -1
- package/src/frontends/program.js +9 -0
- package/src/language-registry.js +113 -4
- package/src/project-build.js +353 -0
- package/src/project-cli.js +155 -0
- package/src/project-manifest.js +479 -0
- package/src/project-reporter.js +320 -0
- package/src/project-snapshot.js +403 -0
- package/src/project-watch-reporter.js +303 -0
- package/src/project-watch.js +870 -0
- package/src/publication.js +275 -58
- package/src/semantic/types.js +87 -1
- package/src/subprocess.js +49 -8
- package/src/target-check.js +844 -0
- package/src/toolchains.js +3 -2
- package/tsconfig.json +1 -1
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { SemantifoldDiagnostic } from "./diagnostic.js";
|
|
3
|
+
import { ProjectBuilder } from "./project-build.js";
|
|
4
|
+
import { ProjectBuildReporter } from "./project-reporter.js";
|
|
5
|
+
import { ProjectWatchCoordinator } from "./project-watch.js";
|
|
6
|
+
import { ProjectWatchReporter } from "./project-watch-reporter.js";
|
|
7
|
+
/**
|
|
8
|
+
* Owns one strict command invocation while delegating durable build behavior.
|
|
9
|
+
*/
|
|
10
|
+
export class SemantifoldCli {
|
|
11
|
+
/** @type {ProjectBuilder} */
|
|
12
|
+
#builder;
|
|
13
|
+
/** @type {ProjectWatchCoordinator} */
|
|
14
|
+
#coordinator;
|
|
15
|
+
/** @type {import("./project-reporter.js").WritableOutput} */
|
|
16
|
+
#stdout;
|
|
17
|
+
/** @type {import("./project-reporter.js").WritableOutput} */
|
|
18
|
+
#stderr;
|
|
19
|
+
/**
|
|
20
|
+
* Creates an importable CLI lifecycle.
|
|
21
|
+
* @param {{builder?: ProjectBuilder, coordinator?: ProjectWatchCoordinator, stderr?: import("./project-reporter.js").WritableOutput, stdout?: import("./project-reporter.js").WritableOutput}} [options] - Collaborators and sinks.
|
|
22
|
+
*/
|
|
23
|
+
constructor(options = {}) {
|
|
24
|
+
this.#builder = options.builder ?? new ProjectBuilder();
|
|
25
|
+
this.#coordinator = options.coordinator ?? new ProjectWatchCoordinator({ builder: this.#builder });
|
|
26
|
+
this.#stdout = options.stdout ?? process.stdout;
|
|
27
|
+
this.#stderr = options.stderr ?? process.stderr;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Runs one command without mutating process exit state.
|
|
31
|
+
* @param {readonly string[]} arguments_ - Arguments after the executable name.
|
|
32
|
+
* @returns {Promise<0 | 1>} Exact process status.
|
|
33
|
+
*/
|
|
34
|
+
async run(arguments_) {
|
|
35
|
+
const hintedFormat = arguments_.includes("--ndjson") ? "ndjson" : "human";
|
|
36
|
+
const watchHint = arguments_[0] == "watch";
|
|
37
|
+
let reporter = watchHint
|
|
38
|
+
? new ProjectWatchReporter({ format: hintedFormat, stderr: this.#stderr, stdout: this.#stdout })
|
|
39
|
+
: new ProjectBuildReporter({ format: hintedFormat, stderr: this.#stderr, stdout: this.#stdout });
|
|
40
|
+
try {
|
|
41
|
+
const options = parseSemantifoldCliArguments(arguments_);
|
|
42
|
+
const command = "command" in options ? options.command : "build";
|
|
43
|
+
if (options.format != hintedFormat) {
|
|
44
|
+
reporter = command == "watch"
|
|
45
|
+
? new ProjectWatchReporter({ format: options.format, stderr: this.#stderr, stdout: this.#stdout })
|
|
46
|
+
: new ProjectBuildReporter({ format: options.format, stderr: this.#stderr, stdout: this.#stdout });
|
|
47
|
+
}
|
|
48
|
+
if (command == "watch") {
|
|
49
|
+
const result = await this.#coordinator.run(options.projectPath, /** @type {ProjectWatchReporter} */ (reporter), {
|
|
50
|
+
check: options.check
|
|
51
|
+
});
|
|
52
|
+
return result.status == "stopped" ? 0 : 1;
|
|
53
|
+
}
|
|
54
|
+
const controller = new AbortController();
|
|
55
|
+
const forwardSignal = () => controller.abort("Semantifold CLI received a termination signal.");
|
|
56
|
+
if (options.check) {
|
|
57
|
+
process.once("SIGINT", forwardSignal);
|
|
58
|
+
process.once("SIGTERM", forwardSignal);
|
|
59
|
+
}
|
|
60
|
+
let result;
|
|
61
|
+
try {
|
|
62
|
+
result = await this.#builder.build(options.projectPath, /** @type {ProjectBuildReporter} */ (reporter), {
|
|
63
|
+
check: options.check,
|
|
64
|
+
...(options.check ? { signal: controller.signal } : {})
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
if (options.check) {
|
|
69
|
+
process.removeListener("SIGINT", forwardSignal);
|
|
70
|
+
process.removeListener("SIGTERM", forwardSignal);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** @type {ProjectBuildReporter} */ (reporter).succeeded(result);
|
|
74
|
+
return 0;
|
|
75
|
+
}
|
|
76
|
+
catch (error) {
|
|
77
|
+
if (reporter instanceof ProjectWatchReporter)
|
|
78
|
+
reporter.watchFailed(error);
|
|
79
|
+
else
|
|
80
|
+
reporter.failed(error);
|
|
81
|
+
return 1;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Parses the intentionally narrow one-shot CLI grammar.
|
|
87
|
+
* @param {readonly string[]} arguments_ - Arguments after the executable name.
|
|
88
|
+
* @returns {Readonly<{check: boolean, format: "human" | "ndjson", projectPath: string}> | Readonly<{command: "watch", check: boolean, format: "human" | "ndjson", projectPath: string}>} Validated command options.
|
|
89
|
+
*/
|
|
90
|
+
export function parseSemantifoldCliArguments(arguments_) {
|
|
91
|
+
if (!Array.isArray(arguments_) || arguments_.length == 0 || arguments_[0] != "build" && arguments_[0] != "watch") {
|
|
92
|
+
invalidArguments("Expected the command 'semantifold build' or 'semantifold watch'.");
|
|
93
|
+
}
|
|
94
|
+
const command = /** @type {"build" | "watch"} */ (arguments_[0]);
|
|
95
|
+
let format = /** @type {"human" | "ndjson"} */ ("human");
|
|
96
|
+
let projectPath = "./semantifold.json";
|
|
97
|
+
let projectSeen = false;
|
|
98
|
+
let ndjsonSeen = false;
|
|
99
|
+
let checkSeen = false;
|
|
100
|
+
for (let index = 1; index < arguments_.length; index += 1) {
|
|
101
|
+
const argument = arguments_[index];
|
|
102
|
+
if (argument == "--check") {
|
|
103
|
+
if (checkSeen)
|
|
104
|
+
invalidArguments("Option '--check' may be supplied only once.");
|
|
105
|
+
checkSeen = true;
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (argument == "--ndjson") {
|
|
109
|
+
if (ndjsonSeen)
|
|
110
|
+
invalidArguments("Option '--ndjson' may be supplied only once.");
|
|
111
|
+
ndjsonSeen = true;
|
|
112
|
+
format = "ndjson";
|
|
113
|
+
continue;
|
|
114
|
+
}
|
|
115
|
+
if (argument == "--project") {
|
|
116
|
+
if (projectSeen)
|
|
117
|
+
invalidArguments("Option '--project' may be supplied only once.");
|
|
118
|
+
const value = arguments_[index + 1];
|
|
119
|
+
if (typeof value != "string" || value.length == 0 || value.startsWith("--")) {
|
|
120
|
+
invalidArguments("Option '--project' requires one path value.");
|
|
121
|
+
}
|
|
122
|
+
projectSeen = true;
|
|
123
|
+
projectPath = value;
|
|
124
|
+
index += 1;
|
|
125
|
+
continue;
|
|
126
|
+
}
|
|
127
|
+
invalidArguments(`Unknown command argument '${argument}'.`);
|
|
128
|
+
}
|
|
129
|
+
return command == "watch"
|
|
130
|
+
? Object.freeze({ command, check: checkSeen, format, projectPath })
|
|
131
|
+
: Object.freeze({ check: checkSeen, format, projectPath });
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Throws one stable CLI grammar diagnostic.
|
|
135
|
+
* @param {string} message - Failure detail.
|
|
136
|
+
* @returns {never} Always throws.
|
|
137
|
+
*/
|
|
138
|
+
function invalidArguments(message) {
|
|
139
|
+
throw new SemantifoldDiagnostic({
|
|
140
|
+
code: "INVALID_CLI_ARGUMENTS",
|
|
141
|
+
language: "cli",
|
|
142
|
+
message
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC1jbGkuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcHJvamVjdC1jbGkuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsWUFBWTtBQUVaLE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ3JELE9BQU8sRUFBQyxjQUFjLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUNqRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSx1QkFBdUIsQ0FBQTtBQUMxRCxPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQTtBQUMxRCxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSw2QkFBNkIsQ0FBQTtBQUVoRTs7R0FFRztBQUNILE1BQU0sT0FBTyxjQUFjO0lBQ3pCLDZCQUE2QjtJQUM3QixRQUFRLENBQUE7SUFDUixzQ0FBc0M7SUFDdEMsWUFBWSxDQUFBO0lBQ1osNkRBQTZEO0lBQzdELE9BQU8sQ0FBQTtJQUNQLDZEQUE2RDtJQUM3RCxPQUFPLENBQUE7SUFFUDs7O09BR0c7SUFDSCxZQUFZLE9BQU8sR0FBRyxFQUFFO1FBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLGNBQWMsRUFBRSxDQUFBO1FBQ3ZELElBQUksQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFdBQVcsSUFBSSxJQUFJLHVCQUF1QixDQUFDLEVBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUMsQ0FBQyxDQUFBO1FBQ2hHLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFBO1FBQy9DLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDLE1BQU0sSUFBSSxPQUFPLENBQUMsTUFBTSxDQUFBO0lBQ2pELENBQUM7SUFFRDs7OztPQUlHO0lBQ0gsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFVO1FBQ2xCLE1BQU0s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Q0FBQztJQUVELE9BQU8sT0FBTyxJQUFJLE9BQU87UUFDdkIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFDLENBQUM7UUFDakUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBQyxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxXQUFXLEVBQUMsQ0FBQyxDQUFBO0FBQzVELENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxnQkFBZ0IsQ0FBQyxPQUFPO0lBQy9CLE1BQU0sSUFBSSxxQkFBcUIsQ0FBQztRQUM5QixJQUFJLEVBQUUsdUJBQXVCO1FBQzdCLFFBQVEsRUFBRSxLQUFLO1FBQ2YsT0FBTztLQUNSLENBQUMsQ0FBQTtBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBAdHMtY2hlY2tcblxuaW1wb3J0IHtTZW1hbnRpZm9sZERpYWdub3N0aWN9IGZyb20gXCIuL2RpYWdub3N0aWMuanNcIlxuaW1wb3J0IHtQcm9qZWN0QnVpbGRlcn0gZnJvbSBcIi4vcHJvamVjdC1idWlsZC5qc1wiXG5pbXBvcnQge1Byb2plY3RCdWlsZFJlcG9ydGVyfSBmcm9tIFwiLi9wcm9qZWN0LXJlcG9ydGVyLmpzXCJcbmltcG9ydCB7UHJvamVjdFdhdGNoQ29vcmRpbmF0b3J9IGZyb20gXCIuL3Byb2plY3Qtd2F0Y2guanNcIlxuaW1wb3J0IHtQcm9qZWN0V2F0Y2hSZXBvcnRlcn0gZnJvbSBcIi4vcHJvamVjdC13YXRjaC1yZXBvcnRlci5qc1wiXG5cbi8qKlxuICogT3ducyBvbmUgc3RyaWN0IGNvbW1hbmQgaW52b2NhdGlvbiB3aGlsZSBkZWxlZ2F0aW5nIGR1cmFibGUgYnVpbGQgYmVoYXZpb3IuXG4gKi9cbmV4cG9ydCBjbGFzcyBTZW1hbnRpZm9sZENsaSB7XG4gIC8qKiBAdHlwZSB7UHJvamVjdEJ1aWxkZXJ9ICovXG4gICNidWlsZGVyXG4gIC8qKiBAdHlwZSB7UHJvamVjdFdhdGNoQ29vcmRpbmF0b3J9ICovXG4gICNjb29yZGluYXRvclxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vcHJvamVjdC1yZXBvcnRlci5qc1wiKS5Xcml0YWJsZU91dHB1dH0gKi9cbiAgI3N0ZG91dFxuICAvKiogQHR5cGUge2ltcG9ydChcIi4vcHJvamVjdC1yZXBvcnRlci5qc1wiKS5Xcml0YWJsZU91dHB1dH0gKi9cbiAgI3N0ZGVyclxuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGFuIGltcG9ydGFibGUgQ0xJIGxpZmVjeWNsZS5cbiAgICogQHBhcmFtIHt7YnVpbGRlcj86IFByb2plY3RCdWlsZGVyLCBjb29yZGluYXRvcj86IFByb2plY3RXYXRjaENvb3JkaW5hdG9yLCBzdGRlcnI/OiBpbXBvcnQoXCIuL3Byb2plY3QtcmVwb3J0ZXIuanNcIikuV3JpdGFibGVPdXRwdXQsIHN0ZG91dD86IGltcG9ydChcIi4vcHJvamVjdC1yZXBvcnRlci5qc1wiKS5Xcml0YWJsZU91dHB1dH19IFtvcHRpb25zXSAtIENvbGxhYm9yYXRvcnMgYW5kIHNpbmtzLlxuICAgKi9cbiAgY29uc3RydWN0b3Iob3B0aW9ucyA9IHt9KSB7XG4gICAgdGhpcy4jYnVpbGRlciA9IG9wdGlvbnMuYnVpbGRlciA/PyBuZXcgUHJvamVjdEJ1aWxkZXIoKVxuICAgIHRoaXMuI2Nvb3JkaW5hdG9yID0gb3B0aW9ucy5jb29yZGluYXRvciA/PyBuZXcgUHJvamVjdFdhdGNoQ29vcmRpbmF0b3Ioe2J1aWxkZXI6IHRoaXMuI2J1aWxkZXJ9KVxuICAgIHRoaXMuI3N0ZG91dCA9IG9wdGlvbnMuc3Rkb3V0ID8/IHByb2Nlc3Muc3Rkb3V0XG4gICAgdGhpcy4jc3RkZXJyID0gb3B0aW9ucy5zdGRlcnIgPz8gcHJvY2Vzcy5zdGRlcnJcbiAgfVxuXG4gIC8qKlxuICAgKiBSdW5zIG9uZSBjb21tYW5kIHdpdGhvdXQgbXV0YXRpbmcgcHJvY2VzcyBleGl0IHN0YXRlLlxuICAgKiBAcGFyYW0ge3JlYWRvbmx5IHN0cmluZ1tdfSBhcmd1bWVudHNfIC0gQXJndW1lbnRzIGFmdGVyIHRoZSBleGVjdXRhYmxlIG5hbWUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPDAgfCAxPn0gRXhhY3QgcHJvY2VzcyBzdGF0dXMuXG4gICAqL1xuICBhc3luYyBydW4oYXJndW1lbnRzXykge1xuICAgIGNvbnN0IGhpbnRlZEZvcm1hdCA9IGFyZ3VtZW50c18uaW5jbHVkZXMoXCItLW5kanNvblwiKSA/IFwibmRqc29uXCIgOiBcImh1bWFuXCJcbiAgICBjb25zdCB3YXRjaEhpbnQgPSBhcmd1bWVudHNfWzBdID09IFwid2F0Y2hcIlxuICAgIGxldCByZXBvcnRlciA9IHdhdGNoSGludFxuICAgICAgPyBuZXcgUHJvamVjdFdhdGNoUmVwb3J0ZXIoe2Zvcm1hdDogaGludGVkRm9ybWF0LCBzdGRlcnI6IHRoaXMuI3N0ZGVyciwgc3Rkb3V0OiB0aGlzLiNzdGRvdXR9KVxuICAgICAgOiBuZXcgUHJvamVjdEJ1aWxkUmVwb3J0ZXIoe2Zvcm1hdDogaGludGVkRm9ybWF0LCBzdGRlcnI6IHRoaXMuI3N0ZGVyciwgc3Rkb3V0OiB0aGlzLiNzdGRvdXR9KVxuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IG9wdGlvbnMgPSBwYXJzZVNlbWFudGlmb2xkQ2xpQXJndW1lbnRzKGFyZ3VtZW50c18pXG4gICAgICBjb25zdCBjb21tYW5kID0gXCJjb21tYW5kXCIgaW4gb3B0aW9ucyA/IG9wdGlvbnMuY29tbWFuZCA6IFwiYnVpbGRcIlxuXG4gICAgICBpZiAob3B0aW9ucy5mb3JtYXQgIT0gaGludGVkRm9ybWF0KSB7XG4gICAgICAgIHJlcG9ydGVyID0gY29tbWFuZCA9PSBcIndhdGNoXCJcbiAgICAgICAgICA/IG5ldyBQcm9qZWN0V2F0Y2hSZXBvcnRlcih7Zm9ybWF0OiBvcHRpb25zLmZvcm1hdCwgc3RkZXJyOiB0aGlzLiNzdGRlcnIsIHN0ZG91dDogdGhpcy4jc3Rkb3V0fSlcbiAgICAgICAgICA6IG5ldyBQcm9qZWN0QnVpbGRSZXBvcnRlcih7Zm9ybWF0OiBvcHRpb25zLmZvcm1hdCwgc3RkZXJyOiB0aGlzLiNzdGRlcnIsIHN0ZG91dDogdGhpcy4jc3Rkb3V0fSlcbiAgICAgIH1cbiAgICAgIGlmIChjb21tYW5kID09IFwid2F0Y2hcIikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCB0aGlzLiNjb29yZGluYXRvci5ydW4ob3B0aW9ucy5wcm9qZWN0UGF0aCwgLyoqIEB0eXBlIHtQcm9qZWN0V2F0Y2hSZXBvcnRlcn0gKi8gKHJlcG9ydGVyKSwge1xuICAgICAgICAgIGNoZWNrOiBvcHRpb25zLmNoZWNrXG4gICAgICAgIH0pXG5cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5zdGF0dXMgPT0gXCJzdG9wcGVkXCIgPyAwIDogMVxuICAgICAgfVxuICAgICAgY29uc3QgY29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKVxuICAgICAgY29uc3QgZm9yd2FyZFNpZ25hbCA9ICgpID0+IGNvbnRyb2xsZXIuYWJvcnQoXCJTZW1hbnRpZm9sZCBDTEkgcmVjZWl2ZWQgYSB0ZXJtaW5hdGlvbiBzaWduYWwuXCIpXG5cbiAgICAgIGlmIChvcHRpb25zLmNoZWNrKSB7XG4gICAgICAgIHByb2Nlc3Mub25jZShcIlNJR0lOVFwiLCBmb3J3YXJkU2lnbmFsKVxuICAgICAgICBwcm9jZXNzLm9uY2UoXCJTSUdURVJNXCIsIGZvcndhcmRTaWduYWwpXG4gICAgICB9XG4gICAgICBsZXQgcmVzdWx0XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIHJlc3VsdCA9IGF3YWl0IHRoaXMuI2J1aWxkZXIuYnVpbGQob3B0aW9ucy5wcm9qZWN0UGF0aCwgLyoqIEB0eXBlIHtQcm9qZWN0QnVpbGRSZXBvcnRlcn0gKi8gKHJlcG9ydGVyKSwge1xuICAgICAgICAgIGNoZWNrOiBvcHRpb25zLmNoZWNrLFxuICAgICAgICAgIC4uLihvcHRpb25zLmNoZWNrID8ge3NpZ25hbDogY29udHJvbGxlci5zaWduYWx9IDoge30pXG4gICAgICAgIH0pXG4gICAgICB9IGZpbmFsbHkge1xuICAgICAgICBpZiAob3B0aW9ucy5jaGVjaykge1xuICAgICAgICAgIHByb2Nlc3MucmVtb3ZlTGlzdGVuZXIoXCJTSUdJTlRcIiwgZm9yd2FyZFNpZ25hbClcbiAgICAgICAgICBwcm9jZXNzLnJlbW92ZUxpc3RlbmVyKFwiU0lHVEVSTVwiLCBmb3J3YXJkU2lnbmFsKVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8qKiBAdHlwZSB7UHJvamVjdEJ1aWxkUmVwb3J0ZXJ9ICovIChyZXBvcnRlcikuc3VjY2VlZGVkKHJlc3VsdClcblxuICAgICAgcmV0dXJuIDBcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgaWYgKHJlcG9ydGVyIGluc3RhbmNlb2YgUHJvamVjdFdhdGNoUmVwb3J0ZXIpIHJlcG9ydGVyLndhdGNoRmFpbGVkKGVycm9yKVxuICAgICAgZWxzZSByZXBvcnRlci5mYWlsZWQoZXJyb3IpXG5cbiAgICAgIHJldHVybiAxXG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogUGFyc2VzIHRoZSBpbnRlbnRpb25hbGx5IG5hcnJvdyBvbmUtc2hvdCBDTEkgZ3JhbW1hci5cbiAqIEBwYXJhbSB7cmVhZG9ubHkgc3RyaW5nW119IGFyZ3VtZW50c18gLSBBcmd1bWVudHMgYWZ0ZXIgdGhlIGV4ZWN1dGFibGUgbmFtZS5cbiAqIEByZXR1cm5zIHtSZWFkb25seTx7Y2hlY2s6IGJvb2xlYW4sIGZvcm1hdDogXCJodW1hblwiIHwgXCJuZGpzb25cIiwgcHJvamVjdFBhdGg6IHN0cmluZ30+IHwgUmVhZG9ubHk8e2NvbW1hbmQ6IFwid2F0Y2hcIiwgY2hlY2s6IGJvb2xlYW4sIGZvcm1hdDogXCJodW1hblwiIHwgXCJuZGpzb25cIiwgcHJvamVjdFBhdGg6IHN0cmluZ30+fSBWYWxpZGF0ZWQgY29tbWFuZCBvcHRpb25zLlxuICovXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VTZW1hbnRpZm9sZENsaUFyZ3VtZW50cyhhcmd1bWVudHNfKSB7XG4gIGlmICghQXJyYXkuaXNBcnJheShhcmd1bWVudHNfKSB8fCBhcmd1bWVudHNfLmxlbmd0aCA9PSAwIHx8IGFyZ3VtZW50c19bMF0gIT0gXCJidWlsZFwiICYmIGFyZ3VtZW50c19bMF0gIT0gXCJ3YXRjaFwiKSB7XG4gICAgaW52YWxpZEFyZ3VtZW50cyhcIkV4cGVjdGVkIHRoZSBjb21tYW5kICdzZW1hbnRpZm9sZCBidWlsZCcgb3IgJ3NlbWFudGlmb2xkIHdhdGNoJy5cIilcbiAgfVxuICBjb25zdCBjb21tYW5kID0gLyoqIEB0eXBlIHtcImJ1aWxkXCIgfCBcIndhdGNoXCJ9ICovIChhcmd1bWVudHNfWzBdKVxuICBsZXQgZm9ybWF0ID0gLyoqIEB0eXBlIHtcImh1bWFuXCIgfCBcIm5kanNvblwifSAqLyAoXCJodW1hblwiKVxuICBsZXQgcHJvamVjdFBhdGggPSBcIi4vc2VtYW50aWZvbGQuanNvblwiXG4gIGxldCBwcm9qZWN0U2VlbiA9IGZhbHNlXG4gIGxldCBuZGpzb25TZWVuID0gZmFsc2VcbiAgbGV0IGNoZWNrU2VlbiA9IGZhbHNlXG5cbiAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50c18ubGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgY29uc3QgYXJndW1lbnQgPSBhcmd1bWVudHNfW2luZGV4XVxuXG4gICAgaWYgKGFyZ3VtZW50ID09IFwiLS1jaGVja1wiKSB7XG4gICAgICBpZiAoY2hlY2tTZWVuKSBpbnZhbGlkQXJndW1lbnRzKFwiT3B0aW9uICctLWNoZWNrJyBtYXkgYmUgc3VwcGxpZWQgb25seSBvbmNlLlwiKVxuICAgICAgY2hlY2tTZWVuID0gdHJ1ZVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaWYgKGFyZ3VtZW50ID09IFwiLS1uZGpzb25cIikge1xuICAgICAgaWYgKG5kanNvblNlZW4pIGludmFsaWRBcmd1bWVudHMoXCJPcHRpb24gJy0tbmRqc29uJyBtYXkgYmUgc3VwcGxpZWQgb25seSBvbmNlLlwiKVxuICAgICAgbmRqc29uU2VlbiA9IHRydWVcbiAgICAgIGZvcm1hdCA9IFwibmRqc29uXCJcbiAgICAgIGNvbnRpbnVlXG4gICAgfVxuICAgIGlmIChhcmd1bWVudCA9PSBcIi0tcHJvamVjdFwiKSB7XG4gICAgICBpZiAocHJvamVjdFNlZW4pIGludmFsaWRBcmd1bWVudHMoXCJPcHRpb24gJy0tcHJvamVjdCcgbWF5IGJlIHN1cHBsaWVkIG9ubHkgb25jZS5cIilcbiAgICAgIGNvbnN0IHZhbHVlID0gYXJndW1lbnRzX1tpbmRleCArIDFdXG5cbiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT0gXCJzdHJpbmdcIiB8fCB2YWx1ZS5sZW5ndGggPT0gMCB8fCB2YWx1ZS5zdGFydHNXaXRoKFwiLS1cIikpIHtcbiAgICAgICAgaW52YWxpZEFyZ3VtZW50cyhcIk9wdGlvbiAnLS1wcm9qZWN0JyByZXF1aXJlcyBvbmUgcGF0aCB2YWx1ZS5cIilcbiAgICAgIH1cbiAgICAgIHByb2plY3RTZWVuID0gdHJ1ZVxuICAgICAgcHJvamVjdFBhdGggPSB2YWx1ZVxuICAgICAgaW5kZXggKz0gMVxuICAgICAgY29udGludWVcbiAgICB9XG4gICAgaW52YWxpZEFyZ3VtZW50cyhgVW5rbm93biBjb21tYW5kIGFyZ3VtZW50ICcke2FyZ3VtZW50fScuYClcbiAgfVxuXG4gIHJldHVybiBjb21tYW5kID09IFwid2F0Y2hcIlxuICAgID8gT2JqZWN0LmZyZWV6ZSh7Y29tbWFuZCwgY2hlY2s6IGNoZWNrU2VlbiwgZm9ybWF0LCBwcm9qZWN0UGF0aH0pXG4gICAgOiBPYmplY3QuZnJlZXplKHtjaGVjazogY2hlY2tTZWVuLCBmb3JtYXQsIHByb2plY3RQYXRofSlcbn1cblxuLyoqXG4gKiBUaHJvd3Mgb25lIHN0YWJsZSBDTEkgZ3JhbW1hciBkaWFnbm9zdGljLlxuICogQHBhcmFtIHtzdHJpbmd9IG1lc3NhZ2UgLSBGYWlsdXJlIGRldGFpbC5cbiAqIEByZXR1cm5zIHtuZXZlcn0gQWx3YXlzIHRocm93cy5cbiAqL1xuZnVuY3Rpb24gaW52YWxpZEFyZ3VtZW50cyhtZXNzYWdlKSB7XG4gIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgIGNvZGU6IFwiSU5WQUxJRF9DTElfQVJHVU1FTlRTXCIsXG4gICAgbGFuZ3VhZ2U6IFwiY2xpXCIsXG4gICAgbWVzc2FnZVxuICB9KVxufVxuIl19
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One validated immutable Semantifold project request.
|
|
3
|
+
*/
|
|
4
|
+
export declare class SemantifoldProject {
|
|
5
|
+
entryModule: string;
|
|
6
|
+
id: string;
|
|
7
|
+
manifestPath: string;
|
|
8
|
+
manifestText: string;
|
|
9
|
+
projectRoot: string;
|
|
10
|
+
publicationRoot: string;
|
|
11
|
+
sources: readonly Readonly<{
|
|
12
|
+
absolutePath: string;
|
|
13
|
+
entry: boolean;
|
|
14
|
+
id: string;
|
|
15
|
+
language: import("./semantic/types.js").SemanticLanguage;
|
|
16
|
+
path: string;
|
|
17
|
+
}>[];
|
|
18
|
+
targets: readonly Readonly<{
|
|
19
|
+
buildProjection: string;
|
|
20
|
+
id: string;
|
|
21
|
+
language: import("./semantic/types.js").BackendLanguage;
|
|
22
|
+
role: import("./semantic/types.js").PublicationTargetRole;
|
|
23
|
+
sourceProjection: string;
|
|
24
|
+
}>[];
|
|
25
|
+
version: 1;
|
|
26
|
+
/**
|
|
27
|
+
* Constructs a trusted normalized project value for the manifest loader.
|
|
28
|
+
* @param {NormalizedProject} value - Validated normalized fields.
|
|
29
|
+
*/
|
|
30
|
+
constructor(value: NormalizedProject);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Loads and validates the strict versioned project-manifest boundary.
|
|
34
|
+
*/
|
|
35
|
+
export declare class ProjectManifestLoader {
|
|
36
|
+
/**
|
|
37
|
+
* Loads one project manifest without reading source content.
|
|
38
|
+
* @param {string} [projectPath] - Manifest path, relative to the process working directory or absolute.
|
|
39
|
+
* @returns {Promise<SemantifoldProject>} Immutable normalized project.
|
|
40
|
+
*/
|
|
41
|
+
load(projectPath?: string): Promise<SemantifoldProject>;
|
|
42
|
+
}
|
|
43
|
+
export type NormalizedProjectSource = {
|
|
44
|
+
/**
|
|
45
|
+
* - Canonical project-absolute file path.
|
|
46
|
+
*/
|
|
47
|
+
absolutePath: string;
|
|
48
|
+
/**
|
|
49
|
+
* - Whether this is the sole entry module.
|
|
50
|
+
*/
|
|
51
|
+
entry: boolean;
|
|
52
|
+
/**
|
|
53
|
+
* - Stable semantic module identity.
|
|
54
|
+
*/
|
|
55
|
+
id: string;
|
|
56
|
+
/**
|
|
57
|
+
* - Registered source language.
|
|
58
|
+
*/
|
|
59
|
+
language: import("./semantic/types.js").SemanticLanguage;
|
|
60
|
+
/**
|
|
61
|
+
* - Canonical project-relative file path.
|
|
62
|
+
*/
|
|
63
|
+
path: string;
|
|
64
|
+
};
|
|
65
|
+
export type NormalizedProjectTarget = {
|
|
66
|
+
/**
|
|
67
|
+
* - Generation-relative reserved build projection.
|
|
68
|
+
*/
|
|
69
|
+
buildProjection: string;
|
|
70
|
+
/**
|
|
71
|
+
* - Stable project target identity.
|
|
72
|
+
*/
|
|
73
|
+
id: string;
|
|
74
|
+
/**
|
|
75
|
+
* - Registered target identity.
|
|
76
|
+
*/
|
|
77
|
+
language: import("./semantic/types.js").BackendLanguage;
|
|
78
|
+
/**
|
|
79
|
+
* - Explicit target role.
|
|
80
|
+
*/
|
|
81
|
+
role: import("./semantic/types.js").PublicationTargetRole;
|
|
82
|
+
/**
|
|
83
|
+
* - Generation-relative generated-source projection.
|
|
84
|
+
*/
|
|
85
|
+
sourceProjection: string;
|
|
86
|
+
};
|
|
87
|
+
export type NormalizedProject = {
|
|
88
|
+
/**
|
|
89
|
+
* - Sole entry module identity.
|
|
90
|
+
*/
|
|
91
|
+
entryModule: string;
|
|
92
|
+
/**
|
|
93
|
+
* - Stable project identity.
|
|
94
|
+
*/
|
|
95
|
+
id: string;
|
|
96
|
+
/**
|
|
97
|
+
* - Canonical absolute manifest path.
|
|
98
|
+
*/
|
|
99
|
+
manifestPath: string;
|
|
100
|
+
/**
|
|
101
|
+
* - Exact validated manifest text.
|
|
102
|
+
*/
|
|
103
|
+
manifestText: string;
|
|
104
|
+
/**
|
|
105
|
+
* - Canonical absolute project root.
|
|
106
|
+
*/
|
|
107
|
+
projectRoot: string;
|
|
108
|
+
/**
|
|
109
|
+
* - Canonical absolute publication root.
|
|
110
|
+
*/
|
|
111
|
+
publicationRoot: string;
|
|
112
|
+
/**
|
|
113
|
+
* - Ordered normalized sources.
|
|
114
|
+
*/
|
|
115
|
+
sources: NormalizedProjectSource[];
|
|
116
|
+
/**
|
|
117
|
+
* - Ordered normalized targets.
|
|
118
|
+
*/
|
|
119
|
+
targets: NormalizedProjectTarget[];
|
|
120
|
+
};
|
|
121
|
+
/**
|
|
122
|
+
* @typedef NormalizedProjectSource
|
|
123
|
+
* @property {string} absolutePath - Canonical project-absolute file path.
|
|
124
|
+
* @property {boolean} entry - Whether this is the sole entry module.
|
|
125
|
+
* @property {string} id - Stable semantic module identity.
|
|
126
|
+
* @property {import("./semantic/types.js").SemanticLanguage} language - Registered source language.
|
|
127
|
+
* @property {string} path - Canonical project-relative file path.
|
|
128
|
+
*/
|
|
129
|
+
/**
|
|
130
|
+
* @typedef NormalizedProjectTarget
|
|
131
|
+
* @property {string} buildProjection - Generation-relative reserved build projection.
|
|
132
|
+
* @property {string} id - Stable project target identity.
|
|
133
|
+
* @property {import("./semantic/types.js").BackendLanguage} language - Registered target identity.
|
|
134
|
+
* @property {import("./semantic/types.js").PublicationTargetRole} role - Explicit target role.
|
|
135
|
+
* @property {string} sourceProjection - Generation-relative generated-source projection.
|
|
136
|
+
*/
|
|
137
|
+
/**
|
|
138
|
+
* @typedef NormalizedProject
|
|
139
|
+
* @property {string} entryModule - Sole entry module identity.
|
|
140
|
+
* @property {string} id - Stable project identity.
|
|
141
|
+
* @property {string} manifestPath - Canonical absolute manifest path.
|
|
142
|
+
* @property {string} manifestText - Exact validated manifest text.
|
|
143
|
+
* @property {string} projectRoot - Canonical absolute project root.
|
|
144
|
+
* @property {string} publicationRoot - Canonical absolute publication root.
|
|
145
|
+
* @property {NormalizedProjectSource[]} sources - Ordered normalized sources.
|
|
146
|
+
* @property {NormalizedProjectTarget[]} targets - Ordered normalized targets.
|
|
147
|
+
*/
|
|
148
|
+
//# sourceMappingURL=project-manifest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-manifest.d.ts","sourceRoot":"","sources":["../../src/project-manifest.js"],"names":[],"mappings":"AA4BA;;GAEG;AACH,qBAAa,kBAAkB;IAMtB,WAAW;IACX,EAAE;IACF,YAAY;IACZ,YAAY;IACZ,WAAW;IACX,eAAe;IACf,OAAO;sBAyZF,MAAM;eACN,OAAO;YACP,MAAM;kBACN,OAAO,qBAAqB,EAAE,gBAAgB;cAC9C,MAAM;;IA5ZX,OAAO;yBAiaF,MAAM;YACN,MAAM;kBACN,OAAO,qBAAqB,EAAE,eAAe;cAC7C,OAAO,qBAAqB,EAAE,qBAAqB;0BACnD,MAAM;;IApaX,OAAO;IAbd;;;OAGG;IACH,YAAY,KAAK,EAFN,iBAEM,EAWhB;CACF;AAED;;GAEG;AACH,qBAAa,qBAAqB;IAChC;;;;OAIG;IACG,IAAI,CAAC,WAAW,AAHnB,CACA,EADQ,MAGkC,GAFhC,OAAO,CAAC,kBAAkB,CAAC,CAkCvC;CACF;AAuWE,YAAS,uBAAuB,GAChC;;;;IAAmB,YAAY,EAApB,MAAM,CACjB;;;;IAAoB,KAAK,EAAd,OAAO,CAClB;;;;IAAmB,EAAE,EAAV,MAAM,CACjB;;;;IAA2D,QAAQ,EAAxD,OAAO,qBAAqB,EAAE,gBAAgB,CACzD;;;;IAAmB,IAAI,EAAZ,MAAM,CACnB;CAAA,CAAA;AAGE,YAAS,uBAAuB,GAChC;;;;IAAmB,eAAe,EAAvB,MAAM,CACjB;;;;IAAmB,EAAE,EAAV,MAAM,CACjB;;;;IAA0D,QAAQ,EAAvD,OAAO,qBAAqB,EAAE,eAAe,CACxD;;;;IAAgE,IAAI,EAAzD,OAAO,qBAAqB,EAAE,qBAAqB,CAC9D;;;;IAAmB,gBAAgB,EAAxB,MAAM,CACnB;CAAA,CAAA;AAGE,YAAS,iBAAiB,GAC1B;;;;IAAmB,WAAW,EAAnB,MAAM,CACjB;;;;IAAmB,EAAE,EAAV,MAAM,CACjB;;;;IAAmB,YAAY,EAApB,MAAM,CACjB;;;;IAAmB,YAAY,EAApB,MAAM,CACjB;;;;IAAmB,WAAW,EAAnB,MAAM,CACjB;;;;IAAmB,eAAe,EAAvB,MAAM,CACjB;;;;IAAsC,OAAO,EAAlC,uBAAuB,EAAE,CACpC;;;;IAAsC,OAAO,EAAlC,uBAAuB,EAAE,CACtC;CAAA,CAAA;AA5BD;;;;;;;GAOG;AAEH;;;;;;;GAOG;AAEH;;;;;;;;;;GAUG"}
|