@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,51 @@
|
|
|
1
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
}
|
|
7
|
+
function _ts_metadata(k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
}
|
|
10
|
+
import path from "node:path";
|
|
11
|
+
import { Project } from "@decohere/mesh";
|
|
12
|
+
import { memoize } from "@decohere/nexus/caching";
|
|
13
|
+
import { extension } from "@decohere/nexus/extensibility";
|
|
14
|
+
import { io } from "@decohere/nexus/io";
|
|
15
|
+
import { SWC_CONFIG } from "../const.js";
|
|
16
|
+
import { SwcConfig } from "../types/swc-config.type.js";
|
|
17
|
+
export class ProjectExtensions {
|
|
18
|
+
static getForgeConfiguration(project) {
|
|
19
|
+
return project.configuration;
|
|
20
|
+
}
|
|
21
|
+
static async getSwcConfig(project) {
|
|
22
|
+
const projectConfigPath = path.join(project.projectDirectory, SWC_CONFIG);
|
|
23
|
+
if (await io.fileExists(projectConfigPath)) {
|
|
24
|
+
return new SwcConfig(await io.readJsonFile(projectConfigPath));
|
|
25
|
+
}
|
|
26
|
+
const rootConfigPath = path.join(project.rootDir, SWC_CONFIG);
|
|
27
|
+
if (await io.fileExists(rootConfigPath)) {
|
|
28
|
+
return new SwcConfig(await io.readJsonFile(rootConfigPath));
|
|
29
|
+
}
|
|
30
|
+
return new SwcConfig();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
_ts_decorate([
|
|
34
|
+
extension(Project),
|
|
35
|
+
_ts_metadata("design:type", Function),
|
|
36
|
+
_ts_metadata("design:paramtypes", [
|
|
37
|
+
typeof Project === "undefined" ? Object : Project
|
|
38
|
+
]),
|
|
39
|
+
_ts_metadata("design:returntype", typeof ForgeConfiguration === "undefined" ? Object : ForgeConfiguration)
|
|
40
|
+
], ProjectExtensions, "getForgeConfiguration", null);
|
|
41
|
+
_ts_decorate([
|
|
42
|
+
extension(Project),
|
|
43
|
+
memoize(),
|
|
44
|
+
_ts_metadata("design:type", Function),
|
|
45
|
+
_ts_metadata("design:paramtypes", [
|
|
46
|
+
typeof Project === "undefined" ? Object : Project
|
|
47
|
+
]),
|
|
48
|
+
_ts_metadata("design:returntype", Promise)
|
|
49
|
+
], ProjectExtensions, "getSwcConfig", null);
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvZm9yZ2Uvc3JjL2V4dGVuc2lvbnMvcHJvamVjdC5leHRlbnNpb25zLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IFByb2plY3QgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB7IG1lbW9pemUgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NhY2hpbmdcIjtcbmltcG9ydCB7IGV4dGVuc2lvbiB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvZXh0ZW5zaWJpbGl0eVwiO1xuaW1wb3J0IHsgaW8gfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2lvXCI7XG5pbXBvcnQgeyBTV0NfQ09ORklHIH0gZnJvbSBcIi4uL2NvbnN0LmpzXCI7XG5pbXBvcnQgdHlwZSB7IEZvcmdlQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuLi90eXBlcy9jb25maWd1cmF0aW9uLnR5cGUuanNcIjtcbmltcG9ydCB7IFN3Y0NvbmZpZyB9IGZyb20gXCIuLi90eXBlcy9zd2MtY29uZmlnLnR5cGUuanNcIjtcblxuZGVjbGFyZSBtb2R1bGUgXCJAZGVjb2hlcmUvbWVzaFwiIHtcblx0aW50ZXJmYWNlIFByb2plY3Qge1xuXHRcdGdldEZvcmdlQ29uZmlndXJhdGlvbigpOiBGb3JnZUNvbmZpZ3VyYXRpb247XG5cdFx0Z2V0U3djQ29uZmlnKCk6IFByb21pc2U8U3djQ29uZmlnPjtcblx0fVxufVxuXG5leHBvcnQgY2xhc3MgUHJvamVjdEV4dGVuc2lvbnMge1xuXHRAZXh0ZW5zaW9uKFByb2plY3QpXG5cdHB1YmxpYyBzdGF0aWMgZ2V0Rm9yZ2VDb25maWd1cmF0aW9uKHByb2plY3Q6IFByb2plY3QpOiBGb3JnZUNvbmZpZ3VyYXRpb24ge1xuXHRcdHJldHVybiBwcm9qZWN0LmNvbmZpZ3VyYXRpb24gYXMgRm9yZ2VDb25maWd1cmF0aW9uO1xuXHR9XG5cblx0QGV4dGVuc2lvbihQcm9qZWN0KVxuXHRAbWVtb2l6ZSgpXG5cdHB1YmxpYyBzdGF0aWMgYXN5bmMgZ2V0U3djQ29uZmlnKHByb2plY3Q6IFByb2plY3QpOiBQcm9taXNlPFN3Y0NvbmZpZz4ge1xuXHRcdGNvbnN0IHByb2plY3RDb25maWdQYXRoID0gcGF0aC5qb2luKHByb2plY3QucHJvamVjdERpcmVjdG9yeSwgU1dDX0NPTkZJRyk7XG5cdFx0aWYgKGF3YWl0IGlvLmZpbGVFeGlzdHMocHJvamVjdENvbmZpZ1BhdGgpKSB7XG5cdFx0XHRyZXR1cm4gbmV3IFN3Y0NvbmZpZyhhd2FpdCBpby5yZWFkSnNvbkZpbGUocHJvamVjdENvbmZpZ1BhdGgpKTtcblx0XHR9XG5cblx0XHRjb25zdCByb290Q29uZmlnUGF0aCA9IHBhdGguam9pbihwcm9qZWN0LnJvb3REaXIsIFNXQ19DT05GSUcpO1xuXHRcdGlmIChhd2FpdCBpby5maWxlRXhpc3RzKHJvb3RDb25maWdQYXRoKSkge1xuXHRcdFx0cmV0dXJuIG5ldyBTd2NDb25maWcoYXdhaXQgaW8ucmVhZEpzb25GaWxlKHJvb3RDb25maWdQYXRoKSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIG5ldyBTd2NDb25maWcoKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbInBhdGgiLCJQcm9qZWN0IiwibWVtb2l6ZSIsImV4dGVuc2lvbiIsImlvIiwiU1dDX0NPTkZJRyIsIlN3Y0NvbmZpZyIsIlByb2plY3RFeHRlbnNpb25zIiwiZ2V0Rm9yZ2VDb25maWd1cmF0aW9uIiwicHJvamVjdCIsImNvbmZpZ3VyYXRpb24iLCJnZXRTd2NDb25maWciLCJwcm9qZWN0Q29uZmlnUGF0aCIsImpvaW4iLCJwcm9qZWN0RGlyZWN0b3J5IiwiZmlsZUV4aXN0cyIsInJlYWRKc29uRmlsZSIsInJvb3RDb25maWdQYXRoIiwicm9vdERpciJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBT0EsVUFBVSxZQUFZO0FBQzdCLFNBQVNDLE9BQU8sUUFBUSxpQkFBaUI7QUFDekMsU0FBU0MsT0FBTyxRQUFRLDBCQUEwQjtBQUNsRCxTQUFTQyxTQUFTLFFBQVEsZ0NBQWdDO0FBQzFELFNBQVNDLEVBQUUsUUFBUSxxQkFBcUI7QUFDeEMsU0FBU0MsVUFBVSxRQUFRLGNBQWM7QUFFekMsU0FBU0MsU0FBUyxRQUFRLDhCQUE4QjtBQVN4RCxPQUFPLE1BQU1DO0lBQ1osT0FDY0Msc0JBQXNCQyxPQUFnQixFQUFzQjtRQUN6RSxPQUFPQSxRQUFRQyxhQUFhO0lBQzdCO0lBRUEsYUFFb0JDLGFBQWFGLE9BQWdCLEVBQXNCO1FBQ3RFLE1BQU1HLG9CQUFvQlosS0FBS2EsSUFBSSxDQUFDSixRQUFRSyxnQkFBZ0IsRUFBRVQ7UUFDOUQsSUFBSSxNQUFNRCxHQUFHVyxVQUFVLENBQUNILG9CQUFvQjtZQUMzQyxPQUFPLElBQUlOLFVBQVUsTUFBTUYsR0FBR1ksWUFBWSxDQUFDSjtRQUM1QztRQUVBLE1BQU1LLGlCQUFpQmpCLEtBQUthLElBQUksQ0FBQ0osUUFBUVMsT0FBTyxFQUFFYjtRQUNsRCxJQUFJLE1BQU1ELEdBQUdXLFVBQVUsQ0FBQ0UsaUJBQWlCO1lBQ3hDLE9BQU8sSUFBSVgsVUFBVSxNQUFNRixHQUFHWSxZQUFZLENBQUNDO1FBQzVDO1FBRUEsT0FBTyxJQUFJWDtJQUNaO0FBQ0QifQ==
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
}
|
|
7
|
+
import path from "node:path";
|
|
8
|
+
import { Trace } from "@decohere/nexus/diagnostics";
|
|
9
|
+
import { merge } from "@decohere/nexus/objects";
|
|
10
|
+
import { ForgeError } from "../errors.js";
|
|
11
|
+
const defaultOptions = {
|
|
12
|
+
jsc: {
|
|
13
|
+
parser: {
|
|
14
|
+
syntax: "typescript",
|
|
15
|
+
decorators: true
|
|
16
|
+
},
|
|
17
|
+
target: "esnext",
|
|
18
|
+
transform: {
|
|
19
|
+
decoratorMetadata: true
|
|
20
|
+
},
|
|
21
|
+
experimental: {
|
|
22
|
+
keepImportAttributes: true
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
module: {
|
|
26
|
+
resolveFully: true
|
|
27
|
+
},
|
|
28
|
+
sourceMaps: "inline"
|
|
29
|
+
};
|
|
30
|
+
export class SwcConfigFactory {
|
|
31
|
+
/**
|
|
32
|
+
* Creates a base config for a project+target combination, without a filename.
|
|
33
|
+
* Call once per (project, target) and then use createFileConfig() per file.
|
|
34
|
+
*/ createBaseConfig(buildTarget, configOptions) {
|
|
35
|
+
const { userConfig, tsConfig, aliasPaths } = configOptions;
|
|
36
|
+
const { compilerOptions } = tsConfig ?? {};
|
|
37
|
+
const paths = aliasPaths ? compilerOptions?.paths : undefined;
|
|
38
|
+
const baseUrl = SwcConfigFactory.getBaseUrl(tsConfig) ?? (paths != null ? path.resolve(".") : undefined);
|
|
39
|
+
const options = {
|
|
40
|
+
jsc: {
|
|
41
|
+
baseUrl,
|
|
42
|
+
paths
|
|
43
|
+
},
|
|
44
|
+
module: {
|
|
45
|
+
type: buildTarget
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
return merge.withOptions({
|
|
49
|
+
mergeArrays: false
|
|
50
|
+
}, defaultOptions, options, userConfig ?? {});
|
|
51
|
+
}
|
|
52
|
+
/** Stamps a per-file filename onto a pre-built base config. */ createFileConfig(file, baseConfig) {
|
|
53
|
+
const config = {
|
|
54
|
+
...baseConfig,
|
|
55
|
+
filename: file.fullPath
|
|
56
|
+
};
|
|
57
|
+
this.validate(config);
|
|
58
|
+
return config;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Validates SWC options against known causes of Rust/NAPI process crashes.
|
|
62
|
+
* Throws a ForgeError with a descriptive message instead of letting the
|
|
63
|
+
* NAPI layer abort the process.
|
|
64
|
+
*
|
|
65
|
+
* Known crash causes:
|
|
66
|
+
* - `jsc.baseUrl` set to a relative path (SWC requires an absolute path)
|
|
67
|
+
*/ validate(options) {
|
|
68
|
+
const baseUrl = options.jsc?.baseUrl;
|
|
69
|
+
if (baseUrl != null && !path.isAbsolute(baseUrl)) {
|
|
70
|
+
throw new ForgeError(`SWC config: jsc.baseUrl must be an absolute path to avoid a process crash, got: "${baseUrl}". Use path.resolve() to convert it.`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** Resolves tsconfig baseUrl to an absolute path. Returns undefined if not set. */ static getBaseUrl(tsConfig) {
|
|
74
|
+
const baseUrl = tsConfig?.compilerOptions?.baseUrl;
|
|
75
|
+
if (baseUrl == null) return undefined;
|
|
76
|
+
return path.resolve(baseUrl);
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
SwcConfigFactory = _ts_decorate([
|
|
80
|
+
Trace
|
|
81
|
+
], SwcConfigFactory);
|
|
82
|
+
|
|
83
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvZm9yZ2Uvc3JjL2ZhY3Rvcmllcy9zd2MtY29uZmlnLmZhY3RvcnkudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHBhdGggZnJvbSBcIm5vZGU6cGF0aFwiO1xuaW1wb3J0IHR5cGUgeyBUc2NvbmZpZyB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHsgVHJhY2UgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2RpYWdub3N0aWNzXCI7XG5pbXBvcnQgdHlwZSB7IEZpbGVFeCB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IG1lcmdlIH0gZnJvbSBcIkBkZWNvaGVyZS9uZXh1cy9vYmplY3RzXCI7XG5pbXBvcnQgdHlwZSB7IE9wdGlvbnMgfSBmcm9tIFwiQHN3Yy9jb3JlXCI7XG5pbXBvcnQgeyBGb3JnZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHR5cGUgeyBUcmFuc3BpbGVUYXJnZXQgfSBmcm9tIFwiLi4vdHlwZXMvYnVpbGQtdGFyZ2V0LnR5cGUuanNcIjtcbmltcG9ydCB0eXBlIHsgU3djQ29uZmlnT3B0aW9ucyB9IGZyb20gXCIuLi90eXBlcy9zd2MtY29uZmlnLnR5cGUuanNcIjtcblxuY29uc3QgZGVmYXVsdE9wdGlvbnMgPSB7XG5cdGpzYzoge1xuXHRcdHBhcnNlcjoge1xuXHRcdFx0c3ludGF4OiBcInR5cGVzY3JpcHRcIixcblx0XHRcdGRlY29yYXRvcnM6IHRydWUsXG5cdFx0fSxcblx0XHR0YXJnZXQ6IFwiZXNuZXh0XCIsXG5cdFx0dHJhbnNmb3JtOiB7XG5cdFx0XHRkZWNvcmF0b3JNZXRhZGF0YTogdHJ1ZSxcblx0XHR9LFxuXHRcdGV4cGVyaW1lbnRhbDogeyBrZWVwSW1wb3J0QXR0cmlidXRlczogdHJ1ZSB9LFxuXHR9LFxuXHRtb2R1bGU6IHtcblx0XHRyZXNvbHZlRnVsbHk6IHRydWUsXG5cdH0sXG5cdHNvdXJjZU1hcHM6IFwiaW5saW5lXCIsXG59O1xuXG5AVHJhY2VcbmV4cG9ydCBjbGFzcyBTd2NDb25maWdGYWN0b3J5IHtcblx0LyoqXG5cdCAqIENyZWF0ZXMgYSBiYXNlIGNvbmZpZyBmb3IgYSBwcm9qZWN0K3RhcmdldCBjb21iaW5hdGlvbiwgd2l0aG91dCBhIGZpbGVuYW1lLlxuXHQgKiBDYWxsIG9uY2UgcGVyIChwcm9qZWN0LCB0YXJnZXQpIGFuZCB0aGVuIHVzZSBjcmVhdGVGaWxlQ29uZmlnKCkgcGVyIGZpbGUuXG5cdCAqL1xuXHRwdWJsaWMgY3JlYXRlQmFzZUNvbmZpZyhcblx0XHRidWlsZFRhcmdldDogVHJhbnNwaWxlVGFyZ2V0LFxuXHRcdGNvbmZpZ09wdGlvbnM6IFN3Y0NvbmZpZ09wdGlvbnMsXG5cdCk6IE9wdGlvbnMge1xuXHRcdGNvbnN0IHsgdXNlckNvbmZpZywgdHNDb25maWcsIGFsaWFzUGF0aHMgfSA9IGNvbmZpZ09wdGlvbnM7XG5cdFx0Y29uc3QgeyBjb21waWxlck9wdGlvbnMgfSA9IHRzQ29uZmlnID8/IHt9O1xuXHRcdGNvbnN0IHBhdGhzID0gYWxpYXNQYXRocyA/IGNvbXBpbGVyT3B0aW9ucz8ucGF0aHMgOiB1bmRlZmluZWQ7XG5cdFx0Y29uc3QgYmFzZVVybCA9XG5cdFx0XHRTd2NDb25maWdGYWN0b3J5LmdldEJhc2VVcmwodHNDb25maWcpID8/IChwYXRocyAhPSBudWxsID8gcGF0aC5yZXNvbHZlKFwiLlwiKSA6IHVuZGVmaW5lZCk7XG5cblx0XHRjb25zdCBvcHRpb25zOiBPcHRpb25zID0ge1xuXHRcdFx0anNjOiB7XG5cdFx0XHRcdGJhc2VVcmwsXG5cdFx0XHRcdHBhdGhzLFxuXHRcdFx0fSxcblx0XHRcdG1vZHVsZToge1xuXHRcdFx0XHR0eXBlOiBidWlsZFRhcmdldCxcblx0XHRcdH0sXG5cdFx0fTtcblxuXHRcdHJldHVybiBtZXJnZS53aXRoT3B0aW9uczxPcHRpb25zPihcblx0XHRcdHsgbWVyZ2VBcnJheXM6IGZhbHNlIH0sXG5cdFx0XHRkZWZhdWx0T3B0aW9ucyxcblx0XHRcdG9wdGlvbnMsXG5cdFx0XHR1c2VyQ29uZmlnID8/IHt9LFxuXHRcdCk7XG5cdH1cblxuXHQvKiogU3RhbXBzIGEgcGVyLWZpbGUgZmlsZW5hbWUgb250byBhIHByZS1idWlsdCBiYXNlIGNvbmZpZy4gKi9cblx0cHVibGljIGNyZWF0ZUZpbGVDb25maWcoZmlsZTogRmlsZUV4LCBiYXNlQ29uZmlnOiBPcHRpb25zKTogT3B0aW9ucyB7XG5cdFx0Y29uc3QgY29uZmlnID0geyAuLi5iYXNlQ29uZmlnLCBmaWxlbmFtZTogZmlsZS5mdWxsUGF0aCB9O1xuXHRcdHRoaXMudmFsaWRhdGUoY29uZmlnKTtcblx0XHRyZXR1cm4gY29uZmlnO1xuXHR9XG5cblx0LyoqXG5cdCAqIFZhbGlkYXRlcyBTV0Mgb3B0aW9ucyBhZ2FpbnN0IGtub3duIGNhdXNlcyBvZiBSdXN0L05BUEkgcHJvY2VzcyBjcmFzaGVzLlxuXHQgKiBUaHJvd3MgYSBGb3JnZUVycm9yIHdpdGggYSBkZXNjcmlwdGl2ZSBtZXNzYWdlIGluc3RlYWQgb2YgbGV0dGluZyB0aGVcblx0ICogTkFQSSBsYXllciBhYm9ydCB0aGUgcHJvY2Vzcy5cblx0ICpcblx0ICogS25vd24gY3Jhc2ggY2F1c2VzOlxuXHQgKiAtIGBqc2MuYmFzZVVybGAgc2V0IHRvIGEgcmVsYXRpdmUgcGF0aCAoU1dDIHJlcXVpcmVzIGFuIGFic29sdXRlIHBhdGgpXG5cdCAqL1xuXHRwdWJsaWMgdmFsaWRhdGUob3B0aW9uczogT3B0aW9ucyk6IHZvaWQge1xuXHRcdGNvbnN0IGJhc2VVcmwgPSBvcHRpb25zLmpzYz8uYmFzZVVybDtcblx0XHRpZiAoYmFzZVVybCAhPSBudWxsICYmICFwYXRoLmlzQWJzb2x1dGUoYmFzZVVybCkpIHtcblx0XHRcdHRocm93IG5ldyBGb3JnZUVycm9yKFxuXHRcdFx0XHRgU1dDIGNvbmZpZzoganNjLmJhc2VVcmwgbXVzdCBiZSBhbiBhYnNvbHV0ZSBwYXRoIHRvIGF2b2lkIGEgcHJvY2VzcyBjcmFzaCwgZ290OiBcIiR7YmFzZVVybH1cIi4gVXNlIHBhdGgucmVzb2x2ZSgpIHRvIGNvbnZlcnQgaXQuYCxcblx0XHRcdCk7XG5cdFx0fVxuXHR9XG5cblx0LyoqIFJlc29sdmVzIHRzY29uZmlnIGJhc2VVcmwgdG8gYW4gYWJzb2x1dGUgcGF0aC4gUmV0dXJucyB1bmRlZmluZWQgaWYgbm90IHNldC4gKi9cblx0cHJpdmF0ZSBzdGF0aWMgZ2V0QmFzZVVybCh0c0NvbmZpZzogVHNjb25maWcgfCB1bmRlZmluZWQpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGJhc2VVcmwgPSB0c0NvbmZpZz8uY29tcGlsZXJPcHRpb25zPy5iYXNlVXJsO1xuXHRcdGlmIChiYXNlVXJsID09IG51bGwpIHJldHVybiB1bmRlZmluZWQ7XG5cdFx0cmV0dXJuIHBhdGgucmVzb2x2ZShiYXNlVXJsKTtcblx0fVxufVxuIl0sIm5hbWVzIjpbInBhdGgiLCJUcmFjZSIsIm1lcmdlIiwiRm9yZ2VFcnJvciIsImRlZmF1bHRPcHRpb25zIiwianNjIiwicGFyc2VyIiwic3ludGF4IiwiZGVjb3JhdG9ycyIsInRhcmdldCIsInRyYW5zZm9ybSIsImRlY29yYXRvck1ldGFkYXRhIiwiZXhwZXJpbWVudGFsIiwia2VlcEltcG9ydEF0dHJpYnV0ZXMiLCJtb2R1bGUiLCJyZXNvbHZlRnVsbHkiLCJzb3VyY2VNYXBzIiwiU3djQ29uZmlnRmFjdG9yeSIsImNyZWF0ZUJhc2VDb25maWciLCJidWlsZFRhcmdldCIsImNvbmZpZ09wdGlvbnMiLCJ1c2VyQ29uZmlnIiwidHNDb25maWciLCJhbGlhc1BhdGhzIiwiY29tcGlsZXJPcHRpb25zIiwicGF0aHMiLCJ1bmRlZmluZWQiLCJiYXNlVXJsIiwiZ2V0QmFzZVVybCIsInJlc29sdmUiLCJvcHRpb25zIiwidHlwZSIsIndpdGhPcHRpb25zIiwibWVyZ2VBcnJheXMiLCJjcmVhdGVGaWxlQ29uZmlnIiwiZmlsZSIsImJhc2VDb25maWciLCJjb25maWciLCJmaWxlbmFtZSIsImZ1bGxQYXRoIiwidmFsaWRhdGUiLCJpc0Fic29sdXRlIl0sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPQSxVQUFVLFlBQVk7QUFFN0IsU0FBU0MsS0FBSyxRQUFRLDhCQUE4QjtBQUVwRCxTQUFTQyxLQUFLLFFBQVEsMEJBQTBCO0FBRWhELFNBQVNDLFVBQVUsUUFBUSxlQUFlO0FBSTFDLE1BQU1DLGlCQUFpQjtJQUN0QkMsS0FBSztRQUNKQyxRQUFRO1lBQ1BDLFFBQVE7WUFDUkMsWUFBWTtRQUNiO1FBQ0FDLFFBQVE7UUFDUkMsV0FBVztZQUNWQyxtQkFBbUI7UUFDcEI7UUFDQUMsY0FBYztZQUFFQyxzQkFBc0I7UUFBSztJQUM1QztJQUNBQyxRQUFRO1FBQ1BDLGNBQWM7SUFDZjtJQUNBQyxZQUFZO0FBQ2I7QUFHQSxPQUFPLE1BQU1DO0lBQ1o7OztFQUdDLEdBQ0QsQUFBT0MsaUJBQ05DLFdBQTRCLEVBQzVCQyxhQUErQixFQUNyQjtRQUNWLE1BQU0sRUFBRUMsVUFBVSxFQUFFQyxRQUFRLEVBQUVDLFVBQVUsRUFBRSxHQUFHSDtRQUM3QyxNQUFNLEVBQUVJLGVBQWUsRUFBRSxHQUFHRixZQUFZLENBQUM7UUFDekMsTUFBTUcsUUFBUUYsYUFBYUMsaUJBQWlCQyxRQUFRQztRQUNwRCxNQUFNQyxVQUNMVixpQkFBaUJXLFVBQVUsQ0FBQ04sYUFBY0csQ0FBQUEsU0FBUyxPQUFPekIsS0FBSzZCLE9BQU8sQ0FBQyxPQUFPSCxTQUFRO1FBRXZGLE1BQU1JLFVBQW1CO1lBQ3hCekIsS0FBSztnQkFDSnNCO2dCQUNBRjtZQUNEO1lBQ0FYLFFBQVE7Z0JBQ1BpQixNQUFNWjtZQUNQO1FBQ0Q7UUFFQSxPQUFPakIsTUFBTThCLFdBQVcsQ0FDdkI7WUFBRUMsYUFBYTtRQUFNLEdBQ3JCN0IsZ0JBQ0EwQixTQUNBVCxjQUFjLENBQUM7SUFFakI7SUFFQSw2REFBNkQsR0FDN0QsQUFBT2EsaUJBQWlCQyxJQUFZLEVBQUVDLFVBQW1CLEVBQVc7UUFDbkUsTUFBTUMsU0FBUztZQUFFLEdBQUdELFVBQVU7WUFBRUUsVUFBVUgsS0FBS0ksUUFBUTtRQUFDO1FBQ3hELElBQUksQ0FBQ0MsUUFBUSxDQUFDSDtRQUNkLE9BQU9BO0lBQ1I7SUFFQTs7Ozs7OztFQU9DLEdBQ0QsQUFBT0csU0FBU1YsT0FBZ0IsRUFBUTtRQUN2QyxNQUFNSCxVQUFVRyxRQUFRekIsR0FBRyxFQUFFc0I7UUFDN0IsSUFBSUEsV0FBVyxRQUFRLENBQUMzQixLQUFLeUMsVUFBVSxDQUFDZCxVQUFVO1lBQ2pELE1BQU0sSUFBSXhCLFdBQ1QsQ0FBQyxpRkFBaUYsRUFBRXdCLFFBQVEsb0NBQW9DLENBQUM7UUFFbkk7SUFDRDtJQUVBLGlGQUFpRixHQUNqRixPQUFlQyxXQUFXTixRQUE4QixFQUFzQjtRQUM3RSxNQUFNSyxVQUFVTCxVQUFVRSxpQkFBaUJHO1FBQzNDLElBQUlBLFdBQVcsTUFBTSxPQUFPRDtRQUM1QixPQUFPMUIsS0FBSzZCLE9BQU8sQ0FBQ0Y7SUFDckI7QUFDRCJ9
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { UserConfigFactory, WorkspaceFactory } from "@decohere/mesh";
|
|
2
|
+
import { ModuleManifest } from "@decohere/nexus/cli";
|
|
3
|
+
import * as Actions from "./actions/index.js";
|
|
4
|
+
import * as Commands from "./commands/index.js";
|
|
5
|
+
import { DependencyResolver } from "./services/dependency-resolver.service.js";
|
|
6
|
+
import { FileWriterService } from "./services/file-writer.service.js";
|
|
7
|
+
import { SwcTranspiler } from "./services/swc-transpiler.js";
|
|
8
|
+
import { TypeEmitter } from "./services/type-emitter.js";
|
|
9
|
+
import { TransformerKey } from "./types/transformer.type.js";
|
|
10
|
+
import { DefaultConfigurations, WorkspaceDefaults } from "./workspace.config.js";
|
|
11
|
+
export class ForgeModule extends ModuleManifest {
|
|
12
|
+
id = "forge";
|
|
13
|
+
command = Commands.ForgeCommand;
|
|
14
|
+
actions = {
|
|
15
|
+
clean: Actions.Clean,
|
|
16
|
+
copy: Actions.Copy,
|
|
17
|
+
build: Actions.Build,
|
|
18
|
+
watch: Actions.Watch,
|
|
19
|
+
publish: Actions.Publish,
|
|
20
|
+
syncDependencies: Actions.SyncDependencies,
|
|
21
|
+
syncLockFile: Actions.SyncLockFile,
|
|
22
|
+
reportDependencies: Actions.ReportDependencies,
|
|
23
|
+
version: Actions.Version,
|
|
24
|
+
tag: Actions.Tag,
|
|
25
|
+
commitFiles: Actions.CommitFiles
|
|
26
|
+
};
|
|
27
|
+
commands = {
|
|
28
|
+
build: Commands.BuildCommand,
|
|
29
|
+
publish: Commands.PublishCommand,
|
|
30
|
+
dependencies: Commands.DependencyCommand,
|
|
31
|
+
version: Commands.VersionCommand,
|
|
32
|
+
tag: Commands.TagCommand
|
|
33
|
+
};
|
|
34
|
+
registerServices(builder) {
|
|
35
|
+
builder.registerSingleton(TransformerKey, SwcTranspiler);
|
|
36
|
+
builder.registerSingleton(TransformerKey, TypeEmitter);
|
|
37
|
+
builder.registerSingleton(DependencyResolver);
|
|
38
|
+
builder.registerSingleton(FileWriterService);
|
|
39
|
+
}
|
|
40
|
+
async createWorkspace(options) {
|
|
41
|
+
const { configurations: _, ...forgeDefaults } = WorkspaceDefaults;
|
|
42
|
+
const userConfig = await UserConfigFactory.getUserConfig(options.configFile);
|
|
43
|
+
// Only apply forge default configurations when user config doesn't provide any.
|
|
44
|
+
// This ensures user-defined configurations take priority while still providing
|
|
45
|
+
// sensible defaults (debug + release) when no config file is present.
|
|
46
|
+
const configurations = userConfig.configurations?.length ? undefined : DefaultConfigurations;
|
|
47
|
+
return WorkspaceFactory.create({
|
|
48
|
+
...forgeDefaults,
|
|
49
|
+
...configurations ? {
|
|
50
|
+
configurations
|
|
51
|
+
} : {},
|
|
52
|
+
configFile: options.configFile,
|
|
53
|
+
rootDir: options.rootDir ?? WorkspaceDefaults.rootDir
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvZm9yZ2Uvc3JjL2ZvcmdlLm1vZHVsZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBVc2VyQ29uZmlnRmFjdG9yeSwgV29ya3NwYWNlRmFjdG9yeSB9IGZyb20gXCJAZGVjb2hlcmUvbWVzaFwiO1xuaW1wb3J0IHR5cGUgeyBXb3Jrc3BhY2VGYWN0b3J5T3B0aW9ucyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgeyBNb2R1bGVNYW5pZmVzdCB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvY2xpXCI7XG5pbXBvcnQgdHlwZSB7IENvbnRhaW5lckJ1aWxkZXIgfSBmcm9tIFwiQGRlY29oZXJlL25leHVzL2NvbXBvc2l0aW9uXCI7XG5pbXBvcnQgKiBhcyBBY3Rpb25zIGZyb20gXCIuL2FjdGlvbnMvaW5kZXguanNcIjtcbmltcG9ydCAqIGFzIENvbW1hbmRzIGZyb20gXCIuL2NvbW1hbmRzL2luZGV4LmpzXCI7XG5pbXBvcnQgeyBEZXBlbmRlbmN5UmVzb2x2ZXIgfSBmcm9tIFwiLi9zZXJ2aWNlcy9kZXBlbmRlbmN5LXJlc29sdmVyLnNlcnZpY2UuanNcIjtcbmltcG9ydCB7IEZpbGVXcml0ZXJTZXJ2aWNlIH0gZnJvbSBcIi4vc2VydmljZXMvZmlsZS13cml0ZXIuc2VydmljZS5qc1wiO1xuaW1wb3J0IHsgU3djVHJhbnNwaWxlciB9IGZyb20gXCIuL3NlcnZpY2VzL3N3Yy10cmFuc3BpbGVyLmpzXCI7XG5pbXBvcnQgeyBUeXBlRW1pdHRlciB9IGZyb20gXCIuL3NlcnZpY2VzL3R5cGUtZW1pdHRlci5qc1wiO1xuaW1wb3J0IHsgVHJhbnNmb3JtZXJLZXkgfSBmcm9tIFwiLi90eXBlcy90cmFuc2Zvcm1lci50eXBlLmpzXCI7XG5pbXBvcnQgeyBEZWZhdWx0Q29uZmlndXJhdGlvbnMsIFdvcmtzcGFjZURlZmF1bHRzIH0gZnJvbSBcIi4vd29ya3NwYWNlLmNvbmZpZy5qc1wiO1xuXG5leHBvcnQgY2xhc3MgRm9yZ2VNb2R1bGUgZXh0ZW5kcyBNb2R1bGVNYW5pZmVzdCB7XG5cdHB1YmxpYyByZWFkb25seSBpZCA9IFwiZm9yZ2VcIjtcblx0cHVibGljIHJlYWRvbmx5IGNvbW1hbmQgPSBDb21tYW5kcy5Gb3JnZUNvbW1hbmQ7XG5cdHB1YmxpYyByZWFkb25seSBhY3Rpb25zID0ge1xuXHRcdGNsZWFuOiBBY3Rpb25zLkNsZWFuLFxuXHRcdGNvcHk6IEFjdGlvbnMuQ29weSxcblx0XHRidWlsZDogQWN0aW9ucy5CdWlsZCxcblx0XHR3YXRjaDogQWN0aW9ucy5XYXRjaCxcblx0XHRwdWJsaXNoOiBBY3Rpb25zLlB1Ymxpc2gsXG5cdFx0c3luY0RlcGVuZGVuY2llczogQWN0aW9ucy5TeW5jRGVwZW5kZW5jaWVzLFxuXHRcdHN5bmNMb2NrRmlsZTogQWN0aW9ucy5TeW5jTG9ja0ZpbGUsXG5cdFx0cmVwb3J0RGVwZW5kZW5jaWVzOiBBY3Rpb25zLlJlcG9ydERlcGVuZGVuY2llcyxcblx0XHR2ZXJzaW9uOiBBY3Rpb25zLlZlcnNpb24sXG5cdFx0dGFnOiBBY3Rpb25zLlRhZyxcblx0XHRjb21taXRGaWxlczogQWN0aW9ucy5Db21taXRGaWxlcyxcblx0fTtcblx0cHVibGljIHJlYWRvbmx5IGNvbW1hbmRzID0ge1xuXHRcdGJ1aWxkOiBDb21tYW5kcy5CdWlsZENvbW1hbmQsXG5cdFx0cHVibGlzaDogQ29tbWFuZHMuUHVibGlzaENvbW1hbmQsXG5cdFx0ZGVwZW5kZW5jaWVzOiBDb21tYW5kcy5EZXBlbmRlbmN5Q29tbWFuZCxcblx0XHR2ZXJzaW9uOiBDb21tYW5kcy5WZXJzaW9uQ29tbWFuZCxcblx0XHR0YWc6IENvbW1hbmRzLlRhZ0NvbW1hbmQsXG5cdH07XG5cblx0cHVibGljIHJlZ2lzdGVyU2VydmljZXMoYnVpbGRlcjogQ29udGFpbmVyQnVpbGRlcikge1xuXHRcdGJ1aWxkZXIucmVnaXN0ZXJTaW5nbGV0b24oVHJhbnNmb3JtZXJLZXksIFN3Y1RyYW5zcGlsZXIpO1xuXHRcdGJ1aWxkZXIucmVnaXN0ZXJTaW5nbGV0b24oVHJhbnNmb3JtZXJLZXksIFR5cGVFbWl0dGVyKTtcblx0XHRidWlsZGVyLnJlZ2lzdGVyU2luZ2xldG9uKERlcGVuZGVuY3lSZXNvbHZlcik7XG5cdFx0YnVpbGRlci5yZWdpc3RlclNpbmdsZXRvbihGaWxlV3JpdGVyU2VydmljZSk7XG5cdH1cblxuXHRwdWJsaWMgb3ZlcnJpZGUgYXN5bmMgY3JlYXRlV29ya3NwYWNlKG9wdGlvbnM6IFdvcmtzcGFjZUZhY3RvcnlPcHRpb25zKSB7XG5cdFx0Y29uc3QgeyBjb25maWd1cmF0aW9uczogXywgLi4uZm9yZ2VEZWZhdWx0cyB9ID0gV29ya3NwYWNlRGVmYXVsdHM7XG5cdFx0Y29uc3QgdXNlckNvbmZpZyA9IGF3YWl0IFVzZXJDb25maWdGYWN0b3J5LmdldFVzZXJDb25maWcob3B0aW9ucy5jb25maWdGaWxlKTtcblx0XHQvLyBPbmx5IGFwcGx5IGZvcmdlIGRlZmF1bHQgY29uZmlndXJhdGlvbnMgd2hlbiB1c2VyIGNvbmZpZyBkb2Vzbid0IHByb3ZpZGUgYW55LlxuXHRcdC8vIFRoaXMgZW5zdXJlcyB1c2VyLWRlZmluZWQgY29uZmlndXJhdGlvbnMgdGFrZSBwcmlvcml0eSB3aGlsZSBzdGlsbCBwcm92aWRpbmdcblx0XHQvLyBzZW5zaWJsZSBkZWZhdWx0cyAoZGVidWcgKyByZWxlYXNlKSB3aGVuIG5vIGNvbmZpZyBmaWxlIGlzIHByZXNlbnQuXG5cdFx0Y29uc3QgY29uZmlndXJhdGlvbnMgPSB1c2VyQ29uZmlnLmNvbmZpZ3VyYXRpb25zPy5sZW5ndGhcblx0XHRcdD8gdW5kZWZpbmVkXG5cdFx0XHQ6IERlZmF1bHRDb25maWd1cmF0aW9ucztcblx0XHRyZXR1cm4gV29ya3NwYWNlRmFjdG9yeS5jcmVhdGUoe1xuXHRcdFx0Li4uZm9yZ2VEZWZhdWx0cyxcblx0XHRcdC4uLihjb25maWd1cmF0aW9ucyA/IHsgY29uZmlndXJhdGlvbnMgfSA6IHt9KSxcblx0XHRcdGNvbmZpZ0ZpbGU6IG9wdGlvbnMuY29uZmlnRmlsZSxcblx0XHRcdHJvb3REaXI6IG9wdGlvbnMucm9vdERpciA/PyBXb3Jrc3BhY2VEZWZhdWx0cy5yb290RGlyLFxuXHRcdH0pO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiVXNlckNvbmZpZ0ZhY3RvcnkiLCJXb3Jrc3BhY2VGYWN0b3J5IiwiTW9kdWxlTWFuaWZlc3QiLCJBY3Rpb25zIiwiQ29tbWFuZHMiLCJEZXBlbmRlbmN5UmVzb2x2ZXIiLCJGaWxlV3JpdGVyU2VydmljZSIsIlN3Y1RyYW5zcGlsZXIiLCJUeXBlRW1pdHRlciIsIlRyYW5zZm9ybWVyS2V5IiwiRGVmYXVsdENvbmZpZ3VyYXRpb25zIiwiV29ya3NwYWNlRGVmYXVsdHMiLCJGb3JnZU1vZHVsZSIsImlkIiwiY29tbWFuZCIsIkZvcmdlQ29tbWFuZCIsImFjdGlvbnMiLCJjbGVhbiIsIkNsZWFuIiwiY29weSIsIkNvcHkiLCJidWlsZCIsIkJ1aWxkIiwid2F0Y2giLCJXYXRjaCIsInB1Ymxpc2giLCJQdWJsaXNoIiwic3luY0RlcGVuZGVuY2llcyIsIlN5bmNEZXBlbmRlbmNpZXMiLCJzeW5jTG9ja0ZpbGUiLCJTeW5jTG9ja0ZpbGUiLCJyZXBvcnREZXBlbmRlbmNpZXMiLCJSZXBvcnREZXBlbmRlbmNpZXMiLCJ2ZXJzaW9uIiwiVmVyc2lvbiIsInRhZyIsIlRhZyIsImNvbW1pdEZpbGVzIiwiQ29tbWl0RmlsZXMiLCJjb21tYW5kcyIsIkJ1aWxkQ29tbWFuZCIsIlB1Ymxpc2hDb21tYW5kIiwiZGVwZW5kZW5jaWVzIiwiRGVwZW5kZW5jeUNvbW1hbmQiLCJWZXJzaW9uQ29tbWFuZCIsIlRhZ0NvbW1hbmQiLCJyZWdpc3RlclNlcnZpY2VzIiwiYnVpbGRlciIsInJlZ2lzdGVyU2luZ2xldG9uIiwiY3JlYXRlV29ya3NwYWNlIiwib3B0aW9ucyIsImNvbmZpZ3VyYXRpb25zIiwiXyIsImZvcmdlRGVmYXVsdHMiLCJ1c2VyQ29uZmlnIiwiZ2V0VXNlckNvbmZpZyIsImNvbmZpZ0ZpbGUiLCJsZW5ndGgiLCJ1bmRlZmluZWQiLCJjcmVhdGUiLCJyb290RGlyIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxpQkFBaUIsRUFBRUMsZ0JBQWdCLFFBQVEsaUJBQWlCO0FBRXJFLFNBQVNDLGNBQWMsUUFBUSxzQkFBc0I7QUFFckQsWUFBWUMsYUFBYSxxQkFBcUI7QUFDOUMsWUFBWUMsY0FBYyxzQkFBc0I7QUFDaEQsU0FBU0Msa0JBQWtCLFFBQVEsNENBQTRDO0FBQy9FLFNBQVNDLGlCQUFpQixRQUFRLG9DQUFvQztBQUN0RSxTQUFTQyxhQUFhLFFBQVEsK0JBQStCO0FBQzdELFNBQVNDLFdBQVcsUUFBUSw2QkFBNkI7QUFDekQsU0FBU0MsY0FBYyxRQUFRLDhCQUE4QjtBQUM3RCxTQUFTQyxxQkFBcUIsRUFBRUMsaUJBQWlCLFFBQVEsd0JBQXdCO0FBRWpGLE9BQU8sTUFBTUMsb0JBQW9CVjtJQUNoQlcsS0FBSyxRQUFRO0lBQ2JDLFVBQVVWLFNBQVNXLFlBQVksQ0FBQztJQUNoQ0MsVUFBVTtRQUN6QkMsT0FBT2QsUUFBUWUsS0FBSztRQUNwQkMsTUFBTWhCLFFBQVFpQixJQUFJO1FBQ2xCQyxPQUFPbEIsUUFBUW1CLEtBQUs7UUFDcEJDLE9BQU9wQixRQUFRcUIsS0FBSztRQUNwQkMsU0FBU3RCLFFBQVF1QixPQUFPO1FBQ3hCQyxrQkFBa0J4QixRQUFReUIsZ0JBQWdCO1FBQzFDQyxjQUFjMUIsUUFBUTJCLFlBQVk7UUFDbENDLG9CQUFvQjVCLFFBQVE2QixrQkFBa0I7UUFDOUNDLFNBQVM5QixRQUFRK0IsT0FBTztRQUN4QkMsS0FBS2hDLFFBQVFpQyxHQUFHO1FBQ2hCQyxhQUFhbEMsUUFBUW1DLFdBQVc7SUFDakMsRUFBRTtJQUNjQyxXQUFXO1FBQzFCbEIsT0FBT2pCLFNBQVNvQyxZQUFZO1FBQzVCZixTQUFTckIsU0FBU3FDLGNBQWM7UUFDaENDLGNBQWN0QyxTQUFTdUMsaUJBQWlCO1FBQ3hDVixTQUFTN0IsU0FBU3dDLGNBQWM7UUFDaENULEtBQUsvQixTQUFTeUMsVUFBVTtJQUN6QixFQUFFO0lBRUtDLGlCQUFpQkMsT0FBeUIsRUFBRTtRQUNsREEsUUFBUUMsaUJBQWlCLENBQUN2QyxnQkFBZ0JGO1FBQzFDd0MsUUFBUUMsaUJBQWlCLENBQUN2QyxnQkFBZ0JEO1FBQzFDdUMsUUFBUUMsaUJBQWlCLENBQUMzQztRQUMxQjBDLFFBQVFDLGlCQUFpQixDQUFDMUM7SUFDM0I7SUFFQSxNQUFzQjJDLGdCQUFnQkMsT0FBZ0MsRUFBRTtRQUN2RSxNQUFNLEVBQUVDLGdCQUFnQkMsQ0FBQyxFQUFFLEdBQUdDLGVBQWUsR0FBRzFDO1FBQ2hELE1BQU0yQyxhQUFhLE1BQU10RCxrQkFBa0J1RCxhQUFhLENBQUNMLFFBQVFNLFVBQVU7UUFDM0UsZ0ZBQWdGO1FBQ2hGLCtFQUErRTtRQUMvRSxzRUFBc0U7UUFDdEUsTUFBTUwsaUJBQWlCRyxXQUFXSCxjQUFjLEVBQUVNLFNBQy9DQyxZQUNBaEQ7UUFDSCxPQUFPVCxpQkFBaUIwRCxNQUFNLENBQUM7WUFDOUIsR0FBR04sYUFBYTtZQUNoQixHQUFJRixpQkFBaUI7Z0JBQUVBO1lBQWUsSUFBSSxDQUFDLENBQUM7WUFDNUNLLFlBQVlOLFFBQVFNLFVBQVU7WUFDOUJJLFNBQVNWLFFBQVFVLE9BQU8sSUFBSWpELGtCQUFrQmlELE9BQU87UUFDdEQ7SUFDRDtBQUNEIn0=
|
package/es6/src/index.js
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { ForgeError } from "./errors.js";
|
|
2
|
+
export { ForgeModule } from "./forge.module.js";
|
|
3
|
+
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvZm9yZ2Uvc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCB7IEZvcmdlRXJyb3IgfSBmcm9tIFwiLi9lcnJvcnMuanNcIjtcbmV4cG9ydCB7IEZvcmdlTW9kdWxlIH0gZnJvbSBcIi4vZm9yZ2UubW9kdWxlLmpzXCI7XG5leHBvcnQgdHlwZSB7IEZvcmdlQ29uZmlndXJhdGlvbiB9IGZyb20gXCIuL3R5cGVzL2NvbmZpZ3VyYXRpb24udHlwZS5qc1wiO1xuZXhwb3J0IHR5cGUgeyBXb3Jrc3BhY2VPcHRpb25zIH0gZnJvbSBcIi4vdHlwZXMvd29ya3NwYWNlLWNvbmZpZy50eXBlLmpzXCI7XG4iXSwibmFtZXMiOlsiRm9yZ2VFcnJvciIsIkZvcmdlTW9kdWxlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxVQUFVLFFBQVEsY0FBYztBQUN6QyxTQUFTQyxXQUFXLFFBQVEsb0JBQW9CIn0=
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { io } from "@decohere/nexus/io";
|
|
2
|
+
export class CachesOutputs {
|
|
3
|
+
/** Maps source file fullPath -> output TransformResponses for cleanup in watch mode. */ get outputCache() {
|
|
4
|
+
const self = this;
|
|
5
|
+
if (self.__outputCache == null) {
|
|
6
|
+
self.__outputCache = new Map();
|
|
7
|
+
}
|
|
8
|
+
return self.__outputCache;
|
|
9
|
+
}
|
|
10
|
+
cacheOutputs(responses) {
|
|
11
|
+
for (const response of responses){
|
|
12
|
+
if (response.outcome !== "success") continue;
|
|
13
|
+
const existing = this.outputCache.get(response.file.fullPath) ?? [];
|
|
14
|
+
this.outputCache.set(response.file.fullPath, [
|
|
15
|
+
...existing,
|
|
16
|
+
response
|
|
17
|
+
]);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
deleteCachedOutputs(filePath) {
|
|
21
|
+
const outputs = this.outputCache.get(filePath);
|
|
22
|
+
if (outputs == null) return;
|
|
23
|
+
for (const response of outputs){
|
|
24
|
+
if (response.outputPath != null) {
|
|
25
|
+
void io.deleteFile(response.outputPath);
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
this.outputCache.delete(filePath);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvZm9yZ2Uvc3JjL21peGlucy9jYWNoZXMtb3V0cHV0cy5taXhpbi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB0eXBlIHsgVHJhbnNmb3JtUmVzcG9uc2UgfSBmcm9tIFwiLi4vdHlwZXMvdHJhbnNmb3JtLXJlc3BvbnNlLm1vZGVsLmpzXCI7XG5cbmV4cG9ydCBhYnN0cmFjdCBjbGFzcyBDYWNoZXNPdXRwdXRzIHtcblx0LyoqIE1hcHMgc291cmNlIGZpbGUgZnVsbFBhdGggLT4gb3V0cHV0IFRyYW5zZm9ybVJlc3BvbnNlcyBmb3IgY2xlYW51cCBpbiB3YXRjaCBtb2RlLiAqL1xuXHRwcm90ZWN0ZWQgZ2V0IG91dHB1dENhY2hlKCk6IE1hcDxzdHJpbmcsIFRyYW5zZm9ybVJlc3BvbnNlW10+IHtcblx0XHRjb25zdCBzZWxmID0gdGhpcyBhcyB7IF9fb3V0cHV0Q2FjaGU/OiBNYXA8c3RyaW5nLCBUcmFuc2Zvcm1SZXNwb25zZVtdPiB9O1xuXHRcdGlmIChzZWxmLl9fb3V0cHV0Q2FjaGUgPT0gbnVsbCkge1xuXHRcdFx0c2VsZi5fX291dHB1dENhY2hlID0gbmV3IE1hcDxzdHJpbmcsIFRyYW5zZm9ybVJlc3BvbnNlW10+KCk7XG5cdFx0fVxuXHRcdHJldHVybiBzZWxmLl9fb3V0cHV0Q2FjaGU7XG5cdH1cblxuXHRwcm90ZWN0ZWQgY2FjaGVPdXRwdXRzKHJlc3BvbnNlczogVHJhbnNmb3JtUmVzcG9uc2VbXSk6IHZvaWQge1xuXHRcdGZvciAoY29uc3QgcmVzcG9uc2Ugb2YgcmVzcG9uc2VzKSB7XG5cdFx0XHRpZiAocmVzcG9uc2Uub3V0Y29tZSAhPT0gXCJzdWNjZXNzXCIpIGNvbnRpbnVlO1xuXHRcdFx0Y29uc3QgZXhpc3RpbmcgPSB0aGlzLm91dHB1dENhY2hlLmdldChyZXNwb25zZS5maWxlLmZ1bGxQYXRoKSA/PyBbXTtcblx0XHRcdHRoaXMub3V0cHV0Q2FjaGUuc2V0KHJlc3BvbnNlLmZpbGUuZnVsbFBhdGgsIFsuLi5leGlzdGluZywgcmVzcG9uc2VdKTtcblx0XHR9XG5cdH1cblxuXHRwcm90ZWN0ZWQgZGVsZXRlQ2FjaGVkT3V0cHV0cyhmaWxlUGF0aDogc3RyaW5nKTogdm9pZCB7XG5cdFx0Y29uc3Qgb3V0cHV0cyA9IHRoaXMub3V0cHV0Q2FjaGUuZ2V0KGZpbGVQYXRoKTtcblx0XHRpZiAob3V0cHV0cyA9PSBudWxsKSByZXR1cm47XG5cdFx0Zm9yIChjb25zdCByZXNwb25zZSBvZiBvdXRwdXRzKSB7XG5cdFx0XHRpZiAocmVzcG9uc2Uub3V0cHV0UGF0aCAhPSBudWxsKSB7XG5cdFx0XHRcdHZvaWQgaW8uZGVsZXRlRmlsZShyZXNwb25zZS5vdXRwdXRQYXRoKTtcblx0XHRcdH1cblx0XHR9XG5cdFx0dGhpcy5vdXRwdXRDYWNoZS5kZWxldGUoZmlsZVBhdGgpO1xuXHR9XG59XG4iXSwibmFtZXMiOlsiaW8iLCJDYWNoZXNPdXRwdXRzIiwib3V0cHV0Q2FjaGUiLCJzZWxmIiwiX19vdXRwdXRDYWNoZSIsIk1hcCIsImNhY2hlT3V0cHV0cyIsInJlc3BvbnNlcyIsInJlc3BvbnNlIiwib3V0Y29tZSIsImV4aXN0aW5nIiwiZ2V0IiwiZmlsZSIsImZ1bGxQYXRoIiwic2V0IiwiZGVsZXRlQ2FjaGVkT3V0cHV0cyIsImZpbGVQYXRoIiwib3V0cHV0cyIsIm91dHB1dFBhdGgiLCJkZWxldGVGaWxlIiwiZGVsZXRlIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxFQUFFLFFBQVEscUJBQXFCO0FBR3hDLE9BQU8sTUFBZUM7SUFDckIsc0ZBQXNGLEdBQ3RGLElBQWNDLGNBQWdEO1FBQzdELE1BQU1DLE9BQU8sSUFBSTtRQUNqQixJQUFJQSxLQUFLQyxhQUFhLElBQUksTUFBTTtZQUMvQkQsS0FBS0MsYUFBYSxHQUFHLElBQUlDO1FBQzFCO1FBQ0EsT0FBT0YsS0FBS0MsYUFBYTtJQUMxQjtJQUVVRSxhQUFhQyxTQUE4QixFQUFRO1FBQzVELEtBQUssTUFBTUMsWUFBWUQsVUFBVztZQUNqQyxJQUFJQyxTQUFTQyxPQUFPLEtBQUssV0FBVztZQUNwQyxNQUFNQyxXQUFXLElBQUksQ0FBQ1IsV0FBVyxDQUFDUyxHQUFHLENBQUNILFNBQVNJLElBQUksQ0FBQ0MsUUFBUSxLQUFLLEVBQUU7WUFDbkUsSUFBSSxDQUFDWCxXQUFXLENBQUNZLEdBQUcsQ0FBQ04sU0FBU0ksSUFBSSxDQUFDQyxRQUFRLEVBQUU7bUJBQUlIO2dCQUFVRjthQUFTO1FBQ3JFO0lBQ0Q7SUFFVU8sb0JBQW9CQyxRQUFnQixFQUFRO1FBQ3JELE1BQU1DLFVBQVUsSUFBSSxDQUFDZixXQUFXLENBQUNTLEdBQUcsQ0FBQ0s7UUFDckMsSUFBSUMsV0FBVyxNQUFNO1FBQ3JCLEtBQUssTUFBTVQsWUFBWVMsUUFBUztZQUMvQixJQUFJVCxTQUFTVSxVQUFVLElBQUksTUFBTTtnQkFDaEMsS0FBS2xCLEdBQUdtQixVQUFVLENBQUNYLFNBQVNVLFVBQVU7WUFDdkM7UUFDRDtRQUNBLElBQUksQ0FBQ2hCLFdBQVcsQ0FBQ2tCLE1BQU0sQ0FBQ0o7SUFDekI7QUFDRCJ9
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { Subject } from "rxjs";
|
|
2
|
+
// WeakMap avoids the private-field-in-mixin problem: private class fields (#x)
|
|
3
|
+
// are not accessible when methods are copied onto a different class prototype.
|
|
4
|
+
const subjects = new WeakMap();
|
|
5
|
+
function getSubject(instance) {
|
|
6
|
+
let subject = subjects.get(instance);
|
|
7
|
+
if (subject == null) {
|
|
8
|
+
subject = new Subject();
|
|
9
|
+
subjects.set(instance, subject);
|
|
10
|
+
}
|
|
11
|
+
return subject;
|
|
12
|
+
}
|
|
13
|
+
export class IncrementalTransform {
|
|
14
|
+
get incrementalTransform$() {
|
|
15
|
+
return getSubject(this).asObservable();
|
|
16
|
+
}
|
|
17
|
+
watch(workspace) {
|
|
18
|
+
workspace.projectFileChanged$.subscribe((evt)=>{
|
|
19
|
+
void this.onIncrementalFileEvent(evt).then((responses)=>{
|
|
20
|
+
getSubject(this).next(responses);
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvZm9yZ2Uvc3JjL21peGlucy9pbmNyZW1lbnRhbC10cmFuc2Zvcm0ubWl4aW4udHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBQcm9qZWN0RmlsZUV2ZW50LCBXb3Jrc3BhY2UgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB0eXBlIHsgT2JzZXJ2YWJsZSB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB0eXBlIHsgVHJhbnNmb3JtUmVzcG9uc2UgfSBmcm9tIFwiLi4vdHlwZXMvdHJhbnNmb3JtLXJlc3BvbnNlLm1vZGVsLmpzXCI7XG5cbi8vIFdlYWtNYXAgYXZvaWRzIHRoZSBwcml2YXRlLWZpZWxkLWluLW1peGluIHByb2JsZW06IHByaXZhdGUgY2xhc3MgZmllbGRzICgjeClcbi8vIGFyZSBub3QgYWNjZXNzaWJsZSB3aGVuIG1ldGhvZHMgYXJlIGNvcGllZCBvbnRvIGEgZGlmZmVyZW50IGNsYXNzIHByb3RvdHlwZS5cbmNvbnN0IHN1YmplY3RzID0gbmV3IFdlYWtNYXA8b2JqZWN0LCBTdWJqZWN0PFRyYW5zZm9ybVJlc3BvbnNlW10+PigpO1xuXG5mdW5jdGlvbiBnZXRTdWJqZWN0KGluc3RhbmNlOiBvYmplY3QpOiBTdWJqZWN0PFRyYW5zZm9ybVJlc3BvbnNlW10+IHtcblx0bGV0IHN1YmplY3QgPSBzdWJqZWN0cy5nZXQoaW5zdGFuY2UpO1xuXHRpZiAoc3ViamVjdCA9PSBudWxsKSB7XG5cdFx0c3ViamVjdCA9IG5ldyBTdWJqZWN0PFRyYW5zZm9ybVJlc3BvbnNlW10+KCk7XG5cdFx0c3ViamVjdHMuc2V0KGluc3RhbmNlLCBzdWJqZWN0KTtcblx0fVxuXHRyZXR1cm4gc3ViamVjdDtcbn1cblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEluY3JlbWVudGFsVHJhbnNmb3JtIHtcblx0cHVibGljIGdldCBpbmNyZW1lbnRhbFRyYW5zZm9ybSQoKTogT2JzZXJ2YWJsZTxUcmFuc2Zvcm1SZXNwb25zZVtdPiB7XG5cdFx0cmV0dXJuIGdldFN1YmplY3QodGhpcykuYXNPYnNlcnZhYmxlKCk7XG5cdH1cblxuXHRwdWJsaWMgd2F0Y2god29ya3NwYWNlOiBXb3Jrc3BhY2UpOiB2b2lkIHtcblx0XHR3b3Jrc3BhY2UucHJvamVjdEZpbGVDaGFuZ2VkJC5zdWJzY3JpYmUoKGV2dCkgPT4ge1xuXHRcdFx0dm9pZCB0aGlzLm9uSW5jcmVtZW50YWxGaWxlRXZlbnQoZXZ0KS50aGVuKChyZXNwb25zZXMpID0+IHtcblx0XHRcdFx0Z2V0U3ViamVjdCh0aGlzKS5uZXh0KHJlc3BvbnNlcyk7XG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdC8qKlxuXHQgKiBDYWxsZWQgZm9yIGV2ZXJ5IHdvcmtzcGFjZSBmaWxlIGNoYW5nZS4gSW1wbGVtZW50YXRpb25zIHNob3VsZCBpbnZhbGlkYXRlXG5cdCAqIGFueSBpbnRlcm5hbCBjYWNoZXMsIHBlcmZvcm0gdGhlIGluY3JlbWVudGFsIHRyYW5zZm9ybSwgYW5kIHJldHVybiB0aGUgcmVzdWx0cy5cblx0ICogUmV0dXJuIGFuIGVtcHR5IGFycmF5IGZvciBkZWxldGlvbnMgb3Igd2hlbiBubyBvdXRwdXQgaXMgcHJvZHVjZWQuXG5cdCAqL1xuXHRwcm90ZWN0ZWQgYWJzdHJhY3Qgb25JbmNyZW1lbnRhbEZpbGVFdmVudChcblx0XHRldnQ6IFByb2plY3RGaWxlRXZlbnQsXG5cdCk6IFByb21pc2U8VHJhbnNmb3JtUmVzcG9uc2VbXT47XG59XG4iXSwibmFtZXMiOlsiU3ViamVjdCIsInN1YmplY3RzIiwiV2Vha01hcCIsImdldFN1YmplY3QiLCJpbnN0YW5jZSIsInN1YmplY3QiLCJnZXQiLCJzZXQiLCJJbmNyZW1lbnRhbFRyYW5zZm9ybSIsImluY3JlbWVudGFsVHJhbnNmb3JtJCIsImFzT2JzZXJ2YWJsZSIsIndhdGNoIiwid29ya3NwYWNlIiwicHJvamVjdEZpbGVDaGFuZ2VkJCIsInN1YnNjcmliZSIsImV2dCIsIm9uSW5jcmVtZW50YWxGaWxlRXZlbnQiLCJ0aGVuIiwicmVzcG9uc2VzIiwibmV4dCJdLCJtYXBwaW5ncyI6IkFBRUEsU0FBU0EsT0FBTyxRQUFRLE9BQU87QUFHL0IsK0VBQStFO0FBQy9FLCtFQUErRTtBQUMvRSxNQUFNQyxXQUFXLElBQUlDO0FBRXJCLFNBQVNDLFdBQVdDLFFBQWdCO0lBQ25DLElBQUlDLFVBQVVKLFNBQVNLLEdBQUcsQ0FBQ0Y7SUFDM0IsSUFBSUMsV0FBVyxNQUFNO1FBQ3BCQSxVQUFVLElBQUlMO1FBQ2RDLFNBQVNNLEdBQUcsQ0FBQ0gsVUFBVUM7SUFDeEI7SUFDQSxPQUFPQTtBQUNSO0FBRUEsT0FBTyxNQUFlRztJQUNyQixJQUFXQyx3QkFBeUQ7UUFDbkUsT0FBT04sV0FBVyxJQUFJLEVBQUVPLFlBQVk7SUFDckM7SUFFT0MsTUFBTUMsU0FBb0IsRUFBUTtRQUN4Q0EsVUFBVUMsbUJBQW1CLENBQUNDLFNBQVMsQ0FBQyxDQUFDQztZQUN4QyxLQUFLLElBQUksQ0FBQ0Msc0JBQXNCLENBQUNELEtBQUtFLElBQUksQ0FBQyxDQUFDQztnQkFDM0NmLFdBQVcsSUFBSSxFQUFFZ0IsSUFBSSxDQUFDRDtZQUN2QjtRQUNEO0lBQ0Q7QUFVRCJ9
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
function _ts_decorate(decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for(var i = decorators.length - 1; i >= 0; i--)if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
}
|
|
7
|
+
import { injectable } from "@decohere/crucible/decorators";
|
|
8
|
+
import { io } from "@decohere/nexus/io";
|
|
9
|
+
import { parseImports } from "parse-imports";
|
|
10
|
+
import { BUILT_IN_MODULES } from "../const.js";
|
|
11
|
+
import { ForgeError } from "../errors.js";
|
|
12
|
+
export class DependencyResolver {
|
|
13
|
+
computeDrift(current, computed) {
|
|
14
|
+
const sortKeys = (obj)=>Object.fromEntries(Object.entries(obj).sort());
|
|
15
|
+
const currentDeps = sortKeys(current.dependencies ?? {});
|
|
16
|
+
const computedDeps = sortKeys(computed.dependencies ?? {});
|
|
17
|
+
const currentDevDeps = sortKeys(current.devDependencies ?? {});
|
|
18
|
+
const computedDevDeps = sortKeys(computed.devDependencies ?? {});
|
|
19
|
+
const hasDrift = JSON.stringify(currentDeps) !== JSON.stringify(computedDeps) || JSON.stringify(currentDevDeps) !== JSON.stringify(computedDevDeps);
|
|
20
|
+
if (!hasDrift) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
return {
|
|
24
|
+
original: {
|
|
25
|
+
dependencies: currentDeps,
|
|
26
|
+
devDependencies: currentDevDeps
|
|
27
|
+
},
|
|
28
|
+
updated: {
|
|
29
|
+
dependencies: computedDeps,
|
|
30
|
+
devDependencies: computedDevDeps
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
async getWorkspacePackages(workspace, projects) {
|
|
35
|
+
const packageJson = await workspace.getPackageJson().catch(()=>{
|
|
36
|
+
throw new Error(`Root package.json not found at "${workspace.packageJsonDirectory}/package.json". ` + `Ensure the workspace root has a package.json with dependencies listed.`);
|
|
37
|
+
});
|
|
38
|
+
const internals = new Map(await Promise.all(projects.map(async (proj)=>{
|
|
39
|
+
const packageJson = await proj.getPackageJson();
|
|
40
|
+
return [
|
|
41
|
+
packageJson.name,
|
|
42
|
+
{
|
|
43
|
+
name: packageJson.name,
|
|
44
|
+
version: packageJson.version,
|
|
45
|
+
isInternal: true
|
|
46
|
+
}
|
|
47
|
+
];
|
|
48
|
+
})));
|
|
49
|
+
const packages = Object.entries(packageJson.dependencies).filter(([key])=>!internals.has(key)).map(([key, val])=>[
|
|
50
|
+
key,
|
|
51
|
+
{
|
|
52
|
+
name: key,
|
|
53
|
+
version: val
|
|
54
|
+
}
|
|
55
|
+
]);
|
|
56
|
+
const devPackages = Object.entries(packageJson.devDependencies).filter(([key])=>!internals.has(key)).map(([key, val])=>[
|
|
57
|
+
key,
|
|
58
|
+
{
|
|
59
|
+
name: key,
|
|
60
|
+
version: val,
|
|
61
|
+
isDev: true
|
|
62
|
+
}
|
|
63
|
+
]);
|
|
64
|
+
return new Map([
|
|
65
|
+
...packages,
|
|
66
|
+
...devPackages,
|
|
67
|
+
...internals
|
|
68
|
+
]);
|
|
69
|
+
}
|
|
70
|
+
async computeProjectDependencies(project, workspacePackages) {
|
|
71
|
+
const { dependencies, devDependencies, warnings } = await this.getDependencies(project, workspacePackages);
|
|
72
|
+
const pkg = await project.getPackageJson();
|
|
73
|
+
const updatedPackage = pkg.withDependencies(dependencies).withDevDependencies(devDependencies);
|
|
74
|
+
return {
|
|
75
|
+
project,
|
|
76
|
+
updatedPackage,
|
|
77
|
+
warnings
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
async getDependencies(project, workspacePackages) {
|
|
81
|
+
const files = await project.getAllFiles();
|
|
82
|
+
const results = await Promise.all(files.map((file)=>this.getFileImports(file)));
|
|
83
|
+
const imports = results.flatMap((r)=>r.imports);
|
|
84
|
+
const warnings = results.flatMap((r)=>r.warnings);
|
|
85
|
+
const allDependencies = [
|
|
86
|
+
...new Set(imports)
|
|
87
|
+
].map((fileImport)=>this.getDependencyFrom(fileImport, workspacePackages)).filter((dep)=>dep != null);
|
|
88
|
+
const missing = allDependencies.filter((dep)=>dep.missing);
|
|
89
|
+
if (missing.length > 0) {
|
|
90
|
+
const names = missing.map((dep)=>dep.name).join(", ");
|
|
91
|
+
throw new ForgeError(`Missing packages in project "${project.name}": ${names}`);
|
|
92
|
+
}
|
|
93
|
+
const resolved = allDependencies.filter((dep)=>!dep.missing);
|
|
94
|
+
const dependencies = Object.fromEntries(resolved.filter((dep)=>!dep.isDev).map((dep)=>[
|
|
95
|
+
dep.name,
|
|
96
|
+
dep.version
|
|
97
|
+
]));
|
|
98
|
+
const devDependencies = Object.fromEntries(resolved.filter((dep)=>dep.isDev).map((dep)=>[
|
|
99
|
+
dep.name,
|
|
100
|
+
dep.version
|
|
101
|
+
]));
|
|
102
|
+
return {
|
|
103
|
+
dependencies,
|
|
104
|
+
devDependencies,
|
|
105
|
+
warnings
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
getDependencyFrom(importName, workspacePackages) {
|
|
109
|
+
if (importName.startsWith(".") || importName.startsWith("node:")) {
|
|
110
|
+
return;
|
|
111
|
+
}
|
|
112
|
+
const packageNameMatch = importName.match(/^(?:(@[^/]+\/[^/]+)|([^/]+))/);
|
|
113
|
+
const packageName = packageNameMatch?.[0];
|
|
114
|
+
if (packageName == null || BUILT_IN_MODULES.includes(packageName)) {
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
const packg = workspacePackages.get(packageName);
|
|
118
|
+
if (packg == null) {
|
|
119
|
+
return {
|
|
120
|
+
name: packageName,
|
|
121
|
+
version: undefined,
|
|
122
|
+
internal: undefined,
|
|
123
|
+
missing: true,
|
|
124
|
+
isDev: false
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
return {
|
|
128
|
+
name: packageName,
|
|
129
|
+
version: packg.version ?? "",
|
|
130
|
+
internal: packg.isInternal ?? false,
|
|
131
|
+
missing: false,
|
|
132
|
+
isDev: packg.isDev ?? false
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
async getFileImports(file) {
|
|
136
|
+
const contents = await io.readFile(file.fullPath);
|
|
137
|
+
const parsed = Array.from(await parseImports(contents));
|
|
138
|
+
const imports = [];
|
|
139
|
+
const warnings = [];
|
|
140
|
+
for (const impt of parsed){
|
|
141
|
+
if (impt.moduleSpecifier.value != null) {
|
|
142
|
+
imports.push(impt.moduleSpecifier.value);
|
|
143
|
+
} else if (impt.isDynamicImport) {
|
|
144
|
+
const line = contents.substring(0, impt.startIndex).split("\n").length;
|
|
145
|
+
warnings.push({
|
|
146
|
+
file: file.fullPath,
|
|
147
|
+
line,
|
|
148
|
+
message: `Dynamic import with non-literal specifier \`${impt.moduleSpecifier.code}\` cannot be statically resolved`
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
imports,
|
|
154
|
+
warnings
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
DependencyResolver = _ts_decorate([
|
|
159
|
+
injectable()
|
|
160
|
+
], DependencyResolver);
|
|
161
|
+
|
|
162
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9zcmMvcHJvamVjdHMvZm9yZ2Uvc3JjL3NlcnZpY2VzL2RlcGVuZGVuY3ktcmVzb2x2ZXIuc2VydmljZS50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3RhYmxlIH0gZnJvbSBcIkBkZWNvaGVyZS9jcnVjaWJsZS9kZWNvcmF0b3JzXCI7XG5pbXBvcnQgdHlwZSB7IFBhY2thZ2VKc29uLCBQcm9qZWN0LCBXb3Jrc3BhY2UgfSBmcm9tIFwiQGRlY29oZXJlL21lc2hcIjtcbmltcG9ydCB7IHR5cGUgRmlsZUV4LCBpbyB9IGZyb20gXCJAZGVjb2hlcmUvbmV4dXMvaW9cIjtcbmltcG9ydCB7IHBhcnNlSW1wb3J0cyB9IGZyb20gXCJwYXJzZS1pbXBvcnRzXCI7XG5pbXBvcnQgeyBCVUlMVF9JTl9NT0RVTEVTIH0gZnJvbSBcIi4uL2NvbnN0LmpzXCI7XG5pbXBvcnQgeyBGb3JnZUVycm9yIH0gZnJvbSBcIi4uL2Vycm9ycy5qc1wiO1xuaW1wb3J0IHR5cGUge1xuXHREZXBlbmRlbmN5V2FybmluZyxcblx0RHJpZnRFbnRyeSxcblx0UGFja2FnZSxcblx0UmVzb2x2ZWREZXBlbmRlbmN5LFxufSBmcm9tIFwiLi4vdHlwZXMvZGVwZW5kZW5jeS50eXBlcy5qc1wiO1xuXG5leHBvcnQgdHlwZSBQcm9qZWN0RGVwZW5kZW5jaWVzID0ge1xuXHRwcm9qZWN0OiBQcm9qZWN0O1xuXHR1cGRhdGVkUGFja2FnZTogUGFja2FnZUpzb247XG5cdHdhcm5pbmdzOiBEZXBlbmRlbmN5V2FybmluZ1tdO1xufTtcblxuQGluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIERlcGVuZGVuY3lSZXNvbHZlciB7XG5cdHB1YmxpYyBjb21wdXRlRHJpZnQoY3VycmVudDogUGFja2FnZUpzb24sIGNvbXB1dGVkOiBQYWNrYWdlSnNvbik6IERyaWZ0RW50cnkgfCBudWxsIHtcblx0XHRjb25zdCBzb3J0S2V5cyA9IChvYmo6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4pID0+XG5cdFx0XHRPYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMob2JqKS5zb3J0KCkpO1xuXG5cdFx0Y29uc3QgY3VycmVudERlcHMgPSBzb3J0S2V5cyhjdXJyZW50LmRlcGVuZGVuY2llcyA/PyB7fSk7XG5cdFx0Y29uc3QgY29tcHV0ZWREZXBzID0gc29ydEtleXMoY29tcHV0ZWQuZGVwZW5kZW5jaWVzID8/IHt9KTtcblx0XHRjb25zdCBjdXJyZW50RGV2RGVwcyA9IHNvcnRLZXlzKGN1cnJlbnQuZGV2RGVwZW5kZW5jaWVzID8/IHt9KTtcblx0XHRjb25zdCBjb21wdXRlZERldkRlcHMgPSBzb3J0S2V5cyhjb21wdXRlZC5kZXZEZXBlbmRlbmNpZXMgPz8ge30pO1xuXG5cdFx0Y29uc3QgaGFzRHJpZnQgPVxuXHRcdFx0SlNPTi5zdHJpbmdpZnkoY3VycmVudERlcHMpICE9PSBKU09OLnN0cmluZ2lmeShjb21wdXRlZERlcHMpIHx8XG5cdFx0XHRKU09OLnN0cmluZ2lmeShjdXJyZW50RGV2RGVwcykgIT09IEpTT04uc3RyaW5naWZ5KGNvbXB1dGVkRGV2RGVwcyk7XG5cblx0XHRpZiAoIWhhc0RyaWZ0KSB7XG5cdFx0XHRyZXR1cm4gbnVsbDtcblx0XHR9XG5cblx0XHRyZXR1cm4ge1xuXHRcdFx0b3JpZ2luYWw6IHsgZGVwZW5kZW5jaWVzOiBjdXJyZW50RGVwcywgZGV2RGVwZW5kZW5jaWVzOiBjdXJyZW50RGV2RGVwcyB9LFxuXHRcdFx0dXBkYXRlZDogeyBkZXBlbmRlbmNpZXM6IGNvbXB1dGVkRGVwcywgZGV2RGVwZW5kZW5jaWVzOiBjb21wdXRlZERldkRlcHMgfSxcblx0XHR9O1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGdldFdvcmtzcGFjZVBhY2thZ2VzKFxuXHRcdHdvcmtzcGFjZTogV29ya3NwYWNlLFxuXHRcdHByb2plY3RzOiByZWFkb25seSBQcm9qZWN0W10sXG5cdCk6IFByb21pc2U8TWFwPHN0cmluZywgUGFja2FnZT4+IHtcblx0XHRjb25zdCBwYWNrYWdlSnNvbiA9IGF3YWl0IHdvcmtzcGFjZS5nZXRQYWNrYWdlSnNvbigpLmNhdGNoKCgpID0+IHtcblx0XHRcdHRocm93IG5ldyBFcnJvcihcblx0XHRcdFx0YFJvb3QgcGFja2FnZS5qc29uIG5vdCBmb3VuZCBhdCBcIiR7d29ya3NwYWNlLnBhY2thZ2VKc29uRGlyZWN0b3J5fS9wYWNrYWdlLmpzb25cIi4gYCArXG5cdFx0XHRcdFx0YEVuc3VyZSB0aGUgd29ya3NwYWNlIHJvb3QgaGFzIGEgcGFja2FnZS5qc29uIHdpdGggZGVwZW5kZW5jaWVzIGxpc3RlZC5gLFxuXHRcdFx0KTtcblx0XHR9KTtcblxuXHRcdGNvbnN0IGludGVybmFscyA9IG5ldyBNYXAoXG5cdFx0XHRhd2FpdCBQcm9taXNlLmFsbChcblx0XHRcdFx0cHJvamVjdHMubWFwKGFzeW5jIChwcm9qKTogUHJvbWlzZTxbc3RyaW5nLCBQYWNrYWdlXT4gPT4ge1xuXHRcdFx0XHRcdGNvbnN0IHBhY2thZ2VKc29uID0gYXdhaXQgcHJvai5nZXRQYWNrYWdlSnNvbigpO1xuXHRcdFx0XHRcdHJldHVybiBbXG5cdFx0XHRcdFx0XHRwYWNrYWdlSnNvbi5uYW1lLFxuXHRcdFx0XHRcdFx0e1xuXHRcdFx0XHRcdFx0XHRuYW1lOiBwYWNrYWdlSnNvbi5uYW1lLFxuXHRcdFx0XHRcdFx0XHR2ZXJzaW9uOiBwYWNrYWdlSnNvbi52ZXJzaW9uLFxuXHRcdFx0XHRcdFx0XHRpc0ludGVybmFsOiB0cnVlLFxuXHRcdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRdO1xuXHRcdFx0XHR9KSxcblx0XHRcdCksXG5cdFx0KTtcblxuXHRcdGNvbnN0IHBhY2thZ2VzID0gT2JqZWN0LmVudHJpZXMocGFja2FnZUpzb24uZGVwZW5kZW5jaWVzKVxuXHRcdFx0LmZpbHRlcigoW2tleV0pID0+ICFpbnRlcm5hbHMuaGFzKGtleSkpXG5cdFx0XHQubWFwPFtzdHJpbmcsIFBhY2thZ2VdPigoW2tleSwgdmFsXSkgPT4gW2tleSwgeyBuYW1lOiBrZXksIHZlcnNpb246IHZhbCB9XSk7XG5cblx0XHRjb25zdCBkZXZQYWNrYWdlcyA9IE9iamVjdC5lbnRyaWVzKHBhY2thZ2VKc29uLmRldkRlcGVuZGVuY2llcylcblx0XHRcdC5maWx0ZXIoKFtrZXldKSA9PiAhaW50ZXJuYWxzLmhhcyhrZXkpKVxuXHRcdFx0Lm1hcDxbc3RyaW5nLCBQYWNrYWdlXT4oKFtrZXksIHZhbF0pID0+IFtrZXksIHsgbmFtZToga2V5LCB2ZXJzaW9uOiB2YWwsIGlzRGV2OiB0cnVlIH1dKTtcblxuXHRcdHJldHVybiBuZXcgTWFwKFsuLi5wYWNrYWdlcywgLi4uZGV2UGFja2FnZXMsIC4uLmludGVybmFsc10pO1xuXHR9XG5cblx0cHVibGljIGFzeW5jIGNvbXB1dGVQcm9qZWN0RGVwZW5kZW5jaWVzKFxuXHRcdHByb2plY3Q6IFByb2plY3QsXG5cdFx0d29ya3NwYWNlUGFja2FnZXM6IE1hcDxzdHJpbmcsIFBhY2thZ2U+LFxuXHQpOiBQcm9taXNlPFByb2plY3REZXBlbmRlbmNpZXM+IHtcblx0XHRjb25zdCB7IGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCB3YXJuaW5ncyB9ID0gYXdhaXQgdGhpcy5nZXREZXBlbmRlbmNpZXMoXG5cdFx0XHRwcm9qZWN0LFxuXHRcdFx0d29ya3NwYWNlUGFja2FnZXMsXG5cdFx0KTtcblxuXHRcdGNvbnN0IHBrZyA9IGF3YWl0IHByb2plY3QuZ2V0UGFja2FnZUpzb24oKTtcblx0XHRjb25zdCB1cGRhdGVkUGFja2FnZSA9IHBrZ1xuXHRcdFx0LndpdGhEZXBlbmRlbmNpZXMoZGVwZW5kZW5jaWVzKVxuXHRcdFx0LndpdGhEZXZEZXBlbmRlbmNpZXMoZGV2RGVwZW5kZW5jaWVzKTtcblxuXHRcdHJldHVybiB7IHByb2plY3QsIHVwZGF0ZWRQYWNrYWdlLCB3YXJuaW5ncyB9O1xuXHR9XG5cblx0cHJpdmF0ZSBhc3luYyBnZXREZXBlbmRlbmNpZXMocHJvamVjdDogUHJvamVjdCwgd29ya3NwYWNlUGFja2FnZXM6IE1hcDxzdHJpbmcsIFBhY2thZ2U+KSB7XG5cdFx0Y29uc3QgZmlsZXMgPSBhd2FpdCBwcm9qZWN0LmdldEFsbEZpbGVzKCk7XG5cdFx0Y29uc3QgcmVzdWx0cyA9IGF3YWl0IFByb21pc2UuYWxsKGZpbGVzLm1hcCgoZmlsZSkgPT4gdGhpcy5nZXRGaWxlSW1wb3J0cyhmaWxlKSkpO1xuXHRcdGNvbnN0IGltcG9ydHMgPSByZXN1bHRzLmZsYXRNYXAoKHIpID0+IHIuaW1wb3J0cyk7XG5cdFx0Y29uc3Qgd2FybmluZ3MgPSByZXN1bHRzLmZsYXRNYXAoKHIpID0+IHIud2FybmluZ3MpO1xuXG5cdFx0Y29uc3QgYWxsRGVwZW5kZW5jaWVzID0gWy4uLm5ldyBTZXQoaW1wb3J0cyldXG5cdFx0XHQubWFwKChmaWxlSW1wb3J0KSA9PiB0aGlzLmdldERlcGVuZGVuY3lGcm9tKGZpbGVJbXBvcnQsIHdvcmtzcGFjZVBhY2thZ2VzKSlcblx0XHRcdC5maWx0ZXIoKGRlcCkgPT4gZGVwICE9IG51bGwpO1xuXG5cdFx0Y29uc3QgbWlzc2luZyA9IGFsbERlcGVuZGVuY2llcy5maWx0ZXIoXG5cdFx0XHQoZGVwKTogZGVwIGlzIFJlc29sdmVkRGVwZW5kZW5jeSAmIHsgbWlzc2luZzogdHJ1ZSB9ID0+IGRlcC5taXNzaW5nLFxuXHRcdCk7XG5cblx0XHRpZiAobWlzc2luZy5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCBuYW1lcyA9IG1pc3NpbmcubWFwKChkZXApID0+IGRlcC5uYW1lKS5qb2luKFwiLCBcIik7XG5cdFx0XHR0aHJvdyBuZXcgRm9yZ2VFcnJvcihgTWlzc2luZyBwYWNrYWdlcyBpbiBwcm9qZWN0IFwiJHtwcm9qZWN0Lm5hbWV9XCI6ICR7bmFtZXN9YCk7XG5cdFx0fVxuXG5cdFx0Y29uc3QgcmVzb2x2ZWQgPSBhbGxEZXBlbmRlbmNpZXMuZmlsdGVyKFxuXHRcdFx0KGRlcCk6IGRlcCBpcyBSZXNvbHZlZERlcGVuZGVuY3kgJiB7IG1pc3Npbmc6IGZhbHNlIH0gPT4gIWRlcC5taXNzaW5nLFxuXHRcdCk7XG5cblx0XHRjb25zdCBkZXBlbmRlbmNpZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG5cdFx0XHRyZXNvbHZlZFxuXHRcdFx0XHQuZmlsdGVyKChkZXApID0+ICFkZXAuaXNEZXYpXG5cdFx0XHRcdC5tYXA8W3N0cmluZywgc3RyaW5nXT4oKGRlcCkgPT4gW2RlcC5uYW1lLCBkZXAudmVyc2lvbl0pLFxuXHRcdCk7XG5cblx0XHRjb25zdCBkZXZEZXBlbmRlbmNpZXMgPSBPYmplY3QuZnJvbUVudHJpZXMoXG5cdFx0XHRyZXNvbHZlZFxuXHRcdFx0XHQuZmlsdGVyKChkZXApID0+IGRlcC5pc0Rldilcblx0XHRcdFx0Lm1hcDxbc3RyaW5nLCBzdHJpbmddPigoZGVwKSA9PiBbZGVwLm5hbWUsIGRlcC52ZXJzaW9uXSksXG5cdFx0KTtcblxuXHRcdHJldHVybiB7IGRlcGVuZGVuY2llcywgZGV2RGVwZW5kZW5jaWVzLCB3YXJuaW5ncyB9O1xuXHR9XG5cblx0cHJpdmF0ZSBnZXREZXBlbmRlbmN5RnJvbShcblx0XHRpbXBvcnROYW1lOiBzdHJpbmcsXG5cdFx0d29ya3NwYWNlUGFja2FnZXM6IE1hcDxzdHJpbmcsIFBhY2thZ2U+LFxuXHQpOiBSZXNvbHZlZERlcGVuZGVuY3kgfCB1bmRlZmluZWQge1xuXHRcdGlmIChpbXBvcnROYW1lLnN0YXJ0c1dpdGgoXCIuXCIpIHx8IGltcG9ydE5hbWUuc3RhcnRzV2l0aChcIm5vZGU6XCIpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Y29uc3QgcGFja2FnZU5hbWVNYXRjaCA9IGltcG9ydE5hbWUubWF0Y2goL14oPzooQFteL10rXFwvW14vXSspfChbXi9dKykpLyk7XG5cdFx0Y29uc3QgcGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZU1hdGNoPy5bMF07XG5cblx0XHRpZiAocGFja2FnZU5hbWUgPT0gbnVsbCB8fCBCVUlMVF9JTl9NT0RVTEVTLmluY2x1ZGVzKHBhY2thZ2VOYW1lKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGNvbnN0IHBhY2tnID0gd29ya3NwYWNlUGFja2FnZXMuZ2V0KHBhY2thZ2VOYW1lKTtcblxuXHRcdGlmIChwYWNrZyA9PSBudWxsKSB7XG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHRuYW1lOiBwYWNrYWdlTmFtZSxcblx0XHRcdFx0dmVyc2lvbjogdW5kZWZpbmVkLFxuXHRcdFx0XHRpbnRlcm5hbDogdW5kZWZpbmVkLFxuXHRcdFx0XHRtaXNzaW5nOiB0cnVlLFxuXHRcdFx0XHRpc0RldjogZmFsc2UsXG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdHJldHVybiB7XG5cdFx0XHRuYW1lOiBwYWNrYWdlTmFtZSxcblx0XHRcdHZlcnNpb246IHBhY2tnLnZlcnNpb24gPz8gXCJcIixcblx0XHRcdGludGVybmFsOiBwYWNrZy5pc0ludGVybmFsID8/IGZhbHNlLFxuXHRcdFx0bWlzc2luZzogZmFsc2UsXG5cdFx0XHRpc0RldjogcGFja2cuaXNEZXYgPz8gZmFsc2UsXG5cdFx0fTtcblx0fVxuXG5cdHByaXZhdGUgYXN5bmMgZ2V0RmlsZUltcG9ydHMoXG5cdFx0ZmlsZTogRmlsZUV4LFxuXHQpOiBQcm9taXNlPHsgaW1wb3J0czogc3RyaW5nW107IHdhcm5pbmdzOiBEZXBlbmRlbmN5V2FybmluZ1tdIH0+IHtcblx0XHRjb25zdCBjb250ZW50cyA9IGF3YWl0IGlvLnJlYWRGaWxlKGZpbGUuZnVsbFBhdGgpO1xuXHRcdGNvbnN0IHBhcnNlZCA9IEFycmF5LmZyb20oYXdhaXQgcGFyc2VJbXBvcnRzKGNvbnRlbnRzKSk7XG5cblx0XHRjb25zdCBpbXBvcnRzOiBzdHJpbmdbXSA9IFtdO1xuXHRcdGNvbnN0IHdhcm5pbmdzOiBEZXBlbmRlbmN5V2FybmluZ1tdID0gW107XG5cblx0XHRmb3IgKGNvbnN0IGltcHQgb2YgcGFyc2VkKSB7XG5cdFx0XHRpZiAoaW1wdC5tb2R1bGVTcGVjaWZpZXIudmFsdWUgIT0gbnVsbCkge1xuXHRcdFx0XHRpbXBvcnRzLnB1c2goaW1wdC5tb2R1bGVTcGVjaWZpZXIudmFsdWUpO1xuXHRcdFx0fSBlbHNlIGlmIChpbXB0LmlzRHluYW1pY0ltcG9ydCkge1xuXHRcdFx0XHRjb25zdCBsaW5lID0gY29udGVudHMuc3Vic3RyaW5nKDAsIGltcHQuc3RhcnRJbmRleCkuc3BsaXQoXCJcXG5cIikubGVuZ3RoO1xuXHRcdFx0XHR3YXJuaW5ncy5wdXNoKHtcblx0XHRcdFx0XHRmaWxlOiBmaWxlLmZ1bGxQYXRoLFxuXHRcdFx0XHRcdGxpbmUsXG5cdFx0XHRcdFx0bWVzc2FnZTogYER5bmFtaWMgaW1wb3J0IHdpdGggbm9uLWxpdGVyYWwgc3BlY2lmaWVyIFxcYCR7aW1wdC5tb2R1bGVTcGVjaWZpZXIuY29kZX1cXGAgY2Fubm90IGJlIHN0YXRpY2FsbHkgcmVzb2x2ZWRgLFxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4geyBpbXBvcnRzLCB3YXJuaW5ncyB9O1xuXHR9XG59XG4iXSwibmFtZXMiOlsiaW5qZWN0YWJsZSIsImlvIiwicGFyc2VJbXBvcnRzIiwiQlVJTFRfSU5fTU9EVUxFUyIsIkZvcmdlRXJyb3IiLCJEZXBlbmRlbmN5UmVzb2x2ZXIiLCJjb21wdXRlRHJpZnQiLCJjdXJyZW50IiwiY29tcHV0ZWQiLCJzb3J0S2V5cyIsIm9iaiIsIk9iamVjdCIsImZyb21FbnRyaWVzIiwiZW50cmllcyIsInNvcnQiLCJjdXJyZW50RGVwcyIsImRlcGVuZGVuY2llcyIsImNvbXB1dGVkRGVwcyIsImN1cnJlbnREZXZEZXBzIiwiZGV2RGVwZW5kZW5jaWVzIiwiY29tcHV0ZWREZXZEZXBzIiwiaGFzRHJpZnQiLCJKU09OIiwic3RyaW5naWZ5Iiwib3JpZ2luYWwiLCJ1cGRhdGVkIiwiZ2V0V29ya3NwYWNlUGFja2FnZXMiLCJ3b3Jrc3BhY2UiLCJwcm9qZWN0cyIsInBhY2thZ2VKc29uIiwiZ2V0UGFja2FnZUpzb24iLCJjYXRjaCIsIkVycm9yIiwicGFja2FnZUpzb25EaXJlY3RvcnkiLCJpbnRlcm5hbHMiLCJNYXAiLCJQcm9taXNlIiwiYWxsIiwibWFwIiwicHJvaiIsIm5hbWUiLCJ2ZXJzaW9uIiwiaXNJbnRlcm5hbCIsInBhY2thZ2VzIiwiZmlsdGVyIiwia2V5IiwiaGFzIiwidmFsIiwiZGV2UGFja2FnZXMiLCJpc0RldiIsImNvbXB1dGVQcm9qZWN0RGVwZW5kZW5jaWVzIiwicHJvamVjdCIsIndvcmtzcGFjZVBhY2thZ2VzIiwid2FybmluZ3MiLCJnZXREZXBlbmRlbmNpZXMiLCJwa2ciLCJ1cGRhdGVkUGFja2FnZSIsIndpdGhEZXBlbmRlbmNpZXMiLCJ3aXRoRGV2RGVwZW5kZW5jaWVzIiwiZmlsZXMiLCJnZXRBbGxGaWxlcyIsInJlc3VsdHMiLCJmaWxlIiwiZ2V0RmlsZUltcG9ydHMiLCJpbXBvcnRzIiwiZmxhdE1hcCIsInIiLCJhbGxEZXBlbmRlbmNpZXMiLCJTZXQiLCJmaWxlSW1wb3J0IiwiZ2V0RGVwZW5kZW5jeUZyb20iLCJkZXAiLCJtaXNzaW5nIiwibGVuZ3RoIiwibmFtZXMiLCJqb2luIiwicmVzb2x2ZWQiLCJpbXBvcnROYW1lIiwic3RhcnRzV2l0aCIsInBhY2thZ2VOYW1lTWF0Y2giLCJtYXRjaCIsInBhY2thZ2VOYW1lIiwiaW5jbHVkZXMiLCJwYWNrZyIsImdldCIsInVuZGVmaW5lZCIsImludGVybmFsIiwiY29udGVudHMiLCJyZWFkRmlsZSIsImZ1bGxQYXRoIiwicGFyc2VkIiwiQXJyYXkiLCJmcm9tIiwiaW1wdCIsIm1vZHVsZVNwZWNpZmllciIsInZhbHVlIiwicHVzaCIsImlzRHluYW1pY0ltcG9ydCIsImxpbmUiLCJzdWJzdHJpbmciLCJzdGFydEluZGV4Iiwic3BsaXQiLCJtZXNzYWdlIiwiY29kZSJdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBQUEsU0FBU0EsVUFBVSxRQUFRLGdDQUFnQztBQUUzRCxTQUFzQkMsRUFBRSxRQUFRLHFCQUFxQjtBQUNyRCxTQUFTQyxZQUFZLFFBQVEsZ0JBQWdCO0FBQzdDLFNBQVNDLGdCQUFnQixRQUFRLGNBQWM7QUFDL0MsU0FBU0MsVUFBVSxRQUFRLGVBQWU7QUFlMUMsT0FBTyxNQUFNQztJQUNMQyxh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
|