@decohere/forge 0.0.1-dev.11 → 0.0.1-dev.110

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 (148) hide show
  1. package/README.md +139 -0
  2. package/commonjs/src/actions/build.action.js +8 -2
  3. package/commonjs/src/actions/clean.action.js +2 -4
  4. package/commonjs/src/actions/commit.action.js +0 -2
  5. package/commonjs/src/actions/copy.action.js +37 -7
  6. package/commonjs/src/actions/dependency-report.action.js +0 -2
  7. package/commonjs/src/actions/dependency-sync.action.js +0 -2
  8. package/commonjs/src/actions/docker.action.js +209 -0
  9. package/commonjs/src/actions/index.js +5 -2
  10. package/commonjs/src/actions/link.action.js +154 -0
  11. package/commonjs/src/actions/package.action.js +234 -0
  12. package/commonjs/src/actions/publish.action.js +0 -2
  13. package/commonjs/src/actions/sync-lock-file.action.js +0 -2
  14. package/commonjs/src/actions/tag.action.js +2 -5
  15. package/commonjs/src/actions/typecheck.action.js +67 -0
  16. package/commonjs/src/actions/unlink.action.js +74 -0
  17. package/commonjs/src/actions/version.action.js +1 -5
  18. package/commonjs/src/actions/watch.action.js +0 -2
  19. package/commonjs/src/commands/build.command.js +0 -2
  20. package/commonjs/src/commands/dependency.command.js +0 -2
  21. package/commonjs/src/commands/docker.command.js +26 -0
  22. package/commonjs/src/commands/forge.command.js +0 -2
  23. package/commonjs/src/commands/index.js +4 -2
  24. package/commonjs/src/commands/link.command.js +87 -0
  25. package/commonjs/src/commands/package.command.js +36 -0
  26. package/commonjs/src/commands/publish.command.js +0 -2
  27. package/commonjs/src/commands/tag.command.js +0 -2
  28. package/commonjs/src/commands/typecheck.command.js +24 -0
  29. package/commonjs/src/commands/version.command.js +0 -2
  30. package/commonjs/src/const.js +0 -2
  31. package/commonjs/src/create-workspace.js +42 -0
  32. package/commonjs/src/errors.js +0 -2
  33. package/commonjs/src/extensions/project.extensions.js +0 -2
  34. package/commonjs/src/factories/swc-config.factory.js +17 -6
  35. package/commonjs/src/forge.module.js +20 -21
  36. package/commonjs/src/index.js +7 -2
  37. package/commonjs/src/mixins/caches-outputs.mixin.js +7 -7
  38. package/commonjs/src/mixins/incremental-transform.mixin.js +0 -2
  39. package/commonjs/src/packaging/dependency-pinner.service.js +118 -0
  40. package/commonjs/src/packaging/deployable.js +44 -0
  41. package/commonjs/src/packaging/import-graph.service.js +137 -0
  42. package/commonjs/src/packaging/release-exports.js +88 -0
  43. package/commonjs/src/packaging/ui-assets.js +75 -0
  44. package/commonjs/src/services/dependency-resolver.service.js +0 -2
  45. package/commonjs/src/services/file-writer.service.js +0 -2
  46. package/commonjs/src/services/swc-transpiler.js +36 -10
  47. package/commonjs/src/services/ts-program-host.js +2 -4
  48. package/commonjs/src/services/type-emission-program.js +23 -8
  49. package/commonjs/src/services/type-emitter.js +33 -5
  50. package/commonjs/src/types/build-target.type.js +0 -2
  51. package/commonjs/src/types/configuration.type.js +0 -2
  52. package/commonjs/src/types/dependency.types.js +0 -2
  53. package/commonjs/src/types/swc-config.type.js +0 -2
  54. package/commonjs/src/types/transform-response.model.js +1 -2
  55. package/commonjs/src/types/transformer.type.js +0 -2
  56. package/commonjs/src/types/workspace-config.type.js +0 -2
  57. package/commonjs/src/vitest/forge-build.plugin.js +2 -3
  58. package/commonjs/src/vitest/index.js +0 -2
  59. package/commonjs/src/workspace.config.js +37 -4
  60. package/es6/src/actions/build.action.js +8 -4
  61. package/es6/src/actions/clean.action.js +2 -5
  62. package/es6/src/actions/commit.action.js +0 -3
  63. package/es6/src/actions/copy.action.js +37 -8
  64. package/es6/src/actions/dependency-report.action.js +0 -4
  65. package/es6/src/actions/dependency-sync.action.js +0 -4
  66. package/es6/src/actions/docker.action.js +194 -0
  67. package/es6/src/actions/index.js +5 -2
  68. package/es6/src/actions/link.action.js +128 -0
  69. package/es6/src/actions/package.action.js +219 -0
  70. package/es6/src/actions/publish.action.js +0 -3
  71. package/es6/src/actions/sync-lock-file.action.js +0 -2
  72. package/es6/src/actions/tag.action.js +2 -6
  73. package/es6/src/actions/typecheck.action.js +52 -0
  74. package/es6/src/actions/unlink.action.js +59 -0
  75. package/es6/src/actions/version.action.js +1 -6
  76. package/es6/src/actions/watch.action.js +0 -3
  77. package/es6/src/commands/build.command.js +0 -2
  78. package/es6/src/commands/dependency.command.js +0 -2
  79. package/es6/src/commands/docker.command.js +16 -0
  80. package/es6/src/commands/forge.command.js +0 -2
  81. package/es6/src/commands/index.js +4 -2
  82. package/es6/src/commands/link.command.js +64 -0
  83. package/es6/src/commands/package.command.js +26 -0
  84. package/es6/src/commands/publish.command.js +0 -2
  85. package/es6/src/commands/tag.command.js +0 -2
  86. package/es6/src/commands/typecheck.command.js +14 -0
  87. package/es6/src/commands/version.command.js +0 -2
  88. package/es6/src/const.js +0 -2
  89. package/es6/src/create-workspace.js +30 -0
  90. package/es6/src/errors.js +0 -2
  91. package/es6/src/extensions/project.extensions.js +0 -2
  92. package/es6/src/factories/swc-config.factory.js +17 -6
  93. package/es6/src/forge.module.js +20 -21
  94. package/es6/src/index.js +2 -3
  95. package/es6/src/mixins/caches-outputs.mixin.js +7 -7
  96. package/es6/src/mixins/incremental-transform.mixin.js +0 -2
  97. package/es6/src/packaging/dependency-pinner.service.js +103 -0
  98. package/es6/src/packaging/deployable.js +21 -0
  99. package/es6/src/packaging/import-graph.service.js +122 -0
  100. package/es6/src/packaging/release-exports.js +78 -0
  101. package/es6/src/packaging/ui-assets.js +49 -0
  102. package/es6/src/services/dependency-resolver.service.js +0 -2
  103. package/es6/src/services/file-writer.service.js +0 -2
  104. package/es6/src/services/swc-transpiler.js +36 -10
  105. package/es6/src/services/ts-program-host.js +2 -4
  106. package/es6/src/services/type-emission-program.js +23 -8
  107. package/es6/src/services/type-emitter.js +30 -5
  108. package/es6/src/types/build-target.type.js +0 -2
  109. package/es6/src/types/configuration.type.js +0 -2
  110. package/es6/src/types/dependency.types.js +0 -2
  111. package/es6/src/types/swc-config.type.js +0 -2
  112. package/es6/src/types/transform-response.model.js +1 -2
  113. package/es6/src/types/transformer.type.js +0 -2
  114. package/es6/src/types/workspace-config.type.js +0 -2
  115. package/es6/src/vitest/forge-build.plugin.js +2 -3
  116. package/es6/src/vitest/index.js +0 -2
  117. package/es6/src/workspace.config.js +38 -4
  118. package/package.json +5 -5
  119. package/types/src/actions/build.action.d.ts +1 -0
  120. package/types/src/actions/copy.action.d.ts +10 -0
  121. package/types/src/actions/docker.action.d.ts +38 -0
  122. package/types/src/actions/index.d.ts +5 -0
  123. package/types/src/actions/link.action.d.ts +25 -0
  124. package/types/src/actions/package.action.d.ts +38 -0
  125. package/types/src/actions/typecheck.action.d.ts +14 -0
  126. package/types/src/actions/unlink.action.d.ts +9 -0
  127. package/types/src/commands/docker.command.d.ts +6 -0
  128. package/types/src/commands/index.d.ts +4 -0
  129. package/types/src/commands/link.command.d.ts +28 -0
  130. package/types/src/commands/package.command.d.ts +11 -0
  131. package/types/src/commands/typecheck.command.d.ts +6 -0
  132. package/types/src/create-workspace.d.ts +7 -0
  133. package/types/src/factories/swc-config.factory.d.ts +1 -0
  134. package/types/src/forge.module.d.ts +10 -0
  135. package/types/src/index.d.ts +2 -1
  136. package/types/src/packaging/dependency-pinner.service.d.ts +20 -0
  137. package/types/src/packaging/deployable.d.ts +17 -0
  138. package/types/src/packaging/import-graph.service.d.ts +33 -0
  139. package/types/src/packaging/release-exports.d.ts +18 -0
  140. package/types/src/packaging/ui-assets.d.ts +21 -0
  141. package/types/src/services/swc-transpiler.d.ts +15 -3
  142. package/types/src/services/ts-program-host.d.ts +1 -1
  143. package/types/src/services/type-emission-program.d.ts +6 -1
  144. package/types/src/services/type-emitter.d.ts +14 -0
  145. package/types/src/types/configuration.type.d.ts +5 -0
  146. package/types/src/types/swc-config.type.d.ts +7 -1
  147. package/types/src/types/transform-response.model.d.ts +2 -0
  148. package/types/src/workspace.config.d.ts +6 -0
@@ -0,0 +1,64 @@
1
+ import { CommandResponse, ConfigurationOption, DecohereCommand, NoCleanOptions } from "@decohere/nexus/cli";
2
+ import auto from "async/auto.js";
3
+ import { Build } from "../actions/build.action.js";
4
+ import { Clean } from "../actions/clean.action.js";
5
+ import { Copy } from "../actions/copy.action.js";
6
+ import { Link } from "../actions/link.action.js";
7
+ import { Unlink } from "../actions/unlink.action.js";
8
+ import { Watch } from "../actions/watch.action.js";
9
+ export class LinkCommand extends DecohereCommand {
10
+ get actions() {
11
+ return [
12
+ Clean,
13
+ Build,
14
+ Copy,
15
+ Link,
16
+ Watch
17
+ ];
18
+ }
19
+ constructor(name){
20
+ super(name ?? "link");
21
+ this.description("Symlink workspace build outputs into a consumer project's node_modules");
22
+ this.addOption(new ConfigurationOption("link"));
23
+ this.addOption(new NoCleanOptions(true));
24
+ this.option("--build", "Run forge build concurrently after linking", false);
25
+ this.option("--no-copy", "Will not copy files like package.json to outdir", true);
26
+ this.option("--target-dir <dir>", "Path to the consumer project root");
27
+ this.option("--watch", "Watch for changes after linking", false);
28
+ }
29
+ run = async (actions, options)=>{
30
+ const responses = await auto({
31
+ clean: async ()=>await actions.clean.run(options),
32
+ link: [
33
+ "clean",
34
+ async ()=>await actions.link.run(options)
35
+ ],
36
+ build: [
37
+ "link",
38
+ async ()=>await actions.build.run(options)
39
+ ],
40
+ copy: [
41
+ "link",
42
+ async ()=>await actions.copy.run(options)
43
+ ],
44
+ watch: [
45
+ "link",
46
+ async ()=>await actions.watch.run(options)
47
+ ]
48
+ });
49
+ return CommandResponse.success(options, responses);
50
+ };
51
+ }
52
+ export class UnlinkCommand extends DecohereCommand {
53
+ get actions() {
54
+ return [
55
+ Unlink
56
+ ];
57
+ }
58
+ constructor(name, handler){
59
+ super(name ?? "unlink");
60
+ this.description("Remove workspace symlinks from a consumer project's node_modules");
61
+ this.option("--target-dir <dir>", "Path to the consumer project root");
62
+ if (handler) this.action(handler);
63
+ }
64
+ }
@@ -0,0 +1,26 @@
1
+ import { DecohereCommand } from "@decohere/nexus/cli";
2
+ import { PackageDeployable } from "../actions/package.action.js";
3
+ export class PackageCommand extends DecohereCommand {
4
+ get actions() {
5
+ return [
6
+ PackageDeployable
7
+ ];
8
+ }
9
+ constructor(name){
10
+ super(name);
11
+ this.description("Package a deployable (a project with a Dockerfile) with the workspace libraries it imports");
12
+ this.argument("[project]", "Package name of the deployable; omit to package every project with a Dockerfile");
13
+ }
14
+ /**
15
+ * Commander passes the positional before the options; the CLI host reads only options,
16
+ * so the project name is stashed on them.
17
+ */ action(fn) {
18
+ return super.action((...args)=>{
19
+ const cmd = args.at(-1);
20
+ const opts = args.at(-2);
21
+ const project = typeof args[0] === "string" ? args[0] : undefined;
22
+ cmd.setOptionValue("project", project);
23
+ return fn(opts, cmd);
24
+ });
25
+ }
26
+ }
@@ -18,5 +18,3 @@ export class PublishCommand extends DecohereCommand {
18
18
  this.option("--prompt-otp", "Prompt interactively for npm OTP only (use when already logged in)", false);
19
19
  }
20
20
  }
21
-
22
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9jb21tYW5kcy9wdWJsaXNoLmNvbW1hbmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uZmlndXJhdGlvbk9wdGlvbiwgRGVjb2hlcmVDb21tYW5kLCBEcnlSdW5PcHRpb24gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgUHVibGlzaCB9IGZyb20gXCIuLi9hY3Rpb25zL3B1Ymxpc2guYWN0aW9uLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBQdWJsaXNoQ29tbWFuZCBleHRlbmRzIERlY29oZXJlQ29tbWFuZCB7XG5cdHB1YmxpYyBvdmVycmlkZSBnZXQgYWN0aW9ucygpIHtcblx0XHRyZXR1cm4gW1B1Ymxpc2hdO1xuXHR9XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKG5hbWU6IHN0cmluZykge1xuXHRcdHN1cGVyKG5hbWUpO1xuXHRcdHRoaXMuZGVzY3JpcHRpb24oXCJQdWJsaXNoIHdvcmtzcGFjZSBwYWNrYWdlc1wiKTtcblx0XHR0aGlzLmFkZE9wdGlvbihuZXcgQ29uZmlndXJhdGlvbk9wdGlvbihcInJlbGVhc2VcIikpO1xuXHRcdHRoaXMuYWRkT3B0aW9uKG5ldyBEcnlSdW5PcHRpb24oXCJSdW4gbnBtIHB1Ymxpc2ggdXNpbmcgZHJ5LXJ1biBmbGFnXCIpKTtcblx0XHR0aGlzLm9wdGlvbihcIi0tY2hhbm5lbCA8Y2hhbm5lbD5cIiwgXCJUaGUgcmVsZWFzZSBjaGFubmVsXCIsIFwiYmV0YVwiKTtcblx0XHR0aGlzLm9wdGlvbihcIi0tdG9rZW4gPHRva2VuPlwiLCBcIm5wbSBhY2Nlc3MgdG9rZW4gKHVzZWQgb25seSBmb3IgdGhpcyBjb21tYW5kKVwiKTtcblx0XHR0aGlzLm9wdGlvbihcIi0tb3RwIDxvdHA+XCIsIFwibnBtIG9uZS10aW1lIHBhc3N3b3JkIGZvciAyRkEtcHJvdGVjdGVkIHB1Ymxpc2hcIik7XG5cdFx0dGhpcy5vcHRpb24oXCItLXByb21wdC1hdXRoXCIsIFwiUHJvbXB0IGludGVyYWN0aXZlbHkgZm9yIG5wbSB0b2tlbiBhbmQgT1RQXCIsIGZhbHNlKTtcblx0XHR0aGlzLm9wdGlvbihcblx0XHRcdFwiLS1wcm9tcHQtb3RwXCIsXG5cdFx0XHRcIlByb21wdCBpbnRlcmFjdGl2ZWx5IGZvciBucG0gT1RQIG9ubHkgKHVzZSB3aGVuIGFscmVhZHkgbG9nZ2VkIGluKVwiLFxuXHRcdFx0ZmFsc2UsXG5cdFx0KTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkNvbmZpZ3VyYXRpb25PcHRpb24iLCJEZWNvaGVyZUNvbW1hbmQiLCJEcnlSdW5PcHRpb24iLCJQdWJsaXNoIiwiUHVibGlzaENvbW1hbmQiLCJhY3Rpb25zIiwibmFtZSIsImRlc2NyaXB0aW9uIiwiYWRkT3B0aW9uIiwib3B0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxtQkFBbUIsRUFBRUMsZUFBZSxFQUFFQyxZQUFZLFFBQVEsc0JBQXNCO0FBQ3pGLFNBQVNDLE9BQU8sUUFBUSwrQkFBK0I7QUFFdkQsT0FBTyxNQUFNQyx1QkFBdUJIO0lBQ25DLElBQW9CSSxVQUFVO1FBQzdCLE9BQU87WUFBQ0Y7U0FBUTtJQUNqQjtJQUVBLFlBQW1CRyxJQUFZLENBQUU7UUFDaEMsS0FBSyxDQUFDQTtRQUNOLElBQUksQ0FBQ0MsV0FBVyxDQUFDO1FBQ2pCLElBQUksQ0FBQ0MsU0FBUyxDQUFDLElBQUlSLG9CQUFvQjtRQUN2QyxJQUFJLENBQUNRLFNBQVMsQ0FBQyxJQUFJTixhQUFhO1FBQ2hDLElBQUksQ0FBQ08sTUFBTSxDQUFDLHVCQUF1Qix1QkFBdUI7UUFDMUQsSUFBSSxDQUFDQSxNQUFNLENBQUMsbUJBQW1CO1FBQy9CLElBQUksQ0FBQ0EsTUFBTSxDQUFDLGVBQWU7UUFDM0IsSUFBSSxDQUFDQSxNQUFNLENBQUMsaUJBQWlCLDhDQUE4QztRQUMzRSxJQUFJLENBQUNBLE1BQU0sQ0FDVixnQkFDQSxzRUFDQTtJQUVGO0FBQ0QifQ==
@@ -14,5 +14,3 @@ export class TagCommand extends DecohereCommand {
14
14
  this.addOption(new DryRunOption("Print the tag without creating it"));
15
15
  }
16
16
  }
17
-
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9jb21tYW5kcy90YWcuY29tbWFuZC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBEZWNvaGVyZUNvbW1hbmQsIERyeVJ1bk9wdGlvbiB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBUYWcgfSBmcm9tIFwiLi4vYWN0aW9ucy90YWcuYWN0aW9uLmpzXCI7XG5cbmV4cG9ydCBjbGFzcyBUYWdDb21tYW5kIGV4dGVuZHMgRGVjb2hlcmVDb21tYW5kIHtcblx0cHVibGljIG92ZXJyaWRlIGdldCBhY3Rpb25zKCkge1xuXHRcdHJldHVybiBbVGFnXTtcblx0fVxuXG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihuYW1lOiBzdHJpbmcpIHtcblx0XHRzdXBlcihuYW1lKTtcblx0XHR0aGlzLmRlc2NyaXB0aW9uKFwiQ3JlYXRlIGFuZCBvcHRpb25hbGx5IHB1c2ggYSBnaXQgdGFnIGZvciB0aGUgd29ya3NwYWNlIHZlcnNpb25cIik7XG5cdFx0dGhpcy5vcHRpb24oXCItLXByZWZpeCA8cHJlZml4PlwiLCBcIlRhZyBwcmVmaXhcIiwgXCJ2XCIpO1xuXHRcdHRoaXMub3B0aW9uKFwiLS1wdXNoXCIsIFwiUHVzaCB0aGUgdGFnIGFuZCBjdXJyZW50IGJyYW5jaCB0byBvcmlnaW4gYWZ0ZXIgdGFnZ2luZ1wiLCBmYWxzZSk7XG5cdFx0dGhpcy5hZGRPcHRpb24obmV3IERyeVJ1bk9wdGlvbihcIlByaW50IHRoZSB0YWcgd2l0aG91dCBjcmVhdGluZyBpdFwiKSk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJEZWNvaGVyZUNvbW1hbmQiLCJEcnlSdW5PcHRpb24iLCJUYWciLCJUYWdDb21tYW5kIiwiYWN0aW9ucyIsIm5hbWUiLCJkZXNjcmlwdGlvbiIsIm9wdGlvbiIsImFkZE9wdGlvbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsZUFBZSxFQUFFQyxZQUFZLFFBQVEsc0JBQXNCO0FBQ3BFLFNBQVNDLEdBQUcsUUFBUSwyQkFBMkI7QUFFL0MsT0FBTyxNQUFNQyxtQkFBbUJIO0lBQy9CLElBQW9CSSxVQUFVO1FBQzdCLE9BQU87WUFBQ0Y7U0FBSTtJQUNiO0lBRUEsWUFBbUJHLElBQVksQ0FBRTtRQUNoQyxLQUFLLENBQUNBO1FBQ04sSUFBSSxDQUFDQyxXQUFXLENBQUM7UUFDakIsSUFBSSxDQUFDQyxNQUFNLENBQUMscUJBQXFCLGNBQWM7UUFDL0MsSUFBSSxDQUFDQSxNQUFNLENBQUMsVUFBVSwyREFBMkQ7UUFDakYsSUFBSSxDQUFDQyxTQUFTLENBQUMsSUFBSVAsYUFBYTtJQUNqQztBQUNEIn0=
@@ -0,0 +1,14 @@
1
+ import { ConfigurationOption, DecohereCommand } from "@decohere/nexus/cli";
2
+ import { TypeCheck } from "../actions/typecheck.action.js";
3
+ export class TypeCheckCommand extends DecohereCommand {
4
+ get actions() {
5
+ return [
6
+ TypeCheck
7
+ ];
8
+ }
9
+ constructor(name){
10
+ super(name);
11
+ this.description("Type-check workspace projects without emitting files");
12
+ this.addOption(new ConfigurationOption("debug"));
13
+ }
14
+ }
@@ -22,5 +22,3 @@ export class VersionCommand extends DecohereCommand {
22
22
  this.option("--from-changesets", "Read pending .changeset entries to determine the highest bump type (major > minor > patch)", false);
23
23
  }
24
24
  }
25
-
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9jb21tYW5kcy92ZXJzaW9uLmNvbW1hbmQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29uZmlndXJhdGlvbk9wdGlvbiwgRGVjb2hlcmVDb21tYW5kLCBEcnlSdW5PcHRpb24gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgU3luY0xvY2tGaWxlIH0gZnJvbSBcIi4uL2FjdGlvbnMvc3luYy1sb2NrLWZpbGUuYWN0aW9uLmpzXCI7XG5pbXBvcnQgeyBEZWZhdWx0Q2hhbm5lbCwgRGVmYXVsdFJlbGVhc2VUeXBlLCBWZXJzaW9uIH0gZnJvbSBcIi4uL2FjdGlvbnMvdmVyc2lvbi5hY3Rpb24uanNcIjtcblxudHlwZSBWZXJzaW9uQWN0aW9ucyA9IHsgdmVyc2lvbjogVmVyc2lvbjsgc3luY0xvY2tGaWxlOiBTeW5jTG9ja0ZpbGUgfTtcblxuZXhwb3J0IGNsYXNzIFZlcnNpb25Db21tYW5kIGV4dGVuZHMgRGVjb2hlcmVDb21tYW5kPFZlcnNpb25BY3Rpb25zPiB7XG5cdHB1YmxpYyBvdmVycmlkZSBnZXQgYWN0aW9ucygpIHtcblx0XHRyZXR1cm4gW1ZlcnNpb24sIFN5bmNMb2NrRmlsZV07XG5cdH1cblxuXHRwdWJsaWMgY29uc3RydWN0b3IobmFtZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIobmFtZSk7XG5cdFx0dGhpcy5kZXNjcmlwdGlvbihcIkJ1bXAgd29ya3NwYWNlIHBhY2thZ2UgdmVyc2lvbnNcIik7XG5cdFx0dGhpcy5hZGRPcHRpb24obmV3IENvbmZpZ3VyYXRpb25PcHRpb24oXCJyZWxlYXNlXCIpKTtcblx0XHR0aGlzLmFkZE9wdGlvbihuZXcgRHJ5UnVuT3B0aW9uKFwiUnVuIG5wbSBwdWJsaXNoIHVzaW5nIGRyeS1ydW4gZmxhZ1wiKSk7XG5cdFx0dGhpcy5vcHRpb24oXG5cdFx0XHRcIi0tcmVsZWFzZS10eXBlIDxyZWxlYXNlVHlwZT5cIixcblx0XHRcdFwiVGhlIHNlbXZlciByZWxlYXNlIHR5cGU6IG1ham9yLCBtaW5vciwgcGF0Y2gsIHByZXJlbGVhc2VcIixcblx0XHRcdERlZmF1bHRSZWxlYXNlVHlwZSxcblx0XHQpO1xuXHRcdHRoaXMub3B0aW9uKFxuXHRcdFx0XCItLWNoYW5uZWwgPGNoYW5uZWw+XCIsXG5cdFx0XHRcIlRoZSByZWxlYXNlIGNoYW5uZWwgKHByZWlkIGZvciBwcmVyZWxlYXNlcywgZGlzdC10YWcgZm9yIHB1Ymxpc2gpXCIsXG5cdFx0XHREZWZhdWx0Q2hhbm5lbCxcblx0XHQpO1xuXHRcdHRoaXMub3B0aW9uKFxuXHRcdFx0XCItLXZlcnNpb24gPHZlcnNpb24+XCIsXG5cdFx0XHRcIkV4cGxpY2l0IGJhc2UgdmVyc2lvbiB0byBpbmNyZW1lbnQgKG92ZXJyaWRlcyBnaXQgdGFnIGRpc2NvdmVyeSlcIixcblx0XHQpO1xuXHRcdHRoaXMub3B0aW9uKFwiLS1uby1zeW5jXCIsIFwiU2tpcCBsb2NrZmlsZSBzeW5jIGFmdGVyIHZlcnNpb25pbmdcIiwgdHJ1ZSk7XG5cdFx0dGhpcy5vcHRpb24oXCItLWNvbW1pdFwiLCBcIkNvbW1pdCB2ZXJzaW9uZWQgcGFja2FnZS5qc29uIGZpbGVzIGFmdGVyIGJ1bXBpbmdcIiwgZmFsc2UpO1xuXHRcdHRoaXMub3B0aW9uKFwiLS1tZXNzYWdlIDxtZXNzYWdlPlwiLCBcIkNvbW1pdCBtZXNzYWdlICh1c2VkIHdpdGggLS1jb21taXQpXCIpO1xuXHRcdHRoaXMub3B0aW9uKFxuXHRcdFx0XCItLWZyb20tY2hhbmdlc2V0c1wiLFxuXHRcdFx0XCJSZWFkIHBlbmRpbmcgLmNoYW5nZXNldCBlbnRyaWVzIHRvIGRldGVybWluZSB0aGUgaGlnaGVzdCBidW1wIHR5cGUgKG1ham9yID4gbWlub3IgPiBwYXRjaClcIixcblx0XHRcdGZhbHNlLFxuXHRcdCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJDb25maWd1cmF0aW9uT3B0aW9uIiwiRGVjb2hlcmVDb21tYW5kIiwiRHJ5UnVuT3B0aW9uIiwiU3luY0xvY2tGaWxlIiwiRGVmYXVsdENoYW5uZWwiLCJEZWZhdWx0UmVsZWFzZVR5cGUiLCJWZXJzaW9uIiwiVmVyc2lvbkNvbW1hbmQiLCJhY3Rpb25zIiwibmFtZSIsImRlc2NyaXB0aW9uIiwiYWRkT3B0aW9uIiwib3B0aW9uIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxtQkFBbUIsRUFBRUMsZUFBZSxFQUFFQyxZQUFZLFFBQVEsc0JBQXNCO0FBQ3pGLFNBQVNDLFlBQVksUUFBUSxzQ0FBc0M7QUFDbkUsU0FBU0MsY0FBYyxFQUFFQyxrQkFBa0IsRUFBRUMsT0FBTyxRQUFRLCtCQUErQjtBQUkzRixPQUFPLE1BQU1DLHVCQUF1Qk47SUFDbkMsSUFBb0JPLFVBQVU7UUFDN0IsT0FBTztZQUFDRjtZQUFTSDtTQUFhO0lBQy9CO0lBRUEsWUFBbUJNLElBQVksQ0FBRTtRQUNoQyxLQUFLLENBQUNBO1FBQ04sSUFBSSxDQUFDQyxXQUFXLENBQUM7UUFDakIsSUFBSSxDQUFDQyxTQUFTLENBQUMsSUFBSVgsb0JBQW9CO1FBQ3ZDLElBQUksQ0FBQ1csU0FBUyxDQUFDLElBQUlULGFBQWE7UUFDaEMsSUFBSSxDQUFDVSxNQUFNLENBQ1YsZ0NBQ0EsNERBQ0FQO1FBRUQsSUFBSSxDQUFDTyxNQUFNLENBQ1YsdUJBQ0EscUVBQ0FSO1FBRUQsSUFBSSxDQUFDUSxNQUFNLENBQ1YsdUJBQ0E7UUFFRCxJQUFJLENBQUNBLE1BQU0sQ0FBQyxhQUFhLHVDQUF1QztRQUNoRSxJQUFJLENBQUNBLE1BQU0sQ0FBQyxZQUFZLHFEQUFxRDtRQUM3RSxJQUFJLENBQUNBLE1BQU0sQ0FBQyx1QkFBdUI7UUFDbkMsSUFBSSxDQUFDQSxNQUFNLENBQ1YscUJBQ0EsOEZBQ0E7SUFFRjtBQUNEIn0=
package/es6/src/const.js CHANGED
@@ -56,5 +56,3 @@ export const BUILT_IN_MODULES = [
56
56
  "worker_threads",
57
57
  "zlib"
58
58
  ];
59
-
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9jb25zdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY29uc3QgU1dDX0NPTkZJRyA9IFwiLnN3Y3JjXCI7XG5leHBvcnQgY29uc3QgTk9ERV9NT0RVTEVTID0gXCJub2RlX21vZHVsZXNcIjtcbmV4cG9ydCBjb25zdCBCVUlMVF9JTl9NT0RVTEVTID0gW1xuXHRcImFzc2VydFwiLFxuXHRcImFzc2VydC9zdHJpY3RcIixcblx0XCJhc3luY19ob29rc1wiLFxuXHRcImJ1ZmZlclwiLFxuXHRcImNoaWxkX3Byb2Nlc3NcIixcblx0XCJjbHVzdGVyXCIsXG5cdFwiY29uc29sZVwiLFxuXHRcImNvbnN0YW50c1wiLFxuXHRcImNyeXB0b1wiLFxuXHRcImRncmFtXCIsXG5cdFwiZGlhZ25vc3RpY3NfY2hhbm5lbFwiLFxuXHRcImRuc1wiLFxuXHRcImRucy9wcm9taXNlc1wiLFxuXHRcImRvbWFpblwiLFxuXHRcImV2ZW50c1wiLFxuXHRcImZzXCIsXG5cdFwiZnMvcHJvbWlzZXNcIixcblx0XCJodHRwXCIsXG5cdFwiaHR0cDJcIixcblx0XCJodHRwc1wiLFxuXHRcImluc3BlY3RvclwiLFxuXHRcImluc3BlY3Rvci9wcm9taXNlc1wiLFxuXHRcIm1vZHVsZVwiLFxuXHRcIm5ldFwiLFxuXHRcIm9zXCIsXG5cdFwicGF0aFwiLFxuXHRcInBhdGgvcG9zaXhcIixcblx0XCJwYXRoL3dpbjMyXCIsXG5cdFwicGVyZl9ob29rc1wiLFxuXHRcInByb2Nlc3NcIixcblx0XCJwdW55Y29kZVwiLFxuXHRcInF1ZXJ5c3RyaW5nXCIsXG5cdFwicmVhZGxpbmVcIixcblx0XCJyZWFkbGluZS9wcm9taXNlc1wiLFxuXHRcInJlcGxcIixcblx0XCJzdHJlYW1cIixcblx0XCJzdHJlYW0vY29uc3VtZXJzXCIsXG5cdFwic3RyZWFtL3Byb21pc2VzXCIsXG5cdFwic3RyZWFtL3dlYlwiLFxuXHRcInN0cmluZ19kZWNvZGVyXCIsXG5cdFwic3lzXCIsXG5cdFwidGltZXJzXCIsXG5cdFwidGltZXJzL3Byb21pc2VzXCIsXG5cdFwidGxzXCIsXG5cdFwidHJhY2VfZXZlbnRzXCIsXG5cdFwidHR5XCIsXG5cdFwidXJsXCIsXG5cdFwidXRpbFwiLFxuXHRcInV0aWwvdHlwZXNcIixcblx0XCJ2OFwiLFxuXHRcInZtXCIsXG5cdFwid2FzaVwiLFxuXHRcIndvcmtlcl90aHJlYWRzXCIsXG5cdFwiemxpYlwiLFxuXTtcbiJdLCJuYW1lcyI6WyJTV0NfQ09ORklHIiwiTk9ERV9NT0RVTEVTIiwiQlVJTFRfSU5fTU9EVUxFUyJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxNQUFNQSxhQUFhLFNBQVM7QUFDbkMsT0FBTyxNQUFNQyxlQUFlLGVBQWU7QUFDM0MsT0FBTyxNQUFNQyxtQkFBbUI7SUFDL0I7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0NBQ0EsQ0FBQyJ9
@@ -0,0 +1,30 @@
1
+ import path from "node:path";
2
+ import { findWorkspaceRoot, UserConfigFactory, WORKSPACE_CONFIG, WorkspaceFactory } from "@decohere/mesh";
3
+ import { DefaultConfigurations, WorkspaceDefaults } from "./workspace.config.js";
4
+ /**
5
+ * The workspace every Decohere tool sees (forge, the flux CLI and `flux.run`): forge's
6
+ * defaults, the user's `.decohere.js`, and a root found by searching upward from cwd.
7
+ */ export async function createWorkspace(options = {}) {
8
+ const rootDir = options.rootDir ?? defaultRootDir();
9
+ const configFile = options.configFile ?? (rootDir === WorkspaceDefaults.rootDir ? undefined : path.join(rootDir, WORKSPACE_CONFIG));
10
+ // `projects` is dropped too: forge's defaults set it to undefined, which would override the
11
+ // user's per-project settings (docker, ui) in the merge.
12
+ const { configurations: _, projects: __, ...forgeDefaults } = WorkspaceDefaults;
13
+ const userConfig = await UserConfigFactory.getUserConfig(configFile);
14
+ // Only apply forge default configurations when user config doesn't provide any.
15
+ // This ensures user-defined configurations take priority while still providing
16
+ // sensible defaults (debug + release) when no config file is present.
17
+ const configurations = userConfig.configurations?.length ? undefined : DefaultConfigurations;
18
+ return WorkspaceFactory.create({
19
+ ...forgeDefaults,
20
+ ...configurations ? {
21
+ configurations
22
+ } : {},
23
+ configFile,
24
+ rootDir
25
+ });
26
+ }
27
+ /** `./` when cwd is the root (keeps paths relative as before), else the root above it. */ function defaultRootDir() {
28
+ const root = findWorkspaceRoot(process.cwd());
29
+ return root === process.cwd() ? WorkspaceDefaults.rootDir ?? "./" : root;
30
+ }
package/es6/src/errors.js CHANGED
@@ -14,5 +14,3 @@ export function formatUnknownError(reason) {
14
14
  return "Unknown error";
15
15
  }
16
16
  }
17
-
18
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9lcnJvcnMudHMiXSwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IHsgV29ya3NwYWNlQ29uZmlndXJhdGlvbkVycm9yIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5leHBvcnQgY2xhc3MgRm9yZ2VFcnJvciBleHRlbmRzIEVycm9yIHt9XG5cbmV4cG9ydCBmdW5jdGlvbiBmb3JtYXRVbmtub3duRXJyb3IocmVhc29uOiB1bmtub3duKTogc3RyaW5nIHtcblx0aWYgKHJlYXNvbiBpbnN0YW5jZW9mIEVycm9yKSB7XG5cdFx0cmV0dXJuIHJlYXNvbi5tZXNzYWdlO1xuXHR9XG5cblx0aWYgKHR5cGVvZiByZWFzb24gPT09IFwic3RyaW5nXCIpIHtcblx0XHRyZXR1cm4gcmVhc29uO1xuXHR9XG5cblx0dHJ5IHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkocmVhc29uKTtcblx0fSBjYXRjaCB7XG5cdFx0cmV0dXJuIFwiVW5rbm93biBlcnJvclwiO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiV29ya3NwYWNlQ29uZmlndXJhdGlvbkVycm9yIiwiRm9yZ2VFcnJvciIsIkVycm9yIiwiZm9ybWF0VW5rbm93bkVycm9yIiwicmVhc29uIiwibWVzc2FnZSIsIkpTT04iLCJzdHJpbmdpZnkiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLDJCQUEyQixRQUFRLGlCQUFpQjtBQUM3RCxPQUFPLE1BQU1DLG1CQUFtQkM7QUFBTztBQUV2QyxPQUFPLFNBQVNDLG1CQUFtQkMsTUFBZTtJQUNqRCxJQUFJQSxrQkFBa0JGLE9BQU87UUFDNUIsT0FBT0UsT0FBT0MsT0FBTztJQUN0QjtJQUVBLElBQUksT0FBT0QsV0FBVyxVQUFVO1FBQy9CLE9BQU9BO0lBQ1I7SUFFQSxJQUFJO1FBQ0gsT0FBT0UsS0FBS0MsU0FBUyxDQUFDSDtJQUN2QixFQUFFLE9BQU07UUFDUCxPQUFPO0lBQ1I7QUFDRCJ9
@@ -75,5 +75,3 @@ _ts_decorate([
75
75
  ]),
76
76
  _ts_metadata("design:returntype", typeof SwcConfig === "undefined" ? Object : SwcConfig)
77
77
  ], ProjectExtensions, "getSwcConfigSync", null);
78
-
79
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9leHRlbnNpb25zL3Byb2plY3QuZXh0ZW5zaW9ucy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NhY2hpbmdcIjtcbmltcG9ydCB7IGV4dGVuc2lvbiB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvZXh0ZW5zaWJpbGl0eVwiO1xuaW1wb3J0IHsgaW8gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2lvXCI7XG5pbXBvcnQgeyBTV0NfQ09ORklHIH0gZnJvbSBcIi4uL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEZvcmdlQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuLi90eXBlcy9jb25maWd1cmF0aW9uLnR5cGUuanNcIjtcbmltcG9ydCB7IFN3Y0NvbmZpZyB9IGZyb20gXCIuLi90eXBlcy9zd2MtY29uZmlnLnR5cGUuanNcIjtcblxuZGVjbGFyZSBtb2R1bGUgXCJAZGVjb2hlcmUvbWVzaFwiIHtcblx0aW50ZXJmYWNlIFByb2plY3Qge1xuXHRcdGdldEZvcmdlQ29uZmlndXJhdGlvbigpOiBGb3JnZUNvbmZpZ3VyYXRpb247XG5cdFx0Z2V0U3djQ29uZmlnKCk6IFByb21pc2U8U3djQ29uZmlnPjtcblx0XHRnZXRTd2NDb25maWdTeW5jKCk6IFN3Y0NvbmZpZztcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgUHJvamVjdEV4dGVuc2lvbnMge1xuXHRAZXh0ZW5zaW9uKFByb2plY3QpXG5cdHB1YmxpYyBzdGF0aWMgZ2V0Rm9yZ2VDb25maWd1cmF0aW9uKHByb2plY3Q6IFByb2plY3QpOiBGb3JnZUNvbmZpZ3VyYXRpb24ge1xuXHRcdHJldHVybiBwcm9qZWN0LmNvbmZpZ3VyYXRpb24gYXMgRm9yZ2VDb25maWd1cmF0aW9uO1xuXHR9XG5cblx0QGV4dGVuc2lvbihQcm9qZWN0KVxuXHRAbWVtb2l6ZSgpXG5cdHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0U3djQ29uZmlnKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPFN3Y0NvbmZpZz4ge1xuXHRcdGZvciAoY29uc3QgY29uZmlnUGF0aCBvZiBQcm9qZWN0RXh0ZW5zaW9ucy5zd2NDb25maWdQYXRocyhwcm9qZWN0KSkge1xuXHRcdFx0aWYgKGF3YWl0IGlvLmZpbGVFeGlzdHMoY29uZmlnUGF0aCkpIHtcblx0XHRcdFx0cmV0dXJuIG5ldyBTd2NDb25maWcoYXdhaXQgaW8ucmVhZEpzb25GaWxlKGNvbmZpZ1BhdGgpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIG5ldyBTd2NDb25maWcoKTtcblx0fVxuXG5cdEBleHRlbnNpb24oUHJvamVjdClcblx0QG1lbW9pemUoKVxuXHRwdWJsaWMgc3RhdGljIGdldFN3Y0NvbmZpZ1N5bmMocHJvamVjdDogUHJvamVjdCk6IFN3Y0NvbmZpZyB7XG5cdFx0Zm9yIChjb25zdCBjb25maWdQYXRoIG9mIFByb2plY3RFeHRlbnNpb25zLnN3Y0NvbmZpZ1BhdGhzKHByb2plY3QpKSB7XG5cdFx0XHRpZiAoUHJvamVjdEV4dGVuc2lvbnMuZmlsZUV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcblx0XHRcdFx0cmV0dXJuIG5ldyBTd2NDb25maWcoSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgXCJ1dGY4XCIpKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBuZXcgU3djQ29uZmlnKCk7XG5cdH1cblxuXHRwcml2YXRlIHN0YXRpYyBzd2NDb25maWdQYXRocyhwcm9qZWN0OiBQcm9qZWN0KTogc3RyaW5nW10ge1xuXHRcdHJldHVybiBbXG5cdFx0XHRwYXRoLmpvaW4ocHJvamVjdC5wcm9qZWN0RGlyZWN0b3J5LCBTV0NfQ09ORklHKSxcblx0XHRcdHBhdGguam9pbihwcm9qZWN0LnJvb3REaXIsIFNXQ19DT05GSUcpLFxuXHRcdF07XG5cdH1cblxuXHRwcml2YXRlIHN0YXRpYyBmaWxlRXhpc3RzU3luYyhmaWxlUGF0aDogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBmcy5zdGF0U3luYyhmaWxlUGF0aCkuaXNGaWxlKCk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG59XG4iXSwibmFtZXMiOlsiZnMiLCJwYXRoIiwiUHJvamVjdCIsIm1lbW9pemUiLCJleHRlbnNpb24iLCJpbyIsIlNXQ19DT05GSUciLCJTd2NDb25maWciLCJQcm9qZWN0RXh0ZW5zaW9ucyIsImdldEZvcmdlQ29uZmlndXJhdGlvbiIsInByb2plY3QiLCJjb25maWd1cmF0aW9uIiwiZ2V0U3djQ29uZmlnIiwiY29uZmlnUGF0aCIsInN3Y0NvbmZpZ1BhdGhzIiwiZmlsZUV4aXN0cyIsInJlYWRKc29uRmlsZSIsImdldFN3Y0NvbmZpZ1N5bmMiLCJmaWxlRXhpc3RzU3luYyIsIkpTT04iLCJwYXJzZSIsInJlYWRGaWxlU3luYyIsImpvaW4iLCJwcm9qZWN0RGlyZWN0b3J5Iiwicm9vdERpciIsImZpbGVQYXRoIiwic3RhdFN5bmMiLCJpc0ZpbGUiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLE9BQU9BLFFBQVEsVUFBVTtBQUN6QixPQUFPQyxVQUFVLFlBQVk7QUFDN0IsU0FBU0MsT0FBTyxRQUFRLGlCQUFpQjtBQUN6QyxTQUFTQyxPQUFPLFFBQVEsMEJBQTBCO0FBQ2xELFNBQVNDLFNBQVMsUUFBUSxnQ0FBZ0M7QUFDMUQsU0FBU0MsRUFBRSxRQUFRLHFCQUFxQjtBQUN4QyxTQUFTQyxVQUFVLFFBQVEsY0FBYztBQUV6QyxTQUFTQyxTQUFTLFFBQVEsOEJBQThCO0FBVXhELE9BQU8sTUFBTUM7SUFDWixPQUNjQyxzQkFBc0JDLE9BQWdCLEVBQXNCO1FBQ3pFLE9BQU9BLFFBQVFDLGFBQWE7SUFDN0I7SUFFQSxhQUVvQkMsYUFBYUYsT0FBZ0IsRUFBc0I7UUFDdEUsS0FBSyxNQUFNRyxjQUFjTCxrQkFBa0JNLGNBQWMsQ0FBQ0osU0FBVTtZQUNuRSxJQUFJLE1BQU1MLEdBQUdVLFVBQVUsQ0FBQ0YsYUFBYTtnQkFDcEMsT0FBTyxJQUFJTixVQUFVLE1BQU1GLEdBQUdXLFlBQVksQ0FBQ0g7WUFDNUM7UUFDRDtRQUNBLE9BQU8sSUFBSU47SUFDWjtJQUVBLE9BRWNVLGlCQUFpQlAsT0FBZ0IsRUFBYTtRQUMzRCxLQUFLLE1BQU1HLGNBQWNMLGtCQUFrQk0sY0FBYyxDQUFDSixTQUFVO1lBQ25FLElBQUlGLGtCQUFrQlUsY0FBYyxDQUFDTCxhQUFhO2dCQUNqRCxPQUFPLElBQUlOLFVBQVVZLEtBQUtDLEtBQUssQ0FBQ3BCLEdBQUdxQixZQUFZLENBQUNSLFlBQVk7WUFDN0Q7UUFDRDtRQUNBLE9BQU8sSUFBSU47SUFDWjtJQUVBLE9BQWVPLGVBQWVKLE9BQWdCLEVBQVk7UUFDekQsT0FBTztZQUNOVCxLQUFLcUIsSUFBSSxDQUFDWixRQUFRYSxnQkFBZ0IsRUFBRWpCO1lBQ3BDTCxLQUFLcUIsSUFBSSxDQUFDWixRQUFRYyxPQUFPLEVBQUVsQjtTQUMzQjtJQUNGO0lBRUEsT0FBZVksZUFBZU8sUUFBZ0IsRUFBVztRQUN4RCxJQUFJO1lBQ0gsT0FBT3pCLEdBQUcwQixRQUFRLENBQUNELFVBQVVFLE1BQU07UUFDcEMsRUFBRSxPQUFNO1lBQ1AsT0FBTztRQUNSO0lBQ0Q7QUFDRCJ9
@@ -5,6 +5,7 @@ function _ts_decorate(decorators, target, key, desc) {
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  }
7
7
  import path from "node:path";
8
+ import { packageAliases } from "@decohere/mesh";
8
9
  import { Trace } from "@decohere/nexus/diagnostics";
9
10
  import { merge } from "@decohere/nexus/objects";
10
11
  import { ForgeError } from "../errors.js";
@@ -32,10 +33,15 @@ export class SwcConfigFactory {
32
33
  * Creates a base config for a project+target combination, without a filename.
33
34
  * Call once per (project, target) and then use createFileConfig() per file.
34
35
  */ createBaseConfig(buildTarget, configOptions) {
35
- const { userConfig, tsConfig, aliasPaths } = configOptions;
36
+ const { userConfig, tsConfig, aliasPaths, sourceMaps, workspace, projects } = configOptions;
36
37
  const { compilerOptions } = tsConfig ?? {};
37
- const paths = aliasPaths ? compilerOptions?.paths : undefined;
38
- const baseUrl = SwcConfigFactory.getBaseUrl(tsConfig) ?? (paths != null ? path.resolve(".") : undefined);
38
+ const aliases = aliasPaths ? workspace != null ? workspace.getPackageAliases(projects?.[0]?.configuration.name ?? "debug") : projects != null && projects.length > 0 ? packageAliases.build(projects, {
39
+ baseUrl: SwcConfigFactory.getBaseUrl(tsConfig) ?? path.resolve(projects[0].rootDir),
40
+ tsconfigPaths: compilerOptions?.paths
41
+ }) : undefined : undefined;
42
+ const tsconfigOnlyPaths = aliasPaths && aliases == null ? compilerOptions?.paths : undefined;
43
+ const paths = SwcConfigFactory.nonemptyPaths(aliases?.paths ?? tsconfigOnlyPaths);
44
+ const baseUrl = aliases?.baseUrl ?? SwcConfigFactory.getBaseUrl(tsConfig) ?? (workspace != null ? path.resolve(workspace.rootDir) : undefined) ?? (paths != null ? path.resolve(".") : undefined);
39
45
  const options = {
40
46
  jsc: {
41
47
  baseUrl,
@@ -43,7 +49,10 @@ export class SwcConfigFactory {
43
49
  },
44
50
  module: {
45
51
  type: buildTarget
46
- }
52
+ },
53
+ ...sourceMaps === false ? {
54
+ sourceMaps: false
55
+ } : {}
47
56
  };
48
57
  return merge.withOptions({
49
58
  mergeArrays: false
@@ -57,6 +66,10 @@ export class SwcConfigFactory {
57
66
  this.validate(config);
58
67
  return config;
59
68
  }
69
+ static nonemptyPaths(paths) {
70
+ if (paths == null || Object.keys(paths).length === 0) return undefined;
71
+ return paths;
72
+ }
60
73
  /**
61
74
  * Validates SWC options against known causes of Rust/NAPI process crashes.
62
75
  * Throws a ForgeError with a descriptive message instead of letting the
@@ -79,5 +92,3 @@ export class SwcConfigFactory {
79
92
  SwcConfigFactory = _ts_decorate([
80
93
  Trace
81
94
  ], SwcConfigFactory);
82
-
83
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9mYWN0b3JpZXMvc3djLWNvbmZpZy5mYWN0b3J5LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgVHNjb25maWcgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB7IFRyYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9kaWFnbm9zdGljc1wiO1xuaW1wb3J0IHR5cGUgeyBGaWxlRXggfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2lvXCI7XG5pbXBvcnQgeyBtZXJnZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvb2JqZWN0c1wiO1xuaW1wb3J0IHR5cGUgeyBPcHRpb25zIH0gZnJvbSBcIkBzd2MvY29yZVwiO1xuaW1wb3J0IHsgRm9yZ2VFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMuanNcIjtcbmltcG9ydCB0eXBlIHsgVHJhbnNwaWxlVGFyZ2V0IH0gZnJvbSBcIi4uL3R5cGVzL2J1aWxkLXRhcmdldC50eXBlLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN3Y0NvbmZpZ09wdGlvbnMgfSBmcm9tIFwiLi4vdHlwZXMvc3djLWNvbmZpZy50eXBlLmpzXCI7XG5cbmNvbnN0IGRlZmF1bHRPcHRpb25zID0ge1xuXHRqc2M6IHtcblx0XHRwYXJzZXI6IHtcblx0XHRcdHN5bnRheDogXCJ0eXBlc2NyaXB0XCIsXG5cdFx0XHRkZWNvcmF0b3JzOiB0cnVlLFxuXHRcdH0sXG5cdFx0dGFyZ2V0OiBcImVzbmV4dFwiLFxuXHRcdHRyYW5zZm9ybToge1xuXHRcdFx0ZGVjb3JhdG9yTWV0YWRhdGE6IHRydWUsXG5cdFx0fSxcblx0XHRleHBlcmltZW50YWw6IHsga2VlcEltcG9ydEF0dHJpYnV0ZXM6IHRydWUgfSxcblx0fSxcblx0bW9kdWxlOiB7XG5cdFx0cmVzb2x2ZUZ1bGx5OiB0cnVlLFxuXHR9LFxuXHRzb3VyY2VNYXBzOiBcImlubGluZVwiLFxufTtcblxuQFRyYWNlXG5leHBvcnQgY2xhc3MgU3djQ29uZmlnRmFjdG9yeSB7XG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgYmFzZSBjb25maWcgZm9yIGEgcHJvamVjdCt0YXJnZXQgY29tYmluYXRpb24sIHdpdGhvdXQgYSBmaWxlbmFtZS5cblx0ICogQ2FsbCBvbmNlIHBlciAocHJvamVjdCwgdGFyZ2V0KSBhbmQgdGhlbiB1c2UgY3JlYXRlRmlsZUNvbmZpZygpIHBlciBmaWxlLlxuXHQgKi9cblx0cHVibGljIGNyZWF0ZUJhc2VDb25maWcoXG5cdFx0YnVpbGRUYXJnZXQ6IFRyYW5zcGlsZVRhcmdldCxcblx0XHRjb25maWdPcHRpb25zOiBTd2NDb25maWdPcHRpb25zLFxuXHQpOiBPcHRpb25zIHtcblx0XHRjb25zdCB7IHVzZXJDb25maWcsIHRzQ29uZmlnLCBhbGlhc1BhdGhzIH0gPSBjb25maWdPcHRpb25zO1xuXHRcdGNvbnN0IHsgY29tcGlsZXJPcHRpb25zIH0gPSB0c0NvbmZpZyA/PyB7fTtcblx0XHRjb25zdCBwYXRocyA9IGFsaWFzUGF0aHMgPyBjb21waWxlck9wdGlvbnM/LnBhdGhzIDogdW5kZWZpbmVkO1xuXHRcdGNvbnN0IGJhc2VVcmwgPVxuXHRcdFx0U3djQ29uZmlnRmFjdG9yeS5nZXRCYXNlVXJsKHRzQ29uZmlnKSA/PyAocGF0aHMgIT0gbnVsbCA/IHBhdGgucmVzb2x2ZShcIi5cIikgOiB1bmRlZmluZWQpO1xuXG5cdFx0Y29uc3Qgb3B0aW9uczogT3B0aW9ucyA9IHtcblx0XHRcdGpzYzoge1xuXHRcdFx0XHRiYXNlVXJsLFxuXHRcdFx0XHRwYXRocyxcblx0XHRcdH0sXG5cdFx0XHRtb2R1bGU6IHtcblx0XHRcdFx0dHlwZTogYnVpbGRUYXJnZXQsXG5cdFx0XHR9LFxuXHRcdH07XG5cblx0XHRyZXR1cm4gbWVyZ2Uud2l0aE9wdGlvbnM8T3B0aW9ucz4oXG5cdFx0XHR7IG1lcmdlQXJyYXlzOiBmYWxzZSB9LFxuXHRcdFx0ZGVmYXVsdE9wdGlvbnMsXG5cdFx0XHRvcHRpb25zLFxuXHRcdFx0dXNlckNvbmZpZyA/PyB7fSxcblx0XHQpO1xuXHR9XG5cblx0LyoqIFN0YW1wcyBhIHBlci1maWxlIGZpbGVuYW1lIG9udG8gYSBwcmUtYnVpbHQgYmFzZSBjb25maWcuICovXG5cdHB1YmxpYyBjcmVhdGVGaWxlQ29uZmlnKGZpbGU6IEZpbGVFeCwgYmFzZUNvbmZpZzogT3B0aW9ucyk6IE9wdGlvbnMge1xuXHRcdGNvbnN0IGNvbmZpZyA9IHsgLi4uYmFzZUNvbmZpZywgZmlsZW5hbWU6IGZpbGUuZnVsbFBhdGggfTtcblx0XHR0aGlzLnZhbGlkYXRlKGNvbmZpZyk7XG5cdFx0cmV0dXJuIGNvbmZpZztcblx0fVxuXG5cdC8qKlxuXHQgKiBWYWxpZGF0ZXMgU1dDIG9wdGlvbnMgYWdhaW5zdCBrbm93biBjYXVzZXMgb2YgUnVzdC9OQVBJIHByb2Nlc3MgY3Jhc2hlcy5cblx0ICogVGhyb3dzIGEgRm9yZ2VFcnJvciB3aXRoIGEgZGVzY3JpcHRpdmUgbWVzc2FnZSBpbnN0ZWFkIG9mIGxldHRpbmcgdGhlXG5cdCAqIE5BUEkgbGF5ZXIgYWJvcnQgdGhlIHByb2Nlc3MuXG5cdCAqXG5cdCAqIEtub3duIGNyYXNoIGNhdXNlczpcblx0ICogLSBganNjLmJhc2VVcmxgIHNldCB0byBhIHJlbGF0aXZlIHBhdGggKFNXQyByZXF1aXJlcyBhbiBhYnNvbHV0ZSBwYXRoKVxuXHQgKi9cblx0cHVibGljIHZhbGlkYXRlKG9wdGlvbnM6IE9wdGlvbnMpOiB2b2lkIHtcblx0XHRjb25zdCBiYXNlVXJsID0gb3B0aW9ucy5qc2M/LmJhc2VVcmw7XG5cdFx0aWYgKGJhc2VVcmwgIT0gbnVsbCAmJiAhcGF0aC5pc0Fic29sdXRlKGJhc2VVcmwpKSB7XG5cdFx0XHR0aHJvdyBuZXcgRm9yZ2VFcnJvcihcblx0XHRcdFx0YFNXQyBjb25maWc6IGpzYy5iYXNlVXJsIG11c3QgYmUgYW4gYWJzb2x1dGUgcGF0aCB0byBhdm9pZCBhIHByb2Nlc3MgY3Jhc2gsIGdvdDogXCIke2Jhc2VVcmx9XCIuIFVzZSBwYXRoLnJlc29sdmUoKSB0byBjb252ZXJ0IGl0LmAsXG5cdFx0XHQpO1xuXHRcdH1cblx0fVxuXG5cdC8qKiBSZXNvbHZlcyB0c2NvbmZpZyBiYXNlVXJsIHRvIGFuIGFic29sdXRlIHBhdGguIFJldHVybnMgdW5kZWZpbmVkIGlmIG5vdCBzZXQuICovXG5cdHByaXZhdGUgc3RhdGljIGdldEJhc2VVcmwodHNDb25maWc6IFRzY29uZmlnIHwgdW5kZWZpbmVkKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBiYXNlVXJsID0gdHNDb25maWc/LmNvbXBpbGVyT3B0aW9ucz8uYmFzZVVybDtcblx0XHRpZiAoYmFzZVVybCA9PSBudWxsKSByZXR1cm4gdW5kZWZpbmVkO1xuXHRcdHJldHVybiBwYXRoLnJlc29sdmUoYmFzZVVybCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJwYXRoIiwiVHJhY2UiLCJtZXJnZSIsIkZvcmdlRXJyb3IiLCJkZWZhdWx0T3B0aW9ucyIsImpzYyIsInBhcnNlciIsInN5bnRheCIsImRlY29yYXRvcnMiLCJ0YXJnZXQiLCJ0cmFuc2Zvcm0iLCJkZWNvcmF0b3JNZXRhZGF0YSIsImV4cGVyaW1lbnRhbCIsImtlZXBJbXBvcnRBdHRyaWJ1dGVzIiwibW9kdWxlIiwicmVzb2x2ZUZ1bGx5Iiwic291cmNlTWFwcyIsIlN3Y0NvbmZpZ0ZhY3RvcnkiLCJjcmVhdGVCYXNlQ29uZmlnIiwiYnVpbGRUYXJnZXQiLCJjb25maWdPcHRpb25zIiwidXNlckNvbmZpZyIsInRzQ29uZmlnIiwiYWxpYXNQYXRocyIsImNvbXBpbGVyT3B0aW9ucyIsInBhdGhzIiwidW5kZWZpbmVkIiwiYmFzZVVybCIsImdldEJhc2VVcmwiLCJyZXNvbHZlIiwib3B0aW9ucyIsInR5cGUiLCJ3aXRoT3B0aW9ucyIsIm1lcmdlQXJyYXlzIiwiY3JlYXRlRmlsZUNvbmZpZyIsImZpbGUiLCJiYXNlQ29uZmlnIiwiY29uZmlnIiwiZmlsZW5hbWUiLCJmdWxsUGF0aCIsInZhbGlkYXRlIiwiaXNBYnNvbHV0ZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBT0EsVUFBVSxZQUFZO0FBRTdCLFNBQVNDLEtBQUssUUFBUSw4QkFBOEI7QUFFcEQsU0FBU0MsS0FBSyxRQUFRLDBCQUEwQjtBQUVoRCxTQUFTQyxVQUFVLFFBQVEsZUFBZTtBQUkxQyxNQUFNQyxpQkFBaUI7SUFDdEJDLEtBQUs7UUFDSkMsUUFBUTtZQUNQQyxRQUFRO1lBQ1JDLFlBQVk7UUFDYjtRQUNBQyxRQUFRO1FBQ1JDLFdBQVc7WUFDVkMsbUJBQW1CO1FBQ3BCO1FBQ0FDLGNBQWM7WUFBRUMsc0JBQXNCO1FBQUs7SUFDNUM7SUFDQUMsUUFBUTtRQUNQQyxjQUFjO0lBQ2Y7SUFDQUMsWUFBWTtBQUNiO0FBR0EsT0FBTyxNQUFNQztJQUNaOzs7RUFHQyxHQUNELEFBQU9DLGlCQUNOQyxXQUE0QixFQUM1QkMsYUFBK0IsRUFDckI7UUFDVixNQUFNLEVBQUVDLFVBQVUsRUFBRUMsUUFBUSxFQUFFQyxVQUFVLEVBQUUsR0FBR0g7UUFDN0MsTUFBTSxFQUFFSSxlQUFlLEVBQUUsR0FBR0YsWUFBWSxDQUFDO1FBQ3pDLE1BQU1HLFFBQVFGLGFBQWFDLGlCQUFpQkMsUUFBUUM7UUFDcEQsTUFBTUMsVUFDTFYsaUJBQWlCVyxVQUFVLENBQUNOLGFBQWNHLENBQUFBLFNBQVMsT0FBT3pCLEtBQUs2QixPQUFPLENBQUMsT0FBT0gsU0FBUTtRQUV2RixNQUFNSSxVQUFtQjtZQUN4QnpCLEtBQUs7Z0JBQ0pzQjtnQkFDQUY7WUFDRDtZQUNBWCxRQUFRO2dCQUNQaUIsTUFBTVo7WUFDUDtRQUNEO1FBRUEsT0FBT2pCLE1BQU04QixXQUFXLENBQ3ZCO1lBQUVDLGFBQWE7UUFBTSxHQUNyQjdCLGdCQUNBMEIsU0FDQVQsY0FBYyxDQUFDO0lBRWpCO0lBRUEsNkRBQTZELEdBQzdELEFBQU9hLGlCQUFpQkMsSUFBWSxFQUFFQyxVQUFtQixFQUFXO1FBQ25FLE1BQU1DLFNBQVM7WUFBRSxHQUFHRCxVQUFVO1lBQUVFLFVBQVVILEtBQUtJLFFBQVE7UUFBQztRQUN4RCxJQUFJLENBQUNDLFFBQVEsQ0FBQ0g7UUFDZCxPQUFPQTtJQUNSO0lBRUE7Ozs7Ozs7RUFPQyxHQUNELEFBQU9HLFNBQVNWLE9BQWdCLEVBQVE7UUFDdkMsTUFBTUgsVUFBVUcsUUFBUXpCLEdBQUcsRUFBRXNCO1FBQzdCLElBQUlBLFdBQVcsUUFBUSxDQUFDM0IsS0FBS3lDLFVBQVUsQ0FBQ2QsVUFBVTtZQUNqRCxNQUFNLElBQUl4QixXQUNULENBQUMsaUZBQWlGLEVBQUV3QixRQUFRLG9DQUFvQyxDQUFDO1FBRW5JO0lBQ0Q7SUFFQSxpRkFBaUYsR0FDakYsT0FBZUMsV0FBV04sUUFBOEIsRUFBc0I7UUFDN0UsTUFBTUssVUFBVUwsVUFBVUUsaUJBQWlCRztRQUMzQyxJQUFJQSxXQUFXLE1BQU0sT0FBT0Q7UUFDNUIsT0FBTzFCLEtBQUs2QixPQUFPLENBQUNGO0lBQ3JCO0FBQ0QifQ==
@@ -1,19 +1,22 @@
1
- import { UserConfigFactory, WorkspaceFactory } from "@decohere/mesh";
2
1
  import { ModuleManifest } from "@decohere/nexus/cli";
3
2
  import * as Actions from "./actions/index.js";
4
3
  import * as Commands from "./commands/index.js";
4
+ import { createWorkspace } from "./create-workspace.js";
5
+ import { DependencyPinner } from "./packaging/dependency-pinner.service.js";
6
+ import { ImportGraph } from "./packaging/import-graph.service.js";
5
7
  import { DependencyResolver } from "./services/dependency-resolver.service.js";
6
8
  import { FileWriterService } from "./services/file-writer.service.js";
7
9
  import { SwcTranspiler } from "./services/swc-transpiler.js";
8
10
  import { TypeEmitter } from "./services/type-emitter.js";
9
11
  import { TransformerKey } from "./types/transformer.type.js";
10
- import { DefaultConfigurations, WorkspaceDefaults } from "./workspace.config.js";
11
12
  export class ForgeModule extends ModuleManifest {
12
13
  id = "forge";
13
14
  command = Commands.ForgeCommand;
14
15
  actions = {
15
16
  clean: Actions.Clean,
16
17
  copy: Actions.Copy,
18
+ docker: Actions.Docker,
19
+ package: Actions.PackageDeployable,
17
20
  build: Actions.Build,
18
21
  watch: Actions.Watch,
19
22
  publish: Actions.Publish,
@@ -22,37 +25,33 @@ export class ForgeModule extends ModuleManifest {
22
25
  reportDependencies: Actions.ReportDependencies,
23
26
  version: Actions.Version,
24
27
  tag: Actions.Tag,
25
- commitFiles: Actions.CommitFiles
28
+ typecheck: Actions.TypeCheck,
29
+ commitFiles: Actions.CommitFiles,
30
+ link: Actions.Link,
31
+ unlink: Actions.Unlink
26
32
  };
27
33
  commands = {
28
34
  build: Commands.BuildCommand,
29
35
  publish: Commands.PublishCommand,
30
36
  dependencies: Commands.DependencyCommand,
37
+ docker: Commands.DockerCommand,
38
+ package: Commands.PackageCommand,
31
39
  version: Commands.VersionCommand,
32
- tag: Commands.TagCommand
40
+ tag: Commands.TagCommand,
41
+ typecheck: Commands.TypeCheckCommand,
42
+ link: Commands.LinkCommand,
43
+ unlink: Commands.UnlinkCommand
33
44
  };
34
45
  registerServices(builder) {
46
+ builder.registerSingleton(TypeEmitter);
35
47
  builder.registerSingleton(TransformerKey, SwcTranspiler);
36
48
  builder.registerSingleton(TransformerKey, TypeEmitter);
37
49
  builder.registerSingleton(DependencyResolver);
50
+ builder.registerSingleton(ImportGraph);
51
+ builder.registerSingleton(DependencyPinner);
38
52
  builder.registerSingleton(FileWriterService);
39
53
  }
40
- async createWorkspace(options) {
41
- const { configurations: _, ...forgeDefaults } = WorkspaceDefaults;
42
- const userConfig = await UserConfigFactory.getUserConfig(options.configFile);
43
- // Only apply forge default configurations when user config doesn't provide any.
44
- // This ensures user-defined configurations take priority while still providing
45
- // sensible defaults (debug + release) when no config file is present.
46
- const configurations = userConfig.configurations?.length ? undefined : DefaultConfigurations;
47
- return WorkspaceFactory.create({
48
- ...forgeDefaults,
49
- ...configurations ? {
50
- configurations
51
- } : {},
52
- configFile: options.configFile,
53
- rootDir: options.rootDir ?? WorkspaceDefaults.rootDir
54
- });
54
+ createWorkspace(options) {
55
+ return createWorkspace(options);
55
56
  }
56
57
  }
57
-
58
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9mb3JnZS5tb2R1bGUudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgVXNlckNvbmZpZ0ZhY3RvcnksIFdvcmtzcGFjZUZhY3RvcnkgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB0eXBlIHsgV29ya3NwYWNlRmFjdG9yeU9wdGlvbnMgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgTW9kdWxlTWFuaWZlc3QgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHR5cGUgeyBDb250YWluZXJCdWlsZGVyIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jb21wb3NpdGlvblwiO1xuaW1wb3J0ICogYXMgQWN0aW9ucyBmcm9tIFwiLi9hY3Rpb25zL2luZGV4LmpzXCI7XG5pbXBvcnQgKiBhcyBDb21tYW5kcyBmcm9tIFwiLi9jb21tYW5kcy9pbmRleC5qc1wiO1xuaW1wb3J0IHsgRGVwZW5kZW5jeVJlc29sdmVyIH0gZnJvbSBcIi4vc2VydmljZXMvZGVwZW5kZW5jeS1yZXNvbHZlci5zZXJ2aWNlLmpzXCI7XG5pbXBvcnQgeyBGaWxlV3JpdGVyU2VydmljZSB9IGZyb20gXCIuL3NlcnZpY2VzL2ZpbGUtd3JpdGVyLnNlcnZpY2UuanNcIjtcbmltcG9ydCB7IFN3Y1RyYW5zcGlsZXIgfSBmcm9tIFwiLi9zZXJ2aWNlcy9zd2MtdHJhbnNwaWxlci5qc1wiO1xuaW1wb3J0IHsgVHlwZUVtaXR0ZXIgfSBmcm9tIFwiLi9zZXJ2aWNlcy90eXBlLWVtaXR0ZXIuanNcIjtcbmltcG9ydCB7IFRyYW5zZm9ybWVyS2V5IH0gZnJvbSBcIi4vdHlwZXMvdHJhbnNmb3JtZXIudHlwZS5qc1wiO1xuaW1wb3J0IHsgRGVmYXVsdENvbmZpZ3VyYXRpb25zLCBXb3Jrc3BhY2VEZWZhdWx0cyB9IGZyb20gXCIuL3dvcmtzcGFjZS5jb25maWcuanNcIjtcblxuZXhwb3J0IGNsYXNzIEZvcmdlTW9kdWxlIGV4dGVuZHMgTW9kdWxlTWFuaWZlc3Qge1xuXHRwdWJsaWMgcmVhZG9ubHkgaWQgPSBcImZvcmdlXCI7XG5cdHB1YmxpYyByZWFkb25seSBjb21tYW5kID0gQ29tbWFuZHMuRm9yZ2VDb21tYW5kO1xuXHRwdWJsaWMgcmVhZG9ubHkgYWN0aW9ucyA9IHtcblx0XHRjbGVhbjogQWN0aW9ucy5DbGVhbixcblx0XHRjb3B5OiBBY3Rpb25zLkNvcHksXG5cdFx0YnVpbGQ6IEFjdGlvbnMuQnVpbGQsXG5cdFx0d2F0Y2g6IEFjdGlvbnMuV2F0Y2gsXG5cdFx0cHVibGlzaDogQWN0aW9ucy5QdWJsaXNoLFxuXHRcdHN5bmNEZXBlbmRlbmNpZXM6IEFjdGlvbnMuU3luY0RlcGVuZGVuY2llcyxcblx0XHRzeW5jTG9ja0ZpbGU6IEFjdGlvbnMuU3luY0xvY2tGaWxlLFxuXHRcdHJlcG9ydERlcGVuZGVuY2llczogQWN0aW9ucy5SZXBvcnREZXBlbmRlbmNpZXMsXG5cdFx0dmVyc2lvbjogQWN0aW9ucy5WZXJzaW9uLFxuXHRcdHRhZzogQWN0aW9ucy5UYWcsXG5cdFx0Y29tbWl0RmlsZXM6IEFjdGlvbnMuQ29tbWl0RmlsZXMsXG5cdH07XG5cdHB1YmxpYyByZWFkb25seSBjb21tYW5kcyA9IHtcblx0XHRidWlsZDogQ29tbWFuZHMuQnVpbGRDb21tYW5kLFxuXHRcdHB1Ymxpc2g6IENvbW1hbmRzLlB1Ymxpc2hDb21tYW5kLFxuXHRcdGRlcGVuZGVuY2llczogQ29tbWFuZHMuRGVwZW5kZW5jeUNvbW1hbmQsXG5cdFx0dmVyc2lvbjogQ29tbWFuZHMuVmVyc2lvbkNvbW1hbmQsXG5cdFx0dGFnOiBDb21tYW5kcy5UYWdDb21tYW5kLFxuXHR9O1xuXG5cdHB1YmxpYyByZWdpc3RlclNlcnZpY2VzKGJ1aWxkZXI6IENvbnRhaW5lckJ1aWxkZXIpIHtcblx0XHRidWlsZGVyLnJlZ2lzdGVyU2luZ2xldG9uKFRyYW5zZm9ybWVyS2V5LCBTd2NUcmFuc3BpbGVyKTtcblx0XHRidWlsZGVyLnJlZ2lzdGVyU2luZ2xldG9uKFRyYW5zZm9ybWVyS2V5LCBUeXBlRW1pdHRlcik7XG5cdFx0YnVpbGRlci5yZWdpc3RlclNpbmdsZXRvbihEZXBlbmRlbmN5UmVzb2x2ZXIpO1xuXHRcdGJ1aWxkZXIucmVnaXN0ZXJTaW5nbGV0b24oRmlsZVdyaXRlclNlcnZpY2UpO1xuXHR9XG5cblx0cHVibGljIG92ZXJyaWRlIGFzeW5jIGNyZWF0ZVdvcmtzcGFjZShvcHRpb25zOiBXb3Jrc3BhY2VGYWN0b3J5T3B0aW9ucykge1xuXHRcdGNvbnN0IHsgY29uZmlndXJhdGlvbnM6IF8sIC4uLmZvcmdlRGVmYXVsdHMgfSA9IFdvcmtzcGFjZURlZmF1bHRzO1xuXHRcdGNvbnN0IHVzZXJDb25maWcgPSBhd2FpdCBVc2VyQ29uZmlnRmFjdG9yeS5nZXRVc2VyQ29uZmlnKG9wdGlvbnMuY29uZmlnRmlsZSk7XG5cdFx0Ly8gT25seSBhcHBseSBmb3JnZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb25zIHdoZW4gdXNlciBjb25maWcgZG9lc24ndCBwcm92aWRlIGFueS5cblx0XHQvLyBUaGlzIGVuc3VyZXMgdXNlci1kZWZpbmVkIGNvbmZpZ3VyYXRpb25zIHRha2UgcHJpb3JpdHkgd2hpbGUgc3RpbGwgcHJvdmlkaW5nXG5cdFx0Ly8gc2Vuc2libGUgZGVmYXVsdHMgKGRlYnVnICsgcmVsZWFzZSkgd2hlbiBubyBjb25maWcgZmlsZSBpcyBwcmVzZW50LlxuXHRcdGNvbnN0IGNvbmZpZ3VyYXRpb25zID0gdXNlckNvbmZpZy5jb25maWd1cmF0aW9ucz8ubGVuZ3RoXG5cdFx0XHQ/IHVuZGVmaW5lZFxuXHRcdFx0OiBEZWZhdWx0Q29uZmlndXJhdGlvbnM7XG5cdFx0cmV0dXJuIFdvcmtzcGFjZUZhY3RvcnkuY3JlYXRlKHtcblx0XHRcdC4uLmZvcmdlRGVmYXVsdHMsXG5cdFx0XHQuLi4oY29uZmlndXJhdGlvbnMgPyB7IGNvbmZpZ3VyYXRpb25zIH0gOiB7fSksXG5cdFx0XHRjb25maWdGaWxlOiBvcHRpb25zLmNvbmZpZ0ZpbGUsXG5cdFx0XHRyb290RGlyOiBvcHRpb25zLnJvb3REaXIgPz8gV29ya3NwYWNlRGVmYXVsdHMucm9vdERpcixcblx0XHR9KTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIlVzZXJDb25maWdGYWN0b3J5IiwiV29ya3NwYWNlRmFjdG9yeSIsIk1vZHVsZU1hbmlmZXN0IiwiQWN0aW9ucyIsIkNvbW1hbmRzIiwiRGVwZW5kZW5jeVJlc29sdmVyIiwiRmlsZVdyaXRlclNlcnZpY2UiLCJTd2NUcmFuc3BpbGVyIiwiVHlwZUVtaXR0ZXIiLCJUcmFuc2Zvcm1lcktleSIsIkRlZmF1bHRDb25maWd1cmF0aW9ucyIsIldvcmtzcGFjZURlZmF1bHRzIiwiRm9yZ2VNb2R1bGUiLCJpZCIsImNvbW1hbmQiLCJGb3JnZUNvbW1hbmQiLCJhY3Rpb25zIiwiY2xlYW4iLCJDbGVhbiIsImNvcHkiLCJDb3B5IiwiYnVpbGQiLCJCdWlsZCIsIndhdGNoIiwiV2F0Y2giLCJwdWJsaXNoIiwiUHVibGlzaCIsInN5bmNEZXBlbmRlbmNpZXMiLCJTeW5jRGVwZW5kZW5jaWVzIiwic3luY0xvY2tGaWxlIiwiU3luY0xvY2tGaWxlIiwicmVwb3J0RGVwZW5kZW5jaWVzIiwiUmVwb3J0RGVwZW5kZW5jaWVzIiwidmVyc2lvbiIsIlZlcnNpb24iLCJ0YWciLCJUYWciLCJjb21taXRGaWxlcyIsIkNvbW1pdEZpbGVzIiwiY29tbWFuZHMiLCJCdWlsZENvbW1hbmQiLCJQdWJsaXNoQ29tbWFuZCIsImRlcGVuZGVuY2llcyIsIkRlcGVuZGVuY3lDb21tYW5kIiwiVmVyc2lvbkNvbW1hbmQiLCJUYWdDb21tYW5kIiwicmVnaXN0ZXJTZXJ2aWNlcyIsImJ1aWxkZXIiLCJyZWdpc3RlclNpbmdsZXRvbiIsImNyZWF0ZVdvcmtzcGFjZSIsIm9wdGlvbnMiLCJjb25maWd1cmF0aW9ucyIsIl8iLCJmb3JnZURlZmF1bHRzIiwidXNlckNvbmZpZyIsImdldFVzZXJDb25maWciLCJjb25maWdGaWxlIiwibGVuZ3RoIiwidW5kZWZpbmVkIiwiY3JlYXRlIiwicm9vdERpciJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsaUJBQWlCLEVBQUVDLGdCQUFnQixRQUFRLGlCQUFpQjtBQUVyRSxTQUFTQyxjQUFjLFFBQVEsc0JBQXNCO0FBRXJELFlBQVlDLGFBQWEscUJBQXFCO0FBQzlDLFlBQVlDLGNBQWMsc0JBQXNCO0FBQ2hELFNBQVNDLGtCQUFrQixRQUFRLDRDQUE0QztBQUMvRSxTQUFTQyxpQkFBaUIsUUFBUSxvQ0FBb0M7QUFDdEUsU0FBU0MsYUFBYSxRQUFRLCtCQUErQjtBQUM3RCxTQUFTQyxXQUFXLFFBQVEsNkJBQTZCO0FBQ3pELFNBQVNDLGNBQWMsUUFBUSw4QkFBOEI7QUFDN0QsU0FBU0MscUJBQXFCLEVBQUVDLGlCQUFpQixRQUFRLHdCQUF3QjtBQUVqRixPQUFPLE1BQU1DLG9CQUFvQlY7SUFDaEJXLEtBQUssUUFBUTtJQUNiQyxVQUFVVixTQUFTVyxZQUFZLENBQUM7SUFDaENDLFVBQVU7UUFDekJDLE9BQU9kLFFBQVFlLEtBQUs7UUFDcEJDLE1BQU1oQixRQUFRaUIsSUFBSTtRQUNsQkMsT0FBT2xCLFFBQVFtQixLQUFLO1FBQ3BCQyxPQUFPcEIsUUFBUXFCLEtBQUs7UUFDcEJDLFNBQVN0QixRQUFRdUIsT0FBTztRQUN4QkMsa0JBQWtCeEIsUUFBUXlCLGdCQUFnQjtRQUMxQ0MsY0FBYzFCLFFBQVEyQixZQUFZO1FBQ2xDQyxvQkFBb0I1QixRQUFRNkIsa0JBQWtCO1FBQzlDQyxTQUFTOUIsUUFBUStCLE9BQU87UUFDeEJDLEtBQUtoQyxRQUFRaUMsR0FBRztRQUNoQkMsYUFBYWxDLFFBQVFtQyxXQUFXO0lBQ2pDLEVBQUU7SUFDY0MsV0FBVztRQUMxQmxCLE9BQU9qQixTQUFTb0MsWUFBWTtRQUM1QmYsU0FBU3JCLFNBQVNxQyxjQUFjO1FBQ2hDQyxjQUFjdEMsU0FBU3VDLGlCQUFpQjtRQUN4Q1YsU0FBUzdCLFNBQVN3QyxjQUFjO1FBQ2hDVCxLQUFLL0IsU0FBU3lDLFVBQVU7SUFDekIsRUFBRTtJQUVLQyxpQkFBaUJDLE9BQXlCLEVBQUU7UUFDbERBLFFBQVFDLGlCQUFpQixDQUFDdkMsZ0JBQWdCRjtRQUMxQ3dDLFFBQVFDLGlCQUFpQixDQUFDdkMsZ0JBQWdCRDtRQUMxQ3VDLFFBQVFDLGlCQUFpQixDQUFDM0M7UUFDMUIwQyxRQUFRQyxpQkFBaUIsQ0FBQzFDO0lBQzNCO0lBRUEsTUFBc0IyQyxnQkFBZ0JDLE9BQWdDLEVBQUU7UUFDdkUsTUFBTSxFQUFFQyxnQkFBZ0JDLENBQUMsRUFBRSxHQUFHQyxlQUFlLEdBQUcxQztRQUNoRCxNQUFNMkMsYUFBYSxNQUFNdEQsa0JBQWtCdUQsYUFBYSxDQUFDTCxRQUFRTSxVQUFVO1FBQzNFLGdGQUFnRjtRQUNoRiwrRUFBK0U7UUFDL0Usc0VBQXNFO1FBQ3RFLE1BQU1MLGlCQUFpQkcsV0FBV0gsY0FBYyxFQUFFTSxTQUMvQ0MsWUFDQWhEO1FBQ0gsT0FBT1QsaUJBQWlCMEQsTUFBTSxDQUFDO1lBQzlCLEdBQUdOLGFBQWE7WUFDaEIsR0FBSUYsaUJBQWlCO2dCQUFFQTtZQUFlLElBQUksQ0FBQyxDQUFDO1lBQzVDSyxZQUFZTixRQUFRTSxVQUFVO1lBQzlCSSxTQUFTVixRQUFRVSxPQUFPLElBQUlqRCxrQkFBa0JpRCxPQUFPO1FBQ3REO0lBQ0Q7QUFDRCJ9
package/es6/src/index.js CHANGED
@@ -1,7 +1,6 @@
1
+ export { createWorkspace } from "./create-workspace.js";
1
2
  export { ForgeError } from "./errors.js";
2
3
  export { ForgeModule } from "./forge.module.js";
3
4
  export { SwcTranspiler } from "./services/swc-transpiler.js";
4
5
  export { BuildTargets } from "./types/build-target.type.js";
5
- export { Debug as DebugConfiguration, DefaultConfigurations, Release as ReleaseConfiguration, WorkspaceDefaults } from "./workspace.config.js";
6
-
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9pbmRleC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBGb3JnZUVycm9yIH0gZnJvbSBcIi4vZXJyb3JzLmpzXCI7XG5leHBvcnQgeyBGb3JnZU1vZHVsZSB9IGZyb20gXCIuL2ZvcmdlLm1vZHVsZS5qc1wiO1xuZXhwb3J0IHR5cGUgeyBUcmFuc3BpbGVPcHRpb25zIH0gZnJvbSBcIi4vc2VydmljZXMvc3djLXRyYW5zcGlsZXIuanNcIjtcbmV4cG9ydCB7IFN3Y1RyYW5zcGlsZXIgfSBmcm9tIFwiLi9zZXJ2aWNlcy9zd2MtdHJhbnNwaWxlci5qc1wiO1xuZXhwb3J0IHR5cGUgeyBCdWlsZFRhcmdldCwgVHJhbnNwaWxlVGFyZ2V0IH0gZnJvbSBcIi4vdHlwZXMvYnVpbGQtdGFyZ2V0LnR5cGUuanNcIjtcbmV4cG9ydCB7IEJ1aWxkVGFyZ2V0cyB9IGZyb20gXCIuL3R5cGVzL2J1aWxkLXRhcmdldC50eXBlLmpzXCI7XG5leHBvcnQgdHlwZSB7IEZvcmdlQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL3R5cGVzL2NvbmZpZ3VyYXRpb24udHlwZS5qc1wiO1xuZXhwb3J0IHR5cGUgeyBXb3Jrc3BhY2VPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXMvd29ya3NwYWNlLWNvbmZpZy50eXBlLmpzXCI7XG5leHBvcnQge1xuXHREZWJ1ZyBhcyBEZWJ1Z0NvbmZpZ3VyYXRpb24sXG5cdERlZmF1bHRDb25maWd1cmF0aW9ucyxcblx0UmVsZWFzZSBhcyBSZWxlYXNlQ29uZmlndXJhdGlvbixcblx0V29ya3NwYWNlRGVmYXVsdHMsXG59IGZyb20gXCIuL3dvcmtzcGFjZS5jb25maWcuanNcIjtcbiJdLCJuYW1lcyI6WyJGb3JnZUVycm9yIiwiRm9yZ2VNb2R1bGUiLCJTd2NUcmFuc3BpbGVyIiwiQnVpbGRUYXJnZXRzIiwiRGVidWciLCJEZWJ1Z0NvbmZpZ3VyYXRpb24iLCJEZWZhdWx0Q29uZmlndXJhdGlvbnMiLCJSZWxlYXNlIiwiUmVsZWFzZUNvbmZpZ3VyYXRpb24iLCJXb3Jrc3BhY2VEZWZhdWx0cyJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsVUFBVSxRQUFRLGNBQWM7QUFDekMsU0FBU0MsV0FBVyxRQUFRLG9CQUFvQjtBQUVoRCxTQUFTQyxhQUFhLFFBQVEsK0JBQStCO0FBRTdELFNBQVNDLFlBQVksUUFBUSwrQkFBK0I7QUFHNUQsU0FDQ0MsU0FBU0Msa0JBQWtCLEVBQzNCQyxxQkFBcUIsRUFDckJDLFdBQVdDLG9CQUFvQixFQUMvQkMsaUJBQWlCLFFBQ1gsd0JBQXdCIn0=
6
+ export { Debug as DebugConfiguration, DefaultConfigurations, Link as LinkConfiguration, Release as ReleaseConfiguration, WorkspaceDefaults } from "./workspace.config.js";
@@ -8,13 +8,15 @@ export class CachesOutputs {
8
8
  return self.__outputCache;
9
9
  }
10
10
  cacheOutputs(responses) {
11
+ const byFile = new Map();
11
12
  for (const response of responses){
12
13
  if (response.outcome !== "success") continue;
13
- const existing = this.outputCache.get(response.file.fullPath) ?? [];
14
- this.outputCache.set(response.file.fullPath, [
15
- ...existing,
16
- response
17
- ]);
14
+ const group = byFile.get(response.file.fullPath) ?? [];
15
+ group.push(response);
16
+ byFile.set(response.file.fullPath, group);
17
+ }
18
+ for (const [fullPath, group] of byFile){
19
+ this.outputCache.set(fullPath, group);
18
20
  }
19
21
  }
20
22
  deleteCachedOutputs(filePath) {
@@ -28,5 +30,3 @@ export class CachesOutputs {
28
30
  this.outputCache.delete(filePath);
29
31
  }
30
32
  }
31
-
32
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9taXhpbnMvY2FjaGVzLW91dHB1dHMubWl4aW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW8gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2lvXCI7XG5pbXBvcnQgdHlwZSB7IFRyYW5zZm9ybVJlc3BvbnNlIH0gZnJvbSBcIi4uL3R5cGVzL3RyYW5zZm9ybS1yZXNwb25zZS5tb2RlbC5qc1wiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2FjaGVzT3V0cHV0cyB7XG5cdC8qKiBNYXBzIHNvdXJjZSBmaWxlIGZ1bGxQYXRoIC0+IG91dHB1dCBUcmFuc2Zvcm1SZXNwb25zZXMgZm9yIGNsZWFudXAgaW4gd2F0Y2ggbW9kZS4gKi9cblx0cHJvdGVjdGVkIGdldCBvdXRwdXRDYWNoZSgpOiBNYXA8c3RyaW5nLCBUcmFuc2Zvcm1SZXNwb25zZVtdPiB7XG5cdFx0Y29uc3Qgc2VsZiA9IHRoaXMgYXMgeyBfX291dHB1dENhY2hlPzogTWFwPHN0cmluZywgVHJhbnNmb3JtUmVzcG9uc2VbXT4gfTtcblx0XHRpZiAoc2VsZi5fX291dHB1dENhY2hlID09IG51bGwpIHtcblx0XHRcdHNlbGYuX19vdXRwdXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBUcmFuc2Zvcm1SZXNwb25zZVtdPigpO1xuXHRcdH1cblx0XHRyZXR1cm4gc2VsZi5fX291dHB1dENhY2hlO1xuXHR9XG5cblx0cHJvdGVjdGVkIGNhY2hlT3V0cHV0cyhyZXNwb25zZXM6IFRyYW5zZm9ybVJlc3BvbnNlW10pOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuXHRcdFx0aWYgKHJlc3BvbnNlLm91dGNvbWUgIT09IFwic3VjY2Vzc1wiKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IGV4aXN0aW5nID0gdGhpcy5vdXRwdXRDYWNoZS5nZXQocmVzcG9uc2UuZmlsZS5mdWxsUGF0aCkgPz8gW107XG5cdFx0XHR0aGlzLm91dHB1dENhY2hlLnNldChyZXNwb25zZS5maWxlLmZ1bGxQYXRoLCBbLi4uZXhpc3RpbmcsIHJlc3BvbnNlXSk7XG5cdFx0fVxuXHR9XG5cblx0cHJvdGVjdGVkIGRlbGV0ZUNhY2hlZE91dHB1dHMoZmlsZVBhdGg6IHN0cmluZyk6IHZvaWQge1xuXHRcdGNvbnN0IG91dHB1dHMgPSB0aGlzLm91dHB1dENhY2hlLmdldChmaWxlUGF0aCk7XG5cdFx0aWYgKG91dHB1dHMgPT0gbnVsbCkgcmV0dXJuO1xuXHRcdGZvciAoY29uc3QgcmVzcG9uc2Ugb2Ygb3V0cHV0cykge1xuXHRcdFx0aWYgKHJlc3BvbnNlLm91dHB1dFBhdGggIT0gbnVsbCkge1xuXHRcdFx0XHR2b2lkIGlvLmRlbGV0ZUZpbGUocmVzcG9uc2Uub3V0cHV0UGF0aCk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHRoaXMub3V0cHV0Q2FjaGUuZGVsZXRlKGZpbGVQYXRoKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbImlvIiwiQ2FjaGVzT3V0cHV0cyIsIm91dHB1dENhY2hlIiwic2VsZiIsIl9fb3V0cHV0Q2FjaGUiLCJNYXAiLCJjYWNoZU91dHB1dHMiLCJyZXNwb25zZXMiLCJyZXNwb25zZSIsIm91dGNvbWUiLCJleGlzdGluZyIsImdldCIsImZpbGUiLCJmdWxsUGF0aCIsInNldCIsImRlbGV0ZUNhY2hlZE91dHB1dHMiLCJmaWxlUGF0aCIsIm91dHB1dHMiLCJvdXRwdXRQYXRoIiwiZGVsZXRlRmlsZSIsImRlbGV0ZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsRUFBRSxRQUFRLHFCQUFxQjtBQUd4QyxPQUFPLE1BQWVDO0lBQ3JCLHNGQUFzRixHQUN0RixJQUFjQyxjQUFnRDtRQUM3RCxNQUFNQyxPQUFPLElBQUk7UUFDakIsSUFBSUEsS0FBS0MsYUFBYSxJQUFJLE1BQU07WUFDL0JELEtBQUtDLGFBQWEsR0FBRyxJQUFJQztRQUMxQjtRQUNBLE9BQU9GLEtBQUtDLGFBQWE7SUFDMUI7SUFFVUUsYUFBYUMsU0FBOEIsRUFBUTtRQUM1RCxLQUFLLE1BQU1DLFlBQVlELFVBQVc7WUFDakMsSUFBSUMsU0FBU0MsT0FBTyxLQUFLLFdBQVc7WUFDcEMsTUFBTUMsV0FBVyxJQUFJLENBQUNSLFdBQVcsQ0FBQ1MsR0FBRyxDQUFDSCxTQUFTSSxJQUFJLENBQUNDLFFBQVEsS0FBSyxFQUFFO1lBQ25FLElBQUksQ0FBQ1gsV0FBVyxDQUFDWSxHQUFHLENBQUNOLFNBQVNJLElBQUksQ0FBQ0MsUUFBUSxFQUFFO21CQUFJSDtnQkFBVUY7YUFBUztRQUNyRTtJQUNEO0lBRVVPLG9CQUFvQkMsUUFBZ0IsRUFBUTtRQUNyRCxNQUFNQyxVQUFVLElBQUksQ0FBQ2YsV0FBVyxDQUFDUyxHQUFHLENBQUNLO1FBQ3JDLElBQUlDLFdBQVcsTUFBTTtRQUNyQixLQUFLLE1BQU1ULFlBQVlTLFFBQVM7WUFDL0IsSUFBSVQsU0FBU1UsVUFBVSxJQUFJLE1BQU07Z0JBQ2hDLEtBQUtsQixHQUFHbUIsVUFBVSxDQUFDWCxTQUFTVSxVQUFVO1lBQ3ZDO1FBQ0Q7UUFDQSxJQUFJLENBQUNoQixXQUFXLENBQUNrQixNQUFNLENBQUNKO0lBQ3pCO0FBQ0QifQ==
@@ -22,5 +22,3 @@ export class IncrementalTransform {
22
22
  });
23
23
  }
24
24
  }
25
-
26
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9taXhpbnMvaW5jcmVtZW50YWwtdHJhbnNmb3JtLm1peGluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgdHlwZSB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgdHlwZSB7IFRyYW5zZm9ybVJlc3BvbnNlIH0gZnJvbSBcIi4uL3R5cGVzL3RyYW5zZm9ybS1yZXNwb25zZS5tb2RlbC5qc1wiO1xuXG4vLyBXZWFrTWFwIGF2b2lkcyB0aGUgcHJpdmF0ZS1maWVsZC1pbi1taXhpbiBwcm9ibGVtOiBwcml2YXRlIGNsYXNzIGZpZWxkcyAoI3gpXG4vLyBhcmUgbm90IGFjY2Vzc2libGUgd2hlbiBtZXRob2RzIGFyZSBjb3BpZWQgb250byBhIGRpZmZlcmVudCBjbGFzcyBwcm90b3R5cGUuXG5jb25zdCBzdWJqZWN0cyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgU3ViamVjdDxUcmFuc2Zvcm1SZXNwb25zZVtdPj4oKTtcblxuZnVuY3Rpb24gZ2V0U3ViamVjdChpbnN0YW5jZTogb2JqZWN0KTogU3ViamVjdDxUcmFuc2Zvcm1SZXNwb25zZVtdPiB7XG5cdGxldCBzdWJqZWN0ID0gc3ViamVjdHMuZ2V0KGluc3RhbmNlKTtcblx0aWYgKHN1YmplY3QgPT0gbnVsbCkge1xuXHRcdHN1YmplY3QgPSBuZXcgU3ViamVjdDxUcmFuc2Zvcm1SZXNwb25zZVtdPigpO1xuXHRcdHN1YmplY3RzLnNldChpbnN0YW5jZSwgc3ViamVjdCk7XG5cdH1cblx0cmV0dXJuIHN1YmplY3Q7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJbmNyZW1lbnRhbFRyYW5zZm9ybSB7XG5cdHB1YmxpYyBnZXQgaW5jcmVtZW50YWxUcmFuc2Zvcm0kKCk6IE9ic2VydmFibGU8VHJhbnNmb3JtUmVzcG9uc2VbXT4ge1xuXHRcdHJldHVybiBnZXRTdWJqZWN0KHRoaXMpLmFzT2JzZXJ2YWJsZSgpO1xuXHR9XG5cblx0cHVibGljIHdhdGNoKHdvcmtzcGFjZTogV29ya3NwYWNlKTogdm9pZCB7XG5cdFx0d29ya3NwYWNlLnByb2plY3RGaWxlQ2hhbmdlZCQuc3Vic2NyaWJlKChldnQpID0+IHtcblx0XHRcdHZvaWQgdGhpcy5vbkluY3JlbWVudGFsRmlsZUV2ZW50KGV2dCkudGhlbigocmVzcG9uc2VzKSA9PiB7XG5cdFx0XHRcdGdldFN1YmplY3QodGhpcykubmV4dChyZXNwb25zZXMpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIGZvciBldmVyeSB3b3Jrc3BhY2UgZmlsZSBjaGFuZ2UuIEltcGxlbWVudGF0aW9ucyBzaG91bGQgaW52YWxpZGF0ZVxuXHQgKiBhbnkgaW50ZXJuYWwgY2FjaGVzLCBwZXJmb3JtIHRoZSBpbmNyZW1lbnRhbCB0cmFuc2Zvcm0sIGFuZCByZXR1cm4gdGhlIHJlc3VsdHMuXG5cdCAqIFJldHVybiBhbiBlbXB0eSBhcnJheSBmb3IgZGVsZXRpb25zIG9yIHdoZW4gbm8gb3V0cHV0IGlzIHByb2R1Y2VkLlxuXHQgKi9cblx0cHJvdGVjdGVkIGFic3RyYWN0IG9uSW5jcmVtZW50YWxGaWxlRXZlbnQoXG5cdFx0ZXZ0OiBQcm9qZWN0RmlsZUV2ZW50LFxuXHQpOiBQcm9taXNlPFRyYW5zZm9ybVJlc3BvbnNlW10+O1xufVxuIl0sIm5hbWVzIjpbIlN1YmplY3QiLCJzdWJqZWN0cyIsIldlYWtNYXAiLCJnZXRTdWJqZWN0IiwiaW5zdGFuY2UiLCJzdWJqZWN0IiwiZ2V0Iiwic2V0IiwiSW5jcmVtZW50YWxUcmFuc2Zvcm0iLCJpbmNyZW1lbnRhbFRyYW5zZm9ybSQiLCJhc09ic2VydmFibGUiLCJ3YXRjaCIsIndvcmtzcGFjZSIsInByb2plY3RGaWxlQ2hhbmdlZCQiLCJzdWJzY3JpYmUiLCJldnQiLCJvbkluY3JlbWVudGFsRmlsZUV2ZW50IiwidGhlbiIsInJlc3BvbnNlcyIsIm5leHQiXSwibWFwcGluZ3MiOiJBQUVBLFNBQVNBLE9BQU8sUUFBUSxPQUFPO0FBRy9CLCtFQUErRTtBQUMvRSwrRUFBK0U7QUFDL0UsTUFBTUMsV0FBVyxJQUFJQztBQUVyQixTQUFTQyxXQUFXQyxRQUFnQjtJQUNuQyxJQUFJQyxVQUFVSixTQUFTSyxHQUFHLENBQUNGO0lBQzNCLElBQUlDLFdBQVcsTUFBTTtRQUNwQkEsVUFBVSxJQUFJTDtRQUNkQyxTQUFTTSxHQUFHLENBQUNILFVBQVVDO0lBQ3hCO0lBQ0EsT0FBT0E7QUFDUjtBQUVBLE9BQU8sTUFBZUc7SUFDckIsSUFBV0Msd0JBQXlEO1FBQ25FLE9BQU9OLFdBQVcsSUFBSSxFQUFFTyxZQUFZO0lBQ3JDO0lBRU9DLE1BQU1DLFNBQW9CLEVBQVE7UUFDeENBLFVBQVVDLG1CQUFtQixDQUFDQyxTQUFTLENBQUMsQ0FBQ0M7WUFDeEMsS0FBSyxJQUFJLENBQUNDLHNCQUFzQixDQUFDRCxLQUFLRSxJQUFJLENBQUMsQ0FBQ0M7Z0JBQzNDZixXQUFXLElBQUksRUFBRWdCLElBQUksQ0FBQ0Q7WUFDdkI7UUFDRDtJQUNEO0FBVUQifQ==
@@ -0,0 +1,103 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ import path from "node:path";
8
+ import { injectable } from "@decohere/crucible/decorators";
9
+ import { io } from "@decohere/nexus/io";
10
+ import { ForgeError } from "../errors.js";
11
+ export class DependencyPinner {
12
+ async pin(imported, shipped, projects, workspaceRoot) {
13
+ const scopes = [
14
+ ...shipped.map((project)=>({
15
+ name: project.name,
16
+ dir: project.projectRoot,
17
+ pkg: project.pkg
18
+ })),
19
+ {
20
+ name: "the workspace root",
21
+ dir: workspaceRoot.dir,
22
+ pkg: workspaceRoot.pkg
23
+ }
24
+ ];
25
+ const declaredBy = new Map();
26
+ for (const scope of scopes){
27
+ for (const name of Object.keys(scope.pkg.dependencies ?? {})){
28
+ if (projects.has(name)) {
29
+ continue; // a workspace library, copied from its build, never installed
30
+ }
31
+ declaredBy.set(name, [
32
+ ...declaredBy.get(name) ?? [],
33
+ scope
34
+ ]);
35
+ }
36
+ }
37
+ this.assertImportsAreShipped(imported, declaredBy, scopes);
38
+ const pinned = {};
39
+ for (const name of [
40
+ ...declaredBy.keys()
41
+ ].sort()){
42
+ pinned[name] = await this.installedVersion(name, declaredBy.get(name) ?? [], workspaceRoot.dir);
43
+ }
44
+ return pinned;
45
+ }
46
+ assertImportsAreShipped(imported, declaredBy, scopes) {
47
+ for (const name of [
48
+ ...imported.keys()
49
+ ].sort()){
50
+ if (declaredBy.has(name)) {
51
+ continue;
52
+ }
53
+ const importers = [
54
+ ...imported.get(name) ?? []
55
+ ].sort().join(", ");
56
+ const devOnly = scopes.find((scope)=>scope.pkg.devDependencies?.[name] != null);
57
+ if (devOnly != null) {
58
+ throw new ForgeError(`${name} is imported at run time by ${importers}, but it is only a devDependency ` + `(of ${devOnly.name}). Move it to "dependencies".`);
59
+ }
60
+ throw new ForgeError(`${name} is imported at run time by ${importers}, but is not in "dependencies" of the ` + "deployable, any library it uses, or the workspace root package.json. Add it there.");
61
+ }
62
+ }
63
+ async installedVersion(name, declarers, workspaceRootDir) {
64
+ const versions = new Map();
65
+ for (const scope of declarers){
66
+ const version = await findInstalledVersion(name, scope.dir) ?? await findInstalledVersion(name, workspaceRootDir);
67
+ if (version == null) {
68
+ throw new ForgeError(`${name} is declared by ${scope.name} but is not installed. ` + "Run the package manager install first.");
69
+ }
70
+ versions.set(scope.name, version);
71
+ }
72
+ const distinct = new Set(versions.values());
73
+ if (distinct.size > 1) {
74
+ const detail = [
75
+ ...versions
76
+ ].map(([owner, version])=>`${owner}: ${version}`).join(", ");
77
+ throw new ForgeError(`${name} is installed at different versions for the packages that declare it (${detail}). ` + "One packaged app can only ship one version; align them.");
78
+ }
79
+ const [version] = distinct;
80
+ if (version == null) {
81
+ throw new ForgeError(`${name} is not installed. Run the package manager install first.`);
82
+ }
83
+ return version;
84
+ }
85
+ }
86
+ DependencyPinner = _ts_decorate([
87
+ injectable()
88
+ ], DependencyPinner);
89
+ /** Looks for `node_modules/<name>` in `fromDir` and each folder above it, as Node does. */ async function findInstalledVersion(name, fromDir) {
90
+ let dir = path.resolve(fromDir);
91
+ for(;;){
92
+ const manifest = path.join(dir, "node_modules", name, "package.json");
93
+ if (await io.fileExists(manifest)) {
94
+ const { version } = await io.readJsonFile(manifest);
95
+ return version;
96
+ }
97
+ const parent = path.dirname(dir);
98
+ if (parent === dir) {
99
+ return undefined;
100
+ }
101
+ dir = parent;
102
+ }
103
+ }
@@ -0,0 +1,21 @@
1
+ import path from "node:path";
2
+ import { io } from "@decohere/nexus/io";
3
+ /** Where `forge package` writes a deployable's output: inside the project, the Docker build context. */ export const PACKAGE_DIR = ".package";
4
+ /**
5
+ * A deployable is a project with a Dockerfile: `docker.dockerfile` from `.decohere.js`,
6
+ * or `Dockerfile` in the project folder. `forge docker` and `forge package` share this
7
+ * rule so they always agree on which projects are deployables.
8
+ */ function dockerfileName(project) {
9
+ return project.dockerConfig?.dockerfile ?? "Dockerfile";
10
+ }
11
+ function dockerfilePath(project) {
12
+ return path.join(project.projectRoot, dockerfileName(project));
13
+ }
14
+ async function isDeployable(project) {
15
+ return await io.fileExists(dockerfilePath(project));
16
+ }
17
+ export const deployable = {
18
+ dockerfileName,
19
+ dockerfilePath,
20
+ isDeployable
21
+ };