@workflow/builders 5.0.0-beta.0 → 5.0.0-beta.10
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/dist/apply-swc-transform.d.ts +1 -1
- package/dist/apply-swc-transform.d.ts.map +1 -1
- package/dist/apply-swc-transform.js +1 -1
- package/dist/base-builder.d.ts +79 -5
- package/dist/base-builder.d.ts.map +1 -1
- package/dist/base-builder.js +424 -44
- package/dist/build-queue.js +1 -1
- package/dist/config-helpers.d.ts +2 -1
- package/dist/config-helpers.d.ts.map +1 -1
- package/dist/config-helpers.js +2 -1
- package/dist/constants.d.ts +3 -13
- package/dist/constants.d.ts.map +1 -1
- package/dist/constants.js +4 -14
- package/dist/discover-entries-esbuild-plugin.d.ts.map +1 -1
- package/dist/discover-entries-esbuild-plugin.js +27 -10
- package/dist/discover-entries-esbuild-plugin.test.js +42 -2
- package/dist/esbuild-tsconfig.js +1 -1
- package/dist/esbuild-tsconfig.test.js +1 -1
- package/dist/external-package-warning.test.d.ts +2 -0
- package/dist/external-package-warning.test.d.ts.map +1 -0
- package/dist/external-package-warning.test.js +219 -0
- package/dist/get-input-files.test.js +49 -2
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -3
- package/dist/module-specifier.d.ts.map +1 -1
- package/dist/module-specifier.js +48 -10
- package/dist/module-specifier.test.js +21 -1
- package/dist/node-module-esbuild-plugin.d.ts.map +1 -1
- package/dist/node-module-esbuild-plugin.js +73 -23
- package/dist/node-module-esbuild-plugin.test.js +97 -1
- package/dist/pseudo-package-esbuild-plugin.js +1 -1
- package/dist/pseudo-package-esbuild-plugin.test.js +1 -1
- package/dist/request-converter.js +1 -1
- package/dist/resolve-sourcemap.test.d.ts +2 -0
- package/dist/resolve-sourcemap.test.d.ts.map +1 -0
- package/dist/resolve-sourcemap.test.js +126 -0
- package/dist/serde-checker.js +1 -1
- package/dist/standalone.d.ts +0 -3
- package/dist/standalone.d.ts.map +1 -1
- package/dist/standalone.js +11 -40
- package/dist/swc-esbuild-plugin.d.ts +10 -1
- package/dist/swc-esbuild-plugin.d.ts.map +1 -1
- package/dist/swc-esbuild-plugin.js +73 -9
- package/dist/swc-esbuild-plugin.test.js +280 -4
- package/dist/transform-utils.d.ts +3 -9
- package/dist/transform-utils.d.ts.map +1 -1
- package/dist/transform-utils.js +5 -30
- package/dist/transform-utils.test.js +37 -17
- package/dist/types.d.ts +31 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/vercel-build-output-api.d.ts +0 -2
- package/dist/vercel-build-output-api.d.ts.map +1 -1
- package/dist/vercel-build-output-api.js +32 -57
- package/dist/workflow-alias.js +1 -1
- package/dist/workflow-alias.test.js +1 -1
- package/dist/workflows-extractor.js +1 -1
- package/package.json +5 -5
- package/dist/apply-swc-transform.js.map +0 -1
- package/dist/base-builder.js.map +0 -1
- package/dist/build-queue.js.map +0 -1
- package/dist/config-helpers.js.map +0 -1
- package/dist/constants.js.map +0 -1
- package/dist/discover-entries-esbuild-plugin.js.map +0 -1
- package/dist/discover-entries-esbuild-plugin.test.js.map +0 -1
- package/dist/esbuild-tsconfig.js.map +0 -1
- package/dist/esbuild-tsconfig.test.js.map +0 -1
- package/dist/get-input-files.test.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/module-specifier.js.map +0 -1
- package/dist/module-specifier.test.js.map +0 -1
- package/dist/node-module-esbuild-plugin.js.map +0 -1
- package/dist/node-module-esbuild-plugin.test.js.map +0 -1
- package/dist/pseudo-package-esbuild-plugin.js.map +0 -1
- package/dist/pseudo-package-esbuild-plugin.test.js.map +0 -1
- package/dist/request-converter.js.map +0 -1
- package/dist/serde-checker.js.map +0 -1
- package/dist/standalone.js.map +0 -1
- package/dist/swc-esbuild-plugin.js.map +0 -1
- package/dist/swc-esbuild-plugin.test.js.map +0 -1
- package/dist/transform-utils.js.map +0 -1
- package/dist/transform-utils.test.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/vercel-build-output-api.js.map +0 -1
- package/dist/workflow-alias.js.map +0 -1
- package/dist/workflow-alias.test.js.map +0 -1
- package/dist/workflows-extractor.js.map +0 -1
package/dist/standalone.js
CHANGED
|
@@ -9,19 +9,19 @@ export class StandaloneBuilder extends BaseBuilder {
|
|
|
9
9
|
async build() {
|
|
10
10
|
const inputFiles = await this.getInputFiles();
|
|
11
11
|
const tsconfigPath = await this.findTsConfigPath();
|
|
12
|
-
const
|
|
12
|
+
const stepsBundlePath = this.resolvePath(this.config.stepsBundlePath);
|
|
13
|
+
const workflowBundlePath = this.resolvePath(this.config.workflowsBundlePath);
|
|
14
|
+
await this.ensureDirectory(stepsBundlePath);
|
|
15
|
+
await this.ensureDirectory(workflowBundlePath);
|
|
16
|
+
console.log('Creating combined bundle');
|
|
17
|
+
const { manifest } = await this.createCombinedBundle({
|
|
13
18
|
inputFiles,
|
|
19
|
+
stepsOutfile: stepsBundlePath,
|
|
20
|
+
flowOutfile: workflowBundlePath,
|
|
14
21
|
tsconfigPath,
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
const workflowsManifest = await this.buildWorkflowsBundle(options);
|
|
22
|
+
bundleFinalOutput: true,
|
|
23
|
+
});
|
|
18
24
|
await this.buildWebhookFunction();
|
|
19
|
-
// Merge manifests from both bundles
|
|
20
|
-
// Steps bundle discovers classes from default export conditions
|
|
21
|
-
// Workflow bundle discovers classes from 'workflow' export conditions
|
|
22
|
-
const manifest = this.mergeManifests(stepsManifest, workflowsManifest);
|
|
23
|
-
// Build unified manifest from workflow bundle
|
|
24
|
-
const workflowBundlePath = this.resolvePath(this.config.workflowsBundlePath);
|
|
25
25
|
const manifestDir = this.resolvePath('.well-known/workflow/v1');
|
|
26
26
|
await this.createManifest({
|
|
27
27
|
workflowBundlePath,
|
|
@@ -30,35 +30,6 @@ export class StandaloneBuilder extends BaseBuilder {
|
|
|
30
30
|
});
|
|
31
31
|
await this.createClientLibrary();
|
|
32
32
|
}
|
|
33
|
-
mergeManifests(stepsManifest, workflowsManifest) {
|
|
34
|
-
return {
|
|
35
|
-
steps: { ...stepsManifest.steps, ...workflowsManifest.steps },
|
|
36
|
-
workflows: { ...stepsManifest.workflows, ...workflowsManifest.workflows },
|
|
37
|
-
classes: { ...stepsManifest.classes, ...workflowsManifest.classes },
|
|
38
|
-
};
|
|
39
|
-
}
|
|
40
|
-
async buildStepsBundle({ inputFiles, tsconfigPath, }) {
|
|
41
|
-
console.log('Creating steps bundle at', this.config.stepsBundlePath);
|
|
42
|
-
const stepsBundlePath = this.resolvePath(this.config.stepsBundlePath);
|
|
43
|
-
await this.ensureDirectory(stepsBundlePath);
|
|
44
|
-
const { manifest } = await this.createStepsBundle({
|
|
45
|
-
outfile: stepsBundlePath,
|
|
46
|
-
inputFiles,
|
|
47
|
-
tsconfigPath,
|
|
48
|
-
});
|
|
49
|
-
return manifest;
|
|
50
|
-
}
|
|
51
|
-
async buildWorkflowsBundle({ inputFiles, tsconfigPath, }) {
|
|
52
|
-
console.log('Creating workflows bundle at', this.config.workflowsBundlePath);
|
|
53
|
-
const workflowBundlePath = this.resolvePath(this.config.workflowsBundlePath);
|
|
54
|
-
await this.ensureDirectory(workflowBundlePath);
|
|
55
|
-
const { manifest } = await this.createWorkflowsBundle({
|
|
56
|
-
outfile: workflowBundlePath,
|
|
57
|
-
inputFiles,
|
|
58
|
-
tsconfigPath,
|
|
59
|
-
});
|
|
60
|
-
return manifest;
|
|
61
|
-
}
|
|
62
33
|
async buildWebhookFunction() {
|
|
63
34
|
console.log('Creating webhook bundle at', this.config.webhookBundlePath);
|
|
64
35
|
const webhookBundlePath = this.resolvePath(this.config.webhookBundlePath);
|
|
@@ -68,4 +39,4 @@ export class StandaloneBuilder extends BaseBuilder {
|
|
|
68
39
|
});
|
|
69
40
|
}
|
|
70
41
|
}
|
|
71
|
-
//# sourceMappingURL=
|
|
42
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhbmRhbG9uZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zdGFuZGFsb25lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUdoRCxNQUFNLE9BQU8saUJBQWtCLFNBQVEsV0FBVztJQUNoRCxZQUFZLE1BQXNCO1FBQ2hDLEtBQUssQ0FBQztZQUNKLEdBQUcsTUFBTTtZQUNULElBQUksRUFBRSxDQUFDLEdBQUcsQ0FBQztTQUNaLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsS0FBSztRQUNULE1BQU0sVUFBVSxHQUFHLE1BQU0sSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQzlDLE1BQU0sWUFBWSxHQUFHLE1BQU0sSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUM7UUFFbkQsTUFBTSxlQUFlLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1FBQ3RFLE1BQU0sa0JBQWtCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FDekMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsQ0FDaEMsQ0FBQztRQUNGLE1BQU0sSUFBSSxDQUFDLGVBQWUsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUM1QyxNQUFNLElBQUksQ0FBQyxlQUFlLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUUvQyxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixDQUFDLENBQUM7UUFFeEMsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLE1BQU0sSUFBSSxDQUFDLG9CQUFvQixDQUFDO1lBQ25ELFVBQVU7WUFDVixZQUFZLEVBQUUsZUFBZTtZQUM3QixXQUFXLEVBQUUsa0JBQWtCO1lBQy9CLFlBQVk7WUFDWixpQkFBaUIsRUFBRSxJQUFJO1NBQ3hCLENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFFbEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBQ2hFLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUN4QixrQkFBa0I7WUFDbEIsV0FBVztZQUNYLFFBQVE7U0FDVCxDQUFDLENBQUM7UUFFSCxNQUFNLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQ25DLENBQUM7SUFFTyxLQUFLLENBQUMsb0JBQW9CO1FBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsNEJBQTRCLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBRXpFLE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFDMUUsTUFBTSxJQUFJLENBQUMsZUFBZSxDQUFDLGlCQUFpQixDQUFDLENBQUM7UUFFOUMsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUM7WUFDN0IsT0FBTyxFQUFFLGlCQUFpQjtTQUMzQixDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBCYXNlQnVpbGRlciB9IGZyb20gJy4vYmFzZS1idWlsZGVyLmpzJztcbmltcG9ydCB0eXBlIHsgV29ya2Zsb3dDb25maWcgfSBmcm9tICcuL3R5cGVzLmpzJztcblxuZXhwb3J0IGNsYXNzIFN0YW5kYWxvbmVCdWlsZGVyIGV4dGVuZHMgQmFzZUJ1aWxkZXIge1xuICBjb25zdHJ1Y3Rvcihjb25maWc6IFdvcmtmbG93Q29uZmlnKSB7XG4gICAgc3VwZXIoe1xuICAgICAgLi4uY29uZmlnLFxuICAgICAgZGlyczogWycuJ10sXG4gICAgfSk7XG4gIH1cblxuICBhc3luYyBidWlsZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbnB1dEZpbGVzID0gYXdhaXQgdGhpcy5nZXRJbnB1dEZpbGVzKCk7XG4gICAgY29uc3QgdHNjb25maWdQYXRoID0gYXdhaXQgdGhpcy5maW5kVHNDb25maWdQYXRoKCk7XG5cbiAgICBjb25zdCBzdGVwc0J1bmRsZVBhdGggPSB0aGlzLnJlc29sdmVQYXRoKHRoaXMuY29uZmlnLnN0ZXBzQnVuZGxlUGF0aCk7XG4gICAgY29uc3Qgd29ya2Zsb3dCdW5kbGVQYXRoID0gdGhpcy5yZXNvbHZlUGF0aChcbiAgICAgIHRoaXMuY29uZmlnLndvcmtmbG93c0J1bmRsZVBhdGhcbiAgICApO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlRGlyZWN0b3J5KHN0ZXBzQnVuZGxlUGF0aCk7XG4gICAgYXdhaXQgdGhpcy5lbnN1cmVEaXJlY3Rvcnkod29ya2Zsb3dCdW5kbGVQYXRoKTtcblxuICAgIGNvbnNvbGUubG9nKCdDcmVhdGluZyBjb21iaW5lZCBidW5kbGUnKTtcblxuICAgIGNvbnN0IHsgbWFuaWZlc3QgfSA9IGF3YWl0IHRoaXMuY3JlYXRlQ29tYmluZWRCdW5kbGUoe1xuICAgICAgaW5wdXRGaWxlcyxcbiAgICAgIHN0ZXBzT3V0ZmlsZTogc3RlcHNCdW5kbGVQYXRoLFxuICAgICAgZmxvd091dGZpbGU6IHdvcmtmbG93QnVuZGxlUGF0aCxcbiAgICAgIHRzY29uZmlnUGF0aCxcbiAgICAgIGJ1bmRsZUZpbmFsT3V0cHV0OiB0cnVlLFxuICAgIH0pO1xuXG4gICAgYXdhaXQgdGhpcy5idWlsZFdlYmhvb2tGdW5jdGlvbigpO1xuXG4gICAgY29uc3QgbWFuaWZlc3REaXIgPSB0aGlzLnJlc29sdmVQYXRoKCcud2VsbC1rbm93bi93b3JrZmxvdy92MScpO1xuICAgIGF3YWl0IHRoaXMuY3JlYXRlTWFuaWZlc3Qoe1xuICAgICAgd29ya2Zsb3dCdW5kbGVQYXRoLFxuICAgICAgbWFuaWZlc3REaXIsXG4gICAgICBtYW5pZmVzdCxcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMuY3JlYXRlQ2xpZW50TGlicmFyeSgpO1xuICB9XG5cbiAgcHJpdmF0ZSBhc3luYyBidWlsZFdlYmhvb2tGdW5jdGlvbigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zb2xlLmxvZygnQ3JlYXRpbmcgd2ViaG9vayBidW5kbGUgYXQnLCB0aGlzLmNvbmZpZy53ZWJob29rQnVuZGxlUGF0aCk7XG5cbiAgICBjb25zdCB3ZWJob29rQnVuZGxlUGF0aCA9IHRoaXMucmVzb2x2ZVBhdGgodGhpcy5jb25maWcud2ViaG9va0J1bmRsZVBhdGgpO1xuICAgIGF3YWl0IHRoaXMuZW5zdXJlRGlyZWN0b3J5KHdlYmhvb2tCdW5kbGVQYXRoKTtcblxuICAgIGF3YWl0IHRoaXMuY3JlYXRlV2ViaG9va0J1bmRsZSh7XG4gICAgICBvdXRmaWxlOiB3ZWJob29rQnVuZGxlUGF0aCxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Plugin } from 'esbuild';
|
|
2
2
|
import { type WorkflowManifest } from './apply-swc-transform.js';
|
|
3
3
|
export interface SwcPluginOptions {
|
|
4
|
-
mode: 'step' | 'workflow'
|
|
4
|
+
mode: 'step' | 'workflow';
|
|
5
5
|
entriesToBundle?: string[];
|
|
6
6
|
outdir?: string;
|
|
7
7
|
projectRoot?: string;
|
|
@@ -18,6 +18,15 @@ export interface SwcPluginOptions {
|
|
|
18
18
|
* breaks them because the .js file doesn't exist on disk.
|
|
19
19
|
*/
|
|
20
20
|
rewriteTsExtensions?: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Bundle project-local files that are transitively imported by step entries.
|
|
23
|
+
*
|
|
24
|
+
* Keep this disabled when a downstream bundler consumes the generated step
|
|
25
|
+
* bundle because that bundler can resolve the externalized local imports.
|
|
26
|
+
* Enable it for direct runtime loading, where Node imports the generated step
|
|
27
|
+
* bundle from disk without a later bundling pass.
|
|
28
|
+
*/
|
|
29
|
+
bundleTransitiveLocalStepDependencies?: boolean;
|
|
21
30
|
/**
|
|
22
31
|
* Absolute file paths of discovered workflow/step/serde entries whose
|
|
23
32
|
* imports must be treated as side-effectful.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"swc-esbuild-plugin.d.ts","sourceRoot":"","sources":["../src/swc-esbuild-plugin.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"swc-esbuild-plugin.d.ts","sourceRoot":"","sources":["../src/swc-esbuild-plugin.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACtC,OAAO,EAEL,KAAK,gBAAgB,EACtB,MAAM,0BAA0B,CAAC;AAQlC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC;;;;;;;;;;OAUG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;;;;OAOG;IACH,qCAAqC,CAAC,EAAE,OAAO,CAAC;IAChD;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;CAC9B;AA0CD,wBAAgB,eAAe,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,CAqWjE"}
|
|
@@ -4,6 +4,7 @@ import { promisify } from 'node:util';
|
|
|
4
4
|
import enhancedResolveOrig from 'enhanced-resolve';
|
|
5
5
|
import { applySwcTransform, } from './apply-swc-transform.js';
|
|
6
6
|
import { jsTsRegex, parentHasChild, } from './discover-entries-esbuild-plugin.js';
|
|
7
|
+
import { resolveModuleSpecifier } from './module-specifier.js';
|
|
7
8
|
import { resolveWorkflowAliasRelativePath } from './workflow-alias.js';
|
|
8
9
|
const NODE_RESOLVE_OPTIONS = {
|
|
9
10
|
dependencyType: 'commonjs',
|
|
@@ -39,6 +40,9 @@ const NODE_ESM_RESOLVE_OPTIONS = {
|
|
|
39
40
|
dependencyType: 'esm',
|
|
40
41
|
conditionNames: ['node', 'import'],
|
|
41
42
|
};
|
|
43
|
+
function normalizePath(path) {
|
|
44
|
+
return path.replace(/\\/g, '/');
|
|
45
|
+
}
|
|
42
46
|
export function createSwcPlugin(options) {
|
|
43
47
|
return {
|
|
44
48
|
name: 'swc-workflow-plugin',
|
|
@@ -75,17 +79,33 @@ export function createSwcPlugin(options) {
|
|
|
75
79
|
const specifier = args.path;
|
|
76
80
|
const specifierIsPath = specifier.startsWith('.') || specifier.startsWith('/');
|
|
77
81
|
let resolvedPath;
|
|
78
|
-
//
|
|
79
|
-
//
|
|
80
|
-
|
|
82
|
+
// Path-style specifiers (./foo, ../foo, /abs/path) externalize as
|
|
83
|
+
// relative paths from `outdir`. Bare specifiers (npm packages)
|
|
84
|
+
// externalize as-is so Node can resolve them at runtime.
|
|
85
|
+
const shouldMakeRelative = specifierIsPath;
|
|
81
86
|
if (specifierIsPath) {
|
|
82
87
|
resolvedPath = await enhancedResolve(args.resolveDir, specifier);
|
|
83
88
|
}
|
|
84
89
|
else {
|
|
85
90
|
// Resolve from project root so nested deps aren't externalized
|
|
86
91
|
resolvedPath = await enhancedResolve(build.initialOptions.absWorkingDir || process.cwd(), specifier).catch(() => undefined); // swallow so esbuild fallback below can try
|
|
87
|
-
// Fall back to esbuild for aliases/tsconfig paths
|
|
88
|
-
//
|
|
92
|
+
// Fall back to esbuild for aliases/tsconfig paths.
|
|
93
|
+
//
|
|
94
|
+
// If the specifier resolves to a project-local file via an
|
|
95
|
+
// alias/path mapping (e.g. tsconfig `paths`, esbuild `alias`,
|
|
96
|
+
// self-referencing package names like `@my-pkg/lib/foo`), we
|
|
97
|
+
// bundle it inline rather than externalizing.
|
|
98
|
+
//
|
|
99
|
+
// Externalizing such files is unsafe: we'd emit a relative
|
|
100
|
+
// import to the original source on disk, but that source can
|
|
101
|
+
// contain further alias imports. At runtime, Node's ESM loader
|
|
102
|
+
// doesn't know about tsconfig paths or build-time aliases, so
|
|
103
|
+
// those transitive imports throw `ERR_MODULE_NOT_FOUND` /
|
|
104
|
+
// `Package subpath ... is not defined by "exports"`.
|
|
105
|
+
//
|
|
106
|
+
// Bundling inline ensures alias-based imports are resolved at
|
|
107
|
+
// build time (where the alias map is known) and the runtime
|
|
108
|
+
// never sees an unresolvable specifier.
|
|
89
109
|
if (!resolvedPath) {
|
|
90
110
|
const esbuildResult = await build.resolve(specifier, {
|
|
91
111
|
resolveDir: args.resolveDir,
|
|
@@ -99,15 +119,33 @@ export function createSwcPlugin(options) {
|
|
|
99
119
|
.replace(/\\/g, '/')
|
|
100
120
|
.includes('/node_modules/');
|
|
101
121
|
if (isProjectLocalFile) {
|
|
102
|
-
|
|
103
|
-
|
|
122
|
+
// Let esbuild bundle this aliased project-local file inline
|
|
123
|
+
// (return null to defer to esbuild's normal pipeline). The
|
|
124
|
+
// SWC `onLoad` handler will still process it.
|
|
125
|
+
return null;
|
|
126
|
+
}
|
|
127
|
+
else if (options.entriesToBundle &&
|
|
128
|
+
esbuildResult.path?.endsWith('.node')) {
|
|
129
|
+
return {
|
|
130
|
+
external: true,
|
|
131
|
+
path: specifier,
|
|
132
|
+
};
|
|
104
133
|
}
|
|
105
134
|
}
|
|
106
135
|
}
|
|
107
136
|
if (!resolvedPath)
|
|
108
137
|
return null;
|
|
109
138
|
// Normalize to forward slashes for cross-platform comparison
|
|
110
|
-
const normalizedResolvedPath = resolvedPath
|
|
139
|
+
const normalizedResolvedPath = normalizePath(resolvedPath);
|
|
140
|
+
const workingDir = build.initialOptions.absWorkingDir || process.cwd();
|
|
141
|
+
const projectRoot = options.projectRoot || workingDir;
|
|
142
|
+
if (options.entriesToBundle &&
|
|
143
|
+
normalizedResolvedPath.endsWith('.node')) {
|
|
144
|
+
return {
|
|
145
|
+
external: true,
|
|
146
|
+
path: specifier,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
111
149
|
// Check if this module is a discovered entry whose SWC-transformed
|
|
112
150
|
// code contains side effects (workflow/step/class registration).
|
|
113
151
|
// Override the package.json "sideEffects": false so esbuild does not
|
|
@@ -128,6 +166,17 @@ export function createSwcPlugin(options) {
|
|
|
128
166
|
shouldBundle = true;
|
|
129
167
|
break;
|
|
130
168
|
}
|
|
169
|
+
// Bundle project-local source files that are imported by a
|
|
170
|
+
// step/serde entry so direct runtime loaders do not see raw TS
|
|
171
|
+
// extensionless imports. Keep package dependencies external
|
|
172
|
+
// unless they are themselves in entriesToBundle or are parents
|
|
173
|
+
// of a discovered workflow/step/serde file via the check above.
|
|
174
|
+
if (options.bundleTransitiveLocalStepDependencies &&
|
|
175
|
+
isProjectLocalFile(normalizedResolvedPath, projectRoot) &&
|
|
176
|
+
parentHasChild(normalizedEntry, normalizedResolvedPath)) {
|
|
177
|
+
shouldBundle = true;
|
|
178
|
+
break;
|
|
179
|
+
}
|
|
131
180
|
}
|
|
132
181
|
if (shouldBundle) {
|
|
133
182
|
// Let esbuild bundle this entry, but override sideEffects if needed.
|
|
@@ -141,6 +190,15 @@ export function createSwcPlugin(options) {
|
|
|
141
190
|
}
|
|
142
191
|
let externalPath;
|
|
143
192
|
if (shouldMakeRelative) {
|
|
193
|
+
// When the resolved file lives inside node_modules, let
|
|
194
|
+
// esbuild bundle it rather than externalizing with a deeply
|
|
195
|
+
// nested relative path. Downstream bundlers (Rollup/Vite)
|
|
196
|
+
// can't rewrite opaque `__require()` calls in CJS shims, so
|
|
197
|
+
// relative paths computed for `outdir` break once the output
|
|
198
|
+
// is rebundled to a different directory.
|
|
199
|
+
if (normalizedResolvedPath.includes('/node_modules/')) {
|
|
200
|
+
return null; // let esbuild bundle it
|
|
201
|
+
}
|
|
144
202
|
externalPath = relative(options.outdir || process.cwd(), resolvedPath).replace(/\\/g, '/');
|
|
145
203
|
if (options.rewriteTsExtensions) {
|
|
146
204
|
// Rewrite TypeScript extensions to their JS equivalents so the
|
|
@@ -266,4 +324,10 @@ export function createSwcPlugin(options) {
|
|
|
266
324
|
},
|
|
267
325
|
};
|
|
268
326
|
}
|
|
269
|
-
|
|
327
|
+
function isProjectLocalFile(filePath, projectRoot) {
|
|
328
|
+
if (normalizePath(filePath).includes('/node_modules/')) {
|
|
329
|
+
return false;
|
|
330
|
+
}
|
|
331
|
+
return (resolveModuleSpecifier(filePath, projectRoot).moduleSpecifier === undefined);
|
|
332
|
+
}
|
|
333
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3djLWVzYnVpbGQtcGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL3N3Yy1lc2J1aWxkLXBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDNUMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUNyQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ3RDLE9BQU8sbUJBQW1CLE1BQU0sa0JBQWtCLENBQUM7QUFFbkQsT0FBTyxFQUNMLGlCQUFpQixHQUVsQixNQUFNLDBCQUEwQixDQUFDO0FBQ2xDLE9BQU8sRUFDTCxTQUFTLEVBQ1QsY0FBYyxHQUNmLE1BQU0sc0NBQXNDLENBQUM7QUFDOUMsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGdDQUFnQyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUF5Q3ZFLE1BQU0sb0JBQW9CLEdBQUc7SUFDM0IsY0FBYyxFQUFFLFVBQVU7SUFDMUIsT0FBTyxFQUFFLENBQUMsY0FBYyxDQUFDO0lBQ3pCLGFBQWEsRUFBRSxDQUFDLFNBQVMsQ0FBQztJQUMxQixhQUFhLEVBQUUsQ0FBQyxTQUFTLENBQUM7SUFDMUIsY0FBYyxFQUFFLENBQUMsTUFBTSxFQUFFLFNBQVMsQ0FBQztJQUNuQyxnQkFBZ0IsRUFBRSxDQUFDLGNBQWMsQ0FBQztJQUNsQyxVQUFVLEVBQUU7UUFDVixLQUFLO1FBQ0wsTUFBTTtRQUNOLE1BQU07UUFDTixNQUFNO1FBQ04sTUFBTTtRQUNOLE1BQU07UUFDTixLQUFLO1FBQ0wsTUFBTTtRQUNOLE9BQU87UUFDUCxPQUFPO0tBQ1I7SUFDRCxpQkFBaUIsRUFBRSxLQUFLO0lBQ3hCLFFBQVEsRUFBRSxJQUFJO0lBQ2QsVUFBVSxFQUFFLENBQUMsTUFBTSxDQUFDO0lBQ3BCLFNBQVMsRUFBRSxDQUFD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LE9BQU87d0JBQ0wsUUFBUSxFQUFFLGVBQWU7d0JBQ3pCLE1BQU07cUJBQ1AsQ0FBQztnQkFDSixDQUFDO2dCQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ2YsTUFBTSxZQUFZLEdBQ2hCLEtBQUssWUFBWSxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDekQsT0FBTyxDQUFDLEtBQUssQ0FDWCw0QkFBNEIsSUFBSSxDQUFDLElBQUksR0FBRyxFQUN4QyxZQUFZLENBQ2IsQ0FBQztvQkFDRixPQUFPO3dCQUNMLE1BQU0sRUFBRTs0QkFDTjtnQ0FDRSxJQUFJLEVBQUUseUJBQXlCLFlBQVksRUFBRTtnQ0FDN0MsUUFBUSxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQyxFQUFFOzZCQUNsRDt5QkFDRjtxQkFDRixDQUFDO2dCQUNKLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsa0JBQWtCLENBQUMsUUFBZ0IsRUFBRSxXQUFtQjtJQUMvRCxJQUFJLGFBQWEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxDQUFDO1FBQ3ZELE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE9BQU8sQ0FDTCxzQkFBc0IsQ0FBQyxRQUFRLEVBQUUsV0FBVyxDQUFDLENBQUMsZUFBZSxLQUFLLFNBQVMsQ0FDNUUsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgcmVsYXRpdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgcHJvbWlzaWZ5IH0gZnJvbSAnbm9kZTp1dGlsJztcbmltcG9ydCBlbmhhbmNlZFJlc29sdmVPcmlnIGZyb20gJ2VuaGFuY2VkLXJlc29sdmUnO1xuaW1wb3J0IHR5cGUgeyBQbHVnaW4gfSBmcm9tICdlc2J1aWxkJztcbmltcG9ydCB7XG4gIGFwcGx5U3djVHJhbnNmb3JtLFxuICB0eXBlIFdvcmtmbG93TWFuaWZlc3QsXG59IGZyb20gJy4vYXBwbHktc3djLXRyYW5zZm9ybS5qcyc7XG5pbXBvcnQge1xuICBqc1RzUmVnZXgsXG4gIHBhcmVudEhhc0NoaWxkLFxufSBmcm9tICcuL2Rpc2NvdmVyLWVudHJpZXMtZXNidWlsZC1wbHVnaW4uanMnO1xuaW1wb3J0IHsgcmVzb2x2ZU1vZHVsZVNwZWNpZmllciB9IGZyb20gJy4vbW9kdWxlLXNwZWNpZmllci5qcyc7XG5pbXBvcnQgeyByZXNvbHZlV29ya2Zsb3dBbGlhc1JlbGF0aXZlUGF0aCB9IGZyb20gJy4vd29ya2Zsb3ctYWxpYXMuanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFN3Y1BsdWdpbk9wdGlvbnMge1xuICBtb2RlOiAnc3RlcCcgfCAnd29ya2Zsb3cnO1xuICBlbnRyaWVzVG9CdW5kbGU/OiBzdHJpbmdbXTtcbiAgb3V0ZGlyPzogc3RyaW5nO1xuICBwcm9qZWN0Um9vdD86IHN0cmluZztcbiAgd29ya2Zsb3dNYW5pZmVzdD86IFdvcmtmbG93TWFuaWZlc3Q7XG4gIC8qKlxuICAgKiBSZXdyaXRlIFR5cGVTY3JpcHQgZXh0ZW5zaW9ucyAoLnRzLCAudHN4LCAubXRzLCAuY3RzKSB0byB0aGVpciBKU1xuICAgKiBlcXVpdmFsZW50cyAoLmpzLCAubWpzLCAuY2pzKSBpbiBleHRlcm5hbGl6ZWQgaW1wb3J0IHBhdGhzLlxuICAgKlxuICAgKiBFbmFibGUgdGhpcyB3aGVuIHRoZSBvdXRwdXQgYnVuZGxlIGlzIGNvbnN1bWVkIGRpcmVjdGx5IGJ5IE5vZGUncyBuYXRpdmVcbiAgICogRVNNIGxvYWRlciAoZS5nLiB2aXRlc3QpLCB3aGljaCBjYW5ub3QgcmVzb2x2ZSAudHMgZXh0ZW5zaW9ucy5cbiAgICpcbiAgICogTGVhdmUgZGlzYWJsZWQgKGRlZmF1bHQpIHdoZW4gYSBkb3duc3RyZWFtIGJ1bmRsZXIgKHdlYnBhY2ssIFZpdGUsIGV0Yy4pXG4gICAqIGhhbmRsZXMgcmVzb2x1dGlvbiDigJQgdGhvc2UgdG9vbHMgcmVzb2x2ZSAudHMgbmF0aXZlbHkgYW5kIHJld3JpdGluZ1xuICAgKiBicmVha3MgdGhlbSBiZWNhdXNlIHRoZSAuanMgZmlsZSBkb2Vzbid0IGV4aXN0IG9uIGRpc2suXG4gICAqL1xuICByZXdyaXRlVHNFeHRlbnNpb25zPzogYm9vbGVhbjtcbiAgLyoqXG4gICAqIEJ1bmRsZSBwcm9qZWN0LWxvY2FsIGZpbGVzIHRoYXQgYXJlIHRyYW5zaXRpdmVseSBpbXBvcnRlZCBieSBzdGVwIGVudHJpZXMuXG4gICAqXG4gICAqIEtlZXAgdGhpcyBkaXNhYmxlZCB3aGVuIGEgZG93bnN0cmVhbSBidW5kbGVyIGNvbnN1bWVzIHRoZSBnZW5lcmF0ZWQgc3RlcFxuICAgKiBidW5kbGUgYmVjYXVzZSB0aGF0IGJ1bmRsZXIgY2FuIHJlc29sdmUgdGhlIGV4dGVybmFsaXplZCBsb2NhbCBpbXBvcnRzLlxuICAgKiBFbmFibGUgaXQgZm9yIGRpcmVjdCBydW50aW1lIGxvYWRpbmcsIHdoZXJlIE5vZGUgaW1wb3J0cyB0aGUgZ2VuZXJhdGVkIHN0ZXBcbiAgICogYnVuZGxlIGZyb20gZGlzayB3aXRob3V0IGEgbGF0ZXIgYnVuZGxpbmcgcGFzcy5cbiAgICovXG4gIGJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXM/OiBib29sZWFuO1xuICAvKipcbiAgICogQWJzb2x1dGUgZmlsZSBwYXRocyBvZiBkaXNjb3ZlcmVkIHdvcmtmbG93L3N0ZXAvc2VyZGUgZW50cmllcyB3aG9zZVxuICAgKiBpbXBvcnRzIG11c3QgYmUgdHJlYXRlZCBhcyBzaWRlLWVmZmVjdGZ1bC5cbiAgICpcbiAgICogVGhlIFNXQyBjb21waWxlciB0cmFuc2Zvcm0gaW5qZWN0cyByZWdpc3RyYXRpb24gY2FsbHMgKHdvcmtmbG93IElEcyxcbiAgICogc3RlcCBJRHMsIGNsYXNzIHNlcmlhbGl6YXRpb24sIGV0Yy4pIGludG8gdGhlc2UgZmlsZXMuIFdpdGhvdXQgdGhpc1xuICAgKiBvdmVycmlkZSwgZXNidWlsZCBob25vdXJzIGBcInNpZGVFZmZlY3RzXCI6IGZhbHNlYCBmcm9tIHRoZSBwYWNrYWdlJ3NcbiAgICogYHBhY2thZ2UuanNvbmAgYW5kIHNpbGVudGx5IGRyb3BzIGJhcmUgaW1wb3J0cyBvZiB0aGVzZSBtb2R1bGVzLlxuICAgKi9cbiAgc2lkZUVmZmVjdEVudHJpZXM/OiBzdHJpbmdbXTtcbn1cblxuY29uc3QgTk9ERV9SRVNPTFZFX09QVElPTlMgPSB7XG4gIGRlcGVuZGVuY3lUeXBlOiAnY29tbW9uanMnLFxuICBtb2R1bGVzOiBbJ25vZGVfbW9kdWxlcyddLFxuICBleHBvcnRzRmllbGRzOiBbJ2V4cG9ydHMnXSxcbiAgaW1wb3J0c0ZpZWxkczogWydpbXBvcnRzJ10sXG4gIGNvbmRpdGlvbk5hbWVzOiBbJ25vZGUnLCAncmVxdWlyZSddLFxuICBkZXNjcmlwdGlvbkZpbGVzOiBbJ3BhY2thZ2UuanNvbiddLFxuICBleHRlbnNpb25zOiBbXG4gICAgJy50cycsXG4gICAgJy50c3gnLFxuICAgICcubXRzJyxcbiAgICAnLmN0cycsXG4gICAgJy5janMnLFxuICAgICcubWpzJyxcbiAgICAnLmpzJyxcbiAgICAnLmpzeCcsXG4gICAgJy5qc29uJyxcbiAgICAnLm5vZGUnLFxuICBdLFxuICBlbmZvcmNlRXh0ZW5zaW9uczogZmFsc2UsXG4gIHN5bWxpbmtzOiB0cnVlLFxuICBtYWluRmllbGRzOiBbJ21haW4nXSxcbiAgbWFpbkZpbGVzOiBbJ2luZGV4J10sXG4gIHJvb3RzOiBbXSxcbiAgZnVsbHlTcGVjaWZpZWQ6IGZhbHNlLFxuICBwcmVmZXJSZWxhdGl2ZTogZmFsc2UsXG4gIHByZWZlckFic29sdXRlOiBmYWxzZSxcbiAgcmVzdHJpY3Rpb25zOiBbXSxcbn07XG5cbmNvbnN0IE5PREVfRVNNX1JFU09MVkVfT1BUSU9OUyA9IHtcbiAgLi4uTk9ERV9SRVNPTFZFX09QVElPTlMsXG4gIGRlcGVuZGVuY3lUeXBlOiAnZXNtJyxcbiAgY29uZGl0aW9uTmFtZXM6IFsnbm9kZScsICdpbXBvcnQnXSxcbn07XG5cbmZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aDogc3RyaW5nKTogc3RyaW5nIHtcbiAgcmV0dXJuIHBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3djUGx1Z2luKG9wdGlvbnM6IFN3Y1BsdWdpbk9wdGlvbnMpOiBQbHVnaW4ge1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICdzd2Mtd29ya2Zsb3ctcGx1Z2luJyxcbiAgICBzZXR1cChidWlsZCkge1xuICAgICAgLy8gZXZlcnl0aGluZyBpcyBleHRlcm5hbCB1bmxlc3MgZXhwbGljaXRseSBjb25maWd1cmVkXG4gICAgICAvLyB0byBiZSBidW5kbGVkXG4gICAgICBjb25zdCBjanNSZXNvbHZlciA9IHByb21pc2lmeShcbiAgICAgICAgZW5oYW5jZWRSZXNvbHZlT3JpZy5jcmVhdGUoTk9ERV9SRVNPTFZFX09QVElPTlMpXG4gICAgICApO1xuICAgICAgY29uc3QgZXNtUmVzb2x2ZXIgPSBwcm9taXNpZnkoXG4gICAgICAgIGVuaGFuY2VkUmVzb2x2ZU9yaWcuY3JlYXRlKE5PREVfRVNNX1JFU09MVkVfT1BUSU9OUylcbiAgICAgICk7XG5cbiAgICAgIGNvbnN0IGVuaGFuY2VkUmVzb2x2ZSA9IGFzeW5jIChjb250ZXh0OiBzdHJpbmcsIHBhdGg6IHN0cmluZykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBhd2FpdCBlc21SZXNvbHZlcihjb250ZXh0LCBwYXRoKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiBjanNSZXNvbHZlcihjb250ZXh0LCBwYXRoKTtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICAgICAgLy8gUHJlLWNvbXB1dGUgdGhlIG5vcm1hbGl6ZWQgc2lkZS1lZmZlY3QgZW50cmllcyBzZXQgZm9yIE8oMSkgbG9va3Vwcy5cbiAgICAgIGNvbnN0IG5vcm1hbGl6ZWRTaWRlRWZmZWN0RW50cmllcyA9IG5ldyBTZXQoXG4gICAgICAgIG9wdGlvbnMuc2lkZUVmZmVjdEVudHJpZXM/Lm1hcCgoZSkgPT4gZS5yZXBsYWNlKC9cXFxcL2csICcvJykpXG4gICAgICApO1xuXG4gICAgICBidWlsZC5vblJlc29sdmUoeyBmaWx0ZXI6IC8uKi8gfSwgYXN5bmMgKGFyZ3MpID0+IHtcbiAgICAgICAgaWYgKGFyZ3MucGx1Z2luRGF0YT8uc2tpcFN3Y1BsdWdpbikgcmV0dXJuIG51bGw7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICFvcHRpb25zLmVudHJpZXNUb0J1bmRsZSAmJlxuICAgICAgICAgIG5vcm1hbGl6ZWRTaWRlRWZmZWN0RW50cmllcy5zaXplID09PSAwXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gV2hlbiBvbmx5IHNpZGVFZmZlY3RFbnRyaWVzIGlzIHNldCAobm8gZW50cmllc1RvQnVuZGxlKSwgd2Ugb25seVxuICAgICAgICAvLyBuZWVkIHRvIG92ZXJyaWRlIHNpZGVFZmZlY3RzIGZvciB0b3AtbGV2ZWwgYmFyZSBpbXBvcnRzIOKAlCB0eXBpY2FsbHlcbiAgICAgICAgLy8gZnJvbSB0aGUgdmlydHVhbCBlbnRyeS4gU2tpcCByZXNvbHV0aW9uIGZvciB0cmFuc2l0aXZlIGltcG9ydHNcbiAgICAgICAgLy8gKGR5bmFtaWMgaW1wb3J0cywgcmVxdWlyZXMsIGV0Yy4pIHRvIGF2b2lkIHVubmVjZXNzYXJ5IG92ZXJoZWFkLlxuICAgICAgICBpZiAoIW9wdGlvbnMuZW50cmllc1RvQnVuZGxlICYmIGFyZ3Mua2luZCAhPT0gJ2ltcG9ydC1zdGF0ZW1lbnQnKSB7XG4gICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHNwZWNpZmllciA9IGFyZ3MucGF0aDtcbiAgICAgICAgICBjb25zdCBzcGVjaWZpZXJJc1BhdGggPVxuICAgICAgICAgICAgc3BlY2lmaWVyLnN0YXJ0c1dpdGgoJy4nKSB8fCBzcGVjaWZpZXIuc3RhcnRzV2l0aCgnLycpO1xuXG4gICAgICAgICAgbGV0IHJlc29sdmVkUGF0aDogc3RyaW5nIHwgZmFsc2UgfCB1bmRlZmluZWQ7XG4gICAgICAgICAgLy8gUGF0aC1zdHlsZSBzcGVjaWZpZXJzICguL2ZvbywgLi4vZm9vLCAvYWJzL3BhdGgpIGV4dGVybmFsaXplIGFzXG4gICAgICAgICAgLy8gcmVsYXRpdmUgcGF0aHMgZnJvbSBgb3V0ZGlyYC4gQmFyZSBzcGVjaWZpZXJzIChucG0gcGFja2FnZXMpXG4gICAgICAgICAgLy8gZXh0ZXJuYWxpemUgYXMtaXMgc28gTm9kZSBjYW4gcmVzb2x2ZSB0aGVtIGF0IHJ1bnRpbWUuXG4gICAgICAgICAgY29uc3Qgc2hvdWxkTWFrZVJlbGF0aXZlID0gc3BlY2lmaWVySXNQYXRoO1xuXG4gICAgICAgICAgaWYgKHNwZWNpZmllcklzUGF0aCkge1xuICAgICAgICAgICAgcmVzb2x2ZWRQYXRoID0gYXdhaXQgZW5oYW5jZWRSZXNvbHZlKGFyZ3MucmVzb2x2ZURpciwgc3BlY2lmaWVyKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUmVzb2x2ZSBmcm9tIHByb2plY3Qgcm9vdCBzbyBuZXN0ZWQgZGVwcyBhcmVuJ3QgZXh0ZXJuYWxpemVkXG4gICAgICAgICAgICByZXNvbHZlZFBhdGggPSBhd2FpdCBlbmhhbmNlZFJlc29sdmUoXG4gICAgICAgICAgICAgIGJ1aWxkLmluaXRpYWxPcHRpb25zLmFic1dvcmtpbmdEaXIgfHwgcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgICAgICAgc3BlY2lmaWVyXG4gICAgICAgICAgICApLmNhdGNoKCgpID0+IHVuZGVmaW5lZCk7IC8vIHN3YWxsb3cgc28gZXNidWlsZCBmYWxsYmFjayBiZWxvdyBjYW4gdHJ5XG5cbiAgICAgICAgICAgIC8vIEZhbGwgYmFjayB0byBlc2J1aWxkIGZvciBhbGlhc2VzL3RzY29uZmlnIHBhdGhzLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIElmIHRoZSBzcGVjaWZpZXIgcmVzb2x2ZXMgdG8gYSBwcm9qZWN0LWxvY2FsIGZpbGUgdmlhIGFuXG4gICAgICAgICAgICAvLyBhbGlhcy9wYXRoIG1hcHBpbmcgKGUuZy4gdHNjb25maWcgYHBhdGhzYCwgZXNidWlsZCBgYWxpYXNgLFxuICAgICAgICAgICAgLy8gc2VsZi1yZWZlcmVuY2luZyBwYWNrYWdlIG5hbWVzIGxpa2UgYEBteS1wa2cvbGliL2Zvb2ApLCB3ZVxuICAgICAgICAgICAgLy8gYnVuZGxlIGl0IGlubGluZSByYXRoZXIgdGhhbiBleHRlcm5hbGl6aW5nLlxuICAgICAgICAgICAgLy9cbiAgICAgICAgICAgIC8vIEV4dGVybmFsaXppbmcgc3VjaCBmaWxlcyBpcyB1bnNhZmU6IHdlJ2QgZW1pdCBhIHJlbGF0aXZlXG4gICAgICAgICAgICAvLyBpbXBvcnQgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZSBvbiBkaXNrLCBidXQgdGhhdCBzb3VyY2UgY2FuXG4gICAgICAgICAgICAvLyBjb250YWluIGZ1cnRoZXIgYWxpYXMgaW1wb3J0cy4gQXQgcnVudGltZSwgTm9kZSdzIEVTTSBsb2FkZXJcbiAgICAgICAgICAgIC8vIGRvZXNuJ3Qga25vdyBhYm91dCB0c2NvbmZpZyBwYXRocyBvciBidWlsZC10aW1lIGFsaWFzZXMsIHNvXG4gICAgICAgICAgICAvLyB0aG9zZSB0cmFuc2l0aXZlIGltcG9ydHMgdGhyb3cgYEVSUl9NT0RVTEVfTk9UX0ZPVU5EYCAvXG4gICAgICAgICAgICAvLyBgUGFja2FnZSBzdWJwYXRoIC4uLiBpcyBub3QgZGVmaW5lZCBieSBcImV4cG9ydHNcImAuXG4gICAgICAgICAgICAvL1xuICAgICAgICAgICAgLy8gQnVuZGxpbmcgaW5saW5lIGVuc3VyZXMgYWxpYXMtYmFzZWQgaW1wb3J0cyBhcmUgcmVzb2x2ZWQgYXRcbiAgICAgICAgICAgIC8vIGJ1aWxkIHRpbWUgKHdoZXJlIHRoZSBhbGlhcyBtYXAgaXMga25vd24pIGFuZCB0aGUgcnVudGltZVxuICAgICAgICAgICAgLy8gbmV2ZXIgc2VlcyBhbiB1bnJlc29sdmFibGUgc3BlY2lmaWVyLlxuICAgICAgICAgICAgaWYgKCFyZXNvbHZlZFBhdGgpIHtcbiAgICAgICAgICAgICAgY29uc3QgZXNidWlsZFJlc3VsdCA9IGF3YWl0IGJ1aWxkLnJlc29sdmUoc3BlY2lmaWVyLCB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZURpcjogYXJncy5yZXNvbHZlRGlyLFxuICAgICAgICAgICAgICAgIGtpbmQ6IGFyZ3Mua2luZCxcbiAgICAgICAgICAgICAgICBwbHVnaW5EYXRhOiB7IHNraXBTd2NQbHVnaW46IHRydWUgfSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIGNvbnN0IGRpZFJlc29sdmUgPVxuICAgICAgICAgICAgICAgICEhZXNidWlsZFJlc3VsdC5wYXRoICYmICFlc2J1aWxkUmVzdWx0LmVycm9ycy5sZW5ndGg7XG4gICAgICAgICAgICAgIGNvbnN0IGlzUHJvamVjdExvY2FsRmlsZSA9XG4gICAgICAgICAgICAgICAgZGlkUmVzb2x2ZSAmJlxuICAgICAgICAgICAgICAgICFlc2J1aWxkUmVzdWx0LmV4dGVybmFsICYmXG4gICAgICAgICAgICAgICAgIWVzYnVpbGRSZXN1bHQucGF0aFxuICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFwvZywgJy8nKVxuICAgICAgICAgICAgICAgICAgLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLycpO1xuICAgICAgICAgICAgICBpZiAoaXNQcm9qZWN0TG9jYWxGaWxlKSB7XG4gICAgICAgICAgICAgICAgLy8gTGV0IGVzYnVpbGQgYnVuZGxlIHRoaXMgYWxpYXNlZCBwcm9qZWN0LWxvY2FsIGZpbGUgaW5saW5lXG4gICAgICAgICAgICAgICAgLy8gKHJldHVybiBudWxsIHRvIGRlZmVyIHRvIGVzYnVpbGQncyBub3JtYWwgcGlwZWxpbmUpLiBUaGVcbiAgICAgICAgICAgICAgICAvLyBTV0MgYG9uTG9hZGAgaGFuZGxlciB3aWxsIHN0aWxsIHByb2Nlc3MgaXQuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgb3B0aW9ucy5lbnRyaWVzVG9CdW5kbGUgJiZcbiAgICAgICAgICAgICAgICBlc2J1aWxkUmVzdWx0LnBhdGg/LmVuZHNXaXRoKCcubm9kZScpXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgICBleHRlcm5hbDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgIHBhdGg6IHNwZWNpZmllcixcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCFyZXNvbHZlZFBhdGgpIHJldHVybiBudWxsO1xuXG4gICAgICAgICAgLy8gTm9ybWFsaXplIHRvIGZvcndhcmQgc2xhc2hlcyBmb3IgY3Jvc3MtcGxhdGZvcm0gY29tcGFyaXNvblxuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGggPSBub3JtYWxpemVQYXRoKHJlc29sdmVkUGF0aCk7XG4gICAgICAgICAgY29uc3Qgd29ya2luZ0RpciA9XG4gICAgICAgICAgICBidWlsZC5pbml0aWFsT3B0aW9ucy5hYnNXb3JraW5nRGlyIHx8IHByb2Nlc3MuY3dkKCk7XG4gICAgICAgICAgY29uc3QgcHJvamVjdFJvb3QgPSBvcHRpb25zLnByb2plY3RSb290IHx8IHdvcmtpbmdEaXI7XG5cbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICBvcHRpb25zLmVudHJpZXNUb0J1bmRsZSAmJlxuICAgICAgICAgICAgbm9ybWFsaXplZFJlc29sdmVkUGF0aC5lbmRzV2l0aCgnLm5vZGUnKVxuICAgICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZXh0ZXJuYWw6IHRydWUsXG4gICAgICAgICAgICAgIHBhdGg6IHNwZWNpZmllcixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBtb2R1bGUgaXMgYSBkaXNjb3ZlcmVkIGVudHJ5IHdob3NlIFNXQy10cmFuc2Zvcm1lZFxuICAgICAgICAgIC8vIGNvZGUgY29udGFpbnMgc2lkZSBlZmZlY3RzICh3b3JrZmxvdy9zdGVwL2NsYXNzIHJlZ2lzdHJhdGlvbikuXG4gICAgICAgICAgLy8gT3ZlcnJpZGUgdGhlIHBhY2thZ2UuanNvbiBcInNpZGVFZmZlY3RzXCI6IGZhbHNlIHNvIGVzYnVpbGQgZG9lcyBub3RcbiAgICAgICAgICAvLyBkcm9wIGJhcmUgaW1wb3J0cyBvZiB0aGVzZSBtb2R1bGVzLlxuICAgICAgICAgIGNvbnN0IGhhc1NpZGVFZmZlY3RzID0gbm9ybWFsaXplZFNpZGVFZmZlY3RFbnRyaWVzLmhhcyhcbiAgICAgICAgICAgIG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGhcbiAgICAgICAgICApO1xuXG4gICAgICAgICAgaWYgKG9wdGlvbnMuZW50cmllc1RvQnVuZGxlKSB7XG4gICAgICAgICAgICBsZXQgc2hvdWxkQnVuZGxlID0gZmFsc2U7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGVudHJ5VG9CdW5kbGUgb2Ygb3B0aW9ucy5lbnRyaWVzVG9CdW5kbGUpIHtcbiAgICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZEVudHJ5ID0gZW50cnlUb0J1bmRsZS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG5cbiAgICAgICAgICAgICAgaWYgKG5vcm1hbGl6ZWRSZXNvbHZlZFBhdGggPT09IG5vcm1hbGl6ZWRFbnRyeSkge1xuICAgICAgICAgICAgICAgIHNob3VsZEJ1bmRsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBpZiB0aGUgY3VycmVudCBlbnRyeSBpbXBvcnRzIGEgY2hpbGQgdGhhdCBuZWVkc1xuICAgICAgICAgICAgICAvLyB0byBiZSBidW5kbGVkIHRoZW4gaXQgbmVlZHMgdG8gYWxzbyBiZSBidW5kbGVkIHNvXG4gICAgICAgICAgICAgIC8vIHRoYXQgdGhlIGNoaWxkIGNhbiBoYXZlIG91ciB0cmFuc2Zvcm0gYXBwbGllZFxuICAgICAgICAgICAgICBpZiAocGFyZW50SGFzQ2hpbGQobm9ybWFsaXplZFJlc29sdmVkUGF0aCwgbm9ybWFsaXplZEVudHJ5KSkge1xuICAgICAgICAgICAgICAgIHNob3VsZEJ1bmRsZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBCdW5kbGUgcHJvamVjdC1sb2NhbCBzb3VyY2UgZmlsZXMgdGhhdCBhcmUgaW1wb3J0ZWQgYnkgYVxuICAgICAgICAgICAgICAvLyBzdGVwL3NlcmRlIGVudHJ5IHNvIGRpcmVjdCBydW50aW1lIGxvYWRlcnMgZG8gbm90IHNlZSByYXcgVFNcbiAgICAgICAgICAgICAgLy8gZXh0ZW5zaW9ubGVzcyBpbXBvcnRzLiBLZWVwIHBhY2thZ2UgZGVwZW5kZW5jaWVzIGV4dGVybmFsXG4gICAgICAgICAgICAgIC8vIHVubGVzcyB0aGV5IGFyZSB0aGVtc2VsdmVzIGluIGVudHJpZXNUb0J1bmRsZSBvciBhcmUgcGFyZW50c1xuICAgICAgICAgICAgICAvLyBvZiBhIGRpc2NvdmVyZWQgd29ya2Zsb3cvc3RlcC9zZXJkZSBmaWxlIHZpYSB0aGUgY2hlY2sgYWJvdmUuXG4gICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBvcHRpb25zLmJ1bmRsZVRyYW5zaXRpdmVMb2NhbFN0ZXBEZXBlbmRlbmNpZXMgJiZcbiAgICAgICAgICAgICAgICBpc1Byb2plY3RMb2NhbEZpbGUobm9ybWFsaXplZFJlc29sdmVkUGF0aCwgcHJvamVjdFJvb3QpICYmXG4gICAgICAgICAgICAgICAgcGFyZW50SGFzQ2hpbGQobm9ybWFsaXplZEVudHJ5LCBub3JtYWxpemVkUmVzb2x2ZWRQYXRoKVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBzaG91bGRCdW5kbGUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChzaG91bGRCdW5kbGUpIHtcbiAgICAgICAgICAgICAgLy8gTGV0IGVzYnVpbGQgYnVuZGxlIHRoaXMgZW50cnksIGJ1dCBvdmVycmlkZSBzaWRlRWZmZWN0cyBpZiBuZWVkZWQuXG4gICAgICAgICAgICAgIC8vIFdlIG11c3QgcmV0dXJuIHRoZSByZXNvbHZlZCBgcGF0aGAgYWxvbmdzaWRlIGBzaWRlRWZmZWN0c2AgYmVjYXVzZVxuICAgICAgICAgICAgICAvLyByZXR1cm5pbmcgb25seSBgeyBzaWRlRWZmZWN0czogdHJ1ZSB9YCB3aXRob3V0IGEgcGF0aCBjYXVzZXMgZXNidWlsZFxuICAgICAgICAgICAgICAvLyB0byBmYWxsIHRocm91Z2ggdG8gaXRzIG93biByZXNvbHZlciwgd2hpY2ggcmUtcmVhZHMgdGhlIHBhY2thZ2UuanNvblxuICAgICAgICAgICAgICAvLyBhbmQgYXBwbGllcyBgXCJzaWRlRWZmZWN0c1wiOiBmYWxzZWAgZnJvbSB0aGVyZS5cbiAgICAgICAgICAgICAgcmV0dXJuIGhhc1NpZGVFZmZlY3RzXG4gICAgICAgICAgICAgICAgPyB7IHBhdGg6IHJlc29sdmVkUGF0aCwgc2lkZUVmZmVjdHM6IHRydWUgfVxuICAgICAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IGV4dGVybmFsUGF0aDogc3RyaW5nO1xuICAgICAgICAgICAgaWYgKHNob3VsZE1ha2VSZWxhdGl2ZSkge1xuICAgICAgICAgICAgICAvLyBXaGVuIHRoZSByZXNvbHZlZCBmaWxlIGxpdmVzIGluc2lkZSBub2RlX21vZHVsZXMsIGxldFxuICAgICAgICAgICAgICAvLyBlc2J1aWxkIGJ1bmRsZSBpdCByYXRoZXIgdGhhbiBleHRlcm5hbGl6aW5nIHdpdGggYSBkZWVwbHlcbiAgICAgICAgICAgICAgLy8gbmVzdGVkIHJlbGF0aXZlIHBhdGguIERvd25zdHJlYW0gYnVuZGxlcnMgKFJvbGx1cC9WaXRlKVxuICAgICAgICAgICAgICAvLyBjYW4ndCByZXdyaXRlIG9wYXF1ZSBgX19yZXF1aXJlKClgIGNhbGxzIGluIENKUyBzaGltcywgc29cbiAgICAgICAgICAgICAgLy8gcmVsYXRpdmUgcGF0aHMgY29tcHV0ZWQgZm9yIGBvdXRkaXJgIGJyZWFrIG9uY2UgdGhlIG91dHB1dFxuICAgICAgICAgICAgICAvLyBpcyByZWJ1bmRsZWQgdG8gYSBkaWZmZXJlbnQgZGlyZWN0b3J5LlxuICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFJlc29sdmVkUGF0aC5pbmNsdWRlcygnL25vZGVfbW9kdWxlcy8nKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBsZXQgZXNidWlsZCBidW5kbGUgaXRcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIGV4dGVybmFsUGF0aCA9IHJlbGF0aXZlKFxuICAgICAgICAgICAgICAgIG9wdGlvbnMub3V0ZGlyIHx8IHByb2Nlc3MuY3dkKCksXG4gICAgICAgICAgICAgICAgcmVzb2x2ZWRQYXRoXG4gICAgICAgICAgICAgICkucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXG4gICAgICAgICAgICAgIGlmIChvcHRpb25zLnJld3JpdGVUc0V4dGVuc2lvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXdyaXRlIFR5cGVTY3JpcHQgZXh0ZW5zaW9ucyB0byB0aGVpciBKUyBlcXVpdmFsZW50cyBzbyB0aGVcbiAgICAgICAgICAgICAgICAvLyBleHRlcm5hbGl6ZWQgaW1wb3J0IGlzIGxvYWRhYmxlIGJ5IE5vZGUncyBuYXRpdmUgRVNNIGxvYWRlci5cbiAgICAgICAgICAgICAgICBleHRlcm5hbFBhdGggPSBleHRlcm5hbFBhdGhcbiAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXC50c3g/JC8sICcuanMnKVxuICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcLm10cyQvLCAnLm1qcycpXG4gICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFwuY3RzJC8sICcuY2pzJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIGV4dGVybmFsUGF0aCA9IHNwZWNpZmllcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgZXh0ZXJuYWw6IHRydWUsXG4gICAgICAgICAgICAgIHBhdGg6IGV4dGVybmFsUGF0aCxcbiAgICAgICAgICAgICAgc2lkZUVmZmVjdHM6IGhhc1NpZGVFZmZlY3RzIHx8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gTm8gZW50cmllc1RvQnVuZGxlIOKAlCBvbmx5IG92ZXJyaWRlIHNpZGVFZmZlY3RzIHdoZW4gbmVlZGVkLlxuICAgICAgICAgIC8vIFdlIG11c3QgcmV0dXJuIHRoZSByZXNvbHZlZCBgcGF0aGAgYWxvbmdzaWRlIGBzaWRlRWZmZWN0c2AgYmVjYXVzZVxuICAgICAgICAgIC8vIHJldHVybmluZyBvbmx5IGB7IHNpZGVFZmZlY3RzOiB0cnVlIH1gIHdpdGhvdXQgYSBwYXRoIGNhdXNlcyBlc2J1aWxkXG4gICAgICAgICAgLy8gdG8gZmFsbCB0aHJvdWdoIHRvIGl0cyBvd24gcmVzb2x2ZXIsIHdoaWNoIHJlLXJlYWRzIHRoZSBwYWNrYWdlLmpzb25cbiAgICAgICAgICAvLyBhbmQgYXBwbGllcyBgXCJzaWRlRWZmZWN0c1wiOiBmYWxzZWAgZnJvbSB0aGVyZS5cbiAgICAgICAgICByZXR1cm4gaGFzU2lkZUVmZmVjdHNcbiAgICAgICAgICAgID8geyBwYXRoOiByZXNvbHZlZFBhdGgsIHNpZGVFZmZlY3RzOiB0cnVlIH1cbiAgICAgICAgICAgIDogbnVsbDtcbiAgICAgICAgfSBjYXRjaCAoXykge31cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9KTtcblxuICAgICAgLy8gSGFuZGxlIFR5cGVTY3JpcHQgYW5kIEphdmFTY3JpcHQgZmlsZXNcbiAgICAgIGJ1aWxkLm9uTG9hZCh7IGZpbHRlcjoganNUc1JlZ2V4IH0sIGFzeW5jIChhcmdzKSA9PiB7XG4gICAgICAgIC8vIERldGVybWluZSBpZiB0aGlzIGlzIGEgVHlwZVNjcmlwdCBmaWxlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBsb2FkZXIgYmFzZWQgb24gdGhlIG91dHB1dFxuICAgICAgICAgIGxldCBsb2FkZXI6ICdqcycgfCAnanN4JyB8ICd0c3gnID0gJ2pzJztcbiAgICAgICAgICBpZiAoYXJncy5wYXRoLmVuZHNXaXRoKCcuanN4JykpIHtcbiAgICAgICAgICAgIGxvYWRlciA9ICdqc3gnO1xuICAgICAgICAgIH0gZWxzZSBpZiAoYXJncy5wYXRoLmVuZHNXaXRoKCcudHN4JykpIHtcbiAgICAgICAgICAgIGxvYWRlciA9ICd0c3gnO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCByZWFkRmlsZShhcmdzLnBhdGgsICd1dGY4Jyk7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFNvdXJjZSA9IHNvdXJjZVxuICAgICAgICAgICAgLnJlcGxhY2UoL3JlcXVpcmVcXChcXHMqKFsnXCJdKXNlcnZlci1vbmx5XFwxXFxzKlxcKS9nLCAndm9pZCAwJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC9yZXF1aXJlXFwoXFxzKihbJ1wiXSljbGllbnQtb25seVxcMVxccypcXCkvZywgJ3ZvaWQgMCcpO1xuXG4gICAgICAgICAgLy8gQ2FsY3VsYXRlIHJlbGF0aXZlIHBhdGggZm9yIFNXQyBwbHVnaW5cbiAgICAgICAgICAvLyBUaGUgZmlsZW5hbWUgcGFyYW1ldGVyIGlzIHVzZWQgdG8gZ2VuZXJhdGUgd29ya2Zsb3dJZC9zdGVwSWQsIHNvIGl0IG11c3QgYmUgcmVsYXRpdmVcbiAgICAgICAgICBjb25zdCB3b3JraW5nRGlyID1cbiAgICAgICAgICAgIGJ1aWxkLmluaXRpYWxPcHRpb25zLmFic1dvcmtpbmdEaXIgfHwgcHJvY2Vzcy5jd2QoKTtcbiAgICAgICAgICBjb25zdCBwcm9qZWN0Um9vdCA9IG9wdGlvbnMucHJvamVjdFJvb3QgfHwgd29ya2luZ0RpcjtcbiAgICAgICAgICAvLyBOb3JtYWxpemUgcGF0aHM6IGNvbnZlcnQgYmFja3NsYXNoZXMgdG8gZm9yd2FyZCBzbGFzaGVzIGFuZCByZW1vdmUgdHJhaWxpbmcgc2xhc2hlc1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gd29ya2luZ0RpclxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFwvZywgJy8nKVxuICAgICAgICAgICAgLnJlcGxhY2UoL1xcLyQvLCAnJyk7XG4gICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFBhdGggPSBhcmdzLnBhdGgucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXG4gICAgICAgICAgLy8gV2luZG93cyBmaXg6IEFsd2F5cyBkbyBjYXNlLWluc2Vuc2l0aXZlIHBhdGggY29tcGFyaXNvbiBhcyB0aGUgUFJJTUFSWSBsb2dpY1xuICAgICAgICAgIC8vIHRvIHdvcmsgYXJvdW5kIG5vZGU6cGF0aC5yZWxhdGl2ZSgpIG5vdCByZWNvZ25pemluZyBwYXRocyB3aXRoIGRpZmZlcmVudCBkcml2ZVxuICAgICAgICAgIC8vIGxldHRlciBjYXNpbmcgKGUuZy4sIEQ6IHZzIGQ6KSBhcyBiZWluZyBpbiB0aGUgc2FtZSB0cmVlXG4gICAgICAgICAgY29uc3QgbG93ZXJXZCA9IG5vcm1hbGl6ZWRXb3JraW5nRGlyLnRvTG93ZXJDYXNlKCk7XG4gICAgICAgICAgY29uc3QgbG93ZXJQYXRoID0gbm9ybWFsaXplZFBhdGgudG9Mb3dlckNhc2UoKTtcblxuICAgICAgICAgIGxldCByZWxhdGl2ZUZpbGVwYXRoOiBzdHJpbmc7XG4gICAgICAgICAgaWYgKGxvd2VyUGF0aC5zdGFydHNXaXRoKGxvd2VyV2QgKyAnLycpKSB7XG4gICAgICAgICAgICAvLyBGaWxlIGlzIHVuZGVyIHdvcmtpbmcgZGlyZWN0b3J5IC0gbWFudWFsbHkgY2FsY3VsYXRlIHJlbGF0aXZlIHBhdGhcbiAgICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyB3ZSBnZXQgYSByZWxhdGl2ZSBwYXRoIGV2ZW4gd2l0aCBkcml2ZSBsZXR0ZXIgY2FzaW5nIGlzc3Vlc1xuICAgICAgICAgICAgcmVsYXRpdmVGaWxlcGF0aCA9IG5vcm1hbGl6ZWRQYXRoLnN1YnN0cmluZyhcbiAgICAgICAgICAgICAgbm9ybWFsaXplZFdvcmtpbmdEaXIubGVuZ3RoICsgMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGxvd2VyUGF0aCA9PT0gbG93ZXJXZCkge1xuICAgICAgICAgICAgLy8gRmlsZSBJUyB0aGUgd29ya2luZyBkaXJlY3RvcnlcbiAgICAgICAgICAgIHJlbGF0aXZlRmlsZXBhdGggPSAnLic7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIEZpbGUgaXMgb3V0c2lkZSB3b3JraW5nIGRpcmVjdG9yeSAtIHVzZSByZWxhdGl2ZSgpIGFuZCBzdHJpcCAuLi8gcHJlZml4ZXMgaWYgbmVlZGVkXG4gICAgICAgICAgICByZWxhdGl2ZUZpbGVwYXRoID0gcmVsYXRpdmUoXG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWRXb3JraW5nRGlyLFxuICAgICAgICAgICAgICBub3JtYWxpemVkUGF0aFxuICAgICAgICAgICAgKS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG5cbiAgICAgICAgICAgIC8vIEhhbmRsZSBmaWxlcyBkaXNjb3ZlcmVkIG91dHNpZGUgdGhlIHdvcmtpbmcgZGlyZWN0b3J5XG4gICAgICAgICAgICAvLyBUaGVzZSBjb21lIGJhY2sgYXMgLi4vcGF0aC90by9maWxlLCBidXQgd2Ugd2FudCBqdXN0IHBhdGgvdG8vZmlsZVxuICAgICAgICAgICAgaWYgKHJlbGF0aXZlRmlsZXBhdGguc3RhcnRzV2l0aCgnLi4vJykpIHtcbiAgICAgICAgICAgICAgY29uc3QgYWxpYXNlZFJlbGF0aXZlUGF0aCA9XG4gICAgICAgICAgICAgICAgYXdhaXQgcmVzb2x2ZVdvcmtmbG93QWxpYXNSZWxhdGl2ZVBhdGgoYXJncy5wYXRoLCB3b3JraW5nRGlyKTtcbiAgICAgICAgICAgICAgaWYgKGFsaWFzZWRSZWxhdGl2ZVBhdGgpIHtcbiAgICAgICAgICAgICAgICByZWxhdGl2ZUZpbGVwYXRoID0gYWxpYXNlZFJlbGF0aXZlUGF0aDtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZWxhdGl2ZUZpbGVwYXRoID0gcmVsYXRpdmVGaWxlcGF0aFxuICAgICAgICAgICAgICAgICAgLnNwbGl0KCcvJylcbiAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09ICcuLicpXG4gICAgICAgICAgICAgICAgICAuam9pbignLycpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgLy8gRmluYWwgc2FmZXR5IGNoZWNrIC0gZW5zdXJlIHdlIG5ldmVyIHBhc3MgYW4gYWJzb2x1dGUgcGF0aCB0byBTV0NcbiAgICAgICAgICBpZiAoXG4gICAgICAgICAgICByZWxhdGl2ZUZpbGVwYXRoLmluY2x1ZGVzKCc6JykgfHxcbiAgICAgICAgICAgIHJlbGF0aXZlRmlsZXBhdGguc3RhcnRzV2l0aCgnLycpXG4gICAgICAgICAgKSB7XG4gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIGJ1dCBpZiBpdCBkb2VzLCB1c2UganVzdCB0aGUgZmlsZW5hbWUgYXMgbGFzdCByZXNvcnRcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoXG4gICAgICAgICAgICAgIGBbRVJST1JdIHJlbGF0aXZlRmlsZXBhdGggaXMgc3RpbGwgYWJzb2x1dGU6ICR7cmVsYXRpdmVGaWxlcGF0aH1gXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgcmVsYXRpdmVGaWxlcGF0aCA9IG5vcm1hbGl6ZWRQYXRoLnNwbGl0KCcvJykucG9wKCkgfHwgJ3Vua25vd24udHMnO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGNvbnN0IHsgY29kZTogdHJhbnNmb3JtZWRDb2RlLCB3b3JrZmxvd01hbmlmZXN0IH0gPVxuICAgICAgICAgICAgYXdhaXQgYXBwbHlTd2NUcmFuc2Zvcm0oXG4gICAgICAgICAgICAgIHJlbGF0aXZlRmlsZXBhdGgsXG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWRTb3VyY2UsXG4gICAgICAgICAgICAgIG9wdGlvbnMubW9kZSxcbiAgICAgICAgICAgICAgYXJncy5wYXRoLCAvLyBQYXNzIGFic29sdXRlIHBhdGggZm9yIG1vZHVsZSBzcGVjaWZpZXIgcmVzb2x1dGlvblxuICAgICAgICAgICAgICBwcm9qZWN0Um9vdFxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgIGlmICghb3B0aW9ucy53b3JrZmxvd01hbmlmZXN0KSB7XG4gICAgICAgICAgICBvcHRpb25zLndvcmtmbG93TWFuaWZlc3QgPSB7fTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBvcHRpb25zLndvcmtmbG93TWFuaWZlc3Qud29ya2Zsb3dzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIG9wdGlvbnMud29ya2Zsb3dNYW5pZmVzdC53b3JrZmxvd3MgfHwge30sXG4gICAgICAgICAgICB3b3JrZmxvd01hbmlmZXN0LndvcmtmbG93c1xuICAgICAgICAgICk7XG4gICAgICAgICAgb3B0aW9ucy53b3JrZmxvd01hbmlmZXN0LnN0ZXBzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIG9wdGlvbnMud29ya2Zsb3dNYW5pZmVzdC5zdGVwcyB8fCB7fSxcbiAgICAgICAgICAgIHdvcmtmbG93TWFuaWZlc3Quc3RlcHNcbiAgICAgICAgICApO1xuICAgICAgICAgIG9wdGlvbnMud29ya2Zsb3dNYW5pZmVzdC5jbGFzc2VzID0gT2JqZWN0LmFzc2lnbihcbiAgICAgICAgICAgIG9wdGlvbnMud29ya2Zsb3dNYW5pZmVzdC5jbGFzc2VzIHx8IHt9LFxuICAgICAgICAgICAgd29ya2Zsb3dNYW5pZmVzdC5jbGFzc2VzXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb250ZW50czogdHJhbnNmb3JtZWRDb2RlLFxuICAgICAgICAgICAgbG9hZGVyLFxuICAgICAgICAgIH07XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID1cbiAgICAgICAgICAgIGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKFxuICAgICAgICAgICAgYOKdjCBTV0MgdHJhbnNmb3JtIGVycm9yIGluICR7YXJncy5wYXRofTpgLFxuICAgICAgICAgICAgZXJyb3JNZXNzYWdlXG4gICAgICAgICAgKTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZXJyb3JzOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0ZXh0OiBgU1dDIHRyYW5zZm9ybSBmYWlsZWQ6ICR7ZXJyb3JNZXNzYWdlfWAsXG4gICAgICAgICAgICAgICAgbG9jYXRpb246IHsgZmlsZTogYXJncy5wYXRoLCBsaW5lOiAwLCBjb2x1bW46IDAgfSxcbiAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgfSxcbiAgfTtcbn1cblxuZnVuY3Rpb24gaXNQcm9qZWN0TG9jYWxGaWxlKGZpbGVQYXRoOiBzdHJpbmcsIHByb2plY3RSb290OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgaWYgKG5vcm1hbGl6ZVBhdGgoZmlsZVBhdGgpLmluY2x1ZGVzKCcvbm9kZV9tb2R1bGVzLycpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIChcbiAgICByZXNvbHZlTW9kdWxlU3BlY2lmaWVyKGZpbGVQYXRoLCBwcm9qZWN0Um9vdCkubW9kdWxlU3BlY2lmaWVyID09PSB1bmRlZmluZWRcbiAgKTtcbn1cbiJdfQ==
|