@decohere/forge 0.0.1-dev.12 → 0.0.1-dev.120

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 (194) hide show
  1. package/README.md +141 -0
  2. package/commonjs/src/actions/build.action.js +8 -6
  3. package/commonjs/src/actions/clean.action.js +6 -8
  4. package/commonjs/src/actions/commit.action.js +4 -6
  5. package/commonjs/src/actions/copy.action.js +43 -12
  6. package/commonjs/src/actions/dependency-report.action.js +4 -6
  7. package/commonjs/src/actions/dependency-sync.action.js +3 -5
  8. package/commonjs/src/actions/docker.action.js +209 -0
  9. package/commonjs/src/actions/index.js +6 -2
  10. package/commonjs/src/actions/link.action.js +154 -0
  11. package/commonjs/src/actions/package.action.js +234 -0
  12. package/commonjs/src/actions/paths.action.js +109 -0
  13. package/commonjs/src/actions/publish.action.js +4 -6
  14. package/commonjs/src/actions/sync-lock-file.action.js +2 -4
  15. package/commonjs/src/actions/tag.action.js +6 -9
  16. package/commonjs/src/actions/typecheck.action.js +67 -0
  17. package/commonjs/src/actions/unlink.action.js +74 -0
  18. package/commonjs/src/actions/version.action.js +10 -14
  19. package/commonjs/src/actions/watch.action.js +3 -5
  20. package/commonjs/src/commands/build.command.js +4 -3
  21. package/commonjs/src/commands/dependency.command.js +1 -3
  22. package/commonjs/src/commands/docker.command.js +26 -0
  23. package/commonjs/src/commands/forge.command.js +1 -3
  24. package/commonjs/src/commands/index.js +5 -2
  25. package/commonjs/src/commands/link.command.js +90 -0
  26. package/commonjs/src/commands/package.command.js +36 -0
  27. package/commonjs/src/commands/paths.command.js +24 -0
  28. package/commonjs/src/commands/publish.command.js +1 -3
  29. package/commonjs/src/commands/tag.command.js +1 -3
  30. package/commonjs/src/commands/typecheck.command.js +24 -0
  31. package/commonjs/src/commands/version.command.js +1 -3
  32. package/commonjs/src/const.js +0 -2
  33. package/commonjs/src/create-workspace.js +42 -0
  34. package/commonjs/src/errors.js +2 -4
  35. package/commonjs/src/extensions/project.extensions.js +11 -13
  36. package/commonjs/src/factories/swc-config.factory.js +29 -9
  37. package/commonjs/src/forge.module.js +23 -22
  38. package/commonjs/src/index.js +11 -2
  39. package/commonjs/src/packaging/dependency-pinner.service.js +118 -0
  40. package/commonjs/src/packaging/deployable.js +44 -0
  41. package/commonjs/src/packaging/import-graph.service.js +137 -0
  42. package/commonjs/src/packaging/release-exports.js +90 -0
  43. package/commonjs/src/packaging/ui-assets.js +75 -0
  44. package/commonjs/src/semver/index.js +18 -0
  45. package/commonjs/src/semver/semver.js +92 -0
  46. package/commonjs/src/services/dependency-resolver.service.js +1 -3
  47. package/commonjs/src/services/file-writer.service.js +2 -11
  48. package/commonjs/src/services/incremental-watch.js +24 -0
  49. package/commonjs/src/services/output-cache.js +39 -0
  50. package/commonjs/src/services/swc-transpiler.js +85 -99
  51. package/commonjs/src/services/transpile-cache.js +44 -0
  52. package/commonjs/src/services/ts-program-host.js +4 -6
  53. package/commonjs/src/services/type-emission-program.js +24 -9
  54. package/commonjs/src/services/type-emitter.js +51 -16
  55. package/commonjs/src/types/build-target.type.js +0 -2
  56. package/commonjs/src/types/configuration.type.js +0 -2
  57. package/commonjs/src/types/dependency.types.js +0 -2
  58. package/commonjs/src/types/swc-config.type.js +0 -2
  59. package/commonjs/src/types/transform-response.model.js +3 -18
  60. package/commonjs/src/types/transformer.type.js +0 -2
  61. package/commonjs/src/types/workspace-config.type.js +0 -2
  62. package/commonjs/src/vitest/forge-build.plugin.js +28 -44
  63. package/commonjs/src/vitest/index.js +0 -2
  64. package/commonjs/src/workspace.config.js +39 -6
  65. package/es6/src/actions/build.action.js +7 -7
  66. package/es6/src/actions/clean.action.js +5 -8
  67. package/es6/src/actions/commit.action.js +3 -6
  68. package/es6/src/actions/copy.action.js +42 -12
  69. package/es6/src/actions/dependency-report.action.js +3 -7
  70. package/es6/src/actions/dependency-sync.action.js +2 -6
  71. package/es6/src/actions/docker.action.js +194 -0
  72. package/es6/src/actions/index.js +6 -2
  73. package/es6/src/actions/link.action.js +128 -0
  74. package/es6/src/actions/package.action.js +219 -0
  75. package/es6/src/actions/paths.action.js +86 -0
  76. package/es6/src/actions/publish.action.js +3 -6
  77. package/es6/src/actions/sync-lock-file.action.js +2 -4
  78. package/es6/src/actions/tag.action.js +5 -9
  79. package/es6/src/actions/typecheck.action.js +52 -0
  80. package/es6/src/actions/unlink.action.js +59 -0
  81. package/es6/src/actions/version.action.js +5 -10
  82. package/es6/src/actions/watch.action.js +2 -5
  83. package/es6/src/commands/build.command.js +4 -3
  84. package/es6/src/commands/dependency.command.js +1 -3
  85. package/es6/src/commands/docker.command.js +16 -0
  86. package/es6/src/commands/forge.command.js +1 -3
  87. package/es6/src/commands/index.js +5 -2
  88. package/es6/src/commands/link.command.js +67 -0
  89. package/es6/src/commands/package.command.js +26 -0
  90. package/es6/src/commands/paths.command.js +14 -0
  91. package/es6/src/commands/publish.command.js +1 -3
  92. package/es6/src/commands/tag.command.js +1 -3
  93. package/es6/src/commands/typecheck.command.js +14 -0
  94. package/es6/src/commands/version.command.js +1 -3
  95. package/es6/src/const.js +0 -2
  96. package/es6/src/create-workspace.js +30 -0
  97. package/es6/src/errors.js +1 -3
  98. package/es6/src/extensions/project.extensions.js +5 -7
  99. package/es6/src/factories/swc-config.factory.js +29 -9
  100. package/es6/src/forge.module.js +23 -22
  101. package/es6/src/index.js +3 -3
  102. package/es6/src/packaging/dependency-pinner.service.js +103 -0
  103. package/es6/src/packaging/deployable.js +21 -0
  104. package/es6/src/packaging/import-graph.service.js +122 -0
  105. package/es6/src/packaging/release-exports.js +80 -0
  106. package/es6/src/packaging/ui-assets.js +49 -0
  107. package/es6/src/semver/index.js +1 -0
  108. package/es6/src/semver/semver.js +71 -0
  109. package/es6/src/services/dependency-resolver.service.js +1 -3
  110. package/es6/src/services/file-writer.service.js +2 -11
  111. package/es6/src/services/incremental-watch.js +18 -0
  112. package/es6/src/services/output-cache.js +29 -0
  113. package/es6/src/services/swc-transpiler.js +85 -99
  114. package/es6/src/services/transpile-cache.js +29 -0
  115. package/es6/src/services/ts-program-host.js +4 -6
  116. package/es6/src/services/type-emission-program.js +24 -9
  117. package/es6/src/services/type-emitter.js +48 -16
  118. package/es6/src/types/build-target.type.js +0 -2
  119. package/es6/src/types/configuration.type.js +0 -2
  120. package/es6/src/types/dependency.types.js +0 -2
  121. package/es6/src/types/swc-config.type.js +0 -2
  122. package/es6/src/types/transform-response.model.js +0 -7
  123. package/es6/src/types/transformer.type.js +0 -2
  124. package/es6/src/types/workspace-config.type.js +0 -2
  125. package/es6/src/vitest/forge-build.plugin.js +27 -43
  126. package/es6/src/vitest/index.js +0 -2
  127. package/es6/src/workspace.config.js +39 -5
  128. package/package.json +6 -5
  129. package/types/src/actions/build.action.d.ts +5 -4
  130. package/types/src/actions/clean.action.d.ts +3 -3
  131. package/types/src/actions/commit.action.d.ts +3 -3
  132. package/types/src/actions/copy.action.d.ts +13 -3
  133. package/types/src/actions/dependency-report.action.d.ts +3 -3
  134. package/types/src/actions/dependency-sync.action.d.ts +3 -3
  135. package/types/src/actions/docker.action.d.ts +38 -0
  136. package/types/src/actions/index.d.ts +6 -0
  137. package/types/src/actions/link.action.d.ts +25 -0
  138. package/types/src/actions/package.action.d.ts +38 -0
  139. package/types/src/actions/paths.action.d.ts +28 -0
  140. package/types/src/actions/publish.action.d.ts +4 -4
  141. package/types/src/actions/sync-lock-file.action.d.ts +2 -2
  142. package/types/src/actions/tag.action.d.ts +3 -3
  143. package/types/src/actions/typecheck.action.d.ts +14 -0
  144. package/types/src/actions/unlink.action.d.ts +9 -0
  145. package/types/src/actions/version.action.d.ts +4 -4
  146. package/types/src/actions/watch.action.d.ts +3 -3
  147. package/types/src/commands/build.command.d.ts +3 -2
  148. package/types/src/commands/dependency.command.d.ts +2 -2
  149. package/types/src/commands/docker.command.d.ts +6 -0
  150. package/types/src/commands/forge.command.d.ts +2 -2
  151. package/types/src/commands/index.d.ts +5 -0
  152. package/types/src/commands/link.command.d.ts +29 -0
  153. package/types/src/commands/package.command.d.ts +11 -0
  154. package/types/src/commands/paths.command.d.ts +6 -0
  155. package/types/src/commands/publish.command.d.ts +1 -1
  156. package/types/src/commands/tag.command.d.ts +1 -1
  157. package/types/src/commands/typecheck.command.d.ts +6 -0
  158. package/types/src/commands/version.command.d.ts +1 -1
  159. package/types/src/create-workspace.d.ts +7 -0
  160. package/types/src/errors.d.ts +1 -1
  161. package/types/src/extensions/project.extensions.d.ts +2 -2
  162. package/types/src/factories/swc-config.factory.d.ts +3 -2
  163. package/types/src/forge.module.d.ts +16 -4
  164. package/types/src/index.d.ts +3 -1
  165. package/types/src/packaging/dependency-pinner.service.d.ts +20 -0
  166. package/types/src/packaging/deployable.d.ts +17 -0
  167. package/types/src/packaging/import-graph.service.d.ts +33 -0
  168. package/types/src/packaging/release-exports.d.ts +18 -0
  169. package/types/src/packaging/ui-assets.d.ts +21 -0
  170. package/types/src/semver/index.d.ts +1 -0
  171. package/types/src/semver/semver.d.ts +18 -0
  172. package/types/src/services/dependency-resolver.service.d.ts +1 -1
  173. package/types/src/services/file-writer.service.d.ts +1 -2
  174. package/types/src/services/incremental-watch.d.ts +13 -0
  175. package/types/src/services/output-cache.d.ts +10 -0
  176. package/types/src/services/swc-transpiler.d.ts +28 -15
  177. package/types/src/services/transpile-cache.d.ts +17 -0
  178. package/types/src/services/ts-program-host.d.ts +2 -2
  179. package/types/src/services/type-emission-program.d.ts +8 -3
  180. package/types/src/services/type-emitter.d.ts +21 -8
  181. package/types/src/types/configuration.type.d.ts +6 -1
  182. package/types/src/types/dependency.types.d.ts +1 -1
  183. package/types/src/types/swc-config.type.d.ts +7 -1
  184. package/types/src/types/transform-response.model.d.ts +2 -7
  185. package/types/src/types/transformer.type.d.ts +2 -11
  186. package/types/src/types/workspace-config.type.d.ts +3 -3
  187. package/types/src/vitest/forge-build.plugin.d.ts +0 -2
  188. package/types/src/workspace.config.d.ts +6 -0
  189. package/commonjs/src/mixins/caches-outputs.mixin.js +0 -44
  190. package/commonjs/src/mixins/incremental-transform.mixin.js +0 -36
  191. package/es6/src/mixins/caches-outputs.mixin.js +0 -34
  192. package/es6/src/mixins/incremental-transform.mixin.js +0 -26
  193. package/types/src/mixins/caches-outputs.mixin.d.ts +0 -7
  194. package/types/src/mixins/incremental-transform.mixin.d.ts +0 -13
@@ -10,8 +10,8 @@ Object.defineProperty(exports, "FileWriterService", {
10
10
  });
11
11
  const _promises = /*#__PURE__*/ _interop_require_default(require("node:fs/promises"));
12
12
  const _decorators = require("@decohere/crucible/decorators");
13
- const _diagnostics = require("@decohere/nexus/diagnostics");
14
- const _io = require("@decohere/nexus/io");
13
+ const _diagnostics = require("@decohere/devkit/diagnostics");
14
+ const _io = require("@decohere/core/io");
15
15
  require("../extensions/project.extensions.js");
16
16
  function _interop_require_default(obj) {
17
17
  return obj && obj.__esModule ? obj : {
@@ -29,19 +29,12 @@ class FileWriterService {
29
29
  #artifactByPath = new Map();
30
30
  #warmupSignature = "";
31
31
  #warmupPromise;
32
- #initialized = false;
33
32
  #pendingWrites = [];
34
33
  #activeWorkers = 0;
35
34
  #drainResolvers = [];
36
35
  #ensuredDirs = new Set();
37
36
  #ensureDirPromises = new Map();
38
37
  #workerError;
39
- async initialize() {
40
- if (this.#initialized) {
41
- return;
42
- }
43
- this.#initialized = true;
44
- }
45
38
  async warmup(projects) {
46
39
  const outputDirs = this.getOutputDirs(projects);
47
40
  const signature = outputDirs.join("|");
@@ -228,5 +221,3 @@ FileWriterService = _ts_decorate([
228
221
  _diagnostics.Trace,
229
222
  (0, _decorators.injectable)()
230
223
  ], FileWriterService);
231
-
232
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9zZXJ2aWNlcy9maWxlLXdyaXRlci5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBUcmFjZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvZGlhZ25vc3RpY3NcIjtcbmltcG9ydCB7IGlvIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9pb1wiO1xuaW1wb3J0IFwiLi4vZXh0ZW5zaW9ucy9wcm9qZWN0LmV4dGVuc2lvbnMuanNcIjtcbmltcG9ydCB0eXBlIHsgQnVpbGRUYXJnZXQgfSBmcm9tIFwiLi4vdHlwZXMvYnVpbGQtdGFyZ2V0LnR5cGUuanNcIjtcbmltcG9ydCB0eXBlIHsgVHJhbnNmb3JtUmVzcG9uc2UgfSBmcm9tIFwiLi4vdHlwZXMvdHJhbnNmb3JtLXJlc3BvbnNlLm1vZGVsLmpzXCI7XG5cbmNvbnN0IERFRkFVTFRfV1JJVEVfQ09OQ1VSUkVOQ1kgPSAxNjtcblxuQFRyYWNlXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRmlsZVdyaXRlclNlcnZpY2Uge1xuXHQjYXJ0aWZhY3RCeVBhdGggPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXHQjd2FybXVwU2lnbmF0dXJlID0gXCJcIjtcblx0I3dhcm11cFByb21pc2U6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG5cdCNpbml0aWFsaXplZCA9IGZhbHNlO1xuXHQjcGVuZGluZ1dyaXRlczogVHJhbnNmb3JtUmVzcG9uc2VbXSA9IFtdO1xuXHQjYWN0aXZlV29ya2VycyA9IDA7XG5cdCNkcmFpblJlc29sdmVyczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblx0I2Vuc3VyZWREaXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cdCNlbnN1cmVEaXJQcm9taXNlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXHQjd29ya2VyRXJyb3I6IHVua25vd247XG5cblx0cHVibGljIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuI2luaXRpYWxpemVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuI2luaXRpYWxpemVkID0gdHJ1ZTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyB3YXJtdXAocHJvamVjdHM6IFByb2plY3RbXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG91dHB1dERpcnMgPSB0aGlzLmdldE91dHB1dERpcnMocHJvamVjdHMpO1xuXHRcdGNvbnN0IHNpZ25hdHVyZSA9IG91dHB1dERpcnMuam9pbihcInxcIik7XG5cdFx0aWYgKHNpZ25hdHVyZSA9PT0gdGhpcy4jd2FybXVwU2lnbmF0dXJlICYmIHRoaXMuI3dhcm11cFByb21pc2UgIT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuI3dhcm11cFByb21pc2U7XG5cdFx0fVxuXG5cdFx0dGhpcy4jd2FybXVwU2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuXHRcdHRoaXMuI2Vuc3VyZWREaXJzLmNsZWFyKCk7XG5cdFx0dGhpcy4jZW5zdXJlRGlyUHJvbWlzZXMuY2xlYXIoKTtcblx0XHR0aGlzLiN3b3JrZXJFcnJvciA9IHVuZGVmaW5lZDtcblx0XHR0aGlzLiN3YXJtdXBQcm9taXNlID0gdGhpcy5sb2FkRXhpc3RpbmdBcnRpZmFjdHMob3V0cHV0RGlycyk7XG5cdFx0cmV0dXJuIHRoaXMuI3dhcm11cFByb21pc2U7XG5cdH1cblxuXHRwdWJsaWMgZW5xdWV1ZU91dHB1dChyZXNwb25zZTogVHJhbnNmb3JtUmVzcG9uc2UpOiB2b2lkIHtcblx0XHRpZiAodGhpcy4jd29ya2VyRXJyb3IgIT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAocmVzcG9uc2Uub3V0Y29tZSAhPT0gXCJzdWNjZXNzXCIgfHwgcmVzcG9uc2Uub3V0cHV0UGF0aCA9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuI3BlbmRpbmdXcml0ZXMucHVzaChyZXNwb25zZSk7XG5cdFx0dGhpcy5zdGFydFdvcmtlcnMoKTtcblx0fVxuXG5cdHB1YmxpYyBlbnF1ZXVlT3V0cHV0cyhyZXNwb25zZXM6IFRyYW5zZm9ybVJlc3BvbnNlW10pOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuXHRcdFx0dGhpcy5lbnF1ZXVlT3V0cHV0KHJlc3BvbnNlKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuI3dhcm11cFByb21pc2UgIT0gbnVsbCkge1xuXHRcdFx0YXdhaXQgdGhpcy4jd2FybXVwUHJvbWlzZTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuI3BlbmRpbmdXcml0ZXMubGVuZ3RoID09PSAwICYmIHRoaXMuI2FjdGl2ZVdvcmtlcnMgPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0YXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcblx0XHRcdHRoaXMuI2RyYWluUmVzb2x2ZXJzLnB1c2gocmVzb2x2ZSk7XG5cdFx0fSk7XG5cdFx0aWYgKHRoaXMuI3dvcmtlckVycm9yICE9IG51bGwpIHtcblx0XHRcdHRocm93IHRoaXMuI3dvcmtlckVycm9yO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0T3V0cHV0RGlycyhwcm9qZWN0czogUHJvamVjdFtdKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IGRpcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcblx0XHRcdGZvciAoY29uc3QgdGFyZ2V0IG9mIHByb2plY3QuZ2V0Rm9yZ2VDb25maWd1cmF0aW9uKCkudGFyZ2V0cykge1xuXHRcdFx0XHRkaXJzLmFkZChwcm9qZWN0LmdldE91dERpcih0YXJnZXQgYXMgQnVpbGRUYXJnZXQpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFsuLi5kaXJzXS5zb3J0KCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGxvYWRFeGlzdGluZ0FydGlmYWN0cyhvdXRwdXREaXJzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRoaXMuI2FydGlmYWN0QnlQYXRoLmNsZWFyKCk7XG5cblx0XHRjb25zdCBmaWxlczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IGRpciBvZiBvdXRwdXREaXJzKSB7XG5cdFx0XHRmaWxlcy5wdXNoKC4uLihhd2FpdCB0aGlzLmNvbGxlY3RGaWxlcyhkaXIpKSk7XG5cdFx0fVxuXG5cdFx0YXdhaXQgdGhpcy53aXRoQ29uY3VycmVuY3koZmlsZXMsIHRoaXMuZ2V0V3JpdGVDb25jdXJyZW5jeSgpLCBhc3luYyAoZmlsZVBhdGgpID0+IHtcblx0XHRcdGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgXCJ1dGY4XCIpO1xuXHRcdFx0dGhpcy4jYXJ0aWZhY3RCeVBhdGguc2V0KGZpbGVQYXRoLCBjb250ZW50KTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgY29sbGVjdEZpbGVzKHJvb3REaXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIocm9vdERpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXHRcdFx0Y29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcblx0XHRcdFx0Y29uc3QgZnVsbFBhdGggPSBgJHtyb290RGlyfS8ke2VudHJ5Lm5hbWV9YDtcblx0XHRcdFx0aWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcblx0XHRcdFx0XHRmaWxlcy5wdXNoKC4uLihhd2FpdCB0aGlzLmNvbGxlY3RGaWxlcyhmdWxsUGF0aCkpKTtcblx0XHRcdFx0fSBlbHNlIGlmIChlbnRyeS5pc0ZpbGUoKSkge1xuXHRcdFx0XHRcdGZpbGVzLnB1c2goZnVsbFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmlsZXM7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRXcml0ZUNvbmN1cnJlbmN5KCk6IG51bWJlciB7XG5cdFx0Y29uc3QgcmVxdWVzdGVkID0gTnVtYmVyKHByb2Nlc3MuZW52LkZPUkdFX1dSSVRFX0NPTkNVUlJFTkNZKTtcblx0XHRpZiAoTnVtYmVyLmlzRmluaXRlKHJlcXVlc3RlZCkgJiYgcmVxdWVzdGVkID4gMCkge1xuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IocmVxdWVzdGVkKTtcblx0XHR9XG5cdFx0cmV0dXJuIERFRkFVTFRfV1JJVEVfQ09OQ1VSUkVOQ1k7XG5cdH1cblxuXHRwcml2YXRlIHN0YXJ0V29ya2VycygpOiB2b2lkIHtcblx0XHRpZiAodGhpcy4jd29ya2VyRXJyb3IgIT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBtYXhXb3JrZXJzID0gdGhpcy5nZXRXcml0ZUNvbmN1cnJlbmN5KCk7XG5cdFx0d2hpbGUgKHRoaXMuI2FjdGl2ZVdvcmtlcnMgPCBtYXhXb3JrZXJzICYmIHRoaXMuI3BlbmRpbmdXcml0ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhpcy4jYWN0aXZlV29ya2VycyArPSAxO1xuXHRcdFx0dm9pZCB0aGlzLnJ1bldvcmtlcigpLmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLiNhY3RpdmVXb3JrZXJzIC09IDE7XG5cdFx0XHRcdGlmICh0aGlzLiNwZW5kaW5nV3JpdGVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHR0aGlzLnN0YXJ0V29ya2VycygpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuI2FjdGl2ZVdvcmtlcnMgPT09IDApIHtcblx0XHRcdFx0XHR0aGlzLnJlc29sdmVEcmFpbigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHJ1bldvcmtlcigpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSB0aGlzLiNwZW5kaW5nV3JpdGVzLnNoaWZ0KCk7XG5cdFx0XHRpZiAocmVzcG9uc2UgPT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmICh0aGlzLiN3YXJtdXBQcm9taXNlICE9IG51bGwpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLiN3YXJtdXBQcm9taXNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3Qgb3V0cHV0UGF0aCA9IHJlc3BvbnNlLm91dHB1dFBhdGg7XG5cdFx0XHRcdGlmIChvdXRwdXRQYXRoID09IG51bGwpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IG91dHB1dERpciA9IHJlc3BvbnNlLm91dHB1dERpcjtcblx0XHRcdFx0aWYgKG91dHB1dERpciAhPSBudWxsKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5lbnN1cmVEaXJlY3Rvcnkob3V0cHV0RGlyKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGV4aXN0aW5nID0gdGhpcy4jYXJ0aWZhY3RCeVBhdGguZ2V0KG91dHB1dFBhdGgpO1xuXHRcdFx0XHRpZiAoZXhpc3RpbmcgPT09IHJlc3BvbnNlLmNvZGUpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IGlvLndyaXRlRmlsZShvdXRwdXRQYXRoLCByZXNwb25zZS5jb2RlKTtcblx0XHRcdFx0dGhpcy4jYXJ0aWZhY3RCeVBhdGguc2V0KG91dHB1dFBhdGgsIHJlc3BvbnNlLmNvZGUpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0dGhpcy4jd29ya2VyRXJyb3IgPSBlcnJvcjtcblx0XHRcdFx0dGhpcy4jcGVuZGluZ1dyaXRlcyA9IFtdO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBlbnN1cmVEaXJlY3RvcnkoZGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy4jZW5zdXJlZERpcnMuaGFzKGRpcikpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdFx0Y29uc3QgZXhpc3RpbmcgPSB0aGlzLiNlbnN1cmVEaXJQcm9taXNlcy5nZXQoZGlyKTtcblx0XHRpZiAoZXhpc3RpbmcgIT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGV4aXN0aW5nO1xuXHRcdH1cblx0XHRjb25zdCBta2RpclByb21pc2UgPSBmcy5ta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pLnRoZW4oKCkgPT4ge1xuXHRcdFx0dGhpcy4jZW5zdXJlZERpcnMuYWRkKGRpcik7XG5cdFx0XHR0aGlzLiNlbnN1cmVEaXJQcm9taXNlcy5kZWxldGUoZGlyKTtcblx0XHR9KTtcblx0XHR0aGlzLiNlbnN1cmVEaXJQcm9taXNlcy5zZXQoZGlyLCBta2RpclByb21pc2UpO1xuXHRcdHJldHVybiBta2RpclByb21pc2U7XG5cdH1cblxuXHRwcml2YXRlIHJlc29sdmVEcmFpbigpOiB2b2lkIHtcblx0XHRpZiAodGhpcy4jcGVuZGluZ1dyaXRlcy5sZW5ndGggPiAwIHx8IHRoaXMuI2FjdGl2ZVdvcmtlcnMgPiAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgcmVzb2x2ZSBvZiB0aGlzLiNkcmFpblJlc29sdmVycykge1xuXHRcdFx0cmVzb2x2ZSgpO1xuXHRcdH1cblx0XHR0aGlzLiNkcmFpblJlc29sdmVycyA9IFtdO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyB3aXRoQ29uY3VycmVuY3k8VD4oXG5cdFx0aXRlbXM6IFRbXSxcblx0XHRjb25jdXJyZW5jeTogbnVtYmVyLFxuXHRcdHdvcmtlcjogKGl0ZW06IFQpID0+IFByb21pc2U8dm9pZD4sXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBjdXJzb3IgPSAwO1xuXHRcdGNvbnN0IHdvcmtlckNvdW50ID0gTWF0aC5taW4oY29uY3VycmVuY3ksIGl0ZW1zLmxlbmd0aCk7XG5cdFx0Y29uc3Qgd29ya2VycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHdvcmtlckNvdW50IH0sICgpID0+XG5cdFx0XHQoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0XHRcdGNvbnN0IGluZGV4ID0gY3Vyc29yO1xuXHRcdFx0XHRcdGN1cnNvciArPSAxO1xuXHRcdFx0XHRcdGlmIChpbmRleCA+PSBpdGVtcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YXdhaXQgd29ya2VyKGl0ZW1zW2luZGV4XSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pKCksXG5cdFx0KTtcblx0XHRhd2FpdCBQcm9taXNlLmFsbCh3b3JrZXJzKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkZpbGVXcml0ZXJTZXJ2aWNlIiwiREVGQVVMVF9XUklURV9DT05DVVJSRU5DWSIsIk1hcCIsIlNldCIsImluaXRpYWxpemUiLCJ3YXJtdXAiLCJwcm9qZWN0cyIsIm91dHB1dERpcnMiLCJnZXRPdXRwdXREaXJzIiwic2lnbmF0dXJlIiwiam9pbiIsImNsZWFyIiwidW5kZWZpbmVkIiwibG9hZEV4aXN0aW5nQXJ0aWZhY3RzIiwiZW5xdWV1ZU91dHB1dCIsInJlc3BvbnNlIiwib3V0Y29tZSIsIm91dHB1dFBhdGgiLCJwdXNoIiwic3RhcnRXb3JrZXJzIiwiZW5xdWV1ZU91dHB1dHMiLCJyZXNwb25zZXMiLCJmbHVzaCIsImxlbmd0aCIsIlByb21pc2UiLCJyZXNvbHZlIiwiZGlycyIsInByb2plY3QiLCJ0YXJnZXQiLCJnZXRGb3JnZUNvbmZpZ3VyYXRpb24iLCJ0YXJnZXRzIiwiYWRkIiwiZ2V0T3V0RGlyIiwic29ydCIsImZpbGVzIiwiZGlyIiwiY29sbGVjdEZpbGVzIiwid2l0aENvbmN1cnJlbmN5IiwiZ2V0V3JpdGVDb25jdXJyZW5jeSIsImZpbGVQYXRoIiwiY29udGVudCIsImZzIiwicmVhZEZpbGUiLCJzZXQiLCJyb290RGlyIiwiZW50cmllcyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwiZW50cnkiLCJmdWxsUGF0aCIsIm5hbWUiLCJpc0RpcmVjdG9yeSIsImlzRmlsZSIsInJlcXVlc3RlZCIsIk51bWJlciIsInByb2Nlc3MiLCJlbnYiLCJGT1JHRV9XUklURV9DT05DVVJSRU5DWSIsImlzRmluaXRlIiwiTWF0aCIsImZsb29yIiwibWF4V29ya2VycyIsInJ1bldvcmtlciIsImZpbmFsbHkiLCJyZXNvbHZlRHJhaW4iLCJzaGlmdCIsIm91dHB1dERpciIsImVuc3VyZURpcmVjdG9yeSIsImV4aXN0aW5nIiwiZ2V0IiwiY29kZSIsImlvIiwid3JpdGVGaWxlIiwiZXJyb3IiLCJoYXMiLCJta2RpclByb21pc2UiLCJta2RpciIsInJlY3Vyc2l2ZSIsInRoZW4iLCJkZWxldGUiLCJpdGVtcyIsImNvbmN1cnJlbmN5Iiwid29ya2VyIiwiY3Vyc29yIiwid29ya2VyQ291bnQiLCJtaW4iLCJ3b3JrZXJzIiwiQXJyYXkiLCJmcm9tIiwiaW5kZXgiLCJhbGwiXSwibWFwcGluZ3MiOiI7Ozs7K0JBYWFBOzs7ZUFBQUE7OztpRUFiRTs0QkFDWTs2QkFFTDtvQkFDSDtRQUNaOzs7Ozs7Ozs7Ozs7QUFJUCxNQUFNQyw0QkFBNEI7QUFJM0IsTUFBTUQ7SUFDWixDQUFBLGNBQWUsR0FB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
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "IncrementalWatch", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return IncrementalWatch;
9
+ }
10
+ });
11
+ const _rxjs = require("rxjs");
12
+ class IncrementalWatch {
13
+ #results = new _rxjs.Subject();
14
+ get results$() {
15
+ return this.#results.asObservable();
16
+ }
17
+ watch(workspace, handler) {
18
+ workspace.projectFileChanged$.subscribe((evt)=>{
19
+ void handler(evt).then((responses)=>{
20
+ this.#results.next(responses);
21
+ });
22
+ });
23
+ }
24
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "OutputCache", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return OutputCache;
9
+ }
10
+ });
11
+ const _io = require("@decohere/core/io");
12
+ class OutputCache {
13
+ #bySource = new Map();
14
+ get(sourcePath) {
15
+ return this.#bySource.get(sourcePath);
16
+ }
17
+ /** Records the successful outputs, replacing what each of their source files had before. */ record(responses) {
18
+ const bySource = new Map();
19
+ for (const response of responses){
20
+ if (response.outcome !== "success") continue;
21
+ const group = bySource.get(response.file.fullPath) ?? [];
22
+ group.push(response);
23
+ bySource.set(response.file.fullPath, group);
24
+ }
25
+ for (const [sourcePath, group] of bySource){
26
+ this.#bySource.set(sourcePath, group);
27
+ }
28
+ }
29
+ /** Deletes the files a source built to and forgets them. */ delete(sourcePath) {
30
+ const outputs = this.#bySource.get(sourcePath);
31
+ if (outputs == null) return;
32
+ for (const response of outputs){
33
+ if (response.outputPath != null) {
34
+ void _io.io.deleteFile(response.outputPath);
35
+ }
36
+ }
37
+ this.#bySource.delete(sourcePath);
38
+ }
39
+ }
@@ -8,19 +8,18 @@ Object.defineProperty(exports, "SwcTranspiler", {
8
8
  return SwcTranspiler;
9
9
  }
10
10
  });
11
- const _nodefs = /*#__PURE__*/ _interop_require_default(require("node:fs"));
12
11
  const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
13
- const _caching = require("@decohere/nexus/caching");
14
- const _diagnostics = require("@decohere/nexus/diagnostics");
15
- const _extensibility = require("@decohere/nexus/extensibility");
16
- const _io = require("@decohere/nexus/io");
12
+ const _workspace = require("@decohere/workspace");
13
+ const _caching = require("@decohere/core/caching");
14
+ const _diagnostics = require("@decohere/devkit/diagnostics");
15
+ const _io = require("@decohere/devkit/io");
17
16
  const _core = require("@swc/core");
18
17
  const _buildtargettype = require("../types/build-target.type.js");
19
18
  require("../extensions/project.extensions.js");
20
19
  const _swcconfigfactory = require("../factories/swc-config.factory.js");
21
- const _cachesoutputsmixin = require("../mixins/caches-outputs.mixin.js");
22
- const _incrementaltransformmixin = require("../mixins/incremental-transform.mixin.js");
23
20
  const _transformresponsemodel = require("../types/transform-response.model.js");
21
+ const _incrementalwatch = require("./incremental-watch.js");
22
+ const _outputcache = require("./output-cache.js");
24
23
  function _interop_require_default(obj) {
25
24
  return obj && obj.__esModule ? obj : {
26
25
  default: obj
@@ -35,18 +34,34 @@ function _ts_decorate(decorators, target, key, desc) {
35
34
  function _ts_metadata(k, v) {
36
35
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
37
36
  }
38
- class SwcTranspiler extends (0, _extensibility.mixwith)(_cachesoutputsmixin.CachesOutputs, _incrementaltransformmixin.IncrementalTransform) {
37
+ class SwcTranspiler {
39
38
  buildTargets = [
40
39
  _buildtargettype.BuildTargets.es6,
41
40
  _buildtargettype.BuildTargets.commonjs
42
41
  ];
43
42
  #swcConfigFactory = new _swcconfigfactory.SwcConfigFactory();
43
+ #workspace;
44
+ #outputs = new _outputcache.OutputCache();
45
+ #incremental = new _incrementalwatch.IncrementalWatch();
46
+ get incrementalTransform$() {
47
+ return this.#incremental.results$;
48
+ }
49
+ watch(workspace) {
50
+ this.#workspace = workspace;
51
+ this.#incremental.watch(workspace, (evt)=>this.onIncrementalFileEvent(evt));
52
+ }
53
+ withAliasContext(options = {}) {
54
+ return {
55
+ ...options,
56
+ workspace: options.workspace ?? this.#workspace
57
+ };
58
+ }
44
59
  async transformProject(projectArrayLike, fileFilter, onOutput) {
45
60
  const projects = Array.isArray(projectArrayLike) ? projectArrayLike : [
46
61
  projectArrayLike
47
62
  ];
48
63
  const responses = await Promise.all(projects.map(async (project)=>{
49
- const { targets, aliasPaths } = project.getForgeConfiguration();
64
+ const { targets, aliasPaths, sourceMaps } = project.getForgeConfiguration();
50
65
  const transpileTargets = targets.filter((bt)=>bt !== _buildtargettype.BuildTargets.types);
51
66
  if (transpileTargets.length === 0) {
52
67
  return [];
@@ -58,64 +73,34 @@ class SwcTranspiler extends (0, _extensibility.mixwith)(_cachesoutputsmixin.Cach
58
73
  return this.transformTarget(sourceFiles, target, {
59
74
  tsConfig,
60
75
  userConfig,
61
- aliasPaths
76
+ aliasPaths,
77
+ sourceMaps,
78
+ workspace: this.#workspace,
79
+ projects
62
80
  }, project, onOutput);
63
81
  }));
64
82
  return responses.flat();
65
83
  }));
66
84
  const flat = responses.flat();
67
- this.cacheOutputs(flat);
85
+ this.#outputs.record(flat);
68
86
  return flat;
69
87
  }
70
- async transformFile(fileArrayLike, buildTarget, options = {}) {
71
- const files = Array.isArray(fileArrayLike) ? fileArrayLike : [
72
- fileArrayLike
73
- ];
74
- const responses = this.transformTarget(files, buildTarget, options);
75
- return responses;
76
- }
77
88
  /**
78
- * Synchronous, single-file variant of `transformFile`.
79
- * Reads the file with `fs.readFileSync` and transpiles via `swc.transformSync`.
80
- * Intended for callers that cannot await (e.g. Node.js `registerHooks` load hook).
81
- */ transformFileSync(file, buildTarget, options = {}) {
82
- const baseConfig = this.#swcConfigFactory.createBaseConfig(buildTarget, options);
89
+ * The SWC options for one project and target, without a filename. Building them reads the
90
+ * workspace's aliases and merges configs, so a caller that transpiles many files builds them
91
+ * once and passes them to {@link transformCode}.
92
+ */ createBaseConfig(buildTarget, options = {}) {
93
+ return this.#swcConfigFactory.createBaseConfig(buildTarget, this.withAliasContext(options));
94
+ }
95
+ /** Sync variant of {@link transformCode}, for the load hook, which cannot await (#514). */ transformCodeSync(content, file, buildTarget, baseConfig) {
83
96
  const swcOptions = this.#swcConfigFactory.createFileConfig(file, baseConfig);
84
- let content;
85
- try {
86
- content = _nodefs.default.readFileSync(file.fullPath, "utf8");
87
- } catch (error) {
88
- return _transformresponsemodel.TransformResponse.Error({
89
- file,
90
- messages: [
91
- String(error)
92
- ],
93
- config: swcOptions
94
- });
95
- }
96
- if (content === "") {
97
- return _transformresponsemodel.TransformResponse.Skipped({
98
- file,
99
- messages: "File is empty",
100
- config: swcOptions
101
- });
102
- }
97
+ if (content === "") return SwcTranspiler.skippedEmpty(file, swcOptions);
103
98
  try {
104
99
  const transformed = (0, _core.transformSync)(content, swcOptions);
105
100
  if (transformed == null) {
106
101
  throw new Error("swc.transformSync returned no result");
107
102
  }
108
- const filePath = file.relativePath;
109
- const extName = _nodepath.default.extname(filePath);
110
- const fileName = filePath.replace(new RegExp(`${extName}$`), ".js");
111
- return _transformresponsemodel.TransformResponse.Success({
112
- file,
113
- code: transformed.code,
114
- sourceContent: content,
115
- target: buildTarget,
116
- fileName,
117
- config: swcOptions
118
- });
103
+ return SwcTranspiler.succeeded(file, buildTarget, swcOptions, content, transformed.code);
119
104
  } catch (error) {
120
105
  return _transformresponsemodel.TransformResponse.Error({
121
106
  file,
@@ -126,51 +111,23 @@ class SwcTranspiler extends (0, _extensibility.mixwith)(_cachesoutputsmixin.Cach
126
111
  });
127
112
  }
128
113
  }
129
- async transformTarget(files, buildTarget, options, project, onOutput) {
130
- const baseConfig = this.#swcConfigFactory.createBaseConfig(buildTarget, options ?? {});
131
- return await Promise.all(files.map((file)=>{
132
- const swcOptions = this.#swcConfigFactory.createFileConfig(file, baseConfig);
133
- return this.runTransform(file, buildTarget, swcOptions, project, onOutput);
134
- }));
135
- }
136
- async runTransform(file, target, swcOptions, project, onOutput) {
137
- const content = await this.getFileContent(file);
138
- if (content === "") {
139
- const skipped = _transformresponsemodel.TransformResponse.Skipped({
140
- file,
141
- messages: "File is empty",
142
- config: swcOptions,
143
- project
144
- });
145
- onOutput?.(skipped);
146
- return skipped;
147
- }
114
+ /**
115
+ * Compiles `content` as the source of `file`, without reading the file: for callers that
116
+ * already hold the code, such as the Vitest plugin, which must compile what Vite passes it
117
+ * rather than an earlier read of the disk (#517). Async SWC, on the thread pool, so many
118
+ * calls in flight compile in parallel (#661). With a `project`, the response carries where
119
+ * the build writes the output.
120
+ */ async transformCode(content, file, buildTarget, baseConfig, project) {
121
+ const swcOptions = this.#swcConfigFactory.createFileConfig(file, baseConfig);
122
+ if (content === "") return SwcTranspiler.skippedEmpty(file, swcOptions, project);
148
123
  try {
149
- const filePath = file.relativePath;
150
- const extName = _nodepath.default.extname(filePath);
151
- const fileName = filePath.replace(new RegExp(`${extName}$`), ".js");
152
- const outBaseDir = project?.getOutDir(target);
153
- const outputPath = outBaseDir ? _nodepath.default.join(outBaseDir, fileName) : undefined;
154
- const outputDir = outputPath ? _nodepath.default.dirname(outputPath) : undefined;
155
124
  const transformed = await (0, _core.transform)(content, swcOptions);
156
125
  if (transformed == null) {
157
126
  throw new Error("swc.transform returned no result");
158
127
  }
159
- const success = _transformresponsemodel.TransformResponse.Success({
160
- file,
161
- code: transformed.code,
162
- sourceContent: content,
163
- target,
164
- fileName,
165
- outputDir,
166
- outputPath,
167
- config: swcOptions,
168
- project
169
- });
170
- onOutput?.(success);
171
- return success;
128
+ return SwcTranspiler.succeeded(file, buildTarget, swcOptions, content, transformed.code, project);
172
129
  } catch (error) {
173
- const failure = _transformresponsemodel.TransformResponse.Error({
130
+ return _transformresponsemodel.TransformResponse.Error({
174
131
  file,
175
132
  messages: [
176
133
  String(error)
@@ -178,21 +135,52 @@ class SwcTranspiler extends (0, _extensibility.mixwith)(_cachesoutputsmixin.Cach
178
135
  config: swcOptions,
179
136
  project
180
137
  });
181
- onOutput?.(failure);
182
- return failure;
183
138
  }
184
139
  }
140
+ static skippedEmpty(file, swcOptions, project) {
141
+ return _transformresponsemodel.TransformResponse.Skipped({
142
+ file,
143
+ messages: "File is empty",
144
+ config: swcOptions,
145
+ project
146
+ });
147
+ }
148
+ static succeeded(file, buildTarget, swcOptions, content, code, project) {
149
+ const fileName = _workspace.sourceExtensions.outputPath(file.relativePath);
150
+ const outBaseDir = project?.getOutDir(buildTarget);
151
+ const outputPath = outBaseDir ? _nodepath.default.join(outBaseDir, fileName) : undefined;
152
+ return _transformresponsemodel.TransformResponse.Success({
153
+ file,
154
+ code,
155
+ sourceContent: content,
156
+ target: buildTarget,
157
+ fileName,
158
+ outputDir: outputPath ? _nodepath.default.dirname(outputPath) : undefined,
159
+ outputPath,
160
+ config: swcOptions,
161
+ project
162
+ });
163
+ }
164
+ async transformTarget(files, buildTarget, options, project, onOutput) {
165
+ const baseConfig = this.createBaseConfig(buildTarget, options);
166
+ return await Promise.all(files.map(async (file)=>{
167
+ const content = await this.getFileContent(file);
168
+ const response = await this.transformCode(content, file, buildTarget, baseConfig, project);
169
+ onOutput?.(response);
170
+ return response;
171
+ }));
172
+ }
185
173
  async onIncrementalFileEvent(evt) {
186
174
  const { file, project } = evt;
187
- if (evt.eventName === _io.io.WatchEvents.unlink) {
188
- this.deleteCachedOutputs(file.fullPath);
175
+ if (evt.eventName === _io.WatchEvents.unlink) {
176
+ this.#outputs.delete(file.fullPath);
189
177
  return [];
190
178
  }
191
179
  if (!project.isSourceFile(file)) {
192
180
  return [];
193
181
  }
194
182
  const freshContent = await file.getContent();
195
- const cached = this.outputCache.get(file.fullPath);
183
+ const cached = this.#outputs.get(file.fullPath);
196
184
  if (cached != null && cached[0]?.sourceContent === freshContent) {
197
185
  return [];
198
186
  }
@@ -231,5 +219,3 @@ _ts_decorate([
231
219
  SwcTranspiler = _ts_decorate([
232
220
  _diagnostics.Trace
233
221
  ], SwcTranspiler);
234
-
235
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9zZXJ2aWNlcy9zd2MtdHJhbnNwaWxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgY2FjaGUsIGludmFsaWRhdGVDYWNoZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgVHJhY2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2RpYWdub3N0aWNzXCI7XG5pbXBvcnQgeyBtaXh3aXRoIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9leHRlbnNpYmlsaXR5XCI7XG5pbXBvcnQgdHlwZSB7IEZpbGVFeCB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGlvIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9pb1wiO1xuaW1wb3J0IHsgdHlwZSBPcHRpb25zLCB0cmFuc2Zvcm0sIHRyYW5zZm9ybVN5bmMgfSBmcm9tIFwiQHN3Yy9jb3JlXCI7XG5pbXBvcnQge1xuXHR0eXBlIEJ1aWxkVGFyZ2V0LFxuXHRCdWlsZFRhcmdldHMsXG5cdHR5cGUgVHJhbnNwaWxlVGFyZ2V0LFxufSBmcm9tIFwiLi4vdHlwZXMvYnVpbGQtdGFyZ2V0LnR5cGUuanNcIjtcbmltcG9ydCBcIi4uL2V4dGVuc2lvbnMvcHJvamVjdC5leHRlbnNpb25zLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3RGaWxlRXZlbnQsIFRzY29uZmlnIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBTd2NDb25maWdGYWN0b3J5IH0gZnJvbSBcIi4uL2ZhY3Rvcmllcy9zd2MtY29uZmlnLmZhY3RvcnkuanNcIjtcbmltcG9ydCB7IENhY2hlc091dHB1dHMgfSBmcm9tIFwiLi4vbWl4aW5zL2NhY2hlcy1vdXRwdXRzLm1peGluLmpzXCI7XG5pbXBvcnQgeyBJbmNyZW1lbnRhbFRyYW5zZm9ybSB9IGZyb20gXCIuLi9taXhpbnMvaW5jcmVtZW50YWwtdHJhbnNmb3JtLm1peGluLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN3Y0NvbmZpZyB9IGZyb20gXCIuLi90eXBlcy9zd2MtY29uZmlnLnR5cGUuanNcIjtcbmltcG9ydCB7IFRyYW5zZm9ybVJlc3BvbnNlIH0gZnJvbSBcIi4uL3R5cGVzL3RyYW5zZm9ybS1yZXNwb25zZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUcmFuc2Zvcm1lciB9IGZyb20gXCIuLi90eXBlcy90cmFuc2Zvcm1lci50eXBlLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFRyYW5zcGlsZU9wdGlvbnMgPSB7XG5cdGFsaWFzUGF0aHM/OiBib29sZWFuO1xuXHR0c0NvbmZpZz86IFRzY29uZmlnO1xuXHR1c2VyQ29uZmlnPzogU3djQ29uZmlnO1xufTtcblxuQFRyYWNlXG5leHBvcnQgY2xhc3MgU3djVHJhbnNwaWxlclxuXHRleHRlbmRzIG1peHdpdGgoQ2FjaGVzT3V0cHV0cywgSW5jcmVtZW50YWxUcmFuc2Zvcm0pXG5cdGltcGxlbWVudHMgVHJhbnNmb3JtZXJcbntcblx0cHVibGljIGJ1aWxkVGFyZ2V0czogQnVpbGRUYXJnZXRbXSA9IFtCdWlsZFRhcmdldHMuZXM2LCBCdWlsZFRhcmdldHMuY29tbW9uanNdO1xuXHQjc3djQ29uZmlnRmFjdG9yeSA9IG5ldyBTd2NDb25maWdGYWN0b3J5KCk7XG5cblx0cHVibGljIGFzeW5jIHRyYW5zZm9ybVByb2plY3QoXG5cdFx0cHJvamVjdEFycmF5TGlrZTogUHJvamVjdCB8IFByb2plY3RbXSxcblx0XHRmaWxlRmlsdGVyPzogKHByb2plY3Q6IFByb2plY3QpID0+IFByb21pc2U8RmlsZUV4W10+LFxuXHRcdG9uT3V0cHV0PzogKHJlc3BvbnNlOiBUcmFuc2Zvcm1SZXNwb25zZSkgPT4gdm9pZCxcblx0KTogUHJvbWlzZTxUcmFuc2Zvcm1SZXNwb25zZVtdPiB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSBBcnJheS5pc0FycmF5KHByb2plY3RBcnJheUxpa2UpID8gcHJvamVjdEFycmF5TGlrZSA6IFtwcm9qZWN0QXJyYXlMaWtlXTtcblx0XHRjb25zdCByZXNwb25zZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdHByb2plY3RzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuXHRcdFx0XHRjb25zdCB7IHRhcmdldHMsIGFsaWFzUGF0aHMgfSA9IHByb2plY3QuZ2V0Rm9yZ2VDb25maWd1cmF0aW9uKCk7XG5cdFx0XHRcdGNvbnN0IHRyYW5zcGlsZVRhcmdldHMgPSB0YXJnZXRzLmZpbHRlcigoYnQpID0+IGJ0ICE9PSBCdWlsZFRhcmdldHMudHlwZXMpO1xuXHRcdFx0XHRpZiAodHJhbnNwaWxlVGFyZ2V0cy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRyZXR1cm4gW107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBzb3VyY2VGaWxlcyA9IGF3YWl0IChmaWxlRmlsdGVyPy4ocHJvamVjdCkgPz8gcHJvamVjdC5nZXRBbGxGaWxlcygpKTtcblx0XHRcdFx0Y29uc3QgdHNDb25maWcgPSBhd2FpdCBwcm9qZWN0LmdldFRzQ29uZmlnKCk7XG5cdFx0XHRcdGNvbnN0IHVzZXJDb25maWcgPSBhd2FpdCBwcm9qZWN0LmdldFN3Y0NvbmZpZygpO1xuXHRcdFx0XHRjb25zdCByZXNwb25zZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdFx0XHR0cmFuc3BpbGVUYXJnZXRzLm1hcCgodGFyZ2V0KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy50cmFuc2Zvcm1UYXJnZXQoXG5cdFx0XHRcdFx0XHRcdHNvdXJjZUZpbGVzLFxuXHRcdFx0XHRcdFx0XHR0YXJnZXQsXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0c0NvbmZpZyxcblx0XHRcdFx0XHRcdFx0XHR1c2VyQ29uZmlnLFxuXHRcdFx0XHRcdFx0XHRcdGFsaWFzUGF0aHMsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHByb2plY3QsXG5cdFx0XHRcdFx0XHRcdG9uT3V0cHV0LFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlcy5mbGF0KCk7XG5cdFx0XHR9KSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgZmxhdCA9IHJlc3BvbnNlcy5mbGF0KCk7XG5cdFx0dGhpcy5jYWNoZU91dHB1dHMoZmxhdCk7XG5cdFx0cmV0dXJuIGZsYXQ7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgdHJhbnNmb3JtRmlsZShcblx0XHRmaWxlQXJyYXlMaWtlOiBGaWxlRXhbXSB8IEZpbGVFeCxcblx0XHRidWlsZFRhcmdldDogVHJhbnNwaWxlVGFyZ2V0LFxuXHRcdG9wdGlvbnM6IFRyYW5zcGlsZU9wdGlvbnMgPSB7fSxcblx0KSB7XG5cdFx0Y29uc3QgZmlsZXMgPSBBcnJheS5pc0FycmF5KGZpbGVBcnJheUxpa2UpID8gZmlsZUFycmF5TGlrZSA6IFtmaWxlQXJyYXlMaWtlXTtcblx0XHRjb25zdCByZXNwb25zZXMgPSB0aGlzLnRyYW5zZm9ybVRhcmdldChmaWxlcywgYnVpbGRUYXJnZXQsIG9wdGlvbnMpO1xuXHRcdHJldHVybiByZXNwb25zZXM7XG5cdH1cblxuXHQvKipcblx0ICogU3luY2hyb25vdXMsIHNpbmdsZS1maWxlIHZhcmlhbnQgb2YgYHRyYW5zZm9ybUZpbGVgLlxuXHQgKiBSZWFkcyB0aGUgZmlsZSB3aXRoIGBmcy5yZWFkRmlsZVN5bmNgIGFuZCB0cmFuc3BpbGVzIHZpYSBgc3djLnRyYW5zZm9ybVN5bmNgLlxuXHQgKiBJbnRlbmRlZCBmb3IgY2FsbGVycyB0aGF0IGNhbm5vdCBhd2FpdCAoZS5nLiBOb2RlLmpzIGByZWdpc3Rlckhvb2tzYCBsb2FkIGhvb2spLlxuXHQgKi9cblx0cHVibGljIHRyYW5zZm9ybUZpbGVTeW5jKFxuXHRcdGZpbGU6IEZpbGVFeCxcblx0XHRidWlsZFRhcmdldDogVHJhbnNwaWxlVGFyZ2V0LFxuXHRcdG9wdGlvbnM6IFRyYW5zcGlsZU9wdGlvbnMgPSB7fSxcblx0KTogVHJhbnNmb3JtUmVzcG9uc2Uge1xuXHRcdGNvbnN0IGJhc2VDb25maWcgPSB0aGlzLiNzd2NDb25maWdGYWN0b3J5LmNyZWF0ZUJhc2VDb25maWcoYnVpbGRUYXJnZXQsIG9wdGlvbnMpO1xuXHRcdGNvbnN0IHN3Y09wdGlvbnMgPSB0aGlzLiNzd2NDb25maWdGYWN0b3J5LmNyZWF0ZUZpbGVDb25maWcoZmlsZSwgYmFzZUNvbmZpZyk7XG5cblx0XHRsZXQgY29udGVudDogc3RyaW5nO1xuXHRcdHRyeSB7XG5cdFx0XHRjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUuZnVsbFBhdGgsIFwidXRmOFwiKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0cmV0dXJuIFRyYW5zZm9ybVJlc3BvbnNlLkVycm9yKHtcblx0XHRcdFx0ZmlsZSxcblx0XHRcdFx0bWVzc2FnZXM6IFtTdHJpbmcoZXJyb3IpXSxcblx0XHRcdFx0Y29uZmlnOiBzd2NPcHRpb25zLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbnRlbnQgPT09IFwiXCIpIHtcblx0XHRcdHJldHVybiBUcmFuc2Zvcm1SZXNwb25zZS5Ta2lwcGVkKHtcblx0XHRcdFx0ZmlsZSxcblx0XHRcdFx0bWVzc2FnZXM6IFwiRmlsZSBpcyBlbXB0eVwiLFxuXHRcdFx0XHRjb25maWc6IHN3Y09wdGlvbnMsXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdHJhbnNmb3JtZWQgPSB0cmFuc2Zvcm1TeW5jKGNvbnRlbnQsIHN3Y09wdGlvbnMpO1xuXHRcdFx0aWYgKHRyYW5zZm9ybWVkID09IG51bGwpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic3djLnRyYW5zZm9ybVN5bmMgcmV0dXJuZWQgbm8gcmVzdWx0XCIpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZmlsZVBhdGggPSBmaWxlLnJlbGF0aXZlUGF0aDtcblx0XHRcdGNvbnN0IGV4dE5hbWUgPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpO1xuXHRcdFx0Y29uc3QgZmlsZU5hbWUgPSBmaWxlUGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoYCR7ZXh0TmFtZX0kYCksIFwiLmpzXCIpO1xuXHRcdFx0cmV0dXJuIFRyYW5zZm9ybVJlc3BvbnNlLlN1Y2Nlc3Moe1xuXHRcdFx0XHRmaWxlLFxuXHRcdFx0XHRjb2RlOiB0cmFuc2Zvcm1lZC5jb2RlLFxuXHRcdFx0XHRzb3VyY2VDb250ZW50OiBjb250ZW50LFxuXHRcdFx0XHR0YXJnZXQ6IGJ1aWxkVGFyZ2V0LFxuXHRcdFx0XHRmaWxlTmFtZSxcblx0XHRcdFx0Y29uZmlnOiBzd2NPcHRpb25zLFxuXHRcdFx0fSk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHJldHVybiBUcmFuc2Zvcm1SZXNwb25zZS5FcnJvcih7XG5cdFx0XHRcdGZpbGUsXG5cdFx0XHRcdG1lc3NhZ2VzOiBbU3RyaW5nKGVycm9yKV0sXG5cdFx0XHRcdGNvbmZpZzogc3djT3B0aW9ucyxcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgdHJhbnNmb3JtVGFyZ2V0KFxuXHRcdGZpbGVzOiBGaWxlRXhbXSxcblx0XHRidWlsZFRhcmdldDogVHJhbnNwaWxlVGFyZ2V0LFxuXHRcdG9wdGlvbnM/OiBUcmFuc3BpbGVPcHRpb25zLFxuXHRcdHByb2plY3Q/OiBQcm9qZWN0LFxuXHRcdG9uT3V0cHV0PzogKHJlc3BvbnNlOiBUcmFuc2Zvcm1SZXNwb25zZSkgPT4gdm9pZCxcblx0KSB7XG5cdFx0Y29uc3QgYmFzZUNvbmZpZyA9IHRoaXMuI3N3Y0NvbmZpZ0ZhY3RvcnkuY3JlYXRlQmFzZUNvbmZpZyhidWlsZFRhcmdldCwgb3B0aW9ucyA/PyB7fSk7XG5cdFx0cmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0ZmlsZXMubWFwKChmaWxlKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHN3Y09wdGlvbnMgPSB0aGlzLiNzd2NDb25maWdGYWN0b3J5LmNyZWF0ZUZpbGVDb25maWcoZmlsZSwgYmFzZUNvbmZpZyk7XG5cdFx0XHRcdHJldHVybiB0aGlzLnJ1blRyYW5zZm9ybShmaWxlLCBidWlsZFRhcmdldCwgc3djT3B0aW9ucywgcHJvamVjdCwgb25PdXRwdXQpO1xuXHRcdFx0fSksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuVHJhbnNmb3JtKFxuXHRcdGZpbGU6IEZpbGVFeCxcblx0XHR0YXJnZXQ6IEJ1aWxkVGFyZ2V0LFxuXHRcdHN3Y09wdGlvbnM6IE9wdGlvbnMsXG5cdFx0cHJvamVjdD86IFByb2plY3QsXG5cdFx0b25PdXRwdXQ/OiAocmVzcG9uc2U6IFRyYW5zZm9ybVJlc3BvbnNlKSA9PiB2b2lkLFxuXHQpOiBQcm9taXNlPFRyYW5zZm9ybVJlc3BvbnNlPiB7XG5cdFx0Y29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZ2V0RmlsZUNvbnRlbnQoZmlsZSk7XG5cdFx0aWYgKGNvbnRlbnQgPT09IFwiXCIpIHtcblx0XHRcdGNvbnN0IHNraXBwZWQgPSBUcmFuc2Zvcm1SZXNwb25zZS5Ta2lwcGVkKHtcblx0XHRcdFx0ZmlsZSxcblx0XHRcdFx0bWVzc2FnZXM6IFwiRmlsZSBpcyBlbXB0eVwiLFxuXHRcdFx0XHRjb25maWc6IHN3Y09wdGlvbnMsXG5cdFx0XHRcdHByb2plY3QsXG5cdFx0XHR9KTtcblx0XHRcdG9uT3V0cHV0Py4oc2tpcHBlZCk7XG5cdFx0XHRyZXR1cm4gc2tpcHBlZDtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgZmlsZVBhdGggPSBmaWxlLnJlbGF0aXZlUGF0aDtcblx0XHRcdGNvbnN0IGV4dE5hbWUgPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpO1xuXHRcdFx0Y29uc3QgZmlsZU5hbWUgPSBmaWxlUGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoYCR7ZXh0TmFtZX0kYCksIFwiLmpzXCIpO1xuXHRcdFx0Y29uc3Qgb3V0QmFzZURpciA9IHByb2plY3Q/LmdldE91dERpcih0YXJnZXQpO1xuXHRcdFx0Y29uc3Qgb3V0cHV0UGF0aCA9IG91dEJhc2VEaXIgPyBwYXRoLmpvaW4ob3V0QmFzZURpciwgZmlsZU5hbWUpIDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3Qgb3V0cHV0RGlyID0gb3V0cHV0UGF0aCA/IHBhdGguZGlybmFtZShvdXRwdXRQYXRoKSA6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IHRyYW5zZm9ybWVkID0gYXdhaXQgdHJhbnNmb3JtKGNvbnRlbnQsIHN3Y09wdGlvbnMpO1xuXHRcdFx0aWYgKHRyYW5zZm9ybWVkID09IG51bGwpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic3djLnRyYW5zZm9ybSByZXR1cm5lZCBubyByZXN1bHRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHN1Y2Nlc3MgPSBUcmFuc2Zvcm1SZXNwb25zZS5TdWNjZXNzKHtcblx0XHRcdFx0ZmlsZSxcblx0XHRcdFx0Y29kZTogdHJhbnNmb3JtZWQuY29kZSxcblx0XHRcdFx0c291cmNlQ29udGVudDogY29udGVudCxcblx0XHRcdFx0dGFyZ2V0LFxuXHRcdFx0XHRmaWxlTmFtZSxcblx0XHRcdFx0b3V0cHV0RGlyLFxuXHRcdFx0XHRvdXRwdXRQYXRoLFxuXHRcdFx0XHRjb25maWc6IHN3Y09wdGlvbnMsXG5cdFx0XHRcdHByb2plY3QsXG5cdFx0XHR9KTtcblx0XHRcdG9uT3V0cHV0Py4oc3VjY2Vzcyk7XG5cdFx0XHRyZXR1cm4gc3VjY2Vzcztcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc3QgZmFpbHVyZSA9IFRyYW5zZm9ybVJlc3BvbnNlLkVycm9yKHtcblx0XHRcdFx0ZmlsZSxcblx0XHRcdFx0bWVzc2FnZXM6IFtTdHJpbmcoZXJyb3IpXSxcblx0XHRcdFx0Y29uZmlnOiBzd2NPcHRpb25zLFxuXHRcdFx0XHRwcm9qZWN0LFxuXHRcdFx0fSk7XG5cdFx0XHRvbk91dHB1dD8uKGZhaWx1cmUpO1xuXHRcdFx0cmV0dXJuIGZhaWx1cmU7XG5cdFx0fVxuXHR9XG5cblx0cHJvdGVjdGVkIGFzeW5jIG9uSW5jcmVtZW50YWxGaWxlRXZlbnQoZXZ0OiBQcm9qZWN0RmlsZUV2ZW50KTogUHJvbWlzZTxUcmFuc2Zvcm1SZXNwb25zZVtdPiB7XG5cdFx0Y29uc3QgeyBmaWxlLCBwcm9qZWN0IH0gPSBldnQ7XG5cdFx0aWYgKGV2dC5ldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLnVubGluaykge1xuXHRcdFx0dGhpcy5kZWxldGVDYWNoZWRPdXRwdXRzKGZpbGUuZnVsbFBhdGgpO1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblx0XHRpZiAoIXByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXHRcdGNvbnN0IGZyZXNoQ29udGVudCA9IGF3YWl0IGZpbGUuZ2V0Q29udGVudCgpO1xuXHRcdGNvbnN0IGNhY2hlZCA9IHRoaXMub3V0cHV0Q2FjaGUuZ2V0KGZpbGUuZnVsbFBhdGgpO1xuXHRcdGlmIChjYWNoZWQgIT0gbnVsbCAmJiBjYWNoZWRbMF0/LnNvdXJjZUNvbnRlbnQgPT09IGZyZXNoQ29udGVudCkge1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblx0XHR0aGlzLmludmFsaWRhdGVDb250ZW50Q2FjaGUoZmlsZSk7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNmb3JtUHJvamVjdChwcm9qZWN0LCAoKSA9PiBQcm9taXNlLnJlc29sdmUoW2ZpbGVdKSk7XG5cdH1cblxuXHRAaW52YWxpZGF0ZUNhY2hlKFN3Y1RyYW5zcGlsZXIucHJvdG90eXBlLmdldEZpbGVDb250ZW50LCB7XG5cdFx0bmFtZTogXCJGSUxFX0NPTlRFTlRcIixcblx0XHRrZXlGbjogKC4uLmFyZ3MpID0+IChhcmdzWzBdIGFzIEZpbGVFeCkuZnVsbFBhdGgsXG5cdH0pXG5cdHB1YmxpYyBpbnZhbGlkYXRlQ29udGVudENhY2hlKF9maWxlOiBGaWxlRXgpOiB2b2lkIHt9XG5cblx0QGNhY2hlKHsgbmFtZTogXCJGSUxFX0NPTlRFTlRcIiwga2V5Rm46ICguLi5hcmdzKSA9PiAoYXJnc1swXSBhcyBGaWxlRXgpLmZ1bGxQYXRoIH0pXG5cdHByaXZhdGUgYXN5bmMgZ2V0RmlsZUNvbnRlbnQoZmlsZTogRmlsZUV4KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gYXdhaXQgZmlsZS5nZXRDb250ZW50KCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJTd2NUcmFuc3BpbGVyIiwibWl4d2l0aCIsIkNhY2hlc091dHB1dHMiLCJJbmNyZW1lbnRhbFRyYW5zZm9ybSIsImJ1aWxkVGFyZ2V0cyIsIkJ1aWxkVGFyZ2V0cyIsImVzNiIsImNvbW1vbmpzIiwiU3djQ29uZmlnRmFjdG9yeSIsInRyYW5zZm9ybVByb2plY3QiLCJwcm9qZWN0QXJyYXlMaWtlIiwiZmlsZUZpbHRlciIsIm9uT3V0cHV0IiwicHJvamVjdHMiLCJBcnJheSIsImlzQXJyYXkiLCJyZXNwb25zZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwicHJvamVjdCIsInRhcmdldHMiLCJhbGlhc1BhdGhzIiwiZ2V0Rm9yZ2VDb25maWd1cmF0aW9uIiwidHJhbnNwaWxlVGFyZ2V0cyIsImZpbHRlciIsImJ0IiwidHlwZXMiLCJsZW5ndGgiLCJzb3VyY2VGaWxlcyIsImdldEFsbEZpbGVzIiwidHNDb25maWciLCJnZXRUc0NvbmZpZyIsInVzZXJDb25maWciLCJnZXRTd2NDb25maWciLCJ0YXJnZXQiLCJ0cmFuc2Zvcm1UYXJnZXQiLCJmbGF0IiwiY2FjaGVPdXRwdXRzIiwidHJhbnNmb3JtRmlsZSIsImZpbGVBcnJheUxpa2UiLCJidWlsZFRhcmdldCIsIm9wdGlvbnMiLCJmaWxlcyIsInRyYW5zZm9ybUZpbGVTeW5jIiwiZmlsZSIsImJhc2VDb25maWciLCJjcmVhdGVCYXNlQ29uZmlnIiwic3djT3B0aW9ucyIsImNyZWF0ZUZpbGVDb25maWciLCJjb250ZW50IiwiZnMiLCJyZWFkRmlsZVN5bmMiLCJmdWxsUGF0aCIsImVycm9yIiwiVHJhbnNmb3JtUmVzcG9uc2UiLCJFcnJvciIsIm1lc3NhZ2VzIiwiU3RyaW5nIiwiY29uZmlnIiwiU2tpcHBlZCIsInRyYW5zZm9ybWVkIiwidHJhbnNmb3JtU3luYyIsImZpbGVQYXRoIiwicmVsYXRpdmVQYXRoIiwiZXh0TmFtZSIsInBhdGgiLCJleHRuYW1lIiwiZmlsZU5hbWUiLCJyZXBsYWNlIiwiUmVnRXhwIiwiU3VjY2VzcyIsImNvZGUiLCJzb3VyY2VDb250ZW50IiwicnVuVHJhbnNmb3JtIiwiZ2V0RmlsZUNvbnRlbnQiLCJza2lwcGVkIiwib3V0QmFzZURpciIsImdldE91dERpciIsIm91dHB1dFBhdGgiLCJqb2luIiwidW5kZWZpbmVkIiwib3V0cHV0RGlyIiwiZGlybmFtZSIsInRyYW5zZm9ybSIsInN1Y2Nlc3MiLCJmYWlsdXJlIiwib25JbmNyZW1lbnRhbEZpbGVFdmVudCIsImV2dCIsImV2ZW50TmFtZSIsImlvIiwiV2F0Y2hFdmVudHMiLCJ1bmxpbmsiLCJkZWxldGVDYWNoZWRPdXRwdXRzIiwiaXNTb3VyY2VGaWxlIiwiZnJlc2hDb250ZW50IiwiZ2V0Q29udGVudCIsImNhY2hlZCIsIm91dHB1dENhY2hlIiwiZ2V0IiwiaW52YWxpZGF0ZUNvbnRlbnRDYWNoZSIsInJlc29sdmUiLCJfZmlsZSIsInByb3RvdHlwZSIsIm5hbWUiLCJrZXlGbiIsImFyZ3MiXSwibWFwcGluZ3MiOiI7Ozs7K0JBOEJhQTs7O2VBQUFBOzs7K0RBOUJFO2lFQUNFO3lCQUVzQjs2QkFDakI7K0JBQ0U7b0JBRUw7c0JBQ29DO2lDQUtoRDtRQUNBO2tDQUUwQjtvQ0FDSDsyQ0FDTzt3Q0FFSDs7Ozs7Ozs7Ozs7Ozs7O0FBVTNCLE1BQU1BLHNCQUNKQyxJQUFBQSxzQkFBTyxFQUFDQyxpQ0FBYSxFQUFFQywrQ0FBb0I7SUFHNUNDLGVBQThCO1FBQUNDLDZCQUFZLENBQUNDLEdBQUc7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
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", {
3
+ value: true
4
+ });
5
+ Object.defineProperty(exports, "transpileCache", {
6
+ enumerable: true,
7
+ get: function() {
8
+ return transpileCache;
9
+ }
10
+ });
11
+ const _nodefs = require("node:fs");
12
+ const _nodeos = /*#__PURE__*/ _interop_require_default(require("node:os"));
13
+ const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
14
+ const _core = require("@swc/core");
15
+ function _interop_require_default(obj) {
16
+ return obj && obj.__esModule ? obj : {
17
+ default: obj
18
+ };
19
+ }
20
+ /**
21
+ * Where compiled code is cached on disk (#514), or null when caching is off:
22
+ *
23
+ * - `DECOHERE_CACHE=0` turns it off.
24
+ * - `DECOHERE_CACHE_DIR` puts it in that directory.
25
+ * - Otherwise `<root>/node_modules/.cache/decohere`, where tools keep caches, or when the
26
+ * workspace has no `node_modules`, `$XDG_CACHE_HOME/decohere`, then the OS temp directory.
27
+ *
28
+ * Flux keeps its entries in the `flux` folder inside it; `forge clean` removes the folder.
29
+ */ function directory(rootDir, env = process.env) {
30
+ if (env.DECOHERE_CACHE === "0") return null;
31
+ if (env.DECOHERE_CACHE_DIR != null && env.DECOHERE_CACHE_DIR !== "") {
32
+ return _nodepath.default.resolve(env.DECOHERE_CACHE_DIR);
33
+ }
34
+ const nodeModules = _nodepath.default.join(rootDir, "node_modules");
35
+ if ((0, _nodefs.existsSync)(nodeModules)) return _nodepath.default.join(nodeModules, ".cache", "decohere");
36
+ if (env.XDG_CACHE_HOME != null && env.XDG_CACHE_HOME !== "") {
37
+ return _nodepath.default.join(env.XDG_CACHE_HOME, "decohere");
38
+ }
39
+ return _nodepath.default.join(_nodeos.default.tmpdir(), "decohere");
40
+ }
41
+ const transpileCache = {
42
+ directory,
43
+ swcVersion: _core.version
44
+ };
@@ -9,8 +9,8 @@ Object.defineProperty(exports, "TsProgramHost", {
9
9
  }
10
10
  });
11
11
  const _nodefs = /*#__PURE__*/ _interop_require_default(require("node:fs"));
12
- const _caching = require("@decohere/nexus/caching");
13
- const _diagnostics = require("@decohere/nexus/diagnostics");
12
+ const _caching = require("@decohere/core/caching");
13
+ const _diagnostics = require("@decohere/devkit/diagnostics");
14
14
  const _typescript = require("typescript");
15
15
  const _typeemitter = require("./type-emitter.js");
16
16
  function _interop_require_default(obj) {
@@ -57,13 +57,13 @@ class TsProgramHost {
57
57
  host.getDirectories = (directoryName)=>this.getDirectories(directoryName);
58
58
  return host;
59
59
  }
60
- createProgram(files, compilerOptions, host, oldProgram) {
60
+ createProgram(files, compilerOptions, host, oldProgram, requiredOptions = _typeemitter.REQUIRED_TYPE_EMITTER_OPTIONS) {
61
61
  const filePaths = files.map((f)=>f.fullPath);
62
62
  this.#invalidated.clear();
63
63
  return (0, _typescript.createProgram)(filePaths, {
64
64
  ..._typeemitter.DEFAULT_TYPE_EMITTER_OPTIONS,
65
65
  ...compilerOptions,
66
- ..._typeemitter.REQUIRED_TYPE_EMITTER_OPTIONS
66
+ ...requiredOptions
67
67
  }, host, oldProgram);
68
68
  }
69
69
  readFileFromDisk(fileName) {
@@ -131,5 +131,3 @@ _ts_decorate([
131
131
  TsProgramHost = _ts_decorate([
132
132
  _diagnostics.Trace
133
133
  ], TsProgramHost);
134
-
135
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9zZXJ2aWNlcy90cy1wcm9ncmFtLWhvc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBjYWNoZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgVHJhY2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2RpYWdub3N0aWNzXCI7XG5pbXBvcnQgdHlwZSB7IEZpbGVFeCB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB0eXBlIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5pbXBvcnQgeyBjcmVhdGVDb21waWxlckhvc3QsIGNyZWF0ZVByb2dyYW0gfSBmcm9tIFwidHlwZXNjcmlwdFwiO1xuaW1wb3J0IHtcblx0REVGQVVMVF9UWVBFX0VNSVRURVJfT1BUSU9OUyxcblx0UkVRVUlSRURfVFlQRV9FTUlUVEVSX09QVElPTlMsXG59IGZyb20gXCIuLi9zZXJ2aWNlcy90eXBlLWVtaXR0ZXIuanNcIjtcblxuLyoqXG4gKiBXcmFwcyBhIFR5cGVTY3JpcHQgQ29tcGlsZXJIb3N0IHdpdGggY2FjaGVkIGZpbGUtc3lzdGVtIGNhbGxzIHNvIHRoYXRcbiAqIHJlcGVhdGVkIHJlYWRzIGR1cmluZyBhIHNpbmdsZSBidWlsZCBkbyBub3QgaGl0IHRoZSBkaXNrIG11bHRpcGxlIHRpbWVzLlxuICpcbiAqIFNlcGFyYXRpbmcgdGhpcyBmcm9tIFR5cGVFbWl0dGVyIGtlZXBzIHRoZSB0cmFuc2Zvcm1lciBsb2dpYyByZWFkYWJsZSBhbmRcbiAqIGxldHMgdGhlIGNhY2hpbmcvcHJvZ3JhbS1jcmVhdGlvbiBjb25jZXJucyBsaXZlIGluIG9uZSBmb2N1c2VkIHBsYWNlLlxuICovXG5AVHJhY2VcbmV4cG9ydCBjbGFzcyBUc1Byb2dyYW1Ib3N0IHtcblx0I2ludmFsaWRhdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cblx0cHVibGljIGludmFsaWRhdGVTb3VyY2VGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLiNpbnZhbGlkYXRlZC5hZGQoZmlsZU5hbWUpO1xuXHR9XG5cblx0cHVibGljIGhhc0ludmFsaWRhdGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLiNpbnZhbGlkYXRlZC5zaXplID4gMDtcblx0fVxuXG5cdC8qKiBSZXR1cm5zIGEgc3RhYmxlIHN0cmluZyBrZXkgZm9yIGEgc2V0IG9mIGNvbXBpbGVyIG9wdGlvbnMgdGhhdCBhZmZlY3QgaG9zdCBiZWhhdmlvdXIuICovXG5cdHB1YmxpYyBob3N0S2V5KG9wdHM6IHRzLkNvbXBpbGVyT3B0aW9ucyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcblx0XHRcdHRhcmdldDogb3B0cy50YXJnZXQsXG5cdFx0XHRsaWI6IG9wdHMubGliLFxuXHRcdFx0dHlwZVJvb3RzOiBvcHRzLnR5cGVSb290cyxcblx0XHRcdHR5cGVzOiBvcHRzLnR5cGVzLFxuXHRcdFx0bW9kdWxlUmVzb2x1dGlvbjogb3B0cy5tb2R1bGVSZXNvbHV0aW9uLFxuXHRcdFx0YmFzZVVybDogb3B0cy5iYXNlVXJsLFxuXHRcdFx0cGF0aHM6IG9wdHMucGF0aHMsXG5cdFx0XHRtb2R1bGU6IG9wdHMubW9kdWxlLFxuXHRcdFx0cm9vdERpcjogb3B0cy5yb290RGlyLFxuXHRcdFx0cm9vdERpcnM6IG9wdHMucm9vdERpcnMsXG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlSG9zdChjb21waWxlck9wdGlvbnM6IHRzLkNvbXBpbGVyT3B0aW9ucyk6IHRzLkNvbXBpbGVySG9zdCB7XG5cdFx0Y29uc3QgaG9zdCA9IGNyZWF0ZUNvbXBpbGVySG9zdChjb21waWxlck9wdGlvbnMpO1xuXHRcdGhvc3QuZmlsZUV4aXN0cyA9IChmaWxlTmFtZSkgPT4gdGhpcy5maWxlRXhpc3RzT25EaXNrKGZpbGVOYW1lKTtcblx0XHRob3N0LnJlYWRGaWxlID0gKGZpbGVOYW1lKSA9PiB0aGlzLnJlYWRGaWxlRnJvbURpc2soZmlsZU5hbWUpO1xuXHRcdGhvc3QuZGlyZWN0b3J5RXhpc3RzID0gKGRpcmVjdG9yeU5hbWUpID0+IHRoaXMuZGlyZWN0b3J5RXhpc3RzKGRpcmVjdG9yeU5hbWUpO1xuXHRcdGhvc3QuZ2V0RGlyZWN0b3JpZXMgPSAoZGlyZWN0b3J5TmFtZSkgPT4gdGhpcy5nZXREaXJlY3RvcmllcyhkaXJlY3RvcnlOYW1lKTtcblx0XHRyZXR1cm4gaG9zdDtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVQcm9ncmFtKFxuXHRcdGZpbGVzOiBGaWxlRXhbXSxcblx0XHRjb21waWxlck9wdGlvbnM6IHRzLkNvbXBpbGVyT3B0aW9ucyxcblx0XHRob3N0OiB0cy5Db21waWxlckhvc3QsXG5cdFx0b2xkUHJvZ3JhbT86IHRzLlByb2dyYW0sXG5cdCk6IHRzLlByb2dyYW0ge1xuXHRcdGNvbnN0IGZpbGVQYXRocyA9IGZpbGVzLm1hcCgoZikgPT4gZi5mdWxsUGF0aCk7XG5cdFx0dGhpcy4jaW52YWxpZGF0ZWQuY2xlYXIoKTtcblx0XHRyZXR1cm4gY3JlYXRlUHJvZ3JhbShcblx0XHRcdGZpbGVQYXRocyxcblx0XHRcdHtcblx0XHRcdFx0Li4uREVGQVVMVF9UWVBFX0VNSVRURVJfT1BUSU9OUyxcblx0XHRcdFx0Li4uY29tcGlsZXJPcHRpb25zLFxuXHRcdFx0XHQuLi5SRVFVSVJFRF9UWVBFX0VNSVRURVJfT1BUSU9OUyxcblx0XHRcdH0sXG5cdFx0XHRob3N0LFxuXHRcdFx0b2xkUHJvZ3JhbSxcblx0XHQpO1xuXHR9XG5cblx0QGNhY2hlKHsgbmFtZTogXCJGSUxFX0NPTlRFTlRcIiwga2V5Rm46ICguLi5hcmdzKSA9PiBhcmdzWzBdIGFzIHN0cmluZyB9KVxuXHRwdWJsaWMgcmVhZEZpbGVGcm9tRGlzayhmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIGZzLnJlYWRGaWxlU3luYyhmaWxlTmFtZSwgXCJ1dGY4XCIpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRAY2FjaGUoKVxuXHRwdWJsaWMgZmlsZUV4aXN0c09uRGlzayhmaWxlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGZzLmV4aXN0c1N5bmMoZmlsZU5hbWUpO1xuXHR9XG5cblx0QGNhY2hlKClcblx0cHVibGljIGRpcmVjdG9yeUV4aXN0cyhkaXJlY3RvcnlOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIGZzLnN0YXRTeW5jKGRpcmVjdG9yeU5hbWUpLmlzRGlyZWN0b3J5KCk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0QGNhY2hlKClcblx0cHVibGljIGdldERpcmVjdG9yaWVzKGRpcmVjdG9yeU5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIGZzXG5cdFx0XHRcdC5yZWFkZGlyU3luYyhkaXJlY3RvcnlOYW1lLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcblx0XHRcdFx0LmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmlzRGlyZWN0b3J5KCkpXG5cdFx0XHRcdC5tYXAoKGVudHJ5KSA9PiBlbnRyeS5uYW1lKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJUc1Byb2dyYW1Ib3N0IiwiU2V0IiwiaW52YWxpZGF0ZVNvdXJjZUZpbGUiLCJmaWxlTmFtZSIsImFkZCIsImhhc0ludmFsaWRhdGVkIiwic2l6ZSIsImhvc3RLZXkiLCJvcHRzIiwiSlNPTiIsInN0cmluZ2lmeSIsInRhcmdldCIsImxpYiIsInR5cGVSb290cyIsInR5cGVzIiwibW9kdWxlUmVzb2x1dGlvbiIsImJhc2VVcmwiLCJwYXRocyIsIm1vZHVsZSIsInJvb3REaXIiLCJyb290RGlycyIsImNyZWF0ZUhvc3QiLCJjb21waWxlck9wdGlvbnMiLCJob3N0IiwiY3JlYXRlQ29tcGlsZXJIb3N0IiwiZmlsZUV4aXN0cyIsImZpbGVFeGlzdHNPbkRpc2siLCJyZWFkRmlsZSIsInJlYWRGaWxlRnJvbURpc2siLCJkaXJlY3RvcnlFeGlzdHMiLCJkaXJlY3RvcnlOYW1lIiwiZ2V0RGlyZWN0b3JpZXMiLCJjcmVhdGVQcm9ncmFtIiwiZmlsZXMiLCJvbGRQcm9ncmFtIiwiZmlsZVBhdGhzIiwibWFwIiwiZiIsImZ1bGxQYXRoIiwiY2xlYXIiLCJERUZBVUxUX1RZUEVfRU1JVFRFUl9PUFRJT05TIiwiUkVRVUlSRURfVFlQRV9FTUlUVEVSX09QVElPTlMiLCJmcyIsInJlYWRGaWxlU3luYyIsInVuZGVmaW5lZCIsImV4aXN0c1N5bmMiLCJzdGF0U3luYyIsImlzRGlyZWN0b3J5IiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwiZmlsdGVyIiwiZW50cnkiLCJuYW1lIiwia2V5Rm4iLCJhcmdzIl0sIm1hcHBpbmdzIjoiOzs7OytCQW1CYUE7OztlQUFBQTs7OytEQW5CRTt5QkFDTzs2QkFDQTs0QkFHNEI7NkJBSTNDOzs7Ozs7Ozs7Ozs7Ozs7QUFVQSxNQUFNQTtJQUNaLENBQUEsV0FBWSxHQUFHLElBQUlDLE1BQWM7SUFFMUJDLHFCQUFxQkMsUUFBZ0IsRUFBUTtRQUNuRCxJQUFJLENBQUMsQ0FBQSxXQUFZLENBQUNDLEdBQUcsQ0FBQ0Q7SUFDdkI7SUFFT0UsaUJBQTBCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLENBQUEsV0FBWSxDQUFDQyxJQUFJLEdBQUc7SUFDakM7SUFFQSwwRkFBMEYsR0FDMUYsQUFBT0MsUUFBUUMsSUFBd0IsRUFBVTtRQUNoRCxPQUFPQyxLQUFLQyxTQUFTLENBQUM7WUFDckJDLFFBQVFILEtBQUtHLE1BQU07WUFDbkJDLEtBQUtKLEtBQUtJLEdBQUc7WUFDYkMsV0FBV0wsS0FBS0ssU0FBUztZQUN6QkMsT0FBT04sS0FBS00sS0FBSztZQUNqQkMsa0JBQWtCUCxLQUFLTyxnQkFBZ0I7WUFDdkNDLFNBQVNSLEtBQUtRLE9BQU87WUFDckJDLE9BQU9ULEtBQUtTLEtBQUs7WUFDakJDLFFBQVFWLEtBQUtVLE1BQU07WUFDbkJDLFNBQVNYLEtBQUtXLE9BQU87WUFDckJDLFVBQVVaLEtBQUtZLFFBQVE7UUFDeEI7SUFDRDtJQUVPQyxXQUFXQyxlQUFtQyxFQUFtQjtRQUN2RSxNQUFNQyxPQUFPQyxJQUFBQSw4QkFBa0IsRUFBQ0Y7UUFDaENDLEtBQUtFLFVBQVUsR0FBRyxDQUFDdEIsV0FBYSxJQUFJLENBQUN1QixnQkFBZ0IsQ0FBQ3ZCO1FBQ3REb0IsS0FBS0ksUUFBUSxHQUFHLENBQUN4QixXQUFhLElBQUksQ0FBQ3lCLGdCQUFnQixDQUFDekI7UUFDcERvQixLQUFLTSxlQUFlLEdBQUcsQ0FBQ0MsZ0JBQWtCLElBQUksQ0FBQ0QsZUFBZSxDQUFDQztRQUMvRFAsS0FBS1EsY0FBYyxHQUFHLENBQUNELGdCQUFrQixJQUFJLENBQUNDLGNBQWMsQ0FBQ0Q7UUFDN0QsT0FBT1A7SUFDUjtJQUVPUyxjQUNOQyxLQUFlLEVBQ2ZYLGVBQW1DLEVBQ25DQyxJQUFxQixFQUNyQlcsVUFBdUIsRUFDVjtRQUNiLE1BQU1DLFlBQVlGLE1BQU1HLEdBQUcsQ0FBQyxDQUFDQyxJQUFNQSxFQUFFQyxRQUFRO1FBQzdDLElBQUksQ0FBQyxDQUFBLFdBQVksQ0FBQ0MsS0FBSztRQUN2QixPQUFPUCxJQUFBQSx5QkFBYSxFQUNuQkcsV0FDQTtZQUNDLEdBQUdLLHlDQUE0QjtZQUMvQixHQUFHbEIsZUFBZTtZQUNsQixHQUFHbUIsMENBQTZCO1FBQ2pDLEdBQ0FsQixNQUNBVztJQUVGO0lBR09OLGlCQUFpQnpCLFFBQWdCLEVBQXNCO1FBQzdELElBQUk7WUFDSCxPQUFPdUMsZUFBRSxDQUFDQyxZQUFZLENBQUN4QyxVQUFVO1FBQ2xDLEVBQUUsT0FBTTtZQUNQLE9BQU95QztRQUNSO0lBQ0Q7SUFHT2xCLGlCQUFpQnZCLFFBQWdCLEVBQVc7UUFDbEQsT0FBT3VDLGVBQUUsQ0FBQ0csVUFBVSxDQUFDMUM7SUFDdEI7SUFHTzBCLGdCQUFnQkMsYUFBcUIsRUFBVztRQUN0RCxJQUFJO1lBQ0gsT0FBT1ksZUFBRSxDQUFDSSxRQUFRLENBQUNoQixlQUFlaUIsV0FBVztRQUM5QyxFQUFFLE9BQU07WUFDUCxPQUFPO1FBQ1I7SUFDRDtJQUdPaEIsZUFBZUQsYUFBcUIsRUFBWTtRQUN0RCxJQUFJO1lBQ0gsT0FBT1ksZUFBRSxDQUNQTSxXQUFXLENBQUNsQixlQUFlO2dCQUFFbUIsZUFBZTtZQUFLLEdBQ2pEQyxNQUFNLENBQUMsQ0FBQ0MsUUFBVUEsTUFBTUosV0FBVyxJQUNuQ1gsR0FBRyxDQUFDLENBQUNlLFFBQVVBLE1BQU1DLElBQUk7UUFDNUIsRUFBRSxPQUFNO1lBQ1AsT0FBTyxFQUFFO1FBQ1Y7SUFDRDtBQUNEOzs7UUFsQ1VBLE1BQU07UUFBZ0JDLE9BQU8sQ0FBQyxHQUFHQyxPQUFTQSxJQUFJLENBQUMsRUFBRSJ9
@@ -9,7 +9,8 @@ Object.defineProperty(exports, "TypeEmissionProgram", {
9
9
  }
10
10
  });
11
11
  const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
12
- const _diagnostics = require("@decohere/nexus/diagnostics");
12
+ const _diagnostics = require("@decohere/devkit/diagnostics");
13
+ const _typescript = /*#__PURE__*/ _interop_require_default(require("typescript"));
13
14
  const _transformresponsemodel = require("../types/transform-response.model.js");
14
15
  function _interop_require_default(obj) {
15
16
  return obj && obj.__esModule ? obj : {
@@ -34,16 +35,25 @@ class TypeEmissionProgram {
34
35
  #compilerHost;
35
36
  #allFiles;
36
37
  #compilerOptions;
37
- constructor(group, hostFactory){
38
+ #requiredOptions;
39
+ constructor(group, hostFactory, requiredOptions){
38
40
  this.#group = group;
39
41
  const targets = this.buildTargetMaps(group);
40
42
  this.#targetsByDtsPath = targets.byDtsPath;
41
43
  this.#targetsByEmittedPath = targets.byEmittedPath;
42
44
  this.#host = hostFactory;
43
45
  this.#compilerOptions = group[0].tsconfig.compilerOptions;
46
+ this.#requiredOptions = requiredOptions;
44
47
  this.#allFiles = group.flatMap(({ files })=>files);
45
48
  this.#compilerHost = hostFactory.createHost(this.#compilerOptions);
46
- this.#program = hostFactory.createProgram(this.#allFiles, this.#compilerOptions, this.#compilerHost);
49
+ this.#program = this.createProgram();
50
+ }
51
+ check() {
52
+ this.refreshProgramIfNeeded();
53
+ return _typescript.default.getPreEmitDiagnostics(this.#program);
54
+ }
55
+ formatDiagnostics(diagnostics) {
56
+ return _typescript.default.formatDiagnosticsWithColorAndContext(diagnostics, this.#compilerHost);
47
57
  }
48
58
  toEmissionTarget(groupProject, file, outBaseDir) {
49
59
  const extName = _nodepath.default.extname(file.relativePath);
@@ -89,14 +99,20 @@ class TypeEmissionProgram {
89
99
  this.#host.invalidateSourceFile(file.fullPath);
90
100
  }
91
101
  async emit(fileFilter, onOutput) {
92
- if (this.#host.hasInvalidated()) {
93
- this.#program = this.#host.createProgram(this.#allFiles, this.#compilerOptions, this.#compilerHost, this.#program);
94
- }
102
+ this.refreshProgramIfNeeded();
95
103
  if (fileFilter == null) {
96
104
  return this.emitAll(onOutput);
97
105
  }
98
106
  return this.emitFiltered(fileFilter, onOutput);
99
107
  }
108
+ createProgram(oldProgram) {
109
+ return this.#host.createProgram(this.#allFiles, this.#compilerOptions, this.#compilerHost, oldProgram, this.#requiredOptions);
110
+ }
111
+ refreshProgramIfNeeded() {
112
+ if (this.#host.hasInvalidated()) {
113
+ this.#program = this.createProgram(this.#program);
114
+ }
115
+ }
100
116
  emitAll(onOutput) {
101
117
  const responses = [];
102
118
  this.#program.emit(undefined, (emittedPath, content)=>{
@@ -153,8 +169,7 @@ TypeEmissionProgram = _ts_decorate([
153
169
  _ts_metadata("design:type", Function),
154
170
  _ts_metadata("design:paramtypes", [
155
171
  Array,
156
- typeof TsProgramHost === "undefined" ? Object : TsProgramHost
172
+ typeof TsProgramHost === "undefined" ? Object : TsProgramHost,
173
+ typeof _typescript.default === "undefined" || typeof _typescript.default.CompilerOptions === "undefined" ? Object : _typescript.default.CompilerOptions
157
174
  ])
158
175
  ], TypeEmissionProgram);
159
-
160
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9zZXJ2aWNlcy90eXBlLWVtaXNzaW9uLXByb2dyYW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0LCBUc2NvbmZpZyB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgVHJhY2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2RpYWdub3N0aWNzXCI7XG5pbXBvcnQgdHlwZSB7IEZpbGVFeCB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB0eXBlIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5pbXBvcnQgdHlwZSB7IFRzUHJvZ3JhbUhvc3QgfSBmcm9tIFwiLi4vc2VydmljZXMvdHMtcHJvZ3JhbS1ob3N0LmpzXCI7XG5pbXBvcnQgeyBUcmFuc2Zvcm1SZXNwb25zZSB9IGZyb20gXCIuLi90eXBlcy90cmFuc2Zvcm0tcmVzcG9uc2UubW9kZWwuanNcIjtcblxuZXhwb3J0IHR5cGUgVHlwZVByb2dyYW1Qcm9qZWN0ID0ge1xuXHRwcm9qZWN0OiBQcm9qZWN0O1xuXHRmaWxlczogRmlsZUV4W107XG5cdHRzY29uZmlnOiBUc2NvbmZpZztcbn07XG5cbnR5cGUgRW1pc3Npb25UYXJnZXQgPSB7XG5cdGZpbGU6IEZpbGVFeDtcblx0dHNjb25maWc6IFRzY29uZmlnO1xuXHRwcm9qZWN0OiBQcm9qZWN0O1xuXHRvdXRwdXRQYXRoOiBzdHJpbmc7XG5cdG91dHB1dERpcjogc3RyaW5nO1xuXHRkdHNSZWxhdGl2ZTogc3RyaW5nO1xufTtcblxuQFRyYWNlXG5leHBvcnQgY2xhc3MgVHlwZUVtaXNzaW9uUHJvZ3JhbSB7XG5cdCNwcm9ncmFtOiB0cy5Qcm9ncmFtO1xuXHQjZ3JvdXA6IFR5cGVQcm9ncmFtUHJvamVjdFtdO1xuXHQjdGFyZ2V0c0J5RHRzUGF0aDogTWFwPHN0cmluZywgRW1pc3Npb25UYXJnZXQ+O1xuXHQjdGFyZ2V0c0J5RW1pdHRlZFBhdGg6IE1hcDxzdHJpbmcsIEVtaXNzaW9uVGFyZ2V0Pjtcblx0I2hvc3Q6IFRzUHJvZ3JhbUhvc3Q7XG5cdCNjb21waWxlckhvc3Q6IHRzLkNvbXBpbGVySG9zdDtcblx0I2FsbEZpbGVzOiBGaWxlRXhbXTtcblx0I2NvbXBpbGVyT3B0aW9uczogdHMuQ29tcGlsZXJPcHRpb25zO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihncm91cDogVHlwZVByb2dyYW1Qcm9qZWN0W10sIGhvc3RGYWN0b3J5OiBUc1Byb2dyYW1Ib3N0KSB7XG5cdFx0dGhpcy4jZ3JvdXAgPSBncm91cDtcblx0XHRjb25zdCB0YXJnZXRzID0gdGhpcy5idWlsZFRhcmdldE1hcHMoZ3JvdXApO1xuXHRcdHRoaXMuI3RhcmdldHNCeUR0c1BhdGggPSB0YXJnZXRzLmJ5RHRzUGF0aDtcblx0XHR0aGlzLiN0YXJnZXRzQnlFbWl0dGVkUGF0aCA9IHRhcmdldHMuYnlFbWl0dGVkUGF0aDtcblx0XHR0aGlzLiNob3N0ID0gaG9zdEZhY3Rvcnk7XG5cdFx0dGhpcy4jY29tcGlsZXJPcHRpb25zID0gZ3JvdXBbMF0udHNjb25maWcuY29tcGlsZXJPcHRpb25zO1xuXHRcdHRoaXMuI2FsbEZpbGVzID0gZ3JvdXAuZmxhdE1hcCgoeyBmaWxlcyB9KSA9PiBmaWxlcyk7XG5cdFx0dGhpcy4jY29tcGlsZXJIb3N0ID0gaG9zdEZhY3RvcnkuY3JlYXRlSG9zdCh0aGlzLiNjb21waWxlck9wdGlvbnMpO1xuXHRcdHRoaXMuI3Byb2dyYW0gPSBob3N0RmFjdG9yeS5jcmVhdGVQcm9ncmFtKFxuXHRcdFx0dGhpcy4jYWxsRmlsZXMsXG5cdFx0XHR0aGlzLiNjb21waWxlck9wdGlvbnMsXG5cdFx0XHR0aGlzLiNjb21waWxlckhvc3QsXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgdG9FbWlzc2lvblRhcmdldChcblx0XHRncm91cFByb2plY3Q6IFR5cGVQcm9ncmFtUHJvamVjdCxcblx0XHRmaWxlOiBGaWxlRXgsXG5cdFx0b3V0QmFzZURpcjogc3RyaW5nLFxuXHQpOiBFbWlzc2lvblRhcmdldCB7XG5cdFx0Y29uc3QgZXh0TmFtZSA9IHBhdGguZXh0bmFtZShmaWxlLnJlbGF0aXZlUGF0aCk7XG5cdFx0Y29uc3QgZHRzUmVsYXRpdmUgPSBmaWxlLnJlbGF0aXZlUGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoYCR7ZXh0TmFtZX0kYCksIFwiLmQudHNcIik7XG5cdFx0Y29uc3Qgb3V0cHV0UGF0aCA9IHBhdGguam9pbihvdXRCYXNlRGlyLCBkdHNSZWxhdGl2ZSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGZpbGUsXG5cdFx0XHR0c2NvbmZpZzogZ3JvdXBQcm9qZWN0LnRzY29uZmlnLFxuXHRcdFx0cHJvamVjdDogZ3JvdXBQcm9qZWN0LnByb2plY3QsXG5cdFx0XHRvdXRwdXRQYXRoLFxuXHRcdFx0b3V0cHV0RGlyOiBwYXRoLmRpcm5hbWUob3V0cHV0UGF0aCksXG5cdFx0XHRkdHNSZWxhdGl2ZSxcblx0XHR9O1xuXHR9XG5cblx0cHJpdmF0ZSBlbWl0dGVkS2V5KGZpbGU6IEZpbGVFeCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGZpbGUuZnVsbFBhdGgucmVwbGFjZSgvXFwuW14uXSskLywgXCIuZC50c1wiKTtcblx0fVxuXG5cdHByaXZhdGUgYnVpbGRUYXJnZXRNYXBzKGdyb3VwOiBUeXBlUHJvZ3JhbVByb2plY3RbXSk6IHtcblx0XHRieUR0c1BhdGg6IE1hcDxzdHJpbmcsIEVtaXNzaW9uVGFyZ2V0Pjtcblx0XHRieUVtaXR0ZWRQYXRoOiBNYXA8c3RyaW5nLCBFbWlzc2lvblRhcmdldD47XG5cdH0ge1xuXHRcdGNvbnN0IGJ5RHRzUGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBFbWlzc2lvblRhcmdldD4oKTtcblx0XHRjb25zdCBieUVtaXR0ZWRQYXRoID0gbmV3IE1hcDxzdHJpbmcsIEVtaXNzaW9uVGFyZ2V0PigpO1xuXG5cdFx0Zm9yIChjb25zdCBncm91cFByb2plY3Qgb2YgZ3JvdXApIHtcblx0XHRcdGNvbnN0IG91dEJhc2VEaXIgPSBncm91cFByb2plY3QucHJvamVjdC5nZXRPdXREaXIoXCJ0eXBlc1wiKTtcblx0XHRcdGZvciAoY29uc3QgZmlsZSBvZiBncm91cFByb2plY3QuZmlsZXMpIHtcblx0XHRcdFx0Y29uc3QgdGFyZ2V0ID0gdGhpcy50b0VtaXNzaW9uVGFyZ2V0KGdyb3VwUHJvamVjdCwgZmlsZSwgb3V0QmFzZURpcik7XG5cdFx0XHRcdGJ5RHRzUGF0aC5zZXQodGFyZ2V0LmR0c1JlbGF0aXZlLCB0YXJnZXQpO1xuXHRcdFx0XHRieUVtaXR0ZWRQYXRoLnNldCh0aGlzLmVtaXR0ZWRLZXkoZmlsZSksIHRhcmdldCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHsgYnlEdHNQYXRoLCBieUVtaXR0ZWRQYXRoIH07XG5cdH1cblxuXHRwdWJsaWMgYWRkRmlsZShmaWxlOiBGaWxlRXgsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcblx0XHRjb25zdCBncm91cFByb2plY3QgPSB0aGlzLiNncm91cC5maW5kKChnKSA9PiBnLnByb2plY3QgPT09IHByb2plY3QpO1xuXHRcdGlmIChncm91cFByb2plY3QgPT0gbnVsbCkgcmV0dXJuO1xuXG5cdFx0Z3JvdXBQcm9qZWN0LmZpbGVzLnB1c2goZmlsZSk7XG5cdFx0dGhpcy4jYWxsRmlsZXMucHVzaChmaWxlKTtcblxuXHRcdGNvbnN0IG91dEJhc2VEaXIgPSBncm91cFByb2plY3QucHJvamVjdC5nZXRPdXREaXIoXCJ0eXBlc1wiKTtcblx0XHRjb25zdCB0YXJnZXQgPSB0aGlzLnRvRW1pc3Npb25UYXJnZXQoZ3JvdXBQcm9qZWN0LCBmaWxlLCBvdXRCYXNlRGlyKTtcblx0XHR0aGlzLiN0YXJnZXRzQnlEdHNQYXRoLnNldCh0YXJnZXQuZHRzUmVsYXRpdmUsIHRhcmdldCk7XG5cdFx0dGhpcy4jdGFyZ2V0c0J5RW1pdHRlZFBhdGguc2V0KHRoaXMuZW1pdHRlZEtleShmaWxlKSwgdGFyZ2V0KTtcblx0XHR0aGlzLiNob3N0LmludmFsaWRhdGVTb3VyY2VGaWxlKGZpbGUuZnVsbFBhdGgpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGVtaXQoXG5cdFx0ZmlsZUZpbHRlcj86IChwcm9qZWN0OiBQcm9qZWN0KSA9PiBQcm9taXNlPEZpbGVFeFtdPixcblx0XHRvbk91dHB1dD86IChyZXNwb25zZTogVHJhbnNmb3JtUmVzcG9uc2UpID0+IHZvaWQsXG5cdCk6IFByb21pc2U8VHJhbnNmb3JtUmVzcG9uc2VbXT4ge1xuXHRcdGlmICh0aGlzLiNob3N0Lmhhc0ludmFsaWRhdGVkKCkpIHtcblx0XHRcdHRoaXMuI3Byb2dyYW0gPSB0aGlzLiNob3N0LmNyZWF0ZVByb2dyYW0oXG5cdFx0XHRcdHRoaXMuI2FsbEZpbGVzLFxuXHRcdFx0XHR0aGlzLiNjb21waWxlck9wdGlvbnMsXG5cdFx0XHRcdHRoaXMuI2NvbXBpbGVySG9zdCxcblx0XHRcdFx0dGhpcy4jcHJvZ3JhbSxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGlmIChmaWxlRmlsdGVyID09IG51bGwpIHtcblx0XHRcdHJldHVybiB0aGlzLmVtaXRBbGwob25PdXRwdXQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lbWl0RmlsdGVyZWQoZmlsZUZpbHRlciwgb25PdXRwdXQpO1xuXHR9XG5cblx0cHJpdmF0ZSBlbWl0QWxsKG9uT3V0cHV0PzogKHJlc3BvbnNlOiBUcmFuc2Zvcm1SZXNwb25zZSkgPT4gdm9pZCk6IFRyYW5zZm9ybVJlc3BvbnNlW10ge1xuXHRcdGNvbnN0IHJlc3BvbnNlczogVHJhbnNmb3JtUmVzcG9uc2VbXSA9IFtdO1xuXHRcdHRoaXMuI3Byb2dyYW0uZW1pdCh1bmRlZmluZWQsIChlbWl0dGVkUGF0aCwgY29udGVudCkgPT4ge1xuXHRcdFx0aWYgKCFlbWl0dGVkUGF0aC5lbmRzV2l0aChcIi5kLnRzXCIpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gdGhpcy50b1RyYW5zZm9ybVJlc3BvbnNlKGVtaXR0ZWRQYXRoLCBjb250ZW50KTtcblx0XHRcdHJlc3BvbnNlcy5wdXNoKHJlc3BvbnNlKTtcblx0XHRcdG9uT3V0cHV0Py4ocmVzcG9uc2UpO1xuXHRcdH0pO1xuXHRcdHJldHVybiByZXNwb25zZXM7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGVtaXRGaWx0ZXJlZChcblx0XHRmaWxlRmlsdGVyOiAocHJvamVjdDogUHJvamVjdCkgPT4gUHJvbWlzZTxGaWxlRXhbXT4sXG5cdFx0b25PdXRwdXQ/OiAocmVzcG9uc2U6IFRyYW5zZm9ybVJlc3BvbnNlKSA9PiB2b2lkLFxuXHQpOiBQcm9taXNlPFRyYW5zZm9ybVJlc3BvbnNlW10+IHtcblx0XHRjb25zdCBmaWxlcyA9IGF3YWl0IFByb21pc2UuYWxsKHRoaXMuI2dyb3VwLm1hcCgoeyBwcm9qZWN0IH0pID0+IGZpbGVGaWx0ZXIocHJvamVjdCkpKTtcblx0XHRjb25zdCBzb3VyY2VGaWxlcyA9IGZpbGVzXG5cdFx0XHQuZmxhdCgpXG5cdFx0XHQubWFwKChmaWxlKSA9PiB0aGlzLiNwcm9ncmFtLmdldFNvdXJjZUZpbGUoZmlsZS5mdWxsUGF0aCkpXG5cdFx0XHQuZmlsdGVyKChzZik6IHNmIGlzIHRzLlNvdXJjZUZpbGUgPT4gc2YgIT0gbnVsbCk7XG5cblx0XHRjb25zdCByZXNwb25zZXM6IFRyYW5zZm9ybVJlc3BvbnNlW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBzb3VyY2VGaWxlcykge1xuXHRcdFx0dGhpcy4jcHJvZ3JhbS5lbWl0KHNvdXJjZUZpbGUsIChlbWl0dGVkUGF0aCwgY29udGVudCkgPT4ge1xuXHRcdFx0XHRpZiAoIWVtaXR0ZWRQYXRoLmVuZHNXaXRoKFwiLmQudHNcIikpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgcmVzcG9uc2UgPSB0aGlzLnRvVHJhbnNmb3JtUmVzcG9uc2UoZW1pdHRlZFBhdGgsIGNvbnRlbnQpO1xuXHRcdFx0XHRyZXNwb25zZXMucHVzaChyZXNwb25zZSk7XG5cdFx0XHRcdG9uT3V0cHV0Py4ocmVzcG9uc2UpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3BvbnNlcztcblx0fVxuXG5cdHByaXZhdGUgdG9UcmFuc2Zvcm1SZXNwb25zZShlbWl0dGVkUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBUcmFuc2Zvcm1SZXNwb25zZSB7XG5cdFx0Y29uc3QgdGFyZ2V0ID0gdGhpcy4jdGFyZ2V0c0J5RW1pdHRlZFBhdGguZ2V0KGVtaXR0ZWRQYXRoKTtcblx0XHRpZiAodGFyZ2V0ID09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgTm8gbWF0Y2hpbmcgZW1pc3Npb24gdGFyZ2V0IGZvcjogJHtlbWl0dGVkUGF0aH1gKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMudG9UcmFuc2Zvcm1SZXNwb25zZUZyb21UYXJnZXQodGFyZ2V0LCBjb250ZW50KTtcblx0fVxuXG5cdHByaXZhdGUgdG9UcmFuc2Zvcm1SZXNwb25zZUZyb21UYXJnZXQoXG5cdFx0dGFyZ2V0OiBFbWlzc2lvblRhcmdldCxcblx0XHRjb250ZW50OiBzdHJpbmcsXG5cdCk6IFRyYW5zZm9ybVJlc3BvbnNlIHtcblx0XHRjb25zdCB7IGZpbGUsIHRzY29uZmlnLCBwcm9qZWN0LCBvdXRwdXRQYXRoLCBvdXRwdXREaXIsIGR0c1JlbGF0aXZlIH0gPSB0YXJnZXQ7XG5cdFx0cmV0dXJuIFRyYW5zZm9ybVJlc3BvbnNlLmZyb20oe1xuXHRcdFx0ZmlsZSxcblx0XHRcdGNvbmZpZzogdHNjb25maWcsXG5cdFx0XHRvdXRjb21lOiBcInN1Y2Nlc3NcIixcblx0XHRcdGZpbGVOYW1lOiBkdHNSZWxhdGl2ZSxcblx0XHRcdGNvZGU6IGNvbnRlbnQsXG5cdFx0XHR0YXJnZXQ6IFwidHlwZXNcIixcblx0XHRcdG1lc3NhZ2VzOiBbXSxcblx0XHRcdHByb2plY3QsXG5cdFx0XHRvdXRwdXREaXIsXG5cdFx0XHRvdXRwdXRQYXRoLFxuXHRcdH0pO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiVHlwZUVtaXNzaW9uUHJvZ3JhbSIsImdyb3VwIiwiaG9zdEZhY3RvcnkiLCJ0YXJnZXRzIiwiYnVpbGRUYXJnZXRNYXBzIiwiYnlEdHNQYXRoIiwiYnlFbWl0dGVkUGF0aCIsInRzY29uZmlnIiwiY29tcGlsZXJPcHRpb25zIiwiZmxhdE1hcCIsImZpbGVzIiwiY3JlYXRlSG9zdCIsImNyZWF0ZVByb2dyYW0iLCJ0b0VtaXNzaW9uVGFyZ2V0IiwiZ3JvdXBQcm9qZWN0IiwiZmlsZSIsIm91dEJhc2VEaXIiLCJleHROYW1lIiwicGF0aCIsImV4dG5hbWUiLCJyZWxhdGl2ZVBhdGgiLCJkdHNSZWxhdGl2ZSIsInJlcGxhY2UiLCJSZWdFeHAiLCJvdXRwdXRQYXRoIiwiam9pbiIsInByb2plY3QiLCJvdXRwdXREaXIiLCJkaXJuYW1lIiwiZW1pdHRlZEtleSIsImZ1bGxQYXRoIiwiTWFwIiwiZ2V0T3V0RGlyIiwidGFyZ2V0Iiwic2V0IiwiYWRkRmlsZSIsImZpbmQiLCJnIiwicHVzaCIsImludmFsaWRhdGVTb3VyY2VGaWxlIiwiZW1pdCIsImZpbGVGaWx0ZXIiLCJvbk91dHB1dCIsImhhc0ludmFsaWRhdGVkIiwiZW1pdEFsbCIsImVtaXRGaWx0ZXJlZCIsInJlc3BvbnNlcyIsInVuZGVmaW5lZCIsImVtaXR0ZWRQYXRoIiwiY29udGVudCIsImVuZHNXaXRoIiwicmVzcG9uc2UiLCJ0b1RyYW5zZm9ybVJlc3BvbnNlIiwiUHJvbWlzZSIsImFsbCIsIm1hcCIsInNvdXJjZUZpbGVzIiwiZmxhdCIsImdldFNvdXJjZUZpbGUiLCJmaWx0ZXIiLCJzZiIsInNvdXJjZUZpbGUiLCJnZXQiLCJFcnJvciIsInRvVHJhbnNmb3JtUmVzcG9uc2VGcm9tVGFyZ2V0IiwiVHJhbnNmb3JtUmVzcG9uc2UiLCJmcm9tIiwiY29uZmlnIiwib3V0Y29tZSIsImZpbGVOYW1lIiwiY29kZSIsIm1lc3NhZ2VzIl0sIm1h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