@decohere/forge 0.0.1-dev.10 → 0.0.1-dev.100

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 (145) hide show
  1. package/README.md +118 -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 +229 -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 +1 -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 +40 -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/services/dependency-resolver.service.js +0 -2
  44. package/commonjs/src/services/file-writer.service.js +0 -2
  45. package/commonjs/src/services/swc-transpiler.js +28 -9
  46. package/commonjs/src/services/ts-program-host.js +2 -4
  47. package/commonjs/src/services/type-emission-program.js +23 -8
  48. package/commonjs/src/services/type-emitter.js +33 -5
  49. package/commonjs/src/types/build-target.type.js +0 -2
  50. package/commonjs/src/types/configuration.type.js +0 -2
  51. package/commonjs/src/types/dependency.types.js +0 -2
  52. package/commonjs/src/types/swc-config.type.js +0 -2
  53. package/commonjs/src/types/transform-response.model.js +1 -2
  54. package/commonjs/src/types/transformer.type.js +0 -2
  55. package/commonjs/src/types/workspace-config.type.js +0 -2
  56. package/commonjs/src/vitest/forge-build.plugin.js +2 -3
  57. package/commonjs/src/vitest/index.js +0 -2
  58. package/commonjs/src/workspace.config.js +33 -3
  59. package/es6/src/actions/build.action.js +8 -4
  60. package/es6/src/actions/clean.action.js +2 -5
  61. package/es6/src/actions/commit.action.js +0 -3
  62. package/es6/src/actions/copy.action.js +37 -8
  63. package/es6/src/actions/dependency-report.action.js +0 -4
  64. package/es6/src/actions/dependency-sync.action.js +0 -4
  65. package/es6/src/actions/docker.action.js +194 -0
  66. package/es6/src/actions/index.js +5 -2
  67. package/es6/src/actions/link.action.js +128 -0
  68. package/es6/src/actions/package.action.js +214 -0
  69. package/es6/src/actions/publish.action.js +0 -3
  70. package/es6/src/actions/sync-lock-file.action.js +0 -2
  71. package/es6/src/actions/tag.action.js +2 -6
  72. package/es6/src/actions/typecheck.action.js +52 -0
  73. package/es6/src/actions/unlink.action.js +59 -0
  74. package/es6/src/actions/version.action.js +1 -6
  75. package/es6/src/actions/watch.action.js +1 -3
  76. package/es6/src/commands/build.command.js +0 -2
  77. package/es6/src/commands/dependency.command.js +0 -2
  78. package/es6/src/commands/docker.command.js +16 -0
  79. package/es6/src/commands/forge.command.js +0 -2
  80. package/es6/src/commands/index.js +4 -2
  81. package/es6/src/commands/link.command.js +64 -0
  82. package/es6/src/commands/package.command.js +26 -0
  83. package/es6/src/commands/publish.command.js +0 -2
  84. package/es6/src/commands/tag.command.js +0 -2
  85. package/es6/src/commands/typecheck.command.js +14 -0
  86. package/es6/src/commands/version.command.js +0 -2
  87. package/es6/src/const.js +0 -2
  88. package/es6/src/create-workspace.js +28 -0
  89. package/es6/src/errors.js +0 -2
  90. package/es6/src/extensions/project.extensions.js +0 -2
  91. package/es6/src/factories/swc-config.factory.js +17 -6
  92. package/es6/src/forge.module.js +20 -21
  93. package/es6/src/index.js +2 -3
  94. package/es6/src/mixins/caches-outputs.mixin.js +7 -7
  95. package/es6/src/mixins/incremental-transform.mixin.js +0 -2
  96. package/es6/src/packaging/dependency-pinner.service.js +103 -0
  97. package/es6/src/packaging/deployable.js +21 -0
  98. package/es6/src/packaging/import-graph.service.js +122 -0
  99. package/es6/src/packaging/release-exports.js +78 -0
  100. package/es6/src/services/dependency-resolver.service.js +0 -2
  101. package/es6/src/services/file-writer.service.js +0 -2
  102. package/es6/src/services/swc-transpiler.js +28 -9
  103. package/es6/src/services/ts-program-host.js +2 -4
  104. package/es6/src/services/type-emission-program.js +23 -8
  105. package/es6/src/services/type-emitter.js +30 -5
  106. package/es6/src/types/build-target.type.js +0 -2
  107. package/es6/src/types/configuration.type.js +0 -2
  108. package/es6/src/types/dependency.types.js +0 -2
  109. package/es6/src/types/swc-config.type.js +0 -2
  110. package/es6/src/types/transform-response.model.js +1 -2
  111. package/es6/src/types/transformer.type.js +0 -2
  112. package/es6/src/types/workspace-config.type.js +0 -2
  113. package/es6/src/vitest/forge-build.plugin.js +2 -3
  114. package/es6/src/vitest/index.js +0 -2
  115. package/es6/src/workspace.config.js +34 -3
  116. package/package.json +5 -5
  117. package/types/src/actions/build.action.d.ts +1 -0
  118. package/types/src/actions/copy.action.d.ts +10 -0
  119. package/types/src/actions/docker.action.d.ts +38 -0
  120. package/types/src/actions/index.d.ts +5 -0
  121. package/types/src/actions/link.action.d.ts +25 -0
  122. package/types/src/actions/package.action.d.ts +38 -0
  123. package/types/src/actions/typecheck.action.d.ts +14 -0
  124. package/types/src/actions/unlink.action.d.ts +9 -0
  125. package/types/src/commands/docker.command.d.ts +6 -0
  126. package/types/src/commands/index.d.ts +4 -0
  127. package/types/src/commands/link.command.d.ts +28 -0
  128. package/types/src/commands/package.command.d.ts +11 -0
  129. package/types/src/commands/typecheck.command.d.ts +6 -0
  130. package/types/src/create-workspace.d.ts +7 -0
  131. package/types/src/factories/swc-config.factory.d.ts +1 -0
  132. package/types/src/forge.module.d.ts +10 -0
  133. package/types/src/index.d.ts +2 -1
  134. package/types/src/packaging/dependency-pinner.service.d.ts +20 -0
  135. package/types/src/packaging/deployable.d.ts +17 -0
  136. package/types/src/packaging/import-graph.service.d.ts +33 -0
  137. package/types/src/packaging/release-exports.d.ts +18 -0
  138. package/types/src/services/swc-transpiler.d.ts +6 -2
  139. package/types/src/services/ts-program-host.d.ts +1 -1
  140. package/types/src/services/type-emission-program.d.ts +6 -1
  141. package/types/src/services/type-emitter.d.ts +14 -0
  142. package/types/src/types/configuration.type.d.ts +5 -0
  143. package/types/src/types/swc-config.type.d.ts +7 -1
  144. package/types/src/types/transform-response.model.d.ts +2 -0
  145. package/types/src/workspace.config.d.ts +6 -0
@@ -8,13 +8,11 @@ function _ts_metadata(k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  }
10
10
  import { injectable } from "@decohere/crucible/decorators";
11
- // biome-ignore lint/style/useImportType: <DI>
12
11
  import { Workspace } from "@decohere/mesh";
13
12
  import { ActionResponse } from "@decohere/nexus/cli";
14
13
  import { io } from "@decohere/nexus/io";
15
14
  import { scribe } from "@decohere/scribe";
16
15
  import { formatUnknownError } from "../errors.js";
17
- // biome-ignore lint/style/useImportType: <DI>
18
16
  import { DependencyResolver } from "../services/dependency-resolver.service.js";
19
17
  export class ReportDependencies {
20
18
  workspace;
@@ -130,5 +128,3 @@ ReportDependencies = _ts_decorate([
130
128
  typeof DependencyResolver === "undefined" ? Object : DependencyResolver
131
129
  ])
132
130
  ], ReportDependencies);
133
-
134
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9hY3Rpb25zL2RlcGVuZGVuY3ktcmVwb3J0LmFjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBQcm9qZWN0IH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiA8REk+XG5pbXBvcnQgeyBXb3Jrc3BhY2UgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB0eXBlIHsgQWN0aW9uIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7IEFjdGlvblJlc3BvbnNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7IGlvIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9pb1wiO1xuaW1wb3J0IHsgc2NyaWJlIH0gZnJvbSBcIkBkZWNvaGVyZS9zY3JpYmVcIjtcbmltcG9ydCB7IGZvcm1hdFVua25vd25FcnJvciB9IGZyb20gXCIuLi9lcnJvcnMuanNcIjtcbi8vIGJpb21lLWlnbm9yZSBsaW50L3N0eWxlL3VzZUltcG9ydFR5cGU6IDxEST5cbmltcG9ydCB7IERlcGVuZGVuY3lSZXNvbHZlciB9IGZyb20gXCIuLi9zZXJ2aWNlcy9kZXBlbmRlbmN5LXJlc29sdmVyLnNlcnZpY2UuanNcIjtcbmltcG9ydCB0eXBlIHsgRGVwZW5kZW5jeVdhcm5pbmcsIERyaWZ0RW50cnksIFBhY2thZ2UgfSBmcm9tIFwiLi4vdHlwZXMvZGVwZW5kZW5jeS50eXBlcy5qc1wiO1xuXG50eXBlIFJlcG9ydE9wdGlvbnMgPSB7XG5cdGNvbmZpZ3VyYXRpb246IHN0cmluZztcblx0ZmlsZT86IHN0cmluZztcblx0ZmFpbE9uRHJpZnQ/OiBib29sZWFuO1xufTtcblxudHlwZSBSZXBvcnRFbnRyeSA9IHtcblx0cHJvamVjdE5hbWU6IHN0cmluZztcblx0ZGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcblx0ZGV2RGVwZW5kZW5jaWVzOiBzdHJpbmdbXTtcbn07XG5cbnR5cGUgRHJpZnRSZXBvcnQgPSBSZWNvcmQ8c3RyaW5nLCBEcmlmdEVudHJ5PjtcblxudHlwZSBQcm9qZWN0UmVwb3J0ID0ge1xuXHRwcm9qZWN0TmFtZTogc3RyaW5nO1xuXHRlbnRyeTogUmVwb3J0RW50cnk7XG5cdGRyaWZ0OiBEcmlmdEVudHJ5IHwgbnVsbDtcblx0d2FybmluZ3M6IERlcGVuZGVuY3lXYXJuaW5nW107XG59O1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUmVwb3J0RGVwZW5kZW5jaWVzIGltcGxlbWVudHMgQWN0aW9uPFJlcG9ydE9wdGlvbnM+IHtcblx0I2xvZ2dlciA9IHNjcmliZS5sb2dnZXIoUmVwb3J0RGVwZW5kZW5jaWVzLm5hbWUpO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihcblx0XHRwcml2YXRlIHJlYWRvbmx5IHdvcmtzcGFjZTogV29ya3NwYWNlLFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgcmVzb2x2ZXI6IERlcGVuZGVuY3lSZXNvbHZlcixcblx0KSB7fVxuXG5cdHB1YmxpYyBhc3luYyBydW4ob3B0aW9uczogUmVwb3J0T3B0aW9ucyk6IFByb21pc2U8QWN0aW9uUmVzcG9uc2U8UHJvamVjdFJlcG9ydD4+IHtcblx0XHRjb25zdCB7IGNvbmZpZ3VyYXRpb24sIGZpbGUsIGZhaWxPbkRyaWZ0IH0gPSBvcHRpb25zO1xuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IHByb2plY3REZXBzID0gYXdhaXQgdGhpcy5hbmFseXplV29ya3NwYWNlKHRoaXMud29ya3NwYWNlLCBjb25maWd1cmF0aW9uKTtcblx0XHRcdHRoaXMubG9nUmVwb3J0KHByb2plY3REZXBzKTtcblxuXHRcdFx0aWYgKGZpbGUpIHtcblx0XHRcdFx0YXdhaXQgdGhpcy53cml0ZVJlcG9ydEZpbGUoZmlsZSwgcHJvamVjdERlcHMpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoZmFpbE9uRHJpZnQpIHtcblx0XHRcdFx0Y29uc3QgZHJpZnRSZXBvcnQgPSB0aGlzLmJ1aWxkRHJpZnRSZXBvcnQocHJvamVjdERlcHMpO1xuXHRcdFx0XHR0aGlzLnRocm93T25EcmlmdChkcmlmdFJlcG9ydCk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5TdWNjZXNzKFJlcG9ydERlcGVuZGVuY2llcy5uYW1lLCBwcm9qZWN0RGVwcyk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBmb3JtYXRVbmtub3duRXJyb3IoZXJyb3IpO1xuXHRcdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLkVycm9yPFByb2plY3RSZXBvcnQ+KFJlcG9ydERlcGVuZGVuY2llcy5uYW1lLCBtZXNzYWdlKTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGFuYWx5emVXb3Jrc3BhY2UoXG5cdFx0d29ya3NwYWNlOiBXb3Jrc3BhY2UsXG5cdFx0Y29uZmlndXJhdGlvbjogc3RyaW5nLFxuXHQpOiBQcm9taXNlPFByb2plY3RSZXBvcnRbXT4ge1xuXHRcdGNvbnN0IHByb2plY3RzID0gd29ya3NwYWNlLmdldFByb2plY3RzKGNvbmZpZ3VyYXRpb24pO1xuXHRcdGNvbnN0IHdvcmtzcGFjZVBhY2thZ2VzID0gYXdhaXQgdGhpcy5yZXNvbHZlci5nZXRXb3Jrc3BhY2VQYWNrYWdlcyhcblx0XHRcdHRoaXMud29ya3NwYWNlLFxuXHRcdFx0cHJvamVjdHMsXG5cdFx0KTtcblx0XHRyZXR1cm4gUHJvbWlzZS5hbGwoXG5cdFx0XHRwcm9qZWN0cy5tYXAoKHByb2plY3QpID0+IHRoaXMuYW5hbHl6ZVByb2plY3QocHJvamVjdCwgd29ya3NwYWNlUGFja2FnZXMpKSxcblx0XHQpO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBhbmFseXplUHJvamVjdChcblx0XHRwcm9qZWN0OiBQcm9qZWN0LFxuXHRcdHdvcmtzcGFjZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQYWNrYWdlPixcblx0KTogUHJvbWlzZTxQcm9qZWN0UmVwb3J0PiB7XG5cdFx0Y29uc3QgeyBlbnRyeSwgY3VycmVudFBhY2thZ2UsIHVwZGF0ZWRQYWNrYWdlLCB3YXJuaW5ncyB9ID0gYXdhaXQgdGhpcy5nZXREZXBlbmRlbmNpZXMoXG5cdFx0XHRwcm9qZWN0LFxuXHRcdFx0d29ya3NwYWNlUGFja2FnZXMsXG5cdFx0KTtcblx0XHRjb25zdCBkcmlmdCA9IHRoaXMucmVzb2x2ZXIuY29tcHV0ZURyaWZ0KGN1cnJlbnRQYWNrYWdlLCB1cGRhdGVkUGFja2FnZSk7XG5cdFx0cmV0dXJuIHsgcHJvamVjdE5hbWU6IHByb2plY3QubmFtZSwgZW50cnksIGRyaWZ0LCB3YXJuaW5ncyB9O1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBnZXREZXBlbmRlbmNpZXMoXG5cdFx0cHJvamVjdDogUHJvamVjdCxcblx0XHR3b3Jrc3BhY2VQYWNrYWdlczogTWFwPHN0cmluZywgUGFja2FnZT4sXG5cdCk6IFByb21pc2U8e1xuXHRcdGVudHJ5OiBSZXBvcnRFbnRyeTtcblx0XHRjdXJyZW50UGFja2FnZTogUGFja2FnZUpzb247XG5cdFx0dXBkYXRlZFBhY2thZ2U6IFBhY2thZ2VKc29uO1xuXHRcdHdhcm5pbmdzOiBEZXBlbmRlbmN5V2FybmluZ1tdO1xuXHR9PiB7XG5cdFx0Y29uc3QgY3VycmVudFBhY2thZ2UgPSBhd2FpdCBwcm9qZWN0LmdldFBhY2thZ2VKc29uKCk7XG5cdFx0Y29uc3QgeyB1cGRhdGVkUGFja2FnZSwgd2FybmluZ3MgfSA9IGF3YWl0IHRoaXMucmVzb2x2ZXIuY29tcHV0ZVByb2plY3REZXBlbmRlbmNpZXMoXG5cdFx0XHRwcm9qZWN0LFxuXHRcdFx0d29ya3NwYWNlUGFja2FnZXMsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGVudHJ5OiBSZXBvcnRFbnRyeSA9IHtcblx0XHRcdHByb2plY3ROYW1lOiBwcm9qZWN0Lm5hbWUsXG5cdFx0XHRkZXBlbmRlbmNpZXM6IE9iamVjdC5rZXlzKHVwZGF0ZWRQYWNrYWdlLmRlcGVuZGVuY2llcyA/PyB7fSksXG5cdFx0XHRkZXZEZXBlbmRlbmNpZXM6IE9iamVjdC5rZXlzKHVwZGF0ZWRQYWNrYWdlLmRldkRlcGVuZGVuY2llcyA/PyB7fSksXG5cdFx0fTtcblxuXHRcdHJldHVybiB7IGVudHJ5LCBjdXJyZW50UGFja2FnZSwgdXBkYXRlZFBhY2thZ2UsIHdhcm5pbmdzIH07XG5cdH1cblxuXHRwcml2YXRlIGJ1aWxkRHJpZnRSZXBvcnQocmVwb3J0czogUHJvamVjdFJlcG9ydFtdKTogRHJpZnRSZXBvcnQge1xuXHRcdHJldHVybiBPYmplY3QuZnJvbUVudHJpZXMoXG5cdFx0XHRyZXBvcnRzXG5cdFx0XHRcdC5maWx0ZXIoKHIpOiByIGlzIFByb2plY3RSZXBvcnQgJiB7IGRyaWZ0OiBEcmlmdEVudHJ5IH0gPT4gci5kcmlmdCAhPSBudWxsKVxuXHRcdFx0XHQubWFwKChyKSA9PiBbci5wcm9qZWN0TmFtZSwgci5kcmlmdF0pLFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIHRocm93T25EcmlmdChkcmlmdFJlcG9ydDogRHJpZnRSZXBvcnQpOiB2b2lkIHtcblx0XHRjb25zdCBkcmlmdGVkUHJvamVjdHMgPSBPYmplY3Qua2V5cyhkcmlmdFJlcG9ydCk7XG5cdFx0aWYgKGRyaWZ0ZWRQcm9qZWN0cy5sZW5ndGggPiAwKSB7XG5cdFx0XHRmb3IgKGNvbnN0IFtwcm9qZWN0TmFtZSwgZHJpZnRdIG9mIE9iamVjdC5lbnRyaWVzKGRyaWZ0UmVwb3J0KSkge1xuXHRcdFx0XHR0aGlzLiNsb2dnZXIud2FybihgRGVwZW5kZW5jeSBkcmlmdCBpbiAnJHtwcm9qZWN0TmFtZX0nYCwge1xuXHRcdFx0XHRcdG9yaWdpbmFsOiBkcmlmdC5vcmlnaW5hbCxcblx0XHRcdFx0XHR1cGRhdGVkOiBkcmlmdC51cGRhdGVkLFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHRcdHRocm93IG5ldyBFcnJvcihgRGVwZW5kZW5jeSBkcmlmdCBkZXRlY3RlZCBpbjogJHtkcmlmdGVkUHJvamVjdHMuam9pbihcIiwgXCIpfWApO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgbG9nUmVwb3J0KHJlcG9ydHM6IFByb2plY3RSZXBvcnRbXSkge1xuXHRcdGZvciAoY29uc3QgeyBlbnRyeSwgd2FybmluZ3MgfSBvZiByZXBvcnRzKSB7XG5cdFx0XHR0aGlzLiNsb2dnZXIuaW5mbyhgJHtlbnRyeS5wcm9qZWN0TmFtZX06YCk7XG5cdFx0XHRpZiAoZW50cnkuZGVwZW5kZW5jaWVzLmxlbmd0aCkge1xuXHRcdFx0XHR0aGlzLiNsb2dnZXIuaW5mbyhgICBkZXBlbmRlbmNpZXM6ICR7ZW50cnkuZGVwZW5kZW5jaWVzLmpvaW4oXCIsIFwiKX1gKTtcblx0XHRcdH1cblx0XHRcdGlmIChlbnRyeS5kZXZEZXBlbmRlbmNpZXMubGVuZ3RoKSB7XG5cdFx0XHRcdHRoaXMuI2xvZ2dlci5pbmZvKGAgIGRldkRlcGVuZGVuY2llczogJHtlbnRyeS5kZXZEZXBlbmRlbmNpZXMuam9pbihcIiwgXCIpfWApO1xuXHRcdFx0fVxuXHRcdFx0Zm9yIChjb25zdCB3YXJuaW5nIG9mIHdhcm5pbmdzKSB7XG5cdFx0XHRcdHRoaXMuI2xvZ2dlci53YXJuKGAgIHdhcm5pbmc6ICR7d2FybmluZy5maWxlfToke3dhcm5pbmcubGluZX06ICR7d2FybmluZy5tZXNzYWdlfWApO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgd3JpdGVSZXBvcnRGaWxlKGZpbGU6IHN0cmluZywgcmVwb3J0czogUHJvamVjdFJlcG9ydFtdKSB7XG5cdFx0Y29uc3QgbGluZXMgPSByZXBvcnRzLmZsYXRNYXAoKHsgZW50cnksIHdhcm5pbmdzIH0pID0+IFtcblx0XHRcdGAke2VudHJ5LnByb2plY3ROYW1lfTpgLFxuXHRcdFx0Li4uKGVudHJ5LmRlcGVuZGVuY2llcy5sZW5ndGhcblx0XHRcdFx0PyBbYCAgZGVwZW5kZW5jaWVzOiAke2VudHJ5LmRlcGVuZGVuY2llcy5qb2luKFwiLCBcIil9YF1cblx0XHRcdFx0OiBbXSksXG5cdFx0XHQuLi4oZW50cnkuZGV2RGVwZW5kZW5jaWVzLmxlbmd0aFxuXHRcdFx0XHQ/IFtgICBkZXZEZXBlbmRlbmNpZXM6ICR7ZW50cnkuZGV2RGVwZW5kZW5jaWVzLmpvaW4oXCIsIFwiKX1gXVxuXHRcdFx0XHQ6IFtdKSxcblx0XHRcdC4uLndhcm5pbmdzLm1hcCgodykgPT4gYCAgd2FybmluZzogJHt3LmZpbGV9OiR7dy5saW5lfTogJHt3Lm1lc3NhZ2V9YCksXG5cdFx0XHRcIlwiLFxuXHRcdF0pO1xuXHRcdGF3YWl0IGlvLndyaXRlRmlsZShmaWxlLCBsaW5lcy5qb2luKFwiXFxuXCIpLCB7IG1rZGlyOiB0cnVlIH0pO1xuXHRcdHRoaXMuI2xvZ2dlci5pbmZvKGBSZXBvcnQgd3JpdHRlbiB0byAke2ZpbGV9YCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJpbmplY3RhYmxlIiwiV29ya3NwYWNlIiwiQWN0aW9uUmVzcG9uc2UiLCJpbyIsInNjcmliZSIsImZvcm1hdFVua25vd25FcnJvciIsIkRlcGVuZGVuY3lSZXNvbHZlciIsIlJlcG9ydERlcGVuZGVuY2llcyIsImxvZ2dlciIsIm5hbWUiLCJ3b3Jrc3BhY2UiLCJyZXNvbHZlciIsInJ1biIsIm9wdGlvbnMiLCJjb25maWd1cmF0aW9uIiwiZmlsZSIsImZhaWxPbkRyaWZ0IiwicHJvamVjdERlcHMiLCJhbmFseXplV29ya3NwYWNlIiwibG9nUmVwb3J0Iiwid3JpdGVSZXBvcnRGaWxlIiwiZHJpZnRSZXBvcnQiLCJidWlsZERyaWZ0UmVwb3J0IiwidGhyb3dPbkRyaWZ0IiwiU3VjY2VzcyIsImVycm9yIiwibWVzc2FnZSIsIkVycm9yIiwicHJvamVjdHMiLCJnZXRQcm9qZWN0cyIsIndvcmtzcGFjZVBhY2thZ2VzIiwiZ2V0V29ya3NwYWNlUGFja2FnZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwicHJvamVjdCIsImFuYWx5emVQcm9qZWN0IiwiZW50cnkiLCJjdXJyZW50UGFja2FnZSIsInVwZGF0ZWRQYWNrYWdlIiwid2FybmluZ3MiLCJnZXREZXBlbmRlbmNpZXMiLCJkcmlmdCIsImNvbXB1dGVEcmlmdCIsInByb2plY3ROYW1lIiwiZ2V0UGFja2FnZUpzb24iLCJjb21wdXRlUHJvamVjdERlcGVuZGVuY2llcyIsImRlcGVuZGVuY2llcyIsIk9iamVjdCIsImtleXMiLCJkZXZEZXBlbmRlbmNpZXMiLCJyZXBvcnRzIiwiZnJvbUVudHJpZXMiLCJmaWx0ZXIiLCJyIiwiZHJpZnRlZFByb2plY3RzIiwibGVuZ3RoIiwiZW50cmllcyIsIndhcm4iLCJvcmlnaW5hbCIsInVwZGF0ZWQiLCJqb2luIiwiaW5mbyIsIndhcm5pbmciLCJsaW5lIiwibGluZXMiLCJmbGF0TWFwIiwidyIsIndyaXRlRmlsZSIsIm1rZGlyIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxTQUFTQSxVQUFVLFFBQVEsZ0NBQWdDO0FBRTNELDhDQUE4QztBQUM5QyxTQUFTQyxTQUFTLFFBQVEsaUJBQWlCO0FBRTNDLFNBQVNDLGNBQWMsUUFBUSxzQkFBc0I7QUFDckQsU0FBU0MsRUFBRSxRQUFRLHFCQUFxQjtBQUN4QyxTQUFTQyxNQUFNLFFBQVEsbUJBQW1CO0FBQzFDLFNBQVNDLGtCQUFrQixRQUFRLGVBQWU7QUFDbEQsOENBQThDO0FBQzlDLFNBQVNDLGtCQUFrQixRQUFRLDZDQUE2QztBQXlCaEYsT0FBTyxNQUFNQzs7O0lBQ1osQ0FBQSxNQUFPLEdBQUdILE9BQU9JLE1BQU0sQ0FBQ0QsbUJBQW1CRSxJQUFJLEVBQUU7SUFFakQsWUFDQyxBQUFpQkMsU0FBb0IsRUFDckMsQUFBaUJDLFFBQTRCLENBQzVDO2FBRmdCRCxZQUFBQTthQUNBQyxXQUFBQTtJQUNmO0lBRUgsTUFBYUMsSUFBSUMsT0FBc0IsRUFBMEM7UUFDaEYsTUFBTSxFQUFFQyxhQUFhLEVBQUVDLElBQUksRUFBRUMsV0FB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
@@ -8,12 +8,10 @@ function _ts_metadata(k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  }
10
10
  import { injectable } from "@decohere/crucible/decorators";
11
- // biome-ignore lint/style/useImportType: <DI>
12
11
  import { Workspace } from "@decohere/mesh";
13
12
  import { ActionResponse } from "@decohere/nexus/cli";
14
13
  import { scribe } from "@decohere/scribe";
15
14
  import { formatUnknownError } from "../errors.js";
16
- // biome-ignore lint/style/useImportType: <DI>
17
15
  import { DependencyResolver } from "../services/dependency-resolver.service.js";
18
16
  export class SyncDependencies {
19
17
  workspace;
@@ -88,5 +86,3 @@ SyncDependencies = _ts_decorate([
88
86
  typeof DependencyResolver === "undefined" ? Object : DependencyResolver
89
87
  ])
90
88
  ], SyncDependencies);
91
-
92
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9hY3Rpb25zL2RlcGVuZGVuY3ktc3luYy5hY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgUHJvamVjdCB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogPERJPlxuaW1wb3J0IHsgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgdHlwZSB7IEFjdGlvbiB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBBY3Rpb25SZXNwb25zZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHsgZm9ybWF0VW5rbm93bkVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogPERJPlxuaW1wb3J0IHsgRGVwZW5kZW5jeVJlc29sdmVyIH0gZnJvbSBcIi4uL3NlcnZpY2VzL2RlcGVuZGVuY3ktcmVzb2x2ZXIuc2VydmljZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlLCBTeW5jcHJvamVjdFJlc3VsdCB9IGZyb20gXCIuLi90eXBlcy9kZXBlbmRlbmN5LnR5cGVzLmpzXCI7XG5cbmV4cG9ydCB0eXBlIERlcGVuZGVuY2llc09wdGlvbnMgPSB7XG5cdGNvbmZpZ3VyYXRpb246IHN0cmluZztcblx0bG9nRGlmZj86IGJvb2xlYW47XG59O1xuXG50eXBlIFN5bmNDb21wdXRlZCA9XG5cdHwgeyBzdWNjZWVkZWQ6IGZhbHNlOyBzeW5jUmVzdWx0OiBTeW5jcHJvamVjdFJlc3VsdCB9XG5cdHwge1xuXHRcdFx0c3VjY2VlZGVkOiB0cnVlO1xuXHRcdFx0c3luY1Jlc3VsdDogU3luY3Byb2plY3RSZXN1bHQ7XG5cdFx0XHRwcm9qZWN0OiBQcm9qZWN0O1xuXHRcdFx0b3JpZ2luYWxQYWNrYWdlOiBQYWNrYWdlSnNvbjtcblx0XHRcdHVwZGF0ZWRQYWNrYWdlOiBQYWNrYWdlSnNvbjtcblx0ICB9O1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgU3luY0RlcGVuZGVuY2llcyBpbXBsZW1lbnRzIEFjdGlvbjxEZXBlbmRlbmNpZXNPcHRpb25zPiB7XG5cdCNsb2dnZXIgPSBzY3JpYmUubG9nZ2VyKFN5bmNEZXBlbmRlbmNpZXMubmFtZSk7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKFxuXHRcdHByaXZhdGUgcmVhZG9ubHkgd29ya3NwYWNlOiBXb3Jrc3BhY2UsXG5cdFx0cHJpdmF0ZSByZWFkb25seSByZXNvbHZlcjogRGVwZW5kZW5jeVJlc29sdmVyLFxuXHQpIHt9XG5cblx0cHVibGljIGFzeW5jIHJ1bihvcHRpb25zOiBEZXBlbmRlbmNpZXNPcHRpb25zKTogUHJvbWlzZTxBY3Rpb25SZXNwb25zZTxTeW5jcHJvamVjdFJlc3VsdD4+IHtcblx0XHRjb25zdCB7IGNvbmZpZ3VyYXRpb24sIGxvZ0RpZmYgfSA9IG9wdGlvbnM7XG5cblx0XHRjb25zdCBwcm9qZWN0cyA9IHRoaXMud29ya3NwYWNlLmdldFByb2plY3RzKGNvbmZpZ3VyYXRpb24pO1xuXHRcdGNvbnN0IHdvcmtzcGFjZVBhY2thZ2VzID0gYXdhaXQgdGhpcy5yZXNvbHZlci5nZXRXb3Jrc3BhY2VQYWNrYWdlcyhcblx0XHRcdHRoaXMud29ya3NwYWNlLFxuXHRcdFx0cHJvamVjdHMsXG5cdFx0KTtcblxuXHRcdGNvbnN0IGNvbXB1dGVkID0gYXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRwcm9qZWN0cy5tYXAoKHByb2plY3QpID0+IHRoaXMuY29tcHV0ZURlcGVuZGVuY2llc0Zvcihwcm9qZWN0LCB3b3Jrc3BhY2VQYWNrYWdlcykpLFxuXHRcdCk7XG5cblx0XHRjb25zdCByZXN1bHRzID0gY29tcHV0ZWQubWFwKChjKSA9PiBjLnN5bmNSZXN1bHQpO1xuXHRcdGlmIChyZXN1bHRzLnNvbWUoKHIpID0+ICFyLnN1Y2NlZWRlZCkpIHtcblx0XHRcdHJldHVybiBBY3Rpb25SZXNwb25zZS5FcnJvcihTeW5jRGVwZW5kZW5jaWVzLm5hbWUsIHJlc3VsdHMpO1xuXHRcdH1cblxuXHRcdGNvbnN0IHN1Y2NlZWRlZCA9IGNvbXB1dGVkLmZpbHRlcihcblx0XHRcdChjKTogYyBpcyBTeW5jQ29tcHV0ZWQgJiB7IHN1Y2NlZWRlZDogdHJ1ZSB9ID0+IGMuc3VjY2VlZGVkLFxuXHRcdCk7XG5cblx0XHRhd2FpdCBQcm9taXNlLmFsbChzdWNjZWVkZWQubWFwKChjKSA9PiBjLnByb2plY3QucGVyc2lzdFBhY2thZ2VKc29uKGMudXBkYXRlZFBhY2thZ2UpKSk7XG5cblx0XHRjb25zdCBzeW5jUmVzdWx0cyA9IHN1Y2NlZWRlZC5tYXAoKGMpID0+IHtcblx0XHRcdGNvbnN0IGRyaWZ0ID0gdGhpcy5yZXNvbHZlci5jb21wdXRlRHJpZnQoYy5vcmlnaW5hbFBhY2thZ2UsIGMudXBkYXRlZFBhY2thZ2UpO1xuXHRcdFx0aWYgKGRyaWZ0ICYmIGxvZ0RpZmYpIHtcblx0XHRcdFx0dGhpcy4jbG9nZ2VyLndhcm4oYERlcGVuZGVuY3kgZHJpZnQgc3luY2VkIGluICcke2Muc3luY1Jlc3VsdC5wcm9qZWN0TmFtZX0nYCwgZHJpZnQpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHsgLi4uYy5zeW5jUmVzdWx0LCBkcmlmdCB9O1xuXHRcdH0pO1xuXG5cdFx0Y29uc3QgZmFpbGVkUmVzdWx0cyA9IHJlc3VsdHMuZmlsdGVyKChyKSA9PiAhci5zdWNjZWVkZWQpO1xuXG5cdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLlN1Y2Nlc3MoU3luY0RlcGVuZGVuY2llcy5uYW1lLCBbLi4uc3luY1Jlc3VsdHMsIC4uLmZhaWxlZFJlc3VsdHNdKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgY29tcHV0ZURlcGVuZGVuY2llc0Zvcihcblx0XHRwcm9qZWN0OiBQcm9qZWN0LFxuXHRcdHdvcmtzcGFjZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQYWNrYWdlPixcblx0KTogUHJvbWlzZTxTeW5jQ29tcHV0ZWQ+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3Qgb3JpZ2luYWxQYWNrYWdlID0gYXdhaXQgcHJvamVjdC5nZXRQYWNrYWdlSnNvbigpO1xuXHRcdFx0Y29uc3QgeyB1cGRhdGVkUGFja2FnZSwgd2FybmluZ3MgfSA9IGF3YWl0IHRoaXMucmVzb2x2ZXIuY29tcHV0ZVByb2plY3REZXBlbmRlbmNpZXMoXG5cdFx0XHRcdHByb2plY3QsXG5cdFx0XHRcdHdvcmtzcGFjZVBhY2thZ2VzLFxuXHRcdFx0KTtcblx0XHRcdGZvciAoY29uc3Qgd2FybmluZyBvZiB3YXJuaW5ncykge1xuXHRcdFx0XHR0aGlzLiNsb2dnZXIud2FybihgJHt3YXJuaW5nLmZpbGV9OiR7d2FybmluZy5saW5lfTogJHt3YXJuaW5nLm1lc3NhZ2V9YCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRzdWNjZWVkZWQ6IHRydWUsXG5cdFx0XHRcdHN5bmNSZXN1bHQ6IHsgcHJvamVjdE5hbWU6IHByb2plY3QubmFtZSwgc3VjY2VlZGVkOiB0cnVlIH0sXG5cdFx0XHRcdHByb2plY3QsXG5cdFx0XHRcdG9yaWdpbmFsUGFja2FnZSxcblx0XHRcdFx0dXBkYXRlZFBhY2thZ2UsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XG5cdFx0XHRjb25zdCBtZXNzYWdlID0gZm9ybWF0VW5rbm93bkVycm9yKGVycm9yKTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHN1Y2NlZWRlZDogZmFsc2UsXG5cdFx0XHRcdHN5bmNSZXN1bHQ6IHtcblx0XHRcdFx0XHRwcm9qZWN0TmFtZTogcHJvamVjdC5uYW1lLFxuXHRcdFx0XHRcdGVycm9yOiBgJHtwcm9qZWN0Lm5hbWV9OiAke21lc3NhZ2V9YCxcblx0XHRcdFx0XHRzdWNjZWVkZWQ6IGZhbHNlLFxuXHRcdFx0XHR9LFxuXHRcdFx0fTtcblx0XHR9XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJpbmplY3RhYmxlIiwiV29ya3NwYWNlIiwiQWN0aW9uUmVzcG9uc2UiLCJzY3JpYmUiLCJmb3JtYXRVbmtub3duRXJyb3IiLCJEZXBlbmRlbmN5UmVzb2x2ZXIiLCJTeW5jRGVwZW5kZW5jaWVzIiwibG9nZ2VyIiwibmFtZSIsIndvcmtzcGFjZSIsInJlc29sdmVyIiwicnVuIiwib3B0aW9ucyIsImNvbmZpZ3VyYXRpb24iLCJsb2dEaWZmIiwicHJvamVjdHMiLCJnZXRQcm9qZWN0cyIsIndvcmtzcGFjZVBhY2thZ2VzIiwiZ2V0V29ya3NwYWNlUGFja2FnZXMiLCJjb21wdXRlZCIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJwcm9qZWN0IiwiY29tcHV0ZURlcGVuZGVuY2llc0ZvciIsInJlc3VsdHMiLCJjIiwic3luY1Jlc3VsdCIsInNvbWUiLCJyIiwic3VjY2VlZGVkIiwiRXJyb3IiLCJmaWx0ZXIiLCJwZXJzaXN0UGFja2FnZUpzb24iLCJ1cGRhdGVkUGFja2FnZSIsInN5bmNSZXN1bHRzIiwiZHJpZnQiLCJjb21wdXRlRHJpZnQiLCJvcmlnaW5hbFBhY2thZ2UiLCJ3YXJuIiwicHJvamVjdE5hbWUiLCJmYWlsZWRSZXN1bHRzIiwiU3VjY2VzcyIsImdldFBhY2thZ2VKc29uIiwid2FybmluZ3MiLCJjb21wdXRlUHJvamVjdERlcGVuZGVuY2llcyIsIndhcm5pbmciLCJmaWxlIiwibGluZSIsIm1lc3NhZ2UiLCJlcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsU0FBU0EsVUFBVSxRQUFRLGdDQUFnQztBQUUzRCw4Q0FBOEM7QUFDOUMsU0FBU0MsU0FBUyxRQUFRLGlCQUFpQjtBQUUzQyxTQUFTQyxjQUFjLFFBQVEsc0JB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
@@ -0,0 +1,194 @@
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
+ function _ts_metadata(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ }
10
+ import path from "node:path";
11
+ import { injectable } from "@decohere/crucible/decorators";
12
+ import { Workspace } from "@decohere/mesh";
13
+ import { ActionResponse } from "@decohere/nexus/cli";
14
+ import { Docker as DockerInterop } from "@decohere/nexus/interop";
15
+ import { io } from "@decohere/nexus/io";
16
+ import { scribe } from "@decohere/scribe";
17
+ import { ForgeError, formatUnknownError } from "../errors.js";
18
+ import { deployable, PACKAGE_DIR } from "../packaging/deployable.js";
19
+ export class Docker {
20
+ workspace;
21
+ #logger = scribe.logger(Docker.name);
22
+ docker = new DockerInterop();
23
+ #defaultRegistry = process.env.FORGE_DOCKER_REGISTRY?.trim() || "ghcr.io";
24
+ constructor(workspace){
25
+ this.workspace = workspace;
26
+ }
27
+ async run(options) {
28
+ const projects = await this.getDockerProjects(this.workspace.getProjects(options.configuration));
29
+ if (projects.length === 0) {
30
+ this.#logger.info("No projects found with a Dockerfile — nothing to dockerize");
31
+ return ActionResponse.Success(Docker.name, []);
32
+ }
33
+ const workspacePackageJson = await this.workspace.getPackageJson();
34
+ const version = await this.workspace.getVersion();
35
+ const responses = await Promise.all(projects.map(async (project)=>await this.buildProject(project, workspacePackageJson, version, options)));
36
+ const failed = responses.filter((response)=>!response.succeeded);
37
+ if (failed.length > 0) {
38
+ return ActionResponse.Error(Docker.name, responses);
39
+ }
40
+ return ActionResponse.Success(Docker.name, responses);
41
+ }
42
+ async getDockerProjects(projects) {
43
+ const result = [];
44
+ for (const project of projects){
45
+ if (!await deployable.isDeployable(project)) {
46
+ this.#logger.info(`Skipping ${project.name}: missing ${deployable.dockerfileName(project)}`);
47
+ continue;
48
+ }
49
+ result.push(project);
50
+ }
51
+ return result;
52
+ }
53
+ /**
54
+ * A Dockerfile that copies `.package/` needs `forge package` to have run. Fail before the
55
+ * build with that instruction rather than with Docker's "not found" from deep in a layer.
56
+ */ async assertPackaged(project) {
57
+ const dockerfile = await io.readFile(deployable.dockerfilePath(project)).catch(()=>"");
58
+ if (!dockerfile.includes(PACKAGE_DIR)) {
59
+ return;
60
+ }
61
+ const packaged = path.join(project.projectRoot, PACKAGE_DIR, "package.json");
62
+ if (!await io.fileExists(packaged)) {
63
+ throw new ForgeError(`${project.name}: its Dockerfile copies ${PACKAGE_DIR}/, which does not exist. ` + `Run \`forge build --configuration release\` and \`forge package ${project.name}\` first.`);
64
+ }
65
+ }
66
+ async buildProject(project, workspacePackageJson, version, options) {
67
+ const dockerConfig = project.dockerConfig ?? {};
68
+ const envBuildArgs = this.parseJsonEnv("FORGE_DOCKER_BUILD_ARGS_JSON", {});
69
+ const envSecrets = this.parseJsonEnv("FORGE_DOCKER_SECRETS_JSON", {});
70
+ const envTags = this.parseJsonEnv("FORGE_DOCKER_EXTRA_TAGS_JSON", []);
71
+ const image = dockerConfig.image ?? this.defaultImageName(project.name, workspacePackageJson);
72
+ const dockerfile = dockerConfig.dockerfile ?? "Dockerfile";
73
+ const extraTags = this.extraTagsForImage(image, [
74
+ ...dockerConfig.tags ?? [],
75
+ ...envTags
76
+ ]);
77
+ const tags = [
78
+ `${image}:${version}`,
79
+ ...extraTags
80
+ ];
81
+ const buildArgs = this.interpolateBuildArgs({
82
+ ...dockerConfig.buildArgs,
83
+ ...envBuildArgs
84
+ }, version);
85
+ const secrets = {
86
+ ...dockerConfig.secrets,
87
+ ...envSecrets
88
+ };
89
+ this.#logger.info(`${options.dryRun ? "[dry-run] " : ""}Building ${project.name}`);
90
+ try {
91
+ await this.assertPackaged(project);
92
+ await this.docker.build(project.projectRoot, {
93
+ cwd: project.projectRoot,
94
+ dockerfile: path.join(project.projectRoot, dockerfile),
95
+ tags,
96
+ buildArgs,
97
+ secrets
98
+ });
99
+ const shouldPush = options.push || dockerConfig.push;
100
+ if (shouldPush && !options.dryRun) {
101
+ for (const tag of tags){
102
+ await this.docker.push(tag, {
103
+ cwd: project.projectRoot
104
+ });
105
+ }
106
+ } else if (shouldPush && options.dryRun) {
107
+ this.#logger.info(`[dry-run] Skipping push for ${project.name}`);
108
+ }
109
+ return {
110
+ projectName: project.name,
111
+ image,
112
+ tags,
113
+ succeeded: true,
114
+ message: options.dryRun ? `Built ${image} (not pushed)` : `Built ${image}`
115
+ };
116
+ } catch (reason) {
117
+ const message = formatUnknownError(reason);
118
+ return {
119
+ projectName: project.name,
120
+ image,
121
+ tags,
122
+ succeeded: false,
123
+ message,
124
+ error: `${project.name}: ${message}`
125
+ };
126
+ }
127
+ }
128
+ interpolateBuildArgs(buildArgs, version) {
129
+ const result = {};
130
+ const versionPlaceholder = "$" + "{version}";
131
+ for (const [key, value] of Object.entries(buildArgs ?? {})){
132
+ result[key] = value.split(versionPlaceholder).join(version);
133
+ }
134
+ return result;
135
+ }
136
+ /**
137
+ * Keep FORGE_DOCKER_EXTRA_TAGS_JSON scoped to this image so multi-image
138
+ * publishes do not stamp create:latest onto the app Dev Container (and vice versa).
139
+ */ extraTagsForImage(image, tags) {
140
+ const prefix = `${image}:`;
141
+ const seen = new Set();
142
+ const result = [];
143
+ for (const tag of tags){
144
+ if (tag === image || tag.startsWith(prefix)) {
145
+ if (!seen.has(tag)) {
146
+ seen.add(tag);
147
+ result.push(tag);
148
+ }
149
+ }
150
+ }
151
+ return result;
152
+ }
153
+ defaultImageName(projectName, workspacePackageJson) {
154
+ const repositoryPath = process.env.FORGE_DOCKER_NAMESPACE?.trim() || workspacePackageJson.getRepositoryFullName() || this.normalizeDockerRepository(projectName);
155
+ const projectSlug = this.normalizeProjectSlug(projectName);
156
+ if (repositoryPath.includes("/") && projectSlug !== "") {
157
+ return `${this.#defaultRegistry}/${repositoryPath}/${projectSlug}`;
158
+ }
159
+ return `${this.#defaultRegistry}/${repositoryPath}`;
160
+ }
161
+ normalizeDockerRepository(name) {
162
+ const repository = name.replace(/^@/, "").split("/").map((segment)=>segment.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "")).filter(Boolean).join("/");
163
+ if (repository === "") {
164
+ throw new ForgeError(`Could not derive a Docker repository from project name "${name}"`);
165
+ }
166
+ return repository;
167
+ }
168
+ normalizeProjectSlug(name) {
169
+ const unscoped = name.includes("/") ? name.split("/").at(-1) ?? name : name;
170
+ const slug = unscoped.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
171
+ if (slug === "") {
172
+ throw new ForgeError(`Could not derive a Docker project slug from project name "${name}"`);
173
+ }
174
+ return slug;
175
+ }
176
+ parseJsonEnv(name, fallback) {
177
+ const value = process.env[name];
178
+ if (value == null || value.trim() === "") {
179
+ return fallback;
180
+ }
181
+ try {
182
+ return JSON.parse(value);
183
+ } catch (reason) {
184
+ throw new ForgeError(`Invalid JSON in ${name}: ${formatUnknownError(reason)}`);
185
+ }
186
+ }
187
+ }
188
+ Docker = _ts_decorate([
189
+ injectable(),
190
+ _ts_metadata("design:type", Function),
191
+ _ts_metadata("design:paramtypes", [
192
+ typeof Workspace === "undefined" ? Object : Workspace
193
+ ])
194
+ ], Docker);
@@ -4,10 +4,13 @@ export * from "./commit.action.js";
4
4
  export * from "./copy.action.js";
5
5
  export * from "./dependency-report.action.js";
6
6
  export * from "./dependency-sync.action.js";
7
+ export * from "./docker.action.js";
8
+ export * from "./link.action.js";
9
+ export * from "./package.action.js";
7
10
  export * from "./publish.action.js";
8
11
  export * from "./sync-lock-file.action.js";
9
12
  export * from "./tag.action.js";
13
+ export * from "./typecheck.action.js";
14
+ export * from "./unlink.action.js";
10
15
  export * from "./version.action.js";
11
16
  export * from "./watch.action.js";
12
-
13
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9hY3Rpb25zL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2J1aWxkLmFjdGlvbi5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY2xlYW4uYWN0aW9uLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb21taXQuYWN0aW9uLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb3B5LmFjdGlvbi5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVwZW5kZW5jeS1yZXBvcnQuYWN0aW9uLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZXBlbmRlbmN5LXN5bmMuYWN0aW9uLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9wdWJsaXNoLmFjdGlvbi5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vc3luYy1sb2NrLWZpbGUuYWN0aW9uLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90YWcuYWN0aW9uLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi92ZXJzaW9uLmFjdGlvbi5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vd2F0Y2guYWN0aW9uLmpzXCI7XG4iXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsY0FBYyxvQkFBb0I7QUFDbEMsY0FBYyxvQkFBb0I7QUFDbEMsY0FBYyxxQkFBcUI7QUFDbkMsY0FBYyxtQkFBbUI7QUFDakMsY0FBYyxnQ0FBZ0M7QUFDOUMsY0FBYyw4QkFBOEI7QUFDNUMsY0FBYyxzQkFBc0I7QUFDcEMsY0FBYyw2QkFBNkI7QUFDM0MsY0FBYyxrQkFBa0I7QUFDaEMsY0FBYyxzQkFBc0I7QUFDcEMsY0FBYyxvQkFBb0IifQ==
@@ -0,0 +1,128 @@
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
+ function _ts_metadata(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ }
10
+ import fs from "node:fs/promises";
11
+ import path from "node:path";
12
+ import { injectable } from "@decohere/crucible/decorators";
13
+ import { Workspace } from "@decohere/mesh";
14
+ import { ActionResponse } from "@decohere/nexus/cli";
15
+ import { scribe } from "@decohere/scribe";
16
+ import "../extensions/project.extensions.js";
17
+ import { ForgeError } from "../errors.js";
18
+ export const LINK_MANIFEST = ".forge-link.json";
19
+ export const DEFAULT_LINK_CONFIGURATION = "link";
20
+ export class Link {
21
+ workspace;
22
+ #logger = scribe.logger(Link.name);
23
+ constructor(workspace){
24
+ this.workspace = workspace;
25
+ }
26
+ run = async (options)=>{
27
+ const targetDir = path.resolve(options.targetDir);
28
+ const nodeModulesDir = path.join(targetDir, "node_modules");
29
+ const stat = await fs.stat(nodeModulesDir).catch(()=>null);
30
+ if (stat == null) {
31
+ throw new ForgeError(`node_modules not found in "${targetDir}". Run pnpm install first.`);
32
+ }
33
+ const projects = this.workspace.getProjects(options.configuration);
34
+ if (projects.length === 0) {
35
+ throw new ForgeError(`No projects found for configuration "${options.configuration}"`);
36
+ }
37
+ // Load any existing manifest so originalPath values are preserved on re-link
38
+ const manifestPath = path.join(targetDir, LINK_MANIFEST);
39
+ const existingManifestText = await fs.readFile(manifestPath, "utf8").catch(()=>null);
40
+ const existingManifest = existingManifestText != null ? JSON.parse(existingManifestText) : null;
41
+ const manifest = {
42
+ workspaceRoot: this.workspace.rootDir,
43
+ links: []
44
+ };
45
+ for (const project of projects){
46
+ const pkg = await project.getPackageJson();
47
+ const packageName = pkg.name;
48
+ if (!packageName) {
49
+ this.#logger.trace(`Skipping project "${project.name}" — no package name`);
50
+ continue;
51
+ }
52
+ // Resolve the build output directory (no target arg — debug config is not packed)
53
+ const outDir = project.getOutDir();
54
+ const absoluteOutDir = path.resolve(outDir);
55
+ // Pre-create the output dir so the symlink is valid even before a build completes.
56
+ await fs.mkdir(absoluteOutDir, {
57
+ recursive: true
58
+ });
59
+ // Compute symlink path inside target node_modules
60
+ const symlinkPath = path.join(nodeModulesDir, ...packageName.split("/"));
61
+ const symlinkParent = path.dirname(symlinkPath);
62
+ // Capture any existing entry so we can restore it on unlink.
63
+ // If a manifest already exists for this package, preserve its originalPath —
64
+ // the current symlink is our own and must not be treated as the original.
65
+ let originalPath = null;
66
+ const existingStat = await fs.lstat(symlinkPath).catch(()=>null);
67
+ if (existingStat != null) {
68
+ const existingEntry = existingManifest?.links.find((l)=>l.packageName === packageName);
69
+ if (existingEntry != null) {
70
+ // Already linked — preserve the recorded originalPath and replace the symlink
71
+ originalPath = existingEntry.originalPath;
72
+ if (existingStat.isSymbolicLink()) {
73
+ await fs.unlink(symlinkPath);
74
+ }
75
+ } else if (existingStat.isSymbolicLink()) {
76
+ originalPath = await fs.readlink(symlinkPath);
77
+ await fs.unlink(symlinkPath);
78
+ } else {
79
+ // Real directory — back it up by renaming
80
+ originalPath = `${symlinkPath}.__forge_backup__`;
81
+ await fs.rename(symlinkPath, originalPath);
82
+ }
83
+ }
84
+ await fs.mkdir(symlinkParent, {
85
+ recursive: true
86
+ });
87
+ await fs.symlink(absoluteOutDir, symlinkPath, "dir");
88
+ manifest.links.push({
89
+ packageName,
90
+ symlinkPath,
91
+ originalPath
92
+ });
93
+ this.#logger.info(`Linked ${packageName} → ${absoluteOutDir}`);
94
+ }
95
+ // Create a peer node_modules at the build output root so Node can resolve
96
+ // bare specifiers from the real (non-symlink) paths of linked packages.
97
+ if (manifest.links.length > 0) {
98
+ const buildRoot = path.resolve(projects[0].getRootOut());
99
+ const peerNodeModulesDir = path.join(buildRoot, "node_modules");
100
+ await fs.rm(peerNodeModulesDir, {
101
+ recursive: true,
102
+ force: true
103
+ });
104
+ for (const project of projects){
105
+ const pkg = await project.getPackageJson();
106
+ if (!pkg.name) continue;
107
+ const outDir = path.resolve(project.getOutDir());
108
+ const peerSymlink = path.join(peerNodeModulesDir, ...pkg.name.split("/"));
109
+ await fs.mkdir(path.dirname(peerSymlink), {
110
+ recursive: true
111
+ });
112
+ await fs.symlink(outDir, peerSymlink, "dir");
113
+ this.#logger.trace(`Peer-linked ${pkg.name} → ${outDir}`);
114
+ }
115
+ manifest.peerNodeModulesDir = peerNodeModulesDir;
116
+ this.#logger.info(`Created peer node_modules at ${peerNodeModulesDir}`);
117
+ }
118
+ await fs.writeFile(path.join(targetDir, LINK_MANIFEST), JSON.stringify(manifest, null, 2));
119
+ return ActionResponse.Success(Link.name);
120
+ };
121
+ }
122
+ Link = _ts_decorate([
123
+ injectable(),
124
+ _ts_metadata("design:type", Function),
125
+ _ts_metadata("design:paramtypes", [
126
+ typeof Workspace === "undefined" ? Object : Workspace
127
+ ])
128
+ ], Link);
@@ -0,0 +1,214 @@
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
+ function _ts_metadata(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ }
10
+ import fs from "node:fs/promises";
11
+ import path from "node:path";
12
+ import { injectable } from "@decohere/crucible/decorators";
13
+ import { Workspace } from "@decohere/mesh";
14
+ import { ActionResponse } from "@decohere/nexus/cli";
15
+ import { Npm } from "@decohere/nexus/interop";
16
+ import { io } from "@decohere/nexus/io";
17
+ import { scribe } from "@decohere/scribe";
18
+ import { ForgeError, formatUnknownError } from "../errors.js";
19
+ import { DependencyPinner } from "../packaging/dependency-pinner.service.js";
20
+ import { deployable, PACKAGE_DIR } from "../packaging/deployable.js";
21
+ import { ImportGraph } from "../packaging/import-graph.service.js";
22
+ import { releaseExports } from "../packaging/release-exports.js";
23
+ import { Release } from "../workspace.config.js";
24
+ export class PackageDeployable {
25
+ workspace;
26
+ importGraph;
27
+ pinner;
28
+ #logger = scribe.logger(PackageDeployable.name);
29
+ npm = new Npm();
30
+ constructor(workspace, importGraph, pinner){
31
+ this.workspace = workspace;
32
+ this.importGraph = importGraph;
33
+ this.pinner = pinner;
34
+ }
35
+ async run(options) {
36
+ const projects = this.workspace.getProjects(Release.name);
37
+ const selected = await this.select(projects, options.project);
38
+ if (typeof selected === "string") {
39
+ return ActionResponse.Error(PackageDeployable.name, selected);
40
+ }
41
+ if (selected.length === 0) {
42
+ this.#logger.info("No projects found with a Dockerfile — nothing to package");
43
+ return ActionResponse.Success(PackageDeployable.name, []);
44
+ }
45
+ const releaseProjects = await this.releaseProjects(projects);
46
+ const responses = [];
47
+ for (const project of selected){
48
+ responses.push(await this.packageProject(project, releaseProjects));
49
+ }
50
+ return responses.some((response)=>!response.succeeded) ? ActionResponse.Error(PackageDeployable.name, responses) : ActionResponse.Success(PackageDeployable.name, responses);
51
+ }
52
+ /** The deployables to package, or the reason a named project cannot be one. */ async select(projects, requested) {
53
+ if (requested == null || requested === "") {
54
+ const found = [];
55
+ for (const project of projects){
56
+ if (await deployable.isDeployable(project)) {
57
+ found.push(project);
58
+ }
59
+ }
60
+ return found;
61
+ }
62
+ const project = projects.find((candidate)=>candidate.name === requested);
63
+ if (project == null) {
64
+ return `${requested} is not a workspace project. Known projects: ${projects.map((p)=>p.name).join(", ")}`;
65
+ }
66
+ if (!await deployable.isDeployable(project)) {
67
+ return `${requested} has no ${deployable.dockerfileName(project)}, so it is a library, not a deployable. ` + "Libraries are packaged into the deployables that import them.";
68
+ }
69
+ return [
70
+ project
71
+ ];
72
+ }
73
+ async releaseProjects(projects) {
74
+ const entries = await Promise.all(projects.map(async (project)=>{
75
+ const pkg = await project.getPackageJson();
76
+ return [
77
+ project.name,
78
+ {
79
+ name: project.name,
80
+ pkg,
81
+ projectRoot: path.resolve(project.projectRoot),
82
+ releaseDir: path.resolve(project.getOutDir())
83
+ }
84
+ ];
85
+ }));
86
+ return new Map(entries);
87
+ }
88
+ async packageProject(project, releaseProjects) {
89
+ const outDir = path.join(path.resolve(project.projectRoot), PACKAGE_DIR);
90
+ const base = {
91
+ projectName: project.name,
92
+ outDir,
93
+ workspacePackages: [],
94
+ dependencies: {}
95
+ };
96
+ try {
97
+ const entry = releaseProjects.get(project.name);
98
+ if (!await io.directoryExists(path.join(entry.releaseDir, "es6"))) {
99
+ throw new ForgeError(`No release build for ${project.name}. Run \`forge build --configuration release\` first.`);
100
+ }
101
+ const reached = await this.importGraph.walk(entry, releaseProjects);
102
+ const libraries = [
103
+ ...reached.workspace
104
+ ].filter((name)=>name !== project.name).sort().map((name)=>releaseProjects.get(name));
105
+ const dependencies = await this.pinner.pin(reached.thirdParty, [
106
+ entry,
107
+ ...libraries
108
+ ], releaseProjects, {
109
+ dir: path.resolve(this.workspace.rootDir),
110
+ pkg: await this.workspace.getPackageJson()
111
+ });
112
+ await this.write(entry, libraries, dependencies, outDir);
113
+ const workspacePackages = [
114
+ ...reached.workspace
115
+ ].sort();
116
+ this.#logger.info(`Packaged ${project.name} to ${outDir}`, {
117
+ workspace: workspacePackages,
118
+ thirdParty: Object.keys(dependencies)
119
+ });
120
+ return {
121
+ projectName: project.name,
122
+ outDir,
123
+ workspacePackages,
124
+ dependencies,
125
+ succeeded: true,
126
+ message: `Packaged ${project.name} to ${outDir}`
127
+ };
128
+ } catch (reason) {
129
+ const message = formatUnknownError(reason);
130
+ return {
131
+ ...base,
132
+ succeeded: false,
133
+ message,
134
+ error: `${project.name}: ${message}`
135
+ };
136
+ }
137
+ }
138
+ async write(entry, libraries, dependencies, outDir) {
139
+ await fs.rm(outDir, {
140
+ recursive: true,
141
+ force: true
142
+ });
143
+ await fs.mkdir(outDir, {
144
+ recursive: true
145
+ });
146
+ await this.writeJson(path.join(outDir, "package.json"), {
147
+ name: entry.name.replace(/^@/, "").replace("/", "-"),
148
+ version: entry.pkg.version,
149
+ private: true,
150
+ type: "module",
151
+ scripts: {
152
+ start: `node es6/${releaseExports.toJs(entry.pkg.main ?? "src/index.ts")}`
153
+ },
154
+ dependencies
155
+ });
156
+ // npm writes real folders. It also removes anything in node_modules it does not know,
157
+ // so the workspace libraries are copied in only after it has run.
158
+ if (Object.keys(dependencies).length > 0) {
159
+ await this.npm.installProduction({
160
+ cwd: outDir
161
+ });
162
+ }
163
+ await this.copyTree(path.join(entry.releaseDir, "es6"), path.join(outDir, "es6"));
164
+ const config = path.join(path.resolve(this.workspace.rootDir), "config");
165
+ if (await io.directoryExists(config)) {
166
+ await this.copyTree(config, path.join(outDir, "config"));
167
+ }
168
+ for (const library of libraries){
169
+ const target = path.join(outDir, "node_modules", ...library.name.split("/"));
170
+ await this.copyTree(path.join(library.releaseDir, "es6"), path.join(target, "es6"));
171
+ await this.writeJson(path.join(target, "package.json"), {
172
+ name: library.name,
173
+ version: library.pkg.version,
174
+ type: "module",
175
+ exports: releaseExports.build(library.pkg)
176
+ });
177
+ }
178
+ await this.assertNoSymlinks(outDir);
179
+ }
180
+ /** Copies file contents, never links: a symlink in the output would break outside the image. */ async copyTree(from, to) {
181
+ await fs.cp(from, to, {
182
+ recursive: true,
183
+ dereference: true
184
+ });
185
+ }
186
+ async writeJson(filePath, value) {
187
+ await io.writeFile(filePath, `${JSON.stringify(value, null, "\t")}\n`, {
188
+ mkdir: true,
189
+ encoding: "utf8"
190
+ });
191
+ }
192
+ async assertNoSymlinks(dir) {
193
+ for (const entry of (await fs.readdir(dir, {
194
+ withFileTypes: true
195
+ }))){
196
+ const entryPath = path.join(dir, entry.name);
197
+ if (entry.isSymbolicLink()) {
198
+ throw new ForgeError(`The packaged output must hold no symlinks, but found ${entryPath}`);
199
+ }
200
+ if (entry.isDirectory()) {
201
+ await this.assertNoSymlinks(entryPath);
202
+ }
203
+ }
204
+ }
205
+ }
206
+ PackageDeployable = _ts_decorate([
207
+ injectable(),
208
+ _ts_metadata("design:type", Function),
209
+ _ts_metadata("design:paramtypes", [
210
+ typeof Workspace === "undefined" ? Object : Workspace,
211
+ typeof ImportGraph === "undefined" ? Object : ImportGraph,
212
+ typeof DependencyPinner === "undefined" ? Object : DependencyPinner
213
+ ])
214
+ ], PackageDeployable);