@decohere/forge 0.0.1-dev.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (130) hide show
  1. package/commonjs/src/actions/build.action.js +108 -0
  2. package/commonjs/src/actions/clean.action.js +55 -0
  3. package/commonjs/src/actions/commit.action.js +80 -0
  4. package/commonjs/src/actions/copy.action.js +83 -0
  5. package/commonjs/src/actions/dependency-report.action.js +142 -0
  6. package/commonjs/src/actions/dependency-sync.action.js +100 -0
  7. package/commonjs/src/actions/index.js +30 -0
  8. package/commonjs/src/actions/publish.action.js +156 -0
  9. package/commonjs/src/actions/sync-lock-file.action.js +43 -0
  10. package/commonjs/src/actions/tag.action.js +76 -0
  11. package/commonjs/src/actions/version.action.js +209 -0
  12. package/commonjs/src/actions/watch.action.js +50 -0
  13. package/commonjs/src/commands/build.command.js +49 -0
  14. package/commonjs/src/commands/dependency.command.js +88 -0
  15. package/commonjs/src/commands/forge.command.js +24 -0
  16. package/commonjs/src/commands/index.js +25 -0
  17. package/commonjs/src/commands/publish.command.js +32 -0
  18. package/commonjs/src/commands/tag.command.js +28 -0
  19. package/commonjs/src/commands/version.command.js +36 -0
  20. package/commonjs/src/const.js +81 -0
  21. package/commonjs/src/errors.js +39 -0
  22. package/commonjs/src/extensions/project.extensions.js +66 -0
  23. package/commonjs/src/factories/swc-config.factory.js +98 -0
  24. package/commonjs/src/forge.module.js +109 -0
  25. package/commonjs/src/index.js +22 -0
  26. package/commonjs/src/mixins/caches-outputs.mixin.js +42 -0
  27. package/commonjs/src/mixins/incremental-transform.mixin.js +36 -0
  28. package/commonjs/src/services/dependency-resolver.service.js +172 -0
  29. package/commonjs/src/services/file-writer.service.js +232 -0
  30. package/commonjs/src/services/swc-transpiler.js +176 -0
  31. package/commonjs/src/services/ts-program-host.js +135 -0
  32. package/commonjs/src/services/type-emission-program.js +160 -0
  33. package/commonjs/src/services/type-emitter.js +141 -0
  34. package/commonjs/src/types/build-target.type.js +17 -0
  35. package/commonjs/src/types/configuration.type.js +6 -0
  36. package/commonjs/src/types/dependency.types.js +6 -0
  37. package/commonjs/src/types/swc-config.type.js +17 -0
  38. package/commonjs/src/types/transform-response.model.js +64 -0
  39. package/commonjs/src/types/transformer.type.js +13 -0
  40. package/commonjs/src/types/workspace-config.type.js +6 -0
  41. package/commonjs/src/vitest/forge-build.plugin.js +129 -0
  42. package/commonjs/src/vitest/index.js +13 -0
  43. package/commonjs/src/workspace.config.js +73 -0
  44. package/es6/src/actions/build.action.js +100 -0
  45. package/es6/src/actions/clean.action.js +46 -0
  46. package/es6/src/actions/commit.action.js +71 -0
  47. package/es6/src/actions/copy.action.js +69 -0
  48. package/es6/src/actions/dependency-report.action.js +134 -0
  49. package/es6/src/actions/dependency-sync.action.js +92 -0
  50. package/es6/src/actions/index.js +13 -0
  51. package/es6/src/actions/publish.action.js +147 -0
  52. package/es6/src/actions/sync-lock-file.action.js +33 -0
  53. package/es6/src/actions/tag.action.js +67 -0
  54. package/es6/src/actions/version.action.js +189 -0
  55. package/es6/src/actions/watch.action.js +41 -0
  56. package/es6/src/commands/build.command.js +34 -0
  57. package/es6/src/commands/dependency.command.js +78 -0
  58. package/es6/src/commands/forge.command.js +14 -0
  59. package/es6/src/commands/index.js +8 -0
  60. package/es6/src/commands/publish.command.js +22 -0
  61. package/es6/src/commands/tag.command.js +18 -0
  62. package/es6/src/commands/version.command.js +26 -0
  63. package/es6/src/const.js +60 -0
  64. package/es6/src/errors.js +18 -0
  65. package/es6/src/extensions/project.extensions.js +51 -0
  66. package/es6/src/factories/swc-config.factory.js +83 -0
  67. package/es6/src/forge.module.js +58 -0
  68. package/es6/src/index.js +4 -0
  69. package/es6/src/mixins/caches-outputs.mixin.js +32 -0
  70. package/es6/src/mixins/incremental-transform.mixin.js +26 -0
  71. package/es6/src/services/dependency-resolver.service.js +162 -0
  72. package/es6/src/services/file-writer.service.js +217 -0
  73. package/es6/src/services/swc-transpiler.js +161 -0
  74. package/es6/src/services/ts-program-host.js +120 -0
  75. package/es6/src/services/type-emission-program.js +145 -0
  76. package/es6/src/services/type-emitter.js +134 -0
  77. package/es6/src/types/build-target.type.js +7 -0
  78. package/es6/src/types/configuration.type.js +3 -0
  79. package/es6/src/types/dependency.types.js +3 -0
  80. package/es6/src/types/swc-config.type.js +7 -0
  81. package/es6/src/types/transform-response.model.js +46 -0
  82. package/es6/src/types/transformer.type.js +3 -0
  83. package/es6/src/types/workspace-config.type.js +3 -0
  84. package/es6/src/vitest/forge-build.plugin.js +114 -0
  85. package/es6/src/vitest/index.js +3 -0
  86. package/es6/src/workspace.config.js +49 -0
  87. package/package.json +43 -0
  88. package/types/src/actions/build.action.d.ts +22 -0
  89. package/types/src/actions/clean.action.d.ts +13 -0
  90. package/types/src/actions/commit.action.d.ts +17 -0
  91. package/types/src/actions/copy.action.d.ts +14 -0
  92. package/types/src/actions/dependency-report.action.d.ts +36 -0
  93. package/types/src/actions/dependency-sync.action.d.ts +17 -0
  94. package/types/src/actions/index.d.ts +11 -0
  95. package/types/src/actions/publish.action.d.ts +34 -0
  96. package/types/src/actions/sync-lock-file.action.d.ts +10 -0
  97. package/types/src/actions/tag.action.d.ts +19 -0
  98. package/types/src/actions/version.action.d.ts +35 -0
  99. package/types/src/actions/watch.action.d.ts +14 -0
  100. package/types/src/commands/build.command.d.ts +16 -0
  101. package/types/src/commands/dependency.command.d.ts +5 -0
  102. package/types/src/commands/forge.command.d.ts +6 -0
  103. package/types/src/commands/index.d.ts +6 -0
  104. package/types/src/commands/publish.command.d.ts +6 -0
  105. package/types/src/commands/tag.command.d.ts +6 -0
  106. package/types/src/commands/version.command.d.ts +12 -0
  107. package/types/src/const.d.ts +3 -0
  108. package/types/src/errors.d.ts +4 -0
  109. package/types/src/extensions/project.extensions.d.ts +13 -0
  110. package/types/src/factories/swc-config.factory.d.ts +24 -0
  111. package/types/src/forge.module.d.ts +31 -0
  112. package/types/src/index.d.ts +4 -0
  113. package/types/src/mixins/caches-outputs.mixin.d.ts +7 -0
  114. package/types/src/mixins/incremental-transform.mixin.d.ts +13 -0
  115. package/types/src/services/dependency-resolver.service.d.ts +15 -0
  116. package/types/src/services/file-writer.service.d.ts +20 -0
  117. package/types/src/services/swc-transpiler.d.ts +28 -0
  118. package/types/src/services/ts-program-host.d.ts +22 -0
  119. package/types/src/services/type-emission-program.d.ts +22 -0
  120. package/types/src/services/type-emitter.d.ts +43 -0
  121. package/types/src/types/build-target.type.d.ts +7 -0
  122. package/types/src/types/configuration.type.d.ts +6 -0
  123. package/types/src/types/dependency.types.d.ts +39 -0
  124. package/types/src/types/swc-config.type.d.ts +9 -0
  125. package/types/src/types/transform-response.model.d.ts +54 -0
  126. package/types/src/types/transformer.type.d.ts +37 -0
  127. package/types/src/types/workspace-config.type.d.ts +13 -0
  128. package/types/src/vitest/forge-build.plugin.d.ts +18 -0
  129. package/types/src/vitest/index.d.ts +2 -0
  130. package/types/src/workspace.config.d.ts +6 -0
@@ -0,0 +1,217 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ import fs from "node:fs/promises";
8
+ import { injectable } from "@decohere/crucible/decorators";
9
+ import { Trace } from "@decohere/nexus/diagnostics";
10
+ import { io } from "@decohere/nexus/io";
11
+ import "../extensions/project.extensions.js";
12
+ const DEFAULT_WRITE_CONCURRENCY = 16;
13
+ export class FileWriterService {
14
+ #artifactByPath = new Map();
15
+ #warmupSignature = "";
16
+ #warmupPromise;
17
+ #initialized = false;
18
+ #pendingWrites = [];
19
+ #activeWorkers = 0;
20
+ #drainResolvers = [];
21
+ #ensuredDirs = new Set();
22
+ #ensureDirPromises = new Map();
23
+ #workerError;
24
+ async initialize() {
25
+ if (this.#initialized) {
26
+ return;
27
+ }
28
+ this.#initialized = true;
29
+ }
30
+ async warmup(projects) {
31
+ const outputDirs = this.getOutputDirs(projects);
32
+ const signature = outputDirs.join("|");
33
+ if (signature === this.#warmupSignature && this.#warmupPromise != null) {
34
+ return this.#warmupPromise;
35
+ }
36
+ this.#warmupSignature = signature;
37
+ this.#ensuredDirs.clear();
38
+ this.#ensureDirPromises.clear();
39
+ this.#workerError = undefined;
40
+ this.#warmupPromise = this.loadExistingArtifacts(outputDirs);
41
+ return this.#warmupPromise;
42
+ }
43
+ enqueueOutput(response) {
44
+ if (this.#workerError != null) {
45
+ return;
46
+ }
47
+ if (response.outcome !== "success" || response.outputPath == null) {
48
+ return;
49
+ }
50
+ this.#pendingWrites.push(response);
51
+ this.startWorkers();
52
+ }
53
+ enqueueOutputs(responses) {
54
+ for (const response of responses){
55
+ this.enqueueOutput(response);
56
+ }
57
+ }
58
+ async flush() {
59
+ if (this.#warmupPromise != null) {
60
+ await this.#warmupPromise;
61
+ }
62
+ if (this.#pendingWrites.length === 0 && this.#activeWorkers === 0) {
63
+ return;
64
+ }
65
+ await new Promise((resolve)=>{
66
+ this.#drainResolvers.push(resolve);
67
+ });
68
+ if (this.#workerError != null) {
69
+ throw this.#workerError;
70
+ }
71
+ }
72
+ getOutputDirs(projects) {
73
+ const dirs = new Set();
74
+ for (const project of projects){
75
+ for (const target of project.getForgeConfiguration().targets){
76
+ dirs.add(project.getOutDir(target));
77
+ }
78
+ }
79
+ return [
80
+ ...dirs
81
+ ].sort();
82
+ }
83
+ async loadExistingArtifacts(outputDirs) {
84
+ this.#artifactByPath.clear();
85
+ const files = [];
86
+ for (const dir of outputDirs){
87
+ files.push(...await this.collectFiles(dir));
88
+ }
89
+ await this.withConcurrency(files, this.getWriteConcurrency(), async (filePath)=>{
90
+ const content = await fs.readFile(filePath, "utf8");
91
+ this.#artifactByPath.set(filePath, content);
92
+ });
93
+ }
94
+ async collectFiles(rootDir) {
95
+ try {
96
+ const entries = await fs.readdir(rootDir, {
97
+ withFileTypes: true
98
+ });
99
+ const files = [];
100
+ for (const entry of entries){
101
+ const fullPath = `${rootDir}/${entry.name}`;
102
+ if (entry.isDirectory()) {
103
+ files.push(...await this.collectFiles(fullPath));
104
+ } else if (entry.isFile()) {
105
+ files.push(fullPath);
106
+ }
107
+ }
108
+ return files;
109
+ } catch {
110
+ return [];
111
+ }
112
+ }
113
+ getWriteConcurrency() {
114
+ const requested = Number(process.env.FORGE_WRITE_CONCURRENCY);
115
+ if (Number.isFinite(requested) && requested > 0) {
116
+ return Math.floor(requested);
117
+ }
118
+ return DEFAULT_WRITE_CONCURRENCY;
119
+ }
120
+ startWorkers() {
121
+ if (this.#workerError != null) {
122
+ return;
123
+ }
124
+ const maxWorkers = this.getWriteConcurrency();
125
+ while(this.#activeWorkers < maxWorkers && this.#pendingWrites.length > 0){
126
+ this.#activeWorkers += 1;
127
+ void this.runWorker().finally(()=>{
128
+ this.#activeWorkers -= 1;
129
+ if (this.#pendingWrites.length > 0) {
130
+ this.startWorkers();
131
+ } else if (this.#activeWorkers === 0) {
132
+ this.resolveDrain();
133
+ }
134
+ });
135
+ }
136
+ }
137
+ async runWorker() {
138
+ while(true){
139
+ const response = this.#pendingWrites.shift();
140
+ if (response == null) {
141
+ return;
142
+ }
143
+ try {
144
+ if (this.#warmupPromise != null) {
145
+ await this.#warmupPromise;
146
+ }
147
+ const outputPath = response.outputPath;
148
+ if (outputPath == null) {
149
+ continue;
150
+ }
151
+ const outputDir = response.outputDir;
152
+ if (outputDir != null) {
153
+ await this.ensureDirectory(outputDir);
154
+ }
155
+ const existing = this.#artifactByPath.get(outputPath);
156
+ if (existing === response.code) {
157
+ continue;
158
+ }
159
+ await io.writeFile(outputPath, response.code);
160
+ this.#artifactByPath.set(outputPath, response.code);
161
+ } catch (error) {
162
+ this.#workerError = error;
163
+ this.#pendingWrites = [];
164
+ return;
165
+ }
166
+ }
167
+ }
168
+ ensureDirectory(dir) {
169
+ if (this.#ensuredDirs.has(dir)) {
170
+ return Promise.resolve();
171
+ }
172
+ const existing = this.#ensureDirPromises.get(dir);
173
+ if (existing != null) {
174
+ return existing;
175
+ }
176
+ const mkdirPromise = fs.mkdir(dir, {
177
+ recursive: true
178
+ }).then(()=>{
179
+ this.#ensuredDirs.add(dir);
180
+ this.#ensureDirPromises.delete(dir);
181
+ });
182
+ this.#ensureDirPromises.set(dir, mkdirPromise);
183
+ return mkdirPromise;
184
+ }
185
+ resolveDrain() {
186
+ if (this.#pendingWrites.length > 0 || this.#activeWorkers > 0) {
187
+ return;
188
+ }
189
+ for (const resolve of this.#drainResolvers){
190
+ resolve();
191
+ }
192
+ this.#drainResolvers = [];
193
+ }
194
+ async withConcurrency(items, concurrency, worker) {
195
+ let cursor = 0;
196
+ const workerCount = Math.min(concurrency, items.length);
197
+ const workers = Array.from({
198
+ length: workerCount
199
+ }, ()=>(async ()=>{
200
+ while(true){
201
+ const index = cursor;
202
+ cursor += 1;
203
+ if (index >= items.length) {
204
+ return;
205
+ }
206
+ await worker(items[index]);
207
+ }
208
+ })());
209
+ await Promise.all(workers);
210
+ }
211
+ }
212
+ FileWriterService = _ts_decorate([
213
+ Trace,
214
+ injectable()
215
+ ], FileWriterService);
216
+
217
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvZm9yZ2Uvc3JjL3NlcnZpY2VzL2ZpbGUtd3JpdGVyLnNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IGZzIGZyb20gXCJub2RlOmZzL3Byb21pc2VzXCI7XG5pbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3QgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB7IFRyYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9kaWFnbm9zdGljc1wiO1xuaW1wb3J0IHsgaW8gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2lvXCI7XG5pbXBvcnQgXCIuLi9leHRlbnNpb25zL3Byb2plY3QuZXh0ZW5zaW9ucy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBCdWlsZFRhcmdldCB9IGZyb20gXCIuLi90eXBlcy9idWlsZC10YXJnZXQudHlwZS5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUcmFuc2Zvcm1SZXNwb25zZSB9IGZyb20gXCIuLi90eXBlcy90cmFuc2Zvcm0tcmVzcG9uc2UubW9kZWwuanNcIjtcblxuY29uc3QgREVGQVVMVF9XUklURV9DT05DVVJSRU5DWSA9IDE2O1xuXG5AVHJhY2VcbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBGaWxlV3JpdGVyU2VydmljZSB7XG5cdCNhcnRpZmFjdEJ5UGF0aCA9IG5ldyBNYXA8c3RyaW5nLCBzdHJpbmc+KCk7XG5cdCN3YXJtdXBTaWduYXR1cmUgPSBcIlwiO1xuXHQjd2FybXVwUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB8IHVuZGVmaW5lZDtcblx0I2luaXRpYWxpemVkID0gZmFsc2U7XG5cdCNwZW5kaW5nV3JpdGVzOiBUcmFuc2Zvcm1SZXNwb25zZVtdID0gW107XG5cdCNhY3RpdmVXb3JrZXJzID0gMDtcblx0I2RyYWluUmVzb2x2ZXJzOiBBcnJheTwoKSA9PiB2b2lkPiA9IFtdO1xuXHQjZW5zdXJlZERpcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0I2Vuc3VyZURpclByb21pc2VzID0gbmV3IE1hcDxzdHJpbmcsIFByb21pc2U8dm9pZD4+KCk7XG5cdCN3b3JrZXJFcnJvcjogdW5rbm93bjtcblxuXHRwdWJsaWMgYXN5bmMgaW5pdGlhbGl6ZSgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy4jaW5pdGlhbGl6ZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy4jaW5pdGlhbGl6ZWQgPSB0cnVlO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIHdhcm11cChwcm9qZWN0czogUHJvamVjdFtdKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0Y29uc3Qgb3V0cHV0RGlycyA9IHRoaXMuZ2V0T3V0cHV0RGlycyhwcm9qZWN0cyk7XG5cdFx0Y29uc3Qgc2lnbmF0dXJlID0gb3V0cHV0RGlycy5qb2luKFwifFwiKTtcblx0XHRpZiAoc2lnbmF0dXJlID09PSB0aGlzLiN3YXJtdXBTaWduYXR1cmUgJiYgdGhpcy4jd2FybXVwUHJvbWlzZSAhPSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy4jd2FybXVwUHJvbWlzZTtcblx0XHR9XG5cblx0XHR0aGlzLiN3YXJtdXBTaWduYXR1cmUgPSBzaWduYXR1cmU7XG5cdFx0dGhpcy4jZW5zdXJlZERpcnMuY2xlYXIoKTtcblx0XHR0aGlzLiNlbnN1cmVEaXJQcm9taXNlcy5jbGVhcigpO1xuXHRcdHRoaXMuI3dvcmtlckVycm9yID0gdW5kZWZpbmVkO1xuXHRcdHRoaXMuI3dhcm11cFByb21pc2UgPSB0aGlzLmxvYWRFeGlzdGluZ0FydGlmYWN0cyhvdXRwdXREaXJzKTtcblx0XHRyZXR1cm4gdGhpcy4jd2FybXVwUHJvbWlzZTtcblx0fVxuXG5cdHB1YmxpYyBlbnF1ZXVlT3V0cHV0KHJlc3BvbnNlOiBUcmFuc2Zvcm1SZXNwb25zZSk6IHZvaWQge1xuXHRcdGlmICh0aGlzLiN3b3JrZXJFcnJvciAhPSBudWxsKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChyZXNwb25zZS5vdXRjb21lICE9PSBcInN1Y2Nlc3NcIiB8fCByZXNwb25zZS5vdXRwdXRQYXRoID09IG51bGwpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy4jcGVuZGluZ1dyaXRlcy5wdXNoKHJlc3BvbnNlKTtcblx0XHR0aGlzLnN0YXJ0V29ya2VycygpO1xuXHR9XG5cblx0cHVibGljIGVucXVldWVPdXRwdXRzKHJlc3BvbnNlczogVHJhbnNmb3JtUmVzcG9uc2VbXSk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgcmVzcG9uc2VzKSB7XG5cdFx0XHR0aGlzLmVucXVldWVPdXRwdXQocmVzcG9uc2UpO1xuXHRcdH1cblx0fVxuXG5cdHB1YmxpYyBhc3luYyBmbHVzaCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy4jd2FybXVwUHJvbWlzZSAhPSBudWxsKSB7XG5cdFx0XHRhd2FpdCB0aGlzLiN3YXJtdXBQcm9taXNlO1xuXHRcdH1cblx0XHRpZiAodGhpcy4jcGVuZGluZ1dyaXRlcy5sZW5ndGggPT09IDAgJiYgdGhpcy4jYWN0aXZlV29ya2VycyA9PT0gMCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSkgPT4ge1xuXHRcdFx0dGhpcy4jZHJhaW5SZXNvbHZlcnMucHVzaChyZXNvbHZlKTtcblx0XHR9KTtcblx0XHRpZiAodGhpcy4jd29ya2VyRXJyb3IgIT0gbnVsbCkge1xuXHRcdFx0dGhyb3cgdGhpcy4jd29ya2VyRXJyb3I7XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRPdXRwdXREaXJzKHByb2plY3RzOiBQcm9qZWN0W10pOiBzdHJpbmdbXSB7XG5cdFx0Y29uc3QgZGlycyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXHRcdGZvciAoY29uc3QgcHJvamVjdCBvZiBwcm9qZWN0cykge1xuXHRcdFx0Zm9yIChjb25zdCB0YXJnZXQgb2YgcHJvamVjdC5nZXRGb3JnZUNvbmZpZ3VyYXRpb24oKS50YXJnZXRzKSB7XG5cdFx0XHRcdGRpcnMuYWRkKHByb2plY3QuZ2V0T3V0RGlyKHRhcmdldCBhcyBCdWlsZFRhcmdldCkpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXR1cm4gWy4uLmRpcnNdLnNvcnQoKTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgbG9hZEV4aXN0aW5nQXJ0aWZhY3RzKG91dHB1dERpcnM6IHN0cmluZ1tdKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0dGhpcy4jYXJ0aWZhY3RCeVBhdGguY2xlYXIoKTtcblxuXHRcdGNvbnN0IGZpbGVzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGZvciAoY29uc3QgZGlyIG9mIG91dHB1dERpcnMpIHtcblx0XHRcdGZpbGVzLnB1c2goLi4uKGF3YWl0IHRoaXMuY29sbGVjdEZpbGVzKGRpcikpKTtcblx0XHR9XG5cblx0XHRhd2FpdCB0aGlzLndpdGhDb25jdXJyZW5jeShmaWxlcywgdGhpcy5nZXRXcml0ZUNvbmN1cnJlbmN5KCksIGFzeW5jIChmaWxlUGF0aCkgPT4ge1xuXHRcdFx0Y29uc3QgY29udGVudCA9IGF3YWl0IGZzLnJlYWRGaWxlKGZpbGVQYXRoLCBcInV0ZjhcIik7XG5cdFx0XHR0aGlzLiNhcnRpZmFjdEJ5UGF0aC5zZXQoZmlsZVBhdGgsIGNvbnRlbnQpO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBjb2xsZWN0RmlsZXMocm9vdERpcjogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmdbXT4ge1xuXHRcdHRyeSB7XG5cdFx0XHRjb25zdCBlbnRyaWVzID0gYXdhaXQgZnMucmVhZGRpcihyb290RGlyLCB7IHdpdGhGaWxlVHlwZXM6IHRydWUgfSk7XG5cdFx0XHRjb25zdCBmaWxlczogc3RyaW5nW10gPSBbXTtcblx0XHRcdGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuXHRcdFx0XHRjb25zdCBmdWxsUGF0aCA9IGAke3Jvb3REaXJ9LyR7ZW50cnkubmFtZX1gO1xuXHRcdFx0XHRpZiAoZW50cnkuaXNEaXJlY3RvcnkoKSkge1xuXHRcdFx0XHRcdGZpbGVzLnB1c2goLi4uKGF3YWl0IHRoaXMuY29sbGVjdEZpbGVzKGZ1bGxQYXRoKSkpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKGVudHJ5LmlzRmlsZSgpKSB7XG5cdFx0XHRcdFx0ZmlsZXMucHVzaChmdWxsUGF0aCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHJldHVybiBmaWxlcztcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGdldFdyaXRlQ29uY3VycmVuY3koKTogbnVtYmVyIHtcblx0XHRjb25zdCByZXF1ZXN0ZWQgPSBOdW1iZXIocHJvY2Vzcy5lbnYuRk9SR0VfV1JJVEVfQ09OQ1VSUkVOQ1kpO1xuXHRcdGlmIChOdW1iZXIuaXNGaW5pdGUocmVxdWVzdGVkKSAmJiByZXF1ZXN0ZWQgPiAwKSB7XG5cdFx0XHRyZXR1cm4gTWF0aC5mbG9vcihyZXF1ZXN0ZWQpO1xuXHRcdH1cblx0XHRyZXR1cm4gREVGQVVMVF9XUklURV9DT05DVVJSRU5DWTtcblx0fVxuXG5cdHByaXZhdGUgc3RhcnRXb3JrZXJzKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLiN3b3JrZXJFcnJvciAhPSBudWxsKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IG1heFdvcmtlcnMgPSB0aGlzLmdldFdyaXRlQ29uY3VycmVuY3koKTtcblx0XHR3aGlsZSAodGhpcy4jYWN0aXZlV29ya2VycyA8IG1heFdvcmtlcnMgJiYgdGhpcy4jcGVuZGluZ1dyaXRlcy5sZW5ndGggPiAwKSB7XG5cdFx0XHR0aGlzLiNhY3RpdmVXb3JrZXJzICs9IDE7XG5cdFx0XHR2b2lkIHRoaXMucnVuV29ya2VyKCkuZmluYWxseSgoKSA9PiB7XG5cdFx0XHRcdHRoaXMuI2FjdGl2ZVdvcmtlcnMgLT0gMTtcblx0XHRcdFx0aWYgKHRoaXMuI3BlbmRpbmdXcml0ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRcdHRoaXMuc3RhcnRXb3JrZXJzKCk7XG5cdFx0XHRcdH0gZWxzZSBpZiAodGhpcy4jYWN0aXZlV29ya2VycyA9PT0gMCkge1xuXHRcdFx0XHRcdHRoaXMucmVzb2x2ZURyYWluKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgcnVuV29ya2VyKCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHdoaWxlICh0cnVlKSB7XG5cdFx0XHRjb25zdCByZXNwb25zZSA9IHRoaXMuI3BlbmRpbmdXcml0ZXMuc2hpZnQoKTtcblx0XHRcdGlmIChyZXNwb25zZSA9PSBudWxsKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dHJ5IHtcblx0XHRcdFx0aWYgKHRoaXMuI3dhcm11cFByb21pc2UgIT0gbnVsbCkge1xuXHRcdFx0XHRcdGF3YWl0IHRoaXMuI3dhcm11cFByb21pc2U7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBvdXRwdXRQYXRoID0gcmVzcG9uc2Uub3V0cHV0UGF0aDtcblx0XHRcdFx0aWYgKG91dHB1dFBhdGggPT0gbnVsbCkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3Qgb3V0cHV0RGlyID0gcmVzcG9uc2Uub3V0cHV0RGlyO1xuXHRcdFx0XHRpZiAob3V0cHV0RGlyICE9IG51bGwpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLmVuc3VyZURpcmVjdG9yeShvdXRwdXREaXIpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3QgZXhpc3RpbmcgPSB0aGlzLiNhcnRpZmFjdEJ5UGF0aC5nZXQob3V0cHV0UGF0aCk7XG5cdFx0XHRcdGlmIChleGlzdGluZyA9PT0gcmVzcG9uc2UuY29kZSkge1xuXHRcdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0YXdhaXQgaW8ud3JpdGVGaWxlKG91dHB1dFBhdGgsIHJlc3BvbnNlLmNvZGUpO1xuXHRcdFx0XHR0aGlzLiNhcnRpZmFjdEJ5UGF0aC5zZXQob3V0cHV0UGF0aCwgcmVzcG9uc2UuY29kZSk7XG5cdFx0XHR9IGNhdGNoIChlcnJvcikge1xuXHRcdFx0XHR0aGlzLiN3b3JrZXJFcnJvciA9IGVycm9yO1xuXHRcdFx0XHR0aGlzLiNwZW5kaW5nV3JpdGVzID0gW107XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGVuc3VyZURpcmVjdG9yeShkaXI6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGlmICh0aGlzLiNlbnN1cmVkRGlycy5oYXMoZGlyKSkge1xuXHRcdFx0cmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdH1cblx0XHRjb25zdCBleGlzdGluZyA9IHRoaXMuI2Vuc3VyZURpclByb21pc2VzLmdldChkaXIpO1xuXHRcdGlmIChleGlzdGluZyAhPSBudWxsKSB7XG5cdFx0XHRyZXR1cm4gZXhpc3Rpbmc7XG5cdFx0fVxuXHRcdGNvbnN0IG1rZGlyUHJvbWlzZSA9IGZzLm1rZGlyKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSkudGhlbigoKSA9PiB7XG5cdFx0XHR0aGlzLiNlbnN1cmVkRGlycy5hZGQoZGlyKTtcblx0XHRcdHRoaXMuI2Vuc3VyZURpclByb21pc2VzLmRlbGV0ZShkaXIpO1xuXHRcdH0pO1xuXHRcdHRoaXMuI2Vuc3VyZURpclByb21pc2VzLnNldChkaXIsIG1rZGlyUHJvbWlzZSk7XG5cdFx0cmV0dXJuIG1rZGlyUHJvbWlzZTtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZURyYWluKCk6IHZvaWQge1xuXHRcdGlmICh0aGlzLiNwZW5kaW5nV3JpdGVzLmxlbmd0aCA+IDAgfHwgdGhpcy4jYWN0aXZlV29ya2VycyA+IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Zm9yIChjb25zdCByZXNvbHZlIG9mIHRoaXMuI2RyYWluUmVzb2x2ZXJzKSB7XG5cdFx0XHRyZXNvbHZlKCk7XG5cdFx0fVxuXHRcdHRoaXMuI2RyYWluUmVzb2x2ZXJzID0gW107XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHdpdGhDb25jdXJyZW5jeTxUPihcblx0XHRpdGVtczogVFtdLFxuXHRcdGNvbmN1cnJlbmN5OiBudW1iZXIsXG5cdFx0d29ya2VyOiAoaXRlbTogVCkgPT4gUHJvbWlzZTx2b2lkPixcblx0KTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0bGV0IGN1cnNvciA9IDA7XG5cdFx0Y29uc3Qgd29ya2VyQ291bnQgPSBNYXRoLm1pbihjb25jdXJyZW5jeSwgaXRlbXMubGVuZ3RoKTtcblx0XHRjb25zdCB3b3JrZXJzID0gQXJyYXkuZnJvbSh7IGxlbmd0aDogd29ya2VyQ291bnQgfSwgKCkgPT5cblx0XHRcdChhc3luYyAoKSA9PiB7XG5cdFx0XHRcdHdoaWxlICh0cnVlKSB7XG5cdFx0XHRcdFx0Y29uc3QgaW5kZXggPSBjdXJzb3I7XG5cdFx0XHRcdFx0Y3Vyc29yICs9IDE7XG5cdFx0XHRcdFx0aWYgKGluZGV4ID49IGl0ZW1zLmxlbmd0aCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRhd2FpdCB3b3JrZXIoaXRlbXNbaW5kZXhdKTtcblx0XHRcdFx0fVxuXHRcdFx0fSkoKSxcblx0XHQpO1xuXHRcdGF3YWl0IFByb21pc2UuYWxsKHdvcmtlcnMpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiZnMiLCJpbmplY3RhYmxlIiwiVHJhY2UiLCJpbyIsIkRFRkFVTFRfV1JJVEVfQ09OQ1VSUkVOQ1kiLCJGaWxlV3JpdGVyU2VydmljZSIsIk1hcCIsIlNldCIsImluaXRpYWxpemUiLCJ3YXJtdXAiLCJwcm9qZWN0cyIsIm91dHB1dERpcnMiLCJnZXRPdXRwdXREaXJzIiwic2lnbmF0dXJlIiwiam9pbiIsImNsZWFyIiwidW5kZWZpbmVkIiwibG9hZEV4aXN0aW5nQXJ0aWZhY3RzIiwiZW5xdWV1ZU91dHB1dCIsInJlc3BvbnNlIiwib3V0Y29tZSIsIm91dHB1dFBhdGgiLCJwdXNoIiwic3RhcnRXb3JrZXJzIiwiZW5xdWV1ZU91dHB1dHMiLCJyZXNwb25zZXMiLCJmbHVzaCIsImxlbmd0aCIsIlByb21pc2UiLCJyZXNvbHZlIiwiZGlycyIsInByb2plY3QiLCJ0YXJnZXQiLCJnZXRGb3JnZUNvbmZpZ3VyYXRpb24iLCJ0YXJnZXRzIiwiYWRkIiwiZ2V0T3V0RGlyIiwic29ydCIsImZpbGVzIiwiZGlyIiwiY29sbGVjdEZpbGVzIiwid2l0aENvbmN1cnJlbmN5IiwiZ2V0V3JpdGVDb25jdXJyZW5jeSIsImZpbGVQYXRoIiwiY29udGVudCIsInJlYWRGaWxlIiwic2V0Iiwicm9vdERpciIsImVudHJpZXMiLCJyZWFkZGlyIiwid2l0aEZpbGVUeXBlcyIsImVudHJ5IiwiZnVsbFBhdGgiLCJuYW1lIiwiaXNEaXJlY3RvcnkiLCJpc0ZpbGUiLCJyZXF1ZXN0ZWQiLCJOdW1iZXIiLCJwcm9jZXNzIiwiZW52IiwiRk9SR0VfV1JJVEVfQ09OQ1VSUkVOQ1kiLCJpc0Zpbml0ZSIsIk1hdGgiLCJmbG9vciIsIm1heFdvcmtlcnMiLCJydW5Xb3JrZXIiLCJmaW5hbGx5IiwicmVzb2x2ZURyYWluIiwic2hpZnQiLCJvdXRwdXREaXIiLCJlbnN1cmVEaXJlY3RvcnkiLCJleGlzdGluZyIsImdldCIsImNvZGUiLCJ3cml0ZUZpbGUiLCJlcnJvciIsImhhcyIsIm1rZGlyUHJvbWlzZSIsIm1rZGlyIiwicmVjdXJzaXZlIiwidGhlbiIsImRlbGV0ZSIsIml0ZW1zIiwiY29uY3VycmVuY3kiLCJ3b3JrZXIiLCJjdXJzb3IiLCJ3b3JrZXJDb3VudCIsIm1pbiIsIndvcmtlcnMiLCJBcnJheSIsImZyb20iLCJpbmRleCIsImFsbCJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsT0FBT0EsUUFBUSxtQkFBbUI7QUFDbEMsU0FBU0MsVUFBVSxRQUFRLGdDQUFnQztBQUUzRCxTQUFTQyxLQUFLLFFBQVEsOEJBQThCO0FBQ3BELFNBQVNDLEVBQUUsUUFBUSxxQkFBcUI7QUFD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
@@ -0,0 +1,161 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ function _ts_metadata(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ }
10
+ import path from "node:path";
11
+ import { cache, invalidateCache } from "@decohere/nexus/caching";
12
+ import { Trace } from "@decohere/nexus/diagnostics";
13
+ import { mixwith } from "@decohere/nexus/extensibility";
14
+ import { io } from "@decohere/nexus/io";
15
+ import { transform } from "@swc/core";
16
+ import { BuildTargets } from "../types/build-target.type.js";
17
+ import "../extensions/project.extensions.js";
18
+ import { SwcConfigFactory } from "../factories/swc-config.factory.js";
19
+ import { CachesOutputs } from "../mixins/caches-outputs.mixin.js";
20
+ import { IncrementalTransform } from "../mixins/incremental-transform.mixin.js";
21
+ import { TransformResponse } from "../types/transform-response.model.js";
22
+ export class SwcTranspiler extends mixwith(CachesOutputs, IncrementalTransform) {
23
+ buildTargets = [
24
+ BuildTargets.es6,
25
+ BuildTargets.commonjs
26
+ ];
27
+ #swcConfigFactory = new SwcConfigFactory();
28
+ async transformProject(projectArrayLike, fileFilter, onOutput) {
29
+ const projects = Array.isArray(projectArrayLike) ? projectArrayLike : [
30
+ projectArrayLike
31
+ ];
32
+ const responses = await Promise.all(projects.map(async (project)=>{
33
+ const { targets, aliasPaths } = project.getForgeConfiguration();
34
+ const transpileTargets = targets.filter((bt)=>bt !== BuildTargets.types);
35
+ if (transpileTargets.length === 0) {
36
+ return [];
37
+ }
38
+ const sourceFiles = await (fileFilter?.(project) ?? project.getAllFiles());
39
+ const tsConfig = await project.getTsConfig();
40
+ const userConfig = await project.getSwcConfig();
41
+ const responses = await Promise.all(transpileTargets.map((target)=>{
42
+ return this.transformTarget(sourceFiles, target, {
43
+ tsConfig,
44
+ userConfig,
45
+ aliasPaths
46
+ }, project, onOutput);
47
+ }));
48
+ return responses.flat();
49
+ }));
50
+ const flat = responses.flat();
51
+ this.cacheOutputs(flat);
52
+ return flat;
53
+ }
54
+ async transformFile(fileArrayLike, buildTarget, options = {}) {
55
+ const files = Array.isArray(fileArrayLike) ? fileArrayLike : [
56
+ fileArrayLike
57
+ ];
58
+ const responses = this.transformTarget(files, buildTarget, options);
59
+ return responses;
60
+ }
61
+ async transformTarget(files, buildTarget, options, project, onOutput) {
62
+ const baseConfig = this.#swcConfigFactory.createBaseConfig(buildTarget, options ?? {});
63
+ return await Promise.all(files.map((file)=>{
64
+ const swcOptions = this.#swcConfigFactory.createFileConfig(file, baseConfig);
65
+ return this.runTransform(file, buildTarget, swcOptions, project, onOutput);
66
+ }));
67
+ }
68
+ async runTransform(file, target, swcOptions, project, onOutput) {
69
+ const content = await this.getFileContent(file);
70
+ if (content === "") {
71
+ const skipped = TransformResponse.Skipped({
72
+ file,
73
+ messages: "File is empty",
74
+ config: swcOptions,
75
+ project
76
+ });
77
+ onOutput?.(skipped);
78
+ return skipped;
79
+ }
80
+ try {
81
+ const filePath = file.relativePath;
82
+ const extName = path.extname(filePath);
83
+ const fileName = filePath.replace(new RegExp(`${extName}$`), ".js");
84
+ const outBaseDir = project?.getOutDir(target);
85
+ const outputPath = outBaseDir ? path.join(outBaseDir, fileName) : undefined;
86
+ const outputDir = outputPath ? path.dirname(outputPath) : undefined;
87
+ const transformed = await transform(content, swcOptions);
88
+ if (transformed == null) {
89
+ throw new Error("swc.transform returned no result");
90
+ }
91
+ const success = TransformResponse.Success({
92
+ file,
93
+ code: transformed.code,
94
+ target,
95
+ fileName,
96
+ outputDir,
97
+ outputPath,
98
+ config: swcOptions,
99
+ project
100
+ });
101
+ onOutput?.(success);
102
+ return success;
103
+ } catch (error) {
104
+ const failure = TransformResponse.Error({
105
+ file,
106
+ messages: [
107
+ String(error)
108
+ ],
109
+ config: swcOptions,
110
+ project
111
+ });
112
+ onOutput?.(failure);
113
+ return failure;
114
+ }
115
+ }
116
+ async onIncrementalFileEvent(evt) {
117
+ const { file, project } = evt;
118
+ if (evt.eventName === io.WatchEvents.unlink) {
119
+ this.deleteCachedOutputs(file.fullPath);
120
+ return [];
121
+ }
122
+ if (!project.isSourceFile(file)) {
123
+ return [];
124
+ }
125
+ this.invalidateContentCache(file);
126
+ return this.transformProject(project, ()=>Promise.resolve([
127
+ file
128
+ ]));
129
+ }
130
+ invalidateContentCache(_file) {}
131
+ getFileContent(file) {
132
+ return file.getContent();
133
+ }
134
+ }
135
+ _ts_decorate([
136
+ invalidateCache(SwcTranspiler.prototype.getFileContent, {
137
+ name: "FILE_CONTENT",
138
+ keyFn: (...args)=>args[0].fullPath
139
+ }),
140
+ _ts_metadata("design:type", Function),
141
+ _ts_metadata("design:paramtypes", [
142
+ typeof FileEx === "undefined" ? Object : FileEx
143
+ ]),
144
+ _ts_metadata("design:returntype", void 0)
145
+ ], SwcTranspiler.prototype, "invalidateContentCache", null);
146
+ _ts_decorate([
147
+ cache({
148
+ name: "FILE_CONTENT",
149
+ keyFn: (...args)=>args[0].fullPath
150
+ }),
151
+ _ts_metadata("design:type", Function),
152
+ _ts_metadata("design:paramtypes", [
153
+ typeof FileEx === "undefined" ? Object : FileEx
154
+ ]),
155
+ _ts_metadata("design:returntype", typeof Promise === "undefined" ? Object : Promise)
156
+ ], SwcTranspiler.prototype, "getFileContent", null);
157
+ SwcTranspiler = _ts_decorate([
158
+ Trace
159
+ ], SwcTranspiler);
160
+
161
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvZm9yZ2Uvc3JjL3NlcnZpY2VzL3N3Yy10cmFuc3BpbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB0eXBlIHsgUHJvamVjdCB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgY2FjaGUsIGludmFsaWRhdGVDYWNoZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2FjaGluZ1wiO1xuaW1wb3J0IHsgVHJhY2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2RpYWdub3N0aWNzXCI7XG5pbXBvcnQgeyBtaXh3aXRoIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9leHRlbnNpYmlsaXR5XCI7XG5pbXBvcnQgdHlwZSB7IEZpbGVFeCB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IGlvIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9pb1wiO1xuaW1wb3J0IHsgdHlwZSBPcHRpb25zLCB0cmFuc2Zvcm0gfSBmcm9tIFwiQHN3Yy9jb3JlXCI7XG5pbXBvcnQge1xuXHR0eXBlIEJ1aWxkVGFyZ2V0LFxuXHRCdWlsZFRhcmdldHMsXG5cdHR5cGUgVHJhbnNwaWxlVGFyZ2V0LFxufSBmcm9tIFwiLi4vdHlwZXMvYnVpbGQtdGFyZ2V0LnR5cGUuanNcIjtcbmltcG9ydCBcIi4uL2V4dGVuc2lvbnMvcHJvamVjdC5leHRlbnNpb25zLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFByb2plY3RGaWxlRXZlbnQsIFRzY29uZmlnIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBTd2NDb25maWdGYWN0b3J5IH0gZnJvbSBcIi4uL2ZhY3Rvcmllcy9zd2MtY29uZmlnLmZhY3RvcnkuanNcIjtcbmltcG9ydCB7IENhY2hlc091dHB1dHMgfSBmcm9tIFwiLi4vbWl4aW5zL2NhY2hlcy1vdXRwdXRzLm1peGluLmpzXCI7XG5pbXBvcnQgeyBJbmNyZW1lbnRhbFRyYW5zZm9ybSB9IGZyb20gXCIuLi9taXhpbnMvaW5jcmVtZW50YWwtdHJhbnNmb3JtLm1peGluLmpzXCI7XG5pbXBvcnQgdHlwZSB7IFN3Y0NvbmZpZyB9IGZyb20gXCIuLi90eXBlcy9zd2MtY29uZmlnLnR5cGUuanNcIjtcbmltcG9ydCB7IFRyYW5zZm9ybVJlc3BvbnNlIH0gZnJvbSBcIi4uL3R5cGVzL3RyYW5zZm9ybS1yZXNwb25zZS5tb2RlbC5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUcmFuc2Zvcm1lciB9IGZyb20gXCIuLi90eXBlcy90cmFuc2Zvcm1lci50eXBlLmpzXCI7XG5cbmV4cG9ydCB0eXBlIFRyYW5zcGlsZU9wdGlvbnMgPSB7XG5cdGFsaWFzUGF0aHM/OiBib29sZWFuO1xuXHR0c0NvbmZpZz86IFRzY29uZmlnO1xuXHR1c2VyQ29uZmlnPzogU3djQ29uZmlnO1xufTtcblxuQFRyYWNlXG5leHBvcnQgY2xhc3MgU3djVHJhbnNwaWxlclxuXHRleHRlbmRzIG1peHdpdGgoQ2FjaGVzT3V0cHV0cywgSW5jcmVtZW50YWxUcmFuc2Zvcm0pXG5cdGltcGxlbWVudHMgVHJhbnNmb3JtZXJcbntcblx0cHVibGljIGJ1aWxkVGFyZ2V0czogQnVpbGRUYXJnZXRbXSA9IFtCdWlsZFRhcmdldHMuZXM2LCBCdWlsZFRhcmdldHMuY29tbW9uanNdO1xuXHQjc3djQ29uZmlnRmFjdG9yeSA9IG5ldyBTd2NDb25maWdGYWN0b3J5KCk7XG5cblx0cHVibGljIGFzeW5jIHRyYW5zZm9ybVByb2plY3QoXG5cdFx0cHJvamVjdEFycmF5TGlrZTogUHJvamVjdCB8IFByb2plY3RbXSxcblx0XHRmaWxlRmlsdGVyPzogKHByb2plY3Q6IFByb2plY3QpID0+IFByb21pc2U8RmlsZUV4W10+LFxuXHRcdG9uT3V0cHV0PzogKHJlc3BvbnNlOiBUcmFuc2Zvcm1SZXNwb25zZSkgPT4gdm9pZCxcblx0KTogUHJvbWlzZTxUcmFuc2Zvcm1SZXNwb25zZVtdPiB7XG5cdFx0Y29uc3QgcHJvamVjdHMgPSBBcnJheS5pc0FycmF5KHByb2plY3RBcnJheUxpa2UpID8gcHJvamVjdEFycmF5TGlrZSA6IFtwcm9qZWN0QXJyYXlMaWtlXTtcblx0XHRjb25zdCByZXNwb25zZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdHByb2plY3RzLm1hcChhc3luYyAocHJvamVjdCkgPT4ge1xuXHRcdFx0XHRjb25zdCB7IHRhcmdldHMsIGFsaWFzUGF0aHMgfSA9IHByb2plY3QuZ2V0Rm9yZ2VDb25maWd1cmF0aW9uKCk7XG5cdFx0XHRcdGNvbnN0IHRyYW5zcGlsZVRhcmdldHMgPSB0YXJnZXRzLmZpbHRlcigoYnQpID0+IGJ0ICE9PSBCdWlsZFRhcmdldHMudHlwZXMpO1xuXHRcdFx0XHRpZiAodHJhbnNwaWxlVGFyZ2V0cy5sZW5ndGggPT09IDApIHtcblx0XHRcdFx0XHRyZXR1cm4gW107XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRjb25zdCBzb3VyY2VGaWxlcyA9IGF3YWl0IChmaWxlRmlsdGVyPy4ocHJvamVjdCkgPz8gcHJvamVjdC5nZXRBbGxGaWxlcygpKTtcblx0XHRcdFx0Y29uc3QgdHNDb25maWcgPSBhd2FpdCBwcm9qZWN0LmdldFRzQ29uZmlnKCk7XG5cdFx0XHRcdGNvbnN0IHVzZXJDb25maWcgPSBhd2FpdCBwcm9qZWN0LmdldFN3Y0NvbmZpZygpO1xuXHRcdFx0XHRjb25zdCByZXNwb25zZXMgPSBhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdFx0XHR0cmFuc3BpbGVUYXJnZXRzLm1hcCgodGFyZ2V0KSA9PiB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gdGhpcy50cmFuc2Zvcm1UYXJnZXQoXG5cdFx0XHRcdFx0XHRcdHNvdXJjZUZpbGVzLFxuXHRcdFx0XHRcdFx0XHR0YXJnZXQsXG5cdFx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0XHR0c0NvbmZpZyxcblx0XHRcdFx0XHRcdFx0XHR1c2VyQ29uZmlnLFxuXHRcdFx0XHRcdFx0XHRcdGFsaWFzUGF0aHMsXG5cdFx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XHRcdHByb2plY3QsXG5cdFx0XHRcdFx0XHRcdG9uT3V0cHV0LFxuXHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHR9KSxcblx0XHRcdFx0KTtcblx0XHRcdFx0cmV0dXJuIHJlc3BvbnNlcy5mbGF0KCk7XG5cdFx0XHR9KSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgZmxhdCA9IHJlc3BvbnNlcy5mbGF0KCk7XG5cdFx0dGhpcy5jYWNoZU91dHB1dHMoZmxhdCk7XG5cdFx0cmV0dXJuIGZsYXQ7XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgdHJhbnNmb3JtRmlsZShcblx0XHRmaWxlQXJyYXlMaWtlOiBGaWxlRXhbXSB8IEZpbGVFeCxcblx0XHRidWlsZFRhcmdldDogVHJhbnNwaWxlVGFyZ2V0LFxuXHRcdG9wdGlvbnM6IFRyYW5zcGlsZU9wdGlvbnMgPSB7fSxcblx0KSB7XG5cdFx0Y29uc3QgZmlsZXMgPSBBcnJheS5pc0FycmF5KGZpbGVBcnJheUxpa2UpID8gZmlsZUFycmF5TGlrZSA6IFtmaWxlQXJyYXlMaWtlXTtcblx0XHRjb25zdCByZXNwb25zZXMgPSB0aGlzLnRyYW5zZm9ybVRhcmdldChmaWxlcywgYnVpbGRUYXJnZXQsIG9wdGlvbnMpO1xuXHRcdHJldHVybiByZXNwb25zZXM7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHRyYW5zZm9ybVRhcmdldChcblx0XHRmaWxlczogRmlsZUV4W10sXG5cdFx0YnVpbGRUYXJnZXQ6IFRyYW5zcGlsZVRhcmdldCxcblx0XHRvcHRpb25zPzogVHJhbnNwaWxlT3B0aW9ucyxcblx0XHRwcm9qZWN0PzogUHJvamVjdCxcblx0XHRvbk91dHB1dD86IChyZXNwb25zZTogVHJhbnNmb3JtUmVzcG9uc2UpID0+IHZvaWQsXG5cdCkge1xuXHRcdGNvbnN0IGJhc2VDb25maWcgPSB0aGlzLiNzd2NDb25maWdGYWN0b3J5LmNyZWF0ZUJhc2VDb25maWcoYnVpbGRUYXJnZXQsIG9wdGlvbnMgPz8ge30pO1xuXHRcdHJldHVybiBhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdGZpbGVzLm1hcCgoZmlsZSkgPT4ge1xuXHRcdFx0XHRjb25zdCBzd2NPcHRpb25zID0gdGhpcy4jc3djQ29uZmlnRmFjdG9yeS5jcmVhdGVGaWxlQ29uZmlnKGZpbGUsIGJhc2VDb25maWcpO1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5ydW5UcmFuc2Zvcm0oZmlsZSwgYnVpbGRUYXJnZXQsIHN3Y09wdGlvbnMsIHByb2plY3QsIG9uT3V0cHV0KTtcblx0XHRcdH0pLFxuXHRcdCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHJ1blRyYW5zZm9ybShcblx0XHRmaWxlOiBGaWxlRXgsXG5cdFx0dGFyZ2V0OiBCdWlsZFRhcmdldCxcblx0XHRzd2NPcHRpb25zOiBPcHRpb25zLFxuXHRcdHByb2plY3Q/OiBQcm9qZWN0LFxuXHRcdG9uT3V0cHV0PzogKHJlc3BvbnNlOiBUcmFuc2Zvcm1SZXNwb25zZSkgPT4gdm9pZCxcblx0KTogUHJvbWlzZTxUcmFuc2Zvcm1SZXNwb25zZT4ge1xuXHRcdGNvbnN0IGNvbnRlbnQgPSBhd2FpdCB0aGlzLmdldEZpbGVDb250ZW50KGZpbGUpO1xuXHRcdGlmIChjb250ZW50ID09PSBcIlwiKSB7XG5cdFx0XHRjb25zdCBza2lwcGVkID0gVHJhbnNmb3JtUmVzcG9uc2UuU2tpcHBlZCh7XG5cdFx0XHRcdGZpbGUsXG5cdFx0XHRcdG1lc3NhZ2VzOiBcIkZpbGUgaXMgZW1wdHlcIixcblx0XHRcdFx0Y29uZmlnOiBzd2NPcHRpb25zLFxuXHRcdFx0XHRwcm9qZWN0LFxuXHRcdFx0fSk7XG5cdFx0XHRvbk91dHB1dD8uKHNraXBwZWQpO1xuXHRcdFx0cmV0dXJuIHNraXBwZWQ7XG5cdFx0fVxuXG5cdFx0dHJ5IHtcblx0XHRcdGNvbnN0IGZpbGVQYXRoID0gZmlsZS5yZWxhdGl2ZVBhdGg7XG5cdFx0XHRjb25zdCBleHROYW1lID0gcGF0aC5leHRuYW1lKGZpbGVQYXRoKTtcblx0XHRcdGNvbnN0IGZpbGVOYW1lID0gZmlsZVBhdGgucmVwbGFjZShuZXcgUmVnRXhwKGAke2V4dE5hbWV9JGApLCBcIi5qc1wiKTtcblx0XHRcdGNvbnN0IG91dEJhc2VEaXIgPSBwcm9qZWN0Py5nZXRPdXREaXIodGFyZ2V0KTtcblx0XHRcdGNvbnN0IG91dHB1dFBhdGggPSBvdXRCYXNlRGlyID8gcGF0aC5qb2luKG91dEJhc2VEaXIsIGZpbGVOYW1lKSA6IHVuZGVmaW5lZDtcblx0XHRcdGNvbnN0IG91dHB1dERpciA9IG91dHB1dFBhdGggPyBwYXRoLmRpcm5hbWUob3V0cHV0UGF0aCkgOiB1bmRlZmluZWQ7XG5cdFx0XHRjb25zdCB0cmFuc2Zvcm1lZCA9IGF3YWl0IHRyYW5zZm9ybShjb250ZW50LCBzd2NPcHRpb25zKTtcblx0XHRcdGlmICh0cmFuc2Zvcm1lZCA9PSBudWxsKSB7XG5cdFx0XHRcdHRocm93IG5ldyBFcnJvcihcInN3Yy50cmFuc2Zvcm0gcmV0dXJuZWQgbm8gcmVzdWx0XCIpO1xuXHRcdFx0fVxuXG5cdFx0XHRjb25zdCBzdWNjZXNzID0gVHJhbnNmb3JtUmVzcG9uc2UuU3VjY2Vzcyh7XG5cdFx0XHRcdGZpbGUsXG5cdFx0XHRcdGNvZGU6IHRyYW5zZm9ybWVkLmNvZGUsXG5cdFx0XHRcdHRhcmdldCxcblx0XHRcdFx0ZmlsZU5hbWUsXG5cdFx0XHRcdG91dHB1dERpcixcblx0XHRcdFx0b3V0cHV0UGF0aCxcblx0XHRcdFx0Y29uZmlnOiBzd2NPcHRpb25zLFxuXHRcdFx0XHRwcm9qZWN0LFxuXHRcdFx0fSk7XG5cdFx0XHRvbk91dHB1dD8uKHN1Y2Nlc3MpO1xuXHRcdFx0cmV0dXJuIHN1Y2Nlc3M7XG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdGNvbnN0IGZhaWx1cmUgPSBUcmFuc2Zvcm1SZXNwb25zZS5FcnJvcih7XG5cdFx0XHRcdGZpbGUsXG5cdFx0XHRcdG1lc3NhZ2VzOiBbU3RyaW5nKGVycm9yKV0sXG5cdFx0XHRcdGNvbmZpZzogc3djT3B0aW9ucyxcblx0XHRcdFx0cHJvamVjdCxcblx0XHRcdH0pO1xuXHRcdFx0b25PdXRwdXQ/LihmYWlsdXJlKTtcblx0XHRcdHJldHVybiBmYWlsdXJlO1xuXHRcdH1cblx0fVxuXG5cdHByb3RlY3RlZCBhc3luYyBvbkluY3JlbWVudGFsRmlsZUV2ZW50KGV2dDogUHJvamVjdEZpbGVFdmVudCk6IFByb21pc2U8VHJhbnNmb3JtUmVzcG9uc2VbXT4ge1xuXHRcdGNvbnN0IHsgZmlsZSwgcHJvamVjdCB9ID0gZXZ0O1xuXHRcdGlmIChldnQuZXZlbnROYW1lID09PSBpby5XYXRjaEV2ZW50cy51bmxpbmspIHtcblx0XHRcdHRoaXMuZGVsZXRlQ2FjaGVkT3V0cHV0cyhmaWxlLmZ1bGxQYXRoKTtcblx0XHRcdHJldHVybiBbXTtcblx0XHR9XG5cdFx0aWYgKCFwcm9qZWN0LmlzU291cmNlRmlsZShmaWxlKSkge1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblx0XHR0aGlzLmludmFsaWRhdGVDb250ZW50Q2FjaGUoZmlsZSk7XG5cdFx0cmV0dXJuIHRoaXMudHJhbnNmb3JtUHJvamVjdChwcm9qZWN0LCAoKSA9PiBQcm9taXNlLnJlc29sdmUoW2ZpbGVdKSk7XG5cdH1cblxuXHRAaW52YWxpZGF0ZUNhY2hlKFN3Y1RyYW5zcGlsZXIucHJvdG90eXBlLmdldEZpbGVDb250ZW50LCB7XG5cdFx0bmFtZTogXCJGSUxFX0NPTlRFTlRcIixcblx0XHRrZXlGbjogKC4uLmFyZ3MpID0+IChhcmdzWzBdIGFzIEZpbGVFeCkuZnVsbFBhdGgsXG5cdH0pXG5cdHB1YmxpYyBpbnZhbGlkYXRlQ29udGVudENhY2hlKF9maWxlOiBGaWxlRXgpOiB2b2lkIHt9XG5cblx0QGNhY2hlKHsgbmFtZTogXCJGSUxFX0NPTlRFTlRcIiwga2V5Rm46ICguLi5hcmdzKSA9PiAoYXJnc1swXSBhcyBGaWxlRXgpLmZ1bGxQYXRoIH0pXG5cdHByaXZhdGUgZ2V0RmlsZUNvbnRlbnQoZmlsZTogRmlsZUV4KTogUHJvbWlzZTxzdHJpbmc+IHtcblx0XHRyZXR1cm4gZmlsZS5nZXRDb250ZW50KCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJwYXRoIiwiY2FjaGUiLCJpbnZhbGlkYXRlQ2FjaGUiLCJUcmFjZSIsIm1peHdpdGgiLCJpbyIsInRyYW5zZm9ybSIsIkJ1aWxkVGFyZ2V0cyIsIlN3Y0NvbmZpZ0ZhY3RvcnkiLCJDYWNoZXNPdXRwdXRzIiwiSW5jcmVtZW50YWxUcmFuc2Zvcm0iLCJUcmFuc2Zvcm1SZXNwb25zZSIsIlN3Y1RyYW5zcGlsZXIiLCJidWlsZFRhcmdldHMiLCJlczYiLCJjb21tb25qcyIsInRyYW5zZm9ybVByb2plY3QiLCJwcm9qZWN0QXJyYXlMaWtlIiwiZmlsZUZpbHRlciIsIm9uT3V0cHV0IiwicHJvamVjdHMiLCJBcnJheSIsImlzQXJyYXkiLCJyZXNwb25zZXMiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwicHJvamVjdCIsInRhcmdldHMiLCJhbGlhc1BhdGhzIiwiZ2V0Rm9yZ2VDb25maWd1cmF0aW9uIiwidHJhbnNwaWxlVGFyZ2V0cyIsImZpbHRlciIsImJ0IiwidHlwZXMiLCJsZW5ndGgiLCJzb3VyY2VGaWxlcyIsImdldEFsbEZpbGVzIiwidHNDb25maWciLCJnZXRUc0NvbmZpZyIsInVzZXJDb25maWciLCJnZXRTd2NDb25maWciLCJ0YXJnZXQiLCJ0cmFuc2Zvcm1UYXJnZXQiLCJmbGF0IiwiY2FjaGVPdXRwdXRzIiwidHJhbnNmb3JtRmlsZSIsImZpbGVBcnJheUxpa2UiLCJidWlsZFRhcmdldCIsIm9wdGlvbnMiLCJmaWxlcyIsImJhc2VDb25maWciLCJjcmVhdGVCYXNlQ29uZmlnIiwiZmlsZSIsInN3Y09wdGlvbnMiLCJjcmVhdGVGaWxlQ29uZmlnIiwicnVuVHJhbnNmb3JtIiwiY29udGVudCIsImdldEZpbGVDb250ZW50Iiwic2tpcHBlZCIsIlNraXBwZWQiLCJtZXNzYWdlcyIsImNvbmZpZyIsImZpbGVQYXRoIiwicmVsYXRpdmVQYXRoIiwiZXh0TmFtZSIsImV4dG5hbWUiLCJmaWxlTmFtZSIsInJlcGxhY2UiLCJSZWdFeHAiLCJvdXRCYXNlRGlyIiwiZ2V0T3V0RGlyIiwib3V0cHV0UGF0aCIsImpvaW4iLCJ1bmRlZmluZWQiLCJvdXRwdXREaXIiLCJkaXJuYW1lIiwidHJhbnNmb3JtZWQiLCJFcnJvciIsInN1Y2Nlc3MiLCJTdWNjZXNzIiwiY29kZSIsImVycm9yIiwiZmFpbHVyZSIsIlN0cmluZyIsIm9uSW5jcmVtZW50YWxGaWxlRXZlbnQiLCJldnQiLCJldmVudE5hbWUiLCJXYXRjaEV2ZW50cyIsInVubGluayIsImRlbGV0ZUNhY2hlZE91dHB1dHMiLCJmdWxsUGF0aCIsImlzU291cmNlRmlsZSIsImludmFsaWRhdGVDb250ZW50Q2FjaGUiLCJyZXNvbHZlIiwiX2ZpbGUiLCJnZXRDb250ZW50IiwicHJvdG90eXBlIiwibmFtZSIsImtleUZuIiwiYXJncyJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBT0EsVUFBVSxZQUFZO0FBRTdCLFNBQVNDLEtBQUssRUFBRUMsZUFBZSxRQUFRLDBCQUEwQjtBQUNqRSxTQUFTQyxLQUFLLFFBQVEsOEJBQThCO0FBQ3BELFNBQVNDLE9BQU8sUUFBUSxnQ0FBZ0M7QUFFeEQsU0FBU0MsRUFBRSxRQUFRLHFCQUFxQjtBQUN4QyxTQUF1QkMsU0FBUyxRQUFRLFlBQVk7QUFDcEQsU0FFQ0MsWUFBWSxRQUVOLGdDQUFnQztBQUN2QyxPQUFPLHNDQUFzQztBQUU3QyxTQUFTQyxnQkFBZ0IsUUFBUSxxQ0FBcUM7QUFDdEUsU0FBU0MsYUFBYSxRQUFRLG9DQUFvQztBQUNsRSxTQUFTQyxvQkFBb0IsUUFBUSwyQ0FBMkM7QUFFaEYsU0FBU0MsaUJBQWlCLFFBQVEsdUNBQXVDO0FBVXpFLE9BQU8sTUFBTUMsc0JBQ0pSLFFBQVFLLGVBQWVDO0lBR3hCRyxlQUE4QjtRQUFDTixhQUFhTyxHQUFHO1FBQUVQLGFBQWFRLFFBQVE7S0FBQyxDQUFDO0lBQy9FLENBQUEsZ0JBQWlCLEdBQUcsSUFBSVAsbUJBQW1CO0lBRTNDLE1BQWFRLGlCQUNaQyxnQkFBcUMsRUFDckNDLFVBQW9ELEVBQ3BEQyxRQUFnRCxFQUNqQjtRQUMv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
@@ -0,0 +1,120 @@
1
+ function _ts_decorate(decorators, target, key, desc) {
2
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
3
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
4
+ else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
5
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
6
+ }
7
+ function _ts_metadata(k, v) {
8
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
9
+ }
10
+ import fs from "node:fs";
11
+ import { cache } from "@decohere/nexus/caching";
12
+ import { Trace } from "@decohere/nexus/diagnostics";
13
+ import { createCompilerHost, createProgram } from "typescript";
14
+ import { DEFAULT_TYPE_EMITTER_OPTIONS, REQUIRED_TYPE_EMITTER_OPTIONS } from "./type-emitter.js";
15
+ export class TsProgramHost {
16
+ #invalidated = new Set();
17
+ invalidateSourceFile(fileName) {
18
+ this.#invalidated.add(fileName);
19
+ }
20
+ hasInvalidated() {
21
+ return this.#invalidated.size > 0;
22
+ }
23
+ /** Returns a stable string key for a set of compiler options that affect host behaviour. */ hostKey(opts) {
24
+ return JSON.stringify({
25
+ target: opts.target,
26
+ lib: opts.lib,
27
+ typeRoots: opts.typeRoots,
28
+ types: opts.types,
29
+ moduleResolution: opts.moduleResolution,
30
+ baseUrl: opts.baseUrl,
31
+ paths: opts.paths,
32
+ module: opts.module,
33
+ rootDir: opts.rootDir,
34
+ rootDirs: opts.rootDirs
35
+ });
36
+ }
37
+ createHost(compilerOptions) {
38
+ const host = createCompilerHost(compilerOptions);
39
+ host.fileExists = (fileName)=>this.fileExistsOnDisk(fileName);
40
+ host.readFile = (fileName)=>this.readFileFromDisk(fileName);
41
+ host.directoryExists = (directoryName)=>this.directoryExists(directoryName);
42
+ host.getDirectories = (directoryName)=>this.getDirectories(directoryName);
43
+ return host;
44
+ }
45
+ createProgram(files, compilerOptions, host, oldProgram) {
46
+ const filePaths = files.map((f)=>f.fullPath);
47
+ this.#invalidated.clear();
48
+ return createProgram(filePaths, {
49
+ ...DEFAULT_TYPE_EMITTER_OPTIONS,
50
+ ...compilerOptions,
51
+ ...REQUIRED_TYPE_EMITTER_OPTIONS
52
+ }, host, oldProgram);
53
+ }
54
+ readFileFromDisk(fileName) {
55
+ try {
56
+ return fs.readFileSync(fileName, "utf8");
57
+ } catch {
58
+ return undefined;
59
+ }
60
+ }
61
+ fileExistsOnDisk(fileName) {
62
+ return fs.existsSync(fileName);
63
+ }
64
+ directoryExists(directoryName) {
65
+ try {
66
+ return fs.statSync(directoryName).isDirectory();
67
+ } catch {
68
+ return false;
69
+ }
70
+ }
71
+ getDirectories(directoryName) {
72
+ try {
73
+ return fs.readdirSync(directoryName, {
74
+ withFileTypes: true
75
+ }).filter((entry)=>entry.isDirectory()).map((entry)=>entry.name);
76
+ } catch {
77
+ return [];
78
+ }
79
+ }
80
+ }
81
+ _ts_decorate([
82
+ cache({
83
+ name: "FILE_CONTENT",
84
+ keyFn: (...args)=>args[0]
85
+ }),
86
+ _ts_metadata("design:type", Function),
87
+ _ts_metadata("design:paramtypes", [
88
+ String
89
+ ]),
90
+ _ts_metadata("design:returntype", Object)
91
+ ], TsProgramHost.prototype, "readFileFromDisk", null);
92
+ _ts_decorate([
93
+ cache(),
94
+ _ts_metadata("design:type", Function),
95
+ _ts_metadata("design:paramtypes", [
96
+ String
97
+ ]),
98
+ _ts_metadata("design:returntype", Boolean)
99
+ ], TsProgramHost.prototype, "fileExistsOnDisk", null);
100
+ _ts_decorate([
101
+ cache(),
102
+ _ts_metadata("design:type", Function),
103
+ _ts_metadata("design:paramtypes", [
104
+ String
105
+ ]),
106
+ _ts_metadata("design:returntype", Boolean)
107
+ ], TsProgramHost.prototype, "directoryExists", null);
108
+ _ts_decorate([
109
+ cache(),
110
+ _ts_metadata("design:type", Function),
111
+ _ts_metadata("design:paramtypes", [
112
+ String
113
+ ]),
114
+ _ts_metadata("design:returntype", Array)
115
+ ], TsProgramHost.prototype, "getDirectories", null);
116
+ TsProgramHost = _ts_decorate([
117
+ Trace
118
+ ], TsProgramHost);
119
+
120
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvZm9yZ2Uvc3JjL3NlcnZpY2VzL3RzLXByb2dyYW0taG9zdC50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcIm5vZGU6ZnNcIjtcbmltcG9ydCB7IGNhY2hlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9jYWNoaW5nXCI7XG5pbXBvcnQgeyBUcmFjZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvZGlhZ25vc3RpY3NcIjtcbmltcG9ydCB0eXBlIHsgRmlsZUV4IH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9pb1wiO1xuaW1wb3J0IHR5cGUgdHMgZnJvbSBcInR5cGVzY3JpcHRcIjtcbmltcG9ydCB7IGNyZWF0ZUNvbXBpbGVySG9zdCwgY3JlYXRlUHJvZ3JhbSB9IGZyb20gXCJ0eXBlc2NyaXB0XCI7XG5pbXBvcnQge1xuXHRERUZBVUxUX1RZUEVfRU1JVFRFUl9PUFRJT05TLFxuXHRSRVFVSVJFRF9UWVBFX0VNSVRURVJfT1BUSU9OUyxcbn0gZnJvbSBcIi4uL3NlcnZpY2VzL3R5cGUtZW1pdHRlci5qc1wiO1xuXG4vKipcbiAqIFdyYXBzIGEgVHlwZVNjcmlwdCBDb21waWxlckhvc3Qgd2l0aCBjYWNoZWQgZmlsZS1zeXN0ZW0gY2FsbHMgc28gdGhhdFxuICogcmVwZWF0ZWQgcmVhZHMgZHVyaW5nIGEgc2luZ2xlIGJ1aWxkIGRvIG5vdCBoaXQgdGhlIGRpc2sgbXVsdGlwbGUgdGltZXMuXG4gKlxuICogU2VwYXJhdGluZyB0aGlzIGZyb20gVHlwZUVtaXR0ZXIga2VlcHMgdGhlIHRyYW5zZm9ybWVyIGxvZ2ljIHJlYWRhYmxlIGFuZFxuICogbGV0cyB0aGUgY2FjaGluZy9wcm9ncmFtLWNyZWF0aW9uIGNvbmNlcm5zIGxpdmUgaW4gb25lIGZvY3VzZWQgcGxhY2UuXG4gKi9cbkBUcmFjZVxuZXhwb3J0IGNsYXNzIFRzUHJvZ3JhbUhvc3Qge1xuXHQjaW52YWxpZGF0ZWQgPSBuZXcgU2V0PHN0cmluZz4oKTtcblxuXHRwdWJsaWMgaW52YWxpZGF0ZVNvdXJjZUZpbGUoZmlsZU5hbWU6IHN0cmluZyk6IHZvaWQge1xuXHRcdHRoaXMuI2ludmFsaWRhdGVkLmFkZChmaWxlTmFtZSk7XG5cdH1cblxuXHRwdWJsaWMgaGFzSW52YWxpZGF0ZWQoKTogYm9vbGVhbiB7XG5cdFx0cmV0dXJuIHRoaXMuI2ludmFsaWRhdGVkLnNpemUgPiAwO1xuXHR9XG5cblx0LyoqIFJldHVybnMgYSBzdGFibGUgc3RyaW5nIGtleSBmb3IgYSBzZXQgb2YgY29tcGlsZXIgb3B0aW9ucyB0aGF0IGFmZmVjdCBob3N0IGJlaGF2aW91ci4gKi9cblx0cHVibGljIGhvc3RLZXkob3B0czogdHMuQ29tcGlsZXJPcHRpb25zKTogc3RyaW5nIHtcblx0XHRyZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xuXHRcdFx0dGFyZ2V0OiBvcHRzLnRhcmdldCxcblx0XHRcdGxpYjogb3B0cy5saWIsXG5cdFx0XHR0eXBlUm9vdHM6IG9wdHMudHlwZVJvb3RzLFxuXHRcdFx0dHlwZXM6IG9wdHMudHlwZXMsXG5cdFx0XHRtb2R1bGVSZXNvbHV0aW9uOiBvcHRzLm1vZHVsZVJlc29sdXRpb24sXG5cdFx0XHRiYXNlVXJsOiBvcHRzLmJhc2VVcmwsXG5cdFx0XHRwYXRoczogb3B0cy5wYXRocyxcblx0XHRcdG1vZHVsZTogb3B0cy5tb2R1bGUsXG5cdFx0XHRyb290RGlyOiBvcHRzLnJvb3REaXIsXG5cdFx0XHRyb290RGlyczogb3B0cy5yb290RGlycyxcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBjcmVhdGVIb3N0KGNvbXBpbGVyT3B0aW9uczogdHMuQ29tcGlsZXJPcHRpb25zKTogdHMuQ29tcGlsZXJIb3N0IHtcblx0XHRjb25zdCBob3N0ID0gY3JlYXRlQ29tcGlsZXJIb3N0KGNvbXBpbGVyT3B0aW9ucyk7XG5cdFx0aG9zdC5maWxlRXhpc3RzID0gKGZpbGVOYW1lKSA9PiB0aGlzLmZpbGVFeGlzdHNPbkRpc2soZmlsZU5hbWUpO1xuXHRcdGhvc3QucmVhZEZpbGUgPSAoZmlsZU5hbWUpID0+IHRoaXMucmVhZEZpbGVGcm9tRGlzayhmaWxlTmFtZSk7XG5cdFx0aG9zdC5kaXJlY3RvcnlFeGlzdHMgPSAoZGlyZWN0b3J5TmFtZSkgPT4gdGhpcy5kaXJlY3RvcnlFeGlzdHMoZGlyZWN0b3J5TmFtZSk7XG5cdFx0aG9zdC5nZXREaXJlY3RvcmllcyA9IChkaXJlY3RvcnlOYW1lKSA9PiB0aGlzLmdldERpcmVjdG9yaWVzKGRpcmVjdG9yeU5hbWUpO1xuXHRcdHJldHVybiBob3N0O1xuXHR9XG5cblx0cHVibGljIGNyZWF0ZVByb2dyYW0oXG5cdFx0ZmlsZXM6IEZpbGVFeFtdLFxuXHRcdGNvbXBpbGVyT3B0aW9uczogdHMuQ29tcGlsZXJPcHRpb25zLFxuXHRcdGhvc3Q6IHRzLkNvbXBpbGVySG9zdCxcblx0XHRvbGRQcm9ncmFtPzogdHMuUHJvZ3JhbSxcblx0KTogdHMuUHJvZ3JhbSB7XG5cdFx0Y29uc3QgZmlsZVBhdGhzID0gZmlsZXMubWFwKChmKSA9PiBmLmZ1bGxQYXRoKTtcblx0XHR0aGlzLiNpbnZhbGlkYXRlZC5jbGVhcigpO1xuXHRcdHJldHVybiBjcmVhdGVQcm9ncmFtKFxuXHRcdFx0ZmlsZVBhdGhzLFxuXHRcdFx0e1xuXHRcdFx0XHQuLi5ERUZBVUxUX1RZUEVfRU1JVFRFUl9PUFRJT05TLFxuXHRcdFx0XHQuLi5jb21waWxlck9wdGlvbnMsXG5cdFx0XHRcdC4uLlJFUVVJUkVEX1RZUEVfRU1JVFRFUl9PUFRJT05TLFxuXHRcdFx0fSxcblx0XHRcdGhvc3QsXG5cdFx0XHRvbGRQcm9ncmFtLFxuXHRcdCk7XG5cdH1cblxuXHRAY2FjaGUoeyBuYW1lOiBcIkZJTEVfQ09OVEVOVFwiLCBrZXlGbjogKC4uLmFyZ3MpID0+IGFyZ3NbMF0gYXMgc3RyaW5nIH0pXG5cdHB1YmxpYyByZWFkRmlsZUZyb21EaXNrKGZpbGVOYW1lOiBzdHJpbmcpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4gZnMucmVhZEZpbGVTeW5jKGZpbGVOYW1lLCBcInV0ZjhcIik7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gdW5kZWZpbmVkO1xuXHRcdH1cblx0fVxuXG5cdEBjYWNoZSgpXG5cdHB1YmxpYyBmaWxlRXhpc3RzT25EaXNrKGZpbGVOYW1lOiBzdHJpbmcpOiBib29sZWFuIHtcblx0XHRyZXR1cm4gZnMuZXhpc3RzU3luYyhmaWxlTmFtZSk7XG5cdH1cblxuXHRAY2FjaGUoKVxuXHRwdWJsaWMgZGlyZWN0b3J5RXhpc3RzKGRpcmVjdG9yeU5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4gZnMuc3RhdFN5bmMoZGlyZWN0b3J5TmFtZSkuaXNEaXJlY3RvcnkoKTtcblx0XHR9IGNhdGNoIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cdH1cblxuXHRAY2FjaGUoKVxuXHRwdWJsaWMgZ2V0RGlyZWN0b3JpZXMoZGlyZWN0b3J5TmFtZTogc3RyaW5nKTogc3RyaW5nW10ge1xuXHRcdHRyeSB7XG5cdFx0XHRyZXR1cm4gZnNcblx0XHRcdFx0LnJlYWRkaXJTeW5jKGRpcmVjdG9yeU5hbWUsIHsgd2l0aEZpbGVUeXBlczogdHJ1ZSB9KVxuXHRcdFx0XHQuZmlsdGVyKChlbnRyeSkgPT4gZW50cnkuaXNEaXJlY3RvcnkoKSlcblx0XHRcdFx0Lm1hcCgoZW50cnkpID0+IGVudHJ5Lm5hbWUpO1xuXHRcdH0gY2F0Y2gge1xuXHRcdFx0cmV0dXJuIFtdO1xuXHRcdH1cblx0fVxufVxuIl0sIm5hbWVzIjpbImZzIiwiY2FjaGUiLCJUcmFjZSIsImNyZWF0ZUNvbXBpbGVySG9zdCIsImNyZWF0ZVByb2dyYW0iLCJERUZBVUxUX1RZUEVfRU1JVFRFUl9PUFRJT05TIiwiUkVRVUlSRURfVFlQRV9FTUlUVEVSX09QVElPTlMiLCJUc1Byb2dyYW1Ib3N0IiwiU2V0IiwiaW52YWxpZGF0ZVNvdXJjZUZpbGUiLCJmaWxlTmFtZSIsImFkZCIsImhhc0ludmFsaWRhdGVkIiwic2l6ZSIsImhvc3RLZXkiLCJvcHRzIiwiSlNPTiIsInN0cmluZ2lmeSIsInRhcmdldCIsImxpYiIsInR5cGVSb290cyIsInR5cGVzIiwibW9kdWxlUmVzb2x1dGlvbiIsImJhc2VVcmwiLCJwYXRocyIsIm1vZHVsZSIsInJvb3REaXIiLCJyb290RGlycyIsImNyZWF0ZUhvc3QiLCJjb21waWxlck9wdGlvbnMiLCJob3N0IiwiZmlsZUV4aXN0cyIsImZpbGVFeGlzdHNPbkRpc2siLCJyZWFkRmlsZSIsInJlYWRGaWxlRnJvbURpc2siLCJkaXJlY3RvcnlFeGlzdHMiLCJkaXJlY3RvcnlOYW1lIiwiZ2V0RGlyZWN0b3JpZXMiLCJmaWxlcyIsIm9sZFByb2dyYW0iLCJmaWxlUGF0aHMiLCJtYXAiLCJmIiwiZnVsbFBhdGgiLCJjbGVhciIsInJlYWRGaWxlU3luYyIsInVuZGVmaW5lZCIsImV4aXN0c1N5bmMiLCJzdGF0U3luYyIsImlzRGlyZWN0b3J5IiwicmVhZGRpclN5bmMiLCJ3aXRoRmlsZVR5cGVzIiwiZmlsdGVyIiwiZW50cnkiLCJuYW1lIiwia2V5Rm4iLCJhcmdzIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7QUFBQSxPQUFPQSxRQUFRLFVBQVU7QUFDekIsU0FBU0MsS0FBSyxRQUFRLDBCQUEwQjtBQUNoRCxTQUFTQyxLQUFLLFFBQVEsOEJBQThCO0FBR3BELFNBQVNDLGtCQUFrQixFQUFFQyxhQUFhLFFBQVEsYUFBYTtBQUMvRCxTQUNDQyw0QkFBNEIsRUFDNUJDLDZCQUE2QixRQUN2QixvQkFBOEI7QUFVckMsT0FBTyxNQUFNQztJQUNaLENBQUEsV0FBWSxHQUFHLElBQUlDLE1BQWM7SUFFMUJDLHFCQUFxQkMsUUFBZ0IsRUFBUTtRQUNuRCxJQUFJLENBQUMsQ0FBQSxXQUFZLENBQUNDLEdBQUcsQ0FBQ0Q7SUFDdkI7SUFFT0UsaUJBQTBCO1FBQ2hDLE9BQU8sSUFBSSxDQUFDLENBQUEsV0FBWSxDQUFDQyxJQUFJLEdBQUc7SUFDakM7SUFFQSwwRkFBMEYsR0FDMUYsQUFBT0MsUUFBUUMsSUFBd0IsRUFBVTtRQUNoRCxPQUFPQyxLQUFLQyxTQUFTLENBQUM7WUFDckJDLFFBQVFILEtBQUtHLE1BQU07WUFDbkJDLEtBQUtKLEtBQUtJLEdBQUc7WUFDYkMsV0FBV0wsS0FBS0ssU0FBUztZQUN6QkMsT0FBT04sS0FBS00sS0FBSztZQUNqQkMsa0JBQWtCUCxLQUFLTyxnQkFBZ0I7WUFDdkNDLFNBQVNSLEtBQUtRLE9BQU87WUFDckJDLE9BQU9ULEtBQUtTLEtBQUs7WUFDakJDLFFBQVFWLEtBQUtVLE1BQU07WUFDbkJDLFNBQVNYLEtBQUtXLE9BQU87WUFDckJDLFVBQVVaLEtBQUtZLFFBQVE7UUFDeEI7SUFDRDtJQUVPQyxXQUFXQyxlQUFtQyxFQUFtQjtRQUN2RSxNQUFNQyxPQUFPM0IsbUJBQW1CMEI7UUFDaENDLEtBQUtDLFVBQVUsR0FBRyxDQUFDckIsV0FBYSxJQUFJLENBQUNzQixnQkFBZ0IsQ0FBQ3RCO1FBQ3REb0IsS0FBS0csUUFBUSxHQUFHLENBQUN2QixXQUFhLElBQUksQ0FBQ3dCLGdCQUFnQixDQUFDeEI7UUFDcERvQixLQUFLSyxlQUFlLEdBQUcsQ0FBQ0MsZ0JBQWtCLElBQUksQ0FBQ0QsZUFBZSxDQUFDQztRQUMvRE4sS0FBS08sY0FBYyxHQUFHLENBQUNELGdCQUFrQixJQUFJLENBQUNDLGNBQWMsQ0FBQ0Q7UUFDN0QsT0FBT047SUFDUjtJQUVPMUIsY0FDTmtDLEtBQWUsRUFDZlQsZUFBbUMsRUFDbkNDLElBQXFCLEVBQ3JCUyxVQUF1QixFQUNWO1FBQ2IsTUFBTUMsWUFBWUYsTUFBTUcsR0FBRyxDQUFDLENBQUNDLElBQU1BLEVBQUVDLFFBQVE7UUFDN0MsSUFBSSxDQUFDLENBQUEsV0FBWSxDQUFDQyxLQUFLO1FBQ3ZCLE9BQU94QyxjQUNOb0MsV0FDQTtZQUNDLEdBQUduQyw0QkFBNEI7WUFDL0IsR0FBR3dCLGVBQWU7WUFDbEIsR0FBR3ZCLDZCQUE2QjtRQUNqQyxHQUNBd0IsTUFDQVM7SUFFRjtJQUdPTCxpQkFBaUJ4QixRQUFnQixFQUFzQjtRQUM3RCxJQUFJO1lBQ0gsT0FBT1YsR0FBRzZDLFlBQVksQ0FBQ25DLFVBQVU7UUFDbEMsRUFBRSxPQUFNO1lBQ1AsT0FBT29DO1FBQ1I7SUFDRDtJQUdPZCxpQkFBaUJ0QixRQUFnQixFQUFXO1FBQ2xELE9BQU9WLEdBQUcrQyxVQUFVLENBQUNyQztJQUN0QjtJQUdPeUIsZ0JBQWdCQyxhQUFxQixFQUFXO1FBQ3RELElBQUk7WUFDSCxPQUFPcEMsR0FBR2dELFFBQVEsQ0FBQ1osZUFBZWEsV0FBVztRQUM5QyxFQUFFLE9BQU07WUFDUCxPQUFPO1FBQ1I7SUFDRDtJQUdPWixlQUFlRCxhQUFxQixFQUFZO1FBQ3RELElBQUk7WUFDSCxPQUFPcEMsR0FDTGtELFdBQVcsQ0FBQ2QsZUFBZTtnQkFBRWUsZUFBZTtZQUFLLEdBQ2pEQyxNQUFNLENBQUMsQ0FBQ0MsUUFBVUEsTUFBTUosV0FBVyxJQUNuQ1IsR0FBRyxDQUFDLENBQUNZLFFBQVVBLE1BQU1DLElBQUk7UUFDNUIsRUFBRSxPQUFNO1lBQ1AsT0FBTyxFQUFFO1FBQ1Y7SUFDRDtBQUNEOzs7UUFsQ1VBLE1BQU07UUFBZ0JDLE9BQU8sQ0FBQyxHQUFHQyxPQUFTQSxJQUFJLENBQUMsRUFBRSJ9