@workflow/next 5.0.0-beta.2 → 5.0.0-beta.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"builder-eager.d.ts","sourceRoot":"","sources":["../src/builder-eager.ts"],"names":[],"mappings":"AAUA,wBAAsB,mBAAmB,iBA4hBxC"}
1
+ {"version":3,"file":"builder-eager.d.ts","sourceRoot":"","sources":["../src/builder-eager.ts"],"names":[],"mappings":"AAWA,wBAAsB,mBAAmB,iBAmgBxC"}
@@ -16,7 +16,7 @@ async function getNextBuilderEager() {
16
16
  if (CachedNextBuilderEager) {
17
17
  return CachedNextBuilderEager;
18
18
  }
19
- const { BaseBuilder: BaseBuilderClass, STEP_QUEUE_TRIGGER, WORKFLOW_QUEUE_TRIGGER,
19
+ const { BaseBuilder: BaseBuilderClass, WORKFLOW_QUEUE_TRIGGER,
20
20
  // biome-ignore lint/security/noGlobalEval: Need to use eval here to avoid TypeScript from transpiling the import statement into `require()`
21
21
  } = (await eval('import("@workflow/builders")'));
22
22
  class NextBuilder extends BaseBuilderClass {
@@ -25,7 +25,6 @@ async function getNextBuilderEager() {
25
25
  const workflowGeneratedDir = (0, node_path_1.join)(outputDir, '.well-known/workflow/v1');
26
26
  // Ensure output directories exist
27
27
  await (0, promises_1.mkdir)(workflowGeneratedDir, { recursive: true });
28
- // ignore the generated assets
29
28
  await (0, promises_1.writeFile)((0, node_path_1.join)(workflowGeneratedDir, '.gitignore'), '*');
30
29
  const inputFiles = await this.getInputFiles();
31
30
  const tsconfigPath = await this.findTsConfigPath();
@@ -34,52 +33,48 @@ async function getNextBuilderEager() {
34
33
  workflowGeneratedDir,
35
34
  tsconfigPath,
36
35
  };
37
- const { manifest: stepsManifest, context: stepsBuildContext } = await this.buildStepsFunction(options);
38
- const workflowsBundle = await this.buildWorkflowsFunction(options);
36
+ // V2: Build combined route (replaces separate step + flow routes)
37
+ const combinedResult = await this.buildCombinedFunction(options);
39
38
  await this.buildWebhookRoute({ workflowGeneratedDir });
40
- // Merge manifests from both bundles
41
- const manifest = {
42
- steps: { ...stepsManifest.steps, ...workflowsBundle?.manifest?.steps },
43
- workflows: {
44
- ...stepsManifest.workflows,
45
- ...workflowsBundle?.manifest?.workflows,
46
- },
47
- classes: {
48
- ...stepsManifest.classes,
49
- ...workflowsBundle?.manifest?.classes,
50
- },
39
+ const writeManifest = async (sourceManifest) => {
40
+ const manifest = {
41
+ steps: { ...sourceManifest?.steps },
42
+ workflows: { ...sourceManifest?.workflows },
43
+ classes: { ...sourceManifest?.classes },
44
+ };
45
+ // Write manifest
46
+ const workflowBundlePath = (0, node_path_1.join)(workflowGeneratedDir, 'flow/route.js');
47
+ const manifestJson = await this.createManifest({
48
+ workflowBundlePath,
49
+ manifestDir: workflowGeneratedDir,
50
+ manifest,
51
+ });
52
+ // Expose manifest as a static file when WORKFLOW_PUBLIC_MANIFEST=1.
53
+ if (this.shouldExposePublicManifest && manifestJson) {
54
+ const publicManifestDir = (0, node_path_1.join)(this.config.workingDir, 'public/.well-known/workflow/v1');
55
+ await (0, promises_1.mkdir)(publicManifestDir, { recursive: true });
56
+ if (process.env.VERCEL_DEPLOYMENT_ID === undefined) {
57
+ await (0, promises_1.writeFile)((0, node_path_1.join)(publicManifestDir, '.gitignore'), '*');
58
+ }
59
+ await (0, promises_1.copyFile)((0, node_path_1.join)(workflowGeneratedDir, 'manifest.json'), (0, node_path_1.join)(publicManifestDir, 'manifest.json'));
60
+ }
51
61
  };
52
- // Write unified manifest to workflow generated directory
53
- const workflowBundlePath = (0, node_path_1.join)(workflowGeneratedDir, 'flow/route.js');
54
- const manifestJson = await this.createManifest({
55
- workflowBundlePath,
56
- manifestDir: workflowGeneratedDir,
57
- manifest,
58
- });
59
- // Expose manifest as a static file when WORKFLOW_PUBLIC_MANIFEST=1.
60
- // Next.js serves files from public/ at the root URL.
61
- if (this.shouldExposePublicManifest && manifestJson) {
62
- const publicManifestDir = (0, node_path_1.join)(this.config.workingDir, 'public/.well-known/workflow/v1');
63
- await (0, promises_1.mkdir)(publicManifestDir, { recursive: true });
64
- await (0, promises_1.copyFile)((0, node_path_1.join)(workflowGeneratedDir, 'manifest.json'), (0, node_path_1.join)(publicManifestDir, 'manifest.json'));
65
- }
62
+ await writeManifest(combinedResult?.manifest);
66
63
  await this.writeFunctionsConfig(outputDir);
67
64
  if (this.config.watch) {
68
- if (!stepsBuildContext) {
69
- throw new Error('Invariant: expected steps build context in watch mode');
70
- }
71
- if (!workflowsBundle?.interimBundleCtx ||
72
- !workflowsBundle?.bundleFinal) {
73
- throw new Error('Invariant: expected workflows bundle in watch mode');
65
+ // TODO: implement watch mode for combined bundle
66
+ // For now, fall back to full rebuild on file changes
67
+ if (!combinedResult?.interimBundleCtx || !combinedResult.bundleFinal) {
68
+ throw new Error('Invariant: expected workflow build context in watch mode');
74
69
  }
75
- let stepsCtx = stepsBuildContext;
76
- // These are safe to assert as non-null because we checked above
70
+ // Step registrations may be emitted as source imports without an
71
+ // esbuild context when externalizeNonSteps is enabled.
72
+ let stepsCtx = combinedResult.stepsContext;
77
73
  let workflowsCtx = {
78
- interimBundleCtx: workflowsBundle.interimBundleCtx,
79
- bundleFinal: workflowsBundle.bundleFinal,
74
+ interimBundleCtx: combinedResult.interimBundleCtx,
75
+ bundleFinal: combinedResult.bundleFinal,
80
76
  };
81
77
  const normalizePath = (pathname) => pathname.replace(/\\/g, '/');
82
- const knownFiles = new Set();
83
78
  let previousTimeInfo = new Map();
84
79
  const watchableExtensions = new Set([
85
80
  '.js',
@@ -149,56 +144,37 @@ async function getNextBuilderEager() {
149
144
  return rebuildQueue;
150
145
  };
151
146
  const fullRebuild = async () => {
147
+ this.clearDiscoveredEntriesCache();
152
148
  const newInputFiles = await this.getInputFiles();
153
149
  options.inputFiles = newInputFiles;
154
- await stepsCtx.dispose();
155
- const { context: newStepsCtx } = await this.buildStepsFunction(options);
156
- if (!newStepsCtx) {
157
- throw new Error('Invariant: expected steps build context after rebuild');
158
- }
159
- stepsCtx = newStepsCtx;
150
+ await stepsCtx?.dispose();
160
151
  await workflowsCtx.interimBundleCtx.dispose();
161
- const newWorkflowsCtx = await this.buildWorkflowsFunction(options);
162
- if (!newWorkflowsCtx?.interimBundleCtx ||
163
- !newWorkflowsCtx?.bundleFinal) {
152
+ const newCombined = await this.buildCombinedFunction(options);
153
+ stepsCtx = newCombined.stepsContext;
154
+ if (!newCombined?.interimBundleCtx || !newCombined?.bundleFinal) {
164
155
  throw new Error('Invariant: expected workflows bundle context after rebuild');
165
156
  }
166
157
  workflowsCtx = {
167
- interimBundleCtx: newWorkflowsCtx.interimBundleCtx,
168
- bundleFinal: newWorkflowsCtx.bundleFinal,
158
+ interimBundleCtx: newCombined.interimBundleCtx,
159
+ bundleFinal: newCombined.bundleFinal,
169
160
  };
161
+ await writeManifest(newCombined.manifest);
170
162
  };
171
- const logBuildMessages = (result, label) => {
172
- const logByType = (messages, method) => {
173
- if (!messages || messages.length === 0) {
174
- return;
175
- }
176
- const descriptor = method === 'error' ? 'errors' : 'warnings';
177
- console[method](`${descriptor} while rebuilding ${label}`);
178
- for (const message of messages) {
179
- console[method](message);
163
+ const isWatchableFile = (path) => watchableExtensions.has((0, node_path_1.extname)(path));
164
+ const normalizeWatchpackPaths = (paths) => {
165
+ const normalizedPaths = [];
166
+ if (!paths) {
167
+ return normalizedPaths;
168
+ }
169
+ for (const path of paths) {
170
+ const normalizedPath = normalizePath(path);
171
+ if (isWatchableFile(normalizedPath)) {
172
+ normalizedPaths.push(normalizedPath);
180
173
  }
181
- };
182
- logByType(result.errors, 'error');
183
- logByType(result.warnings, 'warn');
184
- };
185
- const rebuildExistingFiles = async () => {
186
- const rebuiltStepStart = Date.now();
187
- const stepsResult = await stepsCtx.rebuild();
188
- logBuildMessages(stepsResult, 'steps bundle');
189
- console.log('Rebuilt steps bundle', `${Date.now() - rebuiltStepStart}ms`);
190
- const rebuiltWorkflowStart = Date.now();
191
- const workflowResult = await workflowsCtx.interimBundleCtx.rebuild();
192
- logBuildMessages(workflowResult, 'workflows bundle');
193
- if (!workflowResult.outputFiles ||
194
- workflowResult.outputFiles.length === 0) {
195
- console.error('No output generated while rebuilding workflows bundle');
196
- return;
197
174
  }
198
- await workflowsCtx.bundleFinal(workflowResult.outputFiles[0].text);
199
- console.log('Rebuilt workflow bundle', `${Date.now() - rebuiltWorkflowStart}ms`);
175
+ return normalizedPaths;
200
176
  };
201
- const isWatchableFile = (path) => watchableExtensions.has((0, node_path_1.extname)(path));
177
+ const unique = (paths) => [...new Set(paths)];
202
178
  const getComparableTimestamp = (entry) => entry.timestamp ?? entry.safeTime;
203
179
  const findRemovedFiles = (currentEntries, previousEntries) => {
204
180
  const removed = [];
@@ -236,39 +212,54 @@ async function getNextBuilderEager() {
236
212
  removedFiles,
237
213
  };
238
214
  };
215
+ const mergeFileChanges = ({ currentEntries, previousEntries, timestampChanges, eventChangedFiles, eventRemovedFiles, }) => ({
216
+ addedFiles: unique([
217
+ ...timestampChanges.addedFiles,
218
+ ...eventChangedFiles.filter((path) => currentEntries.has(path) && !previousEntries.has(path)),
219
+ ]),
220
+ modifiedFiles: unique([
221
+ ...timestampChanges.modifiedFiles,
222
+ ...eventChangedFiles,
223
+ ]),
224
+ removedFiles: unique([
225
+ ...timestampChanges.removedFiles,
226
+ ...eventRemovedFiles,
227
+ ]),
228
+ });
229
+ const hasFileChanges = ({ addedFiles, modifiedFiles, removedFiles, }) => addedFiles.length > 0 ||
230
+ modifiedFiles.length > 0 ||
231
+ removedFiles.length > 0;
239
232
  let isInitial = true;
240
- watcher.on('aggregated', () => {
233
+ watcher.on('aggregated', (changes, removals) => {
241
234
  const currentEntries = readTimeInfoEntries();
242
- const { addedFiles, modifiedFiles, removedFiles } = determineFileChanges(currentEntries, previousTimeInfo);
235
+ const eventChangedFiles = normalizeWatchpackPaths(changes);
236
+ const eventRemovedFiles = normalizeWatchpackPaths(removals);
237
+ const timestampChanges = determineFileChanges(currentEntries, previousTimeInfo);
238
+ const fileChanges = mergeFileChanges({
239
+ currentEntries,
240
+ previousEntries: previousTimeInfo,
241
+ timestampChanges,
242
+ eventChangedFiles,
243
+ eventRemovedFiles,
244
+ });
243
245
  previousTimeInfo = currentEntries;
244
246
  if (isInitial) {
245
247
  isInitial = false;
246
- return;
248
+ if (eventChangedFiles.length === 0 &&
249
+ eventRemovedFiles.length === 0) {
250
+ return;
251
+ }
247
252
  }
248
- if (addedFiles.length === 0 &&
249
- modifiedFiles.length === 0 &&
250
- removedFiles.length === 0) {
253
+ if (!hasFileChanges(fileChanges)) {
251
254
  return;
252
255
  }
253
- for (const removal of removedFiles) {
254
- knownFiles.delete(removal);
255
- }
256
- for (const added of addedFiles) {
257
- knownFiles.add(added);
258
- }
259
256
  enqueue(async () => {
260
- if (addedFiles.length > 0 || removedFiles.length > 0) {
261
- await fullRebuild();
262
- return;
263
- }
264
- if (modifiedFiles.length > 0) {
265
- await rebuildExistingFiles();
266
- }
257
+ await fullRebuild();
267
258
  });
268
259
  });
269
260
  watcher.watch({
270
261
  directories: [this.config.workingDir],
271
- startTime: 0,
262
+ startTime: Date.now(),
272
263
  });
273
264
  }
274
265
  }
@@ -292,46 +283,32 @@ async function getNextBuilderEager() {
292
283
  if (process.env.NODE_ENV === 'development') {
293
284
  return;
294
285
  }
286
+ // V2 combined config: single trigger handles both workflow and step execution.
287
+ // The step route no longer needs its own trigger since steps are executed
288
+ // inline by the combined handler or queued back to __wkf_workflow_* with stepId.
295
289
  const generatedConfig = {
296
290
  version: '0',
297
- steps: {
298
- maxDuration: 'max',
299
- experimentalTriggers: [STEP_QUEUE_TRIGGER],
300
- },
301
291
  workflows: {
302
292
  maxDuration: 'max',
303
293
  experimentalTriggers: [WORKFLOW_QUEUE_TRIGGER],
304
294
  },
305
295
  };
306
- // We write this file to the generated directory for
307
- // the Next.js builder to consume
308
296
  await (0, promises_1.writeFile)((0, node_path_1.join)(outputDir, '.well-known/workflow/v1/config.json'), JSON.stringify(generatedConfig, null, 2));
309
297
  }
310
- async buildStepsFunction({ inputFiles, workflowGeneratedDir, tsconfigPath, }) {
311
- // Create steps bundle
312
- const stepsRouteDir = (0, node_path_1.join)(workflowGeneratedDir, 'step');
313
- await (0, promises_1.mkdir)(stepsRouteDir, { recursive: true });
314
- return await this.createStepsBundle({
315
- // If any dynamic requires are used when bundling with ESM
316
- // esbuild will create a too dynamic wrapper around require
317
- // which turbopack/webpack fail to analyze. If we externalize
318
- // correctly this shouldn't be an issue although we might want
319
- // to use cjs as alternative to avoid
298
+ /**
299
+ * V2: Build combined route that handles both workflow and step execution.
300
+ */
301
+ async buildCombinedFunction({ inputFiles, workflowGeneratedDir, tsconfigPath, }) {
302
+ const flowRouteDir = (0, node_path_1.join)(workflowGeneratedDir, 'flow');
303
+ await (0, promises_1.mkdir)(flowRouteDir, { recursive: true });
304
+ return await this.createCombinedBundle({
320
305
  format: 'esm',
321
306
  inputFiles,
322
- outfile: (0, node_path_1.join)(stepsRouteDir, 'route.js'),
323
- externalizeNonSteps: true,
324
- tsconfigPath,
325
- });
326
- }
327
- async buildWorkflowsFunction({ inputFiles, workflowGeneratedDir, tsconfigPath, }) {
328
- const workflowsRouteDir = (0, node_path_1.join)(workflowGeneratedDir, 'flow');
329
- await (0, promises_1.mkdir)(workflowsRouteDir, { recursive: true });
330
- return await this.createWorkflowsBundle({
331
- format: 'esm',
332
- outfile: (0, node_path_1.join)(workflowsRouteDir, 'route.js'),
307
+ stepsOutfile: (0, node_path_1.join)(flowRouteDir, '__step_registrations.js'),
308
+ flowOutfile: (0, node_path_1.join)(flowRouteDir, 'route.js'),
333
309
  bundleFinalOutput: false,
334
- inputFiles,
310
+ externalizeNonSteps: true,
311
+ sourceStepRegistrationImports: true,
335
312
  tsconfigPath,
336
313
  });
337
314
  }
@@ -389,4 +366,4 @@ async function getNextBuilderEager() {
389
366
  CachedNextBuilderEager = NextBuilder;
390
367
  return NextBuilder;
391
368
  }
392
- //# sourceMappingURL=builder-eager.js.map
369
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci1lYWdlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsZGVyLWVhZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBV0Esa0RBbWdCQztBQTlnQkQscUNBQW9DO0FBQ3BDLCtDQUE0RTtBQUM1RSx5Q0FBbUQ7QUFFbkQsMERBQWtDO0FBRWxDLElBQUksc0JBQTJCLENBQUM7QUFFaEMsOEVBQThFO0FBQzlFLDZFQUE2RTtBQUM3RSxvRUFBb0U7QUFDN0QsS0FBSyxVQUFVLG1CQUFtQjtJQUN2QyxJQUFJLHNCQUFzQixFQUFFLENBQUM7UUFDM0IsT0FBTyxzQkFBc0IsQ0FBQztJQUNoQyxDQUFDO0lBRUQsTUFBTSxFQUNKLFdBQVcsRUFBRSxnQkFBZ0IsRUFDN0Isc0JBQXNCO0lBQ3RCLDRJQUE0STtNQUM3SSxHQUFHLENBQUMsTUFBTSxJQUFJLENBQ2IsOEJBQThCLENBQy9CLENBQXdDLENBQUM7SUFFMUMsTUFBTSxXQUFZLFNBQVEsZ0JBQWdCO1FBQ3hDLEtBQUssQ0FBQyxLQUFLO1lBQ1QsTUFBTSxTQUFTLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUNoRCxNQUFNLG9CQUFvQixHQUFHLElBQUEsZ0JBQUksRUFBQyxTQUFTLEVBQUUseUJBQXlCLENBQUMsQ0FBQztZQUV4RSxrQ0FBa0M7WUFDbEMsTUFBTSxJQUFBLGdCQUFLLEVBQUMsb0JBQW9CLEVBQUUsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztZQUN2RCxNQUFNLElBQUEsb0JBQVMsRUFBQyxJQUFBLGdCQUFJLEVBQUMsb0JBQW9CLEVBQUUsWUFBWSxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7WUFFL0QsTUFBTSxVQUFVLEdBQUcsTUFBTSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDOUMsTUFBTSxZQUFZLEdBQUcsTUFBTSxJQUFJLENBQUMsZ0JBQWdCLEVBQUUsQ0FBQztZQUVuRCxNQUFN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IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgYWNjZXNzLCBjb3B5RmlsZSwgbWtkaXIsIHN0YXQsIHdyaXRlRmlsZSB9IGZyb20gJ25vZGU6ZnMvcHJvbWlzZXMnO1xuaW1wb3J0IHsgZXh0bmFtZSwgam9pbiwgcmVzb2x2ZSB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgdHlwZSB7IFdvcmtmbG93TWFuaWZlc3QgfSBmcm9tICdAd29ya2Zsb3cvYnVpbGRlcnMnO1xuaW1wb3J0IFdhdGNocGFjayBmcm9tICd3YXRjaHBhY2snO1xuXG5sZXQgQ2FjaGVkTmV4dEJ1aWxkZXJFYWdlcjogYW55O1xuXG4vLyBDcmVhdGUgdGhlIGVhZ2VyIE5leHQgYnVpbGRlciBkeW5hbWljYWxseSBieSBleHRlbmRpbmcgdGhlIEVTTSBCYXNlQnVpbGRlci5cbi8vIEV4cG9ydGVkIGFzIGdldE5leHRCdWlsZGVyRWFnZXIoKSB0byBhbGxvdyBDb21tb25KUyBtb2R1bGVzIHRvIGltcG9ydCBmcm9tXG4vLyB0aGUgRVNNIEB3b3JrZmxvdy9idWlsZGVycyBwYWNrYWdlIHZpYSBkeW5hbWljIGltcG9ydCBhdCBydW50aW1lLlxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldE5leHRCdWlsZGVyRWFnZXIoKSB7XG4gIGlmIChDYWNoZWROZXh0QnVpbGRlckVhZ2VyKSB7XG4gICAgcmV0dXJuIENhY2hlZE5leHRCdWlsZGVyRWFnZXI7XG4gIH1cblxuICBjb25zdCB7XG4gICAgQmFzZUJ1aWxkZXI6IEJhc2VCdWlsZGVyQ2xhc3MsXG4gICAgV09SS0ZMT1dfUVVFVUVfVFJJR0dFUixcbiAgICAvLyBiaW9tZS1pZ25vcmUgbGludC9zZWN1cml0eS9ub0dsb2JhbEV2YWw6IE5lZWQgdG8gdXNlIGV2YWwgaGVyZSB0byBhdm9pZCBUeXBlU2NyaXB0IGZyb20gdHJhbnNwaWxpbmcgdGhlIGltcG9ydCBzdGF0ZW1lbnQgaW50byBgcmVxdWlyZSgpYFxuICB9ID0gKGF3YWl0IGV2YWwoXG4gICAgJ2ltcG9ydChcIkB3b3JrZmxvdy9idWlsZGVyc1wiKSdcbiAgKSkgYXMgdHlwZW9mIGltcG9ydCgnQHdvcmtmbG93L2J1aWxkZXJzJyk7XG5cbiAgY2xhc3MgTmV4dEJ1aWxkZXIgZXh0ZW5kcyBCYXNlQnVpbGRlckNsYXNzIHtcbiAgICBhc3luYyBidWlsZCgpIHtcbiAgICAgIGNvbnN0IG91dHB1dERpciA9IGF3YWl0IHRoaXMuZmluZEFwcERpcmVjdG9yeSgpO1xuICAgICAgY29uc3Qgd29ya2Zsb3dHZW5lcmF0ZWREaXIgPSBqb2luKG91dHB1dERpciwgJy53ZWxsLWtub3duL3dvcmtmbG93L3YxJyk7XG5cbiAgICAgIC8vIEVuc3VyZSBvdXRwdXQgZGlyZWN0b3JpZXMgZXhpc3RcbiAgICAgIGF3YWl0IG1rZGlyKHdvcmtmbG93R2VuZXJhdGVkRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgIGF3YWl0IHdyaXRlRmlsZShqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnLmdpdGlnbm9yZScpLCAnKicpO1xuXG4gICAgICBjb25zdCBpbnB1dEZpbGVzID0gYXdhaXQgdGhpcy5nZXRJbnB1dEZpbGVzKCk7XG4gICAgICBjb25zdCB0c2NvbmZpZ1BhdGggPSBhd2FpdCB0aGlzLmZpbmRUc0NvbmZpZ1BhdGgoKTtcblxuICAgICAgY29uc3Qgb3B0aW9ucyA9IHtcbiAgICAgICAgaW5wdXRGaWxlcyxcbiAgICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXIsXG4gICAgICAgIHRzY29uZmlnUGF0aCxcbiAgICAgIH07XG5cbiAgICAgIC8vIFYyOiBCdWlsZCBjb21iaW5lZCByb3V0ZSAocmVwbGFjZXMgc2VwYXJhdGUgc3RlcCArIGZsb3cgcm91dGVzKVxuICAgICAgY29uc3QgY29tYmluZWRSZXN1bHQgPSBhd2FpdCB0aGlzLmJ1aWxkQ29tYmluZWRGdW5jdGlvbihvcHRpb25zKTtcbiAgICAgIGF3YWl0IHRoaXMuYnVpbGRXZWJob29rUm91dGUoeyB3b3JrZmxvd0dlbmVyYXRlZERpciB9KTtcblxuICAgICAgY29uc3Qgd3JpdGVNYW5pZmVzdCA9IGFzeW5jIChcbiAgICAgICAgc291cmNlTWFuaWZlc3Q6IFdvcmtmbG93TWFuaWZlc3QgfCB1bmRlZmluZWRcbiAgICAgICkgPT4ge1xuICAgICAgICBjb25zdCBtYW5pZmVzdCA9IHtcbiAgICAgICAgICBzdGVwczogeyAuLi5zb3VyY2VNYW5pZmVzdD8uc3RlcHMgfSxcbiAgICAgICAgICB3b3JrZmxvd3M6IHsgLi4uc291cmNlTWFuaWZlc3Q/LndvcmtmbG93cyB9LFxuICAgICAgICAgIGNsYXNzZXM6IHsgLi4uc291cmNlTWFuaWZlc3Q/LmNsYXNzZXMgfSxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBXcml0ZSBtYW5pZmVzdFxuICAgICAgICBjb25zdCB3b3JrZmxvd0J1bmRsZVBhdGggPSBqb2luKHdvcmtmbG93R2VuZXJhdGVkRGlyLCAnZmxvdy9yb3V0ZS5qcycpO1xuICAgICAgICBjb25zdCBtYW5pZmVzdEpzb24gPSBhd2FpdCB0aGlzLmNyZWF0ZU1hbmlmZXN0KHtcbiAgICAgICAgICB3b3JrZmxvd0J1bmRsZVBhdGgsXG4gICAgICAgICAgbWFuaWZlc3REaXI6IHdvcmtmbG93R2VuZXJhdGVkRGlyLFxuICAgICAgICAgIG1hbmlmZXN0LFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFeHBvc2UgbWFuaWZlc3QgYXMgYSBzdGF0aWMgZmlsZSB3aGVuIFdPUktGTE9XX1BVQkxJQ19NQU5JRkVTVD0xLlxuICAgICAgICBpZiAodGhpcy5zaG91bGRFeHBvc2VQdWJsaWNNYW5pZmVzdCAmJiBtYW5pZmVzdEpzb24pIHtcbiAgICAgICAgICBjb25zdCBwdWJsaWNNYW5pZmVzdERpciA9IGpvaW4oXG4gICAgICAgICAgICB0aGlzLmNvbmZpZy53b3JraW5nRGlyLFxuICAgICAgICAgICAgJ3B1YmxpYy8ud2VsbC1rbm93bi93b3JrZmxvdy92MSdcbiAgICAgICAgICApO1xuICAgICAgICAgIGF3YWl0IG1rZGlyKHB1YmxpY01hbmlmZXN0RGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgICBpZiAocHJvY2Vzcy5lbnYuVkVSQ0VMX0RFUExPWU1FTlRfSUQgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgYXdhaXQgd3JpdGVGaWxlKGpvaW4ocHVibGljTWFuaWZlc3REaXIsICcuZ2l0aWdub3JlJyksICcqJyk7XG4gICAgICAgICAgfVxuICAgICAgICAgIGF3YWl0IGNvcHlGaWxlKFxuICAgICAgICAgICAgam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgJ21hbmlmZXN0Lmpzb24nKSxcbiAgICAgICAgICAgIGpvaW4ocHVibGljTWFuaWZlc3REaXIsICdtYW5pZmVzdC5qc29uJylcbiAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB3cml0ZU1hbmlmZXN0KGNvbWJpbmVkUmVzdWx0Py5tYW5pZmVzdCk7XG5cbiAgICAgIGF3YWl0IHRoaXMud3JpdGVGdW5jdGlvbnNDb25maWcob3V0cHV0RGlyKTtcblxuICAgICAgaWYgKHRoaXMuY29uZmlnLndhdGNoKSB7XG4gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB3YXRjaCBtb2RlIGZvciBjb21iaW5lZCBidW5kbGVcbiAgICAgICAgLy8gRm9yIG5vdywgZmFsbCBiYWNrIHRvIGZ1bGwgcmVidWlsZCBvbiBmaWxlIGNoYW5nZXNcbiAgICAgICAgaWYgKCFjb21iaW5lZFJlc3VsdD8uaW50ZXJpbUJ1bmRsZUN0eCB8fCAhY29tYmluZWRSZXN1bHQuYnVuZGxlRmluYWwpIHtcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAnSW52YXJpYW50OiBleHBlY3RlZCB3b3JrZmxvdyBidWlsZCBjb250ZXh0IGluIHdhdGNoIG1vZGUnXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFN0ZXAgcmVnaXN0cmF0aW9ucyBtYXkgYmUgZW1pdHRlZCBhcyBzb3VyY2UgaW1wb3J0cyB3aXRob3V0IGFuXG4gICAgICAgIC8vIGVzYnVpbGQgY29udGV4dCB3aGVuIGV4dGVybmFsaXplTm9uU3RlcHMgaXMgZW5hYmxlZC5cbiAgICAgICAgbGV0IHN0ZXBzQ3R4ID0gY29tYmluZWRSZXN1bHQuc3RlcHNDb250ZXh0O1xuICAgICAgICBsZXQgd29ya2Zsb3dzQ3R4ID0ge1xuICAgICAgICAgIGludGVyaW1CdW5kbGVDdHg6IGNvbWJpbmVkUmVzdWx0LmludGVyaW1CdW5kbGVDdHgsXG4gICAgICAgICAgYnVuZGxlRmluYWw6IGNvbWJpbmVkUmVzdWx0LmJ1bmRsZUZpbmFsLFxuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZVBhdGggPSAocGF0aG5hbWU6IHN0cmluZykgPT5cbiAgICAgICAgICBwYXRobmFtZS5yZXBsYWNlKC9cXFxcL2csICcvJyk7XG4gICAgICAgIHR5cGUgV2F0Y2hwYWNrVGltZUluZm9FbnRyeSA9IHtcbiAgICAgICAgICBzYWZlVGltZTogbnVtYmVyO1xuICAgICAgICAgIHRpbWVzdGFtcD86IG51bWJlcjtcbiAgICAgICAgfTtcbiAgICAgICAgdHlwZSBGaWxlQ2hhbmdlcyA9IHtcbiAgICAgICAgICBhZGRlZEZpbGVzOiBzdHJpbmdbXTtcbiAgICAgICAgICBtb2RpZmllZEZpbGVzOiBzdHJpbmdbXTtcbiAgICAgICAgICByZW1vdmVkRmlsZXM6IHN0cmluZ1tdO1xuICAgICAgICB9O1xuICAgICAgICBsZXQgcHJldmlvdXNUaW1lSW5mbyA9IG5ldyBNYXA8c3RyaW5nLCBXYXRjaHBhY2tUaW1lSW5mb0VudHJ5PigpO1xuXG4gICAgICAgIGNvbnN0IHdhdGNoYWJsZUV4dGVuc2lvbnMgPSBuZXcgU2V0KFtcbiAgICAgICAgICAnLmpzJyxcbiAgICAgICAgICAnLmpzeCcsXG4gICAgICAgICAgJy50cycsXG4gICAgICAgICAgJy50c3gnLFxuICAgICAgICAgICcubXRzJyxcbiAgICAgICAgICAnLmN0cycsXG4gICAgICAgICAgJy5janMnLFxuICAgICAgICAgICcubWpzJyxcbiAgICAgICAgXSk7XG4gICAgICAgIGNvbnN0IGlnbm9yZWRQYXRoRnJhZ21lbnRzID0gW1xuICAgICAgICAgICcvLmdpdC8nLFxuICAgICAgICAgICcvbm9kZV9tb2R1bGVzLycsXG4gICAgICAgICAgJy8ubmV4dC8nLFxuICAgICAgICAgICcvLnR1cmJvLycsXG4gICAgICAgICAgJy8udmVyY2VsLycsXG4gICAgICAgICAgJy9kaXN0LycsXG4gICAgICAgICAgJy9idWlsZC8nLFxuICAgICAgICAgICcvb3V0LycsXG4gICAgICAgICAgJy8uY2FjaGUvJyxcbiAgICAgICAgICAnLy55YXJuLycsXG4gICAgICAgICAgJy8ucG5wbS1zdG9yZS8nLFxuICAgICAgICAgICcvLnBhcmNlbC1jYWNoZS8nLFxuICAgICAgICAgICcvLndlbGwta25vd24vd29ya2Zsb3cvJyxcbiAgICAgICAgXTtcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEdlbmVyYXRlZERpciA9IHdvcmtmbG93R2VuZXJhdGVkRGlyLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgICAgaWdub3JlZFBhdGhGcmFnbWVudHMucHVzaChub3JtYWxpemVkR2VuZXJhdGVkRGlyKTtcblxuICAgICAgICAvLyBUaGVyZSBpcyBhIG5vZGUuanMgYnVnIG9uIE1hY09TIHdoaWNoIGNhdXNlcyBjbG9zaW5nIGZpbGUgd2F0Y2hlcnMgdG8gYmUgcmVhbGx5IHNsb3cuXG4gICAgICAgIC8vIFRoaXMgbGltaXRzIHRoZSBudW1iZXIgb2Ygd2F0Y2hlcnMgdG8gbWl0aWdhdGUgdGhlIGlzc3VlLlxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vbm9kZWpzL25vZGUvaXNzdWVzLzI5OTQ5XG4gICAgICAgIHByb2Nlc3MuZW52LldBVENIUEFDS19XQVRDSEVSX0xJTUlUID1cbiAgICAgICAgICBwcm9jZXNzLnBsYXRmb3JtID09PSAnZGFyd2luJyA/ICcyMCcgOiB1bmRlZmluZWQ7XG5cbiAgICAgICAgY29uc3Qgd2F0Y2hlciA9IG5ldyBXYXRjaHBhY2soe1xuICAgICAgICAgIC8vIFdhdGNocGFjayBkZWZhdWx0IGlzIDIwMG1zIHdoaWNoIGFkZHMgMjAwbXMgb2YgZGVhZCB0aW1lIG9uIGJvb3R1cC5cbiAgICAgICAgICBhZ2dyZWdhdGVUaW1lb3V0OiA1LFxuICAgICAgICAgIGlnbm9yZWQ6IChwYXRobmFtZTogc3RyaW5nKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBub3JtYWxpemVkUGF0aCA9IHBhdGhuYW1lLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcbiAgICAgICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dG5hbWUobm9ybWFsaXplZFBhdGgpO1xuICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiAmJiAhd2F0Y2hhYmxlRXh0ZW5zaW9ucy5oYXMoZXh0ZW5zaW9uKSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChub3JtYWxpemVkUGF0aC5zdGFydHNXaXRoKG5vcm1hbGl6ZWRHZW5lcmF0ZWREaXIpKSB7XG4gICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZm9yIChjb25zdCBmcmFnbWVudCBvZiBpZ25vcmVkUGF0aEZyYWdtZW50cykge1xuICAgICAgICAgICAgICBpZiAobm9ybWFsaXplZFBhdGguaW5jbHVkZXMoZnJhZ21lbnQpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCByZWFkVGltZUluZm9FbnRyaWVzID0gKCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHJhd0VudHJpZXMgPSB3YXRjaGVyLmdldFRpbWVJbmZvRW50cmllcygpIGFzIE1hcDxcbiAgICAgICAgICAgIHN0cmluZyxcbiAgICAgICAgICAgIFdhdGNocGFja1RpbWVJbmZvRW50cnlcbiAgICAgICAgICA+O1xuICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRFbnRyaWVzID0gbmV3IE1hcDxzdHJpbmcsIFdhdGNocGFja1RpbWVJbmZvRW50cnk+KCk7XG4gICAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgaW5mb10gb2YgcmF3RW50cmllcykge1xuICAgICAgICAgICAgbm9ybWFsaXplZEVudHJpZXMuc2V0KG5vcm1hbGl6ZVBhdGgocGF0aCksIGluZm8pO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gbm9ybWFsaXplZEVudHJpZXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgbGV0IHJlYnVpbGRRdWV1ZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuXG4gICAgICAgIGNvbnN0IGVucXVldWUgPSAodGFzazogKCkgPT4gUHJvbWlzZTx2b2lkPikgPT4ge1xuICAgICAgICAgIHJlYnVpbGRRdWV1ZSA9IHJlYnVpbGRRdWV1ZS50aGVuKHRhc2spLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIHByb2Nlc3MgZmlsZSBjaGFuZ2UnLCBlcnJvcik7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgcmV0dXJuIHJlYnVpbGRRdWV1ZTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBmdWxsUmVidWlsZCA9IGFzeW5jICgpID0+IHtcbiAgICAgICAgICB0aGlzLmNsZWFyRGlzY292ZXJlZEVudHJpZXNDYWNoZSgpO1xuICAgICAgICAgIGNvbnN0IG5ld0lucHV0RmlsZXMgPSBhd2FpdCB0aGlzLmdldElucHV0RmlsZXMoKTtcbiAgICAgICAgICBvcHRpb25zLmlucHV0RmlsZXMgPSBuZXdJbnB1dEZpbGVzO1xuXG4gICAgICAgICAgYXdhaXQgc3RlcHNDdHg/LmRpc3Bvc2UoKTtcbiAgICAgICAgICBhd2FpdCB3b3JrZmxvd3NDdHguaW50ZXJpbUJ1bmRsZUN0eC5kaXNwb3NlKCk7XG5cbiAgICAgICAgICBjb25zdCBuZXdDb21iaW5lZCA9IGF3YWl0IHRoaXMuYnVpbGRDb21iaW5lZEZ1bmN0aW9uKG9wdGlvbnMpO1xuICAgICAgICAgIHN0ZXBzQ3R4ID0gbmV3Q29tYmluZWQuc3RlcHNDb250ZXh0O1xuXG4gICAgICAgICAgaWYgKCFuZXdDb21iaW5lZD8uaW50ZXJpbUJ1bmRsZUN0eCB8fCAhbmV3Q29tYmluZWQ/LmJ1bmRsZUZpbmFsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICAgICdJbnZhcmlhbnQ6IGV4cGVjdGVkIHdvcmtmbG93cyBidW5kbGUgY29udGV4dCBhZnRlciByZWJ1aWxkJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgd29ya2Zsb3dzQ3R4ID0ge1xuICAgICAgICAgICAgaW50ZXJpbUJ1bmRsZUN0eDogbmV3Q29tYmluZWQuaW50ZXJpbUJ1bmRsZUN0eCxcbiAgICAgICAgICAgIGJ1bmRsZUZpbmFsOiBuZXdDb21iaW5lZC5idW5kbGVGaW5hbCxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgYXdhaXQgd3JpdGVNYW5pZmVzdChuZXdDb21iaW5lZC5tYW5pZmVzdCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgaXNXYXRjaGFibGVGaWxlID0gKHBhdGg6IHN0cmluZykgPT5cbiAgICAgICAgICB3YXRjaGFibGVFeHRlbnNpb25zLmhhcyhleHRuYW1lKHBhdGgpKTtcblxuICAgICAgICBjb25zdCBub3JtYWxpemVXYXRjaHBhY2tQYXRocyA9IChwYXRocz86IEl0ZXJhYmxlPHN0cmluZz4pID0+IHtcbiAgICAgICAgICBjb25zdCBub3JtYWxpemVkUGF0aHM6IHN0cmluZ1tdID0gW107XG4gICAgICAgICAgaWYgKCFwYXRocykge1xuICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZWRQYXRocztcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBmb3IgKGNvbnN0IHBhdGggb2YgcGF0aHMpIHtcbiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRQYXRoID0gbm9ybWFsaXplUGF0aChwYXRoKTtcbiAgICAgICAgICAgIGlmIChpc1dhdGNoYWJsZUZpbGUobm9ybWFsaXplZFBhdGgpKSB7XG4gICAgICAgICAgICAgIG5vcm1hbGl6ZWRQYXRocy5wdXNoKG5vcm1hbGl6ZWRQYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4gbm9ybWFsaXplZFBhdGhzO1xuICAgICAgICB9O1xuXG4gICAgICAgIGNvbnN0IHVuaXF1ZSA9IChwYXRoczogc3RyaW5nW10pID0+IFsuLi5uZXcgU2V0KHBhdGhzKV07XG5cbiAgICAgICAgY29uc3QgZ2V0Q29tcGFyYWJsZVRpbWVzdGFtcCA9IChlbnRyeTogV2F0Y2hwYWNrVGltZUluZm9FbnRyeSkgPT5cbiAgICAgICAgICBlbnRyeS50aW1lc3RhbXAgPz8gZW50cnkuc2FmZVRpbWU7XG5cbiAgICAgICAgY29uc3QgZmluZFJlbW92ZWRGaWxlcyA9IChcbiAgICAgICAgICBjdXJyZW50RW50cmllczogTWFwPHN0cmluZywgV2F0Y2hwYWNrVGltZUluZm9FbnRyeT4sXG4gICAgICAgICAgcHJldmlvdXNFbnRyaWVzOiBNYXA8c3RyaW5nLCBXYXRjaHBhY2tUaW1lSW5mb0VudHJ5PlxuICAgICAgICApID0+IHtcbiAgICAgICAgICBjb25zdCByZW1vdmVkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGZvciAoY29uc3QgcGF0aCBvZiBwcmV2aW91c0VudHJpZXMua2V5cygpKSB7XG4gICAgICAgICAgICBpZiAoIWN1cnJlbnRFbnRyaWVzLmhhcyhwYXRoKSAmJiBpc1dhdGNoYWJsZUZpbGUocGF0aCkpIHtcbiAgICAgICAgICAgICAgcmVtb3ZlZC5wdXNoKHBhdGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gcmVtb3ZlZDtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBmaW5kQWRkZWRBbmRNb2RpZmllZEZpbGVzID0gKFxuICAgICAgICAgIGN1cnJlbnRFbnRyaWVzOiBNYXA8c3RyaW5nLCBXYXRjaHBhY2tUaW1lSW5mb0VudHJ5PixcbiAgICAgICAgICBwcmV2aW91c0VudHJpZXM6IE1hcDxzdHJpbmcsIFdhdGNocGFja1RpbWVJbmZvRW50cnk+XG4gICAgICAgICkgPT4ge1xuICAgICAgICAgIGNvbnN0IGFkZGVkOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICAgIGNvbnN0IG1vZGlmaWVkOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgICAgICAgZm9yIChjb25zdCBbcGF0aCwgaW5mb10gb2YgY3VycmVudEVudHJpZXMpIHtcbiAgICAgICAgICAgIGlmICghaXNXYXRjaGFibGVGaWxlKHBhdGgpKSB7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IHByZXZpb3VzRW50cmllcy5nZXQocGF0aCk7XG4gICAgICAgICAgICBpZiAoIXByZXZpb3VzKSB7XG4gICAgICAgICAgICAgIGFkZGVkLnB1c2gocGF0aCk7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgIGdldENvbXBhcmFibGVUaW1lc3RhbXAoaW5mbykgIT09IGdldENvbXBhcmFibGVUaW1lc3RhbXAocHJldmlvdXMpXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgbW9kaWZpZWQucHVzaChwYXRoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICByZXR1cm4geyBhZGRlZCwgbW9kaWZpZWQgfTtcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBkZXRlcm1pbmVGaWxlQ2hhbmdlcyA9IChcbiAgICAgICAgICBjdXJyZW50RW50cmllczogTWFwPHN0cmluZywgV2F0Y2hwYWNrVGltZUluZm9FbnRyeT4sXG4gICAgICAgICAgcHJldmlvdXNFbnRyaWVzOiBNYXA8c3RyaW5nLCBXYXRjaHBhY2tUaW1lSW5mb0VudHJ5PlxuICAgICAgICApOiBGaWxlQ2hhbmdlcyA9PiB7XG4gICAgICAgICAgY29uc3QgcmVtb3ZlZEZpbGVzID0gZmluZFJlbW92ZWRGaWxlcyhcbiAgICAgICAgICAgIGN1cnJlbnRFbnRyaWVzLFxuICAgICAgICAgICAgcHJldmlvdXNFbnRyaWVzXG4gICAgICAgICAgKTtcbiAgICAgICAgICBjb25zdCB7IGFkZGVkLCBtb2RpZmllZCB9ID0gZmluZEFkZGVkQW5kTW9kaWZpZWRGaWxlcyhcbiAgICAgICAgICAgIGN1cnJlbnRFbnRyaWVzLFxuICAgICAgICAgICAgcHJldmlvdXNFbnRyaWVzXG4gICAgICAgICAgKTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBhZGRlZEZpbGVzOiBhZGRlZCxcbiAgICAgICAgICAgIG1vZGlmaWVkRmlsZXM6IG1vZGlmaWVkLFxuICAgICAgICAgICAgcmVtb3ZlZEZpbGVzLFxuICAgICAgICAgIH07XG4gICAgICAgIH07XG5cbiAgICAgICAgY29uc3QgbWVyZ2VGaWxlQ2hhbmdlcyA9ICh7XG4gICAgICAgICAgY3VycmVudEVudHJpZXMsXG4gICAgICAgICAgcHJldmlvdXNFbnRyaWVzLFxuICAgICAgICAgIHRpbWVzdGFtcENoYW5nZXMsXG4gICAgICAgICAgZXZlbnRDaGFuZ2VkRmlsZXMsXG4gICAgICAgICAgZXZlbnRSZW1vdmVkRmlsZXMsXG4gICAgICAgIH06IHtcbiAgICAgICAgICBjdXJyZW50RW50cmllczogTWFwPHN0cmluZywgV2F0Y2hwYWNrVGltZUluZm9FbnRyeT47XG4gICAgICAgICAgcHJldmlvdXNFbnRyaWVzOiBNYXA8c3RyaW5nLCBXYXRjaHBhY2tUaW1lSW5mb0VudHJ5PjtcbiAgICAgICAgICB0aW1lc3RhbXBDaGFuZ2VzOiBGaWxlQ2hhbmdlcztcbiAgICAgICAgICBldmVudENoYW5nZWRGaWxlczogc3RyaW5nW107XG4gICAgICAgICAgZXZlbnRSZW1vdmVkRmlsZXM6IHN0cmluZ1tdO1xuICAgICAgICB9KTogRmlsZUNoYW5nZXMgPT4gKHtcbiAgICAgICAgICBhZGRlZEZpbGVzOiB1bmlxdWUoW1xuICAgICAgICAgICAgLi4udGltZXN0YW1wQ2hhbmdlcy5hZGRlZEZpbGVzLFxuICAgICAgICAgICAgLi4uZXZlbnRDaGFuZ2VkRmlsZXMuZmlsdGVyKFxuICAgICAgICAgICAgICAocGF0aCkgPT4gY3VycmVudEVudHJpZXMuaGFzKHBhdGgpICYmICFwcmV2aW91c0VudHJpZXMuaGFzKHBhdGgpXG4gICAgICAgICAgICApLFxuICAgICAgICAgIF0pLFxuICAgICAgICAgIG1vZGlmaWVkRmlsZXM6IHVuaXF1ZShbXG4gICAgICAgICAgICAuLi50aW1lc3RhbXBDaGFuZ2VzLm1vZGlmaWVkRmlsZXMsXG4gICAgICAgICAgICAuLi5ldmVudENoYW5nZWRGaWxlcyxcbiAgICAgICAgICBdKSxcbiAgICAgICAgICByZW1vdmVkRmlsZXM6IHVuaXF1ZShbXG4gICAgICAgICAgICAuLi50aW1lc3RhbXBDaGFuZ2VzLnJlbW92ZWRGaWxlcyxcbiAgICAgICAgICAgIC4uLmV2ZW50UmVtb3ZlZEZpbGVzLFxuICAgICAgICAgIF0pLFxuICAgICAgICB9KTtcblxuICAgICAgICBjb25zdCBoYXNGaWxlQ2hhbmdlcyA9ICh7XG4gICAgICAgICAgYWRkZWRGaWxlcyxcbiAgICAgICAgICBtb2RpZmllZEZpbGVzLFxuICAgICAgICAgIHJlbW92ZWRGaWxlcyxcbiAgICAgICAgfTogRmlsZUNoYW5nZXMpID0+XG4gICAgICAgICAgYWRkZWRGaWxlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgbW9kaWZpZWRGaWxlcy5sZW5ndGggPiAwIHx8XG4gICAgICAgICAgcmVtb3ZlZEZpbGVzLmxlbmd0aCA+IDA7XG5cbiAgICAgICAgbGV0IGlzSW5pdGlhbCA9IHRydWU7XG5cbiAgICAgICAgd2F0Y2hlci5vbihcbiAgICAgICAgICAnYWdncmVnYXRlZCcsXG4gICAgICAgICAgKGNoYW5nZXM/OiBTZXQ8c3RyaW5nPiwgcmVtb3ZhbHM/OiBTZXQ8c3RyaW5nPikgPT4ge1xuICAgICAgICAgICAgY29uc3QgY3VycmVudEVudHJpZXMgPSByZWFkVGltZUluZm9FbnRyaWVzKCk7XG4gICAgICAgICAgICBjb25zdCBldmVudENoYW5nZWRGaWxlcyA9IG5vcm1hbGl6ZVdhdGNocGFja1BhdGhzKGNoYW5nZXMpO1xuICAgICAgICAgICAgY29uc3QgZXZlbnRSZW1vdmVkRmlsZXMgPSBub3JtYWxpemVXYXRjaHBhY2tQYXRocyhyZW1vdmFscyk7XG4gICAgICAgICAgICBjb25zdCB0aW1lc3RhbXBDaGFuZ2VzID0gZGV0ZXJtaW5lRmlsZUNoYW5nZXMoXG4gICAgICAgICAgICAgIGN1cnJlbnRFbnRyaWVzLFxuICAgICAgICAgICAgICBwcmV2aW91c1RpbWVJbmZvXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBjb25zdCBmaWxlQ2hhbmdlcyA9IG1lcmdlRmlsZUNoYW5nZXMoe1xuICAgICAgICAgICAgICBjdXJyZW50RW50cmllcyxcbiAgICAgICAgICAgICAgcHJldmlvdXNFbnRyaWVzOiBwcmV2aW91c1RpbWVJbmZvLFxuICAgICAgICAgICAgICB0aW1lc3RhbXBDaGFuZ2VzLFxuICAgICAgICAgICAgICBldmVudENoYW5nZWRGaWxlcyxcbiAgICAgICAgICAgICAgZXZlbnRSZW1vdmVkRmlsZXMsXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgcHJldmlvdXNUaW1lSW5mbyA9IGN1cnJlbnRFbnRyaWVzO1xuXG4gICAgICAgICAgICBpZiAoaXNJbml0aWFsKSB7XG4gICAgICAgICAgICAgIGlzSW5pdGlhbCA9IGZhbHNlO1xuICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgZXZlbnRDaGFuZ2VkRmlsZXMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgZXZlbnRSZW1vdmVkRmlsZXMubGVuZ3RoID09PSAwXG4gICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoIWhhc0ZpbGVDaGFuZ2VzKGZpbGVDaGFuZ2VzKSkge1xuICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGVucXVldWUoYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBhd2FpdCBmdWxsUmVidWlsZCgpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIHdhdGNoZXIud2F0Y2goe1xuICAgICAgICAgIGRpcmVjdG9yaWVzOiBbdGhpcy5jb25maWcud29ya2luZ0Rpcl0sXG4gICAgICAgICAgc3RhcnRUaW1lOiBEYXRlLm5vdygpLFxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgYXN5bmMgZ2V0SW5wdXRGaWxlcygpOiBQcm9taXNlPHN0cmluZ1tdPiB7XG4gICAgICBjb25zdCBpbnB1dEZpbGVzID0gYXdhaXQgc3VwZXIuZ2V0SW5wdXRGaWxlcygpO1xuICAgICAgcmV0dXJuIGlucHV0RmlsZXMuZmlsdGVyKChpdGVtKSA9PiB7XG4gICAgICAgIC8vIE1hdGNoIEFwcCBSb3V0ZXIgZW50cnlwb2ludHM6IHJvdXRlLnRzLCBwYWdlLnRzLCBsYXlvdXQudHMgaW4gYXBwLyBvciBzcmMvYXBwLyBkaXJlY3Rvcmllc1xuICAgICAgICAvLyBNYXRjaGVzOiAvYXBwL3BhZ2UudHMsIC9hcHAvZGFzaGJvYXJkL3BhZ2UudHMsIC9zcmMvYXBwL3JvdXRlLnRzLCBldGMuXG4gICAgICAgIGlmIChcbiAgICAgICAgICBpdGVtLm1hdGNoKFxuICAgICAgICAgICAgLyhefC4qWy9cXFxcXSkoYXBwfHNyY1svXFxcXF1hcHApKFsvXFxcXF0ocm91dGV8cGFnZXxsYXlvdXQpXFwufFsvXFxcXF0uKlsvXFxcXF0ocm91dGV8cGFnZXxsYXlvdXQpXFwuKS9cbiAgICAgICAgICApXG4gICAgICAgICkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIC8vIE1hdGNoIFBhZ2VzIFJvdXRlciBlbnRyeXBvaW50czogZmlsZXMgaW4gcGFnZXMvIG9yIHNyYy9wYWdlcy9cbiAgICAgICAgaWYgKGl0ZW0ubWF0Y2goL1svXFxcXF0ocGFnZXN8c3JjWy9cXFxcXXBhZ2VzKVsvXFxcXF0vKSkge1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgd3JpdGVGdW5jdGlvbnNDb25maWcob3V0cHV0RGlyOiBzdHJpbmcpIHtcbiAgICAgIC8vIHdlIGRvbid0IHJ1biB0aGlzIGluIGRldmVsb3BtZW50IG1vZGUgYXMgaXQncyBub3QgbmVlZGVkXG4gICAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09ICdkZXZlbG9wbWVudCcpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuXG4gICAgICAvLyBWMiBjb21iaW5lZCBjb25maWc6IHNpbmdsZSB0cmlnZ2VyIGhhbmRsZXMgYm90aCB3b3JrZmxvdyBhbmQgc3RlcCBleGVjdXRpb24uXG4gICAgICAvLyBUaGUgc3RlcCByb3V0ZSBubyBsb25nZXIgbmVlZHMgaXRzIG93biB0cmlnZ2VyIHNpbmNlIHN0ZXBzIGFyZSBleGVjdXRlZFxuICAgICAgLy8gaW5saW5lIGJ5IHRoZSBjb21iaW5lZCBoYW5kbGVyIG9yIHF1ZXVlZCBiYWNrIHRvIF9fd2tmX3dvcmtmbG93Xyogd2l0aCBzdGVwSWQuXG4gICAgICBjb25zdCBnZW5lcmF0ZWRDb25maWcgPSB7XG4gICAgICAgIHZlcnNpb246ICcwJyxcbiAgICAgICAgd29ya2Zsb3dzOiB7XG4gICAgICAgICAgbWF4RHVyYXRpb246ICdtYXgnLFxuICAgICAgICAgIGV4cGVyaW1lbnRhbFRyaWdnZXJzOiBbV09SS0ZMT1dfUVVFVUVfVFJJR0dFUl0sXG4gICAgICAgIH0sXG4gICAgICB9O1xuXG4gICAgICBhd2FpdCB3cml0ZUZpbGUoXG4gICAgICAgIGpvaW4ob3V0cHV0RGlyLCAnLndlbGwta25vd24vd29ya2Zsb3cvdjEvY29uZmlnLmpzb24nKSxcbiAgICAgICAgSlNPTi5zdHJpbmdpZnkoZ2VuZXJhdGVkQ29uZmlnLCBudWxsLCAyKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBWMjogQnVpbGQgY29tYmluZWQgcm91dGUgdGhhdCBoYW5kbGVzIGJvdGggd29ya2Zsb3cgYW5kIHN0ZXAgZXhlY3V0aW9uLlxuICAgICAqL1xuICAgIHByaXZhdGUgYXN5bmMgYnVpbGRDb21iaW5lZEZ1bmN0aW9uKHtcbiAgICAgIGlucHV0RmlsZXMsXG4gICAgICB3b3JrZmxvd0dlbmVyYXRlZERpcixcbiAgICAgIHRzY29uZmlnUGF0aCxcbiAgICB9OiB7XG4gICAgICBpbnB1dEZpbGVzOiBzdHJpbmdbXTtcbiAgICAgIHdvcmtmbG93R2VuZXJhdGVkRGlyOiBzdHJpbmc7XG4gICAgICB0c2NvbmZpZ1BhdGg/OiBzdHJpbmc7XG4gICAgfSkge1xuICAgICAgY29uc3QgZmxvd1JvdXRlRGlyID0gam9pbih3b3JrZmxvd0dlbmVyYXRlZERpciwgJ2Zsb3cnKTtcbiAgICAgIGF3YWl0IG1rZGlyKGZsb3dSb3V0ZURpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG5cbiAgICAgIHJldHVybiBhd2FpdCB0aGlzLmNyZWF0ZUNvbWJpbmVkQnVuZGxlKHtcbiAgICAgICAgZm9ybWF0OiAnZXNtJyxcbiAgICAgICAgaW5wdXRGaWxlcyxcbiAgICAgICAgc3RlcHNPdXRmaWxlOiBqb2luKGZsb3dSb3V0ZURpciwgJ19fc3RlcF9yZWdpc3RyYXRpb25zLmpzJyksXG4gICAgICAgIGZsb3dPdXRmaWxlOiBqb2luKGZsb3dSb3V0ZURpciwgJ3JvdXRlLmpzJyksXG4gICAgICAgIGJ1bmRsZUZpbmFsT3V0cHV0OiBmYWxzZSxcbiAgICAgICAgZXh0ZXJuYWxpemVOb25TdGVwczogdHJ1ZSxcbiAgICAgICAgc291cmNlU3RlcFJlZ2lzdHJhdGlvbkltcG9ydHM6IHRydWUsXG4gICAgICAgIHRzY29uZmlnUGF0aCxcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgYnVpbGRXZWJob29rUm91dGUoe1xuICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXIsXG4gICAgfToge1xuICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXI6IHN0cmluZztcbiAgICB9KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICBjb25zdCB3ZWJob29rUm91dGVGaWxlID0gam9pbihcbiAgICAgICAgd29ya2Zsb3dHZW5lcmF0ZWREaXIsXG4gICAgICAgICd3ZWJob29rL1t0b2tlbl0vcm91dGUuanMnXG4gICAgICApO1xuICAgICAgYXdhaXQgdGhpcy5jcmVhdGVXZWJob29rQnVuZGxlKHtcbiAgICAgICAgb3V0ZmlsZTogd2ViaG9va1JvdXRlRmlsZSxcbiAgICAgICAgYnVuZGxlOiBmYWxzZSwgLy8gTmV4dC5qcyBkb2Vzbid0IG5lZWQgYnVuZGxpbmdcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIHByaXZhdGUgYXN5bmMgZmluZEFwcERpcmVjdG9yeSgpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgICAgY29uc3QgYXBwRGlyID0gcmVzb2x2ZSh0aGlzLmNvbmZpZy53b3JraW5nRGlyLCAnYXBwJyk7XG4gICAgICBjb25zdCBzcmNBcHBEaXIgPSByZXNvbHZlKHRoaXMuY29uZmlnLndvcmtpbmdEaXIsICdzcmMvYXBwJyk7XG4gICAgICBjb25zdCBwYWdlc0RpciA9IHJlc29sdmUodGhpcy5jb25maWcud29ya2luZ0RpciwgJ3BhZ2VzJyk7XG4gICAgICBjb25zdCBzcmNQYWdlc0RpciA9IHJlc29sdmUodGhpcy5jb25maWcud29ya2luZ0RpciwgJ3NyYy9wYWdlcycpO1xuXG4gICAgICAvLyBIZWxwZXIgdG8gY2hlY2sgaWYgYSBwYXRoIGV4aXN0cyBhbmQgaXMgYSBkaXJlY3RvcnlcbiAgICAgIGNvbnN0IGlzRGlyZWN0b3J5ID0gYXN5bmMgKHBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4gPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGF3YWl0IGFjY2VzcyhwYXRoLCBjb25zdGFudHMuRl9PSyk7XG4gICAgICAgICAgY29uc3Qgc3RhdHMgPSBhd2FpdCBzdGF0KHBhdGgpO1xuICAgICAgICAgIGlmICghc3RhdHMuaXNEaXJlY3RvcnkoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQYXRoIGV4aXN0cyBidXQgaXMgbm90IGEgZGlyZWN0b3J5OiAke3BhdGh9YCk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBFcnJvciAmJiBlLm1lc3NhZ2UuaW5jbHVkZXMoJ25vdCBhIGRpcmVjdG9yeScpKSB7XG4gICAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIC8vIENoZWNrIGlmIGFwcCBkaXJlY3RvcnkgZXhpc3RzXG4gICAgICBpZiAoYXdhaXQgaXNEaXJlY3RvcnkoYXBwRGlyKSkge1xuICAgICAgICByZXR1cm4gYXBwRGlyO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBpZiBzcmMvYXBwIGRpcmVjdG9yeSBleGlzdHNcbiAgICAgIGlmIChhd2FpdCBpc0RpcmVjdG9yeShzcmNBcHBEaXIpKSB7XG4gICAgICAgIHJldHVybiBzcmNBcHBEaXI7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIG5vIGFwcCBkaXJlY3RvcnkgZXhpc3RzLCBjaGVjayBmb3IgcGFnZXMgZGlyZWN0b3J5IGFuZCBjcmVhdGUgYXBwIG5leHQgdG8gaXRcbiAgICAgIGlmIChhd2FpdCBpc0RpcmVjdG9yeShwYWdlc0RpcikpIHtcbiAgICAgICAgLy8gQ3JlYXRlIGFwcCBkaXJlY3RvcnkgbmV4dCB0byBwYWdlcyBkaXJlY3RvcnlcbiAgICAgICAgYXdhaXQgbWtkaXIoYXBwRGlyLCB7IHJlY3Vyc2l2ZTogdHJ1ZSB9KTtcbiAgICAgICAgcmV0dXJuIGFwcERpcjtcbiAgICAgIH1cblxuICAgICAgaWYgKGF3YWl0IGlzRGlyZWN0b3J5KHNyY1BhZ2VzRGlyKSkge1xuICAgICAgICAvLyBDcmVhdGUgc3JjL2FwcCBkaXJlY3RvcnkgbmV4dCB0byBzcmMvcGFnZXMgZGlyZWN0b3J5XG4gICAgICAgIGF3YWl0IG1rZGlyKHNyY0FwcERpciwgeyByZWN1cnNpdmU6IHRydWUgfSk7XG4gICAgICAgIHJldHVybiBzcmNBcHBEaXI7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0NvdWxkIG5vdCBmaW5kIE5leHQuanMgYXBwIG9yIHBhZ2VzIGRpcmVjdG9yeS4gRXhwZWN0ZWQgb25lIG9mOiBcImFwcFwiLCBcInNyYy9hcHBcIiwgXCJwYWdlc1wiLCBvciBcInNyYy9wYWdlc1wiIHRvIGV4aXN0LidcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgQ2FjaGVkTmV4dEJ1aWxkZXJFYWdlciA9IE5leHRCdWlsZGVyO1xuICByZXR1cm4gTmV4dEJ1aWxkZXI7XG59XG4iXX0=
package/dist/builder.d.ts CHANGED
@@ -1,5 +1,2 @@
1
- export declare const DEFERRED_BUILDER_MIN_VERSION = "16.2.0-canary.48";
2
- export declare const WORKFLOW_DEFERRED_ENTRIES: readonly ["/.well-known/workflow/v1/flow", "/.well-known/workflow/v1/step", "/.well-known/workflow/v1/webhook/[token]"];
3
- export declare function shouldUseDeferredBuilder(nextVersion: string): boolean;
4
- export declare function getNextBuilder(nextVersion: string): Promise<any>;
1
+ export declare function getNextBuilder(_nextVersion: string): Promise<any>;
5
2
  //# sourceMappingURL=builder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,4BAA4B,qBAAqB,CAAC;AAE/D,eAAO,MAAM,yBAAyB,yHAI5B,CAAC;AAIX,wBAAgB,wBAAwB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAerE;AAED,wBAAsB,cAAc,CAAC,WAAW,EAAE,MAAM,gBAMvD"}
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAEA,wBAAsB,cAAc,CAAC,YAAY,EAAE,MAAM,gBAExD"}
package/dist/builder.js CHANGED
@@ -1,34 +1,8 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.WORKFLOW_DEFERRED_ENTRIES = exports.DEFERRED_BUILDER_MIN_VERSION = void 0;
7
- exports.shouldUseDeferredBuilder = shouldUseDeferredBuilder;
8
3
  exports.getNextBuilder = getNextBuilder;
9
- const semver_1 = __importDefault(require("semver"));
10
- const builder_deferred_js_1 = require("./builder-deferred.js");
11
4
  const builder_eager_js_1 = require("./builder-eager.js");
12
- exports.DEFERRED_BUILDER_MIN_VERSION = '16.2.0-canary.48';
13
- exports.WORKFLOW_DEFERRED_ENTRIES = [
14
- '/.well-known/workflow/v1/flow',
15
- '/.well-known/workflow/v1/step',
16
- '/.well-known/workflow/v1/webhook/[token]',
17
- ];
18
- let warnedAboutFlagAndVersion = false;
19
- function shouldUseDeferredBuilder(nextVersion) {
20
- const flagEnabled = Boolean(process.env.WORKFLOW_NEXT_LAZY_DISCOVERY);
21
- const versionCompatible = semver_1.default.gte(nextVersion, exports.DEFERRED_BUILDER_MIN_VERSION);
22
- if (flagEnabled && !versionCompatible && !warnedAboutFlagAndVersion) {
23
- warnedAboutFlagAndVersion = true;
24
- console.warn(`Enabled lazyDiscovery but Next.js version is not compatible, needs ${exports.DEFERRED_BUILDER_MIN_VERSION} have ${nextVersion}`);
25
- }
26
- return flagEnabled && versionCompatible;
27
- }
28
- async function getNextBuilder(nextVersion) {
29
- if (shouldUseDeferredBuilder(nextVersion)) {
30
- return (0, builder_deferred_js_1.getNextBuilderDeferred)();
31
- }
5
+ async function getNextBuilder(_nextVersion) {
32
6
  return (0, builder_eager_js_1.getNextBuilderEager)();
33
7
  }
34
- //# sourceMappingURL=builder.js.map
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGRlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9idWlsZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBRUEsd0NBRUM7QUFKRCx5REFBeUQ7QUFFbEQsS0FBSyxVQUFVLGNBQWMsQ0FBQyxZQUFvQjtJQUN2RCxPQUFPLElBQUEsc0NBQW1CLEdBQUUsQ0FBQztBQUMvQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0TmV4dEJ1aWxkZXJFYWdlciB9IGZyb20gJy4vYnVpbGRlci1lYWdlci5qcyc7XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXROZXh0QnVpbGRlcihfbmV4dFZlcnNpb246IHN0cmluZykge1xuICByZXR1cm4gZ2V0TmV4dEJ1aWxkZXJFYWdlcigpO1xufVxuIl19
package/dist/index.d.ts CHANGED
@@ -3,10 +3,17 @@ export declare function withWorkflow(nextConfigOrFn: NextConfig | ((phase: strin
3
3
  defaultConfig: NextConfig;
4
4
  }) => Promise<NextConfig>), { workflows, }?: {
5
5
  workflows?: {
6
- lazyDiscovery?: boolean;
7
6
  local?: {
8
7
  port?: number;
9
8
  };
9
+ /**
10
+ * Controls how source maps are emitted for workflow bundles. Accepts
11
+ * the same values as esbuild's `sourcemap` option: `true`/`'inline'`
12
+ * (default), `'linked'`, `'external'`, `'both'`, or `false` to omit
13
+ * source maps. Can also be set via the `WORKFLOW_SOURCEMAP`
14
+ * environment variable.
15
+ */
16
+ sourcemap?: boolean | 'inline' | 'linked' | 'external' | 'both';
10
17
  };
11
18
  }): (phase: string, ctx: {
12
19
  defaultConfig: NextConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AA6CvC,wBAAgB,YAAY,CAC1B,cAAc,EACV,UAAU,GACV,CAAC,CACC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE;IAAE,aAAa,EAAE,UAAU,CAAA;CAAE,KAC/B,OAAO,CAAC,UAAU,CAAC,CAAC,EAC7B,EACE,SAAS,GACV,GAAE;IACD,SAAS,CAAC,EAAE;QACV,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,KAAK,CAAC,EAAE;YACN,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,CAAC;KACH,CAAC;CACE,IAsBJ,OAAO,MAAM,EACb,KAAK;IAAE,aAAa,EAAE,UAAU,CAAA;CAAE,yBAsLrC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAqTvC,wBAAgB,YAAY,CAC1B,cAAc,EACV,UAAU,GACV,CAAC,CACC,KAAK,EAAE,MAAM,EACb,GAAG,EAAE;IAAE,aAAa,EAAE,UAAU,CAAA;CAAE,KAC/B,OAAO,CAAC,UAAU,CAAC,CAAC,EAC7B,EACE,SAAS,GACV,GAAE;IACD,SAAS,CAAC,EAAE;QACV,KAAK,CAAC,EAAE;YACN,IAAI,CAAC,EAAE,MAAM,CAAC;SACf,CAAC;QACF;;;;;;WAMG;QACH,SAAS,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,UAAU,GAAG,MAAM,CAAC;KACjE,CAAC;CACE,IAkBJ,OAAO,MAAM,EACb,KAAK;IAAE,aAAa,EAAE,UAAU,CAAA;CAAE,yBAwMrC"}