@workflow/nitro 5.0.0-beta.5 → 5.0.0-beta.50
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/README.md +2 -0
- package/dist/builders.d.ts +12 -0
- package/dist/builders.d.ts.map +1 -1
- package/dist/builders.js +34 -13
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +281 -45
- package/dist/types.d.ts +21 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +1 -1
- package/dist/vite.d.ts.map +1 -1
- package/dist/vite.js +17 -10
- package/package.json +15 -11
- package/dist/builders.js.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/vite.js.map +0 -1
package/README.md
CHANGED
package/dist/builders.d.ts
CHANGED
|
@@ -7,6 +7,18 @@ export declare class VercelBuilder extends VercelBuildOutputAPIBuilder {
|
|
|
7
7
|
export declare class LocalBuilder extends BaseBuilder {
|
|
8
8
|
#private;
|
|
9
9
|
constructor(nitro: Nitro);
|
|
10
|
+
/**
|
|
11
|
+
* The dev handler in `../src/index.ts` cache-busts its dynamic import of
|
|
12
|
+
* `workflow/steps.mjs` using the mtime of `workflow/workflows.mjs`, so an
|
|
13
|
+
* unchanged `workflows.mjs` must still be rewritten: a step-body-only edit
|
|
14
|
+
* changes `steps.mjs` alone, and skipping the `workflows.mjs` write would
|
|
15
|
+
* freeze the version key and serve the previous step code until restart.
|
|
16
|
+
*
|
|
17
|
+
* Nothing is lost by opting out. These files are generated into
|
|
18
|
+
* `<buildDir>/workflow`, which no dev server watches, so skipping the write
|
|
19
|
+
* would not have saved a recompile here.
|
|
20
|
+
*/
|
|
21
|
+
protected get skipsUnchangedGeneratedWrites(): boolean;
|
|
10
22
|
build(): Promise<void>;
|
|
11
23
|
}
|
|
12
24
|
//# sourceMappingURL=builders.d.ts.map
|
package/dist/builders.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../src/builders.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EAEX,2BAA2B,EAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../src/builders.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EAEX,2BAA2B,EAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AA+BzC,qBAAa,aAAc,SAAQ,2BAA2B;gBAChD,KAAK,EAAE,KAAK;IAaT,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAWtC;AAED,qBAAa,YAAa,SAAQ,WAAW;;gBAE/B,KAAK,EAAE,KAAK;IAgBxB;;;;;;;;;;OAUG;IACH,cAAuB,6BAA6B,IAAI,OAAO,CAE9D;IAMQ,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAqDhC"}
|
package/dist/builders.js
CHANGED
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
2
2
|
import { BaseBuilder, createBaseBuilderConfig, VercelBuildOutputAPIBuilder, } from '@workflow/builders';
|
|
3
3
|
import { join } from 'pathe';
|
|
4
|
-
/**
|
|
5
|
-
* Forward string entries from Nitro's `externals.external` config to the
|
|
6
|
-
* workflow builder's esbuild `external` option. RegExp and function entries
|
|
7
|
-
* are skipped since esbuild's `external` only supports literal strings.
|
|
8
|
-
*/
|
|
9
4
|
function getNitroStringExternals(nitro) {
|
|
10
|
-
const
|
|
11
|
-
|
|
5
|
+
const external = nitro.options.externals
|
|
6
|
+
?.external;
|
|
7
|
+
const strings = external?.filter((entry) => typeof entry === 'string');
|
|
8
|
+
return strings && strings.length > 0 ? strings : undefined;
|
|
9
|
+
}
|
|
10
|
+
function getNitroProjectRoot(nitro) {
|
|
11
|
+
return nitro.options.workspaceDir ?? nitro.options.rootDir;
|
|
12
|
+
}
|
|
13
|
+
function getNitroWorkflowDirs(nitro) {
|
|
14
|
+
return nitro.options.workflow?.dirs ?? ['.'];
|
|
12
15
|
}
|
|
13
16
|
export class VercelBuilder extends VercelBuildOutputAPIBuilder {
|
|
14
17
|
constructor(nitro) {
|
|
15
18
|
super({
|
|
16
19
|
...createBaseBuilderConfig({
|
|
17
20
|
workingDir: nitro.options.rootDir,
|
|
18
|
-
|
|
21
|
+
projectRoot: getNitroProjectRoot(nitro),
|
|
22
|
+
dirs: getNitroWorkflowDirs(nitro),
|
|
19
23
|
runtime: nitro.options.workflow?.runtime,
|
|
20
24
|
sourcemap: nitro.options.workflow?.sourcemap,
|
|
21
25
|
externalPackages: getNitroStringExternals(nitro),
|
|
@@ -39,8 +43,9 @@ export class LocalBuilder extends BaseBuilder {
|
|
|
39
43
|
super({
|
|
40
44
|
...createBaseBuilderConfig({
|
|
41
45
|
workingDir: nitro.options.rootDir,
|
|
46
|
+
projectRoot: getNitroProjectRoot(nitro),
|
|
42
47
|
watch: nitro.options.dev,
|
|
43
|
-
dirs:
|
|
48
|
+
dirs: getNitroWorkflowDirs(nitro),
|
|
44
49
|
sourcemap: nitro.options.workflow?.sourcemap,
|
|
45
50
|
externalPackages: getNitroStringExternals(nitro),
|
|
46
51
|
}),
|
|
@@ -48,6 +53,20 @@ export class LocalBuilder extends BaseBuilder {
|
|
|
48
53
|
});
|
|
49
54
|
this.#outDir = outDir;
|
|
50
55
|
}
|
|
56
|
+
/**
|
|
57
|
+
* The dev handler in `../src/index.ts` cache-busts its dynamic import of
|
|
58
|
+
* `workflow/steps.mjs` using the mtime of `workflow/workflows.mjs`, so an
|
|
59
|
+
* unchanged `workflows.mjs` must still be rewritten: a step-body-only edit
|
|
60
|
+
* changes `steps.mjs` alone, and skipping the `workflows.mjs` write would
|
|
61
|
+
* freeze the version key and serve the previous step code until restart.
|
|
62
|
+
*
|
|
63
|
+
* Nothing is lost by opting out. These files are generated into
|
|
64
|
+
* `<buildDir>/workflow`, which no dev server watches, so skipping the write
|
|
65
|
+
* would not have saved a recompile here.
|
|
66
|
+
*/
|
|
67
|
+
get skipsUnchangedGeneratedWrites() {
|
|
68
|
+
return false;
|
|
69
|
+
}
|
|
51
70
|
// Serialize concurrent build() calls so overlapping dev rebuilds don't
|
|
52
71
|
// stomp on each other's temp files or partially overwrite output.
|
|
53
72
|
#buildQueue = Promise.resolve();
|
|
@@ -66,13 +85,13 @@ export class LocalBuilder extends BaseBuilder {
|
|
|
66
85
|
// name in its import statement, so we build directly to final names.
|
|
67
86
|
// (The V1 atomic tmp-file pattern doesn't work here because renaming
|
|
68
87
|
// the steps file would leave the flow route's import stale.)
|
|
69
|
-
const
|
|
88
|
+
const build = await this.createCombinedBundle({
|
|
70
89
|
inputFiles,
|
|
71
90
|
stepsOutfile: join(this.#outDir, 'steps.mjs'),
|
|
72
91
|
flowOutfile: join(this.#outDir, 'workflows.mjs'),
|
|
73
92
|
format: 'esm',
|
|
74
|
-
// bundleFinalOutput: false
|
|
75
|
-
// during dev, and its own rollup pipeline handles bundling for prod.
|
|
93
|
+
// bundleFinalOutput: false, since Nitro externalizes the workflow build
|
|
94
|
+
// dir during dev, and its own rollup pipeline handles bundling for prod.
|
|
76
95
|
// Using true causes "Dynamic require of X is not supported" errors
|
|
77
96
|
// because esbuild wraps CJS require() calls in ESM output.
|
|
78
97
|
bundleFinalOutput: false,
|
|
@@ -82,6 +101,8 @@ export class LocalBuilder extends BaseBuilder {
|
|
|
82
101
|
// TypeScript imports. In prod, Nitro/Rollup handles those imports.
|
|
83
102
|
bundleTransitiveLocalStepDependencies: this.config.watch,
|
|
84
103
|
});
|
|
104
|
+
const { manifest, stepsContext, interimBundleCtx } = build;
|
|
105
|
+
await Promise.all([stepsContext?.dispose(), interimBundleCtx?.dispose()]);
|
|
85
106
|
await this.createWebhookBundle({
|
|
86
107
|
outfile: join(this.#outDir, 'webhook.mjs'),
|
|
87
108
|
bundle: false,
|
|
@@ -95,4 +116,4 @@ export class LocalBuilder extends BaseBuilder {
|
|
|
95
116
|
});
|
|
96
117
|
}
|
|
97
118
|
}
|
|
98
|
-
//# sourceMappingURL=builders.js.map
|
|
119
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYnVpbGRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUQsT0FBTyxFQUNMLFdBQVcsRUFDWCx1QkFBdUIsRUFDdkIsMkJBQTJCLEdBQzVCLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE9BQU8sQ0FBQztBQWE3QixTQUFTLHVCQUF1QixDQUFDLEtBQVk7SUFDM0MsTUFBTSxRQUFRLEdBQUksS0FBSyxDQUFDLE9BQW1DLENBQUMsU0FBUztRQUNuRSxFQUFFLFFBQVEsQ0FBQztJQUNiLE1BQU0sT0FBTyxHQUFHLFFBQVEsRUFBRSxNQUFNLENBQzlCLENBQUMsS0FBSyxFQUFtQixFQUFFLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUN0RCxDQUFDO0lBQ0YsT0FBTyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzdELENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLEtBQVk7SUFDdkMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUM3RCxDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxLQUFZO0lBQ3hDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVELE1BQU0sT0FBTyxhQUFjLFNBQVEsMkJBQTJCO0lBQzVELFlBQVksS0FBWTtRQUN0QixLQUFLLENBQUM7WUFDSixHQUFHLHVCQUF1QixDQUFDO2dCQUN6QixVQUFVLEVBQUUsS0FBSyxD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RCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDeEIsa0JBQWtCO1lBQ2xCLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTztZQUN6QixRQUFRO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWtkaXIsIHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7XG4gIEJhc2VCdWlsZGVyLFxuICBjcmVhdGVCYXNlQnVpbGRlckNvbmZpZyxcbiAgVmVyY2VsQnVpbGRPdXRwdXRBUElCdWlsZGVyLFxufSBmcm9tICdAd29ya2Zsb3cvYnVpbGRlcnMnO1xuaW1wb3J0IHR5cGUgeyBOaXRybyB9IGZyb20gJ25pdHJvL3R5cGVzJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoZSc7XG5cbi8qKlxuICogRm9yd2FyZCBzdHJpbmcgZW50cmllcyBmcm9tIE5pdHJvJ3MgYGV4dGVybmFscy5leHRlcm5hbGAgY29uZmlnIHRvIHRoZVxuICogd29ya2Zsb3cgYnVpbGRlcidzIGVzYnVpbGQgYGV4dGVybmFsYCBvcHRpb24uIFJlZ0V4cCBhbmQgZnVuY3Rpb24gZW50cmllc1xuICogYXJlIHNraXBwZWQgc2luY2UgZXNidWlsZCdzIGBleHRlcm5hbGAgb25seSBzdXBwb3J0cyBsaXRlcmFsIHN0cmluZ3MuXG4gKlxuICogTm90ZTogYGV4dGVybmFscy5leHRlcm5hbGAgaXMgb24gTml0cm8gdjIncyBvcHRpb25zIHNoYXBlOyB2MyBkcm9wcGVkIGl0XG4gKiBpbiBmYXZvciBvZiBgbm9FeHRlcm5hbHNgLiBSZWFkaW5nIGl0IHRocm91Z2ggYSB2Mi1zaGFwZWQgdmlldyBsZXRzIHVzXG4gKiBzdGlsbCBwaWNrIGl0IHVwIG9uIHYyIHNldHVwczsgb24gdjMgdGhlIGNoYWluZWQgb3B0aW9uYWwgYWNjZXNzXG4gKiByZXR1cm5zIHVuZGVmaW5lZC5cbiAqL1xudHlwZSBOaXRyb1YyRXh0ZXJuYWxzT3B0aW9ucyA9IHsgZXh0ZXJuYWxzPzogeyBleHRlcm5hbD86IHVua25vd25bXSB9IH07XG5mdW5jdGlvbiBnZXROaXRyb1N0cmluZ0V4dGVybmFscyhuaXRybzogTml0cm8pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGV4dGVybmFsID0gKG5pdHJvLm9wdGlvbnMgYXMgTml0cm9WMkV4dGVybmFsc09wdGlvbnMpLmV4dGVybmFsc1xuICAgID8uZXh0ZXJuYWw7XG4gIGNvbnN0IHN0cmluZ3MgPSBleHRlcm5hbD8uZmlsdGVyKFxuICAgIChlbnRyeSk6IGVudHJ5IGlzIHN0cmluZyA9PiB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnXG4gICk7XG4gIHJldHVybiBzdHJpbmdzICYmIHN0cmluZ3MubGVuZ3RoID4gMCA/IHN0cmluZ3MgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldE5pdHJvUHJvamVjdFJvb3Qobml0cm86IE5pdHJvKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5pdHJvLm9wdGlvbnMud29ya3NwYWNlRGlyID8/IG5pdHJvLm9wdGlvbnMucm9vdERpcjtcbn1cblxuZnVuY3Rpb24gZ2V0Tml0cm9Xb3JrZmxvd0RpcnMobml0cm86IE5pdHJvKTogc3RyaW5nW10ge1xuICByZXR1cm4gbml0cm8ub3B0aW9ucy53b3JrZmxvdz8uZGlycyA/PyBbJy4nXTtcbn1cblxuZXhwb3J0IGNsYXNzIFZlcmNlbEJ1aWxkZXIgZXh0ZW5kcyBWZXJjZWxCdWlsZE91dHB1dEFQSUJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcihuaXRybzogTml0cm8pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5jcmVhdGVCYXNlQnVpbGRlckNvbmZpZyh7XG4gICAgICAgIHdvcmtpbmdEaXI6IG5pdHJvLm9wdGlvbnMucm9vdERpcixcbiAgICAgICAgcHJvamVjdFJvb3Q6IGdldE5pdHJvUHJvamVjdFJvb3Qobml0cm8pLFxuICAgICAgICBkaXJzOiBnZXROaXRyb1dvcmtmbG93RGlycyhuaXRybyksXG4gICAgICAgIHJ1bnRpbWU6IG5pdHJvLm9wdGlvbnMud29ya2Zsb3c/LnJ1bnRpbWUsXG4gICAgICAgIHNvdXJjZW1hcDogbml0cm8ub3B0aW9ucy53b3JrZmxvdz8uc291cmNlbWFwLFxuICAgICAgICBleHRlcm5hbFBhY2thZ2VzOiBnZXROaXRyb1N0cmluZ0V4dGVybmFscyhuaXRybyksXG4gICAgICB9KSxcbiAgICAgIGJ1aWxkVGFyZ2V0OiAndmVyY2VsLWJ1aWxkLW91dHB1dC1hcGknLFxuICAgIH0pO1xuICB9XG4gIG92ZXJyaWRlIGFzeW5jIGJ1aWxkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKFxuICAgICAgdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICcudmVyY2VsL291dHB1dC9jb25maWcuanNvbidcbiAgICApO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uZmlnID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShjb25maWdQYXRoLCAndXRmLTgnKSk7XG4gICAgYXdhaXQgc3VwZXIuYnVpbGQoKTtcbiAgICBjb25zdCBuZXdDb25maWcgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGNvbmZpZ1BhdGgsICd1dGYtOCcpKTtcbiAgICBvcmlnaW5hbENvbmZpZy5yb3V0ZXMudW5zaGlmdCguLi5uZXdDb25maWcucm91dGVzKTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoY29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkob3JpZ2luYWxDb25maWcsIG51bGwsIDIpKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTG9jYWxCdWlsZGVyIGV4dGVuZHMgQmFzZUJ1aWxkZXIge1xuICAjb3V0RGlyOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKG5pdHJvOiBOaXRybykge1xuICAgIGNvbnN0IG91dERpciA9IGpvaW4obml0cm8ub3B0aW9ucy5idWlsZERpciwgJ3dvcmtmbG93Jyk7XG4gICAgc3VwZXIoe1xuICAgICAgLi4uY3JlYXRlQmFzZUJ1aWxkZXJDb25maWcoe1xuICAgICAgICB3b3JraW5nRGlyOiBuaXRyby5vcHRpb25zLnJvb3REaXIsXG4gICAgICAgIHByb2plY3RSb290OiBnZXROaXRyb1Byb2plY3RSb290KG5pdHJvKSxcbiAgICAgICAgd2F0Y2g6IG5pdHJvLm9wdGlvbnMuZGV2LFxuICAgICAgICBkaXJzOiBnZXROaXRyb1dvcmtmbG93RGlycyhuaXRybyksXG4gICAgICAgIHNvdXJjZW1hcDogbml0cm8ub3B0aW9ucy53b3JrZmxvdz8uc291cmNlbWFwLFxuICAgICAgICBleHRlcm5hbFBhY2thZ2VzOiBnZXROaXRyb1N0cmluZ0V4dGVybmFscyhuaXRybyksXG4gICAgICB9KSxcbiAgICAgIGJ1aWxkVGFyZ2V0OiAnbmV4dCcsIC8vIFBsYWNlaG9sZGVyLCBub3QgYWN0dWFsbHkgdXNlZFxuICAgIH0pO1xuICAgIHRoaXMuI291dERpciA9IG91dERpcjtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgZGV2IGhhbmRsZXIgaW4gYC4uL3NyYy9pbmRleC50c2AgY2FjaGUtYnVzdHMgaXRzIGR5bmFtaWMgaW1wb3J0IG9mXG4gICAqIGB3b3JrZmxvdy9zdGVwcy5tanNgIHVzaW5nIHRoZSBtdGltZSBvZiBgd29ya2Zsb3cvd29ya2Zsb3dzLm1qc2AsIHNvIGFuXG4gICAqIHVuY2hhbmdlZCBgd29ya2Zsb3dzLm1qc2AgbXVzdCBzdGlsbCBiZSByZXdyaXR0ZW46IGEgc3RlcC1ib2R5LW9ubHkgZWRpdFxuICAgKiBjaGFuZ2VzIGBzdGVwcy5tanNgIGFsb25lLCBhbmQgc2tpcHBpbmcgdGhlIGB3b3JrZmxvd3MubWpzYCB3cml0ZSB3b3VsZFxuICAgKiBmcmVlemUgdGhlIHZlcnNpb24ga2V5IGFuZCBzZXJ2ZSB0aGUgcHJldmlvdXMgc3RlcCBjb2RlIHVudGlsIHJlc3RhcnQuXG4gICAqXG4gICAqIE5vdGhpbmcgaXMgbG9zdCBieSBvcHRpbmcgb3V0LiBUaGVzZSBmaWxlcyBhcmUgZ2VuZXJhdGVkIGludG9cbiAgICogYDxidWlsZERpcj4vd29ya2Zsb3dgLCB3aGljaCBubyBkZXYgc2VydmVyIHdhdGNoZXMsIHNvIHNraXBwaW5nIHRoZSB3cml0ZVxuICAgKiB3b3VsZCBub3QgaGF2ZSBzYXZlZCBhIHJlY29tcGlsZSBoZXJlLlxuICAgKi9cbiAgcHJvdGVjdGVkIG92ZXJyaWRlIGdldCBza2lwc1VuY2hhbmdlZEdlbmVyYXRlZFdyaXRlcygpOiBib29sZWFuIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBTZXJpYWxpemUgY29uY3VycmVudCBidWlsZCgpIGNhbGxzIHNvIG92ZXJsYXBwaW5nIGRldiByZWJ1aWxkcyBkb24ndFxuICAvLyBzdG9tcCBvbiBlYWNoIG90aGVyJ3MgdGVtcCBmaWxlcyBvciBwYXJ0aWFsbHkgb3ZlcndyaXRlIG91dHB1dC5cbiAgI2J1aWxkUXVldWU6IFByb21pc2U8dm9pZD4gPSBQcm9taXNlLnJlc29sdmUoKTtcblxuICBvdmVycmlkZSBidWlsZCgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBuZXh0ID0gdGhpcy4jYnVpbGRRdWV1ZS50aGVuKFxuICAgICAgKCkgPT4gdGhpcy4jYnVpbGRPbmNlKCksXG4gICAgICAoKSA9PiB0aGlzLiNidWlsZE9uY2UoKVxuICAgICk7XG4gICAgLy8gU3dhbGxvdyByZWplY3Rpb25zIG9uIHRoZSBxdWV1ZSBpdHNlbGYgc28gYSBmYWlsZWQgYnVpbGQgZG9lc24ndFxuICAgIC8vIHBlcm1hbmVudGx5IHJlamVjdCBhbGwgc3Vic2VxdWVudCBidWlsZHM7IGVhY2ggY2FsbGVyIHN0aWxsIHNlZXNcbiAgICAvLyBpdHMgb3duIHJlamVjdGlvbiB2aWEgdGhlIHJldHVybmVkIHByb21pc2UuXG4gICAgdGhpcy4jYnVpbGRRdWV1ZSA9IG5leHQuY2F0Y2goKCkgPT4ge30pO1xuICAgIHJldHVybiBuZXh0O1xuICB9XG5cbiAgYXN5bmMgI2J1aWxkT25jZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBpbnB1dEZpbGVzID0gYXdhaXQgdGhpcy5nZXRJbnB1dEZpbGVzKCk7XG4gICAgYXdhaXQgbWtkaXIodGhpcy4jb3V0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcblxuICAgIC8vIFYyOiBUaGUgY29tYmluZWQgYnVuZGxlJ3MgZmxvdyByb3V0ZSByZWZlcmVuY2VzIHRoZSBzdGVwcyBmaWxlIGJ5XG4gICAgLy8gbmFtZSBpbiBpdHMgaW1wb3J0IHN0YXRlbWVudCwgc28gd2UgYnVpbGQgZGlyZWN0bHkgdG8gZmluYWwgbmFtZXMuXG4gICAgLy8gKFRoZSBWMSBhdG9taWMgdG1wLWZpbGUgcGF0dGVybiBkb2Vzbid0IHdvcmsgaGVyZSBiZWNhdXNlIHJlbmFtaW5nXG4gICAgLy8gdGhlIHN0ZXBzIGZpbGUgd291bGQgbGVhdmUgdGhlIGZsb3cgcm91dGUncyBpbXBvcnQgc3RhbGUuKVxuICAgIGNvbnN0IGJ1aWxkID0gYXdhaXQgdGhpcy5jcmVhdGVDb21iaW5lZEJ1bmRsZSh7XG4gICAgICBpbnB1dEZpbGVzLFxuICAgICAgc3RlcHNPdXRmaWxlOiBqb2luKHRoaXMuI291dERpciwgJ3N0ZXBzLm1qcycpLFxuICAgICAgZmxvd091dGZpbGU6IGpvaW4odGhpcy4jb3V0RGlyLCAnd29ya2Zsb3dzLm1qcycpLFxuICAgICAgZm9ybWF0OiAnZXNtJyxcbiAgICAgIC8vIGJ1bmRsZUZpbmFsT3V0cHV0OiBmYWxzZSwgc2luY2UgTml0cm8gZXh0ZXJuYWxpemVzIHRoZSB3b3JrZmxvdyBidWlsZFxuICAgICAgLy8gZGlyIGR1cmluZyBkZXYsIGFuZCBpdHMgb3duIHJvbGx1cCBwaXBlbGluZSBoYW5kbGVzIGJ1bmRsaW5nIGZvciBwcm9kLlxuICAgICAgLy8gVXNpbmcgdHJ1ZSBjYXVzZXMgXCJEeW5hbWljIHJlcXVpcmUgb2YgWCBpcyBub3Qgc3VwcG9ydGVkXCIgZXJyb3JzXG4gICAgICAvLyBiZWNhdXNlIGVzYnVpbGQgd3JhcHMgQ0pTIHJlcXVpcmUoKSBjYWxscyBpbiBFU00gb3V0cHV0LlxuICAgICAgYnVuZGxlRmluYWxPdXRwdXQ6IGZhbHNlLFxuICAgICAgZXh0ZXJuYWxpemVOb25TdGVwczogdHJ1ZSxcbiAgICAgIC8vIEluIGRldiwgTml0cm8gZHluYW1pY2FsbHkgaW1wb3J0cyB0aGUgZ2VuZXJhdGVkIHdvcmtmbG93IGZpbGVzIGZyb21cbiAgICAgIC8vIGRpc2ssIHNvIHRoZXJlIGlzIG5vIGxhdGVyIFJvbGx1cCBwYXNzIHRvIHJlc29sdmUgZXh0ZXJuYWxpemVkIGxvY2FsXG4gICAgICAvLyBUeXBlU2NyaXB0IGltcG9ydHMuIEluIHByb2QsIE5pdHJvL1JvbGx1cCBoYW5kbGVzIHRob3NlIGltcG9ydHMuXG4gICAgICBidW5kbGVUcmFuc2l0aXZlTG9jYWxTdGVwRGVwZW5kZW5jaWVzOiB0aGlzLmNvbmZpZy53YXRjaCxcbiAgICB9KTtcbiAgICBjb25zdCB7IG1hbmlmZXN0LCBzdGVwc0NvbnRleHQsIGludGVyaW1CdW5kbGVDdHggfSA9IGJ1aWxkO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW3N0ZXBzQ29udGV4dD8uZGlzcG9zZSgpLCBpbnRlcmltQnVuZGxlQ3R4Py5kaXNwb3NlKCldKTtcblxuICAgIGF3YWl0IHRoaXMuY3JlYXRlV2ViaG9va0J1bmRsZSh7XG4gICAgICBvdXRmaWxlOiBqb2luKHRoaXMuI291dERpciwgJ3dlYmhvb2subWpzJyksXG4gICAgICBidW5kbGU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gR2VuZXJhdGUgbWFuaWZlc3RcbiAgICBjb25zdCB3b3JrZmxvd0J1bmRsZVBhdGggPSBqb2luKHRoaXMuI291dERpciwgJ3dvcmtmbG93cy5tanMnKTtcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZU1hbmlmZXN0KHtcbiAgICAgIHdvcmtmbG93QnVuZGxlUGF0aCxcbiAgICAgIG1hbmlmZXN0RGlyOiB0aGlzLiNvdXREaXIsXG4gICAgICBtYW5pZmVzdCxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
package/dist/index.d.ts
CHANGED
|
@@ -3,7 +3,7 @@ import type { ModuleOptions } from './types';
|
|
|
3
3
|
export type { ModuleOptions };
|
|
4
4
|
declare const _default: {
|
|
5
5
|
name: string;
|
|
6
|
-
setup(
|
|
6
|
+
setup(nitro: Nitro): Promise<void>;
|
|
7
7
|
};
|
|
8
8
|
export default _default;
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAA6B,MAAM,aAAa,CAAC;AAGpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,YAAY,EAAE,aAAa,EAAE,CAAC;;;iBA4DT,KAAK;;AAF1B,wBA+RwB"}
|
package/dist/index.js
CHANGED
|
@@ -1,27 +1,92 @@
|
|
|
1
1
|
import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
-
import {
|
|
2
|
+
import { createRequire } from 'node:module';
|
|
3
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
4
|
+
import { WORKFLOW_QUEUE_TRIGGER } from '@workflow/builders';
|
|
3
5
|
import { workflowTransformPlugin } from '@workflow/rollup';
|
|
4
6
|
import { join } from 'pathe';
|
|
5
7
|
import { LocalBuilder, VercelBuilder } from './builders.js';
|
|
8
|
+
/**
|
|
9
|
+
* Detect whether the Nitro instance is v2.
|
|
10
|
+
* Newer Nitro releases (both v2 and v3) expose `nitro.meta.majorVersion`.
|
|
11
|
+
* Fall back to `!nitro.routing` (only present in v3+) for older Nitro v2
|
|
12
|
+
* versions that don't have `majorVersion` yet (e.g. Nuxt users on an older
|
|
13
|
+
* nitropack).
|
|
14
|
+
*/
|
|
15
|
+
function isNitroV2(nitro) {
|
|
16
|
+
const majorVersion = nitro.meta
|
|
17
|
+
?.majorVersion;
|
|
18
|
+
if (majorVersion != null) {
|
|
19
|
+
return majorVersion === 2;
|
|
20
|
+
}
|
|
21
|
+
return !nitro.routing;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Prepend a `createRequire`-backed global `require` to every server chunk so
|
|
25
|
+
* undici's bundled `require('node:http2')` resolves the real builtin instead of
|
|
26
|
+
* throwing (which would make undici fall back to a stub without
|
|
27
|
+
* `http2.connect`, breaking HTTP/2). The guard keeps it idempotent across
|
|
28
|
+
* chunks, and `node:module` is always available in the Node server runtime.
|
|
29
|
+
*
|
|
30
|
+
* This is a Node-server-runtime-only shim (callers gate it to the production
|
|
31
|
+
* server build). Note the deliberate global side effect: defining
|
|
32
|
+
* `globalThis.require` makes `typeof require` truthy for *every* bundled
|
|
33
|
+
* dependency in this ESM server output, so any library that feature-detects
|
|
34
|
+
* `require` will take its CJS path here. That is safe because (a) it never
|
|
35
|
+
* touches the client bundle, (b) the `typeof require === 'undefined'` guard
|
|
36
|
+
* makes it a no-op in CJS chunks where a real `require` already exists, and
|
|
37
|
+
* (c) the `require` we install is a working `createRequire`, so a library that
|
|
38
|
+
* switches to the require path gets a functional `require`, not a broken stub.
|
|
39
|
+
* The behavior to watch for is a bundled lib that, on seeing `require`, does
|
|
40
|
+
* `require()` of an ESM-only dependency on a Node version without `require(ESM)`
|
|
41
|
+
* support.
|
|
42
|
+
*/
|
|
43
|
+
function addNodeRequireBanner(config) {
|
|
44
|
+
const banner = "import { createRequire as __wkfCreateRequire } from 'node:module'; if (typeof require === 'undefined') { globalThis.require = __wkfCreateRequire(import.meta.url); }";
|
|
45
|
+
const output = config.output;
|
|
46
|
+
if (output == null) {
|
|
47
|
+
config.output = { banner };
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
const outputs = Array.isArray(output) ? output : [output];
|
|
51
|
+
for (const o of outputs) {
|
|
52
|
+
const existing = o.banner;
|
|
53
|
+
o.banner =
|
|
54
|
+
existing == null
|
|
55
|
+
? banner
|
|
56
|
+
: typeof existing === 'function'
|
|
57
|
+
? async (chunk) => `${banner}\n${await existing(chunk)}`
|
|
58
|
+
: `${banner}\n${existing}`;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
6
61
|
export default {
|
|
7
62
|
name: 'workflow/nitro',
|
|
8
63
|
async setup(nitro) {
|
|
9
64
|
const isVercelDeploy = !nitro.options.dev && nitro.options.preset === 'vercel';
|
|
10
|
-
|
|
11
|
-
const workflowBuildDir = join(nitro.options.buildDir, 'workflow');
|
|
65
|
+
const nitroBuildDir = `${nitro.options.buildDir.replace(/[\\/]+$/, '')}/`;
|
|
12
66
|
// Add transform plugin at the BEGINNING to run before other transforms
|
|
13
67
|
// (especially before class property transforms that rename classes like _ClassName)
|
|
14
68
|
nitro.hooks.hook('rollup:before', (_nitro, config) => {
|
|
15
69
|
config.plugins.unshift(workflowTransformPlugin({
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
|
|
19
|
-
exclude: [workflowBuildDir],
|
|
70
|
+
// Nitro build artifacts have already been transformed.
|
|
71
|
+
// Re-processing them can duplicate class registration.
|
|
72
|
+
exclude: [nitroBuildDir],
|
|
20
73
|
}));
|
|
74
|
+
// Nitro bundles undici (via the world adapter) into the ESM server
|
|
75
|
+
// output. undici loads most node: builtins as ESM imports, but pulls in
|
|
76
|
+
// `node:http2` lazily via a bare `require('node:http2')` inside a
|
|
77
|
+
// try/catch, which the bundler leaves un-wired, so in the ESM bundle the
|
|
78
|
+
// require throws and undici silently falls back to a stub whose
|
|
79
|
+
// `http2.connect` is undefined. That breaks any HTTP/2 request (the
|
|
80
|
+
// workflow flow-route callback fails with "fetch failed", so runs never
|
|
81
|
+
// start). Prepend a working CJS `require` to the server chunks so the
|
|
82
|
+
// real `node:http2` resolves. Skipped in dev (Vite SSR provides require).
|
|
83
|
+
if (!nitro.options.dev) {
|
|
84
|
+
addNodeRequireBanner(config);
|
|
85
|
+
}
|
|
21
86
|
});
|
|
22
87
|
// NOTE: Temporary workaround for debug unenv mock
|
|
23
88
|
if (!nitro.options.workflow?._vite) {
|
|
24
|
-
nitro.options.alias
|
|
89
|
+
nitro.options.alias.debug ??= 'debug';
|
|
25
90
|
}
|
|
26
91
|
if (nitro.options.dev) {
|
|
27
92
|
const workflowBuildGlob = `${join(nitro.options.buildDir, 'workflow')}/**`;
|
|
@@ -61,36 +126,48 @@ export default {
|
|
|
61
126
|
nitro.hooks.hook('rollup:before', (_nitro, config) => {
|
|
62
127
|
config.plugins.unshift({
|
|
63
128
|
name: 'workflow:force-inline',
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
//
|
|
86
|
-
//
|
|
129
|
+
// `order: 'pre'` is required: Nitro's `nitro:externals` plugin
|
|
130
|
+
// uses `order: 'pre'` for its resolveId hook and spreads our
|
|
131
|
+
// resolution result while forcing `external: true`. Without
|
|
132
|
+
// `pre` here, our `external: false` decision gets overwritten
|
|
133
|
+
// and `@workflow/*` imports end up externalized in the dev
|
|
134
|
+
// bundle, which means the SWC-injected `static classId` IIFE
|
|
135
|
+
// in (e.g.) `@workflow/core/dist/runtime/run.js` is never
|
|
136
|
+
// applied, and step return values that include `Run`
|
|
137
|
+
// instances fail to serialize at runtime.
|
|
138
|
+
resolveId: {
|
|
139
|
+
order: 'pre',
|
|
140
|
+
async handler(source, importer, options) {
|
|
141
|
+
if (!importer)
|
|
142
|
+
return null;
|
|
143
|
+
// Match workflow package specifiers OR direct paths into
|
|
144
|
+
// packages/<name>/. Bail out early on non-workflow imports
|
|
145
|
+
// so we don't intercept the rest of the resolution chain.
|
|
146
|
+
const isWorkflowPkg = /^@?workflow(\/|$)/.test(source) ||
|
|
147
|
+
/[\\/]packages[\\/](workflow|core|serde|errors|utils|builders|rollup|ai|world|world-local|world-vercel|world-postgres|world-testing|cli|next|nitro|nuxt|vite|vitest|astro|sveltekit|nest)[\\/]/.test(source);
|
|
148
|
+
if (!isWorkflowPkg)
|
|
149
|
+
return null;
|
|
150
|
+
// Resolve via other resolvers, skipping ourselves so we
|
|
151
|
+
// get a path. We don't gate on `resolved.external` because
|
|
152
|
+
// `nitro:externals` spreads our result and overrides
|
|
153
|
+
// `external: true` regardless of what we return; we want
|
|
154
|
+
// to win that race by returning first under `order: 'pre'`.
|
|
155
|
+
const resolved = await this.resolve(source, importer, {
|
|
156
|
+
...options,
|
|
157
|
+
skipSelf: true,
|
|
158
|
+
});
|
|
159
|
+
if (!resolved)
|
|
160
|
+
return null;
|
|
87
161
|
let resolvedId = resolved.id;
|
|
162
|
+
// Strip file:// protocol if present, since Rollup needs a plain
|
|
163
|
+
// filesystem path to load the module. `fileURLToPath`
|
|
164
|
+
// correctly handles Windows paths (e.g., file:///C:/...
|
|
165
|
+
// -> C:\...) and percent-decoding.
|
|
88
166
|
if (resolvedId.startsWith('file://')) {
|
|
89
167
|
resolvedId = fileURLToPath(resolvedId);
|
|
90
168
|
}
|
|
91
169
|
return { id: resolvedId, external: false };
|
|
92
|
-
}
|
|
93
|
-
return null;
|
|
170
|
+
},
|
|
94
171
|
},
|
|
95
172
|
});
|
|
96
173
|
});
|
|
@@ -104,14 +181,23 @@ export default {
|
|
|
104
181
|
name: 'workflow',
|
|
105
182
|
});
|
|
106
183
|
}
|
|
107
|
-
//
|
|
108
|
-
|
|
184
|
+
// Nitro v2 Vercel deploy: keep the legacy Build Output API path that
|
|
185
|
+
// builds the workflow functions standalone and stitches the routes into
|
|
186
|
+
// `.vercel/output/config.json`. This path is independent of nitro's own
|
|
187
|
+
// bundle and is only used for nitropack v2 (e.g. Nuxt 4 still uses it).
|
|
188
|
+
const useLegacyVercelBuild = isVercelDeploy && isNitroV2(nitro);
|
|
189
|
+
if (useLegacyVercelBuild) {
|
|
109
190
|
nitro.hooks.hook('compiled', async () => {
|
|
110
191
|
await new VercelBuilder(nitro).build();
|
|
111
192
|
});
|
|
112
193
|
}
|
|
113
|
-
//
|
|
114
|
-
|
|
194
|
+
// Local dev/prod and Nitro v3 Vercel deploy share the same path:
|
|
195
|
+
// bundle the workflow routes into nitro itself via virtual handlers.
|
|
196
|
+
// For Vercel v3 we additionally configure `functionRules` so the
|
|
197
|
+
// routes get queue triggers + extended maxDuration via the nitro
|
|
198
|
+
// vercel preset. This lets workflow handlers use nitro features
|
|
199
|
+
// (storage, database, runtime config, virtual imports, etc.).
|
|
200
|
+
if (!useLegacyVercelBuild) {
|
|
115
201
|
const builder = new LocalBuilder(nitro);
|
|
116
202
|
let isInitialBuild = true;
|
|
117
203
|
nitro.hooks.hook('build:before', async () => {
|
|
@@ -137,17 +223,66 @@ export default {
|
|
|
137
223
|
catch (error) {
|
|
138
224
|
// During dev, files may be added/removed while the builder
|
|
139
225
|
// is rebuilding (e.g., during test cleanup). Log the error
|
|
140
|
-
// but don't crash
|
|
226
|
+
// but don't crash; the next file change will trigger
|
|
141
227
|
// another rebuild with the correct file list.
|
|
142
228
|
console.warn('Warning: Workflow rebuild failed:', error);
|
|
143
229
|
}
|
|
144
230
|
});
|
|
145
231
|
}
|
|
232
|
+
// Embedded observability dashboard. Defaults to on in dev / off in prod
|
|
233
|
+
// builds; when disabled nothing is registered, so prod bundles never
|
|
234
|
+
// import @workflow/web. Excluded on Vercel deploys (the on-disk build/
|
|
235
|
+
// and node_modules import don't survive a serverless bundle; users use
|
|
236
|
+
// the hosted Vercel dashboard there).
|
|
237
|
+
const dashboardOption = nitro.options.workflow?.dashboard;
|
|
238
|
+
const dashboardEnabled = typeof dashboardOption === 'object'
|
|
239
|
+
? (dashboardOption.enabled ?? nitro.options.dev)
|
|
240
|
+
: (dashboardOption ?? nitro.options.dev);
|
|
241
|
+
const dashboardPath = normalizeDashboardPath((typeof dashboardOption === 'object' && dashboardOption.path) ||
|
|
242
|
+
DEFAULT_DASHBOARD_PATH);
|
|
243
|
+
if (dashboardEnabled && !isVercelDeploy) {
|
|
244
|
+
addDashboardHandler(nitro, dashboardPath);
|
|
245
|
+
}
|
|
146
246
|
addVirtualHandler(nitro, '/.well-known/workflow/v1/webhook/:token', 'workflow/webhook.mjs');
|
|
147
247
|
// V2: single combined handler for both workflow and step execution.
|
|
148
248
|
// The step registrations are imported as side effects by the combined
|
|
149
|
-
// handler
|
|
249
|
+
// handler, so no separate step route is needed.
|
|
150
250
|
addVirtualHandler(nitro, '/.well-known/workflow/v1/flow', 'workflow/workflows.mjs');
|
|
251
|
+
// Nitro v3+ Vercel deploy: configure function rules for the combined
|
|
252
|
+
// flow handler so it gets the queue triggers + max duration that the
|
|
253
|
+
// workflow runtime needs. Workflow-required fields (`maxDuration`,
|
|
254
|
+
// `experimentalTriggers`, `runtime` when set) take precedence over
|
|
255
|
+
// user-provided values for these routes; unrelated fields the user
|
|
256
|
+
// sets (e.g. `memory`) pass through untouched.
|
|
257
|
+
//
|
|
258
|
+
// Pattern keys must match the route patterns the handlers are
|
|
259
|
+
// registered with so nitro reuses the same function directory.
|
|
260
|
+
// Using a `webhook/**` catch-all here would create a second
|
|
261
|
+
// `webhook/[...].func` next to the `webhook/[token].func` that
|
|
262
|
+
// `addVirtualHandler` produces.
|
|
263
|
+
if (isVercelDeploy) {
|
|
264
|
+
nitro.options.vercel ??= {};
|
|
265
|
+
nitro.options.vercel.functionRules ??= {};
|
|
266
|
+
const runtime = nitro.options.workflow?.runtime;
|
|
267
|
+
const rules = nitro.options.vercel.functionRules;
|
|
268
|
+
const flowPath = '/.well-known/workflow/v1/flow';
|
|
269
|
+
rules[flowPath] = {
|
|
270
|
+
...rules[flowPath],
|
|
271
|
+
...(runtime && { runtime }),
|
|
272
|
+
maxDuration: 'max',
|
|
273
|
+
// A single workflow trigger handles orchestration and queued step
|
|
274
|
+
// execution; step messages include stepId on `__wkf_workflow_*`.
|
|
275
|
+
experimentalTriggers: [WORKFLOW_QUEUE_TRIGGER],
|
|
276
|
+
};
|
|
277
|
+
if (runtime) {
|
|
278
|
+
const webhookPath = '/.well-known/workflow/v1/webhook/:token';
|
|
279
|
+
rules[webhookPath] = { ...rules[webhookPath], runtime };
|
|
280
|
+
if (process.env.WORKFLOW_PUBLIC_MANIFEST === '1') {
|
|
281
|
+
const manifestPath = '/.well-known/workflow/v1/manifest.json';
|
|
282
|
+
rules[manifestPath] = { ...rules[manifestPath], runtime };
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
}
|
|
151
286
|
// Expose manifest as a public HTTP route when WORKFLOW_PUBLIC_MANIFEST=1
|
|
152
287
|
if (process.env.WORKFLOW_PUBLIC_MANIFEST === '1') {
|
|
153
288
|
// Write a placeholder manifest-data.mjs so rollup can resolve the
|
|
@@ -166,18 +301,117 @@ export default {
|
|
|
166
301
|
}
|
|
167
302
|
},
|
|
168
303
|
};
|
|
304
|
+
const DASHBOARD_VIRTUAL_ID = '#workflow/dashboard-handler';
|
|
305
|
+
const DEFAULT_DASHBOARD_PATH = '/_workflow';
|
|
306
|
+
/**
|
|
307
|
+
* Normalize the dashboard mount path so the Nitro route registration and the
|
|
308
|
+
* embedded handler's own basename normalization can't disagree.
|
|
309
|
+
*
|
|
310
|
+
* `dashboardPath` feeds two consumers: the Nitro route registration
|
|
311
|
+
* (`[path, path + '/**']`) and the handler's `basename` (which re-normalizes
|
|
312
|
+
* internally via `normalizeBasename`). Normalizing once, here, keeps them in
|
|
313
|
+
* sync. We force a single leading slash, strip trailing slashes, and reject
|
|
314
|
+
* the root mount (whose `/**` catch-all would swallow the host app), falling
|
|
315
|
+
* back to the default.
|
|
316
|
+
*/
|
|
317
|
+
function normalizeDashboardPath(path) {
|
|
318
|
+
const normalized = `/${path.trim().replace(/^\/+/, '').replace(/\/+$/, '')}`;
|
|
319
|
+
return normalized === '/' ? DEFAULT_DASHBOARD_PATH : normalized;
|
|
320
|
+
}
|
|
321
|
+
/**
|
|
322
|
+
* Mount the observability dashboard in-process at `basename` (e.g. `/_workflow`).
|
|
323
|
+
*
|
|
324
|
+
* The entire `@workflow/web` UI (SSR + static client assets + RPC) is served by
|
|
325
|
+
* a single Web-standard fetch handler running inside this Nitro process: no
|
|
326
|
+
* second server, no separate port, no redirect. The handler is framework-
|
|
327
|
+
* neutral; this is its first consumer.
|
|
328
|
+
*/
|
|
329
|
+
function addDashboardHandler(nitro, basename) {
|
|
330
|
+
// Resolve `@workflow/web/handler` relative to this module so consumers don't
|
|
331
|
+
// need a direct dependency on `@workflow/web`. Inlined into the virtual
|
|
332
|
+
// handler as a file:// URL and imported with @vite-ignore/webpackIgnore so
|
|
333
|
+
// Node `import()`s it from node_modules at runtime, keeping @workflow/web's
|
|
334
|
+
// (large, React) dependency graph out of the Nitro server bundle.
|
|
335
|
+
const require_ = createRequire(import.meta.url);
|
|
336
|
+
let webHandlerUrl;
|
|
337
|
+
try {
|
|
338
|
+
webHandlerUrl = pathToFileURL(require_.resolve('@workflow/web/handler')).href;
|
|
339
|
+
}
|
|
340
|
+
catch {
|
|
341
|
+
webHandlerUrl = '@workflow/web/handler';
|
|
342
|
+
}
|
|
343
|
+
const handlerSource = /* js */ `
|
|
344
|
+
const __workflowWebHandlerUrl = ${JSON.stringify(webHandlerUrl)};
|
|
345
|
+
const __workflowDashboardBasename = ${JSON.stringify(basename)};
|
|
346
|
+
let handlerPromise = null;
|
|
347
|
+
async function getDashboardHandler() {
|
|
348
|
+
if (!handlerPromise) {
|
|
349
|
+
handlerPromise = (async () => {
|
|
350
|
+
const mod = await import(/* @vite-ignore */ /* webpackIgnore: true */ __workflowWebHandlerUrl);
|
|
351
|
+
return mod.createWorkflowWebHandler({ basename: __workflowDashboardBasename });
|
|
352
|
+
})().catch((error) => {
|
|
353
|
+
handlerPromise = null;
|
|
354
|
+
throw error;
|
|
355
|
+
});
|
|
356
|
+
}
|
|
357
|
+
return handlerPromise;
|
|
358
|
+
}
|
|
359
|
+
`;
|
|
360
|
+
if (isNitroV2(nitro)) {
|
|
361
|
+
// Nitro v2 (legacy h3)
|
|
362
|
+
nitro.options.virtual[DASHBOARD_VIRTUAL_ID] = /* js */ `
|
|
363
|
+
import { fromWebHandler } from "h3";
|
|
364
|
+
${handlerSource}
|
|
365
|
+
export default fromWebHandler(async (request) => {
|
|
366
|
+
try {
|
|
367
|
+
const handler = await getDashboardHandler();
|
|
368
|
+
return await handler(request);
|
|
369
|
+
} catch (error) {
|
|
370
|
+
console.error('Failed to render workflow dashboard:', error);
|
|
371
|
+
return new Response('Failed to render workflow dashboard: ' + (error && error.message || error), { status: 500 });
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
`;
|
|
375
|
+
}
|
|
376
|
+
else {
|
|
377
|
+
// Nitro v3+ (native web handlers)
|
|
378
|
+
nitro.options.virtual[DASHBOARD_VIRTUAL_ID] = /* js */ `
|
|
379
|
+
${handlerSource}
|
|
380
|
+
export default async ({ req }) => {
|
|
381
|
+
try {
|
|
382
|
+
const handler = await getDashboardHandler();
|
|
383
|
+
return await handler(req);
|
|
384
|
+
} catch (error) {
|
|
385
|
+
console.error('Failed to render workflow dashboard:', error);
|
|
386
|
+
return new Response('Failed to render workflow dashboard: ' + (error && error.message || error), { status: 500 });
|
|
387
|
+
}
|
|
388
|
+
};
|
|
389
|
+
`;
|
|
390
|
+
}
|
|
391
|
+
// Register the exact mount path and a catch-all beneath it so the index,
|
|
392
|
+
// client routes, API routes (RPC/stream), and static assets all route to the
|
|
393
|
+
// embedded handler, which resolves them against `basename` internally.
|
|
394
|
+
for (const route of [basename, `${basename}/**`]) {
|
|
395
|
+
nitro.options.handlers.push({ route, handler: DASHBOARD_VIRTUAL_ID });
|
|
396
|
+
}
|
|
397
|
+
}
|
|
169
398
|
function addVirtualHandler(nitro, route, buildPath) {
|
|
170
399
|
nitro.options.handlers.push({
|
|
171
400
|
route,
|
|
172
401
|
handler: `#${buildPath}`,
|
|
173
402
|
});
|
|
174
403
|
const handlerImportPath = JSON.stringify(join(nitro.options.buildDir, buildPath));
|
|
404
|
+
const stepsImportPath = JSON.stringify(join(nitro.options.buildDir, 'workflow/steps.mjs'));
|
|
405
|
+
const preloadSteps = {
|
|
406
|
+
'workflow/webhook.mjs': '',
|
|
407
|
+
'workflow/workflows.mjs': `await import(/* @vite-ignore */ pathToFileURL(${stepsImportPath}).href + "?t=" + version);`,
|
|
408
|
+
};
|
|
175
409
|
if (nitro.options.dev) {
|
|
176
410
|
// Dev mode: load generated workflow bundles from disk at request time.
|
|
177
411
|
// This keeps `.nitro/workflow/*.mjs` out of Nitro's own bundle graph,
|
|
178
412
|
// which avoids rebuild loops and stale dependency graphs during HMR.
|
|
179
413
|
// Cache-bust by file mtime so each successful rebuild loads fresh code.
|
|
180
|
-
if (
|
|
414
|
+
if (isNitroV2(nitro)) {
|
|
181
415
|
nitro.options.virtual[`#${buildPath}`] = /* js */ `
|
|
182
416
|
import { fromWebHandler } from "h3";
|
|
183
417
|
import { statSync } from "node:fs";
|
|
@@ -192,6 +426,7 @@ function addVirtualHandler(nitro, route, buildPath) {
|
|
|
192
426
|
if (version !== currentVersion) {
|
|
193
427
|
currentVersion = version;
|
|
194
428
|
currentImportPath = pathToFileURL(handlerPath).href + "?t=" + version;
|
|
429
|
+
${preloadSteps[buildPath]}
|
|
195
430
|
}
|
|
196
431
|
return (await import(currentImportPath)).POST;
|
|
197
432
|
}
|
|
@@ -216,6 +451,7 @@ function addVirtualHandler(nitro, route, buildPath) {
|
|
|
216
451
|
if (version !== currentVersion) {
|
|
217
452
|
currentVersion = version;
|
|
218
453
|
currentImportPath = pathToFileURL(handlerPath).href + "?t=" + version;
|
|
454
|
+
${preloadSteps[buildPath]}
|
|
219
455
|
}
|
|
220
456
|
return (await import(currentImportPath)).POST;
|
|
221
457
|
}
|
|
@@ -237,7 +473,7 @@ function addVirtualHandler(nitro, route, buildPath) {
|
|
|
237
473
|
// using `@workflow/nuxt`, importing only `POST` could drop the generated
|
|
238
474
|
// step bundle's top-level registrations, so the handler loaded but steps
|
|
239
475
|
// were missing at runtime.
|
|
240
|
-
if (
|
|
476
|
+
if (isNitroV2(nitro)) {
|
|
241
477
|
// Nitro v2 (legacy)
|
|
242
478
|
nitro.options.virtual[`#${buildPath}`] = /* js */ `
|
|
243
479
|
import ${handlerImportPath};
|
|
@@ -271,7 +507,7 @@ function addManifestHandler(nitro) {
|
|
|
271
507
|
// Dev mode: use a virtual handler that reads the manifest from disk at
|
|
272
508
|
// request time. The absolute path is valid because we're on the build machine.
|
|
273
509
|
nitro.options.handlers.push({ route, handler: MANIFEST_VIRTUAL_ID });
|
|
274
|
-
nitro.options.virtual[MANIFEST_VIRTUAL_ID] =
|
|
510
|
+
nitro.options.virtual[MANIFEST_VIRTUAL_ID] = isNitroV2(nitro)
|
|
275
511
|
? /* js */ `
|
|
276
512
|
import { fromWebHandler } from "h3";
|
|
277
513
|
import { readFileSync } from "node:fs";
|
|
@@ -321,7 +557,7 @@ function writeManifestHandler(nitro) {
|
|
|
321
557
|
try {
|
|
322
558
|
const manifestContent = readFileSync(manifestPath, 'utf-8');
|
|
323
559
|
JSON.parse(manifestContent); // validate
|
|
324
|
-
const handlerCode =
|
|
560
|
+
const handlerCode = isNitroV2(nitro)
|
|
325
561
|
? `import { fromWebHandler } from "h3";
|
|
326
562
|
const manifest = ${JSON.stringify(manifestContent)};
|
|
327
563
|
export default fromWebHandler(() => new Response(manifest, {
|
|
@@ -337,7 +573,7 @@ export default async () => new Response(manifest, {
|
|
|
337
573
|
}
|
|
338
574
|
catch {
|
|
339
575
|
// Write a 404 fallback handler
|
|
340
|
-
const fallback =
|
|
576
|
+
const fallback = isNitroV2(nitro)
|
|
341
577
|
? `import { fromWebHandler } from "h3";
|
|
342
578
|
export default fromWebHandler(() => new Response("Manifest not found", { status: 404 }));
|
|
343
579
|
`
|
|
@@ -346,4 +582,4 @@ export default fromWebHandler(() => new Response("Manifest not found", { status:
|
|
|
346
582
|
writeFileSync(handlerPath, fallback);
|
|
347
583
|
}
|
|
348
584
|
}
|
|
349
|
-
//# sourceMappingURL=index.js.map
|
|
585
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDeEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFM0QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM3QixPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUs1RDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxLQUFZO0lBQzdCLE1BQU0sWUFBWSxHQUFJLEtBQThDLENBQUMsSUFBSTtRQUN2RSxFQUFFLFlBQVksQ0FBQztJQUNqQixJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6QixPQUFPLFlBQVksS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUNELE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILFNBQVMsb0JBQW9CLENBQUMsTUFBb0I7SUFDaEQsTUFBTSxNQUFNLEdBQ1Ysc0tBQXNLLENBQUM7SUFDekssTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM3QixJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNuQixNQUFNLENBQUMsTUFBTSxHQUFHLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDM0IsT0FBTztJQUNULENBQUM7SUFDRCxNQUFN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LFVBQVUsQ0FBQyxDQUFDO0lBQ3JELFNBQVMsQ0FBQyxHQUFHLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztJQUVwQyxJQUFJLENBQUM7UUFDSCxNQUFNLGVBQWUsR0FBRyxZQUFZLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQzVELElBQUksQ0FBQyxLQUFLLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxXQUFXO1FBRXhDLE1BQU0sV0FBVyxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFDbEMsQ0FBQyxDQUFDO21CQUNXLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDOzs7O0NBSWpEO1lBQ0ssQ0FBQyxDQUFDLG9CQUFvQixJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQzs7OztDQUkxRCxDQUFDO1FBQ0UsYUFBYSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsK0JBQStCO1FBQy9CLE1BQU0sUUFBUSxHQUFHLFNBQVMsQ0FBQyxLQUFLLENBQUM7WUFDL0IsQ0FBQyxDQUFDOztDQUVQO1lBQ0ssQ0FBQyxDQUFDO0NBQ1AsQ0FBQztRQUNFLGFBQWEsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdkMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBta2RpclN5bmMsIHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSB9IGZyb20gJ25vZGU6bW9kdWxlJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGgsIHBhdGhUb0ZpbGVVUkwgfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgeyBXT1JLRkxPV19RVUVVRV9UUklHR0VSIH0gZnJvbSAnQHdvcmtmbG93L2J1aWxkZXJzJztcbmltcG9ydCB7IHdvcmtmbG93VHJhbnNmb3JtUGx1Z2luIH0gZnJvbSAnQHdvcmtmbG93L3JvbGx1cCc7XG5pbXBvcnQgdHlwZSB7IE5pdHJvLCBOaXRyb01vZHVsZSwgUm9sbHVwQ29uZmlnIH0gZnJvbSAnbml0cm8vdHlwZXMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGhlJztcbmltcG9ydCB7IExvY2FsQnVpbGRlciwgVmVyY2VsQnVpbGRlciB9IGZyb20gJy4vYnVpbGRlcnMuanMnO1xuaW1wb3J0IHR5cGUgeyBNb2R1bGVPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIHsgTW9kdWxlT3B0aW9ucyB9O1xuXG4vKipcbiAqIERldGVjdCB3aGV0aGVyIHRoZSBOaXRybyBpbnN0YW5jZSBpcyB2Mi5cbiAqIE5ld2VyIE5pdHJvIHJlbGVhc2VzIChib3RoIHYyIGFuZCB2MykgZXhwb3NlIGBuaXRyby5tZXRhLm1ham9yVmVyc2lvbmAuXG4gKiBGYWxsIGJhY2sgdG8gYCFuaXRyby5yb3V0aW5nYCAob25seSBwcmVzZW50IGluIHYzKykgZm9yIG9sZGVyIE5pdHJvIHYyXG4gKiB2ZXJzaW9ucyB0aGF0IGRvbid0IGhhdmUgYG1ham9yVmVyc2lvbmAgeWV0IChlLmcuIE51eHQgdXNlcnMgb24gYW4gb2xkZXJcbiAqIG5pdHJvcGFjaykuXG4gKi9cbmZ1bmN0aW9uIGlzTml0cm9WMihuaXRybzogTml0cm8pOiBib29sZWFuIHtcbiAgY29uc3QgbWFqb3JWZXJzaW9uID0gKG5pdHJvIGFzIHsgbWV0YT86IHsgbWFqb3JWZXJzaW9uPzogbnVtYmVyIH0gfSkubWV0YVxuICAgID8ubWFqb3JWZXJzaW9uO1xuICBpZiAobWFqb3JWZXJzaW9uICE9IG51bGwpIHtcbiAgICByZXR1cm4gbWFqb3JWZXJzaW9uID09PSAyO1xuICB9XG4gIHJldHVybiAhbml0cm8ucm91dGluZztcbn1cblxuLyoqXG4gKiBQcmVwZW5kIGEgYGNyZWF0ZVJlcXVpcmVgLWJhY2tlZCBnbG9iYWwgYHJlcXVpcmVgIHRvIGV2ZXJ5IHNlcnZlciBjaHVuayBzb1xuICogdW5kaWNpJ3MgYnVuZGxlZCBgcmVxdWlyZSgnbm9kZTpodHRwMicpYCByZXNvbHZlcyB0aGUgcmVhbCBidWlsdGluIGluc3RlYWQgb2ZcbiAqIHRocm93aW5nICh3aGljaCB3b3VsZCBtYWtlIHVuZGljaSBmYWxsIGJhY2sgdG8gYSBzdHViIHdpdGhvdXRcbiAqIGBodHRwMi5jb25uZWN0YCwgYnJlYWtpbmcgSFRUUC8yKS4gVGhlIGd1YXJkIGtlZXBzIGl0IGlkZW1wb3RlbnQgYWNyb3NzXG4gKiBjaHVua3MsIGFuZCBgbm9kZTptb2R1bGVgIGlzIGFsd2F5cyBhdmFpbGFibGUgaW4gdGhlIE5vZGUgc2VydmVyIHJ1bnRpbWUuXG4gKlxuICogVGhpcyBpcyBhIE5vZGUtc2VydmVyLXJ1bnRpbWUtb25seSBzaGltIChjYWxsZXJzIGdhdGUgaXQgdG8gdGhlIHByb2R1Y3Rpb25cbiAqIHNlcnZlciBidWlsZCkuIE5vdGUgdGhlIGRlbGliZXJhdGUgZ2xvYmFsIHNpZGUgZWZmZWN0OiBkZWZpbmluZ1xuICogYGdsb2JhbFRoaXMucmVxdWlyZWAgbWFrZXMgYHR5cGVvZiByZXF1aXJlYCB0cnV0aHkgZm9yICpldmVyeSogYnVuZGxlZFxuICogZGVwZW5kZW5jeSBpbiB0aGlzIEVTTSBzZXJ2ZXIgb3V0cHV0LCBzbyBhbnkgbGlicmFyeSB0aGF0IGZlYXR1cmUtZGV0ZWN0c1xuICogYHJlcXVpcmVgIHdpbGwgdGFrZSBpdHMgQ0pTIHBhdGggaGVyZS4gVGhhdCBpcyBzYWZlIGJlY2F1c2UgKGEpIGl0IG5ldmVyXG4gKiB0b3VjaGVzIHRoZSBjbGllbnQgYnVuZGxlLCAoYikgdGhlIGB0eXBlb2YgcmVxdWlyZSA9PT0gJ3VuZGVmaW5lZCdgIGd1YXJkXG4gKiBtYWtlcyBpdCBhIG5vLW9wIGluIENKUyBjaHVua3Mgd2hlcmUgYSByZWFsIGByZXF1aXJlYCBhbHJlYWR5IGV4aXN0cywgYW5kXG4gKiAoYykgdGhlIGByZXF1aXJlYCB3ZSBpbnN0YWxsIGlzIGEgd29ya2luZyBgY3JlYXRlUmVxdWlyZWAsIHNvIGEgbGlicmFyeSB0aGF0XG4gKiBzd2l0Y2hlcyB0byB0aGUgcmVxdWlyZSBwYXRoIGdldHMgYSBmdW5jdGlvbmFsIGByZXF1aXJlYCwgbm90IGEgYnJva2VuIHN0dWIuXG4gKiBUaGUgYmVoYXZpb3IgdG8gd2F0Y2ggZm9yIGlzIGEgYnVuZGxlZCBsaWIgdGhhdCwgb24gc2VlaW5nIGByZXF1aXJlYCwgZG9lc1xuICogYHJlcXVpcmUoKWAgb2YgYW4gRVNNLW9ubHkgZGVwZW5kZW5jeSBvbiBhIE5vZGUgdmVyc2lvbiB3aXRob3V0IGByZXF1aXJlKEVTTSlgXG4gKiBzdXBwb3J0LlxuICovXG5mdW5jdGlvbiBhZGROb2RlUmVxdWlyZUJhbm5lcihjb25maWc6IFJvbGx1cENvbmZpZyk6IHZvaWQge1xuICBjb25zdCBiYW5uZXIgPVxuICAgIFwiaW1wb3J0IHsgY3JlYXRlUmVxdWlyZSBhcyBfX3drZkNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7IGlmICh0eXBlb2YgcmVxdWlyZSA9PT0gJ3VuZGVmaW5lZCcpIHsgZ2xvYmFsVGhpcy5yZXF1aXJlID0gX193a2ZDcmVhdGVSZXF1aXJlKGltcG9ydC5tZXRhLnVybCk7IH1cIjtcbiAgY29uc3Qgb3V0cHV0ID0gY29uZmlnLm91dHB1dDtcbiAgaWYgKG91dHB1dCA9PSBudWxsKSB7XG4gICAgY29uZmlnLm91dHB1dCA9IHsgYmFubmVyIH07XG4gICAgcmV0dXJuO1xuICB9XG4gIGNvbnN0IG91dHB1dHMgPSBBcnJheS5pc0FycmF5KG91dHB1dCkgPyBvdXRwdXQgOiBbb3V0cHV0XTtcbiAgZm9yIChjb25zdCBvIG9mIG91dHB1dHMpIHtcbiAgICBjb25zdCBleGlzdGluZyA9IG8uYmFubmVyO1xuICAgIG8uYmFubmVyID1cbiAgICAgIGV4aXN0aW5nID09IG51bGxcbiAgICAgICAgPyBiYW5uZXJcbiAgICAgICAgOiB0eXBlb2YgZXhpc3RpbmcgPT09ICdmdW5jdGlvbidcbiAgICAgICAgICA/IGFzeW5jIChjaHVuazogdW5rbm93bikgPT4gYCR7YmFubmVyfVxcbiR7YXdhaXQgZXhpc3RpbmcoY2h1bmspfWBcbiAgICAgICAgICA6IGAke2Jhbm5lcn1cXG4ke2V4aXN0aW5nfWA7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnd29ya2Zsb3cvbml0cm8nLFxuICBhc3luYyBzZXR1cChuaXRybzogTml0cm8pIHtcbiAgICBjb25zdCBpc1ZlcmNlbERlcGxveSA9XG4gICAgICAhbml0cm8ub3B0aW9ucy5kZXYgJiYgbml0cm8ub3B0aW9ucy5wcmVzZXQgPT09ICd2ZXJjZWwnO1xuICAgIGNvbnN0IG5pdHJvQnVpbGREaXIgPSBgJHtuaXRyby5vcHRpb25zLmJ1aWxkRGlyLnJlcGxhY2UoL1tcXFxcL10rJC8sICcnKX0vYDtcblxuICAgIC8vIEFkZCB0cmFuc2Zvcm0gcGx1Z2luIGF0IHRoZSBCRUdJTk5JTkcgdG8gcnVuIGJlZm9yZSBvdGhlciB0cmFuc2Zvcm1zXG4gICAgLy8gKGVzcGVjaWFsbHkgYmVmb3JlIGNsYXNzIHByb3BlcnR5IHRyYW5zZm9ybXMgdGhhdCByZW5hbWUgY2xhc3NlcyBsaWtlIF9DbGFzc05hbWUpXG4gICAgbml0cm8uaG9va3MuaG9vaygncm9sbHVwOmJlZm9yZScsIChfbml0cm86IE5pdHJvLCBjb25maWc6IFJvbGx1cENvbmZpZykgPT4ge1xuICAgICAgKGNvbmZpZy5wbHVnaW5zIGFzIEFycmF5PHVua25vd24+KS51bnNoaWZ0KFxuICAgICAgICB3b3JrZmxvd1RyYW5zZm9ybVBsdWdpbih7XG4gICAgICAgICAgLy8gTml0cm8gYnVpbGQgYXJ0aWZhY3RzIGhhdmUgYWxyZWFkeSBiZWVuIHRyYW5zZm9ybWVkLlxuICAgICAgICAgIC8vIFJlLXByb2Nlc3NpbmcgdGhlbSBjYW4gZHVwbGljYXRlIGNsYXNzIHJlZ2lzdHJhdGlvbi5cbiAgICAgICAgICBleGNsdWRlOiBbbml0cm9CdWlsZERpcl0sXG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICAvLyBOaXRybyBidW5kbGVzIHVuZGljaSAodmlhIHRoZSB3b3JsZCBhZGFwdGVyKSBpbnRvIHRoZSBFU00gc2VydmVyXG4gICAgICAvLyBvdXRwdXQuIHVuZGljaSBsb2FkcyBtb3N0IG5vZGU6IGJ1aWx0aW5zIGFzIEVTTSBpbXBvcnRzLCBidXQgcHVsbHMgaW5cbiAgICAgIC8vIGBub2RlOmh0dHAyYCBsYXppbHkgdmlhIGEgYmFyZSBgcmVxdWlyZSgnbm9kZTpodHRwMicpYCBpbnNpZGUgYVxuICAgICAgLy8gdHJ5L2NhdGNoLCB3aGljaCB0aGUgYnVuZGxlciBsZWF2ZXMgdW4td2lyZWQsIHNvIGluIHRoZSBFU00gYnVuZGxlIHRoZVxuICAgICAgLy8gcmVxdWlyZSB0aHJvd3MgYW5kIHVuZGljaSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIGEgc3R1YiB3aG9zZVxuICAgICAgLy8gYGh0dHAyLmNvbm5lY3RgIGlzIHVuZGVmaW5lZC4gVGhhdCBicmVha3MgYW55IEhUVFAvMiByZXF1ZXN0ICh0aGVcbiAgICAgIC8vIHdvcmtmbG93IGZsb3ctcm91dGUgY2FsbGJhY2sgZmFpbHMgd2l0aCBcImZldGNoIGZhaWxlZFwiLCBzbyBydW5zIG5ldmVyXG4gICAgICAvLyBzdGFydCkuIFByZXBlbmQgYSB3b3JraW5nIENKUyBgcmVxdWlyZWAgdG8gdGhlIHNlcnZlciBjaHVua3Mgc28gdGhlXG4gICAgICAvLyByZWFsIGBub2RlOmh0dHAyYCByZXNvbHZlcy4gU2tpcHBlZCBpbiBkZXYgKFZpdGUgU1NSIHByb3ZpZGVzIHJlcXVpcmUpLlxuICAgICAgaWYgKCFuaXRyby5vcHRpb25zLmRldikge1xuICAgICAgICBhZGROb2RlUmVxdWlyZUJhbm5lcihjb25maWcpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTk9URTogVGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGRlYnVnIHVuZW52IG1vY2tcbiAgICBpZiAoIW5pdHJvLm9wdGlvbnMud29ya2Zsb3c/Ll92aXRlKSB7XG4gICAgICBuaXRyby5vcHRpb25zLmFsaWFzLmRlYnVnID8/PSAnZGVidWcnO1xuICAgIH1cblxuICAgIGlmIChuaXRyby5vcHRpb25zLmRldikge1xuICAgICAgY29uc3Qgd29ya2Zsb3dCdWlsZEdsb2IgPSBgJHtqb2luKG5pdHJvLm9wdGlvbnMuYnVpbGREaXIsICd3b3JrZmxvdycpfS8qKmA7XG4gICAgICBuaXRyby5vcHRpb25zLndhdGNoT3B0aW9ucyB8fD0ge307XG4gICAgICBjb25zdCBleGlzdGluZ0lnbm9yZWQgPSBuaXRyby5vcHRpb25zLndhdGNoT3B0aW9ucy5pZ25vcmVkO1xuICAgICAgaWYgKCFleGlzdGluZ0lnbm9yZWQpIHtcbiAgICAgICAgbml0cm8ub3B0aW9ucy53YXRjaE9wdGlvbnMuaWdub3JlZCA9IFt3b3JrZmxvd0J1aWxkR2xvYl07XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmdJZ25vcmVkKSkge1xuICAgICAgICBuaXRyby5vcHRpb25zLndhdGNoT3B0aW9ucy5pZ25vcmVkID0gW1xuICAgICAgICAgIC4uLmV4aXN0aW5nSWdub3JlZCxcbiAgICAgICAgICB3b3JrZmxvd0J1aWxkR2xvYixcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5pdHJvLm9wdGlvbnMud2F0Y2hPcHRpb25zLmlnbm9yZWQgPSBbXG4gICAgICAgICAgZXhpc3RpbmdJZ25vcmVkLFxuICAgICAgICAgIHdvcmtmbG93QnVpbGRHbG9iLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluIGRldiBtb2RlLCBmb3JjZSB3b3JrZmxvdyBTREsgcGFja2FnZXMgdG8gYmUgYnVuZGxlZCBieSBOaXRybydzXG4gICAgLy8gUm9sbHVwIHJhdGhlciB0aGFuIGV4dGVybmFsaXplZC4gVGhpcyBlbnN1cmVzIHRoZSBTV0MgdHJhbnNmb3JtXG4gICAgLy8gcGx1Z2luIHByb2Nlc3NlcyBmaWxlcyBjb250YWluaW5nIHdvcmtmbG93IHBhdHRlcm5zIChsaWtlXG4gICAgLy8gQHdvcmtmbG93L2NvcmUvZGlzdC9ydW50aW1lL3J1bi5qcykgYW5kIGFkZHMgdGhlIGNsYXNzSWRcbiAgICAvLyByZWdpc3RyYXRpb24gSUlGRXMgbmVlZGVkIGZvciBzZXJpYWxpemF0aW9uLiBXaXRob3V0IHRoaXMsIHNlcmRlXG4gICAgLy8gY2xhc3NlcyBmcm9tIG5wbSBwYWNrYWdlcyAobGlrZSBgUnVuYCkgd291bGQgYmUgZXh0ZXJuYWxpemVkLCB0aGVcbiAgICAvLyBTV0MgdHJhbnNmb3JtIHdvdWxkIG5ldmVyIGZpcmUgb24gdGhlbSwgYW5kIHNlcmlhbGl6YXRpb24gd291bGRcbiAgICAvLyBmYWlsIHdpdGggXCJtdXN0IGhhdmUgYSBzdGF0aWMgY2xhc3NJZCBwcm9wZXJ0eVwiLlxuICAgIC8vXG4gICAgLy8gV2UgdXNlIGEgUm9sbHVwIHJlc29sdmVJZCBob29rIChhZGRlZCBCRUZPUkUgdGhlIGV4dGVybmFsaXphdGlvblxuICAgIC8vIHBsdWdpbikgdGhhdCBpbnRlcmNlcHRzIHdvcmtmbG93IHBhY2thZ2UgaW1wb3J0cyBhbmQgbWFya3MgdGhlbVxuICAgIC8vIGFzIG5vbi1leHRlcm5hbC4gVGhpcyBpcyBtb3JlIHRhcmdldGVkIHRoYW4gYG5vRXh0ZXJuYWxzID0gdHJ1ZWBcbiAgICAvLyB3aGljaCB3b3VsZCBidW5kbGUgQUxMIGRlcGVuZGVuY2llcyBhbmQgY2F1c2UgVERaIGVycm9ycyBmcm9tXG4gICAgLy8gY2lyY3VsYXIgaW1wb3J0cyBpbiBwYWNrYWdlcyBsaWtlIHZ1ZS1idW5kbGUtcmVuZGVyZXIvaDMuXG4gICAgaWYgKG5pdHJvLm9wdGlvbnMuZGV2KSB7XG4gICAgICBuaXRyby5ob29rcy5ob29rKFxuICAgICAgICAncm9sbHVwOmJlZm9yZScsXG4gICAgICAgIChfbml0cm86IE5pdHJvLCBjb25maWc6IFJvbGx1cENvbmZpZykgPT4ge1xuICAgICAgICAgIChjb25maWcucGx1Z2lucyBhcyBBcnJheTx1bmtub3duPikudW5zaGlmdCh7XG4gICAgICAgICAgICBuYW1lOiAnd29ya2Zsb3c6Zm9yY2UtaW5saW5lJyxcbiAgICAgICAgICAgIC8vIGBvcmRlcjogJ3ByZSdgIGlzIHJlcXVpcmVkOiBOaXRybydzIGBuaXRybzpleHRlcm5hbHNgIHBsdWdpblxuICAgICAgICAgICAgLy8gdXNlcyBgb3JkZXI6ICdwcmUnYCBmb3IgaXRzIHJlc29sdmVJZCBob29rIGFuZCBzcHJlYWRzIG91clxuICAgICAgICAgICAgLy8gcmVzb2x1dGlvbiByZXN1bHQgd2hpbGUgZm9yY2luZyBgZXh0ZXJuYWw6IHRydWVgLiBXaXRob3V0XG4gICAgICAgICAgICAvLyBgcHJlYCBoZXJlLCBvdXIgYGV4dGVybmFsOiBmYWxzZWAgZGVjaXNpb24gZ2V0cyBvdmVyd3JpdHRlblxuICAgICAgICAgICAgLy8gYW5kIGBAd29ya2Zsb3cvKmAgaW1wb3J0cyBlbmQgdXAgZXh0ZXJuYWxpemVkIGluIHRoZSBkZXZcbiAgICAgICAgICAgIC8vIGJ1bmRsZSwgd2hpY2ggbWVhbnMgdGhlIFNXQy1pbmplY3RlZCBgc3RhdGljIGNsYXNzSWRgIElJRkVcbiAgICAgICAgICAgIC8vIGluIChlLmcuKSBgQHdvcmtmbG93L2NvcmUvZGlzdC9ydW50aW1lL3J1bi5qc2AgaXMgbmV2ZXJcbiAgICAgICAgICAgIC8vIGFwcGxpZWQsIGFuZCBzdGVwIHJldHVybiB2YWx1ZXMgdGhhdCBpbmNsdWRlIGBSdW5gXG4gICAgICAgICAgICAvLyBpbnN0YW5jZXMgZmFpbCB0byBzZXJpYWxpemUgYXQgcnVudGltZS5cbiAgICAgICAgICAgIHJlc29sdmVJZDoge1xuICAgICAgICAgICAgICBvcmRlcjogJ3ByZScsXG4gICAgICAgICAgICAgIGFzeW5jIGhhbmRsZXIoXG4gICAgICAgICAgICAgICAgdGhpczogeyByZXNvbHZlOiBGdW5jdGlvbiB9LFxuICAgICAgICAgICAgICAgIHNvdXJjZTogc3RyaW5nLFxuICAgICAgICAgICAgICAgIGltcG9ydGVyOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgb3B0aW9uczogeyBza2lwU2VsZj86IGJvb2xlYW4gfVxuICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICBpZiAoIWltcG9ydGVyKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAvLyBNYXRjaCB3b3JrZmxvdyBwYWNrYWdlIHNwZWNpZmllcnMgT1IgZGlyZWN0IHBhdGhzIGludG9cbiAgICAgICAgICAgICAgICAvLyBwYWNrYWdlcy88bmFtZT4vLiBCYWlsIG91dCBlYXJseSBvbiBub24td29ya2Zsb3cgaW1wb3J0c1xuICAgICAgICAgICAgICAgIC8vIHNvIHdlIGRvbid0IGludGVyY2VwdCB0aGUgcmVzdCBvZiB0aGUgcmVzb2x1dGlvbiBjaGFpbi5cbiAgICAgICAgICAgICAgICBjb25zdCBpc1dvcmtmbG93UGtnID1cbiAgICAgICAgICAgICAgICAgIC9eQD93b3JrZmxvdyhcXC98JCkvLnRlc3Qoc291cmNlKSB8fFxuICAgICAgICAgICAgICAgICAgL1tcXFxcL11wYWNrYWdlc1tcXFxcL10od29ya2Zsb3d8Y29yZXxzZXJkZXxlcnJvcnN8dXRpbHN8YnVpbGRlcnN8cm9sbHVwfGFpfHdvcmxkfHdvcmxkLWxvY2FsfHdvcmxkLXZlcmNlbHx3b3JsZC1wb3N0Z3Jlc3x3b3JsZC10ZXN0aW5nfGNsaXxuZXh0fG5pdHJvfG51eHR8dml0ZXx2aXRlc3R8YXN0cm98c3ZlbHRla2l0fG5lc3QpW1xcXFwvXS8udGVzdChcbiAgICAgICAgICAgICAgICAgICAgc291cmNlXG4gICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGlmICghaXNXb3JrZmxvd1BrZykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgLy8gUmVzb2x2ZSB2aWEgb3RoZXIgcmVzb2x2ZXJzLCBza2lwcGluZyBvdXJzZWx2ZXMgc28gd2VcbiAgICAgICAgICAgICAgICAvLyBnZXQgYSBwYXRoLiBXZSBkb24ndCBnYXRlIG9uIGByZXNvbHZlZC5leHRlcm5hbGAgYmVjYXVzZVxuICAgICAgICAgICAgICAgIC8vIGBuaXRybzpleHRlcm5hbHNgIHNwcmVhZHMgb3VyIHJlc3VsdCBhbmQgb3ZlcnJpZGVzXG4gICAgICAgICAgICAgICAgLy8gYGV4dGVybmFsOiB0cnVlYCByZWdhcmRsZXNzIG9mIHdoYXQgd2UgcmV0dXJuOyB3ZSB3YW50XG4gICAgICAgICAgICAgICAgLy8gdG8gd2luIHRoYXQgcmFjZSBieSByZXR1cm5pbmcgZmlyc3QgdW5kZXIgYG9yZGVyOiAncHJlJ2AuXG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCB0aGlzLnJlc29sdmUoc291cmNlLCBpbXBvcnRlciwge1xuICAgICAgICAgICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICAgICAgICAgIHNraXBTZWxmOiB0cnVlLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzb2x2ZWQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGxldCByZXNvbHZlZElkID0gcmVzb2x2ZWQuaWQ7XG4gICAgICAgICAgICAgICAgLy8gU3RyaXAgZmlsZTovLyBwcm90b2NvbCBpZiBwcmVzZW50LCBzaW5jZSBSb2xsdXAgbmVlZHMgYSBwbGFpblxuICAgICAgICAgICAgICAgIC8vIGZpbGVzeXN0ZW0gcGF0aCB0byBsb2FkIHRoZSBtb2R1bGUuIGBmaWxlVVJMVG9QYXRoYFxuICAgICAgICAgICAgICAgIC8vIGNvcnJlY3RseSBoYW5kbGVzIFdpbmRvd3MgcGF0aHMgKGUuZy4sIGZpbGU6Ly8vQzovLi4uXG4gICAgICAgICAgICAgICAgLy8gLT4gQzpcXC4uLikgYW5kIHBlcmNlbnQtZGVjb2RpbmcuXG4gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVkSWQuc3RhcnRzV2l0aCgnZmlsZTovLycpKSB7XG4gICAgICAgICAgICAgICAgICByZXNvbHZlZElkID0gZmlsZVVSTFRvUGF0aChyZXNvbHZlZElkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgaWQ6IHJlc29sdmVkSWQsIGV4dGVybmFsOiBmYWxzZSB9O1xuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBZGQgdHNDb25maWcgcGx1Z2luXG4gICAgaWYgKG5pdHJvLm9wdGlvbnMud29ya2Zsb3c/LnR5cGVzY3JpcHRQbHVnaW4pIHtcbiAgICAgIG5pdHJvLm9wdGlvbnMudHlwZXNjcmlwdC50c0NvbmZpZyB8fD0ge307XG4gICAgICBuaXRyby5vcHRpb25zLnR5cGVzY3JpcHQudHNDb25maWcuY29tcGlsZXJPcHRpb25zIHx8PSB7fTtcbiAgICAgIG5pdHJvLm9wdGlvbnMudHlwZXNjcmlwdC50c0NvbmZpZy5jb21waWxlck9wdGlvbnMucGx1Z2lucyB8fD0gW107XG4gICAgICBuaXRyby5vcHRpb25zLnR5cGVzY3JpcHQudHNDb25maWcuY29tcGlsZXJPcHRpb25zLnBsdWdpbnMucHVzaCh7XG4gICAgICAgIG5hbWU6ICd3b3JrZmxvdycsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBOaXRybyB2MiBWZXJjZWwgZGVwbG95OiBrZWVwIHRoZSBsZWdhY3kgQnVpbGQgT3V0cHV0IEFQSSBwYXRoIHRoYXRcbiAgICAvLyBidWlsZHMgdGhlIHdvcmtmbG93IGZ1bmN0aW9ucyBzdGFuZGFsb25lIGFuZCBzdGl0Y2hlcyB0aGUgcm91dGVzIGludG9cbiAgICAvLyBgLnZlcmNlbC9vdXRwdXQvY29uZmlnLmpzb25gLiBUaGlzIHBhdGggaXMgaW5kZXBlbmRlbnQgb2Ygbml0cm8ncyBvd25cbiAgICAvLyBidW5kbGUgYW5kIGlzIG9ubHkgdXNlZCBmb3Igbml0cm9wYWNrIHYyIChlLmcuIE51eHQgNCBzdGlsbCB1c2VzIGl0KS5cbiAgICBjb25zdCB1c2VMZWdhY3lWZXJjZWxCdWlsZCA9IGlzVmVyY2VsRGVwbG95ICYmIGlzTml0cm9WMihuaXRybyk7XG5cbiAgICBpZiAodXNlTGVnYWN5VmVyY2VsQnVpbGQpIHtcbiAgICAgIG5pdHJvLmhvb2tzLmhvb2soJ2NvbXBpbGVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBuZXcgVmVyY2VsQnVpbGRlcihuaXRybykuYnVpbGQoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIExvY2FsIGRldi9wcm9kIGFuZCBOaXRybyB2MyBWZXJjZWwgZGVwbG95IHNoYXJlIHRoZSBzYW1lIHBhdGg6XG4gICAgLy8gYnVuZGxlIHRoZSB3b3JrZmxvdyByb3V0ZXMgaW50byBuaXRybyBpdHNlbGYgdmlhIHZpcnR1YWwgaGFuZGxlcnMuXG4gICAgLy8gRm9yIFZlcmNlbCB2MyB3ZSBhZGRpdGlvbmFsbHkgY29uZmlndXJlIGBmdW5jdGlvblJ1bGVzYCBzbyB0aGVcbiAgICAvLyByb3V0ZXMgZ2V0IHF1ZXVlIHRyaWdnZXJzICsgZXh0ZW5kZWQgbWF4RHVyYXRpb24gdmlhIHRoZSBuaXRyb1xuICAgIC8vIHZlcmNlbCBwcmVzZXQuIFRoaXMgbGV0cyB3b3JrZmxvdyBoYW5kbGVycyB1c2Ugbml0cm8gZmVhdHVyZXNcbiAgICAvLyAoc3RvcmFnZSwgZGF0YWJhc2UsIHJ1bnRpbWUgY29uZmlnLCB2aXJ0dWFsIGltcG9ydHMsIGV0Yy4pLlxuICAgIGlmICghdXNlTGVnYWN5VmVyY2VsQnVpbGQpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgTG9jYWxCdWlsZGVyKG5pdHJvKTtcbiAgICAgIGxldCBpc0luaXRpYWxCdWlsZCA9IHRydWU7XG5cbiAgICAgIG5pdHJvLmhvb2tzLmhvb2soJ2J1aWxkOmJlZm9yZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAgIC8vIEZvciBwcm9kOiB3cml0ZSB0aGUgbWFuaWZlc3QgaGFuZGxlciBmaWxlIHdpdGggaW5saW5lZCBjb250ZW50XG4gICAgICAgIC8vIG5vdyB0aGF0IHRoZSBidWlsZGVyIGhhcyBnZW5lcmF0ZWQgdGhlIG1hbmlmZXN0LiBSb2xsdXAgd2lsbFxuICAgICAgICAvLyBidW5kbGUgdGhpcyBmaWxlIGludG8gdGhlIGNvbXBpbGVkIG91dHB1dC5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICFuaXRyby5vcHRpb25zLmRldiAmJlxuICAgICAgICAgIHByb2Nlc3MuZW52LldPUktGTE9XX1BVQkxJQ19NQU5JRkVTVCA9PT0gJzEnXG4gICAgICAgICkge1xuICAgICAgICAgIHdyaXRlTWFuaWZlc3RIYW5kbGVyKG5pdHJvKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEFsbG93cyBmb3IgSE1SIC0gYnV0IHNraXAgdGhlIGZpcnN0IGRldjpyZWxvYWQgc2luY2UgYnVpbGQ6YmVmb3JlIGFscmVhZHkgcmFuXG4gICAgICBpZiAobml0cm8ub3B0aW9ucy5kZXYpIHtcbiAgICAgICAgbml0cm8uaG9va3MuaG9vaygnZGV2OnJlbG9hZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoaXNJbml0aWFsQnVpbGQpIHtcbiAgICAgICAgICAgIGlzSW5pdGlhbEJ1aWxkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIER1cmluZyBkZXYsIGZpbGVzIG1heSBiZSBhZGRlZC9yZW1vdmVkIHdoaWxlIHRoZSBidWlsZGVyXG4gICAgICAgICAgICAvLyBpcyByZWJ1aWxkaW5nIChlLmcuLCBkdXJpbmcgdGVzdCBjbGVhbnVwKS4gTG9nIHRoZSBlcnJvclxuICAgICAgICAgICAgLy8gYnV0IGRvbid0IGNyYXNoOyB0aGUgbmV4dCBmaWxlIGNoYW5nZSB3aWxsIHRyaWdnZXJcbiAgICAgICAgICAgIC8vIGFub3RoZXIgcmVidWlsZCB3aXRoIHRoZSBjb3JyZWN0IGZpbGUgbGlzdC5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybignV2FybmluZzogV29ya2Zsb3cgcmVidWlsZCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVtYmVkZGVkIG9ic2VydmFiaWxpdHkgZGFzaGJvYXJkLiBEZWZhdWx0cyB0byBvbiBpbiBkZXYgLyBvZmYgaW4gcHJvZFxuICAgICAgLy8gYnVpbGRzOyB3aGVuIGRpc2FibGVkIG5vdGhpbmcgaXMgcmVnaXN0ZXJlZCwgc28gcHJvZCBidW5kbGVzIG5ldmVyXG4gICAgICAvLyBpbXBvcnQgQHdvcmtmbG93L3dlYi4gRXhjbHVkZWQgb24gVmVyY2VsIGRlcGxveXMgKHRoZSBvbi1kaXNrIGJ1aWxkL1xuICAgICAgLy8gYW5kIG5vZGVfbW9kdWxlcyBpbXBvcnQgZG9uJ3Qgc3Vydml2ZSBhIHNlcnZlcmxlc3MgYnVuZGxlOyB1c2VycyB1c2VcbiAgICAgIC8vIHRoZSBob3N0ZWQgVmVyY2VsIGRhc2hib2FyZCB0aGVyZSkuXG4gICAgICBjb25zdCBkYXNoYm9hcmRPcHRpb24gPSBuaXRyby5vcHRpb25zLndvcmtmbG93Py5kYXNoYm9hcmQ7XG4gICAgICBjb25zdCBkYXNoYm9hcmRFbmFibGVkID1cbiAgICAgICAgdHlwZW9mIGRhc2hib2FyZE9wdGlvbiA9PT0gJ29iamVjdCdcbiAgICAgICAgICA/IChkYXNoYm9hcmRPcHRpb24uZW5hYmxlZCA/PyBuaXRyby5vcHRpb25zLmRldilcbiAgICAgICAgICA6IChkYXNoYm9hcmRPcHRpb24gPz8gbml0cm8ub3B0aW9ucy5kZXYpO1xuICAgICAgY29uc3QgZGFzaGJvYXJkUGF0aCA9IG5vcm1hbGl6ZURhc2hib2FyZFBhdGgoXG4gICAgICAgICh0eXBlb2YgZGFzaGJvYXJkT3B0aW9uID09PSAnb2JqZWN0JyAmJiBkYXNoYm9hcmRPcHRpb24ucGF0aCkgfHxcbiAgICAgICAgICBERUZBVUxUX0RBU0hCT0FSRF9QQVRIXG4gICAgICApO1xuICAgICAgaWYgKGRhc2hib2FyZEVuYWJsZWQgJiYgIWlzVmVyY2VsRGVwbG95KSB7XG4gICAgICAgIGFkZERhc2hib2FyZEhhbmRsZXIobml0cm8sIGRhc2hib2FyZFBhdGgpO1xuICAgICAgfVxuXG4gICAgICBhZGRWaXJ0dWFsSGFuZGxlcihcbiAgICAgICAgbml0cm8sXG4gICAgICAgICcvLndlbGwta25vd24vd29ya2Zsb3cvdjEvd2ViaG9vay86dG9rZW4nLFxuICAgICAgICAnd29ya2Zsb3cvd2ViaG9vay5tanMnXG4gICAgICApO1xuXG4gICAgICAvLyBWMjogc2luZ2xlIGNvbWJpbmVkIGhhbmRsZXIgZm9yIGJvdGggd29ya2Zsb3cgYW5kIHN0ZXAgZXhlY3V0aW9uLlxuICAgICAgLy8gVGhlIHN0ZXAgcmVnaXN0cmF0aW9ucyBhcmUgaW1wb3J0ZWQgYXMgc2lkZSBlZmZlY3RzIGJ5IHRoZSBjb21iaW5lZFxuICAgICAgLy8gaGFuZGxlciwgc28gbm8gc2VwYXJhdGUgc3RlcCByb3V0ZSBpcyBuZWVkZWQuXG4gICAgICBhZGRWaXJ0dWFsSGFuZGxlcihcbiAgICAgICAgbml0cm8sXG4gICAgICAgICcvLndlbGwta25vd24vd29ya2Zsb3cvdjEvZmxvdycsXG4gICAgICAgICd3b3JrZmxvdy93b3JrZmxvd3MubWpzJ1xuICAgICAgKTtcblxuICAgICAgLy8gTml0cm8gdjMrIFZlcmNlbCBkZXBsb3k6IGNvbmZpZ3VyZSBmdW5jdGlvbiBydWxlcyBmb3IgdGhlIGNvbWJpbmVkXG4gICAgICAvLyBmbG93IGhhbmRsZXIgc28gaXQgZ2V0cyB0aGUgcXVldWUgdHJpZ2dlcnMgKyBtYXggZHVyYXRpb24gdGhhdCB0aGVcbiAgICAgIC8vIHdvcmtmbG93IHJ1bnRpbWUgbmVlZHMuIFdvcmtmbG93LXJlcXVpcmVkIGZpZWxkcyAoYG1heER1cmF0aW9uYCxcbiAgICAgIC8vIGBleHBlcmltZW50YWxUcmlnZ2Vyc2AsIGBydW50aW1lYCB3aGVuIHNldCkgdGFrZSBwcmVjZWRlbmNlIG92ZXJcbiAgICAgIC8vIHVzZXItcHJvdmlkZWQgdmFsdWVzIGZvciB0aGVzZSByb3V0ZXM7IHVucmVsYXRlZCBmaWVsZHMgdGhlIHVzZXJcbiAgICAgIC8vIHNldHMgKGUuZy4gYG1lbW9yeWApIHBhc3MgdGhyb3VnaCB1bnRvdWNoZWQuXG4gICAgICAvL1xuICAgICAgLy8gUGF0dGVybiBrZXlzIG11c3QgbWF0Y2ggdGhlIHJvdXRlIHBhdHRlcm5zIHRoZSBoYW5kbGVycyBhcmVcbiAgICAgIC8vIHJlZ2lzdGVyZWQgd2l0aCBzbyBuaXRybyByZXVzZXMgdGhlIHNhbWUgZnVuY3Rpb24gZGlyZWN0b3J5LlxuICAgICAgLy8gVXNpbmcgYSBgd2ViaG9vay8qKmAgY2F0Y2gtYWxsIGhlcmUgd291bGQgY3JlYXRlIGEgc2Vjb25kXG4gICAgICAvLyBgd2ViaG9vay9bLi4uXS5mdW5jYCBuZXh0IHRvIHRoZSBgd2ViaG9vay9bdG9rZW5dLmZ1bmNgIHRoYXRcbiAgICAgIC8vIGBhZGRWaXJ0dWFsSGFuZGxlcmAgcHJvZHVjZXMuXG4gICAgICBpZiAoaXNWZXJjZWxEZXBsb3kpIHtcbiAgICAgICAgbml0cm8ub3B0aW9ucy52ZXJjZWwgPz89IHt9O1xuICAgICAgICBuaXRyby5vcHRpb25zLnZlcmNlbC5mdW5jdGlvblJ1bGVzID8/PSB7fTtcblxuICAgICAgICBjb25zdCBydW50aW1lID0gbml0cm8ub3B0aW9ucy53b3JrZmxvdz8ucnVudGltZTtcbiAgICAgICAgY29uc3QgcnVsZXMgPSBuaXRyby5vcHRpb25zLnZlcmNlbC5mdW5jdGlvblJ1bGVzO1xuXG4gICAgICAgIGNvbnN0IGZsb3dQYXRoID0gJy8ud2VsbC1rbm93bi93b3JrZmxvdy92MS9mbG93JztcbiAgICAgICAgcnVsZXNbZmxvd1BhdGhdID0ge1xuICAgICAgICAgIC4uLnJ1bGVzW2Zsb3dQYXRoXSxcbiAgICAgICAgICAuLi4ocnVudGltZSAmJiB7IHJ1bnRpbWUgfSksXG4gICAgICAgICAgbWF4RHVyYXRpb246ICdtYXgnLFxuICAgICAgICAgIC8vIEEgc2luZ2xlIHdvcmtmbG93IHRyaWdnZXIgaGFuZGxlcyBvcmNoZXN0cmF0aW9uIGFuZCBxdWV1ZWQgc3RlcFxuICAgICAgICAgIC8vIGV4ZWN1dGlvbjsgc3RlcCBtZXNzYWdlcyBpbmNsdWRlIHN0ZXBJZCBvbiBgX193a2Zfd29ya2Zsb3dfKmAuXG4gICAgICAgICAgZXhwZXJpbWVudGFsVHJpZ2dlcnM6IFtXT1JLRkxPV19RVUVVRV9UUklHR0VSXSxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocnVudGltZSkge1xuICAgICAgICAgIGNvbnN0IHdlYmhvb2tQYXRoID0gJy8ud2VsbC1rbm93bi93b3JrZmxvdy92MS93ZWJob29rLzp0b2tlbic7XG4gICAgICAgICAgcnVsZXNbd2ViaG9va1BhdGhdID0geyAuLi5ydWxlc1t3ZWJob29rUGF0aF0sIHJ1bnRpbWUgfTtcblxuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5XT1JLRkxPV19QVUJMSUNfTUFOSUZFU1QgPT09ICcxJykge1xuICAgICAgICAgICAgY29uc3QgbWFuaWZlc3RQYXRoID0gJy8ud2VsbC1rbm93bi93b3JrZmxvdy92MS9tYW5pZmVzdC5qc29uJztcbiAgICAgICAgICAgIHJ1bGVzW21hbmlmZXN0UGF0aF0gPSB7IC4uLnJ1bGVzW21hbmlmZXN0UGF0aF0sIHJ1bnRpbWUgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRXhwb3NlIG1hbmlmZXN0IGFzIGEgcHVibGljIEhUVFAgcm91dGUgd2hlbiBXT1JLRkxPV19QVUJMSUNfTUFOSUZFU1Q9MVxuICAgICAgaWYgKHByb2Nlc3MuZW52LldPUktGTE9XX1BVQkxJQ19NQU5JRkVTVCA9PT0gJzEnKSB7XG4gICAgICAgIC8vIFdyaXRlIGEgcGxhY2Vob2xkZXIgbWFuaWZlc3QtZGF0YS5tanMgc28gcm9sbHVwIGNhbiByZXNvbHZlIHRoZVxuICAgICAgICAvLyBpbXBvcnQuIEl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgcmVhbCBtYW5pZmVzdCBpbiBidWlsZDpiZWZvcmUuXG4gICAgICAgIC8vIFdyaXRlIGEgcGxhY2Vob2xkZXIgaGFuZGxlciBmaWxlIHNvIHJvbGx1cCBjYW4gcmVzb2x2ZSB0aGUgcGF0aFxuICAgICAgICAvLyBkdXJpbmcgcHJvZCBjb21waWxhdGlvbi4gSXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSByZWFsXG4gICAgICAgIC8vIG1hbmlmZXN0IGNvbnRlbnQgYnkgd3JpdGVNYW5pZmVzdEhhbmRsZXIoKSBpbiBidWlsZDpiZWZvcmUuXG4gICAgICAgIGlmICghbml0cm8ub3B0aW9ucy5kZXYpIHtcbiAgICAgICAgICBjb25zdCBkaXIgPSBqb2luKG5pdHJvLm9wdGlvbnMuYnVpbGREaXIsICd3b3JrZmxvdycpO1xuICAgICAgICAgIG1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGNvbnN0IGhhbmRsZXJQYXRoID0gam9pbihkaXIsICdtYW5pZmVzdC1oYW5kbGVyLm1qcycpO1xuICAgICAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICBoYW5kbGVyUGF0aCxcbiAgICAgICAgICAgICdleHBvcnQgZGVmYXVsdCBhc3luYyAoKSA9PiBuZXcgUmVzcG9uc2UoXCJNYW5pZmVzdCBub3QgZm91bmRcIiwgeyBzdGF0dXM6IDQwNCB9KTtcXG4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRNYW5pZmVzdEhhbmRsZXIobml0cm8pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0gc2F0aXNmaWVzIE5pdHJvTW9kdWxlO1xuXG5jb25zdCBEQVNIQk9BUkRfVklSVFVBTF9JRCA9ICcjd29ya2Zsb3cvZGFzaGJvYXJkLWhhbmRsZXInO1xuY29uc3QgREVGQVVMVF9EQVNIQk9BUkRfUEFUSCA9ICcvX3dvcmtmbG93JztcblxuLyoqXG4gKiBOb3JtYWxpemUgdGhlIGRhc2hib2FyZCBtb3VudCBwYXRoIHNvIHRoZSBOaXRybyByb3V0ZSByZWdpc3RyYXRpb24gYW5kIHRoZVxuICogZW1iZWRkZWQgaGFuZGxlcidzIG93biBiYXNlbmFtZSBub3JtYWxpemF0aW9uIGNhbid0IGRpc2FncmVlLlxuICpcbiAqIGBkYXNoYm9hcmRQYXRoYCBmZWVkcyB0d28gY29uc3VtZXJzOiB0aGUgTml0cm8gcm91dGUgcmVnaXN0cmF0aW9uXG4gKiAoYFtwYXRoLCBwYXRoICsgJy8qKiddYCkgYW5kIHRoZSBoYW5kbGVyJ3MgYGJhc2VuYW1lYCAod2hpY2ggcmUtbm9ybWFsaXplc1xuICogaW50ZXJuYWxseSB2aWEgYG5vcm1hbGl6ZUJhc2VuYW1lYCkuIE5vcm1hbGl6aW5nIG9uY2UsIGhlcmUsIGtlZXBzIHRoZW0gaW5cbiAqIHN5bmMuIFdlIGZvcmNlIGEgc2luZ2xlIGxlYWRpbmcgc2xhc2gsIHN0cmlwIHRyYWlsaW5nIHNsYXNoZXMsIGFuZCByZWplY3RcbiAqIHRoZSByb290IG1vdW50ICh3aG9zZSBgLyoqYCBjYXRjaC1hbGwgd291bGQgc3dhbGxvdyB0aGUgaG9zdCBhcHApLCBmYWxsaW5nXG4gKiBiYWNrIHRvIHRoZSBkZWZhdWx0LlxuICovXG5mdW5jdGlvbiBub3JtYWxpemVEYXNoYm9hcmRQYXRoKHBhdGg6IHN0cmluZyk6IHN0cmluZyB7XG4gIGNvbnN0IG5vcm1hbGl6ZWQgPSBgLyR7cGF0aC50cmltKCkucmVwbGFjZSgvXlxcLysvLCAnJykucmVwbGFjZSgvXFwvKyQvLCAnJyl9YDtcbiAgcmV0dXJuIG5vcm1hbGl6ZWQgPT09ICcvJyA/IERFRkFVTFRfREFTSEJPQVJEX1BBVEggOiBub3JtYWxpemVkO1xufVxuXG4vKipcbiAqIE1vdW50IHRoZSBvYnNlcnZhYmlsaXR5IGRhc2hib2FyZCBpbi1wcm9jZXNzIGF0IGBiYXNlbmFtZWAgKGUuZy4gYC9fd29ya2Zsb3dgKS5cbiAqXG4gKiBUaGUgZW50aXJlIGBAd29ya2Zsb3cvd2ViYCBVSSAoU1NSICsgc3RhdGljIGNsaWVudCBhc3NldHMgKyBSUEMpIGlzIHNlcnZlZCBieVxuICogYSBzaW5nbGUgV2ViLXN0YW5kYXJkIGZldGNoIGhhbmRsZXIgcnVubmluZyBpbnNpZGUgdGhpcyBOaXRybyBwcm9jZXNzOiBub1xuICogc2Vjb25kIHNlcnZlciwgbm8gc2VwYXJhdGUgcG9ydCwgbm8gcmVkaXJlY3QuIFRoZSBoYW5kbGVyIGlzIGZyYW1ld29yay1cbiAqIG5ldXRyYWw7IHRoaXMgaXMgaXRzIGZpcnN0IGNvbnN1bWVyLlxuICovXG5mdW5jdGlvbiBhZGREYXNoYm9hcmRIYW5kbGVyKG5pdHJvOiBOaXRybywgYmFzZW5hbWU6IHN0cmluZykge1xuICAvLyBSZXNvbHZlIGBAd29ya2Zsb3cvd2ViL2hhbmRsZXJgIHJlbGF0aXZlIHRvIHRoaXMgbW9kdWxlIHNvIGNvbnN1bWVycyBkb24ndFxuICAvLyBuZWVkIGEgZGlyZWN0IGRlcGVuZGVuY3kgb24gYEB3b3JrZmxvdy93ZWJgLiBJbmxpbmVkIGludG8gdGhlIHZpcnR1YWxcbiAgLy8gaGFuZGxlciBhcyBhIGZpbGU6Ly8gVVJMIGFuZCBpbXBvcnRlZCB3aXRoIEB2aXRlLWlnbm9yZS93ZWJwYWNrSWdub3JlIHNvXG4gIC8vIE5vZGUgYGltcG9ydCgpYHMgaXQgZnJvbSBub2RlX21vZHVsZXMgYXQgcnVudGltZSwga2VlcGluZyBAd29ya2Zsb3cvd2ViJ3NcbiAgLy8gKGxhcmdlLCBSZWFjdCkgZGVwZW5kZW5jeSBncmFwaCBvdXQgb2YgdGhlIE5pdHJvIHNlcnZlciBidW5kbGUuXG4gIGNvbnN0IHJlcXVpcmVfID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICBsZXQgd2ViSGFuZGxlclVybDogc3RyaW5nO1xuICB0cnkge1xuICAgIHdlYkhhbmRsZXJVcmwgPSBwYXRoVG9GaWxlVVJMKFxuICAgICAgcmVxdWlyZV8ucmVzb2x2ZSgnQHdvcmtmbG93L3dlYi9oYW5kbGVyJylcbiAgICApLmhyZWY7XG4gIH0gY2F0Y2gge1xuICAgIHdlYkhhbmRsZXJVcmwgPSAnQHdvcmtmbG93L3dlYi9oYW5kbGVyJztcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZXJTb3VyY2UgPSAvKiBqcyAqLyBgXG4gICAgY29uc3QgX193b3JrZmxvd1dlYkhhbmRsZXJVcmwgPSAke0pTT04uc3RyaW5naWZ5KHdlYkhhbmRsZXJVcmwpfTtcbiAgICBjb25zdCBfX3dvcmtmbG93RGFzaGJvYXJkQmFzZW5hbWUgPSAke0pTT04uc3RyaW5naWZ5KGJhc2VuYW1lKX07XG4gICAgbGV0IGhhbmRsZXJQcm9taXNlID0gbnVsbDtcbiAgICBhc3luYyBmdW5jdGlvbiBnZXREYXNoYm9hcmRIYW5kbGVyKCkge1xuICAgICAgaWYgKCFoYW5kbGVyUHJvbWlzZSkge1xuICAgICAgICBoYW5kbGVyUHJvbWlzZSA9IChhc3luYyAoKSA9PiB7XG4gICAgICAgICAgY29uc3QgbW9kID0gYXdhaXQgaW1wb3J0KC8qIEB2aXRlLWlnbm9yZSAqLyAvKiB3ZWJwYWNrSWdub3JlOiB0cnVlICovIF9fd29ya2Zsb3dXZWJIYW5kbGVyVXJsKTtcbiAgICAgICAgICByZXR1cm4gbW9kLmNyZWF0ZVdvcmtmbG93V2ViSGFuZGxlcih7IGJhc2VuYW1lOiBfX3dvcmtmbG93RGFzaGJvYXJkQmFzZW5hbWUgfSk7XG4gICAgICAgIH0pKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgaGFuZGxlclByb21pc2UgPSBudWxsO1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBoYW5kbGVyUHJvbWlzZTtcbiAgICB9XG4gIGA7XG5cbiAgaWYgKGlzTml0cm9WMihuaXRybykpIHtcbiAgICAvLyBOaXRybyB2MiAobGVnYWN5IGgzKVxuICAgIG5pdHJvLm9wdGlvbnMudmlydHVhbFtEQVNIQk9BUkRfVklSVFVBTF9JRF0gPSAvKiBqcyAqLyBgXG4gICAgICBpbXBvcnQgeyBmcm9tV2ViSGFuZGxlciB9IGZyb20gXCJoM1wiO1xuICAgICAgJHtoYW5kbGVyU291cmNlfVxuICAgICAgZXhwb3J0IGRlZmF1bHQgZnJvbVdlYkhhbmRsZXIoYXN5bmMgKHJlcXVlc3QpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBoYW5kbGVyID0gYXdhaXQgZ2V0RGFzaGJvYXJkSGFuZGxlcigpO1xuICAgICAgICAgIHJldHVybiBhd2FpdCBoYW5kbGVyKHJlcXVlc3QpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byByZW5kZXIgd29ya2Zsb3cgZGFzaGJvYXJkOicsIGVycm9yKTtcbiAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCdGYWlsZWQgdG8gcmVuZGVyIHdvcmtmbG93IGRhc2hib2FyZDogJyArIChlcnJvciAmJiBlcnJvci5tZXNzYWdlIHx8IGVycm9yKSwgeyBzdGF0dXM6IDUwMCB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgYDtcbiAgfSBlbHNlIHtcbiAgICAvLyBOaXRybyB2MysgKG5hdGl2ZSB3ZWIgaGFuZGxlcnMpXG4gICAgbml0cm8ub3B0aW9ucy52aXJ0dWFsW0RBU0hCT0FSRF9WSVJUVUFMX0lEXSA9IC8qIGpzICovIGBcbiAgICAgICR7aGFuZGxlclNvdXJjZX1cbiAgICAgIGV4cG9ydCBkZWZhdWx0IGFzeW5jICh7IHJlcSB9KSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgaGFuZGxlciA9IGF3YWl0IGdldERhc2hib2FyZEhhbmRsZXIoKTtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgaGFuZGxlcihyZXEpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byByZW5kZXIgd29ya2Zsb3cgZGFzaGJvYXJkOicsIGVycm9yKTtcbiAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCdGYWlsZWQgdG8gcmVuZGVyIHdvcmtmbG93IGRhc2hib2FyZDogJyArIChlcnJvciAmJiBlcnJvci5tZXNzYWdlIHx8IGVycm9yKSwgeyBzdGF0dXM6IDUwMCB9KTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICBgO1xuICB9XG5cbiAgLy8gUmVnaXN0ZXIgdGhlIGV4YWN0IG1vdW50IHBhdGggYW5kIGEgY2F0Y2gtYWxsIGJlbmVhdGggaXQgc28gdGhlIGluZGV4LFxuICAvLyBjbGllbnQgcm91dGVzLCBBUEkgcm91dGVzIChSUEMvc3RyZWFtKSwgYW5kIHN0YXRpYyBhc3NldHMgYWxsIHJvdXRlIHRvIHRoZVxuICAvLyBlbWJlZGRlZCBoYW5kbGVyLCB3aGljaCByZXNvbHZlcyB0aGVtIGFnYWluc3QgYGJhc2VuYW1lYCBpbnRlcm5hbGx5LlxuICBmb3IgKGNvbnN0IHJvdXRlIG9mIFtiYXNlbmFtZSwgYCR7YmFzZW5hbWV9LyoqYF0pIHtcbiAgICBuaXRyby5vcHRpb25zLmhhbmRsZXJzLnB1c2goeyByb3V0ZSwgaGFuZGxlcjogREFTSEJPQVJEX1ZJUlRVQUxfSUQgfSk7XG4gIH1cbn1cblxudHlwZSBWaXJ0dWFsSGFuZGxlclBhdGggPSAnd29ya2Zsb3cvd2ViaG9vay5tanMnIHwgJ3dvcmtmbG93L3dvcmtmbG93cy5tanMnO1xuXG5mdW5jdGlvbiBhZGRWaXJ0dWFsSGFuZGxlcihcbiAgbml0cm86IE5pdHJvLFxuICByb3V0ZTogc3RyaW5nLFxuICBidWlsZFBhdGg6IFZpcnR1YWxIYW5kbGVyUGF0aFxuKSB7XG4gIG5pdHJvLm9wdGlvbnMuaGFuZGxlcnMucHVzaCh7XG4gICAgcm91dGUsXG4gICAgaGFuZGxlcjogYCMke2J1aWxkUGF0aH1gLFxuICB9KTtcbiAgY29uc3QgaGFuZGxlckltcG9ydFBhdGggPSBKU09OLnN0cmluZ2lmeShcbiAgICBqb2luKG5pdHJvLm9wdGlvbnMuYnVpbGREaXIsIGJ1aWxkUGF0aClcbiAgKTtcbiAgY29uc3Qgc3RlcHNJbXBvcnRQYXRoID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgam9pbihuaXRyby5vcHRpb25zLmJ1aWxkRGlyLCAnd29ya2Zsb3cvc3RlcHMubWpzJylcbiAgKTtcbiAgY29uc3QgcHJlbG9hZFN0ZXBzOiBSZWNvcmQ8VmlydHVhbEhhbmRsZXJQYXRoLCBzdHJpbmc+ID0ge1xuICAgICd3b3JrZmxvdy93ZWJob29rLm1qcyc6ICcnLFxuICAgICd3b3JrZmxvdy93b3JrZmxvd3MubWpzJzogYGF3YWl0IGltcG9ydCgvKiBAdml0ZS1pZ25vcmUgKi8gcGF0aFRvRmlsZVVSTCgke3N0ZXBzSW1wb3J0UGF0aH0pLmhyZWYgKyBcIj90PVwiICsgdmVyc2lvbik7YCxcbiAgfTtcblxuICBpZiAobml0cm8ub3B0aW9ucy5kZXYpIHtcbiAgICAvLyBEZXYgbW9kZTogbG9hZCBnZW5lcmF0ZWQgd29ya2Zsb3cgYnVuZGxlcyBmcm9tIGRpc2sgYXQgcmVxdWVzdCB0aW1lLlxuICAgIC8vIFRoaXMga2VlcHMgYC5uaXRyby93b3JrZmxvdy8qLm1qc2Agb3V0IG9mIE5pdHJvJ3Mgb3duIGJ1bmRsZSBncmFwaCxcbiAgICAvLyB3aGljaCBhdm9pZHMgcmVidWlsZCBsb29wcyBhbmQgc3RhbGUgZGVwZW5kZW5jeSBncmFwaHMgZHVyaW5nIEhNUi5cbiAgICAvLyBDYWNoZS1idXN0IGJ5IGZpbGUgbXRpbWUgc28gZWFjaCBzdWNjZXNzZnVsIHJlYnVpbGQgbG9hZHMgZnJlc2ggY29kZS5cbiAgICBpZiAoaXNOaXRyb1YyKG5pdHJvKSkge1xuICAgICAgbml0cm8ub3B0aW9ucy52aXJ0dWFsW2AjJHtidWlsZFBhdGh9YF0gPSAvKiBqcyAqLyBgXG4gICAgICBpbXBvcnQgeyBmcm9tV2ViSGFuZGxlciB9IGZyb20gXCJoM1wiO1xuICAgICAgaW1wb3J0IHsgc3RhdFN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuICAgICAgaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gXCJub2RlOnVybFwiO1xuXG4gICAgICBjb25zdCBoYW5kbGVyUGF0aCA9ICR7aGFuZGxlckltcG9ydFBhdGh9O1xuICAgICAgbGV0IGN1cnJlbnRWZXJzaW9uID0gXCJcIjtcbiAgICAgIGxldCBjdXJyZW50SW1wb3J0UGF0aCA9IFwiXCI7XG5cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWRQT1NUKCkge1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gU3RyaW5nKHN0YXRTeW5jKGhhbmRsZXJQYXRoKS5tdGltZU1zKTtcbiAgICAgICAgaWYgKHZlcnNpb24gIT09IGN1cnJlbnRWZXJzaW9uKSB7XG4gICAgICAgICAgY3VycmVudFZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICAgIGN1cnJlbnRJbXBvcnRQYXRoID0gcGF0aFRvRmlsZVVSTChoYW5kbGVyUGF0aCkuaHJlZiArIFwiP3Q9XCIgKyB2ZXJzaW9uO1xuICAgICAgICAgICR7cHJlbG9hZFN0ZXBzW2J1aWxkUGF0aF19XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChhd2FpdCBpbXBvcnQoY3VycmVudEltcG9ydFBhdGgpKS5QT1NUO1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgZGVmYXVsdCBmcm9tV2ViSGFuZGxlcihhc3luYyAocmVxdWVzdCwgY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBQT1NUID0gYXdhaXQgbG9hZFBPU1QoKTtcbiAgICAgICAgcmV0dXJuIFBPU1QocmVxdWVzdCwgY29udGV4dCk7XG4gICAgICB9KTtcbiAgICBgO1xuICAgIH0gZWxzZSB7XG4gICAgICBuaXRyby5vcHRpb25zLnZpcnR1YWxbYCMke2J1aWxkUGF0aH1gXSA9IC8qIGpzICovIGBcbiAgICAgIGltcG9ydCB7IHN0YXRTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbiAgICAgIGltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tIFwibm9kZTp1cmxcIjtcblxuICAgICAgY29uc3QgaGFuZGxlclBhdGggPSAke2hhbmRsZXJJbXBvcnRQYXRofTtcbiAgICAgIGxldCBjdXJyZW50VmVyc2lvbiA9IFwiXCI7XG4gICAgICBsZXQgY3VycmVudEltcG9ydFBhdGggPSBcIlwiO1xuXG4gICAgICBhc3luYyBmdW5jdGlvbiBsb2FkUE9TVCgpIHtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IFN0cmluZyhzdGF0U3luYyhoYW5kbGVyUGF0aCkubXRpbWVNcyk7XG4gICAgICAgIGlmICh2ZXJzaW9uICE9PSBjdXJyZW50VmVyc2lvbikge1xuICAgICAgICAgIGN1cnJlbnRWZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgICBjdXJyZW50SW1wb3J0UGF0aCA9IHBhdGhUb0ZpbGVVUkwoaGFuZGxlclBhdGgpLmhyZWYgKyBcIj90PVwiICsgdmVyc2lvbjtcbiAgICAgICAgICAke3ByZWxvYWRTdGVwc1tidWlsZFBhdGhdfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoYXdhaXQgaW1wb3J0KGN1cnJlbnRJbXBvcnRQYXRoKSkuUE9TVDtcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IGRlZmF1bHQgYXN5bmMgKHsgcmVxIH0pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBQT1NUID0gYXdhaXQgbG9hZFBPU1QoKTtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgUE9TVChyZXEpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0hhbmRsZXIgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoJ0ludGVybmFsIFNlcnZlciBFcnJvcicsIHsgc3RhdHVzOiA1MDAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gS2VlcCBhIGJhcmUgaW1wb3J0IGFsb25nc2lkZSBgUE9TVGA6IGluIE51eHQgKyBOaXRybyBwcm9kdWN0aW9uIGJ1aWxkc1xuICAvLyB1c2luZyBgQHdvcmtmbG93L251eHRgLCBpbXBvcnRpbmcgb25seSBgUE9TVGAgY291bGQgZHJvcCB0aGUgZ2VuZXJhdGVkXG4gIC8vIHN0ZXAgYnVuZGxlJ3MgdG9wLWxldmVsIHJlZ2lzdHJhdGlvbnMsIHNvIHRoZSBoYW5kbGVyIGxvYWRlZCBidXQgc3RlcHNcbiAgLy8gd2VyZSBtaXNzaW5nIGF0IHJ1bnRpbWUuXG5cbiAgaWYgKGlzTml0cm9WMihuaXRybykpIHtcbiAgICAvLyBOaXRybyB2MiAobGVnYWN5KVxuICAgIG5pdHJvLm9wdGlvbnMudmlydHVhbFtgIyR7YnVpbGRQYXRofWBdID0gLyoganMgKi8gYFxuICAgIGltcG9ydCAke2hhbmRsZXJJbXBvcnRQYXRofTtcbiAgICBpbXBvcnQgeyBmcm9tV2ViSGFuZGxlciB9IGZyb20gXCJoM1wiO1xuICAgIGltcG9ydCB7IFBPU1QgfSBmcm9tICR7aGFuZGxlckltcG9ydFBhdGh9O1xuICAgIGV4cG9ydCBkZWZhdWx0IGZyb21XZWJIYW5kbGVyKFBPU1QpO1xuICBgO1xuICB9IGVsc2Uge1xuICAgIC8vIE5pdHJvIHYzKyAobmF0aXZlIHdlYiBoYW5kbGVycylcbiAgICBuaXRyby5vcHRpb25zLnZpcnR1YWxbYCMke2J1aWxkUGF0aH1gXSA9IC8qIGpzICovIGBcbiAgICBpbXBvcnQgJHtoYW5kbGVySW1wb3J0UGF0aH07XG4gICAgaW1wb3J0IHsgUE9TVCB9IGZyb20gJHtoYW5kbGVySW1wb3J0UGF0aH07XG4gICAgZXhwb3J0IGRlZmF1bHQgYXN5bmMgKHsgcmVxIH0pID0+IHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHJldHVybiBhd2FpdCBQT1NUKHJlcSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBjb25zb2xlLmVycm9yKCdIYW5kbGVyIGVycm9yOicsIGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSgnSW50ZXJuYWwgU2VydmVyIEVycm9yJywgeyBzdGF0dXM6IDUwMCB9KTtcbiAgICAgIH1cbiAgICB9O1xuICBgO1xuICB9XG59XG5cbmNvbnN0IE1BTklGRVNUX1ZJUlRVQUxfSUQgPSAnI3dvcmtmbG93L21hbmlmZXN0LWhhbmRsZXInO1xuXG5mdW5jdGlvbiBhZGRNYW5pZmVzdEhhbmRsZXIobml0cm86IE5pdHJvKSB7XG4gIGNvbnN0IHJvdXRlID0gJy8ud2VsbC1rbm93bi93b3JrZmxvdy92MS9tYW5pZmVzdC5qc29uJztcbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gam9pbihuaXRyby5vcHRpb25zLmJ1aWxkRGlyLCAnd29ya2Zsb3cvbWFuaWZlc3QuanNvbicpO1xuICBjb25zdCBoYW5kbGVyUGF0aCA9IGpvaW4oXG4gICAgbml0cm8ub3B0aW9ucy5idWlsZERpcixcbiAgICAnd29ya2Zsb3cvbWFuaWZlc3QtaGFuZGxlci5tanMnXG4gICk7XG5cbiAgaWYgKG5pdHJvLm9wdGlvbnMuZGV2KSB7XG4gICAgLy8gRGV2IG1vZGU6IHVzZSBhIHZpcnR1YWwgaGFuZGxlciB0aGF0IHJlYWRzIHRoZSBtYW5pZmVzdCBmcm9tIGRpc2sgYXRcbiAgICAvLyByZXF1ZXN0IHRpbWUuIFRoZSBhYnNvbHV0ZSBwYXRoIGlzIHZhbGlkIGJlY2F1c2Ugd2UncmUgb24gdGhlIGJ1aWxkIG1hY2hpbmUuXG4gICAgbml0cm8ub3B0aW9ucy5oYW5kbGVycy5wdXNoKHsgcm91dGUsIGhhbmRsZXI6IE1BTklGRVNUX1ZJUlRVQUxfSUQgfSk7XG4gICAgbml0cm8ub3B0aW9ucy52aXJ0dWFsW01BTklGRVNUX1ZJUlRVQUxfSURdID0gaXNOaXRyb1YyKG5pdHJvKVxuICAgICAgPyAvKiBqcyAqLyBgXG4gICAgICBpbXBvcnQgeyBmcm9tV2ViSGFuZGxlciB9IGZyb20gXCJoM1wiO1xuICAgICAgaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbiAgICAgIGZ1bmN0aW9uIEdFVCgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtYW5pZmVzdCA9IHJlYWRGaWxlU3luYygke0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0UGF0aCl9LCBcInV0Zi04XCIpO1xuICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UobWFuaWZlc3QsIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShcIk1hbmlmZXN0IG5vdCBmb3VuZFwiLCB7IHN0YXR1czogNDA0IH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBleHBvcnQgZGVmYXVsdCBmcm9tV2ViSGFuZGxlcihHRVQpO1xuICAgIGBcbiAgICAgIDogLyoganMgKi8gYFxuICAgICAgaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbiAgICAgIGV4cG9ydCBkZWZhdWx0IGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBtYW5pZmVzdCA9IHJlYWRGaWxlU3luYygke0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0UGF0aCl9LCBcInV0Zi04XCIpO1xuICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UobWFuaWZlc3QsIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHsgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShcIk1hbmlmZXN0IG5vdCBmb3VuZFwiLCB7IHN0YXR1czogNDA0IH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIGA7XG4gIH0gZWxzZSB7XG4gICAgLy8gUHJvZCBtb2RlOiByZWdpc3RlciBhIHBoeXNpY2FsIGhhbmRsZXIgZmlsZSB0aGF0IHdpbGwgYmUgd3JpdHRlbiBieVxuICAgIC8vIHdyaXRlTWFuaWZlc3RIYW5kbGVyKCkgYWZ0ZXIgdGhlIGJ1aWxkZXIgZ2VuZXJhdGVzIHRoZSBtYW5pZmVzdC5cbiAgICAvLyBUaGlzIGZpbGUgaXMgYnVuZGxlZCBieSByb2xsdXAgaW50byB0aGUgY29tcGlsZWQgb3V0cHV0LlxuICAgIG5pdHJvLm9wdGlvbnMuaGFuZGxlcnMucHVzaCh7IHJvdXRlLCBoYW5kbGVyOiBoYW5kbGVyUGF0aCB9KTtcbiAgfVxufVxuXG4vKipcbiAqIFdyaXRlcyBhIHBoeXNpY2FsIG1hbmlmZXN0IGhhbmRsZXIgZmlsZSB3aXRoIHRoZSBtYW5pZmVzdCBjb250ZW50IGlubGluZWQuXG4gKiBNdXN0IGJlIGNhbGxlZCBhZnRlciB0aGUgYnVpbGRlciBnZW5lcmF0ZXMgdGhlIG1hbmlmZXN0IChkdXJpbmcgYnVpbGQ6YmVmb3JlKVxuICogYW5kIGJlZm9yZSBOaXRybyBjb21waWxlcyB0aGUgYnVuZGxlIHdpdGggcm9sbHVwLlxuICovXG5mdW5jdGlvbiB3cml0ZU1hbmlmZXN0SGFuZGxlcihuaXRybzogTml0cm8pIHtcbiAgY29uc3QgbWFuaWZlc3RQYXRoID0gam9pbihuaXRyby5vcHRpb25zLmJ1aWxkRGlyLCAnd29ya2Zsb3cvbWFuaWZlc3QuanNvbicpO1xuICBjb25zdCBoYW5kbGVyUGF0aCA9IGpvaW4oXG4gICAgbml0cm8ub3B0aW9ucy5idWlsZERpcixcbiAgICAnd29ya2Zsb3cvbWFuaWZlc3QtaGFuZGxlci5tanMnXG4gICk7XG4gIGNvbnN0IGRpciA9IGpvaW4obml0cm8ub3B0aW9ucy5idWlsZERpciwgJ3dvcmtmbG93Jyk7XG4gIG1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gIHRyeSB7XG4gICAgY29uc3QgbWFuaWZlc3RDb250ZW50ID0gcmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCwgJ3V0Zi04Jyk7XG4gICAgSlNPTi5wYXJzZShtYW5pZmVzdENvbnRlbnQpOyAvLyB2YWxpZGF0ZVxuXG4gICAgY29uc3QgaGFuZGxlckNvZGUgPSBpc05pdHJvVjIobml0cm8pXG4gICAgICA/IGBpbXBvcnQgeyBmcm9tV2ViSGFuZGxlciB9IGZyb20gXCJoM1wiO1xuY29uc3QgbWFuaWZlc3QgPSAke0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0Q29udGVudCl9O1xuZXhwb3J0IGRlZmF1bHQgZnJvbVdlYkhhbmRsZXIoKCkgPT4gbmV3IFJlc3BvbnNlKG1hbmlmZXN0LCB7XG4gIGhlYWRlcnM6IHsgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbn0pKTtcbmBcbiAgICAgIDogYGNvbnN0IG1hbmlmZXN0ID0gJHtKU09OLnN0cmluZ2lmeShtYW5pZmVzdENvbnRlbnQpfTtcbmV4cG9ydCBkZWZhdWx0IGFzeW5jICgpID0+IG5ldyBSZXNwb25zZShtYW5pZmVzdCwge1xuICBoZWFkZXJzOiB7IFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG59KTtcbmA7XG4gICAgd3JpdGVGaWxlU3luYyhoYW5kbGVyUGF0aCwgaGFuZGxlckNvZGUpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBXcml0ZSBhIDQwNCBmYWxsYmFjayBoYW5kbGVyXG4gICAgY29uc3QgZmFsbGJhY2sgPSBpc05pdHJvVjIobml0cm8pXG4gICAgICA/IGBpbXBvcnQgeyBmcm9tV2ViSGFuZGxlciB9IGZyb20gXCJoM1wiO1xuZXhwb3J0IGRlZmF1bHQgZnJvbVdlYkhhbmRsZXIoKCkgPT4gbmV3IFJlc3BvbnNlKFwiTWFuaWZlc3Qgbm90IGZvdW5kXCIsIHsgc3RhdHVzOiA0MDQgfSkpO1xuYFxuICAgICAgOiBgZXhwb3J0IGRlZmF1bHQgYXN5bmMgKCkgPT4gbmV3IFJlc3BvbnNlKFwiTWFuaWZlc3Qgbm90IGZvdW5kXCIsIHsgc3RhdHVzOiA0MDQgfSk7XG5gO1xuICAgIHdyaXRlRmlsZVN5bmMoaGFuZGxlclBhdGgsIGZhbGxiYWNrKTtcbiAgfVxufVxuIl19
|
package/dist/types.d.ts
CHANGED
|
@@ -24,13 +24,32 @@ export interface ModuleOptions {
|
|
|
24
24
|
* for step/workflow bundles), `'linked'`, `'external'`, `'both'`, or
|
|
25
25
|
* `false` to omit source maps.
|
|
26
26
|
*
|
|
27
|
-
* Set to `false` for smaller function bundles
|
|
28
|
-
* the Vercel 250MB function size limit
|
|
27
|
+
* Set to `false` for smaller function bundles (useful for staying under
|
|
28
|
+
* the Vercel 250MB function size limit) at the cost of stack traces that
|
|
29
29
|
* point at generated code instead of your source files.
|
|
30
30
|
*
|
|
31
31
|
* Can also be set via the `WORKFLOW_SOURCEMAP` environment variable.
|
|
32
32
|
*/
|
|
33
33
|
sourcemap?: boolean | 'inline' | 'linked' | 'external' | 'both';
|
|
34
|
+
/**
|
|
35
|
+
* Embed the workflow observability dashboard in-process on this server,
|
|
36
|
+
* served at `/_workflow` (configurable). The UI runs inside the same Nitro
|
|
37
|
+
* process, with no separate server or port.
|
|
38
|
+
*
|
|
39
|
+
* - `true` / `false`: force the dashboard on or off.
|
|
40
|
+
* - `{ enabled, path }`: toggle and/or change the mount path.
|
|
41
|
+
*
|
|
42
|
+
* Defaults to **on in dev, off in production builds**. When disabled the
|
|
43
|
+
* route is never registered, so production bundles carry no `@workflow/web`
|
|
44
|
+
* import and pay zero bundle-size or startup cost. Never mounted for Vercel
|
|
45
|
+
* deploys (use the hosted Vercel dashboard there).
|
|
46
|
+
*
|
|
47
|
+
* @default nitro.options.dev
|
|
48
|
+
*/
|
|
49
|
+
dashboard?: boolean | {
|
|
50
|
+
enabled?: boolean;
|
|
51
|
+
path?: string;
|
|
52
|
+
};
|
|
34
53
|
}
|
|
35
54
|
declare module 'nitro/types' {
|
|
36
55
|
interface NitroOptions {
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,gBAAgB;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,aAAa;IAC5B,gBAAgB;IAChB,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;;;OAIG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAEhB;;;OAGG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;;;OAIG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IAEjB;;;;;;;;;;;OAWG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;IAEhE;;;;;;;;;;;;;;OAcG;IACH,SAAS,CAAC,EAAE,OAAO,GAAG;QAAE,OAAO,CAAC,EAAE,OAAO,CAAC;QAAC,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAC5D;AAED,OAAO,QAAQ,aAAa,CAAC;IAC3B,UAAU,YAAY;QACpB,QAAQ,CAAC,EAAE,aAAa,CAAC;KAC1B;CACF;AAGD,OAAO,QAAQ,WAAW,CAAC;IACzB,UAAU,YAAY;QACpB,QAAQ,CAAC,EAAE,aAAa,CAAC;KAC1B;CACF"}
|
package/dist/types.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
//# sourceMappingURL=
|
|
1
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlT3B0aW9ucyB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ZpdGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEaXJlY3RvcmllcyB0byBzY2FuIGZvciB3b3JrZmxvd3MgYW5kIHN0ZXBzLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBgd29ya2Zsb3dzL2AgZGlyZWN0b3J5IHdpbGwgYmUgc2Nhbm5lZCBmcm9tIHJvb3QgYW5kIGFsbCBsYXllciBzb3VyY2UgZGlycy5cbiAgICovXG4gIGRpcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogRW5hYmxlIHdvcmtmbG93IFR5cGVTY3JpcHQgcGx1Z2luIGluIGdlbmVyYXRlZCB0c2NvbmZpZy5qc29uXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB0eXBlc2NyaXB0UGx1Z2luPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTm9kZS5qcyBydW50aW1lIHZlcnNpb24gZm9yIFZlcmNlbCBGdW5jdGlvbnMuXG4gICAqIEBleGFtcGxlIFwibm9kZWpzMjIueFwiXG4gICAqIEBleGFtcGxlIFwibm9kZWpzMjQueFwiXG4gICAqL1xuICBydW50aW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBob3cgc291cmNlIG1hcHMgYXJlIGVtaXR0ZWQgZm9yIHdvcmtmbG93IGJ1bmRsZXMuIEFjY2VwdHMgdGhlXG4gICAqIHNhbWUgdmFsdWVzIGFzIGVzYnVpbGQncyBgc291cmNlbWFwYCBvcHRpb246IGB0cnVlYC9gJ2lubGluZSdgIChkZWZhdWx0XG4gICAqIGZvciBzdGVwL3dvcmtmbG93IGJ1bmRsZXMpLCBgJ2xpbmtlZCdgLCBgJ2V4dGVybmFsJ2AsIGAnYm90aCdgLCBvclxuICAgKiBgZmFsc2VgIHRvIG9taXQgc291cmNlIG1hcHMuXG4gICAqXG4gICAqIFNldCB0byBgZmFsc2VgIGZvciBzbWFsbGVyIGZ1bmN0aW9uIGJ1bmRsZXMgKHVzZWZ1bCBmb3Igc3RheWluZyB1bmRlclxuICAgKiB0aGUgVmVyY2VsIDI1ME1CIGZ1bmN0aW9uIHNpemUgbGltaXQpIGF0IHRoZSBjb3N0IG9mIHN0YWNrIHRyYWNlcyB0aGF0XG4gICAqIHBvaW50IGF0IGdlbmVyYXRlZCBjb2RlIGluc3RlYWQgb2YgeW91ciBzb3VyY2UgZmlsZXMuXG4gICAqXG4gICAqIENhbiBhbHNvIGJlIHNldCB2aWEgdGhlIGBXT1JLRkxPV19TT1VSQ0VNQVBgIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICAgKi9cbiAgc291cmNlbWFwPzogYm9vbGVhbiB8ICdpbmxpbmUnIHwgJ2xpbmtlZCcgfCAnZXh0ZXJuYWwnIHwgJ2JvdGgnO1xuXG4gIC8qKlxuICAgKiBFbWJlZCB0aGUgd29ya2Zsb3cgb2JzZXJ2YWJpbGl0eSBkYXNoYm9hcmQgaW4tcHJvY2VzcyBvbiB0aGlzIHNlcnZlcixcbiAgICogc2VydmVkIGF0IGAvX3dvcmtmbG93YCAoY29uZmlndXJhYmxlKS4gVGhlIFVJIHJ1bnMgaW5zaWRlIHRoZSBzYW1lIE5pdHJvXG4gICAqIHByb2Nlc3MsIHdpdGggbm8gc2VwYXJhdGUgc2VydmVyIG9yIHBvcnQuXG4gICAqXG4gICAqIC0gYHRydWVgIC8gYGZhbHNlYDogZm9yY2UgdGhlIGRhc2hib2FyZCBvbiBvciBvZmYuXG4gICAqIC0gYHsgZW5hYmxlZCwgcGF0aCB9YDogdG9nZ2xlIGFuZC9vciBjaGFuZ2UgdGhlIG1vdW50IHBhdGguXG4gICAqXG4gICAqIERlZmF1bHRzIHRvICoqb24gaW4gZGV2LCBvZmYgaW4gcHJvZHVjdGlvbiBidWlsZHMqKi4gV2hlbiBkaXNhYmxlZCB0aGVcbiAgICogcm91dGUgaXMgbmV2ZXIgcmVnaXN0ZXJlZCwgc28gcHJvZHVjdGlvbiBidW5kbGVzIGNhcnJ5IG5vIGBAd29ya2Zsb3cvd2ViYFxuICAgKiBpbXBvcnQgYW5kIHBheSB6ZXJvIGJ1bmRsZS1zaXplIG9yIHN0YXJ0dXAgY29zdC4gTmV2ZXIgbW91bnRlZCBmb3IgVmVyY2VsXG4gICAqIGRlcGxveXMgKHVzZSB0aGUgaG9zdGVkIFZlcmNlbCBkYXNoYm9hcmQgdGhlcmUpLlxuICAgKlxuICAgKiBAZGVmYXVsdCBuaXRyby5vcHRpb25zLmRldlxuICAgKi9cbiAgZGFzaGJvYXJkPzogYm9vbGVhbiB8IHsgZW5hYmxlZD86IGJvb2xlYW47IHBhdGg/OiBzdHJpbmcgfTtcbn1cblxuZGVjbGFyZSBtb2R1bGUgJ25pdHJvL3R5cGVzJyB7XG4gIGludGVyZmFjZSBOaXRyb09wdGlvbnMge1xuICAgIHdvcmtmbG93PzogTW9kdWxlT3B0aW9ucztcbiAgfVxufVxuXG4vLyBAdHMtZXhwZWN0LWVycm9yIChsZWdhY3kpXG5kZWNsYXJlIG1vZHVsZSAnbml0cm9wYWNrJyB7XG4gIGludGVyZmFjZSBOaXRyb09wdGlvbnMge1xuICAgIHdvcmtmbG93PzogTW9kdWxlT3B0aW9ucztcbiAgfVxufVxuIl19
|
package/dist/vite.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAmB,MAAM,MAAM,CAAC;AAEpD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,wBAAgB,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,EAAE,CA2F1D"}
|
package/dist/vite.js
CHANGED
|
@@ -1,24 +1,25 @@
|
|
|
1
1
|
import { createBuildQueue } from '@workflow/builders';
|
|
2
2
|
import { workflowTransformPlugin } from '@workflow/rollup';
|
|
3
3
|
import { workflowHotUpdatePlugin } from '@workflow/vite';
|
|
4
|
-
import { join } from 'pathe';
|
|
5
4
|
import { LocalBuilder } from './builders.js';
|
|
6
5
|
import nitroModule from './index.js';
|
|
7
6
|
export function workflow(options) {
|
|
8
7
|
let builder;
|
|
9
|
-
let
|
|
8
|
+
let devNitro;
|
|
9
|
+
let nitroBuildDir;
|
|
10
10
|
const enqueue = createBuildQueue();
|
|
11
|
-
// Create a lazy transform plugin that excludes
|
|
11
|
+
// Create a lazy transform plugin that excludes Nitro build artifacts.
|
|
12
12
|
// The exclusion path is set during nitro setup, so we need to defer plugin creation
|
|
13
13
|
const lazyTransformPlugin = {
|
|
14
14
|
name: 'workflow:transform',
|
|
15
|
-
transform(code, id) {
|
|
15
|
+
transform(code, id, options) {
|
|
16
16
|
// Delegate to the actual transform plugin with exclusion
|
|
17
|
-
//
|
|
17
|
+
// nitroBuildDir is set during nitro setup before transforms run
|
|
18
18
|
const plugin = workflowTransformPlugin({
|
|
19
|
-
exclude:
|
|
19
|
+
exclude: nitroBuildDir ? [nitroBuildDir] : [],
|
|
20
20
|
});
|
|
21
|
-
|
|
21
|
+
const transform = plugin.transform;
|
|
22
|
+
return transform?.call(this, code, id, options);
|
|
22
23
|
},
|
|
23
24
|
};
|
|
24
25
|
return [
|
|
@@ -27,19 +28,25 @@ export function workflow(options) {
|
|
|
27
28
|
name: 'workflow:nitro',
|
|
28
29
|
nitro: {
|
|
29
30
|
setup: (nitro) => {
|
|
30
|
-
// Capture the
|
|
31
|
-
|
|
31
|
+
// Capture the Nitro build directory for exclusion
|
|
32
|
+
nitroBuildDir = `${nitro.options.buildDir.replace(/[\\/]+$/, '')}/`;
|
|
32
33
|
nitro.options.workflow = {
|
|
33
34
|
...nitro.options.workflow,
|
|
34
35
|
...options,
|
|
35
36
|
_vite: true,
|
|
36
37
|
};
|
|
37
38
|
if (nitro.options.dev) {
|
|
39
|
+
devNitro = nitro;
|
|
38
40
|
builder = new LocalBuilder(nitro);
|
|
39
41
|
}
|
|
40
42
|
return nitroModule.setup(nitro);
|
|
41
43
|
},
|
|
42
44
|
},
|
|
45
|
+
async buildEnd() {
|
|
46
|
+
const nitro = devNitro;
|
|
47
|
+
devNitro = undefined;
|
|
48
|
+
await nitro?.close();
|
|
49
|
+
},
|
|
43
50
|
// NOTE: This is a workaround because Nitro passes the 404 requests to the dev server to handle.
|
|
44
51
|
// For workflow routes, we override to send an empty body to prevent Hono/Vite's SPA fallback.
|
|
45
52
|
configureServer(server) {
|
|
@@ -75,4 +82,4 @@ export function workflow(options) {
|
|
|
75
82
|
}),
|
|
76
83
|
];
|
|
77
84
|
}
|
|
78
|
-
//# sourceMappingURL=
|
|
85
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBSXpELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFN0MsT0FBTyxXQUFXLE1BQU0sWUFBWSxDQUFDO0FBRXJDLE1BQU0sVUFBVSxRQUFRLENBQUMsT0FBdUI7SUFDOUMsSUFBSSxPQUFxQixDQUFDO0lBQzFCLElBQUksUUFBMkIsQ0FBQztJQUNoQyxJQUFJLGFBQXFCLENBQUM7SUFDMUIsTUFBTSxPQUFPLEdBQUcsZ0JBQWdCLEVBQUUsQ0FBQztJQUVuQyxzRUFBc0U7SUFDdEUsb0ZBQW9GO0lBQ3BGLE1BQU0sbUJBQW1CLEdBQVc7UUFDbEMsSUFBSSxFQUFFLG9CQUFvQjtRQUMxQixTQUFTLENBQUMsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPO1lBQ3pCLHlEQUF5RDtZQUN6RCxnRUFBZ0U7WUFDaEUsTUFBTSxNQUFNLEdBQUcsdUJBQXVCLENBQUM7Z0JBQ3JDLE9BQU8sRUFBRSxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7YUFDOUMsQ0FBQyxDQUFDO1lBQ0gsTUFBTSxTQUFTLEdBQUcsTUFBTSxDQUFDLFNBT1osQ0FBQztZQUNkLE9BQU8sU0FBUyxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztRQUNsRCxDQUFDO0tBQ0YsQ0FBQztJQUVGLE9BQU87UUFDTCxtQkFBbUI7UUFDbkI7WUFDRSxJQUFJLEVBQUUsZ0JBQWdCO1lBQ3RCLEtBQUssRUFBRTtnQkFDTCxLQUFLLEVBQUUsQ0FBQyxLQUFZLEVBQUUsRUFBRTtvQkFDdEIsa0RBQWtEO29CQUNsRCxhQUFhLEdBQUcsR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsU0FBUyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUM7b0JBQ3BFLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxHQUFHO3dCQUN2QixHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUTt3QkFDekIsR0FBRyxPQUFPO3dCQUNWLEtBQUssRUFBRSxJQUFJO3FCQUNaLENBQUM7b0JBQ0YsSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxDQUFDO3dCQUN0QixRQUFRLEdBQUcsS0FBSyxDQUFDO3dCQUNqQixPQUFPLEdBQUcsSUFBSSxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUM7b0JBQ3BDLENBQUM7b0JBQ0QsT0FBTyxXQUFXLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO2dCQUNsQyxDQUFDO2FBQ0Y7WUFDRCxLQUFLLENBQUMsUUFBUTtnQkFDWixNQUFNLEtBQUssR0FBRyxRQUFRLENBQUM7Z0JBQ3ZCLFFBQVEsR0FBRyxTQUFTLENBQUM7Z0JBQ3JCLE1BQU0sS0FBSyxFQUFFLEtBQUssRUFBRSxDQUFDO1lBQ3ZCLENBQUM7WUFDRCxnR0FBZ0c7WUFDaEcsOEZBQThGO1lBQzlGLGVBQWUsQ0FBQyxNQUFNO2dCQUNwQixpRkFBaUY7Z0JBQ2pGLE9BQU8sR0FBRyxFQUFFO29CQUNWLE1BQU0sQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRTt3QkFDeEMsc0NBQXNDO3dCQUN0QyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxVQUFVLENBQUMsMkJBQTJCLENBQUMsRUFBRSxDQUFDOzRCQUN0RCxPQUFPLElBQUksRUFBRSxDQUFDO3dCQUNoQixDQUFDO3dCQUVELHVEQUF1RDt3QkFDdkQsTUFBTSxpQkFBaUIsR0FBRyxHQUFHLENBQUMsU0FBUyxDQUFDO3dCQUN4QyxHQUFHLENBQUMsU0FBUyxHQUFHLFVBQTRCLEdBQUcsSUFBVzs0QkFDeEQsTUFBTSxVQUFVLEdBQUcsT0FBTyxJQUFJLENBQUMsQ0FBQyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQzs0QkFFL0QsNEVBQTRFOzRCQUM1RSwwREFBMEQ7NEJBQzFELHNFQUFzRTs0QkFDdEUsSUFBSSxVQUFVLEtBQUssR0FBRyxFQUFFLENBQUM7Z0NBQ3ZCLDBEQUEwRDtnQ0FDMUQsR0FBRyxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsRUFBRSxHQUFHLENBQUMsQ0FBQzs0QkFDdkMsQ0FBQzs0QkFFRCxnREFBZ0Q7NEJBQ2hELE9BQU8saUJBQWlCLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQzt3QkFDN0MsQ0FBUSxDQUFDO3dCQUVULElBQUksRUFBRSxDQUFDO29CQUNULENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUMsQ0FBQztZQUNKLENBQUM7U0FDRjtRQUNELHVCQUF1QixDQUFDO1lBQ3RCLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxPQUFPO1lBQ3RCLE9BQU87U0FDUixDQUFDO0tBQ0gsQ0FBQztBQUNKLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVCdWlsZFF1ZXVlIH0gZnJvbSAnQHdvcmtmbG93L2J1aWxkZXJzJztcbmltcG9ydCB7IHdvcmtmbG93VHJhbnNmb3JtUGx1Z2luIH0gZnJvbSAnQHdvcmtmbG93L3JvbGx1cCc7XG5pbXBvcnQgeyB3b3JrZmxvd0hvdFVwZGF0ZVBsdWdpbiB9IGZyb20gJ0B3b3JrZmxvdy92aXRlJztcbmltcG9ydCB0eXBlIHsgTml0cm8gfSBmcm9tICduaXRyby90eXBlcyc7XG5pbXBvcnQgdHlwZSB7fSBmcm9tICduaXRyby92aXRlJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luLCBUcmFuc2Zvcm1SZXN1bHQgfSBmcm9tICd2aXRlJztcbmltcG9ydCB7IExvY2FsQnVpbGRlciB9IGZyb20gJy4vYnVpbGRlcnMuanMnO1xuaW1wb3J0IHR5cGUgeyBNb2R1bGVPcHRpb25zIH0gZnJvbSAnLi9pbmRleC5qcyc7XG5pbXBvcnQgbml0cm9Nb2R1bGUgZnJvbSAnLi9pbmRleC5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiB3b3JrZmxvdyhvcHRpb25zPzogTW9kdWxlT3B0aW9ucyk6IFBsdWdpbltdIHtcbiAgbGV0IGJ1aWxkZXI6IExvY2FsQnVpbGRlcjtcbiAgbGV0IGRldk5pdHJvOiBOaXRybyB8IHVuZGVmaW5lZDtcbiAgbGV0IG5pdHJvQnVpbGREaXI6IHN0cmluZztcbiAgY29uc3QgZW5xdWV1ZSA9IGNyZWF0ZUJ1aWxkUXVldWUoKTtcblxuICAvLyBDcmVhdGUgYSBsYXp5IHRyYW5zZm9ybSBwbHVnaW4gdGhhdCBleGNsdWRlcyBOaXRybyBidWlsZCBhcnRpZmFjdHMuXG4gIC8vIFRoZSBleGNsdXNpb24gcGF0aCBpcyBzZXQgZHVyaW5nIG5pdHJvIHNldHVwLCBzbyB3ZSBuZWVkIHRvIGRlZmVyIHBsdWdpbiBjcmVhdGlvblxuICBjb25zdCBsYXp5VHJhbnNmb3JtUGx1Z2luOiBQbHVnaW4gPSB7XG4gICAgbmFtZTogJ3dvcmtmbG93OnRyYW5zZm9ybScsXG4gICAgdHJhbnNmb3JtKGNvZGUsIGlkLCBvcHRpb25zKSB7XG4gICAgICAvLyBEZWxlZ2F0ZSB0byB0aGUgYWN0dWFsIHRyYW5zZm9ybSBwbHVnaW4gd2l0aCBleGNsdXNpb25cbiAgICAgIC8vIG5pdHJvQnVpbGREaXIgaXMgc2V0IGR1cmluZyBuaXRybyBzZXR1cCBiZWZvcmUgdHJhbnNmb3JtcyBydW5cbiAgICAgIGNvbnN0IHBsdWdpbiA9IHdvcmtmbG93VHJhbnNmb3JtUGx1Z2luKHtcbiAgICAgICAgZXhjbHVkZTogbml0cm9CdWlsZERpciA/IFtuaXRyb0J1aWxkRGlyXSA6IFtdLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB0cmFuc2Zvcm0gPSBwbHVnaW4udHJhbnNmb3JtIGFzXG4gICAgICAgIHwgKChcbiAgICAgICAgICAgIHRoaXM6IHVua25vd24sXG4gICAgICAgICAgICBjb2RlOiBzdHJpbmcsXG4gICAgICAgICAgICBpZDogc3RyaW5nLFxuICAgICAgICAgICAgb3B0aW9ucz86IHsgc3NyPzogYm9vbGVhbiB9XG4gICAgICAgICAgKSA9PiBUcmFuc2Zvcm1SZXN1bHQgfCBQcm9taXNlPFRyYW5zZm9ybVJlc3VsdD4pXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybT8uY2FsbCh0aGlzLCBjb2RlLCBpZCwgb3B0aW9ucyk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gW1xuICAgIGxhenlUcmFuc2Zvcm1QbHVnaW4sXG4gICAge1xuICAgICAgbmFtZTogJ3dvcmtmbG93Om5pdHJvJyxcbiAgICAgIG5pdHJvOiB7XG4gICAgICAgIHNldHVwOiAobml0cm86IE5pdHJvKSA9PiB7XG4gICAgICAgICAgLy8gQ2FwdHVyZSB0aGUgTml0cm8gYnVpbGQgZGlyZWN0b3J5IGZvciBleGNsdXNpb25cbiAgICAgICAgICBuaXRyb0J1aWxkRGlyID0gYCR7bml0cm8ub3B0aW9ucy5idWlsZERpci5yZXBsYWNlKC9bXFxcXC9dKyQvLCAnJyl9L2A7XG4gICAgICAgICAgbml0cm8ub3B0aW9ucy53b3JrZmxvdyA9IHtcbiAgICAgICAgICAgIC4uLm5pdHJvLm9wdGlvbnMud29ya2Zsb3csXG4gICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgX3ZpdGU6IHRydWUsXG4gICAgICAgICAgfTtcbiAgICAgICAgICBpZiAobml0cm8ub3B0aW9ucy5kZXYpIHtcbiAgICAgICAgICAgIGRldk5pdHJvID0gbml0cm87XG4gICAgICAgICAgICBidWlsZGVyID0gbmV3IExvY2FsQnVpbGRlcihuaXRybyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBuaXRyb01vZHVsZS5zZXR1cChuaXRybyk7XG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYXN5bmMgYnVpbGRFbmQoKSB7XG4gICAgICAgIGNvbnN0IG5pdHJvID0gZGV2Tml0cm87XG4gICAgICAgIGRldk5pdHJvID0gdW5kZWZpbmVkO1xuICAgICAgICBhd2FpdCBuaXRybz8uY2xvc2UoKTtcbiAgICAgIH0sXG4gICAgICAvLyBOT1RFOiBUaGlzIGlzIGEgd29ya2Fyb3VuZCBiZWNhdXNlIE5pdHJvIHBhc3NlcyB0aGUgNDA0IHJlcXVlc3RzIHRvIHRoZSBkZXYgc2VydmVyIHRvIGhhbmRsZS5cbiAgICAgIC8vIEZvciB3b3JrZmxvdyByb3V0ZXMsIHdlIG92ZXJyaWRlIHRvIHNlbmQgYW4gZW1wdHkgYm9keSB0byBwcmV2ZW50IEhvbm8vVml0ZSdzIFNQQSBmYWxsYmFjay5cbiAgICAgIGNvbmZpZ3VyZVNlcnZlcihzZXJ2ZXIpIHtcbiAgICAgICAgLy8gQWRkIG1pZGRsZXdhcmUgdG8gaW50ZXJjZXB0IDQwNHMgb24gd29ya2Zsb3cgcm91dGVzIGJlZm9yZSBWaXRlJ3MgU1BBIGZhbGxiYWNrXG4gICAgICAgIHJldHVybiAoKSA9PiB7XG4gICAgICAgICAgc2VydmVyLm1pZGRsZXdhcmVzLnVzZSgocmVxLCByZXMsIG5leHQpID0+IHtcbiAgICAgICAgICAgIC8vIE9ubHkgaGFuZGxlIHdvcmtmbG93IHdlYmhvb2sgcm91dGVzXG4gICAgICAgICAgICBpZiAoIXJlcS51cmw/LnN0YXJ0c1dpdGgoJy8ud2VsbC1rbm93bi93b3JrZmxvdy92MS8nKSkge1xuICAgICAgICAgICAgICByZXR1cm4gbmV4dCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBXcmFwIHdyaXRlSGVhZCB0byBlbnN1cmUgd2Ugc2VuZCBlbXB0eSBib2R5IGZvciA0MDRzXG4gICAgICAgICAgICBjb25zdCBvcmlnaW5hbFdyaXRlSGVhZCA9IHJlcy53cml0ZUhlYWQ7XG4gICAgICAgICAgICByZXMud3JpdGVIZWFkID0gZnVuY3Rpb24gKHRoaXM6IHR5cGVvZiByZXMsIC4uLmFyZ3M6IGFueVtdKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHN0YXR1c0NvZGUgPSB0eXBlb2YgYXJnc1swXSA9PT0gJ251bWJlcicgPyBhcmdzWzBdIDogMjAwO1xuXG4gICAgICAgICAgICAgIC8vIE5PVEU6IFdvcmthcm91bmQgYmVjYXVzZSBOaXRybyBwYXNzZXMgNDA0IHJlcXVlc3RzIHRvIHRoZSB2aXRlIHRvIGhhbmRsZS5cbiAgICAgICAgICAgICAgLy8gQ2F1c2VzIGB3ZWJob29rIHJvdXRlIHdpdGggaW52YWxpZCB0b2tlbmAgdGVzdCB0byBmYWlsLlxuICAgICAgICAgICAgICAvLyBGb3IgNDA0cyBvbiB3b3JrZmxvdyByb3V0ZXMsIGVuc3VyZSB3ZSdyZSBzZW5kaW5nIHRoZSByaWdodCBoZWFkZXJzXG4gICAgICAgICAgICAgIGlmIChzdGF0dXNDb2RlID09PSA0MDQpIHtcbiAgICAgICAgICAgICAgICAvLyBTZXQgY29udGVudC1sZW5ndGggdG8gMCB0byBwcmV2ZW50IFZpdGUgZnJvbSBvdmVycmlkaW5nXG4gICAgICAgICAgICAgICAgcmVzLnNldEhlYWRlcignQ29udGVudC1MZW5ndGgnLCAnMCcpO1xuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgLy8gQHRzLWV4cGVjdC1lcnJvciAtIENvbXBsZXggb3ZlcmxvYWQgc2lnbmF0dXJlXG4gICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbFdyaXRlSGVhZC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgIH0gYXMgYW55O1xuXG4gICAgICAgICAgICBuZXh0KCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICB9LFxuICAgIH0sXG4gICAgd29ya2Zsb3dIb3RVcGRhdGVQbHVnaW4oe1xuICAgICAgYnVpbGRlcjogKCkgPT4gYnVpbGRlcixcbiAgICAgIGVucXVldWUsXG4gICAgfSksXG4gIF07XG59XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workflow/nitro",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.50",
|
|
4
4
|
"description": "Nitro integration for Workflow SDK",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -22,23 +22,27 @@
|
|
|
22
22
|
},
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@swc/core": "1.15.3",
|
|
25
|
+
"@workflow/builders": "5.0.0-beta.50",
|
|
26
|
+
"@workflow/core": "5.0.0-beta.50",
|
|
27
|
+
"@workflow/rollup": "5.0.0-beta.50",
|
|
28
|
+
"@workflow/swc-plugin": "5.0.0-beta.6",
|
|
29
|
+
"@workflow/vite": "5.0.0-beta.50",
|
|
30
|
+
"@workflow/web": "5.0.0-beta.50",
|
|
25
31
|
"exsolve": "1.0.8",
|
|
26
|
-
"pathe": "2.0.3"
|
|
27
|
-
"@workflow/builders": "5.0.0-beta.5",
|
|
28
|
-
"@workflow/core": "5.0.0-beta.5",
|
|
29
|
-
"@workflow/rollup": "5.0.0-beta.5",
|
|
30
|
-
"@workflow/swc-plugin": "5.0.0-beta.4",
|
|
31
|
-
"@workflow/vite": "5.0.0-beta.5"
|
|
32
|
+
"pathe": "2.0.3"
|
|
32
33
|
},
|
|
33
34
|
"devDependencies": {
|
|
34
35
|
"@types/node": "22.19.0",
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"
|
|
36
|
+
"@workflow/tsconfig": "5.0.0-beta.0",
|
|
37
|
+
"nitro": "^3.0.260610-beta",
|
|
38
|
+
"typescript": "^6.0.3",
|
|
39
|
+
"vite": "7.3.6",
|
|
40
|
+
"vitest": "^4.1.10"
|
|
38
41
|
},
|
|
39
42
|
"scripts": {
|
|
40
43
|
"build": "tsc",
|
|
41
44
|
"dev": "tsc --watch",
|
|
42
|
-
"clean": "tsc --build --clean && rm -rf dist"
|
|
45
|
+
"clean": "tsc --build --clean && rm -rf dist",
|
|
46
|
+
"test": "vitest run src"
|
|
43
47
|
}
|
|
44
48
|
}
|
package/dist/builders.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"builders.js","sourceRoot":"","sources":["../src/builders.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport {\n BaseBuilder,\n createBaseBuilderConfig,\n VercelBuildOutputAPIBuilder,\n} from '@workflow/builders';\nimport type { Nitro } from 'nitro/types';\nimport { join } from 'pathe';\n\n/**\n * Forward string entries from Nitro's `externals.external` config to the\n * workflow builder's esbuild `external` option. RegExp and function entries\n * are skipped since esbuild's `external` only supports literal strings.\n */\nfunction getNitroStringExternals(nitro: Nitro): string[] | undefined {\n const externals = nitro.options.externals?.external?.filter(\n (entry): entry is string => typeof entry === 'string'\n );\n return externals && externals.length > 0 ? externals : undefined;\n}\n\nexport class VercelBuilder extends VercelBuildOutputAPIBuilder {\n constructor(nitro: Nitro) {\n super({\n ...createBaseBuilderConfig({\n workingDir: nitro.options.rootDir,\n dirs: ['.'], // Different apps that use nitro have different directories\n runtime: nitro.options.workflow?.runtime,\n sourcemap: nitro.options.workflow?.sourcemap,\n externalPackages: getNitroStringExternals(nitro),\n }),\n buildTarget: 'vercel-build-output-api',\n });\n }\n override async build(): Promise<void> {\n const configPath = join(\n this.config.workingDir,\n '.vercel/output/config.json'\n );\n const originalConfig = JSON.parse(await readFile(configPath, 'utf-8'));\n await super.build();\n const newConfig = JSON.parse(await readFile(configPath, 'utf-8'));\n originalConfig.routes.unshift(...newConfig.routes);\n await writeFile(configPath, JSON.stringify(originalConfig, null, 2));\n }\n}\n\nexport class LocalBuilder extends BaseBuilder {\n #outDir: string;\n constructor(nitro: Nitro) {\n const outDir = join(nitro.options.buildDir, 'workflow');\n super({\n ...createBaseBuilderConfig({\n workingDir: nitro.options.rootDir,\n watch: nitro.options.dev,\n dirs: ['.'], // Different apps that use nitro have different directories\n sourcemap: nitro.options.workflow?.sourcemap,\n externalPackages: getNitroStringExternals(nitro),\n }),\n buildTarget: 'next', // Placeholder, not actually used\n });\n this.#outDir = outDir;\n }\n\n // Serialize concurrent build() calls so overlapping dev rebuilds don't\n // stomp on each other's temp files or partially overwrite output.\n #buildQueue: Promise<void> = Promise.resolve();\n\n override build(): Promise<void> {\n const next = this.#buildQueue.then(\n () => this.#buildOnce(),\n () => this.#buildOnce()\n );\n // Swallow rejections on the queue itself so a failed build doesn't\n // permanently reject all subsequent builds; each caller still sees\n // its own rejection via the returned promise.\n this.#buildQueue = next.catch(() => {});\n return next;\n }\n\n async #buildOnce(): Promise<void> {\n const inputFiles = await this.getInputFiles();\n await mkdir(this.#outDir, { recursive: true });\n\n // V2: The combined bundle's flow route references the steps file by\n // name in its import statement, so we build directly to final names.\n // (The V1 atomic tmp-file pattern doesn't work here because renaming\n // the steps file would leave the flow route's import stale.)\n const { manifest } = await this.createCombinedBundle({\n inputFiles,\n stepsOutfile: join(this.#outDir, 'steps.mjs'),\n flowOutfile: join(this.#outDir, 'workflows.mjs'),\n format: 'esm',\n // bundleFinalOutput: false — Nitro externalizes the workflow build dir\n // during dev, and its own rollup pipeline handles bundling for prod.\n // Using true causes \"Dynamic require of X is not supported\" errors\n // because esbuild wraps CJS require() calls in ESM output.\n bundleFinalOutput: false,\n externalizeNonSteps: true,\n // In dev, Nitro dynamically imports the generated workflow files from\n // disk, so there is no later Rollup pass to resolve externalized local\n // TypeScript imports. In prod, Nitro/Rollup handles those imports.\n bundleTransitiveLocalStepDependencies: this.config.watch,\n });\n\n await this.createWebhookBundle({\n outfile: join(this.#outDir, 'webhook.mjs'),\n bundle: false,\n });\n\n // Generate manifest\n const workflowBundlePath = join(this.#outDir, 'workflows.mjs');\n await this.createManifest({\n workflowBundlePath,\n manifestDir: this.#outDir,\n manifest,\n });\n }\n}\n"]}
|
package/dist/index.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';\nimport { fileURLToPath } from 'node:url';\nimport { workflowTransformPlugin } from '@workflow/rollup';\nimport type { Nitro, NitroModule, RollupConfig } from 'nitro/types';\nimport { join } from 'pathe';\nimport { LocalBuilder, VercelBuilder } from './builders.js';\nimport type { ModuleOptions } from './types';\n\nexport type { ModuleOptions };\n\nexport default {\n name: 'workflow/nitro',\n async setup(nitro: Nitro) {\n const isVercelDeploy =\n !nitro.options.dev && nitro.options.preset === 'vercel';\n\n // Pre-built workflow bundles directory - must be excluded from re-transformation\n const workflowBuildDir = join(nitro.options.buildDir, 'workflow');\n\n // Add transform plugin at the BEGINNING to run before other transforms\n // (especially before class property transforms that rename classes like _ClassName)\n nitro.hooks.hook('rollup:before', (_nitro: Nitro, config: RollupConfig) => {\n (config.plugins as Array<unknown>).unshift(\n workflowTransformPlugin({\n // Exclude pre-built workflow bundles from re-transformation\n // These are already processed and re-processing causes issues like\n // undefined class references when Nitro's bundler renames variables\n exclude: [workflowBuildDir],\n })\n );\n });\n\n // NOTE: Temporary workaround for debug unenv mock\n if (!nitro.options.workflow?._vite) {\n nitro.options.alias['debug'] ??= 'debug';\n }\n\n if (nitro.options.dev) {\n const workflowBuildGlob = `${join(nitro.options.buildDir, 'workflow')}/**`;\n nitro.options.watchOptions ||= {};\n const existingIgnored = nitro.options.watchOptions.ignored;\n if (!existingIgnored) {\n nitro.options.watchOptions.ignored = [workflowBuildGlob];\n } else if (Array.isArray(existingIgnored)) {\n nitro.options.watchOptions.ignored = [\n ...existingIgnored,\n workflowBuildGlob,\n ];\n } else {\n nitro.options.watchOptions.ignored = [\n existingIgnored,\n workflowBuildGlob,\n ];\n }\n }\n\n // In dev mode, force workflow SDK packages to be bundled by Nitro's\n // Rollup rather than externalized. This ensures the SWC transform\n // plugin processes files containing workflow patterns (like\n // @workflow/core/dist/runtime/run.js) and adds the classId\n // registration IIFEs needed for serialization. Without this, serde\n // classes from npm packages (like `Run`) would be externalized, the\n // SWC transform would never fire on them, and serialization would\n // fail with \"must have a static classId property\".\n //\n // We use a Rollup resolveId hook (added BEFORE the externalization\n // plugin) that intercepts workflow package imports and marks them\n // as non-external. This is more targeted than `noExternals = true`\n // which would bundle ALL dependencies and cause TDZ errors from\n // circular imports in packages like vue-bundle-renderer/h3.\n if (nitro.options.dev) {\n nitro.hooks.hook(\n 'rollup:before',\n (_nitro: Nitro, config: RollupConfig) => {\n (config.plugins as Array<unknown>).unshift({\n name: 'workflow:force-inline',\n async resolveId(\n this: { resolve: Function },\n source: string,\n importer: string | undefined,\n options: { skipSelf?: boolean }\n ) {\n if (!importer) return null;\n // Let other plugins resolve first to get the file path\n const resolved = await this.resolve(source, importer, {\n ...options,\n skipSelf: true,\n });\n if (!resolved) return null;\n if (!resolved.external) return null;\n // Force workflow packages and their internal imports\n // to be bundled (not external). We match both the\n // package specifier (e.g., `@workflow/core/runtime`)\n // and resolved file paths within workflow packages.\n const isWorkflowPkg =\n /^@?workflow(\\/|$)/.test(source) ||\n /[\\\\/]packages[\\\\/](workflow|core|serde|errors|utils|builders|rollup|ai|world|world-local|world-vercel|world-postgres|world-testing|cli|next|nitro|nuxt|vite|vitest|web|web-shared|astro|sveltekit|nest)[\\\\/]/.test(\n resolved.id\n );\n if (isWorkflowPkg) {\n // Strip file:// protocol if present — Rollup needs\n // a plain filesystem path to load the module.\n // `fileURLToPath` correctly handles Windows paths\n // (e.g., file:///C:/... -> C:\\...) and percent-decoding.\n let resolvedId = resolved.id;\n if (resolvedId.startsWith('file://')) {\n resolvedId = fileURLToPath(resolvedId);\n }\n return { id: resolvedId, external: false };\n }\n return null;\n },\n });\n }\n );\n }\n\n // Add tsConfig plugin\n if (nitro.options.workflow?.typescriptPlugin) {\n nitro.options.typescript.tsConfig ||= {};\n nitro.options.typescript.tsConfig.compilerOptions ||= {};\n nitro.options.typescript.tsConfig.compilerOptions.plugins ||= [];\n nitro.options.typescript.tsConfig.compilerOptions.plugins.push({\n name: 'workflow',\n });\n }\n\n // Generate functions for vercel build\n if (isVercelDeploy) {\n nitro.hooks.hook('compiled', async () => {\n await new VercelBuilder(nitro).build();\n });\n }\n\n // Generate local bundles for dev and local prod\n if (!isVercelDeploy) {\n const builder = new LocalBuilder(nitro);\n let isInitialBuild = true;\n\n nitro.hooks.hook('build:before', async () => {\n await builder.build();\n\n // For prod: write the manifest handler file with inlined content\n // now that the builder has generated the manifest. Rollup will\n // bundle this file into the compiled output.\n if (\n !nitro.options.dev &&\n process.env.WORKFLOW_PUBLIC_MANIFEST === '1'\n ) {\n writeManifestHandler(nitro);\n }\n });\n\n // Allows for HMR - but skip the first dev:reload since build:before already ran\n if (nitro.options.dev) {\n nitro.hooks.hook('dev:reload', async () => {\n if (isInitialBuild) {\n isInitialBuild = false;\n return;\n }\n try {\n await builder.build();\n } catch (error) {\n // During dev, files may be added/removed while the builder\n // is rebuilding (e.g., during test cleanup). Log the error\n // but don't crash — the next file change will trigger\n // another rebuild with the correct file list.\n console.warn('Warning: Workflow rebuild failed:', error);\n }\n });\n }\n\n addVirtualHandler(\n nitro,\n '/.well-known/workflow/v1/webhook/:token',\n 'workflow/webhook.mjs'\n );\n\n // V2: single combined handler for both workflow and step execution.\n // The step registrations are imported as side effects by the combined\n // handler — no separate step route needed.\n addVirtualHandler(\n nitro,\n '/.well-known/workflow/v1/flow',\n 'workflow/workflows.mjs'\n );\n\n // Expose manifest as a public HTTP route when WORKFLOW_PUBLIC_MANIFEST=1\n if (process.env.WORKFLOW_PUBLIC_MANIFEST === '1') {\n // Write a placeholder manifest-data.mjs so rollup can resolve the\n // import. It will be overwritten with the real manifest in build:before.\n // Write a placeholder handler file so rollup can resolve the path\n // during prod compilation. It will be overwritten with the real\n // manifest content by writeManifestHandler() in build:before.\n if (!nitro.options.dev) {\n const dir = join(nitro.options.buildDir, 'workflow');\n mkdirSync(dir, { recursive: true });\n const handlerPath = join(dir, 'manifest-handler.mjs');\n writeFileSync(\n handlerPath,\n 'export default async () => new Response(\"Manifest not found\", { status: 404 });\\n'\n );\n }\n addManifestHandler(nitro);\n }\n }\n },\n} satisfies NitroModule;\n\nfunction addVirtualHandler(nitro: Nitro, route: string, buildPath: string) {\n nitro.options.handlers.push({\n route,\n handler: `#${buildPath}`,\n });\n const handlerImportPath = JSON.stringify(\n join(nitro.options.buildDir, buildPath)\n );\n\n if (nitro.options.dev) {\n // Dev mode: load generated workflow bundles from disk at request time.\n // This keeps `.nitro/workflow/*.mjs` out of Nitro's own bundle graph,\n // which avoids rebuild loops and stale dependency graphs during HMR.\n // Cache-bust by file mtime so each successful rebuild loads fresh code.\n if (!nitro.routing) {\n nitro.options.virtual[`#${buildPath}`] = /* js */ `\n import { fromWebHandler } from \"h3\";\n import { statSync } from \"node:fs\";\n import { pathToFileURL } from \"node:url\";\n\n const handlerPath = ${handlerImportPath};\n let currentVersion = \"\";\n let currentImportPath = \"\";\n\n async function loadPOST() {\n const version = String(statSync(handlerPath).mtimeMs);\n if (version !== currentVersion) {\n currentVersion = version;\n currentImportPath = pathToFileURL(handlerPath).href + \"?t=\" + version;\n }\n return (await import(currentImportPath)).POST;\n }\n\n export default fromWebHandler(async (request, context) => {\n const POST = await loadPOST();\n return POST(request, context);\n });\n `;\n } else {\n nitro.options.virtual[`#${buildPath}`] = /* js */ `\n import { statSync } from \"node:fs\";\n import { pathToFileURL } from \"node:url\";\n\n const handlerPath = ${handlerImportPath};\n let currentVersion = \"\";\n let currentImportPath = \"\";\n\n async function loadPOST() {\n const version = String(statSync(handlerPath).mtimeMs);\n if (version !== currentVersion) {\n currentVersion = version;\n currentImportPath = pathToFileURL(handlerPath).href + \"?t=\" + version;\n }\n return (await import(currentImportPath)).POST;\n }\n\n export default async ({ req }) => {\n try {\n const POST = await loadPOST();\n return await POST(req);\n } catch (error) {\n console.error('Handler error:', error);\n return new Response('Internal Server Error', { status: 500 });\n }\n };\n `;\n }\n return;\n }\n\n // Keep a bare import alongside `POST`: in Nuxt + Nitro production builds\n // using `@workflow/nuxt`, importing only `POST` could drop the generated\n // step bundle's top-level registrations, so the handler loaded but steps\n // were missing at runtime.\n\n if (!nitro.routing) {\n // Nitro v2 (legacy)\n nitro.options.virtual[`#${buildPath}`] = /* js */ `\n import ${handlerImportPath};\n import { fromWebHandler } from \"h3\";\n import { POST } from ${handlerImportPath};\n export default fromWebHandler(POST);\n `;\n } else {\n // Nitro v3+ (native web handlers)\n nitro.options.virtual[`#${buildPath}`] = /* js */ `\n import ${handlerImportPath};\n import { POST } from ${handlerImportPath};\n export default async ({ req }) => {\n try {\n return await POST(req);\n } catch (error) {\n console.error('Handler error:', error);\n return new Response('Internal Server Error', { status: 500 });\n }\n };\n `;\n }\n}\n\nconst MANIFEST_VIRTUAL_ID = '#workflow/manifest-handler';\n\nfunction addManifestHandler(nitro: Nitro) {\n const route = '/.well-known/workflow/v1/manifest.json';\n const manifestPath = join(nitro.options.buildDir, 'workflow/manifest.json');\n const handlerPath = join(\n nitro.options.buildDir,\n 'workflow/manifest-handler.mjs'\n );\n\n if (nitro.options.dev) {\n // Dev mode: use a virtual handler that reads the manifest from disk at\n // request time. The absolute path is valid because we're on the build machine.\n nitro.options.handlers.push({ route, handler: MANIFEST_VIRTUAL_ID });\n nitro.options.virtual[MANIFEST_VIRTUAL_ID] = !nitro.routing\n ? /* js */ `\n import { fromWebHandler } from \"h3\";\n import { readFileSync } from \"node:fs\";\n function GET() {\n try {\n const manifest = readFileSync(${JSON.stringify(manifestPath)}, \"utf-8\");\n return new Response(manifest, {\n headers: { \"content-type\": \"application/json\" },\n });\n } catch {\n return new Response(\"Manifest not found\", { status: 404 });\n }\n }\n export default fromWebHandler(GET);\n `\n : /* js */ `\n import { readFileSync } from \"node:fs\";\n export default async () => {\n try {\n const manifest = readFileSync(${JSON.stringify(manifestPath)}, \"utf-8\");\n return new Response(manifest, {\n headers: { \"content-type\": \"application/json\" },\n });\n } catch {\n return new Response(\"Manifest not found\", { status: 404 });\n }\n };\n `;\n } else {\n // Prod mode: register a physical handler file that will be written by\n // writeManifestHandler() after the builder generates the manifest.\n // This file is bundled by rollup into the compiled output.\n nitro.options.handlers.push({ route, handler: handlerPath });\n }\n}\n\n/**\n * Writes a physical manifest handler file with the manifest content inlined.\n * Must be called after the builder generates the manifest (during build:before)\n * and before Nitro compiles the bundle with rollup.\n */\nfunction writeManifestHandler(nitro: Nitro) {\n const manifestPath = join(nitro.options.buildDir, 'workflow/manifest.json');\n const handlerPath = join(\n nitro.options.buildDir,\n 'workflow/manifest-handler.mjs'\n );\n const dir = join(nitro.options.buildDir, 'workflow');\n mkdirSync(dir, { recursive: true });\n\n try {\n const manifestContent = readFileSync(manifestPath, 'utf-8');\n JSON.parse(manifestContent); // validate\n\n const handlerCode = !nitro.routing\n ? `import { fromWebHandler } from \"h3\";\nconst manifest = ${JSON.stringify(manifestContent)};\nexport default fromWebHandler(() => new Response(manifest, {\n headers: { \"content-type\": \"application/json\" },\n}));\n`\n : `const manifest = ${JSON.stringify(manifestContent)};\nexport default async () => new Response(manifest, {\n headers: { \"content-type\": \"application/json\" },\n});\n`;\n writeFileSync(handlerPath, handlerCode);\n } catch {\n // Write a 404 fallback handler\n const fallback = !nitro.routing\n ? `import { fromWebHandler } from \"h3\";\nexport default fromWebHandler(() => new Response(\"Manifest not found\", { status: 404 }));\n`\n : `export default async () => new Response(\"Manifest not found\", { status: 404 });\n`;\n writeFileSync(handlerPath, fallback);\n }\n}\n"]}
|
package/dist/types.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"","sourcesContent":["export interface ModuleOptions {\n /** @internal */\n _vite?: boolean;\n\n /**\n * Directories to scan for workflows and steps.\n *\n * By default, `workflows/` directory will be scanned from root and all layer source dirs.\n */\n dirs?: string[];\n\n /**\n * Enable workflow TypeScript plugin in generated tsconfig.json\n * @default false\n */\n typescriptPlugin?: boolean;\n\n /**\n * Node.js runtime version for Vercel Functions.\n * @example \"nodejs22.x\"\n * @example \"nodejs24.x\"\n */\n runtime?: string;\n\n /**\n * Controls how source maps are emitted for workflow bundles. Accepts the\n * same values as esbuild's `sourcemap` option: `true`/`'inline'` (default\n * for step/workflow bundles), `'linked'`, `'external'`, `'both'`, or\n * `false` to omit source maps.\n *\n * Set to `false` for smaller function bundles — useful for staying under\n * the Vercel 250MB function size limit — at the cost of stack traces that\n * point at generated code instead of your source files.\n *\n * Can also be set via the `WORKFLOW_SOURCEMAP` environment variable.\n */\n sourcemap?: boolean | 'inline' | 'linked' | 'external' | 'both';\n}\n\ndeclare module 'nitro/types' {\n interface NitroOptions {\n workflow?: ModuleOptions;\n }\n}\n\n// @ts-expect-error (legacy)\ndeclare module 'nitropack' {\n interface NitroOptions {\n workflow?: ModuleOptions;\n }\n}\n"]}
|
package/dist/vite.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"vite.js","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"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","sourcesContent":["import { createBuildQueue } from '@workflow/builders';\nimport { workflowTransformPlugin } from '@workflow/rollup';\nimport { workflowHotUpdatePlugin } from '@workflow/vite';\nimport type { Nitro } from 'nitro/types';\nimport type {} from 'nitro/vite';\nimport { join } from 'pathe';\nimport type { Plugin } from 'vite';\nimport { LocalBuilder } from './builders.js';\nimport type { ModuleOptions } from './index.js';\nimport nitroModule from './index.js';\n\nexport function workflow(options?: ModuleOptions): Plugin[] {\n let builder: LocalBuilder;\n let workflowBuildDir: string;\n const enqueue = createBuildQueue();\n\n // Create a lazy transform plugin that excludes the workflow build directory\n // The exclusion path is set during nitro setup, so we need to defer plugin creation\n const lazyTransformPlugin: Plugin = {\n name: 'workflow:transform',\n transform(code, id) {\n // Delegate to the actual transform plugin with exclusion\n // workflowBuildDir is set during nitro setup before transforms run\n const plugin = workflowTransformPlugin({\n exclude: workflowBuildDir ? [workflowBuildDir] : [],\n });\n return (plugin.transform as Function)?.call(this, code, id);\n },\n };\n\n return [\n lazyTransformPlugin,\n {\n name: 'workflow:nitro',\n nitro: {\n setup: (nitro: Nitro) => {\n // Capture the workflow build directory for exclusion\n workflowBuildDir = join(nitro.options.buildDir, 'workflow');\n nitro.options.workflow = {\n ...nitro.options.workflow,\n ...options,\n _vite: true,\n };\n if (nitro.options.dev) {\n builder = new LocalBuilder(nitro);\n }\n return nitroModule.setup(nitro);\n },\n },\n // NOTE: This is a workaround because Nitro passes the 404 requests to the dev server to handle.\n // For workflow routes, we override to send an empty body to prevent Hono/Vite's SPA fallback.\n configureServer(server) {\n // Add middleware to intercept 404s on workflow routes before Vite's SPA fallback\n return () => {\n server.middlewares.use((req, res, next) => {\n // Only handle workflow webhook routes\n if (!req.url?.startsWith('/.well-known/workflow/v1/')) {\n return next();\n }\n\n // Wrap writeHead to ensure we send empty body for 404s\n const originalWriteHead = res.writeHead;\n res.writeHead = function (this: typeof res, ...args: any[]) {\n const statusCode = typeof args[0] === 'number' ? args[0] : 200;\n\n // NOTE: Workaround because Nitro passes 404 requests to the vite to handle.\n // Causes `webhook route with invalid token` test to fail.\n // For 404s on workflow routes, ensure we're sending the right headers\n if (statusCode === 404) {\n // Set content-length to 0 to prevent Vite from overriding\n res.setHeader('Content-Length', '0');\n }\n\n // @ts-expect-error - Complex overload signature\n return originalWriteHead.apply(this, args);\n } as any;\n\n next();\n });\n };\n },\n },\n workflowHotUpdatePlugin({\n builder: () => builder,\n enqueue,\n }),\n ];\n}\n"]}
|