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,172 @@
|
|
|
1
|
+
import { ProjectManifestLoader } from "./project-manifest.js";
|
|
2
|
+
import { ProjectSnapshotBuilder } from "./project-snapshot.js";
|
|
3
|
+
import { TargetCheckRunner } from "./target-check.js";
|
|
4
|
+
/**
|
|
5
|
+
* Installs an internal synchronous orchestration observer for focused specs.
|
|
6
|
+
* This helper is intentionally not part of the package root API.
|
|
7
|
+
* @param {ProjectBuilder} builder - Project builder instance.
|
|
8
|
+
* @param {(operation: string) => void} observer - Ordered operation observer.
|
|
9
|
+
* @returns {void}
|
|
10
|
+
*/
|
|
11
|
+
export declare function observeProjectBuild(builder: ProjectBuilder, observer: (operation: string) => void): void;
|
|
12
|
+
/**
|
|
13
|
+
* Runs one builder invocation with the narrow snapshot-currentness controls owned by the watch coordinator.
|
|
14
|
+
* This helper is intentionally not part of the package root API.
|
|
15
|
+
* @param {ProjectBuilder} builder - Project builder instance.
|
|
16
|
+
* @param {string} projectPath - Exact project manifest path.
|
|
17
|
+
* @param {ProjectBuildReporterLike} reporter - Watch-cycle reporter.
|
|
18
|
+
* @param {ProjectWatchBuildOptions} options - Checked-cycle and currentness controls.
|
|
19
|
+
* @returns {Promise<Readonly<ProjectBuildSuccess>>} Committed build result.
|
|
20
|
+
*/
|
|
21
|
+
export declare function buildWatchedProject(builder: ProjectBuilder, projectPath: string, reporter: ProjectBuildReporterLike, options: ProjectWatchBuildOptions): Promise<Readonly<ProjectBuildSuccess>>;
|
|
22
|
+
/**
|
|
23
|
+
* Orchestrates one complete immutable project build and one transactional publication.
|
|
24
|
+
*/
|
|
25
|
+
export declare class ProjectBuilder {
|
|
26
|
+
#private;
|
|
27
|
+
/**
|
|
28
|
+
* Creates a one-shot project builder.
|
|
29
|
+
* @param {{checkRunner?: TargetCheckRunner, environment?: Readonly<Record<string, string | undefined>>, manifestLoader?: ProjectManifestLoader, snapshotBuilder?: ProjectSnapshotBuilder}} [options] - Lifecycle collaborators.
|
|
30
|
+
*/
|
|
31
|
+
constructor(options?: {
|
|
32
|
+
checkRunner?: TargetCheckRunner;
|
|
33
|
+
environment?: Readonly<Record<string, string | undefined>>;
|
|
34
|
+
manifestLoader?: ProjectManifestLoader;
|
|
35
|
+
snapshotBuilder?: ProjectSnapshotBuilder;
|
|
36
|
+
});
|
|
37
|
+
/**
|
|
38
|
+
* Builds and atomically publishes one project generation.
|
|
39
|
+
* @param {string} [projectPath] - Project manifest path.
|
|
40
|
+
* @param {ProjectBuildReporterLike} [reporter] - Optional state reporter.
|
|
41
|
+
* @param {ProjectBuildOptions} [options] - Optional developer-check and publication lifecycle.
|
|
42
|
+
* @returns {Promise<Readonly<ProjectBuildSuccess>>} Committed build result.
|
|
43
|
+
*/
|
|
44
|
+
build(projectPath?: string, reporter?: ProjectBuildReporterLike, options?: ProjectBuildOptions): Promise<Readonly<ProjectBuildSuccess>>;
|
|
45
|
+
}
|
|
46
|
+
export type ProjectBuildOptions = {
|
|
47
|
+
/**
|
|
48
|
+
* - Whether every target must run its developer check.
|
|
49
|
+
*/
|
|
50
|
+
check?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* - Active check and publication cancellation authority.
|
|
53
|
+
*/
|
|
54
|
+
signal?: AbortSignal;
|
|
55
|
+
/**
|
|
56
|
+
* - Per-check-stage deadline.
|
|
57
|
+
*/
|
|
58
|
+
timeoutMs?: number;
|
|
59
|
+
};
|
|
60
|
+
export type ProjectWatchBuildOptions = {
|
|
61
|
+
/**
|
|
62
|
+
* - Whether every target must run its developer check.
|
|
63
|
+
*/
|
|
64
|
+
check: boolean;
|
|
65
|
+
/**
|
|
66
|
+
* - Coordinator-reconciled complete graph hash.
|
|
67
|
+
*/
|
|
68
|
+
expectedSnapshotHash: string;
|
|
69
|
+
/**
|
|
70
|
+
* - Publication-only cancellation authority.
|
|
71
|
+
*/
|
|
72
|
+
publicationSignal: AbortSignal;
|
|
73
|
+
/**
|
|
74
|
+
* - Active check and publication cancellation authority.
|
|
75
|
+
*/
|
|
76
|
+
signal: AbortSignal;
|
|
77
|
+
/**
|
|
78
|
+
* - Complete graph guard at the pointer boundary.
|
|
79
|
+
*/
|
|
80
|
+
validateCurrentSnapshot: () => Promise<void> | void;
|
|
81
|
+
};
|
|
82
|
+
export type ProjectWatchBuildControls = {
|
|
83
|
+
/**
|
|
84
|
+
* - Coordinator-reconciled complete graph hash.
|
|
85
|
+
*/
|
|
86
|
+
expectedSnapshotHash: string;
|
|
87
|
+
/**
|
|
88
|
+
* - Publication-only cancellation authority.
|
|
89
|
+
*/
|
|
90
|
+
publicationSignal: AbortSignal;
|
|
91
|
+
/**
|
|
92
|
+
* - Complete graph guard at the pointer boundary.
|
|
93
|
+
*/
|
|
94
|
+
validateCurrentSnapshot: () => Promise<void> | void;
|
|
95
|
+
};
|
|
96
|
+
export type ProjectBuildReporterLike = {
|
|
97
|
+
/**
|
|
98
|
+
* - Reports validated configuration.
|
|
99
|
+
*/
|
|
100
|
+
projectLoaded: (projectId: string) => void;
|
|
101
|
+
/**
|
|
102
|
+
* - Reports a complete snapshot.
|
|
103
|
+
*/
|
|
104
|
+
snapshotLoaded: (snapshotHash: string) => void;
|
|
105
|
+
/**
|
|
106
|
+
* - Reports generated target output.
|
|
107
|
+
*/
|
|
108
|
+
targetGenerated: (target: ProjectBuildTargetResult) => void;
|
|
109
|
+
/**
|
|
110
|
+
* - Reports a successful check stage.
|
|
111
|
+
*/
|
|
112
|
+
targetChecked: (checked: {
|
|
113
|
+
id: string;
|
|
114
|
+
language: string;
|
|
115
|
+
stage: import("./semantic/types.js").TargetCheckStageResult;
|
|
116
|
+
}) => void;
|
|
117
|
+
};
|
|
118
|
+
export type ProjectBuildTargetResult = {
|
|
119
|
+
/**
|
|
120
|
+
* - Generated artifact count.
|
|
121
|
+
*/
|
|
122
|
+
artifactCount: number;
|
|
123
|
+
/**
|
|
124
|
+
* - Project target identity.
|
|
125
|
+
*/
|
|
126
|
+
id: string;
|
|
127
|
+
/**
|
|
128
|
+
* - Backend target identity.
|
|
129
|
+
*/
|
|
130
|
+
language: import("./semantic/types.js").BackendLanguage;
|
|
131
|
+
/**
|
|
132
|
+
* - Explicit target role.
|
|
133
|
+
*/
|
|
134
|
+
role: import("./semantic/types.js").PublicationTargetRole;
|
|
135
|
+
/**
|
|
136
|
+
* - Successful developer-check evidence.
|
|
137
|
+
*/
|
|
138
|
+
check?: Readonly<{
|
|
139
|
+
stages: readonly import("./semantic/types.js").TargetCheckStageResult[];
|
|
140
|
+
}>;
|
|
141
|
+
};
|
|
142
|
+
export type ProjectBuildSuccess = {
|
|
143
|
+
/**
|
|
144
|
+
* - Terminal success state.
|
|
145
|
+
*/
|
|
146
|
+
status: "succeeded";
|
|
147
|
+
/**
|
|
148
|
+
* - Stable project identity.
|
|
149
|
+
*/
|
|
150
|
+
projectId: string;
|
|
151
|
+
/**
|
|
152
|
+
* - Complete ordered input hash.
|
|
153
|
+
*/
|
|
154
|
+
snapshotHash: string;
|
|
155
|
+
/**
|
|
156
|
+
* - Deterministic immutable generation identity.
|
|
157
|
+
*/
|
|
158
|
+
generationId: string;
|
|
159
|
+
/**
|
|
160
|
+
* - Whether developer checks completed for every target.
|
|
161
|
+
*/
|
|
162
|
+
checked: boolean;
|
|
163
|
+
/**
|
|
164
|
+
* - Ordered generated target results.
|
|
165
|
+
*/
|
|
166
|
+
targets: readonly ProjectBuildTargetResult[];
|
|
167
|
+
/**
|
|
168
|
+
* - Committed publisher snapshot.
|
|
169
|
+
*/
|
|
170
|
+
generation: import("./semantic/types.js").PublishedGeneration;
|
|
171
|
+
};
|
|
172
|
+
//# sourceMappingURL=project-build.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-build.d.ts","sourceRoot":"","sources":["../../src/project-build.js"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,320 @@
|
|
|
1
|
+
// @ts-check
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { generateProgramArtifacts } from "./backends/program.js";
|
|
4
|
+
import { SemantifoldDiagnostic } from "./diagnostic.js";
|
|
5
|
+
import { parseProgramSource } from "./frontends/program.js";
|
|
6
|
+
import { ProjectManifestLoader } from "./project-manifest.js";
|
|
7
|
+
import { ProjectSnapshotBuilder } from "./project-snapshot.js";
|
|
8
|
+
import { GeneratedArtifactPublisher, guardNextPublicationCommit } from "./publication.js";
|
|
9
|
+
import { languageRegistry } from "./language-registry.js";
|
|
10
|
+
import { createTargetCheckPlan, TargetCheckRunner } from "./target-check.js";
|
|
11
|
+
import { canonicalToolchains, discoverCanonicalToolchain } from "./toolchains.js";
|
|
12
|
+
/** @type {WeakMap<ProjectBuilder, (operation: string) => void>} */
|
|
13
|
+
const projectBuildObservers = new WeakMap();
|
|
14
|
+
/** @type {WeakMap<ProjectBuilder, ProjectWatchBuildControls[]>} */
|
|
15
|
+
const projectWatchBuildControls = new WeakMap();
|
|
16
|
+
/**
|
|
17
|
+
* Installs an internal synchronous orchestration observer for focused specs.
|
|
18
|
+
* This helper is intentionally not part of the package root API.
|
|
19
|
+
* @param {ProjectBuilder} builder - Project builder instance.
|
|
20
|
+
* @param {(operation: string) => void} observer - Ordered operation observer.
|
|
21
|
+
* @returns {void}
|
|
22
|
+
*/
|
|
23
|
+
export function observeProjectBuild(builder, observer) {
|
|
24
|
+
if (!(builder instanceof ProjectBuilder) || typeof observer != "function") {
|
|
25
|
+
throw new TypeError("Invalid project build observer.");
|
|
26
|
+
}
|
|
27
|
+
projectBuildObservers.set(builder, observer);
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Runs one builder invocation with the narrow snapshot-currentness controls owned by the watch coordinator.
|
|
31
|
+
* This helper is intentionally not part of the package root API.
|
|
32
|
+
* @param {ProjectBuilder} builder - Project builder instance.
|
|
33
|
+
* @param {string} projectPath - Exact project manifest path.
|
|
34
|
+
* @param {ProjectBuildReporterLike} reporter - Watch-cycle reporter.
|
|
35
|
+
* @param {ProjectWatchBuildOptions} options - Checked-cycle and currentness controls.
|
|
36
|
+
* @returns {Promise<Readonly<ProjectBuildSuccess>>} Committed build result.
|
|
37
|
+
*/
|
|
38
|
+
export function buildWatchedProject(builder, projectPath, reporter, options) {
|
|
39
|
+
if (!(builder instanceof ProjectBuilder) || typeof projectPath != "string" || projectPath.length == 0 ||
|
|
40
|
+
!isPlainObject(options) || Object.keys(options).some(key => !["check", "expectedSnapshotHash", "publicationSignal", "signal", "validateCurrentSnapshot"].includes(key)) ||
|
|
41
|
+
typeof options.check != "boolean" || typeof options.expectedSnapshotHash != "string" ||
|
|
42
|
+
!/^[a-f0-9]{64}$/u.test(options.expectedSnapshotHash) || !(options.publicationSignal instanceof AbortSignal) ||
|
|
43
|
+
!(options.signal instanceof AbortSignal) || typeof options.validateCurrentSnapshot != "function") {
|
|
44
|
+
throw new TypeError("Invalid watched project build controls.");
|
|
45
|
+
}
|
|
46
|
+
const queued = projectWatchBuildControls.get(builder) ?? [];
|
|
47
|
+
queued.push({
|
|
48
|
+
expectedSnapshotHash: options.expectedSnapshotHash,
|
|
49
|
+
publicationSignal: options.publicationSignal,
|
|
50
|
+
validateCurrentSnapshot: options.validateCurrentSnapshot
|
|
51
|
+
});
|
|
52
|
+
projectWatchBuildControls.set(builder, queued);
|
|
53
|
+
return builder.build(projectPath, reporter, { check: options.check, signal: options.signal });
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Orchestrates one complete immutable project build and one transactional publication.
|
|
57
|
+
*/
|
|
58
|
+
export class ProjectBuilder {
|
|
59
|
+
/** @type {ProjectManifestLoader} */
|
|
60
|
+
#manifestLoader;
|
|
61
|
+
/** @type {ProjectSnapshotBuilder} */
|
|
62
|
+
#snapshotBuilder;
|
|
63
|
+
/** @type {TargetCheckRunner} */
|
|
64
|
+
#checkRunner;
|
|
65
|
+
/** @type {Readonly<Record<string, string | undefined>> | undefined} */
|
|
66
|
+
#environment;
|
|
67
|
+
/**
|
|
68
|
+
* Creates a one-shot project builder.
|
|
69
|
+
* @param {{checkRunner?: TargetCheckRunner, environment?: Readonly<Record<string, string | undefined>>, manifestLoader?: ProjectManifestLoader, snapshotBuilder?: ProjectSnapshotBuilder}} [options] - Lifecycle collaborators.
|
|
70
|
+
*/
|
|
71
|
+
constructor(options = {}) {
|
|
72
|
+
if (options.checkRunner !== undefined && !(options.checkRunner instanceof TargetCheckRunner)) {
|
|
73
|
+
throw new TypeError("Project builder check runner must be a TargetCheckRunner.");
|
|
74
|
+
}
|
|
75
|
+
this.#manifestLoader = options.manifestLoader ?? new ProjectManifestLoader();
|
|
76
|
+
this.#snapshotBuilder = options.snapshotBuilder ?? new ProjectSnapshotBuilder();
|
|
77
|
+
this.#checkRunner = options.checkRunner ?? new TargetCheckRunner();
|
|
78
|
+
this.#environment = options.environment === undefined ? undefined : snapshotEnvironment(options.environment);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Builds and atomically publishes one project generation.
|
|
82
|
+
* @param {string} [projectPath] - Project manifest path.
|
|
83
|
+
* @param {ProjectBuildReporterLike} [reporter] - Optional state reporter.
|
|
84
|
+
* @param {ProjectBuildOptions} [options] - Optional developer-check and publication lifecycle.
|
|
85
|
+
* @returns {Promise<Readonly<ProjectBuildSuccess>>} Committed build result.
|
|
86
|
+
*/
|
|
87
|
+
async build(projectPath = "./semantifold.json", reporter, options = {}) {
|
|
88
|
+
const queuedWatchControls = projectWatchBuildControls.get(this);
|
|
89
|
+
const watchControls = queuedWatchControls?.shift();
|
|
90
|
+
if (queuedWatchControls?.length == 0)
|
|
91
|
+
projectWatchBuildControls.delete(this);
|
|
92
|
+
if (typeof options != "object" || options == null || Array.isArray(options) || Object.getPrototypeOf(options) != Object.prototype ||
|
|
93
|
+
Object.keys(options).some(key => !["check", "signal", "timeoutMs"].includes(key)) ||
|
|
94
|
+
options.check !== undefined && typeof options.check != "boolean" ||
|
|
95
|
+
options.signal !== undefined && !(options.signal instanceof AbortSignal) ||
|
|
96
|
+
options.timeoutMs !== undefined && (typeof options.timeoutMs != "number" || !Number.isInteger(options.timeoutMs))) {
|
|
97
|
+
throw new SemantifoldDiagnostic({
|
|
98
|
+
code: "INVALID_PROJECT_BUILD",
|
|
99
|
+
language: "project",
|
|
100
|
+
message: "Project build options require valid check, snapshot-currentness, cancellation, and timeout controls."
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
const check = options.check === true;
|
|
104
|
+
const signal = options.signal;
|
|
105
|
+
const project = await this.#manifestLoader.load(projectPath);
|
|
106
|
+
reporter?.projectLoaded(project.id);
|
|
107
|
+
const snapshot = await this.#snapshotBuilder.build(project);
|
|
108
|
+
if (watchControls !== undefined && snapshot.hash != watchControls.expectedSnapshotHash) {
|
|
109
|
+
throw new SemantifoldDiagnostic({
|
|
110
|
+
code: "WATCH_SNAPSHOT_CHANGED",
|
|
111
|
+
language: project.id,
|
|
112
|
+
message: "The complete project snapshot changed before its watch cycle began."
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
reporter?.snapshotLoaded(snapshot.hash);
|
|
116
|
+
projectBuildObservers.get(this)?.("snapshot");
|
|
117
|
+
const program = parseProgramSource({
|
|
118
|
+
entryModule: project.entryModule,
|
|
119
|
+
sources: snapshot.sources.map(source => ({
|
|
120
|
+
filename: source.path,
|
|
121
|
+
id: source.id,
|
|
122
|
+
language: source.language,
|
|
123
|
+
source: source.source
|
|
124
|
+
}))
|
|
125
|
+
});
|
|
126
|
+
projectBuildObservers.get(this)?.("parse");
|
|
127
|
+
/** @type {import("./semantic/types.js").PublicationTargetInput[]} */
|
|
128
|
+
const publicationTargets = [];
|
|
129
|
+
/** @type {ProjectBuildTargetResult[]} */
|
|
130
|
+
const targetResults = [];
|
|
131
|
+
/** @type {Map<string, import("./semantic/types.js").TargetCheckResult>} */
|
|
132
|
+
const checkResults = new Map();
|
|
133
|
+
for (const target of project.targets) {
|
|
134
|
+
if (target.role == "binary") {
|
|
135
|
+
throw new SemantifoldDiagnostic({
|
|
136
|
+
code: "UNSUPPORTED_PROJECT_TARGET",
|
|
137
|
+
language: target.language,
|
|
138
|
+
message: "Complete semantic programs do not support binary project generation."
|
|
139
|
+
});
|
|
140
|
+
}
|
|
141
|
+
const artifactSet = generateProgramArtifacts({
|
|
142
|
+
language: target.language,
|
|
143
|
+
program,
|
|
144
|
+
role: target.role
|
|
145
|
+
});
|
|
146
|
+
const checkCapability = languageRegistry.record(target.language).check;
|
|
147
|
+
if (check && !checkCapability.supported) {
|
|
148
|
+
throw new SemantifoldDiagnostic({
|
|
149
|
+
code: "UNSUPPORTED_TARGET_CHECK",
|
|
150
|
+
language: target.language,
|
|
151
|
+
message: `Project target '${target.id}' does not provide a developer check plan.`
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Ordered candidate validators when checking is enabled.
|
|
156
|
+
* @type {import("./semantic/types.js").PublicationValidator[] | undefined}
|
|
157
|
+
*/
|
|
158
|
+
const validators = check ? [async ({ buildPath, sourcePath, targetId }) => {
|
|
159
|
+
/** @type {import("./semantic/types.js").DiscoveredToolchain[]} */
|
|
160
|
+
const tools = [];
|
|
161
|
+
for (const toolchain of checkCapability.toolchains) {
|
|
162
|
+
tools.push(await discoverCanonicalToolchain(/** @type {keyof typeof canonicalToolchains} */ (toolchain), {
|
|
163
|
+
...(this.#environment === undefined ? {} : { environment: this.#environment })
|
|
164
|
+
}));
|
|
165
|
+
}
|
|
166
|
+
const plan = createTargetCheckPlan({
|
|
167
|
+
artifacts: artifactSet,
|
|
168
|
+
buildPath,
|
|
169
|
+
projectId: project.id,
|
|
170
|
+
sourcePath,
|
|
171
|
+
targetId,
|
|
172
|
+
tools: Object.freeze(tools)
|
|
173
|
+
});
|
|
174
|
+
const result = await this.#checkRunner.run(plan, {
|
|
175
|
+
onStage: stage => {
|
|
176
|
+
reporter?.targetChecked({ id: target.id, language: target.language, stage });
|
|
177
|
+
projectBuildObservers.get(this)?.(`check:${target.id}:${stage.stage}`);
|
|
178
|
+
},
|
|
179
|
+
...(signal === undefined ? {} : { signal }),
|
|
180
|
+
...(options.timeoutMs === undefined ? {} : { timeoutMs: options.timeoutMs })
|
|
181
|
+
});
|
|
182
|
+
checkResults.set(target.id, result);
|
|
183
|
+
return [...result.outputs];
|
|
184
|
+
}] : undefined;
|
|
185
|
+
publicationTargets.push({
|
|
186
|
+
artifactSet,
|
|
187
|
+
buildProjection: target.buildProjection,
|
|
188
|
+
id: target.id,
|
|
189
|
+
role: target.role,
|
|
190
|
+
sourceProjection: target.sourceProjection,
|
|
191
|
+
...(validators === undefined ? {} : { validators })
|
|
192
|
+
});
|
|
193
|
+
targetResults.push(Object.freeze({
|
|
194
|
+
artifactCount: artifactSet.artifacts.length,
|
|
195
|
+
id: target.id,
|
|
196
|
+
language: target.language,
|
|
197
|
+
role: target.role
|
|
198
|
+
}));
|
|
199
|
+
reporter?.targetGenerated(targetResults[targetResults.length - 1]);
|
|
200
|
+
projectBuildObservers.get(this)?.(`target:${target.id}`);
|
|
201
|
+
}
|
|
202
|
+
const publisher = new GeneratedArtifactPublisher({
|
|
203
|
+
projectId: project.id,
|
|
204
|
+
projectRoot: project.projectRoot,
|
|
205
|
+
publicationRoot: project.publicationRoot,
|
|
206
|
+
sourceFiles: project.sources.map(({ absolutePath }) => absolutePath)
|
|
207
|
+
});
|
|
208
|
+
const generationId = check
|
|
209
|
+
? `g-${snapshot.hash}-checked-${randomUUID()}`
|
|
210
|
+
: `g-${snapshot.hash}`;
|
|
211
|
+
if (watchControls !== undefined) {
|
|
212
|
+
guardNextPublicationCommit(publisher, watchControls.validateCurrentSnapshot);
|
|
213
|
+
}
|
|
214
|
+
const publicationSignal = signal === undefined
|
|
215
|
+
? watchControls?.publicationSignal
|
|
216
|
+
: watchControls === undefined
|
|
217
|
+
? signal
|
|
218
|
+
: AbortSignal.any([signal, watchControls.publicationSignal]);
|
|
219
|
+
const generation = await publisher.publish({ generationId, targets: publicationTargets }, {
|
|
220
|
+
...(publicationSignal === undefined ? {} : { signal: publicationSignal })
|
|
221
|
+
});
|
|
222
|
+
projectBuildObservers.get(this)?.("publish");
|
|
223
|
+
return Object.freeze({
|
|
224
|
+
generation,
|
|
225
|
+
generationId,
|
|
226
|
+
checked: check,
|
|
227
|
+
projectId: project.id,
|
|
228
|
+
snapshotHash: snapshot.hash,
|
|
229
|
+
status: /** @type {const} */ ("succeeded"),
|
|
230
|
+
targets: Object.freeze(targetResults.map(target => {
|
|
231
|
+
const result = checkResults.get(target.id);
|
|
232
|
+
return Object.freeze({
|
|
233
|
+
...target,
|
|
234
|
+
...(result === undefined ? {} : { check: Object.freeze({ stages: result.stages }) })
|
|
235
|
+
});
|
|
236
|
+
}))
|
|
237
|
+
});
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
/**
|
|
241
|
+
* @typedef ProjectBuildOptions
|
|
242
|
+
* @property {boolean} [check] - Whether every target must run its developer check.
|
|
243
|
+
* @property {AbortSignal} [signal] - Active check and publication cancellation authority.
|
|
244
|
+
* @property {number} [timeoutMs] - Per-check-stage deadline.
|
|
245
|
+
*/
|
|
246
|
+
/**
|
|
247
|
+
* @typedef ProjectWatchBuildOptions
|
|
248
|
+
* @property {boolean} check - Whether every target must run its developer check.
|
|
249
|
+
* @property {string} expectedSnapshotHash - Coordinator-reconciled complete graph hash.
|
|
250
|
+
* @property {AbortSignal} publicationSignal - Publication-only cancellation authority.
|
|
251
|
+
* @property {AbortSignal} signal - Active check and publication cancellation authority.
|
|
252
|
+
* @property {() => Promise<void> | void} validateCurrentSnapshot - Complete graph guard at the pointer boundary.
|
|
253
|
+
*/
|
|
254
|
+
/**
|
|
255
|
+
* @typedef ProjectWatchBuildControls
|
|
256
|
+
* @property {string} expectedSnapshotHash - Coordinator-reconciled complete graph hash.
|
|
257
|
+
* @property {AbortSignal} publicationSignal - Publication-only cancellation authority.
|
|
258
|
+
* @property {() => Promise<void> | void} validateCurrentSnapshot - Complete graph guard at the pointer boundary.
|
|
259
|
+
*/
|
|
260
|
+
/**
|
|
261
|
+
* @typedef ProjectBuildReporterLike
|
|
262
|
+
* @property {(projectId: string) => void} projectLoaded - Reports validated configuration.
|
|
263
|
+
* @property {(snapshotHash: string) => void} snapshotLoaded - Reports a complete snapshot.
|
|
264
|
+
* @property {(target: ProjectBuildTargetResult) => void} targetGenerated - Reports generated target output.
|
|
265
|
+
* @property {(checked: {id: string, language: string, stage: import("./semantic/types.js").TargetCheckStageResult}) => void} targetChecked - Reports a successful check stage.
|
|
266
|
+
*/
|
|
267
|
+
/**
|
|
268
|
+
* @typedef ProjectBuildTargetResult
|
|
269
|
+
* @property {number} artifactCount - Generated artifact count.
|
|
270
|
+
* @property {string} id - Project target identity.
|
|
271
|
+
* @property {import("./semantic/types.js").BackendLanguage} language - Backend target identity.
|
|
272
|
+
* @property {import("./semantic/types.js").PublicationTargetRole} role - Explicit target role.
|
|
273
|
+
* @property {Readonly<{stages: readonly import("./semantic/types.js").TargetCheckStageResult[]}>} [check] - Successful developer-check evidence.
|
|
274
|
+
*/
|
|
275
|
+
/**
|
|
276
|
+
* @typedef ProjectBuildSuccess
|
|
277
|
+
* @property {"succeeded"} status - Terminal success state.
|
|
278
|
+
* @property {string} projectId - Stable project identity.
|
|
279
|
+
* @property {string} snapshotHash - Complete ordered input hash.
|
|
280
|
+
* @property {string} generationId - Deterministic immutable generation identity.
|
|
281
|
+
* @property {boolean} checked - Whether developer checks completed for every target.
|
|
282
|
+
* @property {readonly ProjectBuildTargetResult[]} targets - Ordered generated target results.
|
|
283
|
+
* @property {import("./semantic/types.js").PublishedGeneration} generation - Committed publisher snapshot.
|
|
284
|
+
*/
|
|
285
|
+
/**
|
|
286
|
+
* Detaches explicit tool discovery configuration from caller mutation.
|
|
287
|
+
* @param {unknown} candidate - Candidate environment.
|
|
288
|
+
* @returns {Readonly<Record<string, string | undefined>>} Immutable snapshot.
|
|
289
|
+
*/
|
|
290
|
+
function snapshotEnvironment(candidate) {
|
|
291
|
+
if (typeof candidate != "object" || candidate == null || Array.isArray(candidate)) {
|
|
292
|
+
throw new TypeError("Project builder environment must be a plain string record.");
|
|
293
|
+
}
|
|
294
|
+
const prototype = Object.getPrototypeOf(candidate);
|
|
295
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
296
|
+
throw new TypeError("Project builder environment must be a plain string record.");
|
|
297
|
+
}
|
|
298
|
+
/** @type {Record<string, string | undefined>} */
|
|
299
|
+
const snapshot = Object.create(null);
|
|
300
|
+
for (const key of Reflect.ownKeys(candidate)) {
|
|
301
|
+
if (typeof key != "string")
|
|
302
|
+
throw new TypeError("Project builder environment must use string keys.");
|
|
303
|
+
const descriptor = Object.getOwnPropertyDescriptor(candidate, key);
|
|
304
|
+
if (descriptor == undefined || !descriptor.enumerable || !("value" in descriptor) ||
|
|
305
|
+
descriptor.value !== undefined && typeof descriptor.value != "string") {
|
|
306
|
+
throw new TypeError("Project builder environment must contain string or undefined data values.");
|
|
307
|
+
}
|
|
308
|
+
snapshot[key] = descriptor.value;
|
|
309
|
+
}
|
|
310
|
+
return Object.freeze(snapshot);
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Checks for an ordinary object-prototype record.
|
|
314
|
+
* @param {unknown} value - Candidate value.
|
|
315
|
+
* @returns {value is Record<string, unknown>} Whether the value is a plain object.
|
|
316
|
+
*/
|
|
317
|
+
function isPlainObject(value) {
|
|
318
|
+
return typeof value == "object" && value != null && !Array.isArray(value) && Object.getPrototypeOf(value) == Object.prototype;
|
|
319
|
+
}
|
|
320
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvamVjdC1idWlsZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9wcm9qZWN0LWJ1aWxkLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLFlBQVk7QUFFWixPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sYUFBYSxDQUFBO0FBQ3RDLE9BQU8sRUFBQyx3QkFBd0IsRUFBQyxNQUFNLHVCQUF1QixDQUFBO0FBQzlELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBQ3JELE9BQU8sRUFBQyxrQkFBa0IsRUFBQyxNQUFNLHdCQUF3QixDQUFBO0FBQ3pELE9BQU8sRUFBQyxxQkFBcUIsRUFBQyxNQUFNLHVCQUF1QixDQUFBO0FBQzNELE9BQU8sRUFBQyxzQkFBc0IsRUFBQyxNQUFNLHVCQUF1QixDQUFBO0FBQzVELE9BQU8sRUFBQywwQkFBMEIsRUFBRSwwQkFBMEIsRUFBQyxNQUFNLGtCQUFrQixDQUFBO0FBQ3ZGLE9BQU8sRUFBQyxnQkFBZ0IsRUFBQyxNQUFNLHdCQUF3QixDQUFBO0FBQ3ZELE9BQU8sRUFBQyxxQkFBcUIsRUFBRSxpQkFBaUIsRUFBQyxNQUFNLG1CQUFtQixDQUFBO0FBQzFFLE9BQU8sRUFBQyxtQkFBbUIsRUFBRSwwQkFBMEIsRUFBQyxNQUFNLGlCQUFpQixDQUFBO0FBRS9FLG1FQUFtRTtBQUNuRSxNQUFNLHFCQUFxQixHQUFHLElBQUksT0FBTyxFQUFFLENBQUE7QUFDM0MsbUVBQW1FO0FBQ25FLE1BQU0seUJBQXlCLEdBQUcsSUFBSSxPQUFPLEVBQUUsQ0FBQTtBQUUvQzs7Ozs7O0dBTUc7QUFDSCxNQUFNLFVBQVUsbUJBQW1CLENBQUMsT0FBTyxFQUFFLFFBQVE7SUFDbkQsSUFBSSxDQUFDLENBQUMsT0FBTyxZQUFZLGNBQWMsQ0FBQyxJQUFJLE9BQU8sUUFBUSxJQUFJLFVBQVUsRUFBRSxDQUFDO1FBQzFFLE1BQU0sSUFBSSxTQUFTLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtJ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QUMsR0FBRyxVQUFVLENBQUMsS0FBSyxDQUFBO0lBQ2xDLENBQUM7SUFFRCxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUE7QUFDaEMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxTQUFTLGFBQWEsQ0FBQyxLQUFLO0lBQzFCLE9BQU8sT0FBTyxLQUFLLElBQUksUUFBUSxJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxJQUFJLE1BQU0sQ0FBQyxjQUFjLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQTtBQUMvSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLy8gQHRzLWNoZWNrXG5cbmltcG9ydCB7cmFuZG9tVVVJRH0gZnJvbSBcIm5vZGU6Y3J5cHRvXCJcbmltcG9ydCB7Z2VuZXJhdGVQcm9ncmFtQXJ0aWZhY3RzfSBmcm9tIFwiLi9iYWNrZW5kcy9wcm9ncmFtLmpzXCJcbmltcG9ydCB7U2VtYW50aWZvbGREaWFnbm9zdGljfSBmcm9tIFwiLi9kaWFnbm9zdGljLmpzXCJcbmltcG9ydCB7cGFyc2VQcm9ncmFtU291cmNlfSBmcm9tIFwiLi9mcm9udGVuZHMvcHJvZ3JhbS5qc1wiXG5pbXBvcnQge1Byb2plY3RNYW5pZmVzdExvYWRlcn0gZnJvbSBcIi4vcHJvamVjdC1tYW5pZmVzdC5qc1wiXG5pbXBvcnQge1Byb2plY3RTbmFwc2hvdEJ1aWxkZXJ9IGZyb20gXCIuL3Byb2plY3Qtc25hcHNob3QuanNcIlxuaW1wb3J0IHtHZW5lcmF0ZWRBcnRpZmFjdFB1Ymxpc2hlciwgZ3VhcmROZXh0UHVibGljYXRpb25Db21taXR9IGZyb20gXCIuL3B1YmxpY2F0aW9uLmpzXCJcbmltcG9ydCB7bGFuZ3VhZ2VSZWdpc3RyeX0gZnJvbSBcIi4vbGFuZ3VhZ2UtcmVnaXN0cnkuanNcIlxuaW1wb3J0IHtjcmVhdGVUYXJnZXRDaGVja1BsYW4sIFRhcmdldENoZWNrUnVubmVyfSBmcm9tIFwiLi90YXJnZXQtY2hlY2suanNcIlxuaW1wb3J0IHtjYW5vbmljYWxUb29sY2hhaW5zLCBkaXNjb3ZlckNhbm9uaWNhbFRvb2xjaGFpbn0gZnJvbSBcIi4vdG9vbGNoYWlucy5qc1wiXG5cbi8qKiBAdHlwZSB7V2Vha01hcDxQcm9qZWN0QnVpbGRlciwgKG9wZXJhdGlvbjogc3RyaW5nKSA9PiB2b2lkPn0gKi9cbmNvbnN0IHByb2plY3RCdWlsZE9ic2VydmVycyA9IG5ldyBXZWFrTWFwKClcbi8qKiBAdHlwZSB7V2Vha01hcDxQcm9qZWN0QnVpbGRlciwgUHJvamVjdFdhdGNoQnVpbGRDb250cm9sc1tdPn0gKi9cbmNvbnN0IHByb2plY3RXYXRjaEJ1aWxkQ29udHJvbHMgPSBuZXcgV2Vha01hcCgpXG5cbi8qKlxuICogSW5zdGFsbHMgYW4gaW50ZXJuYWwgc3luY2hyb25vdXMgb3JjaGVzdHJhdGlvbiBvYnNlcnZlciBmb3IgZm9jdXNlZCBzcGVjcy5cbiAqIFRoaXMgaGVscGVyIGlzIGludGVudGlvbmFsbHkgbm90IHBhcnQgb2YgdGhlIHBhY2thZ2Ugcm9vdCBBUEkuXG4gKiBAcGFyYW0ge1Byb2plY3RCdWlsZGVyfSBidWlsZGVyIC0gUHJvamVjdCBidWlsZGVyIGluc3RhbmNlLlxuICogQHBhcmFtIHsob3BlcmF0aW9uOiBzdHJpbmcpID0+IHZvaWR9IG9ic2VydmVyIC0gT3JkZXJlZCBvcGVyYXRpb24gb2JzZXJ2ZXIuXG4gKiBAcmV0dXJucyB7dm9pZH1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG9ic2VydmVQcm9qZWN0QnVpbGQoYnVpbGRlciwgb2JzZXJ2ZXIpIHtcbiAgaWYgKCEoYnVpbGRlciBpbnN0YW5jZW9mIFByb2plY3RCdWlsZGVyKSB8fCB0eXBlb2Ygb2JzZXJ2ZXIgIT0gXCJmdW5jdGlvblwiKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIkludmFsaWQgcHJvamVjdCBidWlsZCBvYnNlcnZlci5cIilcbiAgfVxuICBwcm9qZWN0QnVpbGRPYnNlcnZlcnMuc2V0KGJ1aWxkZXIsIG9ic2VydmVyKVxufVxuXG4vKipcbiAqIFJ1bnMgb25lIGJ1aWxkZXIgaW52b2NhdGlvbiB3aXRoIHRoZSBuYXJyb3cgc25hcHNob3QtY3VycmVudG5lc3MgY29udHJvbHMgb3duZWQgYnkgdGhlIHdhdGNoIGNvb3JkaW5hdG9yLlxuICogVGhpcyBoZWxwZXIgaXMgaW50ZW50aW9uYWxseSBub3QgcGFydCBvZiB0aGUgcGFja2FnZSByb290IEFQSS5cbiAqIEBwYXJhbSB7UHJvamVjdEJ1aWxkZXJ9IGJ1aWxkZXIgLSBQcm9qZWN0IGJ1aWxkZXIgaW5zdGFuY2UuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJvamVjdFBhdGggLSBFeGFjdCBwcm9qZWN0IG1hbmlmZXN0IHBhdGguXG4gKiBAcGFyYW0ge1Byb2plY3RCdWlsZFJlcG9ydGVyTGlrZX0gcmVwb3J0ZXIgLSBXYXRjaC1jeWNsZSByZXBvcnRlci5cbiAqIEBwYXJhbSB7UHJvamVjdFdhdGNoQnVpbGRPcHRpb25zfSBvcHRpb25zIC0gQ2hlY2tlZC1jeWNsZSBhbmQgY3VycmVudG5lc3MgY29udHJvbHMuXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxSZWFkb25seTxQcm9qZWN0QnVpbGRTdWNjZXNzPj59IENvbW1pdHRlZCBidWlsZCByZXN1bHQuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBidWlsZFdhdGNoZWRQcm9qZWN0KGJ1aWxkZXIsIHByb2plY3RQYXRoLCByZXBvcnRlciwgb3B0aW9ucykge1xuICBpZiAoIShidWlsZGVyIGluc3RhbmNlb2YgUHJvamVjdEJ1aWxkZXIpIHx8IHR5cGVvZiBwcm9qZWN0UGF0aCAhPSBcInN0cmluZ1wiIHx8IHByb2plY3RQYXRoLmxlbmd0aCA9PSAwIHx8XG4gICAgIWlzUGxhaW5PYmplY3Qob3B0aW9ucykgfHwgT2JqZWN0LmtleXMob3B0aW9ucykuc29tZShrZXkgPT5cbiAgICAgICFbXCJjaGVja1wiLCBcImV4cGVjdGVkU25hcHNob3RIYXNoXCIsIFwicHVibGljYXRpb25TaWduYWxcIiwgXCJzaWduYWxcIiwgXCJ2YWxpZGF0ZUN1cnJlbnRTbmFwc2hvdFwiXS5pbmNsdWRlcyhrZXkpKSB8fFxuICAgIHR5cGVvZiBvcHRpb25zLmNoZWNrICE9IFwiYm9vbGVhblwiIHx8IHR5cGVvZiBvcHRpb25zLmV4cGVjdGVkU25hcHNob3RIYXNoICE9IFwic3RyaW5nXCIgfHxcbiAgICAhL15bYS1mMC05XXs2NH0kL3UudGVzdChvcHRpb25zLmV4cGVjdGVkU25hcHNob3RIYXNoKSB8fCAhKG9wdGlvbnMucHVibGljYXRpb25TaWduYWwgaW5zdGFuY2VvZiBBYm9ydFNpZ25hbCkgfHxcbiAgICAhKG9wdGlvbnMuc2lnbmFsIGluc3RhbmNlb2YgQWJvcnRTaWduYWwpIHx8IHR5cGVvZiBvcHRpb25zLnZhbGlkYXRlQ3VycmVudFNuYXBzaG90ICE9IFwiZnVuY3Rpb25cIikge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJJbnZhbGlkIHdhdGNoZWQgcHJvamVjdCBidWlsZCBjb250cm9scy5cIilcbiAgfVxuICBjb25zdCBxdWV1ZWQgPSBwcm9qZWN0V2F0Y2hCdWlsZENvbnRyb2xzLmdldChidWlsZGVyKSA/PyBbXVxuXG4gIHF1ZXVlZC5wdXNoKHtcbiAgICBleHBlY3RlZFNuYXBzaG90SGFzaDogb3B0aW9ucy5leHBlY3RlZFNuYXBzaG90SGFzaCxcbiAgICBwdWJsaWNhdGlvblNpZ25hbDogb3B0aW9ucy5wdWJsaWNhdGlvblNpZ25hbCxcbiAgICB2YWxpZGF0ZUN1cnJlbnRTbmFwc2hvdDogb3B0aW9ucy52YWxpZGF0ZUN1cnJlbnRTbmFwc2hvdFxuICB9KVxuICBwcm9qZWN0V2F0Y2hCdWlsZENvbnRyb2xzLnNldChidWlsZGVyLCBxdWV1ZWQpXG5cbiAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQocHJvamVjdFBhdGgsIHJlcG9ydGVyLCB7Y2hlY2s6IG9wdGlvbnMuY2hlY2ssIHNpZ25hbDogb3B0aW9ucy5zaWduYWx9KVxufVxuXG4vKipcbiAqIE9yY2hlc3RyYXRlcyBvbmUgY29tcGxldGUgaW1tdXRhYmxlIHByb2plY3QgYnVpbGQgYW5kIG9uZSB0cmFuc2FjdGlvbmFsIHB1YmxpY2F0aW9uLlxuICovXG5leHBvcnQgY2xhc3MgUHJvamVjdEJ1aWxkZXIge1xuICAvKiogQHR5cGUge1Byb2plY3RNYW5pZmVzdExvYWRlcn0gKi9cbiAgI21hbmlmZXN0TG9hZGVyXG4gIC8qKiBAdHlwZSB7UHJvamVjdFNuYXBzaG90QnVpbGRlcn0gKi9cbiAgI3NuYXBzaG90QnVpbGRlclxuICAvKiogQHR5cGUge1RhcmdldENoZWNrUnVubmVyfSAqL1xuICAjY2hlY2tSdW5uZXJcbiAgLyoqIEB0eXBlIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+PiB8IHVuZGVmaW5lZH0gKi9cbiAgI2Vudmlyb25tZW50XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBvbmUtc2hvdCBwcm9qZWN0IGJ1aWxkZXIuXG4gICAqIEBwYXJhbSB7e2NoZWNrUnVubmVyPzogVGFyZ2V0Q2hlY2tSdW5uZXIsIGVudmlyb25tZW50PzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgc3RyaW5nIHwgdW5kZWZpbmVkPj4sIG1hbmlmZXN0TG9hZGVyPzogUHJvamVjdE1hbmlmZXN0TG9hZGVyLCBzbmFwc2hvdEJ1aWxkZXI/OiBQcm9qZWN0U25hcHNob3RCdWlsZGVyfX0gW29wdGlvbnNdIC0gTGlmZWN5Y2xlIGNvbGxhYm9yYXRvcnMuXG4gICAqL1xuICBjb25zdHJ1Y3RvcihvcHRpb25zID0ge30pIHtcbiAgICBpZiAob3B0aW9ucy5jaGVja1J1bm5lciAhPT0gdW5kZWZpbmVkICYmICEob3B0aW9ucy5jaGVja1J1bm5lciBpbnN0YW5jZW9mIFRhcmdldENoZWNrUnVubmVyKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcIlByb2plY3QgYnVpbGRlciBjaGVjayBydW5uZXIgbXVzdCBiZSBhIFRhcmdldENoZWNrUnVubmVyLlwiKVxuICAgIH1cbiAgICB0aGlzLiNtYW5pZmVzdExvYWRlciA9IG9wdGlvbnMubWFuaWZlc3RMb2FkZXIgPz8gbmV3IFByb2plY3RNYW5pZmVzdExvYWRlcigpXG4gICAgdGhpcy4jc25hcHNob3RCdWlsZGVyID0gb3B0aW9ucy5zbmFwc2hvdEJ1aWxkZXIgPz8gbmV3IFByb2plY3RTbmFwc2hvdEJ1aWxkZXIoKVxuICAgIHRoaXMuI2NoZWNrUnVubmVyID0gb3B0aW9ucy5jaGVja1J1bm5lciA/PyBuZXcgVGFyZ2V0Q2hlY2tSdW5uZXIoKVxuICAgIHRoaXMuI2Vudmlyb25tZW50ID0gb3B0aW9ucy5lbnZpcm9ubWVudCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogc25hcHNob3RFbnZpcm9ubWVudChvcHRpb25zLmVudmlyb25tZW50KVxuICB9XG5cbiAgLyoqXG4gICAqIEJ1aWxkcyBhbmQgYXRvbWljYWxseSBwdWJsaXNoZXMgb25lIHByb2plY3QgZ2VuZXJhdGlvbi5cbiAgICogQHBhcmFtIHtzdHJpbmd9IFtwcm9qZWN0UGF0aF0gLSBQcm9qZWN0IG1hbmlmZXN0IHBhdGguXG4gICAqIEBwYXJhbSB7UHJvamVjdEJ1aWxkUmVwb3J0ZXJMaWtlfSBbcmVwb3J0ZXJdIC0gT3B0aW9uYWwgc3RhdGUgcmVwb3J0ZXIuXG4gICAqIEBwYXJhbSB7UHJvamVjdEJ1aWxkT3B0aW9uc30gW29wdGlvbnNdIC0gT3B0aW9uYWwgZGV2ZWxvcGVyLWNoZWNrIGFuZCBwdWJsaWNhdGlvbiBsaWZlY3ljbGUuXG4gICAqIEByZXR1cm5zIHtQcm9taXNlPFJlYWRvbmx5PFByb2plY3RCdWlsZFN1Y2Nlc3M+Pn0gQ29tbWl0dGVkIGJ1aWxkIHJlc3VsdC5cbiAgICovXG4gIGFzeW5jIGJ1aWxkKHByb2plY3RQYXRoID0gXCIuL3NlbWFudGlmb2xkLmpzb25cIiwgcmVwb3J0ZXIsIG9wdGlvbnMgPSB7fSkge1xuICAgIGNvbnN0IHF1ZXVlZFdhdGNoQ29udHJvbHMgPSBwcm9qZWN0V2F0Y2hCdWlsZENvbnRyb2xzLmdldCh0aGlzKVxuICAgIGNvbnN0IHdhdGNoQ29udHJvbHMgPSBxdWV1ZWRXYXRjaENvbnRyb2xzPy5zaGlmdCgpXG5cbiAgICBpZiAocXVldWVkV2F0Y2hDb250cm9scz8ubGVuZ3RoID09IDApIHByb2plY3RXYXRjaEJ1aWxkQ29udHJvbHMuZGVsZXRlKHRoaXMpXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zICE9IFwib2JqZWN0XCIgfHwgb3B0aW9ucyA9PSBudWxsIHx8IEFycmF5LmlzQXJyYXkob3B0aW9ucykgfHwgT2JqZWN0LmdldFByb3RvdHlwZU9mKG9wdGlvbnMpICE9IE9iamVjdC5wcm90b3R5cGUgfHxcbiAgICAgIE9iamVjdC5rZXlzKG9wdGlvbnMpLnNvbWUoa2V5ID0+ICFbXCJjaGVja1wiLCBcInNpZ25hbFwiLCBcInRpbWVvdXRNc1wiXS5pbmNsdWRlcyhrZXkpKSB8fFxuICAgICAgb3B0aW9ucy5jaGVjayAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBvcHRpb25zLmNoZWNrICE9IFwiYm9vbGVhblwiIHx8XG4gICAgICBvcHRpb25zLnNpZ25hbCAhPT0gdW5kZWZpbmVkICYmICEob3B0aW9ucy5zaWduYWwgaW5zdGFuY2VvZiBBYm9ydFNpZ25hbCkgfHxcbiAgICAgIG9wdGlvbnMudGltZW91dE1zICE9PSB1bmRlZmluZWQgJiYgKHR5cGVvZiBvcHRpb25zLnRpbWVvdXRNcyAhPSBcIm51bWJlclwiIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKG9wdGlvbnMudGltZW91dE1zKSkpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjb2RlOiBcIklOVkFMSURfUFJPSkVDVF9CVUlMRFwiLFxuICAgICAgICBsYW5ndWFnZTogXCJwcm9qZWN0XCIsXG4gICAgICAgIG1lc3NhZ2U6IFwiUHJvamVjdCBidWlsZCBvcHRpb25zIHJlcXVpcmUgdmFsaWQgY2hlY2ssIHNuYXBzaG90LWN1cnJlbnRuZXNzLCBjYW5jZWxsYXRpb24sIGFuZCB0aW1lb3V0IGNvbnRyb2xzLlwiXG4gICAgICB9KVxuICAgIH1cbiAgICBjb25zdCBjaGVjayA9IG9wdGlvbnMuY2hlY2sgPT09IHRydWVcbiAgICBjb25zdCBzaWduYWwgPSBvcHRpb25zLnNpZ25hbFxuICAgIGNvbnN0IHByb2plY3QgPSBhd2FpdCB0aGlzLiNtYW5pZmVzdExvYWRlci5sb2FkKHByb2plY3RQYXRoKVxuXG4gICAgcmVwb3J0ZXI/LnByb2plY3RMb2FkZWQocHJvamVjdC5pZClcbiAgICBjb25zdCBzbmFwc2hvdCA9IGF3YWl0IHRoaXMuI3NuYXBzaG90QnVpbGRlci5idWlsZChwcm9qZWN0KVxuXG4gICAgaWYgKHdhdGNoQ29udHJvbHMgIT09IHVuZGVmaW5lZCAmJiBzbmFwc2hvdC5oYXNoICE9IHdhdGNoQ29udHJvbHMuZXhwZWN0ZWRTbmFwc2hvdEhhc2gpIHtcbiAgICAgIHRocm93IG5ldyBTZW1hbnRpZm9sZERpYWdub3N0aWMoe1xuICAgICAgICBjb2RlOiBcIldBVENIX1NOQVBTSE9UX0NIQU5HRURcIixcbiAgICAgICAgbGFuZ3VhZ2U6IHByb2plY3QuaWQsXG4gICAgICAgIG1lc3NhZ2U6IFwiVGhlIGNvbXBsZXRlIHByb2plY3Qgc25hcHNob3QgY2hhbmdlZCBiZWZvcmUgaXRzIHdhdGNoIGN5Y2xlIGJlZ2FuLlwiXG4gICAgICB9KVxuICAgIH1cblxuICAgIHJlcG9ydGVyPy5zbmFwc2hvdExvYWRlZChzbmFwc2hvdC5oYXNoKVxuICAgIHByb2plY3RCdWlsZE9ic2VydmVycy5nZXQodGhpcyk/LihcInNuYXBzaG90XCIpXG4gICAgY29uc3QgcHJvZ3JhbSA9IHBhcnNlUHJvZ3JhbVNvdXJjZSh7XG4gICAgICBlbnRyeU1vZHVsZTogcHJvamVjdC5lbnRyeU1vZHVsZSxcbiAgICAgIHNvdXJjZXM6IHNuYXBzaG90LnNvdXJjZXMubWFwKHNvdXJjZSA9PiAoe1xuICAgICAgICBmaWxlbmFtZTogc291cmNlLnBhdGgsXG4gICAgICAgIGlkOiBzb3VyY2UuaWQsXG4gICAgICAgIGxhbmd1YWdlOiBzb3VyY2UubGFuZ3VhZ2UsXG4gICAgICAgIHNvdXJjZTogc291cmNlLnNvdXJjZVxuICAgICAgfSkpXG4gICAgfSlcblxuICAgIHByb2plY3RCdWlsZE9ic2VydmVycy5nZXQodGhpcyk/LihcInBhcnNlXCIpXG4gICAgLyoqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlB1YmxpY2F0aW9uVGFyZ2V0SW5wdXRbXX0gKi9cbiAgICBjb25zdCBwdWJsaWNhdGlvblRhcmdldHMgPSBbXVxuICAgIC8qKiBAdHlwZSB7UHJvamVjdEJ1aWxkVGFyZ2V0UmVzdWx0W119ICovXG4gICAgY29uc3QgdGFyZ2V0UmVzdWx0cyA9IFtdXG4gICAgLyoqIEB0eXBlIHtNYXA8c3RyaW5nLCBpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlRhcmdldENoZWNrUmVzdWx0Pn0gKi9cbiAgICBjb25zdCBjaGVja1Jlc3VsdHMgPSBuZXcgTWFwKClcblxuICAgIGZvciAoY29uc3QgdGFyZ2V0IG9mIHByb2plY3QudGFyZ2V0cykge1xuICAgICAgaWYgKHRhcmdldC5yb2xlID09IFwiYmluYXJ5XCIpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgICAgY29kZTogXCJVTlNVUFBPUlRFRF9QUk9KRUNUX1RBUkdFVFwiLFxuICAgICAgICAgIGxhbmd1YWdlOiB0YXJnZXQubGFuZ3VhZ2UsXG4gICAgICAgICAgbWVzc2FnZTogXCJDb21wbGV0ZSBzZW1hbnRpYyBwcm9ncmFtcyBkbyBub3Qgc3VwcG9ydCBiaW5hcnkgcHJvamVjdCBnZW5lcmF0aW9uLlwiXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgICBjb25zdCBhcnRpZmFjdFNldCA9IGdlbmVyYXRlUHJvZ3JhbUFydGlmYWN0cyh7XG4gICAgICAgIGxhbmd1YWdlOiB0YXJnZXQubGFuZ3VhZ2UsXG4gICAgICAgIHByb2dyYW0sXG4gICAgICAgIHJvbGU6IHRhcmdldC5yb2xlXG4gICAgICB9KVxuICAgICAgY29uc3QgY2hlY2tDYXBhYmlsaXR5ID0gbGFuZ3VhZ2VSZWdpc3RyeS5yZWNvcmQodGFyZ2V0Lmxhbmd1YWdlKS5jaGVja1xuXG4gICAgICBpZiAoY2hlY2sgJiYgIWNoZWNrQ2FwYWJpbGl0eS5zdXBwb3J0ZWQpIHtcbiAgICAgICAgdGhyb3cgbmV3IFNlbWFudGlmb2xkRGlhZ25vc3RpYyh7XG4gICAgICAgICAgY29kZTogXCJVTlNVUFBPUlRFRF9UQVJHRVRfQ0hFQ0tcIixcbiAgICAgICAgICBsYW5ndWFnZTogdGFyZ2V0Lmxhbmd1YWdlLFxuICAgICAgICAgIG1lc3NhZ2U6IGBQcm9qZWN0IHRhcmdldCAnJHt0YXJnZXQuaWR9JyBkb2VzIG5vdCBwcm92aWRlIGEgZGV2ZWxvcGVyIGNoZWNrIHBsYW4uYFxuICAgICAgICB9KVxuICAgICAgfVxuICAgICAgLyoqXG4gICAgICAgKiBPcmRlcmVkIGNhbmRpZGF0ZSB2YWxpZGF0b3JzIHdoZW4gY2hlY2tpbmcgaXMgZW5hYmxlZC5cbiAgICAgICAqIEB0eXBlIHtpbXBvcnQoXCIuL3NlbWFudGljL3R5cGVzLmpzXCIpLlB1YmxpY2F0aW9uVmFsaWRhdG9yW10gfCB1bmRlZmluZWR9XG4gICAgICAgKi9cbiAgICAgIGNvbnN0IHZhbGlkYXRvcnMgPSBjaGVjayA/IFthc3luYyAoe2J1aWxkUGF0aCwgc291cmNlUGF0aCwgdGFyZ2V0SWR9KSA9PiB7XG4gICAgICAgIC8qKiBAdHlwZSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5EaXNjb3ZlcmVkVG9vbGNoYWluW119ICovXG4gICAgICAgIGNvbnN0IHRvb2xzID0gW11cblxuICAgICAgICBmb3IgKGNvbnN0IHRvb2xjaGFpbiBvZiBjaGVja0NhcGFiaWxpdHkudG9vbGNoYWlucykge1xuICAgICAgICAgIHRvb2xzLnB1c2goYXdhaXQgZGlzY292ZXJDYW5vbmljYWxUb29sY2hhaW4oLyoqIEB0eXBlIHtrZXlvZiB0eXBlb2YgY2Fub25pY2FsVG9vbGNoYWluc30gKi8gKHRvb2xjaGFpbiksIHtcbiAgICAgICAgICAgIC4uLih0aGlzLiNlbnZpcm9ubWVudCA9PT0gdW5kZWZpbmVkID8ge30gOiB7ZW52aXJvbm1lbnQ6IHRoaXMuI2Vudmlyb25tZW50fSlcbiAgICAgICAgICB9KSlcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwbGFuID0gY3JlYXRlVGFyZ2V0Q2hlY2tQbGFuKHtcbiAgICAgICAgICBhcnRpZmFjdHM6IGFydGlmYWN0U2V0LFxuICAgICAgICAgIGJ1aWxkUGF0aCxcbiAgICAgICAgICBwcm9qZWN0SWQ6IHByb2plY3QuaWQsXG4gICAgICAgICAgc291cmNlUGF0aCxcbiAgICAgICAgICB0YXJnZXRJZCxcbiAgICAgICAgICB0b29sczogT2JqZWN0LmZyZWV6ZSh0b29scylcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdGhpcy4jY2hlY2tSdW5uZXIucnVuKHBsYW4sIHtcbiAgICAgICAgICBvblN0YWdlOiBzdGFnZSA9PiB7XG4gICAgICAgICAgICByZXBvcnRlcj8udGFyZ2V0Q2hlY2tlZCh7aWQ6IHRhcmdldC5pZCwgbGFuZ3VhZ2U6IHRhcmdldC5sYW5ndWFnZSwgc3RhZ2V9KVxuICAgICAgICAgICAgcHJvamVjdEJ1aWxkT2JzZXJ2ZXJzLmdldCh0aGlzKT8uKGBjaGVjazoke3RhcmdldC5pZH06JHtzdGFnZS5zdGFnZX1gKVxuICAgICAgICAgIH0sXG4gICAgICAgICAgLi4uKHNpZ25hbCA9PT0gdW5kZWZpbmVkID8ge30gOiB7c2lnbmFsfSksXG4gICAgICAgICAgLi4uKG9wdGlvbnMudGltZW91dE1zID09PSB1bmRlZmluZWQgPyB7fSA6IHt0aW1lb3V0TXM6IG9wdGlvbnMudGltZW91dE1zfSlcbiAgICAgICAgfSlcblxuICAgICAgICBjaGVja1Jlc3VsdHMuc2V0KHRhcmdldC5pZCwgcmVzdWx0KVxuXG4gICAgICAgIHJldHVybiBbLi4ucmVzdWx0Lm91dHB1dHNdXG4gICAgICB9XSA6IHVuZGVmaW5lZFxuXG4gICAgICBwdWJsaWNhdGlvblRhcmdldHMucHVzaCh7XG4gICAgICAgIGFydGlmYWN0U2V0LFxuICAgICAgICBidWlsZFByb2plY3Rpb246IHRhcmdldC5idWlsZFByb2plY3Rpb24sXG4gICAgICAgIGlkOiB0YXJnZXQuaWQsXG4gICAgICAgIHJvbGU6IHRhcmdldC5yb2xlLFxuICAgICAgICBzb3VyY2VQcm9qZWN0aW9uOiB0YXJnZXQuc291cmNlUHJvamVjdGlvbixcbiAgICAgICAgLi4uKHZhbGlkYXRvcnMgPT09IHVuZGVmaW5lZCA/IHt9IDoge3ZhbGlkYXRvcnN9KVxuICAgICAgfSlcbiAgICAgIHRhcmdldFJlc3VsdHMucHVzaChPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXJ0aWZhY3RDb3VudDogYXJ0aWZhY3RTZXQuYXJ0aWZhY3RzLmxlbmd0aCxcbiAgICAgICAgaWQ6IHRhcmdldC5pZCxcbiAgICAgICAgbGFuZ3VhZ2U6IHRhcmdldC5sYW5ndWFnZSxcbiAgICAgICAgcm9sZTogdGFyZ2V0LnJvbGVcbiAgICAgIH0pKVxuICAgICAgcmVwb3J0ZXI/LnRhcmdldEdlbmVyYXRlZCh0YXJnZXRSZXN1bHRzW3RhcmdldFJlc3VsdHMubGVuZ3RoIC0gMV0pXG4gICAgICBwcm9qZWN0QnVpbGRPYnNlcnZlcnMuZ2V0KHRoaXMpPy4oYHRhcmdldDoke3RhcmdldC5pZH1gKVxuICAgIH1cbiAgICBjb25zdCBwdWJsaXNoZXIgPSBuZXcgR2VuZXJhdGVkQXJ0aWZhY3RQdWJsaXNoZXIoe1xuICAgICAgcHJvamVjdElkOiBwcm9qZWN0LmlkLFxuICAgICAgcHJvamVjdFJvb3Q6IHByb2plY3QucHJvamVjdFJvb3QsXG4gICAgICBwdWJsaWNhdGlvblJvb3Q6IHByb2plY3QucHVibGljYXRpb25Sb290LFxuICAgICAgc291cmNlRmlsZXM6IHByb2plY3Quc291cmNlcy5tYXAoKHthYnNvbHV0ZVBhdGh9KSA9PiBhYnNvbHV0ZVBhdGgpXG4gICAgfSlcbiAgICBjb25zdCBnZW5lcmF0aW9uSWQgPSBjaGVja1xuICAgICAgPyBgZy0ke3NuYXBzaG90Lmhhc2h9LWNoZWNrZWQtJHtyYW5kb21VVUlEKCl9YFxuICAgICAgOiBgZy0ke3NuYXBzaG90Lmhhc2h9YFxuICAgIGlmICh3YXRjaENvbnRyb2xzICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGd1YXJkTmV4dFB1YmxpY2F0aW9uQ29tbWl0KHB1Ymxpc2hlciwgd2F0Y2hDb250cm9scy52YWxpZGF0ZUN1cnJlbnRTbmFwc2hvdClcbiAgICB9XG4gICAgY29uc3QgcHVibGljYXRpb25TaWduYWwgPSBzaWduYWwgPT09IHVuZGVmaW5lZFxuICAgICAgPyB3YXRjaENvbnRyb2xzPy5wdWJsaWNhdGlvblNpZ25hbFxuICAgICAgOiB3YXRjaENvbnRyb2xzID09PSB1bmRlZmluZWRcbiAgICAgICAgPyBzaWduYWxcbiAgICAgICAgOiBBYm9ydFNpZ25hbC5hbnkoW3NpZ25hbCwgd2F0Y2hDb250cm9scy5wdWJsaWNhdGlvblNpZ25hbF0pXG4gICAgY29uc3QgZ2VuZXJhdGlvbiA9IGF3YWl0IHB1Ymxpc2hlci5wdWJsaXNoKHtnZW5lcmF0aW9uSWQsIHRhcmdldHM6IHB1YmxpY2F0aW9uVGFyZ2V0c30sIHtcbiAgICAgIC4uLihwdWJsaWNhdGlvblNpZ25hbCA9PT0gdW5kZWZpbmVkID8ge30gOiB7c2lnbmFsOiBwdWJsaWNhdGlvblNpZ25hbH0pXG4gICAgfSlcblxuICAgIHByb2plY3RCdWlsZE9ic2VydmVycy5nZXQodGhpcyk/LihcInB1Ymxpc2hcIilcblxuICAgIHJldHVybiBPYmplY3QuZnJlZXplKHtcbiAgICAgIGdlbmVyYXRpb24sXG4gICAgICBnZW5lcmF0aW9uSWQsXG4gICAgICBjaGVja2VkOiBjaGVjayxcbiAgICAgIHByb2plY3RJZDogcHJvamVjdC5pZCxcbiAgICAgIHNuYXBzaG90SGFzaDogc25hcHNob3QuaGFzaCxcbiAgICAgIHN0YXR1czogLyoqIEB0eXBlIHtjb25zdH0gKi8gKFwic3VjY2VlZGVkXCIpLFxuICAgICAgdGFyZ2V0czogT2JqZWN0LmZyZWV6ZSh0YXJnZXRSZXN1bHRzLm1hcCh0YXJnZXQgPT4ge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBjaGVja1Jlc3VsdHMuZ2V0KHRhcmdldC5pZClcblxuICAgICAgICByZXR1cm4gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgICAgLi4udGFyZ2V0LFxuICAgICAgICAgIC4uLihyZXN1bHQgPT09IHVuZGVmaW5lZCA/IHt9IDoge2NoZWNrOiBPYmplY3QuZnJlZXplKHtzdGFnZXM6IHJlc3VsdC5zdGFnZXN9KX0pXG4gICAgICAgIH0pXG4gICAgICB9KSlcbiAgICB9KVxuICB9XG59XG5cbi8qKlxuICogQHR5cGVkZWYgUHJvamVjdEJ1aWxkT3B0aW9uc1xuICogQHByb3BlcnR5IHtib29sZWFufSBbY2hlY2tdIC0gV2hldGhlciBldmVyeSB0YXJnZXQgbXVzdCBydW4gaXRzIGRldmVsb3BlciBjaGVjay5cbiAqIEBwcm9wZXJ0eSB7QWJvcnRTaWduYWx9IFtzaWduYWxdIC0gQWN0aXZlIGNoZWNrIGFuZCBwdWJsaWNhdGlvbiBjYW5jZWxsYXRpb24gYXV0aG9yaXR5LlxuICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0TXNdIC0gUGVyLWNoZWNrLXN0YWdlIGRlYWRsaW5lLlxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgUHJvamVjdFdhdGNoQnVpbGRPcHRpb25zXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGNoZWNrIC0gV2hldGhlciBldmVyeSB0YXJnZXQgbXVzdCBydW4gaXRzIGRldmVsb3BlciBjaGVjay5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHBlY3RlZFNuYXBzaG90SGFzaCAtIENvb3JkaW5hdG9yLXJlY29uY2lsZWQgY29tcGxldGUgZ3JhcGggaGFzaC5cbiAqIEBwcm9wZXJ0eSB7QWJvcnRTaWduYWx9IHB1YmxpY2F0aW9uU2lnbmFsIC0gUHVibGljYXRpb24tb25seSBjYW5jZWxsYXRpb24gYXV0aG9yaXR5LlxuICogQHByb3BlcnR5IHtBYm9ydFNpZ25hbH0gc2lnbmFsIC0gQWN0aXZlIGNoZWNrIGFuZCBwdWJsaWNhdGlvbiBjYW5jZWxsYXRpb24gYXV0aG9yaXR5LlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZH0gdmFsaWRhdGVDdXJyZW50U25hcHNob3QgLSBDb21wbGV0ZSBncmFwaCBndWFyZCBhdCB0aGUgcG9pbnRlciBib3VuZGFyeS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByb2plY3RXYXRjaEJ1aWxkQ29udHJvbHNcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBleHBlY3RlZFNuYXBzaG90SGFzaCAtIENvb3JkaW5hdG9yLXJlY29uY2lsZWQgY29tcGxldGUgZ3JhcGggaGFzaC5cbiAqIEBwcm9wZXJ0eSB7QWJvcnRTaWduYWx9IHB1YmxpY2F0aW9uU2lnbmFsIC0gUHVibGljYXRpb24tb25seSBjYW5jZWxsYXRpb24gYXV0aG9yaXR5LlxuICogQHByb3BlcnR5IHsoKSA9PiBQcm9taXNlPHZvaWQ+IHwgdm9pZH0gdmFsaWRhdGVDdXJyZW50U25hcHNob3QgLSBDb21wbGV0ZSBncmFwaCBndWFyZCBhdCB0aGUgcG9pbnRlciBib3VuZGFyeS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByb2plY3RCdWlsZFJlcG9ydGVyTGlrZVxuICogQHByb3BlcnR5IHsocHJvamVjdElkOiBzdHJpbmcpID0+IHZvaWR9IHByb2plY3RMb2FkZWQgLSBSZXBvcnRzIHZhbGlkYXRlZCBjb25maWd1cmF0aW9uLlxuICogQHByb3BlcnR5IHsoc25hcHNob3RIYXNoOiBzdHJpbmcpID0+IHZvaWR9IHNuYXBzaG90TG9hZGVkIC0gUmVwb3J0cyBhIGNvbXBsZXRlIHNuYXBzaG90LlxuICogQHByb3BlcnR5IHsodGFyZ2V0OiBQcm9qZWN0QnVpbGRUYXJnZXRSZXN1bHQpID0+IHZvaWR9IHRhcmdldEdlbmVyYXRlZCAtIFJlcG9ydHMgZ2VuZXJhdGVkIHRhcmdldCBvdXRwdXQuXG4gKiBAcHJvcGVydHkgeyhjaGVja2VkOiB7aWQ6IHN0cmluZywgbGFuZ3VhZ2U6IHN0cmluZywgc3RhZ2U6IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuVGFyZ2V0Q2hlY2tTdGFnZVJlc3VsdH0pID0+IHZvaWR9IHRhcmdldENoZWNrZWQgLSBSZXBvcnRzIGEgc3VjY2Vzc2Z1bCBjaGVjayBzdGFnZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByb2plY3RCdWlsZFRhcmdldFJlc3VsdFxuICogQHByb3BlcnR5IHtudW1iZXJ9IGFydGlmYWN0Q291bnQgLSBHZW5lcmF0ZWQgYXJ0aWZhY3QgY291bnQuXG4gKiBAcHJvcGVydHkge3N0cmluZ30gaWQgLSBQcm9qZWN0IHRhcmdldCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5CYWNrZW5kTGFuZ3VhZ2V9IGxhbmd1YWdlIC0gQmFja2VuZCB0YXJnZXQgaWRlbnRpdHkuXG4gKiBAcHJvcGVydHkge2ltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuUHVibGljYXRpb25UYXJnZXRSb2xlfSByb2xlIC0gRXhwbGljaXQgdGFyZ2V0IHJvbGUuXG4gKiBAcHJvcGVydHkge1JlYWRvbmx5PHtzdGFnZXM6IHJlYWRvbmx5IGltcG9ydChcIi4vc2VtYW50aWMvdHlwZXMuanNcIikuVGFyZ2V0Q2hlY2tTdGFnZVJlc3VsdFtdfT59IFtjaGVja10gLSBTdWNjZXNzZnVsIGRldmVsb3Blci1jaGVjayBldmlkZW5jZS5cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIFByb2plY3RCdWlsZFN1Y2Nlc3NcbiAqIEBwcm9wZXJ0eSB7XCJzdWNjZWVkZWRcIn0gc3RhdHVzIC0gVGVybWluYWwgc3VjY2VzcyBzdGF0ZS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBwcm9qZWN0SWQgLSBTdGFibGUgcHJvamVjdCBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzbmFwc2hvdEhhc2ggLSBDb21wbGV0ZSBvcmRlcmVkIGlucHV0IGhhc2guXG4gKiBAcHJvcGVydHkge3N0cmluZ30gZ2VuZXJhdGlvbklkIC0gRGV0ZXJtaW5pc3RpYyBpbW11dGFibGUgZ2VuZXJhdGlvbiBpZGVudGl0eS5cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gY2hlY2tlZCAtIFdoZXRoZXIgZGV2ZWxvcGVyIGNoZWNrcyBjb21wbGV0ZWQgZm9yIGV2ZXJ5IHRhcmdldC5cbiAqIEBwcm9wZXJ0eSB7cmVhZG9ubHkgUHJvamVjdEJ1aWxkVGFyZ2V0UmVzdWx0W119IHRhcmdldHMgLSBPcmRlcmVkIGdlbmVyYXRlZCB0YXJnZXQgcmVzdWx0cy5cbiAqIEBwcm9wZXJ0eSB7aW1wb3J0KFwiLi9zZW1hbnRpYy90eXBlcy5qc1wiKS5QdWJsaXNoZWRHZW5lcmF0aW9ufSBnZW5lcmF0aW9uIC0gQ29tbWl0dGVkIHB1Ymxpc2hlciBzbmFwc2hvdC5cbiAqL1xuXG4vKipcbiAqIERldGFjaGVzIGV4cGxpY2l0IHRvb2wgZGlzY292ZXJ5IGNvbmZpZ3VyYXRpb24gZnJvbSBjYWxsZXIgbXV0YXRpb24uXG4gKiBAcGFyYW0ge3Vua25vd259IGNhbmRpZGF0ZSAtIENhbmRpZGF0ZSBlbnZpcm9ubWVudC5cbiAqIEByZXR1cm5zIHtSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+Pn0gSW1tdXRhYmxlIHNuYXBzaG90LlxuICovXG5mdW5jdGlvbiBzbmFwc2hvdEVudmlyb25tZW50KGNhbmRpZGF0ZSkge1xuICBpZiAodHlwZW9mIGNhbmRpZGF0ZSAhPSBcIm9iamVjdFwiIHx8IGNhbmRpZGF0ZSA9PSBudWxsIHx8IEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9qZWN0IGJ1aWxkZXIgZW52aXJvbm1lbnQgbXVzdCBiZSBhIHBsYWluIHN0cmluZyByZWNvcmQuXCIpXG4gIH1cbiAgY29uc3QgcHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGNhbmRpZGF0ZSlcblxuICBpZiAocHJvdG90eXBlICE9PSBPYmplY3QucHJvdG90eXBlICYmIHByb3RvdHlwZSAhPT0gbnVsbCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9qZWN0IGJ1aWxkZXIgZW52aXJvbm1lbnQgbXVzdCBiZSBhIHBsYWluIHN0cmluZyByZWNvcmQuXCIpXG4gIH1cbiAgLyoqIEB0eXBlIHtSZWNvcmQ8c3RyaW5nLCBzdHJpbmcgfCB1bmRlZmluZWQ+fSAqL1xuICBjb25zdCBzbmFwc2hvdCA9IE9iamVjdC5jcmVhdGUobnVsbClcblxuICBmb3IgKGNvbnN0IGtleSBvZiBSZWZsZWN0Lm93bktleXMoY2FuZGlkYXRlKSkge1xuICAgIGlmICh0eXBlb2Yga2V5ICE9IFwic3RyaW5nXCIpIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9qZWN0IGJ1aWxkZXIgZW52aXJvbm1lbnQgbXVzdCB1c2Ugc3RyaW5nIGtleXMuXCIpXG4gICAgY29uc3QgZGVzY3JpcHRvciA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY2FuZGlkYXRlLCBrZXkpXG5cbiAgICBpZiAoZGVzY3JpcHRvciA9PSB1bmRlZmluZWQgfHwgIWRlc2NyaXB0b3IuZW51bWVyYWJsZSB8fCAhKFwidmFsdWVcIiBpbiBkZXNjcmlwdG9yKSB8fFxuICAgICAgZGVzY3JpcHRvci52YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBkZXNjcmlwdG9yLnZhbHVlICE9IFwic3RyaW5nXCIpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJQcm9qZWN0IGJ1aWxkZXIgZW52aXJvbm1lbnQgbXVzdCBjb250YWluIHN0cmluZyBvciB1bmRlZmluZWQgZGF0YSB2YWx1ZXMuXCIpXG4gICAgfVxuICAgIHNuYXBzaG90W2tleV0gPSBkZXNjcmlwdG9yLnZhbHVlXG4gIH1cblxuICByZXR1cm4gT2JqZWN0LmZyZWV6ZShzbmFwc2hvdClcbn1cblxuLyoqXG4gKiBDaGVja3MgZm9yIGFuIG9yZGluYXJ5IG9iamVjdC1wcm90b3R5cGUgcmVjb3JkLlxuICogQHBhcmFtIHt1bmtub3dufSB2YWx1ZSAtIENhbmRpZGF0ZSB2YWx1ZS5cbiAqIEByZXR1cm5zIHt2YWx1ZSBpcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPn0gV2hldGhlciB0aGUgdmFsdWUgaXMgYSBwbGFpbiBvYmplY3QuXG4gKi9cbmZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodmFsdWUpIHtcbiAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSBcIm9iamVjdFwiICYmIHZhbHVlICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsdWUpICYmIE9iamVjdC5nZXRQcm90b3R5cGVPZih2YWx1ZSkgPT0gT2JqZWN0LnByb3RvdHlwZVxufVxuIl19
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { ProjectBuilder } from "./project-build.js";
|
|
2
|
+
import { ProjectWatchCoordinator } from "./project-watch.js";
|
|
3
|
+
/**
|
|
4
|
+
* Owns one strict command invocation while delegating durable build behavior.
|
|
5
|
+
*/
|
|
6
|
+
export declare class SemantifoldCli {
|
|
7
|
+
#private;
|
|
8
|
+
/**
|
|
9
|
+
* Creates an importable CLI lifecycle.
|
|
10
|
+
* @param {{builder?: ProjectBuilder, coordinator?: ProjectWatchCoordinator, stderr?: import("./project-reporter.js").WritableOutput, stdout?: import("./project-reporter.js").WritableOutput}} [options] - Collaborators and sinks.
|
|
11
|
+
*/
|
|
12
|
+
constructor(options?: {
|
|
13
|
+
builder?: ProjectBuilder;
|
|
14
|
+
coordinator?: ProjectWatchCoordinator;
|
|
15
|
+
stderr?: import("./project-reporter.js").WritableOutput;
|
|
16
|
+
stdout?: import("./project-reporter.js").WritableOutput;
|
|
17
|
+
});
|
|
18
|
+
/**
|
|
19
|
+
* Runs one command without mutating process exit state.
|
|
20
|
+
* @param {readonly string[]} arguments_ - Arguments after the executable name.
|
|
21
|
+
* @returns {Promise<0 | 1>} Exact process status.
|
|
22
|
+
*/
|
|
23
|
+
run(arguments_: readonly string[]): Promise<0 | 1>;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Parses the intentionally narrow one-shot CLI grammar.
|
|
27
|
+
* @param {readonly string[]} arguments_ - Arguments after the executable name.
|
|
28
|
+
* @returns {Readonly<{check: boolean, format: "human" | "ndjson", projectPath: string}> | Readonly<{command: "watch", check: boolean, format: "human" | "ndjson", projectPath: string}>} Validated command options.
|
|
29
|
+
*/
|
|
30
|
+
export declare function parseSemantifoldCliArguments(arguments_: readonly string[]): Readonly<{
|
|
31
|
+
check: boolean;
|
|
32
|
+
format: "human" | "ndjson";
|
|
33
|
+
projectPath: string;
|
|
34
|
+
}> | Readonly<{
|
|
35
|
+
command: "watch";
|
|
36
|
+
check: boolean;
|
|
37
|
+
format: "human" | "ndjson";
|
|
38
|
+
projectPath: string;
|
|
39
|
+
}>;
|
|
40
|
+
//# sourceMappingURL=project-cli.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-cli.d.ts","sourceRoot":"","sources":["../../src/project-cli.js"],"names":[],"mappings":"AAGA,OAAO,EAAC,cAAc,EAAC,MAAM,oBAAoB,CAAA;AAEjD,OAAO,EAAC,uBAAuB,EAAC,MAAM,oBAAoB,CAAA;AAG1D;;GAEG;AACH,qBAAa,cAAc;;IAUzB;;;OAGG;IACH,YAAY,OAAO,AAFhB,CACF,EADU;QAAC,OAAO,CAAC,EAAE,cAAc,CAAC;QAAC,WAAW,CAAC,EAAE,uBAAuB,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,uBAAuB,EAAE,cAAc,CAAC;QAAC,MAAM,CAAC,EAAE,OAAO,uBAAuB,EAAE,cAAc,CAAA;KAErK,EAKvB;IAED;;;;OAIG;IACG,GAAG,CAAC,UAAU,EAHT,SAAS,MAAM,EAGN,GAFP,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAuD1B;CACF;AAED;;;;GAIG;AACH,wBAAgB,4BAA4B,CAAC,UAAU,EAH5C,SAAS,MAAM,EAG6B,GAF1C,QAAQ,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAC,CAAC,GAAG,QAAQ,CAAC;IAAC,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAC,CAAC,CA6CvL"}
|