@decohere/forge 0.0.1-dev.20 → 0.0.1-dev.20261105.54

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 (200) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +152 -0
  3. package/commonjs/src/actions/build.action.js +4 -6
  4. package/commonjs/src/actions/clean.action.js +4 -6
  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 +83 -36
  10. package/commonjs/src/actions/index.js +3 -2
  11. package/commonjs/src/actions/link.action.js +3 -5
  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 +1 -3
  19. package/commonjs/src/actions/version.action.js +74 -21
  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 +2 -4
  24. package/commonjs/src/commands/forge.command.js +1 -3
  25. package/commonjs/src/commands/index.js +3 -2
  26. package/commonjs/src/commands/link.command.js +4 -3
  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 +3 -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 +15 -20
  39. package/commonjs/src/index.js +8 -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 +96 -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-compiler-options.js +50 -0
  54. package/commonjs/src/services/ts-program-host.js +4 -6
  55. package/commonjs/src/services/type-emission-program.js +25 -10
  56. package/commonjs/src/services/type-emitter.js +60 -20
  57. package/commonjs/src/transpile/index.js +30 -0
  58. package/commonjs/src/types/build-target.type.js +0 -2
  59. package/commonjs/src/types/configuration.type.js +0 -2
  60. package/commonjs/src/types/dependency.types.js +0 -2
  61. package/commonjs/src/types/swc-config.type.js +0 -2
  62. package/commonjs/src/types/transform-response.model.js +3 -18
  63. package/commonjs/src/types/transformer.type.js +0 -2
  64. package/commonjs/src/types/workspace-config.type.js +0 -2
  65. package/commonjs/src/vitest/forge-build.plugin.js +28 -44
  66. package/commonjs/src/vitest/index.js +0 -2
  67. package/commonjs/src/workspace.config.js +27 -6
  68. package/es6/src/actions/build.action.js +3 -7
  69. package/es6/src/actions/clean.action.js +3 -6
  70. package/es6/src/actions/commit.action.js +3 -6
  71. package/es6/src/actions/copy.action.js +61 -12
  72. package/es6/src/actions/dependency-report.action.js +7 -7
  73. package/es6/src/actions/dependency-sync.action.js +8 -6
  74. package/es6/src/actions/docker.action.js +82 -36
  75. package/es6/src/actions/index.js +3 -2
  76. package/es6/src/actions/link.action.js +2 -5
  77. package/es6/src/actions/package.action.js +219 -0
  78. package/es6/src/actions/paths.action.js +97 -0
  79. package/es6/src/actions/publish.action.js +3 -6
  80. package/es6/src/actions/sync-lock-file.action.js +2 -4
  81. package/es6/src/actions/tag.action.js +5 -9
  82. package/es6/src/actions/typecheck.action.js +52 -0
  83. package/es6/src/actions/unlink.action.js +1 -3
  84. package/es6/src/actions/version.action.js +69 -17
  85. package/es6/src/actions/watch.action.js +2 -5
  86. package/es6/src/commands/build.command.js +4 -3
  87. package/es6/src/commands/dependency.command.js +1 -3
  88. package/es6/src/commands/docker.command.js +2 -4
  89. package/es6/src/commands/forge.command.js +1 -3
  90. package/es6/src/commands/index.js +3 -2
  91. package/es6/src/commands/link.command.js +4 -3
  92. package/es6/src/commands/package.command.js +26 -0
  93. package/es6/src/commands/paths.command.js +14 -0
  94. package/es6/src/commands/publish.command.js +1 -3
  95. package/es6/src/commands/tag.command.js +1 -3
  96. package/es6/src/commands/typecheck.command.js +14 -0
  97. package/es6/src/commands/version.command.js +3 -3
  98. package/es6/src/const.js +0 -2
  99. package/es6/src/create-workspace.js +26 -0
  100. package/es6/src/errors.js +1 -3
  101. package/es6/src/extensions/project.extensions.js +5 -7
  102. package/es6/src/factories/swc-config.factory.js +29 -9
  103. package/es6/src/forge.module.js +15 -20
  104. package/es6/src/index.js +2 -2
  105. package/es6/src/packaging/dependency-pinner.service.js +103 -0
  106. package/es6/src/packaging/deployable.js +21 -0
  107. package/es6/src/packaging/import-graph.service.js +122 -0
  108. package/es6/src/packaging/release-exports.js +80 -0
  109. package/es6/src/packaging/ui-assets.js +49 -0
  110. package/es6/src/semver/index.js +1 -0
  111. package/es6/src/semver/semver.js +75 -0
  112. package/es6/src/services/dependency-resolver.service.js +70 -26
  113. package/es6/src/services/file-writer.service.js +2 -11
  114. package/es6/src/services/incremental-watch.js +18 -0
  115. package/es6/src/services/output-cache.js +29 -0
  116. package/es6/src/services/swc-transpiler.js +85 -99
  117. package/es6/src/services/transpile-cache.js +29 -0
  118. package/es6/src/services/ts-compiler-options.js +39 -0
  119. package/es6/src/services/ts-program-host.js +4 -6
  120. package/es6/src/services/type-emission-program.js +25 -10
  121. package/es6/src/services/type-emitter.js +57 -20
  122. package/es6/src/transpile/index.js +6 -0
  123. package/es6/src/types/build-target.type.js +0 -2
  124. package/es6/src/types/configuration.type.js +0 -2
  125. package/es6/src/types/dependency.types.js +0 -2
  126. package/es6/src/types/swc-config.type.js +0 -2
  127. package/es6/src/types/transform-response.model.js +0 -7
  128. package/es6/src/types/transformer.type.js +0 -2
  129. package/es6/src/types/workspace-config.type.js +0 -2
  130. package/es6/src/vitest/forge-build.plugin.js +27 -43
  131. package/es6/src/vitest/index.js +0 -2
  132. package/es6/src/workspace.config.js +26 -5
  133. package/package.json +20 -6
  134. package/types/src/actions/build.action.d.ts +4 -4
  135. package/types/src/actions/clean.action.d.ts +3 -3
  136. package/types/src/actions/commit.action.d.ts +3 -3
  137. package/types/src/actions/copy.action.d.ts +18 -3
  138. package/types/src/actions/dependency-report.action.d.ts +3 -3
  139. package/types/src/actions/dependency-sync.action.d.ts +3 -3
  140. package/types/src/actions/docker.action.d.ts +14 -3
  141. package/types/src/actions/index.d.ts +3 -0
  142. package/types/src/actions/link.action.d.ts +3 -3
  143. package/types/src/actions/package.action.d.ts +38 -0
  144. package/types/src/actions/paths.action.d.ts +28 -0
  145. package/types/src/actions/publish.action.d.ts +4 -4
  146. package/types/src/actions/sync-lock-file.action.d.ts +2 -2
  147. package/types/src/actions/tag.action.d.ts +3 -3
  148. package/types/src/actions/typecheck.action.d.ts +14 -0
  149. package/types/src/actions/unlink.action.d.ts +2 -2
  150. package/types/src/actions/version.action.d.ts +14 -4
  151. package/types/src/actions/watch.action.d.ts +3 -3
  152. package/types/src/commands/build.command.d.ts +3 -2
  153. package/types/src/commands/dependency.command.d.ts +2 -2
  154. package/types/src/commands/docker.command.d.ts +1 -1
  155. package/types/src/commands/forge.command.d.ts +2 -2
  156. package/types/src/commands/index.d.ts +3 -0
  157. package/types/src/commands/link.command.d.ts +3 -2
  158. package/types/src/commands/package.command.d.ts +11 -0
  159. package/types/src/commands/paths.command.d.ts +6 -0
  160. package/types/src/commands/publish.command.d.ts +1 -1
  161. package/types/src/commands/tag.command.d.ts +1 -1
  162. package/types/src/commands/typecheck.command.d.ts +6 -0
  163. package/types/src/commands/version.command.d.ts +1 -1
  164. package/types/src/create-workspace.d.ts +7 -0
  165. package/types/src/errors.d.ts +1 -1
  166. package/types/src/extensions/project.extensions.d.ts +2 -2
  167. package/types/src/factories/swc-config.factory.d.ts +3 -2
  168. package/types/src/forge.module.d.ts +10 -4
  169. package/types/src/index.d.ts +2 -0
  170. package/types/src/packaging/dependency-pinner.service.d.ts +20 -0
  171. package/types/src/packaging/deployable.d.ts +17 -0
  172. package/types/src/packaging/import-graph.service.d.ts +33 -0
  173. package/types/src/packaging/release-exports.d.ts +18 -0
  174. package/types/src/packaging/ui-assets.d.ts +21 -0
  175. package/types/src/semver/index.d.ts +1 -0
  176. package/types/src/semver/semver.d.ts +20 -0
  177. package/types/src/services/dependency-resolver.service.d.ts +8 -1
  178. package/types/src/services/file-writer.service.d.ts +1 -2
  179. package/types/src/services/incremental-watch.d.ts +13 -0
  180. package/types/src/services/output-cache.d.ts +10 -0
  181. package/types/src/services/swc-transpiler.d.ts +28 -15
  182. package/types/src/services/transpile-cache.d.ts +17 -0
  183. package/types/src/services/ts-compiler-options.d.ts +8 -0
  184. package/types/src/services/ts-program-host.d.ts +2 -2
  185. package/types/src/services/type-emission-program.d.ts +10 -3
  186. package/types/src/services/type-emitter.d.ts +21 -8
  187. package/types/src/transpile/index.d.ts +6 -0
  188. package/types/src/types/configuration.type.d.ts +6 -1
  189. package/types/src/types/dependency.types.d.ts +8 -9
  190. package/types/src/types/swc-config.type.d.ts +7 -1
  191. package/types/src/types/transform-response.model.d.ts +2 -7
  192. package/types/src/types/transformer.type.d.ts +3 -12
  193. package/types/src/types/workspace-config.type.d.ts +3 -3
  194. package/types/src/vitest/forge-build.plugin.d.ts +0 -2
  195. package/commonjs/src/mixins/caches-outputs.mixin.js +0 -44
  196. package/commonjs/src/mixins/incremental-transform.mixin.js +0 -36
  197. package/es6/src/mixins/caches-outputs.mixin.js +0 -34
  198. package/es6/src/mixins/incremental-transform.mixin.js +0 -26
  199. package/types/src/mixins/caches-outputs.mixin.d.ts +0 -7
  200. package/types/src/mixins/incremental-transform.mixin.d.ts +0 -13
@@ -10,12 +10,13 @@ Object.defineProperty(exports, "Docker", {
10
10
  });
11
11
  const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
12
12
  const _decorators = require("@decohere/crucible/decorators");
13
- const _mesh = require("@decohere/mesh");
14
- const _cli = require("@decohere/nexus/cli");
15
- const _interop = require("@decohere/nexus/interop");
16
- const _io = require("@decohere/nexus/io");
13
+ const _workspace = require("@decohere/workspace");
14
+ const _cli = require("@decohere/devkit/cli");
15
+ const _interop = require("@decohere/devkit/interop");
16
+ const _io = require("@decohere/core/io");
17
17
  const _scribe = require("@decohere/scribe");
18
18
  const _errors = require("../errors.js");
19
+ const _deployable = require("../packaging/deployable.js");
19
20
  function _interop_require_default(obj) {
20
21
  return obj && obj.__esModule ? obj : {
21
22
  default: obj
@@ -41,10 +42,12 @@ class Docker {
41
42
  async run(options) {
42
43
  const projects = await this.getDockerProjects(this.workspace.getProjects(options.configuration));
43
44
  if (projects.length === 0) {
44
- throw new _errors.ForgeError(`No projects found with a Dockerfile`);
45
+ this.#logger.info("No projects found with a Dockerfile — nothing to dockerize");
46
+ return _cli.ActionResponse.Success(Docker.name, []);
45
47
  }
48
+ const workspacePackageJson = await this.workspace.getPackageJson();
46
49
  const version = await this.workspace.getVersion();
47
- const responses = await Promise.all(projects.map(async (project)=>await this.buildProject(project, version, options)));
50
+ const responses = await Promise.all(projects.map(async (project)=>await this.buildProject(project, workspacePackageJson, version, options)));
48
51
  const failed = responses.filter((response)=>!response.succeeded);
49
52
  if (failed.length > 0) {
50
53
  return _cli.ActionResponse.Error(Docker.name, responses);
@@ -54,60 +57,76 @@ class Docker {
54
57
  async getDockerProjects(projects) {
55
58
  const result = [];
56
59
  for (const project of projects){
57
- const dockerfile = project.dockerConfig?.dockerfile ?? "Dockerfile";
58
- const dockerfilePath = _nodepath.default.join(project.projectRoot, dockerfile);
59
- if (!await _io.io.fileExists(dockerfilePath)) {
60
- this.#logger.info(`Skipping ${project.name}: missing ${dockerfile}`);
60
+ if (!await _deployable.deployable.isDeployable(project)) {
61
+ this.#logger.info(`Skipping ${project.name}: missing ${_deployable.deployable.dockerfileName(project)}`);
61
62
  continue;
62
63
  }
63
64
  result.push(project);
64
65
  }
65
66
  return result;
66
67
  }
67
- async buildProject(project, version, options) {
68
+ /**
69
+ * A Dockerfile that copies `.package/` needs `forge package` to have run. Fail before the
70
+ * build with that instruction rather than with Docker's "not found" from deep in a layer.
71
+ */ async assertPackaged(project) {
72
+ const dockerfile = await _io.io.readFile(_deployable.deployable.dockerfilePath(project)).catch(()=>"");
73
+ if (!dockerfile.includes(_deployable.PACKAGE_DIR)) {
74
+ return;
75
+ }
76
+ const packaged = _nodepath.default.join(project.projectRoot, _deployable.PACKAGE_DIR, "package.json");
77
+ if (!await _io.io.fileExists(packaged)) {
78
+ throw new _errors.ForgeError(`${project.name}: its Dockerfile copies ${_deployable.PACKAGE_DIR}/, which does not exist. ` + `Run \`forge build --configuration release\` and \`forge package ${project.name}\` first.`);
79
+ }
80
+ }
81
+ async buildProject(project, workspacePackageJson, version, options) {
68
82
  const dockerConfig = project.dockerConfig ?? {};
69
83
  const envBuildArgs = this.parseJsonEnv("FORGE_DOCKER_BUILD_ARGS_JSON", {});
70
84
  const envSecrets = this.parseJsonEnv("FORGE_DOCKER_SECRETS_JSON", {});
71
85
  const envTags = this.parseJsonEnv("FORGE_DOCKER_EXTRA_TAGS_JSON", []);
72
- const image = dockerConfig.image ?? this.defaultImageName(project.name);
86
+ const image = dockerConfig.image ?? this.defaultImageName(project.name, workspacePackageJson);
73
87
  const dockerfile = dockerConfig.dockerfile ?? "Dockerfile";
74
- const tags = [
75
- `${image}:${version}`,
88
+ const extraTags = this.extraTagsForImage(image, [
76
89
  ...dockerConfig.tags ?? [],
77
90
  ...envTags
91
+ ]);
92
+ const tags = [
93
+ `${image}:${version}`,
94
+ ...extraTags
78
95
  ];
79
96
  const buildArgs = this.interpolateBuildArgs({
80
- ...dockerConfig.buildArgs ?? {},
97
+ ...dockerConfig.buildArgs,
81
98
  ...envBuildArgs
82
99
  }, version);
83
100
  const secrets = {
84
- ...dockerConfig.secrets ?? {},
101
+ ...dockerConfig.secrets,
85
102
  ...envSecrets
86
103
  };
87
104
  this.#logger.info(`${options.dryRun ? "[dry-run] " : ""}Building ${project.name}`);
88
105
  try {
89
- if (!options.dryRun) {
90
- await this.docker.build(project.projectRoot, {
91
- cwd: project.projectRoot,
92
- dockerfile: _nodepath.default.join(project.projectRoot, dockerfile),
93
- tags,
94
- buildArgs,
95
- secrets
96
- });
97
- if (options.push || dockerConfig.push) {
98
- for (const tag of tags){
99
- await this.docker.push(tag, {
100
- cwd: project.projectRoot
101
- });
102
- }
106
+ await this.assertPackaged(project);
107
+ await this.docker.build(project.projectRoot, {
108
+ cwd: project.projectRoot,
109
+ dockerfile: _nodepath.default.join(project.projectRoot, dockerfile),
110
+ tags,
111
+ buildArgs,
112
+ secrets
113
+ });
114
+ const shouldPush = options.push || dockerConfig.push;
115
+ if (shouldPush && !options.dryRun) {
116
+ for (const tag of tags){
117
+ await this.docker.push(tag, {
118
+ cwd: project.projectRoot
119
+ });
103
120
  }
121
+ } else if (shouldPush && options.dryRun) {
122
+ this.#logger.info(`[dry-run] Skipping push for ${project.name}`);
104
123
  }
105
124
  return {
106
125
  projectName: project.name,
107
126
  image,
108
127
  tags,
109
128
  succeeded: true,
110
- message: options.dryRun ? "Dry run" : `Built ${image}`
129
+ message: options.dryRun ? `Built ${image} (not pushed)` : `Built ${image}`
111
130
  };
112
131
  } catch (reason) {
113
132
  const message = (0, _errors.formatUnknownError)(reason);
@@ -129,8 +148,30 @@ class Docker {
129
148
  }
130
149
  return result;
131
150
  }
132
- defaultImageName(projectName) {
133
- return `${this.#defaultRegistry}/${this.normalizeDockerRepository(projectName)}`;
151
+ /**
152
+ * Keep FORGE_DOCKER_EXTRA_TAGS_JSON scoped to this image so multi-image
153
+ * publishes do not stamp create:latest onto the app Dev Container (and vice versa).
154
+ */ extraTagsForImage(image, tags) {
155
+ const prefix = `${image}:`;
156
+ const seen = new Set();
157
+ const result = [];
158
+ for (const tag of tags){
159
+ if (tag === image || tag.startsWith(prefix)) {
160
+ if (!seen.has(tag)) {
161
+ seen.add(tag);
162
+ result.push(tag);
163
+ }
164
+ }
165
+ }
166
+ return result;
167
+ }
168
+ defaultImageName(projectName, workspacePackageJson) {
169
+ const repositoryPath = process.env.FORGE_DOCKER_NAMESPACE?.trim() || workspacePackageJson.getRepositoryFullName() || this.normalizeDockerRepository(projectName);
170
+ const projectSlug = this.normalizeProjectSlug(projectName);
171
+ if (repositoryPath.includes("/") && projectSlug !== "") {
172
+ return `${this.#defaultRegistry}/${repositoryPath}/${projectSlug}`;
173
+ }
174
+ return `${this.#defaultRegistry}/${repositoryPath}`;
134
175
  }
135
176
  normalizeDockerRepository(name) {
136
177
  const repository = name.replace(/^@/, "").split("/").map((segment)=>segment.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "")).filter(Boolean).join("/");
@@ -139,6 +180,14 @@ class Docker {
139
180
  }
140
181
  return repository;
141
182
  }
183
+ normalizeProjectSlug(name) {
184
+ const unscoped = name.includes("/") ? name.split("/").at(-1) ?? name : name;
185
+ const slug = unscoped.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-+|-+$/g, "");
186
+ if (slug === "") {
187
+ throw new _errors.ForgeError(`Could not derive a Docker project slug from project name "${name}"`);
188
+ }
189
+ return slug;
190
+ }
142
191
  parseJsonEnv(name, fallback) {
143
192
  const value = process.env[name];
144
193
  if (value == null || value.trim() === "") {
@@ -155,8 +204,6 @@ Docker = _ts_decorate([
155
204
  (0, _decorators.injectable)(),
156
205
  _ts_metadata("design:type", Function),
157
206
  _ts_metadata("design:paramtypes", [
158
- typeof _mesh.Workspace === "undefined" ? Object : _mesh.Workspace
207
+ typeof _workspace.Workspace === "undefined" ? Object : _workspace.Workspace
159
208
  ])
160
209
  ], Docker);
161
-
162
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9hY3Rpb25zL2RvY2tlci5hY3Rpb24udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG4vLyBiaW9tZS1pZ25vcmUgbGludC9zdHlsZS91c2VJbXBvcnRUeXBlOiA8REk+XG5pbXBvcnQgeyBXb3Jrc3BhY2UgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB0eXBlIHsgQWN0aW9uLCBSZXN1bHRTdGF0dXMgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgQWN0aW9uUmVzcG9uc2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NsaVwiO1xuaW1wb3J0IHsgRG9ja2VyIGFzIERvY2tlckludGVyb3AgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2ludGVyb3BcIjtcbmltcG9ydCB7IGlvIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9pb1wiO1xuaW1wb3J0IHsgc2NyaWJlIH0gZnJvbSBcIkBkZWNvaGVyZS9zY3JpYmVcIjtcbmltcG9ydCB7IEZvcmdlRXJyb3IsIGZvcm1hdFVua25vd25FcnJvciB9IGZyb20gXCIuLi9lcnJvcnMuanNcIjtcblxuZXhwb3J0IHR5cGUgRG9ja2VyT3B0aW9ucyA9IHtcblx0Y29uZmlndXJhdGlvbjogc3RyaW5nO1xuXHRkcnlSdW4/OiBib29sZWFuO1xuXHRwdXNoPzogYm9vbGVhbjtcbn07XG5cbmV4cG9ydCB0eXBlIERvY2tlclJlc3BvbnNlID0gUmVzdWx0U3RhdHVzICYge1xuXHRwcm9qZWN0TmFtZTogc3RyaW5nO1xuXHRpbWFnZTogc3RyaW5nO1xuXHR0YWdzOiBzdHJpbmdbXTtcblx0bWVzc2FnZTogc3RyaW5nO1xufTtcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERvY2tlciBpbXBsZW1lbnRzIEFjdGlvbjxEb2NrZXJPcHRpb25zPiB7XG5cdCNsb2dnZXIgPSBzY3JpYmUubG9nZ2VyKERvY2tlci5uYW1lKTtcblx0cHJpdmF0ZSByZWFkb25seSBkb2NrZXIgPSBuZXcgRG9ja2VySW50ZXJvcCgpO1xuXHRyZWFkb25seSAjZGVmYXVsdFJlZ2lzdHJ5ID0gcHJvY2Vzcy5lbnYuRk9SR0VfRE9DS0VSX1JFR0lTVFJZPy50cmltKCkgfHwgXCJnaGNyLmlvXCI7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgd29ya3NwYWNlOiBXb3Jrc3BhY2UpIHt9XG5cblx0cHVibGljIGFzeW5jIHJ1bihvcHRpb25zOiBEb2NrZXJPcHRpb25zKTogUHJvbWlzZTxBY3Rpb25SZXNwb25zZTxEb2NrZXJSZXNwb25zZT4+IHtcblx0XHRjb25zdCBwcm9qZWN0cyA9IGF3YWl0IHRoaXMuZ2V0RG9ja2VyUHJvamVjdHMoXG5cdFx0XHR0aGlzLndvcmtzcGFjZS5nZXRQcm9qZWN0cyhvcHRpb25zLmNvbmZpZ3VyYXRpb24pLFxuXHRcdCk7XG5cdFx0aWYgKHByb2plY3RzLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0dGhyb3cgbmV3IEZvcmdlRXJyb3IoYE5vIHByb2plY3RzIGZvdW5kIHdpdGggYSBEb2NrZXJmaWxlYCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgdmVyc2lvbiA9IGF3YWl0IHRoaXMud29ya3NwYWNlLmdldFZlcnNpb24oKTtcblx0XHRjb25zdCByZXNwb25zZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdHByb2plY3RzLm1hcChhc3luYyAocHJvamVjdCkgPT4gYXdhaXQgdGhpcy5idWlsZFByb2plY3QocHJvamVjdCwgdmVyc2lvbiwgb3B0aW9ucykpLFxuXHRcdCk7XG5cdFx0Y29uc3QgZmFpbGVkID0gcmVzcG9uc2VzLmZpbHRlcigocmVzcG9uc2UpID0+ICFyZXNwb25zZS5zdWNjZWVkZWQpO1xuXHRcdGlmIChmYWlsZWQubGVuZ3RoID4gMCkge1xuXHRcdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLkVycm9yKERvY2tlci5uYW1lLCByZXNwb25zZXMpO1xuXHRcdH1cblx0XHRyZXR1cm4gQWN0aW9uUmVzcG9uc2UuU3VjY2VzcyhEb2NrZXIubmFtZSwgcmVzcG9uc2VzKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZ2V0RG9ja2VyUHJvamVjdHMocHJvamVjdHM6IHJlYWRvbmx5IFByb2plY3RbXSkge1xuXHRcdGNvbnN0IHJlc3VsdDogUHJvamVjdFtdID0gW107XG5cdFx0Zm9yIChjb25zdCBwcm9qZWN0IG9mIHByb2plY3RzKSB7XG5cdFx0XHRjb25zdCBkb2NrZXJmaWxlID0gcHJvamVjdC5kb2NrZXJDb25maWc/LmRvY2tlcmZpbGUgPz8gXCJEb2NrZXJmaWxlXCI7XG5cdFx0XHRjb25zdCBkb2NrZXJmaWxlUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LnByb2plY3RSb290LCBkb2NrZXJmaWxlKTtcblx0XHRcdGlmICghKGF3YWl0IGlvLmZpbGVFeGlzdHMoZG9ja2VyZmlsZVBhdGgpKSkge1xuXHRcdFx0XHR0aGlzLiNsb2dnZXIuaW5mbyhgU2tpcHBpbmcgJHtwcm9qZWN0Lm5hbWV9OiBtaXNzaW5nICR7ZG9ja2VyZmlsZX1gKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHJlc3VsdC5wdXNoKHByb2plY3QpO1xuXHRcdH1cblx0XHRyZXR1cm4gcmVzdWx0O1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBidWlsZFByb2plY3QoXG5cdFx0cHJvamVjdDogUHJvamVjdCxcblx0XHR2ZXJzaW9uOiBzdHJpbmcsXG5cdFx0b3B0aW9uczogRG9ja2VyT3B0aW9ucyxcblx0KTogUHJvbWlzZTxEb2NrZXJSZXNwb25zZT4ge1xuXHRcdGNvbnN0IGRvY2tlckNvbmZpZyA9IHByb2plY3QuZG9ja2VyQ29uZmlnID8/IHt9O1xuXHRcdGNvbnN0IGVudkJ1aWxkQXJncyA9IHRoaXMucGFyc2VKc29uRW52PFJlY29yZDxzdHJpbmcsIHN0cmluZz4+KFxuXHRcdFx0XCJGT1JHRV9ET0NLRVJfQlVJTERfQVJHU19KU09OXCIsXG5cdFx0XHR7fSxcblx0XHQpO1xuXHRcdGNvbnN0IGVudlNlY3JldHMgPSB0aGlzLnBhcnNlSnNvbkVudjxSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+Pihcblx0XHRcdFwiRk9SR0VfRE9DS0VSX1NFQ1JFVFNfSlNPTlwiLFxuXHRcdFx0e30sXG5cdFx0KTtcblx0XHRjb25zdCBlbnZUYWdzID0gdGhpcy5wYXJzZUpzb25FbnY8c3RyaW5nW10+KFwiRk9SR0VfRE9DS0VSX0VYVFJBX1RBR1NfSlNPTlwiLCBbXSk7XG5cblx0XHRjb25zdCBpbWFnZSA9IGRvY2tlckNvbmZpZy5pbWFnZSA/PyB0aGlzLmRlZmF1bHRJbWFnZU5hbWUocHJvamVjdC5uYW1lKTtcblx0XHRjb25zdCBkb2NrZXJmaWxlID0gZG9ja2VyQ29uZmlnLmRvY2tlcmZpbGUgPz8gXCJEb2NrZXJmaWxlXCI7XG5cdFx0Y29uc3QgdGFncyA9IFtgJHtpbWFnZX06JHt2ZXJzaW9ufWAsIC4uLihkb2NrZXJDb25maWcudGFncyA/PyBbXSksIC4uLmVudlRhZ3NdO1xuXHRcdGNvbnN0IGJ1aWxkQXJncyA9IHRoaXMuaW50ZXJwb2xhdGVCdWlsZEFyZ3MoXG5cdFx0XHR7IC4uLihkb2NrZXJDb25maWcuYnVpbGRBcmdzID8/IHt9KSwgLi4uZW52QnVpbGRBcmdzIH0sXG5cdFx0XHR2ZXJzaW9uLFxuXHRcdCk7XG5cdFx0Y29uc3Qgc2VjcmV0cyA9IHsgLi4uKGRvY2tlckNvbmZpZy5zZWNyZXRzID8/IHt9KSwgLi4uZW52U2VjcmV0cyB9O1xuXG5cdFx0dGhpcy4jbG9nZ2VyLmluZm8oYCR7b3B0aW9ucy5kcnlSdW4gPyBcIltkcnktcnVuXSBcIiA6IFwiXCJ9QnVpbGRpbmcgJHtwcm9qZWN0Lm5hbWV9YCk7XG5cdFx0dHJ5IHtcblx0XHRcdGlmICghb3B0aW9ucy5kcnlSdW4pIHtcblx0XHRcdFx0YXdhaXQgdGhpcy5kb2NrZXIuYnVpbGQocHJvamVjdC5wcm9qZWN0Um9vdCwge1xuXHRcdFx0XHRcdGN3ZDogcHJvamVjdC5wcm9qZWN0Um9vdCxcblx0XHRcdFx0XHRkb2NrZXJmaWxlOiBwYXRoLmpvaW4ocHJvamVjdC5wcm9qZWN0Um9vdCwgZG9ja2VyZmlsZSksXG5cdFx0XHRcdFx0dGFncyxcblx0XHRcdFx0XHRidWlsZEFyZ3MsXG5cdFx0XHRcdFx0c2VjcmV0cyxcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0aWYgKG9wdGlvbnMucHVzaCB8fCBkb2NrZXJDb25maWcucHVzaCkge1xuXHRcdFx0XHRcdGZvciAoY29uc3QgdGFnIG9mIHRhZ3MpIHtcblx0XHRcdFx0XHRcdGF3YWl0IHRoaXMuZG9ja2VyLnB1c2godGFnLCB7IGN3ZDogcHJvamVjdC5wcm9qZWN0Um9vdCB9KTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cHJvamVjdE5hbWU6IHByb2plY3QubmFtZSxcblx0XHRcdFx0aW1hZ2UsXG5cdFx0XHRcdHRhZ3MsXG5cdFx0XHRcdHN1Y2NlZWRlZDogdHJ1ZSxcblx0XHRcdFx0bWVzc2FnZTogb3B0aW9ucy5kcnlSdW4gPyBcIkRyeSBydW5cIiA6IGBCdWlsdCAke2ltYWdlfWAsXG5cdFx0XHR9O1xuXHRcdH0gY2F0Y2ggKHJlYXNvbikge1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IGZvcm1hdFVua25vd25FcnJvcihyZWFzb24pO1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0cHJvamVjdE5hbWU6IHByb2plY3QubmFtZSxcblx0XHRcdFx0aW1hZ2UsXG5cdFx0XHRcdHRhZ3MsXG5cdFx0XHRcdHN1Y2NlZWRlZDogZmFsc2UsXG5cdFx0XHRcdG1lc3NhZ2UsXG5cdFx0XHRcdGVycm9yOiBgJHtwcm9qZWN0Lm5hbWV9OiAke21lc3NhZ2V9YCxcblx0XHRcdH07XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBpbnRlcnBvbGF0ZUJ1aWxkQXJncyhcblx0XHRidWlsZEFyZ3M6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gfCB1bmRlZmluZWQsXG5cdFx0dmVyc2lvbjogc3RyaW5nLFxuXHQpIHtcblx0XHRjb25zdCByZXN1bHQ6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblx0XHRjb25zdCB2ZXJzaW9uUGxhY2Vob2xkZXIgPSBcIiRcIiArIFwie3ZlcnNpb259XCI7XG5cdFx0Zm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoYnVpbGRBcmdzID8/IHt9KSkge1xuXHRcdFx0cmVzdWx0W2tleV0gPSB2YWx1ZS5zcGxpdCh2ZXJzaW9uUGxhY2Vob2xkZXIpLmpvaW4odmVyc2lvbik7XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRwcml2YXRlIGRlZmF1bHRJbWFnZU5hbWUocHJvamVjdE5hbWU6IHN0cmluZykge1xuXHRcdHJldHVybiBgJHt0aGlzLiNkZWZhdWx0UmVnaXN0cnl9LyR7dGhpcy5ub3JtYWxpemVEb2NrZXJSZXBvc2l0b3J5KHByb2plY3ROYW1lKX1gO1xuXHR9XG5cblx0cHJpdmF0ZSBub3JtYWxpemVEb2NrZXJSZXBvc2l0b3J5KG5hbWU6IHN0cmluZykge1xuXHRcdGNvbnN0IHJlcG9zaXRvcnkgPSBuYW1lXG5cdFx0XHQucmVwbGFjZSgvXkAvLCBcIlwiKVxuXHRcdFx0LnNwbGl0KFwiL1wiKVxuXHRcdFx0Lm1hcCgoc2VnbWVudCkgPT5cblx0XHRcdFx0c2VnbWVudFxuXHRcdFx0XHRcdC50b0xvd2VyQ2FzZSgpXG5cdFx0XHRcdFx0LnJlcGxhY2UoL1teYS16MC05XSsvZywgXCItXCIpXG5cdFx0XHRcdFx0LnJlcGxhY2UoL14tK3wtKyQvZywgXCJcIiksXG5cdFx0XHQpXG5cdFx0XHQuZmlsdGVyKEJvb2xlYW4pXG5cdFx0XHQuam9pbihcIi9cIik7XG5cblx0XHRpZiAocmVwb3NpdG9yeSA9PT0gXCJcIikge1xuXHRcdFx0dGhyb3cgbmV3IEZvcmdlRXJyb3IoYENvdWxkIG5vdCBkZXJpdmUgYSBEb2NrZXIgcmVwb3NpdG9yeSBmcm9tIHByb2plY3QgbmFtZSBcIiR7bmFtZX1cImApO1xuXHRcdH1cblxuXHRcdHJldHVybiByZXBvc2l0b3J5O1xuXHR9XG5cblx0cHJpdmF0ZSBwYXJzZUpzb25FbnY8VD4obmFtZTogc3RyaW5nLCBmYWxsYmFjazogVCk6IFQge1xuXHRcdGNvbnN0IHZhbHVlID0gcHJvY2Vzcy5lbnZbbmFtZV07XG5cdFx0aWYgKHZhbHVlID09IG51bGwgfHwgdmFsdWUudHJpbSgpID09PSBcIlwiKSB7XG5cdFx0XHRyZXR1cm4gZmFsbGJhY2s7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdHJldHVybiBKU09OLnBhcnNlKHZhbHVlKSBhcyBUO1xuXHRcdH0gY2F0Y2ggKHJlYXNvbikge1xuXHRcdFx0dGhyb3cgbmV3IEZvcmdlRXJyb3IoYEludmFsaWQgSlNPTiBpbiAke25hbWV9OiAke2Zvcm1hdFVua25vd25FcnJvcihyZWFzb24pfWApO1xuXHRcdH1cblx0fVxufVxuIl0sIm5hbWVzIjpbIkRvY2tlciIsInNjcmliZSIsImxvZ2dlciIsIm5hbWUiLCJkb2NrZXIiLCJEb2NrZXJJbnRlcm9wIiwicHJvY2VzcyIsImVudiIsIkZPUkdFX0RPQ0tFUl9SRUdJU1RSWSIsInRyaW0iLCJ3b3Jrc3BhY2UiLCJydW4iLCJvcHRpb25zIiwicHJvamVjdHMiLCJnZXREb2NrZXJQcm9qZWN0cyIsImdldFByb2plY3RzIiwiY29uZmlndXJhdGlvbiIsImxlbmd0aCIsIkZvcmdlRXJyb3IiLCJ2ZXJzaW9uIiwiZ2V0VmVyc2lvbiIsInJlc3BvbnNlcyIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJwcm9qZWN0IiwiYnVpbGRQcm9qZWN0IiwiZmFpbGVkIiwiZmlsdGVyIiwicmVzcG9uc2UiLCJzdWNjZWVkZWQiLCJBY3Rpb25SZXNwb25zZSIsIkVycm9yIiwiU3VjY2VzcyIsInJlc3VsdCIsImRvY2tlcmZpbGUiLCJkb2NrZXJDb25maWciLCJkb2NrZXJmaWxlUGF0aCIsInBhdGgiLCJqb2luIiwicHJvamVjdFJvb3QiLCJpbyIsImZpbGVFeGlzdHMiLCJpbmZvIiwicHVzaCIsImVudkJ1aWxkQXJncyIsInBhcnNlSnNvbkVudiIsImVudlNlY3JldHMiLCJlbnZUYWdzIiwiaW1hZ2UiLCJkZWZhdWx0SW1hZ2VOYW1lIiwidGFncyIsImJ1aWxkQXJncyIsImludGVycG9sYXRlQnVpbGRBcmdzIiwic2VjcmV0cyIsImRyeVJ1biIsImJ1aWxkIiwiY3dkIiwidGFnIiwicHJvamVjdE5hbWUiLCJtZXNzYWdlIiwicmVhc29uIiwiZm9ybWF0VW5rbm93bkVycm9yIiwiZXJyb3IiLCJ2ZXJzaW9uUGxhY2Vob2xkZXIiLCJrZXkiLCJ2YWx1ZSIsIk9iamVjdCIsImVudHJpZXMiLCJzcGxpdCIsIm5vcm1hbGl6ZURvY2tlclJlcG9zaXRvcnkiLCJyZXBvc2l0b3J5IiwicmVwbGFjZSIsInNlZ21lbnQiLCJ0b0xvd2VyQ2FzZSIsIkJvb2xlYW4iLCJmYWxsYmFjayIsIkpTT04iLCJwYXJzZSJdLCJtYXBwaW5ncyI6Ijs7OzsrQkEwQmFBOzs7ZUFBQUE7OztpRUExQkk7NEJBQ1U7c0JBR0Q7cUJBRUs7eUJBQ1M7b0JBQ3JCO3dCQUNJO3dCQUN3Qjs7Ozs7Ozs7Ozs7Ozs7O0FBZ0J4QyxNQUFNQTs7SUFDWixDQUFBLE1BQU8sR0FBR0MsY0FBTSxDQUFDQyxNQUFNLENBQUNGLE9BQU9HLElBQUksRUFBRTtJQUNwQkMsU0FBUyxJQUFJQyxlQUFhLEdBQUc7SUFDckMsQ0FBQSxlQUFnQixHQUFHQyxRQUFRQyxHQUFHLENBQUNDLHFCQUFxQixFQUFFQyxVQUFVLFVBQVU7SUFFbkYsWUFBbUIsQUFBaUJDLFNBQW9CLENBQUU7YUFBdEJBLFlBQUFBO0lBQXVCO0lBRTNELE1BQWFDLElBQUlDLE9BQXNCLEVBQTJDO1FBQ2pGLE1BQU1DLFdBQVcsTUFBTSxJ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
@@ -10,9 +10,12 @@ _export_star(require("./dependency-report.action.js"), exports);
10
10
  _export_star(require("./dependency-sync.action.js"), exports);
11
11
  _export_star(require("./docker.action.js"), exports);
12
12
  _export_star(require("./link.action.js"), exports);
13
+ _export_star(require("./package.action.js"), exports);
14
+ _export_star(require("./paths.action.js"), exports);
13
15
  _export_star(require("./publish.action.js"), exports);
14
16
  _export_star(require("./sync-lock-file.action.js"), exports);
15
17
  _export_star(require("./tag.action.js"), exports);
18
+ _export_star(require("./typecheck.action.js"), exports);
16
19
  _export_star(require("./unlink.action.js"), exports);
17
20
  _export_star(require("./version.action.js"), exports);
18
21
  _export_star(require("./watch.action.js"), exports);
@@ -29,5 +32,3 @@ function _export_star(from, to) {
29
32
  });
30
33
  return from;
31
34
  }
32
-
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9hY3Rpb25zL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2J1aWxkLmFjdGlvbi5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vY2xlYW4uYWN0aW9uLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb21taXQuYWN0aW9uLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9jb3B5LmFjdGlvbi5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vZGVwZW5kZW5jeS1yZXBvcnQuYWN0aW9uLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kZXBlbmRlbmN5LXN5bmMuYWN0aW9uLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9kb2NrZXIuYWN0aW9uLmpzXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9saW5rLmFjdGlvbi5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vcHVibGlzaC5hY3Rpb24uanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3N5bmMtbG9jay1maWxlLmFjdGlvbi5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGFnLmFjdGlvbi5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdW5saW5rLmFjdGlvbi5qc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdmVyc2lvbi5hY3Rpb24uanNcIjtcbmV4cG9ydCAqIGZyb20gXCIuL3dhdGNoLmFjdGlvbi5qc1wiO1xuIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7cUJBQWM7cUJBQ0E7cUJBQ0E7cUJBQ0E7cUJBQ0E7cUJBQ0E7cUJBQ0E7cUJBQ0E7cUJBQ0E7cUJBQ0E7cUJBQ0E7cUJBQ0E7cUJBQ0E7cUJBQ0EifQ==
@@ -22,8 +22,8 @@ _export(exports, {
22
22
  const _promises = /*#__PURE__*/ _interop_require_default(require("node:fs/promises"));
23
23
  const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
24
24
  const _decorators = require("@decohere/crucible/decorators");
25
- const _mesh = require("@decohere/mesh");
26
- const _cli = require("@decohere/nexus/cli");
25
+ const _workspace = require("@decohere/workspace");
26
+ const _cli = require("@decohere/devkit/cli");
27
27
  const _scribe = require("@decohere/scribe");
28
28
  require("../extensions/project.extensions.js");
29
29
  const _errors = require("../errors.js");
@@ -149,8 +149,6 @@ Link = _ts_decorate([
149
149
  (0, _decorators.injectable)(),
150
150
  _ts_metadata("design:type", Function),
151
151
  _ts_metadata("design:paramtypes", [
152
- typeof _mesh.Workspace === "undefined" ? Object : _mesh.Workspace
152
+ typeof _workspace.Workspace === "undefined" ? Object : _workspace.Workspace
153
153
  ])
154
154
  ], Link);
155
-
156
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9hY3Rpb25zL2xpbmsuYWN0aW9uLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuLy8gYmlvbWUtaWdub3JlIGxpbnQvc3R5bGUvdXNlSW1wb3J0VHlwZTogPERJPlxuaW1wb3J0IHsgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgdHlwZSB7IEFjdGlvbiB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBBY3Rpb25SZXNwb25zZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBzY3JpYmUgfSBmcm9tIFwiQGRlY29oZXJlL3NjcmliZVwiO1xuaW1wb3J0IFwiLi4vZXh0ZW5zaW9ucy9wcm9qZWN0LmV4dGVuc2lvbnMuanNcIjtcbmltcG9ydCB7IEZvcmdlRXJyb3IgfSBmcm9tIFwiLi4vZXJyb3JzLmpzXCI7XG5cbmV4cG9ydCBjb25zdCBMSU5LX01BTklGRVNUID0gXCIuZm9yZ2UtbGluay5qc29uXCI7XG5cbmV4cG9ydCB0eXBlIExpbmtPcHRpb25zID0ge1xuXHRjb25maWd1cmF0aW9uOiBzdHJpbmc7XG5cdHRhcmdldERpcjogc3RyaW5nO1xufTtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfTElOS19DT05GSUdVUkFUSU9OID0gXCJsaW5rXCI7XG5cbmV4cG9ydCB0eXBlIExpbmtNYW5pZmVzdCA9IHtcblx0d29ya3NwYWNlUm9vdDogc3RyaW5nO1xuXHRwZWVyTm9kZU1vZHVsZXNEaXI/OiBzdHJpbmc7XG5cdGxpbmtzOiBBcnJheTx7IHBhY2thZ2VOYW1lOiBzdHJpbmc7IHN5bWxpbmtQYXRoOiBzdHJpbmc7IG9yaWdpbmFsUGF0aDogc3RyaW5nIHwgbnVsbCB9Pjtcbn07XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBMaW5rIGltcGxlbWVudHMgQWN0aW9uPExpbmtPcHRpb25zPiB7XG5cdCNsb2dnZXIgPSBzY3JpYmUubG9nZ2VyKExpbmsubmFtZSk7XG5cblx0cHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgcmVhZG9ubHkgd29ya3NwYWNlOiBXb3Jrc3BhY2UpIHt9XG5cblx0cHVibGljIHJ1biA9IGFzeW5jIChvcHRpb25zOiBMaW5rT3B0aW9ucyk6IFByb21pc2U8QWN0aW9uUmVzcG9uc2U+ID0+IHtcblx0XHRjb25zdCB0YXJnZXREaXIgPSBwYXRoLnJlc29sdmUob3B0aW9ucy50YXJnZXREaXIpO1xuXHRcdGNvbnN0IG5vZGVNb2R1bGVzRGlyID0gcGF0aC5qb2luKHRhcmdldERpciwgXCJub2RlX21vZHVsZXNcIik7XG5cblx0XHRjb25zdCBzdGF0ID0gYXdhaXQgZnMuc3RhdChub2RlTW9kdWxlc0RpcikuY2F0Y2goKCkgPT4gbnVsbCk7XG5cdFx0aWYgKHN0YXQgPT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgbmV3IEZvcmdlRXJyb3IoXG5cdFx0XHRcdGBub2RlX21vZHVsZXMgbm90IGZvdW5kIGluIFwiJHt0YXJnZXREaXJ9XCIuIFJ1biBwbnBtIGluc3RhbGwgZmlyc3QuYCxcblx0XHRcdCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcHJvamVjdHMgPSB0aGlzLndvcmtzcGFjZS5nZXRQcm9qZWN0cyhvcHRpb25zLmNvbmZpZ3VyYXRpb24pO1xuXHRcdGlmIChwcm9qZWN0cy5sZW5ndGggPT09IDApIHtcblx0XHRcdHRocm93IG5ldyBGb3JnZUVycm9yKGBObyBwcm9qZWN0cyBmb3VuZCBmb3IgY29uZmlndXJhdGlvbiBcIiR7b3B0aW9ucy5jb25maWd1cmF0aW9ufVwiYCk7XG5cdFx0fVxuXG5cdFx0Ly8gTG9hZCBhbnkgZXhpc3RpbmcgbWFuaWZlc3Qgc28gb3JpZ2luYWxQYXRoIHZhbHVlcyBhcmUgcHJlc2VydmVkIG9uIHJlLWxpbmtcblx0XHRjb25zdCBtYW5pZmVzdFBhdGggPSBwYXRoLmpvaW4odGFyZ2V0RGlyLCBMSU5LX01BTklGRVNUKTtcblx0XHRjb25zdCBleGlzdGluZ01hbmlmZXN0VGV4dCA9IGF3YWl0IGZzLnJlYWRGaWxlKG1hbmlmZXN0UGF0aCwgXCJ1dGY4XCIpLmNhdGNoKCgpID0+IG51bGwpO1xuXHRcdGNvbnN0IGV4aXN0aW5nTWFuaWZlc3Q6IExpbmtNYW5pZmVzdCB8IG51bGwgPVxuXHRcdFx0ZXhpc3RpbmdNYW5pZmVzdFRleHQgIT0gbnVsbCA/IEpTT04ucGFyc2UoZXhpc3RpbmdNYW5pZmVzdFRleHQpIDogbnVsbDtcblxuXHRcdGNvbnN0IG1hbmlmZXN0OiBMaW5rTWFuaWZlc3QgPSB7XG5cdFx0XHR3b3Jrc3BhY2VSb290OiB0aGlzLndvcmtzcGFjZS5yb290RGlyLFxuXHRcdFx0bGlua3M6IFtdLFxuXHRcdH07XG5cblx0XHRmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcblx0XHRcdGNvbnN0IHBrZyA9IGF3YWl0IHByb2plY3QuZ2V0UGFja2FnZUpzb24oKTtcblx0XHRcdGNvbnN0IHBhY2thZ2VOYW1lID0gcGtnLm5hbWU7XG5cdFx0XHRpZiAoIXBhY2thZ2VOYW1lKSB7XG5cdFx0XHRcdHRoaXMuI2xvZ2dlci50cmFjZShgU2tpcHBpbmcgcHJvamVjdCBcIiR7cHJvamVjdC5uYW1lfVwiIOKAlCBubyBwYWNrYWdlIG5hbWVgKTtcblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJlc29sdmUgdGhlIGJ1aWxkIG91dHB1dCBkaXJlY3RvcnkgKG5vIHRhcmdldCBhcmcg4oCUIGRlYnVnIGNvbmZpZyBpcyBub3QgcGFja2VkKVxuXHRcdFx0Y29uc3Qgb3V0RGlyID0gcHJvamVjdC5nZXRPdXREaXIoKTtcblx0XHRcdGNvbnN0IGFic29sdXRlT3V0RGlyID0gcGF0aC5yZXNvbHZlKG91dERpcik7XG5cblx0XHRcdC8vIFByZS1jcmVhdGUgdGhlIG91dHB1dCBkaXIgc28gdGhlIHN5bWxpbmsgaXMgdmFsaWQgZXZlbiBiZWZvcmUgYSBidWlsZCBjb21wbGV0ZXMuXG5cdFx0XHRhd2FpdCBmcy5ta2RpcihhYnNvbHV0ZU91dERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cblx0XHRcdC8vIENvbXB1dGUgc3ltbGluayBwYXRoIGluc2lkZSB0YXJnZXQgbm9kZV9tb2R1bGVzXG5cdFx0XHRjb25zdCBzeW1saW5rUGF0aCA9IHBhdGguam9pbihub2RlTW9kdWxlc0RpciwgLi4ucGFja2FnZU5hbWUuc3BsaXQoXCIvXCIpKTtcblx0XHRcdGNvbnN0IHN5bWxpbmtQYXJlbnQgPSBwYXRoLmRpcm5hbWUoc3ltbGlua1BhdGgpO1xuXG5cdFx0XHQvLyBDYXB0dXJlIGFueSBleGlzdGluZyBlbnRyeSBzbyB3ZSBjYW4gcmVzdG9yZSBpdCBvbiB1bmxpbmsuXG5cdFx0XHQvLyBJZiBhIG1hbmlmZXN0IGFscmVhZHkgZXhpc3RzIGZvciB0aGlzIHBhY2thZ2UsIHByZXNlcnZlIGl0cyBvcmlnaW5hbFBhdGgg4oCUXG5cdFx0XHQvLyB0aGUgY3VycmVudCBzeW1saW5rIGlzIG91ciBvd24gYW5kIG11c3Qgbm90IGJlIHRyZWF0ZWQgYXMgdGhlIG9yaWdpbmFsLlxuXHRcdFx0bGV0IG9yaWdpbmFsUGF0aDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cdFx0XHRjb25zdCBleGlzdGluZ1N0YXQgPSBhd2FpdCBmcy5sc3RhdChzeW1saW5rUGF0aCkuY2F0Y2goKCkgPT4gbnVsbCk7XG5cdFx0XHRpZiAoZXhpc3RpbmdTdGF0ICE9IG51bGwpIHtcblx0XHRcdFx0Y29uc3QgZXhpc3RpbmdFbnRyeSA9IGV4aXN0aW5nTWFuaWZlc3Q/LmxpbmtzLmZpbmQoXG5cdFx0XHRcdFx0KGwpID0+IGwucGFja2FnZU5hbWUgPT09IHBhY2thZ2VOYW1lLFxuXHRcdFx0XHQpO1xuXHRcdFx0XHRpZiAoZXhpc3RpbmdFbnRyeSAhPSBudWxsKSB7XG5cdFx0XHRcdFx0Ly8gQWxyZWFkeSBsaW5rZWQg4oCUIHByZXNlcnZlIHRoZSByZWNvcmRlZCBvcmlnaW5hbFBhdGggYW5kIHJlcGxhY2UgdGhlIHN5bWxpbmtcblx0XHRcdFx0XHRvcmlnaW5hbFBhdGggPSBleGlzdGluZ0VudHJ5Lm9yaWdpbmFsUGF0aDtcblx0XHRcdFx0XHRpZiAoZXhpc3RpbmdTdGF0LmlzU3ltYm9saWNMaW5rKCkpIHtcblx0XHRcdFx0XHRcdGF3YWl0IGZzLnVubGluayhzeW1saW5rUGF0aCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9IGVsc2UgaWYgKGV4aXN0aW5nU3RhdC5pc1N5bWJvbGljTGluaygpKSB7XG5cdFx0XHRcdFx0b3JpZ2luYWxQYXRoID0gYXdhaXQgZnMucmVhZGxpbmsoc3ltbGlua1BhdGgpO1xuXHRcdFx0XHRcdGF3YWl0IGZzLnVubGluayhzeW1saW5rUGF0aCk7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0Ly8gUmVhbCBkaXJlY3Rvcnkg4oCUIGJhY2sgaXQgdXAgYnkgcmVuYW1pbmdcblx0XHRcdFx0XHRvcmlnaW5hbFBhdGggPSBgJHtzeW1saW5rUGF0aH0uX19mb3JnZV9iYWNrdXBfX2A7XG5cdFx0XHRcdFx0YXdhaXQgZnMucmVuYW1lKHN5bWxpbmtQYXRoLCBvcmlnaW5hbFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGF3YWl0IGZzLm1rZGlyKHN5bWxpbmtQYXJlbnQsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXHRcdFx0YXdhaXQgZnMuc3ltbGluayhhYnNvbHV0ZU91dERpciwgc3ltbGlua1BhdGgsIFwiZGlyXCIpO1xuXG5cdFx0XHRtYW5pZmVzdC5saW5rcy5wdXNoKHsgcGFja2FnZU5hbWUsIHN5bWxpbmtQYXRoLCBvcmlnaW5hbFBhdGggfSk7XG5cdFx0XHR0aGlzLiNsb2dnZXIuaW5mbyhgTGlua2VkICR7cGFja2FnZU5hbWV9IOKGkiAke2Fic29sdXRlT3V0RGlyfWApO1xuXHRcdH1cblxuXHRcdC8vIENyZWF0ZSBhIHBlZXIgbm9kZV9tb2R1bGVzIGF0IHRoZSBidWlsZCBvdXRwdXQgcm9vdCBzbyBOb2RlIGNhbiByZXNvbHZlXG5cdFx0Ly8gYmFyZSBzcGVjaWZpZXJzIGZyb20gdGhlIHJlYWwgKG5vbi1zeW1saW5rKSBwYXRocyBvZiBsaW5rZWQgcGFja2FnZXMuXG5cdFx0aWYgKG1hbmlmZXN0LmxpbmtzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IGJ1aWxkUm9vdCA9IHBhdGgucmVzb2x2ZShwcm9qZWN0c1swXS5nZXRSb290T3V0KCkpO1xuXHRcdFx0Y29uc3QgcGVlck5vZGVNb2R1bGVzRGlyID0gcGF0aC5qb2luKGJ1aWxkUm9vdCwgXCJub2RlX21vZHVsZXNcIik7XG5cdFx0XHRhd2FpdCBmcy5ybShwZWVyTm9kZU1vZHVsZXNEaXIsIHsgcmVjdXJzaXZlOiB0cnVlLCBmb3JjZTogdHJ1ZSB9KTtcblx0XHRcdGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuXHRcdFx0XHRjb25zdCBwa2cgPSBhd2FpdCBwcm9qZWN0LmdldFBhY2thZ2VKc29uKCk7XG5cdFx0XHRcdGlmICghcGtnLm5hbWUpIGNvbnRpbnVlO1xuXHRcdFx0XHRjb25zdCBvdXREaXIgPSBwYXRoLnJlc29sdmUocHJvamVjdC5nZXRPdXREaXIoKSk7XG5cdFx0XHRcdGNvbnN0IHBlZXJTeW1saW5rID0gcGF0aC5qb2luKHBlZXJOb2RlTW9kdWxlc0RpciwgLi4ucGtnLm5hbWUuc3BsaXQoXCIvXCIpKTtcblx0XHRcdFx0YXdhaXQgZnMubWtkaXIocGF0aC5kaXJuYW1lKHBlZXJTeW1saW5rKSwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cdFx0XHRcdGF3YWl0IGZzLnN5bWxpbmsob3V0RGlyLCBwZWVyU3ltbGluaywgXCJkaXJcIik7XG5cdFx0XHRcdHRoaXMuI2xvZ2dlci50cmFjZShgUGVlci1saW5rZWQgJHtwa2cubmFtZX0g4oaSICR7b3V0RGlyfWApO1xuXHRcdFx0fVxuXHRcdFx0bWFuaWZlc3QucGVlck5vZGVNb2R1bGVzRGlyID0gcGVlck5vZGVNb2R1bGVzRGlyO1xuXHRcdFx0dGhpcy4jbG9nZ2VyLmluZm8oYENyZWF0ZWQgcGVlciBub2RlX21vZHVsZXMgYXQgJHtwZWVyTm9kZU1vZHVsZXNEaXJ9YCk7XG5cdFx0fVxuXG5cdFx0YXdhaXQgZnMud3JpdGVGaWxlKHBhdGguam9pbih0YXJnZXREaXIsIExJTktfTUFOSUZFU1QpLCBKU09OLnN0cmluZ2lmeShtYW5pZmVzdCwgbnVsbCwgMikpO1xuXG5cdFx0cmV0dXJuIEFjdGlvblJlc3BvbnNlLlN1Y2Nlc3MoTGluay5uYW1lKTtcblx0fTtcbn1cbiJdLCJuYW1lcyI6WyJERUZBVUxUX0xJTktfQ09ORklHVVJBVElPTiIsIkxJTktfTUFOSUZFU1QiLCJMaW5rIiwic2NyaWJlIiwibG9nZ2VyIiwibmFtZSIsIndvcmtzcGFjZSIsInJ1biIsIm9wdGlvbnMiLCJ0YXJnZXREaXIiLCJwYXRoIiwicmVzb2x2ZSIsIm5vZGVNb2R1bGVzRGlyIiwiam9pbiIsInN0YXQiLCJmcyIsImNhdGNoIiwiRm9yZ2VFcnJvciIsInByb2plY3RzIiwiZ2V0UHJvamVjdHMiLCJjb25maWd1cmF0aW9uIiwibGVuZ3RoIiwibWFuaWZlc3RQYXRoIiwiZXhpc3RpbmdNYW5pZmVzdFRleHQiLCJyZWFkRmlsZSIsImV4aXN0aW5nTWFuaWZlc3QiLCJKU09OIiwicGFyc2UiLCJtYW5pZmVzdCIsIndvcmtzcGFjZVJvb3QiLCJyb290RGlyIiwibGlua3MiLCJwcm9qZWN0IiwicGtnIiwiZ2V0UGFja2FnZUpzb24iLCJwYWNrYWdlTmFtZSIsInRyYWNlIiwib3V0RGlyIiwiZ2V0T3V0RGlyIiwiYWJzb2x1dGVPdXREaXIiLCJta2RpciIsInJlY3Vyc2l2ZSIsInN5bWxpbmtQYXRoIiwic3BsaXQiLCJzeW1saW5rUGFyZW50IiwiZGlybmFtZSIsIm9yaWdpbmFsUGF0aCIsImV4aXN0aW5nU3RhdCIsImxzdGF0IiwiZXhpc3RpbmdFbnRyeSIsImZpbmQiLCJsIiwiaXNTeW1ib2xpY0xpbmsiLCJ1bmxpbmsiLCJyZWFkbGluayIsInJlbmFtZSIsInN5bWxpbmsiLCJwdXNoIiwiaW5mbyIsImJ1aWxkUm9vdCIsImdldFJvb3RPdXQiLCJwZWVyTm9kZU1vZHVsZXNEaXIiLCJybSIsImZvcmNlIiwicGVlclN5bWxpbmsiLCJ3cml0ZUZpbGUiLCJzdHJpbmdpZnkiLCJBY3Rpb25SZXNwb25zZSIsIlN1Y2Nlc3MiXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7O1FBa0JhQTtlQUFBQTs7UUFQQUM7ZUFBQUE7O1FBZ0JBQztlQUFBQTs7O2lFQTNCRTtpRUFDRTs0QkFDVTtzQkFFRDtxQkFFSzt3QkFDUjtRQUNoQjt3QkFDb0I7Ozs7Ozs7Ozs7Ozs7OztBQUVwQixNQUFNRCxnQkFBZ0I7QUFPdEIsTUFBTUQsNkJBQTZCO0FBU25DLE1BQU1FOztJQUNaLENBQUEsTUFBTyxHQUFHQyxjQUFNLENBQUNDLE1BQU0sQ0FBQ0YsS0FBS0csSUFBSSxFQUFFO0lBRW5DLFlBQW1CLEFBQWlCQyxTQUFvQixDQUFFO2FBQXRCQSxZQUFBQTtJQUF1QjtJQUVwREMsTUFBTSxPQUFPQztRQUNuQixNQUFNQyxZQUFZQyxpQkFBSSxDQUFDQyxPQUFPLENBQUNILFFBQVFDLFNBQVM7UUFDaEQsTUFBTUcsaUJBQWlCRixpQkFBSSxDQUFDRyxJQUFJLENBQUNKLFdBQVc7UUFFNUMsTUFBTUssT0FBTyxNQUFNQyxpQkFBRSxDQUFDRCxJQUFJLENBQUNGLGdCQUFnQkksS0FBSyxDQUFDLElBQU07UUFDdkQsSUFBSUYsUUFBUSxNQUFNO1lBQ2pCLE1BQU0sSUFBSUcsa0JBQVUsQ0FDbkIsQ0FBQywyQkFBMkIsRUFBRVIsVUFBVSwwQkFBMEIsQ0FBQztRQUVyRTtRQUVBLE1BQU1TLFdBQVcsSUFBSSxDQUFDWixTQUFTLENBQUNhLFdBQVcsQ0FBQ1gsUUFBUVksYUFBYTtRQUNqRSxJQUFJRixTQUFTRyxNQUFNLEtBQUssR0FBRztZQUMxQixNQUFNLElBQUlKLGtCQUFVLENBQUMsQ0FBQyxxQ0FBcUMsRUFBRVQsUUFBUVksYUFBYSxDQUFDLENBQUMsQ0FBQztRQUN0RjtRQUVBLDZFQUE2RTtRQUM3RSxNQUFNRSxlQUFlWixpQkFBSSxDQUFDRyxJQUFJLENBQUNKLFdBQVdSO1FBQzFDLE1BQU1zQix1QkFBdUIsTUFBTVIsaUJBQUUsQ0FBQ1MsUUFBUSxDQUFDRixjQUFjLFFBQVFOLEtBQUssQ0FBQyxJQUFNO1FBQ2pGLE1BQU1TLG1CQUNMRix3QkFBd0IsT0FBT0csS0FBS0MsS0FBSyxDQUFDSix3QkFBd0I7UUFFbkUsTUFBTUssV0FBeUI7WUFDOUJDLGVBQWUsSUFBSSxDQUFDdkIsU0FBUyxDQUFDd0IsT0FBTztZQUNyQ0MsT0FBTyxFQUFFO1FBQ1Y7UUFFQSxLQUFLLE1BQU1DLFdBQVdkLFNBQVU7WUFDL0IsTUFBTWUsTUFBTSxNQUFNRCxRQUFRRSxjQUFjO1lBQ3hDLE1BQU1DLGNBQWNGLElBQUk1QixJQUFJO1lBQzVCLElBQUksQ0FBQzhCLGFBQWE7Z0JBQ2pCLElBQUksQ0FBQyxDQUFBLE1BQU8sQ0FBQ0MsS0FBSyxDQUFDLENBQUMsa0JBQWtCLEVBQUVKLFFBQVEzQixJQUFJLENBQUMsbUJBQW1CLENBQUM7Z0JBQ3pFO1lBQ0Q7WUFFQSxrRkFBa0Y7WUFDbEYsTUFBTWdDLFNBQVNMLFFBQVFNLFNBQVM7WUFDaEMsTUFBTUMsaUJBQWlCN0IsaUJBQUksQ0FBQ0MsT0FBTyxDQUFDMEI7WUFFcEMsbUZBQW1GO1lBQ25GLE1BQU10QixpQkFBRSxDQUFDeUIsS0FBSyxDQUFDRCxnQkFBZ0I7Z0JBQUVFLFdBQVc7WUFBSztZQUVqRCxrREFBa0Q7WUFDbEQsTUFBTUMsY0FBY2hDLGlCQUFJLENBQUNHLElBQUksQ0FBQ0QsbUJBQW1CdUIsWUFBWVEsS0FBSyxDQUFDO1lBQ25FLE1BQU1DLGdCQUFnQmxDLGlCQUFJLENBQUNtQyxPQUFPLENBQUNIO1lBRW5DLDZEQUE2RDtZQUM3RCw2RUFBNkU7WUFDN0UsMEVBQTBFO1lBQzFFLElBQUlJLGVBQThCO1lBQ2xDLE1BQU1DLGVBQWUsTUFBTWhDLGlCQUFFLENBQUNpQyxLQUFLLENBQUNOLGFBQWExQixLQUFLLENBQUMsSUFBTTtZQUM3RCxJQUFJK0IsZ0JBQWdCLE1BQU07Z0JBQ3pCLE1BQU1FLGdCQUFnQnhCLGtCQUFrQk0sTUFBTW1CLEtBQzdDLENBQUNDLElBQU1BLEVBQUVoQixXQUFXLEtBQUtBO2dCQUUxQixJQUFJYyxpQkFBaUIsTUFBTTtvQkFDMUIsOEVBQThFO29CQUM5RUgsZUFBZUcsY0FBY0gsWUFBWTtvQkFDekMsSUFBSUMsYUFBYUssY0FBYyxJQUFJO3dCQUNsQyxNQUFNckMsaUJBQUUsQ0FBQ3NDLE1BQU0sQ0FBQ1g7b0JBQ2pCO2dCQUNELE9BQU8sSUFBSUssYUFBYUssY0FBYyxJQUFJO29CQUN6Q04sZUFBZSxNQUFNL0IsaUJBQUUsQ0FBQ3VDLFFBQVEsQ0FBQ1o7b0JBQ2pDLE1BQU0zQixpQkFBRSxDQUFDc0MsTUFBTSxDQUFDWDtnQkFDakIsT0FBTztvQkFDTiwwQ0FBMEM7b0JBQzFDSSxlQUFlLEdBQUdKLFlBQVksaUJBQWlCLENBQUM7b0JBQ2hELE1BQU0zQixpQkFBRSxDQUFDd0MsTUFBTSxDQUFDYixhQUFhSTtnQkFDOUI7WUFDRDtZQUVBLE1BQU0vQixpQkFBRSxDQUFDeUIsS0FBSyxDQUFDSSxlQUFlO2dCQUFFSCxXQUFXO1lBQUs7WUFDaEQsTUFBTTFCLGlCQUFFLENBQUN5QyxPQUFPLENBQUNqQixnQkFBZ0JHLGFBQWE7WUFFOUNkLFNBQVNHLEtBQUssQ0FBQzBCLElBQUksQ0FBQztnQkFBRXRCO2dCQUFhTztnQkFBYUk7WUFBYTtZQUM3RCxJQUFJLENBQUMsQ0FBQSxNQUFPLENBQUNZLElBQUksQ0FBQyxDQUFDLE9BQU8sRUFBRXZCLFlBQVksR0FBRyxFQUFFSSxnQkFBZ0I7UUFDOUQ7UUFFQSwwRUFBMEU7UUFDMUUsd0VBQXdFO1FBQ3hFLElBQUlYLFNBQVNHLEtBQUssQ0FBQ1YsTUFBTSxHQUFHLEdBQUc7WUFDOUIsTUFBTXNDLFlBQVlqRCxpQkFBSSxDQUFDQyxPQUFPLENBQUNPLFFBQVEsQ0FBQyxFQUFFLENBQUMwQyxVQUFVO1lBQ3JELE1BQU1DLHFCQUFxQm5ELGlCQUFJLENBQUNHLElBQUksQ0FBQzhDLFdBQVc7WUFDaEQsTUFBTTVDLGlCQUFFLENBQUMrQyxFQUFFLENBQUNELG9CQUFvQjtnQkFBRXBCLFdBQVc7Z0JBQU1zQixPQUFPO1lBQUs7WUFDL0QsS0FBSyxNQUFNL0IsV0FBV2QsU0FBVTtnQkFDL0IsTUFBTWUsTUFBTSxNQUFNRCxRQUFRRSxjQUFjO2dCQUN4QyxJQUFJLENBQUNELElBQUk1QixJQUFJLEVBQUU7Z0JBQ2YsTUFBTWdDLFNBQVMzQixpQkFBSSxDQUFDQyxPQUFPLENBQUNxQixRQUFRTSxTQUFTO2dCQUM3QyxNQUFNMEIsY0FBY3RELGlCQUFJLENBQUNHLElBQUksQ0FBQ2dELHVCQUF1QjVCLElBQUk1QixJQUFJLENBQUNzQyxLQUFLLENBQUM7Z0JBQ3BFLE1BQU01QixpQkFBRSxDQUFDeUIsS0FBSyxDQUFDOUIsaUJBQUksQ0FBQ21DLE9BQU8sQ0FBQ21CLGNBQWM7b0JBQUV2QixXQUFXO2dCQUFLO2dCQUM1RCxNQUFNMUIsaUJBQUUsQ0FBQ3lDLE9BQU8sQ0FBQ25CLFFBQVEyQixhQUFhO2dCQUN0QyxJQUFJLENBQUMsQ0FBQSxNQUFPLENBQUM1QixLQUFLLENBQUMsQ0FBQyxZQUFZLEVBQUVILElBQUk1QixJQUFJLENBQUMsR0FBRyxFQUFFZ0MsUUFBUTtZQUN6RDtZQUNBVCxTQUFTaUMsa0JBQWtCLEdBQUdBO1lBQzlCLElBQUksQ0FBQyxDQUFBLE1BQU8sQ0FBQ0gsSUFBSSxDQUFDLENBQUMsNkJBQTZCLEVBQUVHLG9CQUFvQjtRQUN2RTtRQUVBLE1BQU05QyxpQkFBRSxDQUFDa0QsU0FBUyxDQUFDdkQsaUJBQUksQ0FBQ0csSUFBSSxDQUFDSixXQUFXUixnQkFBZ0J5QixLQUFLd0MsU0FBUyxDQUFDdEMsVUFBVSxNQUFNO1FBRXZGLE9BQU91QyxtQkFBYyxDQUFDQyxPQUFPLENBQUNsRSxLQUFLRyxJQUFJO0lBQ3hDLEVBQUU7QUFDSCJ9
@@ -0,0 +1,234 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "PackageDeployable", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return PackageDeployable;
9
+ }
10
+ });
11
+ const _promises = /*#__PURE__*/ _interop_require_default(require("node:fs/promises"));
12
+ const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
13
+ const _decorators = require("@decohere/crucible/decorators");
14
+ const _workspace = require("@decohere/workspace");
15
+ const _cli = require("@decohere/devkit/cli");
16
+ const _interop = require("@decohere/devkit/interop");
17
+ const _io = require("@decohere/core/io");
18
+ const _scribe = require("@decohere/scribe");
19
+ const _errors = require("../errors.js");
20
+ const _dependencypinnerservice = require("../packaging/dependency-pinner.service.js");
21
+ const _deployable = require("../packaging/deployable.js");
22
+ const _importgraphservice = require("../packaging/import-graph.service.js");
23
+ const _releaseexports = require("../packaging/release-exports.js");
24
+ const _uiassets = require("../packaging/ui-assets.js");
25
+ const _workspaceconfig = require("../workspace.config.js");
26
+ function _interop_require_default(obj) {
27
+ return obj && obj.__esModule ? obj : {
28
+ default: obj
29
+ };
30
+ }
31
+ function _ts_decorate(decorators, target, key, desc) {
32
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
33
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
34
+ 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;
35
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
36
+ }
37
+ function _ts_metadata(k, v) {
38
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
39
+ }
40
+ class PackageDeployable {
41
+ workspace;
42
+ importGraph;
43
+ pinner;
44
+ #logger = _scribe.scribe.logger(PackageDeployable.name);
45
+ npm = new _interop.Npm();
46
+ constructor(workspace, importGraph, pinner){
47
+ this.workspace = workspace;
48
+ this.importGraph = importGraph;
49
+ this.pinner = pinner;
50
+ }
51
+ async run(options) {
52
+ const projects = this.workspace.getProjects(_workspaceconfig.Release.name);
53
+ const selected = await this.select(projects, options.project);
54
+ if (typeof selected === "string") {
55
+ return _cli.ActionResponse.Error(PackageDeployable.name, selected);
56
+ }
57
+ if (selected.length === 0) {
58
+ this.#logger.info("No projects found with a Dockerfile — nothing to package");
59
+ return _cli.ActionResponse.Success(PackageDeployable.name, []);
60
+ }
61
+ const releaseProjects = await this.releaseProjects(projects);
62
+ const responses = [];
63
+ for (const project of selected){
64
+ responses.push(await this.packageProject(project, releaseProjects, projects));
65
+ }
66
+ return responses.some((response)=>!response.succeeded) ? _cli.ActionResponse.Error(PackageDeployable.name, responses) : _cli.ActionResponse.Success(PackageDeployable.name, responses);
67
+ }
68
+ /** The deployables to package, or the reason a named project cannot be one. */ async select(projects, requested) {
69
+ if (requested == null || requested === "") {
70
+ const found = [];
71
+ for (const project of projects){
72
+ if (await _deployable.deployable.isDeployable(project)) {
73
+ found.push(project);
74
+ }
75
+ }
76
+ return found;
77
+ }
78
+ const project = projects.find((candidate)=>candidate.name === requested);
79
+ if (project == null) {
80
+ return `${requested} is not a workspace project. Known projects: ${projects.map((p)=>p.name).join(", ")}`;
81
+ }
82
+ if (!await _deployable.deployable.isDeployable(project)) {
83
+ return `${requested} has no ${_deployable.deployable.dockerfileName(project)}, so it is a library, not a deployable. ` + "Libraries are packaged into the deployables that import them.";
84
+ }
85
+ return [
86
+ project
87
+ ];
88
+ }
89
+ async releaseProjects(projects) {
90
+ const entries = await Promise.all(projects.map(async (project)=>{
91
+ const pkg = await project.getPackageJson();
92
+ return [
93
+ project.name,
94
+ {
95
+ name: project.name,
96
+ pkg,
97
+ projectRoot: _nodepath.default.resolve(project.projectRoot),
98
+ releaseDir: _nodepath.default.resolve(project.getOutDir())
99
+ }
100
+ ];
101
+ }));
102
+ return new Map(entries);
103
+ }
104
+ async packageProject(project, releaseProjects, projects) {
105
+ const outDir = _nodepath.default.join(_nodepath.default.resolve(project.projectRoot), _deployable.PACKAGE_DIR);
106
+ const base = {
107
+ projectName: project.name,
108
+ outDir,
109
+ workspacePackages: [],
110
+ dependencies: {}
111
+ };
112
+ try {
113
+ const entry = releaseProjects.get(project.name);
114
+ if (!await _io.io.directoryExists(_nodepath.default.join(entry.releaseDir, "es6"))) {
115
+ throw new _errors.ForgeError(`No release build for ${project.name}. Run \`forge build --configuration release\` first.`);
116
+ }
117
+ const ui = await _uiassets.uiAssets.resolve(project, projects);
118
+ const reached = await this.importGraph.walk(entry, releaseProjects);
119
+ const libraries = [
120
+ ...reached.workspace
121
+ ].filter((name)=>name !== project.name).sort().map((name)=>releaseProjects.get(name));
122
+ const dependencies = await this.pinner.pin(reached.thirdParty, [
123
+ entry,
124
+ ...libraries
125
+ ], releaseProjects, {
126
+ dir: _nodepath.default.resolve(this.workspace.rootDir),
127
+ pkg: await this.workspace.getPackageJson()
128
+ });
129
+ await this.write(entry, libraries, dependencies, outDir, ui);
130
+ const workspacePackages = [
131
+ ...reached.workspace
132
+ ].sort();
133
+ this.#logger.info(`Packaged ${project.name} to ${outDir}`, {
134
+ workspace: workspacePackages,
135
+ thirdParty: Object.keys(dependencies)
136
+ });
137
+ return {
138
+ projectName: project.name,
139
+ outDir,
140
+ workspacePackages,
141
+ dependencies,
142
+ succeeded: true,
143
+ message: `Packaged ${project.name} to ${outDir}`
144
+ };
145
+ } catch (reason) {
146
+ const message = (0, _errors.formatUnknownError)(reason);
147
+ return {
148
+ ...base,
149
+ succeeded: false,
150
+ message,
151
+ error: `${project.name}: ${message}`
152
+ };
153
+ }
154
+ }
155
+ async write(entry, libraries, dependencies, outDir, ui) {
156
+ await _promises.default.rm(outDir, {
157
+ recursive: true,
158
+ force: true
159
+ });
160
+ await _promises.default.mkdir(outDir, {
161
+ recursive: true
162
+ });
163
+ await this.writeJson(_nodepath.default.join(outDir, "package.json"), {
164
+ name: entry.name.replace(/^@/, "").replace("/", "-"),
165
+ version: entry.pkg.version,
166
+ private: true,
167
+ type: "module",
168
+ scripts: {
169
+ start: `node es6/${_releaseexports.releaseExports.toJs(entry.pkg.main ?? "src/index.ts")}`
170
+ },
171
+ dependencies
172
+ });
173
+ // npm writes real folders. It also removes anything in node_modules it does not know,
174
+ // so the workspace libraries are copied in only after it has run.
175
+ if (Object.keys(dependencies).length > 0) {
176
+ await this.npm.installProduction({
177
+ cwd: outDir
178
+ });
179
+ }
180
+ await this.copyTree(_nodepath.default.join(entry.releaseDir, "es6"), _nodepath.default.join(outDir, "es6"));
181
+ const config = _nodepath.default.join(_nodepath.default.resolve(this.workspace.rootDir), "config");
182
+ if (await _io.io.directoryExists(config)) {
183
+ await this.copyTree(config, _nodepath.default.join(outDir, "config"));
184
+ }
185
+ if (ui != null) {
186
+ await this.copyTree(ui.from, _nodepath.default.join(outDir, ui.to));
187
+ }
188
+ for (const library of libraries){
189
+ const target = _nodepath.default.join(outDir, "node_modules", ...library.name.split("/"));
190
+ await this.copyTree(_nodepath.default.join(library.releaseDir, "es6"), _nodepath.default.join(target, "es6"));
191
+ await this.writeJson(_nodepath.default.join(target, "package.json"), {
192
+ name: library.name,
193
+ version: library.pkg.version,
194
+ type: "module",
195
+ exports: _releaseexports.releaseExports.build(library.pkg)
196
+ });
197
+ }
198
+ await this.assertNoSymlinks(outDir);
199
+ }
200
+ /** Copies file contents, never links: a symlink in the output would break outside the image. */ async copyTree(from, to) {
201
+ await _promises.default.cp(from, to, {
202
+ recursive: true,
203
+ dereference: true
204
+ });
205
+ }
206
+ async writeJson(filePath, value) {
207
+ await _io.io.writeFile(filePath, `${JSON.stringify(value, null, "\t")}\n`, {
208
+ mkdir: true,
209
+ encoding: "utf8"
210
+ });
211
+ }
212
+ async assertNoSymlinks(dir) {
213
+ for (const entry of (await _promises.default.readdir(dir, {
214
+ withFileTypes: true
215
+ }))){
216
+ const entryPath = _nodepath.default.join(dir, entry.name);
217
+ if (entry.isSymbolicLink()) {
218
+ throw new _errors.ForgeError(`The packaged output must hold no symlinks, but found ${entryPath}`);
219
+ }
220
+ if (entry.isDirectory()) {
221
+ await this.assertNoSymlinks(entryPath);
222
+ }
223
+ }
224
+ }
225
+ }
226
+ PackageDeployable = _ts_decorate([
227
+ (0, _decorators.injectable)(),
228
+ _ts_metadata("design:type", Function),
229
+ _ts_metadata("design:paramtypes", [
230
+ typeof _workspace.Workspace === "undefined" ? Object : _workspace.Workspace,
231
+ typeof _importgraphservice.ImportGraph === "undefined" ? Object : _importgraphservice.ImportGraph,
232
+ typeof _dependencypinnerservice.DependencyPinner === "undefined" ? Object : _dependencypinnerservice.DependencyPinner
233
+ ])
234
+ ], PackageDeployable);
@@ -0,0 +1,120 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ function _export(target, all) {
6
+ for(var name in all)Object.defineProperty(target, name, {
7
+ enumerable: true,
8
+ get: Object.getOwnPropertyDescriptor(all, name).get
9
+ });
10
+ }
11
+ _export(exports, {
12
+ get PATHS_FILE () {
13
+ return PATHS_FILE;
14
+ },
15
+ get Paths () {
16
+ return Paths;
17
+ }
18
+ });
19
+ const _nodefs = require("node:fs");
20
+ const _promises = require("node:fs/promises");
21
+ const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
22
+ const _decorators = require("@decohere/crucible/decorators");
23
+ const _workspace = require("@decohere/workspace");
24
+ const _cli = require("@decohere/devkit/cli");
25
+ const _scribe = require("@decohere/scribe");
26
+ function _interop_require_default(obj) {
27
+ return obj && obj.__esModule ? obj : {
28
+ default: obj
29
+ };
30
+ }
31
+ function _ts_decorate(decorators, target, key, desc) {
32
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
33
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
34
+ 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;
35
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
36
+ }
37
+ function _ts_metadata(k, v) {
38
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
39
+ }
40
+ const PATHS_FILE = "tsconfig.paths.json";
41
+ class Paths {
42
+ workspace;
43
+ #logger = _scribe.scribe.logger(Paths.name);
44
+ constructor(workspace){
45
+ this.workspace = workspace;
46
+ }
47
+ async run(options) {
48
+ const file = _nodepath.default.join(this.workspace.rootDir, PATHS_FILE);
49
+ if (this.workspace.isStandalone) {
50
+ // One project has no other projects to import from source.
51
+ this.#logger.info(`Standalone project: no ${PATHS_FILE} needed`);
52
+ return _cli.ActionResponse.Success(Paths.name, [
53
+ {
54
+ file,
55
+ changed: false,
56
+ succeeded: true
57
+ }
58
+ ]);
59
+ }
60
+ const content = Paths.render(this.workspace);
61
+ const current = (0, _nodefs.existsSync)(file) ? await (0, _promises.readFile)(file, "utf8") : null;
62
+ const changed = current !== content;
63
+ if (options.check) {
64
+ if (!changed) {
65
+ return _cli.ActionResponse.Success(Paths.name, [
66
+ {
67
+ file,
68
+ changed,
69
+ succeeded: true
70
+ }
71
+ ]);
72
+ }
73
+ const error = `${PATHS_FILE} is out of date. Run \`forge paths\` to update it.`;
74
+ this.#logger.error(error);
75
+ return _cli.ActionResponse.Error(Paths.name, [
76
+ {
77
+ file,
78
+ changed,
79
+ succeeded: false,
80
+ error
81
+ }
82
+ ]);
83
+ }
84
+ if (changed) {
85
+ await (0, _promises.writeFile)(file, content);
86
+ this.#logger.info(`Wrote ${PATHS_FILE}`);
87
+ }
88
+ return _cli.ActionResponse.Success(Paths.name, [
89
+ {
90
+ file,
91
+ changed,
92
+ succeeded: true
93
+ }
94
+ ]);
95
+ }
96
+ /** The file's content: convention and exported subpaths only, never the tsconfig's own paths. */ static render(workspace) {
97
+ const rootDir = _nodepath.default.resolve(workspace.rootDir);
98
+ const { paths } = _workspace.packageAliases.build(workspace.getProjects("debug"), {
99
+ baseUrl: rootDir
100
+ });
101
+ const sorted = Object.fromEntries(Object.keys(paths).sort().map((key)=>[
102
+ key,
103
+ (paths[key] ?? []).map((target)=>`./${target}`)
104
+ ]));
105
+ const json = {
106
+ $comment: "Generated by `forge paths` from the workspace packages. Do not edit.",
107
+ compilerOptions: {
108
+ paths: sorted
109
+ }
110
+ };
111
+ return `${JSON.stringify(json, null, 2)}\n`;
112
+ }
113
+ }
114
+ Paths = _ts_decorate([
115
+ (0, _decorators.injectable)(),
116
+ _ts_metadata("design:type", Function),
117
+ _ts_metadata("design:paramtypes", [
118
+ typeof _workspace.Workspace === "undefined" ? Object : _workspace.Workspace
119
+ ])
120
+ ], Paths);