@decohere/forge 0.0.1-dev.13 → 0.0.1-dev.130

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 (195) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +150 -0
  3. package/commonjs/src/actions/build.action.js +8 -6
  4. package/commonjs/src/actions/clean.action.js +6 -8
  5. package/commonjs/src/actions/commit.action.js +4 -6
  6. package/commonjs/src/actions/copy.action.js +62 -12
  7. package/commonjs/src/actions/dependency-report.action.js +8 -6
  8. package/commonjs/src/actions/dependency-sync.action.js +9 -5
  9. package/commonjs/src/actions/docker.action.js +209 -0
  10. package/commonjs/src/actions/index.js +6 -2
  11. package/commonjs/src/actions/link.action.js +154 -0
  12. package/commonjs/src/actions/package.action.js +234 -0
  13. package/commonjs/src/actions/paths.action.js +120 -0
  14. package/commonjs/src/actions/publish.action.js +4 -6
  15. package/commonjs/src/actions/sync-lock-file.action.js +2 -4
  16. package/commonjs/src/actions/tag.action.js +6 -9
  17. package/commonjs/src/actions/typecheck.action.js +67 -0
  18. package/commonjs/src/actions/unlink.action.js +74 -0
  19. package/commonjs/src/actions/version.action.js +14 -16
  20. package/commonjs/src/actions/watch.action.js +3 -5
  21. package/commonjs/src/commands/build.command.js +4 -3
  22. package/commonjs/src/commands/dependency.command.js +1 -3
  23. package/commonjs/src/commands/docker.command.js +26 -0
  24. package/commonjs/src/commands/forge.command.js +1 -3
  25. package/commonjs/src/commands/index.js +5 -2
  26. package/commonjs/src/commands/link.command.js +90 -0
  27. package/commonjs/src/commands/package.command.js +36 -0
  28. package/commonjs/src/commands/paths.command.js +24 -0
  29. package/commonjs/src/commands/publish.command.js +1 -3
  30. package/commonjs/src/commands/tag.command.js +1 -3
  31. package/commonjs/src/commands/typecheck.command.js +24 -0
  32. package/commonjs/src/commands/version.command.js +1 -3
  33. package/commonjs/src/const.js +0 -2
  34. package/commonjs/src/create-workspace.js +38 -0
  35. package/commonjs/src/errors.js +2 -4
  36. package/commonjs/src/extensions/project.extensions.js +11 -13
  37. package/commonjs/src/factories/swc-config.factory.js +29 -9
  38. package/commonjs/src/forge.module.js +23 -22
  39. package/commonjs/src/index.js +11 -2
  40. package/commonjs/src/packaging/dependency-pinner.service.js +118 -0
  41. package/commonjs/src/packaging/deployable.js +44 -0
  42. package/commonjs/src/packaging/import-graph.service.js +137 -0
  43. package/commonjs/src/packaging/release-exports.js +90 -0
  44. package/commonjs/src/packaging/ui-assets.js +75 -0
  45. package/commonjs/src/semver/index.js +18 -0
  46. package/commonjs/src/semver/semver.js +92 -0
  47. package/commonjs/src/services/dependency-resolver.service.js +70 -26
  48. package/commonjs/src/services/file-writer.service.js +2 -11
  49. package/commonjs/src/services/incremental-watch.js +24 -0
  50. package/commonjs/src/services/output-cache.js +39 -0
  51. package/commonjs/src/services/swc-transpiler.js +85 -99
  52. package/commonjs/src/services/transpile-cache.js +44 -0
  53. package/commonjs/src/services/ts-program-host.js +4 -6
  54. package/commonjs/src/services/type-emission-program.js +24 -9
  55. package/commonjs/src/services/type-emitter.js +51 -16
  56. package/commonjs/src/types/build-target.type.js +0 -2
  57. package/commonjs/src/types/configuration.type.js +0 -2
  58. package/commonjs/src/types/dependency.types.js +0 -2
  59. package/commonjs/src/types/swc-config.type.js +0 -2
  60. package/commonjs/src/types/transform-response.model.js +3 -18
  61. package/commonjs/src/types/transformer.type.js +0 -2
  62. package/commonjs/src/types/workspace-config.type.js +0 -2
  63. package/commonjs/src/vitest/forge-build.plugin.js +28 -44
  64. package/commonjs/src/vitest/index.js +0 -2
  65. package/commonjs/src/workspace.config.js +39 -6
  66. package/es6/src/actions/build.action.js +7 -7
  67. package/es6/src/actions/clean.action.js +5 -8
  68. package/es6/src/actions/commit.action.js +3 -6
  69. package/es6/src/actions/copy.action.js +61 -12
  70. package/es6/src/actions/dependency-report.action.js +7 -7
  71. package/es6/src/actions/dependency-sync.action.js +8 -6
  72. package/es6/src/actions/docker.action.js +194 -0
  73. package/es6/src/actions/index.js +6 -2
  74. package/es6/src/actions/link.action.js +128 -0
  75. package/es6/src/actions/package.action.js +219 -0
  76. package/es6/src/actions/paths.action.js +97 -0
  77. package/es6/src/actions/publish.action.js +3 -6
  78. package/es6/src/actions/sync-lock-file.action.js +2 -4
  79. package/es6/src/actions/tag.action.js +5 -9
  80. package/es6/src/actions/typecheck.action.js +52 -0
  81. package/es6/src/actions/unlink.action.js +59 -0
  82. package/es6/src/actions/version.action.js +9 -12
  83. package/es6/src/actions/watch.action.js +2 -5
  84. package/es6/src/commands/build.command.js +4 -3
  85. package/es6/src/commands/dependency.command.js +1 -3
  86. package/es6/src/commands/docker.command.js +16 -0
  87. package/es6/src/commands/forge.command.js +1 -3
  88. package/es6/src/commands/index.js +5 -2
  89. package/es6/src/commands/link.command.js +67 -0
  90. package/es6/src/commands/package.command.js +26 -0
  91. package/es6/src/commands/paths.command.js +14 -0
  92. package/es6/src/commands/publish.command.js +1 -3
  93. package/es6/src/commands/tag.command.js +1 -3
  94. package/es6/src/commands/typecheck.command.js +14 -0
  95. package/es6/src/commands/version.command.js +1 -3
  96. package/es6/src/const.js +0 -2
  97. package/es6/src/create-workspace.js +26 -0
  98. package/es6/src/errors.js +1 -3
  99. package/es6/src/extensions/project.extensions.js +5 -7
  100. package/es6/src/factories/swc-config.factory.js +29 -9
  101. package/es6/src/forge.module.js +23 -22
  102. package/es6/src/index.js +3 -3
  103. package/es6/src/packaging/dependency-pinner.service.js +103 -0
  104. package/es6/src/packaging/deployable.js +21 -0
  105. package/es6/src/packaging/import-graph.service.js +122 -0
  106. package/es6/src/packaging/release-exports.js +80 -0
  107. package/es6/src/packaging/ui-assets.js +49 -0
  108. package/es6/src/semver/index.js +1 -0
  109. package/es6/src/semver/semver.js +71 -0
  110. package/es6/src/services/dependency-resolver.service.js +70 -26
  111. package/es6/src/services/file-writer.service.js +2 -11
  112. package/es6/src/services/incremental-watch.js +18 -0
  113. package/es6/src/services/output-cache.js +29 -0
  114. package/es6/src/services/swc-transpiler.js +85 -99
  115. package/es6/src/services/transpile-cache.js +29 -0
  116. package/es6/src/services/ts-program-host.js +4 -6
  117. package/es6/src/services/type-emission-program.js +24 -9
  118. package/es6/src/services/type-emitter.js +48 -16
  119. package/es6/src/types/build-target.type.js +0 -2
  120. package/es6/src/types/configuration.type.js +0 -2
  121. package/es6/src/types/dependency.types.js +0 -2
  122. package/es6/src/types/swc-config.type.js +0 -2
  123. package/es6/src/types/transform-response.model.js +0 -7
  124. package/es6/src/types/transformer.type.js +0 -2
  125. package/es6/src/types/workspace-config.type.js +0 -2
  126. package/es6/src/vitest/forge-build.plugin.js +27 -43
  127. package/es6/src/vitest/index.js +0 -2
  128. package/es6/src/workspace.config.js +39 -5
  129. package/package.json +15 -5
  130. package/types/src/actions/build.action.d.ts +5 -4
  131. package/types/src/actions/clean.action.d.ts +3 -3
  132. package/types/src/actions/commit.action.d.ts +3 -3
  133. package/types/src/actions/copy.action.d.ts +18 -3
  134. package/types/src/actions/dependency-report.action.d.ts +3 -3
  135. package/types/src/actions/dependency-sync.action.d.ts +3 -3
  136. package/types/src/actions/docker.action.d.ts +38 -0
  137. package/types/src/actions/index.d.ts +6 -0
  138. package/types/src/actions/link.action.d.ts +25 -0
  139. package/types/src/actions/package.action.d.ts +38 -0
  140. package/types/src/actions/paths.action.d.ts +28 -0
  141. package/types/src/actions/publish.action.d.ts +4 -4
  142. package/types/src/actions/sync-lock-file.action.d.ts +2 -2
  143. package/types/src/actions/tag.action.d.ts +3 -3
  144. package/types/src/actions/typecheck.action.d.ts +14 -0
  145. package/types/src/actions/unlink.action.d.ts +9 -0
  146. package/types/src/actions/version.action.d.ts +4 -4
  147. package/types/src/actions/watch.action.d.ts +3 -3
  148. package/types/src/commands/build.command.d.ts +3 -2
  149. package/types/src/commands/dependency.command.d.ts +2 -2
  150. package/types/src/commands/docker.command.d.ts +6 -0
  151. package/types/src/commands/forge.command.d.ts +2 -2
  152. package/types/src/commands/index.d.ts +5 -0
  153. package/types/src/commands/link.command.d.ts +29 -0
  154. package/types/src/commands/package.command.d.ts +11 -0
  155. package/types/src/commands/paths.command.d.ts +6 -0
  156. package/types/src/commands/publish.command.d.ts +1 -1
  157. package/types/src/commands/tag.command.d.ts +1 -1
  158. package/types/src/commands/typecheck.command.d.ts +6 -0
  159. package/types/src/commands/version.command.d.ts +1 -1
  160. package/types/src/create-workspace.d.ts +7 -0
  161. package/types/src/errors.d.ts +1 -1
  162. package/types/src/extensions/project.extensions.d.ts +2 -2
  163. package/types/src/factories/swc-config.factory.d.ts +3 -2
  164. package/types/src/forge.module.d.ts +16 -4
  165. package/types/src/index.d.ts +3 -1
  166. package/types/src/packaging/dependency-pinner.service.d.ts +20 -0
  167. package/types/src/packaging/deployable.d.ts +17 -0
  168. package/types/src/packaging/import-graph.service.d.ts +33 -0
  169. package/types/src/packaging/release-exports.d.ts +18 -0
  170. package/types/src/packaging/ui-assets.d.ts +21 -0
  171. package/types/src/semver/index.d.ts +1 -0
  172. package/types/src/semver/semver.d.ts +18 -0
  173. package/types/src/services/dependency-resolver.service.d.ts +8 -1
  174. package/types/src/services/file-writer.service.d.ts +1 -2
  175. package/types/src/services/incremental-watch.d.ts +13 -0
  176. package/types/src/services/output-cache.d.ts +10 -0
  177. package/types/src/services/swc-transpiler.d.ts +28 -15
  178. package/types/src/services/transpile-cache.d.ts +17 -0
  179. package/types/src/services/ts-program-host.d.ts +2 -2
  180. package/types/src/services/type-emission-program.d.ts +8 -3
  181. package/types/src/services/type-emitter.d.ts +21 -8
  182. package/types/src/types/configuration.type.d.ts +6 -1
  183. package/types/src/types/dependency.types.d.ts +8 -9
  184. package/types/src/types/swc-config.type.d.ts +7 -1
  185. package/types/src/types/transform-response.model.d.ts +2 -7
  186. package/types/src/types/transformer.type.d.ts +2 -11
  187. package/types/src/types/workspace-config.type.d.ts +3 -3
  188. package/types/src/vitest/forge-build.plugin.d.ts +0 -2
  189. package/types/src/workspace.config.d.ts +6 -0
  190. package/commonjs/src/mixins/caches-outputs.mixin.js +0 -44
  191. package/commonjs/src/mixins/incremental-transform.mixin.js +0 -36
  192. package/es6/src/mixins/caches-outputs.mixin.js +0 -34
  193. package/es6/src/mixins/incremental-transform.mixin.js +0 -26
  194. package/types/src/mixins/caches-outputs.mixin.d.ts +0 -7
  195. package/types/src/mixins/incremental-transform.mixin.d.ts +0 -13
@@ -4,10 +4,14 @@ 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";
10
+ export * from "./paths.action.js";
7
11
  export * from "./publish.action.js";
8
12
  export * from "./sync-lock-file.action.js";
9
13
  export * from "./tag.action.js";
14
+ export * from "./typecheck.action.js";
15
+ export * from "./unlink.action.js";
10
16
  export * from "./version.action.js";
11
17
  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/workspace";
14
+ import { ActionResponse } from "@decohere/devkit/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,219 @@
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/workspace";
14
+ import { ActionResponse } from "@decohere/devkit/cli";
15
+ import { Npm } from "@decohere/devkit/interop";
16
+ import { io } from "@decohere/core/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 { uiAssets } from "../packaging/ui-assets.js";
24
+ import { Release } from "../workspace.config.js";
25
+ export class PackageDeployable {
26
+ workspace;
27
+ importGraph;
28
+ pinner;
29
+ #logger = scribe.logger(PackageDeployable.name);
30
+ npm = new Npm();
31
+ constructor(workspace, importGraph, pinner){
32
+ this.workspace = workspace;
33
+ this.importGraph = importGraph;
34
+ this.pinner = pinner;
35
+ }
36
+ async run(options) {
37
+ const projects = this.workspace.getProjects(Release.name);
38
+ const selected = await this.select(projects, options.project);
39
+ if (typeof selected === "string") {
40
+ return ActionResponse.Error(PackageDeployable.name, selected);
41
+ }
42
+ if (selected.length === 0) {
43
+ this.#logger.info("No projects found with a Dockerfile — nothing to package");
44
+ return ActionResponse.Success(PackageDeployable.name, []);
45
+ }
46
+ const releaseProjects = await this.releaseProjects(projects);
47
+ const responses = [];
48
+ for (const project of selected){
49
+ responses.push(await this.packageProject(project, releaseProjects, projects));
50
+ }
51
+ return responses.some((response)=>!response.succeeded) ? ActionResponse.Error(PackageDeployable.name, responses) : ActionResponse.Success(PackageDeployable.name, responses);
52
+ }
53
+ /** The deployables to package, or the reason a named project cannot be one. */ async select(projects, requested) {
54
+ if (requested == null || requested === "") {
55
+ const found = [];
56
+ for (const project of projects){
57
+ if (await deployable.isDeployable(project)) {
58
+ found.push(project);
59
+ }
60
+ }
61
+ return found;
62
+ }
63
+ const project = projects.find((candidate)=>candidate.name === requested);
64
+ if (project == null) {
65
+ return `${requested} is not a workspace project. Known projects: ${projects.map((p)=>p.name).join(", ")}`;
66
+ }
67
+ if (!await deployable.isDeployable(project)) {
68
+ return `${requested} has no ${deployable.dockerfileName(project)}, so it is a library, not a deployable. ` + "Libraries are packaged into the deployables that import them.";
69
+ }
70
+ return [
71
+ project
72
+ ];
73
+ }
74
+ async releaseProjects(projects) {
75
+ const entries = await Promise.all(projects.map(async (project)=>{
76
+ const pkg = await project.getPackageJson();
77
+ return [
78
+ project.name,
79
+ {
80
+ name: project.name,
81
+ pkg,
82
+ projectRoot: path.resolve(project.projectRoot),
83
+ releaseDir: path.resolve(project.getOutDir())
84
+ }
85
+ ];
86
+ }));
87
+ return new Map(entries);
88
+ }
89
+ async packageProject(project, releaseProjects, projects) {
90
+ const outDir = path.join(path.resolve(project.projectRoot), PACKAGE_DIR);
91
+ const base = {
92
+ projectName: project.name,
93
+ outDir,
94
+ workspacePackages: [],
95
+ dependencies: {}
96
+ };
97
+ try {
98
+ const entry = releaseProjects.get(project.name);
99
+ if (!await io.directoryExists(path.join(entry.releaseDir, "es6"))) {
100
+ throw new ForgeError(`No release build for ${project.name}. Run \`forge build --configuration release\` first.`);
101
+ }
102
+ const ui = await uiAssets.resolve(project, projects);
103
+ const reached = await this.importGraph.walk(entry, releaseProjects);
104
+ const libraries = [
105
+ ...reached.workspace
106
+ ].filter((name)=>name !== project.name).sort().map((name)=>releaseProjects.get(name));
107
+ const dependencies = await this.pinner.pin(reached.thirdParty, [
108
+ entry,
109
+ ...libraries
110
+ ], releaseProjects, {
111
+ dir: path.resolve(this.workspace.rootDir),
112
+ pkg: await this.workspace.getPackageJson()
113
+ });
114
+ await this.write(entry, libraries, dependencies, outDir, ui);
115
+ const workspacePackages = [
116
+ ...reached.workspace
117
+ ].sort();
118
+ this.#logger.info(`Packaged ${project.name} to ${outDir}`, {
119
+ workspace: workspacePackages,
120
+ thirdParty: Object.keys(dependencies)
121
+ });
122
+ return {
123
+ projectName: project.name,
124
+ outDir,
125
+ workspacePackages,
126
+ dependencies,
127
+ succeeded: true,
128
+ message: `Packaged ${project.name} to ${outDir}`
129
+ };
130
+ } catch (reason) {
131
+ const message = formatUnknownError(reason);
132
+ return {
133
+ ...base,
134
+ succeeded: false,
135
+ message,
136
+ error: `${project.name}: ${message}`
137
+ };
138
+ }
139
+ }
140
+ async write(entry, libraries, dependencies, outDir, ui) {
141
+ await fs.rm(outDir, {
142
+ recursive: true,
143
+ force: true
144
+ });
145
+ await fs.mkdir(outDir, {
146
+ recursive: true
147
+ });
148
+ await this.writeJson(path.join(outDir, "package.json"), {
149
+ name: entry.name.replace(/^@/, "").replace("/", "-"),
150
+ version: entry.pkg.version,
151
+ private: true,
152
+ type: "module",
153
+ scripts: {
154
+ start: `node es6/${releaseExports.toJs(entry.pkg.main ?? "src/index.ts")}`
155
+ },
156
+ dependencies
157
+ });
158
+ // npm writes real folders. It also removes anything in node_modules it does not know,
159
+ // so the workspace libraries are copied in only after it has run.
160
+ if (Object.keys(dependencies).length > 0) {
161
+ await this.npm.installProduction({
162
+ cwd: outDir
163
+ });
164
+ }
165
+ await this.copyTree(path.join(entry.releaseDir, "es6"), path.join(outDir, "es6"));
166
+ const config = path.join(path.resolve(this.workspace.rootDir), "config");
167
+ if (await io.directoryExists(config)) {
168
+ await this.copyTree(config, path.join(outDir, "config"));
169
+ }
170
+ if (ui != null) {
171
+ await this.copyTree(ui.from, path.join(outDir, ui.to));
172
+ }
173
+ for (const library of libraries){
174
+ const target = path.join(outDir, "node_modules", ...library.name.split("/"));
175
+ await this.copyTree(path.join(library.releaseDir, "es6"), path.join(target, "es6"));
176
+ await this.writeJson(path.join(target, "package.json"), {
177
+ name: library.name,
178
+ version: library.pkg.version,
179
+ type: "module",
180
+ exports: releaseExports.build(library.pkg)
181
+ });
182
+ }
183
+ await this.assertNoSymlinks(outDir);
184
+ }
185
+ /** Copies file contents, never links: a symlink in the output would break outside the image. */ async copyTree(from, to) {
186
+ await fs.cp(from, to, {
187
+ recursive: true,
188
+ dereference: true
189
+ });
190
+ }
191
+ async writeJson(filePath, value) {
192
+ await io.writeFile(filePath, `${JSON.stringify(value, null, "\t")}\n`, {
193
+ mkdir: true,
194
+ encoding: "utf8"
195
+ });
196
+ }
197
+ async assertNoSymlinks(dir) {
198
+ for (const entry of (await fs.readdir(dir, {
199
+ withFileTypes: true
200
+ }))){
201
+ const entryPath = path.join(dir, entry.name);
202
+ if (entry.isSymbolicLink()) {
203
+ throw new ForgeError(`The packaged output must hold no symlinks, but found ${entryPath}`);
204
+ }
205
+ if (entry.isDirectory()) {
206
+ await this.assertNoSymlinks(entryPath);
207
+ }
208
+ }
209
+ }
210
+ }
211
+ PackageDeployable = _ts_decorate([
212
+ injectable(),
213
+ _ts_metadata("design:type", Function),
214
+ _ts_metadata("design:paramtypes", [
215
+ typeof Workspace === "undefined" ? Object : Workspace,
216
+ typeof ImportGraph === "undefined" ? Object : ImportGraph,
217
+ typeof DependencyPinner === "undefined" ? Object : DependencyPinner
218
+ ])
219
+ ], PackageDeployable);
@@ -0,0 +1,97 @@
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 { existsSync } from "node:fs";
11
+ import { readFile, writeFile } from "node:fs/promises";
12
+ import path from "node:path";
13
+ import { injectable } from "@decohere/crucible/decorators";
14
+ import { packageAliases, Workspace } from "@decohere/workspace";
15
+ import { ActionResponse } from "@decohere/devkit/cli";
16
+ import { scribe } from "@decohere/scribe";
17
+ export const PATHS_FILE = "tsconfig.paths.json";
18
+ export class Paths {
19
+ workspace;
20
+ #logger = scribe.logger(Paths.name);
21
+ constructor(workspace){
22
+ this.workspace = workspace;
23
+ }
24
+ async run(options) {
25
+ const file = path.join(this.workspace.rootDir, PATHS_FILE);
26
+ if (this.workspace.isStandalone) {
27
+ // One project has no other projects to import from source.
28
+ this.#logger.info(`Standalone project: no ${PATHS_FILE} needed`);
29
+ return ActionResponse.Success(Paths.name, [
30
+ {
31
+ file,
32
+ changed: false,
33
+ succeeded: true
34
+ }
35
+ ]);
36
+ }
37
+ const content = Paths.render(this.workspace);
38
+ const current = existsSync(file) ? await readFile(file, "utf8") : null;
39
+ const changed = current !== content;
40
+ if (options.check) {
41
+ if (!changed) {
42
+ return ActionResponse.Success(Paths.name, [
43
+ {
44
+ file,
45
+ changed,
46
+ succeeded: true
47
+ }
48
+ ]);
49
+ }
50
+ const error = `${PATHS_FILE} is out of date. Run \`forge paths\` to update it.`;
51
+ this.#logger.error(error);
52
+ return ActionResponse.Error(Paths.name, [
53
+ {
54
+ file,
55
+ changed,
56
+ succeeded: false,
57
+ error
58
+ }
59
+ ]);
60
+ }
61
+ if (changed) {
62
+ await writeFile(file, content);
63
+ this.#logger.info(`Wrote ${PATHS_FILE}`);
64
+ }
65
+ return ActionResponse.Success(Paths.name, [
66
+ {
67
+ file,
68
+ changed,
69
+ succeeded: true
70
+ }
71
+ ]);
72
+ }
73
+ /** The file's content: convention and exported subpaths only, never the tsconfig's own paths. */ static render(workspace) {
74
+ const rootDir = path.resolve(workspace.rootDir);
75
+ const { paths } = packageAliases.build(workspace.getProjects("debug"), {
76
+ baseUrl: rootDir
77
+ });
78
+ const sorted = Object.fromEntries(Object.keys(paths).sort().map((key)=>[
79
+ key,
80
+ (paths[key] ?? []).map((target)=>`./${target}`)
81
+ ]));
82
+ const json = {
83
+ $comment: "Generated by `forge paths` from the workspace packages. Do not edit.",
84
+ compilerOptions: {
85
+ paths: sorted
86
+ }
87
+ };
88
+ return `${JSON.stringify(json, null, 2)}\n`;
89
+ }
90
+ }
91
+ Paths = _ts_decorate([
92
+ injectable(),
93
+ _ts_metadata("design:type", Function),
94
+ _ts_metadata("design:paramtypes", [
95
+ typeof Workspace === "undefined" ? Object : Workspace
96
+ ])
97
+ ], Paths);
@@ -8,10 +8,9 @@ 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
- import { Workspace } from "@decohere/mesh";
13
- import { ActionResponse } from "@decohere/nexus/cli";
14
- import { Npm } from "@decohere/nexus/interop";
11
+ import { Workspace } from "@decohere/workspace";
12
+ import { ActionResponse } from "@decohere/devkit/cli";
13
+ import { Npm } from "@decohere/devkit/interop";
15
14
  import { scribe } from "@decohere/scribe";
16
15
  import { ForgeError, formatUnknownError } from "../errors.js";
17
16
  export class Publish {
@@ -143,5 +142,3 @@ Publish = _ts_decorate([
143
142
  typeof Workspace === "undefined" ? Object : Workspace
144
143
  ])
145
144
  ], Publish);
146
-
147
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9hY3Rpb25zL3B1Ymxpc2guYWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGluamVjdGFibGUgfSBmcm9tIFwiQGRlY29oZXJlL2NydWNpYmxlL2RlY29yYXRvcnNcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogPERJPlxuaW1wb3J0IHsgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgdHlwZSB7IEFjdGlvbiwgUmVzdWx0U3RhdHVzIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7IEFjdGlvblJlc3BvbnNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jbGlcIjtcbmltcG9ydCB7IE5wbSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW50ZXJvcFwiO1xuaW1wb3J0IHsgc2NyaWJlIH0gZnJvbSBcIkBkZWNvaGVyZS9zY3JpYmVcIjtcbmltcG9ydCB7IEZvcmdlRXJyb3IsIGZvcm1hdFVua25vd25FcnJvciB9IGZyb20gXCIuLi9lcnJvcnMuanNcIjtcblxuZXhwb3J0IHR5cGUgUHVibGlzaE9wdGlvbnMgPSB7XG5cdGNvbmZpZ3VyYXRpb246IHN0cmluZztcblx0Y2hhbm5lbD86IHN0cmluZztcblx0ZHJ5UnVuPzogYm9vbGVhbjtcblx0dG9rZW4/OiBzdHJpbmc7XG5cdG90cD86IHN0cmluZztcblx0cHJvbXB0QXV0aD86IGJvb2xlYW47XG5cdHByb21wdE90cD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBQdWJsaXNoUmVzcG9uc2UgPSBSZXN1bHRTdGF0dXMgJiB7XG5cdHByb2plY3ROYW1lOiBzdHJpbmc7XG5cdG1lc3NhZ2U6IHN0cmluZztcblx0cGFja2FnZU5hbWU/OiBzdHJpbmc7XG59O1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgUHVibGlzaCBpbXBsZW1lbnRzIEFjdGlvbjxQdWJsaXNoT3B0aW9ucz4ge1xuXHQvLyBUT0RPOiBwcm9iYWJseSBiZXN0IHRvIGluamVjdCBucG1cblx0cHJpdmF0ZSByZWFkb25seSBucG0gPSBuZXcgTnBtKCk7XG5cdCNsb2dnZXIgPSBzY3JpYmUubG9nZ2VyKFB1Ymxpc2gubmFtZSk7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgd29ya3NwYWNlOiBXb3Jrc3BhY2UpIHt9XG5cblx0cHVibGljIGFzeW5jIHJ1bihvcHRpb25zOiBQdWJsaXNoT3B0aW9ucyk6IFByb21pc2U8QWN0aW9uUmVzcG9uc2U8UHVibGlzaFJlc3BvbnNlPj4ge1xuXHRcdGNvbnN0IHByb2plY3RzID0gdGhpcy53b3Jrc3BhY2UuZ2V0UHJvamVjdHMob3B0aW9ucy5jb25maWd1cmF0aW9uKTtcblx0XHRjb25zdCB0b2tlbiA9IGF3YWl0IHRoaXMucmVzb2x2ZVRva2VuKG9wdGlvbnMpO1xuXHRcdGNvbnN0IG90cCA9IGF3YWl0IHRoaXMucmVzb2x2ZU90cChvcHRpb25zKTtcblxuXHRcdGlmIChwcm9qZWN0cy5sZW5ndGggPT09IDApIHtcblx0XHRcdHRocm93IG5ldyBGb3JnZUVycm9yKGBObyBwcm9qZWN0cyBmb3VuZCB0byBwdWJsaXNoYCk7XG5cdFx0fVxuXHRcdGNvbnN0IHB1Ymxpc2hSZXNwb25zZXMgPSBhd2FpdCB0aGlzLnB1Ymxpc2hQcm9qZWN0cyhwcm9qZWN0cywge1xuXHRcdFx0Li4ub3B0aW9ucyxcblx0XHRcdHRva2VuLFxuXHRcdFx0b3RwLFxuXHRcdH0pO1xuXHRcdGNvbnN0IGZhaWxlZCA9IHB1Ymxpc2hSZXNwb25zZXMuZmlsdGVyKChyKSA9PiAhci5zdWNjZWVkZWQpO1xuXHRcdGlmIChmYWlsZWQubGVuZ3RoKSB7XG5cdFx0XHRyZXR1cm4gQWN0aW9uUmVzcG9uc2UuRXJyb3IoUHVibGlzaC5uYW1lLCBwdWJsaXNoUmVzcG9uc2VzKTtcblx0XHR9XG5cdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLlN1Y2Nlc3MoUHVibGlzaC5uYW1lLCBwdWJsaXNoUmVzcG9uc2VzKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBwdWJsaXNoUHJvamVjdHMocHJvamVjdHM6IHJlYWRvbmx5IFByb2plY3RbXSwgb3B0aW9uczogUHVibGlzaE9wdGlvbnMpIHtcblx0XHRyZXR1cm4gYXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRwcm9qZWN0c1xuXHRcdFx0XHQuZmlsdGVyKChwcm9qZWN0KSA9PiB7XG5cdFx0XHRcdFx0aWYgKHByb2plY3QuaXNQcml2YXRlKSB7XG5cdFx0XHRcdFx0XHR0aGlzLiNsb2dnZXIuaW5mbyhgU2tpcHBpbmcgcHJpdmF0ZSBwYWNrYWdlOiAke3Byb2plY3QubmFtZX1gKTtcblx0XHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdH0pXG5cdFx0XHRcdC5tYXAoYXN5bmMgKHByb2plY3QpID0+IGF3YWl0IHRoaXMucHVibGlzaFByb2plY3QocHJvamVjdCwgb3B0aW9ucykpLFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHB1Ymxpc2hQcm9qZWN0KFxuXHRcdHByb2plY3Q6IFByb2plY3QsXG5cdFx0b3B0aW9uczogUHVibGlzaE9wdGlvbnMsXG5cdCk6IFByb21pc2U8UHVibGlzaFJlc3BvbnNlPiB7XG5cdFx0Y29uc3QgeyBjaGFubmVsLCBkcnlSdW4sIHRva2VuLCBvdHAgfSA9IG9wdGlvbnM7XG5cdFx0Y29uc3Qgb3V0RGlyID0gcHJvamVjdC5nZXRPdXREaXIoKTtcblx0XHR0aGlzLiNsb2dnZXIuaW5mbyhgJHtkcnlSdW4gPyBcIltkcnktcnVuXSBcIiA6IFwiXCJ9UHVibGlzaGluZyAke3Byb2plY3QubmFtZX1gKTtcblxuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCByZXNwb25zZSA9IGF3YWl0IHRoaXMubnBtLnB1Ymxpc2gob3V0RGlyLCB7XG5cdFx0XHRcdGNoYW5uZWwsXG5cdFx0XHRcdGRyeVJ1bixcblx0XHRcdFx0YXV0aFRva2VuOiB0b2tlbixcblx0XHRcdFx0b3RwLFxuXHRcdFx0XHRza2lwSWZQdWJsaXNoZWQ6IHRydWUsXG5cdFx0XHR9KTtcblxuXHRcdFx0Y29uc3QgcGFja2FnZU5hbWUgPSByZXNwb25zZS5kYXRhPy5qb2luKFwiXCIpO1xuXHRcdFx0dGhpcy4jbG9nZ2VyLnRyYWNlKGAke3Byb2plY3QubmFtZX0g4oaSICR7cGFja2FnZU5hbWUgPz8gcmVzcG9uc2UubWVzc2FnZX1gKTtcblx0XHRcdHJldHVybiB7XG5cdFx0XHRcdHByb2plY3ROYW1lOiBwcm9qZWN0Lm5hbWUsXG5cdFx0XHRcdHN1Y2NlZWRlZDogdHJ1ZSxcblx0XHRcdFx0bWVzc2FnZTogcmVzcG9uc2UubWVzc2FnZSxcblx0XHRcdFx0cGFja2FnZU5hbWUsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKHJlYXNvbikge1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IGZvcm1hdFVua25vd25FcnJvcihyZWFzb24pO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cHJvamVjdE5hbWU6IHByb2plY3QubmFtZSxcblx0XHRcdFx0c3VjY2VlZGVkOiBmYWxzZSxcblx0XHRcdFx0bWVzc2FnZSxcblx0XHRcdFx0ZXJyb3I6IGAke3Byb2plY3QubmFtZX06ICR7bWVzc2FnZX1gLFxuXHRcdFx0fTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHJlc29sdmVUb2tlbihvcHRpb25zOiBQdWJsaXNoT3B0aW9ucyk6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG5cdFx0aWYgKG9wdGlvbnMudG9rZW4/LnRyaW0oKSkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMudG9rZW4udHJpbSgpO1xuXHRcdH1cblxuXHRcdGlmIChvcHRpb25zLnByb21wdEF1dGgpIHtcblx0XHRcdHJldHVybiBhd2FpdCB0aGlzLnByb21wdFNlY3JldChcIm5wbSBhY2Nlc3MgdG9rZW46IFwiKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyByZXNvbHZlT3RwKG9wdGlvbnM6IFB1Ymxpc2hPcHRpb25zKTogUHJvbWlzZTxzdHJpbmcgfCB1bmRlZmluZWQ+IHtcblx0XHRpZiAob3B0aW9ucy5vdHA/LnRyaW0oKSkge1xuXHRcdFx0cmV0dXJuIG9wdGlvbnMub3RwLnRyaW0oKTtcblx0XHR9XG5cblx0XHRpZiAob3B0aW9ucy5wcm9tcHRBdXRoIHx8IG9wdGlvbnMucHJvbXB0T3RwKSB7XG5cdFx0XHRyZXR1cm4gYXdhaXQgdGhpcy5wcm9tcHRTZWNyZXQoXCJucG0gT1RQOiBcIik7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcHJvbXB0U2VjcmV0KGxhYmVsOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuXHRcdGlmICghcHJvY2Vzcy5zdGRpbi5pc1RUWSB8fCAhcHJvY2Vzcy5zdGRvdXQuaXNUVFkpIHtcblx0XHRcdHRocm93IG5ldyBGb3JnZUVycm9yKGBDYW5ub3QgcHJvbXB0IGZvciBzZWNyZXQgd2l0aG91dCBhbiBpbnRlcmFjdGl2ZSBUVFlgKTtcblx0XHR9XG5cblx0XHRwcm9jZXNzLnN0ZG91dC53cml0ZShsYWJlbCk7XG5cdFx0Y29uc3Qgc3RkaW4gPSBwcm9jZXNzLnN0ZGluO1xuXHRcdHN0ZGluLnNldEVuY29kaW5nKFwidXRmOFwiKTtcblx0XHRzdGRpbi5yZXN1bWUoKTtcblx0XHRzdGRpbi5zZXRSYXdNb2RlPy4odHJ1ZSk7XG5cblx0XHRsZXQgdmFsdWUgPSBcIlwiO1xuXG5cdFx0cmV0dXJuIGF3YWl0IG5ldyBQcm9taXNlPHN0cmluZz4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuXHRcdFx0Y29uc3QgY2xlYW51cCA9ICgpID0+IHtcblx0XHRcdFx0c3RkaW4uc2V0UmF3TW9kZT8uKGZhbHNlKTtcblx0XHRcdFx0c3RkaW4ucGF1c2UoKTtcblx0XHRcdFx0c3RkaW4ucmVtb3ZlTGlzdGVuZXIoXCJkYXRhXCIsIG9uRGF0YSk7XG5cdFx0XHRcdHByb2Nlc3Muc3Rkb3V0LndyaXRlKFwiXFxuXCIpO1xuXHRcdFx0fTtcblxuXHRcdFx0Y29uc3Qgb25EYXRhID0gKGNodW5rOiBzdHJpbmcpID0+IHtcblx0XHRcdFx0Y29uc3QgY2hhciA9IGNodW5rO1xuXHRcdFx0XHRpZiAoY2hhciA9PT0gXCJcXHUwMDAzXCIpIHtcblx0XHRcdFx0XHRjbGVhbnVwKCk7XG5cdFx0XHRcdFx0cmVqZWN0KG5ldyBGb3JnZUVycm9yKFwiSW5wdXQgY2FuY2VsbGVkXCIpKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY2hhciA9PT0gXCJcXHJcIiB8fCBjaGFyID09PSBcIlxcblwiKSB7XG5cdFx0XHRcdFx0Y2xlYW51cCgpO1xuXHRcdFx0XHRcdHJlc29sdmUodmFsdWUudHJpbSgpKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRpZiAoY2hhciA9PT0gXCJcXHUwMDA4XCIgfHwgY2hhciA9PT0gXCJcXHUwMDdmXCIpIHtcblx0XHRcdFx0XHR2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIC0xKTtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblxuXHRcdFx0XHR2YWx1ZSArPSBjaGFyO1xuXHRcdFx0fTtcblxuXHRcdFx0c3RkaW4ub24oXCJkYXRhXCIsIG9uRGF0YSk7XG5cdFx0fSk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJpbmplY3RhYmxlIiwiV29ya3NwYWNlIiwiQWN0aW9uUmVzcG9uc2UiLCJOcG0iLCJzY3JpYmUiLCJGb3JnZUVycm9yIiwiZm9ybWF0VW5rbm93bkVycm9yIiwiUHVibGlzaCIsIm5wbSIsImxvZ2dlciIsIm5hbWUiLCJ3b3Jrc3BhY2UiLCJydW4iLCJvcHRpb25zIiwicHJvamVjdHMiLCJnZXRQcm9qZWN0cyIsImNvbmZpZ3VyYXRpb24iLCJ0b2tlbiIsInJlc29sdmVUb2tlbiIsIm90cCIsInJlc29sdmVPdHAiLCJsZW5ndGgiLCJwdWJsaXNoUmVzcG9uc2VzIiwicHVibGlzaFByb2plY3RzIiwiZmFpbGVkIiwiZmlsdGVyIiwiciIsInN1Y2NlZWRlZCIsIkVycm9yIiwiU3VjY2VzcyIsIlByb21pc2UiLCJhbGwiLCJwcm9qZWN0IiwiaXNQcml2YXRlIiwiaW5mbyIsIm1hcCIsInB1Ymxpc2hQcm9qZWN0IiwiY2hhbm5lbCIsImRyeVJ1biIsIm91dERpciIsImdldE91dERpciIsInJlc3BvbnNlIiwicHVibGlzaCIsImF1dGhUb2tlbiIsInNraXBJZlB1Ymxpc2hlZCIsInBhY2thZ2VOYW1lIiwiZGF0YSIsImpvaW4iLCJ0cmFjZSIsIm1lc3NhZ2UiLCJwcm9qZWN0TmFtZSIsInJlYXNvbiIsImVycm9yIiwidHJpbSIsInByb21wdEF1dGgiLCJwcm9tcHRTZWNyZXQiLCJ1bmRlZmluZWQiLCJwcm9tcHRPdHAiLCJsYWJlbCIsInByb2Nlc3MiLCJzdGRpbiIsImlzVFRZIiwic3Rkb3V0Iiwid3JpdGUiLCJzZXRFbmNvZGluZyIsInJlc3VtZSIsInNldFJhd01vZGUiLCJ2YWx1ZSIsInJlc29sdmUiLCJyZWplY3QiLCJjbGVhbnVwIiwicGF1c2UiLCJyZW1vdmVMaXN0ZW5lciIsIm9uRGF0YSIsImNodW5rIiwiY2hhciIsInNsaWNlIiwib24iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7OztBQUFBLFNBQVNBLFVBQVUsUUFBUSxnQ0FBZ0M7QUFFM0QsOENBQThDO0FBQzlDLFNBQVNDLFNBQVMsUUFBUSxpQkFBaUI7QUFFM0MsU0FBU0MsY0FBYyxRQUFRLHNCQUFzQjtBQUNyRCxTQUFTQyxHQUFHLFFBQVEsMEJBQTBCO0FBQzlDLFNBQVNDLE1BQU0sUUFBUSxtQkFBbUI7QUFDMUMsU0FBU0MsVUFBVSxFQUFFQyxrQkFBa0IsUUFBUSxlQUFlO0FBbUI5RCxPQUFP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
@@ -5,8 +5,8 @@ function _ts_decorate(decorators, target, key, desc) {
5
5
  return c > 3 && r && Object.defineProperty(target, key, r), r;
6
6
  }
7
7
  import { injectable } from "@decohere/crucible/decorators";
8
- import { ActionResponse } from "@decohere/nexus/cli";
9
- import { Pnpm } from "@decohere/nexus/interop";
8
+ import { ActionResponse } from "@decohere/devkit/cli";
9
+ import { Pnpm } from "@decohere/devkit/interop";
10
10
  import { scribe } from "@decohere/scribe";
11
11
  import { formatUnknownError } from "../errors.js";
12
12
  export class SyncLockFile {
@@ -29,5 +29,3 @@ export class SyncLockFile {
29
29
  SyncLockFile = _ts_decorate([
30
30
  injectable()
31
31
  ], SyncLockFile);
32
-
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9hY3Rpb25zL3N5bmMtbG9jay1maWxlLmFjdGlvbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgdHlwZSB7IEFjdGlvbiB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBBY3Rpb25SZXNwb25zZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBQbnBtIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9pbnRlcm9wXCI7XG5pbXBvcnQgeyBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IHsgZm9ybWF0VW5rbm93bkVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuXG5leHBvcnQgdHlwZSBTeW5jTG9ja0ZpbGVPcHRpb25zID0ge1xuXHRzeW5jPzogYm9vbGVhbjtcblx0ZHJ5UnVuPzogYm9vbGVhbjtcbn07XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBTeW5jTG9ja0ZpbGUgaW1wbGVtZW50cyBBY3Rpb248U3luY0xvY2tGaWxlT3B0aW9ucz4ge1xuXHQjbG9nZ2VyID0gc2NyaWJlLmxvZ2dlcihTeW5jTG9ja0ZpbGUubmFtZSk7XG5cdCNwbnBtID0gbmV3IFBucG0oKTtcblxuXHRwdWJsaWMgYXN5bmMgcnVuKG9wdGlvbnM6IFN5bmNMb2NrRmlsZU9wdGlvbnMpOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPiB7XG5cdFx0Y29uc3Qgc2hvdWxkU3luYyA9IG9wdGlvbnMuc3luYyA/PyB0cnVlO1xuXG5cdFx0aWYgKG9wdGlvbnMuZHJ5UnVuIHx8ICFzaG91bGRTeW5jKSB7XG5cdFx0XHR0aGlzLiNsb2dnZXIuaW5mbyhcblx0XHRcdFx0b3B0aW9ucy5kcnlSdW4gPyBcIltkcnktcnVuXSBTa2lwcGluZyBsb2NrZmlsZSBzeW5jXCIgOiBcIlNraXBwaW5nIGxvY2tmaWxlIHN5bmNcIixcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm4gQWN0aW9uUmVzcG9uc2UuU2tpcHBlZChTeW5jTG9ja0ZpbGUubmFtZSk7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGF3YWl0IHRoaXMuI3BucG0uc3luY0xvY2tGaWxlKCk7XG5cdFx0fSBjYXRjaCAocmVhc29uKSB7XG5cdFx0XHRyZXR1cm4gQWN0aW9uUmVzcG9uc2UuRXJyb3IoXG5cdFx0XHRcdFN5bmNMb2NrRmlsZS5uYW1lLFxuXHRcdFx0XHRgRmFpbGVkIHN5bmNpbmcgbG9ja2ZpbGU6ICR7Zm9ybWF0VW5rbm93bkVycm9yKHJlYXNvbil9YCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLlN1Y2Nlc3MoU3luY0xvY2tGaWxlLm5hbWUpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiaW5qZWN0YWJsZSIsIkFjdGlvblJlc3BvbnNlIiwiUG5wbSIsInNjcmliZSIsImZvcm1hdFVua25vd25FcnJvciIsIlN5bmNMb2NrRmlsZSIsImxvZ2dlciIsIm5hbWUiLCJydW4iLCJvcHRpb25zIiwic2hvdWxkU3luYyIsInN5bmMiLCJkcnlSdW4iLCJpbmZvIiwiU2tpcHBlZCIsInN5bmNMb2NrRmlsZSIsInJlYXNvbiIsIkVycm9yIiwiU3VjY2VzcyJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsU0FBU0EsVUFBVSxRQUFRLGdDQUFnQztBQUUzRCxTQUFTQyxjQUFjLFFBQVEsc0JBQXNCO0FBQ3JELFNBQVNDLElBQUksUUFBUSwwQkFBMEI7QUFDL0MsU0FBU0MsTUFBTSxRQUFRLG1CQUFtQjtBQUMxQyxTQUFTQyxrQkFBa0IsUUFBUSxlQUFlO0FBUWxELE9BQU8sTUFBTUM7SUFDWixDQUFBLE1BQU8sR0FBR0YsT0FBT0csTUFBTSxDQUFDRCxhQUFhRSxJQUFJLEVBQUU7SUFDM0MsQ0FBQSxJQUFLLEdBQUcsSUFBSUwsT0FBTztJQUVuQixNQUFhTSxJQUFJQyxPQUE0QixFQUEyQjtRQUN2RSxNQUFNQyxhQUFhRCxRQUFRRSxJQUFJLElBQUk7UUFFbkMsSUFBSUYsUUFBUUcsTUFBTSxJQUFJLENBQUNGLFlBQVk7WUFDbEMsSUFBSSxDQUFDLENBQUEsTUFBTyxDQUFDRyxJQUFJLENBQ2hCSixRQUFRRyxNQUFNLEdBQUcscUNBQXFDO1lBRXZELE9BQU9YLGVBQWVhLE9BQU8sQ0FBQ1QsYUFBYUUsSUFBSTtRQUNoRDtRQUVBLElBQUk7WUFDSCxNQUFNLElBQUksQ0FBQyxDQUFBLElBQUssQ0FBQ1EsWUFBWTtRQUM5QixFQUFFLE9BQU9DLFFBQVE7WUFDaEIsT0FBT2YsZUFBZWdCLEtBQUssQ0FDMUJaLGFBQWFFLElBQUksRUFDakIsQ0FBQyx5QkFBeUIsRUFBRUgsbUJBQW1CWSxTQUFTO1FBRTFEO1FBRUEsT0FBT2YsZUFBZWlCLE9BQU8sQ0FBQ2IsYUFBYUUsSUFBSTtJQUNoRDtBQUNEIn0=
@@ -8,10 +8,9 @@ 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
- import { Workspace } from "@decohere/mesh";
13
- import { ActionResponse } from "@decohere/nexus/cli";
14
- import { Git } from "@decohere/nexus/interop";
11
+ import { Workspace } from "@decohere/workspace";
12
+ import { ActionResponse } from "@decohere/devkit/cli";
13
+ import { Git } from "@decohere/devkit/interop";
15
14
  import { scribe } from "@decohere/scribe";
16
15
  import { ForgeError, formatUnknownError } from "../errors.js";
17
16
  export class Tag {
@@ -38,9 +37,8 @@ export class Tag {
38
37
  const git = new Git();
39
38
  await git.tag(tag);
40
39
  if (options.push) {
41
- const branch = await git.getBranchName();
42
- this.#logger.info(`Pushing branch: ${branch}`);
43
- await git.push(branch);
40
+ // Tag-only: Publish checks out a commit SHA (detached HEAD). Pushing a
41
+ // branch name is wrong there and unnecessary — the version label is the tag.
44
42
  this.#logger.info(`Pushing tag: ${tag}`);
45
43
  await git.pushTag(tag);
46
44
  }
@@ -63,5 +61,3 @@ Tag = _ts_decorate([
63
61
  typeof Workspace === "undefined" ? Object : Workspace
64
62
  ])
65
63
  ], Tag);
66
-
67
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9hY3Rpb25zL3RhZy5hY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogPERJPlxuaW1wb3J0IHsgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgdHlwZSB7IEFjdGlvbiB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBBY3Rpb25SZXNwb25zZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBHaXQgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2ludGVyb3BcIjtcbmltcG9ydCB7IHNjcmliZSB9IGZyb20gXCJAZGVjb2hlcmUvc2NyaWJlXCI7XG5pbXBvcnQgeyBGb3JnZUVycm9yLCBmb3JtYXRVbmtub3duRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFRhZ09wdGlvbnMgPSB7XG5cdHByZWZpeD86IHN0cmluZztcblx0ZHJ5UnVuPzogYm9vbGVhbjtcblx0cHVzaD86IGJvb2xlYW47XG59O1xuXG5leHBvcnQgdHlwZSBUYWdSZXNwb25zZSA9IHtcblx0dGFnOiBzdHJpbmc7XG5cdHN1Y2NlZWRlZDogYm9vbGVhbjtcblx0ZXJyb3I/OiBzdHJpbmc7XG59O1xuXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVGFnIGltcGxlbWVudHMgQWN0aW9uPFRhZ09wdGlvbnM+IHtcblx0I2xvZ2dlciA9IHNjcmliZS5sb2dnZXIoVGFnLm5hbWUpO1xuXHRwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSByZWFkb25seSB3b3Jrc3BhY2U6IFdvcmtzcGFjZSkge31cblxuXHRwdWJsaWMgYXN5bmMgcnVuKG9wdGlvbnM6IFRhZ09wdGlvbnMpOiBQcm9taXNlPEFjdGlvblJlc3BvbnNlPFRhZ1Jlc3BvbnNlPj4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCB2ZXJzaW9uID0gYXdhaXQgdGhpcy53b3Jrc3BhY2UuZ2V0VmVyc2lvbigpO1xuXHRcdFx0Y29uc3QgcHJlZml4ID0gb3B0aW9ucy5wcmVmaXggPz8gXCJ2XCI7XG5cdFx0XHRjb25zdCB0YWcgPSBgJHtwcmVmaXh9JHt2ZXJzaW9ufWA7XG5cblx0XHRcdGlmIChvcHRpb25zLmRyeVJ1bikge1xuXHRcdFx0XHR0aGlzLiNsb2dnZXIuaW5mbyhgW2RyeS1ydW5dICR7dGFnfWApO1xuXHRcdFx0XHRyZXR1cm4gQWN0aW9uUmVzcG9uc2UuU3VjY2VzczxUYWdSZXNwb25zZT4oVGFnLm5hbWUsIFt7IHRhZywgc3VjY2VlZGVkOiB0cnVlIH1dKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy4jbG9nZ2VyLmluZm8oYENyZWF0aW5nIHRhZzogJHt0YWd9YCk7XG5cdFx0XHRjb25zdCBnaXQgPSBuZXcgR2l0KCk7XG5cdFx0XHRhd2FpdCBnaXQudGFnKHRhZyk7XG5cblx0XHRcdGlmIChvcHRpb25zLnB1c2gpIHtcblx0XHRcdFx0Y29uc3QgYnJhbmNoID0gYXdhaXQgZ2l0LmdldEJyYW5jaE5hbWUoKTtcblx0XHRcdFx0dGhpcy4jbG9nZ2VyLmluZm8oYFB1c2hpbmcgYnJhbmNoOiAke2JyYW5jaH1gKTtcblx0XHRcdFx0YXdhaXQgZ2l0LnB1c2goYnJhbmNoKTtcblx0XHRcdFx0dGhpcy4jbG9nZ2VyLmluZm8oYFB1c2hpbmcgdGFnOiAke3RhZ31gKTtcblx0XHRcdFx0YXdhaXQgZ2l0LnB1c2hUYWcodGFnKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLlN1Y2Nlc3M8VGFnUmVzcG9uc2U+KFRhZy5uYW1lLCBbeyB0YWcsIHN1Y2NlZWRlZDogdHJ1ZSB9XSk7XG5cdFx0fSBjYXRjaCAocmVhc29uKSB7XG5cdFx0XHRjb25zdCBlcnJvciA9IGZvcm1hdFVua25vd25FcnJvcihyZWFzb24pO1xuXHRcdFx0dGhyb3cgbmV3IEZvcmdlRXJyb3IoYEZhaWxlZCB0byBjcmVhdGUgdGFnOiAke2Vycm9yfWApO1xuXHRcdH1cblx0fVxufVxuIl0sIm5hbWVzIjpbImluamVjdGFibGUiLCJXb3Jrc3BhY2UiLCJBY3Rpb25SZXNwb25zZSIsIkdpdCIsInNjcmliZSIsIkZvcmdlRXJyb3IiLCJmb3JtYXRVbmtub3duRXJyb3IiLCJUYWciLCJsb2dnZXIiLCJuYW1lIiwid29ya3NwYWNlIiwicnVuIiwib3B0aW9ucyIsInZlcnNpb24iLCJnZXRWZXJzaW9uIiwicHJlZml4IiwidGFnIiwiZHJ5UnVuIiwiaW5mbyIsIlN1Y2Nlc3MiLCJzdWNjZWVkZWQiLCJnaXQiLCJwdXNoIiwiYnJhbmNoIiwiZ2V0QnJhbmNoTmFtZSIsInB1c2hUYWciLCJyZWFzb24iLCJlcnJvciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsU0FBU0EsVUFBVSxRQUFRLGdDQUFnQztBQUMzRCw4Q0FBOEM7QUFDOUMsU0FBU0MsU0FBUyxRQUFRLGlCQUFpQjtBQUUzQyxTQUFTQyxjQUFjLFFBQVEsc0JBQXNCO0FBQ3JELFNBQVNDLEdBQUcsUUFBUSwwQkFBMEI7QUFDOUMsU0FBU0MsTUFBTSxRQUFRLG1CQUFtQjtBQUMxQyxTQUFTQyxVQUFVLEVBQUVDLGtCQUFrQixRQUFRLGVBQWU7QUFlOUQsT0FBTyxNQUFNQzs7SUFDWixDQUFBLE1BQU8sR0FBR0gsT0FBT0ksTUFBTSxDQUFDRCxJQUFJRSxJQUFJLEVBQUU7SUFDbEMsWUFBbUIsQUFBaUJDLFNBQW9CLENBQUU7YUFBdEJBLFlBQUFBO0lBQXVCO0lBRTNELE1BQWFDLElBQUlDLE9BQW1CLEVBQXdDO1FBQzNFLElBQUk7WUFDSCxNQUFNQyxVQUFVLE1BQU0sSUFBSSxDQUFDSCxTQUFTLENBQUNJLFVBQVU7WUFDL0MsTUFBTUMsU0FBU0gsUUFBUUcsTUFBTSxJQUFJO1lBQ2pDLE1BQU1DLE1BQU0sR0FBR0QsU0FBU0YsU0FBUztZQUVqQyxJQUFJRCxRQUFRSyxNQUFNLEVBQUU7Z0JBQ25CLElBQUksQ0FBQyxDQUFBLE1BQU8sQ0FBQ0MsSUFBSSxDQUFDLENBQUMsVUFBVSxFQUFFRixLQUFLO2dCQUNwQyxPQUFPZCxlQUFlaUIsT0FBTyxDQUFjWixJQUFJRSxJQUFJLEVBQUU7b0JBQUM7d0JBQUVPO3dCQUFLSSxXQUFXO29CQUFLO2lCQUFFO1lBQ2hGO1lBRUEsSUFBSSxDQUFDLENBQUEsTUFBTyxDQUFDRixJQUFJLENBQUMsQ0FBQyxjQUFjLEVBQUVGLEtBQUs7WUFDeEMsTUFBTUssTUFBTSxJQUFJbEI7WUFDaEIsTUFBTWtCLElBQUlMLEdBQUcsQ0FBQ0E7WUFFZCxJQUFJSixRQUFRVSxJQUFJLEVBQUU7Z0JBQ2pCLE1BQU1DLFNBQVMsTUFBTUYsSUFBSUcsYUFBYTtnQkFDdEMsSUFBSSxDQUFDLENBQUEsTUFBTyxDQUFDTixJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsRUFBRUssUUFBUTtnQkFDN0MsTUFBTUYsSUFBSUMsSUFBSSxDQUFDQztnQkFDZixJQUFJLENBQUMsQ0FBQSxNQUFPLENBQUNMLElBQUksQ0FBQyxDQUFDLGFBQWEsRUFBRUYsS0FBSztnQkFDdkMsTUFBTUssSUFBSUksT0FBTyxDQUFDVDtZQUNuQjtZQUVBLE9BQU9kLGVBQWVpQixPQUFPLENBQWNaLElBQUlFLElBQUksRUFBRTtnQkFBQztvQkFBRU87b0JBQUtJLFdBQVc7Z0JBQUs7YUFBRTtRQUNoRixFQUFFLE9BQU9NLFFBQVE7WUFDaEIsTUFBTUMsUUFBUXJCLG1CQUFtQm9CO1lBQ2pDLE1BQU0sSUFBSXJCLFdBQVcsQ0FBQyxzQkFBc0IsRUFBRXNCLE9BQU87UUFDdEQ7SUFDRDtBQUNEIn0=
@@ -0,0 +1,52 @@
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 { injectable } from "@decohere/crucible/decorators";
11
+ import { Workspace } from "@decohere/workspace";
12
+ import { ActionResponse } from "@decohere/devkit/cli";
13
+ import { Trace } from "@decohere/devkit/diagnostics";
14
+ import { scribe } from "@decohere/scribe";
15
+ import ts from "typescript";
16
+ import { ForgeError } from "../errors.js";
17
+ import { TypeEmitter } from "../services/type-emitter.js";
18
+ export class TypeCheck {
19
+ workspace;
20
+ typeEmitter;
21
+ #logger = scribe.logger(TypeCheck.name);
22
+ constructor(workspace, typeEmitter){
23
+ this.workspace = workspace;
24
+ this.typeEmitter = typeEmitter;
25
+ }
26
+ run = async (options)=>{
27
+ const projects = this.workspace.getProjects(options.configuration);
28
+ for (const project of projects){
29
+ this.#logger.info(`Type-checking ${project.name}`);
30
+ }
31
+ const { diagnostics, formatted } = await this.typeEmitter.checkProject([
32
+ ...projects
33
+ ]);
34
+ const errors = diagnostics.filter((diagnostic)=>diagnostic.category === ts.DiagnosticCategory.Error);
35
+ if (errors.length > 0) {
36
+ throw new ForgeError(formatted || "Type check failed");
37
+ }
38
+ if (formatted.length > 0) {
39
+ this.#logger.info(formatted);
40
+ }
41
+ return ActionResponse.Success(TypeCheck.name);
42
+ };
43
+ }
44
+ TypeCheck = _ts_decorate([
45
+ Trace,
46
+ injectable(),
47
+ _ts_metadata("design:type", Function),
48
+ _ts_metadata("design:paramtypes", [
49
+ typeof Workspace === "undefined" ? Object : Workspace,
50
+ typeof TypeEmitter === "undefined" ? Object : TypeEmitter
51
+ ])
52
+ ], TypeCheck);