@workflow/next 5.0.0-beta.3 → 5.0.0-beta.31

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":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AA8lBA,KAAK,qBAAqB,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CACZ,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,GAAG,KACZ,IAAI,CAAC;IACV,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,IAAI,EAAE,qBAAqB,EAC3B,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,SAAS,EAAE,GAAG,GACb,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,CA+IjC"}
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAmJA,wBAAsB,+BAA+B,CACnD,MAAM,EAAE,MAAM,EACd,cAAc,CAAC,EAAE,IAAI,CACnB,cAAc,oBAAoB,CAAC,EACnC,8BAA8B,GAAG,8BAA8B,CAChE,GACA,OAAO,CAAC,MAAM,CAAC,CAejB;AAqED,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG;;;;EAOzE;AAKD,KAAK,qBAAqB,GAAG;IAC3B,YAAY,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CACZ,KAAK,EAAE,KAAK,GAAG,IAAI,EACnB,OAAO,CAAC,EAAE,MAAM,EAChB,SAAS,CAAC,EAAE,GAAG,KACZ,IAAI,CAAC;IACV,aAAa,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7C,kBAAkB,CAAC,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,IAAI,CAAC;CACnD,CAAC;AAEF,MAAM,CAAC,OAAO,UAAU,cAAc,CACpC,IAAI,EAAE,qBAAqB,EAC3B,MAAM,EAAE,MAAM,GAAG,MAAM,EACvB,SAAS,EAAE,GAAG,GACb,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,SAAS,CAgGtC"}
package/dist/loader.js CHANGED
@@ -1,48 +1,20 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.injectWorkflowTargetWorldImport = injectWorkflowTargetWorldImport;
4
+ exports.getLoaderSourceMapOptions = getLoaderSourceMapOptions;
3
5
  exports.default = workflowLoader;
4
6
  const node_fs_1 = require("node:fs");
5
- const promises_1 = require("node:fs/promises");
6
- const node_net_1 = require("node:net");
7
7
  const node_path_1 = require("node:path");
8
8
  const core_1 = require("@swc/core");
9
- const socket_server_js_1 = require("./socket-server.js");
10
9
  // Cache decorator options per working directory to avoid reading tsconfig for every file
11
10
  const decoratorOptionsCache = new Map();
12
11
  // Cache for shared utilities from @workflow/builders (ESM module loaded dynamically in CommonJS context)
13
12
  let cachedBuildersModule = null;
14
13
  let cachedLoaderStaticDependencies = null;
15
- const discoveredPatternStateByFilePath = new Map();
16
- // Cache socket connection to avoid reconnecting on every file.
17
- let socketClientPromise = null;
18
- let socketClient = null;
19
- let socketClientKey = null;
20
- const ROUTE_STUB_FILE_MARKER = 'WORKFLOW_ROUTE_STUB_FILE';
21
- const ROUTE_STUB_BUILD_WAIT_TIMEOUT_MS = 120_000;
22
- let pendingDeferredRouteStubBuildPromise = null;
23
14
  function registerFileDependency(loaderContext, dependencyPath) {
24
15
  loaderContext.addDependency?.(dependencyPath);
25
16
  loaderContext.addBuildDependency?.(dependencyPath);
26
17
  }
27
- function updateDiscoveredPatternState(filePath, nextState) {
28
- const previousState = discoveredPatternStateByFilePath.get(filePath);
29
- const hasAnyPattern = nextState.hasWorkflow || nextState.hasStep || nextState.hasSerde;
30
- if (!hasAnyPattern) {
31
- if (!previousState) {
32
- return { shouldNotify: false };
33
- }
34
- discoveredPatternStateByFilePath.delete(filePath);
35
- return { shouldNotify: true, previousState };
36
- }
37
- if (previousState &&
38
- previousState.hasWorkflow === nextState.hasWorkflow &&
39
- previousState.hasStep === nextState.hasStep &&
40
- previousState.hasSerde === nextState.hasSerde) {
41
- return { shouldNotify: false, previousState };
42
- }
43
- discoveredPatternStateByFilePath.set(filePath, nextState);
44
- return { shouldNotify: true, previousState };
45
- }
46
18
  function addIfExists(files, dependencyPath) {
47
19
  if ((0, node_fs_1.existsSync)(dependencyPath)) {
48
20
  files.add(dependencyPath);
@@ -61,7 +33,6 @@ function resolveLoaderStaticDependencies() {
61
33
  const workflowBuildersPackageJsonPath = (0, node_path_1.join)((0, node_path_1.dirname)(workflowBuildersPath), '../package.json');
62
34
  const files = new Set([
63
35
  __filename,
64
- require.resolve('./socket-server'),
65
36
  swcPluginPath,
66
37
  swcPluginBuildHashPath,
67
38
  workflowBuildersPath,
@@ -81,286 +52,6 @@ function registerTransformDependencies(loaderContext) {
81
52
  }
82
53
  return staticDependencies.swcPluginPath;
83
54
  }
84
- function resetSocketClient(cachedSocket) {
85
- if (cachedSocket && socketClient && socketClient !== cachedSocket) {
86
- return;
87
- }
88
- socketClientPromise = null;
89
- socketClient = null;
90
- socketClientKey = null;
91
- }
92
- async function writeSocketMessage(socket, message) {
93
- await new Promise((resolve, reject) => {
94
- socket.write(message, (error) => {
95
- if (error) {
96
- reject(error);
97
- return;
98
- }
99
- resolve();
100
- });
101
- });
102
- }
103
- function getSocketInfoFilePath() {
104
- const configuredPath = process.env.WORKFLOW_SOCKET_INFO_PATH;
105
- if (configuredPath) {
106
- return configuredPath;
107
- }
108
- // Fallback for worker processes that don't inherit dynamic env updates
109
- // from the process that created the socket server.
110
- const distDir = process.env.WORKFLOW_NEXT_DIST_DIR || '.next';
111
- const cwdFallbackPath = (0, node_path_1.join)(process.cwd(), distDir, 'cache', 'workflow-socket.json');
112
- const projectRoot = process.env.WORKFLOW_PROJECT_ROOT;
113
- if (projectRoot) {
114
- const projectRootFallbackPath = (0, node_path_1.join)(projectRoot, distDir, 'cache', 'workflow-socket.json');
115
- if ((0, node_fs_1.existsSync)(projectRootFallbackPath)) {
116
- return projectRootFallbackPath;
117
- }
118
- }
119
- return cwdFallbackPath;
120
- }
121
- function getSocketCredentialsFromEnv() {
122
- const socketPort = process.env.WORKFLOW_SOCKET_PORT;
123
- const authToken = process.env.WORKFLOW_SOCKET_AUTH;
124
- if (!socketPort || !authToken) {
125
- return null;
126
- }
127
- const port = Number.parseInt(socketPort, 10);
128
- if (Number.isNaN(port)) {
129
- return null;
130
- }
131
- return { port, authToken };
132
- }
133
- async function getSocketCredentialsFromFile() {
134
- const socketInfoFilePath = getSocketInfoFilePath();
135
- if (!socketInfoFilePath) {
136
- return null;
137
- }
138
- if (!(0, node_fs_1.existsSync)(socketInfoFilePath)) {
139
- return null;
140
- }
141
- try {
142
- const raw = await (0, promises_1.readFile)(socketInfoFilePath, 'utf8');
143
- const parsed = JSON.parse(raw);
144
- const authToken = typeof parsed.authToken === 'string' ? parsed.authToken : null;
145
- const numericPort = typeof parsed.port === 'number'
146
- ? parsed.port
147
- : Number.parseInt(String(parsed.port), 10);
148
- if (!authToken || Number.isNaN(numericPort)) {
149
- return null;
150
- }
151
- return {
152
- port: numericPort,
153
- authToken,
154
- };
155
- }
156
- catch {
157
- return null;
158
- }
159
- }
160
- async function getSocketCredentials() {
161
- const envCredentials = getSocketCredentialsFromEnv();
162
- if (envCredentials) {
163
- return envCredentials;
164
- }
165
- return await getSocketCredentialsFromFile();
166
- }
167
- async function getSocketClient() {
168
- const socketCredentials = await getSocketCredentials();
169
- if (!socketCredentials) {
170
- return null;
171
- }
172
- if (socketClient?.destroyed) {
173
- resetSocketClient(socketClient);
174
- }
175
- const currentSocketKey = `${socketCredentials.port}:${socketCredentials.authToken}`;
176
- if (socketClientKey && socketClientKey !== currentSocketKey) {
177
- if (socketClient) {
178
- resetSocketClient(socketClient);
179
- }
180
- else {
181
- resetSocketClient();
182
- }
183
- }
184
- if (!socketClientPromise) {
185
- socketClientPromise = (async () => {
186
- try {
187
- const socket = (0, node_net_1.connect)({
188
- port: socketCredentials.port,
189
- host: '127.0.0.1',
190
- });
191
- // Wait for connection
192
- await new Promise((resolve, reject) => {
193
- const onConnect = () => {
194
- socket.setNoDelay(true);
195
- cleanup();
196
- resolve();
197
- };
198
- const onError = (error) => {
199
- cleanup();
200
- reject(error);
201
- };
202
- const timeout = setTimeout(() => {
203
- cleanup();
204
- socket.destroy();
205
- reject(new Error('Socket connection timeout'));
206
- }, 1000);
207
- const cleanup = () => {
208
- clearTimeout(timeout);
209
- socket.off('connect', onConnect);
210
- socket.off('error', onError);
211
- };
212
- socket.on('connect', onConnect);
213
- socket.on('error', onError);
214
- });
215
- socket.on('close', () => {
216
- resetSocketClient(socket);
217
- });
218
- socket.on('error', () => {
219
- resetSocketClient(socket);
220
- });
221
- socketClient = socket;
222
- socketClientKey = currentSocketKey;
223
- return socket;
224
- }
225
- catch (error) {
226
- resetSocketClient();
227
- throw error;
228
- }
229
- })();
230
- }
231
- return socketClientPromise;
232
- }
233
- async function notifySocketServer(filename, hasWorkflow, hasStep, hasSerde) {
234
- const socketCredentials = await getSocketCredentials();
235
- if (!socketCredentials) {
236
- return;
237
- }
238
- const socket = await getSocketClient();
239
- if (!socket) {
240
- throw new Error('Invariant: missing workflow socket connection');
241
- }
242
- const message = {
243
- type: 'file-discovered',
244
- filePath: filename,
245
- hasWorkflow,
246
- hasStep,
247
- hasSerde,
248
- };
249
- const serializedMessage = (0, socket_server_js_1.serializeMessage)(message, socketCredentials.authToken);
250
- try {
251
- await writeSocketMessage(socket, serializedMessage);
252
- }
253
- catch (error) {
254
- resetSocketClient(socket);
255
- const reconnectedSocket = await getSocketClient();
256
- if (!reconnectedSocket) {
257
- throw error;
258
- }
259
- await writeSocketMessage(reconnectedSocket, serializedMessage);
260
- }
261
- }
262
- function isWorkflowRouteStubSource(source) {
263
- return source.includes(ROUTE_STUB_FILE_MARKER);
264
- }
265
- async function createSocketConnection(socketCredentials, timeoutMs = 1_000) {
266
- return await new Promise((resolve, reject) => {
267
- const socket = (0, node_net_1.connect)({
268
- port: socketCredentials.port,
269
- host: '127.0.0.1',
270
- });
271
- const timeout = setTimeout(() => {
272
- cleanup();
273
- socket.destroy();
274
- reject(new Error('Socket connection timeout'));
275
- }, timeoutMs);
276
- const cleanup = () => {
277
- clearTimeout(timeout);
278
- socket.off('connect', onConnect);
279
- socket.off('error', onError);
280
- };
281
- const onConnect = () => {
282
- socket.setNoDelay(true);
283
- cleanup();
284
- resolve(socket);
285
- };
286
- const onError = (error) => {
287
- cleanup();
288
- socket.destroy();
289
- reject(error);
290
- };
291
- socket.on('connect', onConnect);
292
- socket.on('error', onError);
293
- });
294
- }
295
- async function waitForDeferredBuildComplete(socket, authToken, timeoutMs = ROUTE_STUB_BUILD_WAIT_TIMEOUT_MS) {
296
- await new Promise((resolve, reject) => {
297
- let buffer = '';
298
- const timeout = setTimeout(() => {
299
- cleanup();
300
- reject(new Error('Timed out waiting for deferred route build completion'));
301
- }, timeoutMs);
302
- const cleanup = () => {
303
- clearTimeout(timeout);
304
- socket.off('data', onData);
305
- socket.off('error', onError);
306
- socket.off('close', onClose);
307
- socket.off('end', onClose);
308
- };
309
- const onError = (error) => {
310
- cleanup();
311
- reject(error);
312
- };
313
- const onClose = () => {
314
- cleanup();
315
- reject(new Error('Socket closed before deferred route build completed'));
316
- };
317
- const onData = (chunk) => {
318
- buffer += chunk.toString();
319
- let newlineIndex = buffer.indexOf('\n');
320
- while (newlineIndex !== -1) {
321
- const line = buffer.slice(0, newlineIndex);
322
- buffer = buffer.slice(newlineIndex + 1);
323
- newlineIndex = buffer.indexOf('\n');
324
- const message = (0, socket_server_js_1.parseMessage)(line, authToken);
325
- if (message?.type === 'build-complete') {
326
- cleanup();
327
- resolve();
328
- return;
329
- }
330
- }
331
- };
332
- socket.on('data', onData);
333
- socket.on('error', onError);
334
- socket.on('close', onClose);
335
- socket.on('end', onClose);
336
- });
337
- }
338
- async function triggerDeferredRouteStubBuildAndWait() {
339
- const socketCredentials = await getSocketCredentials();
340
- if (!socketCredentials) {
341
- return;
342
- }
343
- const socket = await createSocketConnection(socketCredentials);
344
- try {
345
- await writeSocketMessage(socket, (0, socket_server_js_1.serializeMessage)({ type: 'trigger-build' }, socketCredentials.authToken));
346
- await waitForDeferredBuildComplete(socket, socketCredentials.authToken);
347
- }
348
- finally {
349
- socket.destroy();
350
- }
351
- }
352
- async function ensureDeferredRouteStubBuildAndWait() {
353
- if (pendingDeferredRouteStubBuildPromise) {
354
- return pendingDeferredRouteStubBuildPromise;
355
- }
356
- const pendingPromise = triggerDeferredRouteStubBuildAndWait();
357
- pendingDeferredRouteStubBuildPromise = pendingPromise.finally(() => {
358
- if (pendingDeferredRouteStubBuildPromise === pendingPromise) {
359
- pendingDeferredRouteStubBuildPromise = null;
360
- }
361
- });
362
- return pendingDeferredRouteStubBuildPromise;
363
- }
364
55
  async function getBuildersModule() {
365
56
  if (cachedBuildersModule) {
366
57
  return cachedBuildersModule;
@@ -402,6 +93,26 @@ async function resolveWorkflowAliasPath(filePath, workingDir) {
402
93
  const { resolveWorkflowAliasRelativePath } = await getBuildersModule();
403
94
  return resolveWorkflowAliasRelativePath(filePath, workingDir);
404
95
  }
96
+ async function injectWorkflowTargetWorldImport(source, buildersModule) {
97
+ const targetModule = buildersModule?.WORKFLOW_WORLD_TARGET_MODULE ??
98
+ '@workflow/core/runtime/world-target';
99
+ if (!source.includes(targetModule)) {
100
+ return source;
101
+ }
102
+ const { ensureWorkflowTargetWorldEnv, WORKFLOW_WORLD_TARGET_MODULE } = buildersModule ?? (await getBuildersModule());
103
+ return source.replaceAll(WORKFLOW_WORLD_TARGET_MODULE, ensureWorkflowTargetWorldEnv());
104
+ }
105
+ function parseTransformMap(resultMap, fallbackMap) {
106
+ if (typeof resultMap !== 'string') {
107
+ return resultMap || fallbackMap;
108
+ }
109
+ try {
110
+ return JSON.parse(resultMap);
111
+ }
112
+ catch {
113
+ return resultMap;
114
+ }
115
+ }
405
116
  async function getRelativeFilenameForSwc(filename, workingDir) {
406
117
  const normalizedWorkingDir = workingDir
407
118
  .replace(/\\/g, '/')
@@ -442,6 +153,17 @@ async function getRelativeFilenameForSwc(filename, workingDir) {
442
153
  }
443
154
  return relativeFilename;
444
155
  }
156
+ function isNodeModulesPath(filename) {
157
+ return /(?:^|[/\\])node_modules(?:[/\\]|$)/.test(filename);
158
+ }
159
+ function getLoaderSourceMapOptions(filename, sourceMap) {
160
+ const shouldEmitSourceMaps = !isNodeModulesPath(filename);
161
+ return {
162
+ inputSourceMap: shouldEmitSourceMaps ? (sourceMap ?? false) : false,
163
+ sourceMaps: shouldEmitSourceMaps,
164
+ inlineSourcesContent: shouldEmitSourceMaps,
165
+ };
166
+ }
445
167
  function workflowLoader(source, sourceMap) {
446
168
  const callback = this.async?.();
447
169
  const run = async () => {
@@ -449,43 +171,17 @@ function workflowLoader(source, sourceMap) {
449
171
  const normalizedSource = source.toString();
450
172
  const workingDir = process.cwd();
451
173
  const swcPluginPath = registerTransformDependencies(this);
452
- const sourceForTransform = normalizedSource;
174
+ const sourceForTransform = await injectWorkflowTargetWorldImport(normalizedSource);
453
175
  const isGeneratedWorkflowFile = await checkGeneratedFile(filename);
454
176
  // Skip generated workflow route files to avoid re-processing them.
455
- // Deferred route stubs are a special case: wait for the generated route
456
- // output to become available before returning.
457
177
  if (isGeneratedWorkflowFile) {
458
- if (process.env.WORKFLOW_NEXT_LAZY_DISCOVERY === '1' &&
459
- isWorkflowRouteStubSource(normalizedSource)) {
460
- try {
461
- await ensureDeferredRouteStubBuildAndWait();
462
- const refreshedSource = await (0, promises_1.readFile)(filename, 'utf8');
463
- if (!isWorkflowRouteStubSource(refreshedSource)) {
464
- return { code: refreshedSource, map: sourceMap };
465
- }
466
- }
467
- catch (error) {
468
- console.warn(`[workflow] Failed waiting for deferred route build for ${filename}, using stub output`, error);
469
- }
470
- }
471
- return { code: normalizedSource, map: sourceMap };
178
+ return { code: sourceForTransform, map: sourceMap };
472
179
  }
473
180
  // Detect workflow patterns in the source code.
474
181
  const patterns = await detectPatterns(sourceForTransform);
475
- // Always notify discovery tracking, even for `false/false`, so files that
476
- // previously had workflow/step usage are removed from the tracked sets.
477
- const nextPatternState = {
478
- hasWorkflow: patterns.hasUseWorkflow,
479
- hasStep: patterns.hasUseStep,
480
- hasSerde: patterns.hasSerde,
481
- };
482
- const { shouldNotify } = updateDiscoveredPatternState(filename, nextPatternState);
483
- if (shouldNotify) {
484
- await notifySocketServer(filename, nextPatternState.hasWorkflow, nextPatternState.hasStep, nextPatternState.hasSerde);
485
- }
486
182
  // Check if file needs transformation based on patterns and path
487
183
  if (!(await checkShouldTransform(filename, patterns))) {
488
- return { code: normalizedSource, map: sourceMap };
184
+ return { code: sourceForTransform, map: sourceMap };
489
185
  }
490
186
  const isTypeScript = filename.endsWith('.ts') ||
491
187
  filename.endsWith('.tsx') ||
@@ -521,6 +217,7 @@ function workflowLoader(source, sourceMap) {
521
217
  },
522
218
  target: 'es2022',
523
219
  experimental: {
220
+ cacheRoot: (0, node_path_1.join)(workingDir, '.swc'),
524
221
  plugins: [[swcPluginPath, { mode, moduleSpecifier }]],
525
222
  },
526
223
  transform: {
@@ -532,22 +229,9 @@ function workflowLoader(source, sourceMap) {
532
229
  },
533
230
  },
534
231
  minify: false,
535
- inputSourceMap: sourceMap,
536
- sourceMaps: true,
537
- inlineSourcesContent: true,
232
+ ...getLoaderSourceMapOptions(filename, sourceMap),
538
233
  });
539
- let transformedMap = sourceMap;
540
- if (typeof result.map === 'string') {
541
- try {
542
- transformedMap = JSON.parse(result.map);
543
- }
544
- catch {
545
- transformedMap = result.map;
546
- }
547
- }
548
- else if (result.map) {
549
- transformedMap = result.map;
550
- }
234
+ const transformedMap = parseTransformMap(result.map, sourceMap);
551
235
  return { code: result.code, map: transformedMap };
552
236
  };
553
237
  if (!callback) {
@@ -559,4 +243,4 @@ function workflowLoader(source, sourceMap) {
559
243
  callback(error instanceof Error ? error : new Error(String(error)));
560
244
  });
561
245
  }
562
- //# sourceMappingURL=loader.js.map
246
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vc3JjL2xvYWRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQW1KQSwwRUFxQkM7QUFxRUQsOERBT0M7QUFnQkQsaUNBb0dDO0FBeFdELHFDQUFxQztBQUNyQyx5Q0FBb0Q7QUFDcEQsb0NBQXNDO0FBTXRDLHlGQUF5RjtBQUN6RixNQUFNLHFCQUFxQixHQUFHLElBQUksR0FBRyxFQUdsQyxDQUFDO0FBQ0oseUdBQXlHO0FBQ3pHLElBQUksb0JBQW9CLEdBQStDLElBQUksQ0FBQztBQUs1RSxJQUFJLDhCQUE4QixHQUFvQyxJQUFJLENBQUM7QUFFM0UsU0FBUyxzQkFBc0IsQ0FDN0IsYUFBb0MsRUFDcEMsY0FBc0I7SUFFdEIsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0lBQzlDLGFBQWEsQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO0FBQ3JELENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxLQUFrQixFQUFFLGNBQXNCO0lBQzdELElBQUksSUFBQSxvQkFBVSxFQUFDLGNBQWMsQ0FBQyxFQUFFLENBQUM7UUFDL0IsS0FBSyxDQUFDLEdBQUcsQ0FBQyxjQUFjLENBQUMsQ0FBQztJQUM1QixDQUFDO0FBQ0gsQ0FBQztBQUVELFNBQVMsK0JBQStCO0lBQ3RDLElBQUksOEJBQThCLEVBQUUsQ0FBQztRQUNuQyxPQUFPLDhCQUE4QixDQUFDO0lBQ3hDLENBQUM7SUFFRCxNQUFNLGFBQWEsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7SUFDOUQsTUFBTSxzQkFBc0IsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUM1QyxzQ0FBc0MsQ0FDdkMsQ0FBQztJQUNGLE1BQU0sb0JBQW9CLEdBQUcsT0FBTyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxDQUFDO0lBRW5FLCtEQUErRDtJQUMvRCxvRUFBb0U7SUFDcEUs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aUJBQWlCLEVBQUUsZ0JBQWdCLENBQUMsaUJBQWlCO2lCQUN0RDthQUNGO1lBQ0QsTUFBTSxFQUFFLEtBQUs7WUFDYixHQUFHLHlCQUF5QixDQUFDLFFBQVEsRUFBRSxTQUFTLENBQUM7U0FDbEQsQ0FBQyxDQUFDO1FBRUgsTUFBTSxjQUFjLEdBQUcsaUJBQWlCLENBQUMsTUFBTSxDQUFDLEdBQUcsRUFBRSxTQUFTLENBQUMsQ0FBQztRQUVoRSxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsR0FBRyxFQUFFLGNBQWMsRUFBRSxDQUFDO0lBQ3BELENBQUMsQ0FBQztJQUVGLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztRQUNkLE9BQU8sR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELEtBQUssR0FBRyxFQUFFO1NBQ1AsSUFBSSxDQUFDLENBQUMsTUFBTSxFQUFFLEVBQUUsQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3pELEtBQUssQ0FBQyxDQUFDLEtBQWMsRUFBRSxFQUFFO1FBQ3hCLFFBQVEsQ0FBQyxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZXhpc3RzU3luYyB9IGZyb20gJ25vZGU6ZnMnO1xuaW1wb3J0IHsgZGlybmFtZSwgam9pbiwgcmVsYXRpdmUgfSBmcm9tICdub2RlOnBhdGgnO1xuaW1wb3J0IHsgdHJhbnNmb3JtIH0gZnJvbSAnQHN3Yy9jb3JlJztcblxudHlwZSBEZWNvcmF0b3JPcHRpb25zV2l0aENvbmZpZ1BhdGggPVxuICBpbXBvcnQoJ0B3b3JrZmxvdy9idWlsZGVycycpLkRlY29yYXRvck9wdGlvbnNXaXRoQ29uZmlnUGF0aDtcbnR5cGUgV29ya2Zsb3dQYXR0ZXJuTWF0Y2ggPSBpbXBvcnQoJ0B3b3JrZmxvdy9idWlsZGVycycpLldvcmtmbG93UGF0dGVybk1hdGNoO1xuXG4vLyBDYWNoZSBkZWNvcmF0b3Igb3B0aW9ucyBwZXIgd29ya2luZyBkaXJlY3RvcnkgdG8gYXZvaWQgcmVhZGluZyB0c2NvbmZpZyBmb3IgZXZlcnkgZmlsZVxuY29uc3QgZGVjb3JhdG9yT3B0aW9uc0NhY2hlID0gbmV3IE1hcDxcbiAgc3RyaW5nLFxuICBQcm9taXNlPERlY29yYXRvck9wdGlvbnNXaXRoQ29uZmlnUGF0aD5cbj4oKTtcbi8vIENhY2hlIGZvciBzaGFyZWQgdXRpbGl0aWVzIGZyb20gQHdvcmtmbG93L2J1aWxkZXJzIChFU00gbW9kdWxlIGxvYWRlZCBkeW5hbWljYWxseSBpbiBDb21tb25KUyBjb250ZXh0KVxubGV0IGNhY2hlZEJ1aWxkZXJzTW9kdWxlOiB0eXBlb2YgaW1wb3J0KCdAd29ya2Zsb3cvYnVpbGRlcnMnKSB8IG51bGwgPSBudWxsO1xudHlwZSBMb2FkZXJTdGF0aWNEZXBlbmRlbmNpZXMgPSB7XG4gIHN3Y1BsdWdpblBhdGg6IHN0cmluZztcbiAgZmlsZXM6IHN0cmluZ1tdO1xufTtcbmxldCBjYWNoZWRMb2FkZXJTdGF0aWNEZXBlbmRlbmNpZXM6IExvYWRlclN0YXRpY0RlcGVuZGVuY2llcyB8IG51bGwgPSBudWxsO1xuXG5mdW5jdGlvbiByZWdpc3RlckZpbGVEZXBlbmRlbmN5KFxuICBsb2FkZXJDb250ZXh0OiBXb3JrZmxvd0xvYWRlckNvbnRleHQsXG4gIGRlcGVuZGVuY3lQYXRoOiBzdHJpbmdcbik6IHZvaWQge1xuICBsb2FkZXJDb250ZXh0LmFkZERlcGVuZGVuY3k/LihkZXBlbmRlbmN5UGF0aCk7XG4gIGxvYWRlckNvbnRleHQuYWRkQnVpbGREZXBlbmRlbmN5Py4oZGVwZW5kZW5jeVBhdGgpO1xufVxuXG5mdW5jdGlvbiBhZGRJZkV4aXN0cyhmaWxlczogU2V0PHN0cmluZz4sIGRlcGVuZGVuY3lQYXRoOiBzdHJpbmcpOiB2b2lkIHtcbiAgaWYgKGV4aXN0c1N5bmMoZGVwZW5kZW5jeVBhdGgpKSB7XG4gICAgZmlsZXMuYWRkKGRlcGVuZGVuY3lQYXRoKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXNvbHZlTG9hZGVyU3RhdGljRGVwZW5kZW5jaWVzKCk6IExvYWRlclN0YXRpY0RlcGVuZGVuY2llcyB7XG4gIGlmIChjYWNoZWRMb2FkZXJTdGF0aWNEZXBlbmRlbmNpZXMpIHtcbiAgICByZXR1cm4gY2FjaGVkTG9hZGVyU3RhdGljRGVwZW5kZW5jaWVzO1xuICB9XG5cbiAgY29uc3Qgc3djUGx1Z2luUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnQHdvcmtmbG93L3N3Yy1wbHVnaW4nKTtcbiAgY29uc3Qgc3djUGx1Z2luQnVpbGRIYXNoUGF0aCA9IHJlcXVpcmUucmVzb2x2ZShcbiAgICAnQHdvcmtmbG93L3N3Yy1wbHVnaW4vYnVpbGQtaGFzaC5qc29uJ1xuICApO1xuICBjb25zdCB3b3JrZmxvd0J1aWxkZXJzUGF0aCA9IHJlcXVpcmUucmVzb2x2ZSgnQHdvcmtmbG93L2J1aWxkZXJzJyk7XG5cbiAgLy8gRGVyaXZlIHBhY2thZ2UuanNvbiBwYXRocyBmcm9tIHJlc29sdmVkIGVudHJ5cG9pbnRzIHRvIGF2b2lkXG4gIC8vIFR1cmJvcGFjayBsb2FkZXItZXZhbCBmYWlsdXJlcyBhcm91bmQgLi4vcGFja2FnZS5qc29uIHJlc29sdXRpb24uXG4gIGNvbnN0IHN3Y1BsdWdpblBhY2thZ2VKc29uUGF0aCA9IGpvaW4oZGlybmFtZShzd2NQbHVnaW5QYXRoKSwgJ3BhY2thZ2UuanNvbicpO1xuICBjb25zdCB3b3JrZmxvd0J1aWxkZXJzUGFja2FnZUpzb25QYXRoID0gam9pbihcbiAgICBkaXJuYW1lKHdvcmtmbG93QnVpbGRlcnNQYXRoKSxcbiAgICAnLi4vcGFja2FnZS5qc29uJ1xuICApO1xuXG4gIGNvbnN0IGZpbGVzID0gbmV3IFNldDxzdHJpbmc+KFtcbiAgICBfX2ZpbGVuYW1lLFxuICAgIHN3Y1BsdWdpblBhdGgsXG4gICAgc3djUGx1Z2luQnVpbGRIYXNoUGF0aCxcbiAgICB3b3JrZmxvd0J1aWxkZXJzUGF0aCxcbiAgXSk7XG4gIGFkZElmRXhpc3RzKGZpbGVzLCBzd2NQbHVnaW5QYWNrYWdlSnNvblBhdGgpO1xuICBhZGRJZkV4aXN0cyhmaWxlcywgd29ya2Zsb3dCdWlsZGVyc1BhY2thZ2VKc29uUGF0aCk7XG5cbiAgY2FjaGVkTG9hZGVyU3RhdGljRGVwZW5kZW5jaWVzID0ge1xuICAgIHN3Y1BsdWdpblBhdGgsXG4gICAgZmlsZXM6IEFycmF5LmZyb20oZmlsZXMpLFxuICB9O1xuICByZXR1cm4gY2FjaGVkTG9hZGVyU3RhdGljRGVwZW5kZW5jaWVzO1xufVxuXG5mdW5jdGlvbiByZWdpc3RlclRyYW5zZm9ybURlcGVuZGVuY2llcyhcbiAgbG9hZGVyQ29udGV4dDogV29ya2Zsb3dMb2FkZXJDb250ZXh0XG4pOiBzdHJpbmcge1xuICBjb25zdCBzdGF0aWNEZXBlbmRlbmNpZXMgPSByZXNvbHZlTG9hZGVyU3RhdGljRGVwZW5kZW5jaWVzKCk7XG4gIGZvciAoY29uc3QgZGVwZW5kZW5jeVBhdGggb2Ygc3RhdGljRGVwZW5kZW5jaWVzLmZpbGVzKSB7XG4gICAgcmVnaXN0ZXJGaWxlRGVwZW5kZW5jeShsb2FkZXJDb250ZXh0LCBkZXBlbmRlbmN5UGF0aCk7XG4gIH1cblxuICByZXR1cm4gc3RhdGljRGVwZW5kZW5jaWVzLnN3Y1BsdWdpblBhdGg7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldEJ1aWxkZXJzTW9kdWxlKCk6IFByb21pc2U8XG4gIHR5cGVvZiBpbXBvcnQoJ0B3b3JrZmxvdy9idWlsZGVycycpXG4+IHtcbiAgaWYgKGNhY2hlZEJ1aWxkZXJzTW9kdWxlKSB7XG4gICAgcmV0dXJuIGNhY2hlZEJ1aWxkZXJzTW9kdWxlO1xuICB9XG4gIC8vIER5bmFtaWMgaW1wb3J0IHRvIGhhbmRsZSBFU00gbW9kdWxlIGZyb20gQ29tbW9uSlMgY29udGV4dFxuICAvLyBiaW9tZS1pZ25vcmUgbGludC9zZWN1cml0eS9ub0dsb2JhbEV2YWw6IE5lZWQgdG8gdXNlIGV2YWwgaGVyZSB0byBhdm9pZCBUeXBlU2NyaXB0IGZyb20gdHJhbnNwaWxpbmcgdGhlIGltcG9ydCBzdGF0ZW1lbnQgaW50byBgcmVxdWlyZSgpYFxuICBjYWNoZWRCdWlsZGVyc01vZHVsZSA9IChhd2FpdCBldmFsKFxuICAgICdpbXBvcnQoXCJAd29ya2Zsb3cvYnVpbGRlcnNcIiknXG4gICkpIGFzIHR5cGVvZiBpbXBvcnQoJ0B3b3JrZmxvdy9idWlsZGVycycpO1xuICByZXR1cm4gY2FjaGVkQnVpbGRlcnNNb2R1bGU7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIGdldERlY29yYXRvck9wdGlvbnMoXG4gIHdvcmtpbmdEaXI6IHN0cmluZ1xuKTogUHJvbWlzZTxEZWNvcmF0b3JPcHRpb25zV2l0aENvbmZpZ1BhdGg+IHtcbiAgY29uc3QgY2FjaGVkID0gZGVjb3JhdG9yT3B0aW9uc0NhY2hlLmdldCh3b3JraW5nRGlyKTtcbiAgaWYgKGNhY2hlZCkge1xuICAgIHJldHVybiBjYWNoZWQ7XG4gIH1cblxuICBjb25zdCBwcm9taXNlID0gKGFzeW5jICgpOiBQcm9taXNlPERlY29yYXRvck9wdGlvbnNXaXRoQ29uZmlnUGF0aD4gPT4ge1xuICAgIGNvbnN0IHsgZ2V0RGVjb3JhdG9yT3B0aW9uc0ZvckRpcmVjdG9yeVdpdGhDb25maWdQYXRoIH0gPVxuICAgICAgYXdhaXQgZ2V0QnVpbGRlcnNNb2R1bGUoKTtcbiAgICByZXR1cm4gZ2V0RGVjb3JhdG9yT3B0aW9uc0ZvckRpcmVjdG9yeVdpdGhDb25maWdQYXRoKHdvcmtpbmdEaXIpO1xuICB9KSgpO1xuXG4gIGRlY29yYXRvck9wdGlvbnNDYWNoZS5zZXQod29ya2luZ0RpciwgcHJvbWlzZSk7XG4gIHJldHVybiBwcm9taXNlO1xufVxuXG5hc3luYyBmdW5jdGlvbiBkZXRlY3RQYXR0ZXJucyhzb3VyY2U6IHN0cmluZyk6IFByb21pc2U8V29ya2Zsb3dQYXR0ZXJuTWF0Y2g+IHtcbiAgY29uc3QgeyBkZXRlY3RXb3JrZmxvd1BhdHRlcm5zIH0gPSBhd2FpdCBnZXRCdWlsZGVyc01vZHVsZSgpO1xuICByZXR1cm4gZGV0ZWN0V29ya2Zsb3dQYXR0ZXJucyhzb3VyY2UpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja0dlbmVyYXRlZEZpbGUoZmlsZVBhdGg6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICBjb25zdCB7IGlzR2VuZXJhdGVkV29ya2Zsb3dGaWxlIH0gPSBhd2FpdCBnZXRCdWlsZGVyc01vZHVsZSgpO1xuICByZXR1cm4gaXNHZW5lcmF0ZWRXb3JrZmxvd0ZpbGUoZmlsZVBhdGgpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBjaGVja1Nob3VsZFRyYW5zZm9ybShcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgcGF0dGVybnM6IFdvcmtmbG93UGF0dGVybk1hdGNoXG4pOiBQcm9taXNlPGJvb2xlYW4+IHtcbiAgY29uc3QgeyBzaG91bGRUcmFuc2Zvcm1GaWxlIH0gPSBhd2FpdCBnZXRCdWlsZGVyc01vZHVsZSgpO1xuICByZXR1cm4gc2hvdWxkVHJhbnNmb3JtRmlsZShmaWxlUGF0aCwgcGF0dGVybnMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRNb2R1bGVTcGVjaWZpZXIoXG4gIGZpbGVQYXRoOiBzdHJpbmcsXG4gIHByb2plY3RSb290OiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nIHwgdW5kZWZpbmVkPiB7XG4gIGNvbnN0IHsgcmVzb2x2ZU1vZHVsZVNwZWNpZmllciB9ID0gYXdhaXQgZ2V0QnVpbGRlcnNNb2R1bGUoKTtcbiAgcmV0dXJuIHJlc29sdmVNb2R1bGVTcGVjaWZpZXIoZmlsZVBhdGgsIHByb2plY3RSb290KS5tb2R1bGVTcGVjaWZpZXI7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJlc29sdmVXb3JrZmxvd0FsaWFzUGF0aChcbiAgZmlsZVBhdGg6IHN0cmluZyxcbiAgd29ya2luZ0Rpcjogc3RyaW5nXG4pOiBQcm9taXNlPHN0cmluZyB8IHVuZGVmaW5lZD4ge1xuICBjb25zdCB7IHJlc29sdmVXb3JrZmxvd0FsaWFzUmVsYXRpdmVQYXRoIH0gPSBhd2FpdCBnZXRCdWlsZGVyc01vZHVsZSgpO1xuICByZXR1cm4gcmVzb2x2ZVdvcmtmbG93QWxpYXNSZWxhdGl2ZVBhdGgoZmlsZVBhdGgsIHdvcmtpbmdEaXIpO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gaW5qZWN0V29ya2Zsb3dUYXJnZXRXb3JsZEltcG9ydChcbiAgc291cmNlOiBzdHJpbmcsXG4gIGJ1aWxkZXJzTW9kdWxlPzogUGljazxcbiAgICB0eXBlb2YgaW1wb3J0KCdAd29ya2Zsb3cvYnVpbGRlcnMnKSxcbiAgICAnZW5zdXJlV29ya2Zsb3dUYXJnZXRXb3JsZEVudicgfCAnV09SS0ZMT1dfV09STERfVEFSR0VUX01PRFVMRSdcbiAgPlxuKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgY29uc3QgdGFyZ2V0TW9kdWxlID1cbiAgICBidWlsZGVyc01vZHVsZT8uV09SS0ZMT1dfV09STERfVEFSR0VUX01PRFVMRSA/P1xuICAgICdAd29ya2Zsb3cvY29yZS9ydW50aW1lL3dvcmxkLXRhcmdldCc7XG4gIGlmICghc291cmNlLmluY2x1ZGVzKHRhcmdldE1vZHVsZSkpIHtcbiAgICByZXR1cm4gc291cmNlO1xuICB9XG5cbiAgY29uc3QgeyBlbnN1cmVXb3JrZmxvd1RhcmdldFdvcmxkRW52LCBXT1JLRkxPV19XT1JMRF9UQVJHRVRfTU9EVUxFIH0gPVxuICAgIGJ1aWxkZXJzTW9kdWxlID8/IChhd2FpdCBnZXRCdWlsZGVyc01vZHVsZSgpKTtcblxuICByZXR1cm4gc291cmNlLnJlcGxhY2VBbGwoXG4gICAgV09SS0ZMT1dfV09STERfVEFSR0VUX01PRFVMRSxcbiAgICBlbnN1cmVXb3JrZmxvd1RhcmdldFdvcmxkRW52KClcbiAgKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VUcmFuc2Zvcm1NYXAocmVzdWx0TWFwOiB1bmtub3duLCBmYWxsYmFja01hcDogYW55KTogYW55IHtcbiAgaWYgKHR5cGVvZiByZXN1bHRNYXAgIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHJlc3VsdE1hcCB8fCBmYWxsYmFja01hcDtcbiAgfVxuXG4gIHRyeSB7XG4gICAgcmV0dXJuIEpTT04ucGFyc2UocmVzdWx0TWFwKTtcbiAgfSBjYXRjaCB7XG4gICAgcmV0dXJuIHJlc3VsdE1hcDtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBnZXRSZWxhdGl2ZUZpbGVuYW1lRm9yU3djKFxuICBmaWxlbmFtZTogc3RyaW5nLFxuICB3b3JraW5nRGlyOiBzdHJpbmdcbik6IFByb21pc2U8c3RyaW5nPiB7XG4gIGNvbnN0IG5vcm1hbGl6ZWRXb3JraW5nRGlyID0gd29ya2luZ0RpclxuICAgIC5yZXBsYWNlKC9cXFxcL2csICcvJylcbiAgICAucmVwbGFjZSgvXFwvJC8sICcnKTtcbiAgY29uc3Qgbm9ybWFsaXplZEZpbGVwYXRoID0gZmlsZW5hbWUucmVwbGFjZSgvXFxcXC9nLCAnLycpO1xuXG4gIC8vIFdpbmRvd3MgZml4OiBVc2UgY2FzZS1pbnNlbnNpdGl2ZSBjb21wYXJpc29uIHRvIHdvcmsgYXJvdW5kIGRyaXZlIGxldHRlciBjYXNpbmcgaXNzdWVzXG4gIGNvbnN0IGxvd2VyV2QgPSBub3JtYWxpemVkV29ya2luZ0Rpci50b0xvd2VyQ2FzZSgpO1xuICBjb25zdCBsb3dlclBhdGggPSBub3JtYWxpemVkRmlsZXBhdGgudG9Mb3dlckNhc2UoKTtcblxuICBsZXQgcmVsYXRpdmVGaWxlbmFtZTogc3RyaW5nO1xuICBpZiAobG93ZXJQYXRoLnN0YXJ0c1dpdGgoYCR7bG93ZXJXZH0vYCkpIHtcbiAgICAvLyBGaWxlIGlzIHVuZGVyIHdvcmtpbmcgZGlyZWN0b3J5IC0gbWFudWFsbHkgY2FsY3VsYXRlIHJlbGF0aXZlIHBhdGhcbiAgICByZWxhdGl2ZUZpbGVuYW1lID0gbm9ybWFsaXplZEZpbGVwYXRoLnN1YnN0cmluZyhcbiAgICAgIG5vcm1hbGl6ZWRXb3JraW5nRGlyLmxlbmd0aCArIDFcbiAgICApO1xuICB9IGVsc2UgaWYgKGxvd2VyUGF0aCA9PT0gbG93ZXJXZCkge1xuICAgIC8vIEZpbGUgSVMgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IChzaG91bGRuJ3QgaGFwcGVuKVxuICAgIHJlbGF0aXZlRmlsZW5hbWUgPSAnLic7XG4gIH0gZWxzZSB7XG4gICAgLy8gVXNlIHJlbGF0aXZlKCkgZm9yIGZpbGVzIG91dHNpZGUgd29ya2luZyBkaXJlY3RvcnlcbiAgICByZWxhdGl2ZUZpbGVuYW1lID0gcmVsYXRpdmUod29ya2luZ0RpciwgZmlsZW5hbWUpLnJlcGxhY2UoL1xcXFwvZywgJy8nKTtcblxuICAgIGlmIChyZWxhdGl2ZUZpbGVuYW1lLnN0YXJ0c1dpdGgoJy4uLycpKSB7XG4gICAgICBjb25zdCBhbGlhc2VkUmVsYXRpdmVQYXRoID0gYXdhaXQgcmVzb2x2ZVdvcmtmbG93QWxpYXNQYXRoKFxuICAgICAgICBmaWxlbmFtZSxcbiAgICAgICAgd29ya2luZ0RpclxuICAgICAgKTtcbiAgICAgIGlmIChhbGlhc2VkUmVsYXRpdmVQYXRoKSB7XG4gICAgICAgIHJlbGF0aXZlRmlsZW5hbWUgPSBhbGlhc2VkUmVsYXRpdmVQYXRoO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVsYXRpdmVGaWxlbmFtZSA9IHJlbGF0aXZlRmlsZW5hbWVcbiAgICAgICAgICAuc3BsaXQoJy8nKVxuICAgICAgICAgIC5maWx0ZXIoKHBhcnQpID0+IHBhcnQgIT09ICcuLicpXG4gICAgICAgICAgLmpvaW4oJy8nKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBGaW5hbCBzYWZldHkgY2hlY2sgLSBlbnN1cmUgd2UgbmV2ZXIgcGFzcyBhbiBhYnNvbHV0ZSBwYXRoIHRvIFNXQ1xuICBpZiAocmVsYXRpdmVGaWxlbmFtZS5pbmNsdWRlcygnOicpIHx8IHJlbGF0aXZlRmlsZW5hbWUuc3RhcnRzV2l0aCgnLycpKSB7XG4gICAgLy8gVGhpcyBzaG91bGQgcmFyZWx5IGhhcHBlbiwgYnV0IHVzZSBmaWxlbmFtZSBzcGxpdCBhcyBsYXN0IHJlc29ydFxuICAgIHJlbGF0aXZlRmlsZW5hbWUgPSBub3JtYWxpemVkRmlsZXBhdGguc3BsaXQoJy8nKS5wb3AoKSB8fCAndW5rbm93bi50cyc7XG4gIH1cblxuICByZXR1cm4gcmVsYXRpdmVGaWxlbmFtZTtcbn1cblxuZnVuY3Rpb24gaXNOb2RlTW9kdWxlc1BhdGgoZmlsZW5hbWU6IHN0cmluZyk6IGJvb2xlYW4ge1xuICByZXR1cm4gLyg/Ol58Wy9cXFxcXSlub2RlX21vZHVsZXMoPzpbL1xcXFxdfCQpLy50ZXN0KGZpbGVuYW1lKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGdldExvYWRlclNvdXJjZU1hcE9wdGlvbnMoZmlsZW5hbWU6IHN0cmluZywgc291cmNlTWFwOiBhbnkpIHtcbiAgY29uc3Qgc2hvdWxkRW1pdFNvdXJjZU1hcHMgPSAhaXNOb2RlTW9kdWxlc1BhdGgoZmlsZW5hbWUpO1xuICByZXR1cm4ge1xuICAgIGlucHV0U291cmNlTWFwOiBzaG91bGRFbWl0U291cmNlTWFwcyA/IChzb3VyY2VNYXAgPz8gZmFsc2UpIDogZmFsc2UsXG4gICAgc291cmNlTWFwczogc2hvdWxkRW1pdFNvdXJjZU1hcHMsXG4gICAgaW5saW5lU291cmNlc0NvbnRlbnQ6IHNob3VsZEVtaXRTb3VyY2VNYXBzLFxuICB9O1xufVxuXG4vLyBUaGlzIGxvYWRlciBhcHBsaWVzIHRoZSBcInVzZSB3b3JrZmxvd1wiL1widXNlIHN0ZXBcIiB0cmFuc2Zvcm0uXG4vLyBBbGwgZmlsZXMgdXNlIHN0ZXAgbW9kZTsgdGhlIFNXQyBwbHVnaW4gZGVjaWRlcyBwZXItZnVuY3Rpb24gd2hldGhlclxuLy8gdG8gZW1pdCB3b3JrZmxvdyBvciBzdGVwIGJpbmRpbmdzIGJhc2VkIG9uIHRoZSBzb3VyY2UncyBkaXJlY3RpdmVzLlxudHlwZSBXb3JrZmxvd0xvYWRlckNvbnRleHQgPSB7XG4gIHJlc291cmNlUGF0aDogc3RyaW5nO1xuICBhc3luYz86ICgpID0+IChcbiAgICBlcnJvcjogRXJyb3IgfCBudWxsLFxuICAgIGNvbnRlbnQ/OiBzdHJpbmcsXG4gICAgc291cmNlTWFwPzogYW55XG4gICkgPT4gdm9pZDtcbiAgYWRkRGVwZW5kZW5jeT86IChkZXBlbmRlbmN5OiBzdHJpbmcpID0+IHZvaWQ7XG4gIGFkZEJ1aWxkRGVwZW5kZW5jeT86IChkZXBlbmRlbmN5OiBzdHJpbmcpID0+IHZvaWQ7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiB3b3JrZmxvd0xvYWRlcihcbiAgdGhpczogV29ya2Zsb3dMb2FkZXJDb250ZXh0LFxuICBzb3VyY2U6IHN0cmluZyB8IEJ1ZmZlcixcbiAgc291cmNlTWFwOiBhbnlcbik6IHN0cmluZyB8IFByb21pc2U8c3RyaW5nPiB8IHVuZGVmaW5lZCB7XG4gIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5hc3luYz8uKCk7XG4gIGNvbnN0IHJ1biA9IGFzeW5jICgpOiBQcm9taXNlPHsgY29kZTogc3RyaW5nOyBtYXA6IGFueSB9PiA9PiB7XG4gICAgY29uc3QgZmlsZW5hbWUgPSB0aGlzLnJlc291cmNlUGF0aDtcbiAgICBjb25zdCBub3JtYWxpemVkU291cmNlID0gc291cmNlLnRvU3RyaW5nKCk7XG4gICAgY29uc3Qgd29ya2luZ0RpciA9IHByb2Nlc3MuY3dkKCk7XG4gICAgY29uc3Qgc3djUGx1Z2luUGF0aCA9IHJlZ2lzdGVyVHJhbnNmb3JtRGVwZW5kZW5jaWVzKHRoaXMpO1xuICAgIGNvbnN0IHNvdXJjZUZvclRyYW5zZm9ybSA9XG4gICAgICBhd2FpdCBpbmplY3RXb3JrZmxvd1RhcmdldFdvcmxkSW1wb3J0KG5vcm1hbGl6ZWRTb3VyY2UpO1xuXG4gICAgY29uc3QgaXNHZW5lcmF0ZWRXb3JrZmxvd0ZpbGUgPSBhd2FpdCBjaGVja0dlbmVyYXRlZEZpbGUoZmlsZW5hbWUpO1xuICAgIC8vIFNraXAgZ2VuZXJhdGVkIHdvcmtmbG93IHJvdXRlIGZpbGVzIHRvIGF2b2lkIHJlLXByb2Nlc3NpbmcgdGhlbS5cbiAgICBpZiAoaXNHZW5lcmF0ZWRXb3JrZmxvd0ZpbGUpIHtcbiAgICAgIHJldHVybiB7IGNvZGU6IHNvdXJjZUZvclRyYW5zZm9ybSwgbWFwOiBzb3VyY2VNYXAgfTtcbiAgICB9XG5cbiAgICAvLyBEZXRlY3Qgd29ya2Zsb3cgcGF0dGVybnMgaW4gdGhlIHNvdXJjZSBjb2RlLlxuICAgIGNvbnN0IHBhdHRlcm5zID0gYXdhaXQgZGV0ZWN0UGF0dGVybnMoc291cmNlRm9yVHJhbnNmb3JtKTtcblxuICAgIC8vIENoZWNrIGlmIGZpbGUgbmVlZHMgdHJhbnNmb3JtYXRpb24gYmFzZWQgb24gcGF0dGVybnMgYW5kIHBhdGhcbiAgICBpZiAoIShhd2FpdCBjaGVja1Nob3VsZFRyYW5zZm9ybShmaWxlbmFtZSwgcGF0dGVybnMpKSkge1xuICAgICAgcmV0dXJuIHsgY29kZTogc291cmNlRm9yVHJhbnNmb3JtLCBtYXA6IHNvdXJjZU1hcCB9O1xuICAgIH1cblxuICAgIGNvbnN0IGlzVHlwZVNjcmlwdCA9XG4gICAgICBmaWxlbmFtZS5lbmRzV2l0aCgnLnRzJykgfHxcbiAgICAgIGZpbGVuYW1lLmVuZHNXaXRoKCcudHN4JykgfHxcbiAgICAgIGZpbGVuYW1lLmVuZHNXaXRoKCcubXRzJykgfHxcbiAgICAgIGZpbGVuYW1lLmVuZHNXaXRoKCcuY3RzJyk7XG5cbiAgICAvLyBDYWxjdWxhdGUgcmVsYXRpdmUgZmlsZW5hbWUgZm9yIFNXQyBwbHVnaW5cbiAgICAvLyBUaGUgU1dDIHBsdWdpbiB1c2VzIGZpbGVuYW1lIHRvIGdlbmVyYXRlIHdvcmtmbG93SWQsIHNvIGl0IG11c3QgYmUgcmVsYXRpdmVcbiAgICBjb25zdCByZWxhdGl2ZUZpbGVuYW1lID0gYXdhaXQgZ2V0UmVsYXRpdmVGaWxlbmFtZUZvclN3YyhcbiAgICAgIGZpbGVuYW1lLFxuICAgICAgd29ya2luZ0RpclxuICAgICk7XG5cbiAgICAvLyBHZXQgZGVjb3JhdG9yIG9wdGlvbnMgZnJvbSB0c2NvbmZpZyAoY2FjaGVkIHBlciB3b3JraW5nIGRpcmVjdG9yeSlcbiAgICBjb25zdCB7IG9wdGlvbnM6IGRlY29yYXRvck9wdGlvbnMsIGNvbmZpZ1BhdGggfSA9XG4gICAgICBhd2FpdCBnZXREZWNvcmF0b3JPcHRpb25zKHdvcmtpbmdEaXIpO1xuICAgIGlmIChjb25maWdQYXRoKSB7XG4gICAgICByZWdpc3RlckZpbGVEZXBlbmRlbmN5KHRoaXMsIGNvbmZpZ1BhdGgpO1xuICAgIH1cblxuICAgIC8vIFJlc29sdmUgbW9kdWxlIHNwZWNpZmllciBmb3IgcGFja2FnZXMgKG5vZGVfbW9kdWxlcyBvciB3b3Jrc3BhY2UgcGFja2FnZXMpXG4gICAgY29uc3QgbW9kdWxlU3BlY2lmaWVyID0gYXdhaXQgZ2V0TW9kdWxlU3BlY2lmaWVyKGZpbGVuYW1lLCB3b3JraW5nRGlyKTtcbiAgICBjb25zdCBtb2RlID0gJ3N0ZXAnO1xuXG4gICAgLy8gVHJhbnNmb3JtIHdpdGggU1dDXG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgdHJhbnNmb3JtKHNvdXJjZUZvclRyYW5zZm9ybSwge1xuICAgICAgZmlsZW5hbWU6IHJlbGF0aXZlRmlsZW5hbWUsXG4gICAgICBqc2M6IHtcbiAgICAgICAgcGFyc2VyOiB7XG4gICAgICAgICAgLi4uKGlzVHlwZVNjcmlwdFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgc3ludGF4OiAndHlwZXNjcmlwdCcsXG4gICAgICAgICAgICAgICAgdHN4OiBmaWxlbmFtZS5lbmRzV2l0aCgnLnRzeCcpLFxuICAgICAgICAgICAgICAgIGRlY29yYXRvcnM6IGRlY29yYXRvck9wdGlvbnMuZGVjb3JhdG9ycyxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgc3ludGF4OiAnZWNtYXNjcmlwdCcsXG4gICAgICAgICAgICAgICAganN4OiBmaWxlbmFtZS5lbmRzV2l0aCgnLmpzeCcpLFxuICAgICAgICAgICAgICAgIGRlY29yYXRvcnM6IGRlY29yYXRvck9wdGlvbnMuZGVjb3JhdG9ycyxcbiAgICAgICAgICAgICAgfSksXG4gICAgICAgIH0sXG4gICAgICAgIHRhcmdldDogJ2VzMjAyMicsXG4gICAgICAgIGV4cGVyaW1lbnRhbDoge1xuICAgICAgICAgIGNhY2hlUm9vdDogam9pbih3b3JraW5nRGlyLCAnLnN3YycpLFxuICAgICAgICAgIHBsdWdpbnM6IFtbc3djUGx1Z2luUGF0aCwgeyBtb2RlLCBtb2R1bGVTcGVjaWZpZXIgfV1dLFxuICAgICAgICB9LFxuICAgICAgICB0cmFuc2Zvcm06IHtcbiAgICAgICAgICByZWFjdDoge1xuICAgICAgICAgICAgcnVudGltZTogJ3ByZXNlcnZlJyxcbiAgICAgICAgICB9LFxuICAgICAgICAgIGxlZ2FjeURlY29yYXRvcjogZGVjb3JhdG9yT3B0aW9ucy5sZWdhY3lEZWNvcmF0b3IsXG4gICAgICAgICAgZGVjb3JhdG9yTWV0YWRhdGE6IGRlY29yYXRvck9wdGlvbnMuZGVjb3JhdG9yTWV0YWRhdGEsXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgbWluaWZ5OiBmYWxzZSxcbiAgICAgIC4uLmdldExvYWRlclNvdXJjZU1hcE9wdGlvbnMoZmlsZW5hbWUsIHNvdXJjZU1hcCksXG4gICAgfSk7XG5cbiAgICBjb25zdCB0cmFuc2Zvcm1lZE1hcCA9IHBhcnNlVHJhbnNmb3JtTWFwKHJlc3VsdC5tYXAsIHNvdXJjZU1hcCk7XG5cbiAgICByZXR1cm4geyBjb2RlOiByZXN1bHQuY29kZSwgbWFwOiB0cmFuc2Zvcm1lZE1hcCB9O1xuICB9O1xuXG4gIGlmICghY2FsbGJhY2spIHtcbiAgICByZXR1cm4gcnVuKCkudGhlbigocmVzdWx0KSA9PiByZXN1bHQuY29kZSk7XG4gIH1cblxuICB2b2lkIHJ1bigpXG4gICAgLnRoZW4oKHJlc3VsdCkgPT4gY2FsbGJhY2sobnVsbCwgcmVzdWx0LmNvZGUsIHJlc3VsdC5tYXApKVxuICAgIC5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcbiAgICAgIGNhbGxiYWNrKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvciA6IG5ldyBFcnJvcihTdHJpbmcoZXJyb3IpKSk7XG4gICAgfSk7XG59XG4iXX0=
package/dist/runtime.d.ts CHANGED
@@ -1,2 +1,2 @@
1
- export * from '@workflow/core/dist/runtime';
1
+ export * from '@workflow/core/runtime';
2
2
  //# sourceMappingURL=runtime.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAGA,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAGA,cAAc,wBAAwB,CAAC"}
package/dist/runtime.js CHANGED
@@ -17,5 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
17
17
  // re-export runtime as stub for resolving to not
18
18
  // require @workflow/core be a dependency as well as
19
19
  // @workflow/next
20
- __exportStar(require("@workflow/core/dist/runtime"), exports);
21
- //# sourceMappingURL=runtime.js.map
20
+ __exportStar(require("@workflow/core/runtime"), exports);
21
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnVudGltZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9ydW50aW1lLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxpREFBaUQ7QUFDakQsb0RBQW9EO0FBQ3BELGlCQUFpQjtBQUNqQix5REFBdUMiLCJzb3VyY2VzQ29udGVudCI6WyIvLyByZS1leHBvcnQgcnVudGltZSBhcyBzdHViIGZvciByZXNvbHZpbmcgdG8gbm90XG4vLyByZXF1aXJlIEB3b3JrZmxvdy9jb3JlIGJlIGEgZGVwZW5kZW5jeSBhcyB3ZWxsIGFzXG4vLyBAd29ya2Zsb3cvbmV4dFxuZXhwb3J0ICogZnJvbSAnQHdvcmtmbG93L2NvcmUvcnVudGltZSc7XG4iXX0=
@@ -0,0 +1,7 @@
1
+ /**
2
+ * SWC does not atomically write its Wasmer cache. Compile the plugin before
3
+ * Next.js starts parallel loader workers.
4
+ * @see https://github.com/swc-project/swc/issues/10065
5
+ */
6
+ export declare function prewarmWorkflowSwcPluginCache(projectRoot: string): void;
7
+ //# sourceMappingURL=swc-plugin-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swc-plugin-cache.d.ts","sourceRoot":"","sources":["../src/swc-plugin-cache.ts"],"names":[],"mappings":"AAGA;;;;GAIG;AACH,wBAAgB,6BAA6B,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAWvE"}
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.prewarmWorkflowSwcPluginCache = prewarmWorkflowSwcPluginCache;
4
+ const node_path_1 = require("node:path");
5
+ const core_1 = require("@swc/core");
6
+ /**
7
+ * SWC does not atomically write its Wasmer cache. Compile the plugin before
8
+ * Next.js starts parallel loader workers.
9
+ * @see https://github.com/swc-project/swc/issues/10065
10
+ */
11
+ function prewarmWorkflowSwcPluginCache(projectRoot) {
12
+ (0, core_1.transformSync)(`async function step() { 'use step'; }`, {
13
+ filename: '__workflow_swc_cache_warmup__.js',
14
+ swcrc: false,
15
+ jsc: {
16
+ experimental: {
17
+ cacheRoot: (0, node_path_1.join)(projectRoot, '.swc'),
18
+ plugins: [[require.resolve('@workflow/swc-plugin'), { mode: 'step' }]],
19
+ },
20
+ },
21
+ });
22
+ }
23
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3djLXBsdWdpbi1jYWNoZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL3NyYy9zd2MtcGx1Z2luLWNhY2hlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBUUEsc0VBV0M7QUFuQkQseUNBQWlDO0FBQ2pDLG9DQUEwQztBQUUxQzs7OztHQUlHO0FBQ0gsU0FBZ0IsNkJBQTZCLENBQUMsV0FBbUI7SUFDL0QsSUFBQSxvQkFBYSxFQUFDLHVDQUF1QyxFQUFFO1FBQ3JELFFBQVEsRUFBRSxrQ0FBa0M7UUFDNUMsS0FBSyxFQUFFLEtBQUs7UUFDWixHQUFHLEVBQUU7WUFDSCxZQUFZLEVBQUU7Z0JBQ1osU0FBUyxFQUFFLElBQUEsZ0JBQUksRUFBQyxXQUFXLEVBQUUsTUFBTSxDQUFDO2dCQUNwQyxPQUFPLEVBQUUsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsc0JBQXNCLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQyxDQUFDO2FBQ3ZFO1NBQ0Y7S0FDRixDQUFDLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgam9pbiB9IGZyb20gJ25vZGU6cGF0aCc7XG5pbXBvcnQgeyB0cmFuc2Zvcm1TeW5jIH0gZnJvbSAnQHN3Yy9jb3JlJztcblxuLyoqXG4gKiBTV0MgZG9lcyBub3QgYXRvbWljYWxseSB3cml0ZSBpdHMgV2FzbWVyIGNhY2hlLiBDb21waWxlIHRoZSBwbHVnaW4gYmVmb3JlXG4gKiBOZXh0LmpzIHN0YXJ0cyBwYXJhbGxlbCBsb2FkZXIgd29ya2Vycy5cbiAqIEBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3N3Yy1wcm9qZWN0L3N3Yy9pc3N1ZXMvMTAwNjVcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHByZXdhcm1Xb3JrZmxvd1N3Y1BsdWdpbkNhY2hlKHByb2plY3RSb290OiBzdHJpbmcpOiB2b2lkIHtcbiAgdHJhbnNmb3JtU3luYyhgYXN5bmMgZnVuY3Rpb24gc3RlcCgpIHsgJ3VzZSBzdGVwJzsgfWAsIHtcbiAgICBmaWxlbmFtZTogJ19fd29ya2Zsb3dfc3djX2NhY2hlX3dhcm11cF9fLmpzJyxcbiAgICBzd2NyYzogZmFsc2UsXG4gICAganNjOiB7XG4gICAgICBleHBlcmltZW50YWw6IHtcbiAgICAgICAgY2FjaGVSb290OiBqb2luKHByb2plY3RSb290LCAnLnN3YycpLFxuICAgICAgICBwbHVnaW5zOiBbW3JlcXVpcmUucmVzb2x2ZSgnQHdvcmtmbG93L3N3Yy1wbHVnaW4nKSwgeyBtb2RlOiAnc3RlcCcgfV1dLFxuICAgICAgfSxcbiAgICB9LFxuICB9KTtcbn1cbiJdfQ==
@@ -0,0 +1,63 @@
1
+ export interface DiscoveredEntriesLike {
2
+ discoveredSteps: Set<string>;
3
+ discoveredWorkflows: Set<string>;
4
+ discoveredSerdeFiles: Set<string>;
5
+ discoveredFiles?: Set<string>;
6
+ }
7
+ export interface FileChanges {
8
+ addedFiles: string[];
9
+ modifiedFiles: string[];
10
+ removedFiles: string[];
11
+ }
12
+ export interface SourceSnapshot {
13
+ importSignature: string;
14
+ definitionSignature: string;
15
+ hasDirective: boolean;
16
+ hasSerde: boolean;
17
+ }
18
+ export type RebuildDecision = {
19
+ kind: 'none';
20
+ snapshots?: Map<string, SourceSnapshot>;
21
+ } | {
22
+ kind: 'hot';
23
+ refreshStepRegistrations: boolean;
24
+ snapshots: Map<string, SourceSnapshot>;
25
+ } | {
26
+ kind: 'full';
27
+ };
28
+ export type SourcePatternDetector = (source: string) => {
29
+ hasDirective: boolean;
30
+ hasSerde: boolean;
31
+ };
32
+ export declare const stripCommentsFromSource: (source: string) => string;
33
+ export declare const extractImportSignature: (source: string) => string;
34
+ export declare const extractDefinitionSignature: (source: string) => string;
35
+ export declare const createSourceSnapshotFromSource: (source: string, detectWorkflowPatterns: SourcePatternDetector) => SourceSnapshot;
36
+ export declare const createSourceSnapshot: ({ file, detectWorkflowPatterns, }: {
37
+ file: string;
38
+ detectWorkflowPatterns: SourcePatternDetector;
39
+ }) => Promise<SourceSnapshot>;
40
+ export declare const getRelevantFiles: ({ discoveredEntries, inputFiles, normalizePath, }: {
41
+ discoveredEntries: DiscoveredEntriesLike;
42
+ inputFiles: string[];
43
+ normalizePath?: (path: string) => string;
44
+ }) => Set<string>;
45
+ export declare const replaceSourceSnapshots: ({ discoveredEntries, inputFiles, normalizePath, readSnapshot, sourceSnapshots, }: {
46
+ discoveredEntries: DiscoveredEntriesLike;
47
+ inputFiles: string[];
48
+ normalizePath?: (path: string) => string;
49
+ readSnapshot: (file: string) => Promise<SourceSnapshot>;
50
+ sourceSnapshots: Map<string, SourceSnapshot>;
51
+ }) => Promise<void>;
52
+ export declare const classifyRebuild: ({ discoveredEntries, fileChanges, inputFiles, normalizePath, parentHasChild, readSnapshot, sourceSnapshots, }: {
53
+ discoveredEntries: DiscoveredEntriesLike;
54
+ fileChanges: FileChanges;
55
+ inputFiles: string[];
56
+ normalizePath?: (path: string) => string;
57
+ parentHasChild: (parent: string, child: string, options?: {
58
+ excludedRoots?: Iterable<string>;
59
+ }) => boolean;
60
+ readSnapshot: (file: string) => Promise<SourceSnapshot>;
61
+ sourceSnapshots: Map<string, SourceSnapshot>;
62
+ }) => Promise<RebuildDecision>;
63
+ //# sourceMappingURL=watch-rebuild.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"watch-rebuild.d.ts","sourceRoot":"","sources":["../src/watch-rebuild.ts"],"names":[],"mappings":"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"}