next 15.1.6 → 15.1.7

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.

Potentially problematic release.


This version of next might be problematic. Click here for more details.

Files changed (44) hide show
  1. package/dist/bin/next +1 -1
  2. package/dist/build/index.js +2 -2
  3. package/dist/build/swc/index.js +1 -1
  4. package/dist/build/webpack-config.js +2 -2
  5. package/dist/client/app-bootstrap.js +1 -1
  6. package/dist/client/index.js +1 -1
  7. package/dist/compiled/next-server/server.runtime.prod.js +1 -1
  8. package/dist/compiled/next-server/server.runtime.prod.js.map +1 -1
  9. package/dist/esm/build/index.js +2 -2
  10. package/dist/esm/build/swc/index.js +1 -1
  11. package/dist/esm/build/webpack-config.js +2 -2
  12. package/dist/esm/client/app-bootstrap.js +1 -1
  13. package/dist/esm/client/index.js +1 -1
  14. package/dist/esm/lib/verify-typescript-setup.js +1 -1
  15. package/dist/esm/lib/verify-typescript-setup.js.map +1 -1
  16. package/dist/esm/lib/worker.js +3 -2
  17. package/dist/esm/lib/worker.js.map +1 -1
  18. package/dist/esm/server/config.js +1 -1
  19. package/dist/esm/server/dev/hot-reloader-turbopack.js +1 -1
  20. package/dist/esm/server/dev/hot-reloader-webpack.js +1 -1
  21. package/dist/esm/server/lib/app-info-log.js +1 -1
  22. package/dist/esm/server/lib/start-server.js +1 -1
  23. package/dist/esm/server/send-response.js +4 -0
  24. package/dist/esm/server/send-response.js.map +1 -1
  25. package/dist/esm/server/web/sandbox/resource-managers.js +28 -2
  26. package/dist/esm/server/web/sandbox/resource-managers.js.map +1 -1
  27. package/dist/lib/verify-typescript-setup.js +1 -1
  28. package/dist/lib/verify-typescript-setup.js.map +1 -1
  29. package/dist/lib/worker.js +3 -2
  30. package/dist/lib/worker.js.map +1 -1
  31. package/dist/server/config.js +1 -1
  32. package/dist/server/dev/hot-reloader-turbopack.js +1 -1
  33. package/dist/server/dev/hot-reloader-webpack.js +1 -1
  34. package/dist/server/lib/app-info-log.js +1 -1
  35. package/dist/server/lib/start-server.js +1 -1
  36. package/dist/server/send-response.js +4 -0
  37. package/dist/server/send-response.js.map +1 -1
  38. package/dist/server/web/sandbox/resource-managers.d.ts +3 -3
  39. package/dist/server/web/sandbox/resource-managers.js +28 -2
  40. package/dist/server/web/sandbox/resource-managers.js.map +1 -1
  41. package/dist/telemetry/anonymous-meta.js +1 -1
  42. package/dist/telemetry/events/session-stopped.js +2 -2
  43. package/dist/telemetry/events/version.js +2 -2
  44. package/package.json +15 -15
@@ -289,7 +289,7 @@ export default async function build(dir, reactProductionProfiling = false, debug
289
289
  const nextBuildSpan = trace('next-build', undefined, {
290
290
  buildMode: experimentalBuildMode,
291
291
  isTurboBuild: String(turboNextBuild),
292
- version: "15.1.6"
292
+ version: "15.1.7"
293
293
  });
294
294
  NextBuildContext.nextBuildSpan = nextBuildSpan;
295
295
  NextBuildContext.dir = dir;
@@ -627,7 +627,7 @@ export default async function build(dir, reactProductionProfiling = false, debug
627
627
  // Files outside of the distDir can be "type": "module"
628
628
  await writeFileUtf8(path.join(distDir, 'package.json'), '{"type": "commonjs"}');
629
629
  // These are written to distDir, so they need to come after creating and cleaning distDr.
630
- await recordFrameworkVersion("15.1.6");
630
+ await recordFrameworkVersion("15.1.7");
631
631
  await updateBuildDiagnostics({
632
632
  buildStage: 'start'
633
633
  });
@@ -11,7 +11,7 @@ import { isDeepStrictEqual } from 'util';
11
11
  import { getDefineEnv } from '../webpack/plugins/define-env-plugin';
12
12
  import { getReactCompilerLoader } from '../get-babel-loader-config';
13
13
  import { TurbopackInternalError } from '../../server/dev/turbopack-utils';
14
- const nextVersion = "15.1.6";
14
+ const nextVersion = "15.1.7";
15
15
  const ArchName = arch();
16
16
  const PlatformName = platform();
17
17
  function infoLog(...args) {
@@ -1381,7 +1381,7 @@ export default async function getBaseWebpackConfig(dir, { buildId, encryptionKey
1381
1381
  isClient && new CopyFilePlugin({
1382
1382
  // file path to build output of `@next/polyfill-nomodule`
1383
1383
  filePath: require.resolve('./polyfills/polyfill-nomodule'),
1384
- cacheKey: "15.1.6",
1384
+ cacheKey: "15.1.7",
1385
1385
  name: `static/chunks/polyfills${dev ? '' : '-[hash]'}.js`,
1386
1386
  minimize: false,
1387
1387
  info: {
@@ -1609,7 +1609,7 @@ export default async function getBaseWebpackConfig(dir, { buildId, encryptionKey
1609
1609
  // - Next.js location on disk (some loaders use absolute paths and some resolve options depend on absolute paths)
1610
1610
  // - Next.js version
1611
1611
  // - next.config.js keys that affect compilation
1612
- version: `${__dirname}|${"15.1.6"}|${configVars}`,
1612
+ version: `${__dirname}|${"15.1.7"}|${configVars}`,
1613
1613
  cacheDirectory: path.join(distDir, 'cache', 'webpack'),
1614
1614
  // For production builds, it's more efficient to compress all cache files together instead of compression each one individually.
1615
1615
  // So we disable compression here and allow the build runner to take care of compressing the cache as a whole.
@@ -3,7 +3,7 @@
3
3
  * sure the following scripts are executed in the correct order:
4
4
  * - Polyfills
5
5
  * - next/script with `beforeInteractive` strategy
6
- */ const version = "15.1.6";
6
+ */ const version = "15.1.7";
7
7
  window.next = {
8
8
  version,
9
9
  appDir: true
@@ -27,7 +27,7 @@ import { onRecoverableError } from './react-client-callbacks/shared';
27
27
  import tracer from './tracing/tracer';
28
28
  import reportToSocket from './tracing/report-to-socket';
29
29
  import { isNextRouterError } from './components/is-next-router-error';
30
- export const version = "15.1.6";
30
+ export const version = "15.1.7";
31
31
  export let router;
32
32
  export const emitter = mitt();
33
33
  const looseToArray = (input)=>[].slice.call(input);
@@ -93,7 +93,7 @@ export async function verifyTypeScriptSetup({ dir, distDir, cacheDir, intentDirs
93
93
  * or run in a worker (during next build). In the latter case, we need to print the error message, as the
94
94
  * parent process will only receive an `Jest worker encountered 1 child process exceptions, exceeding retry limit`.
95
95
  */ // we are in a worker, print the error message and exit the process
96
- if (process.env.JEST_WORKER_ID) {
96
+ if (process.env.IS_NEXT_WORKER) {
97
97
  if (err instanceof Error) {
98
98
  console.error(err.message);
99
99
  } else {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/verify-typescript-setup.ts"],"sourcesContent":["import { bold, cyan, red, yellow } from './picocolors'\nimport path from 'path'\n\nimport { hasNecessaryDependencies } from './has-necessary-dependencies'\nimport type { NecessaryDependencies } from './has-necessary-dependencies'\nimport semver from 'next/dist/compiled/semver'\nimport { CompileError } from './compile-error'\nimport * as log from '../build/output/log'\n\nimport { getTypeScriptIntent } from './typescript/getTypeScriptIntent'\nimport type { TypeCheckResult } from './typescript/runTypeCheck'\nimport { writeAppTypeDeclarations } from './typescript/writeAppTypeDeclarations'\nimport { writeConfigurationDefaults } from './typescript/writeConfigurationDefaults'\nimport { installDependencies } from './install-dependencies'\nimport { isCI } from '../server/ci-info'\nimport { missingDepsError } from './typescript/missingDependencyError'\n\nconst requiredPackages = [\n {\n file: 'typescript/lib/typescript.js',\n pkg: 'typescript',\n exportsRestrict: true,\n },\n {\n file: '@types/react/index.d.ts',\n pkg: '@types/react',\n exportsRestrict: true,\n },\n {\n file: '@types/node/index.d.ts',\n pkg: '@types/node',\n exportsRestrict: true,\n },\n]\n\nexport async function verifyTypeScriptSetup({\n dir,\n distDir,\n cacheDir,\n intentDirs,\n tsconfigPath,\n typeCheckPreflight,\n disableStaticImages,\n hasAppDir,\n hasPagesDir,\n}: {\n dir: string\n distDir: string\n cacheDir?: string\n tsconfigPath: string\n intentDirs: string[]\n typeCheckPreflight: boolean\n disableStaticImages: boolean\n hasAppDir: boolean\n hasPagesDir: boolean\n}): Promise<{ result?: TypeCheckResult; version: string | null }> {\n const resolvedTsConfigPath = path.join(dir, tsconfigPath)\n\n try {\n // Check if the project uses TypeScript:\n const intent = await getTypeScriptIntent(dir, intentDirs, tsconfigPath)\n if (!intent) {\n return { version: null }\n }\n\n // Ensure TypeScript and necessary `@types/*` are installed:\n let deps: NecessaryDependencies = await hasNecessaryDependencies(\n dir,\n requiredPackages\n )\n\n if (deps.missing?.length > 0) {\n if (isCI) {\n // we don't attempt auto install in CI to avoid side-effects\n // and instead log the error for installing needed packages\n missingDepsError(dir, deps.missing)\n }\n console.log(\n bold(\n yellow(\n `It looks like you're trying to use TypeScript but do not have the required package(s) installed.`\n )\n ) +\n '\\n' +\n 'Installing dependencies' +\n '\\n\\n' +\n bold(\n 'If you are not trying to use TypeScript, please remove the ' +\n cyan('tsconfig.json') +\n ' file from your package root (and any TypeScript files in your app and pages directories).'\n ) +\n '\\n'\n )\n await installDependencies(dir, deps.missing, true).catch((err) => {\n if (err && typeof err === 'object' && 'command' in err) {\n console.error(\n `Failed to install required TypeScript dependencies, please install them manually to continue:\\n` +\n (err as any).command +\n '\\n'\n )\n }\n throw err\n })\n deps = await hasNecessaryDependencies(dir, requiredPackages)\n }\n\n // Load TypeScript after we're sure it exists:\n const tsPath = deps.resolved.get('typescript')!\n const ts = (await Promise.resolve(\n require(tsPath)\n )) as typeof import('typescript')\n\n if (semver.lt(ts.version, '4.5.2')) {\n log.warn(\n `Minimum recommended TypeScript version is v4.5.2, older versions can potentially be incompatible with Next.js. Detected: ${ts.version}`\n )\n }\n\n // Reconfigure (or create) the user's `tsconfig.json` for them:\n await writeConfigurationDefaults(\n ts,\n resolvedTsConfigPath,\n intent.firstTimeSetup,\n hasAppDir,\n distDir,\n hasPagesDir\n )\n // Write out the necessary `next-env.d.ts` file to correctly register\n // Next.js' types:\n await writeAppTypeDeclarations({\n baseDir: dir,\n imageImportsEnabled: !disableStaticImages,\n hasPagesDir,\n hasAppDir,\n })\n\n let result\n if (typeCheckPreflight) {\n const { runTypeCheck } = require('./typescript/runTypeCheck')\n\n // Verify the project passes type-checking before we go to webpack phase:\n result = await runTypeCheck(\n ts,\n dir,\n distDir,\n resolvedTsConfigPath,\n cacheDir,\n hasAppDir\n )\n }\n return { result, version: ts.version }\n } catch (err) {\n // These are special errors that should not show a stack trace:\n if (err instanceof CompileError) {\n console.error(red('Failed to compile.\\n'))\n console.error(err.message)\n process.exit(1)\n }\n\n /**\n * verifyTypeScriptSetup can be either invoked directly in the main thread (during next dev / next lint)\n * or run in a worker (during next build). In the latter case, we need to print the error message, as the\n * parent process will only receive an `Jest worker encountered 1 child process exceptions, exceeding retry limit`.\n */\n\n // we are in a worker, print the error message and exit the process\n if (process.env.JEST_WORKER_ID) {\n if (err instanceof Error) {\n console.error(err.message)\n } else {\n console.error(err)\n }\n process.exit(1)\n }\n // we are in the main thread, throw the error and it will be handled by the caller\n throw err\n }\n}\n"],"names":["bold","cyan","red","yellow","path","hasNecessaryDependencies","semver","CompileError","log","getTypeScriptIntent","writeAppTypeDeclarations","writeConfigurationDefaults","installDependencies","isCI","missingDepsError","requiredPackages","file","pkg","exportsRestrict","verifyTypeScriptSetup","dir","distDir","cacheDir","intentDirs","tsconfigPath","typeCheckPreflight","disableStaticImages","hasAppDir","hasPagesDir","resolvedTsConfigPath","join","deps","intent","version","missing","length","console","catch","err","error","command","tsPath","resolved","get","ts","Promise","resolve","require","lt","warn","firstTimeSetup","baseDir","imageImportsEnabled","result","runTypeCheck","message","process","exit","env","JEST_WORKER_ID","Error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/lib/verify-typescript-setup.ts"],"sourcesContent":["import { bold, cyan, red, yellow } from './picocolors'\nimport path from 'path'\n\nimport { hasNecessaryDependencies } from './has-necessary-dependencies'\nimport type { NecessaryDependencies } from './has-necessary-dependencies'\nimport semver from 'next/dist/compiled/semver'\nimport { CompileError } from './compile-error'\nimport * as log from '../build/output/log'\n\nimport { getTypeScriptIntent } from './typescript/getTypeScriptIntent'\nimport type { TypeCheckResult } from './typescript/runTypeCheck'\nimport { writeAppTypeDeclarations } from './typescript/writeAppTypeDeclarations'\nimport { writeConfigurationDefaults } from './typescript/writeConfigurationDefaults'\nimport { installDependencies } from './install-dependencies'\nimport { isCI } from '../server/ci-info'\nimport { missingDepsError } from './typescript/missingDependencyError'\n\nconst requiredPackages = [\n {\n file: 'typescript/lib/typescript.js',\n pkg: 'typescript',\n exportsRestrict: true,\n },\n {\n file: '@types/react/index.d.ts',\n pkg: '@types/react',\n exportsRestrict: true,\n },\n {\n file: '@types/node/index.d.ts',\n pkg: '@types/node',\n exportsRestrict: true,\n },\n]\n\nexport async function verifyTypeScriptSetup({\n dir,\n distDir,\n cacheDir,\n intentDirs,\n tsconfigPath,\n typeCheckPreflight,\n disableStaticImages,\n hasAppDir,\n hasPagesDir,\n}: {\n dir: string\n distDir: string\n cacheDir?: string\n tsconfigPath: string\n intentDirs: string[]\n typeCheckPreflight: boolean\n disableStaticImages: boolean\n hasAppDir: boolean\n hasPagesDir: boolean\n}): Promise<{ result?: TypeCheckResult; version: string | null }> {\n const resolvedTsConfigPath = path.join(dir, tsconfigPath)\n\n try {\n // Check if the project uses TypeScript:\n const intent = await getTypeScriptIntent(dir, intentDirs, tsconfigPath)\n if (!intent) {\n return { version: null }\n }\n\n // Ensure TypeScript and necessary `@types/*` are installed:\n let deps: NecessaryDependencies = await hasNecessaryDependencies(\n dir,\n requiredPackages\n )\n\n if (deps.missing?.length > 0) {\n if (isCI) {\n // we don't attempt auto install in CI to avoid side-effects\n // and instead log the error for installing needed packages\n missingDepsError(dir, deps.missing)\n }\n console.log(\n bold(\n yellow(\n `It looks like you're trying to use TypeScript but do not have the required package(s) installed.`\n )\n ) +\n '\\n' +\n 'Installing dependencies' +\n '\\n\\n' +\n bold(\n 'If you are not trying to use TypeScript, please remove the ' +\n cyan('tsconfig.json') +\n ' file from your package root (and any TypeScript files in your app and pages directories).'\n ) +\n '\\n'\n )\n await installDependencies(dir, deps.missing, true).catch((err) => {\n if (err && typeof err === 'object' && 'command' in err) {\n console.error(\n `Failed to install required TypeScript dependencies, please install them manually to continue:\\n` +\n (err as any).command +\n '\\n'\n )\n }\n throw err\n })\n deps = await hasNecessaryDependencies(dir, requiredPackages)\n }\n\n // Load TypeScript after we're sure it exists:\n const tsPath = deps.resolved.get('typescript')!\n const ts = (await Promise.resolve(\n require(tsPath)\n )) as typeof import('typescript')\n\n if (semver.lt(ts.version, '4.5.2')) {\n log.warn(\n `Minimum recommended TypeScript version is v4.5.2, older versions can potentially be incompatible with Next.js. Detected: ${ts.version}`\n )\n }\n\n // Reconfigure (or create) the user's `tsconfig.json` for them:\n await writeConfigurationDefaults(\n ts,\n resolvedTsConfigPath,\n intent.firstTimeSetup,\n hasAppDir,\n distDir,\n hasPagesDir\n )\n // Write out the necessary `next-env.d.ts` file to correctly register\n // Next.js' types:\n await writeAppTypeDeclarations({\n baseDir: dir,\n imageImportsEnabled: !disableStaticImages,\n hasPagesDir,\n hasAppDir,\n })\n\n let result\n if (typeCheckPreflight) {\n const { runTypeCheck } = require('./typescript/runTypeCheck')\n\n // Verify the project passes type-checking before we go to webpack phase:\n result = await runTypeCheck(\n ts,\n dir,\n distDir,\n resolvedTsConfigPath,\n cacheDir,\n hasAppDir\n )\n }\n return { result, version: ts.version }\n } catch (err) {\n // These are special errors that should not show a stack trace:\n if (err instanceof CompileError) {\n console.error(red('Failed to compile.\\n'))\n console.error(err.message)\n process.exit(1)\n }\n\n /**\n * verifyTypeScriptSetup can be either invoked directly in the main thread (during next dev / next lint)\n * or run in a worker (during next build). In the latter case, we need to print the error message, as the\n * parent process will only receive an `Jest worker encountered 1 child process exceptions, exceeding retry limit`.\n */\n\n // we are in a worker, print the error message and exit the process\n if (process.env.IS_NEXT_WORKER) {\n if (err instanceof Error) {\n console.error(err.message)\n } else {\n console.error(err)\n }\n process.exit(1)\n }\n // we are in the main thread, throw the error and it will be handled by the caller\n throw err\n }\n}\n"],"names":["bold","cyan","red","yellow","path","hasNecessaryDependencies","semver","CompileError","log","getTypeScriptIntent","writeAppTypeDeclarations","writeConfigurationDefaults","installDependencies","isCI","missingDepsError","requiredPackages","file","pkg","exportsRestrict","verifyTypeScriptSetup","dir","distDir","cacheDir","intentDirs","tsconfigPath","typeCheckPreflight","disableStaticImages","hasAppDir","hasPagesDir","resolvedTsConfigPath","join","deps","intent","version","missing","length","console","catch","err","error","command","tsPath","resolved","get","ts","Promise","resolve","require","lt","warn","firstTimeSetup","baseDir","imageImportsEnabled","result","runTypeCheck","message","process","exit","env","IS_NEXT_WORKER","Error"],"mappings":"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"}
@@ -27,7 +27,8 @@ export class Worker {
27
27
  ...farmOptions.forkOptions,
28
28
  env: {
29
29
  ...((_farmOptions_forkOptions = farmOptions.forkOptions) == null ? void 0 : _farmOptions_forkOptions.env) || {},
30
- ...process.env
30
+ ...process.env,
31
+ IS_NEXT_WORKER: 'true'
31
32
  }
32
33
  },
33
34
  maxRetries: 0
@@ -49,7 +50,7 @@ export class Worker {
49
50
  _worker__child1;
50
51
  (_worker__child = worker._child) == null ? void 0 : _worker__child.on('exit', (code, signal)=>{
51
52
  if ((code || signal && signal !== 'SIGINT') && this._worker) {
52
- logger.error(`Static worker exited with code: ${code} and signal: ${signal}`);
53
+ logger.error(`Next.js build worker exited with code: ${code} and signal: ${signal}`);
53
54
  // if a child process doesn't exit gracefully, we want to bubble up the exit code to the parent process
54
55
  process.exit(code ?? 1);
55
56
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/worker.ts"],"sourcesContent":["import type { ChildProcess } from 'child_process'\nimport { Worker as JestWorker } from 'next/dist/compiled/jest-worker'\nimport { Transform } from 'stream'\n\ntype FarmOptions = ConstructorParameters<typeof JestWorker>[1]\n\nconst RESTARTED = Symbol('restarted')\n\nconst cleanupWorkers = (worker: JestWorker) => {\n for (const curWorker of ((worker as any)._workerPool?._workers || []) as {\n _child?: ChildProcess\n }[]) {\n curWorker._child?.kill('SIGINT')\n }\n}\n\nexport class Worker {\n private _worker: JestWorker | undefined\n\n constructor(\n workerPath: string,\n options: FarmOptions & {\n timeout?: number\n onActivity?: () => void\n onActivityAbort?: () => void\n onRestart?: (method: string, args: any[], attempts: number) => void\n logger?: Pick<typeof console, 'error' | 'info' | 'warn'>\n exposedMethods: ReadonlyArray<string>\n enableWorkerThreads?: boolean\n }\n ) {\n let { timeout, onRestart, logger = console, ...farmOptions } = options\n\n let restartPromise: Promise<typeof RESTARTED>\n let resolveRestartPromise: (arg: typeof RESTARTED) => void\n let activeTasks = 0\n\n this._worker = undefined\n\n // ensure we end workers if they weren't before exit\n process.on('exit', () => {\n this.close()\n })\n\n const createWorker = () => {\n this._worker = new JestWorker(workerPath, {\n ...farmOptions,\n forkOptions: {\n ...farmOptions.forkOptions,\n env: {\n ...((farmOptions.forkOptions?.env || {}) as any),\n ...process.env,\n } as any,\n },\n maxRetries: 0,\n }) as JestWorker\n restartPromise = new Promise(\n (resolve) => (resolveRestartPromise = resolve)\n )\n\n /**\n * Jest Worker has two worker types, ChildProcessWorker (uses child_process) and NodeThreadWorker (uses worker_threads)\n * Next.js uses ChildProcessWorker by default, but it can be switched to NodeThreadWorker with an experimental flag\n *\n * We only want to handle ChildProcessWorker's orphan process issue, so we access the private property \"_child\":\n * https://github.com/facebook/jest/blob/b38d7d345a81d97d1dc3b68b8458b1837fbf19be/packages/jest-worker/src/workers/ChildProcessWorker.ts\n *\n * But this property is not available in NodeThreadWorker, so we need to check if we are using ChildProcessWorker\n */\n if (!farmOptions.enableWorkerThreads) {\n for (const worker of ((this._worker as any)._workerPool?._workers ||\n []) as {\n _child?: ChildProcess\n }[]) {\n worker._child?.on('exit', (code, signal) => {\n if ((code || (signal && signal !== 'SIGINT')) && this._worker) {\n logger.error(\n `Static worker exited with code: ${code} and signal: ${signal}`\n )\n\n // if a child process doesn't exit gracefully, we want to bubble up the exit code to the parent process\n process.exit(code ?? 1)\n }\n })\n\n // if a child process emits a particular message, we track that as activity\n // so the parent process can keep track of progress\n worker._child?.on('message', ([, data]: [number, unknown]) => {\n if (\n data &&\n typeof data === 'object' &&\n 'type' in data &&\n data.type === 'activity'\n ) {\n onActivity()\n }\n })\n }\n }\n\n let aborted = false\n const onActivityAbort = () => {\n if (!aborted) {\n options.onActivityAbort?.()\n aborted = true\n }\n }\n\n // Listen to the worker's stdout and stderr, if there's any thing logged, abort the activity first\n const abortActivityStreamOnLog = new Transform({\n transform(_chunk, _encoding, callback) {\n onActivityAbort()\n callback()\n },\n })\n // Stop the activity if there's any output from the worker\n this._worker.getStdout().pipe(abortActivityStreamOnLog)\n this._worker.getStderr().pipe(abortActivityStreamOnLog)\n\n // Pipe the worker's stdout and stderr to the parent process\n this._worker.getStdout().pipe(process.stdout)\n this._worker.getStderr().pipe(process.stderr)\n }\n createWorker()\n\n const onHanging = () => {\n const worker = this._worker\n if (!worker) return\n const resolve = resolveRestartPromise\n createWorker()\n logger.warn(\n `Sending SIGTERM signal to static worker due to timeout${\n timeout ? ` of ${timeout / 1000} seconds` : ''\n }. Subsequent errors may be a result of the worker exiting.`\n )\n worker.end().then(() => {\n resolve(RESTARTED)\n })\n }\n\n let hangingTimer: NodeJS.Timeout | false = false\n\n const onActivity = () => {\n if (hangingTimer) clearTimeout(hangingTimer)\n if (options.onActivity) options.onActivity()\n\n hangingTimer = activeTasks > 0 && setTimeout(onHanging, timeout)\n }\n\n for (const method of farmOptions.exposedMethods) {\n if (method.startsWith('_')) continue\n ;(this as any)[method] = timeout\n ? // eslint-disable-next-line no-loop-func\n async (...args: any[]) => {\n activeTasks++\n try {\n let attempts = 0\n for (;;) {\n onActivity()\n const result = await Promise.race([\n (this._worker as any)[method](...args),\n restartPromise,\n ])\n if (result !== RESTARTED) return result\n if (onRestart) onRestart(method, args, ++attempts)\n }\n } finally {\n activeTasks--\n onActivity()\n }\n }\n : (this._worker as any)[method].bind(this._worker)\n }\n }\n\n end(): ReturnType<JestWorker['end']> {\n const worker = this._worker\n if (!worker) {\n throw new Error('Farm is ended, no more calls can be done to it')\n }\n cleanupWorkers(worker)\n this._worker = undefined\n return worker.end()\n }\n\n /**\n * Quietly end the worker if it exists\n */\n close(): void {\n if (this._worker) {\n cleanupWorkers(this._worker)\n this._worker.end()\n }\n }\n}\n"],"names":["Worker","JestWorker","Transform","RESTARTED","Symbol","cleanupWorkers","worker","curWorker","_workerPool","_workers","_child","kill","constructor","workerPath","options","timeout","onRestart","logger","console","farmOptions","restartPromise","resolveRestartPromise","activeTasks","_worker","undefined","process","on","close","createWorker","forkOptions","env","maxRetries","Promise","resolve","enableWorkerThreads","code","signal","error","exit","data","type","onActivity","aborted","onActivityAbort","abortActivityStreamOnLog","transform","_chunk","_encoding","callback","getStdout","pipe","getStderr","stdout","stderr","onHanging","warn","end","then","hangingTimer","clearTimeout","setTimeout","method","exposedMethods","startsWith","args","attempts","result","race","bind","Error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/lib/worker.ts"],"sourcesContent":["import type { ChildProcess } from 'child_process'\nimport { Worker as JestWorker } from 'next/dist/compiled/jest-worker'\nimport { Transform } from 'stream'\n\ntype FarmOptions = ConstructorParameters<typeof JestWorker>[1]\n\nconst RESTARTED = Symbol('restarted')\n\nconst cleanupWorkers = (worker: JestWorker) => {\n for (const curWorker of ((worker as any)._workerPool?._workers || []) as {\n _child?: ChildProcess\n }[]) {\n curWorker._child?.kill('SIGINT')\n }\n}\n\nexport class Worker {\n private _worker: JestWorker | undefined\n\n constructor(\n workerPath: string,\n options: FarmOptions & {\n timeout?: number\n onActivity?: () => void\n onActivityAbort?: () => void\n onRestart?: (method: string, args: any[], attempts: number) => void\n logger?: Pick<typeof console, 'error' | 'info' | 'warn'>\n exposedMethods: ReadonlyArray<string>\n enableWorkerThreads?: boolean\n }\n ) {\n let { timeout, onRestart, logger = console, ...farmOptions } = options\n\n let restartPromise: Promise<typeof RESTARTED>\n let resolveRestartPromise: (arg: typeof RESTARTED) => void\n let activeTasks = 0\n\n this._worker = undefined\n\n // ensure we end workers if they weren't before exit\n process.on('exit', () => {\n this.close()\n })\n\n const createWorker = () => {\n this._worker = new JestWorker(workerPath, {\n ...farmOptions,\n forkOptions: {\n ...farmOptions.forkOptions,\n env: {\n ...((farmOptions.forkOptions?.env || {}) as any),\n ...process.env,\n IS_NEXT_WORKER: 'true',\n } as any,\n },\n maxRetries: 0,\n }) as JestWorker\n restartPromise = new Promise(\n (resolve) => (resolveRestartPromise = resolve)\n )\n\n /**\n * Jest Worker has two worker types, ChildProcessWorker (uses child_process) and NodeThreadWorker (uses worker_threads)\n * Next.js uses ChildProcessWorker by default, but it can be switched to NodeThreadWorker with an experimental flag\n *\n * We only want to handle ChildProcessWorker's orphan process issue, so we access the private property \"_child\":\n * https://github.com/facebook/jest/blob/b38d7d345a81d97d1dc3b68b8458b1837fbf19be/packages/jest-worker/src/workers/ChildProcessWorker.ts\n *\n * But this property is not available in NodeThreadWorker, so we need to check if we are using ChildProcessWorker\n */\n if (!farmOptions.enableWorkerThreads) {\n for (const worker of ((this._worker as any)._workerPool?._workers ||\n []) as {\n _child?: ChildProcess\n }[]) {\n worker._child?.on('exit', (code, signal) => {\n if ((code || (signal && signal !== 'SIGINT')) && this._worker) {\n logger.error(\n `Next.js build worker exited with code: ${code} and signal: ${signal}`\n )\n\n // if a child process doesn't exit gracefully, we want to bubble up the exit code to the parent process\n process.exit(code ?? 1)\n }\n })\n\n // if a child process emits a particular message, we track that as activity\n // so the parent process can keep track of progress\n worker._child?.on('message', ([, data]: [number, unknown]) => {\n if (\n data &&\n typeof data === 'object' &&\n 'type' in data &&\n data.type === 'activity'\n ) {\n onActivity()\n }\n })\n }\n }\n\n let aborted = false\n const onActivityAbort = () => {\n if (!aborted) {\n options.onActivityAbort?.()\n aborted = true\n }\n }\n\n // Listen to the worker's stdout and stderr, if there's any thing logged, abort the activity first\n const abortActivityStreamOnLog = new Transform({\n transform(_chunk, _encoding, callback) {\n onActivityAbort()\n callback()\n },\n })\n // Stop the activity if there's any output from the worker\n this._worker.getStdout().pipe(abortActivityStreamOnLog)\n this._worker.getStderr().pipe(abortActivityStreamOnLog)\n\n // Pipe the worker's stdout and stderr to the parent process\n this._worker.getStdout().pipe(process.stdout)\n this._worker.getStderr().pipe(process.stderr)\n }\n createWorker()\n\n const onHanging = () => {\n const worker = this._worker\n if (!worker) return\n const resolve = resolveRestartPromise\n createWorker()\n logger.warn(\n `Sending SIGTERM signal to static worker due to timeout${\n timeout ? ` of ${timeout / 1000} seconds` : ''\n }. Subsequent errors may be a result of the worker exiting.`\n )\n worker.end().then(() => {\n resolve(RESTARTED)\n })\n }\n\n let hangingTimer: NodeJS.Timeout | false = false\n\n const onActivity = () => {\n if (hangingTimer) clearTimeout(hangingTimer)\n if (options.onActivity) options.onActivity()\n\n hangingTimer = activeTasks > 0 && setTimeout(onHanging, timeout)\n }\n\n for (const method of farmOptions.exposedMethods) {\n if (method.startsWith('_')) continue\n ;(this as any)[method] = timeout\n ? // eslint-disable-next-line no-loop-func\n async (...args: any[]) => {\n activeTasks++\n try {\n let attempts = 0\n for (;;) {\n onActivity()\n const result = await Promise.race([\n (this._worker as any)[method](...args),\n restartPromise,\n ])\n if (result !== RESTARTED) return result\n if (onRestart) onRestart(method, args, ++attempts)\n }\n } finally {\n activeTasks--\n onActivity()\n }\n }\n : (this._worker as any)[method].bind(this._worker)\n }\n }\n\n end(): ReturnType<JestWorker['end']> {\n const worker = this._worker\n if (!worker) {\n throw new Error('Farm is ended, no more calls can be done to it')\n }\n cleanupWorkers(worker)\n this._worker = undefined\n return worker.end()\n }\n\n /**\n * Quietly end the worker if it exists\n */\n close(): void {\n if (this._worker) {\n cleanupWorkers(this._worker)\n this._worker.end()\n }\n }\n}\n"],"names":["Worker","JestWorker","Transform","RESTARTED","Symbol","cleanupWorkers","worker","curWorker","_workerPool","_workers","_child","kill","constructor","workerPath","options","timeout","onRestart","logger","console","farmOptions","restartPromise","resolveRestartPromise","activeTasks","_worker","undefined","process","on","close","createWorker","forkOptions","env","IS_NEXT_WORKER","maxRetries","Promise","resolve","enableWorkerThreads","code","signal","error","exit","data","type","onActivity","aborted","onActivityAbort","abortActivityStreamOnLog","transform","_chunk","_encoding","callback","getStdout","pipe","getStderr","stdout","stderr","onHanging","warn","end","then","hangingTimer","clearTimeout","setTimeout","method","exposedMethods","startsWith","args","attempts","result","race","bind","Error"],"mappings":"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"}
@@ -155,7 +155,7 @@ function assignDefaults(dir, userConfig, silent) {
155
155
  if (((_result_experimental = result.experimental) == null ? void 0 : _result_experimental.allowDevelopmentBuild) && process.env.NODE_ENV !== 'development') {
156
156
  throw new Error(`The experimental.allowDevelopmentBuild option requires NODE_ENV to be explicitly set to 'development'.`);
157
157
  }
158
- if (!((_process_env___NEXT_VERSION = "15.1.6") == null ? void 0 : _process_env___NEXT_VERSION.includes('canary')) && !process.env.__NEXT_TEST_MODE && !process.env.NEXT_PRIVATE_SKIP_CANARY_CHECK) {
158
+ if (!((_process_env___NEXT_VERSION = "15.1.7") == null ? void 0 : _process_env___NEXT_VERSION.includes('canary')) && !process.env.__NEXT_TEST_MODE && !process.env.NEXT_PRIVATE_SKIP_CANARY_CHECK) {
159
159
  var _result_experimental7, _result_experimental8, _result_experimental_turbo3, _result_experimental9;
160
160
  // Prevents usage of certain experimental features outside of canary
161
161
  if ((_result_experimental7 = result.experimental) == null ? void 0 : _result_experimental7.ppr) {
@@ -78,7 +78,7 @@ export async function createHotReloaderTurbopack(opts, serverFields, distDir, re
78
78
  }
79
79
  const hasRewrites = opts.fsChecker.rewrites.afterFiles.length > 0 || opts.fsChecker.rewrites.beforeFiles.length > 0 || opts.fsChecker.rewrites.fallback.length > 0;
80
80
  const hotReloaderSpan = trace('hot-reloader', undefined, {
81
- version: "15.1.6"
81
+ version: "15.1.7"
82
82
  });
83
83
  // Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
84
84
  // of the current `next dev` invocation.
@@ -184,7 +184,7 @@ export default class HotReloaderWebpack {
184
184
  this.previewProps = previewProps;
185
185
  this.rewrites = rewrites;
186
186
  this.hotReloaderSpan = trace('hot-reloader', undefined, {
187
- version: "15.1.6"
187
+ version: "15.1.7"
188
188
  });
189
189
  // Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
190
190
  // of the current `next dev` invocation.
@@ -4,7 +4,7 @@ import { bold, purple } from '../../lib/picocolors';
4
4
  import { PHASE_DEVELOPMENT_SERVER, PHASE_PRODUCTION_BUILD } from '../../shared/lib/constants';
5
5
  import loadConfig, { getEnabledExperimentalFeatures } from '../config';
6
6
  export function logStartInfo({ networkUrl, appUrl, envInfo, expFeatureInfo, maxExperimentalFeatures = Infinity }) {
7
- Log.bootstrap(`${bold(purple(`${Log.prefixes.ready} Next.js ${"15.1.6"}`))}${process.env.TURBOPACK ? ' (Turbopack)' : ''}`);
7
+ Log.bootstrap(`${bold(purple(`${Log.prefixes.ready} Next.js ${"15.1.7"}`))}${process.env.TURBOPACK ? ' (Turbopack)' : ''}`);
8
8
  if (appUrl) {
9
9
  Log.bootstrap(`- Local: ${appUrl}`);
10
10
  }
@@ -43,7 +43,7 @@ export async function getRequestHandlers({ dir, port, isDev, onDevServerCleanup,
43
43
  export async function startServer(serverOptions) {
44
44
  const { dir, isDev, hostname, minimalMode, allowRetry, keepAliveTimeout, selfSignedCertificate } = serverOptions;
45
45
  let { port } = serverOptions;
46
- process.title = `next-server (v${"15.1.6"})`;
46
+ process.title = `next-server (v${"15.1.7"})`;
47
47
  let handlersReady = ()=>{};
48
48
  let handlersError = ()=>{};
49
49
  let handlersPromise = new Promise((resolve, reject)=>{
@@ -23,6 +23,10 @@ import { splitCookiesString } from './web/utils';
23
23
  'proxy-authenticate'
24
24
  ];
25
25
  (_response_headers = response.headers) == null ? void 0 : _response_headers.forEach((value, name)=>{
26
+ // `x-middleware-set-cookie` is an internal header not needed for the response
27
+ if (name.toLowerCase() === 'x-middleware-set-cookie') {
28
+ return;
29
+ }
26
30
  // The append handling is special cased for `set-cookie`.
27
31
  if (name.toLowerCase() === 'set-cookie') {
28
32
  // TODO: (wyattjoh) replace with native response iteration when we can upgrade undici
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/send-response.ts"],"sourcesContent":["import type { BaseNextRequest, BaseNextResponse } from './base-http'\nimport { isNodeNextResponse } from './base-http/helpers'\n\nimport { pipeToNodeResponse } from './pipe-readable'\nimport { splitCookiesString } from './web/utils'\n\n/**\n * Sends the response on the underlying next response object.\n *\n * @param req the underlying request object\n * @param res the underlying response object\n * @param response the response to send\n */\nexport async function sendResponse(\n req: BaseNextRequest,\n res: BaseNextResponse,\n response: Response,\n waitUntil?: Promise<unknown>\n): Promise<void> {\n if (\n // The type check here ensures that `req` is correctly typed, and the\n // environment variable check provides dead code elimination.\n process.env.NEXT_RUNTIME !== 'edge' &&\n isNodeNextResponse(res)\n ) {\n // Copy over the response status.\n res.statusCode = response.status\n res.statusMessage = response.statusText\n\n // can add more headers to this list if needed\n const headersWithMultipleValuesAllowed = [\n 'set-cookie',\n 'www-authenticate',\n 'proxy-authenticate',\n ]\n\n // Copy over the response headers.\n response.headers?.forEach((value, name) => {\n // The append handling is special cased for `set-cookie`.\n if (name.toLowerCase() === 'set-cookie') {\n // TODO: (wyattjoh) replace with native response iteration when we can upgrade undici\n for (const cookie of splitCookiesString(value)) {\n res.appendHeader(name, cookie)\n }\n } else {\n // only append the header if it is either not present in the outbound response\n // or if the header supports multiple values\n const isHeaderPresent = typeof res.getHeader(name) !== 'undefined'\n if (\n headersWithMultipleValuesAllowed.includes(name.toLowerCase()) ||\n !isHeaderPresent\n ) {\n res.appendHeader(name, value)\n }\n }\n })\n\n /**\n * The response can't be directly piped to the underlying response. The\n * following is duplicated from the edge runtime handler.\n *\n * See packages/next/server/next-server.ts\n */\n\n const { originalResponse } = res\n\n // A response body must not be sent for HEAD requests. See https://httpwg.org/specs/rfc9110.html#HEAD\n if (response.body && req.method !== 'HEAD') {\n await pipeToNodeResponse(response.body, originalResponse, waitUntil)\n } else {\n originalResponse.end()\n }\n }\n}\n"],"names":["isNodeNextResponse","pipeToNodeResponse","splitCookiesString","sendResponse","req","res","response","waitUntil","process","env","NEXT_RUNTIME","statusCode","status","statusMessage","statusText","headersWithMultipleValuesAllowed","headers","forEach","value","name","toLowerCase","cookie","appendHeader","isHeaderPresent","getHeader","includes","originalResponse","body","method","end"],"mappings":"AACA,SAASA,kBAAkB,QAAQ,sBAAqB;AAExD,SAASC,kBAAkB,QAAQ,kBAAiB;AACpD,SAASC,kBAAkB,QAAQ,cAAa;AAEhD;;;;;;CAMC,GACD,OAAO,eAAeC,aACpBC,GAAoB,EACpBC,GAAqB,EACrBC,QAAkB,EAClBC,SAA4B;IAE5B,IACE,qEAAqE;IACrE,6DAA6D;IAC7DC,QAAQC,GAAG,CAACC,YAAY,KAAK,UAC7BV,mBAAmBK,MACnB;YAYA,kCAAkC;QAClCC;QAZA,iCAAiC;QACjCD,IAAIM,UAAU,GAAGL,SAASM,MAAM;QAChCP,IAAIQ,aAAa,GAAGP,SAASQ,UAAU;QAEvC,8CAA8C;QAC9C,MAAMC,mCAAmC;YACvC;YACA;YACA;SACD;SAGDT,oBAAAA,SAASU,OAAO,qBAAhBV,kBAAkBW,OAAO,CAAC,CAACC,OAAOC;YAChC,yDAAyD;YACzD,IAAIA,KAAKC,WAAW,OAAO,cAAc;gBACvC,qFAAqF;gBACrF,KAAK,MAAMC,UAAUnB,mBAAmBgB,OAAQ;oBAC9Cb,IAAIiB,YAAY,CAACH,MAAME;gBACzB;YACF,OAAO;gBACL,8EAA8E;gBAC9E,4CAA4C;gBAC5C,MAAME,kBAAkB,OAAOlB,IAAImB,SAAS,CAACL,UAAU;gBACvD,IACEJ,iCAAiCU,QAAQ,CAACN,KAAKC,WAAW,OAC1D,CAACG,iBACD;oBACAlB,IAAIiB,YAAY,CAACH,MAAMD;gBACzB;YACF;QACF;QAEA;;;;;KAKC,GAED,MAAM,EAAEQ,gBAAgB,EAAE,GAAGrB;QAE7B,qGAAqG;QACrG,IAAIC,SAASqB,IAAI,IAAIvB,IAAIwB,MAAM,KAAK,QAAQ;YAC1C,MAAM3B,mBAAmBK,SAASqB,IAAI,EAAED,kBAAkBnB;QAC5D,OAAO;YACLmB,iBAAiBG,GAAG;QACtB;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/server/send-response.ts"],"sourcesContent":["import type { BaseNextRequest, BaseNextResponse } from './base-http'\nimport { isNodeNextResponse } from './base-http/helpers'\n\nimport { pipeToNodeResponse } from './pipe-readable'\nimport { splitCookiesString } from './web/utils'\n\n/**\n * Sends the response on the underlying next response object.\n *\n * @param req the underlying request object\n * @param res the underlying response object\n * @param response the response to send\n */\nexport async function sendResponse(\n req: BaseNextRequest,\n res: BaseNextResponse,\n response: Response,\n waitUntil?: Promise<unknown>\n): Promise<void> {\n if (\n // The type check here ensures that `req` is correctly typed, and the\n // environment variable check provides dead code elimination.\n process.env.NEXT_RUNTIME !== 'edge' &&\n isNodeNextResponse(res)\n ) {\n // Copy over the response status.\n res.statusCode = response.status\n res.statusMessage = response.statusText\n\n // can add more headers to this list if needed\n const headersWithMultipleValuesAllowed = [\n 'set-cookie',\n 'www-authenticate',\n 'proxy-authenticate',\n ]\n\n // Copy over the response headers.\n response.headers?.forEach((value, name) => {\n // `x-middleware-set-cookie` is an internal header not needed for the response\n if (name.toLowerCase() === 'x-middleware-set-cookie') {\n return\n }\n\n // The append handling is special cased for `set-cookie`.\n if (name.toLowerCase() === 'set-cookie') {\n // TODO: (wyattjoh) replace with native response iteration when we can upgrade undici\n for (const cookie of splitCookiesString(value)) {\n res.appendHeader(name, cookie)\n }\n } else {\n // only append the header if it is either not present in the outbound response\n // or if the header supports multiple values\n const isHeaderPresent = typeof res.getHeader(name) !== 'undefined'\n if (\n headersWithMultipleValuesAllowed.includes(name.toLowerCase()) ||\n !isHeaderPresent\n ) {\n res.appendHeader(name, value)\n }\n }\n })\n\n /**\n * The response can't be directly piped to the underlying response. The\n * following is duplicated from the edge runtime handler.\n *\n * See packages/next/server/next-server.ts\n */\n\n const { originalResponse } = res\n\n // A response body must not be sent for HEAD requests. See https://httpwg.org/specs/rfc9110.html#HEAD\n if (response.body && req.method !== 'HEAD') {\n await pipeToNodeResponse(response.body, originalResponse, waitUntil)\n } else {\n originalResponse.end()\n }\n }\n}\n"],"names":["isNodeNextResponse","pipeToNodeResponse","splitCookiesString","sendResponse","req","res","response","waitUntil","process","env","NEXT_RUNTIME","statusCode","status","statusMessage","statusText","headersWithMultipleValuesAllowed","headers","forEach","value","name","toLowerCase","cookie","appendHeader","isHeaderPresent","getHeader","includes","originalResponse","body","method","end"],"mappings":"AACA,SAASA,kBAAkB,QAAQ,sBAAqB;AAExD,SAASC,kBAAkB,QAAQ,kBAAiB;AACpD,SAASC,kBAAkB,QAAQ,cAAa;AAEhD;;;;;;CAMC,GACD,OAAO,eAAeC,aACpBC,GAAoB,EACpBC,GAAqB,EACrBC,QAAkB,EAClBC,SAA4B;IAE5B,IACE,qEAAqE;IACrE,6DAA6D;IAC7DC,QAAQC,GAAG,CAACC,YAAY,KAAK,UAC7BV,mBAAmBK,MACnB;YAYA,kCAAkC;QAClCC;QAZA,iCAAiC;QACjCD,IAAIM,UAAU,GAAGL,SAASM,MAAM;QAChCP,IAAIQ,aAAa,GAAGP,SAASQ,UAAU;QAEvC,8CAA8C;QAC9C,MAAMC,mCAAmC;YACvC;YACA;YACA;SACD;SAGDT,oBAAAA,SAASU,OAAO,qBAAhBV,kBAAkBW,OAAO,CAAC,CAACC,OAAOC;YAChC,8EAA8E;YAC9E,IAAIA,KAAKC,WAAW,OAAO,2BAA2B;gBACpD;YACF;YAEA,yDAAyD;YACzD,IAAID,KAAKC,WAAW,OAAO,cAAc;gBACvC,qFAAqF;gBACrF,KAAK,MAAMC,UAAUnB,mBAAmBgB,OAAQ;oBAC9Cb,IAAIiB,YAAY,CAACH,MAAME;gBACzB;YACF,OAAO;gBACL,8EAA8E;gBAC9E,4CAA4C;gBAC5C,MAAME,kBAAkB,OAAOlB,IAAImB,SAAS,CAACL,UAAU;gBACvD,IACEJ,iCAAiCU,QAAQ,CAACN,KAAKC,WAAW,OAC1D,CAACG,iBACD;oBACAlB,IAAIiB,YAAY,CAACH,MAAMD;gBACzB;YACF;QACF;QAEA;;;;;KAKC,GAED,MAAM,EAAEQ,gBAAgB,EAAE,GAAGrB;QAE7B,qGAAqG;QACrG,IAAIC,SAASqB,IAAI,IAAIvB,IAAIwB,MAAM,KAAK,QAAQ;YAC1C,MAAM3B,mBAAmBK,SAASqB,IAAI,EAAED,kBAAkBnB;QAC5D,OAAO;YACLmB,iBAAiBG,GAAG;QACtB;IACF;AACF"}
@@ -19,7 +19,7 @@ class ResourceManager {
19
19
  class IntervalsManager extends ResourceManager {
20
20
  create(args) {
21
21
  // TODO: use the edge runtime provided `setInterval` instead
22
- return setInterval(...args)[Symbol.toPrimitive]();
22
+ return webSetIntervalPolyfill(...args);
23
23
  }
24
24
  destroy(interval) {
25
25
  clearInterval(interval);
@@ -28,12 +28,38 @@ class IntervalsManager extends ResourceManager {
28
28
  class TimeoutsManager extends ResourceManager {
29
29
  create(args) {
30
30
  // TODO: use the edge runtime provided `setTimeout` instead
31
- return setTimeout(...args)[Symbol.toPrimitive]();
31
+ return webSetTimeoutPolyfill(...args);
32
32
  }
33
33
  destroy(timeout) {
34
34
  clearTimeout(timeout);
35
35
  }
36
36
  }
37
+ function webSetIntervalPolyfill(callback, ms, ...args) {
38
+ return setInterval(()=>{
39
+ // node's `setInterval` sets `this` to the `Timeout` instance it returned,
40
+ // but web `setInterval` always sets `this` to `window`
41
+ // see: https://developer.mozilla.org/en-US/docs/Web/API/Window/setInterval#the_this_problem
42
+ return callback.apply(globalThis, args);
43
+ }, ms)[Symbol.toPrimitive]();
44
+ }
45
+ function webSetTimeoutPolyfill(callback, ms, ...args) {
46
+ const wrappedCallback = ()=>{
47
+ try {
48
+ // node's `setTimeout` sets `this` to the `Timeout` instance it returned,
49
+ // but web `setTimeout` always sets `this` to `window`
50
+ // see: https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout#the_this_problem
51
+ return callback.apply(globalThis, args);
52
+ } finally{
53
+ // On certain older node versions (<20.16.0, <22.4.0),
54
+ // a `setTimeout` whose Timeout was converted to a primitive will leak.
55
+ // See: https://github.com/nodejs/node/issues/53335
56
+ // We can work around this by explicitly calling `clearTimeout` after the callback runs.
57
+ clearTimeout(timeout);
58
+ }
59
+ };
60
+ const timeout = setTimeout(wrappedCallback, ms);
61
+ return timeout[Symbol.toPrimitive]();
62
+ }
37
63
  export const intervalsManager = new IntervalsManager();
38
64
  export const timeoutsManager = new TimeoutsManager();
39
65
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/server/web/sandbox/resource-managers.ts"],"sourcesContent":["abstract class ResourceManager<T, K> {\n private resources: T[] = []\n\n abstract create(resourceArgs: K): T\n abstract destroy(resource: T): void\n\n add(resourceArgs: K) {\n const resource = this.create(resourceArgs)\n this.resources.push(resource)\n return resource\n }\n\n remove(resource: T) {\n this.resources = this.resources.filter((r) => r !== resource)\n this.destroy(resource)\n }\n\n removeAll() {\n this.resources.forEach(this.destroy)\n this.resources = []\n }\n}\n\nclass IntervalsManager extends ResourceManager<\n number,\n Parameters<typeof setInterval>\n> {\n create(args: Parameters<typeof setInterval>) {\n // TODO: use the edge runtime provided `setInterval` instead\n return setInterval(...args)[Symbol.toPrimitive]()\n }\n\n destroy(interval: number) {\n clearInterval(interval)\n }\n}\n\nclass TimeoutsManager extends ResourceManager<\n number,\n Parameters<typeof setTimeout>\n> {\n create(args: Parameters<typeof setTimeout>) {\n // TODO: use the edge runtime provided `setTimeout` instead\n return setTimeout(...args)[Symbol.toPrimitive]()\n }\n\n destroy(timeout: number) {\n clearTimeout(timeout)\n }\n}\n\nexport const intervalsManager = new IntervalsManager()\nexport const timeoutsManager = new TimeoutsManager()\n"],"names":["ResourceManager","add","resourceArgs","resource","create","resources","push","remove","filter","r","destroy","removeAll","forEach","IntervalsManager","args","setInterval","Symbol","toPrimitive","interval","clearInterval","TimeoutsManager","setTimeout","timeout","clearTimeout","intervalsManager","timeoutsManager"],"mappings":"AAAA,MAAeA;IAMbC,IAAIC,YAAe,EAAE;QACnB,MAAMC,WAAW,IAAI,CAACC,MAAM,CAACF;QAC7B,IAAI,CAACG,SAAS,CAACC,IAAI,CAACH;QACpB,OAAOA;IACT;IAEAI,OAAOJ,QAAW,EAAE;QAClB,IAAI,CAACE,SAAS,GAAG,IAAI,CAACA,SAAS,CAACG,MAAM,CAAC,CAACC,IAAMA,MAAMN;QACpD,IAAI,CAACO,OAAO,CAACP;IACf;IAEAQ,YAAY;QACV,IAAI,CAACN,SAAS,CAACO,OAAO,CAAC,IAAI,CAACF,OAAO;QACnC,IAAI,CAACL,SAAS,GAAG,EAAE;IACrB;;aAnBQA,YAAiB,EAAE;;AAoB7B;AAEA,MAAMQ,yBAAyBb;IAI7BI,OAAOU,IAAoC,EAAE;QAC3C,4DAA4D;QAC5D,OAAOC,eAAeD,KAAK,CAACE,OAAOC,WAAW,CAAC;IACjD;IAEAP,QAAQQ,QAAgB,EAAE;QACxBC,cAAcD;IAChB;AACF;AAEA,MAAME,wBAAwBpB;IAI5BI,OAAOU,IAAmC,EAAE;QAC1C,2DAA2D;QAC3D,OAAOO,cAAcP,KAAK,CAACE,OAAOC,WAAW,CAAC;IAChD;IAEAP,QAAQY,OAAe,EAAE;QACvBC,aAAaD;IACf;AACF;AAEA,OAAO,MAAME,mBAAmB,IAAIX,mBAAkB;AACtD,OAAO,MAAMY,kBAAkB,IAAIL,kBAAiB"}
1
+ {"version":3,"sources":["../../../../src/server/web/sandbox/resource-managers.ts"],"sourcesContent":["abstract class ResourceManager<T, Args> {\n private resources: T[] = []\n\n abstract create(resourceArgs: Args): T\n abstract destroy(resource: T): void\n\n add(resourceArgs: Args) {\n const resource = this.create(resourceArgs)\n this.resources.push(resource)\n return resource\n }\n\n remove(resource: T) {\n this.resources = this.resources.filter((r) => r !== resource)\n this.destroy(resource)\n }\n\n removeAll() {\n this.resources.forEach(this.destroy)\n this.resources = []\n }\n}\n\nclass IntervalsManager extends ResourceManager<\n number,\n Parameters<typeof setInterval>\n> {\n create(args: Parameters<typeof setInterval>) {\n // TODO: use the edge runtime provided `setInterval` instead\n return webSetIntervalPolyfill(...args)\n }\n\n destroy(interval: number) {\n clearInterval(interval)\n }\n}\n\nclass TimeoutsManager extends ResourceManager<\n number,\n Parameters<typeof setTimeout>\n> {\n create(args: Parameters<typeof setTimeout>) {\n // TODO: use the edge runtime provided `setTimeout` instead\n return webSetTimeoutPolyfill(...args)\n }\n\n destroy(timeout: number) {\n clearTimeout(timeout)\n }\n}\n\nfunction webSetIntervalPolyfill<TArgs extends any[]>(\n callback: (...args: TArgs) => void,\n ms?: number,\n ...args: TArgs\n): number {\n return setInterval(() => {\n // node's `setInterval` sets `this` to the `Timeout` instance it returned,\n // but web `setInterval` always sets `this` to `window`\n // see: https://developer.mozilla.org/en-US/docs/Web/API/Window/setInterval#the_this_problem\n return callback.apply(globalThis, args)\n }, ms)[Symbol.toPrimitive]()\n}\n\nfunction webSetTimeoutPolyfill<TArgs extends any[]>(\n callback: (...args: TArgs) => void,\n ms?: number,\n ...args: TArgs\n): number {\n const wrappedCallback = () => {\n try {\n // node's `setTimeout` sets `this` to the `Timeout` instance it returned,\n // but web `setTimeout` always sets `this` to `window`\n // see: https://developer.mozilla.org/en-US/docs/Web/API/Window/setTimeout#the_this_problem\n return callback.apply(globalThis, args)\n } finally {\n // On certain older node versions (<20.16.0, <22.4.0),\n // a `setTimeout` whose Timeout was converted to a primitive will leak.\n // See: https://github.com/nodejs/node/issues/53335\n // We can work around this by explicitly calling `clearTimeout` after the callback runs.\n clearTimeout(timeout)\n }\n }\n const timeout = setTimeout(wrappedCallback, ms)\n return timeout[Symbol.toPrimitive]()\n}\n\nexport const intervalsManager = new IntervalsManager()\nexport const timeoutsManager = new TimeoutsManager()\n"],"names":["ResourceManager","add","resourceArgs","resource","create","resources","push","remove","filter","r","destroy","removeAll","forEach","IntervalsManager","args","webSetIntervalPolyfill","interval","clearInterval","TimeoutsManager","webSetTimeoutPolyfill","timeout","clearTimeout","callback","ms","setInterval","apply","globalThis","Symbol","toPrimitive","wrappedCallback","setTimeout","intervalsManager","timeoutsManager"],"mappings":"AAAA,MAAeA;IAMbC,IAAIC,YAAkB,EAAE;QACtB,MAAMC,WAAW,IAAI,CAACC,MAAM,CAACF;QAC7B,IAAI,CAACG,SAAS,CAACC,IAAI,CAACH;QACpB,OAAOA;IACT;IAEAI,OAAOJ,QAAW,EAAE;QAClB,IAAI,CAACE,SAAS,GAAG,IAAI,CAACA,SAAS,CAACG,MAAM,CAAC,CAACC,IAAMA,MAAMN;QACpD,IAAI,CAACO,OAAO,CAACP;IACf;IAEAQ,YAAY;QACV,IAAI,CAACN,SAAS,CAACO,OAAO,CAAC,IAAI,CAACF,OAAO;QACnC,IAAI,CAACL,SAAS,GAAG,EAAE;IACrB;;aAnBQA,YAAiB,EAAE;;AAoB7B;AAEA,MAAMQ,yBAAyBb;IAI7BI,OAAOU,IAAoC,EAAE;QAC3C,4DAA4D;QAC5D,OAAOC,0BAA0BD;IACnC;IAEAJ,QAAQM,QAAgB,EAAE;QACxBC,cAAcD;IAChB;AACF;AAEA,MAAME,wBAAwBlB;IAI5BI,OAAOU,IAAmC,EAAE;QAC1C,2DAA2D;QAC3D,OAAOK,yBAAyBL;IAClC;IAEAJ,QAAQU,OAAe,EAAE;QACvBC,aAAaD;IACf;AACF;AAEA,SAASL,uBACPO,QAAkC,EAClCC,EAAW,EACX,GAAGT,IAAW;IAEd,OAAOU,YAAY;QACjB,0EAA0E;QAC1E,uDAAuD;QACvD,4FAA4F;QAC5F,OAAOF,SAASG,KAAK,CAACC,YAAYZ;IACpC,GAAGS,GAAG,CAACI,OAAOC,WAAW,CAAC;AAC5B;AAEA,SAAST,sBACPG,QAAkC,EAClCC,EAAW,EACX,GAAGT,IAAW;IAEd,MAAMe,kBAAkB;QACtB,IAAI;YACF,yEAAyE;YACzE,sDAAsD;YACtD,2FAA2F;YAC3F,OAAOP,SAASG,KAAK,CAACC,YAAYZ;QACpC,SAAU;YACR,sDAAsD;YACtD,uEAAuE;YACvE,mDAAmD;YACnD,wFAAwF;YACxFO,aAAaD;QACf;IACF;IACA,MAAMA,UAAUU,WAAWD,iBAAiBN;IAC5C,OAAOH,OAAO,CAACO,OAAOC,WAAW,CAAC;AACpC;AAEA,OAAO,MAAMG,mBAAmB,IAAIlB,mBAAkB;AACtD,OAAO,MAAMmB,kBAAkB,IAAId,kBAAiB"}
@@ -149,7 +149,7 @@ async function verifyTypeScriptSetup({ dir, distDir, cacheDir, intentDirs, tscon
149
149
  * or run in a worker (during next build). In the latter case, we need to print the error message, as the
150
150
  * parent process will only receive an `Jest worker encountered 1 child process exceptions, exceeding retry limit`.
151
151
  */ // we are in a worker, print the error message and exit the process
152
- if (process.env.JEST_WORKER_ID) {
152
+ if (process.env.IS_NEXT_WORKER) {
153
153
  if (err instanceof Error) {
154
154
  console.error(err.message);
155
155
  } else {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/verify-typescript-setup.ts"],"sourcesContent":["import { bold, cyan, red, yellow } from './picocolors'\nimport path from 'path'\n\nimport { hasNecessaryDependencies } from './has-necessary-dependencies'\nimport type { NecessaryDependencies } from './has-necessary-dependencies'\nimport semver from 'next/dist/compiled/semver'\nimport { CompileError } from './compile-error'\nimport * as log from '../build/output/log'\n\nimport { getTypeScriptIntent } from './typescript/getTypeScriptIntent'\nimport type { TypeCheckResult } from './typescript/runTypeCheck'\nimport { writeAppTypeDeclarations } from './typescript/writeAppTypeDeclarations'\nimport { writeConfigurationDefaults } from './typescript/writeConfigurationDefaults'\nimport { installDependencies } from './install-dependencies'\nimport { isCI } from '../server/ci-info'\nimport { missingDepsError } from './typescript/missingDependencyError'\n\nconst requiredPackages = [\n {\n file: 'typescript/lib/typescript.js',\n pkg: 'typescript',\n exportsRestrict: true,\n },\n {\n file: '@types/react/index.d.ts',\n pkg: '@types/react',\n exportsRestrict: true,\n },\n {\n file: '@types/node/index.d.ts',\n pkg: '@types/node',\n exportsRestrict: true,\n },\n]\n\nexport async function verifyTypeScriptSetup({\n dir,\n distDir,\n cacheDir,\n intentDirs,\n tsconfigPath,\n typeCheckPreflight,\n disableStaticImages,\n hasAppDir,\n hasPagesDir,\n}: {\n dir: string\n distDir: string\n cacheDir?: string\n tsconfigPath: string\n intentDirs: string[]\n typeCheckPreflight: boolean\n disableStaticImages: boolean\n hasAppDir: boolean\n hasPagesDir: boolean\n}): Promise<{ result?: TypeCheckResult; version: string | null }> {\n const resolvedTsConfigPath = path.join(dir, tsconfigPath)\n\n try {\n // Check if the project uses TypeScript:\n const intent = await getTypeScriptIntent(dir, intentDirs, tsconfigPath)\n if (!intent) {\n return { version: null }\n }\n\n // Ensure TypeScript and necessary `@types/*` are installed:\n let deps: NecessaryDependencies = await hasNecessaryDependencies(\n dir,\n requiredPackages\n )\n\n if (deps.missing?.length > 0) {\n if (isCI) {\n // we don't attempt auto install in CI to avoid side-effects\n // and instead log the error for installing needed packages\n missingDepsError(dir, deps.missing)\n }\n console.log(\n bold(\n yellow(\n `It looks like you're trying to use TypeScript but do not have the required package(s) installed.`\n )\n ) +\n '\\n' +\n 'Installing dependencies' +\n '\\n\\n' +\n bold(\n 'If you are not trying to use TypeScript, please remove the ' +\n cyan('tsconfig.json') +\n ' file from your package root (and any TypeScript files in your app and pages directories).'\n ) +\n '\\n'\n )\n await installDependencies(dir, deps.missing, true).catch((err) => {\n if (err && typeof err === 'object' && 'command' in err) {\n console.error(\n `Failed to install required TypeScript dependencies, please install them manually to continue:\\n` +\n (err as any).command +\n '\\n'\n )\n }\n throw err\n })\n deps = await hasNecessaryDependencies(dir, requiredPackages)\n }\n\n // Load TypeScript after we're sure it exists:\n const tsPath = deps.resolved.get('typescript')!\n const ts = (await Promise.resolve(\n require(tsPath)\n )) as typeof import('typescript')\n\n if (semver.lt(ts.version, '4.5.2')) {\n log.warn(\n `Minimum recommended TypeScript version is v4.5.2, older versions can potentially be incompatible with Next.js. Detected: ${ts.version}`\n )\n }\n\n // Reconfigure (or create) the user's `tsconfig.json` for them:\n await writeConfigurationDefaults(\n ts,\n resolvedTsConfigPath,\n intent.firstTimeSetup,\n hasAppDir,\n distDir,\n hasPagesDir\n )\n // Write out the necessary `next-env.d.ts` file to correctly register\n // Next.js' types:\n await writeAppTypeDeclarations({\n baseDir: dir,\n imageImportsEnabled: !disableStaticImages,\n hasPagesDir,\n hasAppDir,\n })\n\n let result\n if (typeCheckPreflight) {\n const { runTypeCheck } = require('./typescript/runTypeCheck')\n\n // Verify the project passes type-checking before we go to webpack phase:\n result = await runTypeCheck(\n ts,\n dir,\n distDir,\n resolvedTsConfigPath,\n cacheDir,\n hasAppDir\n )\n }\n return { result, version: ts.version }\n } catch (err) {\n // These are special errors that should not show a stack trace:\n if (err instanceof CompileError) {\n console.error(red('Failed to compile.\\n'))\n console.error(err.message)\n process.exit(1)\n }\n\n /**\n * verifyTypeScriptSetup can be either invoked directly in the main thread (during next dev / next lint)\n * or run in a worker (during next build). In the latter case, we need to print the error message, as the\n * parent process will only receive an `Jest worker encountered 1 child process exceptions, exceeding retry limit`.\n */\n\n // we are in a worker, print the error message and exit the process\n if (process.env.JEST_WORKER_ID) {\n if (err instanceof Error) {\n console.error(err.message)\n } else {\n console.error(err)\n }\n process.exit(1)\n }\n // we are in the main thread, throw the error and it will be handled by the caller\n throw err\n }\n}\n"],"names":["verifyTypeScriptSetup","requiredPackages","file","pkg","exportsRestrict","dir","distDir","cacheDir","intentDirs","tsconfigPath","typeCheckPreflight","disableStaticImages","hasAppDir","hasPagesDir","resolvedTsConfigPath","path","join","deps","intent","getTypeScriptIntent","version","hasNecessaryDependencies","missing","length","isCI","missingDepsError","console","log","bold","yellow","cyan","installDependencies","catch","err","error","command","tsPath","resolved","get","ts","Promise","resolve","require","semver","lt","warn","writeConfigurationDefaults","firstTimeSetup","writeAppTypeDeclarations","baseDir","imageImportsEnabled","result","runTypeCheck","CompileError","red","message","process","exit","env","JEST_WORKER_ID","Error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/lib/verify-typescript-setup.ts"],"sourcesContent":["import { bold, cyan, red, yellow } from './picocolors'\nimport path from 'path'\n\nimport { hasNecessaryDependencies } from './has-necessary-dependencies'\nimport type { NecessaryDependencies } from './has-necessary-dependencies'\nimport semver from 'next/dist/compiled/semver'\nimport { CompileError } from './compile-error'\nimport * as log from '../build/output/log'\n\nimport { getTypeScriptIntent } from './typescript/getTypeScriptIntent'\nimport type { TypeCheckResult } from './typescript/runTypeCheck'\nimport { writeAppTypeDeclarations } from './typescript/writeAppTypeDeclarations'\nimport { writeConfigurationDefaults } from './typescript/writeConfigurationDefaults'\nimport { installDependencies } from './install-dependencies'\nimport { isCI } from '../server/ci-info'\nimport { missingDepsError } from './typescript/missingDependencyError'\n\nconst requiredPackages = [\n {\n file: 'typescript/lib/typescript.js',\n pkg: 'typescript',\n exportsRestrict: true,\n },\n {\n file: '@types/react/index.d.ts',\n pkg: '@types/react',\n exportsRestrict: true,\n },\n {\n file: '@types/node/index.d.ts',\n pkg: '@types/node',\n exportsRestrict: true,\n },\n]\n\nexport async function verifyTypeScriptSetup({\n dir,\n distDir,\n cacheDir,\n intentDirs,\n tsconfigPath,\n typeCheckPreflight,\n disableStaticImages,\n hasAppDir,\n hasPagesDir,\n}: {\n dir: string\n distDir: string\n cacheDir?: string\n tsconfigPath: string\n intentDirs: string[]\n typeCheckPreflight: boolean\n disableStaticImages: boolean\n hasAppDir: boolean\n hasPagesDir: boolean\n}): Promise<{ result?: TypeCheckResult; version: string | null }> {\n const resolvedTsConfigPath = path.join(dir, tsconfigPath)\n\n try {\n // Check if the project uses TypeScript:\n const intent = await getTypeScriptIntent(dir, intentDirs, tsconfigPath)\n if (!intent) {\n return { version: null }\n }\n\n // Ensure TypeScript and necessary `@types/*` are installed:\n let deps: NecessaryDependencies = await hasNecessaryDependencies(\n dir,\n requiredPackages\n )\n\n if (deps.missing?.length > 0) {\n if (isCI) {\n // we don't attempt auto install in CI to avoid side-effects\n // and instead log the error for installing needed packages\n missingDepsError(dir, deps.missing)\n }\n console.log(\n bold(\n yellow(\n `It looks like you're trying to use TypeScript but do not have the required package(s) installed.`\n )\n ) +\n '\\n' +\n 'Installing dependencies' +\n '\\n\\n' +\n bold(\n 'If you are not trying to use TypeScript, please remove the ' +\n cyan('tsconfig.json') +\n ' file from your package root (and any TypeScript files in your app and pages directories).'\n ) +\n '\\n'\n )\n await installDependencies(dir, deps.missing, true).catch((err) => {\n if (err && typeof err === 'object' && 'command' in err) {\n console.error(\n `Failed to install required TypeScript dependencies, please install them manually to continue:\\n` +\n (err as any).command +\n '\\n'\n )\n }\n throw err\n })\n deps = await hasNecessaryDependencies(dir, requiredPackages)\n }\n\n // Load TypeScript after we're sure it exists:\n const tsPath = deps.resolved.get('typescript')!\n const ts = (await Promise.resolve(\n require(tsPath)\n )) as typeof import('typescript')\n\n if (semver.lt(ts.version, '4.5.2')) {\n log.warn(\n `Minimum recommended TypeScript version is v4.5.2, older versions can potentially be incompatible with Next.js. Detected: ${ts.version}`\n )\n }\n\n // Reconfigure (or create) the user's `tsconfig.json` for them:\n await writeConfigurationDefaults(\n ts,\n resolvedTsConfigPath,\n intent.firstTimeSetup,\n hasAppDir,\n distDir,\n hasPagesDir\n )\n // Write out the necessary `next-env.d.ts` file to correctly register\n // Next.js' types:\n await writeAppTypeDeclarations({\n baseDir: dir,\n imageImportsEnabled: !disableStaticImages,\n hasPagesDir,\n hasAppDir,\n })\n\n let result\n if (typeCheckPreflight) {\n const { runTypeCheck } = require('./typescript/runTypeCheck')\n\n // Verify the project passes type-checking before we go to webpack phase:\n result = await runTypeCheck(\n ts,\n dir,\n distDir,\n resolvedTsConfigPath,\n cacheDir,\n hasAppDir\n )\n }\n return { result, version: ts.version }\n } catch (err) {\n // These are special errors that should not show a stack trace:\n if (err instanceof CompileError) {\n console.error(red('Failed to compile.\\n'))\n console.error(err.message)\n process.exit(1)\n }\n\n /**\n * verifyTypeScriptSetup can be either invoked directly in the main thread (during next dev / next lint)\n * or run in a worker (during next build). In the latter case, we need to print the error message, as the\n * parent process will only receive an `Jest worker encountered 1 child process exceptions, exceeding retry limit`.\n */\n\n // we are in a worker, print the error message and exit the process\n if (process.env.IS_NEXT_WORKER) {\n if (err instanceof Error) {\n console.error(err.message)\n } else {\n console.error(err)\n }\n process.exit(1)\n }\n // we are in the main thread, throw the error and it will be handled by the caller\n throw err\n }\n}\n"],"names":["verifyTypeScriptSetup","requiredPackages","file","pkg","exportsRestrict","dir","distDir","cacheDir","intentDirs","tsconfigPath","typeCheckPreflight","disableStaticImages","hasAppDir","hasPagesDir","resolvedTsConfigPath","path","join","deps","intent","getTypeScriptIntent","version","hasNecessaryDependencies","missing","length","isCI","missingDepsError","console","log","bold","yellow","cyan","installDependencies","catch","err","error","command","tsPath","resolved","get","ts","Promise","resolve","require","semver","lt","warn","writeConfigurationDefaults","firstTimeSetup","writeAppTypeDeclarations","baseDir","imageImportsEnabled","result","runTypeCheck","CompileError","red","message","process","exit","env","IS_NEXT_WORKER","Error"],"mappings":"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"}
@@ -37,7 +37,8 @@ class Worker {
37
37
  ...farmOptions.forkOptions,
38
38
  env: {
39
39
  ...((_farmOptions_forkOptions = farmOptions.forkOptions) == null ? void 0 : _farmOptions_forkOptions.env) || {},
40
- ...process.env
40
+ ...process.env,
41
+ IS_NEXT_WORKER: 'true'
41
42
  }
42
43
  },
43
44
  maxRetries: 0
@@ -59,7 +60,7 @@ class Worker {
59
60
  _worker__child1;
60
61
  (_worker__child = worker._child) == null ? void 0 : _worker__child.on('exit', (code, signal)=>{
61
62
  if ((code || signal && signal !== 'SIGINT') && this._worker) {
62
- logger.error(`Static worker exited with code: ${code} and signal: ${signal}`);
63
+ logger.error(`Next.js build worker exited with code: ${code} and signal: ${signal}`);
63
64
  // if a child process doesn't exit gracefully, we want to bubble up the exit code to the parent process
64
65
  process.exit(code ?? 1);
65
66
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/worker.ts"],"sourcesContent":["import type { ChildProcess } from 'child_process'\nimport { Worker as JestWorker } from 'next/dist/compiled/jest-worker'\nimport { Transform } from 'stream'\n\ntype FarmOptions = ConstructorParameters<typeof JestWorker>[1]\n\nconst RESTARTED = Symbol('restarted')\n\nconst cleanupWorkers = (worker: JestWorker) => {\n for (const curWorker of ((worker as any)._workerPool?._workers || []) as {\n _child?: ChildProcess\n }[]) {\n curWorker._child?.kill('SIGINT')\n }\n}\n\nexport class Worker {\n private _worker: JestWorker | undefined\n\n constructor(\n workerPath: string,\n options: FarmOptions & {\n timeout?: number\n onActivity?: () => void\n onActivityAbort?: () => void\n onRestart?: (method: string, args: any[], attempts: number) => void\n logger?: Pick<typeof console, 'error' | 'info' | 'warn'>\n exposedMethods: ReadonlyArray<string>\n enableWorkerThreads?: boolean\n }\n ) {\n let { timeout, onRestart, logger = console, ...farmOptions } = options\n\n let restartPromise: Promise<typeof RESTARTED>\n let resolveRestartPromise: (arg: typeof RESTARTED) => void\n let activeTasks = 0\n\n this._worker = undefined\n\n // ensure we end workers if they weren't before exit\n process.on('exit', () => {\n this.close()\n })\n\n const createWorker = () => {\n this._worker = new JestWorker(workerPath, {\n ...farmOptions,\n forkOptions: {\n ...farmOptions.forkOptions,\n env: {\n ...((farmOptions.forkOptions?.env || {}) as any),\n ...process.env,\n } as any,\n },\n maxRetries: 0,\n }) as JestWorker\n restartPromise = new Promise(\n (resolve) => (resolveRestartPromise = resolve)\n )\n\n /**\n * Jest Worker has two worker types, ChildProcessWorker (uses child_process) and NodeThreadWorker (uses worker_threads)\n * Next.js uses ChildProcessWorker by default, but it can be switched to NodeThreadWorker with an experimental flag\n *\n * We only want to handle ChildProcessWorker's orphan process issue, so we access the private property \"_child\":\n * https://github.com/facebook/jest/blob/b38d7d345a81d97d1dc3b68b8458b1837fbf19be/packages/jest-worker/src/workers/ChildProcessWorker.ts\n *\n * But this property is not available in NodeThreadWorker, so we need to check if we are using ChildProcessWorker\n */\n if (!farmOptions.enableWorkerThreads) {\n for (const worker of ((this._worker as any)._workerPool?._workers ||\n []) as {\n _child?: ChildProcess\n }[]) {\n worker._child?.on('exit', (code, signal) => {\n if ((code || (signal && signal !== 'SIGINT')) && this._worker) {\n logger.error(\n `Static worker exited with code: ${code} and signal: ${signal}`\n )\n\n // if a child process doesn't exit gracefully, we want to bubble up the exit code to the parent process\n process.exit(code ?? 1)\n }\n })\n\n // if a child process emits a particular message, we track that as activity\n // so the parent process can keep track of progress\n worker._child?.on('message', ([, data]: [number, unknown]) => {\n if (\n data &&\n typeof data === 'object' &&\n 'type' in data &&\n data.type === 'activity'\n ) {\n onActivity()\n }\n })\n }\n }\n\n let aborted = false\n const onActivityAbort = () => {\n if (!aborted) {\n options.onActivityAbort?.()\n aborted = true\n }\n }\n\n // Listen to the worker's stdout and stderr, if there's any thing logged, abort the activity first\n const abortActivityStreamOnLog = new Transform({\n transform(_chunk, _encoding, callback) {\n onActivityAbort()\n callback()\n },\n })\n // Stop the activity if there's any output from the worker\n this._worker.getStdout().pipe(abortActivityStreamOnLog)\n this._worker.getStderr().pipe(abortActivityStreamOnLog)\n\n // Pipe the worker's stdout and stderr to the parent process\n this._worker.getStdout().pipe(process.stdout)\n this._worker.getStderr().pipe(process.stderr)\n }\n createWorker()\n\n const onHanging = () => {\n const worker = this._worker\n if (!worker) return\n const resolve = resolveRestartPromise\n createWorker()\n logger.warn(\n `Sending SIGTERM signal to static worker due to timeout${\n timeout ? ` of ${timeout / 1000} seconds` : ''\n }. Subsequent errors may be a result of the worker exiting.`\n )\n worker.end().then(() => {\n resolve(RESTARTED)\n })\n }\n\n let hangingTimer: NodeJS.Timeout | false = false\n\n const onActivity = () => {\n if (hangingTimer) clearTimeout(hangingTimer)\n if (options.onActivity) options.onActivity()\n\n hangingTimer = activeTasks > 0 && setTimeout(onHanging, timeout)\n }\n\n for (const method of farmOptions.exposedMethods) {\n if (method.startsWith('_')) continue\n ;(this as any)[method] = timeout\n ? // eslint-disable-next-line no-loop-func\n async (...args: any[]) => {\n activeTasks++\n try {\n let attempts = 0\n for (;;) {\n onActivity()\n const result = await Promise.race([\n (this._worker as any)[method](...args),\n restartPromise,\n ])\n if (result !== RESTARTED) return result\n if (onRestart) onRestart(method, args, ++attempts)\n }\n } finally {\n activeTasks--\n onActivity()\n }\n }\n : (this._worker as any)[method].bind(this._worker)\n }\n }\n\n end(): ReturnType<JestWorker['end']> {\n const worker = this._worker\n if (!worker) {\n throw new Error('Farm is ended, no more calls can be done to it')\n }\n cleanupWorkers(worker)\n this._worker = undefined\n return worker.end()\n }\n\n /**\n * Quietly end the worker if it exists\n */\n close(): void {\n if (this._worker) {\n cleanupWorkers(this._worker)\n this._worker.end()\n }\n }\n}\n"],"names":["Worker","RESTARTED","Symbol","cleanupWorkers","worker","curWorker","_workerPool","_workers","_child","kill","constructor","workerPath","options","timeout","onRestart","logger","console","farmOptions","restartPromise","resolveRestartPromise","activeTasks","_worker","undefined","process","on","close","createWorker","JestWorker","forkOptions","env","maxRetries","Promise","resolve","enableWorkerThreads","code","signal","error","exit","data","type","onActivity","aborted","onActivityAbort","abortActivityStreamOnLog","Transform","transform","_chunk","_encoding","callback","getStdout","pipe","getStderr","stdout","stderr","onHanging","warn","end","then","hangingTimer","clearTimeout","setTimeout","method","exposedMethods","startsWith","args","attempts","result","race","bind","Error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../src/lib/worker.ts"],"sourcesContent":["import type { ChildProcess } from 'child_process'\nimport { Worker as JestWorker } from 'next/dist/compiled/jest-worker'\nimport { Transform } from 'stream'\n\ntype FarmOptions = ConstructorParameters<typeof JestWorker>[1]\n\nconst RESTARTED = Symbol('restarted')\n\nconst cleanupWorkers = (worker: JestWorker) => {\n for (const curWorker of ((worker as any)._workerPool?._workers || []) as {\n _child?: ChildProcess\n }[]) {\n curWorker._child?.kill('SIGINT')\n }\n}\n\nexport class Worker {\n private _worker: JestWorker | undefined\n\n constructor(\n workerPath: string,\n options: FarmOptions & {\n timeout?: number\n onActivity?: () => void\n onActivityAbort?: () => void\n onRestart?: (method: string, args: any[], attempts: number) => void\n logger?: Pick<typeof console, 'error' | 'info' | 'warn'>\n exposedMethods: ReadonlyArray<string>\n enableWorkerThreads?: boolean\n }\n ) {\n let { timeout, onRestart, logger = console, ...farmOptions } = options\n\n let restartPromise: Promise<typeof RESTARTED>\n let resolveRestartPromise: (arg: typeof RESTARTED) => void\n let activeTasks = 0\n\n this._worker = undefined\n\n // ensure we end workers if they weren't before exit\n process.on('exit', () => {\n this.close()\n })\n\n const createWorker = () => {\n this._worker = new JestWorker(workerPath, {\n ...farmOptions,\n forkOptions: {\n ...farmOptions.forkOptions,\n env: {\n ...((farmOptions.forkOptions?.env || {}) as any),\n ...process.env,\n IS_NEXT_WORKER: 'true',\n } as any,\n },\n maxRetries: 0,\n }) as JestWorker\n restartPromise = new Promise(\n (resolve) => (resolveRestartPromise = resolve)\n )\n\n /**\n * Jest Worker has two worker types, ChildProcessWorker (uses child_process) and NodeThreadWorker (uses worker_threads)\n * Next.js uses ChildProcessWorker by default, but it can be switched to NodeThreadWorker with an experimental flag\n *\n * We only want to handle ChildProcessWorker's orphan process issue, so we access the private property \"_child\":\n * https://github.com/facebook/jest/blob/b38d7d345a81d97d1dc3b68b8458b1837fbf19be/packages/jest-worker/src/workers/ChildProcessWorker.ts\n *\n * But this property is not available in NodeThreadWorker, so we need to check if we are using ChildProcessWorker\n */\n if (!farmOptions.enableWorkerThreads) {\n for (const worker of ((this._worker as any)._workerPool?._workers ||\n []) as {\n _child?: ChildProcess\n }[]) {\n worker._child?.on('exit', (code, signal) => {\n if ((code || (signal && signal !== 'SIGINT')) && this._worker) {\n logger.error(\n `Next.js build worker exited with code: ${code} and signal: ${signal}`\n )\n\n // if a child process doesn't exit gracefully, we want to bubble up the exit code to the parent process\n process.exit(code ?? 1)\n }\n })\n\n // if a child process emits a particular message, we track that as activity\n // so the parent process can keep track of progress\n worker._child?.on('message', ([, data]: [number, unknown]) => {\n if (\n data &&\n typeof data === 'object' &&\n 'type' in data &&\n data.type === 'activity'\n ) {\n onActivity()\n }\n })\n }\n }\n\n let aborted = false\n const onActivityAbort = () => {\n if (!aborted) {\n options.onActivityAbort?.()\n aborted = true\n }\n }\n\n // Listen to the worker's stdout and stderr, if there's any thing logged, abort the activity first\n const abortActivityStreamOnLog = new Transform({\n transform(_chunk, _encoding, callback) {\n onActivityAbort()\n callback()\n },\n })\n // Stop the activity if there's any output from the worker\n this._worker.getStdout().pipe(abortActivityStreamOnLog)\n this._worker.getStderr().pipe(abortActivityStreamOnLog)\n\n // Pipe the worker's stdout and stderr to the parent process\n this._worker.getStdout().pipe(process.stdout)\n this._worker.getStderr().pipe(process.stderr)\n }\n createWorker()\n\n const onHanging = () => {\n const worker = this._worker\n if (!worker) return\n const resolve = resolveRestartPromise\n createWorker()\n logger.warn(\n `Sending SIGTERM signal to static worker due to timeout${\n timeout ? ` of ${timeout / 1000} seconds` : ''\n }. Subsequent errors may be a result of the worker exiting.`\n )\n worker.end().then(() => {\n resolve(RESTARTED)\n })\n }\n\n let hangingTimer: NodeJS.Timeout | false = false\n\n const onActivity = () => {\n if (hangingTimer) clearTimeout(hangingTimer)\n if (options.onActivity) options.onActivity()\n\n hangingTimer = activeTasks > 0 && setTimeout(onHanging, timeout)\n }\n\n for (const method of farmOptions.exposedMethods) {\n if (method.startsWith('_')) continue\n ;(this as any)[method] = timeout\n ? // eslint-disable-next-line no-loop-func\n async (...args: any[]) => {\n activeTasks++\n try {\n let attempts = 0\n for (;;) {\n onActivity()\n const result = await Promise.race([\n (this._worker as any)[method](...args),\n restartPromise,\n ])\n if (result !== RESTARTED) return result\n if (onRestart) onRestart(method, args, ++attempts)\n }\n } finally {\n activeTasks--\n onActivity()\n }\n }\n : (this._worker as any)[method].bind(this._worker)\n }\n }\n\n end(): ReturnType<JestWorker['end']> {\n const worker = this._worker\n if (!worker) {\n throw new Error('Farm is ended, no more calls can be done to it')\n }\n cleanupWorkers(worker)\n this._worker = undefined\n return worker.end()\n }\n\n /**\n * Quietly end the worker if it exists\n */\n close(): void {\n if (this._worker) {\n cleanupWorkers(this._worker)\n this._worker.end()\n }\n }\n}\n"],"names":["Worker","RESTARTED","Symbol","cleanupWorkers","worker","curWorker","_workerPool","_workers","_child","kill","constructor","workerPath","options","timeout","onRestart","logger","console","farmOptions","restartPromise","resolveRestartPromise","activeTasks","_worker","undefined","process","on","close","createWorker","JestWorker","forkOptions","env","IS_NEXT_WORKER","maxRetries","Promise","resolve","enableWorkerThreads","code","signal","error","exit","data","type","onActivity","aborted","onActivityAbort","abortActivityStreamOnLog","Transform","transform","_chunk","_encoding","callback","getStdout","pipe","getStderr","stdout","stderr","onHanging","warn","end","then","hangingTimer","clearTimeout","setTimeout","method","exposedMethods","startsWith","args","attempts","result","race","bind","Error"],"mappings":"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"}
@@ -234,7 +234,7 @@ function assignDefaults(dir, userConfig, silent) {
234
234
  if (((_result_experimental = result.experimental) == null ? void 0 : _result_experimental.allowDevelopmentBuild) && process.env.NODE_ENV !== 'development') {
235
235
  throw new Error(`The experimental.allowDevelopmentBuild option requires NODE_ENV to be explicitly set to 'development'.`);
236
236
  }
237
- if (!((_process_env___NEXT_VERSION = "15.1.6") == null ? void 0 : _process_env___NEXT_VERSION.includes('canary')) && !process.env.__NEXT_TEST_MODE && !process.env.NEXT_PRIVATE_SKIP_CANARY_CHECK) {
237
+ if (!((_process_env___NEXT_VERSION = "15.1.7") == null ? void 0 : _process_env___NEXT_VERSION.includes('canary')) && !process.env.__NEXT_TEST_MODE && !process.env.NEXT_PRIVATE_SKIP_CANARY_CHECK) {
238
238
  var _result_experimental7, _result_experimental8, _result_experimental_turbo3, _result_experimental9;
239
239
  // Prevents usage of certain experimental features outside of canary
240
240
  if ((_result_experimental7 = result.experimental) == null ? void 0 : _result_experimental7.ppr) {
@@ -134,7 +134,7 @@ async function createHotReloaderTurbopack(opts, serverFields, distDir, resetFetc
134
134
  }
135
135
  const hasRewrites = opts.fsChecker.rewrites.afterFiles.length > 0 || opts.fsChecker.rewrites.beforeFiles.length > 0 || opts.fsChecker.rewrites.fallback.length > 0;
136
136
  const hotReloaderSpan = (0, _trace.trace)('hot-reloader', undefined, {
137
- version: "15.1.6"
137
+ version: "15.1.7"
138
138
  });
139
139
  // Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
140
140
  // of the current `next dev` invocation.
@@ -260,7 +260,7 @@ class HotReloaderWebpack {
260
260
  this.previewProps = previewProps;
261
261
  this.rewrites = rewrites;
262
262
  this.hotReloaderSpan = (0, _trace.trace)('hot-reloader', undefined, {
263
- version: "15.1.6"
263
+ version: "15.1.7"
264
264
  });
265
265
  // Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
266
266
  // of the current `next dev` invocation.
@@ -67,7 +67,7 @@ function _interop_require_wildcard(obj, nodeInterop) {
67
67
  return newObj;
68
68
  }
69
69
  function logStartInfo({ networkUrl, appUrl, envInfo, expFeatureInfo, maxExperimentalFeatures = Infinity }) {
70
- _log.bootstrap(`${(0, _picocolors.bold)((0, _picocolors.purple)(`${_log.prefixes.ready} Next.js ${"15.1.6"}`))}${process.env.TURBOPACK ? ' (Turbopack)' : ''}`);
70
+ _log.bootstrap(`${(0, _picocolors.bold)((0, _picocolors.purple)(`${_log.prefixes.ready} Next.js ${"15.1.7"}`))}${process.env.TURBOPACK ? ' (Turbopack)' : ''}`);
71
71
  if (appUrl) {
72
72
  _log.bootstrap(`- Local: ${appUrl}`);
73
73
  }
@@ -111,7 +111,7 @@ async function getRequestHandlers({ dir, port, isDev, onDevServerCleanup, server
111
111
  async function startServer(serverOptions) {
112
112
  const { dir, isDev, hostname, minimalMode, allowRetry, keepAliveTimeout, selfSignedCertificate } = serverOptions;
113
113
  let { port } = serverOptions;
114
- process.title = `next-server (v${"15.1.6"})`;
114
+ process.title = `next-server (v${"15.1.7"})`;
115
115
  let handlersReady = ()=>{};
116
116
  let handlersError = ()=>{};
117
117
  let handlersPromise = new Promise((resolve, reject)=>{
@@ -27,6 +27,10 @@ async function sendResponse(req, res, response, waitUntil) {
27
27
  'proxy-authenticate'
28
28
  ];
29
29
  (_response_headers = response.headers) == null ? void 0 : _response_headers.forEach((value, name)=>{
30
+ // `x-middleware-set-cookie` is an internal header not needed for the response
31
+ if (name.toLowerCase() === 'x-middleware-set-cookie') {
32
+ return;
33
+ }
30
34
  // The append handling is special cased for `set-cookie`.
31
35
  if (name.toLowerCase() === 'set-cookie') {
32
36
  // TODO: (wyattjoh) replace with native response iteration when we can upgrade undici
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/server/send-response.ts"],"sourcesContent":["import type { BaseNextRequest, BaseNextResponse } from './base-http'\nimport { isNodeNextResponse } from './base-http/helpers'\n\nimport { pipeToNodeResponse } from './pipe-readable'\nimport { splitCookiesString } from './web/utils'\n\n/**\n * Sends the response on the underlying next response object.\n *\n * @param req the underlying request object\n * @param res the underlying response object\n * @param response the response to send\n */\nexport async function sendResponse(\n req: BaseNextRequest,\n res: BaseNextResponse,\n response: Response,\n waitUntil?: Promise<unknown>\n): Promise<void> {\n if (\n // The type check here ensures that `req` is correctly typed, and the\n // environment variable check provides dead code elimination.\n process.env.NEXT_RUNTIME !== 'edge' &&\n isNodeNextResponse(res)\n ) {\n // Copy over the response status.\n res.statusCode = response.status\n res.statusMessage = response.statusText\n\n // can add more headers to this list if needed\n const headersWithMultipleValuesAllowed = [\n 'set-cookie',\n 'www-authenticate',\n 'proxy-authenticate',\n ]\n\n // Copy over the response headers.\n response.headers?.forEach((value, name) => {\n // The append handling is special cased for `set-cookie`.\n if (name.toLowerCase() === 'set-cookie') {\n // TODO: (wyattjoh) replace with native response iteration when we can upgrade undici\n for (const cookie of splitCookiesString(value)) {\n res.appendHeader(name, cookie)\n }\n } else {\n // only append the header if it is either not present in the outbound response\n // or if the header supports multiple values\n const isHeaderPresent = typeof res.getHeader(name) !== 'undefined'\n if (\n headersWithMultipleValuesAllowed.includes(name.toLowerCase()) ||\n !isHeaderPresent\n ) {\n res.appendHeader(name, value)\n }\n }\n })\n\n /**\n * The response can't be directly piped to the underlying response. The\n * following is duplicated from the edge runtime handler.\n *\n * See packages/next/server/next-server.ts\n */\n\n const { originalResponse } = res\n\n // A response body must not be sent for HEAD requests. See https://httpwg.org/specs/rfc9110.html#HEAD\n if (response.body && req.method !== 'HEAD') {\n await pipeToNodeResponse(response.body, originalResponse, waitUntil)\n } else {\n originalResponse.end()\n }\n }\n}\n"],"names":["sendResponse","req","res","response","waitUntil","process","env","NEXT_RUNTIME","isNodeNextResponse","statusCode","status","statusMessage","statusText","headersWithMultipleValuesAllowed","headers","forEach","value","name","toLowerCase","cookie","splitCookiesString","appendHeader","isHeaderPresent","getHeader","includes","originalResponse","body","method","pipeToNodeResponse","end"],"mappings":";;;;+BAasBA;;;eAAAA;;;yBAZa;8BAEA;uBACA;AAS5B,eAAeA,aACpBC,GAAoB,EACpBC,GAAqB,EACrBC,QAAkB,EAClBC,SAA4B;IAE5B,IACE,qEAAqE;IACrE,6DAA6D;IAC7DC,QAAQC,GAAG,CAACC,YAAY,KAAK,UAC7BC,IAAAA,2BAAkB,EAACN,MACnB;YAYA,kCAAkC;QAClCC;QAZA,iCAAiC;QACjCD,IAAIO,UAAU,GAAGN,SAASO,MAAM;QAChCR,IAAIS,aAAa,GAAGR,SAASS,UAAU;QAEvC,8CAA8C;QAC9C,MAAMC,mCAAmC;YACvC;YACA;YACA;SACD;SAGDV,oBAAAA,SAASW,OAAO,qBAAhBX,kBAAkBY,OAAO,CAAC,CAACC,OAAOC;YAChC,yDAAyD;YACzD,IAAIA,KAAKC,WAAW,OAAO,cAAc;gBACvC,qFAAqF;gBACrF,KAAK,MAAMC,UAAUC,IAAAA,yBAAkB,EAACJ,OAAQ;oBAC9Cd,IAAImB,YAAY,CAACJ,MAAME;gBACzB;YACF,OAAO;gBACL,8EAA8E;gBAC9E,4CAA4C;gBAC5C,MAAMG,kBAAkB,OAAOpB,IAAIqB,SAAS,CAACN,UAAU;gBACvD,IACEJ,iCAAiCW,QAAQ,CAACP,KAAKC,WAAW,OAC1D,CAACI,iBACD;oBACApB,IAAImB,YAAY,CAACJ,MAAMD;gBACzB;YACF;QACF;QAEA;;;;;KAKC,GAED,MAAM,EAAES,gBAAgB,EAAE,GAAGvB;QAE7B,qGAAqG;QACrG,IAAIC,SAASuB,IAAI,IAAIzB,IAAI0B,MAAM,KAAK,QAAQ;YAC1C,MAAMC,IAAAA,gCAAkB,EAACzB,SAASuB,IAAI,EAAED,kBAAkBrB;QAC5D,OAAO;YACLqB,iBAAiBI,GAAG;QACtB;IACF;AACF"}
1
+ {"version":3,"sources":["../../src/server/send-response.ts"],"sourcesContent":["import type { BaseNextRequest, BaseNextResponse } from './base-http'\nimport { isNodeNextResponse } from './base-http/helpers'\n\nimport { pipeToNodeResponse } from './pipe-readable'\nimport { splitCookiesString } from './web/utils'\n\n/**\n * Sends the response on the underlying next response object.\n *\n * @param req the underlying request object\n * @param res the underlying response object\n * @param response the response to send\n */\nexport async function sendResponse(\n req: BaseNextRequest,\n res: BaseNextResponse,\n response: Response,\n waitUntil?: Promise<unknown>\n): Promise<void> {\n if (\n // The type check here ensures that `req` is correctly typed, and the\n // environment variable check provides dead code elimination.\n process.env.NEXT_RUNTIME !== 'edge' &&\n isNodeNextResponse(res)\n ) {\n // Copy over the response status.\n res.statusCode = response.status\n res.statusMessage = response.statusText\n\n // can add more headers to this list if needed\n const headersWithMultipleValuesAllowed = [\n 'set-cookie',\n 'www-authenticate',\n 'proxy-authenticate',\n ]\n\n // Copy over the response headers.\n response.headers?.forEach((value, name) => {\n // `x-middleware-set-cookie` is an internal header not needed for the response\n if (name.toLowerCase() === 'x-middleware-set-cookie') {\n return\n }\n\n // The append handling is special cased for `set-cookie`.\n if (name.toLowerCase() === 'set-cookie') {\n // TODO: (wyattjoh) replace with native response iteration when we can upgrade undici\n for (const cookie of splitCookiesString(value)) {\n res.appendHeader(name, cookie)\n }\n } else {\n // only append the header if it is either not present in the outbound response\n // or if the header supports multiple values\n const isHeaderPresent = typeof res.getHeader(name) !== 'undefined'\n if (\n headersWithMultipleValuesAllowed.includes(name.toLowerCase()) ||\n !isHeaderPresent\n ) {\n res.appendHeader(name, value)\n }\n }\n })\n\n /**\n * The response can't be directly piped to the underlying response. The\n * following is duplicated from the edge runtime handler.\n *\n * See packages/next/server/next-server.ts\n */\n\n const { originalResponse } = res\n\n // A response body must not be sent for HEAD requests. See https://httpwg.org/specs/rfc9110.html#HEAD\n if (response.body && req.method !== 'HEAD') {\n await pipeToNodeResponse(response.body, originalResponse, waitUntil)\n } else {\n originalResponse.end()\n }\n }\n}\n"],"names":["sendResponse","req","res","response","waitUntil","process","env","NEXT_RUNTIME","isNodeNextResponse","statusCode","status","statusMessage","statusText","headersWithMultipleValuesAllowed","headers","forEach","value","name","toLowerCase","cookie","splitCookiesString","appendHeader","isHeaderPresent","getHeader","includes","originalResponse","body","method","pipeToNodeResponse","end"],"mappings":";;;;+BAasBA;;;eAAAA;;;yBAZa;8BAEA;uBACA;AAS5B,eAAeA,aACpBC,GAAoB,EACpBC,GAAqB,EACrBC,QAAkB,EAClBC,SAA4B;IAE5B,IACE,qEAAqE;IACrE,6DAA6D;IAC7DC,QAAQC,GAAG,CAACC,YAAY,KAAK,UAC7BC,IAAAA,2BAAkB,EAACN,MACnB;YAYA,kCAAkC;QAClCC;QAZA,iCAAiC;QACjCD,IAAIO,UAAU,GAAGN,SAASO,MAAM;QAChCR,IAAIS,aAAa,GAAGR,SAASS,UAAU;QAEvC,8CAA8C;QAC9C,MAAMC,mCAAmC;YACvC;YACA;YACA;SACD;SAGDV,oBAAAA,SAASW,OAAO,qBAAhBX,kBAAkBY,OAAO,CAAC,CAACC,OAAOC;YAChC,8EAA8E;YAC9E,IAAIA,KAAKC,WAAW,OAAO,2BAA2B;gBACpD;YACF;YAEA,yDAAyD;YACzD,IAAID,KAAKC,WAAW,OAAO,cAAc;gBACvC,qFAAqF;gBACrF,KAAK,MAAMC,UAAUC,IAAAA,yBAAkB,EAACJ,OAAQ;oBAC9Cd,IAAImB,YAAY,CAACJ,MAAME;gBACzB;YACF,OAAO;gBACL,8EAA8E;gBAC9E,4CAA4C;gBAC5C,MAAMG,kBAAkB,OAAOpB,IAAIqB,SAAS,CAACN,UAAU;gBACvD,IACEJ,iCAAiCW,QAAQ,CAACP,KAAKC,WAAW,OAC1D,CAACI,iBACD;oBACApB,IAAImB,YAAY,CAACJ,MAAMD;gBACzB;YACF;QACF;QAEA;;;;;KAKC,GAED,MAAM,EAAES,gBAAgB,EAAE,GAAGvB;QAE7B,qGAAqG;QACrG,IAAIC,SAASuB,IAAI,IAAIzB,IAAI0B,MAAM,KAAK,QAAQ;YAC1C,MAAMC,IAAAA,gCAAkB,EAACzB,SAASuB,IAAI,EAAED,kBAAkBrB;QAC5D,OAAO;YACLqB,iBAAiBI,GAAG;QACtB;IACF;AACF"}