@workflow/nitro 5.0.0-beta.2 → 5.0.0-beta.20

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.
@@ -1 +1 @@
1
- {"version":3,"file":"builders.d.ts","sourceRoot":"","sources":["../src/builders.ts"],"names":[],"mappings":"AACA,OAAO,EACL,WAAW,EAEX,2BAA2B,EAC5B,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAGzC,qBAAa,aAAc,SAAQ,2BAA2B;gBAChD,KAAK,EAAE,KAAK;IAUT,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAWtC;AAED,qBAAa,YAAa,SAAQ,WAAW;;gBAE/B,KAAK,EAAE,KAAK;IAaT,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAwCtC"}
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;AAuBzC,qBAAa,aAAc,SAAQ,2BAA2B;gBAChD,KAAK,EAAE,KAAK;IAYT,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAWtC;AAED,qBAAa,YAAa,SAAQ,WAAW;;gBAE/B,KAAK,EAAE,KAAK;IAmBf,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAkDhC"}
package/dist/builders.js CHANGED
@@ -1,6 +1,12 @@
1
1
  import { mkdir, readFile, writeFile } from 'node:fs/promises';
2
2
  import { BaseBuilder, createBaseBuilderConfig, VercelBuildOutputAPIBuilder, } from '@workflow/builders';
3
3
  import { join } from 'pathe';
4
+ function getNitroStringExternals(nitro) {
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
+ }
4
10
  export class VercelBuilder extends VercelBuildOutputAPIBuilder {
5
11
  constructor(nitro) {
6
12
  super({
@@ -8,6 +14,8 @@ export class VercelBuilder extends VercelBuildOutputAPIBuilder {
8
14
  workingDir: nitro.options.rootDir,
9
15
  dirs: ['.'], // Different apps that use nitro have different directories
10
16
  runtime: nitro.options.workflow?.runtime,
17
+ sourcemap: nitro.options.workflow?.sourcemap,
18
+ externalPackages: getNitroStringExternals(nitro),
11
19
  }),
12
20
  buildTarget: 'vercel-build-output-api',
13
21
  });
@@ -30,37 +38,51 @@ export class LocalBuilder extends BaseBuilder {
30
38
  workingDir: nitro.options.rootDir,
31
39
  watch: nitro.options.dev,
32
40
  dirs: ['.'], // Different apps that use nitro have different directories
41
+ sourcemap: nitro.options.workflow?.sourcemap,
42
+ externalPackages: getNitroStringExternals(nitro),
33
43
  }),
34
44
  buildTarget: 'next', // Placeholder, not actually used
35
45
  });
36
46
  this.#outDir = outDir;
37
47
  }
38
- async build() {
48
+ // Serialize concurrent build() calls so overlapping dev rebuilds don't
49
+ // stomp on each other's temp files or partially overwrite output.
50
+ #buildQueue = Promise.resolve();
51
+ build() {
52
+ const next = this.#buildQueue.then(() => this.#buildOnce(), () => this.#buildOnce());
53
+ // Swallow rejections on the queue itself so a failed build doesn't
54
+ // permanently reject all subsequent builds; each caller still sees
55
+ // its own rejection via the returned promise.
56
+ this.#buildQueue = next.catch(() => { });
57
+ return next;
58
+ }
59
+ async #buildOnce() {
39
60
  const inputFiles = await this.getInputFiles();
40
61
  await mkdir(this.#outDir, { recursive: true });
41
- const { manifest: workflowsManifest } = await this.createWorkflowsBundle({
42
- outfile: join(this.#outDir, 'workflows.mjs'),
43
- bundleFinalOutput: false,
44
- format: 'esm',
62
+ // V2: The combined bundle's flow route references the steps file by
63
+ // name in its import statement, so we build directly to final names.
64
+ // (The V1 atomic tmp-file pattern doesn't work here because renaming
65
+ // the steps file would leave the flow route's import stale.)
66
+ const { manifest } = await this.createCombinedBundle({
45
67
  inputFiles,
46
- });
47
- const { manifest: stepsManifest } = await this.createStepsBundle({
48
- outfile: join(this.#outDir, 'steps.mjs'),
49
- externalizeNonSteps: true,
68
+ stepsOutfile: join(this.#outDir, 'steps.mjs'),
69
+ flowOutfile: join(this.#outDir, 'workflows.mjs'),
50
70
  format: 'esm',
51
- inputFiles,
71
+ // bundleFinalOutput: false — Nitro externalizes the workflow build dir
72
+ // during dev, and its own rollup pipeline handles bundling for prod.
73
+ // Using true causes "Dynamic require of X is not supported" errors
74
+ // because esbuild wraps CJS require() calls in ESM output.
75
+ bundleFinalOutput: false,
76
+ externalizeNonSteps: true,
77
+ // In dev, Nitro dynamically imports the generated workflow files from
78
+ // disk, so there is no later Rollup pass to resolve externalized local
79
+ // TypeScript imports. In prod, Nitro/Rollup handles those imports.
80
+ bundleTransitiveLocalStepDependencies: this.config.watch,
52
81
  });
53
- const webhookRouteFile = join(this.#outDir, 'webhook.mjs');
54
82
  await this.createWebhookBundle({
55
- outfile: webhookRouteFile,
83
+ outfile: join(this.#outDir, 'webhook.mjs'),
56
84
  bundle: false,
57
85
  });
58
- // Merge manifests from both bundles
59
- const manifest = {
60
- steps: { ...stepsManifest.steps, ...workflowsManifest.steps },
61
- workflows: { ...stepsManifest.workflows, ...workflowsManifest.workflows },
62
- classes: { ...stepsManifest.classes, ...workflowsManifest.classes },
63
- };
64
86
  // Generate manifest
65
87
  const workflowBundlePath = join(this.#outDir, 'workflows.mjs');
66
88
  await this.createManifest({
@@ -70,4 +92,4 @@ export class LocalBuilder extends BaseBuilder {
70
92
  });
71
93
  }
72
94
  }
73
- //# sourceMappingURL=builders.js.map
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlcnMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvYnVpbGRlcnMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsU0FBUyxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUQsT0FBTyxFQUNMLFdBQVcsRUFDWCx1QkFBdUIsRUFDdkIsMkJBQTJCLEdBQzVCLE1BQU0sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE9BQU8sQ0FBQztBQWE3QixTQUFTLHVCQUF1QixDQUFDLEtBQVk7SUFDM0MsTUFBTSxRQUFRLEdBQUksS0FBSyxDQUFDLE9BQW1DLENBQUMsU0FBUztRQUNuRSxFQUFFLFFBQVEsQ0FBQztJQUNiLE1BQU0sT0FBTyxHQUFHLFFBQVEsRUFBRSxNQUFNLENBQzlCLENBQUMsS0FBSyxFQUFtQixFQUFFLENBQUMsT0FBTyxLQUFLLEtBQUssUUFBUSxDQUN0RCxDQUFDO0lBQ0YsT0FBTyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDO0FBQzdELENBQUM7QUFFRCxNQUFNLE9BQU8sYUFBYyxTQUFRLDJCQUEyQjtJQUM1RCxZQUFZLEtBQVk7UUFDdEIsS0FBSyxDQUFDO1lBQ0osR0FBRyx1QkFBdUIsQ0FBQztnQkFDekIsVUFBVSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsT0FBTztnQkFDakMsSUFBSSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsMkRBQTJEO2dCQUN4RSxPQUFPLEVBQUUsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsT0FBTztnQkFDeEMsU0FBUyxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLFNBQVM7Z0JBQzVDLGdCQUFnQixFQUFFLHVCQUF1QixDQUFDLEtBQUssQ0FBQzthQUNqRCxDQUFD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QXVFO1lBQ3ZFLHFFQUFxRTtZQUNyRSxtRUFBbUU7WUFDbkUsMkRBQTJEO1lBQzNELGlCQUFpQixFQUFFLEtBQUs7WUFDeEIsbUJBQW1CLEVBQUUsSUFBSTtZQUN6QixzRUFBc0U7WUFDdEUsdUVBQXVFO1lBQ3ZFLG1FQUFtRTtZQUNuRSxxQ0FBcUMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUs7U0FDekQsQ0FBQyxDQUFDO1FBRUgsTUFBTSxJQUFJLENBQUMsbUJBQW1CLENBQUM7WUFDN0IsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGFBQWEsQ0FBQztZQUMxQyxNQUFNLEVBQUUsS0FBSztTQUNkLENBQUMsQ0FBQztRQUVILG9CQUFvQjtRQUNwQixNQUFNLGtCQUFrQixHQUFHLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLGVBQWUsQ0FBQyxDQUFDO1FBQy9ELE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQztZQUN4QixrQkFBa0I7WUFDbEIsV0FBVyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3pCLFFBQVE7U0FDVCxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBta2RpciwgcmVhZEZpbGUsIHdyaXRlRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHtcbiAgQmFzZUJ1aWxkZXIsXG4gIGNyZWF0ZUJhc2VCdWlsZGVyQ29uZmlnLFxuICBWZXJjZWxCdWlsZE91dHB1dEFQSUJ1aWxkZXIsXG59IGZyb20gJ0B3b3JrZmxvdy9idWlsZGVycyc7XG5pbXBvcnQgdHlwZSB7IE5pdHJvIH0gZnJvbSAnbml0cm8vdHlwZXMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGhlJztcblxuLyoqXG4gKiBGb3J3YXJkIHN0cmluZyBlbnRyaWVzIGZyb20gTml0cm8ncyBgZXh0ZXJuYWxzLmV4dGVybmFsYCBjb25maWcgdG8gdGhlXG4gKiB3b3JrZmxvdyBidWlsZGVyJ3MgZXNidWlsZCBgZXh0ZXJuYWxgIG9wdGlvbi4gUmVnRXhwIGFuZCBmdW5jdGlvbiBlbnRyaWVzXG4gKiBhcmUgc2tpcHBlZCBzaW5jZSBlc2J1aWxkJ3MgYGV4dGVybmFsYCBvbmx5IHN1cHBvcnRzIGxpdGVyYWwgc3RyaW5ncy5cbiAqXG4gKiBOb3RlOiBgZXh0ZXJuYWxzLmV4dGVybmFsYCBpcyBvbiBOaXRybyB2MidzIG9wdGlvbnMgc2hhcGUg4oCUIHYzIGRyb3BwZWQgaXRcbiAqIGluIGZhdm91ciBvZiBgbm9FeHRlcm5hbHNgLiBSZWFkaW5nIGl0IHRocm91Z2ggYSB2Mi1zaGFwZWQgdmlldyBsZXRzIHVzXG4gKiBzdGlsbCBwaWNrIGl0IHVwIG9uIHYyIHNldHVwczsgb24gdjMgdGhlIGNoYWluZWQgb3B0aW9uYWwgYWNjZXNzIGp1c3RcbiAqIHJldHVybnMgdW5kZWZpbmVkLlxuICovXG50eXBlIE5pdHJvVjJFeHRlcm5hbHNPcHRpb25zID0geyBleHRlcm5hbHM/OiB7IGV4dGVybmFsPzogdW5rbm93bltdIH0gfTtcbmZ1bmN0aW9uIGdldE5pdHJvU3RyaW5nRXh0ZXJuYWxzKG5pdHJvOiBOaXRybyk6IHN0cmluZ1tdIHwgdW5kZWZpbmVkIHtcbiAgY29uc3QgZXh0ZXJuYWwgPSAobml0cm8ub3B0aW9ucyBhcyBOaXRyb1YyRXh0ZXJuYWxzT3B0aW9ucykuZXh0ZXJuYWxzXG4gICAgPy5leHRlcm5hbDtcbiAgY29uc3Qgc3RyaW5ncyA9IGV4dGVybmFsPy5maWx0ZXIoXG4gICAgKGVudHJ5KTogZW50cnkgaXMgc3RyaW5nID0+IHR5cGVvZiBlbnRyeSA9PT0gJ3N0cmluZydcbiAgKTtcbiAgcmV0dXJuIHN0cmluZ3MgJiYgc3RyaW5ncy5sZW5ndGggPiAwID8gc3RyaW5ncyA6IHVuZGVmaW5lZDtcbn1cblxuZXhwb3J0IGNsYXNzIFZlcmNlbEJ1aWxkZXIgZXh0ZW5kcyBWZXJjZWxCdWlsZE91dHB1dEFQSUJ1aWxkZXIge1xuICBjb25zdHJ1Y3RvcihuaXRybzogTml0cm8pIHtcbiAgICBzdXBlcih7XG4gICAgICAuLi5jcmVhdGVCYXNlQnVpbGRlckNvbmZpZyh7XG4gICAgICAgIHdvcmtpbmdEaXI6IG5pdHJvLm9wdGlvbnMucm9vdERpcixcbiAgICAgICAgZGlyczogWycuJ10sIC8vIERpZmZlcmVudCBhcHBzIHRoYXQgdXNlIG5pdHJvIGhhdmUgZGlmZmVyZW50IGRpcmVjdG9yaWVzXG4gICAgICAgIHJ1bnRpbWU6IG5pdHJvLm9wdGlvbnMud29ya2Zsb3c/LnJ1bnRpbWUsXG4gICAgICAgIHNvdXJjZW1hcDogbml0cm8ub3B0aW9ucy53b3JrZmxvdz8uc291cmNlbWFwLFxuICAgICAgICBleHRlcm5hbFBhY2thZ2VzOiBnZXROaXRyb1N0cmluZ0V4dGVybmFscyhuaXRybyksXG4gICAgICB9KSxcbiAgICAgIGJ1aWxkVGFyZ2V0OiAndmVyY2VsLWJ1aWxkLW91dHB1dC1hcGknLFxuICAgIH0pO1xuICB9XG4gIG92ZXJyaWRlIGFzeW5jIGJ1aWxkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKFxuICAgICAgdGhpcy5jb25maWcud29ya2luZ0RpcixcbiAgICAgICcudmVyY2VsL291dHB1dC9jb25maWcuanNvbidcbiAgICApO1xuICAgIGNvbnN0IG9yaWdpbmFsQ29uZmlnID0gSlNPTi5wYXJzZShhd2FpdCByZWFkRmlsZShjb25maWdQYXRoLCAndXRmLTgnKSk7XG4gICAgYXdhaXQgc3VwZXIuYnVpbGQoKTtcbiAgICBjb25zdCBuZXdDb25maWcgPSBKU09OLnBhcnNlKGF3YWl0IHJlYWRGaWxlKGNvbmZpZ1BhdGgsICd1dGYtOCcpKTtcbiAgICBvcmlnaW5hbENvbmZpZy5yb3V0ZXMudW5zaGlmdCguLi5uZXdDb25maWcucm91dGVzKTtcbiAgICBhd2FpdCB3cml0ZUZpbGUoY29uZmlnUGF0aCwgSlNPTi5zdHJpbmdpZnkob3JpZ2luYWxDb25maWcsIG51bGwsIDIpKTtcbiAgfVxufVxuXG5leHBvcnQgY2xhc3MgTG9jYWxCdWlsZGVyIGV4dGVuZHMgQmFzZUJ1aWxkZXIge1xuICAjb3V0RGlyOiBzdHJpbmc7XG4gIGNvbnN0cnVjdG9yKG5pdHJvOiBOaXRybykge1xuICAgIGNvbnN0IG91dERpciA9IGpvaW4obml0cm8ub3B0aW9ucy5idWlsZERpciwgJ3dvcmtmbG93Jyk7XG4gICAgc3VwZXIoe1xuICAgICAgLi4uY3JlYXRlQmFzZUJ1aWxkZXJDb25maWcoe1xuICAgICAgICB3b3JraW5nRGlyOiBuaXRyby5vcHRpb25zLnJvb3REaXIsXG4gICAgICAgIHdhdGNoOiBuaXRyby5vcHRpb25zLmRldixcbiAgICAgICAgZGlyczogWycuJ10sIC8vIERpZmZlcmVudCBhcHBzIHRoYXQgdXNlIG5pdHJvIGhhdmUgZGlmZmVyZW50IGRpcmVjdG9yaWVzXG4gICAgICAgIHNvdXJjZW1hcDogbml0cm8ub3B0aW9ucy53b3JrZmxvdz8uc291cmNlbWFwLFxuICAgICAgICBleHRlcm5hbFBhY2thZ2VzOiBnZXROaXRyb1N0cmluZ0V4dGVybmFscyhuaXRybyksXG4gICAgICB9KSxcbiAgICAgIGJ1aWxkVGFyZ2V0OiAnbmV4dCcsIC8vIFBsYWNlaG9sZGVyLCBub3QgYWN0dWFsbHkgdXNlZFxuICAgIH0pO1xuICAgIHRoaXMuI291dERpciA9IG91dERpcjtcbiAgfVxuXG4gIC8vIFNlcmlhbGl6ZSBjb25jdXJyZW50IGJ1aWxkKCkgY2FsbHMgc28gb3ZlcmxhcHBpbmcgZGV2IHJlYnVpbGRzIGRvbid0XG4gIC8vIHN0b21wIG9uIGVhY2ggb3RoZXIncyB0ZW1wIGZpbGVzIG9yIHBhcnRpYWxseSBvdmVyd3JpdGUgb3V0cHV0LlxuICAjYnVpbGRRdWV1ZTogUHJvbWlzZTx2b2lkPiA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gIG92ZXJyaWRlIGJ1aWxkKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IG5leHQgPSB0aGlzLiNidWlsZFF1ZXVlLnRoZW4oXG4gICAgICAoKSA9PiB0aGlzLiNidWlsZE9uY2UoKSxcbiAgICAgICgpID0+IHRoaXMuI2J1aWxkT25jZSgpXG4gICAgKTtcbiAgICAvLyBTd2FsbG93IHJlamVjdGlvbnMgb24gdGhlIHF1ZXVlIGl0c2VsZiBzbyBhIGZhaWxlZCBidWlsZCBkb2Vzbid0XG4gICAgLy8gcGVybWFuZW50bHkgcmVqZWN0IGFsbCBzdWJzZXF1ZW50IGJ1aWxkczsgZWFjaCBjYWxsZXIgc3RpbGwgc2Vlc1xuICAgIC8vIGl0cyBvd24gcmVqZWN0aW9uIHZpYSB0aGUgcmV0dXJuZWQgcHJvbWlzZS5cbiAgICB0aGlzLiNidWlsZFF1ZXVlID0gbmV4dC5jYXRjaCgoKSA9PiB7fSk7XG4gICAgcmV0dXJuIG5leHQ7XG4gIH1cblxuICBhc3luYyAjYnVpbGRPbmNlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGlucHV0RmlsZXMgPSBhd2FpdCB0aGlzLmdldElucHV0RmlsZXMoKTtcbiAgICBhd2FpdCBta2Rpcih0aGlzLiNvdXREaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pO1xuXG4gICAgLy8gVjI6IFRoZSBjb21iaW5lZCBidW5kbGUncyBmbG93IHJvdXRlIHJlZmVyZW5jZXMgdGhlIHN0ZXBzIGZpbGUgYnlcbiAgICAvLyBuYW1lIGluIGl0cyBpbXBvcnQgc3RhdGVtZW50LCBzbyB3ZSBidWlsZCBkaXJlY3RseSB0byBmaW5hbCBuYW1lcy5cbiAgICAvLyAoVGhlIFYxIGF0b21pYyB0bXAtZmlsZSBwYXR0ZXJuIGRvZXNuJ3Qgd29yayBoZXJlIGJlY2F1c2UgcmVuYW1pbmdcbiAgICAvLyB0aGUgc3RlcHMgZmlsZSB3b3VsZCBsZWF2ZSB0aGUgZmxvdyByb3V0ZSdzIGltcG9ydCBzdGFsZS4pXG4gICAgY29uc3QgeyBtYW5pZmVzdCB9ID0gYXdhaXQgdGhpcy5jcmVhdGVDb21iaW5lZEJ1bmRsZSh7XG4gICAgICBpbnB1dEZpbGVzLFxuICAgICAgc3RlcHNPdXRmaWxlOiBqb2luKHRoaXMuI291dERpciwgJ3N0ZXBzLm1qcycpLFxuICAgICAgZmxvd091dGZpbGU6IGpvaW4odGhpcy4jb3V0RGlyLCAnd29ya2Zsb3dzLm1qcycpLFxuICAgICAgZm9ybWF0OiAnZXNtJyxcbiAgICAgIC8vIGJ1bmRsZUZpbmFsT3V0cHV0OiBmYWxzZSDigJQgTml0cm8gZXh0ZXJuYWxpemVzIHRoZSB3b3JrZmxvdyBidWlsZCBkaXJcbiAgICAgIC8vIGR1cmluZyBkZXYsIGFuZCBpdHMgb3duIHJvbGx1cCBwaXBlbGluZSBoYW5kbGVzIGJ1bmRsaW5nIGZvciBwcm9kLlxuICAgICAgLy8gVXNpbmcgdHJ1ZSBjYXVzZXMgXCJEeW5hbWljIHJlcXVpcmUgb2YgWCBpcyBub3Qgc3VwcG9ydGVkXCIgZXJyb3JzXG4gICAgICAvLyBiZWNhdXNlIGVzYnVpbGQgd3JhcHMgQ0pTIHJlcXVpcmUoKSBjYWxscyBpbiBFU00gb3V0cHV0LlxuICAgICAgYnVuZGxlRmluYWxPdXRwdXQ6IGZhbHNlLFxuICAgICAgZXh0ZXJuYWxpemVOb25TdGVwczogdHJ1ZSxcbiAgICAgIC8vIEluIGRldiwgTml0cm8gZHluYW1pY2FsbHkgaW1wb3J0cyB0aGUgZ2VuZXJhdGVkIHdvcmtmbG93IGZpbGVzIGZyb21cbiAgICAgIC8vIGRpc2ssIHNvIHRoZXJlIGlzIG5vIGxhdGVyIFJvbGx1cCBwYXNzIHRvIHJlc29sdmUgZXh0ZXJuYWxpemVkIGxvY2FsXG4gICAgICAvLyBUeXBlU2NyaXB0IGltcG9ydHMuIEluIHByb2QsIE5pdHJvL1JvbGx1cCBoYW5kbGVzIHRob3NlIGltcG9ydHMuXG4gICAgICBidW5kbGVUcmFuc2l0aXZlTG9jYWxTdGVwRGVwZW5kZW5jaWVzOiB0aGlzLmNvbmZpZy53YXRjaCxcbiAgICB9KTtcblxuICAgIGF3YWl0IHRoaXMuY3JlYXRlV2ViaG9va0J1bmRsZSh7XG4gICAgICBvdXRmaWxlOiBqb2luKHRoaXMuI291dERpciwgJ3dlYmhvb2subWpzJyksXG4gICAgICBidW5kbGU6IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgLy8gR2VuZXJhdGUgbWFuaWZlc3RcbiAgICBjb25zdCB3b3JrZmxvd0J1bmRsZVBhdGggPSBqb2luKHRoaXMuI291dERpciwgJ3dvcmtmbG93cy5tanMnKTtcbiAgICBhd2FpdCB0aGlzLmNyZWF0ZU1hbmlmZXN0KHtcbiAgICAgIHdvcmtmbG93QnVuZGxlUGF0aCxcbiAgICAgIG1hbmlmZXN0RGlyOiB0aGlzLiNvdXREaXIsXG4gICAgICBtYW5pZmVzdCxcbiAgICB9KTtcbiAgfVxufVxuIl19
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAEA,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,wBAwHwB"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,KAAK,EAA6B,MAAM,aAAa,CAAC;AAGpE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAE7C,YAAY,EAAE,aAAa,EAAE,CAAC;;;6BAoBT,KAAK;;AAF1B,wBAwQwB"}
package/dist/index.js CHANGED
@@ -1,7 +1,25 @@
1
+ import { createRequire } from 'node:module';
1
2
  import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
3
+ import { fileURLToPath, pathToFileURL } from 'node:url';
4
+ import { WORKFLOW_QUEUE_TRIGGER } from '@workflow/builders';
2
5
  import { workflowTransformPlugin } from '@workflow/rollup';
3
6
  import { join } from 'pathe';
4
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
+ }
5
23
  export default {
6
24
  name: 'workflow/nitro',
7
25
  async setup(nitro) {
@@ -22,12 +40,89 @@ export default {
22
40
  if (!nitro.options.workflow?._vite) {
23
41
  nitro.options.alias['debug'] ??= 'debug';
24
42
  }
25
- // NOTE: Externalize .nitro/workflow to prevent dev reloads
26
43
  if (nitro.options.dev) {
27
- nitro.options.externals ||= {};
28
- nitro.options.externals.external ||= [];
29
- const outDir = join(nitro.options.buildDir, 'workflow');
30
- nitro.options.externals.external.push((id) => id.startsWith(outDir));
44
+ const workflowBuildGlob = `${join(nitro.options.buildDir, 'workflow')}/**`;
45
+ nitro.options.watchOptions ||= {};
46
+ const existingIgnored = nitro.options.watchOptions.ignored;
47
+ if (!existingIgnored) {
48
+ nitro.options.watchOptions.ignored = [workflowBuildGlob];
49
+ }
50
+ else if (Array.isArray(existingIgnored)) {
51
+ nitro.options.watchOptions.ignored = [
52
+ ...existingIgnored,
53
+ workflowBuildGlob,
54
+ ];
55
+ }
56
+ else {
57
+ nitro.options.watchOptions.ignored = [
58
+ existingIgnored,
59
+ workflowBuildGlob,
60
+ ];
61
+ }
62
+ }
63
+ // In dev mode, force workflow SDK packages to be bundled by Nitro's
64
+ // Rollup rather than externalized. This ensures the SWC transform
65
+ // plugin processes files containing workflow patterns (like
66
+ // @workflow/core/dist/runtime/run.js) and adds the classId
67
+ // registration IIFEs needed for serialization. Without this, serde
68
+ // classes from npm packages (like `Run`) would be externalized, the
69
+ // SWC transform would never fire on them, and serialization would
70
+ // fail with "must have a static classId property".
71
+ //
72
+ // We use a Rollup resolveId hook (added BEFORE the externalization
73
+ // plugin) that intercepts workflow package imports and marks them
74
+ // as non-external. This is more targeted than `noExternals = true`
75
+ // which would bundle ALL dependencies and cause TDZ errors from
76
+ // circular imports in packages like vue-bundle-renderer/h3.
77
+ if (nitro.options.dev) {
78
+ nitro.hooks.hook('rollup:before', (_nitro, config) => {
79
+ config.plugins.unshift({
80
+ name: 'workflow:force-inline',
81
+ // `order: 'pre'` is required: Nitro's `nitro:externals` plugin
82
+ // uses `order: 'pre'` for its resolveId hook and spreads our
83
+ // resolution result while forcing `external: true`. Without
84
+ // `pre` here, our `external: false` decision gets overwritten
85
+ // and `@workflow/*` imports end up externalized in the dev
86
+ // bundle — which means the SWC-injected `static classId` IIFE
87
+ // in (e.g.) `@workflow/core/dist/runtime/run.js` is never
88
+ // applied, and step return values that include `Run`
89
+ // instances fail to serialize at runtime.
90
+ resolveId: {
91
+ order: 'pre',
92
+ async handler(source, importer, options) {
93
+ if (!importer)
94
+ return null;
95
+ // Match workflow package specifiers OR direct paths into
96
+ // packages/<name>/. Bail out early on non-workflow imports
97
+ // so we don't intercept the rest of the resolution chain.
98
+ const isWorkflowPkg = /^@?workflow(\/|$)/.test(source) ||
99
+ /[\\/]packages[\\/](workflow|core|serde|errors|utils|builders|rollup|ai|world|world-local|world-vercel|world-postgres|world-testing|cli|next|nitro|nuxt|vite|vitest|astro|sveltekit|nest)[\\/]/.test(source);
100
+ if (!isWorkflowPkg)
101
+ return null;
102
+ // Resolve via other resolvers, skipping ourselves so we
103
+ // get a path. We don't gate on `resolved.external` because
104
+ // `nitro:externals` spreads our result and overrides
105
+ // `external: true` regardless of what we return — we want
106
+ // to win that race by returning first under `order: 'pre'`.
107
+ const resolved = await this.resolve(source, importer, {
108
+ ...options,
109
+ skipSelf: true,
110
+ });
111
+ if (!resolved)
112
+ return null;
113
+ let resolvedId = resolved.id;
114
+ // Strip file:// protocol if present — Rollup needs a plain
115
+ // filesystem path to load the module. `fileURLToPath`
116
+ // correctly handles Windows paths (e.g., file:///C:/...
117
+ // -> C:\...) and percent-decoding.
118
+ if (resolvedId.startsWith('file://')) {
119
+ resolvedId = fileURLToPath(resolvedId);
120
+ }
121
+ return { id: resolvedId, external: false };
122
+ },
123
+ },
124
+ });
125
+ });
31
126
  }
32
127
  // Add tsConfig plugin
33
128
  if (nitro.options.workflow?.typescriptPlugin) {
@@ -38,14 +133,23 @@ export default {
38
133
  name: 'workflow',
39
134
  });
40
135
  }
41
- // Generate functions for vercel build
42
- if (isVercelDeploy) {
136
+ // Nitro v2 Vercel deploy: keep the legacy Build Output API path that
137
+ // builds the workflow functions standalone and stitches the routes into
138
+ // `.vercel/output/config.json`. This path is independent of nitro's own
139
+ // bundle and is only used for nitropack v2 (e.g. Nuxt 4 still uses it).
140
+ const useLegacyVercelBuild = isVercelDeploy && isNitroV2(nitro);
141
+ if (useLegacyVercelBuild) {
43
142
  nitro.hooks.hook('compiled', async () => {
44
143
  await new VercelBuilder(nitro).build();
45
144
  });
46
145
  }
47
- // Generate local bundles for dev and local prod
48
- if (!isVercelDeploy) {
146
+ // Local dev/prod and Nitro v3 Vercel deploy share the same path:
147
+ // bundle the workflow routes into nitro itself via virtual handlers.
148
+ // For Vercel v3 we additionally configure `functionRules` so the
149
+ // routes get queue triggers + extended maxDuration via the nitro
150
+ // vercel preset. This lets workflow handlers use nitro features
151
+ // (storage, database, runtime config, virtual imports, etc.).
152
+ if (!useLegacyVercelBuild) {
49
153
  const builder = new LocalBuilder(nitro);
50
154
  let isInitialBuild = true;
51
155
  nitro.hooks.hook('build:before', async () => {
@@ -65,12 +169,62 @@ export default {
65
169
  isInitialBuild = false;
66
170
  return;
67
171
  }
68
- await builder.build();
172
+ try {
173
+ await builder.build();
174
+ }
175
+ catch (error) {
176
+ // During dev, files may be added/removed while the builder
177
+ // is rebuilding (e.g., during test cleanup). Log the error
178
+ // but don't crash — the next file change will trigger
179
+ // another rebuild with the correct file list.
180
+ console.warn('Warning: Workflow rebuild failed:', error);
181
+ }
69
182
  });
70
183
  }
184
+ if (nitro.options.dev) {
185
+ addDashboardHandler(nitro);
186
+ }
71
187
  addVirtualHandler(nitro, '/.well-known/workflow/v1/webhook/:token', 'workflow/webhook.mjs');
72
- addVirtualHandler(nitro, '/.well-known/workflow/v1/step', 'workflow/steps.mjs');
188
+ // V2: single combined handler for both workflow and step execution.
189
+ // The step registrations are imported as side effects by the combined
190
+ // handler — no separate step route needed.
73
191
  addVirtualHandler(nitro, '/.well-known/workflow/v1/flow', 'workflow/workflows.mjs');
192
+ // Nitro v3+ Vercel deploy: configure function rules for the combined
193
+ // flow handler so it gets the queue triggers + max duration that the
194
+ // workflow runtime needs. Workflow-required fields (`maxDuration`,
195
+ // `experimentalTriggers`, `runtime` when set) take precedence over
196
+ // user-provided values for these routes; unrelated fields the user
197
+ // sets (e.g. `memory`) pass through untouched.
198
+ //
199
+ // Pattern keys must match the route patterns the handlers are
200
+ // registered with so nitro reuses the same function directory.
201
+ // Using a `webhook/**` catch-all here would create a second
202
+ // `webhook/[...].func` next to the `webhook/[token].func` that
203
+ // `addVirtualHandler` produces.
204
+ if (isVercelDeploy) {
205
+ nitro.options.vercel ??= {};
206
+ nitro.options.vercel.functionRules ??= {};
207
+ const runtime = nitro.options.workflow?.runtime;
208
+ const rules = nitro.options.vercel.functionRules;
209
+ const flowPath = '/.well-known/workflow/v1/flow';
210
+ rules[flowPath] = {
211
+ ...rules[flowPath],
212
+ ...(runtime && { runtime }),
213
+ maxDuration: 'max',
214
+ // V2 combined: a single trigger covers both `__wkf_workflow_*`
215
+ // (workflow orchestration) and `__wkf_step_*` (step execution),
216
+ // since the same handler dispatches both.
217
+ experimentalTriggers: [WORKFLOW_QUEUE_TRIGGER],
218
+ };
219
+ if (runtime) {
220
+ const webhookPath = '/.well-known/workflow/v1/webhook/:token';
221
+ rules[webhookPath] = { ...rules[webhookPath], runtime };
222
+ if (process.env.WORKFLOW_PUBLIC_MANIFEST === '1') {
223
+ const manifestPath = '/.well-known/workflow/v1/manifest.json';
224
+ rules[manifestPath] = { ...rules[manifestPath], runtime };
225
+ }
226
+ }
227
+ }
74
228
  // Expose manifest as a public HTTP route when WORKFLOW_PUBLIC_MANIFEST=1
75
229
  if (process.env.WORKFLOW_PUBLIC_MANIFEST === '1') {
76
230
  // Write a placeholder manifest-data.mjs so rollup can resolve the
@@ -89,16 +243,142 @@ export default {
89
243
  }
90
244
  },
91
245
  };
246
+ const DASHBOARD_VIRTUAL_ID = '#workflow/dashboard-handler';
247
+ function addDashboardHandler(nitro) {
248
+ const route = '/_workflow';
249
+ nitro.options.handlers.push({ route, handler: DASHBOARD_VIRTUAL_ID });
250
+ // Resolve `@workflow/web/server` relative to this module so consumers don't
251
+ // need a direct dependency on `@workflow/web`. The path is inlined into the
252
+ // virtual handler as a file:// URL so Node can `import()` it at runtime
253
+ // regardless of where the generated Nitro bundle ends up.
254
+ const require_ = createRequire(import.meta.url);
255
+ let webServerUrl;
256
+ try {
257
+ webServerUrl = pathToFileURL(require_.resolve('@workflow/web/server')).href;
258
+ }
259
+ catch {
260
+ webServerUrl = '@workflow/web/server';
261
+ }
262
+ const handlerSource = /* js */ `
263
+ const __workflowWebServerUrl = ${JSON.stringify(webServerUrl)};
264
+ let serverPromise = null;
265
+ async function getDashboardUrl() {
266
+ if (!serverPromise) {
267
+ serverPromise = (async () => {
268
+ const { startServer } = await import(/* @vite-ignore */ /* webpackIgnore: true */ __workflowWebServerUrl);
269
+ const server = await startServer(0);
270
+ const address = server.address();
271
+ const port = typeof address === 'object' && address ? address.port : 3456;
272
+ return 'http://localhost:' + port;
273
+ })().catch((error) => {
274
+ serverPromise = null;
275
+ throw error;
276
+ });
277
+ }
278
+ return serverPromise;
279
+ }
280
+ `;
281
+ if (!nitro.routing) {
282
+ nitro.options.virtual[DASHBOARD_VIRTUAL_ID] = /* js */ `
283
+ import { fromWebHandler } from "h3";
284
+ ${handlerSource}
285
+ export default fromWebHandler(async () => {
286
+ try {
287
+ const url = await getDashboardUrl();
288
+ return Response.redirect(url, 302);
289
+ } catch (error) {
290
+ console.error('Failed to start workflow dashboard:', error);
291
+ return new Response('Failed to start workflow dashboard: ' + error.message, { status: 500 });
292
+ }
293
+ });
294
+ `;
295
+ }
296
+ else {
297
+ nitro.options.virtual[DASHBOARD_VIRTUAL_ID] = /* js */ `
298
+ ${handlerSource}
299
+ export default async () => {
300
+ try {
301
+ const url = await getDashboardUrl();
302
+ return Response.redirect(url, 302);
303
+ } catch (error) {
304
+ console.error('Failed to start workflow dashboard:', error);
305
+ return new Response('Failed to start workflow dashboard: ' + error.message, { status: 500 });
306
+ }
307
+ };
308
+ `;
309
+ }
310
+ }
92
311
  function addVirtualHandler(nitro, route, buildPath) {
93
312
  nitro.options.handlers.push({
94
313
  route,
95
314
  handler: `#${buildPath}`,
96
315
  });
316
+ const handlerImportPath = JSON.stringify(join(nitro.options.buildDir, buildPath));
317
+ if (nitro.options.dev) {
318
+ // Dev mode: load generated workflow bundles from disk at request time.
319
+ // This keeps `.nitro/workflow/*.mjs` out of Nitro's own bundle graph,
320
+ // which avoids rebuild loops and stale dependency graphs during HMR.
321
+ // Cache-bust by file mtime so each successful rebuild loads fresh code.
322
+ if (!nitro.routing) {
323
+ nitro.options.virtual[`#${buildPath}`] = /* js */ `
324
+ import { fromWebHandler } from "h3";
325
+ import { statSync } from "node:fs";
326
+ import { pathToFileURL } from "node:url";
327
+
328
+ const handlerPath = ${handlerImportPath};
329
+ let currentVersion = "";
330
+ let currentImportPath = "";
331
+
332
+ async function loadPOST() {
333
+ const version = String(statSync(handlerPath).mtimeMs);
334
+ if (version !== currentVersion) {
335
+ currentVersion = version;
336
+ currentImportPath = pathToFileURL(handlerPath).href + "?t=" + version;
337
+ }
338
+ return (await import(currentImportPath)).POST;
339
+ }
340
+
341
+ export default fromWebHandler(async (request, context) => {
342
+ const POST = await loadPOST();
343
+ return POST(request, context);
344
+ });
345
+ `;
346
+ }
347
+ else {
348
+ nitro.options.virtual[`#${buildPath}`] = /* js */ `
349
+ import { statSync } from "node:fs";
350
+ import { pathToFileURL } from "node:url";
351
+
352
+ const handlerPath = ${handlerImportPath};
353
+ let currentVersion = "";
354
+ let currentImportPath = "";
355
+
356
+ async function loadPOST() {
357
+ const version = String(statSync(handlerPath).mtimeMs);
358
+ if (version !== currentVersion) {
359
+ currentVersion = version;
360
+ currentImportPath = pathToFileURL(handlerPath).href + "?t=" + version;
361
+ }
362
+ return (await import(currentImportPath)).POST;
363
+ }
364
+
365
+ export default async ({ req }) => {
366
+ try {
367
+ const POST = await loadPOST();
368
+ return await POST(req);
369
+ } catch (error) {
370
+ console.error('Handler error:', error);
371
+ return new Response('Internal Server Error', { status: 500 });
372
+ }
373
+ };
374
+ `;
375
+ }
376
+ return;
377
+ }
97
378
  // Keep a bare import alongside `POST`: in Nuxt + Nitro production builds
98
379
  // using `@workflow/nuxt`, importing only `POST` could drop the generated
99
380
  // step bundle's top-level registrations, so the handler loaded but steps
100
381
  // were missing at runtime.
101
- const handlerImportPath = JSON.stringify(join(nitro.options.buildDir, buildPath));
102
382
  if (!nitro.routing) {
103
383
  // Nitro v2 (legacy)
104
384
  nitro.options.virtual[`#${buildPath}`] = /* js */ `
@@ -208,4 +488,4 @@ export default fromWebHandler(() => new Response("Manifest not found", { status:
208
488
  writeFileSync(handlerPath, fallback);
209
489
  }
210
490
  }
211
- //# sourceMappingURL=index.js.map
491
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxhQUFhLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDakUsT0FBTyxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDeEQsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDNUQsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFM0QsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLE9BQU8sQ0FBQztBQUM3QixPQUFPLEVBQUUsWUFBWSxFQUFFLGFBQWEsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUs1RDs7Ozs7O0dBTUc7QUFDSCxTQUFTLFNBQVMsQ0FBQyxLQUFZO0lBQzdCLE1BQU0sWUFBWSxHQUFJLEtBQThDLENBQUMsSUFBSTtRQUN2RSxFQUFFLFlBQVksQ0FBQztJQUNqQixJQUFJLFlBQVksSUFBSSxJQUFJLEVBQUUsQ0FBQztRQUN6QixPQUFPLFlBQVksS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUNELE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDO0FBQ3hCLENBQUM7QUFFRCxlQUFlO0lBQ2IsSUFBSSxFQUFFLGdCQUFnQjtJQUN0QixLQUFLLENBQUMsS0FBSyxDQUFDLEtBQVk7UUFDdEIsTUFBTSxjQUFjLEdBQ2xCLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEtBQUssUUFBUSxDQUFDO1FBRTFELGlGQUFpRjtRQUNqRixNQUFNLGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENB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V0FBVyxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDaEMsQ0FBQyxDQUFDO21CQUNXLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDOzs7O0NBSWpEO1lBQ0ssQ0FBQyxDQUFDLG9CQUFvQixJQUFJLENBQUMsU0FBUyxDQUFDLGVBQWUsQ0FBQzs7OztDQUkxRCxDQUFDO1FBQ0UsYUFBYSxDQUFDLFdBQVcsRUFBRSxXQUFXLENBQUMsQ0FBQztJQUMxQyxDQUFDO0lBQUMsTUFBTSxDQUFDO1FBQ1AsK0JBQStCO1FBQy9CLE1BQU0sUUFBUSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU87WUFDN0IsQ0FBQyxDQUFDOztDQUVQO1lBQ0ssQ0FBQyxDQUFDO0NBQ1AsQ0FBQztRQUNFLGFBQWEsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7SUFDdkMsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBjcmVhdGVSZXF1aXJlIH0gZnJvbSAnbm9kZTptb2R1bGUnO1xuaW1wb3J0IHsgbWtkaXJTeW5jLCByZWFkRmlsZVN5bmMsIHdyaXRlRmlsZVN5bmMgfSBmcm9tICdub2RlOmZzJztcbmltcG9ydCB7IGZpbGVVUkxUb1BhdGgsIHBhdGhUb0ZpbGVVUkwgfSBmcm9tICdub2RlOnVybCc7XG5pbXBvcnQgeyBXT1JLRkxPV19RVUVVRV9UUklHR0VSIH0gZnJvbSAnQHdvcmtmbG93L2J1aWxkZXJzJztcbmltcG9ydCB7IHdvcmtmbG93VHJhbnNmb3JtUGx1Z2luIH0gZnJvbSAnQHdvcmtmbG93L3JvbGx1cCc7XG5pbXBvcnQgdHlwZSB7IE5pdHJvLCBOaXRyb01vZHVsZSwgUm9sbHVwQ29uZmlnIH0gZnJvbSAnbml0cm8vdHlwZXMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGhlJztcbmltcG9ydCB7IExvY2FsQnVpbGRlciwgVmVyY2VsQnVpbGRlciB9IGZyb20gJy4vYnVpbGRlcnMuanMnO1xuaW1wb3J0IHR5cGUgeyBNb2R1bGVPcHRpb25zIH0gZnJvbSAnLi90eXBlcyc7XG5cbmV4cG9ydCB0eXBlIHsgTW9kdWxlT3B0aW9ucyB9O1xuXG4vKipcbiAqIERldGVjdCB3aGV0aGVyIHRoZSBOaXRybyBpbnN0YW5jZSBpcyB2Mi5cbiAqIE5ld2VyIE5pdHJvIHJlbGVhc2VzIChib3RoIHYyIGFuZCB2MykgZXhwb3NlIGBuaXRyby5tZXRhLm1ham9yVmVyc2lvbmAuXG4gKiBGYWxsIGJhY2sgdG8gYCFuaXRyby5yb3V0aW5nYCAob25seSBwcmVzZW50IGluIHYzKykgZm9yIG9sZGVyIE5pdHJvIHYyXG4gKiB2ZXJzaW9ucyB0aGF0IGRvbid0IGhhdmUgYG1ham9yVmVyc2lvbmAgeWV0IChlLmcuIE51eHQgdXNlcnMgb24gYW4gb2xkZXJcbiAqIG5pdHJvcGFjaykuXG4gKi9cbmZ1bmN0aW9uIGlzTml0cm9WMihuaXRybzogTml0cm8pOiBib29sZWFuIHtcbiAgY29uc3QgbWFqb3JWZXJzaW9uID0gKG5pdHJvIGFzIHsgbWV0YT86IHsgbWFqb3JWZXJzaW9uPzogbnVtYmVyIH0gfSkubWV0YVxuICAgID8ubWFqb3JWZXJzaW9uO1xuICBpZiAobWFqb3JWZXJzaW9uICE9IG51bGwpIHtcbiAgICByZXR1cm4gbWFqb3JWZXJzaW9uID09PSAyO1xuICB9XG4gIHJldHVybiAhbml0cm8ucm91dGluZztcbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBuYW1lOiAnd29ya2Zsb3cvbml0cm8nLFxuICBhc3luYyBzZXR1cChuaXRybzogTml0cm8pIHtcbiAgICBjb25zdCBpc1ZlcmNlbERlcGxveSA9XG4gICAgICAhbml0cm8ub3B0aW9ucy5kZXYgJiYgbml0cm8ub3B0aW9ucy5wcmVzZXQgPT09ICd2ZXJjZWwnO1xuXG4gICAgLy8gUHJlLWJ1aWx0IHdvcmtmbG93IGJ1bmRsZXMgZGlyZWN0b3J5IC0gbXVzdCBiZSBleGNsdWRlZCBmcm9tIHJlLXRyYW5zZm9ybWF0aW9uXG4gICAgY29uc3Qgd29ya2Zsb3dCdWlsZERpciA9IGpvaW4obml0cm8ub3B0aW9ucy5idWlsZERpciwgJ3dvcmtmbG93Jyk7XG5cbiAgICAvLyBBZGQgdHJhbnNmb3JtIHBsdWdpbiBhdCB0aGUgQkVHSU5OSU5HIHRvIHJ1biBiZWZvcmUgb3RoZXIgdHJhbnNmb3Jtc1xuICAgIC8vIChlc3BlY2lhbGx5IGJlZm9yZSBjbGFzcyBwcm9wZXJ0eSB0cmFuc2Zvcm1zIHRoYXQgcmVuYW1lIGNsYXNzZXMgbGlrZSBfQ2xhc3NOYW1lKVxuICAgIG5pdHJvLmhvb2tzLmhvb2soJ3JvbGx1cDpiZWZvcmUnLCAoX25pdHJvOiBOaXRybywgY29uZmlnOiBSb2xsdXBDb25maWcpID0+IHtcbiAgICAgIChjb25maWcucGx1Z2lucyBhcyBBcnJheTx1bmtub3duPikudW5zaGlmdChcbiAgICAgICAgd29ya2Zsb3dUcmFuc2Zvcm1QbHVnaW4oe1xuICAgICAgICAgIC8vIEV4Y2x1ZGUgcHJlLWJ1aWx0IHdvcmtmbG93IGJ1bmRsZXMgZnJvbSByZS10cmFuc2Zvcm1hdGlvblxuICAgICAgICAgIC8vIFRoZXNlIGFyZSBhbHJlYWR5IHByb2Nlc3NlZCBhbmQgcmUtcHJvY2Vzc2luZyBjYXVzZXMgaXNzdWVzIGxpa2VcbiAgICAgICAgICAvLyB1bmRlZmluZWQgY2xhc3MgcmVmZXJlbmNlcyB3aGVuIE5pdHJvJ3MgYnVuZGxlciByZW5hbWVzIHZhcmlhYmxlc1xuICAgICAgICAgIGV4Y2x1ZGU6IFt3b3JrZmxvd0J1aWxkRGlyXSxcbiAgICAgICAgfSlcbiAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvLyBOT1RFOiBUZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgZGVidWcgdW5lbnYgbW9ja1xuICAgIGlmICghbml0cm8ub3B0aW9ucy53b3JrZmxvdz8uX3ZpdGUpIHtcbiAgICAgIG5pdHJvLm9wdGlvbnMuYWxpYXNbJ2RlYnVnJ10gPz89ICdkZWJ1Zyc7XG4gICAgfVxuXG4gICAgaWYgKG5pdHJvLm9wdGlvbnMuZGV2KSB7XG4gICAgICBjb25zdCB3b3JrZmxvd0J1aWxkR2xvYiA9IGAke2pvaW4obml0cm8ub3B0aW9ucy5idWlsZERpciwgJ3dvcmtmbG93Jyl9LyoqYDtcbiAgICAgIG5pdHJvLm9wdGlvbnMud2F0Y2hPcHRpb25zIHx8PSB7fTtcbiAgICAgIGNvbnN0IGV4aXN0aW5nSWdub3JlZCA9IG5pdHJvLm9wdGlvbnMud2F0Y2hPcHRpb25zLmlnbm9yZWQ7XG4gICAgICBpZiAoIWV4aXN0aW5nSWdub3JlZCkge1xuICAgICAgICBuaXRyby5vcHRpb25zLndhdGNoT3B0aW9ucy5pZ25vcmVkID0gW3dvcmtmbG93QnVpbGRHbG9iXTtcbiAgICAgIH0gZWxzZSBpZiAoQXJyYXkuaXNBcnJheShleGlzdGluZ0lnbm9yZWQpKSB7XG4gICAgICAgIG5pdHJvLm9wdGlvbnMud2F0Y2hPcHRpb25zLmlnbm9yZWQgPSBbXG4gICAgICAgICAgLi4uZXhpc3RpbmdJZ25vcmVkLFxuICAgICAgICAgIHdvcmtmbG93QnVpbGRHbG9iLFxuICAgICAgICBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbml0cm8ub3B0aW9ucy53YXRjaE9wdGlvbnMuaWdub3JlZCA9IFtcbiAgICAgICAgICBleGlzdGluZ0lnbm9yZWQsXG4gICAgICAgICAgd29ya2Zsb3dCdWlsZEdsb2IsXG4gICAgICAgIF07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gSW4gZGV2IG1vZGUsIGZvcmNlIHdvcmtmbG93IFNESyBwYWNrYWdlcyB0byBiZSBidW5kbGVkIGJ5IE5pdHJvJ3NcbiAgICAvLyBSb2xsdXAgcmF0aGVyIHRoYW4gZXh0ZXJuYWxpemVkLiBUaGlzIGVuc3VyZXMgdGhlIFNXQyB0cmFuc2Zvcm1cbiAgICAvLyBwbHVnaW4gcHJvY2Vzc2VzIGZpbGVzIGNvbnRhaW5pbmcgd29ya2Zsb3cgcGF0dGVybnMgKGxpa2VcbiAgICAvLyBAd29ya2Zsb3cvY29yZS9kaXN0L3J1bnRpbWUvcnVuLmpzKSBhbmQgYWRkcyB0aGUgY2xhc3NJZFxuICAgIC8vIHJlZ2lzdHJhdGlvbiBJSUZFcyBuZWVkZWQgZm9yIHNlcmlhbGl6YXRpb24uIFdpdGhvdXQgdGhpcywgc2VyZGVcbiAgICAvLyBjbGFzc2VzIGZyb20gbnBtIHBhY2thZ2VzIChsaWtlIGBSdW5gKSB3b3VsZCBiZSBleHRlcm5hbGl6ZWQsIHRoZVxuICAgIC8vIFNXQyB0cmFuc2Zvcm0gd291bGQgbmV2ZXIgZmlyZSBvbiB0aGVtLCBhbmQgc2VyaWFsaXphdGlvbiB3b3VsZFxuICAgIC8vIGZhaWwgd2l0aCBcIm11c3QgaGF2ZSBhIHN0YXRpYyBjbGFzc0lkIHByb3BlcnR5XCIuXG4gICAgLy9cbiAgICAvLyBXZSB1c2UgYSBSb2xsdXAgcmVzb2x2ZUlkIGhvb2sgKGFkZGVkIEJFRk9SRSB0aGUgZXh0ZXJuYWxpemF0aW9uXG4gICAgLy8gcGx1Z2luKSB0aGF0IGludGVyY2VwdHMgd29ya2Zsb3cgcGFja2FnZSBpbXBvcnRzIGFuZCBtYXJrcyB0aGVtXG4gICAgLy8gYXMgbm9uLWV4dGVybmFsLiBUaGlzIGlzIG1vcmUgdGFyZ2V0ZWQgdGhhbiBgbm9FeHRlcm5hbHMgPSB0cnVlYFxuICAgIC8vIHdoaWNoIHdvdWxkIGJ1bmRsZSBBTEwgZGVwZW5kZW5jaWVzIGFuZCBjYXVzZSBURFogZXJyb3JzIGZyb21cbiAgICAvLyBjaXJjdWxhciBpbXBvcnRzIGluIHBhY2thZ2VzIGxpa2UgdnVlLWJ1bmRsZS1yZW5kZXJlci9oMy5cbiAgICBpZiAobml0cm8ub3B0aW9ucy5kZXYpIHtcbiAgICAgIG5pdHJvLmhvb2tzLmhvb2soXG4gICAgICAgICdyb2xsdXA6YmVmb3JlJyxcbiAgICAgICAgKF9uaXRybzogTml0cm8sIGNvbmZpZzogUm9sbHVwQ29uZmlnKSA9PiB7XG4gICAgICAgICAgKGNvbmZpZy5wbHVnaW5zIGFzIEFycmF5PHVua25vd24+KS51bnNoaWZ0KHtcbiAgICAgICAgICAgIG5hbWU6ICd3b3JrZmxvdzpmb3JjZS1pbmxpbmUnLFxuICAgICAgICAgICAgLy8gYG9yZGVyOiAncHJlJ2AgaXMgcmVxdWlyZWQ6IE5pdHJvJ3MgYG5pdHJvOmV4dGVybmFsc2AgcGx1Z2luXG4gICAgICAgICAgICAvLyB1c2VzIGBvcmRlcjogJ3ByZSdgIGZvciBpdHMgcmVzb2x2ZUlkIGhvb2sgYW5kIHNwcmVhZHMgb3VyXG4gICAgICAgICAgICAvLyByZXNvbHV0aW9uIHJlc3VsdCB3aGlsZSBmb3JjaW5nIGBleHRlcm5hbDogdHJ1ZWAuIFdpdGhvdXRcbiAgICAgICAgICAgIC8vIGBwcmVgIGhlcmUsIG91ciBgZXh0ZXJuYWw6IGZhbHNlYCBkZWNpc2lvbiBnZXRzIG92ZXJ3cml0dGVuXG4gICAgICAgICAgICAvLyBhbmQgYEB3b3JrZmxvdy8qYCBpbXBvcnRzIGVuZCB1cCBleHRlcm5hbGl6ZWQgaW4gdGhlIGRldlxuICAgICAgICAgICAgLy8gYnVuZGxlIOKAlCB3aGljaCBtZWFucyB0aGUgU1dDLWluamVjdGVkIGBzdGF0aWMgY2xhc3NJZGAgSUlGRVxuICAgICAgICAgICAgLy8gaW4gKGUuZy4pIGBAd29ya2Zsb3cvY29yZS9kaXN0L3J1bnRpbWUvcnVuLmpzYCBpcyBuZXZlclxuICAgICAgICAgICAgLy8gYXBwbGllZCwgYW5kIHN0ZXAgcmV0dXJuIHZhbHVlcyB0aGF0IGluY2x1ZGUgYFJ1bmBcbiAgICAgICAgICAgIC8vIGluc3RhbmNlcyBmYWlsIHRvIHNlcmlhbGl6ZSBhdCBydW50aW1lLlxuICAgICAgICAgICAgcmVzb2x2ZUlkOiB7XG4gICAgICAgICAgICAgIG9yZGVyOiAncHJlJyxcbiAgICAgICAgICAgICAgYXN5bmMgaGFuZGxlcihcbiAgICAgICAgICAgICAgICB0aGlzOiB7IHJlc29sdmU6IEZ1bmN0aW9uIH0sXG4gICAgICAgICAgICAgICAgc291cmNlOiBzdHJpbmcsXG4gICAgICAgICAgICAgICAgaW1wb3J0ZXI6IHN0cmluZyB8IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiB7IHNraXBTZWxmPzogYm9vbGVhbiB9XG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmICghaW1wb3J0ZXIpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIC8vIE1hdGNoIHdvcmtmbG93IHBhY2thZ2Ugc3BlY2lmaWVycyBPUiBkaXJlY3QgcGF0aHMgaW50b1xuICAgICAgICAgICAgICAgIC8vIHBhY2thZ2VzLzxuYW1lPi8uIEJhaWwgb3V0IGVhcmx5IG9uIG5vbi13b3JrZmxvdyBpbXBvcnRzXG4gICAgICAgICAgICAgICAgLy8gc28gd2UgZG9uJ3QgaW50ZXJjZXB0IHRoZSByZXN0IG9mIHRoZSByZXNvbHV0aW9uIGNoYWluLlxuICAgICAgICAgICAgICAgIGNvbnN0IGlzV29ya2Zsb3dQa2cgPVxuICAgICAgICAgICAgICAgICAgL15AP3dvcmtmbG93KFxcL3wkKS8udGVzdChzb3VyY2UpIHx8XG4gICAgICAgICAgICAgICAgICAvW1xcXFwvXXBhY2thZ2VzW1xcXFwvXSh3b3JrZmxvd3xjb3JlfHNlcmRlfGVycm9yc3x1dGlsc3xidWlsZGVyc3xyb2xsdXB8YWl8d29ybGR8d29ybGQtbG9jYWx8d29ybGQtdmVyY2VsfHdvcmxkLXBvc3RncmVzfHdvcmxkLXRlc3Rpbmd8Y2xpfG5leHR8bml0cm98bnV4dHx2aXRlfHZpdGVzdHxhc3Ryb3xzdmVsdGVraXR8bmVzdClbXFxcXC9dLy50ZXN0KFxuICAgICAgICAgICAgICAgICAgICBzb3VyY2VcbiAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1dvcmtmbG93UGtnKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICAvLyBSZXNvbHZlIHZpYSBvdGhlciByZXNvbHZlcnMsIHNraXBwaW5nIG91cnNlbHZlcyBzbyB3ZVxuICAgICAgICAgICAgICAgIC8vIGdldCBhIHBhdGguIFdlIGRvbid0IGdhdGUgb24gYHJlc29sdmVkLmV4dGVybmFsYCBiZWNhdXNlXG4gICAgICAgICAgICAgICAgLy8gYG5pdHJvOmV4dGVybmFsc2Agc3ByZWFkcyBvdXIgcmVzdWx0IGFuZCBvdmVycmlkZXNcbiAgICAgICAgICAgICAgICAvLyBgZXh0ZXJuYWw6IHRydWVgIHJlZ2FyZGxlc3Mgb2Ygd2hhdCB3ZSByZXR1cm4g4oCUIHdlIHdhbnRcbiAgICAgICAgICAgICAgICAvLyB0byB3aW4gdGhhdCByYWNlIGJ5IHJldHVybmluZyBmaXJzdCB1bmRlciBgb3JkZXI6ICdwcmUnYC5cbiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IGF3YWl0IHRoaXMucmVzb2x2ZShzb3VyY2UsIGltcG9ydGVyLCB7XG4gICAgICAgICAgICAgICAgICAuLi5vcHRpb25zLFxuICAgICAgICAgICAgICAgICAgc2tpcFNlbGY6IHRydWUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXNvbHZlZCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgbGV0IHJlc29sdmVkSWQgPSByZXNvbHZlZC5pZDtcbiAgICAgICAgICAgICAgICAvLyBTdHJpcCBmaWxlOi8vIHByb3RvY29sIGlmIHByZXNlbnQg4oCUIFJvbGx1cCBuZWVkcyBhIHBsYWluXG4gICAgICAgICAgICAgICAgLy8gZmlsZXN5c3RlbSBwYXRoIHRvIGxvYWQgdGhlIG1vZHVsZS4gYGZpbGVVUkxUb1BhdGhgXG4gICAgICAgICAgICAgICAgLy8gY29ycmVjdGx5IGhhbmRsZXMgV2luZG93cyBwYXRocyAoZS5nLiwgZmlsZTovLy9DOi8uLi5cbiAgICAgICAgICAgICAgICAvLyAtPiBDOlxcLi4uKSBhbmQgcGVyY2VudC1kZWNvZGluZy5cbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWRJZC5zdGFydHNXaXRoKCdmaWxlOi8vJykpIHtcbiAgICAgICAgICAgICAgICAgIHJlc29sdmVkSWQgPSBmaWxlVVJMVG9QYXRoKHJlc29sdmVkSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4geyBpZDogcmVzb2x2ZWRJZCwgZXh0ZXJuYWw6IGZhbHNlIH07XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIEFkZCB0c0NvbmZpZyBwbHVnaW5cbiAgICBpZiAobml0cm8ub3B0aW9ucy53b3JrZmxvdz8udHlwZXNjcmlwdFBsdWdpbikge1xuICAgICAgbml0cm8ub3B0aW9ucy50eXBlc2NyaXB0LnRzQ29uZmlnIHx8PSB7fTtcbiAgICAgIG5pdHJvLm9wdGlvbnMudHlwZXNjcmlwdC50c0NvbmZpZy5jb21waWxlck9wdGlvbnMgfHw9IHt9O1xuICAgICAgbml0cm8ub3B0aW9ucy50eXBlc2NyaXB0LnRzQ29uZmlnLmNvbXBpbGVyT3B0aW9ucy5wbHVnaW5zIHx8PSBbXTtcbiAgICAgIG5pdHJvLm9wdGlvbnMudHlwZXNjcmlwdC50c0NvbmZpZy5jb21waWxlck9wdGlvbnMucGx1Z2lucy5wdXNoKHtcbiAgICAgICAgbmFtZTogJ3dvcmtmbG93JyxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIE5pdHJvIHYyIFZlcmNlbCBkZXBsb3k6IGtlZXAgdGhlIGxlZ2FjeSBCdWlsZCBPdXRwdXQgQVBJIHBhdGggdGhhdFxuICAgIC8vIGJ1aWxkcyB0aGUgd29ya2Zsb3cgZnVuY3Rpb25zIHN0YW5kYWxvbmUgYW5kIHN0aXRjaGVzIHRoZSByb3V0ZXMgaW50b1xuICAgIC8vIGAudmVyY2VsL291dHB1dC9jb25maWcuanNvbmAuIFRoaXMgcGF0aCBpcyBpbmRlcGVuZGVudCBvZiBuaXRybydzIG93blxuICAgIC8vIGJ1bmRsZSBhbmQgaXMgb25seSB1c2VkIGZvciBuaXRyb3BhY2sgdjIgKGUuZy4gTnV4dCA0IHN0aWxsIHVzZXMgaXQpLlxuICAgIGNvbnN0IHVzZUxlZ2FjeVZlcmNlbEJ1aWxkID0gaXNWZXJjZWxEZXBsb3kgJiYgaXNOaXRyb1YyKG5pdHJvKTtcblxuICAgIGlmICh1c2VMZWdhY3lWZXJjZWxCdWlsZCkge1xuICAgICAgbml0cm8uaG9va3MuaG9vaygnY29tcGlsZWQnLCBhc3luYyAoKSA9PiB7XG4gICAgICAgIGF3YWl0IG5ldyBWZXJjZWxCdWlsZGVyKG5pdHJvKS5idWlsZCgpO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTG9jYWwgZGV2L3Byb2QgYW5kIE5pdHJvIHYzIFZlcmNlbCBkZXBsb3kgc2hhcmUgdGhlIHNhbWUgcGF0aDpcbiAgICAvLyBidW5kbGUgdGhlIHdvcmtmbG93IHJvdXRlcyBpbnRvIG5pdHJvIGl0c2VsZiB2aWEgdmlydHVhbCBoYW5kbGVycy5cbiAgICAvLyBGb3IgVmVyY2VsIHYzIHdlIGFkZGl0aW9uYWxseSBjb25maWd1cmUgYGZ1bmN0aW9uUnVsZXNgIHNvIHRoZVxuICAgIC8vIHJvdXRlcyBnZXQgcXVldWUgdHJpZ2dlcnMgKyBleHRlbmRlZCBtYXhEdXJhdGlvbiB2aWEgdGhlIG5pdHJvXG4gICAgLy8gdmVyY2VsIHByZXNldC4gVGhpcyBsZXRzIHdvcmtmbG93IGhhbmRsZXJzIHVzZSBuaXRybyBmZWF0dXJlc1xuICAgIC8vIChzdG9yYWdlLCBkYXRhYmFzZSwgcnVudGltZSBjb25maWcsIHZpcnR1YWwgaW1wb3J0cywgZXRjLikuXG4gICAgaWYgKCF1c2VMZWdhY3lWZXJjZWxCdWlsZCkge1xuICAgICAgY29uc3QgYnVpbGRlciA9IG5ldyBMb2NhbEJ1aWxkZXIobml0cm8pO1xuICAgICAgbGV0IGlzSW5pdGlhbEJ1aWxkID0gdHJ1ZTtcblxuICAgICAgbml0cm8uaG9va3MuaG9vaygnYnVpbGQ6YmVmb3JlJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICBhd2FpdCBidWlsZGVyLmJ1aWxkKCk7XG5cbiAgICAgICAgLy8gRm9yIHByb2Q6IHdyaXRlIHRoZSBtYW5pZmVzdCBoYW5kbGVyIGZpbGUgd2l0aCBpbmxpbmVkIGNvbnRlbnRcbiAgICAgICAgLy8gbm93IHRoYXQgdGhlIGJ1aWxkZXIgaGFzIGdlbmVyYXRlZCB0aGUgbWFuaWZlc3QuIFJvbGx1cCB3aWxsXG4gICAgICAgIC8vIGJ1bmRsZSB0aGlzIGZpbGUgaW50byB0aGUgY29tcGlsZWQgb3V0cHV0LlxuICAgICAgICBpZiAoXG4gICAgICAgICAgIW5pdHJvLm9wdGlvbnMuZGV2ICYmXG4gICAgICAgICAgcHJvY2Vzcy5lbnYuV09SS0ZMT1dfUFVCTElDX01BTklGRVNUID09PSAnMSdcbiAgICAgICAgKSB7XG4gICAgICAgICAgd3JpdGVNYW5pZmVzdEhhbmRsZXIobml0cm8pO1xuICAgICAgICB9XG4gICAgICB9KTtcblxuICAgICAgLy8gQWxsb3dzIGZvciBITVIgLSBidXQgc2tpcCB0aGUgZmlyc3QgZGV2OnJlbG9hZCBzaW5jZSBidWlsZDpiZWZvcmUgYWxyZWFkeSByYW5cbiAgICAgIGlmIChuaXRyby5vcHRpb25zLmRldikge1xuICAgICAgICBuaXRyby5ob29rcy5ob29rKCdkZXY6cmVsb2FkJywgYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGlmIChpc0luaXRpYWxCdWlsZCkge1xuICAgICAgICAgICAgaXNJbml0aWFsQnVpbGQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IGJ1aWxkZXIuYnVpbGQoKTtcbiAgICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgLy8gRHVyaW5nIGRldiwgZmlsZXMgbWF5IGJlIGFkZGVkL3JlbW92ZWQgd2hpbGUgdGhlIGJ1aWxkZXJcbiAgICAgICAgICAgIC8vIGlzIHJlYnVpbGRpbmcgKGUuZy4sIGR1cmluZyB0ZXN0IGNsZWFudXApLiBMb2cgdGhlIGVycm9yXG4gICAgICAgICAgICAvLyBidXQgZG9uJ3QgY3Jhc2gg4oCUIHRoZSBuZXh0IGZpbGUgY2hhbmdlIHdpbGwgdHJpZ2dlclxuICAgICAgICAgICAgLy8gYW5vdGhlciByZWJ1aWxkIHdpdGggdGhlIGNvcnJlY3QgZmlsZSBsaXN0LlxuICAgICAgICAgICAgY29uc29sZS53YXJuKCdXYXJuaW5nOiBXb3JrZmxvdyByZWJ1aWxkIGZhaWxlZDonLCBlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKG5pdHJvLm9wdGlvbnMuZGV2KSB7XG4gICAgICAgIGFkZERhc2hib2FyZEhhbmRsZXIobml0cm8pO1xuICAgICAgfVxuXG4gICAgICBhZGRWaXJ0dWFsSGFuZGxlcihcbiAgICAgICAgbml0cm8sXG4gICAgICAgICcvLndlbGwta25vd24vd29ya2Zsb3cvdjEvd2ViaG9vay86dG9rZW4nLFxuICAgICAgICAnd29ya2Zsb3cvd2ViaG9vay5tanMnXG4gICAgICApO1xuXG4gICAgICAvLyBWMjogc2luZ2xlIGNvbWJpbmVkIGhhbmRsZXIgZm9yIGJvdGggd29ya2Zsb3cgYW5kIHN0ZXAgZXhlY3V0aW9uLlxuICAgICAgLy8gVGhlIHN0ZXAgcmVnaXN0cmF0aW9ucyBhcmUgaW1wb3J0ZWQgYXMgc2lkZSBlZmZlY3RzIGJ5IHRoZSBjb21iaW5lZFxuICAgICAgLy8gaGFuZGxlciDigJQgbm8gc2VwYXJhdGUgc3RlcCByb3V0ZSBuZWVkZWQuXG4gICAgICBhZGRWaXJ0dWFsSGFuZGxlcihcbiAgICAgICAgbml0cm8sXG4gICAgICAgICcvLndlbGwta25vd24vd29ya2Zsb3cvdjEvZmxvdycsXG4gICAgICAgICd3b3JrZmxvdy93b3JrZmxvd3MubWpzJ1xuICAgICAgKTtcblxuICAgICAgLy8gTml0cm8gdjMrIFZlcmNlbCBkZXBsb3k6IGNvbmZpZ3VyZSBmdW5jdGlvbiBydWxlcyBmb3IgdGhlIGNvbWJpbmVkXG4gICAgICAvLyBmbG93IGhhbmRsZXIgc28gaXQgZ2V0cyB0aGUgcXVldWUgdHJpZ2dlcnMgKyBtYXggZHVyYXRpb24gdGhhdCB0aGVcbiAgICAgIC8vIHdvcmtmbG93IHJ1bnRpbWUgbmVlZHMuIFdvcmtmbG93LXJlcXVpcmVkIGZpZWxkcyAoYG1heER1cmF0aW9uYCxcbiAgICAgIC8vIGBleHBlcmltZW50YWxUcmlnZ2Vyc2AsIGBydW50aW1lYCB3aGVuIHNldCkgdGFrZSBwcmVjZWRlbmNlIG92ZXJcbiAgICAgIC8vIHVzZXItcHJvdmlkZWQgdmFsdWVzIGZvciB0aGVzZSByb3V0ZXM7IHVucmVsYXRlZCBmaWVsZHMgdGhlIHVzZXJcbiAgICAgIC8vIHNldHMgKGUuZy4gYG1lbW9yeWApIHBhc3MgdGhyb3VnaCB1bnRvdWNoZWQuXG4gICAgICAvL1xuICAgICAgLy8gUGF0dGVybiBrZXlzIG11c3QgbWF0Y2ggdGhlIHJvdXRlIHBhdHRlcm5zIHRoZSBoYW5kbGVycyBhcmVcbiAgICAgIC8vIHJlZ2lzdGVyZWQgd2l0aCBzbyBuaXRybyByZXVzZXMgdGhlIHNhbWUgZnVuY3Rpb24gZGlyZWN0b3J5LlxuICAgICAgLy8gVXNpbmcgYSBgd2ViaG9vay8qKmAgY2F0Y2gtYWxsIGhlcmUgd291bGQgY3JlYXRlIGEgc2Vjb25kXG4gICAgICAvLyBgd2ViaG9vay9bLi4uXS5mdW5jYCBuZXh0IHRvIHRoZSBgd2ViaG9vay9bdG9rZW5dLmZ1bmNgIHRoYXRcbiAgICAgIC8vIGBhZGRWaXJ0dWFsSGFuZGxlcmAgcHJvZHVjZXMuXG4gICAgICBpZiAoaXNWZXJjZWxEZXBsb3kpIHtcbiAgICAgICAgbml0cm8ub3B0aW9ucy52ZXJjZWwgPz89IHt9O1xuICAgICAgICBuaXRyby5vcHRpb25zLnZlcmNlbC5mdW5jdGlvblJ1bGVzID8/PSB7fTtcblxuICAgICAgICBjb25zdCBydW50aW1lID0gbml0cm8ub3B0aW9ucy53b3JrZmxvdz8ucnVudGltZTtcbiAgICAgICAgY29uc3QgcnVsZXMgPSBuaXRyby5vcHRpb25zLnZlcmNlbC5mdW5jdGlvblJ1bGVzO1xuXG4gICAgICAgIGNvbnN0IGZsb3dQYXRoID0gJy8ud2VsbC1rbm93bi93b3JrZmxvdy92MS9mbG93JztcbiAgICAgICAgcnVsZXNbZmxvd1BhdGhdID0ge1xuICAgICAgICAgIC4uLnJ1bGVzW2Zsb3dQYXRoXSxcbiAgICAgICAgICAuLi4ocnVudGltZSAmJiB7IHJ1bnRpbWUgfSksXG4gICAgICAgICAgbWF4RHVyYXRpb246ICdtYXgnLFxuICAgICAgICAgIC8vIFYyIGNvbWJpbmVkOiBhIHNpbmdsZSB0cmlnZ2VyIGNvdmVycyBib3RoIGBfX3drZl93b3JrZmxvd18qYFxuICAgICAgICAgIC8vICh3b3JrZmxvdyBvcmNoZXN0cmF0aW9uKSBhbmQgYF9fd2tmX3N0ZXBfKmAgKHN0ZXAgZXhlY3V0aW9uKSxcbiAgICAgICAgICAvLyBzaW5jZSB0aGUgc2FtZSBoYW5kbGVyIGRpc3BhdGNoZXMgYm90aC5cbiAgICAgICAgICBleHBlcmltZW50YWxUcmlnZ2VyczogW1dPUktGTE9XX1FVRVVFX1RSSUdHRVJdLFxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChydW50aW1lKSB7XG4gICAgICAgICAgY29uc3Qgd2ViaG9va1BhdGggPSAnLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL3dlYmhvb2svOnRva2VuJztcbiAgICAgICAgICBydWxlc1t3ZWJob29rUGF0aF0gPSB7IC4uLnJ1bGVzW3dlYmhvb2tQYXRoXSwgcnVudGltZSB9O1xuXG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52LldPUktGTE9XX1BVQkxJQ19NQU5JRkVTVCA9PT0gJzEnKSB7XG4gICAgICAgICAgICBjb25zdCBtYW5pZmVzdFBhdGggPSAnLy53ZWxsLWtub3duL3dvcmtmbG93L3YxL21hbmlmZXN0Lmpzb24nO1xuICAgICAgICAgICAgcnVsZXNbbWFuaWZlc3RQYXRoXSA9IHsgLi4ucnVsZXNbbWFuaWZlc3RQYXRoXSwgcnVudGltZSB9O1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBFeHBvc2UgbWFuaWZlc3QgYXMgYSBwdWJsaWMgSFRUUCByb3V0ZSB3aGVuIFdPUktGTE9XX1BVQkxJQ19NQU5JRkVTVD0xXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuV09SS0ZMT1dfUFVCTElDX01BTklGRVNUID09PSAnMScpIHtcbiAgICAgICAgLy8gV3JpdGUgYSBwbGFjZWhvbGRlciBtYW5pZmVzdC1kYXRhLm1qcyBzbyByb2xsdXAgY2FuIHJlc29sdmUgdGhlXG4gICAgICAgIC8vIGltcG9ydC4gSXQgd2lsbCBiZSBvdmVyd3JpdHRlbiB3aXRoIHRoZSByZWFsIG1hbmlmZXN0IGluIGJ1aWxkOmJlZm9yZS5cbiAgICAgICAgLy8gV3JpdGUgYSBwbGFjZWhvbGRlciBoYW5kbGVyIGZpbGUgc28gcm9sbHVwIGNhbiByZXNvbHZlIHRoZSBwYXRoXG4gICAgICAgIC8vIGR1cmluZyBwcm9kIGNvbXBpbGF0aW9uLiBJdCB3aWxsIGJlIG92ZXJ3cml0dGVuIHdpdGggdGhlIHJlYWxcbiAgICAgICAgLy8gbWFuaWZlc3QgY29udGVudCBieSB3cml0ZU1hbmlmZXN0SGFuZGxlcigpIGluIGJ1aWxkOmJlZm9yZS5cbiAgICAgICAgaWYgKCFuaXRyby5vcHRpb25zLmRldikge1xuICAgICAgICAgIGNvbnN0IGRpciA9IGpvaW4obml0cm8ub3B0aW9ucy5idWlsZERpciwgJ3dvcmtmbG93Jyk7XG4gICAgICAgICAgbWtkaXJTeW5jKGRpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgICAgY29uc3QgaGFuZGxlclBhdGggPSBqb2luKGRpciwgJ21hbmlmZXN0LWhhbmRsZXIubWpzJyk7XG4gICAgICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgICAgIGhhbmRsZXJQYXRoLFxuICAgICAgICAgICAgJ2V4cG9ydCBkZWZhdWx0IGFzeW5jICgpID0+IG5ldyBSZXNwb25zZShcIk1hbmlmZXN0IG5vdCBmb3VuZFwiLCB7IHN0YXR1czogNDA0IH0pO1xcbidcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGFkZE1hbmlmZXN0SGFuZGxlcihuaXRybyk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSBzYXRpc2ZpZXMgTml0cm9Nb2R1bGU7XG5cbmNvbnN0IERBU0hCT0FSRF9WSVJUVUFMX0lEID0gJyN3b3JrZmxvdy9kYXNoYm9hcmQtaGFuZGxlcic7XG5cbmZ1bmN0aW9uIGFkZERhc2hib2FyZEhhbmRsZXIobml0cm86IE5pdHJvKSB7XG4gIGNvbnN0IHJvdXRlID0gJy9fd29ya2Zsb3cnO1xuICBuaXRyby5vcHRpb25zLmhhbmRsZXJzLnB1c2goeyByb3V0ZSwgaGFuZGxlcjogREFTSEJPQVJEX1ZJUlRVQUxfSUQgfSk7XG5cbiAgLy8gUmVzb2x2ZSBgQHdvcmtmbG93L3dlYi9zZXJ2ZXJgIHJlbGF0aXZlIHRvIHRoaXMgbW9kdWxlIHNvIGNvbnN1bWVycyBkb24ndFxuICAvLyBuZWVkIGEgZGlyZWN0IGRlcGVuZGVuY3kgb24gYEB3b3JrZmxvdy93ZWJgLiBUaGUgcGF0aCBpcyBpbmxpbmVkIGludG8gdGhlXG4gIC8vIHZpcnR1YWwgaGFuZGxlciBhcyBhIGZpbGU6Ly8gVVJMIHNvIE5vZGUgY2FuIGBpbXBvcnQoKWAgaXQgYXQgcnVudGltZVxuICAvLyByZWdhcmRsZXNzIG9mIHdoZXJlIHRoZSBnZW5lcmF0ZWQgTml0cm8gYnVuZGxlIGVuZHMgdXAuXG4gIGNvbnN0IHJlcXVpcmVfID0gY3JlYXRlUmVxdWlyZShpbXBvcnQubWV0YS51cmwpO1xuICBsZXQgd2ViU2VydmVyVXJsOiBzdHJpbmc7XG4gIHRyeSB7XG4gICAgd2ViU2VydmVyVXJsID0gcGF0aFRvRmlsZVVSTChyZXF1aXJlXy5yZXNvbHZlKCdAd29ya2Zsb3cvd2ViL3NlcnZlcicpKS5ocmVmO1xuICB9IGNhdGNoIHtcbiAgICB3ZWJTZXJ2ZXJVcmwgPSAnQHdvcmtmbG93L3dlYi9zZXJ2ZXInO1xuICB9XG5cbiAgY29uc3QgaGFuZGxlclNvdXJjZSA9IC8qIGpzICovIGBcbiAgICBjb25zdCBfX3dvcmtmbG93V2ViU2VydmVyVXJsID0gJHtKU09OLnN0cmluZ2lmeSh3ZWJTZXJ2ZXJVcmwpfTtcbiAgICBsZXQgc2VydmVyUHJvbWlzZSA9IG51bGw7XG4gICAgYXN5bmMgZnVuY3Rpb24gZ2V0RGFzaGJvYXJkVXJsKCkge1xuICAgICAgaWYgKCFzZXJ2ZXJQcm9taXNlKSB7XG4gICAgICAgIHNlcnZlclByb21pc2UgPSAoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHsgc3RhcnRTZXJ2ZXIgfSA9IGF3YWl0IGltcG9ydCgvKiBAdml0ZS1pZ25vcmUgKi8gLyogd2VicGFja0lnbm9yZTogdHJ1ZSAqLyBfX3dvcmtmbG93V2ViU2VydmVyVXJsKTtcbiAgICAgICAgICBjb25zdCBzZXJ2ZXIgPSBhd2FpdCBzdGFydFNlcnZlcigwKTtcbiAgICAgICAgICBjb25zdCBhZGRyZXNzID0gc2VydmVyLmFkZHJlc3MoKTtcbiAgICAgICAgICBjb25zdCBwb3J0ID0gdHlwZW9mIGFkZHJlc3MgPT09ICdvYmplY3QnICYmIGFkZHJlc3MgPyBhZGRyZXNzLnBvcnQgOiAzNDU2O1xuICAgICAgICAgIHJldHVybiAnaHR0cDovL2xvY2FsaG9zdDonICsgcG9ydDtcbiAgICAgICAgfSkoKS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBzZXJ2ZXJQcm9taXNlID0gbnVsbDtcbiAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICByZXR1cm4gc2VydmVyUHJvbWlzZTtcbiAgICB9XG4gIGA7XG5cbiAgaWYgKCFuaXRyby5yb3V0aW5nKSB7XG4gICAgbml0cm8ub3B0aW9ucy52aXJ0dWFsW0RBU0hCT0FSRF9WSVJUVUFMX0lEXSA9IC8qIGpzICovIGBcbiAgICAgIGltcG9ydCB7IGZyb21XZWJIYW5kbGVyIH0gZnJvbSBcImgzXCI7XG4gICAgICAke2hhbmRsZXJTb3VyY2V9XG4gICAgICBleHBvcnQgZGVmYXVsdCBmcm9tV2ViSGFuZGxlcihhc3luYyAoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY29uc3QgdXJsID0gYXdhaXQgZ2V0RGFzaGJvYXJkVXJsKCk7XG4gICAgICAgICAgcmV0dXJuIFJlc3BvbnNlLnJlZGlyZWN0KHVybCwgMzAyKTtcbiAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICBjb25zb2xlLmVycm9yKCdGYWlsZWQgdG8gc3RhcnQgd29ya2Zsb3cgZGFzaGJvYXJkOicsIGVycm9yKTtcbiAgICAgICAgICByZXR1cm4gbmV3IFJlc3BvbnNlKCdGYWlsZWQgdG8gc3RhcnQgd29ya2Zsb3cgZGFzaGJvYXJkOiAnICsgZXJyb3IubWVzc2FnZSwgeyBzdGF0dXM6IDUwMCB9KTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgYDtcbiAgfSBlbHNlIHtcbiAgICBuaXRyby5vcHRpb25zLnZpcnR1YWxbREFTSEJPQVJEX1ZJUlRVQUxfSURdID0gLyoganMgKi8gYFxuICAgICAgJHtoYW5kbGVyU291cmNlfVxuICAgICAgZXhwb3J0IGRlZmF1bHQgYXN5bmMgKCkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNvbnN0IHVybCA9IGF3YWl0IGdldERhc2hib2FyZFVybCgpO1xuICAgICAgICAgIHJldHVybiBSZXNwb25zZS5yZWRpcmVjdCh1cmwsIDMwMik7XG4gICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHN0YXJ0IHdvcmtmbG93IGRhc2hib2FyZDonLCBlcnJvcik7XG4gICAgICAgICAgcmV0dXJuIG5ldyBSZXNwb25zZSgnRmFpbGVkIHRvIHN0YXJ0IHdvcmtmbG93IGRhc2hib2FyZDogJyArIGVycm9yLm1lc3NhZ2UsIHsgc3RhdHVzOiA1MDAgfSk7XG4gICAgICAgIH1cbiAgICAgIH07XG4gICAgYDtcbiAgfVxufVxuXG5mdW5jdGlvbiBhZGRWaXJ0dWFsSGFuZGxlcihuaXRybzogTml0cm8sIHJvdXRlOiBzdHJpbmcsIGJ1aWxkUGF0aDogc3RyaW5nKSB7XG4gIG5pdHJvLm9wdGlvbnMuaGFuZGxlcnMucHVzaCh7XG4gICAgcm91dGUsXG4gICAgaGFuZGxlcjogYCMke2J1aWxkUGF0aH1gLFxuICB9KTtcbiAgY29uc3QgaGFuZGxlckltcG9ydFBhdGggPSBKU09OLnN0cmluZ2lmeShcbiAgICBqb2luKG5pdHJvLm9wdGlvbnMuYnVpbGREaXIsIGJ1aWxkUGF0aClcbiAgKTtcblxuICBpZiAobml0cm8ub3B0aW9ucy5kZXYpIHtcbiAgICAvLyBEZXYgbW9kZTogbG9hZCBnZW5lcmF0ZWQgd29ya2Zsb3cgYnVuZGxlcyBmcm9tIGRpc2sgYXQgcmVxdWVzdCB0aW1lLlxuICAgIC8vIFRoaXMga2VlcHMgYC5uaXRyby93b3JrZmxvdy8qLm1qc2Agb3V0IG9mIE5pdHJvJ3Mgb3duIGJ1bmRsZSBncmFwaCxcbiAgICAvLyB3aGljaCBhdm9pZHMgcmVidWlsZCBsb29wcyBhbmQgc3RhbGUgZGVwZW5kZW5jeSBncmFwaHMgZHVyaW5nIEhNUi5cbiAgICAvLyBDYWNoZS1idXN0IGJ5IGZpbGUgbXRpbWUgc28gZWFjaCBzdWNjZXNzZnVsIHJlYnVpbGQgbG9hZHMgZnJlc2ggY29kZS5cbiAgICBpZiAoIW5pdHJvLnJvdXRpbmcpIHtcbiAgICAgIG5pdHJvLm9wdGlvbnMudmlydHVhbFtgIyR7YnVpbGRQYXRofWBdID0gLyoganMgKi8gYFxuICAgICAgaW1wb3J0IHsgZnJvbVdlYkhhbmRsZXIgfSBmcm9tIFwiaDNcIjtcbiAgICAgIGltcG9ydCB7IHN0YXRTeW5jIH0gZnJvbSBcIm5vZGU6ZnNcIjtcbiAgICAgIGltcG9ydCB7IHBhdGhUb0ZpbGVVUkwgfSBmcm9tIFwibm9kZTp1cmxcIjtcblxuICAgICAgY29uc3QgaGFuZGxlclBhdGggPSAke2hhbmRsZXJJbXBvcnRQYXRofTtcbiAgICAgIGxldCBjdXJyZW50VmVyc2lvbiA9IFwiXCI7XG4gICAgICBsZXQgY3VycmVudEltcG9ydFBhdGggPSBcIlwiO1xuXG4gICAgICBhc3luYyBmdW5jdGlvbiBsb2FkUE9TVCgpIHtcbiAgICAgICAgY29uc3QgdmVyc2lvbiA9IFN0cmluZyhzdGF0U3luYyhoYW5kbGVyUGF0aCkubXRpbWVNcyk7XG4gICAgICAgIGlmICh2ZXJzaW9uICE9PSBjdXJyZW50VmVyc2lvbikge1xuICAgICAgICAgIGN1cnJlbnRWZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgICBjdXJyZW50SW1wb3J0UGF0aCA9IHBhdGhUb0ZpbGVVUkwoaGFuZGxlclBhdGgpLmhyZWYgKyBcIj90PVwiICsgdmVyc2lvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKGF3YWl0IGltcG9ydChjdXJyZW50SW1wb3J0UGF0aCkpLlBPU1Q7XG4gICAgICB9XG5cbiAgICAgIGV4cG9ydCBkZWZhdWx0IGZyb21XZWJIYW5kbGVyKGFzeW5jIChyZXF1ZXN0LCBjb250ZXh0KSA9PiB7XG4gICAgICAgIGNvbnN0IFBPU1QgPSBhd2FpdCBsb2FkUE9TVCgpO1xuICAgICAgICByZXR1cm4gUE9TVChyZXF1ZXN0LCBjb250ZXh0KTtcbiAgICAgIH0pO1xuICAgIGA7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5pdHJvLm9wdGlvbnMudmlydHVhbFtgIyR7YnVpbGRQYXRofWBdID0gLyoganMgKi8gYFxuICAgICAgaW1wb3J0IHsgc3RhdFN5bmMgfSBmcm9tIFwibm9kZTpmc1wiO1xuICAgICAgaW1wb3J0IHsgcGF0aFRvRmlsZVVSTCB9IGZyb20gXCJub2RlOnVybFwiO1xuXG4gICAgICBjb25zdCBoYW5kbGVyUGF0aCA9ICR7aGFuZGxlckltcG9ydFBhdGh9O1xuICAgICAgbGV0IGN1cnJlbnRWZXJzaW9uID0gXCJcIjtcbiAgICAgIGxldCBjdXJyZW50SW1wb3J0UGF0aCA9IFwiXCI7XG5cbiAgICAgIGFzeW5jIGZ1bmN0aW9uIGxvYWRQT1NUKCkge1xuICAgICAgICBjb25zdCB2ZXJzaW9uID0gU3RyaW5nKHN0YXRTeW5jKGhhbmRsZXJQYXRoKS5tdGltZU1zKTtcbiAgICAgICAgaWYgKHZlcnNpb24gIT09IGN1cnJlbnRWZXJzaW9uKSB7XG4gICAgICAgICAgY3VycmVudFZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICAgIGN1cnJlbnRJbXBvcnRQYXRoID0gcGF0aFRvRmlsZVVSTChoYW5kbGVyUGF0aCkuaHJlZiArIFwiP3Q9XCIgKyB2ZXJzaW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAoYXdhaXQgaW1wb3J0KGN1cnJlbnRJbXBvcnRQYXRoKSkuUE9TVDtcbiAgICAgIH1cblxuICAgICAgZXhwb3J0IGRlZmF1bHQgYXN5bmMgKHsgcmVxIH0pID0+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=
package/dist/vite.js CHANGED
@@ -75,4 +75,4 @@ export function workflow(options) {
75
75
  }),
76
76
  ];
77
77
  }
78
- //# sourceMappingURL=vite.js.map
78
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy92aXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBQ3RELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQzNELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR3pELE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxPQUFPLENBQUM7QUFFN0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUU3QyxPQUFPLFdBQVcsTUFBTSxZQUFZLENBQUM7QUFFckMsTUFBTSxVQUFVLFFBQVEsQ0FBQyxPQUF1QjtJQUM5QyxJQUFJLE9BQXFCLENBQUM7SUFDMUIsSUFBSSxnQkFBd0IsQ0FBQztJQUM3QixNQUFNLE9BQU8sR0FBRyxnQkFBZ0IsRUFBRSxDQUFDO0lBRW5DLDRFQUE0RTtJQUM1RSxvRkFBb0Y7SUFDcEYsTUFBTSxtQkFBbUIsR0FBVztRQUNsQyxJQUFJLEVBQUUsb0JBQW9CO1FBQzFCLFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNoQix5REFBeUQ7WUFDekQsbUVBQW1FO1lBQ25FLE1BQU0sTUFBTSxHQUFHLHVCQUF1QixDQUFDO2dCQUNyQyxPQUFPLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRTthQUNwRCxDQUFDLENBQUM7WUFDSCxPQUFRLE1BQU0sQ0FBQyxTQUFzQixFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQzlELENBQUM7S0FDRixDQUFDO0lBRUYsT0FBTztRQUNMLG1CQUFtQjtRQUNuQjtZQUNFLElBQUksRUFBRSxnQkFBZ0I7WUFDdEIsS0FBSyxFQUFFO2dCQUNMLEtBQUssRUFBRSxDQUFDLEtBQVksRUFBRSxFQUFFO29CQUN0QixxREFBcUQ7b0JBQ3JELGdCQUFnQixHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLFFBQVEsRUFBRSxVQUFVLENBQUMsQ0FBQztvQkFDNUQsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLEdBQUc7d0JBQ3ZCLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRO3dCQUN6QixHQUFHLE9BQU87d0JBQ1YsS0FBSyxFQUFFLElBQUk7cUJBQ1osQ0FBQztvQkFDRixJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7d0JBQ3RCLE9BQU8sR0FBRyxJQUFJLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQkFDcEMsQ0FBQztvQkFDRCxPQUFPLFdBQVcsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7Z0JBQ2xDLENBQUM7YUFDRjtZQUNELGdHQUFnRztZQUNoRyw4RkFBOEY7WUFDOUYsZUFBZSxDQUFDLE1BQU07Z0JBQ3BCLGlGQUFpRjtnQkFDakYsT0FBTyxHQUFHLEVBQUU7b0JBQ1YsTUFBTSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQyxHQUFHLEVBQUUsR0FBRyxFQUFFLElBQUksRUFBRSxFQUFFO3dCQUN4QyxzQ0FBc0M7d0JBQ3RDLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLFVBQVUsQ0FBQywyQkFBMkIsQ0FBQyxFQUFFLENBQUM7NEJBQ3RELE9BQU8sSUFBSSxFQUFFLENBQUM7d0JBQ2hCLENBQUM7d0JBRUQsdURBQXVEO3dCQUN2RCxNQUFNLGlCQUFpQixHQUFHLEdBQUcsQ0FBQyxTQUFTLENBQUM7d0JBQ3hDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsVUFBNEIsR0FBRyxJQUFXOzRCQUN4RCxNQUFNLFVBQVUsR0FBRyxPQUFPLElBQUksQ0FBQyxDQUFDLENBQUMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDOzRCQUUvRCw0RUFBNEU7NEJBQzVFLDBEQUEwRDs0QkFDMUQsc0VBQXNFOzRCQUN0RSxJQUFJLFVBQVUsS0FBSyxHQUFHLEVBQUUsQ0FBQztnQ0FDdkIsMERBQTBEO2dDQUMxRCxHQUFHLENBQUMsU0FBUyxDQUFDLGdCQUFnQixFQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUN2QyxDQUFDOzRCQUVELGdEQUFnRDs0QkFDaEQsT0FBTyxpQkFBaUIsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO3dCQUM3QyxDQUFRLENBQUM7d0JBRVQsSUFBSSxFQUFFLENBQUM7b0JBQ1QsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQyxDQUFDO1lBQ0osQ0FBQztTQUNGO1FBQ0QsdUJBQXVCLENBQUM7WUFDdEIsT0FBTyxFQUFFLEdBQUcsRUFBRSxDQUFDLE9BQU87WUFDdEIsT0FBTztTQUNSLENBQUM7S0FDSCxDQUFDO0FBQ0osQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGNyZWF0ZUJ1aWxkUXVldWUgfSBmcm9tICdAd29ya2Zsb3cvYnVpbGRlcnMnO1xuaW1wb3J0IHsgd29ya2Zsb3dUcmFuc2Zvcm1QbHVnaW4gfSBmcm9tICdAd29ya2Zsb3cvcm9sbHVwJztcbmltcG9ydCB7IHdvcmtmbG93SG90VXBkYXRlUGx1Z2luIH0gZnJvbSAnQHdvcmtmbG93L3ZpdGUnO1xuaW1wb3J0IHR5cGUgeyBOaXRybyB9IGZyb20gJ25pdHJvL3R5cGVzJztcbmltcG9ydCB0eXBlIHt9IGZyb20gJ25pdHJvL3ZpdGUnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGhlJztcbmltcG9ydCB0eXBlIHsgUGx1Z2luIH0gZnJvbSAndml0ZSc7XG5pbXBvcnQgeyBMb2NhbEJ1aWxkZXIgfSBmcm9tICcuL2J1aWxkZXJzLmpzJztcbmltcG9ydCB0eXBlIHsgTW9kdWxlT3B0aW9ucyB9IGZyb20gJy4vaW5kZXguanMnO1xuaW1wb3J0IG5pdHJvTW9kdWxlIGZyb20gJy4vaW5kZXguanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gd29ya2Zsb3cob3B0aW9ucz86IE1vZHVsZU9wdGlvbnMpOiBQbHVnaW5bXSB7XG4gIGxldCBidWlsZGVyOiBMb2NhbEJ1aWxkZXI7XG4gIGxldCB3b3JrZmxvd0J1aWxkRGlyOiBzdHJpbmc7XG4gIGNvbnN0IGVucXVldWUgPSBjcmVhdGVCdWlsZFF1ZXVlKCk7XG5cbiAgLy8gQ3JlYXRlIGEgbGF6eSB0cmFuc2Zvcm0gcGx1Z2luIHRoYXQgZXhjbHVkZXMgdGhlIHdvcmtmbG93IGJ1aWxkIGRpcmVjdG9yeVxuICAvLyBUaGUgZXhjbHVzaW9uIHBhdGggaXMgc2V0IGR1cmluZyBuaXRybyBzZXR1cCwgc28gd2UgbmVlZCB0byBkZWZlciBwbHVnaW4gY3JlYXRpb25cbiAgY29uc3QgbGF6eVRyYW5zZm9ybVBsdWdpbjogUGx1Z2luID0ge1xuICAgIG5hbWU6ICd3b3JrZmxvdzp0cmFuc2Zvcm0nLFxuICAgIHRyYW5zZm9ybShjb2RlLCBpZCkge1xuICAgICAgLy8gRGVsZWdhdGUgdG8gdGhlIGFjdHVhbCB0cmFuc2Zvcm0gcGx1Z2luIHdpdGggZXhjbHVzaW9uXG4gICAgICAvLyB3b3JrZmxvd0J1aWxkRGlyIGlzIHNldCBkdXJpbmcgbml0cm8gc2V0dXAgYmVmb3JlIHRyYW5zZm9ybXMgcnVuXG4gICAgICBjb25zdCBwbHVnaW4gPSB3b3JrZmxvd1RyYW5zZm9ybVBsdWdpbih7XG4gICAgICAgIGV4Y2x1ZGU6IHdvcmtmbG93QnVpbGREaXIgPyBbd29ya2Zsb3dCdWlsZERpcl0gOiBbXSxcbiAgICAgIH0pO1xuICAgICAgcmV0dXJuIChwbHVnaW4udHJhbnNmb3JtIGFzIEZ1bmN0aW9uKT8uY2FsbCh0aGlzLCBjb2RlLCBpZCk7XG4gICAgfSxcbiAgfTtcblxuICByZXR1cm4gW1xuICAgIGxhenlUcmFuc2Zvcm1QbHVnaW4sXG4gICAge1xuICAgICAgbmFtZTogJ3dvcmtmbG93Om5pdHJvJyxcbiAgICAgIG5pdHJvOiB7XG4gICAgICAgIHNldHVwOiAobml0cm86IE5pdHJvKSA9PiB7XG4gICAgICAgICAgLy8gQ2FwdHVyZSB0aGUgd29ya2Zsb3cgYnVpbGQgZGlyZWN0b3J5IGZvciBleGNsdXNpb25cbiAgICAgICAgICB3b3JrZmxvd0J1aWxkRGlyID0gam9pbihuaXRyby5vcHRpb25zLmJ1aWxkRGlyLCAnd29ya2Zsb3cnKTtcbiAgICAgICAgICBuaXRyby5vcHRpb25zLndvcmtmbG93ID0ge1xuICAgICAgICAgICAgLi4ubml0cm8ub3B0aW9ucy53b3JrZmxvdyxcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBfdml0ZTogdHJ1ZSxcbiAgICAgICAgICB9O1xuICAgICAgICAgIGlmIChuaXRyby5vcHRpb25zLmRldikge1xuICAgICAgICAgICAgYnVpbGRlciA9IG5ldyBMb2NhbEJ1aWxkZXIobml0cm8pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbml0cm9Nb2R1bGUuc2V0dXAobml0cm8pO1xuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIC8vIE5PVEU6IFRoaXMgaXMgYSB3b3JrYXJvdW5kIGJlY2F1c2UgTml0cm8gcGFzc2VzIHRoZSA0MDQgcmVxdWVzdHMgdG8gdGhlIGRldiBzZXJ2ZXIgdG8gaGFuZGxlLlxuICAgICAgLy8gRm9yIHdvcmtmbG93IHJvdXRlcywgd2Ugb3ZlcnJpZGUgdG8gc2VuZCBhbiBlbXB0eSBib2R5IHRvIHByZXZlbnQgSG9uby9WaXRlJ3MgU1BBIGZhbGxiYWNrLlxuICAgICAgY29uZmlndXJlU2VydmVyKHNlcnZlcikge1xuICAgICAgICAvLyBBZGQgbWlkZGxld2FyZSB0byBpbnRlcmNlcHQgNDA0cyBvbiB3b3JrZmxvdyByb3V0ZXMgYmVmb3JlIFZpdGUncyBTUEEgZmFsbGJhY2tcbiAgICAgICAgcmV0dXJuICgpID0+IHtcbiAgICAgICAgICBzZXJ2ZXIubWlkZGxld2FyZXMudXNlKChyZXEsIHJlcywgbmV4dCkgPT4ge1xuICAgICAgICAgICAgLy8gT25seSBoYW5kbGUgd29ya2Zsb3cgd2ViaG9vayByb3V0ZXNcbiAgICAgICAgICAgIGlmICghcmVxLnVybD8uc3RhcnRzV2l0aCgnLy53ZWxsLWtub3duL3dvcmtmbG93L3YxLycpKSB7XG4gICAgICAgICAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFdyYXAgd3JpdGVIZWFkIHRvIGVuc3VyZSB3ZSBzZW5kIGVtcHR5IGJvZHkgZm9yIDQwNHNcbiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsV3JpdGVIZWFkID0gcmVzLndyaXRlSGVhZDtcbiAgICAgICAgICAgIHJlcy53cml0ZUhlYWQgPSBmdW5jdGlvbiAodGhpczogdHlwZW9mIHJlcywgLi4uYXJnczogYW55W10pIHtcbiAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzQ29kZSA9IHR5cGVvZiBhcmdzWzBdID09PSAnbnVtYmVyJyA/IGFyZ3NbMF0gOiAyMDA7XG5cbiAgICAgICAgICAgICAgLy8gTk9URTogV29ya2Fyb3VuZCBiZWNhdXNlIE5pdHJvIHBhc3NlcyA0MDQgcmVxdWVzdHMgdG8gdGhlIHZpdGUgdG8gaGFuZGxlLlxuICAgICAgICAgICAgICAvLyBDYXVzZXMgYHdlYmhvb2sgcm91dGUgd2l0aCBpbnZhbGlkIHRva2VuYCB0ZXN0IHRvIGZhaWwuXG4gICAgICAgICAgICAgIC8vIEZvciA0MDRzIG9uIHdvcmtmbG93IHJvdXRlcywgZW5zdXJlIHdlJ3JlIHNlbmRpbmcgdGhlIHJpZ2h0IGhlYWRlcnNcbiAgICAgICAgICAgICAgaWYgKHN0YXR1c0NvZGUgPT09IDQwNCkge1xuICAgICAgICAgICAgICAgIC8vIFNldCBjb250ZW50LWxlbmd0aCB0byAwIHRvIHByZXZlbnQgVml0ZSBmcm9tIG92ZXJyaWRpbmdcbiAgICAgICAgICAgICAgICByZXMuc2V0SGVhZGVyKCdDb250ZW50LUxlbmd0aCcsICcwJyk7XG4gICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAvLyBAdHMtZXhwZWN0LWVycm9yIC0gQ29tcGxleCBvdmVybG9hZCBzaWduYXR1cmVcbiAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsV3JpdGVIZWFkLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgICAgICAgICAgfSBhcyBhbnk7XG5cbiAgICAgICAgICAgIG5leHQoKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICB3b3JrZmxvd0hvdFVwZGF0ZVBsdWdpbih7XG4gICAgICBidWlsZGVyOiAoKSA9PiBidWlsZGVyLFxuICAgICAgZW5xdWV1ZSxcbiAgICB9KSxcbiAgXTtcbn1cbiJdfQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workflow/nitro",
3
- "version": "5.0.0-beta.2",
3
+ "version": "5.0.0-beta.20",
4
4
  "description": "Nitro integration for Workflow SDK",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -24,15 +24,16 @@
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.2",
28
- "@workflow/core": "5.0.0-beta.2",
29
- "@workflow/rollup": "5.0.0-beta.2",
30
- "@workflow/swc-plugin": "5.0.0-beta.2",
31
- "@workflow/vite": "5.0.0-beta.2"
27
+ "@workflow/builders": "5.0.0-beta.20",
28
+ "@workflow/core": "5.0.0-beta.20",
29
+ "@workflow/rollup": "5.0.0-beta.20",
30
+ "@workflow/swc-plugin": "5.0.0-beta.5",
31
+ "@workflow/vite": "5.0.0-beta.20",
32
+ "@workflow/web": "5.0.0-beta.20"
32
33
  },
33
34
  "devDependencies": {
34
35
  "@types/node": "22.19.0",
35
- "nitro": "3.0.1-alpha.1",
36
+ "nitro": "^3.0.260429-beta",
36
37
  "vite": "7.3.2",
37
38
  "@workflow/tsconfig": "5.0.0-beta.0"
38
39
  },
@@ -1 +0,0 @@
1
- {"version":3,"file":"builders.js","sourceRoot":"","sources":["../src/builders.ts"],"names":[],"mappings":"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","sourcesContent":["import { mkdir, readFile, writeFile } from 'node:fs/promises';\nimport {\n BaseBuilder,\n createBaseBuilderConfig,\n VercelBuildOutputAPIBuilder,\n} from '@workflow/builders';\nimport type { Nitro } from 'nitro/types';\nimport { join } from 'pathe';\n\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 }),\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 }),\n buildTarget: 'next', // Placeholder, not actually used\n });\n this.#outDir = outDir;\n }\n\n override async build(): Promise<void> {\n const inputFiles = await this.getInputFiles();\n await mkdir(this.#outDir, { recursive: true });\n\n const { manifest: workflowsManifest } = await this.createWorkflowsBundle({\n outfile: join(this.#outDir, 'workflows.mjs'),\n bundleFinalOutput: false,\n format: 'esm',\n inputFiles,\n });\n\n const { manifest: stepsManifest } = await this.createStepsBundle({\n outfile: join(this.#outDir, 'steps.mjs'),\n externalizeNonSteps: true,\n format: 'esm',\n inputFiles,\n });\n\n const webhookRouteFile = join(this.#outDir, 'webhook.mjs');\n\n await this.createWebhookBundle({\n outfile: webhookRouteFile,\n bundle: false,\n });\n\n // Merge manifests from both bundles\n const manifest = {\n steps: { ...stepsManifest.steps, ...workflowsManifest.steps },\n workflows: { ...stepsManifest.workflows, ...workflowsManifest.workflows },\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 }\n}\n"]}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACjE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,OAAO,EAAE,IAAI,EAAE,MAAM,OAAO,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAK5D,eAAe;IACb,IAAI,EAAE,gBAAgB;IACtB,KAAK,CAAC,KAAK,CAAC,KAAY;QACtB,MAAM,cAAc,GAClB,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,KAAK,QAAQ,CAAC;QAE1D,iFAAiF;QACjF,MAAM,gBAAgB,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAElE,uEAAuE;QACvE,oFAAoF;QACpF,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC,MAAa,EAAE,MAAoB,EAAE,EAAE;YACvE,MAAM,CAAC,OAA0B,CAAC,OAAO,CACxC,uBAAuB,CAAC;gBACtB,4DAA4D;gBAC5D,mEAAmE;gBACnE,oEAAoE;gBACpE,OAAO,EAAE,CAAC,gBAAgB,CAAC;aAC5B,CAAC,CACH,CAAC;QACJ,CAAC,CAAC,CAAC;QAEH,kDAAkD;QAClD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,CAAC;YACnC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,OAAO,CAAC;QAC3C,CAAC;QAED,2DAA2D;QAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;YACtB,KAAK,CAAC,OAAO,CAAC,SAAS,KAAK,EAAE,CAAC;YAC/B,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,KAAK,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;YACxD,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,sBAAsB;QACtB,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;YAC7C,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,KAAK,EAAE,CAAC;YACzC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,eAAe,KAAK,EAAE,CAAC;YACzD,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO,KAAK,EAAE,CAAC;YACjE,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC;gBAC7D,IAAI,EAAE,UAAU;aACjB,CAAC,CAAC;QACL,CAAC;QAED,sCAAsC;QACtC,IAAI,cAAc,EAAE,CAAC;YACnB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,IAAI,EAAE;gBACtC,MAAM,IAAI,aAAa,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC;YACzC,CAAC,CAAC,CAAC;QACL,CAAC;QAED,gDAAgD;QAChD,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC,KAAK,CAAC,CAAC;YACxC,IAAI,cAAc,GAAG,IAAI,CAAC;YAE1B,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,IAAI,EAAE;gBAC1C,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;gBAEtB,iEAAiE;gBACjE,+DAA+D;gBAC/D,6CAA6C;gBAC7C,IACE,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG;oBAClB,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,EAC5C,CAAC;oBACD,oBAAoB,CAAC,KAAK,CAAC,CAAC;gBAC9B,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,gFAAgF;YAChF,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;gBACtB,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;oBACxC,IAAI,cAAc,EAAE,CAAC;wBACnB,cAAc,GAAG,KAAK,CAAC;wBACvB,OAAO;oBACT,CAAC;oBACD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;gBACxB,CAAC,CAAC,CAAC;YACL,CAAC;YAED,iBAAiB,CACf,KAAK,EACL,yCAAyC,EACzC,sBAAsB,CACvB,CAAC;YAEF,iBAAiB,CACf,KAAK,EACL,+BAA+B,EAC/B,oBAAoB,CACrB,CAAC;YAEF,iBAAiB,CACf,KAAK,EACL,+BAA+B,EAC/B,wBAAwB,CACzB,CAAC;YAEF,yEAAyE;YACzE,IAAI,OAAO,CAAC,GAAG,CAAC,wBAAwB,KAAK,GAAG,EAAE,CAAC;gBACjD,kEAAkE;gBAClE,yEAAyE;gBACzE,kEAAkE;gBAClE,gEAAgE;gBAChE,8DAA8D;gBAC9D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;oBACvB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;oBACrD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;oBACpC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,sBAAsB,CAAC,CAAC;oBACtD,aAAa,CACX,WAAW,EACX,mFAAmF,CACpF,CAAC;gBACJ,CAAC;gBACD,kBAAkB,CAAC,KAAK,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;CACoB,CAAC;AAExB,SAAS,iBAAiB,CAAC,KAAY,EAAE,KAAa,EAAE,SAAiB;IACvE,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC1B,KAAK;QACL,OAAO,EAAE,IAAI,SAAS,EAAE;KACzB,CAAC,CAAC;IACH,yEAAyE;IACzE,yEAAyE;IACzE,yEAAyE;IACzE,2BAA2B;IAC3B,MAAM,iBAAiB,GAAG,IAAI,CAAC,SAAS,CACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,SAAS,CAAC,CACxC,CAAC;IAEF,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC;QACnB,oBAAoB;QACpB,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,SAAS,EAAE,CAAC,GAAG,QAAQ,CAAC;aACzC,iBAAiB;;2BAEH,iBAAiB;;GAEzC,CAAC;IACF,CAAC;SAAM,CAAC;QACN,kCAAkC;QAClC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,SAAS,EAAE,CAAC,GAAG,QAAQ,CAAC;aACzC,iBAAiB;2BACH,iBAAiB;;;;;;;;;GASzC,CAAC;IACF,CAAC;AACH,CAAC;AAED,MAAM,mBAAmB,GAAG,4BAA4B,CAAC;AAEzD,SAAS,kBAAkB,CAAC,KAAY;IACtC,MAAM,KAAK,GAAG,wCAAwC,CAAC;IACvD,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG,IAAI,CACtB,KAAK,CAAC,OAAO,CAAC,QAAQ,EACtB,+BAA+B,CAChC,CAAC;IAEF,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;QACtB,uEAAuE;QACvE,+EAA+E;QAC/E,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC,CAAC;QACrE,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO;YACzD,CAAC,CAAC,QAAQ,CAAC;;;;;0CAKyB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;;;;;;;;;KASjE;YACC,CAAC,CAAC,QAAQ,CAAC;;;;0CAIyB,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;;;;;;;;KAQjE,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,sEAAsE;QACtE,mEAAmE;QACnE,2DAA2D;QAC3D,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,CAAC,CAAC;IAC/D,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,KAAY;IACxC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,wBAAwB,CAAC,CAAC;IAC5E,MAAM,WAAW,GAAG,IAAI,CACtB,KAAK,CAAC,OAAO,CAAC,QAAQ,EACtB,+BAA+B,CAChC,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;IACrD,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpC,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,YAAY,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC,WAAW;QAExC,MAAM,WAAW,GAAG,CAAC,KAAK,CAAC,OAAO;YAChC,CAAC,CAAC;mBACW,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;;;;CAIjD;YACK,CAAC,CAAC,oBAAoB,IAAI,CAAC,SAAS,CAAC,eAAe,CAAC;;;;CAI1D,CAAC;QACE,aAAa,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,+BAA+B;QAC/B,MAAM,QAAQ,GAAG,CAAC,KAAK,CAAC,OAAO;YAC7B,CAAC,CAAC;;CAEP;YACK,CAAC,CAAC;CACP,CAAC;QACE,aAAa,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;IACvC,CAAC;AACH,CAAC","sourcesContent":["import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';\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 // NOTE: Externalize .nitro/workflow to prevent dev reloads\n if (nitro.options.dev) {\n nitro.options.externals ||= {};\n nitro.options.externals.external ||= [];\n const outDir = join(nitro.options.buildDir, 'workflow');\n nitro.options.externals.external.push((id) => id.startsWith(outDir));\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 await builder.build();\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 // 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 const handlerImportPath = JSON.stringify(\n join(nitro.options.buildDir, buildPath)\n );\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"]}