@workflow/next 5.0.0-beta.4 → 5.0.0-beta.5

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/dist/index.js CHANGED
@@ -4,8 +4,144 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.withWorkflow = withWorkflow;
7
+ const node_fs_1 = require("node:fs");
8
+ const promises_1 = require("node:fs/promises");
9
+ const node_path_1 = require("node:path");
7
10
  const semver_1 = __importDefault(require("semver"));
8
11
  const builder_js_1 = require("./builder.js");
12
+ const environment_flag_js_1 = require("./environment-flag.js");
13
+ const VERCEL_WORLD_PACKAGE = '@workflow/world-vercel';
14
+ const VERCEL_WORLD_DEPENDENCY_PACKAGES = [
15
+ '@vercel/queue',
16
+ '@vercel/oidc',
17
+ '@vercel/cli-auth',
18
+ '@napi-rs/keyring',
19
+ ];
20
+ const VERCEL_WORLD_SERVER_EXTERNAL_PACKAGES = [
21
+ VERCEL_WORLD_PACKAGE,
22
+ ...VERCEL_WORLD_DEPENDENCY_PACKAGES,
23
+ ];
24
+ const useWorkflowPattern = /^\s*(['"])use workflow\1;?\s*$/m;
25
+ const useStepPattern = /^\s*(['"])use step\1;?\s*$/m;
26
+ const workflowSerdeImportPattern = /from\s+(['"])@workflow\/serde\1/;
27
+ const workflowSerdeSymbolPattern = /Symbol\.for\s*\(\s*(['"])workflow-(?:serialize|deserialize)\1\s*\)/;
28
+ const workflowSerdeComputedPropertyPattern = /\[\s*WORKFLOW_(?:SERIALIZE|DESERIALIZE)\s*\]/;
29
+ const PSEUDO_EXTERNAL_PACKAGES = new Set(['server-only', 'client-only']);
30
+ const warnedAutoRemovedServerExternalPackages = new Set();
31
+ function isPlainObject(value) {
32
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
33
+ }
34
+ function isResolvablePackageSpecifier(specifier) {
35
+ if (specifier.startsWith('.') || specifier.startsWith('/')) {
36
+ return false;
37
+ }
38
+ if (specifier.startsWith('$')) {
39
+ return false;
40
+ }
41
+ if (specifier.includes('*') || specifier.includes(':')) {
42
+ return false;
43
+ }
44
+ return true;
45
+ }
46
+ function detectWorkflowPatterns(source) {
47
+ const hasUseWorkflow = useWorkflowPattern.test(source);
48
+ const hasUseStep = useStepPattern.test(source);
49
+ const hasSerdeImport = workflowSerdeImportPattern.test(source);
50
+ const hasSerdeSymbol = workflowSerdeSymbolPattern.test(source);
51
+ const hasSerdeComputedProperty = workflowSerdeComputedPropertyPattern.test(source);
52
+ return {
53
+ hasUseWorkflow,
54
+ hasUseStep,
55
+ hasSerde: hasSerdeImport || hasSerdeSymbol || hasSerdeComputedProperty,
56
+ };
57
+ }
58
+ function getIssueLabels(detected) {
59
+ const issues = [];
60
+ if (detected.hasUseWorkflow) {
61
+ issues.push('"use workflow" functions');
62
+ }
63
+ if (detected.hasUseStep) {
64
+ issues.push('"use step" functions');
65
+ }
66
+ if (detected.hasSerde) {
67
+ issues.push('serialization classes');
68
+ }
69
+ return issues;
70
+ }
71
+ function hasWorkflowSerdeDependency(packageJson) {
72
+ if (!isPlainObject(packageJson)) {
73
+ return false;
74
+ }
75
+ const dependencies = isPlainObject(packageJson.dependencies)
76
+ ? packageJson.dependencies
77
+ : {};
78
+ const peerDependencies = isPlainObject(packageJson.peerDependencies)
79
+ ? packageJson.peerDependencies
80
+ : {};
81
+ return (Object.hasOwn(dependencies, '@workflow/serde') ||
82
+ Object.hasOwn(peerDependencies, '@workflow/serde'));
83
+ }
84
+ async function detectServerExternalPackage(packageName, workingDir) {
85
+ if (!isResolvablePackageSpecifier(packageName)) {
86
+ return null;
87
+ }
88
+ let hasUseWorkflow = false;
89
+ let hasUseStep = false;
90
+ let hasSerde = false;
91
+ try {
92
+ const packageJsonPath = require.resolve(`${packageName}/package.json`, {
93
+ paths: [workingDir],
94
+ });
95
+ const packageJsonSource = await (0, promises_1.readFile)(packageJsonPath, 'utf-8');
96
+ const packageJson = JSON.parse(packageJsonSource);
97
+ hasSerde = hasWorkflowSerdeDependency(packageJson);
98
+ }
99
+ catch {
100
+ // Best-effort only. Continue to source scanning.
101
+ }
102
+ try {
103
+ const entryPath = require.resolve(packageName, {
104
+ paths: [workingDir],
105
+ });
106
+ const source = await (0, promises_1.readFile)(entryPath, 'utf-8');
107
+ const patterns = detectWorkflowPatterns(source);
108
+ hasUseWorkflow = patterns.hasUseWorkflow;
109
+ hasUseStep = patterns.hasUseStep;
110
+ hasSerde ||= patterns.hasSerde;
111
+ }
112
+ catch {
113
+ // Best-effort only. Use whichever signal we already have.
114
+ }
115
+ if (!hasUseWorkflow && !hasUseStep && !hasSerde) {
116
+ return null;
117
+ }
118
+ return {
119
+ packageName,
120
+ hasUseWorkflow,
121
+ hasUseStep,
122
+ hasSerde,
123
+ };
124
+ }
125
+ function warnAboutAutoRemovedServerExternalPackages(detectedPackages) {
126
+ const newlyDetectedPackages = detectedPackages.filter(({ packageName }) => {
127
+ return !warnedAutoRemovedServerExternalPackages.has(packageName);
128
+ });
129
+ if (newlyDetectedPackages.length === 0) {
130
+ return;
131
+ }
132
+ for (const { packageName } of newlyDetectedPackages) {
133
+ warnedAutoRemovedServerExternalPackages.add(packageName);
134
+ }
135
+ const packageDescriptions = newlyDetectedPackages
136
+ .map((detected) => `"${detected.packageName}" (${getIssueLabels(detected).join(', ')})`)
137
+ .join(', ');
138
+ const packageNames = newlyDetectedPackages
139
+ .map((detected) => `"${detected.packageName}"`)
140
+ .join(', ');
141
+ console.warn(`\n⚠ Workflow removed ${packageDescriptions} from serverExternalPackages for this build.` +
142
+ `\n These packages contain workflow code and must be transformed by the workflow compiler.` +
143
+ `\n Remove ${packageNames} from serverExternalPackages in next.config to silence this warning.\n`);
144
+ }
9
145
  function resolveNextVersion(workingDir) {
10
146
  const errors = [];
11
147
  // Try resolving from the consuming project's working directory first.
@@ -36,9 +172,73 @@ function resolveNextVersion(workingDir) {
36
172
  }
37
173
  throw new AggregateError(errors, `Could not resolve Next.js version. Ensure \`next\` is installed in your project (working directory: ${workingDir}).`);
38
174
  }
175
+ function fileExists(path) {
176
+ try {
177
+ const stats = (0, node_fs_1.statSync)(path);
178
+ return stats.isFile();
179
+ }
180
+ catch {
181
+ return false;
182
+ }
183
+ }
184
+ function getWorkflowManifestCopyPaths({ projectDir, distDir, }) {
185
+ const manifestCandidates = [
186
+ (0, node_path_1.join)(projectDir, 'app/.well-known/workflow/v1/manifest.json'),
187
+ (0, node_path_1.join)(projectDir, 'src/app/.well-known/workflow/v1/manifest.json'),
188
+ (0, node_path_1.join)(projectDir, 'public/.well-known/workflow/v1/manifest.json'),
189
+ ];
190
+ const manifestPath = manifestCandidates.find(fileExists);
191
+ if (!manifestPath) {
192
+ return;
193
+ }
194
+ const resolvedDistDir = (0, node_path_1.isAbsolute)(distDir)
195
+ ? distDir
196
+ : (0, node_path_1.join)(projectDir, distDir);
197
+ const diagnosticsManifestPath = (0, node_path_1.join)(resolvedDistDir, 'diagnostics', 'workflows-manifest.json');
198
+ return { manifestPath, diagnosticsManifestPath };
199
+ }
200
+ async function copyWorkflowDiagnosticsManifest(metadata) {
201
+ const paths = getWorkflowManifestCopyPaths(metadata);
202
+ if (!paths) {
203
+ return;
204
+ }
205
+ const { manifestPath, diagnosticsManifestPath } = paths;
206
+ await (0, promises_1.mkdir)((0, node_path_1.dirname)(diagnosticsManifestPath), { recursive: true });
207
+ await (0, promises_1.copyFile)(manifestPath, diagnosticsManifestPath);
208
+ }
209
+ function copyWorkflowDiagnosticsManifestSync(metadata) {
210
+ const paths = getWorkflowManifestCopyPaths(metadata);
211
+ if (!paths) {
212
+ return;
213
+ }
214
+ const { manifestPath, diagnosticsManifestPath } = paths;
215
+ (0, node_fs_1.mkdirSync)((0, node_path_1.dirname)(diagnosticsManifestPath), { recursive: true });
216
+ (0, node_fs_1.copyFileSync)(manifestPath, diagnosticsManifestPath);
217
+ }
218
+ function registerWorkflowDiagnosticsManifestCopy(metadata) {
219
+ const marker = '__workflowDiagnosticsManifestCopies';
220
+ const globalWithMarker = globalThis;
221
+ if (!globalWithMarker[marker]) {
222
+ globalWithMarker[marker] = [];
223
+ process.once('exit', () => {
224
+ for (const copyMetadata of globalWithMarker[marker] || []) {
225
+ copyWorkflowDiagnosticsManifestSync(copyMetadata);
226
+ }
227
+ });
228
+ }
229
+ globalWithMarker[marker].push(metadata);
230
+ }
39
231
  function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
40
- if (workflows?.lazyDiscovery) {
41
- process.env.WORKFLOW_NEXT_LAZY_DISCOVERY = '1';
232
+ const lazyDiscoveryOverride = (0, environment_flag_js_1.parseEnvironmentFlag)(process.env.WORKFLOW_NEXT_LAZY_DISCOVERY);
233
+ if (lazyDiscoveryOverride === undefined) {
234
+ if (workflows?.lazyDiscovery) {
235
+ process.env.WORKFLOW_NEXT_LAZY_DISCOVERY = '1';
236
+ }
237
+ }
238
+ else {
239
+ process.env.WORKFLOW_NEXT_LAZY_DISCOVERY = lazyDiscoveryOverride
240
+ ? '1'
241
+ : '0';
42
242
  }
43
243
  if (!process.env.VERCEL_DEPLOYMENT_ID) {
44
244
  if (!process.env.WORKFLOW_TARGET_WORLD) {
@@ -67,6 +267,45 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
67
267
  }
68
268
  // shallow clone to avoid read-only on top-level
69
269
  nextConfig = Object.assign({}, nextConfig);
270
+ nextConfig.serverExternalPackages = [
271
+ ...new Set([
272
+ ...(nextConfig.serverExternalPackages || []),
273
+ // Keep the Vercel world and its native-prone dependencies external so
274
+ // local builds do not try to parse @vercel/queue's keyring dependency
275
+ // tree.
276
+ ...VERCEL_WORLD_SERVER_EXTERNAL_PACKAGES,
277
+ ]),
278
+ ];
279
+ const existingCompiler = nextConfig.compiler ?? {};
280
+ const existingRunAfterProductionCompile = existingCompiler.runAfterProductionCompile;
281
+ const configuredServerExternalPackages = Array.isArray(nextConfig.serverExternalPackages)
282
+ ? nextConfig.serverExternalPackages
283
+ : [];
284
+ let effectiveServerExternalPackages = configuredServerExternalPackages;
285
+ if (configuredServerExternalPackages.length > 0) {
286
+ const detectedWorkflowPackages = [];
287
+ for (const packageName of configuredServerExternalPackages) {
288
+ if (PSEUDO_EXTERNAL_PACKAGES.has(packageName)) {
289
+ continue;
290
+ }
291
+ try {
292
+ const detected = await detectServerExternalPackage(packageName, process.cwd());
293
+ if (detected) {
294
+ detectedWorkflowPackages.push(detected);
295
+ }
296
+ }
297
+ catch {
298
+ // Best-effort only. Never block config generation.
299
+ }
300
+ }
301
+ if (detectedWorkflowPackages.length > 0) {
302
+ const removedPackages = new Set(detectedWorkflowPackages.map((detected) => detected.packageName));
303
+ effectiveServerExternalPackages =
304
+ configuredServerExternalPackages.filter((packageName) => !removedPackages.has(packageName));
305
+ nextConfig.serverExternalPackages = effectiveServerExternalPackages;
306
+ warnAboutAutoRemovedServerExternalPackages(detectedWorkflowPackages);
307
+ }
308
+ }
70
309
  // configure the loader if turbopack is being used
71
310
  if (!nextConfig.turbopack) {
72
311
  nextConfig.turbopack = {};
@@ -84,6 +323,16 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
84
323
  const shouldWatch = process.env.NODE_ENV === 'development';
85
324
  let workflowBuilderPromise;
86
325
  const distDir = nextConfig.distDir || '.next';
326
+ nextConfig.compiler = {
327
+ ...existingCompiler,
328
+ runAfterProductionCompile: async (metadata) => {
329
+ if (existingRunAfterProductionCompile) {
330
+ await existingRunAfterProductionCompile(metadata);
331
+ }
332
+ await copyWorkflowDiagnosticsManifest(metadata);
333
+ registerWorkflowDiagnosticsManifestCopy(metadata);
334
+ },
335
+ };
87
336
  const getWorkflowBuilder = async () => {
88
337
  if (!workflowBuilderPromise) {
89
338
  workflowBuilderPromise = (async () => {
@@ -100,6 +349,7 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
100
349
  workflowsBundlePath: '', // not used in base
101
350
  stepsBundlePath: '', // not used in base
102
351
  webhookBundlePath: '', // node used in base
352
+ sourcemap: workflows?.sourcemap,
103
353
  suppressCreateWorkflowsBundleLogs: useDeferredBuilder,
104
354
  suppressCreateWorkflowsBundleWarnings: useDeferredBuilder,
105
355
  suppressCreateWebhookBundleLogs: useDeferredBuilder,
@@ -111,7 +361,7 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
111
361
  // See: https://nextjs.org/docs/app/getting-started/server-and-client-components
112
362
  'server-only',
113
363
  'client-only',
114
- ...(nextConfig.serverExternalPackages || []),
364
+ ...effectiveServerExternalPackages,
115
365
  ],
116
366
  });
117
367
  })();
@@ -201,7 +451,7 @@ function withWorkflow(nextConfigOrFn, { workflows, } = {}) {
201
451
  loader: loaderPath,
202
452
  });
203
453
  return existingWebpackModify
204
- ? existingWebpackModify(...args)
454
+ ? (existingWebpackModify(...args) ?? webpackConfig)
205
455
  : webpackConfig;
206
456
  };
207
457
  // only run this in the main process so it only runs once
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;AA6CA,oCA+NC;AA3QD,oDAA4B;AAC5B,6CAIsB;AAEtB,SAAS,kBAAkB,CAAC,UAAkB;IAC5C,MAAM,MAAM,GAAc,EAAE,CAAC;IAE7B,sEAAsE;IACtE,sEAAsE;IACtE,qCAAqC;IACrC,IAAI,CAAC;QACH,MAAM,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC,mBAAmB,EAAE;YAC3D,KAAK,EAAE,CAAC,UAAU,CAAC;SACpB,CAAC,CAAC;QACH,MAAM,mBAAmB,GAAG,OAAO,CAAC,eAAe,CAElD,CAAC;QACF,IAAI,OAAO,mBAAmB,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;YACpD,OAAO,mBAAmB,CAAC,OAAO,CAAC;QACrC,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,8DAA8D;IAC9D,IAAI,CAAC;QACH,MAAM,OAAO,GAAI,OAAO,CAAC,mBAAmB,CAA2B;aACpE,OAAO,CAAC;QACX,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;YAChC,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;IAED,MAAM,IAAI,cAAc,CACtB,MAAM,EACN,uGAAuG,UAAU,IAAI,CACtH,CAAC;AACJ,CAAC;AAED,SAAgB,YAAY,CAC1B,cAK6B,EAC7B,EACE,SAAS,MAQP,EAAE;IAEN,IAAI,SAAS,EAAE,aAAa,EAAE,CAAC;QAC7B,OAAO,CAAC,GAAG,CAAC,4BAA4B,GAAG,GAAG,CAAC;IACjD,CAAC;IAED,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,EAAE,CAAC;QACtC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,OAAO,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,uBAAuB,GAAG,qBAAqB,CAAC;QAC9D,CAAC;QACD,MAAM,SAAS,GAAG,SAAS,EAAE,KAAK,EAAE,IAAI,CAAC;QACzC,IAAI,SAAS,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,SAAS,CAAC,QAAQ,EAAE,CAAC;QAC1C,CAAC;IACH,CAAC;SAAM,CAAC;QACN,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,CAAC;YACvC,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,QAAQ,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,OAAO,KAAK,UAAU,WAAW,CAC/B,KAAa,EACb,GAAkC;QAElC,MAAM,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,4BAA+D,CAAC;QAEpE,IAAI,UAAsB,CAAC;QAE3B,IAAI,OAAO,cAAc,KAAK,UAAU,EAAE,CAAC;YACzC,UAAU,GAAG,MAAM,cAAc,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAChD,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,cAAc,CAAC;QAC9B,CAAC;QACD,gDAAgD;QAChD,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC;QAE3C,kDAAkD;QAClD,IAAI,CAAC,UAAU,CAAC,SAAS,EAAE,CAAC;YAC1B,UAAU,CAAC,SAAS,GAAG,EAAE,CAAC;QAC5B,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC;YAChC,UAAU,CAAC,SAAS,CAAC,KAAK,GAAG,EAAE,CAAC;QAClC,CAAC;QACD,MAAM,aAAa,GAAG,UAAU,CAAC,SAAS,CAAC,KAAY,CAAC;QACxD,MAAM,WAAW,GAAG,kBAAkB,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;QACtD,MAAM,sBAAsB,GAAG,gBAAM,CAAC,GAAG,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QAClE,MAAM,kBAAkB,GAAG,IAAA,qCAAwB,EAAC,WAAW,CAAC,CAAC;QAEjE,uEAAuE;QACvE,uEAAuE;QACvE,MAAM,yBAAyB,GAC7B,sBAAsB,IAAI,CAAC,kBAAkB,CAAC;QAChD,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,aAAa,CAAC;QAC3D,IAAI,sBAAgD,CAAC;QACrD,MAAM,OAAO,GAAG,UAAU,CAAC,OAAO,IAAI,OAAO,CAAC;QAE9C,MAAM,kBAAkB,GAAG,KAAK,IAAI,EAAE;YACpC,IAAI,CAAC,sBAAsB,EAAE,CAAC;gBAC5B,sBAAsB,GAAG,CAAC,KAAK,IAAI,EAAE;oBACnC,MAAM,WAAW,GAAG,MAAM,IAAA,2BAAc,EAAC,WAAW,CAAC,CAAC;oBACtD,OAAO,IAAI,WAAW,CAAC;wBACrB,KAAK,EAAE,WAAW;wBAClB,4CAA4C;wBAC5C,IAAI,EAAE,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,SAAS,CAAC;wBAC9C,WAAW,EAAE,UAAU,CAAC,qBAAqB;wBAC7C,UAAU,EAAE,OAAO,CAAC,GAAG,EAAE;wBACzB,OAAO;wBACP,cAAc,EAAE,GAAG,OAAO,cAAc;wBACxC,WAAW,EAAE,MAAM;wBACnB,mBAAmB,EAAE,EAAE,EAAE,mBAAmB;wBAC5C,eAAe,EAAE,EAAE,EAAE,mBAAmB;wBACxC,iBAAiB,EAAE,EAAE,EAAE,oBAAoB;wBAC3C,iCAAiC,EAAE,kBAAkB;wBACrD,qCAAqC,EAAE,kBAAkB;wBACzD,+BAA+B,EAAE,kBAAkB;wBACnD,0BAA0B,EAAE,kBAAkB;wBAC9C,gBAAgB,EAAE;4BAChB,qEAAqE;4BACrE,wEAAwE;4BACxE,qDAAqD;4BACrD,gFAAgF;4BAChF,aAAa;4BACb,aAAa;4BACb,GAAG,CAAC,UAAU,CAAC,sBAAsB,IAAI,EAAE,CAAC;yBAC7C;qBACF,CAAC,CAAC;gBACL,CAAC,CAAC,EAAE,CAAC;YACP,CAAC;YAED,OAAO,sBAAsB,CAAC;QAChC,CAAC,CAAC;QAEF,IAAI,kBAAkB,EAAE,CAAC;YACvB,4BAA4B,GAAG,KAAK,IAAI,EAAE;gBACxC,MAAM,eAAe,GAAG,MAAM,kBAAkB,EAAE,CAAC;gBACnD,IAAI,OAAO,eAAe,CAAC,uBAAuB,KAAK,UAAU,EAAE,CAAC;oBAClE,MAAM,eAAe,CAAC,uBAAuB,EAAE,CAAC;gBAClD,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,oBAAoB,GAAG,CAAC,UAAU,CAAC,YAAY,IAAI,EAAE,CAG1D,CAAC;YACF,MAAM,uBAAuB,GAAG,KAAK,CAAC,OAAO,CAC3C,oBAAoB,CAAC,eAAe,CACrC;gBACC,CAAC,CAAC,oBAAoB,CAAC,eAAe;gBACtC,CAAC,CAAC,EAAE,CAAC;YACP,MAAM,+BAA+B,GACnC,OAAO,oBAAoB,CAAC,uBAAuB,KAAK,UAAU;gBAChE,CAAC,CAAC,oBAAoB,CAAC,uBAAuB;gBAC9C,CAAC,CAAC,SAAS,CAAC;YAEhB,UAAU,CAAC,YAAY,GAAG;gBACxB,GAAG,oBAAoB;gBAEvB,kGAAkG;gBAClG,sDAAsD;gBACtD,eAAe,EAAE;oBACf,GAAG,IAAI,GAAG,CAAC;wBACT,GAAG,uBAAuB;wBAC1B,GAAG,sCAAyB;qBAC7B,CAAC;iBACH;gBACD,uBAAuB,EAAE,KAAK,EAAE,GAAG,IAAe,EAAE,EAAE;oBACpD,IAAI,+BAA+B,EAAE,CAAC;wBACpC,MAAM,+BAA+B,CAAC,GAAG,IAAI,CAAC,CAAC;oBACjD,CAAC;oBACD,IAAI,4BAA4B,EAAE,CAAC;wBACjC,MAAM,4BAA4B,EAAE,CAAC;oBACvC,CAAC;gBACH,CAAC;aACF,CAAC;QACJ,CAAC;QAED,KAAK,MAAM,GAAG,IAAI;YAChB,OAAO;YACP,MAAM;YACN,OAAO;YACP,MAAM;YACN,OAAO;YACP,OAAO;YACP,OAAO;YACP,OAAO;SACR,EAAE,CAAC;YACF,UAAU,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG;gBAChC,GAAG,CAAC,yBAAyB;oBAC3B,CAAC,CAAC;wBACE,SAAS,EAAE;4BACT,6EAA6E;4BAC7E,4DAA4D;4BAC5D,GAAG,EAAE;gCACH,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,CAAC;gCAC7C,6DAA6D;gCAC7D,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,qCAAqC,EAAE,EAAE;gCACxD,wEAAwE;gCACxE,8DAA8D;gCAC9D;oCACE,OAAO,EACL,4HAA4H;iCAC/H;6BACF;yBACF;qBACF;oBACH,CAAC,CAAC,EAAE,CAAC;gBACP,OAAO,EAAE,CAAC,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,EAAE,OAAO,IAAI,EAAE,CAAC,EAAE,UAAU,CAAC;aAC9D,CAAC;QACJ,CAAC;QAED,mCAAmC;QACnC,MAAM,qBAAqB,GAAG,UAAU,CAAC,OAAO,CAAC;QACjD,UAAU,CAAC,OAAO,GAAG,CAAC,GAAG,IAAI,EAAE,EAAE;YAC/B,MAAM,CAAC,aAAa,CAAC,GAAG,IAAI,CAAC;YAC7B,IAAI,CAAC,aAAa,CAAC,MAAM,EAAE,CAAC;gBAC1B,aAAa,CAAC,MAAM,GAAG,EAAE,CAAC;YAC5B,CAAC;YACD,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;gBAChC,aAAa,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;YAClC,CAAC;YACD,gDAAgD;YAChD,8CAA8C;YAC9C,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC;gBAC9B,IAAI,EAAE,kCAAkC;gBACxC,MAAM,EAAE,UAAU;aACnB,CAAC,CAAC;YAEH,OAAO,qBAAqB;gBAC1B,CAAC,CAAC,qBAAqB,CAAC,GAAG,IAAI,CAAC;gBAChC,CAAC,CAAC,aAAa,CAAC;QACpB,CAAC,CAAC;QACF,yDAAyD;QACzD,uDAAuD;QACvD,IACE,CAAC,OAAO,CAAC,GAAG,CAAC,2BAA2B;YACxC,KAAK,KAAK,yBAAyB,EACnC,CAAC;YACD,MAAM,eAAe,GAAG,MAAM,kBAAkB,EAAE,CAAC;YAEnD,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC;YAC9B,OAAO,CAAC,GAAG,CAAC,2BAA2B,GAAG,GAAG,CAAC;QAChD,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { NextConfig } from 'next';\nimport semver from 'semver';\nimport {\n getNextBuilder,\n shouldUseDeferredBuilder,\n WORKFLOW_DEFERRED_ENTRIES,\n} from './builder.js';\n\nfunction resolveNextVersion(workingDir: string): string {\n const errors: unknown[] = [];\n\n // Try resolving from the consuming project's working directory first.\n // This handles monorepo setups where `next` may not be hoisted to the\n // same location as `@workflow/next`.\n try {\n const packageJsonPath = require.resolve('next/package.json', {\n paths: [workingDir],\n });\n const resolvedPackageJson = require(packageJsonPath) as {\n version?: unknown;\n };\n if (typeof resolvedPackageJson.version === 'string') {\n return resolvedPackageJson.version;\n }\n } catch (e) {\n errors.push(e);\n }\n\n // Fall back to resolving relative to this package's location.\n try {\n const version = (require('next/package.json') as { version?: unknown })\n .version;\n if (typeof version === 'string') {\n return version;\n }\n } catch (e) {\n errors.push(e);\n }\n\n throw new AggregateError(\n errors,\n `Could not resolve Next.js version. Ensure \\`next\\` is installed in your project (working directory: ${workingDir}).`\n );\n}\n\nexport function withWorkflow(\n nextConfigOrFn:\n | NextConfig\n | ((\n phase: string,\n ctx: { defaultConfig: NextConfig }\n ) => Promise<NextConfig>),\n {\n workflows,\n }: {\n workflows?: {\n lazyDiscovery?: boolean;\n local?: {\n port?: number;\n };\n };\n } = {}\n) {\n if (workflows?.lazyDiscovery) {\n process.env.WORKFLOW_NEXT_LAZY_DISCOVERY = '1';\n }\n\n if (!process.env.VERCEL_DEPLOYMENT_ID) {\n if (!process.env.WORKFLOW_TARGET_WORLD) {\n process.env.WORKFLOW_TARGET_WORLD = 'local';\n process.env.WORKFLOW_LOCAL_DATA_DIR = '.next/workflow-data';\n }\n const maybePort = workflows?.local?.port;\n if (maybePort) {\n process.env.PORT = maybePort.toString();\n }\n } else {\n if (!process.env.WORKFLOW_TARGET_WORLD) {\n process.env.WORKFLOW_TARGET_WORLD = 'vercel';\n }\n }\n\n return async function buildConfig(\n phase: string,\n ctx: { defaultConfig: NextConfig }\n ) {\n const loaderPath = require.resolve('./loader');\n let runDeferredBuildFromCallback: (() => Promise<void>) | undefined;\n\n let nextConfig: NextConfig;\n\n if (typeof nextConfigOrFn === 'function') {\n nextConfig = await nextConfigOrFn(phase, ctx);\n } else {\n nextConfig = nextConfigOrFn;\n }\n // shallow clone to avoid read-only on top-level\n nextConfig = Object.assign({}, nextConfig);\n\n // configure the loader if turbopack is being used\n if (!nextConfig.turbopack) {\n nextConfig.turbopack = {};\n }\n if (!nextConfig.turbopack.rules) {\n nextConfig.turbopack.rules = {};\n }\n const existingRules = nextConfig.turbopack.rules as any;\n const nextVersion = resolveNextVersion(process.cwd());\n const supportsTurboCondition = semver.gte(nextVersion, 'v16.0.0');\n const useDeferredBuilder = shouldUseDeferredBuilder(nextVersion);\n\n // Deferred builder discovers files via loader socket notifications, so\n // turbopack content conditions are only needed with the eager builder.\n const shouldApplyTurboCondition =\n supportsTurboCondition && !useDeferredBuilder;\n const shouldWatch = process.env.NODE_ENV === 'development';\n let workflowBuilderPromise: Promise<any> | undefined;\n const distDir = nextConfig.distDir || '.next';\n\n const getWorkflowBuilder = async () => {\n if (!workflowBuilderPromise) {\n workflowBuilderPromise = (async () => {\n const NextBuilder = await getNextBuilder(nextVersion);\n return new NextBuilder({\n watch: shouldWatch,\n // discover workflows from pages/app entries\n dirs: ['pages', 'app', 'src/pages', 'src/app'],\n projectRoot: nextConfig.outputFileTracingRoot,\n workingDir: process.cwd(),\n distDir,\n diagnosticsDir: `${distDir}/diagnostics`,\n buildTarget: 'next',\n workflowsBundlePath: '', // not used in base\n stepsBundlePath: '', // not used in base\n webhookBundlePath: '', // node used in base\n suppressCreateWorkflowsBundleLogs: useDeferredBuilder,\n suppressCreateWorkflowsBundleWarnings: useDeferredBuilder,\n suppressCreateWebhookBundleLogs: useDeferredBuilder,\n suppressCreateManifestLogs: useDeferredBuilder,\n externalPackages: [\n // server-only and client-only are pseudo-packages handled by Next.js\n // during its build process. We mark them as external to prevent esbuild\n // from failing when bundling code that imports them.\n // See: https://nextjs.org/docs/app/getting-started/server-and-client-components\n 'server-only',\n 'client-only',\n ...(nextConfig.serverExternalPackages || []),\n ],\n });\n })();\n }\n\n return workflowBuilderPromise;\n };\n\n if (useDeferredBuilder) {\n runDeferredBuildFromCallback = async () => {\n const workflowBuilder = await getWorkflowBuilder();\n if (typeof workflowBuilder.onBeforeDeferredEntries === 'function') {\n await workflowBuilder.onBeforeDeferredEntries();\n }\n };\n\n const existingExperimental = (nextConfig.experimental ?? {}) as Record<\n string,\n any\n >;\n const existingDeferredEntries = Array.isArray(\n existingExperimental.deferredEntries\n )\n ? existingExperimental.deferredEntries\n : [];\n const existingOnBeforeDeferredEntries =\n typeof existingExperimental.onBeforeDeferredEntries === 'function'\n ? existingExperimental.onBeforeDeferredEntries\n : undefined;\n\n nextConfig.experimental = {\n ...existingExperimental,\n\n // biome-ignore lint/suspicious/noTsIgnore: expect-error is wrong as it will work on valid version\n // @ts-ignore this is only available in canary Next.js\n deferredEntries: [\n ...new Set([\n ...existingDeferredEntries,\n ...WORKFLOW_DEFERRED_ENTRIES,\n ]),\n ],\n onBeforeDeferredEntries: async (...args: unknown[]) => {\n if (existingOnBeforeDeferredEntries) {\n await existingOnBeforeDeferredEntries(...args);\n }\n if (runDeferredBuildFromCallback) {\n await runDeferredBuildFromCallback();\n }\n },\n };\n }\n\n for (const key of [\n '*.tsx',\n '*.ts',\n '*.jsx',\n '*.js',\n '*.mjs',\n '*.mts',\n '*.cjs',\n '*.cts',\n ]) {\n nextConfig.turbopack.rules[key] = {\n ...(shouldApplyTurboCondition\n ? {\n condition: {\n // Use 'all' to combine: must match content AND must NOT be in generated path\n // Merge with any existing 'all' conditions from user config\n all: [\n ...(existingRules[key]?.condition?.all || []),\n // Exclude generated workflow route files from transformation\n { not: { path: /[/\\\\]\\.well-known[/\\\\]workflow[/\\\\]/ } },\n // Match files with workflow directives or custom serialization patterns\n // Uses backreferences (\\2, \\3) to ensure matching quote types\n {\n content:\n /(use workflow|use step|from\\s+(['\"])@workflow\\/serde\\2|Symbol\\.for\\s*\\(\\s*(['\"])workflow-(?:serialize|deserialize)\\3\\s*\\))/,\n },\n ],\n },\n }\n : {}),\n loaders: [...(existingRules[key]?.loaders || []), loaderPath],\n };\n }\n\n // configure the loader for webpack\n const existingWebpackModify = nextConfig.webpack;\n nextConfig.webpack = (...args) => {\n const [webpackConfig] = args;\n if (!webpackConfig.module) {\n webpackConfig.module = {};\n }\n if (!webpackConfig.module.rules) {\n webpackConfig.module.rules = [];\n }\n // loaders in webpack apply bottom->up so ensure\n // ours comes before the default swc transform\n webpackConfig.module.rules.push({\n test: /.*\\.(mjs|cjs|cts|ts|tsx|js|jsx)$/,\n loader: loaderPath,\n });\n\n return existingWebpackModify\n ? existingWebpackModify(...args)\n : webpackConfig;\n };\n // only run this in the main process so it only runs once\n // as Next.js uses child processes for different builds\n if (\n !process.env.WORKFLOW_NEXT_PRIVATE_BUILT &&\n phase !== 'phase-production-server'\n ) {\n const workflowBuilder = await getWorkflowBuilder();\n\n await workflowBuilder.build();\n process.env.WORKFLOW_NEXT_PRIVATE_BUILT = '1';\n }\n\n return nextConfig;\n };\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { copyFileSync, mkdirSync, statSync } from 'node:fs';\nimport { copyFile, mkdir, readFile } from 'node:fs/promises';\nimport { dirname, isAbsolute, join } from 'node:path';\nimport type { NextConfig } from 'next';\nimport semver from 'semver';\nimport {\n getNextBuilder,\n shouldUseDeferredBuilder,\n WORKFLOW_DEFERRED_ENTRIES,\n} from './builder.js';\nimport { parseEnvironmentFlag } from './environment-flag.js';\n\nconst VERCEL_WORLD_PACKAGE = '@workflow/world-vercel';\nconst VERCEL_WORLD_DEPENDENCY_PACKAGES = [\n '@vercel/queue',\n '@vercel/oidc',\n '@vercel/cli-auth',\n '@napi-rs/keyring',\n];\nconst VERCEL_WORLD_SERVER_EXTERNAL_PACKAGES = [\n VERCEL_WORLD_PACKAGE,\n ...VERCEL_WORLD_DEPENDENCY_PACKAGES,\n];\n\nconst useWorkflowPattern = /^\\s*(['\"])use workflow\\1;?\\s*$/m;\nconst useStepPattern = /^\\s*(['\"])use step\\1;?\\s*$/m;\nconst workflowSerdeImportPattern = /from\\s+(['\"])@workflow\\/serde\\1/;\nconst workflowSerdeSymbolPattern =\n /Symbol\\.for\\s*\\(\\s*(['\"])workflow-(?:serialize|deserialize)\\1\\s*\\)/;\nconst workflowSerdeComputedPropertyPattern =\n /\\[\\s*WORKFLOW_(?:SERIALIZE|DESERIALIZE)\\s*\\]/;\n\nconst PSEUDO_EXTERNAL_PACKAGES = new Set(['server-only', 'client-only']);\nconst warnedAutoRemovedServerExternalPackages = new Set<string>();\n\ninterface WorkflowPatternMatch {\n hasUseWorkflow: boolean;\n hasUseStep: boolean;\n hasSerde: boolean;\n}\n\ninterface DetectedServerExternalPackage {\n packageName: string;\n hasUseWorkflow: boolean;\n hasUseStep: boolean;\n hasSerde: boolean;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction isResolvablePackageSpecifier(specifier: string): boolean {\n if (specifier.startsWith('.') || specifier.startsWith('/')) {\n return false;\n }\n if (specifier.startsWith('$')) {\n return false;\n }\n if (specifier.includes('*') || specifier.includes(':')) {\n return false;\n }\n\n return true;\n}\n\nfunction detectWorkflowPatterns(source: string): WorkflowPatternMatch {\n const hasUseWorkflow = useWorkflowPattern.test(source);\n const hasUseStep = useStepPattern.test(source);\n const hasSerdeImport = workflowSerdeImportPattern.test(source);\n const hasSerdeSymbol = workflowSerdeSymbolPattern.test(source);\n const hasSerdeComputedProperty =\n workflowSerdeComputedPropertyPattern.test(source);\n\n return {\n hasUseWorkflow,\n hasUseStep,\n hasSerde: hasSerdeImport || hasSerdeSymbol || hasSerdeComputedProperty,\n };\n}\n\nfunction getIssueLabels(detected: DetectedServerExternalPackage): string[] {\n const issues: string[] = [];\n if (detected.hasUseWorkflow) {\n issues.push('\"use workflow\" functions');\n }\n if (detected.hasUseStep) {\n issues.push('\"use step\" functions');\n }\n if (detected.hasSerde) {\n issues.push('serialization classes');\n }\n return issues;\n}\n\nfunction hasWorkflowSerdeDependency(packageJson: unknown): boolean {\n if (!isPlainObject(packageJson)) {\n return false;\n }\n\n const dependencies = isPlainObject(packageJson.dependencies)\n ? packageJson.dependencies\n : {};\n const peerDependencies = isPlainObject(packageJson.peerDependencies)\n ? packageJson.peerDependencies\n : {};\n\n return (\n Object.hasOwn(dependencies, '@workflow/serde') ||\n Object.hasOwn(peerDependencies, '@workflow/serde')\n );\n}\n\nasync function detectServerExternalPackage(\n packageName: string,\n workingDir: string\n): Promise<DetectedServerExternalPackage | null> {\n if (!isResolvablePackageSpecifier(packageName)) {\n return null;\n }\n\n let hasUseWorkflow = false;\n let hasUseStep = false;\n let hasSerde = false;\n\n try {\n const packageJsonPath = require.resolve(`${packageName}/package.json`, {\n paths: [workingDir],\n });\n const packageJsonSource = await readFile(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(packageJsonSource) as unknown;\n hasSerde = hasWorkflowSerdeDependency(packageJson);\n } catch {\n // Best-effort only. Continue to source scanning.\n }\n\n try {\n const entryPath = require.resolve(packageName, {\n paths: [workingDir],\n });\n const source = await readFile(entryPath, 'utf-8');\n const patterns = detectWorkflowPatterns(source);\n hasUseWorkflow = patterns.hasUseWorkflow;\n hasUseStep = patterns.hasUseStep;\n hasSerde ||= patterns.hasSerde;\n } catch {\n // Best-effort only. Use whichever signal we already have.\n }\n\n if (!hasUseWorkflow && !hasUseStep && !hasSerde) {\n return null;\n }\n\n return {\n packageName,\n hasUseWorkflow,\n hasUseStep,\n hasSerde,\n };\n}\n\nfunction warnAboutAutoRemovedServerExternalPackages(\n detectedPackages: DetectedServerExternalPackage[]\n): void {\n const newlyDetectedPackages = detectedPackages.filter(({ packageName }) => {\n return !warnedAutoRemovedServerExternalPackages.has(packageName);\n });\n\n if (newlyDetectedPackages.length === 0) {\n return;\n }\n\n for (const { packageName } of newlyDetectedPackages) {\n warnedAutoRemovedServerExternalPackages.add(packageName);\n }\n\n const packageDescriptions = newlyDetectedPackages\n .map(\n (detected) =>\n `\"${detected.packageName}\" (${getIssueLabels(detected).join(', ')})`\n )\n .join(', ');\n const packageNames = newlyDetectedPackages\n .map((detected) => `\"${detected.packageName}\"`)\n .join(', ');\n\n console.warn(\n `\\n⚠ Workflow removed ${packageDescriptions} from serverExternalPackages for this build.` +\n `\\n These packages contain workflow code and must be transformed by the workflow compiler.` +\n `\\n Remove ${packageNames} from serverExternalPackages in next.config to silence this warning.\\n`\n );\n}\n\nfunction resolveNextVersion(workingDir: string): string {\n const errors: unknown[] = [];\n\n // Try resolving from the consuming project's working directory first.\n // This handles monorepo setups where `next` may not be hoisted to the\n // same location as `@workflow/next`.\n try {\n const packageJsonPath = require.resolve('next/package.json', {\n paths: [workingDir],\n });\n const resolvedPackageJson = require(packageJsonPath) as {\n version?: unknown;\n };\n if (typeof resolvedPackageJson.version === 'string') {\n return resolvedPackageJson.version;\n }\n } catch (e) {\n errors.push(e);\n }\n\n // Fall back to resolving relative to this package's location.\n try {\n const version = (require('next/package.json') as { version?: unknown })\n .version;\n if (typeof version === 'string') {\n return version;\n }\n } catch (e) {\n errors.push(e);\n }\n\n throw new AggregateError(\n errors,\n `Could not resolve Next.js version. Ensure \\`next\\` is installed in your project (working directory: ${workingDir}).`\n );\n}\n\nfunction fileExists(path: string): boolean {\n try {\n const stats = statSync(path);\n return stats.isFile();\n } catch {\n return false;\n }\n}\n\nfunction getWorkflowManifestCopyPaths({\n projectDir,\n distDir,\n}: {\n projectDir: string;\n distDir: string;\n}): { manifestPath: string; diagnosticsManifestPath: string } | undefined {\n const manifestCandidates = [\n join(projectDir, 'app/.well-known/workflow/v1/manifest.json'),\n join(projectDir, 'src/app/.well-known/workflow/v1/manifest.json'),\n join(projectDir, 'public/.well-known/workflow/v1/manifest.json'),\n ];\n const manifestPath = manifestCandidates.find(fileExists);\n\n if (!manifestPath) {\n return;\n }\n\n const resolvedDistDir = isAbsolute(distDir)\n ? distDir\n : join(projectDir, distDir);\n const diagnosticsManifestPath = join(\n resolvedDistDir,\n 'diagnostics',\n 'workflows-manifest.json'\n );\n return { manifestPath, diagnosticsManifestPath };\n}\n\nasync function copyWorkflowDiagnosticsManifest(metadata: {\n projectDir: string;\n distDir: string;\n}): Promise<void> {\n const paths = getWorkflowManifestCopyPaths(metadata);\n if (!paths) {\n return;\n }\n\n const { manifestPath, diagnosticsManifestPath } = paths;\n await mkdir(dirname(diagnosticsManifestPath), { recursive: true });\n await copyFile(manifestPath, diagnosticsManifestPath);\n}\n\nfunction copyWorkflowDiagnosticsManifestSync(metadata: {\n projectDir: string;\n distDir: string;\n}): void {\n const paths = getWorkflowManifestCopyPaths(metadata);\n if (!paths) {\n return;\n }\n\n const { manifestPath, diagnosticsManifestPath } = paths;\n mkdirSync(dirname(diagnosticsManifestPath), { recursive: true });\n copyFileSync(manifestPath, diagnosticsManifestPath);\n}\n\nfunction registerWorkflowDiagnosticsManifestCopy(metadata: {\n projectDir: string;\n distDir: string;\n}): void {\n const marker = '__workflowDiagnosticsManifestCopies';\n const globalWithMarker = globalThis as typeof globalThis & {\n [marker]?: Array<{ projectDir: string; distDir: string }>;\n };\n\n if (!globalWithMarker[marker]) {\n globalWithMarker[marker] = [];\n process.once('exit', () => {\n for (const copyMetadata of globalWithMarker[marker] || []) {\n copyWorkflowDiagnosticsManifestSync(copyMetadata);\n }\n });\n }\n\n globalWithMarker[marker].push(metadata);\n}\n\nexport function withWorkflow(\n nextConfigOrFn:\n | NextConfig\n | ((\n phase: string,\n ctx: { defaultConfig: NextConfig }\n ) => Promise<NextConfig>),\n {\n workflows,\n }: {\n workflows?: {\n lazyDiscovery?: boolean;\n local?: {\n port?: number;\n };\n /**\n * Controls how source maps are emitted for workflow bundles. Accepts\n * the same values as esbuild's `sourcemap` option: `true`/`'inline'`\n * (default), `'linked'`, `'external'`, `'both'`, or `false` to omit\n * source maps. Can also be set via the `WORKFLOW_SOURCEMAP`\n * environment variable.\n */\n sourcemap?: boolean | 'inline' | 'linked' | 'external' | 'both';\n };\n } = {}\n) {\n const lazyDiscoveryOverride = parseEnvironmentFlag(\n process.env.WORKFLOW_NEXT_LAZY_DISCOVERY\n );\n if (lazyDiscoveryOverride === undefined) {\n if (workflows?.lazyDiscovery) {\n process.env.WORKFLOW_NEXT_LAZY_DISCOVERY = '1';\n }\n } else {\n process.env.WORKFLOW_NEXT_LAZY_DISCOVERY = lazyDiscoveryOverride\n ? '1'\n : '0';\n }\n\n if (!process.env.VERCEL_DEPLOYMENT_ID) {\n if (!process.env.WORKFLOW_TARGET_WORLD) {\n process.env.WORKFLOW_TARGET_WORLD = 'local';\n process.env.WORKFLOW_LOCAL_DATA_DIR = '.next/workflow-data';\n }\n const maybePort = workflows?.local?.port;\n if (maybePort) {\n process.env.PORT = maybePort.toString();\n }\n } else {\n if (!process.env.WORKFLOW_TARGET_WORLD) {\n process.env.WORKFLOW_TARGET_WORLD = 'vercel';\n }\n }\n\n return async function buildConfig(\n phase: string,\n ctx: { defaultConfig: NextConfig }\n ) {\n const loaderPath = require.resolve('./loader');\n let runDeferredBuildFromCallback: (() => Promise<void>) | undefined;\n\n let nextConfig: NextConfig;\n\n if (typeof nextConfigOrFn === 'function') {\n nextConfig = await nextConfigOrFn(phase, ctx);\n } else {\n nextConfig = nextConfigOrFn;\n }\n // shallow clone to avoid read-only on top-level\n nextConfig = Object.assign({}, nextConfig);\n nextConfig.serverExternalPackages = [\n ...new Set([\n ...(nextConfig.serverExternalPackages || []),\n // Keep the Vercel world and its native-prone dependencies external so\n // local builds do not try to parse @vercel/queue's keyring dependency\n // tree.\n ...VERCEL_WORLD_SERVER_EXTERNAL_PACKAGES,\n ]),\n ];\n const existingCompiler = nextConfig.compiler ?? {};\n const existingRunAfterProductionCompile = (\n existingCompiler as {\n runAfterProductionCompile?: (metadata: {\n projectDir: string;\n distDir: string;\n }) => Promise<void>;\n }\n ).runAfterProductionCompile;\n\n const configuredServerExternalPackages = Array.isArray(\n nextConfig.serverExternalPackages\n )\n ? nextConfig.serverExternalPackages\n : [];\n let effectiveServerExternalPackages = configuredServerExternalPackages;\n\n if (configuredServerExternalPackages.length > 0) {\n const detectedWorkflowPackages: DetectedServerExternalPackage[] = [];\n for (const packageName of configuredServerExternalPackages) {\n if (PSEUDO_EXTERNAL_PACKAGES.has(packageName)) {\n continue;\n }\n\n try {\n const detected = await detectServerExternalPackage(\n packageName,\n process.cwd()\n );\n if (detected) {\n detectedWorkflowPackages.push(detected);\n }\n } catch {\n // Best-effort only. Never block config generation.\n }\n }\n\n if (detectedWorkflowPackages.length > 0) {\n const removedPackages = new Set(\n detectedWorkflowPackages.map((detected) => detected.packageName)\n );\n effectiveServerExternalPackages =\n configuredServerExternalPackages.filter(\n (packageName) => !removedPackages.has(packageName)\n );\n nextConfig.serverExternalPackages = effectiveServerExternalPackages;\n warnAboutAutoRemovedServerExternalPackages(detectedWorkflowPackages);\n }\n }\n\n // configure the loader if turbopack is being used\n if (!nextConfig.turbopack) {\n nextConfig.turbopack = {};\n }\n if (!nextConfig.turbopack.rules) {\n nextConfig.turbopack.rules = {};\n }\n const existingRules = nextConfig.turbopack.rules as any;\n const nextVersion = resolveNextVersion(process.cwd());\n const supportsTurboCondition = semver.gte(nextVersion, 'v16.0.0');\n const useDeferredBuilder = shouldUseDeferredBuilder(nextVersion);\n\n // Deferred builder discovers files via loader socket notifications, so\n // turbopack content conditions are only needed with the eager builder.\n const shouldApplyTurboCondition =\n supportsTurboCondition && !useDeferredBuilder;\n const shouldWatch = process.env.NODE_ENV === 'development';\n let workflowBuilderPromise: Promise<any> | undefined;\n const distDir = nextConfig.distDir || '.next';\n\n nextConfig.compiler = {\n ...existingCompiler,\n runAfterProductionCompile: async (metadata) => {\n if (existingRunAfterProductionCompile) {\n await existingRunAfterProductionCompile(metadata);\n }\n await copyWorkflowDiagnosticsManifest(metadata);\n registerWorkflowDiagnosticsManifestCopy(metadata);\n },\n };\n\n const getWorkflowBuilder = async () => {\n if (!workflowBuilderPromise) {\n workflowBuilderPromise = (async () => {\n const NextBuilder = await getNextBuilder(nextVersion);\n return new NextBuilder({\n watch: shouldWatch,\n // discover workflows from pages/app entries\n dirs: ['pages', 'app', 'src/pages', 'src/app'],\n projectRoot: nextConfig.outputFileTracingRoot,\n workingDir: process.cwd(),\n distDir,\n diagnosticsDir: `${distDir}/diagnostics`,\n buildTarget: 'next',\n workflowsBundlePath: '', // not used in base\n stepsBundlePath: '', // not used in base\n webhookBundlePath: '', // node used in base\n sourcemap: workflows?.sourcemap,\n suppressCreateWorkflowsBundleLogs: useDeferredBuilder,\n suppressCreateWorkflowsBundleWarnings: useDeferredBuilder,\n suppressCreateWebhookBundleLogs: useDeferredBuilder,\n suppressCreateManifestLogs: useDeferredBuilder,\n externalPackages: [\n // server-only and client-only are pseudo-packages handled by Next.js\n // during its build process. We mark them as external to prevent esbuild\n // from failing when bundling code that imports them.\n // See: https://nextjs.org/docs/app/getting-started/server-and-client-components\n 'server-only',\n 'client-only',\n ...effectiveServerExternalPackages,\n ],\n });\n })();\n }\n\n return workflowBuilderPromise;\n };\n\n if (useDeferredBuilder) {\n runDeferredBuildFromCallback = async () => {\n const workflowBuilder = await getWorkflowBuilder();\n if (typeof workflowBuilder.onBeforeDeferredEntries === 'function') {\n await workflowBuilder.onBeforeDeferredEntries();\n }\n };\n\n const existingExperimental = (nextConfig.experimental ?? {}) as Record<\n string,\n any\n >;\n const existingDeferredEntries = Array.isArray(\n existingExperimental.deferredEntries\n )\n ? existingExperimental.deferredEntries\n : [];\n const existingOnBeforeDeferredEntries =\n typeof existingExperimental.onBeforeDeferredEntries === 'function'\n ? existingExperimental.onBeforeDeferredEntries\n : undefined;\n\n nextConfig.experimental = {\n ...existingExperimental,\n\n // biome-ignore lint/suspicious/noTsIgnore: expect-error is wrong as it will work on valid version\n // @ts-ignore this is only available in canary Next.js\n deferredEntries: [\n ...new Set([\n ...existingDeferredEntries,\n ...WORKFLOW_DEFERRED_ENTRIES,\n ]),\n ],\n onBeforeDeferredEntries: async (...args: unknown[]) => {\n if (existingOnBeforeDeferredEntries) {\n await existingOnBeforeDeferredEntries(...args);\n }\n if (runDeferredBuildFromCallback) {\n await runDeferredBuildFromCallback();\n }\n },\n };\n }\n\n for (const key of [\n '*.tsx',\n '*.ts',\n '*.jsx',\n '*.js',\n '*.mjs',\n '*.mts',\n '*.cjs',\n '*.cts',\n ]) {\n nextConfig.turbopack.rules[key] = {\n ...(shouldApplyTurboCondition\n ? {\n condition: {\n // Use 'all' to combine: must match content AND must NOT be in generated path\n // Merge with any existing 'all' conditions from user config\n all: [\n ...(existingRules[key]?.condition?.all || []),\n // Exclude generated workflow route files from transformation\n { not: { path: /[/\\\\]\\.well-known[/\\\\]workflow[/\\\\]/ } },\n // Match files with workflow directives or custom serialization patterns\n // Uses backreferences (\\2, \\3) to ensure matching quote types\n {\n content:\n /(use workflow|use step|from\\s+(['\"])@workflow\\/serde\\2|Symbol\\.for\\s*\\(\\s*(['\"])workflow-(?:serialize|deserialize)\\3\\s*\\))/,\n },\n ],\n },\n }\n : {}),\n loaders: [...(existingRules[key]?.loaders || []), loaderPath],\n };\n }\n\n // configure the loader for webpack\n const existingWebpackModify = nextConfig.webpack;\n nextConfig.webpack = (...args) => {\n const [webpackConfig] = args;\n if (!webpackConfig.module) {\n webpackConfig.module = {};\n }\n if (!webpackConfig.module.rules) {\n webpackConfig.module.rules = [];\n }\n // loaders in webpack apply bottom->up so ensure\n // ours comes before the default swc transform\n webpackConfig.module.rules.push({\n test: /.*\\.(mjs|cjs|cts|ts|tsx|js|jsx)$/,\n loader: loaderPath,\n });\n\n return existingWebpackModify\n ? (existingWebpackModify(...args) ?? webpackConfig)\n : webpackConfig;\n };\n // only run this in the main process so it only runs once\n // as Next.js uses child processes for different builds\n if (\n !process.env.WORKFLOW_NEXT_PRIVATE_BUILT &&\n phase !== 'phase-production-server'\n ) {\n const workflowBuilder = await getWorkflowBuilder();\n\n await workflowBuilder.build();\n process.env.WORKFLOW_NEXT_PRIVATE_BUILT = '1';\n }\n\n return nextConfig;\n };\n}\n"]}
@@ -27,6 +27,15 @@ const workflowConfig = {}
27
27
  export default withWorkflow(nextConfig, workflowConfig); // [!code highlight]
28
28
  ```
29
29
 
30
+ <Callout type="warn">
31
+ If a package in `serverExternalPackages` contains workflow code (`"use step"`,
32
+ `"use workflow"`, or serialization classes), `withWorkflow()` automatically
33
+ removes it from `serverExternalPackages` for the current build and prints a
34
+ warning. This ensures the package still gets transformed by the Workflow
35
+ compiler. Remove that package from `serverExternalPackages` in your
36
+ `next.config` to silence the warning.
37
+ </Callout>
38
+
30
39
  ### Monorepos and Workspace Imports
31
40
 
32
41
  By default, Next.js detects the correct workspace root automatically. If your Next.js app lives in a subdirectory such as `apps/web` and workspace resolution is not working correctly, you can set `outputFileTracingRoot` as a workaround:
@@ -63,6 +72,7 @@ export default withWorkflow(nextConfig, {
63
72
  local: {
64
73
  port: 4000,
65
74
  },
75
+ sourcemap: false,
66
76
  },
67
77
  });
68
78
  ```
@@ -71,6 +81,27 @@ export default withWorkflow(nextConfig, {
71
81
  | --- | --- | --- | --- |
72
82
  | `workflows.lazyDiscovery` | `boolean` | `false` | When `true`, defers workflow discovery until files are requested instead of scanning eagerly at startup. Useful for large projects where startup time matters. |
73
83
  | `workflows.local.port` | `number` | — | Overrides the `PORT` environment variable for local development. Has no effect when deployed to Vercel. |
84
+ | `workflows.sourcemap` | `boolean \| 'inline' \| 'linked' \| 'external' \| 'both'` | `'inline'` | Controls source maps on generated workflow bundles. See [Source maps](#source-maps) below. |
85
+
86
+ ### Source maps
87
+
88
+ The step bundle and intermediate workflow bundle default to `'inline'` source maps so that stack traces from step errors and workflow VM errors point at your source files. The `sourcemap` option lets you change that:
89
+
90
+ | Value | Behavior |
91
+ | --- | --- |
92
+ | `true` / `'inline'` | Base64-encode the source map and append it to the bundle (default). |
93
+ | `'linked'` | Write a separate `.map` file and add a `sourceMappingURL` comment. |
94
+ | `'external'` | Write a separate `.map` file without the comment. |
95
+ | `'both'` | Emit both inline and external source maps. |
96
+ | `false` | Omit source maps entirely. |
97
+
98
+ Setting `sourcemap: false` is the main escape hatch for users hitting the Vercel 250MB function size limit — it drops the inline source map from every bundle and also skips the source-map-support runtime shim on the Vercel step function. The tradeoff is that workflow VM stack traces will reference generated code (e.g. `evalmachine.<anonymous>`) rather than your source files.
99
+
100
+ <Callout type="info">
101
+ Setting `sourcemap` explicitly affects **all** generated bundles (steps, workflows, webhook). The legacy `WORKFLOW_EMIT_SOURCEMAPS_FOR_DEBUGGING=1` environment variable is narrower — it only toggles source maps on the final workflow wrapper and webhook bundle (which default to off). It continues to work, but new code should use the `sourcemap` option or the `WORKFLOW_SOURCEMAP` environment variable instead.
102
+ </Callout>
103
+
104
+ The option can also be set via the `WORKFLOW_SOURCEMAP` environment variable, which accepts the same values plus `'0'` / `'1'` as aliases for `false` / `true`. Precedence is: explicit config > `WORKFLOW_SOURCEMAP` > per-bundle default.
74
105
 
75
106
  <Callout type="info">
76
107
  The `workflows.local` options only affect local development. When deployed to Vercel, the runtime ignores `local` settings and uses the Vercel world automatically.
@@ -78,6 +109,7 @@ The `workflows.local` options only affect local development. When deployed to Ve
78
109
 
79
110
  ## Exporting a Function
80
111
 
112
+
81
113
  If you are exporting a function in your `next.config` you will need to ensure you call the function returned from `withWorkflow`.
82
114
 
83
115
  ```typescript title="next.config.ts" lineNumbers
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@workflow/next",
3
- "version": "5.0.0-beta.4",
3
+ "version": "5.0.0-beta.5",
4
4
  "description": "Next.js integration for Workflow SDK",
5
5
  "type": "commonjs",
6
6
  "main": "dist/index.js",
@@ -29,9 +29,9 @@
29
29
  "@swc/core": "1.15.3",
30
30
  "semver": "7.7.4",
31
31
  "watchpack": "2.5.1",
32
- "@workflow/builders": "5.0.0-beta.4",
33
- "@workflow/core": "5.0.0-beta.4",
34
- "@workflow/swc-plugin": "5.0.0-beta.3"
32
+ "@workflow/builders": "5.0.0-beta.5",
33
+ "@workflow/core": "5.0.0-beta.5",
34
+ "@workflow/swc-plugin": "5.0.0-beta.4"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@types/node": "22.19.0",