@workflow/nitro 5.0.0-beta.5 → 5.0.0-beta.51

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