@decohere/forge 0.0.1-dev.5

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 (130) hide show
  1. package/commonjs/src/actions/build.action.js +108 -0
  2. package/commonjs/src/actions/clean.action.js +55 -0
  3. package/commonjs/src/actions/commit.action.js +80 -0
  4. package/commonjs/src/actions/copy.action.js +83 -0
  5. package/commonjs/src/actions/dependency-report.action.js +142 -0
  6. package/commonjs/src/actions/dependency-sync.action.js +100 -0
  7. package/commonjs/src/actions/index.js +30 -0
  8. package/commonjs/src/actions/publish.action.js +156 -0
  9. package/commonjs/src/actions/sync-lock-file.action.js +43 -0
  10. package/commonjs/src/actions/tag.action.js +76 -0
  11. package/commonjs/src/actions/version.action.js +209 -0
  12. package/commonjs/src/actions/watch.action.js +50 -0
  13. package/commonjs/src/commands/build.command.js +49 -0
  14. package/commonjs/src/commands/dependency.command.js +88 -0
  15. package/commonjs/src/commands/forge.command.js +24 -0
  16. package/commonjs/src/commands/index.js +25 -0
  17. package/commonjs/src/commands/publish.command.js +32 -0
  18. package/commonjs/src/commands/tag.command.js +28 -0
  19. package/commonjs/src/commands/version.command.js +36 -0
  20. package/commonjs/src/const.js +81 -0
  21. package/commonjs/src/errors.js +39 -0
  22. package/commonjs/src/extensions/project.extensions.js +66 -0
  23. package/commonjs/src/factories/swc-config.factory.js +98 -0
  24. package/commonjs/src/forge.module.js +109 -0
  25. package/commonjs/src/index.js +22 -0
  26. package/commonjs/src/mixins/caches-outputs.mixin.js +42 -0
  27. package/commonjs/src/mixins/incremental-transform.mixin.js +36 -0
  28. package/commonjs/src/services/dependency-resolver.service.js +172 -0
  29. package/commonjs/src/services/file-writer.service.js +232 -0
  30. package/commonjs/src/services/swc-transpiler.js +176 -0
  31. package/commonjs/src/services/ts-program-host.js +135 -0
  32. package/commonjs/src/services/type-emission-program.js +160 -0
  33. package/commonjs/src/services/type-emitter.js +141 -0
  34. package/commonjs/src/types/build-target.type.js +17 -0
  35. package/commonjs/src/types/configuration.type.js +6 -0
  36. package/commonjs/src/types/dependency.types.js +6 -0
  37. package/commonjs/src/types/swc-config.type.js +17 -0
  38. package/commonjs/src/types/transform-response.model.js +64 -0
  39. package/commonjs/src/types/transformer.type.js +13 -0
  40. package/commonjs/src/types/workspace-config.type.js +6 -0
  41. package/commonjs/src/vitest/forge-build.plugin.js +129 -0
  42. package/commonjs/src/vitest/index.js +13 -0
  43. package/commonjs/src/workspace.config.js +73 -0
  44. package/es6/src/actions/build.action.js +100 -0
  45. package/es6/src/actions/clean.action.js +46 -0
  46. package/es6/src/actions/commit.action.js +71 -0
  47. package/es6/src/actions/copy.action.js +69 -0
  48. package/es6/src/actions/dependency-report.action.js +134 -0
  49. package/es6/src/actions/dependency-sync.action.js +92 -0
  50. package/es6/src/actions/index.js +13 -0
  51. package/es6/src/actions/publish.action.js +147 -0
  52. package/es6/src/actions/sync-lock-file.action.js +33 -0
  53. package/es6/src/actions/tag.action.js +67 -0
  54. package/es6/src/actions/version.action.js +189 -0
  55. package/es6/src/actions/watch.action.js +41 -0
  56. package/es6/src/commands/build.command.js +34 -0
  57. package/es6/src/commands/dependency.command.js +78 -0
  58. package/es6/src/commands/forge.command.js +14 -0
  59. package/es6/src/commands/index.js +8 -0
  60. package/es6/src/commands/publish.command.js +22 -0
  61. package/es6/src/commands/tag.command.js +18 -0
  62. package/es6/src/commands/version.command.js +26 -0
  63. package/es6/src/const.js +60 -0
  64. package/es6/src/errors.js +18 -0
  65. package/es6/src/extensions/project.extensions.js +51 -0
  66. package/es6/src/factories/swc-config.factory.js +83 -0
  67. package/es6/src/forge.module.js +58 -0
  68. package/es6/src/index.js +4 -0
  69. package/es6/src/mixins/caches-outputs.mixin.js +32 -0
  70. package/es6/src/mixins/incremental-transform.mixin.js +26 -0
  71. package/es6/src/services/dependency-resolver.service.js +162 -0
  72. package/es6/src/services/file-writer.service.js +217 -0
  73. package/es6/src/services/swc-transpiler.js +161 -0
  74. package/es6/src/services/ts-program-host.js +120 -0
  75. package/es6/src/services/type-emission-program.js +145 -0
  76. package/es6/src/services/type-emitter.js +134 -0
  77. package/es6/src/types/build-target.type.js +7 -0
  78. package/es6/src/types/configuration.type.js +3 -0
  79. package/es6/src/types/dependency.types.js +3 -0
  80. package/es6/src/types/swc-config.type.js +7 -0
  81. package/es6/src/types/transform-response.model.js +46 -0
  82. package/es6/src/types/transformer.type.js +3 -0
  83. package/es6/src/types/workspace-config.type.js +3 -0
  84. package/es6/src/vitest/forge-build.plugin.js +114 -0
  85. package/es6/src/vitest/index.js +3 -0
  86. package/es6/src/workspace.config.js +49 -0
  87. package/package.json +43 -0
  88. package/types/src/actions/build.action.d.ts +22 -0
  89. package/types/src/actions/clean.action.d.ts +13 -0
  90. package/types/src/actions/commit.action.d.ts +17 -0
  91. package/types/src/actions/copy.action.d.ts +14 -0
  92. package/types/src/actions/dependency-report.action.d.ts +36 -0
  93. package/types/src/actions/dependency-sync.action.d.ts +17 -0
  94. package/types/src/actions/index.d.ts +11 -0
  95. package/types/src/actions/publish.action.d.ts +34 -0
  96. package/types/src/actions/sync-lock-file.action.d.ts +10 -0
  97. package/types/src/actions/tag.action.d.ts +19 -0
  98. package/types/src/actions/version.action.d.ts +35 -0
  99. package/types/src/actions/watch.action.d.ts +14 -0
  100. package/types/src/commands/build.command.d.ts +16 -0
  101. package/types/src/commands/dependency.command.d.ts +5 -0
  102. package/types/src/commands/forge.command.d.ts +6 -0
  103. package/types/src/commands/index.d.ts +6 -0
  104. package/types/src/commands/publish.command.d.ts +6 -0
  105. package/types/src/commands/tag.command.d.ts +6 -0
  106. package/types/src/commands/version.command.d.ts +12 -0
  107. package/types/src/const.d.ts +3 -0
  108. package/types/src/errors.d.ts +4 -0
  109. package/types/src/extensions/project.extensions.d.ts +13 -0
  110. package/types/src/factories/swc-config.factory.d.ts +24 -0
  111. package/types/src/forge.module.d.ts +31 -0
  112. package/types/src/index.d.ts +4 -0
  113. package/types/src/mixins/caches-outputs.mixin.d.ts +7 -0
  114. package/types/src/mixins/incremental-transform.mixin.d.ts +13 -0
  115. package/types/src/services/dependency-resolver.service.d.ts +15 -0
  116. package/types/src/services/file-writer.service.d.ts +20 -0
  117. package/types/src/services/swc-transpiler.d.ts +28 -0
  118. package/types/src/services/ts-program-host.d.ts +22 -0
  119. package/types/src/services/type-emission-program.d.ts +22 -0
  120. package/types/src/services/type-emitter.d.ts +43 -0
  121. package/types/src/types/build-target.type.d.ts +7 -0
  122. package/types/src/types/configuration.type.d.ts +6 -0
  123. package/types/src/types/dependency.types.d.ts +39 -0
  124. package/types/src/types/swc-config.type.d.ts +9 -0
  125. package/types/src/types/transform-response.model.d.ts +54 -0
  126. package/types/src/types/transformer.type.d.ts +37 -0
  127. package/types/src/types/workspace-config.type.d.ts +13 -0
  128. package/types/src/vitest/forge-build.plugin.d.ts +18 -0
  129. package/types/src/vitest/index.d.ts +2 -0
  130. package/types/src/workspace.config.d.ts +6 -0
@@ -0,0 +1,51 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ function _ts_metadata(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ }
10
+ import path from "node:path";
11
+ import { Project } from "@decohere/mesh";
12
+ import { memoize } from "@decohere/nexus/caching";
13
+ import { extension } from "@decohere/nexus/extensibility";
14
+ import { io } from "@decohere/nexus/io";
15
+ import { SWC_CONFIG } from "../const.js";
16
+ import { SwcConfig } from "../types/swc-config.type.js";
17
+ export class ProjectExtensions {
18
+ static getForgeConfiguration(project) {
19
+ return project.configuration;
20
+ }
21
+ static async getSwcConfig(project) {
22
+ const projectConfigPath = path.join(project.projectDirectory, SWC_CONFIG);
23
+ if (await io.fileExists(projectConfigPath)) {
24
+ return new SwcConfig(await io.readJsonFile(projectConfigPath));
25
+ }
26
+ const rootConfigPath = path.join(project.rootDir, SWC_CONFIG);
27
+ if (await io.fileExists(rootConfigPath)) {
28
+ return new SwcConfig(await io.readJsonFile(rootConfigPath));
29
+ }
30
+ return new SwcConfig();
31
+ }
32
+ }
33
+ _ts_decorate([
34
+ extension(Project),
35
+ _ts_metadata("design:type", Function),
36
+ _ts_metadata("design:paramtypes", [
37
+ typeof Project === "undefined" ? Object : Project
38
+ ]),
39
+ _ts_metadata("design:returntype", typeof ForgeConfiguration === "undefined" ? Object : ForgeConfiguration)
40
+ ], ProjectExtensions, "getForgeConfiguration", null);
41
+ _ts_decorate([
42
+ extension(Project),
43
+ memoize(),
44
+ _ts_metadata("design:type", Function),
45
+ _ts_metadata("design:paramtypes", [
46
+ typeof Project === "undefined" ? Object : Project
47
+ ]),
48
+ _ts_metadata("design:returntype", Promise)
49
+ ], ProjectExtensions, "getSwcConfig", null);
50
+
51
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvZm9yZ2Uvc3JjL2V4dGVuc2lvbnMvcHJvamVjdC5leHRlbnNpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NhY2hpbmdcIjtcbmltcG9ydCB7IGV4dGVuc2lvbiB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvZXh0ZW5zaWJpbGl0eVwiO1xuaW1wb3J0IHsgaW8gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2lvXCI7XG5pbXBvcnQgeyBTV0NfQ09ORklHIH0gZnJvbSBcIi4uL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEZvcmdlQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuLi90eXBlcy9jb25maWd1cmF0aW9uLnR5cGUuanNcIjtcbmltcG9ydCB7IFN3Y0NvbmZpZyB9IGZyb20gXCIuLi90eXBlcy9zd2MtY29uZmlnLnR5cGUuanNcIjtcblxuZGVjbGFyZSBtb2R1bGUgXCJAZGVjb2hlcmUvbWVzaFwiIHtcblx0aW50ZXJmYWNlIFByb2plY3Qge1xuXHRcdGdldEZvcmdlQ29uZmlndXJhdGlvbigpOiBGb3JnZUNvbmZpZ3VyYXRpb247XG5cdFx0Z2V0U3djQ29uZmlnKCk6IFByb21pc2U8U3djQ29uZmlnPjtcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgUHJvamVjdEV4dGVuc2lvbnMge1xuXHRAZXh0ZW5zaW9uKFByb2plY3QpXG5cdHB1YmxpYyBzdGF0aWMgZ2V0Rm9yZ2VDb25maWd1cmF0aW9uKHByb2plY3Q6IFByb2plY3QpOiBGb3JnZUNvbmZpZ3VyYXRpb24ge1xuXHRcdHJldHVybiBwcm9qZWN0LmNvbmZpZ3VyYXRpb24gYXMgRm9yZ2VDb25maWd1cmF0aW9uO1xuXHR9XG5cblx0QGV4dGVuc2lvbihQcm9qZWN0KVxuXHRAbWVtb2l6ZSgpXG5cdHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0U3djQ29uZmlnKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPFN3Y0NvbmZpZz4ge1xuXHRcdGNvbnN0IHByb2plY3RDb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3QucHJvamVjdERpcmVjdG9yeSwgU1dDX0NPTkZJRyk7XG5cdFx0aWYgKGF3YWl0IGlvLmZpbGVFeGlzdHMocHJvamVjdENvbmZpZ1BhdGgpKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFN3Y0NvbmZpZyhhd2FpdCBpby5yZWFkSnNvbkZpbGUocHJvamVjdENvbmZpZ1BhdGgpKTtcblx0XHR9XG5cblx0XHRjb25zdCByb290Q29uZmlnUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LnJvb3REaXIsIFNXQ19DT05GSUcpO1xuXHRcdGlmIChhd2FpdCBpby5maWxlRXhpc3RzKHJvb3RDb25maWdQYXRoKSkge1xuXHRcdFx0cmV0dXJuIG5ldyBTd2NDb25maWcoYXdhaXQgaW8ucmVhZEpzb25GaWxlKHJvb3RDb25maWdQYXRoKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBTd2NDb25maWcoKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbInBhdGgiLCJQcm9qZWN0IiwibWVtb2l6ZSIsImV4dGVuc2lvbiIsImlvIiwiU1dDX0NPTkZJRyIsIlN3Y0NvbmZpZyIsIlByb2plY3RFeHRlbnNpb25zIiwiZ2V0Rm9yZ2VDb25maWd1cmF0aW9uIiwicHJvamVjdCIsImNvbmZpZ3VyYXRpb24iLCJnZXRTd2NDb25maWciLCJwcm9qZWN0Q29uZmlnUGF0aCIsImpvaW4iLCJwcm9qZWN0RGlyZWN0b3J5IiwiZmlsZUV4aXN0cyIsInJlYWRKc29uRmlsZSIsInJvb3RDb25maWdQYXRoIiwicm9vdERpciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBT0EsVUFBVSxZQUFZO0FBQzdCLFNBQVNDLE9BQU8sUUFBUSxpQkFBaUI7QUFDekMsU0FBU0MsT0FBTyxRQUFRLDBCQUEwQjtBQUNsRCxTQUFTQyxTQUFTLFFBQVEsZ0NBQWdDO0FBQzFELFNBQVNDLEVBQUUsUUFBUSxxQkFBcUI7QUFDeEMsU0FBU0MsVUFBVSxRQUFRLGNBQWM7QUFFekMsU0FBU0MsU0FBUyxRQUFRLDhCQUE4QjtBQVN4RCxPQUFPLE1BQU1DO0lBQ1osT0FDY0Msc0JBQXNCQyxPQUFnQixFQUFzQjtRQUN6RSxPQUFPQSxRQUFRQyxhQUFhO0lBQzdCO0lBRUEsYUFFb0JDLGFBQWFGLE9BQWdCLEVBQXNCO1FBQ3RFLE1BQU1HLG9CQUFvQlosS0FBS2EsSUFBSSxDQUFDSixRQUFRSyxnQkFBZ0IsRUFBRVQ7UUFDOUQsSUFBSSxNQUFNRCxHQUFHVyxVQUFVLENBQUNILG9CQUFvQjtZQUMzQyxPQUFPLElBQUlOLFVBQVUsTUFBTUYsR0FBR1ksWUFBWSxDQUFDSjtRQUM1QztRQUVBLE1BQU1LLGlCQUFpQmpCLEtBQUthLElBQUksQ0FBQ0osUUFBUVMsT0FBTyxFQUFFYjtRQUNsRCxJQUFJLE1BQU1ELEdBQUdXLFVBQVUsQ0FBQ0UsaUJBQWlCO1lBQ3hDLE9BQU8sSUFBSVgsVUFBVSxNQUFNRixHQUFHWSxZQUFZLENBQUNDO1FBQzVDO1FBRUEsT0FBTyxJQUFJWDtJQUNaO0FBQ0QifQ==
@@ -0,0 +1,83 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ import path from "node:path";
8
+ import { Trace } from "@decohere/nexus/diagnostics";
9
+ import { merge } from "@decohere/nexus/objects";
10
+ import { ForgeError } from "../errors.js";
11
+ const defaultOptions = {
12
+ jsc: {
13
+ parser: {
14
+ syntax: "typescript",
15
+ decorators: true
16
+ },
17
+ target: "esnext",
18
+ transform: {
19
+ decoratorMetadata: true
20
+ },
21
+ experimental: {
22
+ keepImportAttributes: true
23
+ }
24
+ },
25
+ module: {
26
+ resolveFully: true
27
+ },
28
+ sourceMaps: "inline"
29
+ };
30
+ export class SwcConfigFactory {
31
+ /**
32
+ * Creates a base config for a project+target combination, without a filename.
33
+ * Call once per (project, target) and then use createFileConfig() per file.
34
+ */ createBaseConfig(buildTarget, configOptions) {
35
+ const { userConfig, tsConfig, aliasPaths } = configOptions;
36
+ const { compilerOptions } = tsConfig ?? {};
37
+ const paths = aliasPaths ? compilerOptions?.paths : undefined;
38
+ const baseUrl = SwcConfigFactory.getBaseUrl(tsConfig) ?? (paths != null ? path.resolve(".") : undefined);
39
+ const options = {
40
+ jsc: {
41
+ baseUrl,
42
+ paths
43
+ },
44
+ module: {
45
+ type: buildTarget
46
+ }
47
+ };
48
+ return merge.withOptions({
49
+ mergeArrays: false
50
+ }, defaultOptions, options, userConfig ?? {});
51
+ }
52
+ /** Stamps a per-file filename onto a pre-built base config. */ createFileConfig(file, baseConfig) {
53
+ const config = {
54
+ ...baseConfig,
55
+ filename: file.fullPath
56
+ };
57
+ this.validate(config);
58
+ return config;
59
+ }
60
+ /**
61
+ * Validates SWC options against known causes of Rust/NAPI process crashes.
62
+ * Throws a ForgeError with a descriptive message instead of letting the
63
+ * NAPI layer abort the process.
64
+ *
65
+ * Known crash causes:
66
+ * - `jsc.baseUrl` set to a relative path (SWC requires an absolute path)
67
+ */ validate(options) {
68
+ const baseUrl = options.jsc?.baseUrl;
69
+ if (baseUrl != null && !path.isAbsolute(baseUrl)) {
70
+ throw new ForgeError(`SWC config: jsc.baseUrl must be an absolute path to avoid a process crash, got: "${baseUrl}". Use path.resolve() to convert it.`);
71
+ }
72
+ }
73
+ /** Resolves tsconfig baseUrl to an absolute path. Returns undefined if not set. */ static getBaseUrl(tsConfig) {
74
+ const baseUrl = tsConfig?.compilerOptions?.baseUrl;
75
+ if (baseUrl == null) return undefined;
76
+ return path.resolve(baseUrl);
77
+ }
78
+ }
79
+ SwcConfigFactory = _ts_decorate([
80
+ Trace
81
+ ], SwcConfigFactory);
82
+
83
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvZm9yZ2Uvc3JjL2ZhY3Rvcmllcy9zd2MtY29uZmlnLmZhY3RvcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBUc2NvbmZpZyB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgVHJhY2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2RpYWdub3N0aWNzXCI7XG5pbXBvcnQgdHlwZSB7IEZpbGVFeCB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9vYmplY3RzXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tIFwiQHN3Yy9jb3JlXCI7XG5pbXBvcnQgeyBGb3JnZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUcmFuc3BpbGVUYXJnZXQgfSBmcm9tIFwiLi4vdHlwZXMvYnVpbGQtdGFyZ2V0LnR5cGUuanNcIjtcbmltcG9ydCB0eXBlIHsgU3djQ29uZmlnT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlcy9zd2MtY29uZmlnLnR5cGUuanNcIjtcblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG5cdGpzYzoge1xuXHRcdHBhcnNlcjoge1xuXHRcdFx0c3ludGF4OiBcInR5cGVzY3JpcHRcIixcblx0XHRcdGRlY29yYXRvcnM6IHRydWUsXG5cdFx0fSxcblx0XHR0YXJnZXQ6IFwiZXNuZXh0XCIsXG5cdFx0dHJhbnNmb3JtOiB7XG5cdFx0XHRkZWNvcmF0b3JNZXRhZGF0YTogdHJ1ZSxcblx0XHR9LFxuXHRcdGV4cGVyaW1lbnRhbDogeyBrZWVwSW1wb3J0QXR0cmlidXRlczogdHJ1ZSB9LFxuXHR9LFxuXHRtb2R1bGU6IHtcblx0XHRyZXNvbHZlRnVsbHk6IHRydWUsXG5cdH0sXG5cdHNvdXJjZU1hcHM6IFwiaW5saW5lXCIsXG59O1xuXG5AVHJhY2VcbmV4cG9ydCBjbGFzcyBTd2NDb25maWdGYWN0b3J5IHtcblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBiYXNlIGNvbmZpZyBmb3IgYSBwcm9qZWN0K3RhcmdldCBjb21iaW5hdGlvbiwgd2l0aG91dCBhIGZpbGVuYW1lLlxuXHQgKiBDYWxsIG9uY2UgcGVyIChwcm9qZWN0LCB0YXJnZXQpIGFuZCB0aGVuIHVzZSBjcmVhdGVGaWxlQ29uZmlnKCkgcGVyIGZpbGUuXG5cdCAqL1xuXHRwdWJsaWMgY3JlYXRlQmFzZUNvbmZpZyhcblx0XHRidWlsZFRhcmdldDogVHJhbnNwaWxlVGFyZ2V0LFxuXHRcdGNvbmZpZ09wdGlvbnM6IFN3Y0NvbmZpZ09wdGlvbnMsXG5cdCk6IE9wdGlvbnMge1xuXHRcdGNvbnN0IHsgdXNlckNvbmZpZywgdHNDb25maWcsIGFsaWFzUGF0aHMgfSA9IGNvbmZpZ09wdGlvbnM7XG5cdFx0Y29uc3QgeyBjb21waWxlck9wdGlvbnMgfSA9IHRzQ29uZmlnID8/IHt9O1xuXHRcdGNvbnN0IHBhdGhzID0gYWxpYXNQYXRocyA/IGNvbXBpbGVyT3B0aW9ucz8ucGF0aHMgOiB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgYmFzZVVybCA9XG5cdFx0XHRTd2NDb25maWdGYWN0b3J5LmdldEJhc2VVcmwodHNDb25maWcpID8/IChwYXRocyAhPSBudWxsID8gcGF0aC5yZXNvbHZlKFwiLlwiKSA6IHVuZGVmaW5lZCk7XG5cblx0XHRjb25zdCBvcHRpb25zOiBPcHRpb25zID0ge1xuXHRcdFx0anNjOiB7XG5cdFx0XHRcdGJhc2VVcmwsXG5cdFx0XHRcdHBhdGhzLFxuXHRcdFx0fSxcblx0XHRcdG1vZHVsZToge1xuXHRcdFx0XHR0eXBlOiBidWlsZFRhcmdldCxcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdHJldHVybiBtZXJnZS53aXRoT3B0aW9uczxPcHRpb25zPihcblx0XHRcdHsgbWVyZ2VBcnJheXM6IGZhbHNlIH0sXG5cdFx0XHRkZWZhdWx0T3B0aW9ucyxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHR1c2VyQ29uZmlnID8/IHt9LFxuXHRcdCk7XG5cdH1cblxuXHQvKiogU3RhbXBzIGEgcGVyLWZpbGUgZmlsZW5hbWUgb250byBhIHByZS1idWlsdCBiYXNlIGNvbmZpZy4gKi9cblx0cHVibGljIGNyZWF0ZUZpbGVDb25maWcoZmlsZTogRmlsZUV4LCBiYXNlQ29uZmlnOiBPcHRpb25zKTogT3B0aW9ucyB7XG5cdFx0Y29uc3QgY29uZmlnID0geyAuLi5iYXNlQ29uZmlnLCBmaWxlbmFtZTogZmlsZS5mdWxsUGF0aCB9O1xuXHRcdHRoaXMudmFsaWRhdGUoY29uZmlnKTtcblx0XHRyZXR1cm4gY29uZmlnO1xuXHR9XG5cblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBTV0Mgb3B0aW9ucyBhZ2FpbnN0IGtub3duIGNhdXNlcyBvZiBSdXN0L05BUEkgcHJvY2VzcyBjcmFzaGVzLlxuXHQgKiBUaHJvd3MgYSBGb3JnZUVycm9yIHdpdGggYSBkZXNjcmlwdGl2ZSBtZXNzYWdlIGluc3RlYWQgb2YgbGV0dGluZyB0aGVcblx0ICogTkFQSSBsYXllciBhYm9ydCB0aGUgcHJvY2Vzcy5cblx0ICpcblx0ICogS25vd24gY3Jhc2ggY2F1c2VzOlxuXHQgKiAtIGBqc2MuYmFzZVVybGAgc2V0IHRvIGEgcmVsYXRpdmUgcGF0aCAoU1dDIHJlcXVpcmVzIGFuIGFic29sdXRlIHBhdGgpXG5cdCAqL1xuXHRwdWJsaWMgdmFsaWRhdGUob3B0aW9uczogT3B0aW9ucyk6IHZvaWQge1xuXHRcdGNvbnN0IGJhc2VVcmwgPSBvcHRpb25zLmpzYz8uYmFzZVVybDtcblx0XHRpZiAoYmFzZVVybCAhPSBudWxsICYmICFwYXRoLmlzQWJzb2x1dGUoYmFzZVVybCkpIHtcblx0XHRcdHRocm93IG5ldyBGb3JnZUVycm9yKFxuXHRcdFx0XHRgU1dDIGNvbmZpZzoganNjLmJhc2VVcmwgbXVzdCBiZSBhbiBhYnNvbHV0ZSBwYXRoIHRvIGF2b2lkIGEgcHJvY2VzcyBjcmFzaCwgZ290OiBcIiR7YmFzZVVybH1cIi4gVXNlIHBhdGgucmVzb2x2ZSgpIHRvIGNvbnZlcnQgaXQuYCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIFJlc29sdmVzIHRzY29uZmlnIGJhc2VVcmwgdG8gYW4gYWJzb2x1dGUgcGF0aC4gUmV0dXJucyB1bmRlZmluZWQgaWYgbm90IHNldC4gKi9cblx0cHJpdmF0ZSBzdGF0aWMgZ2V0QmFzZVVybCh0c0NvbmZpZzogVHNjb25maWcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGJhc2VVcmwgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsO1xuXHRcdGlmIChiYXNlVXJsID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG5cdFx0cmV0dXJuIHBhdGgucmVzb2x2ZShiYXNlVXJsKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbInBhdGgiLCJUcmFjZSIsIm1lcmdlIiwiRm9yZ2VFcnJvciIsImRlZmF1bHRPcHRpb25zIiwianNjIiwicGFyc2VyIiwic3ludGF4IiwiZGVjb3JhdG9ycyIsInRhcmdldCIsInRyYW5zZm9ybSIsImRlY29yYXRvck1ldGFkYXRhIiwiZXhwZXJpbWVudGFsIiwia2VlcEltcG9ydEF0dHJpYnV0ZXMiLCJtb2R1bGUiLCJyZXNvbHZlRnVsbHkiLCJzb3VyY2VNYXBzIiwiU3djQ29uZmlnRmFjdG9yeSIsImNyZWF0ZUJhc2VDb25maWciLCJidWlsZFRhcmdldCIsImNvbmZpZ09wdGlvbnMiLCJ1c2VyQ29uZmlnIiwidHNDb25maWciLCJhbGlhc1BhdGhzIiwiY29tcGlsZXJPcHRpb25zIiwicGF0aHMiLCJ1bmRlZmluZWQiLCJiYXNlVXJsIiwiZ2V0QmFzZVVybCIsInJlc29sdmUiLCJvcHRpb25zIiwidHlwZSIsIndpdGhPcHRpb25zIiwibWVyZ2VBcnJheXMiLCJjcmVhdGVGaWxlQ29uZmlnIiwiZmlsZSIsImJhc2VDb25maWciLCJjb25maWciLCJmaWxlbmFtZSIsImZ1bGxQYXRoIiwidmFsaWRhdGUiLCJpc0Fic29sdXRlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPQSxVQUFVLFlBQVk7QUFFN0IsU0FBU0MsS0FBSyxRQUFRLDhCQUE4QjtBQUVwRCxTQUFTQyxLQUFLLFFBQVEsMEJBQTBCO0FBRWhELFNBQVNDLFVBQVUsUUFBUSxlQUFlO0FBSTFDLE1BQU1DLGlCQUFpQjtJQUN0QkMsS0FBSztRQUNKQyxRQUFRO1lBQ1BDLFFBQVE7WUFDUkMsWUFBWTtRQUNiO1FBQ0FDLFFBQVE7UUFDUkMsV0FBVztZQUNWQyxtQkFBbUI7UUFDcEI7UUFDQUMsY0FBYztZQUFFQyxzQkFBc0I7UUFBSztJQUM1QztJQUNBQyxRQUFRO1FBQ1BDLGNBQWM7SUFDZjtJQUNBQyxZQUFZO0FBQ2I7QUFHQSxPQUFPLE1BQU1DO0lBQ1o7OztFQUdDLEdBQ0QsQUFBT0MsaUJBQ05DLFdBQTRCLEVBQzVCQyxhQUErQixFQUNyQjtRQUNWLE1BQU0sRUFBRUMsVUFBVSxFQUFFQyxRQUFRLEVBQUVDLFVBQVUsRUFBRSxHQUFHSDtRQUM3QyxNQUFNLEVBQUVJLGVBQWUsRUFBRSxHQUFHRixZQUFZLENBQUM7UUFDekMsTUFBTUcsUUFBUUYsYUFBYUMsaUJBQWlCQyxRQUFRQztRQUNwRCxNQUFNQyxVQUNMVixpQkFBaUJXLFVBQVUsQ0FBQ04sYUFBY0csQ0FBQUEsU0FBUyxPQUFPekIsS0FBSzZCLE9BQU8sQ0FBQyxPQUFPSCxTQUFRO1FBRXZGLE1BQU1JLFVBQW1CO1lBQ3hCekIsS0FBSztnQkFDSnNCO2dCQUNBRjtZQUNEO1lBQ0FYLFFBQVE7Z0JBQ1BpQixNQUFNWjtZQUNQO1FBQ0Q7UUFFQSxPQUFPakIsTUFBTThCLFdBQVcsQ0FDdkI7WUFBRUMsYUFBYTtRQUFNLEdBQ3JCN0IsZ0JBQ0EwQixTQUNBVCxjQUFjLENBQUM7SUFFakI7SUFFQSw2REFBNkQsR0FDN0QsQUFBT2EsaUJBQWlCQyxJQUFZLEVBQUVDLFVBQW1CLEVBQVc7UUFDbkUsTUFBTUMsU0FBUztZQUFFLEdBQUdELFVBQVU7WUFBRUUsVUFBVUgsS0FBS0ksUUFBUTtRQUFDO1FBQ3hELElBQUksQ0FBQ0MsUUFBUSxDQUFDSDtRQUNkLE9BQU9BO0lBQ1I7SUFFQTs7Ozs7OztFQU9DLEdBQ0QsQUFBT0csU0FBU1YsT0FBZ0IsRUFBUTtRQUN2QyxNQUFNSCxVQUFVRyxRQUFRekIsR0FBRyxFQUFFc0I7UUFDN0IsSUFBSUEsV0FBVyxRQUFRLENBQUMzQixLQUFLeUMsVUFBVSxDQUFDZCxVQUFVO1lBQ2pELE1BQU0sSUFBSXhCLFdBQ1QsQ0FBQyxpRkFBaUYsRUFBRXdCLFFBQVEsb0NBQW9DLENBQUM7UUFFbkk7SUFDRDtJQUVBLGlGQUFpRixHQUNqRixPQUFlQyxXQUFXTixRQUE4QixFQUFzQjtRQUM3RSxNQUFNSyxVQUFVTCxVQUFVRSxpQkFBaUJHO1FBQzNDLElBQUlBLFdBQVcsTUFBTSxPQUFPRDtRQUM1QixPQUFPMUIsS0FBSzZCLE9BQU8sQ0FBQ0Y7SUFDckI7QUFDRCJ9
@@ -0,0 +1,58 @@
1
+ import { UserConfigFactory, WorkspaceFactory } from "@decohere/mesh";
2
+ import { ModuleManifest } from "@decohere/nexus/cli";
3
+ import * as Actions from "./actions/index.js";
4
+ import * as Commands from "./commands/index.js";
5
+ import { DependencyResolver } from "./services/dependency-resolver.service.js";
6
+ import { FileWriterService } from "./services/file-writer.service.js";
7
+ import { SwcTranspiler } from "./services/swc-transpiler.js";
8
+ import { TypeEmitter } from "./services/type-emitter.js";
9
+ import { TransformerKey } from "./types/transformer.type.js";
10
+ import { DefaultConfigurations, WorkspaceDefaults } from "./workspace.config.js";
11
+ export class ForgeModule extends ModuleManifest {
12
+ id = "forge";
13
+ command = Commands.ForgeCommand;
14
+ actions = {
15
+ clean: Actions.Clean,
16
+ copy: Actions.Copy,
17
+ build: Actions.Build,
18
+ watch: Actions.Watch,
19
+ publish: Actions.Publish,
20
+ syncDependencies: Actions.SyncDependencies,
21
+ syncLockFile: Actions.SyncLockFile,
22
+ reportDependencies: Actions.ReportDependencies,
23
+ version: Actions.Version,
24
+ tag: Actions.Tag,
25
+ commitFiles: Actions.CommitFiles
26
+ };
27
+ commands = {
28
+ build: Commands.BuildCommand,
29
+ publish: Commands.PublishCommand,
30
+ dependencies: Commands.DependencyCommand,
31
+ version: Commands.VersionCommand,
32
+ tag: Commands.TagCommand
33
+ };
34
+ registerServices(builder) {
35
+ builder.registerSingleton(TransformerKey, SwcTranspiler);
36
+ builder.registerSingleton(TransformerKey, TypeEmitter);
37
+ builder.registerSingleton(DependencyResolver);
38
+ builder.registerSingleton(FileWriterService);
39
+ }
40
+ async createWorkspace(options) {
41
+ const { configurations: _, ...forgeDefaults } = WorkspaceDefaults;
42
+ const userConfig = await UserConfigFactory.getUserConfig(options.configFile);
43
+ // Only apply forge default configurations when user config doesn't provide any.
44
+ // This ensures user-defined configurations take priority while still providing
45
+ // sensible defaults (debug + release) when no config file is present.
46
+ const configurations = userConfig.configurations?.length ? undefined : DefaultConfigurations;
47
+ return WorkspaceFactory.create({
48
+ ...forgeDefaults,
49
+ ...configurations ? {
50
+ configurations
51
+ } : {},
52
+ configFile: options.configFile,
53
+ rootDir: options.rootDir ?? WorkspaceDefaults.rootDir
54
+ });
55
+ }
56
+ }
57
+
58
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvZm9yZ2Uvc3JjL2ZvcmdlLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBVc2VyQ29uZmlnRmFjdG9yeSwgV29ya3NwYWNlRmFjdG9yeSB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VGYWN0b3J5T3B0aW9ucyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBNb2R1bGVNYW5pZmVzdCB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRhaW5lckJ1aWxkZXIgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NvbXBvc2l0aW9uXCI7XG5pbXBvcnQgKiBhcyBBY3Rpb25zIGZyb20gXCIuL2FjdGlvbnMvaW5kZXguanNcIjtcbmltcG9ydCAqIGFzIENvbW1hbmRzIGZyb20gXCIuL2NvbW1hbmRzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBEZXBlbmRlbmN5UmVzb2x2ZXIgfSBmcm9tIFwiLi9zZXJ2aWNlcy9kZXBlbmRlbmN5LXJlc29sdmVyLnNlcnZpY2UuanNcIjtcbmltcG9ydCB7IEZpbGVXcml0ZXJTZXJ2aWNlIH0gZnJvbSBcIi4vc2VydmljZXMvZmlsZS13cml0ZXIuc2VydmljZS5qc1wiO1xuaW1wb3J0IHsgU3djVHJhbnNwaWxlciB9IGZyb20gXCIuL3NlcnZpY2VzL3N3Yy10cmFuc3BpbGVyLmpzXCI7XG5pbXBvcnQgeyBUeXBlRW1pdHRlciB9IGZyb20gXCIuL3NlcnZpY2VzL3R5cGUtZW1pdHRlci5qc1wiO1xuaW1wb3J0IHsgVHJhbnNmb3JtZXJLZXkgfSBmcm9tIFwiLi90eXBlcy90cmFuc2Zvcm1lci50eXBlLmpzXCI7XG5pbXBvcnQgeyBEZWZhdWx0Q29uZmlndXJhdGlvbnMsIFdvcmtzcGFjZURlZmF1bHRzIH0gZnJvbSBcIi4vd29ya3NwYWNlLmNvbmZpZy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgRm9yZ2VNb2R1bGUgZXh0ZW5kcyBNb2R1bGVNYW5pZmVzdCB7XG5cdHB1YmxpYyByZWFkb25seSBpZCA9IFwiZm9yZ2VcIjtcblx0cHVibGljIHJlYWRvbmx5IGNvbW1hbmQgPSBDb21tYW5kcy5Gb3JnZUNvbW1hbmQ7XG5cdHB1YmxpYyByZWFkb25seSBhY3Rpb25zID0ge1xuXHRcdGNsZWFuOiBBY3Rpb25zLkNsZWFuLFxuXHRcdGNvcHk6IEFjdGlvbnMuQ29weSxcblx0XHRidWlsZDogQWN0aW9ucy5CdWlsZCxcblx0XHR3YXRjaDogQWN0aW9ucy5XYXRjaCxcblx0XHRwdWJsaXNoOiBBY3Rpb25zLlB1Ymxpc2gsXG5cdFx0c3luY0RlcGVuZGVuY2llczogQWN0aW9ucy5TeW5jRGVwZW5kZW5jaWVzLFxuXHRcdHN5bmNMb2NrRmlsZTogQWN0aW9ucy5TeW5jTG9ja0ZpbGUsXG5cdFx0cmVwb3J0RGVwZW5kZW5jaWVzOiBBY3Rpb25zLlJlcG9ydERlcGVuZGVuY2llcyxcblx0XHR2ZXJzaW9uOiBBY3Rpb25zLlZlcnNpb24sXG5cdFx0dGFnOiBBY3Rpb25zLlRhZyxcblx0XHRjb21taXRGaWxlczogQWN0aW9ucy5Db21taXRGaWxlcyxcblx0fTtcblx0cHVibGljIHJlYWRvbmx5IGNvbW1hbmRzID0ge1xuXHRcdGJ1aWxkOiBDb21tYW5kcy5CdWlsZENvbW1hbmQsXG5cdFx0cHVibGlzaDogQ29tbWFuZHMuUHVibGlzaENvbW1hbmQsXG5cdFx0ZGVwZW5kZW5jaWVzOiBDb21tYW5kcy5EZXBlbmRlbmN5Q29tbWFuZCxcblx0XHR2ZXJzaW9uOiBDb21tYW5kcy5WZXJzaW9uQ29tbWFuZCxcblx0XHR0YWc6IENvbW1hbmRzLlRhZ0NvbW1hbmQsXG5cdH07XG5cblx0cHVibGljIHJlZ2lzdGVyU2VydmljZXMoYnVpbGRlcjogQ29udGFpbmVyQnVpbGRlcikge1xuXHRcdGJ1aWxkZXIucmVnaXN0ZXJTaW5nbGV0b24oVHJhbnNmb3JtZXJLZXksIFN3Y1RyYW5zcGlsZXIpO1xuXHRcdGJ1aWxkZXIucmVnaXN0ZXJTaW5nbGV0b24oVHJhbnNmb3JtZXJLZXksIFR5cGVFbWl0dGVyKTtcblx0XHRidWlsZGVyLnJlZ2lzdGVyU2luZ2xldG9uKERlcGVuZGVuY3lSZXNvbHZlcik7XG5cdFx0YnVpbGRlci5yZWdpc3RlclNpbmdsZXRvbihGaWxlV3JpdGVyU2VydmljZSk7XG5cdH1cblxuXHRwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlV29ya3NwYWNlKG9wdGlvbnM6IFdvcmtzcGFjZUZhY3RvcnlPcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBjb25maWd1cmF0aW9uczogXywgLi4uZm9yZ2VEZWZhdWx0cyB9ID0gV29ya3NwYWNlRGVmYXVsdHM7XG5cdFx0Y29uc3QgdXNlckNvbmZpZyA9IGF3YWl0IFVzZXJDb25maWdGYWN0b3J5LmdldFVzZXJDb25maWcob3B0aW9ucy5jb25maWdGaWxlKTtcblx0XHQvLyBPbmx5IGFwcGx5IGZvcmdlIGRlZmF1bHQgY29uZmlndXJhdGlvbnMgd2hlbiB1c2VyIGNvbmZpZyBkb2Vzbid0IHByb3ZpZGUgYW55LlxuXHRcdC8vIFRoaXMgZW5zdXJlcyB1c2VyLWRlZmluZWQgY29uZmlndXJhdGlvbnMgdGFrZSBwcmlvcml0eSB3aGlsZSBzdGlsbCBwcm92aWRpbmdcblx0XHQvLyBzZW5zaWJsZSBkZWZhdWx0cyAoZGVidWcgKyByZWxlYXNlKSB3aGVuIG5vIGNvbmZpZyBmaWxlIGlzIHByZXNlbnQuXG5cdFx0Y29uc3QgY29uZmlndXJhdGlvbnMgPSB1c2VyQ29uZmlnLmNvbmZpZ3VyYXRpb25zPy5sZW5ndGhcblx0XHRcdD8gdW5kZWZpbmVkXG5cdFx0XHQ6IERlZmF1bHRDb25maWd1cmF0aW9ucztcblx0XHRyZXR1cm4gV29ya3NwYWNlRmFjdG9yeS5jcmVhdGUoe1xuXHRcdFx0Li4uZm9yZ2VEZWZhdWx0cyxcblx0XHRcdC4uLihjb25maWd1cmF0aW9ucyA/IHsgY29uZmlndXJhdGlvbnMgfSA6IHt9KSxcblx0XHRcdGNvbmZpZ0ZpbGU6IG9wdGlvbnMuY29uZmlnRmlsZSxcblx0XHRcdHJvb3REaXI6IG9wdGlvbnMucm9vdERpciA/PyBXb3Jrc3BhY2VEZWZhdWx0cy5yb290RGlyLFxuXHRcdH0pO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiVXNlckNvbmZpZ0ZhY3RvcnkiLCJXb3Jrc3BhY2VGYWN0b3J5IiwiTW9kdWxlTWFuaWZlc3QiLCJBY3Rpb25zIiwiQ29tbWFuZHMiLCJEZXBlbmRlbmN5UmVzb2x2ZXIiLCJGaWxlV3JpdGVyU2VydmljZSIsIlN3Y1RyYW5zcGlsZXIiLCJUeXBlRW1pdHRlciIsIlRyYW5zZm9ybWVyS2V5IiwiRGVmYXVsdENvbmZpZ3VyYXRpb25zIiwiV29ya3NwYWNlRGVmYXVsdHMiLCJGb3JnZU1vZHVsZSIsImlkIiwiY29tbWFuZCIsIkZvcmdlQ29tbWFuZCIsImFjdGlvbnMiLCJjbGVhbiIsIkNsZWFuIiwiY29weSIsIkNvcHkiLCJidWlsZCIsIkJ1aWxkIiwid2F0Y2giLCJXYXRjaCIsInB1Ymxpc2giLCJQdWJsaXNoIiwic3luY0RlcGVuZGVuY2llcyIsIlN5bmNEZXBlbmRlbmNpZXMiLCJzeW5jTG9ja0ZpbGUiLCJTeW5jTG9ja0ZpbGUiLCJyZXBvcnREZXBlbmRlbmNpZXMiLCJSZXBvcnREZXBlbmRlbmNpZXMiLCJ2ZXJzaW9uIiwiVmVyc2lvbiIsInRhZyIsIlRhZyIsImNvbW1pdEZpbGVzIiwiQ29tbWl0RmlsZXMiLCJjb21tYW5kcyIsIkJ1aWxkQ29tbWFuZCIsIlB1Ymxpc2hDb21tYW5kIiwiZGVwZW5kZW5jaWVzIiwiRGVwZW5kZW5jeUNvbW1hbmQiLCJWZXJzaW9uQ29tbWFuZCIsIlRhZ0NvbW1hbmQiLCJyZWdpc3RlclNlcnZpY2VzIiwiYnVpbGRlciIsInJlZ2lzdGVyU2luZ2xldG9uIiwiY3JlYXRlV29ya3NwYWNlIiwib3B0aW9ucyIsImNvbmZpZ3VyYXRpb25zIiwiXyIsImZvcmdlRGVmYXVsdHMiLCJ1c2VyQ29uZmlnIiwiZ2V0VXNlckNvbmZpZyIsImNvbmZpZ0ZpbGUiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJjcmVhdGUiLCJyb290RGlyIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxpQkFBaUIsRUFBRUMsZ0JBQWdCLFFBQVEsaUJBQWlCO0FBRXJFLFNBQVNDLGNBQWMsUUFBUSxzQkFBc0I7QUFFckQsWUFBWUMsYUFBYSxxQkFBcUI7QUFDOUMsWUFBWUMsY0FBYyxzQkFBc0I7QUFDaEQsU0FBU0Msa0JBQWtCLFFBQVEsNENBQTRDO0FBQy9FLFNBQVNDLGlCQUFpQixRQUFRLG9DQUFvQztBQUN0RSxTQUFTQyxhQUFhLFFBQVEsK0JBQStCO0FBQzdELFNBQVNDLFdBQVcsUUFBUSw2QkFBNkI7QUFDekQsU0FBU0MsY0FBYyxRQUFRLDhCQUE4QjtBQUM3RCxTQUFTQyxxQkFBcUIsRUFBRUMsaUJBQWlCLFFBQVEsd0JBQXdCO0FBRWpGLE9BQU8sTUFBTUMsb0JBQW9CVjtJQUNoQlcsS0FBSyxRQUFRO0lBQ2JDLFVBQVVWLFNBQVNXLFlBQVksQ0FBQztJQUNoQ0MsVUFBVTtRQUN6QkMsT0FBT2QsUUFBUWUsS0FBSztRQUNwQkMsTUFBTWhCLFFBQVFpQixJQUFJO1FBQ2xCQyxPQUFPbEIsUUFBUW1CLEtBQUs7UUFDcEJDLE9BQU9wQixRQUFRcUIsS0FBSztRQUNwQkMsU0FBU3RCLFFBQVF1QixPQUFPO1FBQ3hCQyxrQkFBa0J4QixRQUFReUIsZ0JBQWdCO1FBQzFDQyxjQUFjMUIsUUFBUTJCLFlBQVk7UUFDbENDLG9CQUFvQjVCLFFBQVE2QixrQkFBa0I7UUFDOUNDLFNBQVM5QixRQUFRK0IsT0FBTztRQUN4QkMsS0FBS2hDLFFBQVFpQyxHQUFHO1FBQ2hCQyxhQUFhbEMsUUFBUW1DLFdBQVc7SUFDakMsRUFBRTtJQUNjQyxXQUFXO1FBQzFCbEIsT0FBT2pCLFNBQVNvQyxZQUFZO1FBQzVCZixTQUFTckIsU0FBU3FDLGNBQWM7UUFDaENDLGNBQWN0QyxTQUFTdUMsaUJBQWlCO1FBQ3hDVixTQUFTN0IsU0FBU3dDLGNBQWM7UUFDaENULEtBQUsvQixTQUFTeUMsVUFBVTtJQUN6QixFQUFFO0lBRUtDLGlCQUFpQkMsT0FBeUIsRUFBRTtRQUNsREEsUUFBUUMsaUJBQWlCLENBQUN2QyxnQkFBZ0JGO1FBQzFDd0MsUUFBUUMsaUJBQWlCLENBQUN2QyxnQkFBZ0JEO1FBQzFDdUMsUUFBUUMsaUJBQWlCLENBQUMzQztRQUMxQjBDLFFBQVFDLGlCQUFpQixDQUFDMUM7SUFDM0I7SUFFQSxNQUFzQjJDLGdCQUFnQkMsT0FBZ0MsRUFBRTtRQUN2RSxNQUFNLEVBQUVDLGdCQUFnQkMsQ0FBQyxFQUFFLEdBQUdDLGVBQWUsR0FBRzFDO1FBQ2hELE1BQU0yQyxhQUFhLE1BQU10RCxrQkFBa0J1RCxhQUFhLENBQUNMLFFBQVFNLFVBQVU7UUFDM0UsZ0ZBQWdGO1FBQ2hGLCtFQUErRTtRQUMvRSxzRUFBc0U7UUFDdEUsTUFBTUwsaUJBQWlCRyxXQUFXSCxjQUFjLEVBQUVNLFNBQy9DQyxZQUNBaEQ7UUFDSCxPQUFPVCxpQkFBaUIwRCxNQUFNLENBQUM7WUFDOUIsR0FBR04sYUFBYTtZQUNoQixHQUFJRixpQkFBaUI7Z0JBQUVBO1lBQWUsSUFBSSxDQUFDLENBQUM7WUFDNUNLLFlBQVlOLFFBQVFNLFVBQVU7WUFDOUJJLFNBQVNWLFFBQVFVLE9BQU8sSUFBSWpELGtCQUFrQmlELE9BQU87UUFDdEQ7SUFDRDtBQUNEIn0=
@@ -0,0 +1,4 @@
1
+ export { ForgeError } from "./errors.js";
2
+ export { ForgeModule } from "./forge.module.js";
3
+
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvZm9yZ2Uvc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IEZvcmdlRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmV4cG9ydCB7IEZvcmdlTW9kdWxlIH0gZnJvbSBcIi4vZm9yZ2UubW9kdWxlLmpzXCI7XG5leHBvcnQgdHlwZSB7IEZvcmdlQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL3R5cGVzL2NvbmZpZ3VyYXRpb24udHlwZS5qc1wiO1xuZXhwb3J0IHR5cGUgeyBXb3Jrc3BhY2VPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXMvd29ya3NwYWNlLWNvbmZpZy50eXBlLmpzXCI7XG4iXSwibmFtZXMiOlsiRm9yZ2VFcnJvciIsIkZvcmdlTW9kdWxlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxVQUFVLFFBQVEsY0FBYztBQUN6QyxTQUFTQyxXQUFXLFFBQVEsb0JBQW9CIn0=
@@ -0,0 +1,32 @@
1
+ import { io } from "@decohere/nexus/io";
2
+ export class CachesOutputs {
3
+ /** Maps source file fullPath -> output TransformResponses for cleanup in watch mode. */ get outputCache() {
4
+ const self = this;
5
+ if (self.__outputCache == null) {
6
+ self.__outputCache = new Map();
7
+ }
8
+ return self.__outputCache;
9
+ }
10
+ cacheOutputs(responses) {
11
+ for (const response of responses){
12
+ if (response.outcome !== "success") continue;
13
+ const existing = this.outputCache.get(response.file.fullPath) ?? [];
14
+ this.outputCache.set(response.file.fullPath, [
15
+ ...existing,
16
+ response
17
+ ]);
18
+ }
19
+ }
20
+ deleteCachedOutputs(filePath) {
21
+ const outputs = this.outputCache.get(filePath);
22
+ if (outputs == null) return;
23
+ for (const response of outputs){
24
+ if (response.outputPath != null) {
25
+ void io.deleteFile(response.outputPath);
26
+ }
27
+ }
28
+ this.outputCache.delete(filePath);
29
+ }
30
+ }
31
+
32
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvZm9yZ2Uvc3JjL21peGlucy9jYWNoZXMtb3V0cHV0cy5taXhpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB0eXBlIHsgVHJhbnNmb3JtUmVzcG9uc2UgfSBmcm9tIFwiLi4vdHlwZXMvdHJhbnNmb3JtLXJlc3BvbnNlLm1vZGVsLmpzXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDYWNoZXNPdXRwdXRzIHtcblx0LyoqIE1hcHMgc291cmNlIGZpbGUgZnVsbFBhdGggLT4gb3V0cHV0IFRyYW5zZm9ybVJlc3BvbnNlcyBmb3IgY2xlYW51cCBpbiB3YXRjaCBtb2RlLiAqL1xuXHRwcm90ZWN0ZWQgZ2V0IG91dHB1dENhY2hlKCk6IE1hcDxzdHJpbmcsIFRyYW5zZm9ybVJlc3BvbnNlW10+IHtcblx0XHRjb25zdCBzZWxmID0gdGhpcyBhcyB7IF9fb3V0cHV0Q2FjaGU/OiBNYXA8c3RyaW5nLCBUcmFuc2Zvcm1SZXNwb25zZVtdPiB9O1xuXHRcdGlmIChzZWxmLl9fb3V0cHV0Q2FjaGUgPT0gbnVsbCkge1xuXHRcdFx0c2VsZi5fX291dHB1dENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFRyYW5zZm9ybVJlc3BvbnNlW10+KCk7XG5cdFx0fVxuXHRcdHJldHVybiBzZWxmLl9fb3V0cHV0Q2FjaGU7XG5cdH1cblxuXHRwcm90ZWN0ZWQgY2FjaGVPdXRwdXRzKHJlc3BvbnNlczogVHJhbnNmb3JtUmVzcG9uc2VbXSk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgcmVzcG9uc2VzKSB7XG5cdFx0XHRpZiAocmVzcG9uc2Uub3V0Y29tZSAhPT0gXCJzdWNjZXNzXCIpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3QgZXhpc3RpbmcgPSB0aGlzLm91dHB1dENhY2hlLmdldChyZXNwb25zZS5maWxlLmZ1bGxQYXRoKSA/PyBbXTtcblx0XHRcdHRoaXMub3V0cHV0Q2FjaGUuc2V0KHJlc3BvbnNlLmZpbGUuZnVsbFBhdGgsIFsuLi5leGlzdGluZywgcmVzcG9uc2VdKTtcblx0XHR9XG5cdH1cblxuXHRwcm90ZWN0ZWQgZGVsZXRlQ2FjaGVkT3V0cHV0cyhmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3Qgb3V0cHV0cyA9IHRoaXMub3V0cHV0Q2FjaGUuZ2V0KGZpbGVQYXRoKTtcblx0XHRpZiAob3V0cHV0cyA9PSBudWxsKSByZXR1cm47XG5cdFx0Zm9yIChjb25zdCByZXNwb25zZSBvZiBvdXRwdXRzKSB7XG5cdFx0XHRpZiAocmVzcG9uc2Uub3V0cHV0UGF0aCAhPSBudWxsKSB7XG5cdFx0XHRcdHZvaWQgaW8uZGVsZXRlRmlsZShyZXNwb25zZS5vdXRwdXRQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5vdXRwdXRDYWNoZS5kZWxldGUoZmlsZVBhdGgpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiaW8iLCJDYWNoZXNPdXRwdXRzIiwib3V0cHV0Q2FjaGUiLCJzZWxmIiwiX19vdXRwdXRDYWNoZSIsIk1hcCIsImNhY2hlT3V0cHV0cyIsInJlc3BvbnNlcyIsInJlc3BvbnNlIiwib3V0Y29tZSIsImV4aXN0aW5nIiwiZ2V0IiwiZmlsZSIsImZ1bGxQYXRoIiwic2V0IiwiZGVsZXRlQ2FjaGVkT3V0cHV0cyIsImZpbGVQYXRoIiwib3V0cHV0cyIsIm91dHB1dFBhdGgiLCJkZWxldGVGaWxlIiwiZGVsZXRlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxFQUFFLFFBQVEscUJBQXFCO0FBR3hDLE9BQU8sTUFBZUM7SUFDckIsc0ZBQXNGLEdBQ3RGLElBQWNDLGNBQWdEO1FBQzdELE1BQU1DLE9BQU8sSUFBSTtRQUNqQixJQUFJQSxLQUFLQyxhQUFhLElBQUksTUFBTTtZQUMvQkQsS0FBS0MsYUFBYSxHQUFHLElBQUlDO1FBQzFCO1FBQ0EsT0FBT0YsS0FBS0MsYUFBYTtJQUMxQjtJQUVVRSxhQUFhQyxTQUE4QixFQUFRO1FBQzVELEtBQUssTUFBTUMsWUFBWUQsVUFBVztZQUNqQyxJQUFJQyxTQUFTQyxPQUFPLEtBQUssV0FBVztZQUNwQyxNQUFNQyxXQUFXLElBQUksQ0FBQ1IsV0FBVyxDQUFDUyxHQUFHLENBQUNILFNBQVNJLElBQUksQ0FBQ0MsUUFBUSxLQUFLLEVBQUU7WUFDbkUsSUFBSSxDQUFDWCxXQUFXLENBQUNZLEdBQUcsQ0FBQ04sU0FBU0ksSUFBSSxDQUFDQyxRQUFRLEVBQUU7bUJBQUlIO2dCQUFVRjthQUFTO1FBQ3JFO0lBQ0Q7SUFFVU8sb0JBQW9CQyxRQUFnQixFQUFRO1FBQ3JELE1BQU1DLFVBQVUsSUFBSSxDQUFDZixXQUFXLENBQUNTLEdBQUcsQ0FBQ0s7UUFDckMsSUFBSUMsV0FBVyxNQUFNO1FBQ3JCLEtBQUssTUFBTVQsWUFBWVMsUUFBUztZQUMvQixJQUFJVCxTQUFTVSxVQUFVLElBQUksTUFBTTtnQkFDaEMsS0FBS2xCLEdBQUdtQixVQUFVLENBQUNYLFNBQVNVLFVBQVU7WUFDdkM7UUFDRDtRQUNBLElBQUksQ0FBQ2hCLFdBQVcsQ0FBQ2tCLE1BQU0sQ0FBQ0o7SUFDekI7QUFDRCJ9
@@ -0,0 +1,26 @@
1
+ import { Subject } from "rxjs";
2
+ // WeakMap avoids the private-field-in-mixin problem: private class fields (#x)
3
+ // are not accessible when methods are copied onto a different class prototype.
4
+ const subjects = new WeakMap();
5
+ function getSubject(instance) {
6
+ let subject = subjects.get(instance);
7
+ if (subject == null) {
8
+ subject = new Subject();
9
+ subjects.set(instance, subject);
10
+ }
11
+ return subject;
12
+ }
13
+ export class IncrementalTransform {
14
+ get incrementalTransform$() {
15
+ return getSubject(this).asObservable();
16
+ }
17
+ watch(workspace) {
18
+ workspace.projectFileChanged$.subscribe((evt)=>{
19
+ void this.onIncrementalFileEvent(evt).then((responses)=>{
20
+ getSubject(this).next(responses);
21
+ });
22
+ });
23
+ }
24
+ }
25
+
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvZm9yZ2Uvc3JjL21peGlucy9pbmNyZW1lbnRhbC10cmFuc2Zvcm0ubWl4aW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcm9qZWN0RmlsZUV2ZW50LCBXb3Jrc3BhY2UgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB0eXBlIHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB0eXBlIHsgVHJhbnNmb3JtUmVzcG9uc2UgfSBmcm9tIFwiLi4vdHlwZXMvdHJhbnNmb3JtLXJlc3BvbnNlLm1vZGVsLmpzXCI7XG5cbi8vIFdlYWtNYXAgYXZvaWRzIHRoZSBwcml2YXRlLWZpZWxkLWluLW1peGluIHByb2JsZW06IHByaXZhdGUgY2xhc3MgZmllbGRzICgjeClcbi8vIGFyZSBub3QgYWNjZXNzaWJsZSB3aGVuIG1ldGhvZHMgYXJlIGNvcGllZCBvbnRvIGEgZGlmZmVyZW50IGNsYXNzIHByb3RvdHlwZS5cbmNvbnN0IHN1YmplY3RzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBTdWJqZWN0PFRyYW5zZm9ybVJlc3BvbnNlW10+PigpO1xuXG5mdW5jdGlvbiBnZXRTdWJqZWN0KGluc3RhbmNlOiBvYmplY3QpOiBTdWJqZWN0PFRyYW5zZm9ybVJlc3BvbnNlW10+IHtcblx0bGV0IHN1YmplY3QgPSBzdWJqZWN0cy5nZXQoaW5zdGFuY2UpO1xuXHRpZiAoc3ViamVjdCA9PSBudWxsKSB7XG5cdFx0c3ViamVjdCA9IG5ldyBTdWJqZWN0PFRyYW5zZm9ybVJlc3BvbnNlW10+KCk7XG5cdFx0c3ViamVjdHMuc2V0KGluc3RhbmNlLCBzdWJqZWN0KTtcblx0fVxuXHRyZXR1cm4gc3ViamVjdDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEluY3JlbWVudGFsVHJhbnNmb3JtIHtcblx0cHVibGljIGdldCBpbmNyZW1lbnRhbFRyYW5zZm9ybSQoKTogT2JzZXJ2YWJsZTxUcmFuc2Zvcm1SZXNwb25zZVtdPiB7XG5cdFx0cmV0dXJuIGdldFN1YmplY3QodGhpcykuYXNPYnNlcnZhYmxlKCk7XG5cdH1cblxuXHRwdWJsaWMgd2F0Y2god29ya3NwYWNlOiBXb3Jrc3BhY2UpOiB2b2lkIHtcblx0XHR3b3Jrc3BhY2UucHJvamVjdEZpbGVDaGFuZ2VkJC5zdWJzY3JpYmUoKGV2dCkgPT4ge1xuXHRcdFx0dm9pZCB0aGlzLm9uSW5jcmVtZW50YWxGaWxlRXZlbnQoZXZ0KS50aGVuKChyZXNwb25zZXMpID0+IHtcblx0XHRcdFx0Z2V0U3ViamVjdCh0aGlzKS5uZXh0KHJlc3BvbnNlcyk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgZm9yIGV2ZXJ5IHdvcmtzcGFjZSBmaWxlIGNoYW5nZS4gSW1wbGVtZW50YXRpb25zIHNob3VsZCBpbnZhbGlkYXRlXG5cdCAqIGFueSBpbnRlcm5hbCBjYWNoZXMsIHBlcmZvcm0gdGhlIGluY3JlbWVudGFsIHRyYW5zZm9ybSwgYW5kIHJldHVybiB0aGUgcmVzdWx0cy5cblx0ICogUmV0dXJuIGFuIGVtcHR5IGFycmF5IGZvciBkZWxldGlvbnMgb3Igd2hlbiBubyBvdXRwdXQgaXMgcHJvZHVjZWQuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYWJzdHJhY3Qgb25JbmNyZW1lbnRhbEZpbGVFdmVudChcblx0XHRldnQ6IFByb2plY3RGaWxlRXZlbnQsXG5cdCk6IFByb21pc2U8VHJhbnNmb3JtUmVzcG9uc2VbXT47XG59XG4iXSwibmFtZXMiOlsiU3ViamVjdCIsInN1YmplY3RzIiwiV2Vha01hcCIsImdldFN1YmplY3QiLCJpbnN0YW5jZSIsInN1YmplY3QiLCJnZXQiLCJzZXQiLCJJbmNyZW1lbnRhbFRyYW5zZm9ybSIsImluY3JlbWVudGFsVHJhbnNmb3JtJCIsImFzT2JzZXJ2YWJsZSIsIndhdGNoIiwid29ya3NwYWNlIiwicHJvamVjdEZpbGVDaGFuZ2VkJCIsInN1YnNjcmliZSIsImV2dCIsIm9uSW5jcmVtZW50YWxGaWxlRXZlbnQiLCJ0aGVuIiwicmVzcG9uc2VzIiwibmV4dCJdLCJtYXBwaW5ncyI6IkFBRUEsU0FBU0EsT0FBTyxRQUFRLE9BQU87QUFHL0IsK0VBQStFO0FBQy9FLCtFQUErRTtBQUMvRSxNQUFNQyxXQUFXLElBQUlDO0FBRXJCLFNBQVNDLFdBQVdDLFFBQWdCO0lBQ25DLElBQUlDLFVBQVVKLFNBQVNLLEdBQUcsQ0FBQ0Y7SUFDM0IsSUFBSUMsV0FBVyxNQUFNO1FBQ3BCQSxVQUFVLElBQUlMO1FBQ2RDLFNBQVNNLEdBQUcsQ0FBQ0gsVUFBVUM7SUFDeEI7SUFDQSxPQUFPQTtBQUNSO0FBRUEsT0FBTyxNQUFlRztJQUNyQixJQUFXQyx3QkFBeUQ7UUFDbkUsT0FBT04sV0FBVyxJQUFJLEVBQUVPLFlBQVk7SUFDckM7SUFFT0MsTUFBTUMsU0FBb0IsRUFBUTtRQUN4Q0EsVUFBVUMsbUJBQW1CLENBQUNDLFNBQVMsQ0FBQyxDQUFDQztZQUN4QyxLQUFLLElBQUksQ0FBQ0Msc0JBQXNCLENBQUNELEtBQUtFLElBQUksQ0FBQyxDQUFDQztnQkFDM0NmLFdBQVcsSUFBSSxFQUFFZ0IsSUFBSSxDQUFDRDtZQUN2QjtRQUNEO0lBQ0Q7QUFVRCJ9
@@ -0,0 +1,162 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ import { injectable } from "@decohere/crucible/decorators";
8
+ import { io } from "@decohere/nexus/io";
9
+ import { parseImports } from "parse-imports";
10
+ import { BUILT_IN_MODULES } from "../const.js";
11
+ import { ForgeError } from "../errors.js";
12
+ export class DependencyResolver {
13
+ computeDrift(current, computed) {
14
+ const sortKeys = (obj)=>Object.fromEntries(Object.entries(obj).sort());
15
+ const currentDeps = sortKeys(current.dependencies ?? {});
16
+ const computedDeps = sortKeys(computed.dependencies ?? {});
17
+ const currentDevDeps = sortKeys(current.devDependencies ?? {});
18
+ const computedDevDeps = sortKeys(computed.devDependencies ?? {});
19
+ const hasDrift = JSON.stringify(currentDeps) !== JSON.stringify(computedDeps) || JSON.stringify(currentDevDeps) !== JSON.stringify(computedDevDeps);
20
+ if (!hasDrift) {
21
+ return null;
22
+ }
23
+ return {
24
+ original: {
25
+ dependencies: currentDeps,
26
+ devDependencies: currentDevDeps
27
+ },
28
+ updated: {
29
+ dependencies: computedDeps,
30
+ devDependencies: computedDevDeps
31
+ }
32
+ };
33
+ }
34
+ async getWorkspacePackages(workspace, projects) {
35
+ const packageJson = await workspace.getPackageJson().catch(()=>{
36
+ throw new Error(`Root package.json not found at "${workspace.packageJsonDirectory}/package.json". ` + `Ensure the workspace root has a package.json with dependencies listed.`);
37
+ });
38
+ const internals = new Map(await Promise.all(projects.map(async (proj)=>{
39
+ const packageJson = await proj.getPackageJson();
40
+ return [
41
+ packageJson.name,
42
+ {
43
+ name: packageJson.name,
44
+ version: packageJson.version,
45
+ isInternal: true
46
+ }
47
+ ];
48
+ })));
49
+ const packages = Object.entries(packageJson.dependencies).filter(([key])=>!internals.has(key)).map(([key, val])=>[
50
+ key,
51
+ {
52
+ name: key,
53
+ version: val
54
+ }
55
+ ]);
56
+ const devPackages = Object.entries(packageJson.devDependencies).filter(([key])=>!internals.has(key)).map(([key, val])=>[
57
+ key,
58
+ {
59
+ name: key,
60
+ version: val,
61
+ isDev: true
62
+ }
63
+ ]);
64
+ return new Map([
65
+ ...packages,
66
+ ...devPackages,
67
+ ...internals
68
+ ]);
69
+ }
70
+ async computeProjectDependencies(project, workspacePackages) {
71
+ const { dependencies, devDependencies, warnings } = await this.getDependencies(project, workspacePackages);
72
+ const pkg = await project.getPackageJson();
73
+ const updatedPackage = pkg.withDependencies(dependencies).withDevDependencies(devDependencies);
74
+ return {
75
+ project,
76
+ updatedPackage,
77
+ warnings
78
+ };
79
+ }
80
+ async getDependencies(project, workspacePackages) {
81
+ const files = await project.getAllFiles();
82
+ const results = await Promise.all(files.map((file)=>this.getFileImports(file)));
83
+ const imports = results.flatMap((r)=>r.imports);
84
+ const warnings = results.flatMap((r)=>r.warnings);
85
+ const allDependencies = [
86
+ ...new Set(imports)
87
+ ].map((fileImport)=>this.getDependencyFrom(fileImport, workspacePackages)).filter((dep)=>dep != null);
88
+ const missing = allDependencies.filter((dep)=>dep.missing);
89
+ if (missing.length > 0) {
90
+ const names = missing.map((dep)=>dep.name).join(", ");
91
+ throw new ForgeError(`Missing packages in project "${project.name}": ${names}`);
92
+ }
93
+ const resolved = allDependencies.filter((dep)=>!dep.missing);
94
+ const dependencies = Object.fromEntries(resolved.filter((dep)=>!dep.isDev).map((dep)=>[
95
+ dep.name,
96
+ dep.version
97
+ ]));
98
+ const devDependencies = Object.fromEntries(resolved.filter((dep)=>dep.isDev).map((dep)=>[
99
+ dep.name,
100
+ dep.version
101
+ ]));
102
+ return {
103
+ dependencies,
104
+ devDependencies,
105
+ warnings
106
+ };
107
+ }
108
+ getDependencyFrom(importName, workspacePackages) {
109
+ if (importName.startsWith(".") || importName.startsWith("node:")) {
110
+ return;
111
+ }
112
+ const packageNameMatch = importName.match(/^(?:(@[^/]+\/[^/]+)|([^/]+))/);
113
+ const packageName = packageNameMatch?.[0];
114
+ if (packageName == null || BUILT_IN_MODULES.includes(packageName)) {
115
+ return;
116
+ }
117
+ const packg = workspacePackages.get(packageName);
118
+ if (packg == null) {
119
+ return {
120
+ name: packageName,
121
+ version: undefined,
122
+ internal: undefined,
123
+ missing: true,
124
+ isDev: false
125
+ };
126
+ }
127
+ return {
128
+ name: packageName,
129
+ version: packg.version ?? "",
130
+ internal: packg.isInternal ?? false,
131
+ missing: false,
132
+ isDev: packg.isDev ?? false
133
+ };
134
+ }
135
+ async getFileImports(file) {
136
+ const contents = await io.readFile(file.fullPath);
137
+ const parsed = Array.from(await parseImports(contents));
138
+ const imports = [];
139
+ const warnings = [];
140
+ for (const impt of parsed){
141
+ if (impt.moduleSpecifier.value != null) {
142
+ imports.push(impt.moduleSpecifier.value);
143
+ } else if (impt.isDynamicImport) {
144
+ const line = contents.substring(0, impt.startIndex).split("\n").length;
145
+ warnings.push({
146
+ file: file.fullPath,
147
+ line,
148
+ message: `Dynamic import with non-literal specifier \`${impt.moduleSpecifier.code}\` cannot be statically resolved`
149
+ });
150
+ }
151
+ }
152
+ return {
153
+ imports,
154
+ warnings
155
+ };
156
+ }
157
+ }
158
+ DependencyResolver = _ts_decorate([
159
+ injectable()
160
+ ], DependencyResolver);
161
+
162
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvZm9yZ2Uvc3JjL3NlcnZpY2VzL2RlcGVuZGVuY3ktcmVzb2x2ZXIuc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBQcm9qZWN0LCBXb3Jrc3BhY2UgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB7IHR5cGUgRmlsZUV4LCBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IHBhcnNlSW1wb3J0cyB9IGZyb20gXCJwYXJzZS1pbXBvcnRzXCI7XG5pbXBvcnQgeyBCVUlMVF9JTl9NT0RVTEVTIH0gZnJvbSBcIi4uL2NvbnN0LmpzXCI7XG5pbXBvcnQgeyBGb3JnZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHR5cGUge1xuXHREZXBlbmRlbmN5V2FybmluZyxcblx0RHJpZnRFbnRyeSxcblx0UGFja2FnZSxcblx0UmVzb2x2ZWREZXBlbmRlbmN5LFxufSBmcm9tIFwiLi4vdHlwZXMvZGVwZW5kZW5jeS50eXBlcy5qc1wiO1xuXG5leHBvcnQgdHlwZSBQcm9qZWN0RGVwZW5kZW5jaWVzID0ge1xuXHRwcm9qZWN0OiBQcm9qZWN0O1xuXHR1cGRhdGVkUGFja2FnZTogUGFja2FnZUpzb247XG5cdHdhcm5pbmdzOiBEZXBlbmRlbmN5V2FybmluZ1tdO1xufTtcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERlcGVuZGVuY3lSZXNvbHZlciB7XG5cdHB1YmxpYyBjb21wdXRlRHJpZnQoY3VycmVudDogUGFja2FnZUpzb24sIGNvbXB1dGVkOiBQYWNrYWdlSnNvbik6IERyaWZ0RW50cnkgfCBudWxsIHtcblx0XHRjb25zdCBzb3J0S2V5cyA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pID0+XG5cdFx0XHRPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMob2JqKS5zb3J0KCkpO1xuXG5cdFx0Y29uc3QgY3VycmVudERlcHMgPSBzb3J0S2V5cyhjdXJyZW50LmRlcGVuZGVuY2llcyA/PyB7fSk7XG5cdFx0Y29uc3QgY29tcHV0ZWREZXBzID0gc29ydEtleXMoY29tcHV0ZWQuZGVwZW5kZW5jaWVzID8/IHt9KTtcblx0XHRjb25zdCBjdXJyZW50RGV2RGVwcyA9IHNvcnRLZXlzKGN1cnJlbnQuZGV2RGVwZW5kZW5jaWVzID8/IHt9KTtcblx0XHRjb25zdCBjb21wdXRlZERldkRlcHMgPSBzb3J0S2V5cyhjb21wdXRlZC5kZXZEZXBlbmRlbmNpZXMgPz8ge30pO1xuXG5cdFx0Y29uc3QgaGFzRHJpZnQgPVxuXHRcdFx0SlNPTi5zdHJpbmdpZnkoY3VycmVudERlcHMpICE9PSBKU09OLnN0cmluZ2lmeShjb21wdXRlZERlcHMpIHx8XG5cdFx0XHRKU09OLnN0cmluZ2lmeShjdXJyZW50RGV2RGVwcykgIT09IEpTT04uc3RyaW5naWZ5KGNvbXB1dGVkRGV2RGVwcyk7XG5cblx0XHRpZiAoIWhhc0RyaWZ0KSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0b3JpZ2luYWw6IHsgZGVwZW5kZW5jaWVzOiBjdXJyZW50RGVwcywgZGV2RGVwZW5kZW5jaWVzOiBjdXJyZW50RGV2RGVwcyB9LFxuXHRcdFx0dXBkYXRlZDogeyBkZXBlbmRlbmNpZXM6IGNvbXB1dGVkRGVwcywgZGV2RGVwZW5kZW5jaWVzOiBjb21wdXRlZERldkRlcHMgfSxcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGdldFdvcmtzcGFjZVBhY2thZ2VzKFxuXHRcdHdvcmtzcGFjZTogV29ya3NwYWNlLFxuXHRcdHByb2plY3RzOiByZWFkb25seSBQcm9qZWN0W10sXG5cdCk6IFByb21pc2U8TWFwPHN0cmluZywgUGFja2FnZT4+IHtcblx0XHRjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHdvcmtzcGFjZS5nZXRQYWNrYWdlSnNvbigpLmNhdGNoKCgpID0+IHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YFJvb3QgcGFja2FnZS5qc29uIG5vdCBmb3VuZCBhdCBcIiR7d29ya3NwYWNlLnBhY2thZ2VKc29uRGlyZWN0b3J5fS9wYWNrYWdlLmpzb25cIi4gYCArXG5cdFx0XHRcdFx0YEVuc3VyZSB0aGUgd29ya3NwYWNlIHJvb3QgaGFzIGEgcGFja2FnZS5qc29uIHdpdGggZGVwZW5kZW5jaWVzIGxpc3RlZC5gLFxuXHRcdFx0KTtcblx0XHR9KTtcblxuXHRcdGNvbnN0IGludGVybmFscyA9IG5ldyBNYXAoXG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdFx0cHJvamVjdHMubWFwKGFzeW5jIChwcm9qKTogUHJvbWlzZTxbc3RyaW5nLCBQYWNrYWdlXT4gPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcHJvai5nZXRQYWNrYWdlSnNvbigpO1xuXHRcdFx0XHRcdHJldHVybiBbXG5cdFx0XHRcdFx0XHRwYWNrYWdlSnNvbi5uYW1lLFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRuYW1lOiBwYWNrYWdlSnNvbi5uYW1lLFxuXHRcdFx0XHRcdFx0XHR2ZXJzaW9uOiBwYWNrYWdlSnNvbi52ZXJzaW9uLFxuXHRcdFx0XHRcdFx0XHRpc0ludGVybmFsOiB0cnVlLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdO1xuXHRcdFx0XHR9KSxcblx0XHRcdCksXG5cdFx0KTtcblxuXHRcdGNvbnN0IHBhY2thZ2VzID0gT2JqZWN0LmVudHJpZXMocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzKVxuXHRcdFx0LmZpbHRlcigoW2tleV0pID0+ICFpbnRlcm5hbHMuaGFzKGtleSkpXG5cdFx0XHQubWFwPFtzdHJpbmcsIFBhY2thZ2VdPigoW2tleSwgdmFsXSkgPT4gW2tleSwgeyBuYW1lOiBrZXksIHZlcnNpb246IHZhbCB9XSk7XG5cblx0XHRjb25zdCBkZXZQYWNrYWdlcyA9IE9iamVjdC5lbnRyaWVzKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcylcblx0XHRcdC5maWx0ZXIoKFtrZXldKSA9PiAhaW50ZXJuYWxzLmhhcyhrZXkpKVxuXHRcdFx0Lm1hcDxbc3RyaW5nLCBQYWNrYWdlXT4oKFtrZXksIHZhbF0pID0+IFtrZXksIHsgbmFtZToga2V5LCB2ZXJzaW9uOiB2YWwsIGlzRGV2OiB0cnVlIH1dKTtcblxuXHRcdHJldHVybiBuZXcgTWFwKFsuLi5wYWNrYWdlcywgLi4uZGV2UGFja2FnZXMsIC4uLmludGVybmFsc10pO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGNvbXB1dGVQcm9qZWN0RGVwZW5kZW5jaWVzKFxuXHRcdHByb2plY3Q6IFByb2plY3QsXG5cdFx0d29ya3NwYWNlUGFja2FnZXM6IE1hcDxzdHJpbmcsIFBhY2thZ2U+LFxuXHQpOiBQcm9taXNlPFByb2plY3REZXBlbmRlbmNpZXM+IHtcblx0XHRjb25zdCB7IGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCB3YXJuaW5ncyB9ID0gYXdhaXQgdGhpcy5nZXREZXBlbmRlbmNpZXMoXG5cdFx0XHRwcm9qZWN0LFxuXHRcdFx0d29ya3NwYWNlUGFja2FnZXMsXG5cdFx0KTtcblxuXHRcdGNvbnN0IHBrZyA9IGF3YWl0IHByb2plY3QuZ2V0UGFja2FnZUpzb24oKTtcblx0XHRjb25zdCB1cGRhdGVkUGFja2FnZSA9IHBrZ1xuXHRcdFx0LndpdGhEZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzKVxuXHRcdFx0LndpdGhEZXZEZXBlbmRlbmNpZXMoZGV2RGVwZW5kZW5jaWVzKTtcblxuXHRcdHJldHVybiB7IHByb2plY3QsIHVwZGF0ZWRQYWNrYWdlLCB3YXJuaW5ncyB9O1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBnZXREZXBlbmRlbmNpZXMocHJvamVjdDogUHJvamVjdCwgd29ya3NwYWNlUGFja2FnZXM6IE1hcDxzdHJpbmcsIFBhY2thZ2U+KSB7XG5cdFx0Y29uc3QgZmlsZXMgPSBhd2FpdCBwcm9qZWN0LmdldEFsbEZpbGVzKCk7XG5cdFx0Y29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGZpbGVzLm1hcCgoZmlsZSkgPT4gdGhpcy5nZXRGaWxlSW1wb3J0cyhmaWxlKSkpO1xuXHRcdGNvbnN0IGltcG9ydHMgPSByZXN1bHRzLmZsYXRNYXAoKHIpID0+IHIuaW1wb3J0cyk7XG5cdFx0Y29uc3Qgd2FybmluZ3MgPSByZXN1bHRzLmZsYXRNYXAoKHIpID0+IHIud2FybmluZ3MpO1xuXG5cdFx0Y29uc3QgYWxsRGVwZW5kZW5jaWVzID0gWy4uLm5ldyBTZXQoaW1wb3J0cyldXG5cdFx0XHQubWFwKChmaWxlSW1wb3J0KSA9PiB0aGlzLmdldERlcGVuZGVuY3lGcm9tKGZpbGVJbXBvcnQsIHdvcmtzcGFjZVBhY2thZ2VzKSlcblx0XHRcdC5maWx0ZXIoKGRlcCkgPT4gZGVwICE9IG51bGwpO1xuXG5cdFx0Y29uc3QgbWlzc2luZyA9IGFsbERlcGVuZGVuY2llcy5maWx0ZXIoXG5cdFx0XHQoZGVwKTogZGVwIGlzIFJlc29sdmVkRGVwZW5kZW5jeSAmIHsgbWlzc2luZzogdHJ1ZSB9ID0+IGRlcC5taXNzaW5nLFxuXHRcdCk7XG5cblx0XHRpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCBuYW1lcyA9IG1pc3NpbmcubWFwKChkZXApID0+IGRlcC5uYW1lKS5qb2luKFwiLCBcIik7XG5cdFx0XHR0aHJvdyBuZXcgRm9yZ2VFcnJvcihgTWlzc2luZyBwYWNrYWdlcyBpbiBwcm9qZWN0IFwiJHtwcm9qZWN0Lm5hbWV9XCI6ICR7bmFtZXN9YCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzb2x2ZWQgPSBhbGxEZXBlbmRlbmNpZXMuZmlsdGVyKFxuXHRcdFx0KGRlcCk6IGRlcCBpcyBSZXNvbHZlZERlcGVuZGVuY3kgJiB7IG1pc3Npbmc6IGZhbHNlIH0gPT4gIWRlcC5taXNzaW5nLFxuXHRcdCk7XG5cblx0XHRjb25zdCBkZXBlbmRlbmNpZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG5cdFx0XHRyZXNvbHZlZFxuXHRcdFx0XHQuZmlsdGVyKChkZXApID0+ICFkZXAuaXNEZXYpXG5cdFx0XHRcdC5tYXA8W3N0cmluZywgc3RyaW5nXT4oKGRlcCkgPT4gW2RlcC5uYW1lLCBkZXAudmVyc2lvbl0pLFxuXHRcdCk7XG5cblx0XHRjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG5cdFx0XHRyZXNvbHZlZFxuXHRcdFx0XHQuZmlsdGVyKChkZXApID0+IGRlcC5pc0Rldilcblx0XHRcdFx0Lm1hcDxbc3RyaW5nLCBzdHJpbmddPigoZGVwKSA9PiBbZGVwLm5hbWUsIGRlcC52ZXJzaW9uXSksXG5cdFx0KTtcblxuXHRcdHJldHVybiB7IGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCB3YXJuaW5ncyB9O1xuXHR9XG5cblx0cHJpdmF0ZSBnZXREZXBlbmRlbmN5RnJvbShcblx0XHRpbXBvcnROYW1lOiBzdHJpbmcsXG5cdFx0d29ya3NwYWNlUGFja2FnZXM6IE1hcDxzdHJpbmcsIFBhY2thZ2U+LFxuXHQpOiBSZXNvbHZlZERlcGVuZGVuY3kgfCB1bmRlZmluZWQge1xuXHRcdGlmIChpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIuXCIpIHx8IGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIm5vZGU6XCIpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGFja2FnZU5hbWVNYXRjaCA9IGltcG9ydE5hbWUubWF0Y2goL14oPzooQFteL10rXFwvW14vXSspfChbXi9dKykpLyk7XG5cdFx0Y29uc3QgcGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZU1hdGNoPy5bMF07XG5cblx0XHRpZiAocGFja2FnZU5hbWUgPT0gbnVsbCB8fCBCVUlMVF9JTl9NT0RVTEVTLmluY2x1ZGVzKHBhY2thZ2VOYW1lKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHBhY2tnID0gd29ya3NwYWNlUGFja2FnZXMuZ2V0KHBhY2thZ2VOYW1lKTtcblxuXHRcdGlmIChwYWNrZyA9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRuYW1lOiBwYWNrYWdlTmFtZSxcblx0XHRcdFx0dmVyc2lvbjogdW5kZWZpbmVkLFxuXHRcdFx0XHRpbnRlcm5hbDogdW5kZWZpbmVkLFxuXHRcdFx0XHRtaXNzaW5nOiB0cnVlLFxuXHRcdFx0XHRpc0RldjogZmFsc2UsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRuYW1lOiBwYWNrYWdlTmFtZSxcblx0XHRcdHZlcnNpb246IHBhY2tnLnZlcnNpb24gPz8gXCJcIixcblx0XHRcdGludGVybmFsOiBwYWNrZy5pc0ludGVybmFsID8/IGZhbHNlLFxuXHRcdFx0bWlzc2luZzogZmFsc2UsXG5cdFx0XHRpc0RldjogcGFja2cuaXNEZXYgPz8gZmFsc2UsXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZ2V0RmlsZUltcG9ydHMoXG5cdFx0ZmlsZTogRmlsZUV4LFxuXHQpOiBQcm9taXNlPHsgaW1wb3J0czogc3RyaW5nW107IHdhcm5pbmdzOiBEZXBlbmRlbmN5V2FybmluZ1tdIH0+IHtcblx0XHRjb25zdCBjb250ZW50cyA9IGF3YWl0IGlvLnJlYWRGaWxlKGZpbGUuZnVsbFBhdGgpO1xuXHRcdGNvbnN0IHBhcnNlZCA9IEFycmF5LmZyb20oYXdhaXQgcGFyc2VJbXBvcnRzKGNvbnRlbnRzKSk7XG5cblx0XHRjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IHdhcm5pbmdzOiBEZXBlbmRlbmN5V2FybmluZ1tdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGltcHQgb2YgcGFyc2VkKSB7XG5cdFx0XHRpZiAoaW1wdC5tb2R1bGVTcGVjaWZpZXIudmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0XHRpbXBvcnRzLnB1c2goaW1wdC5tb2R1bGVTcGVjaWZpZXIudmFsdWUpO1xuXHRcdFx0fSBlbHNlIGlmIChpbXB0LmlzRHluYW1pY0ltcG9ydCkge1xuXHRcdFx0XHRjb25zdCBsaW5lID0gY29udGVudHMuc3Vic3RyaW5nKDAsIGltcHQuc3RhcnRJbmRleCkuc3BsaXQoXCJcXG5cIikubGVuZ3RoO1xuXHRcdFx0XHR3YXJuaW5ncy5wdXNoKHtcblx0XHRcdFx0XHRmaWxlOiBmaWxlLmZ1bGxQYXRoLFxuXHRcdFx0XHRcdGxpbmUsXG5cdFx0XHRcdFx0bWVzc2FnZTogYER5bmFtaWMgaW1wb3J0IHdpdGggbm9uLWxpdGVyYWwgc3BlY2lmaWVyIFxcYCR7aW1wdC5tb2R1bGVTcGVjaWZpZXIuY29kZX1cXGAgY2Fubm90IGJlIHN0YXRpY2FsbHkgcmVzb2x2ZWRgLFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4geyBpbXBvcnRzLCB3YXJuaW5ncyB9O1xuXHR9XG59XG4iXSwibmFtZXMiOlsiaW5qZWN0YWJsZSIsImlvIiwicGFyc2VJbXBvcnRzIiwiQlVJTFRfSU5fTU9EVUxFUyIsIkZvcmdlRXJyb3IiLCJEZXBlbmRlbmN5UmVzb2x2ZXIiLCJjb21wdXRlRHJpZnQiLCJjdXJyZW50IiwiY29tcHV0ZWQiLCJzb3J0S2V5cyIsIm9iaiIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsInNvcnQiLCJjdXJyZW50RGVwcyIsImRlcGVuZGVuY2llcyIsImNvbXB1dGVkRGVwcyIsImN1cnJlbnREZXZEZXBzIiwiZGV2RGVwZW5kZW5jaWVzIiwiY29tcHV0ZWREZXZEZXBzIiwiaGFzRHJpZnQiLCJKU09OIiwic3RyaW5naWZ5Iiwib3JpZ2luYWwiLCJ1cGRhdGVkIiwiZ2V0V29ya3NwYWNlUGFja2FnZXMiLCJ3b3Jrc3BhY2UiLCJwcm9qZWN0cyIsInBhY2thZ2VKc29uIiwiZ2V0UGFja2FnZUpzb24iLCJjYXRjaCIsIkVycm9yIiwicGFja2FnZUpzb25EaXJlY3RvcnkiLCJpbnRlcm5hbHMiLCJNYXAiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwicHJvaiIsIm5hbWUiLCJ2ZXJzaW9uIiwiaXNJbnRlcm5hbCIsInBhY2thZ2VzIiwiZmlsdGVyIiwia2V5IiwiaGFzIiwidmFsIiwiZGV2UGFja2FnZXMiLCJpc0RldiIsImNvbXB1dGVQcm9qZWN0RGVwZW5kZW5jaWVzIiwicHJvamVjdCIsIndvcmtzcGFjZVBhY2thZ2VzIiwid2FybmluZ3MiLCJnZXREZXBlbmRlbmNpZXMiLCJwa2ciLCJ1cGRhdGVkUGFja2FnZSIsIndpdGhEZXBlbmRlbmNpZXMiLCJ3aXRoRGV2RGVwZW5kZW5jaWVzIiwiZmlsZXMiLCJnZXRBbGxGaWxlcyIsInJlc3VsdHMiLCJmaWxlIiwiZ2V0RmlsZUltcG9ydHMiLCJpbXBvcnRzIiwiZmxhdE1hcCIsInIiLCJhbGxEZXBlbmRlbmNpZXMiLCJTZXQiLCJmaWxlSW1wb3J0IiwiZ2V0RGVwZW5kZW5jeUZyb20iLCJkZXAiLCJtaXNzaW5nIiwibGVuZ3RoIiwibmFtZXMiLCJqb2luIiwicmVzb2x2ZWQiLCJpbXBvcnROYW1lIiwic3RhcnRzV2l0aCIsInBhY2thZ2VOYW1lTWF0Y2giLCJtYXRjaCIsInBhY2thZ2VOYW1lIiwiaW5jbHVkZXMiLCJwYWNrZyIsImdldCIsInVuZGVmaW5lZCIsImludGVybmFsIiwiY29udGVudHMiLCJyZWFkRmlsZSIsImZ1bGxQYXRoIiwicGFyc2VkIiwiQXJyYXkiLCJmcm9tIiwiaW1wdCIsIm1vZHVsZVNwZWNpZmllciIsInZhbHVlIiwicHVzaCIsImlzRHluYW1pY0ltcG9ydCIsImxpbmUiLCJzdWJzdHJpbmciLCJzdGFydEluZGV4Iiwic3BsaXQiLCJtZXNzYWdlIiwiY29kZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsU0FBU0EsVUFBVSxRQUFRLGdDQUFnQztBQUUzRCxTQUFzQkMsRUFBRSxRQUFRLHFCQUFxQjtBQUNyRCxTQUFTQyxZQUFZLFFBQVEsZ0JBQWdCO0FBQzdDLFNBQVNDLGdCQUFnQixRQUFRLGNBQWM7QUFDL0MsU0FBU0MsVUFBVSxRQUFRLGVBQWU7QUFlMUMsT0FBTyxNQUFNQztJQUNMQyxh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