@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 CHANGED
@@ -1,3 +1,5 @@
1
1
  # workflow/nitro
2
2
 
3
3
  The docs have moved! Refer to them [here](https://workflow-sdk.dev/)
4
+
5
+ The Nitro module uses Nitro's `workspaceDir` as the workflow project root, so monorepo apps can import sibling workspace packages without extra workflow config.
@@ -1 +1 @@
1
- {"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../src/builders.ts"],"names":[],"mappings":"AAEA,OAAO,EACL,WAAW,EAEX,2BAA2B,EAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAezC,qBAAa,aAAc,SAAQ,2BAA2B;gBAChD,KAAK,EAAE,KAAK;IAWT,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAWtC;AAED,qBAAa,YAAa,SAAQ,WAAW;;gBAE/B,KAAK,EAAE,KAAK;IAkBf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CA2EhC"}
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 { randomUUID } from 'node:crypto';
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 externals = nitro.options.externals?.external?.filter((entry) => typeof entry === 'string');
12
- return externals && externals.length > 0 ? externals : undefined;
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
- dirs: ['.'], // Different apps that use nitro have different directories
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: ['.'], // Different apps that use nitro have different directories
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
- // Build to temporary files first, then move them into place.
65
- // This prevents leaving partial/inconsistent output when a build
66
- // fails mid-way (e.g., a file was deleted between discovery and
67
- // compilation during dev HMR). A per-build UUID guarantees uniqueness
68
- // across concurrent invocations, in case the queue is bypassed.
69
- const tmpSuffix = `.tmp.${randomUUID()}`;
70
- const workflowsTmpFile = join(this.#outDir, `workflows${tmpSuffix}.mjs`);
71
- const stepsTmpFile = join(this.#outDir, `steps${tmpSuffix}.mjs`);
72
- const webhookTmpFile = join(this.#outDir, `webhook${tmpSuffix}.mjs`);
73
- try {
74
- const { manifest: workflowsManifest } = await this.createWorkflowsBundle({
75
- outfile: workflowsTmpFile,
76
- bundleFinalOutput: false,
77
- format: 'esm',
78
- inputFiles,
79
- });
80
- const { manifest: stepsManifest } = await this.createStepsBundle({
81
- outfile: stepsTmpFile,
82
- externalizeNonSteps: true,
83
- format: 'esm',
84
- inputFiles,
85
- });
86
- await this.createWebhookBundle({
87
- outfile: webhookTmpFile,
88
- bundle: false,
89
- });
90
- // All builds succeeded — atomically move files into place
91
- await rename(workflowsTmpFile, join(this.#outDir, 'workflows.mjs'));
92
- await rename(stepsTmpFile, join(this.#outDir, 'steps.mjs'));
93
- await rename(webhookTmpFile, join(this.#outDir, 'webhook.mjs'));
94
- // Merge manifests from both bundles
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(this: void, nitro: Nitro): Promise<void>;
6
+ setup(nitro: Nitro): Promise<void>;
7
7
  };
8
8
  export default _default;
9
9
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,KAAK,EAA6B,MAAM,aAAa,CAAC;AAGpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,YAAY,EAAE,aAAa,EAAE,CAAC;;;6BAIT,KAAK;;AAF1B,wBAwMwB"}
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 { fileURLToPath } from 'node:url';
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['debug'] ??= 'debug';
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
- // In dev mode, force workflow SDK packages to be bundled by Nitro's
47
- // Rollup rather than externalized. This ensures the SWC transform
48
- // plugin processes files containing workflow patterns (like
49
- // @workflow/core/dist/runtime/run.js) and adds the classId
50
- // registration IIFEs needed for serialization. Without this, serde
51
- // classes from npm packages (like `Run`) would be externalized, the
52
- // SWC transform would never fire on them, and serialization would
53
- // fail with "must have a static classId property".
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
- if (nitro.options.dev) {
61
- nitro.hooks.hook('rollup:before', (_nitro, config) => {
62
- config.plugins.unshift({
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
- // Generate functions for vercel build
108
- if (isVercelDeploy) {
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
- // Generate local bundles for dev and local prod
114
- if (!isVercelDeploy) {
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
- addVirtualHandler(nitro, '/.well-known/workflow/v1/step', 'workflow/steps.mjs');
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 {
@@ -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;CAClB;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"}
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=types.js.map
1
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgTW9kdWxlT3B0aW9ucyB7XG4gIC8qKiBAaW50ZXJuYWwgKi9cbiAgX3ZpdGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBEaXJlY3RvcmllcyB0byBzY2FuIGZvciB3b3JrZmxvd3MgYW5kIHN0ZXBzLlxuICAgKlxuICAgKiBCeSBkZWZhdWx0LCBgd29ya2Zsb3dzL2AgZGlyZWN0b3J5IHdpbGwgYmUgc2Nhbm5lZCBmcm9tIHJvb3QgYW5kIGFsbCBsYXllciBzb3VyY2UgZGlycy5cbiAgICovXG4gIGRpcnM/OiBzdHJpbmdbXTtcblxuICAvKipcbiAgICogRW5hYmxlIHdvcmtmbG93IFR5cGVTY3JpcHQgcGx1Z2luIGluIGdlbmVyYXRlZCB0c2NvbmZpZy5qc29uXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICB0eXBlc2NyaXB0UGx1Z2luPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogTm9kZS5qcyBydW50aW1lIHZlcnNpb24gZm9yIFZlcmNlbCBGdW5jdGlvbnMuXG4gICAqIEBleGFtcGxlIFwibm9kZWpzMjIueFwiXG4gICAqIEBleGFtcGxlIFwibm9kZWpzMjQueFwiXG4gICAqL1xuICBydW50aW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBDb250cm9scyBob3cgc291cmNlIG1hcHMgYXJlIGVtaXR0ZWQgZm9yIHdvcmtmbG93IGJ1bmRsZXMuIEFjY2VwdHMgdGhlXG4gICAqIHNhbWUgdmFsdWVzIGFzIGVzYnVpbGQncyBgc291cmNlbWFwYCBvcHRpb246IGB0cnVlYC9gJ2lubGluZSdgIChkZWZhdWx0XG4gICAqIGZvciBzdGVwL3dvcmtmbG93IGJ1bmRsZXMpLCBgJ2xpbmtlZCdgLCBgJ2V4dGVybmFsJ2AsIGAnYm90aCdgLCBvclxuICAgKiBgZmFsc2VgIHRvIG9taXQgc291cmNlIG1hcHMuXG4gICAqXG4gICAqIFNldCB0byBgZmFsc2VgIGZvciBzbWFsbGVyIGZ1bmN0aW9uIGJ1bmRsZXMg4oCUIHVzZWZ1bCBmb3Igc3RheWluZyB1bmRlclxuICAgKiB0aGUgVmVyY2VsIDI1ME1CIGZ1bmN0aW9uIHNpemUgbGltaXQg4oCUIGF0IHRoZSBjb3N0IG9mIHN0YWNrIHRyYWNlcyB0aGF0XG4gICAqIHBvaW50IGF0IGdlbmVyYXRlZCBjb2RlIGluc3RlYWQgb2YgeW91ciBzb3VyY2UgZmlsZXMuXG4gICAqXG4gICAqIENhbiBhbHNvIGJlIHNldCB2aWEgdGhlIGBXT1JLRkxPV19TT1VSQ0VNQVBgIGVudmlyb25tZW50IHZhcmlhYmxlLlxuICAgKi9cbiAgc291cmNlbWFwPzogYm9vbGVhbiB8ICdpbmxpbmUnIHwgJ2xpbmtlZCcgfCAnZXh0ZXJuYWwnIHwgJ2JvdGgnO1xufVxuXG5kZWNsYXJlIG1vZHVsZSAnbml0cm8vdHlwZXMnIHtcbiAgaW50ZXJmYWNlIE5pdHJvT3B0aW9ucyB7XG4gICAgd29ya2Zsb3c/OiBNb2R1bGVPcHRpb25zO1xuICB9XG59XG5cbi8vIEB0cy1leHBlY3QtZXJyb3IgKGxlZ2FjeSlcbmRlY2xhcmUgbW9kdWxlICduaXRyb3BhY2snIHtcbiAgaW50ZXJmYWNlIE5pdHJvT3B0aW9ucyB7XG4gICAgd29ya2Zsb3c/OiBNb2R1bGVPcHRpb25zO1xuICB9XG59XG4iXX0=
@@ -1 +1 @@
1
- {"version":3,"file":"vite.d.ts","sourceRoot":"","sources":["../src/vite.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAEnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAGhD,wBAAgB,QAAQ,CAAC,OAAO,CAAC,EAAE,aAAa,GAAG,MAAM,EAAE,CA4E1D"}
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
- transform(code, id) {
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
- return plugin.transform?.call(this, code, id);
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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDTCxnQkFBZ0IsRUFDaEIsNEJBQTRCLEVBQzVCLCtCQUErQixFQUMvQixpQ0FBaUMsRUFDakMsNEJBQTRCLEdBQzdCLE1BQU0sb0JBQW9CLENBQUM7QUFDNUIsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDM0QsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFHekQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUU3QixPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdDLE9BQU8sV0FBVyxNQUFNLFlBQVksQ0FBQztBQUVyQyxNQUFNLFVBQVUsUUFBUSxDQUFDLE9BQXVCO0lBQzlDLElBQUksT0FBcUIsQ0FBQztJQUMxQixJQUFJLGdCQUF3QixDQUFDO0lBQzdCLE1BQU0sT0FBTyxHQUFHLGdCQUFnQixFQUFFLENBQUM7SUFFbkMsNEVBQTRFO0lBQzVFLG9GQUFvRjtJQUNwRixNQUFNLG1CQUFtQixHQUFXO1FBQ2xDLElBQUksRUFBRSxvQkFBb0I7UUFDMUIsTUFBTTtZQUNKLE1BQU0sbUJBQW1CLEdBQUcsNEJBQTRCLEVBQUUsQ0FBQztZQUMzRCxNQUFNLHdCQUF3QixHQUFHLCtCQUErQixDQUFDO2dCQUMvRCxVQUFVLEVBQUUsT0FBTyxDQUFDLEdBQUcsRUFBRTtnQkFDekIsV0FBVyxFQUFFLG1CQUFtQjthQUNqQyxDQUFDLENBQUM7WUFDSCxPQUFPO2dCQUNMLE1BQU0sRUFBRTtvQkFDTixtQ0FBbUMsRUFDakMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxtQkFBbUIsQ0FBQztpQkFDdEM7Z0JBQ0QsT0FBTyxFQUFFO29CQUNQLEtBQUssRUFBRTt3QkFDTCxDQUFDLDRCQUE0QixDQUFDLEVBQUUsd0JBQXdCO3dC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QztnQ0FDdkIsMERBQTBEO2dDQUMxRCxHQUFHLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUN2QyxDQUFDOzRCQUVELGdEQUFnRDs0QkFDaEQsT0FBTyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUM3QyxDQUFRLENBQUM7d0JBRVQsSUFBSSxFQUFFLENBQUM7b0JBQ1QsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDO1lBQ0osQ0FBQztTQUNGO1FBQ0QsdUJBQXVCLENBQUM7WUFDdEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU87WUFDdEIsT0FBTztTQUNSLENBQUM7S0FDSCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGNyZWF0ZUJ1aWxkUXVldWUsXG4gIGVuc3VyZVdvcmtmbG93VGFyZ2V0V29ybGRFbnYsXG4gIHJlc29sdmVXb3JrZmxvd1RhcmdldFdvcmxkQWxpYXMsXG4gIFdPUktGTE9XX09QVElPTkFMX1BHX05BVElWRV9BTElBUyxcbiAgV09SS0ZMT1dfV09STERfVEFSR0VUX01PRFVMRSxcbn0gZnJvbSAnQHdvcmtmbG93L2J1aWxkZXJzJztcbmltcG9ydCB7IHdvcmtmbG93VHJhbnNmb3JtUGx1Z2luIH0gZnJvbSAnQHdvcmtmbG93L3JvbGx1cCc7XG5pbXBvcnQgeyB3b3JrZmxvd0hvdFVwZGF0ZVBsdWdpbiB9IGZyb20gJ0B3b3JrZmxvdy92aXRlJztcbmltcG9ydCB0eXBlIHsgTml0cm8gfSBmcm9tICduaXRyby90eXBlcyc7XG5pbXBvcnQgdHlwZSB7fSBmcm9tICduaXRyby92aXRlJztcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoZSc7XG5pbXBvcnQgdHlwZSB7IFBsdWdpbiwgVHJhbnNmb3JtUmVzdWx0IH0gZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBMb2NhbEJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgTW9kdWxlT3B0aW9ucyB9IGZyb20gJy4vaW5kZXguanMnO1xuaW1wb3J0IG5pdHJvTW9kdWxlIGZyb20gJy4vaW5kZXguanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gd29ya2Zsb3cob3B0aW9ucz86IE1vZHVsZU9wdGlvbnMpOiBQbHVnaW5bXSB7XG4gIGxldCBidWlsZGVyOiBMb2NhbEJ1aWxkZXI7XG4gIGxldCB3b3JrZmxvd0J1aWxkRGlyOiBzdHJpbmc7XG4gIGNvbnN0IGVucXVldWUgPSBjcmVhdGVCdWlsZFF1ZXVlKCk7XG5cbiAgLy8gQ3JlYXRlIGEgbGF6eSB0cmFuc2Zvcm0gcGx1Z2luIHRoYXQgZXhjbHVkZXMgdGhlIHdvcmtmbG93IGJ1aWxkIGRpcmVjdG9yeVxuICAvLyBUaGUgZXhjbHVzaW9uIHBhdGggaXMgc2V0IGR1cmluZyBuaXRybyBzZXR1cCwgc28gd2UgbmVlZCB0byBkZWZlciBwbHVnaW4gY3JlYXRpb25cbiAgY29uc3QgbGF6eVRyYW5zZm9ybVBsdWdpbjogUGx1Z2luID0ge1xuICAgIG5hbWU6ICd3b3JrZmxvdzp0cmFuc2Zvcm0nLFxuICAgIGNvbmZpZygpIHtcbiAgICAgIGNvbnN0IHdvcmtmbG93VGFyZ2V0V29ybGQgPSBlbnN1cmVXb3JrZmxvd1RhcmdldFdvcmxkRW52KCk7XG4gICAgICBjb25zdCB3b3JrZmxvd1RhcmdldFdvcmxkQWxpYXMgPSByZXNvbHZlV29ya2Zsb3dUYXJnZXRXb3JsZEFsaWFzKHtcbiAgICAgICAgd29ya2luZ0RpcjogcHJvY2Vzcy5jd2QoKSxcbiAgICAgICAgdGFyZ2V0V29ybGQ6IHdvcmtmbG93VGFyZ2V0V29ybGQsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiB7XG4gICAgICAgIGRlZmluZToge1xuICAgICAgICAgICdwcm9jZXNzLmVudi5XT1JLRkxPV19UQVJHRVRfV09STEQnOlxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkod29ya2Zsb3dUYXJnZXRXb3JsZCksXG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmU6IHtcbiAgICAgICAgICBhbGlhczoge1xuICAgICAgICAgICAgW1dPUktGTE9XX1dPUkxEX1RBUkdFVF9NT0RVTEVdOiB3b3JrZmxvd1RhcmdldFdvcmxkQWxpYXMsXG4gICAgICAgICAgICAncGctbmF0aXZlJzogV09SS0ZMT1dfT1BUSU9OQUxfUEdfTkFUSVZFX0FMSUFTLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuICAgIH0sXG4gICAgYXN5bmMgcmVzb2x2ZUlkKHNvdXJjZSwgaW1wb3J0ZXIsIG9wdGlvbnMpIHtcbiAgICAgIGlmIChzb3VyY2UgIT09IFdPUktGTE9XX1dPUkxEX1RBUkdFVF9NT0RVTEUpIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgICBjb25zdCB3b3JrZmxvd1RhcmdldFdvcmxkID0gZW5zdXJlV29ya2Zsb3dUYXJnZXRXb3JsZEVudigpO1xuICAgICAgY29uc3QgcmVzb2x2ZWQgPSBhd2FpdCB0aGlzLnJlc29sdmUod29ya2Zsb3dUYXJnZXRXb3JsZCwgaW1wb3J0ZXIsIHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgc2tpcFNlbGY6IHRydWUsXG4gICAgICB9KTtcbiAgICAgIHJldHVybiByZXNvbHZlZCA/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",
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.3",
28
- "@workflow/core": "5.0.0-beta.3",
29
- "@workflow/rollup": "5.0.0-beta.3",
30
- "@workflow/swc-plugin": "5.0.0-beta.3",
31
- "@workflow/vite": "5.0.0-beta.3"
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.1-alpha.1",
36
- "vite": "7.3.2",
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": {
@@ -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":"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","sourcesContent":["import { createBuildQueue } from '@workflow/builders';\nimport { workflowTransformPlugin } from '@workflow/rollup';\nimport { workflowHotUpdatePlugin } from '@workflow/vite';\nimport type { Nitro } from 'nitro/types';\nimport type {} from 'nitro/vite';\nimport { join } from 'pathe';\nimport type { Plugin } from 'vite';\nimport { LocalBuilder } from './builders.js';\nimport type { ModuleOptions } from './index.js';\nimport nitroModule from './index.js';\n\nexport function workflow(options?: ModuleOptions): Plugin[] {\n let builder: LocalBuilder;\n let workflowBuildDir: string;\n const enqueue = createBuildQueue();\n\n // Create a lazy transform plugin that excludes the workflow build directory\n // The exclusion path is set during nitro setup, so we need to defer plugin creation\n const lazyTransformPlugin: Plugin = {\n name: 'workflow:transform',\n transform(code, id) {\n // Delegate to the actual transform plugin with exclusion\n // workflowBuildDir is set during nitro setup before transforms run\n const plugin = workflowTransformPlugin({\n exclude: workflowBuildDir ? [workflowBuildDir] : [],\n });\n return (plugin.transform as Function)?.call(this, code, id);\n },\n };\n\n return [\n lazyTransformPlugin,\n {\n name: 'workflow:nitro',\n nitro: {\n setup: (nitro: Nitro) => {\n // Capture the workflow build directory for exclusion\n workflowBuildDir = join(nitro.options.buildDir, 'workflow');\n nitro.options.workflow = {\n ...nitro.options.workflow,\n ...options,\n _vite: true,\n };\n if (nitro.options.dev) {\n builder = new LocalBuilder(nitro);\n }\n return nitroModule.setup(nitro);\n },\n },\n // NOTE: This is a workaround because Nitro passes the 404 requests to the dev server to handle.\n // For workflow routes, we override to send an empty body to prevent Hono/Vite's SPA fallback.\n configureServer(server) {\n // Add middleware to intercept 404s on workflow routes before Vite's SPA fallback\n return () => {\n server.middlewares.use((req, res, next) => {\n // Only handle workflow webhook routes\n if (!req.url?.startsWith('/.well-known/workflow/v1/')) {\n return next();\n }\n\n // Wrap writeHead to ensure we send empty body for 404s\n const originalWriteHead = res.writeHead;\n res.writeHead = function (this: typeof res, ...args: any[]) {\n const statusCode = typeof args[0] === 'number' ? args[0] : 200;\n\n // NOTE: Workaround because Nitro passes 404 requests to the vite to handle.\n // Causes `webhook route with invalid token` test to fail.\n // For 404s on workflow routes, ensure we're sending the right headers\n if (statusCode === 404) {\n // Set content-length to 0 to prevent Vite from overriding\n res.setHeader('Content-Length', '0');\n }\n\n // @ts-expect-error - Complex overload signature\n return originalWriteHead.apply(this, args);\n } as any;\n\n next();\n });\n };\n },\n },\n workflowHotUpdatePlugin({\n builder: () => builder,\n enqueue,\n }),\n ];\n}\n"]}