@workflow/nitro 5.0.0-beta.3 → 5.0.0-beta.30
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.map +1 -1
- package/dist/builders.js +49 -65
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +336 -54
- package/dist/types.d.ts +13 -0
- 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 +34 -4
- package/package.json +9 -8
- 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.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../src/builders.ts"],"names":[],"mappings":"
|
|
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;IAoBf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAkDhC"}
|
package/dist/builders.js
CHANGED
|
@@ -1,23 +1,27 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { mkdir, readFile, rename, unlink, writeFile } from 'node:fs/promises';
|
|
1
|
+
import { mkdir, readFile, writeFile } from 'node:fs/promises';
|
|
3
2
|
import { BaseBuilder, createBaseBuilderConfig, VercelBuildOutputAPIBuilder, } from '@workflow/builders';
|
|
4
3
|
import { join } from 'pathe';
|
|
5
|
-
/**
|
|
6
|
-
* Forward string entries from Nitro's `externals.external` config to the
|
|
7
|
-
* workflow builder's esbuild `external` option. RegExp and function entries
|
|
8
|
-
* are skipped since esbuild's `external` only supports literal strings.
|
|
9
|
-
*/
|
|
10
4
|
function getNitroStringExternals(nitro) {
|
|
11
|
-
const
|
|
12
|
-
|
|
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 ?? ['.'];
|
|
13
15
|
}
|
|
14
16
|
export class VercelBuilder extends VercelBuildOutputAPIBuilder {
|
|
15
17
|
constructor(nitro) {
|
|
16
18
|
super({
|
|
17
19
|
...createBaseBuilderConfig({
|
|
18
20
|
workingDir: nitro.options.rootDir,
|
|
19
|
-
|
|
21
|
+
projectRoot: getNitroProjectRoot(nitro),
|
|
22
|
+
dirs: getNitroWorkflowDirs(nitro),
|
|
20
23
|
runtime: nitro.options.workflow?.runtime,
|
|
24
|
+
sourcemap: nitro.options.workflow?.sourcemap,
|
|
21
25
|
externalPackages: getNitroStringExternals(nitro),
|
|
22
26
|
}),
|
|
23
27
|
buildTarget: 'vercel-build-output-api',
|
|
@@ -39,8 +43,10 @@ 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),
|
|
49
|
+
sourcemap: nitro.options.workflow?.sourcemap,
|
|
44
50
|
externalPackages: getNitroStringExternals(nitro),
|
|
45
51
|
}),
|
|
46
52
|
buildTarget: 'next', // Placeholder, not actually used
|
|
@@ -61,59 +67,37 @@ export class LocalBuilder extends BaseBuilder {
|
|
|
61
67
|
async #buildOnce() {
|
|
62
68
|
const inputFiles = await this.getInputFiles();
|
|
63
69
|
await mkdir(this.#outDir, { recursive: true });
|
|
64
|
-
//
|
|
65
|
-
//
|
|
66
|
-
//
|
|
67
|
-
//
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
const manifest = {
|
|
96
|
-
steps: { ...stepsManifest.steps, ...workflowsManifest.steps },
|
|
97
|
-
workflows: {
|
|
98
|
-
...stepsManifest.workflows,
|
|
99
|
-
...workflowsManifest.workflows,
|
|
100
|
-
},
|
|
101
|
-
classes: { ...stepsManifest.classes, ...workflowsManifest.classes },
|
|
102
|
-
};
|
|
103
|
-
// Generate manifest
|
|
104
|
-
const workflowBundlePath = join(this.#outDir, 'workflows.mjs');
|
|
105
|
-
await this.createManifest({
|
|
106
|
-
workflowBundlePath,
|
|
107
|
-
manifestDir: this.#outDir,
|
|
108
|
-
manifest,
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
finally {
|
|
112
|
-
// Clean up temporary files on success or failure
|
|
113
|
-
await unlink(workflowsTmpFile).catch(() => { });
|
|
114
|
-
await unlink(stepsTmpFile).catch(() => { });
|
|
115
|
-
await unlink(webhookTmpFile).catch(() => { });
|
|
116
|
-
}
|
|
70
|
+
// V2: The combined bundle's flow route references the steps file by
|
|
71
|
+
// name in its import statement, so we build directly to final names.
|
|
72
|
+
// (The V1 atomic tmp-file pattern doesn't work here because renaming
|
|
73
|
+
// the steps file would leave the flow route's import stale.)
|
|
74
|
+
const { manifest } = await this.createCombinedBundle({
|
|
75
|
+
inputFiles,
|
|
76
|
+
stepsOutfile: join(this.#outDir, 'steps.mjs'),
|
|
77
|
+
flowOutfile: join(this.#outDir, 'workflows.mjs'),
|
|
78
|
+
format: 'esm',
|
|
79
|
+
// bundleFinalOutput: false — Nitro externalizes the workflow build dir
|
|
80
|
+
// during dev, and its own rollup pipeline handles bundling for prod.
|
|
81
|
+
// Using true causes "Dynamic require of X is not supported" errors
|
|
82
|
+
// because esbuild wraps CJS require() calls in ESM output.
|
|
83
|
+
bundleFinalOutput: false,
|
|
84
|
+
externalizeNonSteps: true,
|
|
85
|
+
// In dev, Nitro dynamically imports the generated workflow files from
|
|
86
|
+
// disk, so there is no later Rollup pass to resolve externalized local
|
|
87
|
+
// TypeScript imports. In prod, Nitro/Rollup handles those imports.
|
|
88
|
+
bundleTransitiveLocalStepDependencies: this.config.watch,
|
|
89
|
+
});
|
|
90
|
+
await this.createWebhookBundle({
|
|
91
|
+
outfile: join(this.#outDir, 'webhook.mjs'),
|
|
92
|
+
bundle: false,
|
|
93
|
+
});
|
|
94
|
+
// Generate manifest
|
|
95
|
+
const workflowBundlePath = join(this.#outDir, 'workflows.mjs');
|
|
96
|
+
await this.createManifest({
|
|
97
|
+
workflowBundlePath,
|
|
98
|
+
manifestDir: this.#outDir,
|
|
99
|
+
manifest,
|
|
100
|
+
});
|
|
117
101
|
}
|
|
118
102
|
}
|
|
119
|
-
//# sourceMappingURL=builders.js.map
|
|
103
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYnVpbGRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUQsT0FBTyxFQUNMLFdBQVcsRUFDWCx1QkFBdUIsRUFDdkIsMkJBQTJCLEdBQzVCLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE9BQU8sQ0FBQztBQWE3QixTQUFTLHVCQUF1QixDQUFDLEtBQVk7SUFDM0MsTUFBTSxRQUFRLEdBQUksS0FBSyxDQUFDLE9BQW1DLENBQUMsU0FBUztRQUNuRSxFQUFFLFFBQVEsQ0FBQztJQUNiLE1BQU0sT0FBTyxHQUFHLFFBQVEsRUFBRSxNQUFNLENBQzlCLENBQUMsS0FBSyxFQUFtQixFQUFFLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUN0RCxDQUFDO0lBQ0YsT0FBTyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzdELENBQUM7QUFFRCxTQUFTLG1CQUFtQixDQUFDLEtBQVk7SUFDdkMsT0FBTyxLQUFLLENBQUMsT0FBTyxDQUFDLFlBQVksSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQztBQUM3RCxDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxLQUFZO0lBQ3hDLE9BQU8sS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDL0MsQ0FBQztBQUVELE1BQU0sT0FBTyxhQUFjLFNBQVEsMkJBQTJCO0lBQzVELFlBQVksS0FBWTtRQUN0QixLQUFLLENBQUM7WUFDSixHQUFHLHVCQUF1QixDQUFDO2dCQUN6QixVQUFVLEVBQUUsS0FBSyxD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RUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBRS9DLG9FQUFvRTtRQUNwRSxxRUFBcUU7UUFDckUscUVBQXFFO1FBQ3JFLDZEQUE2RDtRQUM3RCxNQUFNLEVBQUUsUUFBUSxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsb0JBQW9CLENBQUM7WUFDbkQsVUFBVTtZQUNWLFlBQVksRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUM7WUFDN0MsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQztZQUNoRCxNQUFNLEVBQUUsS0FBSztZQUNiLHVFQUF1RTtZQUN2RSxxRUFBcUU7WUFDckUsbUVBQW1FO1lBQ25FLDJEQUEyRDtZQUMzRCxpQkFBaUIsRUFBRSxLQUFLO1lBQ3hCLG1CQUFtQixFQUFFLElBQUk7WUFDekIsc0VBQXNFO1lBQ3RFLHVFQUF1RTtZQUN2RSxtRUFBbUU7WUFDbkUscUNBQXFDLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLO1NBQ3pELENBQUMsQ0FBQztRQUVILE1BQU0sSUFBSSxDQUFDLG1CQUFtQixDQUFDO1lBQzdCLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxhQUFhLENBQUM7WUFDMUMsTUFBTSxFQUFFLEtBQUs7U0FDZCxDQUFDLENBQUM7UUFFSCxvQkFBb0I7UUFDcEIsTUFBTSxrQkFBa0IsR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxlQUFlLENBQUMsQ0FBQztRQUMvRCxNQUFNLElBQUksQ0FBQyxjQUFjLENBQUM7WUFDeEIsa0JBQWtCO1lBQ2xCLFdBQVcsRUFBRSxJQUFJLENBQUMsT0FBTztZQUN6QixRQUFRO1NBQ1QsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWtkaXIsIHJlYWRGaWxlLCB3cml0ZUZpbGUgfSBmcm9tICdub2RlOmZzL3Byb21pc2VzJztcbmltcG9ydCB7XG4gIEJhc2VCdWlsZGVyLFxuICBjcmVhdGVCYXNlQnVpbGRlckNvbmZpZyxcbiAgVmVyY2VsQnVpbGRPdXRwdXRBUElCdWlsZGVyLFxufSBmcm9tICdAd29ya2Zsb3cvYnVpbGRlcnMnO1xuaW1wb3J0IHR5cGUgeyBOaXRybyB9IGZyb20gJ25pdHJvL3R5cGVzJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoZSc7XG5cbi8qKlxuICogRm9yd2FyZCBzdHJpbmcgZW50cmllcyBmcm9tIE5pdHJvJ3MgYGV4dGVybmFscy5leHRlcm5hbGAgY29uZmlnIHRvIHRoZVxuICogd29ya2Zsb3cgYnVpbGRlcidzIGVzYnVpbGQgYGV4dGVybmFsYCBvcHRpb24uIFJlZ0V4cCBhbmQgZnVuY3Rpb24gZW50cmllc1xuICogYXJlIHNraXBwZWQgc2luY2UgZXNidWlsZCdzIGBleHRlcm5hbGAgb25seSBzdXBwb3J0cyBsaXRlcmFsIHN0cmluZ3MuXG4gKlxuICogTm90ZTogYGV4dGVybmFscy5leHRlcm5hbGAgaXMgb24gTml0cm8gdjIncyBvcHRpb25zIHNoYXBlIOKAlCB2MyBkcm9wcGVkIGl0XG4gKiBpbiBmYXZvdXIgb2YgYG5vRXh0ZXJuYWxzYC4gUmVhZGluZyBpdCB0aHJvdWdoIGEgdjItc2hhcGVkIHZpZXcgbGV0cyB1c1xuICogc3RpbGwgcGljayBpdCB1cCBvbiB2MiBzZXR1cHM7IG9uIHYzIHRoZSBjaGFpbmVkIG9wdGlvbmFsIGFjY2VzcyBqdXN0XG4gKiByZXR1cm5zIHVuZGVmaW5lZC5cbiAqL1xudHlwZSBOaXRyb1YyRXh0ZXJuYWxzT3B0aW9ucyA9IHsgZXh0ZXJuYWxzPzogeyBleHRlcm5hbD86IHVua25vd25bXSB9IH07XG5mdW5jdGlvbiBnZXROaXRyb1N0cmluZ0V4dGVybmFscyhuaXRybzogTml0cm8pOiBzdHJpbmdbXSB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGV4dGVybmFsID0gKG5pdHJvLm9wdGlvbnMgYXMgTml0cm9WMkV4dGVybmFsc09wdGlvbnMpLmV4dGVybmFsc1xuICAgID8uZXh0ZXJuYWw7XG4gIGNvbnN0IHN0cmluZ3MgPSBleHRlcm5hbD8uZmlsdGVyKFxuICAgIChlbnRyeSk6IGVudHJ5IGlzIHN0cmluZyA9PiB0eXBlb2YgZW50cnkgPT09ICdzdHJpbmcnXG4gICk7XG4gIHJldHVybiBzdHJpbmdzICYmIHN0cmluZ3MubGVuZ3RoID4gMCA/IHN0cmluZ3MgOiB1bmRlZmluZWQ7XG59XG5cbmZ1bmN0aW9uIGdldE5pdHJvUHJvamVjdFJvb3Qobml0cm86IE5pdHJvKTogc3RyaW5nIHtcbiAgcmV0dXJuIG5pdHJvLm9wdGlvbnMud29ya3NwYWNlRGlyID8/IG5pdHJvLm9wdGlvbnMucm9vdERpcjtcbn1cblxuZnVuY3Rpb24gZ2V0Tml0cm9Xb3JrZmxvd0RpcnMobml0cm86IE5pdHJvKTogc3RyaW5nW10ge1xuICByZXR1cm4gbml0cm8ub3B0aW9ucy53b3JrZmxvdz8uZGlycyA/PyBbJy4nXTtcbn1cblxuZXhwb3J0IGNsYXNzIFZlcmNlbEJ1aWxkZXIgZXh0ZW5kcyBWZXJjZWxCdWlsZE91dHB1dEFQSUJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcihuaXRybzogTml0cm8pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5jcmVhdGVCYXNlQnVpbGRlckNvbmZpZyh7XG4gICAgICAgIHdvcmtpbmdEaXI6IG5pdHJvLm9wdGlvbnMucm9vdERpcixcbiAgICAgICAgcHJvamVjdFJvb3Q6IGdldE5pdHJvUHJvamVjdFJvb3Qobml0cm8pLFxuICAgICAgICBkaXJzOiBnZXROaXRyb1dvcmtmbG93RGlycyhuaXRybyksXG4gICAgICAgIHJ1bnRpbWU6IG5pdHJvLm9wdGlvbnMud29ya2Zsb3c/LnJ1bnRpbWUsXG4gICAgICAgIHNvdXJjZW1hcDogbml0cm8ub3B0aW9ucy53b3JrZmxvdz8uc291cmNlbWFwLFxuICAgICAgICBleHRlcm5hbFBhY2thZ2VzOiBnZXROaXRyb1N0cmluZ0V4dGVybmFscyhuaXRybyksXG4gICAgICB9KSxcbiAgICAgIGJ1aWxkVGFyZ2V0OiAndmVyY2VsLWJ1aWxkLW91dHB1dC1hcGknLFxuICAgIH0pO1xuICB9XG4gIG92ZXJyaWRlIGFzeW5jIGJ1aWxkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKFxuICAgICAgdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICcudmVyY2VsL291dHB1dC9jb25maWcuanNvbidcbiAgICApO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uZmlnID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShjb25maWdQYXRoLCAndXRmLTgnKSk7XG4gICAgYXdhaXQgc3VwZXIuYnVpbGQoKTtcbiAgICBjb25zdCBuZXdDb25maWcgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGNvbmZpZ1BhdGgsICd1dGYtOCcpKTtcbiAgICBvcmlnaW5hbENvbmZpZy5yb3V0ZXMudW5zaGlmdCguLi5uZXdDb25maWcucm91dGVzKTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoY29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkob3JpZ2luYWxDb25maWcsIG51bGwsIDIpKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTG9jYWxCdWlsZGVyIGV4dGVuZHMgQmFzZUJ1aWxkZXIge1xuICAjb3V0RGlyOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKG5pdHJvOiBOaXRybykge1xuICAgIGNvbnN0IG91dERpciA9IGpvaW4obml0cm8ub3B0aW9ucy5idWlsZERpciwgJ3dvcmtmbG93Jyk7XG4gICAgc3VwZXIoe1xuICAgICAgLi4uY3JlYXRlQmFzZUJ1aWxkZXJDb25maWcoe1xuICAgICAgICB3b3JraW5nRGlyOiBuaXRyby5vcHRpb25zLnJvb3REaXIsXG4gICAgICAgIHByb2plY3RSb290OiBnZXROaXRyb1Byb2plY3RSb290KG5pdHJvKSxcbiAgICAgICAgd2F0Y2g6IG5pdHJvLm9wdGlvbnMuZGV2LFxuICAgICAgICBkaXJzOiBnZXROaXRyb1dvcmtmbG93RGlycyhuaXRybyksXG4gICAgICAgIHNvdXJjZW1hcDogbml0cm8ub3B0aW9ucy53b3JrZmxvdz8uc291cmNlbWFwLFxuICAgICAgICBleHRlcm5hbFBhY2thZ2VzOiBnZXROaXRyb1N0cmluZ0V4dGVybmFscyhuaXRybyksXG4gICAgICB9KSxcbiAgICAgIGJ1aWxkVGFyZ2V0OiAnbmV4dCcsIC8vIFBsYWNlaG9sZGVyLCBub3QgYWN0dWFsbHkgdXNlZFxuICAgIH0pO1xuICAgIHRoaXMuI291dERpciA9IG91dERpcjtcbiAgfVxuXG4gIC8vIFNlcmlhbGl6ZSBjb25jdXJyZW50IGJ1aWxkKCkgY2FsbHMgc28gb3ZlcmxhcHBpbmcgZGV2IHJlYnVpbGRzIGRvbid0XG4gIC8vIHN0b21wIG9uIGVhY2ggb3RoZXIncyB0ZW1wIGZpbGVzIG9yIHBhcnRpYWxseSBvdmVyd3JpdGUgb3V0cHV0LlxuICAjYnVpbGRRdWV1ZTogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIG92ZXJyaWRlIGJ1aWxkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLiNidWlsZFF1ZXVlLnRoZW4oXG4gICAgICAoKSA9PiB0aGlzLiNidWlsZE9uY2UoKSxcbiAgICAgICgpID0+IHRoaXMuI2J1aWxkT25jZSgpXG4gICAgKTtcbiAgICAvLyBTd2FsbG93IHJlamVjdGlvbnMgb24gdGhlIHF1ZXVlIGl0c2VsZiBzbyBhIGZhaWxlZCBidWlsZCBkb2Vzbid0XG4gICAgLy8gcGVybWFuZW50bHkgcmVqZWN0IGFsbCBzdWJzZXF1ZW50IGJ1aWxkczsgZWFjaCBjYWxsZXIgc3RpbGwgc2Vlc1xuICAgIC8vIGl0cyBvd24gcmVqZWN0aW9uIHZpYSB0aGUgcmV0dXJuZWQgcHJvbWlzZS5cbiAgICB0aGlzLiNidWlsZFF1ZXVlID0gbmV4dC5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cblxuICBhc3luYyAjYnVpbGRPbmNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlucHV0RmlsZXMgPSBhd2FpdCB0aGlzLmdldElucHV0RmlsZXMoKTtcbiAgICBhd2FpdCBta2Rpcih0aGlzLiNvdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gVjI6IFRoZSBjb21iaW5lZCBidW5kbGUncyBmbG93IHJvdXRlIHJlZmVyZW5jZXMgdGhlIHN0ZXBzIGZpbGUgYnlcbiAgICAvLyBuYW1lIGluIGl0cyBpbXBvcnQgc3RhdGVtZW50LCBzbyB3ZSBidWlsZCBkaXJlY3RseSB0byBmaW5hbCBuYW1lcy5cbiAgICAvLyAoVGhlIFYxIGF0b21pYyB0bXAtZmlsZSBwYXR0ZXJuIGRvZXNuJ3Qgd29yayBoZXJlIGJlY2F1c2UgcmVuYW1pbmdcbiAgICAvLyB0aGUgc3RlcHMgZmlsZSB3b3VsZCBsZWF2ZSB0aGUgZmxvdyByb3V0ZSdzIGltcG9ydCBzdGFsZS4pXG4gICAgY29uc3QgeyBtYW5pZmVzdCB9ID0gYXdhaXQgdGhpcy5jcmVhdGVDb21iaW5lZEJ1bmRsZSh7XG4gICAgICBpbnB1dEZpbGVzLFxuICAgICAgc3RlcHNPdXRmaWxlOiBqb2luKHRoaXMuI291dERpciwgJ3N0ZXBzLm1qcycpLFxuICAgICAgZmxvd091dGZpbGU6IGpvaW4odGhpcy4jb3V0RGlyLCAnd29ya2Zsb3dzLm1qcycpLFxuICAgICAgZm9ybWF0OiAnZXNtJyxcbiAgICAgIC8vIGJ1bmRsZUZpbmFsT3V0cHV0OiBmYWxzZSDigJQgTml0cm8gZXh0ZXJuYWxpemVzIHRoZSB3b3JrZmxvdyBidWlsZCBkaXJcbiAgICAgIC8vIGR1cmluZyBkZXYsIGFuZCBpdHMgb3duIHJvbGx1cCBwaXBlbGluZSBoYW5kbGVzIGJ1bmRsaW5nIGZvciBwcm9kLlxuICAgICAgLy8gVXNpbmcgdHJ1ZSBjYXVzZXMgXCJEeW5hbWljIHJlcXVpcmUgb2YgWCBpcyBub3Qgc3VwcG9ydGVkXCIgZXJyb3JzXG4gICAgICAvLyBiZWNhdXNlIGVzYnVpbGQgd3JhcHMgQ0pTIHJlcXVpcmUoKSBjYWxscyBpbiBFU00gb3V0cHV0LlxuICAgICAgYnVuZGxlRmluYWxPdXRwdXQ6IGZhbHNlLFxuICAgICAgZXh0ZXJuYWxpemVOb25TdGVwczogdHJ1ZSxcbiAgICAgIC8vIEluIGRldiwgTml0cm8gZHluYW1pY2FsbHkgaW1wb3J0cyB0aGUgZ2VuZXJhdGVkIHdvcmtmbG93IGZpbGVzIGZyb21cbiAgICAgIC8vIGRpc2ssIHNvIHRoZXJlIGlzIG5vIGxhdGVyIFJvbGx1cCBwYXNzIHRvIHJlc29sdmUgZXh0ZXJuYWxpemVkIGxvY2FsXG4gICAgICAvLyBUeXBlU2NyaXB0IGltcG9ydHMuIEluIHByb2QsIE5pdHJvL1JvbGx1cCBoYW5kbGVzIHRob3NlIGltcG9ydHMuXG4gICAgICBidW5kbGVUcmFuc2l0aXZlTG9jYWxTdGVwRGVwZW5kZW5jaWVzOiB0aGlzLmNvbmZpZy53YXRjaCxcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMuY3JlYXRlV2ViaG9va0J1bmRsZSh7XG4gICAgICBvdXRmaWxlOiBqb2luKHRoaXMuI291dERpciwgJ3dlYmhvb2subWpzJyksXG4gICAgICBidW5kbGU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gR2VuZXJhdGUgbWFuaWZlc3RcbiAgICBjb25zdCB3b3JrZmxvd0J1bmRsZVBhdGggPSBqb2luKHRoaXMuI291dERpciwgJ3dvcmtmbG93cy5tanMnKTtcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZU1hbmlmZXN0KHtcbiAgICAgIHdvcmtmbG93QnVuZGxlUGF0aCxcbiAgICAgIG1hbmlmZXN0RGlyOiB0aGlzLiNvdXREaXIsXG4gICAgICBtYW5pZmVzdCxcbiAgICB9KTtcbiAgfVxufVxuIl19
|
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":"AAYA,OAAO,KAAK,EAAE,KAAK,EAA6B,MAAM,aAAa,CAAC;AAGpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,YAAY,EAAE,aAAa,EAAE,CAAC;;;iBAiKT,KAAK;;AAF1B,wBAyOwB"}
|
package/dist/index.js
CHANGED
|
@@ -1,14 +1,156 @@
|
|
|
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 { ensureWorkflowTargetWorldEnv, resolveWorkflowCoreRuntimeAlias, WORKFLOW_NODE_COMPAT_BANNER, WORKFLOW_OPTIONAL_PG_NATIVE_ALIAS, WORKFLOW_QUEUE_TRIGGER, WORKFLOW_WORLD_TARGET_MODULE, } 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 = WORKFLOW_NODE_COMPAT_BANNER;
|
|
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
|
+
}
|
|
61
|
+
const WORKFLOW_INLINE_PACKAGES = new Set([
|
|
62
|
+
'workflow',
|
|
63
|
+
'core',
|
|
64
|
+
'serde',
|
|
65
|
+
'errors',
|
|
66
|
+
'utils',
|
|
67
|
+
'builders',
|
|
68
|
+
'rollup',
|
|
69
|
+
'ai',
|
|
70
|
+
'world',
|
|
71
|
+
]);
|
|
72
|
+
function getWorkflowPackageName(source) {
|
|
73
|
+
const packageSpecifier = source.match(/^@workflow\/([^/]+)/);
|
|
74
|
+
if (packageSpecifier) {
|
|
75
|
+
return packageSpecifier[1] ?? null;
|
|
76
|
+
}
|
|
77
|
+
if (source === 'workflow' || source.startsWith('workflow/')) {
|
|
78
|
+
return 'workflow';
|
|
79
|
+
}
|
|
80
|
+
const packagePath = source.match(/[\\/]packages[\\/]([^\\/]+)/);
|
|
81
|
+
return packagePath?.[1] ?? null;
|
|
82
|
+
}
|
|
83
|
+
function createWorkflowForceInlinePlugin(workflowTargetWorld, workflowTargetWorldAlias) {
|
|
84
|
+
const targetWorldPackage = getWorkflowPackageName(workflowTargetWorld);
|
|
85
|
+
return {
|
|
86
|
+
name: 'workflow:force-inline',
|
|
87
|
+
// `order: 'pre'` is required: Nitro's `nitro:externals` plugin
|
|
88
|
+
// uses `order: 'pre'` for its resolveId hook and spreads our
|
|
89
|
+
// resolution result while forcing `external: true`. Without
|
|
90
|
+
// `pre` here, our `external: false` decision gets overwritten
|
|
91
|
+
// and `@workflow/*` imports end up externalized in the bundle.
|
|
92
|
+
resolveId: {
|
|
93
|
+
order: 'pre',
|
|
94
|
+
async handler(source, importer, options) {
|
|
95
|
+
if (source === WORKFLOW_WORLD_TARGET_MODULE) {
|
|
96
|
+
return { id: workflowTargetWorldAlias, external: false };
|
|
97
|
+
}
|
|
98
|
+
if (!importer)
|
|
99
|
+
return null;
|
|
100
|
+
// Match workflow package specifiers OR direct paths into
|
|
101
|
+
// packages/<name>/. Bail out early on non-workflow imports
|
|
102
|
+
// so we don't intercept the rest of the resolution chain.
|
|
103
|
+
const packageName = getWorkflowPackageName(source);
|
|
104
|
+
const isWorkflowPkg = packageName != null &&
|
|
105
|
+
(WORKFLOW_INLINE_PACKAGES.has(packageName) ||
|
|
106
|
+
packageName === targetWorldPackage);
|
|
107
|
+
if (!isWorkflowPkg)
|
|
108
|
+
return null;
|
|
109
|
+
// Resolve via other resolvers, skipping ourselves so we
|
|
110
|
+
// get a path. We don't gate on `resolved.external` because
|
|
111
|
+
// `nitro:externals` spreads our result and overrides
|
|
112
|
+
// `external: true` regardless of what we return — we want
|
|
113
|
+
// to win that race by returning first under `order: 'pre'`.
|
|
114
|
+
const resolved = await this.resolve(source, importer, {
|
|
115
|
+
...options,
|
|
116
|
+
skipSelf: true,
|
|
117
|
+
});
|
|
118
|
+
if (!resolved)
|
|
119
|
+
return null;
|
|
120
|
+
let resolvedId = resolved.id;
|
|
121
|
+
// Strip file:// protocol if present — Rollup needs a plain
|
|
122
|
+
// filesystem path to load the module. `fileURLToPath`
|
|
123
|
+
// correctly handles Windows paths (e.g., file:///C:/...
|
|
124
|
+
// -> C:\...) and percent-decoding.
|
|
125
|
+
if (resolvedId.startsWith('file://')) {
|
|
126
|
+
resolvedId = fileURLToPath(resolvedId);
|
|
127
|
+
}
|
|
128
|
+
return { id: resolvedId, external: false };
|
|
129
|
+
},
|
|
130
|
+
},
|
|
131
|
+
};
|
|
132
|
+
}
|
|
133
|
+
function createResolverRequire(nitro) {
|
|
134
|
+
return createRequire(join(nitro.options.rootDir, 'package.json'));
|
|
135
|
+
}
|
|
136
|
+
function resolveWorkflowTargetWorldAlias(nitro, targetWorld) {
|
|
137
|
+
try {
|
|
138
|
+
return createResolverRequire(nitro).resolve(targetWorld);
|
|
139
|
+
}
|
|
140
|
+
catch {
|
|
141
|
+
return targetWorld;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
6
144
|
export default {
|
|
7
145
|
name: 'workflow/nitro',
|
|
8
146
|
async setup(nitro) {
|
|
9
147
|
const isVercelDeploy = !nitro.options.dev && nitro.options.preset === 'vercel';
|
|
148
|
+
const workflowTargetWorld = ensureWorkflowTargetWorldEnv();
|
|
10
149
|
// Pre-built workflow bundles directory - must be excluded from re-transformation
|
|
11
150
|
const workflowBuildDir = join(nitro.options.buildDir, 'workflow');
|
|
151
|
+
nitro.options.alias[WORKFLOW_WORLD_TARGET_MODULE] =
|
|
152
|
+
resolveWorkflowTargetWorldAlias(nitro, workflowTargetWorld);
|
|
153
|
+
nitro.options.alias['pg-native'] ??= WORKFLOW_OPTIONAL_PG_NATIVE_ALIAS;
|
|
12
154
|
// Add transform plugin at the BEGINNING to run before other transforms
|
|
13
155
|
// (especially before class property transforms that rename classes like _ClassName)
|
|
14
156
|
nitro.hooks.hook('rollup:before', (_nitro, config) => {
|
|
@@ -18,10 +160,22 @@ export default {
|
|
|
18
160
|
// undefined class references when Nitro's bundler renames variables
|
|
19
161
|
exclude: [workflowBuildDir],
|
|
20
162
|
}));
|
|
163
|
+
// Nitro bundles undici (via the world adapter) into the ESM server
|
|
164
|
+
// output. undici loads most node: builtins as ESM imports, but pulls in
|
|
165
|
+
// `node:http2` lazily via a bare `require('node:http2')` inside a
|
|
166
|
+
// try/catch — which the bundler leaves un-wired, so in the ESM bundle the
|
|
167
|
+
// require throws and undici silently falls back to a stub whose
|
|
168
|
+
// `http2.connect` is undefined. That breaks any HTTP/2 request (the
|
|
169
|
+
// workflow flow-route callback fails with "fetch failed", so runs never
|
|
170
|
+
// start). Prepend a working CJS `require` to the server chunks so the
|
|
171
|
+
// real `node:http2` resolves. Skipped in dev (Vite SSR provides require).
|
|
172
|
+
if (!nitro.options.dev) {
|
|
173
|
+
addNodeRequireBanner(config);
|
|
174
|
+
}
|
|
21
175
|
});
|
|
22
176
|
// NOTE: Temporary workaround for debug unenv mock
|
|
23
177
|
if (!nitro.options.workflow?._vite) {
|
|
24
|
-
nitro.options.alias
|
|
178
|
+
nitro.options.alias.debug ??= 'debug';
|
|
25
179
|
}
|
|
26
180
|
if (nitro.options.dev) {
|
|
27
181
|
const workflowBuildGlob = `${join(nitro.options.buildDir, 'workflow')}/**`;
|
|
@@ -43,58 +197,24 @@ export default {
|
|
|
43
197
|
];
|
|
44
198
|
}
|
|
45
199
|
}
|
|
46
|
-
//
|
|
47
|
-
//
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
-
//
|
|
51
|
-
//
|
|
52
|
-
//
|
|
53
|
-
//
|
|
200
|
+
// Force workflow SDK packages to be bundled by Nitro's Rollup rather than
|
|
201
|
+
// externalized. This lets the static world-target alias resolve inside the
|
|
202
|
+
// host server bundle instead of falling through to the unaliased core stub.
|
|
203
|
+
// It also ensures the SWC transform plugin processes files containing
|
|
204
|
+
// workflow patterns (like @workflow/core/dist/runtime/run.js) and adds the
|
|
205
|
+
// classId registration IIFEs needed for serialization. Without this, serde
|
|
206
|
+
// classes from npm packages (like `Run`) would be externalized, the SWC
|
|
207
|
+
// transform would never fire on them, and serialization would fail with
|
|
208
|
+
// "must have a static classId property".
|
|
54
209
|
//
|
|
55
210
|
// We use a Rollup resolveId hook (added BEFORE the externalization
|
|
56
211
|
// plugin) that intercepts workflow package imports and marks them
|
|
57
212
|
// as non-external. This is more targeted than `noExternals = true`
|
|
58
213
|
// which would bundle ALL dependencies and cause TDZ errors from
|
|
59
214
|
// circular imports in packages like vue-bundle-renderer/h3.
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
name: 'workflow:force-inline',
|
|
64
|
-
async resolveId(source, importer, options) {
|
|
65
|
-
if (!importer)
|
|
66
|
-
return null;
|
|
67
|
-
// Let other plugins resolve first to get the file path
|
|
68
|
-
const resolved = await this.resolve(source, importer, {
|
|
69
|
-
...options,
|
|
70
|
-
skipSelf: true,
|
|
71
|
-
});
|
|
72
|
-
if (!resolved)
|
|
73
|
-
return null;
|
|
74
|
-
if (!resolved.external)
|
|
75
|
-
return null;
|
|
76
|
-
// Force workflow packages and their internal imports
|
|
77
|
-
// to be bundled (not external). We match both the
|
|
78
|
-
// package specifier (e.g., `@workflow/core/runtime`)
|
|
79
|
-
// and resolved file paths within workflow packages.
|
|
80
|
-
const isWorkflowPkg = /^@?workflow(\/|$)/.test(source) ||
|
|
81
|
-
/[\\/]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(resolved.id);
|
|
82
|
-
if (isWorkflowPkg) {
|
|
83
|
-
// Strip file:// protocol if present — Rollup needs
|
|
84
|
-
// a plain filesystem path to load the module.
|
|
85
|
-
// `fileURLToPath` correctly handles Windows paths
|
|
86
|
-
// (e.g., file:///C:/... -> C:\...) and percent-decoding.
|
|
87
|
-
let resolvedId = resolved.id;
|
|
88
|
-
if (resolvedId.startsWith('file://')) {
|
|
89
|
-
resolvedId = fileURLToPath(resolvedId);
|
|
90
|
-
}
|
|
91
|
-
return { id: resolvedId, external: false };
|
|
92
|
-
}
|
|
93
|
-
return null;
|
|
94
|
-
},
|
|
95
|
-
});
|
|
96
|
-
});
|
|
97
|
-
}
|
|
215
|
+
nitro.hooks.hook('rollup:before', (_nitro, config) => {
|
|
216
|
+
config.plugins.unshift(createWorkflowForceInlinePlugin(workflowTargetWorld, nitro.options.alias[WORKFLOW_WORLD_TARGET_MODULE]));
|
|
217
|
+
});
|
|
98
218
|
// Add tsConfig plugin
|
|
99
219
|
if (nitro.options.workflow?.typescriptPlugin) {
|
|
100
220
|
nitro.options.typescript.tsConfig ||= {};
|
|
@@ -104,14 +224,23 @@ export default {
|
|
|
104
224
|
name: 'workflow',
|
|
105
225
|
});
|
|
106
226
|
}
|
|
107
|
-
//
|
|
108
|
-
|
|
227
|
+
// Nitro v2 Vercel deploy: keep the legacy Build Output API path that
|
|
228
|
+
// builds the workflow functions standalone and stitches the routes into
|
|
229
|
+
// `.vercel/output/config.json`. This path is independent of nitro's own
|
|
230
|
+
// bundle and is only used for nitropack v2 (e.g. Nuxt 4 still uses it).
|
|
231
|
+
const useLegacyVercelBuild = isVercelDeploy && isNitroV2(nitro);
|
|
232
|
+
if (useLegacyVercelBuild) {
|
|
109
233
|
nitro.hooks.hook('compiled', async () => {
|
|
110
234
|
await new VercelBuilder(nitro).build();
|
|
111
235
|
});
|
|
112
236
|
}
|
|
113
|
-
//
|
|
114
|
-
|
|
237
|
+
// Local dev/prod and Nitro v3 Vercel deploy share the same path:
|
|
238
|
+
// bundle the workflow routes into nitro itself via virtual handlers.
|
|
239
|
+
// For Vercel v3 we additionally configure `functionRules` so the
|
|
240
|
+
// routes get queue triggers + extended maxDuration via the nitro
|
|
241
|
+
// vercel preset. This lets workflow handlers use nitro features
|
|
242
|
+
// (storage, database, runtime config, virtual imports, etc.).
|
|
243
|
+
if (!useLegacyVercelBuild) {
|
|
115
244
|
const builder = new LocalBuilder(nitro);
|
|
116
245
|
let isInitialBuild = true;
|
|
117
246
|
nitro.hooks.hook('build:before', async () => {
|
|
@@ -143,9 +272,50 @@ export default {
|
|
|
143
272
|
}
|
|
144
273
|
});
|
|
145
274
|
}
|
|
275
|
+
if (nitro.options.dev) {
|
|
276
|
+
addDashboardHandler(nitro);
|
|
277
|
+
}
|
|
146
278
|
addVirtualHandler(nitro, '/.well-known/workflow/v1/webhook/:token', 'workflow/webhook.mjs');
|
|
147
|
-
|
|
279
|
+
// V2: single combined handler for both workflow and step execution.
|
|
280
|
+
// The step registrations are imported as side effects by the combined
|
|
281
|
+
// handler — no separate step route needed.
|
|
148
282
|
addVirtualHandler(nitro, '/.well-known/workflow/v1/flow', 'workflow/workflows.mjs');
|
|
283
|
+
// Nitro v3+ Vercel deploy: configure function rules for the combined
|
|
284
|
+
// flow handler so it gets the queue triggers + max duration that the
|
|
285
|
+
// workflow runtime needs. Workflow-required fields (`maxDuration`,
|
|
286
|
+
// `experimentalTriggers`, `runtime` when set) take precedence over
|
|
287
|
+
// user-provided values for these routes; unrelated fields the user
|
|
288
|
+
// sets (e.g. `memory`) pass through untouched.
|
|
289
|
+
//
|
|
290
|
+
// Pattern keys must match the route patterns the handlers are
|
|
291
|
+
// registered with so nitro reuses the same function directory.
|
|
292
|
+
// Using a `webhook/**` catch-all here would create a second
|
|
293
|
+
// `webhook/[...].func` next to the `webhook/[token].func` that
|
|
294
|
+
// `addVirtualHandler` produces.
|
|
295
|
+
if (isVercelDeploy) {
|
|
296
|
+
nitro.options.vercel ??= {};
|
|
297
|
+
nitro.options.vercel.functionRules ??= {};
|
|
298
|
+
const runtime = nitro.options.workflow?.runtime;
|
|
299
|
+
const rules = nitro.options.vercel.functionRules;
|
|
300
|
+
const flowPath = '/.well-known/workflow/v1/flow';
|
|
301
|
+
rules[flowPath] = {
|
|
302
|
+
...rules[flowPath],
|
|
303
|
+
...(runtime && { runtime }),
|
|
304
|
+
maxDuration: 'max',
|
|
305
|
+
// V2 combined: a single trigger covers both `__wkf_workflow_*`
|
|
306
|
+
// (workflow orchestration) and `__wkf_step_*` (step execution),
|
|
307
|
+
// since the same handler dispatches both.
|
|
308
|
+
experimentalTriggers: [WORKFLOW_QUEUE_TRIGGER],
|
|
309
|
+
};
|
|
310
|
+
if (runtime) {
|
|
311
|
+
const webhookPath = '/.well-known/workflow/v1/webhook/:token';
|
|
312
|
+
rules[webhookPath] = { ...rules[webhookPath], runtime };
|
|
313
|
+
if (process.env.WORKFLOW_PUBLIC_MANIFEST === '1') {
|
|
314
|
+
const manifestPath = '/.well-known/workflow/v1/manifest.json';
|
|
315
|
+
rules[manifestPath] = { ...rules[manifestPath], runtime };
|
|
316
|
+
}
|
|
317
|
+
}
|
|
318
|
+
}
|
|
149
319
|
// Expose manifest as a public HTTP route when WORKFLOW_PUBLIC_MANIFEST=1
|
|
150
320
|
if (process.env.WORKFLOW_PUBLIC_MANIFEST === '1') {
|
|
151
321
|
// Write a placeholder manifest-data.mjs so rollup can resolve the
|
|
@@ -164,13 +334,119 @@ export default {
|
|
|
164
334
|
}
|
|
165
335
|
},
|
|
166
336
|
};
|
|
337
|
+
const DASHBOARD_VIRTUAL_ID = '#workflow/dashboard-handler';
|
|
338
|
+
function addDashboardHandler(nitro) {
|
|
339
|
+
const route = '/_workflow';
|
|
340
|
+
nitro.options.handlers.push({ route, handler: DASHBOARD_VIRTUAL_ID });
|
|
341
|
+
// Resolve `@workflow/web/server` relative to this module so consumers don't
|
|
342
|
+
// need a direct dependency on `@workflow/web`. The path is inlined into the
|
|
343
|
+
// virtual handler as a file:// URL so Node can `import()` it at runtime
|
|
344
|
+
// regardless of where the generated Nitro bundle ends up.
|
|
345
|
+
const require_ = createRequire(import.meta.url);
|
|
346
|
+
let webServerUrl;
|
|
347
|
+
try {
|
|
348
|
+
webServerUrl = pathToFileURL(require_.resolve('@workflow/web/server')).href;
|
|
349
|
+
}
|
|
350
|
+
catch {
|
|
351
|
+
webServerUrl = '@workflow/web/server';
|
|
352
|
+
}
|
|
353
|
+
const handlerSource = /* js */ `
|
|
354
|
+
const __workflowWebServerUrl = ${JSON.stringify(webServerUrl)};
|
|
355
|
+
let serverPromise = null;
|
|
356
|
+
async function getDashboardUrl() {
|
|
357
|
+
if (!serverPromise) {
|
|
358
|
+
serverPromise = (async () => {
|
|
359
|
+
const { startServer } = await import(/* @vite-ignore */ /* webpackIgnore: true */ __workflowWebServerUrl);
|
|
360
|
+
const server = await startServer(0);
|
|
361
|
+
const address = server.address();
|
|
362
|
+
const port = typeof address === 'object' && address ? address.port : 3456;
|
|
363
|
+
return 'http://localhost:' + port;
|
|
364
|
+
})().catch((error) => {
|
|
365
|
+
serverPromise = null;
|
|
366
|
+
throw error;
|
|
367
|
+
});
|
|
368
|
+
}
|
|
369
|
+
return serverPromise;
|
|
370
|
+
}
|
|
371
|
+
`;
|
|
372
|
+
if (!nitro.routing) {
|
|
373
|
+
nitro.options.virtual[DASHBOARD_VIRTUAL_ID] = /* js */ `
|
|
374
|
+
import { fromWebHandler } from "h3";
|
|
375
|
+
${handlerSource}
|
|
376
|
+
export default fromWebHandler(async () => {
|
|
377
|
+
try {
|
|
378
|
+
const url = await getDashboardUrl();
|
|
379
|
+
return Response.redirect(url, 302);
|
|
380
|
+
} catch (error) {
|
|
381
|
+
console.error('Failed to start workflow dashboard:', error);
|
|
382
|
+
return new Response('Failed to start workflow dashboard: ' + error.message, { status: 500 });
|
|
383
|
+
}
|
|
384
|
+
});
|
|
385
|
+
`;
|
|
386
|
+
}
|
|
387
|
+
else {
|
|
388
|
+
nitro.options.virtual[DASHBOARD_VIRTUAL_ID] = /* js */ `
|
|
389
|
+
${handlerSource}
|
|
390
|
+
export default async () => {
|
|
391
|
+
try {
|
|
392
|
+
const url = await getDashboardUrl();
|
|
393
|
+
return Response.redirect(url, 302);
|
|
394
|
+
} catch (error) {
|
|
395
|
+
console.error('Failed to start workflow dashboard:', error);
|
|
396
|
+
return new Response('Failed to start workflow dashboard: ' + error.message, { status: 500 });
|
|
397
|
+
}
|
|
398
|
+
};
|
|
399
|
+
`;
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
function getStaticImportSpecifier(id) {
|
|
403
|
+
if (id.startsWith('file://')) {
|
|
404
|
+
return id;
|
|
405
|
+
}
|
|
406
|
+
if (id.startsWith('/') || /^[A-Za-z]:[\\/]/.test(id)) {
|
|
407
|
+
return pathToFileURL(id).href;
|
|
408
|
+
}
|
|
409
|
+
return id;
|
|
410
|
+
}
|
|
411
|
+
function createDevWorldTargetSource(nitro) {
|
|
412
|
+
const workflowTargetWorldAlias = nitro.options.alias[WORKFLOW_WORLD_TARGET_MODULE];
|
|
413
|
+
if (typeof workflowTargetWorldAlias !== 'string') {
|
|
414
|
+
throw new Error(`Missing ${WORKFLOW_WORLD_TARGET_MODULE} alias for Nitro dev workflow handler`);
|
|
415
|
+
}
|
|
416
|
+
const workflowTargetWorldImport = JSON.stringify(getStaticImportSpecifier(workflowTargetWorldAlias));
|
|
417
|
+
const workflowCoreRuntimeImport = JSON.stringify(getStaticImportSpecifier(resolveWorkflowCoreRuntimeAlias({ workingDir: nitro.options.rootDir })));
|
|
418
|
+
return /* js */ `
|
|
419
|
+
import {
|
|
420
|
+
createWorldFromModule as __workflowCreateWorldFromModule,
|
|
421
|
+
setWorld as __workflowSetWorld,
|
|
422
|
+
} from ${workflowCoreRuntimeImport};
|
|
423
|
+
import * as __workflowTargetWorld from ${workflowTargetWorldImport};
|
|
424
|
+
|
|
425
|
+
let __workflowWorldPromise = null;
|
|
426
|
+
|
|
427
|
+
async function ensureWorkflowWorld() {
|
|
428
|
+
if (!__workflowWorldPromise) {
|
|
429
|
+
__workflowWorldPromise = Promise.resolve(
|
|
430
|
+
__workflowCreateWorldFromModule(__workflowTargetWorld)
|
|
431
|
+
).then(__workflowSetWorld);
|
|
432
|
+
}
|
|
433
|
+
await __workflowWorldPromise;
|
|
434
|
+
}
|
|
435
|
+
`;
|
|
436
|
+
}
|
|
167
437
|
function addVirtualHandler(nitro, route, buildPath) {
|
|
168
438
|
nitro.options.handlers.push({
|
|
169
439
|
route,
|
|
170
440
|
handler: `#${buildPath}`,
|
|
171
441
|
});
|
|
172
442
|
const handlerImportPath = JSON.stringify(join(nitro.options.buildDir, buildPath));
|
|
443
|
+
const stepsImportPath = JSON.stringify(join(nitro.options.buildDir, 'workflow/steps.mjs'));
|
|
444
|
+
const preloadSteps = {
|
|
445
|
+
'workflow/webhook.mjs': '',
|
|
446
|
+
'workflow/workflows.mjs': `await import(/* @vite-ignore */ pathToFileURL(${stepsImportPath}).href + "?t=" + version);`,
|
|
447
|
+
};
|
|
173
448
|
if (nitro.options.dev) {
|
|
449
|
+
const devWorldTargetSource = createDevWorldTargetSource(nitro);
|
|
174
450
|
// Dev mode: load generated workflow bundles from disk at request time.
|
|
175
451
|
// This keeps `.nitro/workflow/*.mjs` out of Nitro's own bundle graph,
|
|
176
452
|
// which avoids rebuild loops and stale dependency graphs during HMR.
|
|
@@ -180,16 +456,19 @@ function addVirtualHandler(nitro, route, buildPath) {
|
|
|
180
456
|
import { fromWebHandler } from "h3";
|
|
181
457
|
import { statSync } from "node:fs";
|
|
182
458
|
import { pathToFileURL } from "node:url";
|
|
459
|
+
${devWorldTargetSource}
|
|
183
460
|
|
|
184
461
|
const handlerPath = ${handlerImportPath};
|
|
185
462
|
let currentVersion = "";
|
|
186
463
|
let currentImportPath = "";
|
|
187
464
|
|
|
188
465
|
async function loadPOST() {
|
|
466
|
+
await ensureWorkflowWorld();
|
|
189
467
|
const version = String(statSync(handlerPath).mtimeMs);
|
|
190
468
|
if (version !== currentVersion) {
|
|
191
469
|
currentVersion = version;
|
|
192
470
|
currentImportPath = pathToFileURL(handlerPath).href + "?t=" + version;
|
|
471
|
+
${preloadSteps[buildPath]}
|
|
193
472
|
}
|
|
194
473
|
return (await import(currentImportPath)).POST;
|
|
195
474
|
}
|
|
@@ -204,16 +483,19 @@ function addVirtualHandler(nitro, route, buildPath) {
|
|
|
204
483
|
nitro.options.virtual[`#${buildPath}`] = /* js */ `
|
|
205
484
|
import { statSync } from "node:fs";
|
|
206
485
|
import { pathToFileURL } from "node:url";
|
|
486
|
+
${devWorldTargetSource}
|
|
207
487
|
|
|
208
488
|
const handlerPath = ${handlerImportPath};
|
|
209
489
|
let currentVersion = "";
|
|
210
490
|
let currentImportPath = "";
|
|
211
491
|
|
|
212
492
|
async function loadPOST() {
|
|
493
|
+
await ensureWorkflowWorld();
|
|
213
494
|
const version = String(statSync(handlerPath).mtimeMs);
|
|
214
495
|
if (version !== currentVersion) {
|
|
215
496
|
currentVersion = version;
|
|
216
497
|
currentImportPath = pathToFileURL(handlerPath).href + "?t=" + version;
|
|
498
|
+
${preloadSteps[buildPath]}
|
|
217
499
|
}
|
|
218
500
|
return (await import(currentImportPath)).POST;
|
|
219
501
|
}
|
|
@@ -344,4 +626,4 @@ export default fromWebHandler(() => new Response("Manifest not found", { status:
|
|
|
344
626
|
writeFileSync(handlerPath, fallback);
|
|
345
627
|
}
|
|
346
628
|
}
|
|
347
|
-
//# sourceMappingURL=index.js.map
|
|
629
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLE1BQU0sU0FBUyxDQUFDO0FBQ2pFLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDNUMsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDeEQsT0FBTyxFQUNMLDRCQUE0QixFQUM1QiwrQkFBK0IsRUFDL0IsMkJBQTJCLEVBQzNCLGlDQUFpQyxFQUNqQyxzQkFBc0IsRUFDdEIsNEJBQTRCLEdBQzdCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFM0QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM3QixPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUs1RDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxLQUFZO0lBQzdCLE1BQU0sWUFBWSxHQUFJLEtBQThDLENBQUMsSUFBSTtRQUN2RSxFQUFFLFlBQVksQ0FBQztJQUNqQixJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6QixPQUFPLFlBQVksS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUNELE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0FBQ3hCLENBQUM7QUFFRDs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILFNBQVMsb0JBQW9CLENBQUMsTUFBb0I7SUFDaEQsTUFBTSxNQUFNLEdBQUcsMkJBQTJCLENBQUM7SUFDM0MsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQztJQUM3QixJQUFJLE1BQU0sSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUNuQixNQUFN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QUFNLFFBQVEsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPO1lBQzdCLENBQUMsQ0FBQzs7Q0FFUDtZQUNLLENBQUMsQ0FBQztDQUNQLENBQUM7UUFDRSxhQUFhLENBQUMsV0FBVyxFQUFFLFFBQVEsQ0FBQyxDQUFDO0lBQ3ZDLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgbWtkaXJTeW5jLCByZWFkRmlsZVN5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGNyZWF0ZVJlcXVpcmUgfSBmcm9tICdub2RlOm1vZHVsZSc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoLCBwYXRoVG9GaWxlVVJMIH0gZnJvbSAnbm9kZTp1cmwnO1xuaW1wb3J0IHtcbiAgZW5zdXJlV29ya2Zsb3dUYXJnZXRXb3JsZEVudixcbiAgcmVzb2x2ZVdvcmtmbG93Q29yZVJ1bnRpbWVBbGlhcyxcbiAgV09SS0ZMT1dfTk9ERV9DT01QQVRfQkFOTkVSLFxuICBXT1JLRkxPV19PUFRJT05BTF9QR19OQVRJVkVfQUxJQVMsXG4gIFdPUktGTE9XX1FVRVVFX1RSSUdHRVIsXG4gIFdPUktGTE9XX1dPUkxEX1RBUkdFVF9NT0RVTEUsXG59IGZyb20gJ0B3b3JrZmxvdy9idWlsZGVycyc7XG5pbXBvcnQgeyB3b3JrZmxvd1RyYW5zZm9ybVBsdWdpbiB9IGZyb20gJ0B3b3JrZmxvdy9yb2xsdXAnO1xuaW1wb3J0IHR5cGUgeyBOaXRybywgTml0cm9Nb2R1bGUsIFJvbGx1cENvbmZpZyB9IGZyb20gJ25pdHJvL3R5cGVzJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoZSc7XG5pbXBvcnQgeyBMb2NhbEJ1aWxkZXIsIFZlcmNlbEJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgTW9kdWxlT3B0aW9ucyB9IGZyb20gJy4vdHlwZXMnO1xuXG5leHBvcnQgdHlwZSB7IE1vZHVsZU9wdGlvbnMgfTtcblxuLyoqXG4gKiBEZXRlY3Qgd2hldGhlciB0aGUgTml0cm8gaW5zdGFuY2UgaXMgdjIuXG4gKiBOZXdlciBOaXRybyByZWxlYXNlcyAoYm90aCB2MiBhbmQgdjMpIGV4cG9zZSBgbml0cm8ubWV0YS5tYWpvclZlcnNpb25gLlxuICogRmFsbCBiYWNrIHRvIGAhbml0cm8ucm91dGluZ2AgKG9ubHkgcHJlc2VudCBpbiB2MyspIGZvciBvbGRlciBOaXRybyB2MlxuICogdmVyc2lvbnMgdGhhdCBkb24ndCBoYXZlIGBtYWpvclZlcnNpb25gIHlldCAoZS5nLiBOdXh0IHVzZXJzIG9uIGFuIG9sZGVyXG4gKiBuaXRyb3BhY2spLlxuICovXG5mdW5jdGlvbiBpc05pdHJvVjIobml0cm86IE5pdHJvKTogYm9vbGVhbiB7XG4gIGNvbnN0IG1ham9yVmVyc2lvbiA9IChuaXRybyBhcyB7IG1ldGE/OiB7IG1ham9yVmVyc2lvbj86IG51bWJlciB9IH0pLm1ldGFcbiAgICA/Lm1ham9yVmVyc2lvbjtcbiAgaWYgKG1ham9yVmVyc2lvbiAhPSBudWxsKSB7XG4gICAgcmV0dXJuIG1ham9yVmVyc2lvbiA9PT0gMjtcbiAgfVxuICByZXR1cm4gIW5pdHJvLnJvdXRpbmc7XG59XG5cbi8qKlxuICogUHJlcGVuZCBhIGBjcmVhdGVSZXF1aXJlYC1iYWNrZWQgZ2xvYmFsIGByZXF1aXJlYCB0byBldmVyeSBzZXJ2ZXIgY2h1bmsgc29cbiAqIHVuZGljaSdzIGJ1bmRsZWQgYHJlcXVpcmUoJ25vZGU6aHR0cDInKWAgcmVzb2x2ZXMgdGhlIHJlYWwgYnVpbHRpbiBpbnN0ZWFkIG9mXG4gKiB0aHJvd2luZyAod2hpY2ggd291bGQgbWFrZSB1bmRpY2kgZmFsbCBiYWNrIHRvIGEgc3R1YiB3aXRob3V0XG4gKiBgaHR0cDIuY29ubmVjdGAsIGJyZWFraW5nIEhUVFAvMikuIFRoZSBndWFyZCBrZWVwcyBpdCBpZGVtcG90ZW50IGFjcm9zc1xuICogY2h1bmtzLCBhbmQgYG5vZGU6bW9kdWxlYCBpcyBhbHdheXMgYXZhaWxhYmxlIGluIHRoZSBOb2RlIHNlcnZlciBydW50aW1lLlxuICpcbiAqIFRoaXMgaXMgYSBOb2RlLXNlcnZlci1ydW50aW1lLW9ubHkgc2hpbSAoY2FsbGVycyBnYXRlIGl0IHRvIHRoZSBwcm9kdWN0aW9uXG4gKiBzZXJ2ZXIgYnVpbGQpLiBOb3RlIHRoZSBkZWxpYmVyYXRlIGdsb2JhbCBzaWRlIGVmZmVjdDogZGVmaW5pbmdcbiAqIGBnbG9iYWxUaGlzLnJlcXVpcmVgIG1ha2VzIGB0eXBlb2YgcmVxdWlyZWAgdHJ1dGh5IGZvciAqZXZlcnkqIGJ1bmRsZWRcbiAqIGRlcGVuZGVuY3kgaW4gdGhpcyBFU00gc2VydmVyIG91dHB1dCwgc28gYW55IGxpYnJhcnkgdGhhdCBmZWF0dXJlLWRldGVjdHNcbiAqIGByZXF1aXJlYCB3aWxsIHRha2UgaXRzIENKUyBwYXRoIGhlcmUuIFRoYXQgaXMgc2FmZSBiZWNhdXNlIChhKSBpdCBuZXZlclxuICogdG91Y2hlcyB0aGUgY2xpZW50IGJ1bmRsZSwgKGIpIHRoZSBgdHlwZW9mIHJlcXVpcmUgPT09ICd1bmRlZmluZWQnYCBndWFyZFxuICogbWFrZXMgaXQgYSBuby1vcCBpbiBDSlMgY2h1bmtzIHdoZXJlIGEgcmVhbCBgcmVxdWlyZWAgYWxyZWFkeSBleGlzdHMsIGFuZFxuICogKGMpIHRoZSBgcmVxdWlyZWAgd2UgaW5zdGFsbCBpcyBhIHdvcmtpbmcgYGNyZWF0ZVJlcXVpcmVgLCBzbyBhIGxpYnJhcnkgdGhhdFxuICogc3dpdGNoZXMgdG8gdGhlIHJlcXVpcmUgcGF0aCBnZXRzIGEgZnVuY3Rpb25hbCBgcmVxdWlyZWAsIG5vdCBhIGJyb2tlbiBzdHViLlxuICogVGhlIGJlaGF2aW9yIHRvIHdhdGNoIGZvciBpcyBhIGJ1bmRsZWQgbGliIHRoYXQsIG9uIHNlZWluZyBgcmVxdWlyZWAsIGRvZXNcbiAqIGByZXF1aXJlKClgIG9mIGFuIEVTTS1vbmx5IGRlcGVuZGVuY3kgb24gYSBOb2RlIHZlcnNpb24gd2l0aG91dCBgcmVxdWlyZShFU00pYFxuICogc3VwcG9ydC5cbiAqL1xuZnVuY3Rpb24gYWRkTm9kZVJlcXVpcmVCYW5uZXIoY29uZmlnOiBSb2xsdXBDb25maWcpOiB2b2lkIHtcbiAgY29uc3QgYmFubmVyID0gV09SS0ZMT1dfTk9ERV9DT01QQVRfQkFOTkVSO1xuICBjb25zdCBvdXRwdXQgPSBjb25maWcub3V0cHV0O1xuICBpZiAob3V0cHV0ID09IG51bGwpIHtcbiAgICBjb25maWcub3V0cHV0ID0geyBiYW5uZXIgfTtcbiAgICByZXR1cm47XG4gIH1cbiAgY29uc3Qgb3V0cHV0cyA9IEFycmF5LmlzQXJyYXkob3V0cHV0KSA/IG91dHB1dCA6IFtvdXRwdXRdO1xuICBmb3IgKGNvbnN0IG8gb2Ygb3V0cHV0cykge1xuICAgIGNvbnN0IGV4aXN0aW5nID0gby5iYW5uZXI7XG4gICAgby5iYW5uZXIgPVxuICAgICAgZXhpc3RpbmcgPT0gbnVsbFxuICAgICAgICA/IGJhbm5lclxuICAgICAgICA6IHR5cGVvZiBleGlzdGluZyA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgICAgID8gYXN5bmMgKGNodW5rOiB1bmtub3duKSA9PiBgJHtiYW5uZXJ9XFxuJHthd2FpdCBleGlzdGluZyhjaHVuayl9YFxuICAgICAgICAgIDogYCR7YmFubmVyfVxcbiR7ZXhpc3Rpbmd9YDtcbiAgfVxufVxuXG5jb25zdCBXT1JLRkxPV19JTkxJTkVfUEFDS0FHRVMgPSBuZXcgU2V0KFtcbiAgJ3dvcmtmbG93JyxcbiAgJ2NvcmUnLFxuICAnc2VyZGUnLFxuICAnZXJyb3JzJyxcbiAgJ3V0aWxzJyxcbiAgJ2J1aWxkZXJzJyxcbiAgJ3JvbGx1cCcsXG4gICdhaScsXG4gICd3b3JsZCcsXG5dKTtcblxuZnVuY3Rpb24gZ2V0V29ya2Zsb3dQYWNrYWdlTmFtZShzb3VyY2U6IHN0cmluZyk6IHN0cmluZyB8IG51bGwge1xuICBjb25zdCBwYWNrYWdlU3BlY2lmaWVyID0gc291cmNlLm1hdGNoKC9eQHdvcmtmbG93XFwvKFteL10rKS8pO1xuICBpZiAocGFja2FnZVNwZWNpZmllcikge1xuICAgIHJldHVybiBwYWNrYWdlU3BlY2lmaWVyWzFdID8/IG51bGw7XG4gIH1cbiAgaWYgKHNvdXJjZSA9PT0gJ3dvcmtmbG93JyB8fCBzb3VyY2Uuc3RhcnRzV2l0aCgnd29ya2Zsb3cvJykpIHtcbiAgICByZXR1cm4gJ3dvcmtmbG93JztcbiAgfVxuICBjb25zdCBwYWNrYWdlUGF0aCA9IHNvdXJjZS5tYXRjaCgvW1xcXFwvXXBhY2thZ2VzW1xcXFwvXShbXlxcXFwvXSspLyk7XG4gIHJldHVybiBwYWNrYWdlUGF0aD8uWzFdID8/IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVdvcmtmbG93Rm9yY2VJbmxpbmVQbHVnaW4oXG4gIHdvcmtmbG93VGFyZ2V0V29ybGQ6IHN0cmluZyxcbiAgd29ya2Zsb3dUYXJnZXRXb3JsZEFsaWFzOiBzdHJpbmdcbikge1xuICBjb25zdCB0YXJnZXRXb3JsZFBhY2thZ2UgPSBnZXRXb3JrZmxvd1BhY2thZ2VOYW1lKHdvcmtmbG93VGFyZ2V0V29ybGQpO1xuICByZXR1cm4ge1xuICAgIG5hbWU6ICd3b3JrZmxvdzpmb3JjZS1pbmxpbmUnLFxuICAgIC8vIGBvcmRlcjogJ3ByZSdgIGlzIHJlcXVpcmVkOiBOaXRybydzIGBuaXRybzpleHRlcm5hbHNgIHBsdWdpblxuICAgIC8vIHVzZXMgYG9yZGVyOiAncHJlJ2AgZm9yIGl0cyByZXNvbHZlSWQgaG9vayBhbmQgc3ByZWFkcyBvdXJcbiAgICAvLyByZXNvbHV0aW9uIHJlc3VsdCB3aGlsZSBmb3JjaW5nIGBleHRlcm5hbDogdHJ1ZWAuIFdpdGhvdXRcbiAgICAvLyBgcHJlYCBoZXJlLCBvdXIgYGV4dGVybmFsOiBmYWxzZWAgZGVjaXNpb24gZ2V0cyBvdmVyd3JpdHRlblxuICAgIC8vIGFuZCBgQHdvcmtmbG93LypgIGltcG9ydHMgZW5kIHVwIGV4dGVybmFsaXplZCBpbiB0aGUgYnVuZGxlLlxuICAgIHJlc29sdmVJZDoge1xuICAgICAgb3JkZXI6ICdwcmUnIGFzIGNvbnN0LFxuICAgICAgYXN5bmMgaGFuZGxlcihcbiAgICAgICAgdGhpczoge1xuICAgICAgICAgIHJlc29sdmU6IChcbiAgICAgICAgICAgIHNvdXJjZTogc3RyaW5nLFxuICAgICAgICAgICAgaW1wb3J0ZXI6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIG9wdGlvbnM6IHsgc2tpcFNlbGY/OiBib29sZWFuIH1cbiAgICAgICAgICApID0+IFByb21pc2U8eyBpZDogc3RyaW5nIH0gfCBudWxsPjtcbiAgICAgICAgfSxcbiAgICAgICAgc291cmNlOiBzdHJpbmcsXG4gICAgICAgIGltcG9ydGVyOiBzdHJpbmcgfCB1bmRlZmluZWQsXG4gICAgICAgIG9wdGlvbnM6IHsgc2tpcFNlbGY/OiBib29sZWFuIH1cbiAgICAgICkge1xuICAgICAgICBpZiAoc291cmNlID09PSBXT1JLRkxPV19XT1JMRF9UQVJHRVRfTU9EVUxFKSB7XG4gICAgICAgICAgcmV0dXJuIHsgaWQ6IHdvcmtmbG93VGFyZ2V0V29ybGRBbGlhcywgZXh0ZXJuYWw6IGZhbHNlIH07XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbXBvcnRlcikgcmV0dXJuIG51bGw7XG4gICAgICAgIC8vIE1hdGNoIHdvcmtmbG93IHBhY2thZ2Ugc3BlY2lmaWVycyBPUiBkaXJlY3QgcGF0aHMgaW50b1xuICAgICAgICAvLyBwYWNrYWdlcy88bmFtZT4vLiBCYWlsIG91dCBlYXJseSBvbiBub24td29ya2Zsb3cgaW1wb3J0c1xuICAgICAgICAvLyBzbyB3ZSBkb24ndCBpbnRlcmNlcHQgdGhlIHJlc3Qgb2YgdGhlIHJlc29sdXRpb24gY2hhaW4uXG4gICAgICAgIGNvbnN0IHBhY2thZ2VOYW1lID0gZ2V0V29ya2Zsb3dQYWNrYWdlTmFtZShzb3VyY2UpO1xuICAgICAgICBjb25zdCBpc1dvcmtmbG93UGtnID1cbiAgICAgICAgICBwYWNrYWdlTmFtZSAhPSBudWxsICYmXG4gICAgICAgICAgKFdPUktGTE9XX0lOTElORV9QQUNLQUdFUy5oYXMocGFja2FnZU5hbWUpIHx8XG4gICAgICAgICAgICBwYWNrYWdlTmFtZSA9PT0gdGFyZ2V0V29ybGRQYWNrYWdlKTtcbiAgICAgICAgaWYgKCFpc1dvcmtmbG93UGtnKSByZXR1cm4gbnVsbDtcbiAgICAgICAgLy8gUmVzb2x2ZSB2aWEgb3RoZXIgcmVzb2x2ZXJzLCBza2lwcGluZyBvdXJzZWx2ZXMgc28gd2VcbiAgICAgICAgLy8gZ2V0IGEgcGF0aC4gV2UgZG9uJ3QgZ2F0ZSBvbiBgcmVzb2x2ZWQuZXh0ZXJuYWxgIGJlY2F1c2VcbiAgICAgICAgLy8gYG5pdHJvOmV4dGVybmFsc2Agc3ByZWFkcyBvdXIgcmVzdWx0IGFuZCBvdmVycmlkZXNcbiAgICAgICAgLy8gYGV4dGVybmFsOiB0cnVlYCByZWdhcmRsZXNzIG9mIHdoYXQgd2UgcmV0dXJuIOKAlCB3ZSB3YW50XG4gICAgICAgIC8vIHRvIHdpbiB0aGF0IHJhY2UgYnkgcmV0dXJuaW5nIGZpcnN0IHVuZGVyIGBvcmRlcjogJ3ByZSdgLlxuICAgICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHRoaXMucmVzb2x2ZShzb3VyY2UsIGltcG9ydGVyLCB7XG4gICAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgICBza2lwU2VsZjogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgICAgIGlmICghcmVzb2x2ZWQpIHJldHVybiBudWxsO1xuICAgICAgICBsZXQgcmVzb2x2ZWRJZCA9IHJlc29sdmVkLmlkO1xuICAgICAgICAvLyBTdHJpcCBmaWxlOi8vIHByb3RvY29sIGlmIHByZXNlbnQg4oCUIFJvbGx1cCBuZWVkcyBhIHBsYWluXG4gICAgICAgIC8vIGZpbGVzeXN0ZW0gcGF0aCB0byBsb2FkIHRoZSBtb2R1bGUuIGBmaWxlVVJMVG9QYXRoYFxuICAgICAgICAvLyBjb3JyZWN0bHkgaGFuZGxlcyBXaW5kb3dzIHBhdGhzIChlLmcuLCBmaWxlOi8vL0M6Ly4uLlxuICAgICAgICAvLyAtPiBDOlxcLi4uKSBhbmQgcGVyY2VudC1kZWNvZGluZy5cbiAgICAgICAgaWYgKHJlc29sdmVkSWQuc3RhcnRzV2l0aCgnZmlsZTovLycpKSB7XG4gICAgICAgICAgcmVzb2x2ZWRJZCA9IGZpbGVVUkxUb1BhdGgocmVzb2x2ZWRJZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgaWQ6IHJlc29sdmVkSWQsIGV4dGVybmFsOiBmYWxzZSB9O1xuICAgICAgfSxcbiAgICB9LFxuICB9O1xufVxuXG5mdW5jdGlvbiBjcmVhdGVSZXNvbHZlclJlcXVpcmUobml0cm86IE5pdHJvKSB7XG4gIHJldHVybiBjcmVhdGVSZXF1aXJlKGpvaW4obml0cm8ub3B0aW9ucy5yb290RGlyLCAncGFja2FnZS5qc29uJykpO1xufVxuXG5mdW5jdGlvbiByZXNvbHZlV29ya2Zsb3dUYXJnZXRXb3JsZEFsaWFzKFxuICBuaXRybzogTml0cm8sXG4gIHRhcmdldFdvcmxkOiBzdHJpbmdcbik6IHN0cmluZyB7XG4gIHRyeSB7XG4gICAgcmV0dXJuIGNyZWF0ZVJlc29sdmVyUmVxdWlyZShuaXRybykucmVzb2x2ZSh0YXJnZXRXb3JsZCk7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiB0YXJnZXRXb3JsZDtcbiAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIG5hbWU6ICd3b3JrZmxvdy9uaXRybycsXG4gIGFzeW5jIHNldHVwKG5pdHJvOiBOaXRybykge1xuICAgIGNvbnN0IGlzVmVyY2VsRGVwbG95ID1cbiAgICAgICFuaXRyby5vcHRpb25zLmRldiAmJiBuaXRyby5vcHRpb25zLnByZXNldCA9PT0gJ3ZlcmNlbCc7XG4gICAgY29uc3Qgd29ya2Zsb3dUYXJnZXRXb3JsZCA9IGVuc3VyZVdvcmtmbG93VGFyZ2V0V29ybGRFbnYoKTtcblxuICAgIC8vIFByZS1idWlsdCB3b3JrZmxvdyBidW5kbGVzIGRpcmVjdG9yeSAtIG11c3QgYmUgZXhjbHVkZWQgZnJvbSByZS10cmFuc2Zvcm1hdGlvblxuICAgIGNvbnN0IHdvcmtmbG93QnVpbGREaXIgPSBqb2luKG5pdHJvLm9wdGlvbnMuYnVpbGREaXIsICd3b3JrZmxvdycpO1xuXG4gICAgbml0cm8ub3B0aW9ucy5hbGlhc1tXT1JLRkxPV19XT1JMRF9UQVJHRVRfTU9EVUxFXSA9XG4gICAgICByZXNvbHZlV29ya2Zsb3dUYXJnZXRXb3JsZEFsaWFzKG5pdHJvLCB3b3JrZmxvd1RhcmdldFdvcmxkKTtcbiAgICBuaXRyby5vcHRpb25zLmFsaWFzWydwZy1uYXRpdmUnXSA/Pz0gV09SS0ZMT1dfT1BUSU9OQUxfUEdfTkFUSVZFX0FMSUFTO1xuXG4gICAgLy8gQWRkIHRyYW5zZm9ybSBwbHVnaW4gYXQgdGhlIEJFR0lOTklORyB0byBydW4gYmVmb3JlIG90aGVyIHRyYW5zZm9ybXNcbiAgICAvLyAoZXNwZWNpYWxseSBiZWZvcmUgY2xhc3MgcHJvcGVydHkgdHJhbnNmb3JtcyB0aGF0IHJlbmFtZSBjbGFzc2VzIGxpa2UgX0NsYXNzTmFtZSlcbiAgICBuaXRyby5ob29rcy5ob29rKCdyb2xsdXA6YmVmb3JlJywgKF9uaXRybzogTml0cm8sIGNvbmZpZzogUm9sbHVwQ29uZmlnKSA9PiB7XG4gICAgICAoY29uZmlnLnBsdWdpbnMgYXMgQXJyYXk8dW5rbm93bj4pLnVuc2hpZnQoXG4gICAgICAgIHdvcmtmbG93VHJhbnNmb3JtUGx1Z2luKHtcbiAgICAgICAgICAvLyBFeGNsdWRlIHByZS1idWlsdCB3b3JrZmxvdyBidW5kbGVzIGZyb20gcmUtdHJhbnNmb3JtYXRpb25cbiAgICAgICAgICAvLyBUaGVzZSBhcmUgYWxyZWFkeSBwcm9jZXNzZWQgYW5kIHJlLXByb2Nlc3NpbmcgY2F1c2VzIGlzc3VlcyBsaWtlXG4gICAgICAgICAgLy8gdW5kZWZpbmVkIGNsYXNzIHJlZmVyZW5jZXMgd2hlbiBOaXRybydzIGJ1bmRsZXIgcmVuYW1lcyB2YXJpYWJsZXNcbiAgICAgICAgICBleGNsdWRlOiBbd29ya2Zsb3dCdWlsZERpcl0sXG4gICAgICAgIH0pXG4gICAgICApO1xuXG4gICAgICAvLyBOaXRybyBidW5kbGVzIHVuZGljaSAodmlhIHRoZSB3b3JsZCBhZGFwdGVyKSBpbnRvIHRoZSBFU00gc2VydmVyXG4gICAgICAvLyBvdXRwdXQuIHVuZGljaSBsb2FkcyBtb3N0IG5vZGU6IGJ1aWx0aW5zIGFzIEVTTSBpbXBvcnRzLCBidXQgcHVsbHMgaW5cbiAgICAgIC8vIGBub2RlOmh0dHAyYCBsYXppbHkgdmlhIGEgYmFyZSBgcmVxdWlyZSgnbm9kZTpodHRwMicpYCBpbnNpZGUgYVxuICAgICAgLy8gdHJ5L2NhdGNoIOKAlCB3aGljaCB0aGUgYnVuZGxlciBsZWF2ZXMgdW4td2lyZWQsIHNvIGluIHRoZSBFU00gYnVuZGxlIHRoZVxuICAgICAgLy8gcmVxdWlyZSB0aHJvd3MgYW5kIHVuZGljaSBzaWxlbnRseSBmYWxscyBiYWNrIHRvIGEgc3R1YiB3aG9zZVxuICAgICAgLy8gYGh0dHAyLmNvbm5lY3RgIGlzIHVuZGVmaW5lZC4gVGhhdCBicmVha3MgYW55IEhUVFAvMiByZXF1ZXN0ICh0aGVcbiAgICAgIC8vIHdvcmtmbG93IGZsb3ctcm91dGUgY2FsbGJhY2sgZmFpbHMgd2l0aCBcImZldGNoIGZhaWxlZFwiLCBzbyBydW5zIG5ldmVyXG4gICAgICAvLyBzdGFydCkuIFByZXBlbmQgYSB3b3JraW5nIENKUyBgcmVxdWlyZWAgdG8gdGhlIHNlcnZlciBjaHVua3Mgc28gdGhlXG4gICAgICAvLyByZWFsIGBub2RlOmh0dHAyYCByZXNvbHZlcy4gU2tpcHBlZCBpbiBkZXYgKFZpdGUgU1NSIHByb3ZpZGVzIHJlcXVpcmUpLlxuICAgICAgaWYgKCFuaXRyby5vcHRpb25zLmRldikge1xuICAgICAgICBhZGROb2RlUmVxdWlyZUJhbm5lcihjb25maWcpO1xuICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gTk9URTogVGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGRlYnVnIHVuZW52IG1vY2tcbiAgICBpZiAoIW5pdHJvLm9wdGlvbnMud29ya2Zsb3c/Ll92aXRlKSB7XG4gICAgICBuaXRyby5vcHRpb25zLmFsaWFzLmRlYnVnID8/PSAnZGVidWcnO1xuICAgIH1cblxuICAgIGlmIChuaXRyby5vcHRpb25zLmRldikge1xuICAgICAgY29uc3Qgd29ya2Zsb3dCdWlsZEdsb2IgPSBgJHtqb2luKG5pdHJvLm9wdGlvbnMuYnVpbGREaXIsICd3b3JrZmxvdycpfS8qKmA7XG4gICAgICBuaXRyby5vcHRpb25zLndhdGNoT3B0aW9ucyB8fD0ge307XG4gICAgICBjb25zdCBleGlzdGluZ0lnbm9yZWQgPSBuaXRyby5vcHRpb25zLndhdGNoT3B0aW9ucy5pZ25vcmVkO1xuICAgICAgaWYgKCFleGlzdGluZ0lnbm9yZWQpIHtcbiAgICAgICAgbml0cm8ub3B0aW9ucy53YXRjaE9wdGlvbnMuaWdub3JlZCA9IFt3b3JrZmxvd0J1aWxkR2xvYl07XG4gICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmdJZ25vcmVkKSkge1xuICAgICAgICBuaXRyby5vcHRpb25zLndhdGNoT3B0aW9ucy5pZ25vcmVkID0gW1xuICAgICAgICAgIC4uLmV4aXN0aW5nSWdub3JlZCxcbiAgICAgICAgICB3b3JrZmxvd0J1aWxkR2xvYixcbiAgICAgICAgXTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG5pdHJvLm9wdGlvbnMud2F0Y2hPcHRpb25zLmlnbm9yZWQgPSBbXG4gICAgICAgICAgZXhpc3RpbmdJZ25vcmVkLFxuICAgICAgICAgIHdvcmtmbG93QnVpbGRHbG9iLFxuICAgICAgICBdO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEZvcmNlIHdvcmtmbG93IFNESyBwYWNrYWdlcyB0byBiZSBidW5kbGVkIGJ5IE5pdHJvJ3MgUm9sbHVwIHJhdGhlciB0aGFuXG4gICAgLy8gZXh0ZXJuYWxpemVkLiBUaGlzIGxldHMgdGhlIHN0YXRpYyB3b3JsZC10YXJnZXQgYWxpYXMgcmVzb2x2ZSBpbnNpZGUgdGhlXG4gICAgLy8gaG9zdCBzZXJ2ZXIgYnVuZGxlIGluc3RlYWQgb2YgZmFsbGluZyB0aHJvdWdoIHRvIHRoZSB1bmFsaWFzZWQgY29yZSBzdHViLlxuICAgIC8vIEl0IGFsc28gZW5zdXJlcyB0aGUgU1dDIHRyYW5zZm9ybSBwbHVnaW4gcHJvY2Vzc2VzIGZpbGVzIGNvbnRhaW5pbmdcbiAgICAvLyB3b3JrZmxvdyBwYXR0ZXJucyAobGlrZSBAd29ya2Zsb3cvY29yZS9kaXN0L3J1bnRpbWUvcnVuLmpzKSBhbmQgYWRkcyB0aGVcbiAgICAvLyBjbGFzc0lkIHJlZ2lzdHJhdGlvbiBJSUZFcyBuZWVkZWQgZm9yIHNlcmlhbGl6YXRpb24uIFdpdGhvdXQgdGhpcywgc2VyZGVcbiAgICAvLyBjbGFzc2VzIGZyb20gbnBtIHBhY2thZ2VzIChsaWtlIGBSdW5gKSB3b3VsZCBiZSBleHRlcm5hbGl6ZWQsIHRoZSBTV0NcbiAgICAvLyB0cmFuc2Zvcm0gd291bGQgbmV2ZXIgZmlyZSBvbiB0aGVtLCBhbmQgc2VyaWFsaXphdGlvbiB3b3VsZCBmYWlsIHdpdGhcbiAgICAvLyBcIm11c3QgaGF2ZSBhIHN0YXRpYyBjbGFzc0lkIHByb3BlcnR5XCIuXG4gICAgLy9cbiAgICAvLyBXZSB1c2UgYSBSb2xsdXAgcmVzb2x2ZUlkIGhvb2sgKGFkZGVkIEJFRk9SRSB0aGUgZXh0ZXJuYWxpemF0aW9uXG4gICAgLy8gcGx1Z2luKSB0aGF0IGludGVyY2VwdHMgd29ya2Zsb3cgcGFja2FnZSBpbXBvcnRzIGFuZCBtYXJrcyB0aGVtXG4gICAgLy8gYXMgbm9uLWV4dGVybmFsLiBUaGlzIGlzIG1vcmUgdGFyZ2V0ZWQgdGhhbiBgbm9FeHRlcm5hbHMgPSB0cnVlYFxuICAgIC8vIHdoaWNoIHdvdWxkIGJ1bmRsZSBBTEwgZGVwZW5kZW5jaWVzIGFuZCBjYXVzZSBURFogZXJyb3JzIGZyb21cbiAgICAvLyBjaXJjdWxhciBpbXBvcnRzIGluIHBhY2thZ2VzIGxpa2UgdnVlLWJ1bmRsZS1yZW5kZXJlci9oMy5cbiAgICBuaXRyby5ob29rcy5ob29rKCdyb2xsdXA6YmVmb3JlJywgKF9uaXRybzogTml0cm8sIGNvbmZpZzogUm9sbHVwQ29uZmlnKSA9PiB7XG4gICAgICAoY29uZmlnLnBsdWdpbnMgYXMgQXJyYXk8dW5rbm93bj4pLnVuc2hpZnQoXG4gICAgICAgIGNyZWF0ZVdvcmtmbG93Rm9yY2VJbmxpbmVQbHVnaW4oXG4gICAgICAgICAgd29ya2Zsb3dUYXJnZXRXb3JsZCxcbiAgICAgICAgICBuaXRyby5vcHRpb25zLmFsaWFzW1dPUktGTE9XX1dPUkxEX1RBUkdFVF9NT0RVTEVdXG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgdHNDb25maWcgcGx1Z2luXG4gICAgaWYgKG5pdHJvLm9wdGlvbnMud29ya2Zsb3c/LnR5cGVzY3JpcHRQbHVnaW4pIHtcbiAgICAgIG5pdHJvLm9wdGlvbnMudHlwZXNjcmlwdC50c0NvbmZpZyB8fD0ge307XG4gICAgICBuaXRyby5vcHRpb25zLnR5cGVzY3JpcHQudHNDb25maWcuY29tcGlsZXJPcHRpb25zIHx8PSB7fTtcbiAgICAgIG5pdHJvLm9wdGlvbnMudHlwZXNjcmlwdC50c0NvbmZpZy5jb21waWxlck9wdGlvbnMucGx1Z2lucyB8fD0gW107XG4gICAgICBuaXRyby5vcHRpb25zLnR5cGVzY3JpcHQudHNDb25maWcuY29tcGlsZXJPcHRpb25zLnBsdWdpbnMucHVzaCh7XG4gICAgICAgIG5hbWU6ICd3b3JrZmxvdycsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBOaXRybyB2MiBWZXJjZWwgZGVwbG95OiBrZWVwIHRoZSBsZWdhY3kgQnVpbGQgT3V0cHV0IEFQSSBwYXRoIHRoYXRcbiAgICAvLyBidWlsZHMgdGhlIHdvcmtmbG93IGZ1bmN0aW9ucyBzdGFuZGFsb25lIGFuZCBzdGl0Y2hlcyB0aGUgcm91dGVzIGludG9cbiAgICAvLyBgLnZlcmNlbC9vdXRwdXQvY29uZmlnLmpzb25gLiBUaGlzIHBhdGggaXMgaW5kZXBlbmRlbnQgb2Ygbml0cm8ncyBvd25cbiAgICAvLyBidW5kbGUgYW5kIGlzIG9ubHkgdXNlZCBmb3Igbml0cm9wYWNrIHYyIChlLmcuIE51eHQgNCBzdGlsbCB1c2VzIGl0KS5cbiAgICBjb25zdCB1c2VMZWdhY3lWZXJjZWxCdWlsZCA9IGlzVmVyY2VsRGVwbG95ICYmIGlzTml0cm9WMihuaXRybyk7XG5cbiAgICBpZiAodXNlTGVnYWN5VmVyY2VsQnVpbGQpIHtcbiAgICAgIG5pdHJvLmhvb2tzLmhvb2soJ2NvbXBpbGVkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBuZXcgVmVyY2VsQnVpbGRlcihuaXRybykuYnVpbGQoKTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIExvY2FsIGRldi9wcm9kIGFuZCBOaXRybyB2MyBWZXJjZWwgZGVwbG95IHNoYXJlIHRoZSBzYW1lIHBhdGg6XG4gICAgLy8gYnVuZGxlIHRoZSB3b3JrZmxvdyByb3V0ZXMgaW50byBuaXRybyBpdHNlbGYgdmlhIHZpcnR1YWwgaGFuZGxlcnMuXG4gICAgLy8gRm9yIFZlcmNlbCB2MyB3ZSBhZGRpdGlvbmFsbHkgY29uZmlndXJlIGBmdW5jdGlvblJ1bGVzYCBzbyB0aGVcbiAgICAvLyByb3V0ZXMgZ2V0IHF1ZXVlIHRyaWdnZXJzICsgZXh0ZW5kZWQgbWF4RHVyYXRpb24gdmlhIHRoZSBuaXRyb1xuICAgIC8vIHZlcmNlbCBwcmVzZXQuIFRoaXMgbGV0cyB3b3JrZmxvdyBoYW5kbGVycyB1c2Ugbml0cm8gZmVhdHVyZXNcbiAgICAvLyAoc3RvcmFnZSwgZGF0YWJhc2UsIHJ1bnRpbWUgY29uZmlnLCB2aXJ0dWFsIGltcG9ydHMsIGV0Yy4pLlxuICAgIGlmICghdXNlTGVnYWN5VmVyY2VsQnVpbGQpIHtcbiAgICAgIGNvbnN0IGJ1aWxkZXIgPSBuZXcgTG9jYWxCdWlsZGVyKG5pdHJvKTtcbiAgICAgIGxldCBpc0luaXRpYWxCdWlsZCA9IHRydWU7XG5cbiAgICAgIG5pdHJvLmhvb2tzLmhvb2soJ2J1aWxkOmJlZm9yZScsIGFzeW5jICgpID0+IHtcbiAgICAgICAgYXdhaXQgYnVpbGRlci5idWlsZCgpO1xuXG4gICAgICAgIC8vIEZvciBwcm9kOiB3cml0ZSB0aGUgbWFuaWZlc3QgaGFuZGxlciBmaWxlIHdpdGggaW5saW5lZCBjb250ZW50XG4gICAgICAgIC8vIG5vdyB0aGF0IHRoZSBidWlsZGVyIGhhcyBnZW5lcmF0ZWQgdGhlIG1hbmlmZXN0LiBSb2xsdXAgd2lsbFxuICAgICAgICAvLyBidW5kbGUgdGhpcyBmaWxlIGludG8gdGhlIGNvbXBpbGVkIG91dHB1dC5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICFuaXRyby5vcHRpb25zLmRldiAmJlxuICAgICAgICAgIHByb2Nlc3MuZW52LldPUktGTE9XX1BVQkxJQ19NQU5JRkVTVCA9PT0gJzEnXG4gICAgICAgICkge1xuICAgICAgICAgIHdyaXRlTWFuaWZlc3RIYW5kbGVyKG5pdHJvKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG5cbiAgICAgIC8vIEFsbG93cyBmb3IgSE1SIC0gYnV0IHNraXAgdGhlIGZpcnN0IGRldjpyZWxvYWQgc2luY2UgYnVpbGQ6YmVmb3JlIGFscmVhZHkgcmFuXG4gICAgICBpZiAobml0cm8ub3B0aW9ucy5kZXYpIHtcbiAgICAgICAgbml0cm8uaG9va3MuaG9vaygnZGV2OnJlbG9hZCcsIGFzeW5jICgpID0+IHtcbiAgICAgICAgICBpZiAoaXNJbml0aWFsQnVpbGQpIHtcbiAgICAgICAgICAgIGlzSW5pdGlhbEJ1aWxkID0gZmFsc2U7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIER1cmluZyBkZXYsIGZpbGVzIG1heSBiZSBhZGRlZC9yZW1vdmVkIHdoaWxlIHRoZSBidWlsZGVyXG4gICAgICAgICAgICAvLyBpcyByZWJ1aWxkaW5nIChlLmcuLCBkdXJpbmcgdGVzdCBjbGVhbnVwKS4gTG9nIHRoZSBlcnJvclxuICAgICAgICAgICAgLy8gYnV0IGRvbid0IGNyYXNoIOKAlCB0aGUgbmV4dCBmaWxlIGNoYW5nZSB3aWxsIHRyaWdnZXJcbiAgICAgICAgICAgIC8vIGFub3RoZXIgcmVidWlsZCB3aXRoIHRoZSBjb3JyZWN0IGZpbGUgbGlzdC5cbiAgICAgICAgICAgIGNvbnNvbGUud2FybignV2FybmluZzogV29ya2Zsb3cgcmVidWlsZCBmYWlsZWQ6JywgZXJyb3IpO1xuICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChuaXRyby5vcHRpb25zLmRldikge1xuICAgICAgICBhZGREYXNoYm9hcmRIYW5kbGVyKG5pdHJvKTtcbiAgICAgIH1cblxuICAgICAgYWRkVmlydHVhbEhhbmRsZXIoXG4gICAgICAgIG5pdHJvLFxuICAgICAgICAnLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL3dlYmhvb2svOnRva2VuJyxcbiAgICAgICAgJ3dvcmtmbG93L3dlYmhvb2subWpzJ1xuICAgICAgKTtcblxuICAgICAgLy8gVjI6IHNpbmdsZSBjb21iaW5lZCBoYW5kbGVyIGZvciBib3RoIHdvcmtmbG93IGFuZCBzdGVwIGV4ZWN1dGlvbi5cbiAgICAgIC8vIFRoZSBzdGVwIHJlZ2lzdHJhdGlvbnMgYXJlIGltcG9ydGVkIGFzIHNpZGUgZWZmZWN0cyBieSB0aGUgY29tYmluZWRcbiAgICAgIC8vIGhhbmRsZXIg4oCUIG5vIHNlcGFyYXRlIHN0ZXAgcm91dGUgbmVlZGVkLlxuICAgICAgYWRkVmlydHVhbEhhbmRsZXIoXG4gICAgICAgIG5pdHJvLFxuICAgICAgICAnLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL2Zsb3cnLFxuICAgICAgICAnd29ya2Zsb3cvd29ya2Zsb3dzLm1qcydcbiAgICAgICk7XG5cbiAgICAgIC8vIE5pdHJvIHYzKyBWZXJjZWwgZGVwbG95OiBjb25maWd1cmUgZnVuY3Rpb24gcnVsZXMgZm9yIHRoZSBjb21iaW5lZFxuICAgICAgLy8gZmxvdyBoYW5kbGVyIHNvIGl0IGdldHMgdGhlIHF1ZXVlIHRyaWdnZXJzICsgbWF4IGR1cmF0aW9uIHRoYXQgdGhlXG4gICAgICAvLyB3b3JrZmxvdyBydW50aW1lIG5lZWRzLiBXb3JrZmxvdy1yZXF1aXJlZCBmaWVsZHMgKGBtYXhEdXJhdGlvbmAsXG4gICAgICAvLyBgZXhwZXJpbWVudGFsVHJpZ2dlcnNgLCBgcnVudGltZWAgd2hlbiBzZXQpIHRha2UgcHJlY2VkZW5jZSBvdmVyXG4gICAgICAvLyB1c2VyLXByb3ZpZGVkIHZhbHVlcyBmb3IgdGhlc2Ugcm91dGVzOyB1bnJlbGF0ZWQgZmllbGRzIHRoZSB1c2VyXG4gICAgICAvLyBzZXRzIChlLmcuIGBtZW1vcnlgKSBwYXNzIHRocm91Z2ggdW50b3VjaGVkLlxuICAgICAgLy9cbiAgICAgIC8vIFBhdHRlcm4ga2V5cyBtdXN0IG1hdGNoIHRoZSByb3V0ZSBwYXR0ZXJucyB0aGUgaGFuZGxlcnMgYXJlXG4gICAgICAvLyByZWdpc3RlcmVkIHdpdGggc28gbml0cm8gcmV1c2VzIHRoZSBzYW1lIGZ1bmN0aW9uIGRpcmVjdG9yeS5cbiAgICAgIC8vIFVzaW5nIGEgYHdlYmhvb2svKipgIGNhdGNoLWFsbCBoZXJlIHdvdWxkIGNyZWF0ZSBhIHNlY29uZFxuICAgICAgLy8gYHdlYmhvb2svWy4uLl0uZnVuY2AgbmV4dCB0byB0aGUgYHdlYmhvb2svW3Rva2VuXS5mdW5jYCB0aGF0XG4gICAgICAvLyBgYWRkVmlydHVhbEhhbmRsZXJgIHByb2R1Y2VzLlxuICAgICAgaWYgKGlzVmVyY2VsRGVwbG95KSB7XG4gICAgICAgIG5pdHJvLm9wdGlvbnMudmVyY2VsID8/PSB7fTtcbiAgICAgICAgbml0cm8ub3B0aW9ucy52ZXJjZWwuZnVuY3Rpb25SdWxlcyA/Pz0ge307XG5cbiAgICAgICAgY29uc3QgcnVudGltZSA9IG5pdHJvLm9wdGlvbnMud29ya2Zsb3c/LnJ1bnRpbWU7XG4gICAgICAgIGNvbnN0IHJ1bGVzID0gbml0cm8ub3B0aW9ucy52ZXJjZWwuZnVuY3Rpb25SdWxlcztcblxuICAgICAgICBjb25zdCBmbG93UGF0aCA9ICcvLndlbGwta25vd24vd29ya2Zsb3cvdjEvZmxvdyc7XG4gICAgICAgIHJ1bGVzW2Zsb3dQYXRoXSA9IHtcbiAgICAgICAgICAuLi5ydWxlc1tmbG93UGF0aF0sXG4gICAgICAgICAgLi4uKHJ1bnRpbWUgJiYgeyBydW50aW1lIH0pLFxuICAgICAgICAgIG1heER1cmF0aW9uOiAnbWF4JyxcbiAgICAgICAgICAvLyBWMiBjb21iaW5lZDogYSBzaW5nbGUgdHJpZ2dlciBjb3ZlcnMgYm90aCBgX193a2Zfd29ya2Zsb3dfKmBcbiAgICAgICAgICAvLyAod29ya2Zsb3cgb3JjaGVzdHJhdGlvbikgYW5kIGBfX3drZl9zdGVwXypgIChzdGVwIGV4ZWN1dGlvbiksXG4gICAgICAgICAgLy8gc2luY2UgdGhlIHNhbWUgaGFuZGxlciBkaXNwYXRjaGVzIGJvdGguXG4gICAgICAgICAgZXhwZXJpbWVudGFsVHJpZ2dlcnM6IFtXT1JLRkxPV19RVUVVRV9UUklHR0VSXSxcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAocnVudGltZSkge1xuICAgICAgICAgIGNvbnN0IHdlYmhvb2tQYXRoID0gJy8ud2VsbC1rbm93bi93b3JrZmxvdy92MS93ZWJob29rLzp0b2tlbic7XG4gICAgICAgICAgcnVsZXNbd2ViaG9va1BhdGhdID0geyAuLi5ydWxlc1t3ZWJob29rUGF0aF0sIHJ1bnRpbWUgfTtcblxuICAgICAgICAgIGlmIChwcm9jZXNzLmVudi5XT1JLRkxPV19QVUJMSUNfTUFOSUZFU1QgPT09ICcxJykge1xuICAgICAgICAgICAgY29uc3QgbWFuaWZlc3RQYXRoID0gJy8ud2VsbC1rbm93bi93b3JrZmxvdy92MS9tYW5pZmVzdC5qc29uJztcbiAgICAgICAgICAgIHJ1bGVzW21hbmlmZXN0UGF0aF0gPSB7IC4uLnJ1bGVzW21hbmlmZXN0UGF0aF0sIHJ1bnRpbWUgfTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gRXhwb3NlIG1hbmlmZXN0IGFzIGEgcHVibGljIEhUVFAgcm91dGUgd2hlbiBXT1JLRkxPV19QVUJMSUNfTUFOSUZFU1Q9MVxuICAgICAgaWYgKHByb2Nlc3MuZW52LldPUktGTE9XX1BVQkxJQ19NQU5JRkVTVCA9PT0gJzEnKSB7XG4gICAgICAgIC8vIFdyaXRlIGEgcGxhY2Vob2xkZXIgbWFuaWZlc3QtZGF0YS5tanMgc28gcm9sbHVwIGNhbiByZXNvbHZlIHRoZVxuICAgICAgICAvLyBpbXBvcnQuIEl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2l0aCB0aGUgcmVhbCBtYW5pZmVzdCBpbiBidWlsZDpiZWZvcmUuXG4gICAgICAgIC8vIFdyaXRlIGEgcGxhY2Vob2xkZXIgaGFuZGxlciBmaWxlIHNvIHJvbGx1cCBjYW4gcmVzb2x2ZSB0aGUgcGF0aFxuICAgICAgICAvLyBkdXJpbmcgcHJvZCBjb21waWxhdGlvbi4gSXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSByZWFsXG4gICAgICAgIC8vIG1hbmlmZXN0IGNvbnRlbnQgYnkgd3JpdGVNYW5pZmVzdEhhbmRsZXIoKSBpbiBidWlsZDpiZWZvcmUuXG4gICAgICAgIGlmICghbml0cm8ub3B0aW9ucy5kZXYpIHtcbiAgICAgICAgICBjb25zdCBkaXIgPSBqb2luKG5pdHJvLm9wdGlvbnMuYnVpbGREaXIsICd3b3JrZmxvdycpO1xuICAgICAgICAgIG1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuICAgICAgICAgIGNvbnN0IGhhbmRsZXJQYXRoID0gam9pbihkaXIsICdtYW5pZmVzdC1oYW5kbGVyLm1qcycpO1xuICAgICAgICAgIHdyaXRlRmlsZVN5bmMoXG4gICAgICAgICAgICBoYW5kbGVyUGF0aCxcbiAgICAgICAgICAgICdleHBvcnQgZGVmYXVsdCBhc3luYyAoKSA9PiBuZXcgUmVzcG9uc2UoXCJNYW5pZmVzdCBub3QgZm91bmRcIiwgeyBzdGF0dXM6IDQwNCB9KTtcXG4nXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBhZGRNYW5pZmVzdEhhbmRsZXIobml0cm8pO1xuICAgICAgfVxuICAgIH1cbiAgfSxcbn0gc2F0aXNmaWVzIE5pdHJvTW9kdWxlO1xuXG5jb25zdCBEQVNIQk9BUkRfVklSVFVBTF9JRCA9ICcjd29ya2Zsb3cvZGFzaGJvYXJkLWhhbmRsZXInO1xuXG5mdW5jdGlvbiBhZGREYXNoYm9hcmRIYW5kbGVyKG5pdHJvOiBOaXRybykge1xuICBjb25zdCByb3V0ZSA9ICcvX3dvcmtmbG93JztcbiAgbml0cm8ub3B0aW9ucy5oYW5kbGVycy5wdXNoKHsgcm91dGUsIGhhbmRsZXI6IERBU0hCT0FSRF9WSVJUVUFMX0lEIH0pO1xuXG4gIC8vIFJlc29sdmUgYEB3b3JrZmxvdy93ZWIvc2VydmVyYCByZWxhdGl2ZSB0byB0aGlzIG1vZHVsZSBzbyBjb25zdW1lcnMgZG9uJ3RcbiAgLy8gbmVlZCBhIGRpcmVjdCBkZXBlbmRlbmN5IG9uIGBAd29ya2Zsb3cvd2ViYC4gVGhlIHBhdGggaXMgaW5saW5lZCBpbnRvIHRoZVxuICAvLyB2aXJ0dWFsIGhhbmRsZXIgYXMgYSBmaWxlOi8vIFVSTCBzbyBOb2RlIGNhbiBgaW1wb3J0KClgIGl0IGF0IHJ1bnRpbWVcbiAgLy8gcmVnYXJkbGVzcyBvZiB3aGVyZSB0aGUgZ2VuZXJhdGVkIE5pdHJvIGJ1bmRsZSBlbmRzIHVwLlxuICBjb25zdCByZXF1aXJlXyA9IGNyZWF0ZVJlcXVpcmUoaW1wb3J0Lm1ldGEudXJsKTtcbiAgbGV0IHdlYlNlcnZlclVybDogc3RyaW5nO1xuICB0cnkge1xuICAgIHdlYlNlcnZlclVybCA9IHBhdGhUb0ZpbGVVUkwocmVxdWlyZV8ucmVzb2x2ZSgnQHdvcmtmbG93L3dlYi9zZXJ2ZXInKSkuaHJlZjtcbiAgfSBjYXRjaCB7XG4gICAgd2ViU2VydmVyVXJsID0gJ0B3b3JrZmxvdy93ZWIvc2VydmVyJztcbiAgfVxuXG4gIGNvbnN0IGhhbmRsZXJTb3VyY2UgPSAvKiBqcyAqLyBgXG4gICAgY29uc3QgX193b3JrZmxvd1dlYlNlcnZlclVybCA9ICR7SlNPTi5zdHJpbmdpZnkod2ViU2VydmVyVXJsKX07XG4gICAgbGV0IHNlcnZlclByb21pc2UgPSBudWxsO1xuICAgIGFzeW5jIGZ1bmN0aW9uIGdldERhc2hib2FyZFVybCgpIHtcbiAgICAgIGlmICghc2VydmVyUHJvbWlzZSkge1xuICAgICAgICBzZXJ2ZXJQcm9taXNlID0gKGFzeW5jICgpID0+IHtcbiAgICAgICAgICBjb25zdCB7IHN0YXJ0U2VydmVyIH0gPSBhd2FpdCBpbXBvcnQoLyogQHZpdGUtaWdub3JlICovIC8qIHdlYnBhY2tJZ25vcmU6IHRydWUgKi8gX193b3JrZmxvd1dlYlNlcnZlclVybCk7XG4gICAgICAgICAgY29uc3Qgc2VydmVyID0gYXdhaXQgc3RhcnRTZXJ2ZXIoMCk7XG4gICAgICAgICAgY29uc3QgYWRkcmVzcyA9IHNlcnZlci5hZGRyZXNzKCk7XG4gICAgICAgICAgY29uc3QgcG9ydCA9IHR5cGVvZiBhZGRyZXNzID09PSAnb2JqZWN0JyAmJiBhZGRyZXNzID8gYWRkcmVzcy5wb3J0IDogMzQ1NjtcbiAgICAgICAgICByZXR1cm4gJ2h0dHA6Ly9sb2NhbGhvc3Q6JyArIHBvcnQ7XG4gICAgICAgIH0pKCkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgc2VydmVyUHJvbWlzZSA9IG51bGw7XG4gICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHNlcnZlclByb21pc2U7XG4gICAgfVxuICBgO1xuXG4gIGlmICghbml0cm8ucm91dGluZykge1xuICAgIG5pdHJvLm9wdGlvbnMudmlydHVhbFtEQVNIQk9BUkRfVklSVFVBTF9JRF0gPSAvKiBqcyAqLyBgXG4gICAgICBpbXBvcnQgeyBmcm9tV2ViSGFuZGxlciB9IGZyb20gXCJoM1wiO1xuICAgICAgJHtoYW5kbGVyU291cmNlfVxuICAgICAgZXhwb3J0IGRlZmF1bHQgZnJvbVdlYkhhbmRsZXIoYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IGdldERhc2hib2FyZFVybCgpO1xuICAgICAgICAgIHJldHVybiBSZXNwb25zZS5yZWRpcmVjdCh1cmwsIDMwMik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHN0YXJ0IHdvcmtmbG93IGRhc2hib2FyZDonLCBlcnJvcik7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSgnRmFpbGVkIHRvIHN0YXJ0IHdvcmtmbG93IGRhc2hib2FyZDogJyArIGVycm9yLm1lc3NhZ2UsIHsgc3RhdHVzOiA1MDAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIGA7XG4gIH0gZWxzZSB7XG4gICAgbml0cm8ub3B0aW9ucy52aXJ0dWFsW0RBU0hCT0FSRF9WSVJUVUFMX0lEXSA9IC8qIGpzICovIGBcbiAgICAgICR7aGFuZGxlclNvdXJjZX1cbiAgICAgIGV4cG9ydCBkZWZhdWx0IGFzeW5jICgpID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCB1cmwgPSBhd2FpdCBnZXREYXNoYm9hcmRVcmwoKTtcbiAgICAgICAgICByZXR1cm4gUmVzcG9uc2UucmVkaXJlY3QodXJsLCAzMDIpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0ZhaWxlZCB0byBzdGFydCB3b3JrZmxvdyBkYXNoYm9hcmQ6JywgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoJ0ZhaWxlZCB0byBzdGFydCB3b3JrZmxvdyBkYXNoYm9hcmQ6ICcgKyBlcnJvci5tZXNzYWdlLCB7IHN0YXR1czogNTAwIH0pO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgIGA7XG4gIH1cbn1cblxudHlwZSBWaXJ0dWFsSGFuZGxlclBhdGggPSAnd29ya2Zsb3cvd2ViaG9vay5tanMnIHwgJ3dvcmtmbG93L3dvcmtmbG93cy5tanMnO1xuXG5mdW5jdGlvbiBnZXRTdGF0aWNJbXBvcnRTcGVjaWZpZXIoaWQ6IHN0cmluZyk6IHN0cmluZyB7XG4gIGlmIChpZC5zdGFydHNXaXRoKCdmaWxlOi8vJykpIHtcbiAgICByZXR1cm4gaWQ7XG4gIH1cbiAgaWYgKGlkLnN0YXJ0c1dpdGgoJy8nKSB8fCAvXltBLVphLXpdOltcXFxcL10vLnRlc3QoaWQpKSB7XG4gICAgcmV0dXJuIHBhdGhUb0ZpbGVVUkwoaWQpLmhyZWY7XG4gIH1cbiAgcmV0dXJuIGlkO1xufVxuXG5mdW5jdGlvbiBjcmVhdGVEZXZXb3JsZFRhcmdldFNvdXJjZShuaXRybzogTml0cm8pOiBzdHJpbmcge1xuICBjb25zdCB3b3JrZmxvd1RhcmdldFdvcmxkQWxpYXMgPVxuICAgIG5pdHJvLm9wdGlvbnMuYWxpYXNbV09SS0ZMT1dfV09STERfVEFSR0VUX01PRFVMRV07XG4gIGlmICh0eXBlb2Ygd29ya2Zsb3dUYXJnZXRXb3JsZEFsaWFzICE9PSAnc3RyaW5nJykge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBNaXNzaW5nICR7V09SS0ZMT1dfV09STERfVEFSR0VUX01PRFVMRX0gYWxpYXMgZm9yIE5pdHJvIGRldiB3b3JrZmxvdyBoYW5kbGVyYFxuICAgICk7XG4gIH1cblxuICBjb25zdCB3b3JrZmxvd1RhcmdldFdvcmxkSW1wb3J0ID0gSlNPTi5zdHJpbmdpZnkoXG4gICAgZ2V0U3RhdGljSW1wb3J0U3BlY2lmaWVyKHdvcmtmbG93VGFyZ2V0V29ybGRBbGlhcylcbiAgKTtcbiAgY29uc3Qgd29ya2Zsb3dDb3JlUnVudGltZUltcG9ydCA9IEpTT04uc3RyaW5naWZ5KFxuICAgIGdldFN0YXRpY0ltcG9ydFNwZWNpZmllcihcbiAgICAgIHJlc29sdmVXb3JrZmxvd0NvcmVSdW50aW1lQWxpYXMoeyB3b3JraW5nRGlyOiBuaXRyby5vcHRpb25zLnJvb3REaXIgfSlcbiAgICApXG4gICk7XG5cbiAgcmV0dXJuIC8qIGpzICovIGBcbiAgICAgIGltcG9ydCB7XG4gICAgICAgIGNyZWF0ZVdvcmxkRnJvbU1vZHVsZSBhcyBfX3dvcmtmbG93Q3JlYXRlV29ybGRGcm9tTW9kdWxlLFxuICAgICAgICBzZXRXb3JsZCBhcyBfX3dvcmtmbG93U2V0V29ybGQsXG4gICAgICB9IGZyb20gJHt3b3JrZmxvd0NvcmVSdW50aW1lSW1wb3J0fTtcbiAgICAgIGltcG9ydCAqIGFzIF9fd29ya2Zsb3dUYXJnZXRXb3JsZCBmcm9tICR7d29ya2Zsb3dUYXJnZXRXb3JsZEltcG9ydH07XG5cbiAgICAgIGxldCBfX3dvcmtmbG93V29ybGRQcm9taXNlID0gbnVsbDtcblxuICAgICAgYXN5bmMgZnVuY3Rpb24gZW5zdXJlV29ya2Zsb3dXb3JsZCgpIHtcbiAgICAgICAgaWYgKCFfX3dvcmtmbG93V29ybGRQcm9taXNlKSB7XG4gICAgICAgICAgX193b3JrZmxvd1dvcmxkUHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgICAgIF9fd29ya2Zsb3dDcmVhdGVXb3JsZEZyb21Nb2R1bGUoX193b3JrZmxvd1RhcmdldFdvcmxkKVxuICAgICAgICAgICkudGhlbihfX3dvcmtmbG93U2V0V29ybGQpO1xuICAgICAgICB9XG4gICAgICAgIGF3YWl0IF9fd29ya2Zsb3dXb3JsZFByb21pc2U7XG4gICAgICB9XG4gIGA7XG59XG5cbmZ1bmN0aW9uIGFkZFZpcnR1YWxIYW5kbGVyKFxuICBuaXRybzogTml0cm8sXG4gIHJvdXRlOiBzdHJpbmcsXG4gIGJ1aWxkUGF0aDogVmlydHVhbEhhbmRsZXJQYXRoXG4pIHtcbiAgbml0cm8ub3B0aW9ucy5oYW5kbGVycy5wdXNoKHtcbiAgICByb3V0ZSxcbiAgICBoYW5kbGVyOiBgIyR7YnVpbGRQYXRofWAsXG4gIH0pO1xuICBjb25zdCBoYW5kbGVySW1wb3J0UGF0aCA9IEpTT04uc3RyaW5naWZ5KFxuICAgIGpvaW4obml0cm8ub3B0aW9ucy5idWlsZERpciwgYnVpbGRQYXRoKVxuICApO1xuICBjb25zdCBzdGVwc0ltcG9ydFBhdGggPSBKU09OLnN0cmluZ2lmeShcbiAgICBqb2luKG5pdHJvLm9wdGlvbnMuYnVpbGREaXIsICd3b3JrZmxvdy9zdGVwcy5tanMnKVxuICApO1xuICBjb25zdCBwcmVsb2FkU3RlcHM6IFJlY29yZDxWaXJ0dWFsSGFuZGxlclBhdGgsIHN0cmluZz4gPSB7XG4gICAgJ3dvcmtmbG93L3dlYmhvb2subWpzJzogJycsXG4gICAgJ3dvcmtmbG93L3dvcmtmbG93cy5tanMnOiBgYXdhaXQgaW1wb3J0KC8qIEB2aXRlLWlnbm9yZSAqLyBwYXRoVG9GaWxlVVJMKCR7c3RlcHNJbXBvcnRQYXRofSkuaHJlZiArIFwiP3Q9XCIgKyB2ZXJzaW9uKTtgLFxuICB9O1xuXG4gIGlmIChuaXRyby5vcHRpb25zLmRldikge1xuICAgIGNvbnN0IGRldldvcmxkVGFyZ2V0U291cmNlID0gY3JlYXRlRGV2V29ybGRUYXJnZXRTb3VyY2Uobml0cm8pO1xuICAgIC8vIERldiBtb2RlOiBsb2FkIGdlbmVyYXRlZCB3b3JrZmxvdyBidW5kbGVzIGZyb20gZGlzayBhdCByZXF1ZXN0IHRpbWUuXG4gICAgLy8gVGhpcyBrZWVwcyBgLm5pdHJvL3dvcmtmbG93LyoubWpzYCBvdXQgb2YgTml0cm8ncyBvd24gYnVuZGxlIGdyYXBoLFxuICAgIC8vIHdoaWNoIGF2b2lkcyByZWJ1aWxkIGxvb3BzIGFuZCBzdGFsZSBkZXBlbmRlbmN5IGdyYXBocyBkdXJpbmcgSE1SLlxuICAgIC8vIENhY2hlLWJ1c3QgYnkgZmlsZSBtdGltZSBzbyBlYWNoIHN1Y2Nlc3NmdWwgcmVidWlsZCBsb2FkcyBmcmVzaCBjb2RlLlxuICAgIGlmICghbml0cm8ucm91dGluZykge1xuICAgICAgbml0cm8ub3B0aW9ucy52aXJ0dWFsW2AjJHtidWlsZFBhdGh9YF0gPSAvKiBqcyAqLyBgXG4gICAgICBpbXBvcnQgeyBmcm9tV2ViSGFuZGxlciB9IGZyb20gXCJoM1wiO1xuICAgICAgaW1wb3J0IHsgc3RhdFN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuICAgICAgaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gXCJub2RlOnVybFwiO1xuICAgICAgJHtkZXZXb3JsZFRhcmdldFNvdXJjZX1cblxuICAgICAgY29uc3QgaGFuZGxlclBhdGggPSAke2hhbmRsZXJJbXBvcnRQYXRofTtcbiAgICAgIGxldCBjdXJyZW50VmVyc2lvbiA9IFwiXCI7XG4gICAgICBsZXQgY3VycmVudEltcG9ydFBhdGggPSBcIlwiO1xuXG4gICAgICBhc3luYyBmdW5jdGlvbiBsb2FkUE9TVCgpIHtcbiAgICAgICAgYXdhaXQgZW5zdXJlV29ya2Zsb3dXb3JsZCgpO1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gU3RyaW5nKHN0YXRTeW5jKGhhbmRsZXJQYXRoKS5tdGltZU1zKTtcbiAgICAgICAgaWYgKHZlcnNpb24gIT09IGN1cnJlbnRWZXJzaW9uKSB7XG4gICAgICAgICAgY3VycmVudFZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICAgIGN1cnJlbnRJbXBvcnRQYXRoID0gcGF0aFRvRmlsZVVSTChoYW5kbGVyUGF0aCkuaHJlZiArIFwiP3Q9XCIgKyB2ZXJzaW9uO1xuICAgICAgICAgICR7cHJlbG9hZFN0ZXBzW2J1aWxkUGF0aF19XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIChhd2FpdCBpbXBvcnQoY3VycmVudEltcG9ydFBhdGgpKS5QT1NUO1xuICAgICAgfVxuXG4gICAgICBleHBvcnQgZGVmYXVsdCBmcm9tV2ViSGFuZGxlcihhc3luYyAocmVxdWVzdCwgY29udGV4dCkgPT4ge1xuICAgICAgICBjb25zdCBQT1NUID0gYXdhaXQgbG9hZFBPU1QoKTtcbiAgICAgICAgcmV0dXJuIFBPU1QocmVxdWVzdCwgY29udGV4dCk7XG4gICAgICB9KTtcbiAgICBgO1xuICAgIH0gZWxzZSB7XG4gICAgICBuaXRyby5vcHRpb25zLnZpcnR1YWxbYCMke2J1aWxkUGF0aH1gXSA9IC8qIGpzICovIGBcbiAgICAgIGltcG9ydCB7IHN0YXRTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbiAgICAgIGltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tIFwibm9kZTp1cmxcIjtcbiAgICAgICR7ZGV2V29ybGRUYXJnZXRTb3VyY2V9XG5cbiAgICAgIGNvbnN0IGhhbmRsZXJQYXRoID0gJHtoYW5kbGVySW1wb3J0UGF0aH07XG4gICAgICBsZXQgY3VycmVudFZlcnNpb24gPSBcIlwiO1xuICAgICAgbGV0IGN1cnJlbnRJbXBvcnRQYXRoID0gXCJcIjtcblxuICAgICAgYXN5bmMgZnVuY3Rpb24gbG9hZFBPU1QoKSB7XG4gICAgICAgIGF3YWl0IGVuc3VyZVdvcmtmbG93V29ybGQoKTtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IFN0cmluZyhzdGF0U3luYyhoYW5kbGVyUGF0aCkubXRpbWVNcyk7XG4gICAgICAgIGlmICh2ZXJzaW9uICE9PSBjdXJyZW50VmVyc2lvbikge1xuICAgICAgICAgIGN1cnJlbnRWZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgICBjdXJyZW50SW1wb3J0UGF0aCA9IHBhdGhUb0ZpbGVVUkwoaGFuZGxlclBhdGgpLmhyZWYgKyBcIj90PVwiICsgdmVyc2lvbjtcbiAgICAgICAgICAke3ByZWxvYWRTdGVwc1tidWlsZFBhdGhdfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoYXdhaXQgaW1wb3J0KGN1cnJlbnRJbXBvcnRQYXRoKSkuUE9TVDtcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IGRlZmF1bHQgYXN5bmMgKHsgcmVxIH0pID0+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICBjb25zdCBQT1NUID0gYXdhaXQgbG9hZFBPU1QoKTtcbiAgICAgICAgICByZXR1cm4gYXdhaXQgUE9TVChyZXEpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ0hhbmRsZXIgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoJ0ludGVybmFsIFNlcnZlciBFcnJvcicsIHsgc3RhdHVzOiA1MDAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgYDtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gS2VlcCBhIGJhcmUgaW1wb3J0IGFsb25nc2lkZSBgUE9TVGA6IGluIE51eHQgKyBOaXRybyBwcm9kdWN0aW9uIGJ1aWxkc1xuICAvLyB1c2luZyBgQHdvcmtmbG93L251eHRgLCBpbXBvcnRpbmcgb25seSBgUE9TVGAgY291bGQgZHJvcCB0aGUgZ2VuZXJhdGVkXG4gIC8vIHN0ZXAgYnVuZGxlJ3MgdG9wLWxldmVsIHJlZ2lzdHJhdGlvbnMsIHNvIHRoZSBoYW5kbGVyIGxvYWRlZCBidXQgc3RlcHNcbiAgLy8gd2VyZSBtaXNzaW5nIGF0IHJ1bnRpbWUuXG5cbiAgaWYgKCFuaXRyby5yb3V0aW5nKSB7XG4gICAgLy8gTml0cm8gdjIgKGxlZ2FjeSlcbiAgICBuaXRyby5vcHRpb25zLnZpcnR1YWxbYCMke2J1aWxkUGF0aH1gXSA9IC8qIGpzICovIGBcbiAgICBpbXBvcnQgJHtoYW5kbGVySW1wb3J0UGF0aH07XG4gICAgaW1wb3J0IHsgZnJvbVdlYkhhbmRsZXIgfSBmcm9tIFwiaDNcIjtcbiAgICBpbXBvcnQgeyBQT1NUIH0gZnJvbSAke2hhbmRsZXJJbXBvcnRQYXRofTtcbiAgICBleHBvcnQgZGVmYXVsdCBmcm9tV2ViSGFuZGxlcihQT1NUKTtcbiAgYDtcbiAgfSBlbHNlIHtcbiAgICAvLyBOaXRybyB2MysgKG5hdGl2ZSB3ZWIgaGFuZGxlcnMpXG4gICAgbml0cm8ub3B0aW9ucy52aXJ0dWFsW2AjJHtidWlsZFBhdGh9YF0gPSAvKiBqcyAqLyBgXG4gICAgaW1wb3J0ICR7aGFuZGxlckltcG9ydFBhdGh9O1xuICAgIGltcG9ydCB7IFBPU1QgfSBmcm9tICR7aGFuZGxlckltcG9ydFBhdGh9O1xuICAgIGV4cG9ydCBkZWZhdWx0IGFzeW5jICh7IHJlcSB9KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICByZXR1cm4gYXdhaXQgUE9TVChyZXEpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5lcnJvcignSGFuZGxlciBlcnJvcjonLCBlcnJvcik7XG4gICAgICAgIHJldHVybiBuZXcgUmVzcG9uc2UoJ0ludGVybmFsIFNlcnZlciBFcnJvcicsIHsgc3RhdHVzOiA1MDAgfSk7XG4gICAgICB9XG4gICAgfTtcbiAgYDtcbiAgfVxufVxuXG5jb25zdCBNQU5JRkVTVF9WSVJUVUFMX0lEID0gJyN3b3JrZmxvdy9tYW5pZmVzdC1oYW5kbGVyJztcblxuZnVuY3Rpb24gYWRkTWFuaWZlc3RIYW5kbGVyKG5pdHJvOiBOaXRybykge1xuICBjb25zdCByb3V0ZSA9ICcvLndlbGwta25vd24vd29ya2Zsb3cvdjEvbWFuaWZlc3QuanNvbic7XG4gIGNvbnN0IG1hbmlmZXN0UGF0aCA9IGpvaW4obml0cm8ub3B0aW9ucy5idWlsZERpciwgJ3dvcmtmbG93L21hbmlmZXN0Lmpzb24nKTtcbiAgY29uc3QgaGFuZGxlclBhdGggPSBqb2luKFxuICAgIG5pdHJvLm9wdGlvbnMuYnVpbGREaXIsXG4gICAgJ3dvcmtmbG93L21hbmlmZXN0LWhhbmRsZXIubWpzJ1xuICApO1xuXG4gIGlmIChuaXRyby5vcHRpb25zLmRldikge1xuICAgIC8vIERldiBtb2RlOiB1c2UgYSB2aXJ0dWFsIGhhbmRsZXIgdGhhdCByZWFkcyB0aGUgbWFuaWZlc3QgZnJvbSBkaXNrIGF0XG4gICAgLy8gcmVxdWVzdCB0aW1lLiBUaGUgYWJzb2x1dGUgcGF0aCBpcyB2YWxpZCBiZWNhdXNlIHdlJ3JlIG9uIHRoZSBidWlsZCBtYWNoaW5lLlxuICAgIG5pdHJvLm9wdGlvbnMuaGFuZGxlcnMucHVzaCh7IHJvdXRlLCBoYW5kbGVyOiBNQU5JRkVTVF9WSVJUVUFMX0lEIH0pO1xuICAgIG5pdHJvLm9wdGlvbnMudmlydHVhbFtNQU5JRkVTVF9WSVJUVUFMX0lEXSA9ICFuaXRyby5yb3V0aW5nXG4gICAgICA/IC8qIGpzICovIGBcbiAgICAgIGltcG9ydCB7IGZyb21XZWJIYW5kbGVyIH0gZnJvbSBcImgzXCI7XG4gICAgICBpbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuICAgICAgZnVuY3Rpb24gR0VUKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gcmVhZEZpbGVTeW5jKCR7SlNPTi5zdHJpbmdpZnkobWFuaWZlc3RQYXRoKX0sIFwidXRmLThcIik7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShtYW5pZmVzdCwge1xuICAgICAgICAgICAgaGVhZGVyczogeyBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFwiTWFuaWZlc3Qgbm90IGZvdW5kXCIsIHsgc3RhdHVzOiA0MDQgfSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGV4cG9ydCBkZWZhdWx0IGZyb21XZWJIYW5kbGVyKEdFVCk7XG4gICAgYFxuICAgICAgOiAvKiBqcyAqLyBgXG4gICAgICBpbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuICAgICAgZXhwb3J0IGRlZmF1bHQgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IG1hbmlmZXN0ID0gcmVhZEZpbGVTeW5jKCR7SlNPTi5zdHJpbmdpZnkobWFuaWZlc3RQYXRoKX0sIFwidXRmLThcIik7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZShtYW5pZmVzdCwge1xuICAgICAgICAgICAgaGVhZGVyczogeyBcImNvbnRlbnQtdHlwZVwiOiBcImFwcGxpY2F0aW9uL2pzb25cIiB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKFwiTWFuaWZlc3Qgbm90IGZvdW5kXCIsIHsgc3RhdHVzOiA0MDQgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgYDtcbiAgfSBlbHNlIHtcbiAgICAvLyBQcm9kIG1vZGU6IHJlZ2lzdGVyIGEgcGh5c2ljYWwgaGFuZGxlciBmaWxlIHRoYXQgd2lsbCBiZSB3cml0dGVuIGJ5XG4gICAgLy8gd3JpdGVNYW5pZmVzdEhhbmRsZXIoKSBhZnRlciB0aGUgYnVpbGRlciBnZW5lcmF0ZXMgdGhlIG1hbmlmZXN0LlxuICAgIC8vIFRoaXMgZmlsZSBpcyBidW5kbGVkIGJ5IHJvbGx1cCBpbnRvIHRoZSBjb21waWxlZCBvdXRwdXQuXG4gICAgbml0cm8ub3B0aW9ucy5oYW5kbGVycy5wdXNoKHsgcm91dGUsIGhhbmRsZXI6IGhhbmRsZXJQYXRoIH0pO1xuICB9XG59XG5cbi8qKlxuICogV3JpdGVzIGEgcGh5c2ljYWwgbWFuaWZlc3QgaGFuZGxlciBmaWxlIHdpdGggdGhlIG1hbmlmZXN0IGNvbnRlbnQgaW5saW5lZC5cbiAqIE11c3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBidWlsZGVyIGdlbmVyYXRlcyB0aGUgbWFuaWZlc3QgKGR1cmluZyBidWlsZDpiZWZvcmUpXG4gKiBhbmQgYmVmb3JlIE5pdHJvIGNvbXBpbGVzIHRoZSBidW5kbGUgd2l0aCByb2xsdXAuXG4gKi9cbmZ1bmN0aW9uIHdyaXRlTWFuaWZlc3RIYW5kbGVyKG5pdHJvOiBOaXRybykge1xuICBjb25zdCBtYW5pZmVzdFBhdGggPSBqb2luKG5pdHJvLm9wdGlvbnMuYnVpbGREaXIsICd3b3JrZmxvdy9tYW5pZmVzdC5qc29uJyk7XG4gIGNvbnN0IGhhbmRsZXJQYXRoID0gam9pbihcbiAgICBuaXRyby5vcHRpb25zLmJ1aWxkRGlyLFxuICAgICd3b3JrZmxvdy9tYW5pZmVzdC1oYW5kbGVyLm1qcydcbiAgKTtcbiAgY29uc3QgZGlyID0gam9pbihuaXRyby5vcHRpb25zLmJ1aWxkRGlyLCAnd29ya2Zsb3cnKTtcbiAgbWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgdHJ5IHtcbiAgICBjb25zdCBtYW5pZmVzdENvbnRlbnQgPSByZWFkRmlsZVN5bmMobWFuaWZlc3RQYXRoLCAndXRmLTgnKTtcbiAgICBKU09OLnBhcnNlKG1hbmlmZXN0Q29udGVudCk7IC8vIHZhbGlkYXRlXG5cbiAgICBjb25zdCBoYW5kbGVyQ29kZSA9ICFuaXRyby5yb3V0aW5nXG4gICAgICA/IGBpbXBvcnQgeyBmcm9tV2ViSGFuZGxlciB9IGZyb20gXCJoM1wiO1xuY29uc3QgbWFuaWZlc3QgPSAke0pTT04uc3RyaW5naWZ5KG1hbmlmZXN0Q29udGVudCl9O1xuZXhwb3J0IGRlZmF1bHQgZnJvbVdlYkhhbmRsZXIoKCkgPT4gbmV3IFJlc3BvbnNlKG1hbmlmZXN0LCB7XG4gIGhlYWRlcnM6IHsgXCJjb250ZW50LXR5cGVcIjogXCJhcHBsaWNhdGlvbi9qc29uXCIgfSxcbn0pKTtcbmBcbiAgICAgIDogYGNvbnN0IG1hbmlmZXN0ID0gJHtKU09OLnN0cmluZ2lmeShtYW5pZmVzdENvbnRlbnQpfTtcbmV4cG9ydCBkZWZhdWx0IGFzeW5jICgpID0+IG5ldyBSZXNwb25zZShtYW5pZmVzdCwge1xuICBoZWFkZXJzOiB7IFwiY29udGVudC10eXBlXCI6IFwiYXBwbGljYXRpb24vanNvblwiIH0sXG59KTtcbmA7XG4gICAgd3JpdGVGaWxlU3luYyhoYW5kbGVyUGF0aCwgaGFuZGxlckNvZGUpO1xuICB9IGNhdGNoIHtcbiAgICAvLyBXcml0ZSBhIDQwNCBmYWxsYmFjayBoYW5kbGVyXG4gICAgY29uc3QgZmFsbGJhY2sgPSAhbml0cm8ucm91dGluZ1xuICAgICAgPyBgaW1wb3J0IHsgZnJvbVdlYkhhbmRsZXIgfSBmcm9tIFwiaDNcIjtcbmV4cG9ydCBkZWZhdWx0IGZyb21XZWJIYW5kbGVyKCgpID0+IG5ldyBSZXNwb25zZShcIk1hbmlmZXN0IG5vdCBmb3VuZFwiLCB7IHN0YXR1czogNDA0IH0pKTtcbmBcbiAgICAgIDogYGV4cG9ydCBkZWZhdWx0IGFzeW5jICgpID0+IG5ldyBSZXNwb25zZShcIk1hbmlmZXN0IG5vdCBmb3VuZFwiLCB7IHN0YXR1czogNDA0IH0pO1xuYDtcbiAgICB3cml0ZUZpbGVTeW5jKGhhbmRsZXJQYXRoLCBmYWxsYmFjayk7XG4gIH1cbn1cbiJdfQ==
|
package/dist/types.d.ts
CHANGED
|
@@ -18,6 +18,19 @@ export interface ModuleOptions {
|
|
|
18
18
|
* @example "nodejs24.x"
|
|
19
19
|
*/
|
|
20
20
|
runtime?: string;
|
|
21
|
+
/**
|
|
22
|
+
* Controls how source maps are emitted for workflow bundles. Accepts the
|
|
23
|
+
* same values as esbuild's `sourcemap` option: `true`/`'inline'` (default
|
|
24
|
+
* for step/workflow bundles), `'linked'`, `'external'`, `'both'`, or
|
|
25
|
+
* `false` to omit source maps.
|
|
26
|
+
*
|
|
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
|
+
* point at generated code instead of your source files.
|
|
30
|
+
*
|
|
31
|
+
* Can also be set via the `WORKFLOW_SOURCEMAP` environment variable.
|
|
32
|
+
*/
|
|
33
|
+
sourcemap?: boolean | 'inline' | 'linked' | 'external' | 'both';
|
|
21
34
|
}
|
|
22
35
|
declare module 'nitro/types' {
|
|
23
36
|
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;
|
|
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;CACjE;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/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogRW5hYmxlIHdvcmtmbG93IFR5cGVTY3JpcHQgcGx1Z2luIGluIGdlbmVyYXRlZCB0c2NvbmZpZy5qc29uXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB0eXBlc2NyaXB0UGx1Z2luPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTm9kZS5qcyBydW50aW1lIHZlcnNpb24gZm9yIFZlcmNlbCBGdW5jdGlvbnMuXG4gICAqIEBleGFtcGxlIFwibm9kZWpzMjIueFwiXG4gICAqIEBleGFtcGxlIFwibm9kZWpzMjQueFwiXG4gICAqL1xuICBydW50aW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBob3cgc291cmNlIG1hcHMgYXJlIGVtaXR0ZWQgZm9yIHdvcmtmbG93IGJ1bmRsZXMuIEFjY2VwdHMgdGhlXG4gICAqIHNhbWUgdmFsdWVzIGFzIGVzYnVpbGQncyBgc291cmNlbWFwYCBvcHRpb246IGB0cnVlYC9gJ2lubGluZSdgIChkZWZhdWx0XG4gICAqIGZvciBzdGVwL3dvcmtmbG93IGJ1bmRsZXMpLCBgJ2xpbmtlZCdgLCBgJ2V4dGVybmFsJ2AsIGAnYm90aCdgLCBvclxuICAgKiBgZmFsc2VgIHRvIG9taXQgc291cmNlIG1hcHMuXG4gICAqXG4gICAqIFNldCB0byBgZmFsc2VgIGZvciBzbWFsbGVyIGZ1bmN0aW9uIGJ1bmRsZXMg4oCUIHVzZWZ1bCBmb3Igc3RheWluZyB1bmRlclxuICAgKiB0aGUgVmVyY2VsIDI1ME1CIGZ1bmN0aW9uIHNpemUgbGltaXQg4oCUIGF0IHRoZSBjb3N0IG9mIHN0YWNrIHRyYWNlcyB0aGF0XG4gICAqIHBvaW50IGF0IGdlbmVyYXRlZCBjb2RlIGluc3RlYWQgb2YgeW91ciBzb3VyY2UgZmlsZXMuXG4gICAqXG4gICAqIENhbiBhbHNvIGJlIHNldCB2aWEgdGhlIGBXT1JLRkxPV19TT1VSQ0VNQVBgIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICAgKi9cbiAgc291cmNlbWFwPzogYm9vbGVhbiB8ICdpbmxpbmUnIHwgJ2xpbmtlZCcgfCAnZXh0ZXJuYWwnIHwgJ2JvdGgnO1xufVxuXG5kZWNsYXJlIG1vZHVsZSAnbml0cm8vdHlwZXMnIHtcbiAgaW50ZXJmYWNlIE5pdHJvT3B0aW9ucyB7XG4gICAgd29ya2Zsb3c/OiBNb2R1bGVPcHRpb25zO1xuICB9XG59XG5cbi8vIEB0cy1leHBlY3QtZXJyb3IgKGxlZ2FjeSlcbmRlY2xhcmUgbW9kdWxlICduaXRyb3BhY2snIHtcbiAgaW50ZXJmYWNlIE5pdHJvT3B0aW9ucyB7XG4gICAgd29ya2Zsb3c/OiBNb2R1bGVPcHRpb25zO1xuICB9XG59XG4iXX0=
|
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":"AAYA,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,CAkH1D"}
|
package/dist/vite.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { createBuildQueue } from '@workflow/builders';
|
|
1
|
+
import { createBuildQueue, ensureWorkflowTargetWorldEnv, resolveWorkflowTargetWorldAlias, WORKFLOW_OPTIONAL_PG_NATIVE_ALIAS, WORKFLOW_WORLD_TARGET_MODULE, } from '@workflow/builders';
|
|
2
2
|
import { workflowTransformPlugin } from '@workflow/rollup';
|
|
3
3
|
import { workflowHotUpdatePlugin } from '@workflow/vite';
|
|
4
4
|
import { join } from 'pathe';
|
|
@@ -12,13 +12,43 @@ export function workflow(options) {
|
|
|
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
|
-
|
|
15
|
+
config() {
|
|
16
|
+
const workflowTargetWorld = ensureWorkflowTargetWorldEnv();
|
|
17
|
+
const workflowTargetWorldAlias = resolveWorkflowTargetWorldAlias({
|
|
18
|
+
workingDir: process.cwd(),
|
|
19
|
+
targetWorld: workflowTargetWorld,
|
|
20
|
+
});
|
|
21
|
+
return {
|
|
22
|
+
define: {
|
|
23
|
+
'process.env.WORKFLOW_TARGET_WORLD': JSON.stringify(workflowTargetWorld),
|
|
24
|
+
},
|
|
25
|
+
resolve: {
|
|
26
|
+
alias: {
|
|
27
|
+
[WORKFLOW_WORLD_TARGET_MODULE]: workflowTargetWorldAlias,
|
|
28
|
+
'pg-native': WORKFLOW_OPTIONAL_PG_NATIVE_ALIAS,
|
|
29
|
+
},
|
|
30
|
+
},
|
|
31
|
+
};
|
|
32
|
+
},
|
|
33
|
+
async resolveId(source, importer, options) {
|
|
34
|
+
if (source !== WORKFLOW_WORLD_TARGET_MODULE) {
|
|
35
|
+
return null;
|
|
36
|
+
}
|
|
37
|
+
const workflowTargetWorld = ensureWorkflowTargetWorldEnv();
|
|
38
|
+
const resolved = await this.resolve(workflowTargetWorld, importer, {
|
|
39
|
+
...options,
|
|
40
|
+
skipSelf: true,
|
|
41
|
+
});
|
|
42
|
+
return resolved ?? { id: workflowTargetWorld, external: true };
|
|
43
|
+
},
|
|
44
|
+
transform(code, id, options) {
|
|
16
45
|
// Delegate to the actual transform plugin with exclusion
|
|
17
46
|
// workflowBuildDir is set during nitro setup before transforms run
|
|
18
47
|
const plugin = workflowTransformPlugin({
|
|
19
48
|
exclude: workflowBuildDir ? [workflowBuildDir] : [],
|
|
20
49
|
});
|
|
21
|
-
|
|
50
|
+
const transform = plugin.transform;
|
|
51
|
+
return transform?.call(this, code, id, options);
|
|
22
52
|
},
|
|
23
53
|
};
|
|
24
54
|
return [
|
|
@@ -75,4 +105,4 @@ export function workflow(options) {
|
|
|
75
105
|
}),
|
|
76
106
|
];
|
|
77
107
|
}
|
|
78
|
-
//# sourceMappingURL=vite.js.map
|
|
108
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsNEJBQTRCLEVBQzVCLCtCQUErQixFQUMvQixpQ0FBaUMsRUFDakMsNEJBQTRCLEdBQzdCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHekQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUU3QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdDLE9BQU8sV0FBVyxNQUFNLFlBQVksQ0FBQztBQUVyQyxNQUFNLFVBQVUsUUFBUSxDQUFDLE9BQXVCO0lBQzlDLElBQUksT0FBcUIsQ0FBQztJQUMxQixJQUFJLGdCQUF3QixDQUFDO0lBQzdCLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFFbkMsNEVBQTRFO0lBQzVFLG9GQUFvRjtJQUNwRixNQUFNLG1CQUFtQixHQUFXO1FBQ2xDLElBQUksRUFBRSxvQkFBb0I7UUFDMUIsTUFBTTtZQUNKLE1BQU0sbUJBQW1CLEdBQUcsNEJBQTRCLEVBQUUsQ0FBQztZQUMzRCxNQUFNLHdCQUF3QixHQUFHLCtCQUErQixDQUFDO2dCQUMvRCxVQUFVLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDekIsV0FBVyxFQUFFLG1CQUFtQjthQUNqQyxDQUFDLENBQUM7WUFDSCxPQUFPO2dCQUNMLE1BQU0sRUFBRTtvQkFDTixtQ0FBbUMsRUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQztpQkFDdEM7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLEtBQUssRUFBRTt3QkFDTCxDQUFDLDRCQUE0QixDQUFDLEVBQUUsd0JBQXdCO3dCQUN4RCxXQUFXLEVBQUUsaUNBQWlDO3FCQUMvQztpQkFDRjthQUNGLENBQUM7UUFDSixDQUFDO1FBQ0QsS0FBSyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU87WUFDdkMsSUFBSSxNQUFNLEtBQUssNEJBQTRCLEVBQUUsQ0FBQztnQkFDNUMsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDO1lBQ0QsTUFBTSxtQkFBbUIsR0FBRyw0QkFBNEIsRUFBRSxDQUFDO1lBQzNELE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE9BQU8sQ0FBQyxtQkFBbUIsRUFBRSxRQUFRLEVBQUU7Z0JBQ2pFLEdBQUcsT0FBTztnQkFDVixRQUFRLEVBQUUsSUFBSTthQUNmLENBQUMsQ0FBQztZQUNILE9BQU8sUUFBUSxJQUFJLEVBQUUsRUFBRSxFQUFFLG1CQUFtQixFQUFFLFFBQVEsRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUNqRSxDQUFDO1FBQ0QsU0FBUyxDQUFDLElBQUksRUFBRSxFQUFFLEVBQUUsT0FBTztZQUN6Qix5REFBeUQ7WUFDekQsbUVBQW1FO1lBQ25FLE1BQU0sTUFBTSxHQUFHLHVCQUF1QixDQUFDO2dCQUNyQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTthQUNwRCxDQUFDLENBQUM7WUFDSCxNQUFNLFNBQVMsR0FBRyxNQUFNLENBQUMsU0FPWixDQUFDO1lBQ2QsT0FBTyxTQUFTLEVBQUUsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLEVBQUUsRUFBRSxFQUFFLE9BQU8sQ0FBQyxDQUFDO1FBQ2xELENBQUM7S0FDRixDQUFDO0lBRUYsT0FBTztRQUNMLG1CQUFtQjtRQUNuQjtZQUNFLElBQUksRUFBRSxnQkFBZ0I7WUFDdEIsS0FBSyxFQUFFO2dCQUNMLEtBQUssRUFBRSxDQUFDLEtBQVksRUFBRSxFQUFFO29CQUN0QixxREFBcUQ7b0JBQ3JELGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDNUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUc7d0JBQ3ZCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRO3dCQUN6QixHQUFHLE9BQU87d0JBQ1YsS0FBSyxFQUFFLElBQUk7cUJBQ1osQ0FBQztvQkFDRixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ3RCLE9BQU8sR0FBRyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDcEMsQ0FBQztvQkFDRCxPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xDLENBQUM7YUFDRjtZQUNELGdHQUFnRztZQUNoRyw4RkFBOEY7WUFDOUYsZUFBZSxDQUFDLE1BQU07Z0JBQ3BCLGlGQUFpRjtnQkFDakYsT0FBTyxHQUFHLEVBQUU7b0JBQ1YsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO3dCQUN4QyxzQ0FBc0M7d0JBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQUM7NEJBQ3RELE9BQU8sSUFBSSxFQUFFLENBQUM7d0JBQ2hCLENBQUM7d0JBRUQsdURBQXVEO3dCQUN2RCxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUM7d0JBQ3hDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsVUFBNEIsR0FBRyxJQUFXOzRCQUN4RCxNQUFNLFVBQVUsR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDOzRCQUUvRCw0RUFBNEU7NEJBQzVFLDBEQUEwRDs0QkFDMUQsc0VBQXNFOzRCQUN0RSxJQUFJLFVBQVUsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQ0FDdkIsMERBQTBEO2dDQUMxRCxHQUFHLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUN2QyxDQUFDOzRCQUVELGdEQUFnRDs0QkFDaEQsT0FBTyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUM3QyxDQUFRLENBQUM7d0JBRVQsSUFBSSxFQUFFLENBQUM7b0JBQ1QsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDO1lBQ0osQ0FBQztTQUNGO1FBQ0QsdUJBQXVCLENBQUM7WUFDdEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU87WUFDdEIsT0FBTztTQUNSLENBQUM7S0FDSCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNyZWF0ZUJ1aWxkUXVldWUsXG4gIGVuc3VyZVdvcmtmbG93VGFyZ2V0V29ybGRFbnYsXG4gIHJlc29sdmVXb3JrZmxvd1RhcmdldFdvcmxkQWxpYXMsXG4gIFdPUktGTE9XX09QVElPTkFMX1BHX05BVElWRV9BTElBUyxcbiAgV09SS0ZMT1dfV09STERfVEFSR0VUX01PRFVMRSxcbn0gZnJvbSAnQHdvcmtmbG93L2J1aWxkZXJzJztcbmltcG9ydCB7IHdvcmtmbG93VHJhbnNmb3JtUGx1Z2luIH0gZnJvbSAnQHdvcmtmbG93L3JvbGx1cCc7XG5pbXBvcnQgeyB3b3JrZmxvd0hvdFVwZGF0ZVBsdWdpbiB9IGZyb20gJ0B3b3JrZmxvdy92aXRlJztcbmltcG9ydCB0eXBlIHsgTml0cm8gfSBmcm9tICduaXRyby90eXBlcyc7XG5pbXBvcnQgdHlwZSB7fSBmcm9tICduaXRyby92aXRlJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoZSc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbiwgVHJhbnNmb3JtUmVzdWx0IH0gZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBMb2NhbEJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgTW9kdWxlT3B0aW9ucyB9IGZyb20gJy4vaW5kZXguanMnO1xuaW1wb3J0IG5pdHJvTW9kdWxlIGZyb20gJy4vaW5kZXguanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gd29ya2Zsb3cob3B0aW9ucz86IE1vZHVsZU9wdGlvbnMpOiBQbHVnaW5bXSB7XG4gIGxldCBidWlsZGVyOiBMb2NhbEJ1aWxkZXI7XG4gIGxldCB3b3JrZmxvd0J1aWxkRGlyOiBzdHJpbmc7XG4gIGNvbnN0IGVucXVldWUgPSBjcmVhdGVCdWlsZFF1ZXVlKCk7XG5cbiAgLy8gQ3JlYXRlIGEgbGF6eSB0cmFuc2Zvcm0gcGx1Z2luIHRoYXQgZXhjbHVkZXMgdGhlIHdvcmtmbG93IGJ1aWxkIGRpcmVjdG9yeVxuICAvLyBUaGUgZXhjbHVzaW9uIHBhdGggaXMgc2V0IGR1cmluZyBuaXRybyBzZXR1cCwgc28gd2UgbmVlZCB0byBkZWZlciBwbHVnaW4gY3JlYXRpb25cbiAgY29uc3QgbGF6eVRyYW5zZm9ybVBsdWdpbjogUGx1Z2luID0ge1xuICAgIG5hbWU6ICd3b3JrZmxvdzp0cmFuc2Zvcm0nLFxuICAgIGNvbmZpZygpIHtcbiAgICAgIGNvbnN0IHdvcmtmbG93VGFyZ2V0V29ybGQgPSBlbnN1cmVXb3JrZmxvd1RhcmdldFdvcmxkRW52KCk7XG4gICAgICBjb25zdCB3b3JrZmxvd1RhcmdldFdvcmxkQWxpYXMgPSByZXNvbHZlV29ya2Zsb3dUYXJnZXRXb3JsZEFsaWFzKHtcbiAgICAgICAgd29ya2luZ0RpcjogcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgdGFyZ2V0V29ybGQ6IHdvcmtmbG93VGFyZ2V0V29ybGQsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRlZmluZToge1xuICAgICAgICAgICdwcm9jZXNzLmVudi5XT1JLRkxPV19UQVJHRVRfV09STEQnOlxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkod29ya2Zsb3dUYXJnZXRXb3JsZCksXG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmU6IHtcbiAgICAgICAgICBhbGlhczoge1xuICAgICAgICAgICAgW1dPUktGTE9XX1dPUkxEX1RBUkdFVF9NT0RVTEVdOiB3b3JrZmxvd1RhcmdldFdvcmxkQWxpYXMsXG4gICAgICAgICAgICAncGctbmF0aXZlJzogV09SS0ZMT1dfT1BUSU9OQUxfUEdfTkFUSVZFX0FMSUFTLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG4gICAgYXN5bmMgcmVzb2x2ZUlkKHNvdXJjZSwgaW1wb3J0ZXIsIG9wdGlvbnMpIHtcbiAgICAgIGlmIChzb3VyY2UgIT09IFdPUktGTE9XX1dPUkxEX1RBUkdFVF9NT0RVTEUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB3b3JrZmxvd1RhcmdldFdvcmxkID0gZW5zdXJlV29ya2Zsb3dUYXJnZXRXb3JsZEVudigpO1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCB0aGlzLnJlc29sdmUod29ya2Zsb3dUYXJnZXRXb3JsZCwgaW1wb3J0ZXIsIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgc2tpcFNlbGY6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXNvbHZlZCA/PyB7IGlkOiB3b3JrZmxvd1RhcmdldFdvcmxkLCBleHRlcm5hbDogdHJ1ZSB9O1xuICAgIH0sXG4gICAgdHJhbnNmb3JtKGNvZGUsIGlkLCBvcHRpb25zKSB7XG4gICAgICAvLyBEZWxlZ2F0ZSB0byB0aGUgYWN0dWFsIHRyYW5zZm9ybSBwbHVnaW4gd2l0aCBleGNsdXNpb25cbiAgICAgIC8vIHdvcmtmbG93QnVpbGREaXIgaXMgc2V0IGR1cmluZyBuaXRybyBzZXR1cCBiZWZvcmUgdHJhbnNmb3JtcyBydW5cbiAgICAgIGNvbnN0IHBsdWdpbiA9IHdvcmtmbG93VHJhbnNmb3JtUGx1Z2luKHtcbiAgICAgICAgZXhjbHVkZTogd29ya2Zsb3dCdWlsZERpciA/IFt3b3JrZmxvd0J1aWxkRGlyXSA6IFtdLFxuICAgICAgfSk7XG4gICAgICBjb25zdCB0cmFuc2Zvcm0gPSBwbHVnaW4udHJhbnNmb3JtIGFzXG4gICAgICAgIHwgKChcbiAgICAgICAgICAgIHRoaXM6IHVua25vd24sXG4gICAgICAgICAgICBjb2RlOiBzdHJpbmcsXG4gICAgICAgICAgICBpZDogc3RyaW5nLFxuICAgICAgICAgICAgb3B0aW9ucz86IHsgc3NyPzogYm9vbGVhbiB9XG4gICAgICAgICAgKSA9PiBUcmFuc2Zvcm1SZXN1bHQgfCBQcm9taXNlPFRyYW5zZm9ybVJlc3VsdD4pXG4gICAgICAgIHwgdW5kZWZpbmVkO1xuICAgICAgcmV0dXJuIHRyYW5zZm9ybT8uY2FsbCh0aGlzLCBjb2RlLCBpZCwgb3B0aW9ucyk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gW1xuICAgIGxhenlUcmFuc2Zvcm1QbHVnaW4sXG4gICAge1xuICAgICAgbmFtZTogJ3dvcmtmbG93Om5pdHJvJyxcbiAgICAgIG5pdHJvOiB7XG4gICAgICAgIHNldHVwOiAobml0cm86IE5pdHJvKSA9PiB7XG4gICAgICAgICAgLy8gQ2FwdHVyZSB0aGUgd29ya2Zsb3cgYnVpbGQgZGlyZWN0b3J5IGZvciBleGNsdXNpb25cbiAgICAgICAgICB3b3JrZmxvd0J1aWxkRGlyID0gam9pbihuaXRyby5vcHRpb25zLmJ1aWxkRGlyLCAnd29ya2Zsb3cnKTtcbiAgICAgICAgICBuaXRyby5vcHRpb25zLndvcmtmbG93ID0ge1xuICAgICAgICAgICAgLi4ubml0cm8ub3B0aW9ucy53b3JrZmxvdyxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBfdml0ZTogdHJ1ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChuaXRyby5vcHRpb25zLmRldikge1xuICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBMb2NhbEJ1aWxkZXIobml0cm8pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbml0cm9Nb2R1bGUuc2V0dXAobml0cm8pO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIC8vIE5PVEU6IFRoaXMgaXMgYSB3b3JrYXJvdW5kIGJlY2F1c2UgTml0cm8gcGFzc2VzIHRoZSA0MDQgcmVxdWVzdHMgdG8gdGhlIGRldiBzZXJ2ZXIgdG8gaGFuZGxlLlxuICAgICAgLy8gRm9yIHdvcmtmbG93IHJvdXRlcywgd2Ugb3ZlcnJpZGUgdG8gc2VuZCBhbiBlbXB0eSBib2R5IHRvIHByZXZlbnQgSG9uby9WaXRlJ3MgU1BBIGZhbGxiYWNrLlxuICAgICAgY29uZmlndXJlU2VydmVyKHNlcnZlcikge1xuICAgICAgICAvLyBBZGQgbWlkZGxld2FyZSB0byBpbnRlcmNlcHQgNDA0cyBvbiB3b3JrZmxvdyByb3V0ZXMgYmVmb3JlIFZpdGUncyBTUEEgZmFsbGJhY2tcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBzZXJ2ZXIubWlkZGxld2FyZXMudXNlKChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgICAgICAgICAgLy8gT25seSBoYW5kbGUgd29ya2Zsb3cgd2ViaG9vayByb3V0ZXNcbiAgICAgICAgICAgIGlmICghcmVxLnVybD8uc3RhcnRzV2l0aCgnLy53ZWxsLWtub3duL3dvcmtmbG93L3YxLycpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdyYXAgd3JpdGVIZWFkIHRvIGVuc3VyZSB3ZSBzZW5kIGVtcHR5IGJvZHkgZm9yIDQwNHNcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsV3JpdGVIZWFkID0gcmVzLndyaXRlSGVhZDtcbiAgICAgICAgICAgIHJlcy53cml0ZUhlYWQgPSBmdW5jdGlvbiAodGhpczogdHlwZW9mIHJlcywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IHR5cGVvZiBhcmdzWzBdID09PSAnbnVtYmVyJyA/IGFyZ3NbMF0gOiAyMDA7XG5cbiAgICAgICAgICAgICAgLy8gTk9URTogV29ya2Fyb3VuZCBiZWNhdXNlIE5pdHJvIHBhc3NlcyA0MDQgcmVxdWVzdHMgdG8gdGhlIHZpdGUgdG8gaGFuZGxlLlxuICAgICAgICAgICAgICAvLyBDYXVzZXMgYHdlYmhvb2sgcm91dGUgd2l0aCBpbnZhbGlkIHRva2VuYCB0ZXN0IHRvIGZhaWwuXG4gICAgICAgICAgICAgIC8vIEZvciA0MDRzIG9uIHdvcmtmbG93IHJvdXRlcywgZW5zdXJlIHdlJ3JlIHNlbmRpbmcgdGhlIHJpZ2h0IGhlYWRlcnNcbiAgICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwNCkge1xuICAgICAgICAgICAgICAgIC8vIFNldCBjb250ZW50LWxlbmd0aCB0byAwIHRvIHByZXZlbnQgVml0ZSBmcm9tIG92ZXJyaWRpbmdcbiAgICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsICcwJyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gQ29tcGxleCBvdmVybG9hZCBzaWduYXR1cmVcbiAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsV3JpdGVIZWFkLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgfSBhcyBhbnk7XG5cbiAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB3b3JrZmxvd0hvdFVwZGF0ZVBsdWdpbih7XG4gICAgICBidWlsZGVyOiAoKSA9PiBidWlsZGVyLFxuICAgICAgZW5xdWV1ZSxcbiAgICB9KSxcbiAgXTtcbn1cbiJdfQ==
|
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.30",
|
|
4
4
|
"description": "Nitro integration for Workflow SDK",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -24,16 +24,17 @@
|
|
|
24
24
|
"@swc/core": "1.15.3",
|
|
25
25
|
"exsolve": "1.0.8",
|
|
26
26
|
"pathe": "2.0.3",
|
|
27
|
-
"@workflow/builders": "5.0.0-beta.
|
|
28
|
-
"@workflow/core": "5.0.0-beta.
|
|
29
|
-
"@workflow/rollup": "5.0.0-beta.
|
|
30
|
-
"@workflow/swc-plugin": "5.0.0-beta.
|
|
31
|
-
"@workflow/vite": "5.0.0-beta.
|
|
27
|
+
"@workflow/builders": "5.0.0-beta.30",
|
|
28
|
+
"@workflow/core": "5.0.0-beta.30",
|
|
29
|
+
"@workflow/rollup": "5.0.0-beta.30",
|
|
30
|
+
"@workflow/swc-plugin": "5.0.0-beta.5",
|
|
31
|
+
"@workflow/vite": "5.0.0-beta.30",
|
|
32
|
+
"@workflow/web": "5.0.0-beta.30"
|
|
32
33
|
},
|
|
33
34
|
"devDependencies": {
|
|
34
35
|
"@types/node": "22.19.0",
|
|
35
|
-
"nitro": "3.0.
|
|
36
|
-
"vite": "7.3.
|
|
36
|
+
"nitro": "^3.0.260610-beta",
|
|
37
|
+
"vite": "7.3.6",
|
|
37
38
|
"@workflow/tsconfig": "5.0.0-beta.0"
|
|
38
39
|
},
|
|
39
40
|
"scripts": {
|
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 { randomUUID } from 'node:crypto';\nimport { mkdir, readFile, rename, unlink, 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 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 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 // Build to temporary files first, then move them into place.\n // This prevents leaving partial/inconsistent output when a build\n // fails mid-way (e.g., a file was deleted between discovery and\n // compilation during dev HMR). A per-build UUID guarantees uniqueness\n // across concurrent invocations, in case the queue is bypassed.\n const tmpSuffix = `.tmp.${randomUUID()}`;\n const workflowsTmpFile = join(this.#outDir, `workflows${tmpSuffix}.mjs`);\n const stepsTmpFile = join(this.#outDir, `steps${tmpSuffix}.mjs`);\n const webhookTmpFile = join(this.#outDir, `webhook${tmpSuffix}.mjs`);\n\n try {\n const { manifest: workflowsManifest } = await this.createWorkflowsBundle({\n outfile: workflowsTmpFile,\n bundleFinalOutput: false,\n format: 'esm',\n inputFiles,\n });\n\n const { manifest: stepsManifest } = await this.createStepsBundle({\n outfile: stepsTmpFile,\n externalizeNonSteps: true,\n format: 'esm',\n inputFiles,\n });\n\n await this.createWebhookBundle({\n outfile: webhookTmpFile,\n bundle: false,\n });\n\n // All builds succeeded — atomically move files into place\n await rename(workflowsTmpFile, join(this.#outDir, 'workflows.mjs'));\n await rename(stepsTmpFile, join(this.#outDir, 'steps.mjs'));\n await rename(webhookTmpFile, join(this.#outDir, 'webhook.mjs'));\n\n // Merge manifests from both bundles\n const manifest = {\n steps: { ...stepsManifest.steps, ...workflowsManifest.steps },\n workflows: {\n ...stepsManifest.workflows,\n ...workflowsManifest.workflows,\n },\n classes: { ...stepsManifest.classes, ...workflowsManifest.classes },\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 } finally {\n // Clean up temporary files on success or failure\n await unlink(workflowsTmpFile).catch(() => {});\n await unlink(stepsTmpFile).catch(() => {});\n await unlink(webhookTmpFile).catch(() => {});\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 addVirtualHandler(\n nitro,\n '/.well-known/workflow/v1/step',\n 'workflow/steps.mjs'\n );\n\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\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":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAGzD,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAE7B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7C,OAAO,WAAW,MAAM,YAAY,CAAC;AAErC,MAAM,UAAU,QAAQ,CAAC,OAAuB;IAC9C,IAAI,OAAqB,CAAC;IAC1B,IAAI,gBAAwB,CAAC;IAC7B,MAAM,OAAO,GAAG,gBAAgB,EAAE,CAAC;IAEnC,4EAA4E;IAC5E,oFAAoF;IACpF,MAAM,mBAAmB,GAAW;QAClC,IAAI,EAAE,oBAAoB;QAC1B,SAAS,CAAC,IAAI,EAAE,EAAE;YAChB,yDAAyD;YACzD,mEAAmE;YACnE,MAAM,MAAM,GAAG,uBAAuB,CAAC;gBACrC,OAAO,EAAE,gBAAgB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,EAAE;aACpD,CAAC,CAAC;YACH,OAAQ,MAAM,CAAC,SAAsB,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9D,CAAC;KACF,CAAC;IAEF,OAAO;QACL,mBAAmB;QACnB;YACE,IAAI,EAAE,gBAAgB;YACtB,KAAK,EAAE;gBACL,KAAK,EAAE,CAAC,KAAY,EAAE,EAAE;oBACtB,qDAAqD;oBACrD,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;oBAC5D,KAAK,CAAC,OAAO,CAAC,QAAQ,GAAG;wBACvB,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ;wBACzB,GAAG,OAAO;wBACV,KAAK,EAAE,IAAI;qBACZ,CAAC;oBACF,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;wBACtB,OAAO,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpC,CAAC;oBACD,OAAO,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;gBAClC,CAAC;aACF;YACD,gGAAgG;YAChG,8FAA8F;YAC9F,eAAe,CAAC,MAAM;gBACpB,iFAAiF;gBACjF,OAAO,GAAG,EAAE;oBACV,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;wBACxC,sCAAsC;wBACtC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,UAAU,CAAC,2BAA2B,CAAC,EAAE,CAAC;4BACtD,OAAO,IAAI,EAAE,CAAC;wBAChB,CAAC;wBAED,uDAAuD;wBACvD,MAAM,iBAAiB,GAAG,GAAG,CAAC,SAAS,CAAC;wBACxC,GAAG,CAAC,SAAS,GAAG,UAA4B,GAAG,IAAW;4BACxD,MAAM,UAAU,GAAG,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;4BAE/D,4EAA4E;4BAC5E,0DAA0D;4BAC1D,sEAAsE;4BACtE,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;gCACvB,0DAA0D;gCAC1D,GAAG,CAAC,SAAS,CAAC,gBAAgB,EAAE,GAAG,CAAC,CAAC;4BACvC,CAAC;4BAED,gDAAgD;4BAChD,OAAO,iBAAiB,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;wBAC7C,CAAQ,CAAC;wBAET,IAAI,EAAE,CAAC;oBACT,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC;YACJ,CAAC;SACF;QACD,uBAAuB,CAAC;YACtB,OAAO,EAAE,GAAG,EAAE,CAAC,OAAO;YACtB,OAAO;SACR,CAAC;KACH,CAAC;AACJ,CAAC","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"]}
|