@decohere/forge 0.0.1-dev.20 → 0.0.1-dev.20261105.103
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +15 -0
- package/README.md +152 -0
- package/es6/src/actions/build.action.js +3 -7
- package/es6/src/actions/clean.action.js +3 -6
- package/es6/src/actions/commit.action.js +3 -6
- package/es6/src/actions/copy.action.js +61 -12
- package/es6/src/actions/dependency-report.action.js +7 -7
- package/es6/src/actions/dependency-sync.action.js +8 -6
- package/es6/src/actions/docker.action.js +82 -36
- package/es6/src/actions/index.js +3 -2
- package/es6/src/actions/link.action.js +2 -5
- package/es6/src/actions/package.action.js +219 -0
- package/es6/src/actions/paths.action.js +97 -0
- package/es6/src/actions/publish.action.js +3 -6
- package/es6/src/actions/sync-lock-file.action.js +2 -4
- package/es6/src/actions/tag.action.js +5 -9
- package/es6/src/actions/typecheck.action.js +52 -0
- package/es6/src/actions/unlink.action.js +1 -3
- package/es6/src/actions/version.action.js +69 -17
- package/es6/src/actions/watch.action.js +2 -5
- package/es6/src/commands/build.command.js +4 -3
- package/es6/src/commands/dependency.command.js +1 -3
- package/es6/src/commands/docker.command.js +2 -4
- package/es6/src/commands/forge.command.js +1 -3
- package/es6/src/commands/index.js +3 -2
- package/es6/src/commands/link.command.js +4 -3
- package/es6/src/commands/package.command.js +26 -0
- package/es6/src/commands/paths.command.js +14 -0
- package/es6/src/commands/publish.command.js +1 -3
- package/es6/src/commands/tag.command.js +1 -3
- package/es6/src/commands/typecheck.command.js +14 -0
- package/es6/src/commands/version.command.js +3 -3
- package/es6/src/const.js +0 -2
- package/es6/src/create-workspace.js +26 -0
- package/es6/src/errors.js +1 -3
- package/es6/src/extensions/project.extensions.js +5 -7
- package/es6/src/factories/swc-config.factory.js +29 -9
- package/es6/src/forge.module.js +15 -20
- package/es6/src/index.js +2 -2
- package/es6/src/packaging/dependency-pinner.service.js +103 -0
- package/es6/src/packaging/deployable.js +21 -0
- package/es6/src/packaging/import-graph.service.js +122 -0
- package/es6/src/packaging/release-exports.js +80 -0
- package/es6/src/packaging/ui-assets.js +49 -0
- package/es6/src/semver/index.js +1 -0
- package/es6/src/semver/semver.js +75 -0
- package/es6/src/services/dependency-resolver.service.js +70 -26
- package/es6/src/services/file-writer.service.js +2 -11
- package/es6/src/services/incremental-watch.js +18 -0
- package/es6/src/services/output-cache.js +29 -0
- package/es6/src/services/swc-transpiler.js +85 -99
- package/es6/src/services/transpile-cache.js +29 -0
- package/es6/src/services/ts-compiler-options.js +39 -0
- package/es6/src/services/ts-program-host.js +4 -6
- package/es6/src/services/type-emission-program.js +25 -10
- package/es6/src/services/type-emitter.js +57 -20
- package/es6/src/transpile/index.js +6 -0
- package/es6/src/types/build-target.type.js +0 -2
- package/es6/src/types/configuration.type.js +0 -2
- package/es6/src/types/dependency.types.js +0 -2
- package/es6/src/types/swc-config.type.js +0 -2
- package/es6/src/types/transform-response.model.js +0 -7
- package/es6/src/types/transformer.type.js +0 -2
- package/es6/src/types/workspace-config.type.js +0 -2
- package/es6/src/vitest/forge-build.plugin.js +27 -43
- package/es6/src/vitest/index.js +0 -2
- package/es6/src/workspace.config.js +26 -6
- package/package.json +21 -10
- package/types/src/actions/build.action.d.ts +4 -4
- package/types/src/actions/clean.action.d.ts +3 -3
- package/types/src/actions/commit.action.d.ts +3 -3
- package/types/src/actions/copy.action.d.ts +18 -3
- package/types/src/actions/dependency-report.action.d.ts +3 -3
- package/types/src/actions/dependency-sync.action.d.ts +3 -3
- package/types/src/actions/docker.action.d.ts +14 -3
- package/types/src/actions/index.d.ts +3 -0
- package/types/src/actions/link.action.d.ts +3 -3
- package/types/src/actions/package.action.d.ts +38 -0
- package/types/src/actions/paths.action.d.ts +28 -0
- package/types/src/actions/publish.action.d.ts +4 -4
- package/types/src/actions/sync-lock-file.action.d.ts +2 -2
- package/types/src/actions/tag.action.d.ts +3 -3
- package/types/src/actions/typecheck.action.d.ts +14 -0
- package/types/src/actions/unlink.action.d.ts +2 -2
- package/types/src/actions/version.action.d.ts +14 -4
- package/types/src/actions/watch.action.d.ts +3 -3
- package/types/src/commands/build.command.d.ts +3 -2
- package/types/src/commands/dependency.command.d.ts +2 -2
- package/types/src/commands/docker.command.d.ts +1 -1
- package/types/src/commands/forge.command.d.ts +2 -2
- package/types/src/commands/index.d.ts +3 -0
- package/types/src/commands/link.command.d.ts +3 -2
- package/types/src/commands/package.command.d.ts +11 -0
- package/types/src/commands/paths.command.d.ts +6 -0
- package/types/src/commands/publish.command.d.ts +1 -1
- package/types/src/commands/tag.command.d.ts +1 -1
- package/types/src/commands/typecheck.command.d.ts +6 -0
- package/types/src/commands/version.command.d.ts +1 -1
- package/types/src/create-workspace.d.ts +7 -0
- package/types/src/errors.d.ts +1 -1
- package/types/src/extensions/project.extensions.d.ts +2 -2
- package/types/src/factories/swc-config.factory.d.ts +3 -2
- package/types/src/forge.module.d.ts +10 -4
- package/types/src/index.d.ts +2 -0
- package/types/src/packaging/dependency-pinner.service.d.ts +20 -0
- package/types/src/packaging/deployable.d.ts +17 -0
- package/types/src/packaging/import-graph.service.d.ts +33 -0
- package/types/src/packaging/release-exports.d.ts +18 -0
- package/types/src/packaging/ui-assets.d.ts +21 -0
- package/types/src/semver/index.d.ts +1 -0
- package/types/src/semver/semver.d.ts +20 -0
- package/types/src/services/dependency-resolver.service.d.ts +8 -1
- package/types/src/services/file-writer.service.d.ts +1 -2
- package/types/src/services/incremental-watch.d.ts +13 -0
- package/types/src/services/output-cache.d.ts +10 -0
- package/types/src/services/swc-transpiler.d.ts +28 -15
- package/types/src/services/transpile-cache.d.ts +17 -0
- package/types/src/services/ts-compiler-options.d.ts +8 -0
- package/types/src/services/ts-program-host.d.ts +2 -2
- package/types/src/services/type-emission-program.d.ts +10 -3
- package/types/src/services/type-emitter.d.ts +21 -8
- package/types/src/transpile/index.d.ts +6 -0
- package/types/src/types/configuration.type.d.ts +6 -1
- package/types/src/types/dependency.types.d.ts +8 -9
- package/types/src/types/swc-config.type.d.ts +7 -1
- package/types/src/types/transform-response.model.d.ts +2 -7
- package/types/src/types/transformer.type.d.ts +3 -12
- package/types/src/types/workspace-config.type.d.ts +3 -3
- package/types/src/vitest/forge-build.plugin.d.ts +0 -2
- package/commonjs/src/actions/build.action.js +0 -116
- package/commonjs/src/actions/clean.action.js +0 -55
- package/commonjs/src/actions/commit.action.js +0 -87
- package/commonjs/src/actions/copy.action.js +0 -83
- package/commonjs/src/actions/dependency-report.action.js +0 -142
- package/commonjs/src/actions/dependency-sync.action.js +0 -100
- package/commonjs/src/actions/docker.action.js +0 -162
- package/commonjs/src/actions/index.js +0 -33
- package/commonjs/src/actions/link.action.js +0 -156
- package/commonjs/src/actions/publish.action.js +0 -156
- package/commonjs/src/actions/sync-lock-file.action.js +0 -43
- package/commonjs/src/actions/tag.action.js +0 -76
- package/commonjs/src/actions/unlink.action.js +0 -76
- package/commonjs/src/actions/version.action.js +0 -209
- package/commonjs/src/actions/watch.action.js +0 -51
- package/commonjs/src/commands/build.command.js +0 -49
- package/commonjs/src/commands/dependency.command.js +0 -88
- package/commonjs/src/commands/docker.command.js +0 -28
- package/commonjs/src/commands/forge.command.js +0 -24
- package/commonjs/src/commands/index.js +0 -27
- package/commonjs/src/commands/link.command.js +0 -89
- package/commonjs/src/commands/publish.command.js +0 -32
- package/commonjs/src/commands/tag.command.js +0 -28
- package/commonjs/src/commands/version.command.js +0 -36
- package/commonjs/src/const.js +0 -81
- package/commonjs/src/errors.js +0 -39
- package/commonjs/src/extensions/project.extensions.js +0 -94
- package/commonjs/src/factories/swc-config.factory.js +0 -98
- package/commonjs/src/forge.module.js +0 -115
- package/commonjs/src/index.js +0 -46
- package/commonjs/src/mixins/caches-outputs.mixin.js +0 -44
- package/commonjs/src/mixins/incremental-transform.mixin.js +0 -36
- package/commonjs/src/services/dependency-resolver.service.js +0 -172
- package/commonjs/src/services/file-writer.service.js +0 -232
- package/commonjs/src/services/swc-transpiler.js +0 -235
- package/commonjs/src/services/ts-program-host.js +0 -135
- package/commonjs/src/services/type-emission-program.js +0 -160
- package/commonjs/src/services/type-emitter.js +0 -141
- package/commonjs/src/types/build-target.type.js +0 -17
- package/commonjs/src/types/configuration.type.js +0 -6
- package/commonjs/src/types/dependency.types.js +0 -6
- package/commonjs/src/types/swc-config.type.js +0 -17
- package/commonjs/src/types/transform-response.model.js +0 -65
- package/commonjs/src/types/transformer.type.js +0 -13
- package/commonjs/src/types/workspace-config.type.js +0 -6
- package/commonjs/src/vitest/forge-build.plugin.js +0 -129
- package/commonjs/src/vitest/index.js +0 -13
- package/commonjs/src/workspace.config.js +0 -75
- package/es6/src/mixins/caches-outputs.mixin.js +0 -34
- package/es6/src/mixins/incremental-transform.mixin.js +0 -26
- package/types/src/mixins/caches-outputs.mixin.d.ts +0 -7
- package/types/src/mixins/incremental-transform.mixin.d.ts +0 -13
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "CachesOutputs", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return CachesOutputs;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _io = require("@decohere/nexus/io");
|
|
12
|
-
class CachesOutputs {
|
|
13
|
-
/** Maps source file fullPath -> output TransformResponses for cleanup in watch mode. */ get outputCache() {
|
|
14
|
-
const self = this;
|
|
15
|
-
if (self.__outputCache == null) {
|
|
16
|
-
self.__outputCache = new Map();
|
|
17
|
-
}
|
|
18
|
-
return self.__outputCache;
|
|
19
|
-
}
|
|
20
|
-
cacheOutputs(responses) {
|
|
21
|
-
const byFile = new Map();
|
|
22
|
-
for (const response of responses){
|
|
23
|
-
if (response.outcome !== "success") continue;
|
|
24
|
-
const group = byFile.get(response.file.fullPath) ?? [];
|
|
25
|
-
group.push(response);
|
|
26
|
-
byFile.set(response.file.fullPath, group);
|
|
27
|
-
}
|
|
28
|
-
for (const [fullPath, group] of byFile){
|
|
29
|
-
this.outputCache.set(fullPath, group);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
deleteCachedOutputs(filePath) {
|
|
33
|
-
const outputs = this.outputCache.get(filePath);
|
|
34
|
-
if (outputs == null) return;
|
|
35
|
-
for (const response of outputs){
|
|
36
|
-
if (response.outputPath != null) {
|
|
37
|
-
void _io.io.deleteFile(response.outputPath);
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
|
-
this.outputCache.delete(filePath);
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9taXhpbnMvY2FjaGVzLW91dHB1dHMubWl4aW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW8gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2lvXCI7XG5pbXBvcnQgdHlwZSB7IFRyYW5zZm9ybVJlc3BvbnNlIH0gZnJvbSBcIi4uL3R5cGVzL3RyYW5zZm9ybS1yZXNwb25zZS5tb2RlbC5qc1wiO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQ2FjaGVzT3V0cHV0cyB7XG5cdC8qKiBNYXBzIHNvdXJjZSBmaWxlIGZ1bGxQYXRoIC0+IG91dHB1dCBUcmFuc2Zvcm1SZXNwb25zZXMgZm9yIGNsZWFudXAgaW4gd2F0Y2ggbW9kZS4gKi9cblx0cHJvdGVjdGVkIGdldCBvdXRwdXRDYWNoZSgpOiBNYXA8c3RyaW5nLCBUcmFuc2Zvcm1SZXNwb25zZVtdPiB7XG5cdFx0Y29uc3Qgc2VsZiA9IHRoaXMgYXMgeyBfX291dHB1dENhY2hlPzogTWFwPHN0cmluZywgVHJhbnNmb3JtUmVzcG9uc2VbXT4gfTtcblx0XHRpZiAoc2VsZi5fX291dHB1dENhY2hlID09IG51bGwpIHtcblx0XHRcdHNlbGYuX19vdXRwdXRDYWNoZSA9IG5ldyBNYXA8c3RyaW5nLCBUcmFuc2Zvcm1SZXNwb25zZVtdPigpO1xuXHRcdH1cblx0XHRyZXR1cm4gc2VsZi5fX291dHB1dENhY2hlO1xuXHR9XG5cblx0cHJvdGVjdGVkIGNhY2hlT3V0cHV0cyhyZXNwb25zZXM6IFRyYW5zZm9ybVJlc3BvbnNlW10pOiB2b2lkIHtcblx0XHRjb25zdCBieUZpbGUgPSBuZXcgTWFwPHN0cmluZywgVHJhbnNmb3JtUmVzcG9uc2VbXT4oKTtcblx0XHRmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuXHRcdFx0aWYgKHJlc3BvbnNlLm91dGNvbWUgIT09IFwic3VjY2Vzc1wiKSBjb250aW51ZTtcblx0XHRcdGNvbnN0IGdyb3VwID0gYnlGaWxlLmdldChyZXNwb25zZS5maWxlLmZ1bGxQYXRoKSA/PyBbXTtcblx0XHRcdGdyb3VwLnB1c2gocmVzcG9uc2UpO1xuXHRcdFx0YnlGaWxlLnNldChyZXNwb25zZS5maWxlLmZ1bGxQYXRoLCBncm91cCk7XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgW2Z1bGxQYXRoLCBncm91cF0gb2YgYnlGaWxlKSB7XG5cdFx0XHR0aGlzLm91dHB1dENhY2hlLnNldChmdWxsUGF0aCwgZ3JvdXApO1xuXHRcdH1cblx0fVxuXG5cdHByb3RlY3RlZCBkZWxldGVDYWNoZWRPdXRwdXRzKGZpbGVQYXRoOiBzdHJpbmcpOiB2b2lkIHtcblx0XHRjb25zdCBvdXRwdXRzID0gdGhpcy5vdXRwdXRDYWNoZS5nZXQoZmlsZVBhdGgpO1xuXHRcdGlmIChvdXRwdXRzID09IG51bGwpIHJldHVybjtcblx0XHRmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIG91dHB1dHMpIHtcblx0XHRcdGlmIChyZXNwb25zZS5vdXRwdXRQYXRoICE9IG51bGwpIHtcblx0XHRcdFx0dm9pZCBpby5kZWxldGVGaWxlKHJlc3BvbnNlLm91dHB1dFBhdGgpO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR0aGlzLm91dHB1dENhY2hlLmRlbGV0ZShmaWxlUGF0aCk7XG5cdH1cbn1cbiJdLCJuYW1lcyI6WyJDYWNoZXNPdXRwdXRzIiwib3V0cHV0Q2FjaGUiLCJzZWxmIiwiX19vdXRwdXRDYWNoZSIsIk1hcCIsImNhY2hlT3V0cHV0cyIsInJlc3BvbnNlcyIsImJ5RmlsZSIsInJlc3BvbnNlIiwib3V0Y29tZSIsImdyb3VwIiwiZ2V0IiwiZmlsZSIsImZ1bGxQYXRoIiwicHVzaCIsInNldCIsImRlbGV0ZUNhY2hlZE91dHB1dHMiLCJmaWxlUGF0aCIsIm91dHB1dHMiLCJvdXRwdXRQYXRoIiwiaW8iLCJkZWxldGVGaWxlIiwiZGVsZXRlIl0sIm1hcHBpbmdzIjoiOzs7OytCQUdzQkE7OztlQUFBQTs7O29CQUhIO0FBR1osTUFBZUE7SUFDckIsc0ZBQXNGLEdBQ3RGLElBQWNDLGNBQWdEO1FBQzdELE1BQU1DLE9BQU8sSUFBSTtRQUNqQixJQUFJQSxLQUFLQyxhQUFhLElBQUksTUFBTTtZQUMvQkQsS0FBS0MsYUFBYSxHQUFHLElBQUlDO1FBQzFCO1FBQ0EsT0FBT0YsS0FBS0MsYUFBYTtJQUMxQjtJQUVVRSxhQUFhQyxTQUE4QixFQUFRO1FBQzVELE1BQU1DLFNBQVMsSUFBSUg7UUFDbkIsS0FBSyxNQUFNSSxZQUFZRixVQUFXO1lBQ2pDLElBQUlFLFNBQVNDLE9BQU8sS0FBSyxXQUFXO1lBQ3BDLE1BQU1DLFFBQVFILE9BQU9JLEdBQUcsQ0FBQ0gsU0FBU0ksSUFBSSxDQUFDQyxRQUFRLEtBQUssRUFBRTtZQUN0REgsTUFBTUksSUFBSSxDQUFDTjtZQUNYRCxPQUFPUSxHQUFHLENBQUNQLFNBQVNJLElBQUksQ0FBQ0MsUUFBUSxFQUFFSDtRQUNwQztRQUNBLEtBQUssTUFBTSxDQUFDRyxVQUFVSCxNQUFNLElBQUlILE9BQVE7WUFDdkMsSUFBSSxDQUFDTixXQUFXLENBQUNjLEdBQUcsQ0FBQ0YsVUFBVUg7UUFDaEM7SUFDRDtJQUVVTSxvQkFBb0JDLFFBQWdCLEVBQVE7UUFDckQsTUFBTUMsVUFBVSxJQUFJLENBQUNqQixXQUFXLENBQUNVLEdBQUcsQ0FBQ007UUFDckMsSUFBSUMsV0FBVyxNQUFNO1FBQ3JCLEtBQUssTUFBTVYsWUFBWVUsUUFBUztZQUMvQixJQUFJVixTQUFTVyxVQUFVLElBQUksTUFBTTtnQkFDaEMsS0FBS0MsTUFBRSxDQUFDQyxVQUFVLENBQUNiLFNBQVNXLFVBQVU7WUFDdkM7UUFDRDtRQUNBLElBQUksQ0FBQ2xCLFdBQVcsQ0FBQ3FCLE1BQU0sQ0FBQ0w7SUFDekI7QUFDRCJ9
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "IncrementalTransform", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return IncrementalTransform;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _rxjs = require("rxjs");
|
|
12
|
-
// WeakMap avoids the private-field-in-mixin problem: private class fields (#x)
|
|
13
|
-
// are not accessible when methods are copied onto a different class prototype.
|
|
14
|
-
const subjects = new WeakMap();
|
|
15
|
-
function getSubject(instance) {
|
|
16
|
-
let subject = subjects.get(instance);
|
|
17
|
-
if (subject == null) {
|
|
18
|
-
subject = new _rxjs.Subject();
|
|
19
|
-
subjects.set(instance, subject);
|
|
20
|
-
}
|
|
21
|
-
return subject;
|
|
22
|
-
}
|
|
23
|
-
class IncrementalTransform {
|
|
24
|
-
get incrementalTransform$() {
|
|
25
|
-
return getSubject(this).asObservable();
|
|
26
|
-
}
|
|
27
|
-
watch(workspace) {
|
|
28
|
-
workspace.projectFileChanged$.subscribe((evt)=>{
|
|
29
|
-
void this.onIncrementalFileEvent(evt).then((responses)=>{
|
|
30
|
-
getSubject(this).next(responses);
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9taXhpbnMvaW5jcmVtZW50YWwtdHJhbnNmb3JtLm1peGluLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgUHJvamVjdEZpbGVFdmVudCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgdHlwZSB7IE9ic2VydmFibGUgfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgU3ViamVjdCB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgdHlwZSB7IFRyYW5zZm9ybVJlc3BvbnNlIH0gZnJvbSBcIi4uL3R5cGVzL3RyYW5zZm9ybS1yZXNwb25zZS5tb2RlbC5qc1wiO1xuXG4vLyBXZWFrTWFwIGF2b2lkcyB0aGUgcHJpdmF0ZS1maWVsZC1pbi1taXhpbiBwcm9ibGVtOiBwcml2YXRlIGNsYXNzIGZpZWxkcyAoI3gpXG4vLyBhcmUgbm90IGFjY2Vzc2libGUgd2hlbiBtZXRob2RzIGFyZSBjb3BpZWQgb250byBhIGRpZmZlcmVudCBjbGFzcyBwcm90b3R5cGUuXG5jb25zdCBzdWJqZWN0cyA9IG5ldyBXZWFrTWFwPG9iamVjdCwgU3ViamVjdDxUcmFuc2Zvcm1SZXNwb25zZVtdPj4oKTtcblxuZnVuY3Rpb24gZ2V0U3ViamVjdChpbnN0YW5jZTogb2JqZWN0KTogU3ViamVjdDxUcmFuc2Zvcm1SZXNwb25zZVtdPiB7XG5cdGxldCBzdWJqZWN0ID0gc3ViamVjdHMuZ2V0KGluc3RhbmNlKTtcblx0aWYgKHN1YmplY3QgPT0gbnVsbCkge1xuXHRcdHN1YmplY3QgPSBuZXcgU3ViamVjdDxUcmFuc2Zvcm1SZXNwb25zZVtdPigpO1xuXHRcdHN1YmplY3RzLnNldChpbnN0YW5jZSwgc3ViamVjdCk7XG5cdH1cblx0cmV0dXJuIHN1YmplY3Q7XG59XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBJbmNyZW1lbnRhbFRyYW5zZm9ybSB7XG5cdHB1YmxpYyBnZXQgaW5jcmVtZW50YWxUcmFuc2Zvcm0kKCk6IE9ic2VydmFibGU8VHJhbnNmb3JtUmVzcG9uc2VbXT4ge1xuXHRcdHJldHVybiBnZXRTdWJqZWN0KHRoaXMpLmFzT2JzZXJ2YWJsZSgpO1xuXHR9XG5cblx0cHVibGljIHdhdGNoKHdvcmtzcGFjZTogV29ya3NwYWNlKTogdm9pZCB7XG5cdFx0d29ya3NwYWNlLnByb2plY3RGaWxlQ2hhbmdlZCQuc3Vic2NyaWJlKChldnQpID0+IHtcblx0XHRcdHZvaWQgdGhpcy5vbkluY3JlbWVudGFsRmlsZUV2ZW50KGV2dCkudGhlbigocmVzcG9uc2VzKSA9PiB7XG5cdFx0XHRcdGdldFN1YmplY3QodGhpcykubmV4dChyZXNwb25zZXMpO1xuXHRcdFx0fSk7XG5cdFx0fSk7XG5cdH1cblxuXHQvKipcblx0ICogQ2FsbGVkIGZvciBldmVyeSB3b3Jrc3BhY2UgZmlsZSBjaGFuZ2UuIEltcGxlbWVudGF0aW9ucyBzaG91bGQgaW52YWxpZGF0ZVxuXHQgKiBhbnkgaW50ZXJuYWwgY2FjaGVzLCBwZXJmb3JtIHRoZSBpbmNyZW1lbnRhbCB0cmFuc2Zvcm0sIGFuZCByZXR1cm4gdGhlIHJlc3VsdHMuXG5cdCAqIFJldHVybiBhbiBlbXB0eSBhcnJheSBmb3IgZGVsZXRpb25zIG9yIHdoZW4gbm8gb3V0cHV0IGlzIHByb2R1Y2VkLlxuXHQgKi9cblx0cHJvdGVjdGVkIGFic3RyYWN0IG9uSW5jcmVtZW50YWxGaWxlRXZlbnQoXG5cdFx0ZXZ0OiBQcm9qZWN0RmlsZUV2ZW50LFxuXHQpOiBQcm9taXNlPFRyYW5zZm9ybVJlc3BvbnNlW10+O1xufVxuIl0sIm5hbWVzIjpbIkluY3JlbWVudGFsVHJhbnNmb3JtIiwic3ViamVjdHMiLCJXZWFrTWFwIiwiZ2V0U3ViamVjdCIsImluc3RhbmNlIiwic3ViamVjdCIsImdldCIsIlN1YmplY3QiLCJzZXQiLCJpbmNyZW1lbnRhbFRyYW5zZm9ybSQiLCJhc09ic2VydmFibGUiLCJ3YXRjaCIsIndvcmtzcGFjZSIsInByb2plY3RGaWxlQ2hhbmdlZCQiLCJzdWJzY3JpYmUiLCJldnQiLCJvbkluY3JlbWVudGFsRmlsZUV2ZW50IiwidGhlbiIsInJlc3BvbnNlcyIsIm5leHQiXSwibWFwcGluZ3MiOiI7Ozs7K0JBa0JzQkE7OztlQUFBQTs7O3NCQWhCRTtBQUd4QiwrRUFBK0U7QUFDL0UsK0VBQStFO0FBQy9FLE1BQU1DLFdBQVcsSUFBSUM7QUFFckIsU0FBU0MsV0FBV0MsUUFBZ0I7SUFDbkMsSUFBSUMsVUFBVUosU0FBU0ssR0FBRyxDQUFDRjtJQUMzQixJQUFJQyxXQUFXLE1BQU07UUFDcEJBLFVBQVUsSUFBSUUsYUFBTztRQUNyQk4sU0FBU08sR0FBRyxDQUFDSixVQUFVQztJQUN4QjtJQUNBLE9BQU9BO0FBQ1I7QUFFTyxNQUFlTDtJQUNyQixJQUFXUyx3QkFBeUQ7UUFDbkUsT0FBT04sV0FBVyxJQUFJLEVBQUVPLFlBQVk7SUFDckM7SUFFT0MsTUFBTUMsU0FBb0IsRUFBUTtRQUN4Q0EsVUFBVUMsbUJBQW1CLENBQUNDLFNBQVMsQ0FBQyxDQUFDQztZQUN4QyxLQUFLLElBQUksQ0FBQ0Msc0JBQXNCLENBQUNELEtBQUtFLElBQUksQ0FBQyxDQUFDQztnQkFDM0NmLFdBQVcsSUFBSSxFQUFFZ0IsSUFBSSxDQUFDRDtZQUN2QjtRQUNEO0lBQ0Q7QUFVRCJ9
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", {
|
|
3
|
-
value: true
|
|
4
|
-
});
|
|
5
|
-
Object.defineProperty(exports, "DependencyResolver", {
|
|
6
|
-
enumerable: true,
|
|
7
|
-
get: function() {
|
|
8
|
-
return DependencyResolver;
|
|
9
|
-
}
|
|
10
|
-
});
|
|
11
|
-
const _decorators = require("@decohere/crucible/decorators");
|
|
12
|
-
const _io = require("@decohere/nexus/io");
|
|
13
|
-
const _parseimports = require("parse-imports");
|
|
14
|
-
const _const = require("../const.js");
|
|
15
|
-
const _errors = require("../errors.js");
|
|
16
|
-
function _ts_decorate(decorators, target, key, desc) {
|
|
17
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
18
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
19
|
-
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;
|
|
20
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
21
|
-
}
|
|
22
|
-
class DependencyResolver {
|
|
23
|
-
computeDrift(current, computed) {
|
|
24
|
-
const sortKeys = (obj)=>Object.fromEntries(Object.entries(obj).sort());
|
|
25
|
-
const currentDeps = sortKeys(current.dependencies ?? {});
|
|
26
|
-
const computedDeps = sortKeys(computed.dependencies ?? {});
|
|
27
|
-
const currentDevDeps = sortKeys(current.devDependencies ?? {});
|
|
28
|
-
const computedDevDeps = sortKeys(computed.devDependencies ?? {});
|
|
29
|
-
const hasDrift = JSON.stringify(currentDeps) !== JSON.stringify(computedDeps) || JSON.stringify(currentDevDeps) !== JSON.stringify(computedDevDeps);
|
|
30
|
-
if (!hasDrift) {
|
|
31
|
-
return null;
|
|
32
|
-
}
|
|
33
|
-
return {
|
|
34
|
-
original: {
|
|
35
|
-
dependencies: currentDeps,
|
|
36
|
-
devDependencies: currentDevDeps
|
|
37
|
-
},
|
|
38
|
-
updated: {
|
|
39
|
-
dependencies: computedDeps,
|
|
40
|
-
devDependencies: computedDevDeps
|
|
41
|
-
}
|
|
42
|
-
};
|
|
43
|
-
}
|
|
44
|
-
async getWorkspacePackages(workspace, projects) {
|
|
45
|
-
const packageJson = await workspace.getPackageJson().catch(()=>{
|
|
46
|
-
throw new Error(`Root package.json not found at "${workspace.packageJsonDirectory}/package.json". ` + `Ensure the workspace root has a package.json with dependencies listed.`);
|
|
47
|
-
});
|
|
48
|
-
const internals = new Map(await Promise.all(projects.map(async (proj)=>{
|
|
49
|
-
const packageJson = await proj.getPackageJson();
|
|
50
|
-
return [
|
|
51
|
-
packageJson.name,
|
|
52
|
-
{
|
|
53
|
-
name: packageJson.name,
|
|
54
|
-
version: packageJson.version,
|
|
55
|
-
isInternal: true
|
|
56
|
-
}
|
|
57
|
-
];
|
|
58
|
-
})));
|
|
59
|
-
const packages = Object.entries(packageJson.dependencies).filter(([key])=>!internals.has(key)).map(([key, val])=>[
|
|
60
|
-
key,
|
|
61
|
-
{
|
|
62
|
-
name: key,
|
|
63
|
-
version: val
|
|
64
|
-
}
|
|
65
|
-
]);
|
|
66
|
-
const devPackages = Object.entries(packageJson.devDependencies).filter(([key])=>!internals.has(key)).map(([key, val])=>[
|
|
67
|
-
key,
|
|
68
|
-
{
|
|
69
|
-
name: key,
|
|
70
|
-
version: val,
|
|
71
|
-
isDev: true
|
|
72
|
-
}
|
|
73
|
-
]);
|
|
74
|
-
return new Map([
|
|
75
|
-
...packages,
|
|
76
|
-
...devPackages,
|
|
77
|
-
...internals
|
|
78
|
-
]);
|
|
79
|
-
}
|
|
80
|
-
async computeProjectDependencies(project, workspacePackages) {
|
|
81
|
-
const { dependencies, devDependencies, warnings } = await this.getDependencies(project, workspacePackages);
|
|
82
|
-
const pkg = await project.getPackageJson();
|
|
83
|
-
const updatedPackage = pkg.withDependencies(dependencies).withDevDependencies(devDependencies);
|
|
84
|
-
return {
|
|
85
|
-
project,
|
|
86
|
-
updatedPackage,
|
|
87
|
-
warnings
|
|
88
|
-
};
|
|
89
|
-
}
|
|
90
|
-
async getDependencies(project, workspacePackages) {
|
|
91
|
-
const files = await project.getAllFiles();
|
|
92
|
-
const results = await Promise.all(files.map((file)=>this.getFileImports(file)));
|
|
93
|
-
const imports = results.flatMap((r)=>r.imports);
|
|
94
|
-
const warnings = results.flatMap((r)=>r.warnings);
|
|
95
|
-
const allDependencies = [
|
|
96
|
-
...new Set(imports)
|
|
97
|
-
].map((fileImport)=>this.getDependencyFrom(fileImport, workspacePackages)).filter((dep)=>dep != null);
|
|
98
|
-
const missing = allDependencies.filter((dep)=>dep.missing);
|
|
99
|
-
if (missing.length > 0) {
|
|
100
|
-
const names = missing.map((dep)=>dep.name).join(", ");
|
|
101
|
-
throw new _errors.ForgeError(`Missing packages in project "${project.name}": ${names}`);
|
|
102
|
-
}
|
|
103
|
-
const resolved = allDependencies.filter((dep)=>!dep.missing);
|
|
104
|
-
const dependencies = Object.fromEntries(resolved.filter((dep)=>!dep.isDev).map((dep)=>[
|
|
105
|
-
dep.name,
|
|
106
|
-
dep.version
|
|
107
|
-
]));
|
|
108
|
-
const devDependencies = Object.fromEntries(resolved.filter((dep)=>dep.isDev).map((dep)=>[
|
|
109
|
-
dep.name,
|
|
110
|
-
dep.version
|
|
111
|
-
]));
|
|
112
|
-
return {
|
|
113
|
-
dependencies,
|
|
114
|
-
devDependencies,
|
|
115
|
-
warnings
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
getDependencyFrom(importName, workspacePackages) {
|
|
119
|
-
if (importName.startsWith(".") || importName.startsWith("node:")) {
|
|
120
|
-
return;
|
|
121
|
-
}
|
|
122
|
-
const packageNameMatch = importName.match(/^(?:(@[^/]+\/[^/]+)|([^/]+))/);
|
|
123
|
-
const packageName = packageNameMatch?.[0];
|
|
124
|
-
if (packageName == null || _const.BUILT_IN_MODULES.includes(packageName)) {
|
|
125
|
-
return;
|
|
126
|
-
}
|
|
127
|
-
const packg = workspacePackages.get(packageName);
|
|
128
|
-
if (packg == null) {
|
|
129
|
-
return {
|
|
130
|
-
name: packageName,
|
|
131
|
-
version: undefined,
|
|
132
|
-
internal: undefined,
|
|
133
|
-
missing: true,
|
|
134
|
-
isDev: false
|
|
135
|
-
};
|
|
136
|
-
}
|
|
137
|
-
return {
|
|
138
|
-
name: packageName,
|
|
139
|
-
version: packg.version ?? "",
|
|
140
|
-
internal: packg.isInternal ?? false,
|
|
141
|
-
missing: false,
|
|
142
|
-
isDev: packg.isDev ?? false
|
|
143
|
-
};
|
|
144
|
-
}
|
|
145
|
-
async getFileImports(file) {
|
|
146
|
-
const contents = await _io.io.readFile(file.fullPath);
|
|
147
|
-
const parsed = Array.from(await (0, _parseimports.parseImports)(contents));
|
|
148
|
-
const imports = [];
|
|
149
|
-
const warnings = [];
|
|
150
|
-
for (const impt of parsed){
|
|
151
|
-
if (impt.moduleSpecifier.value != null) {
|
|
152
|
-
imports.push(impt.moduleSpecifier.value);
|
|
153
|
-
} else if (impt.isDynamicImport) {
|
|
154
|
-
const line = contents.substring(0, impt.startIndex).split("\n").length;
|
|
155
|
-
warnings.push({
|
|
156
|
-
file: file.fullPath,
|
|
157
|
-
line,
|
|
158
|
-
message: `Dynamic import with non-literal specifier \`${impt.moduleSpecifier.code}\` cannot be statically resolved`
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
return {
|
|
163
|
-
imports,
|
|
164
|
-
warnings
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
DependencyResolver = _ts_decorate([
|
|
169
|
-
(0, _decorators.injectable)()
|
|
170
|
-
], DependencyResolver);
|
|
171
|
-
|
|
172
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9zZXJ2aWNlcy9kZXBlbmRlbmN5LXJlc29sdmVyLnNlcnZpY2UudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUgeyBQYWNrYWdlSnNvbiwgUHJvamVjdCwgV29ya3NwYWNlIH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyB0eXBlIEZpbGVFeCwgaW8gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2lvXCI7XG5pbXBvcnQgeyBwYXJzZUltcG9ydHMgfSBmcm9tIFwicGFyc2UtaW1wb3J0c1wiO1xuaW1wb3J0IHsgQlVJTFRfSU5fTU9EVUxFUyB9IGZyb20gXCIuLi9jb25zdC5qc1wiO1xuaW1wb3J0IHsgRm9yZ2VFcnJvciB9IGZyb20gXCIuLi9lcnJvcnMuanNcIjtcbmltcG9ydCB0eXBlIHtcblx0RGVwZW5kZW5jeVdhcm5pbmcsXG5cdERyaWZ0RW50cnksXG5cdFBhY2thZ2UsXG5cdFJlc29sdmVkRGVwZW5kZW5jeSxcbn0gZnJvbSBcIi4uL3R5cGVzL2RlcGVuZGVuY3kudHlwZXMuanNcIjtcblxuZXhwb3J0IHR5cGUgUHJvamVjdERlcGVuZGVuY2llcyA9IHtcblx0cHJvamVjdDogUHJvamVjdDtcblx0dXBkYXRlZFBhY2thZ2U6IFBhY2thZ2VKc29uO1xuXHR3YXJuaW5nczogRGVwZW5kZW5jeVdhcm5pbmdbXTtcbn07XG5cbkBpbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEZXBlbmRlbmN5UmVzb2x2ZXIge1xuXHRwdWJsaWMgY29tcHV0ZURyaWZ0KGN1cnJlbnQ6IFBhY2thZ2VKc29uLCBjb21wdXRlZDogUGFja2FnZUpzb24pOiBEcmlmdEVudHJ5IHwgbnVsbCB7XG5cdFx0Y29uc3Qgc29ydEtleXMgPSAob2JqOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+KSA9PlxuXHRcdFx0T2JqZWN0LmZyb21FbnRyaWVzKE9iamVjdC5lbnRyaWVzKG9iaikuc29ydCgpKTtcblxuXHRcdGNvbnN0IGN1cnJlbnREZXBzID0gc29ydEtleXMoY3VycmVudC5kZXBlbmRlbmNpZXMgPz8ge30pO1xuXHRcdGNvbnN0IGNvbXB1dGVkRGVwcyA9IHNvcnRLZXlzKGNvbXB1dGVkLmRlcGVuZGVuY2llcyA/PyB7fSk7XG5cdFx0Y29uc3QgY3VycmVudERldkRlcHMgPSBzb3J0S2V5cyhjdXJyZW50LmRldkRlcGVuZGVuY2llcyA/PyB7fSk7XG5cdFx0Y29uc3QgY29tcHV0ZWREZXZEZXBzID0gc29ydEtleXMoY29tcHV0ZWQuZGV2RGVwZW5kZW5jaWVzID8/IHt9KTtcblxuXHRcdGNvbnN0IGhhc0RyaWZ0ID1cblx0XHRcdEpTT04uc3RyaW5naWZ5KGN1cnJlbnREZXBzKSAhPT0gSlNPTi5zdHJpbmdpZnkoY29tcHV0ZWREZXBzKSB8fFxuXHRcdFx0SlNPTi5zdHJpbmdpZnkoY3VycmVudERldkRlcHMpICE9PSBKU09OLnN0cmluZ2lmeShjb21wdXRlZERldkRlcHMpO1xuXG5cdFx0aWYgKCFoYXNEcmlmdCkge1xuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHtcblx0XHRcdG9yaWdpbmFsOiB7IGRlcGVuZGVuY2llczogY3VycmVudERlcHMsIGRldkRlcGVuZGVuY2llczogY3VycmVudERldkRlcHMgfSxcblx0XHRcdHVwZGF0ZWQ6IHsgZGVwZW5kZW5jaWVzOiBjb21wdXRlZERlcHMsIGRldkRlcGVuZGVuY2llczogY29tcHV0ZWREZXZEZXBzIH0sXG5cdFx0fTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBnZXRXb3Jrc3BhY2VQYWNrYWdlcyhcblx0XHR3b3Jrc3BhY2U6IFdvcmtzcGFjZSxcblx0XHRwcm9qZWN0czogcmVhZG9ubHkgUHJvamVjdFtdLFxuXHQpOiBQcm9taXNlPE1hcDxzdHJpbmcsIFBhY2thZ2U+PiB7XG5cdFx0Y29uc3QgcGFja2FnZUpzb24gPSBhd2FpdCB3b3Jrc3BhY2UuZ2V0UGFja2FnZUpzb24oKS5jYXRjaCgoKSA9PiB7XG5cdFx0XHR0aHJvdyBuZXcgRXJyb3IoXG5cdFx0XHRcdGBSb290IHBhY2thZ2UuanNvbiBub3QgZm91bmQgYXQgXCIke3dvcmtzcGFjZS5wYWNrYWdlSnNvbkRpcmVjdG9yeX0vcGFja2FnZS5qc29uXCIuIGAgK1xuXHRcdFx0XHRcdGBFbnN1cmUgdGhlIHdvcmtzcGFjZSByb290IGhhcyBhIHBhY2thZ2UuanNvbiB3aXRoIGRlcGVuZGVuY2llcyBsaXN0ZWQuYCxcblx0XHRcdCk7XG5cdFx0fSk7XG5cblx0XHRjb25zdCBpbnRlcm5hbHMgPSBuZXcgTWFwKFxuXHRcdFx0YXdhaXQgUHJvbWlzZS5hbGwoXG5cdFx0XHRcdHByb2plY3RzLm1hcChhc3luYyAocHJvaik6IFByb21pc2U8W3N0cmluZywgUGFja2FnZV0+ID0+IHtcblx0XHRcdFx0XHRjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHByb2ouZ2V0UGFja2FnZUpzb24oKTtcblx0XHRcdFx0XHRyZXR1cm4gW1xuXHRcdFx0XHRcdFx0cGFja2FnZUpzb24ubmFtZSxcblx0XHRcdFx0XHRcdHtcblx0XHRcdFx0XHRcdFx0bmFtZTogcGFja2FnZUpzb24ubmFtZSxcblx0XHRcdFx0XHRcdFx0dmVyc2lvbjogcGFja2FnZUpzb24udmVyc2lvbixcblx0XHRcdFx0XHRcdFx0aXNJbnRlcm5hbDogdHJ1ZSxcblx0XHRcdFx0XHRcdH0sXG5cdFx0XHRcdFx0XTtcblx0XHRcdFx0fSksXG5cdFx0XHQpLFxuXHRcdCk7XG5cblx0XHRjb25zdCBwYWNrYWdlcyA9IE9iamVjdC5lbnRyaWVzKHBhY2thZ2VKc29uLmRlcGVuZGVuY2llcylcblx0XHRcdC5maWx0ZXIoKFtrZXldKSA9PiAhaW50ZXJuYWxzLmhhcyhrZXkpKVxuXHRcdFx0Lm1hcDxbc3RyaW5nLCBQYWNrYWdlXT4oKFtrZXksIHZhbF0pID0+IFtrZXksIHsgbmFtZToga2V5LCB2ZXJzaW9uOiB2YWwgfV0pO1xuXG5cdFx0Y29uc3QgZGV2UGFja2FnZXMgPSBPYmplY3QuZW50cmllcyhwYWNrYWdlSnNvbi5kZXZEZXBlbmRlbmNpZXMpXG5cdFx0XHQuZmlsdGVyKChba2V5XSkgPT4gIWludGVybmFscy5oYXMoa2V5KSlcblx0XHRcdC5tYXA8W3N0cmluZywgUGFja2FnZV0+KChba2V5LCB2YWxdKSA9PiBba2V5LCB7IG5hbWU6IGtleSwgdmVyc2lvbjogdmFsLCBpc0RldjogdHJ1ZSB9XSk7XG5cblx0XHRyZXR1cm4gbmV3IE1hcChbLi4ucGFja2FnZXMsIC4uLmRldlBhY2thZ2VzLCAuLi5pbnRlcm5hbHNdKTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyBjb21wdXRlUHJvamVjdERlcGVuZGVuY2llcyhcblx0XHRwcm9qZWN0OiBQcm9qZWN0LFxuXHRcdHdvcmtzcGFjZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQYWNrYWdlPixcblx0KTogUHJvbWlzZTxQcm9qZWN0RGVwZW5kZW5jaWVzPiB7XG5cdFx0Y29uc3QgeyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgd2FybmluZ3MgfSA9IGF3YWl0IHRoaXMuZ2V0RGVwZW5kZW5jaWVzKFxuXHRcdFx0cHJvamVjdCxcblx0XHRcdHdvcmtzcGFjZVBhY2thZ2VzLFxuXHRcdCk7XG5cblx0XHRjb25zdCBwa2cgPSBhd2FpdCBwcm9qZWN0LmdldFBhY2thZ2VKc29uKCk7XG5cdFx0Y29uc3QgdXBkYXRlZFBhY2thZ2UgPSBwa2dcblx0XHRcdC53aXRoRGVwZW5kZW5jaWVzKGRlcGVuZGVuY2llcylcblx0XHRcdC53aXRoRGV2RGVwZW5kZW5jaWVzKGRldkRlcGVuZGVuY2llcyk7XG5cblx0XHRyZXR1cm4geyBwcm9qZWN0LCB1cGRhdGVkUGFja2FnZSwgd2FybmluZ3MgfTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZ2V0RGVwZW5kZW5jaWVzKHByb2plY3Q6IFByb2plY3QsIHdvcmtzcGFjZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQYWNrYWdlPikge1xuXHRcdGNvbnN0IGZpbGVzID0gYXdhaXQgcHJvamVjdC5nZXRBbGxGaWxlcygpO1xuXHRcdGNvbnN0IHJlc3VsdHMgPSBhd2FpdCBQcm9taXNlLmFsbChmaWxlcy5tYXAoKGZpbGUpID0+IHRoaXMuZ2V0RmlsZUltcG9ydHMoZmlsZSkpKTtcblx0XHRjb25zdCBpbXBvcnRzID0gcmVzdWx0cy5mbGF0TWFwKChyKSA9PiByLmltcG9ydHMpO1xuXHRcdGNvbnN0IHdhcm5pbmdzID0gcmVzdWx0cy5mbGF0TWFwKChyKSA9PiByLndhcm5pbmdzKTtcblxuXHRcdGNvbnN0IGFsbERlcGVuZGVuY2llcyA9IFsuLi5uZXcgU2V0KGltcG9ydHMpXVxuXHRcdFx0Lm1hcCgoZmlsZUltcG9ydCkgPT4gdGhpcy5nZXREZXBlbmRlbmN5RnJvbShmaWxlSW1wb3J0LCB3b3Jrc3BhY2VQYWNrYWdlcykpXG5cdFx0XHQuZmlsdGVyKChkZXApID0+IGRlcCAhPSBudWxsKTtcblxuXHRcdGNvbnN0IG1pc3NpbmcgPSBhbGxEZXBlbmRlbmNpZXMuZmlsdGVyKFxuXHRcdFx0KGRlcCk6IGRlcCBpcyBSZXNvbHZlZERlcGVuZGVuY3kgJiB7IG1pc3Npbmc6IHRydWUgfSA9PiBkZXAubWlzc2luZyxcblx0XHQpO1xuXG5cdFx0aWYgKG1pc3NpbmcubGVuZ3RoID4gMCkge1xuXHRcdFx0Y29uc3QgbmFtZXMgPSBtaXNzaW5nLm1hcCgoZGVwKSA9PiBkZXAubmFtZSkuam9pbihcIiwgXCIpO1xuXHRcdFx0dGhyb3cgbmV3IEZvcmdlRXJyb3IoYE1pc3NpbmcgcGFja2FnZXMgaW4gcHJvamVjdCBcIiR7cHJvamVjdC5uYW1lfVwiOiAke25hbWVzfWApO1xuXHRcdH1cblxuXHRcdGNvbnN0IHJlc29sdmVkID0gYWxsRGVwZW5kZW5jaWVzLmZpbHRlcihcblx0XHRcdChkZXApOiBkZXAgaXMgUmVzb2x2ZWREZXBlbmRlbmN5ICYgeyBtaXNzaW5nOiBmYWxzZSB9ID0+ICFkZXAubWlzc2luZyxcblx0XHQpO1xuXG5cdFx0Y29uc3QgZGVwZW5kZW5jaWVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuXHRcdFx0cmVzb2x2ZWRcblx0XHRcdFx0LmZpbHRlcigoZGVwKSA9PiAhZGVwLmlzRGV2KVxuXHRcdFx0XHQubWFwPFtzdHJpbmcsIHN0cmluZ10+KChkZXApID0+IFtkZXAubmFtZSwgZGVwLnZlcnNpb25dKSxcblx0XHQpO1xuXG5cdFx0Y29uc3QgZGV2RGVwZW5kZW5jaWVzID0gT2JqZWN0LmZyb21FbnRyaWVzKFxuXHRcdFx0cmVzb2x2ZWRcblx0XHRcdFx0LmZpbHRlcigoZGVwKSA9PiBkZXAuaXNEZXYpXG5cdFx0XHRcdC5tYXA8W3N0cmluZywgc3RyaW5nXT4oKGRlcCkgPT4gW2RlcC5uYW1lLCBkZXAudmVyc2lvbl0pLFxuXHRcdCk7XG5cblx0XHRyZXR1cm4geyBkZXBlbmRlbmNpZXMsIGRldkRlcGVuZGVuY2llcywgd2FybmluZ3MgfTtcblx0fVxuXG5cdHByaXZhdGUgZ2V0RGVwZW5kZW5jeUZyb20oXG5cdFx0aW1wb3J0TmFtZTogc3RyaW5nLFxuXHRcdHdvcmtzcGFjZVBhY2thZ2VzOiBNYXA8c3RyaW5nLCBQYWNrYWdlPixcblx0KTogUmVzb2x2ZWREZXBlbmRlbmN5IHwgdW5kZWZpbmVkIHtcblx0XHRpZiAoaW1wb3J0TmFtZS5zdGFydHNXaXRoKFwiLlwiKSB8fCBpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCJub2RlOlwiKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHBhY2thZ2VOYW1lTWF0Y2ggPSBpbXBvcnROYW1lLm1hdGNoKC9eKD86KEBbXi9dK1xcL1teL10rKXwoW14vXSspKS8pO1xuXHRcdGNvbnN0IHBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWVNYXRjaD8uWzBdO1xuXG5cdFx0aWYgKHBhY2thZ2VOYW1lID09IG51bGwgfHwgQlVJTFRfSU5fTU9EVUxFUy5pbmNsdWRlcyhwYWNrYWdlTmFtZSkpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRjb25zdCBwYWNrZyA9IHdvcmtzcGFjZVBhY2thZ2VzLmdldChwYWNrYWdlTmFtZSk7XG5cblx0XHRpZiAocGFja2cgPT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0bmFtZTogcGFja2FnZU5hbWUsXG5cdFx0XHRcdHZlcnNpb246IHVuZGVmaW5lZCxcblx0XHRcdFx0aW50ZXJuYWw6IHVuZGVmaW5lZCxcblx0XHRcdFx0bWlzc2luZzogdHJ1ZSxcblx0XHRcdFx0aXNEZXY6IGZhbHNlLFxuXHRcdFx0fTtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0bmFtZTogcGFja2FnZU5hbWUsXG5cdFx0XHR2ZXJzaW9uOiBwYWNrZy52ZXJzaW9uID8/IFwiXCIsXG5cdFx0XHRpbnRlcm5hbDogcGFja2cuaXNJbnRlcm5hbCA/PyBmYWxzZSxcblx0XHRcdG1pc3Npbmc6IGZhbHNlLFxuXHRcdFx0aXNEZXY6IHBhY2tnLmlzRGV2ID8/IGZhbHNlLFxuXHRcdH07XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGdldEZpbGVJbXBvcnRzKFxuXHRcdGZpbGU6IEZpbGVFeCxcblx0KTogUHJvbWlzZTx7IGltcG9ydHM6IHN0cmluZ1tdOyB3YXJuaW5nczogRGVwZW5kZW5jeVdhcm5pbmdbXSB9PiB7XG5cdFx0Y29uc3QgY29udGVudHMgPSBhd2FpdCBpby5yZWFkRmlsZShmaWxlLmZ1bGxQYXRoKTtcblx0XHRjb25zdCBwYXJzZWQgPSBBcnJheS5mcm9tKGF3YWl0IHBhcnNlSW1wb3J0cyhjb250ZW50cykpO1xuXG5cdFx0Y29uc3QgaW1wb3J0czogc3RyaW5nW10gPSBbXTtcblx0XHRjb25zdCB3YXJuaW5nczogRGVwZW5kZW5jeVdhcm5pbmdbXSA9IFtdO1xuXG5cdFx0Zm9yIChjb25zdCBpbXB0IG9mIHBhcnNlZCkge1xuXHRcdFx0aWYgKGltcHQubW9kdWxlU3BlY2lmaWVyLnZhbHVlICE9IG51bGwpIHtcblx0XHRcdFx0aW1wb3J0cy5wdXNoKGltcHQubW9kdWxlU3BlY2lmaWVyLnZhbHVlKTtcblx0XHRcdH0gZWxzZSBpZiAoaW1wdC5pc0R5bmFtaWNJbXBvcnQpIHtcblx0XHRcdFx0Y29uc3QgbGluZSA9IGNvbnRlbnRzLnN1YnN0cmluZygwLCBpbXB0LnN0YXJ0SW5kZXgpLnNwbGl0KFwiXFxuXCIpLmxlbmd0aDtcblx0XHRcdFx0d2FybmluZ3MucHVzaCh7XG5cdFx0XHRcdFx0ZmlsZTogZmlsZS5mdWxsUGF0aCxcblx0XHRcdFx0XHRsaW5lLFxuXHRcdFx0XHRcdG1lc3NhZ2U6IGBEeW5hbWljIGltcG9ydCB3aXRoIG5vbi1saXRlcmFsIHNwZWNpZmllciBcXGAke2ltcHQubW9kdWxlU3BlY2lmaWVyLmNvZGV9XFxgIGNhbm5vdCBiZSBzdGF0aWNhbGx5IHJlc29sdmVkYCxcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHsgaW1wb3J0cywgd2FybmluZ3MgfTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkRlcGVuZGVuY3lSZXNvbHZlciIsImNvbXB1dGVEcmlmdCIsImN1cnJlbnQiLCJjb21wdXRlZCIsInNvcnRLZXlzIiwib2JqIiwiT2JqZWN0IiwiZnJvbUVudHJpZXMiLCJlbnRyaWVzIiwic29ydCIsImN1cnJlbnREZXBzIiwiZGVwZW5kZW5jaWVzIiwiY29tcHV0ZWREZXBzIiwiY3VycmVudERldkRlcHMiLCJkZXZEZXBlbmRlbmNpZXMiLCJjb21wdXRlZERldkRlcHMiLCJoYXNEcmlmdCIsIkpTT04iLCJzdHJpbmdpZnkiLCJvcmlnaW5hbCIsInVwZGF0ZWQiLCJnZXRXb3Jrc3BhY2VQYWNrYWdlcyIsIndvcmtzcGFjZSIsInByb2plY3RzIiwicGFja2FnZUpzb24iLCJnZXRQYWNrYWdlSnNvbiIsImNhdGNoIiwiRXJyb3IiLCJwYWNrYWdlSnNvbkRpcmVjdG9yeSIsImludGVybmFscyIsIk1hcCIsIlByb21pc2UiLCJhbGwiLCJtYXAiLCJwcm9qIiwibmFtZSIsInZlcnNpb24iLCJpc0ludGVybmFsIiwicGFja2FnZXMiLCJmaWx0ZXIiLCJrZXkiLCJoYXMiLCJ2YWwiLCJkZXZQYWNrYWdlcyIsImlzRGV2IiwiY29tcHV0ZVByb2plY3REZXBlbmRlbmNpZXMiLCJwcm9qZWN0Iiwid29ya3NwYWNlUGFja2FnZXMiLCJ3YXJuaW5ncyIsImdldERlcGVuZGVuY2llcyIsInBrZyIsInVwZGF0ZWRQYWNrYWdlIiwid2l0aERlcGVuZGVuY2llcyIsIndpdGhEZXZEZXBlbmRlbmNpZXMiLCJmaWxlcyIsImdldEFsbEZpbGVzIiwicmVzdWx0cyIsImZpbGUiLCJnZXRGaWxlSW1wb3J0cyIsImltcG9ydHMiLCJmbGF0TWFwIiwiciIsImFsbERlcGVuZGVuY2llcyIsIlNldCIsImZpbGVJbXBvcnQiLCJnZXREZXBlbmRlbmN5RnJvbSIsImRlcCIsIm1pc3NpbmciLCJsZW5ndGgiLCJuYW1lcyIsImpvaW4iLCJGb3JnZUVycm9yIiwicmVzb2x2ZWQiLCJpbXBvcnROYW1lIiwic3RhcnRzV2l0aCIsInBhY2thZ2VOYW1lTWF0Y2giLCJtYXRjaCIsInBhY2thZ2VOYW1lIiwiQlVJTFRfSU5fTU9EVUxFUyIsImluY2x1ZGVzIiwicGFja2ciLCJnZXQiLCJ1bmRlZmluZWQiLCJpbnRlcm5hbCIsImNvbnRlbnRzIiwiaW8iLCJyZWFkRmlsZSIsImZ1bGxQYXRoIiwicGFyc2VkIiwiQXJyYXkiLCJmcm9tIiwicGFyc2VJbXBvcnRzIiwiaW1wdCIsIm1vZHVsZVNwZWNpZmllciIsInZhbHVlIiwicHVzaCIsImlzRHluYW1pY0ltcG9ydCIsImxpbmUiLCJzdWJzdHJpbmciLCJzdGFydEluZGV4Iiwic3BsaXQiLCJtZXNzYWdlIiwiY29kZSJdLCJtYXBwaW5ncyI6Ijs7OzsrQkFvQmFBOzs7ZUFBQUE7Ozs0QkFwQmM7b0JBRUs7OEJBQ0g7dUJBQ0k7d0JBQ047Ozs7Ozs7QUFlcEIsTUFBTUE7SUFDTEMsYUFBYUMsT0FBb0IsRUFBRUMsUUFBcUIsRUFBcUI7UUFDbkYsTUFBTUMsV0FBVyxDQUFDQyxNQUNqQkMsT0FBT0MsV0FBVyxDQUFDRCxP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
|
|
@@ -1,232 +0,0 @@
|
|
|
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,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9ob21lL3J1bm5lci93b3JrL2RlY29oZXJlL2RlY29oZXJlL3Byb2plY3RzL2ZvcmdlL3NyYy9zZXJ2aWNlcy9maWxlLXdyaXRlci5zZXJ2aWNlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBmcyBmcm9tIFwibm9kZTpmcy9wcm9taXNlc1wiO1xuaW1wb3J0IHsgaW5qZWN0YWJsZSB9IGZyb20gXCJAZGVjb2hlcmUvY3J1Y2libGUvZGVjb3JhdG9yc1wiO1xuaW1wb3J0IHR5cGUgeyBQcm9qZWN0IH0gZnJvbSBcIkBkZWNvaGVyZS9tZXNoXCI7XG5pbXBvcnQgeyBUcmFjZSB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvZGlhZ25vc3RpY3NcIjtcbmltcG9ydCB7IGlvIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9pb1wiO1xuaW1wb3J0IFwiLi4vZXh0ZW5zaW9ucy9wcm9qZWN0LmV4dGVuc2lvbnMuanNcIjtcbmltcG9ydCB0eXBlIHsgQnVpbGRUYXJnZXQgfSBmcm9tIFwiLi4vdHlwZXMvYnVpbGQtdGFyZ2V0LnR5cGUuanNcIjtcbmltcG9ydCB0eXBlIHsgVHJhbnNmb3JtUmVzcG9uc2UgfSBmcm9tIFwiLi4vdHlwZXMvdHJhbnNmb3JtLXJlc3BvbnNlLm1vZGVsLmpzXCI7XG5cbmNvbnN0IERFRkFVTFRfV1JJVEVfQ09OQ1VSUkVOQ1kgPSAxNjtcblxuQFRyYWNlXG5AaW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgRmlsZVdyaXRlclNlcnZpY2Uge1xuXHQjYXJ0aWZhY3RCeVBhdGggPSBuZXcgTWFwPHN0cmluZywgc3RyaW5nPigpO1xuXHQjd2FybXVwU2lnbmF0dXJlID0gXCJcIjtcblx0I3dhcm11cFByb21pc2U6IFByb21pc2U8dm9pZD4gfCB1bmRlZmluZWQ7XG5cdCNpbml0aWFsaXplZCA9IGZhbHNlO1xuXHQjcGVuZGluZ1dyaXRlczogVHJhbnNmb3JtUmVzcG9uc2VbXSA9IFtdO1xuXHQjYWN0aXZlV29ya2VycyA9IDA7XG5cdCNkcmFpblJlc29sdmVyczogQXJyYXk8KCkgPT4gdm9pZD4gPSBbXTtcblx0I2Vuc3VyZWREaXJzID0gbmV3IFNldDxzdHJpbmc+KCk7XG5cdCNlbnN1cmVEaXJQcm9taXNlcyA9IG5ldyBNYXA8c3RyaW5nLCBQcm9taXNlPHZvaWQ+PigpO1xuXHQjd29ya2VyRXJyb3I6IHVua25vd247XG5cblx0cHVibGljIGFzeW5jIGluaXRpYWxpemUoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuI2luaXRpYWxpemVkKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuI2luaXRpYWxpemVkID0gdHJ1ZTtcblx0fVxuXG5cdHB1YmxpYyBhc3luYyB3YXJtdXAocHJvamVjdHM6IFByb2plY3RbXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGNvbnN0IG91dHB1dERpcnMgPSB0aGlzLmdldE91dHB1dERpcnMocHJvamVjdHMpO1xuXHRcdGNvbnN0IHNpZ25hdHVyZSA9IG91dHB1dERpcnMuam9pbihcInxcIik7XG5cdFx0aWYgKHNpZ25hdHVyZSA9PT0gdGhpcy4jd2FybXVwU2lnbmF0dXJlICYmIHRoaXMuI3dhcm11cFByb21pc2UgIT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuI3dhcm11cFByb21pc2U7XG5cdFx0fVxuXG5cdFx0dGhpcy4jd2FybXVwU2lnbmF0dXJlID0gc2lnbmF0dXJlO1xuXHRcdHRoaXMuI2Vuc3VyZWREaXJzLmNsZWFyKCk7XG5cdFx0dGhpcy4jZW5zdXJlRGlyUHJvbWlzZXMuY2xlYXIoKTtcblx0XHR0aGlzLiN3b3JrZXJFcnJvciA9IHVuZGVmaW5lZDtcblx0XHR0aGlzLiN3YXJtdXBQcm9taXNlID0gdGhpcy5sb2FkRXhpc3RpbmdBcnRpZmFjdHMob3V0cHV0RGlycyk7XG5cdFx0cmV0dXJuIHRoaXMuI3dhcm11cFByb21pc2U7XG5cdH1cblxuXHRwdWJsaWMgZW5xdWV1ZU91dHB1dChyZXNwb25zZTogVHJhbnNmb3JtUmVzcG9uc2UpOiB2b2lkIHtcblx0XHRpZiAodGhpcy4jd29ya2VyRXJyb3IgIT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAocmVzcG9uc2Uub3V0Y29tZSAhPT0gXCJzdWNjZXNzXCIgfHwgcmVzcG9uc2Uub3V0cHV0UGF0aCA9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuI3BlbmRpbmdXcml0ZXMucHVzaChyZXNwb25zZSk7XG5cdFx0dGhpcy5zdGFydFdvcmtlcnMoKTtcblx0fVxuXG5cdHB1YmxpYyBlbnF1ZXVlT3V0cHV0cyhyZXNwb25zZXM6IFRyYW5zZm9ybVJlc3BvbnNlW10pOiB2b2lkIHtcblx0XHRmb3IgKGNvbnN0IHJlc3BvbnNlIG9mIHJlc3BvbnNlcykge1xuXHRcdFx0dGhpcy5lbnF1ZXVlT3V0cHV0KHJlc3BvbnNlKTtcblx0XHR9XG5cdH1cblxuXHRwdWJsaWMgYXN5bmMgZmx1c2goKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0aWYgKHRoaXMuI3dhcm11cFByb21pc2UgIT0gbnVsbCkge1xuXHRcdFx0YXdhaXQgdGhpcy4jd2FybXVwUHJvbWlzZTtcblx0XHR9XG5cdFx0aWYgKHRoaXMuI3BlbmRpbmdXcml0ZXMubGVuZ3RoID09PSAwICYmIHRoaXMuI2FjdGl2ZVdvcmtlcnMgPT09IDApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0YXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUpID0+IHtcblx0XHRcdHRoaXMuI2RyYWluUmVzb2x2ZXJzLnB1c2gocmVzb2x2ZSk7XG5cdFx0fSk7XG5cdFx0aWYgKHRoaXMuI3dvcmtlckVycm9yICE9IG51bGwpIHtcblx0XHRcdHRocm93IHRoaXMuI3dvcmtlckVycm9yO1xuXHRcdH1cblx0fVxuXG5cdHByaXZhdGUgZ2V0T3V0cHV0RGlycyhwcm9qZWN0czogUHJvamVjdFtdKTogc3RyaW5nW10ge1xuXHRcdGNvbnN0IGRpcnMgPSBuZXcgU2V0PHN0cmluZz4oKTtcblx0XHRmb3IgKGNvbnN0IHByb2plY3Qgb2YgcHJvamVjdHMpIHtcblx0XHRcdGZvciAoY29uc3QgdGFyZ2V0IG9mIHByb2plY3QuZ2V0Rm9yZ2VDb25maWd1cmF0aW9uKCkudGFyZ2V0cykge1xuXHRcdFx0XHRkaXJzLmFkZChwcm9qZWN0LmdldE91dERpcih0YXJnZXQgYXMgQnVpbGRUYXJnZXQpKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0cmV0dXJuIFsuLi5kaXJzXS5zb3J0KCk7XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIGxvYWRFeGlzdGluZ0FydGlmYWN0cyhvdXRwdXREaXJzOiBzdHJpbmdbXSk6IFByb21pc2U8dm9pZD4ge1xuXHRcdHRoaXMuI2FydGlmYWN0QnlQYXRoLmNsZWFyKCk7XG5cblx0XHRjb25zdCBmaWxlczogc3RyaW5nW10gPSBbXTtcblx0XHRmb3IgKGNvbnN0IGRpciBvZiBvdXRwdXREaXJzKSB7XG5cdFx0XHRmaWxlcy5wdXNoKC4uLihhd2FpdCB0aGlzLmNvbGxlY3RGaWxlcyhkaXIpKSk7XG5cdFx0fVxuXG5cdFx0YXdhaXQgdGhpcy53aXRoQ29uY3VycmVuY3koZmlsZXMsIHRoaXMuZ2V0V3JpdGVDb25jdXJyZW5jeSgpLCBhc3luYyAoZmlsZVBhdGgpID0+IHtcblx0XHRcdGNvbnN0IGNvbnRlbnQgPSBhd2FpdCBmcy5yZWFkRmlsZShmaWxlUGF0aCwgXCJ1dGY4XCIpO1xuXHRcdFx0dGhpcy4jYXJ0aWZhY3RCeVBhdGguc2V0KGZpbGVQYXRoLCBjb250ZW50KTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgY29sbGVjdEZpbGVzKHJvb3REaXI6IHN0cmluZyk6IFByb21pc2U8c3RyaW5nW10+IHtcblx0XHR0cnkge1xuXHRcdFx0Y29uc3QgZW50cmllcyA9IGF3YWl0IGZzLnJlYWRkaXIocm9vdERpciwgeyB3aXRoRmlsZVR5cGVzOiB0cnVlIH0pO1xuXHRcdFx0Y29uc3QgZmlsZXM6IHN0cmluZ1tdID0gW107XG5cdFx0XHRmb3IgKGNvbnN0IGVudHJ5IG9mIGVudHJpZXMpIHtcblx0XHRcdFx0Y29uc3QgZnVsbFBhdGggPSBgJHtyb290RGlyfS8ke2VudHJ5Lm5hbWV9YDtcblx0XHRcdFx0aWYgKGVudHJ5LmlzRGlyZWN0b3J5KCkpIHtcblx0XHRcdFx0XHRmaWxlcy5wdXNoKC4uLihhd2FpdCB0aGlzLmNvbGxlY3RGaWxlcyhmdWxsUGF0aCkpKTtcblx0XHRcdFx0fSBlbHNlIGlmIChlbnRyeS5pc0ZpbGUoKSkge1xuXHRcdFx0XHRcdGZpbGVzLnB1c2goZnVsbFBhdGgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmlsZXM7XG5cdFx0fSBjYXRjaCB7XG5cdFx0XHRyZXR1cm4gW107XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBnZXRXcml0ZUNvbmN1cnJlbmN5KCk6IG51bWJlciB7XG5cdFx0Y29uc3QgcmVxdWVzdGVkID0gTnVtYmVyKHByb2Nlc3MuZW52LkZPUkdFX1dSSVRFX0NPTkNVUlJFTkNZKTtcblx0XHRpZiAoTnVtYmVyLmlzRmluaXRlKHJlcXVlc3RlZCkgJiYgcmVxdWVzdGVkID4gMCkge1xuXHRcdFx0cmV0dXJuIE1hdGguZmxvb3IocmVxdWVzdGVkKTtcblx0XHR9XG5cdFx0cmV0dXJuIERFRkFVTFRfV1JJVEVfQ09OQ1VSUkVOQ1k7XG5cdH1cblxuXHRwcml2YXRlIHN0YXJ0V29ya2VycygpOiB2b2lkIHtcblx0XHRpZiAodGhpcy4jd29ya2VyRXJyb3IgIT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRjb25zdCBtYXhXb3JrZXJzID0gdGhpcy5nZXRXcml0ZUNvbmN1cnJlbmN5KCk7XG5cdFx0d2hpbGUgKHRoaXMuI2FjdGl2ZVdvcmtlcnMgPCBtYXhXb3JrZXJzICYmIHRoaXMuI3BlbmRpbmdXcml0ZXMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhpcy4jYWN0aXZlV29ya2VycyArPSAxO1xuXHRcdFx0dm9pZCB0aGlzLnJ1bldvcmtlcigpLmZpbmFsbHkoKCkgPT4ge1xuXHRcdFx0XHR0aGlzLiNhY3RpdmVXb3JrZXJzIC09IDE7XG5cdFx0XHRcdGlmICh0aGlzLiNwZW5kaW5nV3JpdGVzLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHR0aGlzLnN0YXJ0V29ya2VycygpO1xuXHRcdFx0XHR9IGVsc2UgaWYgKHRoaXMuI2FjdGl2ZVdvcmtlcnMgPT09IDApIHtcblx0XHRcdFx0XHR0aGlzLnJlc29sdmVEcmFpbigpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblx0XHR9XG5cdH1cblxuXHRwcml2YXRlIGFzeW5jIHJ1bldvcmtlcigpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0Y29uc3QgcmVzcG9uc2UgPSB0aGlzLiNwZW5kaW5nV3JpdGVzLnNoaWZ0KCk7XG5cdFx0XHRpZiAocmVzcG9uc2UgPT0gbnVsbCkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdGlmICh0aGlzLiN3YXJtdXBQcm9taXNlICE9IG51bGwpIHtcblx0XHRcdFx0XHRhd2FpdCB0aGlzLiN3YXJtdXBQcm9taXNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Y29uc3Qgb3V0cHV0UGF0aCA9IHJlc3BvbnNlLm91dHB1dFBhdGg7XG5cdFx0XHRcdGlmIChvdXRwdXRQYXRoID09IG51bGwpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IG91dHB1dERpciA9IHJlc3BvbnNlLm91dHB1dERpcjtcblx0XHRcdFx0aWYgKG91dHB1dERpciAhPSBudWxsKSB7XG5cdFx0XHRcdFx0YXdhaXQgdGhpcy5lbnN1cmVEaXJlY3Rvcnkob3V0cHV0RGlyKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGV4aXN0aW5nID0gdGhpcy4jYXJ0aWZhY3RCeVBhdGguZ2V0KG91dHB1dFBhdGgpO1xuXHRcdFx0XHRpZiAoZXhpc3RpbmcgPT09IHJlc3BvbnNlLmNvZGUpIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGF3YWl0IGlvLndyaXRlRmlsZShvdXRwdXRQYXRoLCByZXNwb25zZS5jb2RlKTtcblx0XHRcdFx0dGhpcy4jYXJ0aWZhY3RCeVBhdGguc2V0KG91dHB1dFBhdGgsIHJlc3BvbnNlLmNvZGUpO1xuXHRcdFx0fSBjYXRjaCAoZXJyb3IpIHtcblx0XHRcdFx0dGhpcy4jd29ya2VyRXJyb3IgPSBlcnJvcjtcblx0XHRcdFx0dGhpcy4jcGVuZGluZ1dyaXRlcyA9IFtdO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cHJpdmF0ZSBlbnN1cmVEaXJlY3RvcnkoZGlyOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRpZiAodGhpcy4jZW5zdXJlZERpcnMuaGFzKGRpcikpIHtcblx0XHRcdHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcblx0XHR9XG5cdFx0Y29uc3QgZXhpc3RpbmcgPSB0aGlzLiNlbnN1cmVEaXJQcm9taXNlcy5nZXQoZGlyKTtcblx0XHRpZiAoZXhpc3RpbmcgIT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuIGV4aXN0aW5nO1xuXHRcdH1cblx0XHRjb25zdCBta2RpclByb21pc2UgPSBmcy5ta2RpcihkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pLnRoZW4oKCkgPT4ge1xuXHRcdFx0dGhpcy4jZW5zdXJlZERpcnMuYWRkKGRpcik7XG5cdFx0XHR0aGlzLiNlbnN1cmVEaXJQcm9taXNlcy5kZWxldGUoZGlyKTtcblx0XHR9KTtcblx0XHR0aGlzLiNlbnN1cmVEaXJQcm9taXNlcy5zZXQoZGlyLCBta2RpclByb21pc2UpO1xuXHRcdHJldHVybiBta2RpclByb21pc2U7XG5cdH1cblxuXHRwcml2YXRlIHJlc29sdmVEcmFpbigpOiB2b2lkIHtcblx0XHRpZiAodGhpcy4jcGVuZGluZ1dyaXRlcy5sZW5ndGggPiAwIHx8IHRoaXMuI2FjdGl2ZVdvcmtlcnMgPiAwKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGZvciAoY29uc3QgcmVzb2x2ZSBvZiB0aGlzLiNkcmFpblJlc29sdmVycykge1xuXHRcdFx0cmVzb2x2ZSgpO1xuXHRcdH1cblx0XHR0aGlzLiNkcmFpblJlc29sdmVycyA9IFtdO1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyB3aXRoQ29uY3VycmVuY3k8VD4oXG5cdFx0aXRlbXM6IFRbXSxcblx0XHRjb25jdXJyZW5jeTogbnVtYmVyLFxuXHRcdHdvcmtlcjogKGl0ZW06IFQpID0+IFByb21pc2U8dm9pZD4sXG5cdCk6IFByb21pc2U8dm9pZD4ge1xuXHRcdGxldCBjdXJzb3IgPSAwO1xuXHRcdGNvbnN0IHdvcmtlckNvdW50ID0gTWF0aC5taW4oY29uY3VycmVuY3ksIGl0ZW1zLmxlbmd0aCk7XG5cdFx0Y29uc3Qgd29ya2VycyA9IEFycmF5LmZyb20oeyBsZW5ndGg6IHdvcmtlckNvdW50IH0sICgpID0+XG5cdFx0XHQoYXN5bmMgKCkgPT4ge1xuXHRcdFx0XHR3aGlsZSAodHJ1ZSkge1xuXHRcdFx0XHRcdGNvbnN0IGluZGV4ID0gY3Vyc29yO1xuXHRcdFx0XHRcdGN1cnNvciArPSAxO1xuXHRcdFx0XHRcdGlmIChpbmRleCA+PSBpdGVtcy5sZW5ndGgpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0YXdhaXQgd29ya2VyKGl0ZW1zW2luZGV4XSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pKCksXG5cdFx0KTtcblx0XHRhd2FpdCBQcm9taXNlLmFsbCh3b3JrZXJzKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbIkZpbGVXcml0ZXJTZXJ2aWNlIiwiREVGQVVMVF9XUklURV9DT05DVVJSRU5DWSIsIk1hcCIsIlNldCIsImluaXRpYWxpemUiLCJ3YXJtdXAiLCJwcm9qZWN0cyIsIm91dHB1dERpcnMiLCJnZXRPdXRwdXREaXJzIiwic2lnbmF0dXJlIiwiam9pbiIsImNsZWFyIiwidW5kZWZpbmVkIiwibG9hZEV4aXN0aW5nQXJ0aWZhY3RzIiwiZW5xdWV1ZU91dHB1dCIsInJlc3BvbnNlIiwib3V0Y29tZSIsIm91dHB1dFBhdGgiLCJwdXNoIiwic3RhcnRXb3JrZXJzIiwiZW5xdWV1ZU91dHB1dHMiLCJyZXNwb25zZXMiLCJmbHVzaCIsImxlbmd0aCIsIlByb21pc2UiLCJyZXNvbHZlIiwiZGlycyIsInByb2plY3QiLCJ0YXJnZXQiLCJnZXRGb3JnZUNvbmZpZ3VyYXRpb24iLCJ0YXJnZXRzIiwiYWRkIiwiZ2V0T3V0RGlyIiwic29ydCIsImZpbGVzIiwiZGlyIiwiY29sbGVjdEZpbGVzIiwid2l0aENvbmN1cnJlbmN5IiwiZ2V0V3JpdGVDb25jdXJyZW5jeSIsImZpbGVQYXRoIiwiY29udGVudCIsImZzIiwicmVhZEZpbGUiLCJzZXQiLCJyb290RGlyIiwiZW50cmllcyIsInJlYWRkaXIiLCJ3aXRoRmlsZVR5cGVzIiwiZW50cnkiLCJmdWxsUGF0aCIsIm5hbWUiLCJpc0RpcmVjdG9yeSIsImlzRmlsZSIsInJlcXVlc3RlZCIsIk51bWJlciIsInByb2Nlc3MiLCJlbnYiLCJGT1JHRV9XUklURV9DT05DVVJSRU5DWSIsImlzRmluaXRlIiwiTWF0aCIsImZsb29yIiwibWF4V29ya2VycyIsInJ1bldvcmtlciIsImZpbmFsbHkiLCJyZXNvbHZlRHJhaW4iLCJzaGlmdCIsIm91dHB1dERpciIsImVuc3VyZURpcmVjdG9yeSIsImV4aXN0aW5nIiwiZ2V0IiwiY29kZSIsImlvIiwid3JpdGVGaWxlIiwiZXJyb3IiLCJoYXMiLCJta2RpclByb21pc2UiLCJta2RpciIsInJlY3Vyc2l2ZSIsInRoZW4iLCJkZWxldGUiLCJpdGVtcyIsImNvbmN1cnJlbmN5Iiwid29ya2VyIiwiY3Vyc29yIiwid29ya2VyQ291bnQiLCJtaW4iLCJ3b3JrZXJzIiwiQXJyYXkiLCJmcm9tIiwiaW5kZXgiLCJhbGwiXSwibWFwcGluZ3MiOiI7Ozs7K0JBYWFBOzs7ZUFBQUE7OztpRUFiRTs0QkFDWTs2QkFFTDtvQkFDSDtRQUNaOzs7Ozs7Ozs7Ozs7QUFJUCxNQUFNQyw0QkFBNEI7QUFJM0IsTUFBTUQ7SUFDWixDQUFBLGNBQWUsR0FB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
|