@decohere/forge 0.0.1-dev.19 → 0.0.1-dev.20261105.103

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 (179) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +152 -0
  3. package/es6/src/actions/build.action.js +3 -7
  4. package/es6/src/actions/clean.action.js +3 -6
  5. package/es6/src/actions/commit.action.js +3 -6
  6. package/es6/src/actions/copy.action.js +61 -12
  7. package/es6/src/actions/dependency-report.action.js +7 -7
  8. package/es6/src/actions/dependency-sync.action.js +8 -6
  9. package/es6/src/actions/docker.action.js +194 -0
  10. package/es6/src/actions/index.js +4 -2
  11. package/es6/src/actions/link.action.js +2 -5
  12. package/es6/src/actions/package.action.js +219 -0
  13. package/es6/src/actions/paths.action.js +97 -0
  14. package/es6/src/actions/publish.action.js +3 -6
  15. package/es6/src/actions/sync-lock-file.action.js +2 -4
  16. package/es6/src/actions/tag.action.js +5 -9
  17. package/es6/src/actions/typecheck.action.js +52 -0
  18. package/es6/src/actions/unlink.action.js +1 -3
  19. package/es6/src/actions/version.action.js +69 -17
  20. package/es6/src/actions/watch.action.js +2 -5
  21. package/es6/src/commands/build.command.js +4 -3
  22. package/es6/src/commands/dependency.command.js +1 -3
  23. package/es6/src/commands/docker.command.js +16 -0
  24. package/es6/src/commands/forge.command.js +1 -3
  25. package/es6/src/commands/index.js +4 -2
  26. package/es6/src/commands/link.command.js +4 -3
  27. package/es6/src/commands/package.command.js +26 -0
  28. package/es6/src/commands/paths.command.js +14 -0
  29. package/es6/src/commands/publish.command.js +1 -3
  30. package/es6/src/commands/tag.command.js +1 -3
  31. package/es6/src/commands/typecheck.command.js +14 -0
  32. package/es6/src/commands/version.command.js +3 -3
  33. package/es6/src/const.js +0 -2
  34. package/es6/src/create-workspace.js +26 -0
  35. package/es6/src/errors.js +1 -3
  36. package/es6/src/extensions/project.extensions.js +5 -7
  37. package/es6/src/factories/swc-config.factory.js +29 -9
  38. package/es6/src/forge.module.js +17 -20
  39. package/es6/src/index.js +2 -2
  40. package/es6/src/packaging/dependency-pinner.service.js +103 -0
  41. package/es6/src/packaging/deployable.js +21 -0
  42. package/es6/src/packaging/import-graph.service.js +122 -0
  43. package/es6/src/packaging/release-exports.js +80 -0
  44. package/es6/src/packaging/ui-assets.js +49 -0
  45. package/es6/src/semver/index.js +1 -0
  46. package/es6/src/semver/semver.js +75 -0
  47. package/es6/src/services/dependency-resolver.service.js +70 -26
  48. package/es6/src/services/file-writer.service.js +2 -11
  49. package/es6/src/services/incremental-watch.js +18 -0
  50. package/es6/src/services/output-cache.js +29 -0
  51. package/es6/src/services/swc-transpiler.js +85 -99
  52. package/es6/src/services/transpile-cache.js +29 -0
  53. package/es6/src/services/ts-compiler-options.js +39 -0
  54. package/es6/src/services/ts-program-host.js +4 -6
  55. package/es6/src/services/type-emission-program.js +25 -10
  56. package/es6/src/services/type-emitter.js +57 -20
  57. package/es6/src/transpile/index.js +6 -0
  58. package/es6/src/types/build-target.type.js +0 -2
  59. package/es6/src/types/configuration.type.js +0 -2
  60. package/es6/src/types/dependency.types.js +0 -2
  61. package/es6/src/types/swc-config.type.js +0 -2
  62. package/es6/src/types/transform-response.model.js +0 -7
  63. package/es6/src/types/transformer.type.js +0 -2
  64. package/es6/src/types/workspace-config.type.js +0 -2
  65. package/es6/src/vitest/forge-build.plugin.js +27 -43
  66. package/es6/src/vitest/index.js +0 -2
  67. package/es6/src/workspace.config.js +26 -6
  68. package/package.json +21 -10
  69. package/types/src/actions/build.action.d.ts +4 -4
  70. package/types/src/actions/clean.action.d.ts +3 -3
  71. package/types/src/actions/commit.action.d.ts +3 -3
  72. package/types/src/actions/copy.action.d.ts +18 -3
  73. package/types/src/actions/dependency-report.action.d.ts +3 -3
  74. package/types/src/actions/dependency-sync.action.d.ts +3 -3
  75. package/types/src/actions/docker.action.d.ts +38 -0
  76. package/types/src/actions/index.d.ts +4 -0
  77. package/types/src/actions/link.action.d.ts +3 -3
  78. package/types/src/actions/package.action.d.ts +38 -0
  79. package/types/src/actions/paths.action.d.ts +28 -0
  80. package/types/src/actions/publish.action.d.ts +4 -4
  81. package/types/src/actions/sync-lock-file.action.d.ts +2 -2
  82. package/types/src/actions/tag.action.d.ts +3 -3
  83. package/types/src/actions/typecheck.action.d.ts +14 -0
  84. package/types/src/actions/unlink.action.d.ts +2 -2
  85. package/types/src/actions/version.action.d.ts +14 -4
  86. package/types/src/actions/watch.action.d.ts +3 -3
  87. package/types/src/commands/build.command.d.ts +3 -2
  88. package/types/src/commands/dependency.command.d.ts +2 -2
  89. package/types/src/commands/docker.command.d.ts +6 -0
  90. package/types/src/commands/forge.command.d.ts +2 -2
  91. package/types/src/commands/index.d.ts +4 -0
  92. package/types/src/commands/link.command.d.ts +3 -2
  93. package/types/src/commands/package.command.d.ts +11 -0
  94. package/types/src/commands/paths.command.d.ts +6 -0
  95. package/types/src/commands/publish.command.d.ts +1 -1
  96. package/types/src/commands/tag.command.d.ts +1 -1
  97. package/types/src/commands/typecheck.command.d.ts +6 -0
  98. package/types/src/commands/version.command.d.ts +1 -1
  99. package/types/src/create-workspace.d.ts +7 -0
  100. package/types/src/errors.d.ts +1 -1
  101. package/types/src/extensions/project.extensions.d.ts +2 -2
  102. package/types/src/factories/swc-config.factory.d.ts +3 -2
  103. package/types/src/forge.module.d.ts +12 -4
  104. package/types/src/index.d.ts +2 -0
  105. package/types/src/packaging/dependency-pinner.service.d.ts +20 -0
  106. package/types/src/packaging/deployable.d.ts +17 -0
  107. package/types/src/packaging/import-graph.service.d.ts +33 -0
  108. package/types/src/packaging/release-exports.d.ts +18 -0
  109. package/types/src/packaging/ui-assets.d.ts +21 -0
  110. package/types/src/semver/index.d.ts +1 -0
  111. package/types/src/semver/semver.d.ts +20 -0
  112. package/types/src/services/dependency-resolver.service.d.ts +8 -1
  113. package/types/src/services/file-writer.service.d.ts +1 -2
  114. package/types/src/services/incremental-watch.d.ts +13 -0
  115. package/types/src/services/output-cache.d.ts +10 -0
  116. package/types/src/services/swc-transpiler.d.ts +28 -15
  117. package/types/src/services/transpile-cache.d.ts +17 -0
  118. package/types/src/services/ts-compiler-options.d.ts +8 -0
  119. package/types/src/services/ts-program-host.d.ts +2 -2
  120. package/types/src/services/type-emission-program.d.ts +10 -3
  121. package/types/src/services/type-emitter.d.ts +21 -8
  122. package/types/src/transpile/index.d.ts +6 -0
  123. package/types/src/types/configuration.type.d.ts +6 -1
  124. package/types/src/types/dependency.types.d.ts +8 -9
  125. package/types/src/types/swc-config.type.d.ts +7 -1
  126. package/types/src/types/transform-response.model.d.ts +2 -7
  127. package/types/src/types/transformer.type.d.ts +3 -12
  128. package/types/src/types/workspace-config.type.d.ts +3 -3
  129. package/types/src/vitest/forge-build.plugin.d.ts +0 -2
  130. package/commonjs/src/actions/build.action.js +0 -116
  131. package/commonjs/src/actions/clean.action.js +0 -55
  132. package/commonjs/src/actions/commit.action.js +0 -87
  133. package/commonjs/src/actions/copy.action.js +0 -83
  134. package/commonjs/src/actions/dependency-report.action.js +0 -142
  135. package/commonjs/src/actions/dependency-sync.action.js +0 -100
  136. package/commonjs/src/actions/index.js +0 -32
  137. package/commonjs/src/actions/link.action.js +0 -156
  138. package/commonjs/src/actions/publish.action.js +0 -156
  139. package/commonjs/src/actions/sync-lock-file.action.js +0 -43
  140. package/commonjs/src/actions/tag.action.js +0 -76
  141. package/commonjs/src/actions/unlink.action.js +0 -76
  142. package/commonjs/src/actions/version.action.js +0 -209
  143. package/commonjs/src/actions/watch.action.js +0 -51
  144. package/commonjs/src/commands/build.command.js +0 -49
  145. package/commonjs/src/commands/dependency.command.js +0 -88
  146. package/commonjs/src/commands/forge.command.js +0 -24
  147. package/commonjs/src/commands/index.js +0 -26
  148. package/commonjs/src/commands/link.command.js +0 -89
  149. package/commonjs/src/commands/publish.command.js +0 -32
  150. package/commonjs/src/commands/tag.command.js +0 -28
  151. package/commonjs/src/commands/version.command.js +0 -36
  152. package/commonjs/src/const.js +0 -81
  153. package/commonjs/src/errors.js +0 -39
  154. package/commonjs/src/extensions/project.extensions.js +0 -94
  155. package/commonjs/src/factories/swc-config.factory.js +0 -98
  156. package/commonjs/src/forge.module.js +0 -113
  157. package/commonjs/src/index.js +0 -46
  158. package/commonjs/src/mixins/caches-outputs.mixin.js +0 -44
  159. package/commonjs/src/mixins/incremental-transform.mixin.js +0 -36
  160. package/commonjs/src/services/dependency-resolver.service.js +0 -172
  161. package/commonjs/src/services/file-writer.service.js +0 -232
  162. package/commonjs/src/services/swc-transpiler.js +0 -235
  163. package/commonjs/src/services/ts-program-host.js +0 -135
  164. package/commonjs/src/services/type-emission-program.js +0 -160
  165. package/commonjs/src/services/type-emitter.js +0 -141
  166. package/commonjs/src/types/build-target.type.js +0 -17
  167. package/commonjs/src/types/configuration.type.js +0 -6
  168. package/commonjs/src/types/dependency.types.js +0 -6
  169. package/commonjs/src/types/swc-config.type.js +0 -17
  170. package/commonjs/src/types/transform-response.model.js +0 -65
  171. package/commonjs/src/types/transformer.type.js +0 -13
  172. package/commonjs/src/types/workspace-config.type.js +0 -6
  173. package/commonjs/src/vitest/forge-build.plugin.js +0 -129
  174. package/commonjs/src/vitest/index.js +0 -13
  175. package/commonjs/src/workspace.config.js +0 -75
  176. package/es6/src/mixins/caches-outputs.mixin.js +0 -34
  177. package/es6/src/mixins/incremental-transform.mixin.js +0 -26
  178. package/types/src/mixins/caches-outputs.mixin.d.ts +0 -7
  179. package/types/src/mixins/incremental-transform.mixin.d.ts +0 -13
@@ -7,31 +7,46 @@ function _ts_decorate(decorators, target, key, desc) {
7
7
  function _ts_metadata(k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  }
10
- import fs from "node:fs";
11
10
  import path from "node:path";
12
- import { cache, invalidateCache } from "@decohere/nexus/caching";
13
- import { Trace } from "@decohere/nexus/diagnostics";
14
- import { mixwith } from "@decohere/nexus/extensibility";
15
- import { io } from "@decohere/nexus/io";
11
+ import { sourceExtensions } from "@decohere/workspace";
12
+ import { cache, invalidateCache } from "@decohere/core/caching";
13
+ import { Trace } from "@decohere/devkit/diagnostics";
14
+ import { WatchEvents } from "@decohere/devkit/io";
16
15
  import { transform, transformSync } from "@swc/core";
17
16
  import { BuildTargets } from "../types/build-target.type.js";
18
17
  import "../extensions/project.extensions.js";
19
18
  import { SwcConfigFactory } from "../factories/swc-config.factory.js";
20
- import { CachesOutputs } from "../mixins/caches-outputs.mixin.js";
21
- import { IncrementalTransform } from "../mixins/incremental-transform.mixin.js";
22
19
  import { TransformResponse } from "../types/transform-response.model.js";
23
- export class SwcTranspiler extends mixwith(CachesOutputs, IncrementalTransform) {
20
+ import { IncrementalWatch } from "./incremental-watch.js";
21
+ import { OutputCache } from "./output-cache.js";
22
+ export class SwcTranspiler {
24
23
  buildTargets = [
25
24
  BuildTargets.es6,
26
25
  BuildTargets.commonjs
27
26
  ];
28
27
  #swcConfigFactory = new SwcConfigFactory();
28
+ #workspace;
29
+ #outputs = new OutputCache();
30
+ #incremental = new IncrementalWatch();
31
+ get incrementalTransform$() {
32
+ return this.#incremental.results$;
33
+ }
34
+ watch(workspace) {
35
+ this.#workspace = workspace;
36
+ this.#incremental.watch(workspace, (evt)=>this.onIncrementalFileEvent(evt));
37
+ }
38
+ withAliasContext(options = {}) {
39
+ return {
40
+ ...options,
41
+ workspace: options.workspace ?? this.#workspace
42
+ };
43
+ }
29
44
  async transformProject(projectArrayLike, fileFilter, onOutput) {
30
45
  const projects = Array.isArray(projectArrayLike) ? projectArrayLike : [
31
46
  projectArrayLike
32
47
  ];
33
48
  const responses = await Promise.all(projects.map(async (project)=>{
34
- const { targets, aliasPaths } = project.getForgeConfiguration();
49
+ const { targets, aliasPaths, sourceMaps } = project.getForgeConfiguration();
35
50
  const transpileTargets = targets.filter((bt)=>bt !== BuildTargets.types);
36
51
  if (transpileTargets.length === 0) {
37
52
  return [];
@@ -43,64 +58,34 @@ export class SwcTranspiler extends mixwith(CachesOutputs, IncrementalTransform)
43
58
  return this.transformTarget(sourceFiles, target, {
44
59
  tsConfig,
45
60
  userConfig,
46
- aliasPaths
61
+ aliasPaths,
62
+ sourceMaps,
63
+ workspace: this.#workspace,
64
+ projects
47
65
  }, project, onOutput);
48
66
  }));
49
67
  return responses.flat();
50
68
  }));
51
69
  const flat = responses.flat();
52
- this.cacheOutputs(flat);
70
+ this.#outputs.record(flat);
53
71
  return flat;
54
72
  }
55
- async transformFile(fileArrayLike, buildTarget, options = {}) {
56
- const files = Array.isArray(fileArrayLike) ? fileArrayLike : [
57
- fileArrayLike
58
- ];
59
- const responses = this.transformTarget(files, buildTarget, options);
60
- return responses;
61
- }
62
73
  /**
63
- * Synchronous, single-file variant of `transformFile`.
64
- * Reads the file with `fs.readFileSync` and transpiles via `swc.transformSync`.
65
- * Intended for callers that cannot await (e.g. Node.js `registerHooks` load hook).
66
- */ transformFileSync(file, buildTarget, options = {}) {
67
- const baseConfig = this.#swcConfigFactory.createBaseConfig(buildTarget, options);
74
+ * The SWC options for one project and target, without a filename. Building them reads the
75
+ * workspace's aliases and merges configs, so a caller that transpiles many files builds them
76
+ * once and passes them to {@link transformCode}.
77
+ */ createBaseConfig(buildTarget, options = {}) {
78
+ return this.#swcConfigFactory.createBaseConfig(buildTarget, this.withAliasContext(options));
79
+ }
80
+ /** Sync variant of {@link transformCode}, for the load hook, which cannot await. */ transformCodeSync(content, file, buildTarget, baseConfig) {
68
81
  const swcOptions = this.#swcConfigFactory.createFileConfig(file, baseConfig);
69
- let content;
70
- try {
71
- content = fs.readFileSync(file.fullPath, "utf8");
72
- } catch (error) {
73
- return TransformResponse.Error({
74
- file,
75
- messages: [
76
- String(error)
77
- ],
78
- config: swcOptions
79
- });
80
- }
81
- if (content === "") {
82
- return TransformResponse.Skipped({
83
- file,
84
- messages: "File is empty",
85
- config: swcOptions
86
- });
87
- }
82
+ if (content === "") return SwcTranspiler.skippedEmpty(file, swcOptions);
88
83
  try {
89
84
  const transformed = transformSync(content, swcOptions);
90
85
  if (transformed == null) {
91
86
  throw new Error("swc.transformSync returned no result");
92
87
  }
93
- const filePath = file.relativePath;
94
- const extName = path.extname(filePath);
95
- const fileName = filePath.replace(new RegExp(`${extName}$`), ".js");
96
- return TransformResponse.Success({
97
- file,
98
- code: transformed.code,
99
- sourceContent: content,
100
- target: buildTarget,
101
- fileName,
102
- config: swcOptions
103
- });
88
+ return SwcTranspiler.succeeded(file, buildTarget, swcOptions, content, transformed.code);
104
89
  } catch (error) {
105
90
  return TransformResponse.Error({
106
91
  file,
@@ -111,51 +96,23 @@ export class SwcTranspiler extends mixwith(CachesOutputs, IncrementalTransform)
111
96
  });
112
97
  }
113
98
  }
114
- async transformTarget(files, buildTarget, options, project, onOutput) {
115
- const baseConfig = this.#swcConfigFactory.createBaseConfig(buildTarget, options ?? {});
116
- return await Promise.all(files.map((file)=>{
117
- const swcOptions = this.#swcConfigFactory.createFileConfig(file, baseConfig);
118
- return this.runTransform(file, buildTarget, swcOptions, project, onOutput);
119
- }));
120
- }
121
- async runTransform(file, target, swcOptions, project, onOutput) {
122
- const content = await this.getFileContent(file);
123
- if (content === "") {
124
- const skipped = TransformResponse.Skipped({
125
- file,
126
- messages: "File is empty",
127
- config: swcOptions,
128
- project
129
- });
130
- onOutput?.(skipped);
131
- return skipped;
132
- }
99
+ /**
100
+ * Compiles `content` as the source of `file`, without reading the file: for callers that
101
+ * already hold the code, such as the Vitest plugin, which must compile what Vite passes it
102
+ * rather than an earlier read of the disk. Async SWC, on the thread pool, so many
103
+ * calls in flight compile in parallel. With a `project`, the response carries where
104
+ * the build writes the output.
105
+ */ async transformCode(content, file, buildTarget, baseConfig, project) {
106
+ const swcOptions = this.#swcConfigFactory.createFileConfig(file, baseConfig);
107
+ if (content === "") return SwcTranspiler.skippedEmpty(file, swcOptions, project);
133
108
  try {
134
- const filePath = file.relativePath;
135
- const extName = path.extname(filePath);
136
- const fileName = filePath.replace(new RegExp(`${extName}$`), ".js");
137
- const outBaseDir = project?.getOutDir(target);
138
- const outputPath = outBaseDir ? path.join(outBaseDir, fileName) : undefined;
139
- const outputDir = outputPath ? path.dirname(outputPath) : undefined;
140
109
  const transformed = await transform(content, swcOptions);
141
110
  if (transformed == null) {
142
111
  throw new Error("swc.transform returned no result");
143
112
  }
144
- const success = TransformResponse.Success({
145
- file,
146
- code: transformed.code,
147
- sourceContent: content,
148
- target,
149
- fileName,
150
- outputDir,
151
- outputPath,
152
- config: swcOptions,
153
- project
154
- });
155
- onOutput?.(success);
156
- return success;
113
+ return SwcTranspiler.succeeded(file, buildTarget, swcOptions, content, transformed.code, project);
157
114
  } catch (error) {
158
- const failure = TransformResponse.Error({
115
+ return TransformResponse.Error({
159
116
  file,
160
117
  messages: [
161
118
  String(error)
@@ -163,21 +120,52 @@ export class SwcTranspiler extends mixwith(CachesOutputs, IncrementalTransform)
163
120
  config: swcOptions,
164
121
  project
165
122
  });
166
- onOutput?.(failure);
167
- return failure;
168
123
  }
169
124
  }
125
+ static skippedEmpty(file, swcOptions, project) {
126
+ return TransformResponse.Skipped({
127
+ file,
128
+ messages: "File is empty",
129
+ config: swcOptions,
130
+ project
131
+ });
132
+ }
133
+ static succeeded(file, buildTarget, swcOptions, content, code, project) {
134
+ const fileName = sourceExtensions.outputPath(file.relativePath);
135
+ const outBaseDir = project?.getOutDir(buildTarget);
136
+ const outputPath = outBaseDir ? path.join(outBaseDir, fileName) : undefined;
137
+ return TransformResponse.Success({
138
+ file,
139
+ code,
140
+ sourceContent: content,
141
+ target: buildTarget,
142
+ fileName,
143
+ outputDir: outputPath ? path.dirname(outputPath) : undefined,
144
+ outputPath,
145
+ config: swcOptions,
146
+ project
147
+ });
148
+ }
149
+ async transformTarget(files, buildTarget, options, project, onOutput) {
150
+ const baseConfig = this.createBaseConfig(buildTarget, options);
151
+ return await Promise.all(files.map(async (file)=>{
152
+ const content = await this.getFileContent(file);
153
+ const response = await this.transformCode(content, file, buildTarget, baseConfig, project);
154
+ onOutput?.(response);
155
+ return response;
156
+ }));
157
+ }
170
158
  async onIncrementalFileEvent(evt) {
171
159
  const { file, project } = evt;
172
- if (evt.eventName === io.WatchEvents.unlink) {
173
- this.deleteCachedOutputs(file.fullPath);
160
+ if (evt.eventName === WatchEvents.unlink) {
161
+ this.#outputs.delete(file.fullPath);
174
162
  return [];
175
163
  }
176
164
  if (!project.isSourceFile(file)) {
177
165
  return [];
178
166
  }
179
167
  const freshContent = await file.getContent();
180
- const cached = this.outputCache.get(file.fullPath);
168
+ const cached = this.#outputs.get(file.fullPath);
181
169
  if (cached != null && cached[0]?.sourceContent === freshContent) {
182
170
  return [];
183
171
  }
@@ -216,5 +204,3 @@ _ts_decorate([
216
204
  SwcTranspiler = _ts_decorate([
217
205
  Trace
218
206
  ], SwcTranspiler);
219
-
220
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9zZXJ2aWNlcy9zd2MtdHJhbnNwaWxlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgY2FjaGUsIGludmFsaWRhdGVDYWNoZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgVHJhY2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2RpYWdub3N0aWNzXCI7XG5pbXBvcnQgeyBtaXh3aXRoIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9leHRlbnNpYmlsaXR5XCI7XG5pbXBvcnQgdHlwZSB7IEZpbGVFeCB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGlvIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9pb1wiO1xuaW1wb3J0IHsgdHlwZSBPcHRpb25zLCB0cmFuc2Zvcm0sIHRyYW5zZm9ybVN5bmMgfSBmcm9tIFwiQHN3Yy9jb3JlXCI7XG5pbXBvcnQge1xuXHR0eXBlIEJ1aWxkVGFyZ2V0LFxuXHRCdWlsZFRhcmdldHMsXG5cdHR5cGUgVHJhbnNwaWxlVGFyZ2V0LFxufSBmcm9tIFwiLi4vdHlwZXMvYnVpbGQtdGFyZ2V0LnR5cGUuanNcIjtcbmltcG9ydCBcIi4uL2V4dGVuc2lvbnMvcHJvamVjdC5leHRlbnNpb25zLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3RGaWxlRXZlbnQsIFRzY29uZmlnIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBTd2NDb25maWdGYWN0b3J5IH0gZnJvbSBcIi4uL2ZhY3Rvcmllcy9zd2MtY29uZmlnLmZhY3RvcnkuanNcIjtcbmltcG9ydCB7IENhY2hlc091dHB1dHMgfSBmcm9tIFwiLi4vbWl4aW5zL2NhY2hlcy1vdXRwdXRzLm1peGluLmpzXCI7XG5pbXBvcnQgeyBJbmNyZW1lbnRhbFRyYW5zZm9ybSB9IGZyb20gXCIuLi9taXhpbnMvaW5jcmVtZW50YWwtdHJhbnNmb3JtLm1peGluLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN3Y0NvbmZpZyB9IGZyb20gXCIuLi90eXBlcy9zd2MtY29uZmlnLnR5cGUuanNcIjtcbmltcG9ydCB7IFRyYW5zZm9ybVJlc3BvbnNlIH0gZnJvbSBcIi4uL3R5cGVzL3RyYW5zZm9ybS1yZXNwb25zZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUcmFuc2Zvcm1lciB9IGZyb20gXCIuLi90eXBlcy90cmFuc2Zvcm1lci50eXBlLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFRyYW5zcGlsZU9wdGlvbnMgPSB7XG5cdGFsaWFzUGF0aHM/OiBib29sZWFuO1xuXHR0c0NvbmZpZz86IFRzY29uZmlnO1xuXHR1c2VyQ29uZmlnPzogU3djQ29uZmlnO1xufTtcblxuQFRyYWNlXG5leHBvcnQgY2xhc3MgU3djVHJhbnNwaWxlclxuXHRleHRlbmRzIG1peHdpdGgoQ2FjaGVzT3V0cHV0cywgSW5jcmVtZW50YWxUcmFuc2Zvcm0pXG5cdGltcGxlbWVudHMgVHJhbnNmb3JtZXJcbntcblx0cHVibGljIGJ1aWxkVGFyZ2V0czogQnVpbGRUYXJnZXRbXSA9IFtCdWlsZFRhcmdldHMuZXM2LCBCdWlsZFRhcmdldHMuY29tbW9uanNdO1xuXHQjc3djQ29uZmlnRmFjdG9yeSA9IG5ldyBTd2NDb25maWdGYWN0b3J5KCk7XG5cblx0cHVibGljIGFzeW5jIHRyYW5zZm9ybVByb2plY3QoXG5cdFx0cHJvamVjdEFycmF5TGlrZTogUHJvamVjdCB8IFByb2plY3RbXSxcblx0XHRmaWxlRmlsdGVyPzogKHByb2plY3Q6IFByb2plY3QpID0+IFByb21pc2U8RmlsZUV4W10+LFxuXHRcdG9uT3V0cHV0PzogKHJlc3BvbnNlOiBUcmFuc2Zvcm1SZXNwb25zZSkgPT4gdm9pZCxcblx0KTogUHJvbWlzZTxUcmFuc2Zvcm1SZXNwb25zZVtdPiB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSBBcnJheS5pc0FycmF5KHByb2plY3RBcnJheUxpa2UpID8gcHJvamVjdEFycmF5TGlrZSA6IFtwcm9qZWN0QXJyYXlMaWtlXTtcblx0XHRjb25zdCByZXNwb25zZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdHByb2plY3RzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuXHRcdFx0XHRjb25zdCB7IHRhcmdldHMsIGFsaWFzUGF0aHMgfSA9IHByb2plY3QuZ2V0Rm9yZ2VDb25maWd1cmF0aW9uKCk7XG5cdFx0XHRcdGNvbnN0IHRyYW5zcGlsZVRhcmdldHMgPSB0YXJnZXRzLmZpbHRlcigoYnQpID0+IGJ0ICE9PSBCdWlsZFRhcmdldHMudHlwZXMpO1xuXHRcdFx0XHRpZiAodHJhbnNwaWxlVGFyZ2V0cy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRyZXR1cm4gW107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBzb3VyY2VGaWxlcyA9IGF3YWl0IChmaWxlRmlsdGVyPy4ocHJvamVjdCkgPz8gcHJvamVjdC5nZXRBbGxGaWxlcygpKTtcblx0XHRcdFx0Y29uc3QgdHNDb25maWcgPSBhd2FpdCBwcm9qZWN0LmdldFRzQ29uZmlnKCk7XG5cdFx0XHRcdGNvbnN0IHVzZXJDb25maWcgPSBhd2FpdCBwcm9qZWN0LmdldFN3Y0NvbmZpZygpO1xuXHRcdFx0XHRjb25zdCByZXNwb25zZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdFx0XHR0cmFuc3BpbGVUYXJnZXRzLm1hcCgodGFyZ2V0KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy50cmFuc2Zvcm1UYXJnZXQoXG5cdFx0XHRcdFx0XHRcdHNvdXJjZUZpbGVzLFxuXHRcdFx0XHRcdFx0XHR0YXJnZXQsXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0c0NvbmZpZyxcblx0XHRcdFx0XHRcdFx0XHR1c2VyQ29uZmlnLFxuXHRcdFx0XHRcdFx0XHRcdGFsaWFzUGF0aHMsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHByb2plY3QsXG5cdFx0XHRcdFx0XHRcdG9uT3V0cHV0LFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlcy5mbGF0KCk7XG5cdFx0XHR9KSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgZmxhdCA9IHJlc3BvbnNlcy5mbGF0KCk7XG5cdFx0dGhpcy5jYWNoZU91dHB1dHMoZmxhdCk7XG5cdFx0cmV0dXJuIGZsYXQ7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgdHJhbnNmb3JtRmlsZShcblx0XHRmaWxlQXJyYXlMaWtlOiBGaWxlRXhbXSB8IEZpbGVFeCxcblx0XHRidWlsZFRhcmdldDogVHJhbnNwaWxlVGFyZ2V0LFxuXHRcdG9wdGlvbnM6IFRyYW5zcGlsZU9wdGlvbnMgPSB7fSxcblx0KSB7XG5cdFx0Y29uc3QgZmlsZXMgPSBBcnJheS5pc0FycmF5KGZpbGVBcnJheUxpa2UpID8gZmlsZUFycmF5TGlrZSA6IFtmaWxlQXJyYXlMaWtlXTtcblx0XHRjb25zdCByZXNwb25zZXMgPSB0aGlzLnRyYW5zZm9ybVRhcmdldChmaWxlcywgYnVpbGRUYXJnZXQsIG9wdGlvbnMpO1xuXHRcdHJldHVybiByZXNwb25zZXM7XG5cdH1cblxuXHQvKipcblx0ICogU3luY2hyb25vdXMsIHNpbmdsZS1maWxlIHZhcmlhbnQgb2YgYHRyYW5zZm9ybUZpbGVgLlxuXHQgKiBSZWFkcyB0aGUgZmlsZSB3aXRoIGBmcy5yZWFkRmlsZVN5bmNgIGFuZCB0cmFuc3BpbGVzIHZpYSBgc3djLnRyYW5zZm9ybVN5bmNgLlxuXHQgKiBJbnRlbmRlZCBmb3IgY2FsbGVycyB0aGF0IGNhbm5vdCBhd2FpdCAoZS5nLiBOb2RlLmpzIGByZWdpc3Rlckhvb2tzYCBsb2FkIGhvb2spLlxuXHQgKi9cblx0cHVibGljIHRyYW5zZm9ybUZpbGVTeW5jKFxuXHRcdGZpbGU6IEZpbGVFeCxcblx0XHRidWlsZFRhcmdldDogVHJhbnNwaWxlVGFyZ2V0LFxuXHRcdG9wdGlvbnM6IFRyYW5zcGlsZU9wdGlvbnMgPSB7fSxcblx0KTogVHJhbnNmb3JtUmVzcG9uc2Uge1xuXHRcdGNvbnN0IGJhc2VDb25maWcgPSB0aGlzLiNzd2NDb25maWdGYWN0b3J5LmNyZWF0ZUJhc2VDb25maWcoYnVpbGRUYXJnZXQsIG9wdGlvbnMpO1xuXHRcdGNvbnN0IHN3Y09wdGlvbnMgPSB0aGlzLiNzd2NDb25maWdGYWN0b3J5LmNyZWF0ZUZpbGVDb25maWcoZmlsZSwgYmFzZUNvbmZpZyk7XG5cblx0XHRsZXQgY29udGVudDogc3RyaW5nO1xuXHRcdHRyeSB7XG5cdFx0XHRjb250ZW50ID0gZnMucmVhZEZpbGVTeW5jKGZpbGUuZnVsbFBhdGgsIFwidXRmOFwiKTtcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0cmV0dXJuIFRyYW5zZm9ybVJlc3BvbnNlLkVycm9yKHtcblx0XHRcdFx0ZmlsZSxcblx0XHRcdFx0bWVzc2FnZXM6IFtTdHJpbmcoZXJyb3IpXSxcblx0XHRcdFx0Y29uZmlnOiBzd2NPcHRpb25zLFxuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0aWYgKGNvbnRlbnQgPT09IFwiXCIpIHtcblx0XHRcdHJldHVybiBUcmFuc2Zvcm1SZXNwb25zZS5Ta2lwcGVkKHtcblx0XHRcdFx0ZmlsZSxcblx0XHRcdFx0bWVzc2FnZXM6IFwiRmlsZSBpcyBlbXB0eVwiLFxuXHRcdFx0XHRjb25maWc6IHN3Y09wdGlvbnMsXG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgdHJhbnNmb3JtZWQgPSB0cmFuc2Zvcm1TeW5jKGNvbnRlbnQsIHN3Y09wdGlvbnMpO1xuXHRcdFx0aWYgKHRyYW5zZm9ybWVkID09IG51bGwpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic3djLnRyYW5zZm9ybVN5bmMgcmV0dXJuZWQgbm8gcmVzdWx0XCIpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgZmlsZVBhdGggPSBmaWxlLnJlbGF0aXZlUGF0aDtcblx0XHRcdGNvbnN0IGV4dE5hbWUgPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpO1xuXHRcdFx0Y29uc3QgZmlsZU5hbWUgPSBmaWxlUGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoYCR7ZXh0TmFtZX0kYCksIFwiLmpzXCIpO1xuXHRcdFx0cmV0dXJuIFRyYW5zZm9ybVJlc3BvbnNlLlN1Y2Nlc3Moe1xuXHRcdFx0XHRmaWxlLFxuXHRcdFx0XHRjb2RlOiB0cmFuc2Zvcm1lZC5jb2RlLFxuXHRcdFx0XHRzb3VyY2VDb250ZW50OiBjb250ZW50LFxuXHRcdFx0XHR0YXJnZXQ6IGJ1aWxkVGFyZ2V0LFxuXHRcdFx0XHRmaWxlTmFtZSxcblx0XHRcdFx0Y29uZmlnOiBzd2NPcHRpb25zLFxuXHRcdFx0fSk7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdHJldHVybiBUcmFuc2Zvcm1SZXNwb25zZS5FcnJvcih7XG5cdFx0XHRcdGZpbGUsXG5cdFx0XHRcdG1lc3NhZ2VzOiBbU3RyaW5nKGVycm9yKV0sXG5cdFx0XHRcdGNvbmZpZzogc3djT3B0aW9ucyxcblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgdHJhbnNmb3JtVGFyZ2V0KFxuXHRcdGZpbGVzOiBGaWxlRXhbXSxcblx0XHRidWlsZFRhcmdldDogVHJhbnNwaWxlVGFyZ2V0LFxuXHRcdG9wdGlvbnM/OiBUcmFuc3BpbGVPcHRpb25zLFxuXHRcdHByb2plY3Q/OiBQcm9qZWN0LFxuXHRcdG9uT3V0cHV0PzogKHJlc3BvbnNlOiBUcmFuc2Zvcm1SZXNwb25zZSkgPT4gdm9pZCxcblx0KSB7XG5cdFx0Y29uc3QgYmFzZUNvbmZpZyA9IHRoaXMuI3N3Y0NvbmZpZ0ZhY3RvcnkuY3JlYXRlQmFzZUNvbmZpZyhidWlsZFRhcmdldCwgb3B0aW9ucyA/PyB7fSk7XG5cdFx0cmV0dXJuIGF3YWl0IFByb21pc2UuYWxsKFxuXHRcdFx0ZmlsZXMubWFwKChmaWxlKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHN3Y09wdGlvbnMgPSB0aGlzLiNzd2NDb25maWdGYWN0b3J5LmNyZWF0ZUZpbGVDb25maWcoZmlsZSwgYmFzZUNvbmZpZyk7XG5cdFx0XHRcdHJldHVybiB0aGlzLnJ1blRyYW5zZm9ybShmaWxlLCBidWlsZFRhcmdldCwgc3djT3B0aW9ucywgcHJvamVjdCwgb25PdXRwdXQpO1xuXHRcdFx0fSksXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuVHJhbnNmb3JtKFxuXHRcdGZpbGU6IEZpbGVFeCxcblx0XHR0YXJnZXQ6IEJ1aWxkVGFyZ2V0LFxuXHRcdHN3Y09wdGlvbnM6IE9wdGlvbnMsXG5cdFx0cHJvamVjdD86IFByb2plY3QsXG5cdFx0b25PdXRwdXQ/OiAocmVzcG9uc2U6IFRyYW5zZm9ybVJlc3BvbnNlKSA9PiB2b2lkLFxuXHQpOiBQcm9taXNlPFRyYW5zZm9ybVJlc3BvbnNlPiB7XG5cdFx0Y29uc3QgY29udGVudCA9IGF3YWl0IHRoaXMuZ2V0RmlsZUNvbnRlbnQoZmlsZSk7XG5cdFx0aWYgKGNvbnRlbnQgPT09IFwiXCIpIHtcblx0XHRcdGNvbnN0IHNraXBwZWQgPSBUcmFuc2Zvcm1SZXNwb25zZS5Ta2lwcGVkKHtcblx0XHRcdFx0ZmlsZSxcblx0XHRcdFx0bWVzc2FnZXM6IFwiRmlsZSBpcyBlbXB0eVwiLFxuXHRcdFx0XHRjb25maWc6IHN3Y09wdGlvbnMsXG5cdFx0XHRcdHByb2plY3QsXG5cdFx0XHR9KTtcblx0XHRcdG9uT3V0cHV0Py4oc2tpcHBlZCk7XG5cdFx0XHRyZXR1cm4gc2tpcHBlZDtcblx0XHR9XG5cblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgZmlsZVBhdGggPSBmaWxlLnJlbGF0aXZlUGF0aDtcblx0XHRcdGNvbnN0IGV4dE5hbWUgPSBwYXRoLmV4dG5hbWUoZmlsZVBhdGgpO1xuXHRcdFx0Y29uc3QgZmlsZU5hbWUgPSBmaWxlUGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoYCR7ZXh0TmFtZX0kYCksIFwiLmpzXCIpO1xuXHRcdFx0Y29uc3Qgb3V0QmFzZURpciA9IHByb2plY3Q/LmdldE91dERpcih0YXJnZXQpO1xuXHRcdFx0Y29uc3Qgb3V0cHV0UGF0aCA9IG91dEJhc2VEaXIgPyBwYXRoLmpvaW4ob3V0QmFzZURpciwgZmlsZU5hbWUpIDogdW5kZWZpbmVkO1xuXHRcdFx0Y29uc3Qgb3V0cHV0RGlyID0gb3V0cHV0UGF0aCA/IHBhdGguZGlybmFtZShvdXRwdXRQYXRoKSA6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IHRyYW5zZm9ybWVkID0gYXdhaXQgdHJhbnNmb3JtKGNvbnRlbnQsIHN3Y09wdGlvbnMpO1xuXHRcdFx0aWYgKHRyYW5zZm9ybWVkID09IG51bGwpIHtcblx0XHRcdFx0dGhyb3cgbmV3IEVycm9yKFwic3djLnRyYW5zZm9ybSByZXR1cm5lZCBubyByZXN1bHRcIik7XG5cdFx0XHR9XG5cblx0XHRcdGNvbnN0IHN1Y2Nlc3MgPSBUcmFuc2Zvcm1SZXNwb25zZS5TdWNjZXNzKHtcblx0XHRcdFx0ZmlsZSxcblx0XHRcdFx0Y29kZTogdHJhbnNmb3JtZWQuY29kZSxcblx0XHRcdFx0c291cmNlQ29udGVudDogY29udGVudCxcblx0XHRcdFx0dGFyZ2V0LFxuXHRcdFx0XHRmaWxlTmFtZSxcblx0XHRcdFx0b3V0cHV0RGlyLFxuXHRcdFx0XHRvdXRwdXRQYXRoLFxuXHRcdFx0XHRjb25maWc6IHN3Y09wdGlvbnMsXG5cdFx0XHRcdHByb2plY3QsXG5cdFx0XHR9KTtcblx0XHRcdG9uT3V0cHV0Py4oc3VjY2Vzcyk7XG5cdFx0XHRyZXR1cm4gc3VjY2Vzcztcblx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0Y29uc3QgZmFpbHVyZSA9IFRyYW5zZm9ybVJlc3BvbnNlLkVycm9yKHtcblx0XHRcdFx0ZmlsZSxcblx0XHRcdFx0bWVzc2FnZXM6IFtTdHJpbmcoZXJyb3IpXSxcblx0XHRcdFx0Y29uZmlnOiBzd2NPcHRpb25zLFxuXHRcdFx0XHRwcm9qZWN0LFxuXHRcdFx0fSk7XG5cdFx0XHRvbk91dHB1dD8uKGZhaWx1cmUpO1xuXHRcdFx0cmV0dXJuIGZhaWx1cmU7XG5cdFx0fVxuXHR9XG5cblx0cHJvdGVjdGVkIGFzeW5jIG9uSW5jcmVtZW50YWxGaWxlRXZlbnQoZXZ0OiBQcm9qZWN0RmlsZUV2ZW50KTogUHJvbWlzZTxUcmFuc2Zvcm1SZXNwb25zZVtdPiB7XG5cdFx0Y29uc3QgeyBmaWxlLCBwcm9qZWN0IH0gPSBldnQ7XG5cdFx0aWYgKGV2dC5ldmVudE5hbWUgPT09IGlvLldhdGNoRXZlbnRzLnVubGluaykge1xuXHRcdFx0dGhpcy5kZWxldGVDYWNoZWRPdXRwdXRzKGZpbGUuZnVsbFBhdGgpO1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblx0XHRpZiAoIXByb2plY3QuaXNTb3VyY2VGaWxlKGZpbGUpKSB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXHRcdGNvbnN0IGZyZXNoQ29udGVudCA9IGF3YWl0IGZpbGUuZ2V0Q29udGVudCgpO1xuXHRcdGNvbnN0IGNhY2hlZCA9IHRoaXMub3V0cHV0Q2FjaGUuZ2V0KGZpbGUuZnVsbFBhdGgpO1xuXHRcdGlmIChjYWNoZWQgIT0gbnVsbCAmJiBjYWNoZWRbMF0/LnNvdXJjZUNvbnRlbnQgPT09IGZyZXNoQ29udGVudCkge1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblx0XHR0aGlzLmludmFsaWRhdGVDb250ZW50Q2FjaGUoZmlsZSk7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNmb3JtUHJvamVjdChwcm9qZWN0LCAoKSA9PiBQcm9taXNlLnJlc29sdmUoW2ZpbGVdKSk7XG5cdH1cblxuXHRAaW52YWxpZGF0ZUNhY2hlKFN3Y1RyYW5zcGlsZXIucHJvdG90eXBlLmdldEZpbGVDb250ZW50LCB7XG5cdFx0bmFtZTogXCJGSUxFX0NPTlRFTlRcIixcblx0XHRrZXlGbjogKC4uLmFyZ3MpID0+IChhcmdzWzBdIGFzIEZpbGVFeCkuZnVsbFBhdGgsXG5cdH0pXG5cdHB1YmxpYyBpbnZhbGlkYXRlQ29udGVudENhY2hlKF9maWxlOiBGaWxlRXgpOiB2b2lkIHt9XG5cblx0QGNhY2hlKHsgbmFtZTogXCJGSUxFX0NPTlRFTlRcIiwga2V5Rm46ICguLi5hcmdzKSA9PiAoYXJnc1swXSBhcyBGaWxlRXgpLmZ1bGxQYXRoIH0pXG5cdHByaXZhdGUgYXN5bmMgZ2V0RmlsZUNvbnRlbnQoZmlsZTogRmlsZUV4KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gYXdhaXQgZmlsZS5nZXRDb250ZW50KCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJmcyIsInBhdGgiLCJjYWNoZSIsImludmFsaWRhdGVDYWNoZSIsIlRyYWNlIiwibWl4d2l0aCIsImlvIiwidHJhbnNmb3JtIiwidHJhbnNmb3JtU3luYyIsIkJ1aWxkVGFyZ2V0cyIsIlN3Y0NvbmZpZ0ZhY3RvcnkiLCJDYWNoZXNPdXRwdXRzIiwiSW5jcmVtZW50YWxUcmFuc2Zvcm0iLCJUcmFuc2Zvcm1SZXNwb25zZSIsIlN3Y1RyYW5zcGlsZXIiLCJidWlsZFRhcmdldHMiLCJlczYiLCJjb21tb25qcyIsInRyYW5zZm9ybVByb2plY3QiLCJwcm9qZWN0QXJyYXlMaWtlIiwiZmlsZUZpbHRlciIsIm9uT3V0cHV0IiwicHJvamVjdHMiLCJBcnJheSIsImlzQXJyYXkiLCJyZXNwb25zZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwicHJvamVjdCIsInRhcmdldHMiLCJhbGlhc1BhdGhzIiwiZ2V0Rm9yZ2VDb25maWd1cmF0aW9uIiwidHJhbnNwaWxlVGFyZ2V0cyIsImZpbHRlciIsImJ0IiwidHlwZXMiLCJsZW5ndGgiLCJzb3VyY2VGaWxlcyIsImdldEFsbEZpbGVzIiwidHNDb25maWciLCJnZXRUc0NvbmZpZyIsInVzZXJDb25maWciLCJnZXRTd2NDb25maWciLCJ0YXJnZXQiLCJ0cmFuc2Zvcm1UYXJnZXQiLCJmbGF0IiwiY2FjaGVPdXRwdXRzIiwidHJhbnNmb3JtRmlsZSIsImZpbGVBcnJheUxpa2UiLCJidWlsZFRhcmdldCIsIm9wdGlvbnMiLCJmaWxlcyIsInRyYW5zZm9ybUZpbGVTeW5jIiwiZmlsZSIsImJhc2VDb25maWciLCJjcmVhdGVCYXNlQ29uZmlnIiwic3djT3B0aW9ucyIsImNyZWF0ZUZpbGVDb25maWciLCJjb250ZW50IiwicmVhZEZpbGVTeW5jIiwiZnVsbFBhdGgiLCJlcnJvciIsIkVycm9yIiwibWVzc2FnZXMiLCJTdHJpbmciLCJjb25maWciLCJTa2lwcGVkIiwidHJhbnNmb3JtZWQiLCJmaWxlUGF0aCIsInJlbGF0aXZlUGF0aCIsImV4dE5hbWUiLCJleHRuYW1lIiwiZmlsZU5hbWUiLCJyZXBsYWNlIiwiUmVnRXhwIiwiU3VjY2VzcyIsImNvZGUiLCJzb3VyY2VDb250ZW50IiwicnVuVHJhbnNmb3JtIiwiZ2V0RmlsZUNvbnRlbnQiLCJza2lwcGVkIiwib3V0QmFzZURpciIsImdldE91dERpciIsIm91dHB1dFBhdGgiLCJqb2luIiwidW5kZWZpbmVkIiwib3V0cHV0RGlyIiwiZGlybmFtZSIsInN1Y2Nlc3MiLCJmYWlsdXJlIiwib25JbmNyZW1lbnRhbEZpbGVFdmVudCIsImV2dCIsImV2ZW50TmFtZSIsIldhdGNoRXZlbnRzIiwidW5saW5rIiwiZGVsZXRlQ2FjaGVkT3V0cHV0cyIsImlzU291cmNlRmlsZSIsImZyZXNoQ29udGVudCIsImdldENvbnRlbnQiLCJjYWNoZWQiLCJvdXRwdXRDYWNoZSIsImdldCIsImludmFsaWRhdGVDb250ZW50Q2FjaGUiLCJyZXNvbHZlIiwiX2ZpbGUiLCJwcm90b3R5cGUiLCJuYW1lIiwia2V5Rm4iLCJhcmdzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPQSxRQUFRLFVBQVU7QUFDekIsT0FBT0MsVUFBVSxZQUFZO0FBRTdCLFNBQVNDLEtBQUssRUFBRUMsZUFBZSxRQUFRLDBCQUEwQjtBQUNqRSxTQUFTQyxLQUFLLFFBQVEsOEJBQThCO0FBQ3BELFNBQVNDLE9BQU8sUUFBUSxnQ0FBZ0M7QUFFeEQsU0FBU0MsRUFBRSxRQUFRLHFCQUFx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
@@ -0,0 +1,29 @@
1
+ import { existsSync } from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { version as swcVersion } from "@swc/core";
5
+ /**
6
+ * Where compiled code is cached on disk, or null when caching is off:
7
+ *
8
+ * - `DECOHERE_CACHE=0` turns it off.
9
+ * - `DECOHERE_CACHE_DIR` puts it in that directory.
10
+ * - Otherwise `<root>/node_modules/.cache/decohere`, where tools keep caches, or when the
11
+ * workspace has no `node_modules`, `$XDG_CACHE_HOME/decohere`, then the OS temp directory.
12
+ *
13
+ * Flux keeps its entries in the `flux` folder inside it; `forge clean` removes the folder.
14
+ */ function directory(rootDir, env = process.env) {
15
+ if (env.DECOHERE_CACHE === "0") return null;
16
+ if (env.DECOHERE_CACHE_DIR != null && env.DECOHERE_CACHE_DIR !== "") {
17
+ return path.resolve(env.DECOHERE_CACHE_DIR);
18
+ }
19
+ const nodeModules = path.join(rootDir, "node_modules");
20
+ if (existsSync(nodeModules)) return path.join(nodeModules, ".cache", "decohere");
21
+ if (env.XDG_CACHE_HOME != null && env.XDG_CACHE_HOME !== "") {
22
+ return path.join(env.XDG_CACHE_HOME, "decohere");
23
+ }
24
+ return path.join(os.tmpdir(), "decohere");
25
+ }
26
+ /** The SWC version compiling: part of every cache key, so upgrading SWC misses. */ export const transpileCache = {
27
+ directory,
28
+ swcVersion
29
+ };
@@ -0,0 +1,39 @@
1
+ import fs from "node:fs";
2
+ import path from "node:path";
3
+ import ts from "typescript";
4
+ import { ForgeError } from "../errors.js";
5
+ const host = {
6
+ ...ts.sys,
7
+ readFile: (file)=>fs.readFileSync(file, {
8
+ encoding: "utf8"
9
+ }),
10
+ readDirectory: (directoryName)=>fs.readdirSync(directoryName, {
11
+ withFileTypes: true
12
+ }).filter((entry)=>entry.isDirectory()).map((entry)=>entry.name)
13
+ };
14
+ /**
15
+ * No tsconfig means no choices made, so this reads the project as plain tsc would: it clears
16
+ * the `lib` and `types` limits forge sets to keep monorepos fast, which a project opts out of
17
+ * in its tsconfig. Decorators are on because forge and flux compile them by default.
18
+ */ const DEFAULT_TS_OPTIONS = {
19
+ emitDeclarationOnly: true,
20
+ declaration: true,
21
+ lib: undefined,
22
+ types: undefined,
23
+ experimentalDecorators: true
24
+ };
25
+ /**
26
+ * A project's compiler options as the TypeScript compiler parses its `tsconfig.json`: what
27
+ * type emission needs (enums, every option, tsc's own defaults). The workspace reads only
28
+ * what transpiling needs, without loading the compiler.
29
+ */ export function tsCompilerOptions(tsconfig) {
30
+ const { filePath } = tsconfig;
31
+ if (filePath == null) return {
32
+ ...DEFAULT_TS_OPTIONS
33
+ };
34
+ const result = ts.parseConfigFileTextToJson(filePath, fs.readFileSync(filePath, "utf8"));
35
+ if (result.error) {
36
+ throw new ForgeError(`Error parsing ${filePath}. ${ts.flattenDiagnosticMessageText(result.error.messageText, "\n")}`);
37
+ }
38
+ return ts.parseJsonConfigFileContent(result.config, host, path.dirname(filePath)).options;
39
+ }
@@ -8,8 +8,8 @@ function _ts_metadata(k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  }
10
10
  import fs from "node:fs";
11
- import { cache } from "@decohere/nexus/caching";
12
- import { Trace } from "@decohere/nexus/diagnostics";
11
+ import { cache } from "@decohere/core/caching";
12
+ import { Trace } from "@decohere/devkit/diagnostics";
13
13
  import { createCompilerHost, createProgram } from "typescript";
14
14
  import { DEFAULT_TYPE_EMITTER_OPTIONS, REQUIRED_TYPE_EMITTER_OPTIONS } from "./type-emitter.js";
15
15
  export class TsProgramHost {
@@ -42,13 +42,13 @@ export class TsProgramHost {
42
42
  host.getDirectories = (directoryName)=>this.getDirectories(directoryName);
43
43
  return host;
44
44
  }
45
- createProgram(files, compilerOptions, host, oldProgram) {
45
+ createProgram(files, compilerOptions, host, oldProgram, requiredOptions = REQUIRED_TYPE_EMITTER_OPTIONS) {
46
46
  const filePaths = files.map((f)=>f.fullPath);
47
47
  this.#invalidated.clear();
48
48
  return createProgram(filePaths, {
49
49
  ...DEFAULT_TYPE_EMITTER_OPTIONS,
50
50
  ...compilerOptions,
51
- ...REQUIRED_TYPE_EMITTER_OPTIONS
51
+ ...requiredOptions
52
52
  }, host, oldProgram);
53
53
  }
54
54
  readFileFromDisk(fileName) {
@@ -116,5 +116,3 @@ _ts_decorate([
116
116
  TsProgramHost = _ts_decorate([
117
117
  Trace
118
118
  ], TsProgramHost);
119
-
120
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9zZXJ2aWNlcy90cy1wcm9ncmFtLWhvc3QudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzXCI7XG5pbXBvcnQgeyBjYWNoZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgVHJhY2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2RpYWdub3N0aWNzXCI7XG5pbXBvcnQgdHlwZSB7IEZpbGVFeCB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB0eXBlIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5pbXBvcnQgeyBjcmVhdGVDb21waWxlckhvc3QsIGNyZWF0ZVByb2dyYW0gfSBmcm9tIFwidHlwZXNjcmlwdFwiO1xuaW1wb3J0IHtcblx0REVGQVVMVF9UWVBFX0VNSVRURVJfT1BUSU9OUyxcblx0UkVRVUlSRURfVFlQRV9FTUlUVEVSX09QVElPTlMsXG59IGZyb20gXCIuLi9zZXJ2aWNlcy90eXBlLWVtaXR0ZXIuanNcIjtcblxuLyoqXG4gKiBXcmFwcyBhIFR5cGVTY3JpcHQgQ29tcGlsZXJIb3N0IHdpdGggY2FjaGVkIGZpbGUtc3lzdGVtIGNhbGxzIHNvIHRoYXRcbiAqIHJlcGVhdGVkIHJlYWRzIGR1cmluZyBhIHNpbmdsZSBidWlsZCBkbyBub3QgaGl0IHRoZSBkaXNrIG11bHRpcGxlIHRpbWVzLlxuICpcbiAqIFNlcGFyYXRpbmcgdGhpcyBmcm9tIFR5cGVFbWl0dGVyIGtlZXBzIHRoZSB0cmFuc2Zvcm1lciBsb2dpYyByZWFkYWJsZSBhbmRcbiAqIGxldHMgdGhlIGNhY2hpbmcvcHJvZ3JhbS1jcmVhdGlvbiBjb25jZXJucyBsaXZlIGluIG9uZSBmb2N1c2VkIHBsYWNlLlxuICovXG5AVHJhY2VcbmV4cG9ydCBjbGFzcyBUc1Byb2dyYW1Ib3N0IHtcblx0I2ludmFsaWRhdGVkID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cblx0cHVibGljIGludmFsaWRhdGVTb3VyY2VGaWxlKGZpbGVOYW1lOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLiNpbnZhbGlkYXRlZC5hZGQoZmlsZU5hbWUpO1xuXHR9XG5cblx0cHVibGljIGhhc0ludmFsaWRhdGVkKCk6IGJvb2xlYW4ge1xuXHRcdHJldHVybiB0aGlzLiNpbnZhbGlkYXRlZC5zaXplID4gMDtcblx0fVxuXG5cdC8qKiBSZXR1cm5zIGEgc3RhYmxlIHN0cmluZyBrZXkgZm9yIGEgc2V0IG9mIGNvbXBpbGVyIG9wdGlvbnMgdGhhdCBhZmZlY3QgaG9zdCBiZWhhdmlvdXIuICovXG5cdHB1YmxpYyBob3N0S2V5KG9wdHM6IHRzLkNvbXBpbGVyT3B0aW9ucyk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIEpTT04uc3RyaW5naWZ5KHtcblx0XHRcdHRhcmdldDogb3B0cy50YXJnZXQsXG5cdFx0XHRsaWI6IG9wdHMubGliLFxuXHRcdFx0dHlwZVJvb3RzOiBvcHRzLnR5cGVSb290cyxcblx0XHRcdHR5cGVzOiBvcHRzLnR5cGVzLFxuXHRcdFx0bW9kdWxlUmVzb2x1dGlvbjogb3B0cy5tb2R1bGVSZXNvbHV0aW9uLFxuXHRcdFx0YmFzZVVybDogb3B0cy5iYXNlVXJsLFxuXHRcdFx0cGF0aHM6IG9wdHMucGF0aHMsXG5cdFx0XHRtb2R1bGU6IG9wdHMubW9kdWxlLFxuXHRcdFx0cm9vdERpcjogb3B0cy5yb290RGlyLFxuXHRcdFx0cm9vdERpcnM6IG9wdHMucm9vdERpcnMsXG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgY3JlYXRlSG9zdChjb21waWxlck9wdGlvbnM6IHRzLkNvbXBpbGVyT3B0aW9ucyk6IHRzLkNvbXBpbGVySG9zdCB7XG5cdFx0Y29uc3QgaG9zdCA9IGNyZWF0ZUNvbXBpbGVySG9zdChjb21waWxlck9wdGlvbnMpO1xuXHRcdGhvc3QuZmlsZUV4aXN0cyA9IChmaWxlTmFtZSkgPT4gdGhpcy5maWxlRXhpc3RzT25EaXNrKGZpbGVOYW1lKTtcblx0XHRob3N0LnJlYWRGaWxlID0gKGZpbGVOYW1lKSA9PiB0aGlzLnJlYWRGaWxlRnJvbURpc2soZmlsZU5hbWUpO1xuXHRcdGhvc3QuZGlyZWN0b3J5RXhpc3RzID0gKGRpcmVjdG9yeU5hbWUpID0+IHRoaXMuZGlyZWN0b3J5RXhpc3RzKGRpcmVjdG9yeU5hbWUpO1xuXHRcdGhvc3QuZ2V0RGlyZWN0b3JpZXMgPSAoZGlyZWN0b3J5TmFtZSkgPT4gdGhpcy5nZXREaXJlY3RvcmllcyhkaXJlY3RvcnlOYW1lKTtcblx0XHRyZXR1cm4gaG9zdDtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVQcm9ncmFtKFxuXHRcdGZpbGVzOiBGaWxlRXhbXSxcblx0XHRjb21waWxlck9wdGlvbnM6IHRzLkNvbXBpbGVyT3B0aW9ucyxcblx0XHRob3N0OiB0cy5Db21waWxlckhvc3QsXG5cdFx0b2xkUHJvZ3JhbT86IHRzLlByb2dyYW0sXG5cdCk6IHRzLlByb2dyYW0ge1xuXHRcdGNvbnN0IGZpbGVQYXRocyA9IGZpbGVzLm1hcCgoZikgPT4gZi5mdWxsUGF0aCk7XG5cdFx0dGhpcy4jaW52YWxpZGF0ZWQuY2xlYXIoKTtcblx0XHRyZXR1cm4gY3JlYXRlUHJvZ3JhbShcblx0XHRcdGZpbGVQYXRocyxcblx0XHRcdHtcblx0XHRcdFx0Li4uREVGQVVMVF9UWVBFX0VNSVRURVJfT1BUSU9OUyxcblx0XHRcdFx0Li4uY29tcGlsZXJPcHRpb25zLFxuXHRcdFx0XHQuLi5SRVFVSVJFRF9UWVBFX0VNSVRURVJfT1BUSU9OUyxcblx0XHRcdH0sXG5cdFx0XHRob3N0LFxuXHRcdFx0b2xkUHJvZ3JhbSxcblx0XHQpO1xuXHR9XG5cblx0QGNhY2hlKHsgbmFtZTogXCJGSUxFX0NPTlRFTlRcIiwga2V5Rm46ICguLi5hcmdzKSA9PiBhcmdzWzBdIGFzIHN0cmluZyB9KVxuXHRwdWJsaWMgcmVhZEZpbGVGcm9tRGlzayhmaWxlTmFtZTogc3RyaW5nKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIGZzLnJlYWRGaWxlU3luYyhmaWxlTmFtZSwgXCJ1dGY4XCIpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRAY2FjaGUoKVxuXHRwdWJsaWMgZmlsZUV4aXN0c09uRGlzayhmaWxlTmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIGZzLmV4aXN0c1N5bmMoZmlsZU5hbWUpO1xuXHR9XG5cblx0QGNhY2hlKClcblx0cHVibGljIGRpcmVjdG9yeUV4aXN0cyhkaXJlY3RvcnlOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIGZzLnN0YXRTeW5jKGRpcmVjdG9yeU5hbWUpLmlzRGlyZWN0b3J5KCk7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXHR9XG5cblx0QGNhY2hlKClcblx0cHVibGljIGdldERpcmVjdG9yaWVzKGRpcmVjdG9yeU5hbWU6IHN0cmluZyk6IHN0cmluZ1tdIHtcblx0XHR0cnkge1xuXHRcdFx0cmV0dXJuIGZzXG5cdFx0XHRcdC5yZWFkZGlyU3luYyhkaXJlY3RvcnlOYW1lLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSlcblx0XHRcdFx0LmZpbHRlcigoZW50cnkpID0+IGVudHJ5LmlzRGlyZWN0b3J5KCkpXG5cdFx0XHRcdC5tYXAoKGVudHJ5KSA9PiBlbnRyeS5uYW1lKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJmcyIsImNhY2hlIiwiVHJhY2UiLCJjcmVhdGVDb21waWxlckhvc3QiLCJjcmVhdGVQcm9ncmFtIiwiREVGQVVMVF9UWVBFX0VNSVRURVJfT1BUSU9OUyIsIlJFUVVJUkVEX1RZUEVfRU1JVFRFUl9PUFRJT05TIiwiVHNQcm9ncmFtSG9zdCIsIlNldCIsImludmFsaWRhdGVTb3VyY2VGaWxlIiwiZmlsZU5hbWUiLCJhZGQiLCJoYXNJbnZhbGlkYXRlZCIsInNpemUiLCJob3N0S2V5Iiwib3B0cyIsIkpTT04iLCJzdHJpbmdpZnkiLCJ0YXJnZXQiLCJsaWIiLCJ0eXBlUm9vdHMiLCJ0eXBlcyIsIm1vZHVsZVJlc29sdXRpb24iLCJiYXNlVXJsIiwicGF0aHMiLCJtb2R1bGUiLCJyb290RGlyIiwicm9vdERpcnMiLCJjcmVhdGVIb3N0IiwiY29tcGlsZXJPcHRpb25zIiwiaG9zdCIsImZpbGVFeGlzdHMiLCJmaWxlRXhpc3RzT25EaXNrIiwicmVhZEZpbGUiLCJyZWFkRmlsZUZyb21EaXNrIiwiZGlyZWN0b3J5RXhpc3RzIiwiZGlyZWN0b3J5TmFtZSIsImdldERpcmVjdG9yaWVzIiwiZmlsZXMiLCJvbGRQcm9ncmFtIiwiZmlsZVBhdGhzIiwibWFwIiwiZiIsImZ1bGxQYXRoIiwiY2xlYXIiLCJyZWFkRmlsZVN5bmMiLCJ1bmRlZmluZWQiLCJleGlzdHNTeW5jIiwic3RhdFN5bmMiLCJpc0RpcmVjdG9yeSIsInJlYWRkaXJTeW5jIiwid2l0aEZpbGVUeXBlcyIsImZpbHRlciIsImVudHJ5IiwibmFtZSIsImtleUZuIiwiYXJncyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBT0EsUUFBUSxVQUFVO0FBQ3pCLFNBQVNDLEtBQUssUUFBUSwwQkFBMEI7QUFDaEQsU0FBU0MsS0FBSyxRQUFRLDhCQUE4QjtBQUdwRCxTQUFTQyxrQkFBa0IsRUFBRUMsYUFBYSxRQUFRLGFBQWE7QUFDL0QsU0FDQ0MsNEJBQTRCLEVBQzVCQyw2QkFBNkIsUUFDdkIsb0JBQThCO0FBVXJDLE9BQU8sTUFBTUM7SUFDWixDQUFBLFdBQVksR0FBRyxJQUFJQyxNQUFjO0lBRTFCQyxxQkFBcUJDLFFBQWdCLEVBQVE7UUFDbkQsSUFBSSxDQUFDLENBQUEsV0FBWSxDQUFDQyxHQUFHLENBQUNEO0lBQ3ZCO0lBRU9FLGlCQUEwQjtRQUNoQyxPQUFPLElBQUksQ0FBQyxDQUFBLFdBQVksQ0FBQ0MsSUFBSSxHQUFHO0lBQ2pDO0lBRUEsMEZBQTBGLEdBQzFGLEFBQU9DLFFBQVFDLElBQXdCLEVBQVU7UUFDaEQsT0FBT0MsS0FBS0MsU0FBUyxDQUFDO1lBQ3JCQyxRQUFRSCxLQUFLRyxNQUFNO1lBQ25CQyxLQUFLSixLQUFLSSxHQUFHO1lBQ2JDLFdBQVdMLEtBQUtLLFNBQVM7WUFDekJDLE9BQU9OLEtBQUtNLEtBQUs7WUFDakJDLGtCQUFrQlAsS0FBS08sZ0JBQWdCO1lBQ3ZDQyxTQUFTUixLQUFLUSxPQUFPO1lBQ3JCQyxPQUFPVCxLQUFLUyxLQUFLO1lBQ2pCQyxRQUFRVixLQUFLVSxNQUFNO1lBQ25CQyxTQUFTWCxLQUFLVyxPQUFPO1lBQ3JCQyxVQUFVWixLQUFLWSxRQUFRO1FBQ3hCO0lBQ0Q7SUFFT0MsV0FBV0MsZUFBbUMsRUFBbUI7UUFDdkUsTUFBTUMsT0FBTzNCLG1CQUFtQjBCO1FBQ2hDQyxLQUFLQyxVQUFVLEdBQUcsQ0FBQ3JCLFdBQWEsSUFBSSxDQUFDc0IsZ0JBQWdCLENBQUN0QjtRQUN0RG9CLEtBQUtHLFFBQVEsR0FBRyxDQUFDdkIsV0FBYSxJQUFJLENBQUN3QixnQkFBZ0IsQ0FBQ3hCO1FBQ3BEb0IsS0FBS0ssZUFBZSxHQUFHLENBQUNDLGdCQUFrQixJQUFJLENBQUNELGVBQWUsQ0FBQ0M7UUFDL0ROLEtBQUtPLGNBQWMsR0FBRyxDQUFDRCxnQkFBa0IsSUFBSSxDQUFDQyxjQUFjLENBQUNEO1FBQzdELE9BQU9OO0lBQ1I7SUFFTzFCLGNBQ05rQyxLQUFlLEVBQ2ZULGVBQW1DLEVBQ25DQyxJQUFxQixFQUNyQlMsVUFBdUIsRUFDVjtRQUNiLE1BQU1DLFlBQVlGLE1BQU1HLEdBQUcsQ0FBQyxDQUFDQyxJQUFNQSxFQUFFQyxRQUFRO1FBQzdDLElBQUksQ0FBQyxDQUFBLFdBQVksQ0FBQ0MsS0FBSztRQUN2QixPQUFPeEMsY0FDTm9DLFdBQ0E7WUFDQyxHQUFHbkMsNEJBQTRCO1lBQy9CLEdBQUd3QixlQUFlO1lBQ2xCLEdBQUd2Qiw2QkFBNkI7UUFDakMsR0FDQXdCLE1BQ0FTO0lBRUY7SUFHT0wsaUJBQWlCeEIsUUFBZ0IsRUFBc0I7UUFDN0QsSUFBSTtZQUNILE9BQU9WLEdBQUc2QyxZQUFZLENBQUNuQyxVQUFVO1FBQ2xDLEVBQUUsT0FBTTtZQUNQLE9BQU9vQztRQUNSO0lBQ0Q7SUFHT2QsaUJBQWlCdEIsUUFBZ0IsRUFBVztRQUNsRCxPQUFPVixHQUFHK0MsVUFBVSxDQUFDckM7SUFDdEI7SUFHT3lCLGdCQUFnQkMsYUFBcUIsRUFBVztRQUN0RCxJQUFJO1lBQ0gsT0FBT3BDLEdBQUdnRCxRQUFRLENBQUNaLGVBQWVhLFdBQVc7UUFDOUMsRUFBRSxPQUFNO1lBQ1AsT0FBTztRQUNSO0lBQ0Q7SUFHT1osZUFBZUQsYUFBcUIsRUFBWTtRQUN0RCxJQUFJO1lBQ0gsT0FBT3BDLEdBQ0xrRCxXQUFXLENBQUNkLGVBQWU7Z0JBQUVlLGVBQWU7WUFBSyxHQUNqREMsTUFBTSxDQUFDLENBQUNDLFFBQVVBLE1BQU1KLFdBQVcsSUFDbkNSLEdBQUcsQ0FBQyxDQUFDWSxRQUFVQSxNQUFNQyxJQUFJO1FBQzVCLEVBQUUsT0FBTTtZQUNQLE9BQU8sRUFBRTtRQUNWO0lBQ0Q7QUFDRDs7O1FBbENVQSxNQUFNO1FBQWdCQyxPQUFPLENBQUMsR0FBR0MsT0FBU0EsSUFBSSxDQUFDLEVBQUUifQ==
@@ -8,7 +8,8 @@ function _ts_metadata(k, v) {
8
8
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
9
  }
10
10
  import path from "node:path";
11
- import { Trace } from "@decohere/nexus/diagnostics";
11
+ import { Trace } from "@decohere/devkit/diagnostics";
12
+ import ts from "typescript";
12
13
  import { TransformResponse } from "../types/transform-response.model.js";
13
14
  export class TypeEmissionProgram {
14
15
  #program;
@@ -19,16 +20,25 @@ export class TypeEmissionProgram {
19
20
  #compilerHost;
20
21
  #allFiles;
21
22
  #compilerOptions;
22
- constructor(group, hostFactory){
23
+ #requiredOptions;
24
+ constructor(group, hostFactory, requiredOptions){
23
25
  this.#group = group;
24
26
  const targets = this.buildTargetMaps(group);
25
27
  this.#targetsByDtsPath = targets.byDtsPath;
26
28
  this.#targetsByEmittedPath = targets.byEmittedPath;
27
29
  this.#host = hostFactory;
28
- this.#compilerOptions = group[0].tsconfig.compilerOptions;
30
+ this.#compilerOptions = group[0].compilerOptions;
31
+ this.#requiredOptions = requiredOptions;
29
32
  this.#allFiles = group.flatMap(({ files })=>files);
30
33
  this.#compilerHost = hostFactory.createHost(this.#compilerOptions);
31
- this.#program = hostFactory.createProgram(this.#allFiles, this.#compilerOptions, this.#compilerHost);
34
+ this.#program = this.createProgram();
35
+ }
36
+ check() {
37
+ this.refreshProgramIfNeeded();
38
+ return ts.getPreEmitDiagnostics(this.#program);
39
+ }
40
+ formatDiagnostics(diagnostics) {
41
+ return ts.formatDiagnosticsWithColorAndContext(diagnostics, this.#compilerHost);
32
42
  }
33
43
  toEmissionTarget(groupProject, file, outBaseDir) {
34
44
  const extName = path.extname(file.relativePath);
@@ -74,14 +84,20 @@ export class TypeEmissionProgram {
74
84
  this.#host.invalidateSourceFile(file.fullPath);
75
85
  }
76
86
  async emit(fileFilter, onOutput) {
77
- if (this.#host.hasInvalidated()) {
78
- this.#program = this.#host.createProgram(this.#allFiles, this.#compilerOptions, this.#compilerHost, this.#program);
79
- }
87
+ this.refreshProgramIfNeeded();
80
88
  if (fileFilter == null) {
81
89
  return this.emitAll(onOutput);
82
90
  }
83
91
  return this.emitFiltered(fileFilter, onOutput);
84
92
  }
93
+ createProgram(oldProgram) {
94
+ return this.#host.createProgram(this.#allFiles, this.#compilerOptions, this.#compilerHost, oldProgram, this.#requiredOptions);
95
+ }
96
+ refreshProgramIfNeeded() {
97
+ if (this.#host.hasInvalidated()) {
98
+ this.#program = this.createProgram(this.#program);
99
+ }
100
+ }
85
101
  emitAll(onOutput) {
86
102
  const responses = [];
87
103
  this.#program.emit(undefined, (emittedPath, content)=>{
@@ -138,8 +154,7 @@ TypeEmissionProgram = _ts_decorate([
138
154
  _ts_metadata("design:type", Function),
139
155
  _ts_metadata("design:paramtypes", [
140
156
  Array,
141
- typeof TsProgramHost === "undefined" ? Object : TsProgramHost
157
+ typeof TsProgramHost === "undefined" ? Object : TsProgramHost,
158
+ typeof ts === "undefined" || typeof ts.CompilerOptions === "undefined" ? Object : ts.CompilerOptions
142
159
  ])
143
160
  ], TypeEmissionProgram);
144
-
145
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9zZXJ2aWNlcy90eXBlLWVtaXNzaW9uLXByb2dyYW0udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0LCBUc2NvbmZpZyB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgVHJhY2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2RpYWdub3N0aWNzXCI7XG5pbXBvcnQgdHlwZSB7IEZpbGVFeCB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB0eXBlIHRzIGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5pbXBvcnQgdHlwZSB7IFRzUHJvZ3JhbUhvc3QgfSBmcm9tIFwiLi4vc2VydmljZXMvdHMtcHJvZ3JhbS1ob3N0LmpzXCI7XG5pbXBvcnQgeyBUcmFuc2Zvcm1SZXNwb25zZSB9IGZyb20gXCIuLi90eXBlcy90cmFuc2Zvcm0tcmVzcG9uc2UubW9kZWwuanNcIjtcblxuZXhwb3J0IHR5cGUgVHlwZVByb2dyYW1Qcm9qZWN0ID0ge1xuXHRwcm9qZWN0OiBQcm9qZWN0O1xuXHRmaWxlczogRmlsZUV4W107XG5cdHRzY29uZmlnOiBUc2NvbmZpZztcbn07XG5cbnR5cGUgRW1pc3Npb25UYXJnZXQgPSB7XG5cdGZpbGU6IEZpbGVFeDtcblx0dHNjb25maWc6IFRzY29uZmlnO1xuXHRwcm9qZWN0OiBQcm9qZWN0O1xuXHRvdXRwdXRQYXRoOiBzdHJpbmc7XG5cdG91dHB1dERpcjogc3RyaW5nO1xuXHRkdHNSZWxhdGl2ZTogc3RyaW5nO1xufTtcblxuQFRyYWNlXG5leHBvcnQgY2xhc3MgVHlwZUVtaXNzaW9uUHJvZ3JhbSB7XG5cdCNwcm9ncmFtOiB0cy5Qcm9ncmFtO1xuXHQjZ3JvdXA6IFR5cGVQcm9ncmFtUHJvamVjdFtdO1xuXHQjdGFyZ2V0c0J5RHRzUGF0aDogTWFwPHN0cmluZywgRW1pc3Npb25UYXJnZXQ+O1xuXHQjdGFyZ2V0c0J5RW1pdHRlZFBhdGg6IE1hcDxzdHJpbmcsIEVtaXNzaW9uVGFyZ2V0Pjtcblx0I2hvc3Q6IFRzUHJvZ3JhbUhvc3Q7XG5cdCNjb21waWxlckhvc3Q6IHRzLkNvbXBpbGVySG9zdDtcblx0I2FsbEZpbGVzOiBGaWxlRXhbXTtcblx0I2NvbXBpbGVyT3B0aW9uczogdHMuQ29tcGlsZXJPcHRpb25zO1xuXG5cdHB1YmxpYyBjb25zdHJ1Y3Rvcihncm91cDogVHlwZVByb2dyYW1Qcm9qZWN0W10sIGhvc3RGYWN0b3J5OiBUc1Byb2dyYW1Ib3N0KSB7XG5cdFx0dGhpcy4jZ3JvdXAgPSBncm91cDtcblx0XHRjb25zdCB0YXJnZXRzID0gdGhpcy5idWlsZFRhcmdldE1hcHMoZ3JvdXApO1xuXHRcdHRoaXMuI3RhcmdldHNCeUR0c1BhdGggPSB0YXJnZXRzLmJ5RHRzUGF0aDtcblx0XHR0aGlzLiN0YXJnZXRzQnlFbWl0dGVkUGF0aCA9IHRhcmdldHMuYnlFbWl0dGVkUGF0aDtcblx0XHR0aGlzLiNob3N0ID0gaG9zdEZhY3Rvcnk7XG5cdFx0dGhpcy4jY29tcGlsZXJPcHRpb25zID0gZ3JvdXBbMF0udHNjb25maWcuY29tcGlsZXJPcHRpb25zO1xuXHRcdHRoaXMuI2FsbEZpbGVzID0gZ3JvdXAuZmxhdE1hcCgoeyBmaWxlcyB9KSA9PiBmaWxlcyk7XG5cdFx0dGhpcy4jY29tcGlsZXJIb3N0ID0gaG9zdEZhY3RvcnkuY3JlYXRlSG9zdCh0aGlzLiNjb21waWxlck9wdGlvbnMpO1xuXHRcdHRoaXMuI3Byb2dyYW0gPSBob3N0RmFjdG9yeS5jcmVhdGVQcm9ncmFtKFxuXHRcdFx0dGhpcy4jYWxsRmlsZXMsXG5cdFx0XHR0aGlzLiNjb21waWxlck9wdGlvbnMsXG5cdFx0XHR0aGlzLiNjb21waWxlckhvc3QsXG5cdFx0KTtcblx0fVxuXG5cdHByaXZhdGUgdG9FbWlzc2lvblRhcmdldChcblx0XHRncm91cFByb2plY3Q6IFR5cGVQcm9ncmFtUHJvamVjdCxcblx0XHRmaWxlOiBGaWxlRXgsXG5cdFx0b3V0QmFzZURpcjogc3RyaW5nLFxuXHQpOiBFbWlzc2lvblRhcmdldCB7XG5cdFx0Y29uc3QgZXh0TmFtZSA9IHBhdGguZXh0bmFtZShmaWxlLnJlbGF0aXZlUGF0aCk7XG5cdFx0Y29uc3QgZHRzUmVsYXRpdmUgPSBmaWxlLnJlbGF0aXZlUGF0aC5yZXBsYWNlKG5ldyBSZWdFeHAoYCR7ZXh0TmFtZX0kYCksIFwiLmQudHNcIik7XG5cdFx0Y29uc3Qgb3V0cHV0UGF0aCA9IHBhdGguam9pbihvdXRCYXNlRGlyLCBkdHNSZWxhdGl2ZSk7XG5cdFx0cmV0dXJuIHtcblx0XHRcdGZpbGUsXG5cdFx0XHR0c2NvbmZpZzogZ3JvdXBQcm9qZWN0LnRzY29uZmlnLFxuXHRcdFx0cHJvamVjdDogZ3JvdXBQcm9qZWN0LnByb2plY3QsXG5cdFx0XHRvdXRwdXRQYXRoLFxuXHRcdFx0b3V0cHV0RGlyOiBwYXRoLmRpcm5hbWUob3V0cHV0UGF0aCksXG5cdFx0XHRkdHNSZWxhdGl2ZSxcblx0XHR9O1xuXHR9XG5cblx0cHJpdmF0ZSBlbWl0dGVkS2V5KGZpbGU6IEZpbGVFeCk6IHN0cmluZyB7XG5cdFx0cmV0dXJuIGZpbGUuZnVsbFBhdGgucmVwbGFjZSgvXFwuW14uXSskLywgXCIuZC50c1wiKTtcblx0fVxuXG5cdHByaXZhdGUgYnVpbGRUYXJnZXRNYXBzKGdyb3VwOiBUeXBlUHJvZ3JhbVByb2plY3RbXSk6IHtcblx0XHRieUR0c1BhdGg6IE1hcDxzdHJpbmcsIEVtaXNzaW9uVGFyZ2V0Pjtcblx0XHRieUVtaXR0ZWRQYXRoOiBNYXA8c3RyaW5nLCBFbWlzc2lvblRhcmdldD47XG5cdH0ge1xuXHRcdGNvbnN0IGJ5RHRzUGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBFbWlzc2lvblRhcmdldD4oKTtcblx0XHRjb25zdCBieUVtaXR0ZWRQYXRoID0gbmV3IE1hcDxzdHJpbmcsIEVtaXNzaW9uVGFyZ2V0PigpO1xuXG5cdFx0Zm9yIChjb25zdCBncm91cFByb2plY3Qgb2YgZ3JvdXApIHtcblx0XHRcdGNvbnN0IG91dEJhc2VEaXIgPSBncm91cFByb2plY3QucHJvamVjdC5nZXRPdXREaXIoXCJ0eXBlc1wiKTtcblx0XHRcdGZvciAoY29uc3QgZmlsZSBvZiBncm91cFByb2plY3QuZmlsZXMpIHtcblx0XHRcdFx0Y29uc3QgdGFyZ2V0ID0gdGhpcy50b0VtaXNzaW9uVGFyZ2V0KGdyb3VwUHJvamVjdCwgZmlsZSwgb3V0QmFzZURpcik7XG5cdFx0XHRcdGJ5RHRzUGF0aC5zZXQodGFyZ2V0LmR0c1JlbGF0aXZlLCB0YXJnZXQpO1xuXHRcdFx0XHRieUVtaXR0ZWRQYXRoLnNldCh0aGlzLmVtaXR0ZWRLZXkoZmlsZSksIHRhcmdldCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHsgYnlEdHNQYXRoLCBieUVtaXR0ZWRQYXRoIH07XG5cdH1cblxuXHRwdWJsaWMgYWRkRmlsZShmaWxlOiBGaWxlRXgsIHByb2plY3Q6IFByb2plY3QpOiB2b2lkIHtcblx0XHRjb25zdCBncm91cFByb2plY3QgPSB0aGlzLiNncm91cC5maW5kKChnKSA9PiBnLnByb2plY3QgPT09IHByb2plY3QpO1xuXHRcdGlmIChncm91cFByb2plY3QgPT0gbnVsbCkgcmV0dXJuO1xuXG5cdFx0Z3JvdXBQcm9qZWN0LmZpbGVzLnB1c2goZmlsZSk7XG5cdFx0dGhpcy4jYWxsRmlsZXMucHVzaChmaWxlKTtcblxuXHRcdGNvbnN0IG91dEJhc2VEaXIgPSBncm91cFByb2plY3QucHJvamVjdC5nZXRPdXREaXIoXCJ0eXBlc1wiKTtcblx0XHRjb25zdCB0YXJnZXQgPSB0aGlzLnRvRW1pc3Npb25UYXJnZXQoZ3JvdXBQcm9qZWN0LCBmaWxlLCBvdXRCYXNlRGlyKTtcblx0XHR0aGlzLiN0YXJnZXRzQnlEdHNQYXRoLnNldCh0YXJnZXQuZHRzUmVsYXRpdmUsIHRhcmdldCk7XG5cdFx0dGhpcy4jdGFyZ2V0c0J5RW1pdHRlZFBhdGguc2V0KHRoaXMuZW1pdHRlZEtleShmaWxlKSwgdGFyZ2V0KTtcblx0XHR0aGlzLiNob3N0LmludmFsaWRhdGVTb3VyY2VGaWxlKGZpbGUuZnVsbFBhdGgpO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGVtaXQoXG5cdFx0ZmlsZUZpbHRlcj86IChwcm9qZWN0OiBQcm9qZWN0KSA9PiBQcm9taXNlPEZpbGVFeFtdPixcblx0XHRvbk91dHB1dD86IChyZXNwb25zZTogVHJhbnNmb3JtUmVzcG9uc2UpID0+IHZvaWQsXG5cdCk6IFByb21pc2U8VHJhbnNmb3JtUmVzcG9uc2VbXT4ge1xuXHRcdGlmICh0aGlzLiNob3N0Lmhhc0ludmFsaWRhdGVkKCkpIHtcblx0XHRcdHRoaXMuI3Byb2dyYW0gPSB0aGlzLiNob3N0LmNyZWF0ZVByb2dyYW0oXG5cdFx0XHRcdHRoaXMuI2FsbEZpbGVzLFxuXHRcdFx0XHR0aGlzLiNjb21waWxlck9wdGlvbnMsXG5cdFx0XHRcdHRoaXMuI2NvbXBpbGVySG9zdCxcblx0XHRcdFx0dGhpcy4jcHJvZ3JhbSxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGlmIChmaWxlRmlsdGVyID09IG51bGwpIHtcblx0XHRcdHJldHVybiB0aGlzLmVtaXRBbGwob25PdXRwdXQpO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lbWl0RmlsdGVyZWQoZmlsZUZpbHRlciwgb25PdXRwdXQpO1xuXHR9XG5cblx0cHJpdmF0ZSBlbWl0QWxsKG9uT3V0cHV0PzogKHJlc3BvbnNlOiBUcmFuc2Zvcm1SZXNwb25zZSkgPT4gdm9pZCk6IFRyYW5zZm9ybVJlc3BvbnNlW10ge1xuXHRcdGNvbnN0IHJlc3BvbnNlczogVHJhbnNmb3JtUmVzcG9uc2VbXSA9IFtdO1xuXHRcdHRoaXMuI3Byb2dyYW0uZW1pdCh1bmRlZmluZWQsIChlbWl0dGVkUGF0aCwgY29udGVudCkgPT4ge1xuXHRcdFx0aWYgKCFlbWl0dGVkUGF0aC5lbmRzV2l0aChcIi5kLnRzXCIpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGNvbnN0IHJlc3BvbnNlID0gdGhpcy50b1RyYW5zZm9ybVJlc3BvbnNlKGVtaXR0ZWRQYXRoLCBjb250ZW50KTtcblx0XHRcdHJlc3BvbnNlcy5wdXNoKHJlc3BvbnNlKTtcblx0XHRcdG9uT3V0cHV0Py4ocmVzcG9uc2UpO1xuXHRcdH0pO1xuXHRcdHJldHVybiByZXNwb25zZXM7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGVtaXRGaWx0ZXJlZChcblx0XHRmaWxlRmlsdGVyOiAocHJvamVjdDogUHJvamVjdCkgPT4gUHJvbWlzZTxGaWxlRXhbXT4sXG5cdFx0b25PdXRwdXQ/OiAocmVzcG9uc2U6IFRyYW5zZm9ybVJlc3BvbnNlKSA9PiB2b2lkLFxuXHQpOiBQcm9taXNlPFRyYW5zZm9ybVJlc3BvbnNlW10+IHtcblx0XHRjb25zdCBmaWxlcyA9IGF3YWl0IFByb21pc2UuYWxsKHRoaXMuI2dyb3VwLm1hcCgoeyBwcm9qZWN0IH0pID0+IGZpbGVGaWx0ZXIocHJvamVjdCkpKTtcblx0XHRjb25zdCBzb3VyY2VGaWxlcyA9IGZpbGVzXG5cdFx0XHQuZmxhdCgpXG5cdFx0XHQubWFwKChmaWxlKSA9PiB0aGlzLiNwcm9ncmFtLmdldFNvdXJjZUZpbGUoZmlsZS5mdWxsUGF0aCkpXG5cdFx0XHQuZmlsdGVyKChzZik6IHNmIGlzIHRzLlNvdXJjZUZpbGUgPT4gc2YgIT0gbnVsbCk7XG5cblx0XHRjb25zdCByZXNwb25zZXM6IFRyYW5zZm9ybVJlc3BvbnNlW10gPSBbXTtcblxuXHRcdGZvciAoY29uc3Qgc291cmNlRmlsZSBvZiBzb3VyY2VGaWxlcykge1xuXHRcdFx0dGhpcy4jcHJvZ3JhbS5lbWl0KHNvdXJjZUZpbGUsIChlbWl0dGVkUGF0aCwgY29udGVudCkgPT4ge1xuXHRcdFx0XHRpZiAoIWVtaXR0ZWRQYXRoLmVuZHNXaXRoKFwiLmQudHNcIikpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29uc3QgcmVzcG9uc2UgPSB0aGlzLnRvVHJhbnNmb3JtUmVzcG9uc2UoZW1pdHRlZFBhdGgsIGNvbnRlbnQpO1xuXHRcdFx0XHRyZXNwb25zZXMucHVzaChyZXNwb25zZSk7XG5cdFx0XHRcdG9uT3V0cHV0Py4ocmVzcG9uc2UpO1xuXHRcdFx0fSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3BvbnNlcztcblx0fVxuXG5cdHByaXZhdGUgdG9UcmFuc2Zvcm1SZXNwb25zZShlbWl0dGVkUGF0aDogc3RyaW5nLCBjb250ZW50OiBzdHJpbmcpOiBUcmFuc2Zvcm1SZXNwb25zZSB7XG5cdFx0Y29uc3QgdGFyZ2V0ID0gdGhpcy4jdGFyZ2V0c0J5RW1pdHRlZFBhdGguZ2V0KGVtaXR0ZWRQYXRoKTtcblx0XHRpZiAodGFyZ2V0ID09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihgTm8gbWF0Y2hpbmcgZW1pc3Npb24gdGFyZ2V0IGZvcjogJHtlbWl0dGVkUGF0aH1gKTtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMudG9UcmFuc2Zvcm1SZXNwb25zZUZyb21UYXJnZXQodGFyZ2V0LCBjb250ZW50KTtcblx0fVxuXG5cdHByaXZhdGUgdG9UcmFuc2Zvcm1SZXNwb25zZUZyb21UYXJnZXQoXG5cdFx0dGFyZ2V0OiBFbWlzc2lvblRhcmdldCxcblx0XHRjb250ZW50OiBzdHJpbmcsXG5cdCk6IFRyYW5zZm9ybVJlc3BvbnNlIHtcblx0XHRjb25zdCB7IGZpbGUsIHRzY29uZmlnLCBwcm9qZWN0LCBvdXRwdXRQYXRoLCBvdXRwdXREaXIsIGR0c1JlbGF0aXZlIH0gPSB0YXJnZXQ7XG5cdFx0cmV0dXJuIFRyYW5zZm9ybVJlc3BvbnNlLmZyb20oe1xuXHRcdFx0ZmlsZSxcblx0XHRcdGNvbmZpZzogdHNjb25maWcsXG5cdFx0XHRvdXRjb21lOiBcInN1Y2Nlc3NcIixcblx0XHRcdGZpbGVOYW1lOiBkdHNSZWxhdGl2ZSxcblx0XHRcdGNvZGU6IGNvbnRlbnQsXG5cdFx0XHR0YXJnZXQ6IFwidHlwZXNcIixcblx0XHRcdG1lc3NhZ2VzOiBbXSxcblx0XHRcdHByb2plY3QsXG5cdFx0XHRvdXRwdXREaXIsXG5cdFx0XHRvdXRwdXRQYXRoLFxuXHRcdH0pO1xuXHR9XG59XG4iXSwibmFtZXMiOlsicGF0aCIsIlRyYWNlIiwiVHJhbnNmb3JtUmVzcG9uc2UiLCJUeXBlRW1pc3Npb25Qcm9ncmFtIiwiZ3JvdXAiLCJob3N0RmFjdG9yeSIsInRhcmdldHMiLCJidWlsZFRhcmdldE1hcHMiLCJieUR0c1BhdGgiLCJieUVtaXR0ZWRQYXRoIiwidHNjb25maWciLCJjb21waWxlck9wdGlvbnMiLCJmbGF0TWFwIiwiZmlsZXMiLCJjcmVhdGVIb3N0IiwiY3JlYXRlUHJvZ3JhbSIsInRvRW1pc3Npb25UYXJnZXQiLCJncm91cFByb2plY3QiLCJmaWxlIiwib3V0QmFzZURpciIsImV4dE5hbWUiLCJleHRuYW1lIiwicmVsYXRpdmVQYXRoIiwiZHRzUmVsYXRpdmUiLCJyZXBsYWNlIiwiUmVnRXhwIiwib3V0cHV0UGF0aCIsImpvaW4iLCJwcm9qZWN0Iiwib3V0cHV0RGlyIiwiZGlybmFtZSIsImVtaXR0ZWRLZXkiLCJmdWxsUGF0aCIsIk1hcCIsImdldE91dERpciIsInRhcmdldCIsInNldCIsImFkZEZpbGUiLCJmaW5kIiwiZyIsInB1c2giLCJpbnZhbGlkYXRlU291cmNlRmlsZSIsImVtaXQiLCJmaWxlRmlsdGVyIiwib25PdXRwdXQiLCJoYXNJbnZhbGlkYXRlZCIsImVtaXRBbGwiLCJlbWl0RmlsdGVyZWQiLCJyZXNwb25zZXMiLCJ1bmRlZmluZWQiLCJlbWl0dGVkUGF0aCIsImNvbnRlbnQiLCJlbmRzV2l0aCIsInJlc3BvbnNlIiwidG9UcmFuc2Zvcm1SZXNwb25zZSIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJzb3VyY2VGaWxlcyIsImZsYXQiLCJnZXRTb3VyY2VGaWxlIiwiZmlsdGVyIiwic2YiLCJzb3VyY2VGaWxlIiwiZ2V0IiwiRXJyb3IiLCJ0b1RyYW5zZm9ybVJlc3BvbnNlRnJvbVRhcmdldCIsImZyb20iLCJjb25maWciLCJvdXRjb21lIiwiZmlsZU5hbWUiLCJjb2RlIiwibWVzc2Fn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