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