semantifold 0.9.0 → 0.11.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.
Files changed (198) hide show
  1. package/README.md +6 -3
  2. package/bin/semantifold.js +6 -0
  3. package/build/bin/semantifold.d.ts +3 -0
  4. package/build/bin/semantifold.d.ts.map +1 -0
  5. package/build/bin/semantifold.js +5 -0
  6. package/build/index.d.ts +8 -0
  7. package/build/index.d.ts.map +1 -1
  8. package/build/index.js +9 -1
  9. package/build/src/artifact-path.d.ts +16 -0
  10. package/build/src/artifact-path.d.ts.map +1 -1
  11. package/build/src/artifact-path.js +29 -3
  12. package/build/src/backends/c-check.d.ts +7 -0
  13. package/build/src/backends/c-check.d.ts.map +1 -0
  14. package/build/src/backends/c-check.js +65 -0
  15. package/build/src/backends/check-plan.d.ts +96 -0
  16. package/build/src/backends/check-plan.d.ts.map +1 -0
  17. package/build/src/backends/check-plan.js +135 -0
  18. package/build/src/backends/cpp-check.d.ts +7 -0
  19. package/build/src/backends/cpp-check.d.ts.map +1 -0
  20. package/build/src/backends/cpp-check.js +59 -0
  21. package/build/src/backends/csharp-check.d.ts +7 -0
  22. package/build/src/backends/csharp-check.d.ts.map +1 -0
  23. package/build/src/backends/csharp-check.js +125 -0
  24. package/build/src/backends/csharp.d.ts +1 -0
  25. package/build/src/backends/csharp.d.ts.map +1 -1
  26. package/build/src/backends/csharp.js +5 -4
  27. package/build/src/backends/dart-check.d.ts +7 -0
  28. package/build/src/backends/dart-check.d.ts.map +1 -0
  29. package/build/src/backends/dart-check.js +103 -0
  30. package/build/src/backends/dart.d.ts +2 -0
  31. package/build/src/backends/dart.d.ts.map +1 -1
  32. package/build/src/backends/dart.js +5 -5
  33. package/build/src/backends/go-check.d.ts +7 -0
  34. package/build/src/backends/go-check.d.ts.map +1 -0
  35. package/build/src/backends/go-check.js +77 -0
  36. package/build/src/backends/go.d.ts +1 -0
  37. package/build/src/backends/go.d.ts.map +1 -1
  38. package/build/src/backends/go.js +3 -3
  39. package/build/src/backends/java-check.d.ts +21 -0
  40. package/build/src/backends/java-check.d.ts.map +1 -0
  41. package/build/src/backends/java-check.js +73 -0
  42. package/build/src/backends/javascript-check.d.ts +7 -0
  43. package/build/src/backends/javascript-check.d.ts.map +1 -0
  44. package/build/src/backends/javascript-check.js +29 -0
  45. package/build/src/backends/kotlin-check.d.ts +7 -0
  46. package/build/src/backends/kotlin-check.d.ts.map +1 -0
  47. package/build/src/backends/kotlin-check.js +31 -0
  48. package/build/src/backends/kotlin.d.ts +1 -1
  49. package/build/src/backends/kotlin.js +2 -2
  50. package/build/src/backends/php-check.d.ts +7 -0
  51. package/build/src/backends/php-check.d.ts.map +1 -0
  52. package/build/src/backends/php-check.js +21 -0
  53. package/build/src/backends/program.d.ts +7 -0
  54. package/build/src/backends/program.d.ts.map +1 -1
  55. package/build/src/backends/program.js +16 -1
  56. package/build/src/backends/python-check.d.ts +7 -0
  57. package/build/src/backends/python-check.d.ts.map +1 -0
  58. package/build/src/backends/python-check.js +28 -0
  59. package/build/src/backends/ruby-check.d.ts +7 -0
  60. package/build/src/backends/ruby-check.d.ts.map +1 -0
  61. package/build/src/backends/ruby-check.js +21 -0
  62. package/build/src/backends/rust-check.d.ts +7 -0
  63. package/build/src/backends/rust-check.d.ts.map +1 -0
  64. package/build/src/backends/rust-check.js +65 -0
  65. package/build/src/backends/shared.d.ts.map +1 -1
  66. package/build/src/backends/shared.js +29 -1
  67. package/build/src/backends/swift-check.d.ts +7 -0
  68. package/build/src/backends/swift-check.d.ts.map +1 -0
  69. package/build/src/backends/swift-check.js +77 -0
  70. package/build/src/backends/typescript-check.d.ts +7 -0
  71. package/build/src/backends/typescript-check.d.ts.map +1 -0
  72. package/build/src/backends/typescript-check.js +33 -0
  73. package/build/src/backends/zig-check.d.ts +7 -0
  74. package/build/src/backends/zig-check.d.ts.map +1 -0
  75. package/build/src/backends/zig-check.js +70 -0
  76. package/build/src/diagnostic.d.ts +13 -1
  77. package/build/src/diagnostic.d.ts.map +1 -1
  78. package/build/src/diagnostic.js +14 -2
  79. package/build/src/frontends/java.d.ts.map +1 -1
  80. package/build/src/frontends/java.js +23 -1
  81. package/build/src/frontends/javascript-typescript.d.ts.map +1 -1
  82. package/build/src/frontends/javascript-typescript.js +45 -4
  83. package/build/src/frontends/php.d.ts.map +1 -1
  84. package/build/src/frontends/php.js +54 -3
  85. package/build/src/frontends/program.d.ts +6 -0
  86. package/build/src/frontends/program.d.ts.map +1 -1
  87. package/build/src/frontends/program.js +9 -1
  88. package/build/src/frontends/ruby.d.ts.map +1 -1
  89. package/build/src/frontends/ruby.js +55 -5
  90. package/build/src/language-registry.d.ts +54 -0
  91. package/build/src/language-registry.d.ts.map +1 -1
  92. package/build/src/language-registry.js +124 -10
  93. package/build/src/project-build.d.ts +172 -0
  94. package/build/src/project-build.d.ts.map +1 -0
  95. package/build/src/project-build.js +320 -0
  96. package/build/src/project-cli.d.ts +40 -0
  97. package/build/src/project-cli.d.ts.map +1 -0
  98. package/build/src/project-cli.js +145 -0
  99. package/build/src/project-manifest.d.ts +148 -0
  100. package/build/src/project-manifest.d.ts.map +1 -0
  101. package/build/src/project-manifest.js +432 -0
  102. package/build/src/project-reporter.d.ts +81 -0
  103. package/build/src/project-reporter.d.ts.map +1 -0
  104. package/build/src/project-reporter.js +293 -0
  105. package/build/src/project-snapshot.d.ts +129 -0
  106. package/build/src/project-snapshot.d.ts.map +1 -0
  107. package/build/src/project-snapshot.js +362 -0
  108. package/build/src/project-watch-reporter.d.ts +125 -0
  109. package/build/src/project-watch-reporter.d.ts.map +1 -0
  110. package/build/src/project-watch-reporter.js +280 -0
  111. package/build/src/project-watch.d.ts +133 -0
  112. package/build/src/project-watch.d.ts.map +1 -0
  113. package/build/src/project-watch.js +839 -0
  114. package/build/src/publication.d.ts +69 -5
  115. package/build/src/publication.d.ts.map +1 -1
  116. package/build/src/publication.js +246 -57
  117. package/build/src/semantic/effects.js +3 -1
  118. package/build/src/semantic/provenance.d.ts.map +1 -1
  119. package/build/src/semantic/provenance.js +11 -1
  120. package/build/src/semantic/types.d.ts +355 -4
  121. package/build/src/semantic/types.d.ts.map +1 -1
  122. package/build/src/semantic/types.js +92 -3
  123. package/build/src/semantic/validate.js +18 -1
  124. package/build/src/subprocess.d.ts +8 -0
  125. package/build/src/subprocess.d.ts.map +1 -1
  126. package/build/src/subprocess.js +50 -9
  127. package/build/src/target-check.d.ts +52 -0
  128. package/build/src/target-check.d.ts.map +1 -0
  129. package/build/src/target-check.js +796 -0
  130. package/build/src/toolchains.d.ts.map +1 -1
  131. package/build/src/toolchains.js +3 -3
  132. package/docs/adr-expression-breadth.md +186 -0
  133. package/docs/architecture.md +3 -1
  134. package/docs/c.md +4 -0
  135. package/docs/cpp.md +4 -0
  136. package/docs/dart.md +4 -0
  137. package/docs/generated-artifact-publication.md +11 -8
  138. package/docs/kotlin.md +2 -2
  139. package/docs/language-support.md +40 -6
  140. package/docs/parser-qualification.md +1 -1
  141. package/docs/project-build-cli.md +147 -0
  142. package/docs/project-watch.md +60 -0
  143. package/docs/rust.md +4 -0
  144. package/docs/swift.md +2 -0
  145. package/docs/testing.md +70 -3
  146. package/docs/watch-build-pipeline.md +39 -23
  147. package/docs/zig.md +2 -0
  148. package/examples/jsdoc-java-watch/expected-output.txt +3 -0
  149. package/examples/jsdoc-java-watch/semantifold.json +23 -0
  150. package/examples/jsdoc-java-watch/src/main.js +21 -0
  151. package/index.js +8 -0
  152. package/package.json +6 -1
  153. package/src/artifact-path.js +31 -2
  154. package/src/backends/c-check.js +80 -0
  155. package/src/backends/check-plan.js +147 -0
  156. package/src/backends/cpp-check.js +73 -0
  157. package/src/backends/csharp-check.js +139 -0
  158. package/src/backends/csharp.js +4 -3
  159. package/src/backends/dart-check.js +117 -0
  160. package/src/backends/dart.js +4 -4
  161. package/src/backends/go-check.js +89 -0
  162. package/src/backends/go.js +2 -2
  163. package/src/backends/java-check.js +77 -0
  164. package/src/backends/javascript-check.js +33 -0
  165. package/src/backends/kotlin-check.js +41 -0
  166. package/src/backends/kotlin.js +1 -1
  167. package/src/backends/php-check.js +23 -0
  168. package/src/backends/program.js +17 -0
  169. package/src/backends/python-check.js +30 -0
  170. package/src/backends/ruby-check.js +23 -0
  171. package/src/backends/rust-check.js +78 -0
  172. package/src/backends/shared.js +30 -0
  173. package/src/backends/swift-check.js +89 -0
  174. package/src/backends/typescript-check.js +37 -0
  175. package/src/backends/zig-check.js +81 -0
  176. package/src/diagnostic.js +9 -1
  177. package/src/frontends/java.js +24 -0
  178. package/src/frontends/javascript-typescript.js +49 -2
  179. package/src/frontends/php.js +61 -2
  180. package/src/frontends/program.js +9 -0
  181. package/src/frontends/ruby.js +62 -2
  182. package/src/language-registry.js +130 -9
  183. package/src/project-build.js +353 -0
  184. package/src/project-cli.js +155 -0
  185. package/src/project-manifest.js +479 -0
  186. package/src/project-reporter.js +320 -0
  187. package/src/project-snapshot.js +403 -0
  188. package/src/project-watch-reporter.js +303 -0
  189. package/src/project-watch.js +870 -0
  190. package/src/publication.js +275 -58
  191. package/src/semantic/effects.js +1 -0
  192. package/src/semantic/provenance.js +8 -0
  193. package/src/semantic/types.js +101 -2
  194. package/src/semantic/validate.js +26 -0
  195. package/src/subprocess.js +49 -8
  196. package/src/target-check.js +844 -0
  197. package/src/toolchains.js +3 -2
  198. 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"}