next 16.3.3 → 16.3.4
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/bin/next +2 -2
- package/dist/build/index.js +3 -3
- package/dist/build/swc/index.js +1 -1
- package/dist/build/turbopack-analyze/index.js +1 -1
- package/dist/build/turbopack-build/impl.js +1 -1
- package/dist/build/webpack/loaders/next-image-loader/blur.js +2 -1
- package/dist/build/webpack/loaders/next-image-loader/blur.js.map +1 -1
- package/dist/build/webpack-config.js +3 -3
- package/dist/bundle-analyzer/404.html +1 -1
- package/dist/bundle-analyzer/__next.__PAGE__.txt +1 -1
- package/dist/bundle-analyzer/__next._full.txt +1 -1
- package/dist/bundle-analyzer/__next._head.txt +1 -1
- package/dist/bundle-analyzer/__next._index.txt +1 -1
- package/dist/bundle-analyzer/__next._tree.txt +1 -1
- package/dist/bundle-analyzer/_not-found/__next._full.txt +1 -1
- package/dist/bundle-analyzer/_not-found/__next._head.txt +1 -1
- package/dist/bundle-analyzer/_not-found/__next._index.txt +1 -1
- package/dist/bundle-analyzer/_not-found/__next._not-found.__PAGE__.txt +1 -1
- package/dist/bundle-analyzer/_not-found/__next._not-found.txt +1 -1
- package/dist/bundle-analyzer/_not-found/__next._tree.txt +1 -1
- package/dist/bundle-analyzer/_not-found.html +1 -1
- package/dist/bundle-analyzer/_not-found.txt +1 -1
- package/dist/bundle-analyzer/index.html +1 -1
- package/dist/bundle-analyzer/index.txt +1 -1
- package/dist/cli/next-build.js +1 -1
- package/dist/cli/next-post-build.js +1 -1
- package/dist/client/app-bootstrap.js +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/legacy/image.js +2 -8
- package/dist/client/legacy/image.js.map +1 -1
- package/dist/compiled/next-server/pages-api-turbo.runtime.prod.js +1 -1
- package/dist/compiled/next-server/pages-api-turbo.runtime.prod.js.map +1 -1
- package/dist/compiled/next-server/pages-api.runtime.dev.js +1 -1
- package/dist/compiled/next-server/pages-api.runtime.dev.js.map +1 -1
- package/dist/compiled/next-server/pages-turbo.runtime.prod.js +1 -1
- package/dist/compiled/next-server/pages-turbo.runtime.prod.js.map +1 -1
- package/dist/compiled/next-server/pages.runtime.dev.js +1 -1
- package/dist/compiled/next-server/pages.runtime.dev.js.map +1 -1
- package/dist/esm/build/index.js +3 -3
- package/dist/esm/build/swc/index.js +1 -1
- package/dist/esm/build/turbopack-analyze/index.js +1 -1
- package/dist/esm/build/turbopack-build/impl.js +1 -1
- package/dist/esm/build/webpack/loaders/next-image-loader/blur.js +2 -1
- package/dist/esm/build/webpack/loaders/next-image-loader/blur.js.map +1 -1
- package/dist/esm/build/webpack-config.js +3 -3
- package/dist/esm/client/app-bootstrap.js +1 -1
- package/dist/esm/client/index.js +1 -1
- package/dist/esm/client/legacy/image.js +2 -8
- package/dist/esm/client/legacy/image.js.map +1 -1
- package/dist/esm/lib/patch-incorrect-lockfile.js +3 -3
- package/dist/esm/lib/typescript/runTypeScriptCli.js +2 -2
- package/dist/esm/lib/typescript/runTypeScriptCli.js.map +1 -1
- package/dist/esm/lib/verify-typescript-setup.js +3 -1
- package/dist/esm/lib/verify-typescript-setup.js.map +1 -1
- package/dist/esm/server/config.js +1 -1
- package/dist/esm/server/dev/hot-reloader-turbopack.js +2 -2
- package/dist/esm/server/dev/hot-reloader-webpack.js +1 -1
- package/dist/esm/server/image-optimizer.js +2 -2
- package/dist/esm/server/image-optimizer.js.map +1 -1
- package/dist/esm/server/lib/app-info-log.js +1 -1
- package/dist/esm/server/lib/start-server.js +1 -1
- package/dist/esm/shared/lib/errors/canary-only-config-error.js +1 -1
- package/dist/esm/shared/lib/get-img-props.js +2 -8
- package/dist/esm/shared/lib/get-img-props.js.map +1 -1
- package/dist/experimental/testmode/fetch.js +10 -2
- package/dist/experimental/testmode/fetch.js.map +1 -1
- package/dist/lib/patch-incorrect-lockfile.js +3 -3
- package/dist/lib/typescript/runTypeScriptCli.js +2 -2
- package/dist/lib/typescript/runTypeScriptCli.js.map +1 -1
- package/dist/lib/verify-typescript-setup.js +3 -1
- package/dist/lib/verify-typescript-setup.js.map +1 -1
- package/dist/server/config.js +1 -1
- package/dist/server/dev/hot-reloader-turbopack.js +2 -2
- package/dist/server/dev/hot-reloader-webpack.js +1 -1
- package/dist/server/image-optimizer.js +2 -2
- package/dist/server/image-optimizer.js.map +1 -1
- package/dist/server/lib/app-info-log.js +1 -1
- package/dist/server/lib/start-server.js +1 -1
- package/dist/shared/lib/errors/canary-only-config-error.js +1 -1
- package/dist/shared/lib/get-img-props.js +2 -8
- package/dist/shared/lib/get-img-props.js.map +1 -1
- package/dist/telemetry/anonymous-meta.js +1 -1
- package/dist/telemetry/events/session-stopped.js +2 -2
- package/dist/telemetry/events/swc-load-failure.js +1 -1
- package/dist/telemetry/events/version.js +2 -2
- package/package.json +11 -11
- /package/dist/bundle-analyzer/_next/static/{3H_RXABXBUagMrHyvStjP → Dz6lURlWhsYfti5hT8XRr}/_buildManifest.js +0 -0
- /package/dist/bundle-analyzer/_next/static/{3H_RXABXBUagMrHyvStjP → Dz6lURlWhsYfti5hT8XRr}/_clientMiddlewareManifest.js +0 -0
- /package/dist/bundle-analyzer/_next/static/{3H_RXABXBUagMrHyvStjP → Dz6lURlWhsYfti5hT8XRr}/_ssgManifest.js +0 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/typescript/runTypeScriptCli.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport path from 'node:path'\nimport { spawnSync } from 'node:child_process'\n\nimport spawn from 'next/dist/compiled/cross-spawn'\n\nimport { bold } from '../picocolors'\nimport { resolveFrom } from '../resolve-from'\n\nexport interface TypeScriptPackageInfo {\n packageJsonPath: string\n packageDir: string\n version: string\n apiPath?: string\n tscPath?: string\n}\n\nexport function getTypeScriptPackageInfo(\n baseDir: string\n): TypeScriptPackageInfo | null {\n let packageJsonPath: string\n try {\n packageJsonPath = resolveFrom(baseDir, 'typescript/package.json')\n } catch {\n return null\n }\n\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as {\n version: string\n type?: string\n bin?: string | Record<string, string>\n }\n const packageDir = path.dirname(packageJsonPath)\n const apiPath = path.join(packageDir, 'lib', 'typescript.js')\n const tscBin =\n typeof packageJson.bin === 'string' ? packageJson.bin : packageJson.bin?.tsc\n const tscBinPath = tscBin ? path.resolve(packageDir, tscBin) : undefined\n let tscPath = tscBinPath\n\n if (\n tscBinPath &&\n existsSync(tscBinPath) &&\n packageJson.type === 'module' &&\n path.extname(tscBinPath) === ''\n ) {\n // TypeScript 7's extensionless ESM bin wrapper cannot be used as Node's\n // main entry point on Node.js 20.9. Its imported JS entry is the same CLI\n // wrapper and works across all supported Node.js versions.\n const tscJsPath = path.join(packageDir, 'lib', 'tsc.js')\n if (existsSync(tscJsPath)) {\n tscPath = tscJsPath\n }\n }\n\n return {\n packageJsonPath,\n packageDir,\n version: packageJson.version,\n apiPath: existsSync(apiPath) ? apiPath : undefined,\n tscPath: tscPath && existsSync(tscPath) ? tscPath : undefined,\n }\n}\n\nexport function hasNativeTypeScriptPreview(baseDir: string): boolean {\n try {\n resolveFrom(baseDir, '@typescript/native-preview/package.json')\n return true\n } catch {\n return false\n }\n}\n\nexport function getTypeScriptApiMissingError(version: string): Error {\n return new Error(\n `TypeScript ${version} does not provide the compiler API required by Next.js. ` +\n `Set ${bold('experimental.useTypeScriptCli')} back to true in your Next.js config to use the TypeScript CLI, ` +\n `or install TypeScript 6 instead.`\n )\n}\n\nexport interface TypeScriptCliResult {\n exitCode: number\n signal: NodeJS.Signals | null\n stdout: string\n stderr: string\n}\n\nconst terminationSignals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM', 'SIGHUP']\n\nexport function runTypeScriptCli({\n cwd,\n tscPath,\n args,\n captureOutput = false,\n onFirstOutput,\n}: {\n cwd: string\n tscPath: string\n args: string[]\n /**\n * Accumulate stdout/stderr into the resolved result instead of forwarding it\n * to this process's stdout/stderr (for e.g. parsing `--showConfig` output).\n */\n captureOutput?: boolean\n /**\n * Called once, on the first chunk of forwarded output. Used to stop the build\n * spinner before `tsc`'s diagnostics appear. Not called when capturing.\n */\n onFirstOutput?: () => void\n}): Promise<TypeScriptCliResult> {\n return new Promise((resolve, reject) => {\n const child = spawn(process.execPath, [tscPath, ...args], {\n cwd,\n // TypeScript 7's Node wrapper starts the native compiler synchronously\n // on older Node.js releases. A separate process group lets termination\n // reach both processes instead of orphaning the native compiler.\n detached: process.platform !== 'win32',\n shell: false,\n stdio: ['ignore', 'pipe', 'pipe'],\n env: {\n ...process.env,\n // Piping stdio makes `tsc` disable colored/pretty diagnostics. Restore\n // them when we are forwarding output to a TTY (not capturing it for\n // parsing, e.g. `--showConfig`).\n ...(!captureOutput && process.stdout.isTTY\n ? { FORCE_COLOR: '1' }\n : undefined),\n },\n })\n\n let stdout = ''\n let stderr = ''\n\n child.stdout?.setEncoding('utf8')\n child.stderr?.setEncoding('utf8')\n\n if (captureOutput) {\n child.stdout?.on('data', (chunk: string) => {\n stdout += chunk\n })\n child.stderr?.on('data', (chunk: string) => {\n stderr += chunk\n })\n } else {\n const forward = (dest: NodeJS.WriteStream, chunk: string) => {\n onFirstOutput?.()\n onFirstOutput = undefined // ensure we don't call it again\n dest.write(chunk)\n }\n\n child.stdout?.on('data', (chunk: string) => {\n forward(process.stdout, chunk)\n })\n child.stderr?.on('data', (chunk: string) => {\n forward(process.stderr, chunk)\n })\n }\n\n let terminationRequested = false\n const terminateChild = () => {\n if (terminationRequested || child.killed || child.pid === undefined) {\n return\n }\n terminationRequested = true\n\n // The native compiler ignores SIGTERM and SIGINT, so send a kill signal.\n // Target the whole process group so the signal reaches the native compiler whether\n // it is a grandchild or a direct child.\n // https://github.com/microsoft/typescript-go/pull/4592 should improve this in the long run\n if (process.platform === 'win32') {\n spawnSync('taskkill', ['/pid', String(child.pid), '/T', '/F'], {\n stdio: 'ignore',\n windowsHide: true,\n })\n } else {\n try {\n // https://www.youtube.com/watch?v=Fow7iUaKrq4\n process.kill(-child.pid, 'SIGKILL')\n } catch {\n // The process may have exited between the lifecycle event and kill.\n }\n }\n }\n const terminateOnExit = () => terminateChild()\n process.once('exit', terminateOnExit)\n\n const handler = () => {\n terminateChild()\n process.exit(1)\n }\n for (const signal of terminationSignals) {\n process.once(signal, handler)\n }\n\n const cleanup = () => {\n process.off('exit', terminateOnExit)\n for (const signal of terminationSignals) {\n process.off(signal, handler)\n }\n }\n\n let settled = false\n const finish = (settle: () => void) => {\n if (settled) {\n return\n }\n settled = true\n cleanup()\n settle()\n }\n\n child.on('error', (error) => {\n finish(() => reject(error))\n })\n child.on('close', (code, signal) => {\n finish(() => {\n resolve({\n exitCode: code ?? 1,\n signal,\n stdout,\n stderr,\n })\n })\n })\n })\n}\n\nexport async function getTypeScriptConfigurationCli({\n baseDir,\n tsConfigPath,\n tscPath,\n}: {\n baseDir: string\n tsConfigPath: string\n tscPath: string\n}): Promise<{ compilerOptions: Record<string, any> }> {\n const result = await runTypeScriptCli({\n cwd: baseDir,\n tscPath,\n args: ['--showConfig', '--project', tsConfigPath, '--pretty', 'false'],\n captureOutput: true,\n })\n\n if (result.exitCode !== 0) {\n throw new Error(\n [result.stdout, result.stderr].filter(Boolean).join('\\n').trim()\n )\n }\n\n try {\n return JSON.parse(result.stdout)\n } catch (cause) {\n throw new Error(`Could not parse output from TypeScript's --showConfig.`, {\n cause,\n })\n }\n}\n"],"names":["existsSync","readFileSync","path","spawnSync","spawn","bold","resolveFrom","getTypeScriptPackageInfo","baseDir","packageJson","packageJsonPath","JSON","parse","packageDir","dirname","apiPath","join","tscBin","bin","tsc","tscBinPath","resolve","undefined","tscPath","type","extname","tscJsPath","version","hasNativeTypeScriptPreview","getTypeScriptApiMissingError","Error","terminationSignals","runTypeScriptCli","cwd","args","captureOutput","onFirstOutput","Promise","reject","child","process","execPath","detached","platform","shell","stdio","env","stdout","isTTY","FORCE_COLOR","stderr","setEncoding","on","chunk","forward","dest","write","terminationRequested","terminateChild","killed","pid","String","windowsHide","kill","terminateOnExit","once","handler","exit","signal","cleanup","off","settled","finish","settle","error","code","exitCode","getTypeScriptConfigurationCli","tsConfigPath","result","filter","Boolean","trim","cause"],"mappings":"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","ignoreList":[0]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/typescript/runTypeScriptCli.ts"],"sourcesContent":["import { existsSync, readFileSync } from 'node:fs'\nimport path from 'node:path'\nimport { spawnSync } from 'node:child_process'\n\nimport spawn from 'next/dist/compiled/cross-spawn'\n\nimport { bold } from '../picocolors'\nimport { resolveFrom } from '../resolve-from'\n\nexport interface TypeScriptPackageInfo {\n packageJsonPath: string\n packageDir: string\n version: string\n apiPath?: string\n tscPath?: string\n}\n\nexport function getTypeScriptPackageInfo(\n baseDir: string\n): TypeScriptPackageInfo | null {\n let packageJsonPath: string\n try {\n packageJsonPath = resolveFrom(baseDir, 'typescript/package.json')\n } catch {\n return null\n }\n\n const packageJson = JSON.parse(readFileSync(packageJsonPath, 'utf8')) as {\n version: string\n type?: string\n bin?: string | Record<string, string>\n }\n const packageDir = path.dirname(packageJsonPath)\n const apiPath = path.join(packageDir, 'lib', 'typescript.js')\n const tscBin =\n typeof packageJson.bin === 'string'\n ? packageJson.bin\n : (packageJson.bin?.tsc ??\n Object.entries(packageJson.bin ?? {}).find(([name]) =>\n /^tsc\\d+$/.test(name)\n )?.[1])\n const tscBinPath = tscBin ? path.resolve(packageDir, tscBin) : undefined\n let tscPath = tscBinPath\n\n if (\n tscBinPath &&\n existsSync(tscBinPath) &&\n packageJson.type === 'module' &&\n path.extname(tscBinPath) === ''\n ) {\n // TypeScript 7's extensionless ESM bin wrapper cannot be used as Node's\n // main entry point on Node.js 20.9. Its imported JS entry is the same CLI\n // wrapper and works across all supported Node.js versions.\n const tscJsPath = path.join(packageDir, 'lib', 'tsc.js')\n if (existsSync(tscJsPath)) {\n tscPath = tscJsPath\n }\n }\n\n return {\n packageJsonPath,\n packageDir,\n version: packageJson.version,\n apiPath: existsSync(apiPath) ? apiPath : undefined,\n tscPath: tscPath && existsSync(tscPath) ? tscPath : undefined,\n }\n}\n\nexport function hasNativeTypeScriptPreview(baseDir: string): boolean {\n try {\n resolveFrom(baseDir, '@typescript/native-preview/package.json')\n return true\n } catch {\n return false\n }\n}\n\nexport function getTypeScriptApiMissingError(version: string): Error {\n return new Error(\n `TypeScript ${version} does not provide the compiler API required by Next.js. ` +\n `Set ${bold('experimental.useTypeScriptCli')} back to true in your Next.js config to use the TypeScript CLI, ` +\n `or install TypeScript 6 instead.`\n )\n}\n\nexport interface TypeScriptCliResult {\n exitCode: number\n signal: NodeJS.Signals | null\n stdout: string\n stderr: string\n}\n\nconst terminationSignals: NodeJS.Signals[] = ['SIGINT', 'SIGTERM', 'SIGHUP']\n\nexport function runTypeScriptCli({\n cwd,\n tscPath,\n args,\n captureOutput = false,\n onFirstOutput,\n}: {\n cwd: string\n tscPath: string\n args: string[]\n /**\n * Accumulate stdout/stderr into the resolved result instead of forwarding it\n * to this process's stdout/stderr (for e.g. parsing `--showConfig` output).\n */\n captureOutput?: boolean\n /**\n * Called once, on the first chunk of forwarded output. Used to stop the build\n * spinner before `tsc`'s diagnostics appear. Not called when capturing.\n */\n onFirstOutput?: () => void\n}): Promise<TypeScriptCliResult> {\n return new Promise((resolve, reject) => {\n const child = spawn(process.execPath, [tscPath, ...args], {\n cwd,\n // TypeScript 7's Node wrapper starts the native compiler synchronously\n // on older Node.js releases. A separate process group lets termination\n // reach both processes instead of orphaning the native compiler.\n detached: process.platform !== 'win32',\n shell: false,\n stdio: ['ignore', 'pipe', 'pipe'],\n env: {\n ...process.env,\n // Piping stdio makes `tsc` disable colored/pretty diagnostics. Restore\n // them when we are forwarding output to a TTY (not capturing it for\n // parsing, e.g. `--showConfig`).\n ...(!captureOutput && process.stdout.isTTY\n ? { FORCE_COLOR: '1' }\n : undefined),\n },\n })\n\n let stdout = ''\n let stderr = ''\n\n child.stdout?.setEncoding('utf8')\n child.stderr?.setEncoding('utf8')\n\n if (captureOutput) {\n child.stdout?.on('data', (chunk: string) => {\n stdout += chunk\n })\n child.stderr?.on('data', (chunk: string) => {\n stderr += chunk\n })\n } else {\n const forward = (dest: NodeJS.WriteStream, chunk: string) => {\n onFirstOutput?.()\n onFirstOutput = undefined // ensure we don't call it again\n dest.write(chunk)\n }\n\n child.stdout?.on('data', (chunk: string) => {\n forward(process.stdout, chunk)\n })\n child.stderr?.on('data', (chunk: string) => {\n forward(process.stderr, chunk)\n })\n }\n\n let terminationRequested = false\n const terminateChild = () => {\n if (terminationRequested || child.killed || child.pid === undefined) {\n return\n }\n terminationRequested = true\n\n // The native compiler ignores SIGTERM and SIGINT, so send a kill signal.\n // Target the whole process group so the signal reaches the native compiler whether\n // it is a grandchild or a direct child.\n // https://github.com/microsoft/typescript-go/pull/4592 should improve this in the long run\n if (process.platform === 'win32') {\n spawnSync('taskkill', ['/pid', String(child.pid), '/T', '/F'], {\n stdio: 'ignore',\n windowsHide: true,\n })\n } else {\n try {\n // https://www.youtube.com/watch?v=Fow7iUaKrq4\n process.kill(-child.pid, 'SIGKILL')\n } catch {\n // The process may have exited between the lifecycle event and kill.\n }\n }\n }\n const terminateOnExit = () => terminateChild()\n process.once('exit', terminateOnExit)\n\n const handler = () => {\n terminateChild()\n process.exit(1)\n }\n for (const signal of terminationSignals) {\n process.once(signal, handler)\n }\n\n const cleanup = () => {\n process.off('exit', terminateOnExit)\n for (const signal of terminationSignals) {\n process.off(signal, handler)\n }\n }\n\n let settled = false\n const finish = (settle: () => void) => {\n if (settled) {\n return\n }\n settled = true\n cleanup()\n settle()\n }\n\n child.on('error', (error) => {\n finish(() => reject(error))\n })\n child.on('close', (code, signal) => {\n finish(() => {\n resolve({\n exitCode: code ?? 1,\n signal,\n stdout,\n stderr,\n })\n })\n })\n })\n}\n\nexport async function getTypeScriptConfigurationCli({\n baseDir,\n tsConfigPath,\n tscPath,\n}: {\n baseDir: string\n tsConfigPath: string\n tscPath: string\n}): Promise<{ compilerOptions: Record<string, any> }> {\n const result = await runTypeScriptCli({\n cwd: baseDir,\n tscPath,\n args: ['--showConfig', '--project', tsConfigPath, '--pretty', 'false'],\n captureOutput: true,\n })\n\n if (result.exitCode !== 0) {\n throw new Error(\n [result.stdout, result.stderr].filter(Boolean).join('\\n').trim()\n )\n }\n\n try {\n return JSON.parse(result.stdout)\n } catch (cause) {\n throw new Error(`Could not parse output from TypeScript's --showConfig.`, {\n cause,\n })\n }\n}\n"],"names":["existsSync","readFileSync","path","spawnSync","spawn","bold","resolveFrom","getTypeScriptPackageInfo","baseDir","packageJson","Object","packageJsonPath","JSON","parse","packageDir","dirname","apiPath","join","tscBin","bin","tsc","entries","find","name","test","tscBinPath","resolve","undefined","tscPath","type","extname","tscJsPath","version","hasNativeTypeScriptPreview","getTypeScriptApiMissingError","Error","terminationSignals","runTypeScriptCli","cwd","args","captureOutput","onFirstOutput","Promise","reject","child","process","execPath","detached","platform","shell","stdio","env","stdout","isTTY","FORCE_COLOR","stderr","setEncoding","on","chunk","forward","dest","write","terminationRequested","terminateChild","killed","pid","String","windowsHide","kill","terminateOnExit","once","handler","exit","signal","cleanup","off","settled","finish","settle","error","code","exitCode","getTypeScriptConfigurationCli","tsConfigPath","result","filter","Boolean","trim","cause"],"mappings":"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","ignoreList":[0]}
|
|
@@ -18,7 +18,9 @@ const typescriptApiPackage = {
|
|
|
18
18
|
exportsRestrict: true
|
|
19
19
|
};
|
|
20
20
|
const typescriptCliPackage = {
|
|
21
|
-
|
|
21
|
+
// The CLI path is resolved from the package's bin metadata after this initial
|
|
22
|
+
// package-presence check, since aliased TypeScript packages may rename it.
|
|
23
|
+
file: 'typescript/package.json',
|
|
22
24
|
pkg: 'typescript',
|
|
23
25
|
exportsRestrict: true
|
|
24
26
|
};
|
|
@@ -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 {\n MissingDependency,\n NecessaryDependencies,\n} 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'\nimport {\n getTypeScriptApiMissingError,\n getTypeScriptPackageInfo,\n hasNativeTypeScriptPreview,\n} from './typescript/runTypeScriptCli'\n\nconst typescriptApiPackage: MissingDependency = {\n file: 'typescript/lib/typescript.js',\n pkg: 'typescript',\n install: 'typescript@^6.0.0',\n exportsRestrict: true,\n}\n\nconst typescriptCliPackage: MissingDependency = {\n file: 'typescript/bin/tsc',\n pkg: 'typescript',\n exportsRestrict: true,\n}\n\nconst requiredTypePackages: MissingDependency[] = [\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 verifyAndRunTypeScript({\n dir,\n distDir,\n cacheDir,\n strictRouteTypes,\n tsconfigPath,\n shouldRunTypeCheck,\n typedRoutes,\n disableStaticImages,\n hasAppDir,\n hasPagesDir,\n appDir,\n pagesDir,\n debugBuildPaths,\n useTypeScriptCli = false,\n onFirstCliOutput,\n}: {\n dir: string\n distDir: string\n cacheDir?: string\n strictRouteTypes: boolean\n tsconfigPath: string | undefined\n shouldRunTypeCheck: boolean\n typedRoutes: boolean\n disableStaticImages: boolean\n hasAppDir: boolean\n hasPagesDir: boolean\n appDir?: string\n pagesDir?: string\n debugBuildPaths?: { app?: string[]; pages?: string[] }\n useTypeScriptCli?: boolean\n /**\n * Called once when the CLI checker first produces output, so the caller can\n * stop the build spinner. Only used on the in-process CLI path.\n */\n onFirstCliOutput?: () => void\n}): Promise<{\n result?: TypeCheckResult\n version: string | null\n typeCheckMode: 'typescript-api' | 'typescript-cli'\n}> {\n const tsConfigFileName = tsconfigPath || 'tsconfig.json'\n const resolvedTsConfigPath = path.join(dir, tsConfigFileName)\n const typeCheckMode = useTypeScriptCli ? 'typescript-cli' : 'typescript-api'\n\n // Construct intentDirs from appDir and pagesDir for getTypeScriptIntent\n const intentDirs = [pagesDir, appDir].filter(Boolean) as string[]\n\n try {\n // Check if the project uses TypeScript:\n const intent = await getTypeScriptIntent(dir, intentDirs, tsConfigFileName)\n if (!intent) {\n return { version: null, typeCheckMode }\n }\n\n // Check if @typescript/native-preview is installed as an alternative\n const hasNativePreview = hasNativeTypeScriptPreview(dir)\n const installedTypeScript = getTypeScriptPackageInfo(dir)\n\n if (\n !useTypeScriptCli &&\n !hasNativePreview &&\n installedTypeScript &&\n !installedTypeScript.apiPath\n ) {\n throw getTypeScriptApiMissingError(installedTypeScript.version)\n }\n\n const requiredPackages: MissingDependency[] = [\n useTypeScriptCli ? typescriptCliPackage : typescriptApiPackage,\n ...requiredTypePackages,\n ]\n\n // Ensure TypeScript and necessary `@types/*` are installed:\n let deps: NecessaryDependencies = hasNecessaryDependencies(\n dir,\n requiredPackages\n )\n\n // If @typescript/native-preview is installed and only the typescript package is missing,\n // we can skip auto-installing typescript since the native preview provides TS compilation.\n // However, we still need @types/react and @types/node for type checking.\n if (!useTypeScriptCli && hasNativePreview && deps.missing?.length > 0) {\n const missingWithoutTypescript = deps.missing.filter(\n (dep) => dep.pkg !== 'typescript'\n )\n const onlyTypescriptMissing =\n deps.missing.length === 1 && deps.missing[0].pkg === 'typescript'\n\n if (onlyTypescriptMissing) {\n // @typescript/native-preview is installed and only typescript is missing\n // Skip installation and return early - the project can use the native preview\n log.info(\n `Detected ${bold('@typescript/native-preview')} as TypeScript compiler. ` +\n `Some Next.js TypeScript features (like type checking during build) require the standard ${bold('typescript')} package.`\n )\n\n // Still write type declarations since they don't require the typescript package\n await writeAppTypeDeclarations({\n baseDir: dir,\n distDir,\n imageImportsEnabled: !disableStaticImages,\n hasPagesDir,\n hasAppDir,\n strictRouteTypes,\n typedRoutes,\n })\n\n return { version: null, typeCheckMode }\n }\n\n // If there are other missing deps besides typescript, only install those\n if (\n missingWithoutTypescript.length > 0 &&\n missingWithoutTypescript.length < deps.missing.length\n ) {\n deps.missing = missingWithoutTypescript\n }\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 = hasNecessaryDependencies(dir, requiredPackages)\n }\n\n const typeScriptPackage = getTypeScriptPackageInfo(dir)\n const typeScriptPath = useTypeScriptCli\n ? typeScriptPackage?.tscPath\n : typeScriptPackage?.apiPath\n\n if (!typeScriptPackage || !typeScriptPath) {\n missingDepsError(\n dir,\n deps.missing.length > 0\n ? deps.missing\n : [useTypeScriptCli ? typescriptCliPackage : typescriptApiPackage]\n )\n }\n\n const typescriptVersion = typeScriptPackage.version\n\n if (semver.lt(typescriptVersion, '5.1.0')) {\n log.warn(\n `Minimum recommended TypeScript version is v5.1.0, older versions can potentially be incompatible with Next.js. Detected: ${typescriptVersion}`\n )\n }\n\n // Reconfigure (or create) the user's `tsconfig.json` for them:\n await writeConfigurationDefaults(\n typescriptVersion,\n resolvedTsConfigPath,\n intent.firstTimeSetup,\n hasAppDir,\n distDir,\n hasPagesDir,\n strictRouteTypes\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 distDir,\n imageImportsEnabled: !disableStaticImages,\n hasPagesDir,\n hasAppDir,\n strictRouteTypes,\n typedRoutes,\n })\n\n let result\n if (shouldRunTypeCheck) {\n if (useTypeScriptCli) {\n if (debugBuildPaths) {\n log.warn(\n '`experimental.useTypeScriptCli` checks the complete TypeScript project; `--debug-build-paths` does not limit type checking.'\n )\n }\n\n const { runTypeCheckCli } =\n require('./typescript/runTypeCheckCli') as typeof import('./typescript/runTypeCheckCli')\n result = await runTypeCheckCli({\n baseDir: dir,\n tsConfigPath: resolvedTsConfigPath,\n tscPath: typeScriptPath,\n cacheDir,\n onFirstOutput: onFirstCliOutput,\n })\n } else {\n const { runTypeCheck } =\n require('./typescript/runTypeCheck') as typeof import('./typescript/runTypeCheck')\n // Install native bindings so that code frame rendering works in the worker\n const { installBindings } =\n require('../build/swc/install-bindings') as typeof import('../build/swc/install-bindings')\n await installBindings()\n\n const typescript = (await Promise.resolve(\n require(typeScriptPath)\n )) as typeof import('typescript')\n\n // Verify the project passes type-checking before we go to webpack phase:\n result = await runTypeCheck(\n typescript,\n dir,\n distDir,\n resolvedTsConfigPath,\n cacheDir,\n hasAppDir,\n { app: appDir, pages: pagesDir },\n debugBuildPaths\n )\n }\n }\n return { result, version: typescriptVersion, typeCheckMode }\n } catch (err) {\n // Print the user-facing message here and rethrow. This function runs both\n // in-process (next dev / next test / next typegen, and the CLI type-check\n // during build) and inside a jest worker (the TypeScript-API type-check\n // during build). A thrown error does not survive the worker boundary — the\n // parent only sees `Call retries were exceeded` — so the message must be\n // printed on this side. The caller decides what to do with the throw (exit,\n // or tolerate it as `next dev` does on re-verification).\n if (err instanceof CompileError) {\n // The checker already printed its diagnostics.\n console.error(red('Failed to type check.\\n'))\n if (err.message) {\n console.error(err.message)\n }\n } else if (err instanceof Error) {\n console.error(err.message)\n } else {\n console.error(err)\n }\n throw err\n }\n}\n\n/**\n * Worker entrypoint used by `next build` for the TypeScript-API type-check.\n * `verifyAndRunTypeScript` has already printed any error, so on failure we exit\n * the worker directly rather than rethrowing: a thrown error would be retried by\n * jest-worker and surface in the parent as the unhelpful\n * `Jest worker encountered 1 child process exceptions, exceeding retry limit`.\n */\nexport async function verifyAndRunTypeScriptInWorker(\n options: Parameters<typeof verifyAndRunTypeScript>[0]\n): ReturnType<typeof verifyAndRunTypeScript> {\n try {\n return await verifyAndRunTypeScript(options)\n } catch {\n // The error was already printed by `verifyAndRunTypeScript`.\n // Kill the worker with a non-zero exit code.\n process.exit(1)\n }\n}\n"],"names":["bold","cyan","red","yellow","path","hasNecessaryDependencies","semver","CompileError","log","getTypeScriptIntent","writeAppTypeDeclarations","writeConfigurationDefaults","installDependencies","isCI","missingDepsError","getTypeScriptApiMissingError","getTypeScriptPackageInfo","hasNativeTypeScriptPreview","typescriptApiPackage","file","pkg","install","exportsRestrict","typescriptCliPackage","requiredTypePackages","verifyAndRunTypeScript","dir","distDir","cacheDir","strictRouteTypes","tsconfigPath","shouldRunTypeCheck","typedRoutes","disableStaticImages","hasAppDir","hasPagesDir","appDir","pagesDir","debugBuildPaths","useTypeScriptCli","onFirstCliOutput","tsConfigFileName","resolvedTsConfigPath","join","typeCheckMode","intentDirs","filter","Boolean","deps","intent","version","hasNativePreview","installedTypeScript","apiPath","requiredPackages","missing","length","missingWithoutTypescript","dep","onlyTypescriptMissing","info","baseDir","imageImportsEnabled","console","catch","err","error","command","typeScriptPackage","typeScriptPath","tscPath","typescriptVersion","lt","warn","firstTimeSetup","result","runTypeCheckCli","require","tsConfigPath","onFirstOutput","runTypeCheck","installBindings","typescript","Promise","resolve","app","pages","message","Error","verifyAndRunTypeScriptInWorker","options","process","exit"],"mappings":"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","ignoreList":[0]}
|
|
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 {\n MissingDependency,\n NecessaryDependencies,\n} 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'\nimport {\n getTypeScriptApiMissingError,\n getTypeScriptPackageInfo,\n hasNativeTypeScriptPreview,\n} from './typescript/runTypeScriptCli'\n\nconst typescriptApiPackage: MissingDependency = {\n file: 'typescript/lib/typescript.js',\n pkg: 'typescript',\n install: 'typescript@^6.0.0',\n exportsRestrict: true,\n}\n\nconst typescriptCliPackage: MissingDependency = {\n // The CLI path is resolved from the package's bin metadata after this initial\n // package-presence check, since aliased TypeScript packages may rename it.\n file: 'typescript/package.json',\n pkg: 'typescript',\n exportsRestrict: true,\n}\n\nconst requiredTypePackages: MissingDependency[] = [\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 verifyAndRunTypeScript({\n dir,\n distDir,\n cacheDir,\n strictRouteTypes,\n tsconfigPath,\n shouldRunTypeCheck,\n typedRoutes,\n disableStaticImages,\n hasAppDir,\n hasPagesDir,\n appDir,\n pagesDir,\n debugBuildPaths,\n useTypeScriptCli = false,\n onFirstCliOutput,\n}: {\n dir: string\n distDir: string\n cacheDir?: string\n strictRouteTypes: boolean\n tsconfigPath: string | undefined\n shouldRunTypeCheck: boolean\n typedRoutes: boolean\n disableStaticImages: boolean\n hasAppDir: boolean\n hasPagesDir: boolean\n appDir?: string\n pagesDir?: string\n debugBuildPaths?: { app?: string[]; pages?: string[] }\n useTypeScriptCli?: boolean\n /**\n * Called once when the CLI checker first produces output, so the caller can\n * stop the build spinner. Only used on the in-process CLI path.\n */\n onFirstCliOutput?: () => void\n}): Promise<{\n result?: TypeCheckResult\n version: string | null\n typeCheckMode: 'typescript-api' | 'typescript-cli'\n}> {\n const tsConfigFileName = tsconfigPath || 'tsconfig.json'\n const resolvedTsConfigPath = path.join(dir, tsConfigFileName)\n const typeCheckMode = useTypeScriptCli ? 'typescript-cli' : 'typescript-api'\n\n // Construct intentDirs from appDir and pagesDir for getTypeScriptIntent\n const intentDirs = [pagesDir, appDir].filter(Boolean) as string[]\n\n try {\n // Check if the project uses TypeScript:\n const intent = await getTypeScriptIntent(dir, intentDirs, tsConfigFileName)\n if (!intent) {\n return { version: null, typeCheckMode }\n }\n\n // Check if @typescript/native-preview is installed as an alternative\n const hasNativePreview = hasNativeTypeScriptPreview(dir)\n const installedTypeScript = getTypeScriptPackageInfo(dir)\n\n if (\n !useTypeScriptCli &&\n !hasNativePreview &&\n installedTypeScript &&\n !installedTypeScript.apiPath\n ) {\n throw getTypeScriptApiMissingError(installedTypeScript.version)\n }\n\n const requiredPackages: MissingDependency[] = [\n useTypeScriptCli ? typescriptCliPackage : typescriptApiPackage,\n ...requiredTypePackages,\n ]\n\n // Ensure TypeScript and necessary `@types/*` are installed:\n let deps: NecessaryDependencies = hasNecessaryDependencies(\n dir,\n requiredPackages\n )\n\n // If @typescript/native-preview is installed and only the typescript package is missing,\n // we can skip auto-installing typescript since the native preview provides TS compilation.\n // However, we still need @types/react and @types/node for type checking.\n if (!useTypeScriptCli && hasNativePreview && deps.missing?.length > 0) {\n const missingWithoutTypescript = deps.missing.filter(\n (dep) => dep.pkg !== 'typescript'\n )\n const onlyTypescriptMissing =\n deps.missing.length === 1 && deps.missing[0].pkg === 'typescript'\n\n if (onlyTypescriptMissing) {\n // @typescript/native-preview is installed and only typescript is missing\n // Skip installation and return early - the project can use the native preview\n log.info(\n `Detected ${bold('@typescript/native-preview')} as TypeScript compiler. ` +\n `Some Next.js TypeScript features (like type checking during build) require the standard ${bold('typescript')} package.`\n )\n\n // Still write type declarations since they don't require the typescript package\n await writeAppTypeDeclarations({\n baseDir: dir,\n distDir,\n imageImportsEnabled: !disableStaticImages,\n hasPagesDir,\n hasAppDir,\n strictRouteTypes,\n typedRoutes,\n })\n\n return { version: null, typeCheckMode }\n }\n\n // If there are other missing deps besides typescript, only install those\n if (\n missingWithoutTypescript.length > 0 &&\n missingWithoutTypescript.length < deps.missing.length\n ) {\n deps.missing = missingWithoutTypescript\n }\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 = hasNecessaryDependencies(dir, requiredPackages)\n }\n\n const typeScriptPackage = getTypeScriptPackageInfo(dir)\n const typeScriptPath = useTypeScriptCli\n ? typeScriptPackage?.tscPath\n : typeScriptPackage?.apiPath\n\n if (!typeScriptPackage || !typeScriptPath) {\n missingDepsError(\n dir,\n deps.missing.length > 0\n ? deps.missing\n : [useTypeScriptCli ? typescriptCliPackage : typescriptApiPackage]\n )\n }\n\n const typescriptVersion = typeScriptPackage.version\n\n if (semver.lt(typescriptVersion, '5.1.0')) {\n log.warn(\n `Minimum recommended TypeScript version is v5.1.0, older versions can potentially be incompatible with Next.js. Detected: ${typescriptVersion}`\n )\n }\n\n // Reconfigure (or create) the user's `tsconfig.json` for them:\n await writeConfigurationDefaults(\n typescriptVersion,\n resolvedTsConfigPath,\n intent.firstTimeSetup,\n hasAppDir,\n distDir,\n hasPagesDir,\n strictRouteTypes\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 distDir,\n imageImportsEnabled: !disableStaticImages,\n hasPagesDir,\n hasAppDir,\n strictRouteTypes,\n typedRoutes,\n })\n\n let result\n if (shouldRunTypeCheck) {\n if (useTypeScriptCli) {\n if (debugBuildPaths) {\n log.warn(\n '`experimental.useTypeScriptCli` checks the complete TypeScript project; `--debug-build-paths` does not limit type checking.'\n )\n }\n\n const { runTypeCheckCli } =\n require('./typescript/runTypeCheckCli') as typeof import('./typescript/runTypeCheckCli')\n result = await runTypeCheckCli({\n baseDir: dir,\n tsConfigPath: resolvedTsConfigPath,\n tscPath: typeScriptPath,\n cacheDir,\n onFirstOutput: onFirstCliOutput,\n })\n } else {\n const { runTypeCheck } =\n require('./typescript/runTypeCheck') as typeof import('./typescript/runTypeCheck')\n // Install native bindings so that code frame rendering works in the worker\n const { installBindings } =\n require('../build/swc/install-bindings') as typeof import('../build/swc/install-bindings')\n await installBindings()\n\n const typescript = (await Promise.resolve(\n require(typeScriptPath)\n )) as typeof import('typescript')\n\n // Verify the project passes type-checking before we go to webpack phase:\n result = await runTypeCheck(\n typescript,\n dir,\n distDir,\n resolvedTsConfigPath,\n cacheDir,\n hasAppDir,\n { app: appDir, pages: pagesDir },\n debugBuildPaths\n )\n }\n }\n return { result, version: typescriptVersion, typeCheckMode }\n } catch (err) {\n // Print the user-facing message here and rethrow. This function runs both\n // in-process (next dev / next test / next typegen, and the CLI type-check\n // during build) and inside a jest worker (the TypeScript-API type-check\n // during build). A thrown error does not survive the worker boundary — the\n // parent only sees `Call retries were exceeded` — so the message must be\n // printed on this side. The caller decides what to do with the throw (exit,\n // or tolerate it as `next dev` does on re-verification).\n if (err instanceof CompileError) {\n // The checker already printed its diagnostics.\n console.error(red('Failed to type check.\\n'))\n if (err.message) {\n console.error(err.message)\n }\n } else if (err instanceof Error) {\n console.error(err.message)\n } else {\n console.error(err)\n }\n throw err\n }\n}\n\n/**\n * Worker entrypoint used by `next build` for the TypeScript-API type-check.\n * `verifyAndRunTypeScript` has already printed any error, so on failure we exit\n * the worker directly rather than rethrowing: a thrown error would be retried by\n * jest-worker and surface in the parent as the unhelpful\n * `Jest worker encountered 1 child process exceptions, exceeding retry limit`.\n */\nexport async function verifyAndRunTypeScriptInWorker(\n options: Parameters<typeof verifyAndRunTypeScript>[0]\n): ReturnType<typeof verifyAndRunTypeScript> {\n try {\n return await verifyAndRunTypeScript(options)\n } catch {\n // The error was already printed by `verifyAndRunTypeScript`.\n // Kill the worker with a non-zero exit code.\n process.exit(1)\n }\n}\n"],"names":["bold","cyan","red","yellow","path","hasNecessaryDependencies","semver","CompileError","log","getTypeScriptIntent","writeAppTypeDeclarations","writeConfigurationDefaults","installDependencies","isCI","missingDepsError","getTypeScriptApiMissingError","getTypeScriptPackageInfo","hasNativeTypeScriptPreview","typescriptApiPackage","file","pkg","install","exportsRestrict","typescriptCliPackage","requiredTypePackages","verifyAndRunTypeScript","dir","distDir","cacheDir","strictRouteTypes","tsconfigPath","shouldRunTypeCheck","typedRoutes","disableStaticImages","hasAppDir","hasPagesDir","appDir","pagesDir","debugBuildPaths","useTypeScriptCli","onFirstCliOutput","tsConfigFileName","resolvedTsConfigPath","join","typeCheckMode","intentDirs","filter","Boolean","deps","intent","version","hasNativePreview","installedTypeScript","apiPath","requiredPackages","missing","length","missingWithoutTypescript","dep","onlyTypescriptMissing","info","baseDir","imageImportsEnabled","console","catch","err","error","command","typeScriptPackage","typeScriptPath","tscPath","typescriptVersion","lt","warn","firstTimeSetup","result","runTypeCheckCli","require","tsConfigPath","onFirstOutput","runTypeCheck","installBindings","typescript","Promise","resolve","app","pages","message","Error","verifyAndRunTypeScriptInWorker","options","process","exit"],"mappings":"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","ignoreList":[0]}
|
|
@@ -246,7 +246,7 @@ export async function createHotReloaderTurbopack(opts, serverFields, distDir, re
|
|
|
246
246
|
}
|
|
247
247
|
const hasRewrites = opts.fsChecker.rewrites.afterFiles.length > 0 || opts.fsChecker.rewrites.beforeFiles.length > 0 || opts.fsChecker.rewrites.fallback.length > 0;
|
|
248
248
|
const hotReloaderSpan = trace('hot-reloader', undefined, {
|
|
249
|
-
version: "16.3.
|
|
249
|
+
version: "16.3.4"
|
|
250
250
|
});
|
|
251
251
|
// Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
|
|
252
252
|
// of the current `next dev` invocation.
|
|
@@ -306,7 +306,7 @@ export async function createHotReloaderTurbopack(opts, serverFields, distDir, re
|
|
|
306
306
|
writeRoutesHashesManifest: false,
|
|
307
307
|
currentNodeJsVersion,
|
|
308
308
|
isPersistentCachingEnabled: isFileSystemCacheEnabledForDev(opts.nextConfig),
|
|
309
|
-
nextVersion: "16.3.
|
|
309
|
+
nextVersion: "16.3.4",
|
|
310
310
|
serverHmr: serverFastRefresh
|
|
311
311
|
}, {
|
|
312
312
|
turbopackMemoryEviction: opts.nextConfig.experimental.turbopackMemoryEvictionMode,
|
|
@@ -166,7 +166,7 @@ export default class HotReloaderWebpack {
|
|
|
166
166
|
this.previewProps = previewProps;
|
|
167
167
|
this.rewrites = rewrites;
|
|
168
168
|
this.hotReloaderSpan = trace('hot-reloader', undefined, {
|
|
169
|
-
version: "16.3.
|
|
169
|
+
version: "16.3.4"
|
|
170
170
|
});
|
|
171
171
|
// Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
|
|
172
172
|
// of the current `next dev` invocation.
|
|
@@ -48,8 +48,7 @@ const BYPASS_TYPES = [
|
|
|
48
48
|
ICNS,
|
|
49
49
|
BMP,
|
|
50
50
|
JXL,
|
|
51
|
-
HEIC
|
|
52
|
-
AVIF
|
|
51
|
+
HEIC
|
|
53
52
|
];
|
|
54
53
|
const BLUR_IMG_SIZE = 8 // should match `next-image-loader`
|
|
55
54
|
;
|
|
@@ -87,6 +86,7 @@ export function getSharp(concurrency, operationCache) {
|
|
|
87
86
|
});
|
|
88
87
|
_sharp.unblock({
|
|
89
88
|
operation: [
|
|
89
|
+
'VipsForeignLoadHeif',
|
|
90
90
|
'VipsForeignLoadJpeg',
|
|
91
91
|
'VipsForeignLoadNsgif',
|
|
92
92
|
'VipsForeignLoadPng',
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/server/image-optimizer.ts"],"sourcesContent":["import { createHash } from 'crypto'\nimport { promises } from 'fs'\nimport type { IncomingMessage, ServerResponse } from 'http'\nimport { mediaType } from 'next/dist/compiled/@hapi/accept'\nimport contentDisposition from 'next/dist/compiled/content-disposition'\nimport imageSizeOf from 'next/dist/compiled/image-size'\nimport { detector } from 'next/dist/compiled/image-detector/detector.js'\nimport isAnimated from 'next/dist/compiled/is-animated'\nimport { join } from 'path'\nimport { getImageBlurSvg } from '../shared/lib/image-blur-svg'\nimport type { ImageConfigComplete } from '../shared/lib/image-config'\nimport { hasLocalMatch } from '../shared/lib/match-local-pattern'\nimport { hasRemoteMatch } from '../shared/lib/match-remote-pattern'\nimport type { NextConfigComplete, NextConfigRuntime } from './config-shared'\nimport { createRequestResponseMocks } from './lib/mock-request'\nimport type { NextUrlWithParsedQuery } from './request-meta'\nimport {\n CachedRouteKind,\n IncrementalCacheKind,\n type CachedImageValue,\n type IncrementalCacheEntry,\n type IncrementalCacheValue,\n type IncrementalResponseCacheEntry,\n} from './response-cache'\nimport type { CacheHandler } from './lib/incremental-cache'\nimport { sendEtagResponse } from './send-payload'\nimport { getContentType, getExtension } from './serve-static'\nimport * as Log from '../build/output/log'\nimport isError from '../lib/is-error'\nimport { isPrivateIp } from './is-private-ip'\nimport { getOrInitDiskLRU } from './lib/disk-lru-cache.external'\nimport { parseUrl, parseReqUrl } from '../lib/url'\nimport type { CacheControl } from './lib/cache-control'\nimport { InvariantError } from '../shared/lib/invariant-error'\nimport { lookup } from 'dns/promises'\nimport { isIP } from 'net'\nimport { ALL } from 'dns'\n\ntype XCacheHeader = 'MISS' | 'HIT' | 'STALE'\n\nconst AVIF = 'image/avif'\nconst WEBP = 'image/webp'\nconst PNG = 'image/png'\nconst JPEG = 'image/jpeg'\nconst JXL = 'image/jxl'\nconst JP2 = 'image/jp2'\nconst HEIC = 'image/heic'\nconst GIF = 'image/gif'\nconst SVG = 'image/svg+xml'\nconst ICO = 'image/x-icon'\nconst ICNS = 'image/x-icns'\nconst TIFF = 'image/tiff'\nconst BMP = 'image/bmp'\nconst PDF = 'application/pdf'\nconst CACHE_VERSION = 4\nconst ANIMATABLE_TYPES = [WEBP, PNG, GIF]\nconst BYPASS_TYPES = [SVG, ICO, ICNS, BMP, JXL, HEIC, AVIF]\nconst BLUR_IMG_SIZE = 8 // should match `next-image-loader`\nconst BLUR_QUALITY = 70 // should match `next-image-loader`\n\nlet _sharp: typeof import('sharp').default\n\nasync function initCacheEntries(\n cacheDir: string\n): Promise<Array<{ key: string; size: number; expireAt: number }>> {\n const cacheKeys = await promises.readdir(cacheDir).catch(() => [])\n const entries: Array<{ key: string; size: number; expireAt: number }> = []\n\n for (const cacheKey of cacheKeys) {\n try {\n const { expireAt, buffer } = await readFromCacheDir(cacheDir, cacheKey)\n entries.push({\n key: cacheKey,\n size: buffer.byteLength,\n expireAt,\n })\n } catch {\n // Skip entries that can't be read from disk\n }\n }\n\n // Sort oldest-first so we can replay them chronologically into LRU\n return entries.sort((a, b) => a.expireAt - b.expireAt)\n}\n\nexport function getSharp(\n concurrency: number | null | undefined,\n operationCache: boolean | null | undefined\n) {\n if (_sharp) {\n return _sharp\n }\n try {\n _sharp = require('sharp') as typeof import('sharp').default\n _sharp.block({ operation: ['VipsForeignLoad'] })\n _sharp.unblock({\n operation: [\n 'VipsForeignLoadJpeg',\n 'VipsForeignLoadNsgif',\n 'VipsForeignLoadPng',\n 'VipsForeignLoadSvg',\n 'VipsForeignLoadTiff',\n 'VipsForeignLoadWebp',\n ],\n })\n if (typeof operationCache === 'boolean') {\n _sharp.cache(operationCache)\n }\n if (_sharp.concurrency() > 1) {\n // Reducing concurrency should reduce the memory usage too.\n // We more aggressively reduce in dev but also reduce in prod.\n // https://sharp.pixelplumbing.com/api-utility#concurrency\n const divisor = process.env.NODE_ENV === 'development' ? 4 : 2\n _sharp.concurrency(\n concurrency ?? Math.floor(Math.max(_sharp.concurrency() / divisor, 1))\n )\n }\n } catch (e: unknown) {\n if (isError(e) && e.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'Module `sharp` not found. Please run `npm install --cpu=wasm32 sharp` to install it.'\n )\n }\n throw e\n }\n return _sharp\n}\n\nexport interface ImageParamsResult {\n href: string\n isAbsolute: boolean\n isStatic: boolean\n width: number\n quality: number\n mimeType: string\n sizes: number[]\n minimumCacheTTL: number\n}\n\ninterface ImageUpstream {\n buffer: Buffer\n contentType: string | null | undefined\n cacheControl: string | null | undefined\n etag: string\n}\n\nfunction getSupportedMimeType(options: string[], accept = ''): string {\n const mimeType = mediaType(accept, options)\n return accept.includes(mimeType) ? mimeType : ''\n}\n\nexport function getHash(items: (string | number | Buffer)[]) {\n const hash = createHash('sha256')\n for (let item of items) {\n if (typeof item === 'number') hash.update(String(item))\n else {\n hash.update(item)\n }\n }\n // See https://en.wikipedia.org/wiki/Base64#URL_applications\n return hash.digest('base64url')\n}\n\nexport function extractEtag(\n etag: string | null | undefined,\n imageBuffer: Buffer\n) {\n if (etag) {\n // upstream etag needs to be base64url encoded due to weak etag signature\n // as we store this in the cache-entry file name.\n return Buffer.from(etag).toString('base64url')\n }\n return getImageEtag(imageBuffer)\n}\n\nexport function getImageEtag(image: Buffer) {\n return getHash([image])\n}\n\nasync function writeToCacheDir(\n cacheDir: string,\n cacheKey: string,\n extension: string,\n maxAge: number,\n expireAt: number,\n buffer: Buffer,\n etag: string,\n upstreamEtag: string\n) {\n const dir = join(/* turbopackIgnore: true */ cacheDir, cacheKey)\n const filename = join(\n /* turbopackIgnore: true */\n dir,\n `${maxAge}.${expireAt}.${etag}.${upstreamEtag}.${extension}`\n )\n\n await promises.rm(dir, { recursive: true, force: true }).catch(() => {})\n\n await promises.mkdir(dir, { recursive: true })\n await promises.writeFile(filename, buffer)\n}\n\nasync function readFromCacheDir(cacheDir: string, cacheKey: string) {\n const dir = join(/* turbopackIgnore: true */ cacheDir, cacheKey)\n const files = await promises.readdir(dir)\n const file = files[0]\n if (!file) {\n throw new Error(\n `Invariant: cache entry \"${cacheKey}\" not found in dir \"${cacheDir}\"`\n )\n }\n const [maxAgeSt, expireAtSt, etag, upstreamEtag, extension] = file.split(\n '.',\n 5\n )\n const filePath = join(/* turbopackIgnore: true */ dir, file)\n const buffer = await promises.readFile(/* turbopackIgnore: true */ filePath)\n const expireAt = Number(expireAtSt)\n const maxAge = Number(maxAgeSt)\n return { maxAge, expireAt, etag, upstreamEtag, buffer, extension }\n}\n\nasync function deleteFromCacheDir(cacheDir: string, cacheKey: string) {\n return promises\n .rm(join(/* turbopackIgnore: true */ cacheDir, cacheKey), {\n recursive: true,\n force: true,\n })\n .catch((err) => {\n Log.error(`Failed to delete cache key ${cacheKey}`, err)\n })\n}\n\n/**\n * Inspects the first few bytes of a buffer to determine if\n * it matches the \"magic number\" of known file signatures.\n * https://en.wikipedia.org/wiki/List_of_file_signatures\n */\nexport async function detectContentType(\n buffer: Buffer\n): Promise<string | null> {\n if (buffer.byteLength === 0) {\n return null\n }\n if ([0xff, 0xd8, 0xff].every((b, i) => buffer[i] === b)) {\n return JPEG\n }\n if (\n [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a].every(\n (b, i) => buffer[i] === b\n )\n ) {\n return PNG\n }\n if ([0x47, 0x49, 0x46, 0x38].every((b, i) => buffer[i] === b)) {\n return GIF\n }\n if (\n [0x52, 0x49, 0x46, 0x46, 0, 0, 0, 0, 0x57, 0x45, 0x42, 0x50].every(\n (b, i) => !b || buffer[i] === b\n )\n ) {\n return WEBP\n }\n if ([0x3c, 0x3f, 0x78, 0x6d, 0x6c].every((b, i) => buffer[i] === b)) {\n return SVG\n }\n if ([0x3c, 0x73, 0x76, 0x67].every((b, i) => buffer[i] === b)) {\n return SVG\n }\n if (\n [0, 0, 0, 0, 0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x66].every(\n (b, i) => !b || buffer[i] === b\n )\n ) {\n return AVIF\n }\n if ([0x00, 0x00, 0x01, 0x00].every((b, i) => buffer[i] === b)) {\n return ICO\n }\n if ([0x69, 0x63, 0x6e, 0x73].every((b, i) => buffer[i] === b)) {\n return ICNS\n }\n if ([0x49, 0x49, 0x2a, 0x00].every((b, i) => buffer[i] === b)) {\n return TIFF\n }\n if ([0x42, 0x4d].every((b, i) => buffer[i] === b)) {\n return BMP\n }\n if ([0xff, 0x0a].every((b, i) => buffer[i] === b)) {\n return JXL\n }\n if (\n [\n 0x00, 0x00, 0x00, 0x0c, 0x4a, 0x58, 0x4c, 0x20, 0x0d, 0x0a, 0x87, 0x0a,\n ].every((b, i) => buffer[i] === b)\n ) {\n return JXL\n }\n if (\n [0, 0, 0, 0, 0x66, 0x74, 0x79, 0x70, 0x68, 0x65, 0x69, 0x63].every(\n (b, i) => !b || buffer[i] === b\n )\n ) {\n return HEIC\n }\n if ([0x25, 0x50, 0x44, 0x46, 0x2d].every((b, i) => buffer[i] === b)) {\n return PDF\n }\n if (\n [\n 0x00, 0x00, 0x00, 0x0c, 0x6a, 0x50, 0x20, 0x20, 0x0d, 0x0a, 0x87, 0x0a,\n ].every((b, i) => buffer[i] === b)\n ) {\n return JP2\n }\n\n const format = detector(buffer.subarray(0, 1024))\n\n switch (format) {\n case 'webp':\n return WEBP\n case 'png':\n return PNG\n case 'jpg':\n return JPEG\n case 'gif':\n return GIF\n case 'svg':\n return SVG\n case 'jxl':\n case 'jxl-stream':\n return JXL\n case 'jp2':\n return JP2\n case 'tiff':\n return TIFF\n case 'bmp':\n return BMP\n case 'ico':\n return ICO\n case 'icns':\n return ICNS\n case 'heif':\n case 'cur':\n case 'dds':\n case 'j2c':\n case 'ktx':\n case 'pnm':\n case 'psd':\n case 'tga':\n case undefined:\n return null // unsupported formats\n default:\n format satisfies never // exhaustive check\n return null // impossible to reach\n }\n}\n\nexport class ImageOptimizerCache {\n private cacheDir: string\n private nextConfig: NextConfigRuntime\n private cacheHandler?: CacheHandler\n private cacheDiskLRU?: ReturnType<typeof getOrInitDiskLRU>\n private isDiskCacheEnabled?: boolean\n\n static validateParams(\n req: IncomingMessage,\n query: NextUrlWithParsedQuery['query'],\n nextConfig: NextConfigRuntime,\n isDev: boolean\n ): ImageParamsResult | { errorMessage: string } {\n const imageData = nextConfig.images\n const {\n deviceSizes = [],\n imageSizes = [],\n domains = [],\n minimumCacheTTL = 14400,\n formats = ['image/webp'],\n } = imageData\n const remotePatterns = nextConfig.images?.remotePatterns || []\n const localPatterns = nextConfig.images?.localPatterns\n const qualities = nextConfig.images?.qualities\n const { url, w, q } = query\n let href: string\n\n if (domains.length > 0) {\n Log.warnOnce(\n 'The \"images.domains\" configuration is deprecated. Please use \"images.remotePatterns\" configuration instead.'\n )\n }\n\n if (!url) {\n return { errorMessage: '\"url\" parameter is required' }\n } else if (Array.isArray(url)) {\n return { errorMessage: '\"url\" parameter cannot be an array' }\n }\n\n if (url.length > 3072) {\n return { errorMessage: '\"url\" parameter is too long' }\n }\n\n if (url.startsWith('//')) {\n return {\n errorMessage: '\"url\" parameter cannot be a protocol-relative URL (//)',\n }\n }\n\n let isAbsolute: boolean\n\n if (url.startsWith('/')) {\n href = url\n isAbsolute = false\n if (\n /\\/_next\\/image($|\\/)/.test(\n decodeURIComponent(parseUrl(url)?.pathname ?? '')\n )\n ) {\n return {\n errorMessage: '\"url\" parameter cannot be recursive',\n }\n }\n if (!hasLocalMatch(localPatterns, url)) {\n return { errorMessage: '\"url\" parameter is not allowed' }\n }\n } else {\n let hrefParsed: URL\n\n try {\n hrefParsed = new URL(url)\n href = hrefParsed.toString()\n isAbsolute = true\n } catch (_error) {\n return { errorMessage: '\"url\" parameter is invalid' }\n }\n\n if (!['http:', 'https:'].includes(hrefParsed.protocol)) {\n return { errorMessage: '\"url\" parameter is invalid' }\n }\n\n if (!hasRemoteMatch(domains, remotePatterns, hrefParsed)) {\n return { errorMessage: '\"url\" parameter is not allowed' }\n }\n }\n\n if (!w) {\n return { errorMessage: '\"w\" parameter (width) is required' }\n } else if (Array.isArray(w)) {\n return { errorMessage: '\"w\" parameter (width) cannot be an array' }\n } else if (!/^[0-9]+$/.test(w)) {\n return {\n errorMessage: '\"w\" parameter (width) must be an integer greater than 0',\n }\n }\n\n if (!q) {\n return { errorMessage: '\"q\" parameter (quality) is required' }\n } else if (Array.isArray(q)) {\n return { errorMessage: '\"q\" parameter (quality) cannot be an array' }\n } else if (!/^[0-9]+$/.test(q)) {\n return {\n errorMessage:\n '\"q\" parameter (quality) must be an integer between 1 and 100',\n }\n }\n\n const width = parseInt(w, 10)\n\n if (width <= 0 || isNaN(width)) {\n return {\n errorMessage: '\"w\" parameter (width) must be an integer greater than 0',\n }\n }\n\n const sizes = [...(deviceSizes || []), ...(imageSizes || [])]\n\n if (isDev) {\n sizes.push(BLUR_IMG_SIZE)\n }\n\n const isValidSize =\n sizes.includes(width) || (isDev && width <= BLUR_IMG_SIZE)\n\n if (!isValidSize) {\n return {\n errorMessage: `\"w\" parameter (width) of ${width} is not allowed`,\n }\n }\n\n const quality = parseInt(q, 10)\n\n if (isNaN(quality) || quality < 1 || quality > 100) {\n return {\n errorMessage:\n '\"q\" parameter (quality) must be an integer between 1 and 100',\n }\n }\n\n if (qualities) {\n if (isDev) {\n qualities.push(BLUR_QUALITY)\n }\n\n if (!qualities.includes(quality)) {\n return {\n errorMessage: `\"q\" parameter (quality) of ${q} is not allowed`,\n }\n }\n }\n\n const mimeType = getSupportedMimeType(formats || [], req.headers['accept'])\n\n const isStatic =\n url.startsWith(`${nextConfig.basePath || ''}/_next/static/media`) ||\n url.startsWith(\n `${nextConfig.basePath || ''}/_next/static/immutable/media`\n )\n\n return {\n href,\n sizes,\n isAbsolute,\n isStatic,\n width,\n quality,\n mimeType,\n minimumCacheTTL,\n }\n }\n\n static getCacheKey({\n href,\n width,\n quality,\n mimeType,\n }: {\n href: string\n width: number\n quality: number\n mimeType: string\n }): string {\n return getHash([CACHE_VERSION, href, width, quality, mimeType])\n }\n\n constructor({\n distDir,\n nextConfig,\n cacheHandler,\n }: {\n distDir: string\n nextConfig: NextConfigRuntime\n cacheHandler?: CacheHandler\n }) {\n this.cacheDir = join(/* turbopackIgnore: true */ distDir, 'cache', 'images')\n this.nextConfig = nextConfig\n this.cacheHandler = cacheHandler\n\n // Eagerly start LRU initialization for filesystem cache\n if (\n !cacheHandler &&\n nextConfig.images.maximumDiskCacheSize !== 0 &&\n nextConfig.experimental.isrFlushToDisk\n ) {\n this.isDiskCacheEnabled = true\n this.cacheDiskLRU = getOrInitDiskLRU(\n this.cacheDir,\n nextConfig.images.maximumDiskCacheSize,\n initCacheEntries,\n deleteFromCacheDir\n )\n }\n }\n\n async get(cacheKey: string): Promise<IncrementalResponseCacheEntry | null> {\n // If a custom cache handler is provided, use it\n if (this.cacheHandler) {\n try {\n const cacheData = await this.cacheHandler.get(cacheKey, {\n kind: IncrementalCacheKind.IMAGE,\n isFallback: false,\n })\n\n if (!cacheData?.value) {\n return null\n }\n\n if (cacheData.value.kind !== CachedRouteKind.IMAGE) {\n return null\n }\n\n const now = Date.now()\n const lastModified = cacheData.lastModified || now\n const revalidate =\n typeof cacheData.value.revalidate === 'number'\n ? cacheData.value.revalidate\n : this.nextConfig.images.minimumCacheTTL\n const revalidateAfter =\n Math.max(revalidate, this.nextConfig.images.minimumCacheTTL) * 1000 +\n lastModified\n const isStale = revalidateAfter < now\n\n return {\n value: cacheData.value,\n revalidateAfter,\n cacheControl: { revalidate, expire: undefined },\n isStale,\n }\n } catch (_) {\n // failed to get from custom cache handler, treat as cache miss\n }\n return null\n }\n\n // If the filesystem cache is disabled, return early\n if (!this.isDiskCacheEnabled) {\n return null\n }\n\n // Fall back to filesystem cache\n try {\n const now = Date.now()\n const { maxAge, expireAt, etag, upstreamEtag, buffer, extension } =\n await readFromCacheDir(this.cacheDir, cacheKey)\n\n // Promote entry in LRU (mark as recently used)\n const lru = await this.cacheDiskLRU\n lru?.get(cacheKey)\n\n return {\n value: {\n kind: CachedRouteKind.IMAGE,\n etag,\n buffer,\n extension,\n upstreamEtag,\n },\n revalidateAfter:\n Math.max(maxAge, this.nextConfig.images.minimumCacheTTL) * 1000 +\n Date.now(),\n cacheControl: { revalidate: maxAge, expire: undefined },\n isStale: now > expireAt,\n }\n } catch (_) {\n // failed to read from cache dir, treat as cache miss\n }\n return null\n }\n async set(\n cacheKey: string,\n value: IncrementalCacheValue | null,\n {\n cacheControl,\n }: {\n cacheControl?: CacheControl\n }\n ) {\n if (value?.kind !== CachedRouteKind.IMAGE) {\n throw new Error('invariant attempted to set non-image to image-cache')\n }\n\n const revalidate = cacheControl?.revalidate\n\n if (typeof revalidate !== 'number') {\n throw new InvariantError('revalidate must be a number for image-cache')\n }\n\n // If a custom cache handler is provided, use it\n if (this.cacheHandler) {\n try {\n // Apply minimumCacheTTL at write time, similar to the implementation in the fallback filesystem cache\n const effectiveRevalidate = Math.max(\n revalidate,\n this.nextConfig.images.minimumCacheTTL\n )\n const valueWithRevalidate = {\n ...value,\n revalidate: effectiveRevalidate,\n }\n await this.cacheHandler.set(cacheKey, valueWithRevalidate, {\n cacheControl: {\n revalidate: effectiveRevalidate,\n expire: cacheControl?.expire,\n },\n })\n } catch (err) {\n Log.error(`Failed to write image to custom cache ${cacheKey}`, err)\n }\n return\n }\n\n // If the filesystem cache is disabled, return early\n if (!this.isDiskCacheEnabled) {\n return\n }\n\n // Fall back to filesystem cache\n const expireAt =\n Math.max(revalidate, this.nextConfig.images.minimumCacheTTL) * 1000 +\n Date.now()\n\n try {\n const lru = await this.cacheDiskLRU\n const success = lru?.set(cacheKey, value.buffer.byteLength)\n if (success === false) {\n throw new Error(\n `image of size ${value.buffer.byteLength} could not be tracked by lru cache`\n )\n }\n\n await writeToCacheDir(\n this.cacheDir,\n cacheKey,\n value.extension,\n revalidate,\n expireAt,\n value.buffer,\n value.etag,\n value.upstreamEtag\n )\n } catch (err) {\n Log.error(`Failed to write image to cache ${cacheKey}`, err)\n }\n }\n}\nexport class ImageError extends Error {\n statusCode: number\n\n constructor(statusCode: number, message: string) {\n super(message)\n\n // ensure an error status is used > 400\n if (statusCode >= 400) {\n this.statusCode = statusCode\n } else {\n this.statusCode = 500\n }\n }\n}\n\nfunction parseCacheControl(\n str: string | null | undefined\n): Map<string, string> {\n const map = new Map<string, string>()\n if (!str) {\n return map\n }\n for (let directive of str.split(',')) {\n let [key, value] = directive.trim().split('=', 2)\n key = key.toLowerCase()\n if (value) {\n value = value.toLowerCase()\n }\n map.set(key, value)\n }\n return map\n}\n\nexport function getMaxAge(str: string | null | undefined): number {\n const map = parseCacheControl(str)\n if (map) {\n let age = map.get('s-maxage') || map.get('max-age') || ''\n if (age.startsWith('\"') && age.endsWith('\"')) {\n age = age.slice(1, -1)\n }\n const n = parseInt(age, 10)\n if (!isNaN(n)) {\n return n\n }\n }\n return 0\n}\nexport function getPreviouslyCachedImageOrNull(\n upstreamImage: ImageUpstream,\n previousCacheEntry: IncrementalCacheEntry | null | undefined\n): CachedImageValue | null {\n if (\n previousCacheEntry?.value?.kind === 'IMAGE' &&\n // Images that are SVGs, animated or failed the optimization previously end up using upstreamEtag as their etag as well,\n // in these cases we want to trigger a new \"optimization\" attempt.\n previousCacheEntry.value.upstreamEtag !== previousCacheEntry.value.etag &&\n // and the upstream etag is the same as the previous cache entry's\n upstreamImage.etag === previousCacheEntry.value.upstreamEtag\n ) {\n return previousCacheEntry.value\n }\n return null\n}\n\nexport async function optimizeImage({\n buffer,\n contentType,\n quality,\n width,\n height,\n concurrency,\n operationCache,\n limitInputPixels,\n sequentialRead,\n timeoutInSeconds,\n}: {\n buffer: Buffer\n contentType: string\n quality: number\n width: number\n height?: number\n concurrency?: number | null\n operationCache?: boolean | null | undefined\n limitInputPixels?: number\n sequentialRead?: boolean | null\n timeoutInSeconds?: number\n}): Promise<Buffer> {\n const sharp = getSharp(concurrency, operationCache)\n const transformer = sharp(buffer, {\n limitInputPixels,\n sequentialRead: sequentialRead ?? undefined,\n })\n .timeout({\n seconds: timeoutInSeconds ?? 7,\n })\n .rotate()\n\n if (height) {\n transformer.resize(width, height)\n } else {\n transformer.resize(width, undefined, {\n withoutEnlargement: true,\n })\n }\n\n if (contentType === AVIF) {\n transformer.avif({\n // Scale the quality to try and match webp. This ratio was derived\n // from sharp's default 80 (webp) and 50 (avif), and then verified\n // using dssim and ssimulacra2 visual quality tests.\n quality: Math.max(Math.round(quality * (50 / 80)), 1),\n effort: 3,\n })\n } else if (contentType === WEBP) {\n transformer.webp({ quality })\n } else if (contentType === PNG) {\n transformer.png({ quality })\n } else if (contentType === JPEG) {\n transformer.jpeg({ quality, mozjpeg: true })\n }\n\n const optimizedBuffer = await transformer.toBuffer()\n\n return optimizedBuffer\n}\n\nfunction isRedirect(statusCode: number) {\n return [301, 302, 303, 307, 308].includes(statusCode)\n}\n\nexport async function fetchExternalImage(\n href: string,\n dangerouslyAllowLocalIP: boolean,\n maximumResponseBody: number,\n count = 3\n): Promise<ImageUpstream> {\n if (!dangerouslyAllowLocalIP) {\n const { hostname } = new URL(href)\n let ips = [hostname]\n if (!isIP(hostname)) {\n const records = await lookup(hostname, {\n family: 0,\n all: true,\n hints: ALL,\n }).catch((_) => [{ address: hostname }])\n ips = records.map((record) => record.address)\n }\n const privateIps = ips.filter((ip) => isPrivateIp(ip))\n if (privateIps.length > 0) {\n Log.error(\n 'upstream image',\n href,\n 'hostname resolved to private IP',\n JSON.stringify(privateIps),\n 'If this is expected and you understand SSRF risk, use images.dangerouslyAllowLocalIP = true to continue.'\n )\n throw new ImageError(400, '\"url\" parameter is not allowed')\n }\n }\n const res = await fetch(href, {\n signal: AbortSignal.timeout(7_000),\n redirect: 'manual',\n }).catch((err) => err as Error)\n\n if (res instanceof Error) {\n const err = res as Error\n if (err.name === 'TimeoutError') {\n Log.error('upstream image response timed out for', href)\n throw new ImageError(\n 504,\n '\"url\" parameter is valid but upstream response timed out'\n )\n }\n throw err\n }\n\n const locationHeader = res.headers.get('Location')\n if (\n isRedirect(res.status) &&\n locationHeader &&\n URL.canParse(locationHeader, href)\n ) {\n if (count === 0) {\n Log.error('upstream image response had too many redirects', href)\n throw new ImageError(\n 508,\n '\"url\" parameter is valid but upstream response is invalid'\n )\n }\n const redirect = new URL(locationHeader, href).href\n return fetchExternalImage(\n redirect,\n dangerouslyAllowLocalIP,\n maximumResponseBody,\n count - 1\n )\n }\n\n if (!res.ok) {\n Log.error('upstream image response failed for', href, res.status)\n throw new ImageError(\n res.status,\n '\"url\" parameter is valid but upstream response is invalid'\n )\n }\n\n if (!res.body) {\n Log.error('upstream image response is empty for', href)\n throw new ImageError(\n 400,\n '\"url\" parameter is valid but upstream response is invalid'\n )\n }\n\n const chunks: Buffer[] = []\n let totalSize = 0\n\n for await (const c of res.body) {\n const chunk = Buffer.from(c)\n totalSize += chunk.byteLength\n if (totalSize > maximumResponseBody) {\n Log.error(\n 'upstream image response exceeded maximum size for',\n href,\n totalSize\n )\n throw new ImageError(\n 413,\n '\"url\" parameter is valid but upstream response is invalid'\n )\n }\n chunks.push(chunk)\n }\n\n const buffer = Buffer.concat(chunks)\n const contentType = res.headers.get('Content-Type')\n const cacheControl = res.headers.get('Cache-Control')\n const etag = extractEtag(res.headers.get('ETag'), buffer)\n return { buffer, contentType, cacheControl, etag }\n}\n\nexport async function fetchInternalImage(\n href: string,\n _req: IncomingMessage,\n _res: ServerResponse,\n maximumResponseBody: number,\n handleRequest: (\n newReq: IncomingMessage,\n newRes: ServerResponse,\n newParsedUrl?: NextUrlWithParsedQuery\n ) => Promise<void>\n): Promise<ImageUpstream> {\n try {\n // Coerce HEAD to GET to avoid issues with the image optimizer\n const method = !_req.method || _req.method === 'HEAD' ? 'GET' : _req.method\n\n const mocked = createRequestResponseMocks({\n url: href,\n method,\n socket: _req.socket,\n maximumResponseBody,\n })\n\n await handleRequest(mocked.req, mocked.res, parseReqUrl(href))\n await mocked.res.hasStreamed\n\n if (!mocked.res.statusCode) {\n Log.error('image response failed for', href, mocked.res.statusCode)\n throw new ImageError(\n mocked.res.statusCode,\n '\"url\" parameter is valid but internal response is invalid'\n )\n }\n\n if (mocked.res.buffers.length === 0) {\n Log.error('internal image response is empty for', href)\n throw new ImageError(\n 400,\n '\"url\" parameter is valid but internal response is invalid'\n )\n }\n\n const buffer = Buffer.concat(mocked.res.buffers)\n const contentType = mocked.res.getHeader('Content-Type')\n const cacheControl = mocked.res.getHeader('Cache-Control')\n const etag = extractEtag(mocked.res.getHeader('ETag'), buffer)\n\n return { buffer, contentType, cacheControl, etag }\n } catch (err) {\n if (err instanceof ImageError) {\n throw err\n }\n\n if (\n err &&\n typeof err === 'object' &&\n 'code' in err &&\n err.code === 'ERR_MAX_BODY_SIZE_EXCEEDED'\n ) {\n Log.error('internal image response exceeded maximum size for', href)\n throw new ImageError(\n 413,\n '\"url\" parameter is valid but internal response is invalid'\n )\n }\n\n Log.error('upstream image response failed for', href, err)\n throw new ImageError(\n 500,\n '\"url\" parameter is valid but upstream response is invalid'\n )\n }\n}\n\nexport async function imageOptimizer(\n imageUpstream: ImageUpstream,\n paramsResult: Pick<\n ImageParamsResult,\n 'href' | 'width' | 'quality' | 'mimeType'\n >,\n nextConfig: {\n experimental: Pick<\n NextConfigComplete['experimental'],\n | 'imgOptConcurrency'\n | 'imgOptOperationCache'\n | 'imgOptMaxInputPixels'\n | 'imgOptSequentialRead'\n | 'imgOptTimeoutInSeconds'\n >\n images: Pick<\n NextConfigComplete['images'],\n 'dangerouslyAllowSVG' | 'minimumCacheTTL'\n >\n },\n opts: {\n isDev?: boolean\n silent?: boolean\n previousCacheEntry?: IncrementalResponseCacheEntry | null\n }\n): Promise<{\n buffer: Buffer\n contentType: string\n maxAge: number\n etag: string\n upstreamEtag: string\n error?: unknown\n}> {\n const { href, quality, width, mimeType } = paramsResult\n const { buffer: upstreamBuffer, etag: upstreamEtag } = imageUpstream\n const maxAge = Math.max(\n nextConfig.images.minimumCacheTTL,\n getMaxAge(imageUpstream.cacheControl)\n )\n\n const upstreamType = await detectContentType(upstreamBuffer)\n\n if (\n !upstreamType ||\n !upstreamType.startsWith('image/') ||\n upstreamType.includes(',')\n ) {\n if (!opts.silent) {\n Log.error(\n \"The requested resource isn't a valid image for\",\n href,\n 'received',\n upstreamType\n )\n }\n throw new ImageError(400, \"The requested resource isn't a valid image.\")\n }\n if (\n upstreamType.startsWith('image/svg') &&\n !nextConfig.images.dangerouslyAllowSVG\n ) {\n if (!opts.silent) {\n Log.error(\n `The requested resource \"${href}\" has type \"${upstreamType}\" but dangerouslyAllowSVG is disabled. Consider adding the \"unoptimized\" property to the <Image>.`\n )\n }\n throw new ImageError(\n 400,\n '\"url\" parameter is valid but image type is not allowed'\n )\n }\n if (ANIMATABLE_TYPES.includes(upstreamType) && isAnimated(upstreamBuffer)) {\n if (!opts.silent) {\n Log.warnOnce(\n `The requested resource \"${href}\" is an animated image so it will not be optimized. Consider adding the \"unoptimized\" property to the <Image>.`\n )\n }\n return {\n buffer: upstreamBuffer,\n contentType: upstreamType,\n maxAge,\n etag: upstreamEtag,\n upstreamEtag,\n }\n }\n if (BYPASS_TYPES.includes(upstreamType)) {\n return {\n buffer: upstreamBuffer,\n contentType: upstreamType,\n maxAge,\n etag: upstreamEtag,\n upstreamEtag,\n }\n }\n\n let contentType: string\n\n if (mimeType) {\n contentType = mimeType\n } else if (\n getExtension(upstreamType) &&\n upstreamType !== WEBP &&\n upstreamType !== AVIF\n ) {\n contentType = upstreamType\n } else {\n contentType = JPEG\n }\n const previouslyCachedImage = getPreviouslyCachedImageOrNull(\n imageUpstream,\n opts.previousCacheEntry\n )\n if (previouslyCachedImage) {\n return {\n buffer: previouslyCachedImage.buffer,\n contentType,\n maxAge: opts?.previousCacheEntry?.cacheControl?.revalidate || maxAge,\n etag: previouslyCachedImage.etag,\n upstreamEtag: previouslyCachedImage.upstreamEtag,\n }\n }\n\n try {\n let optimizedBuffer = await optimizeImage({\n buffer: upstreamBuffer,\n contentType,\n quality,\n width,\n concurrency: nextConfig.experimental.imgOptConcurrency,\n operationCache: nextConfig.experimental.imgOptOperationCache,\n limitInputPixels: nextConfig.experimental.imgOptMaxInputPixels,\n sequentialRead: nextConfig.experimental.imgOptSequentialRead,\n timeoutInSeconds: nextConfig.experimental.imgOptTimeoutInSeconds,\n })\n if (opts.isDev && width <= BLUR_IMG_SIZE && quality === BLUR_QUALITY) {\n // During `next dev`, we don't want to generate blur placeholders with webpack\n // because it can delay starting the dev server. Instead, `next-image-loader.js`\n // will inline a special url to lazily generate the blur placeholder at request time.\n const meta = await getImageSize(optimizedBuffer)\n const blurOpts = {\n blurWidth: meta.width,\n blurHeight: meta.height,\n blurDataURL: `data:${contentType};base64,${optimizedBuffer.toString(\n 'base64'\n )}`,\n }\n optimizedBuffer = Buffer.from(unescape(getImageBlurSvg(blurOpts)))\n contentType = 'image/svg+xml'\n }\n return {\n buffer: optimizedBuffer,\n contentType,\n maxAge,\n etag: getImageEtag(optimizedBuffer),\n upstreamEtag,\n }\n } catch (error) {\n if (upstreamType) {\n // If we fail to optimize, fallback to the original image\n return {\n buffer: upstreamBuffer,\n contentType: upstreamType,\n maxAge: nextConfig.images.minimumCacheTTL,\n etag: upstreamEtag,\n upstreamEtag,\n error,\n }\n } else {\n throw new ImageError(\n 400,\n 'Unable to optimize image and unable to fallback to upstream image'\n )\n }\n }\n}\n\nfunction getFileNameWithExtension(\n url: string,\n contentType: string | null\n): string {\n const [urlWithoutQueryParams] = url.split('?', 1)\n const fileNameWithExtension = urlWithoutQueryParams.split('/').pop()\n if (!contentType || !fileNameWithExtension) {\n return 'image.bin'\n }\n\n const [fileName] = fileNameWithExtension.split('.', 1)\n const extension = getExtension(contentType)\n return `${fileName}.${extension}`\n}\n\nfunction setResponseHeaders(\n req: IncomingMessage,\n res: ServerResponse,\n url: string,\n etag: string,\n contentType: string | null,\n isStatic: boolean,\n xCache: XCacheHeader,\n imagesConfig: ImageConfigComplete,\n maxAge: number,\n isDev: boolean\n) {\n res.setHeader('Vary', 'Accept')\n res.setHeader(\n 'Cache-Control',\n isStatic\n ? 'public, max-age=315360000, immutable'\n : `public, max-age=${isDev ? 0 : maxAge}, must-revalidate`\n )\n if (sendEtagResponse(req, res, etag)) {\n // already called res.end() so we're finished\n return { finished: true }\n }\n if (contentType) {\n res.setHeader('Content-Type', contentType)\n }\n\n const fileName = getFileNameWithExtension(url, contentType)\n res.setHeader(\n 'Content-Disposition',\n contentDisposition(fileName, { type: imagesConfig.contentDispositionType })\n )\n\n res.setHeader('Content-Security-Policy', imagesConfig.contentSecurityPolicy)\n res.setHeader('X-Nextjs-Cache', xCache)\n\n return { finished: false }\n}\n\nexport function sendResponse(\n req: IncomingMessage,\n res: ServerResponse,\n url: string,\n extension: string,\n buffer: Buffer,\n etag: string,\n isStatic: boolean,\n xCache: XCacheHeader,\n imagesConfig: ImageConfigComplete,\n maxAge: number,\n isDev: boolean\n) {\n const contentType = getContentType(extension)\n const result = setResponseHeaders(\n req,\n res,\n url,\n etag,\n contentType,\n isStatic,\n xCache,\n imagesConfig,\n maxAge,\n isDev\n )\n if (!result.finished) {\n res.setHeader('Content-Length', Buffer.byteLength(buffer))\n // A response body must not be sent for HEAD requests\n if (req.method === 'HEAD') {\n res.end()\n } else {\n res.end(buffer)\n }\n }\n}\n\nexport async function getImageSize(buffer: Buffer): Promise<{\n width?: number\n height?: number\n}> {\n const { width, height } = imageSizeOf(buffer)\n return { width, height }\n}\n"],"names":["createHash","promises","mediaType","contentDisposition","imageSizeOf","detector","isAnimated","join","getImageBlurSvg","hasLocalMatch","hasRemoteMatch","createRequestResponseMocks","CachedRouteKind","IncrementalCacheKind","sendEtagResponse","getContentType","getExtension","Log","isError","isPrivateIp","getOrInitDiskLRU","parseUrl","parseReqUrl","InvariantError","lookup","isIP","ALL","AVIF","WEBP","PNG","JPEG","JXL","JP2","HEIC","GIF","SVG","ICO","ICNS","TIFF","BMP","PDF","CACHE_VERSION","ANIMATABLE_TYPES","BYPASS_TYPES","BLUR_IMG_SIZE","BLUR_QUALITY","_sharp","initCacheEntries","cacheDir","cacheKeys","readdir","catch","entries","cacheKey","expireAt","buffer","readFromCacheDir","push","key","size","byteLength","sort","a","b","getSharp","concurrency","operationCache","require","block","operation","unblock","cache","divisor","process","env","NODE_ENV","Math","floor","max","e","code","Error","getSupportedMimeType","options","accept","mimeType","includes","getHash","items","hash","item","update","String","digest","extractEtag","etag","imageBuffer","Buffer","from","toString","getImageEtag","image","writeToCacheDir","extension","maxAge","upstreamEtag","dir","filename","rm","recursive","force","mkdir","writeFile","files","file","maxAgeSt","expireAtSt","split","filePath","readFile","Number","deleteFromCacheDir","err","error","detectContentType","every","i","format","subarray","undefined","ImageOptimizerCache","validateParams","req","query","nextConfig","isDev","imageData","images","deviceSizes","imageSizes","domains","minimumCacheTTL","formats","remotePatterns","localPatterns","qualities","url","w","q","href","length","warnOnce","errorMessage","Array","isArray","startsWith","isAbsolute","test","decodeURIComponent","pathname","hrefParsed","URL","_error","protocol","width","parseInt","isNaN","sizes","isValidSize","quality","headers","isStatic","basePath","getCacheKey","constructor","distDir","cacheHandler","maximumDiskCacheSize","experimental","isrFlushToDisk","isDiskCacheEnabled","cacheDiskLRU","get","cacheData","kind","IMAGE","isFallback","value","now","Date","lastModified","revalidate","revalidateAfter","isStale","cacheControl","expire","_","lru","set","effectiveRevalidate","valueWithRevalidate","success","ImageError","statusCode","message","parseCacheControl","str","map","Map","directive","trim","toLowerCase","getMaxAge","age","endsWith","slice","n","getPreviouslyCachedImageOrNull","upstreamImage","previousCacheEntry","optimizeImage","contentType","height","limitInputPixels","sequentialRead","timeoutInSeconds","sharp","transformer","timeout","seconds","rotate","resize","withoutEnlargement","avif","round","effort","webp","png","jpeg","mozjpeg","optimizedBuffer","toBuffer","isRedirect","fetchExternalImage","dangerouslyAllowLocalIP","maximumResponseBody","count","hostname","ips","records","family","all","hints","address","record","privateIps","filter","ip","JSON","stringify","res","fetch","signal","AbortSignal","redirect","name","locationHeader","status","canParse","ok","body","chunks","totalSize","c","chunk","concat","fetchInternalImage","_req","_res","handleRequest","method","mocked","socket","hasStreamed","buffers","getHeader","imageOptimizer","imageUpstream","paramsResult","opts","upstreamBuffer","upstreamType","silent","dangerouslyAllowSVG","previouslyCachedImage","imgOptConcurrency","imgOptOperationCache","imgOptMaxInputPixels","imgOptSequentialRead","imgOptTimeoutInSeconds","meta","getImageSize","blurOpts","blurWidth","blurHeight","blurDataURL","unescape","getFileNameWithExtension","urlWithoutQueryParams","fileNameWithExtension","pop","fileName","setResponseHeaders","xCache","imagesConfig","setHeader","finished","type","contentDispositionType","contentSecurityPolicy","sendResponse","result","end"],"mappings":"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","ignoreList":[0]}
|
|
1
|
+
{"version":3,"sources":["../../../src/server/image-optimizer.ts"],"sourcesContent":["import { createHash } from 'crypto'\nimport { promises } from 'fs'\nimport type { IncomingMessage, ServerResponse } from 'http'\nimport { mediaType } from 'next/dist/compiled/@hapi/accept'\nimport contentDisposition from 'next/dist/compiled/content-disposition'\nimport imageSizeOf from 'next/dist/compiled/image-size'\nimport { detector } from 'next/dist/compiled/image-detector/detector.js'\nimport isAnimated from 'next/dist/compiled/is-animated'\nimport { join } from 'path'\nimport { getImageBlurSvg } from '../shared/lib/image-blur-svg'\nimport type { ImageConfigComplete } from '../shared/lib/image-config'\nimport { hasLocalMatch } from '../shared/lib/match-local-pattern'\nimport { hasRemoteMatch } from '../shared/lib/match-remote-pattern'\nimport type { NextConfigComplete, NextConfigRuntime } from './config-shared'\nimport { createRequestResponseMocks } from './lib/mock-request'\nimport type { NextUrlWithParsedQuery } from './request-meta'\nimport {\n CachedRouteKind,\n IncrementalCacheKind,\n type CachedImageValue,\n type IncrementalCacheEntry,\n type IncrementalCacheValue,\n type IncrementalResponseCacheEntry,\n} from './response-cache'\nimport type { CacheHandler } from './lib/incremental-cache'\nimport { sendEtagResponse } from './send-payload'\nimport { getContentType, getExtension } from './serve-static'\nimport * as Log from '../build/output/log'\nimport isError from '../lib/is-error'\nimport { isPrivateIp } from './is-private-ip'\nimport { getOrInitDiskLRU } from './lib/disk-lru-cache.external'\nimport { parseUrl, parseReqUrl } from '../lib/url'\nimport type { CacheControl } from './lib/cache-control'\nimport { InvariantError } from '../shared/lib/invariant-error'\nimport { lookup } from 'dns/promises'\nimport { isIP } from 'net'\nimport { ALL } from 'dns'\n\ntype XCacheHeader = 'MISS' | 'HIT' | 'STALE'\n\nconst AVIF = 'image/avif'\nconst WEBP = 'image/webp'\nconst PNG = 'image/png'\nconst JPEG = 'image/jpeg'\nconst JXL = 'image/jxl'\nconst JP2 = 'image/jp2'\nconst HEIC = 'image/heic'\nconst GIF = 'image/gif'\nconst SVG = 'image/svg+xml'\nconst ICO = 'image/x-icon'\nconst ICNS = 'image/x-icns'\nconst TIFF = 'image/tiff'\nconst BMP = 'image/bmp'\nconst PDF = 'application/pdf'\nconst CACHE_VERSION = 4\nconst ANIMATABLE_TYPES = [WEBP, PNG, GIF]\nconst BYPASS_TYPES = [SVG, ICO, ICNS, BMP, JXL, HEIC]\nconst BLUR_IMG_SIZE = 8 // should match `next-image-loader`\nconst BLUR_QUALITY = 70 // should match `next-image-loader`\n\nlet _sharp: typeof import('sharp').default\n\nasync function initCacheEntries(\n cacheDir: string\n): Promise<Array<{ key: string; size: number; expireAt: number }>> {\n const cacheKeys = await promises.readdir(cacheDir).catch(() => [])\n const entries: Array<{ key: string; size: number; expireAt: number }> = []\n\n for (const cacheKey of cacheKeys) {\n try {\n const { expireAt, buffer } = await readFromCacheDir(cacheDir, cacheKey)\n entries.push({\n key: cacheKey,\n size: buffer.byteLength,\n expireAt,\n })\n } catch {\n // Skip entries that can't be read from disk\n }\n }\n\n // Sort oldest-first so we can replay them chronologically into LRU\n return entries.sort((a, b) => a.expireAt - b.expireAt)\n}\n\nexport function getSharp(\n concurrency: number | null | undefined,\n operationCache: boolean | null | undefined\n) {\n if (_sharp) {\n return _sharp\n }\n try {\n _sharp = require('sharp') as typeof import('sharp').default\n _sharp.block({ operation: ['VipsForeignLoad'] })\n _sharp.unblock({\n operation: [\n 'VipsForeignLoadHeif', // avif\n 'VipsForeignLoadJpeg',\n 'VipsForeignLoadNsgif',\n 'VipsForeignLoadPng',\n 'VipsForeignLoadSvg',\n 'VipsForeignLoadTiff',\n 'VipsForeignLoadWebp',\n ],\n })\n if (typeof operationCache === 'boolean') {\n _sharp.cache(operationCache)\n }\n if (_sharp.concurrency() > 1) {\n // Reducing concurrency should reduce the memory usage too.\n // We more aggressively reduce in dev but also reduce in prod.\n // https://sharp.pixelplumbing.com/api-utility#concurrency\n const divisor = process.env.NODE_ENV === 'development' ? 4 : 2\n _sharp.concurrency(\n concurrency ?? Math.floor(Math.max(_sharp.concurrency() / divisor, 1))\n )\n }\n } catch (e: unknown) {\n if (isError(e) && e.code === 'MODULE_NOT_FOUND') {\n throw new Error(\n 'Module `sharp` not found. Please run `npm install --cpu=wasm32 sharp` to install it.'\n )\n }\n throw e\n }\n return _sharp\n}\n\nexport interface ImageParamsResult {\n href: string\n isAbsolute: boolean\n isStatic: boolean\n width: number\n quality: number\n mimeType: string\n sizes: number[]\n minimumCacheTTL: number\n}\n\ninterface ImageUpstream {\n buffer: Buffer\n contentType: string | null | undefined\n cacheControl: string | null | undefined\n etag: string\n}\n\nfunction getSupportedMimeType(options: string[], accept = ''): string {\n const mimeType = mediaType(accept, options)\n return accept.includes(mimeType) ? mimeType : ''\n}\n\nexport function getHash(items: (string | number | Buffer)[]) {\n const hash = createHash('sha256')\n for (let item of items) {\n if (typeof item === 'number') hash.update(String(item))\n else {\n hash.update(item)\n }\n }\n // See https://en.wikipedia.org/wiki/Base64#URL_applications\n return hash.digest('base64url')\n}\n\nexport function extractEtag(\n etag: string | null | undefined,\n imageBuffer: Buffer\n) {\n if (etag) {\n // upstream etag needs to be base64url encoded due to weak etag signature\n // as we store this in the cache-entry file name.\n return Buffer.from(etag).toString('base64url')\n }\n return getImageEtag(imageBuffer)\n}\n\nexport function getImageEtag(image: Buffer) {\n return getHash([image])\n}\n\nasync function writeToCacheDir(\n cacheDir: string,\n cacheKey: string,\n extension: string,\n maxAge: number,\n expireAt: number,\n buffer: Buffer,\n etag: string,\n upstreamEtag: string\n) {\n const dir = join(/* turbopackIgnore: true */ cacheDir, cacheKey)\n const filename = join(\n /* turbopackIgnore: true */\n dir,\n `${maxAge}.${expireAt}.${etag}.${upstreamEtag}.${extension}`\n )\n\n await promises.rm(dir, { recursive: true, force: true }).catch(() => {})\n\n await promises.mkdir(dir, { recursive: true })\n await promises.writeFile(filename, buffer)\n}\n\nasync function readFromCacheDir(cacheDir: string, cacheKey: string) {\n const dir = join(/* turbopackIgnore: true */ cacheDir, cacheKey)\n const files = await promises.readdir(dir)\n const file = files[0]\n if (!file) {\n throw new Error(\n `Invariant: cache entry \"${cacheKey}\" not found in dir \"${cacheDir}\"`\n )\n }\n const [maxAgeSt, expireAtSt, etag, upstreamEtag, extension] = file.split(\n '.',\n 5\n )\n const filePath = join(/* turbopackIgnore: true */ dir, file)\n const buffer = await promises.readFile(/* turbopackIgnore: true */ filePath)\n const expireAt = Number(expireAtSt)\n const maxAge = Number(maxAgeSt)\n return { maxAge, expireAt, etag, upstreamEtag, buffer, extension }\n}\n\nasync function deleteFromCacheDir(cacheDir: string, cacheKey: string) {\n return promises\n .rm(join(/* turbopackIgnore: true */ cacheDir, cacheKey), {\n recursive: true,\n force: true,\n })\n .catch((err) => {\n Log.error(`Failed to delete cache key ${cacheKey}`, err)\n })\n}\n\n/**\n * Inspects the first few bytes of a buffer to determine if\n * it matches the \"magic number\" of known file signatures.\n * https://en.wikipedia.org/wiki/List_of_file_signatures\n */\nexport async function detectContentType(\n buffer: Buffer\n): Promise<string | null> {\n if (buffer.byteLength === 0) {\n return null\n }\n if ([0xff, 0xd8, 0xff].every((b, i) => buffer[i] === b)) {\n return JPEG\n }\n if (\n [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a].every(\n (b, i) => buffer[i] === b\n )\n ) {\n return PNG\n }\n if ([0x47, 0x49, 0x46, 0x38].every((b, i) => buffer[i] === b)) {\n return GIF\n }\n if (\n [0x52, 0x49, 0x46, 0x46, 0, 0, 0, 0, 0x57, 0x45, 0x42, 0x50].every(\n (b, i) => !b || buffer[i] === b\n )\n ) {\n return WEBP\n }\n if ([0x3c, 0x3f, 0x78, 0x6d, 0x6c].every((b, i) => buffer[i] === b)) {\n return SVG\n }\n if ([0x3c, 0x73, 0x76, 0x67].every((b, i) => buffer[i] === b)) {\n return SVG\n }\n if (\n [0, 0, 0, 0, 0x66, 0x74, 0x79, 0x70, 0x61, 0x76, 0x69, 0x66].every(\n (b, i) => !b || buffer[i] === b\n )\n ) {\n return AVIF\n }\n if ([0x00, 0x00, 0x01, 0x00].every((b, i) => buffer[i] === b)) {\n return ICO\n }\n if ([0x69, 0x63, 0x6e, 0x73].every((b, i) => buffer[i] === b)) {\n return ICNS\n }\n if ([0x49, 0x49, 0x2a, 0x00].every((b, i) => buffer[i] === b)) {\n return TIFF\n }\n if ([0x42, 0x4d].every((b, i) => buffer[i] === b)) {\n return BMP\n }\n if ([0xff, 0x0a].every((b, i) => buffer[i] === b)) {\n return JXL\n }\n if (\n [\n 0x00, 0x00, 0x00, 0x0c, 0x4a, 0x58, 0x4c, 0x20, 0x0d, 0x0a, 0x87, 0x0a,\n ].every((b, i) => buffer[i] === b)\n ) {\n return JXL\n }\n if (\n [0, 0, 0, 0, 0x66, 0x74, 0x79, 0x70, 0x68, 0x65, 0x69, 0x63].every(\n (b, i) => !b || buffer[i] === b\n )\n ) {\n return HEIC\n }\n if ([0x25, 0x50, 0x44, 0x46, 0x2d].every((b, i) => buffer[i] === b)) {\n return PDF\n }\n if (\n [\n 0x00, 0x00, 0x00, 0x0c, 0x6a, 0x50, 0x20, 0x20, 0x0d, 0x0a, 0x87, 0x0a,\n ].every((b, i) => buffer[i] === b)\n ) {\n return JP2\n }\n\n const format = detector(buffer.subarray(0, 1024))\n\n switch (format) {\n case 'webp':\n return WEBP\n case 'png':\n return PNG\n case 'jpg':\n return JPEG\n case 'gif':\n return GIF\n case 'svg':\n return SVG\n case 'jxl':\n case 'jxl-stream':\n return JXL\n case 'jp2':\n return JP2\n case 'tiff':\n return TIFF\n case 'bmp':\n return BMP\n case 'ico':\n return ICO\n case 'icns':\n return ICNS\n case 'heif':\n case 'cur':\n case 'dds':\n case 'j2c':\n case 'ktx':\n case 'pnm':\n case 'psd':\n case 'tga':\n case undefined:\n return null // unsupported formats\n default:\n format satisfies never // exhaustive check\n return null // impossible to reach\n }\n}\n\nexport class ImageOptimizerCache {\n private cacheDir: string\n private nextConfig: NextConfigRuntime\n private cacheHandler?: CacheHandler\n private cacheDiskLRU?: ReturnType<typeof getOrInitDiskLRU>\n private isDiskCacheEnabled?: boolean\n\n static validateParams(\n req: IncomingMessage,\n query: NextUrlWithParsedQuery['query'],\n nextConfig: NextConfigRuntime,\n isDev: boolean\n ): ImageParamsResult | { errorMessage: string } {\n const imageData = nextConfig.images\n const {\n deviceSizes = [],\n imageSizes = [],\n domains = [],\n minimumCacheTTL = 14400,\n formats = ['image/webp'],\n } = imageData\n const remotePatterns = nextConfig.images?.remotePatterns || []\n const localPatterns = nextConfig.images?.localPatterns\n const qualities = nextConfig.images?.qualities\n const { url, w, q } = query\n let href: string\n\n if (domains.length > 0) {\n Log.warnOnce(\n 'The \"images.domains\" configuration is deprecated. Please use \"images.remotePatterns\" configuration instead.'\n )\n }\n\n if (!url) {\n return { errorMessage: '\"url\" parameter is required' }\n } else if (Array.isArray(url)) {\n return { errorMessage: '\"url\" parameter cannot be an array' }\n }\n\n if (url.length > 3072) {\n return { errorMessage: '\"url\" parameter is too long' }\n }\n\n if (url.startsWith('//')) {\n return {\n errorMessage: '\"url\" parameter cannot be a protocol-relative URL (//)',\n }\n }\n\n let isAbsolute: boolean\n\n if (url.startsWith('/')) {\n href = url\n isAbsolute = false\n if (\n /\\/_next\\/image($|\\/)/.test(\n decodeURIComponent(parseUrl(url)?.pathname ?? '')\n )\n ) {\n return {\n errorMessage: '\"url\" parameter cannot be recursive',\n }\n }\n if (!hasLocalMatch(localPatterns, url)) {\n return { errorMessage: '\"url\" parameter is not allowed' }\n }\n } else {\n let hrefParsed: URL\n\n try {\n hrefParsed = new URL(url)\n href = hrefParsed.toString()\n isAbsolute = true\n } catch (_error) {\n return { errorMessage: '\"url\" parameter is invalid' }\n }\n\n if (!['http:', 'https:'].includes(hrefParsed.protocol)) {\n return { errorMessage: '\"url\" parameter is invalid' }\n }\n\n if (!hasRemoteMatch(domains, remotePatterns, hrefParsed)) {\n return { errorMessage: '\"url\" parameter is not allowed' }\n }\n }\n\n if (!w) {\n return { errorMessage: '\"w\" parameter (width) is required' }\n } else if (Array.isArray(w)) {\n return { errorMessage: '\"w\" parameter (width) cannot be an array' }\n } else if (!/^[0-9]+$/.test(w)) {\n return {\n errorMessage: '\"w\" parameter (width) must be an integer greater than 0',\n }\n }\n\n if (!q) {\n return { errorMessage: '\"q\" parameter (quality) is required' }\n } else if (Array.isArray(q)) {\n return { errorMessage: '\"q\" parameter (quality) cannot be an array' }\n } else if (!/^[0-9]+$/.test(q)) {\n return {\n errorMessage:\n '\"q\" parameter (quality) must be an integer between 1 and 100',\n }\n }\n\n const width = parseInt(w, 10)\n\n if (width <= 0 || isNaN(width)) {\n return {\n errorMessage: '\"w\" parameter (width) must be an integer greater than 0',\n }\n }\n\n const sizes = [...(deviceSizes || []), ...(imageSizes || [])]\n\n if (isDev) {\n sizes.push(BLUR_IMG_SIZE)\n }\n\n const isValidSize =\n sizes.includes(width) || (isDev && width <= BLUR_IMG_SIZE)\n\n if (!isValidSize) {\n return {\n errorMessage: `\"w\" parameter (width) of ${width} is not allowed`,\n }\n }\n\n const quality = parseInt(q, 10)\n\n if (isNaN(quality) || quality < 1 || quality > 100) {\n return {\n errorMessage:\n '\"q\" parameter (quality) must be an integer between 1 and 100',\n }\n }\n\n if (qualities) {\n if (isDev) {\n qualities.push(BLUR_QUALITY)\n }\n\n if (!qualities.includes(quality)) {\n return {\n errorMessage: `\"q\" parameter (quality) of ${q} is not allowed`,\n }\n }\n }\n\n const mimeType = getSupportedMimeType(formats || [], req.headers['accept'])\n\n const isStatic =\n url.startsWith(`${nextConfig.basePath || ''}/_next/static/media`) ||\n url.startsWith(\n `${nextConfig.basePath || ''}/_next/static/immutable/media`\n )\n\n return {\n href,\n sizes,\n isAbsolute,\n isStatic,\n width,\n quality,\n mimeType,\n minimumCacheTTL,\n }\n }\n\n static getCacheKey({\n href,\n width,\n quality,\n mimeType,\n }: {\n href: string\n width: number\n quality: number\n mimeType: string\n }): string {\n return getHash([CACHE_VERSION, href, width, quality, mimeType])\n }\n\n constructor({\n distDir,\n nextConfig,\n cacheHandler,\n }: {\n distDir: string\n nextConfig: NextConfigRuntime\n cacheHandler?: CacheHandler\n }) {\n this.cacheDir = join(/* turbopackIgnore: true */ distDir, 'cache', 'images')\n this.nextConfig = nextConfig\n this.cacheHandler = cacheHandler\n\n // Eagerly start LRU initialization for filesystem cache\n if (\n !cacheHandler &&\n nextConfig.images.maximumDiskCacheSize !== 0 &&\n nextConfig.experimental.isrFlushToDisk\n ) {\n this.isDiskCacheEnabled = true\n this.cacheDiskLRU = getOrInitDiskLRU(\n this.cacheDir,\n nextConfig.images.maximumDiskCacheSize,\n initCacheEntries,\n deleteFromCacheDir\n )\n }\n }\n\n async get(cacheKey: string): Promise<IncrementalResponseCacheEntry | null> {\n // If a custom cache handler is provided, use it\n if (this.cacheHandler) {\n try {\n const cacheData = await this.cacheHandler.get(cacheKey, {\n kind: IncrementalCacheKind.IMAGE,\n isFallback: false,\n })\n\n if (!cacheData?.value) {\n return null\n }\n\n if (cacheData.value.kind !== CachedRouteKind.IMAGE) {\n return null\n }\n\n const now = Date.now()\n const lastModified = cacheData.lastModified || now\n const revalidate =\n typeof cacheData.value.revalidate === 'number'\n ? cacheData.value.revalidate\n : this.nextConfig.images.minimumCacheTTL\n const revalidateAfter =\n Math.max(revalidate, this.nextConfig.images.minimumCacheTTL) * 1000 +\n lastModified\n const isStale = revalidateAfter < now\n\n return {\n value: cacheData.value,\n revalidateAfter,\n cacheControl: { revalidate, expire: undefined },\n isStale,\n }\n } catch (_) {\n // failed to get from custom cache handler, treat as cache miss\n }\n return null\n }\n\n // If the filesystem cache is disabled, return early\n if (!this.isDiskCacheEnabled) {\n return null\n }\n\n // Fall back to filesystem cache\n try {\n const now = Date.now()\n const { maxAge, expireAt, etag, upstreamEtag, buffer, extension } =\n await readFromCacheDir(this.cacheDir, cacheKey)\n\n // Promote entry in LRU (mark as recently used)\n const lru = await this.cacheDiskLRU\n lru?.get(cacheKey)\n\n return {\n value: {\n kind: CachedRouteKind.IMAGE,\n etag,\n buffer,\n extension,\n upstreamEtag,\n },\n revalidateAfter:\n Math.max(maxAge, this.nextConfig.images.minimumCacheTTL) * 1000 +\n Date.now(),\n cacheControl: { revalidate: maxAge, expire: undefined },\n isStale: now > expireAt,\n }\n } catch (_) {\n // failed to read from cache dir, treat as cache miss\n }\n return null\n }\n async set(\n cacheKey: string,\n value: IncrementalCacheValue | null,\n {\n cacheControl,\n }: {\n cacheControl?: CacheControl\n }\n ) {\n if (value?.kind !== CachedRouteKind.IMAGE) {\n throw new Error('invariant attempted to set non-image to image-cache')\n }\n\n const revalidate = cacheControl?.revalidate\n\n if (typeof revalidate !== 'number') {\n throw new InvariantError('revalidate must be a number for image-cache')\n }\n\n // If a custom cache handler is provided, use it\n if (this.cacheHandler) {\n try {\n // Apply minimumCacheTTL at write time, similar to the implementation in the fallback filesystem cache\n const effectiveRevalidate = Math.max(\n revalidate,\n this.nextConfig.images.minimumCacheTTL\n )\n const valueWithRevalidate = {\n ...value,\n revalidate: effectiveRevalidate,\n }\n await this.cacheHandler.set(cacheKey, valueWithRevalidate, {\n cacheControl: {\n revalidate: effectiveRevalidate,\n expire: cacheControl?.expire,\n },\n })\n } catch (err) {\n Log.error(`Failed to write image to custom cache ${cacheKey}`, err)\n }\n return\n }\n\n // If the filesystem cache is disabled, return early\n if (!this.isDiskCacheEnabled) {\n return\n }\n\n // Fall back to filesystem cache\n const expireAt =\n Math.max(revalidate, this.nextConfig.images.minimumCacheTTL) * 1000 +\n Date.now()\n\n try {\n const lru = await this.cacheDiskLRU\n const success = lru?.set(cacheKey, value.buffer.byteLength)\n if (success === false) {\n throw new Error(\n `image of size ${value.buffer.byteLength} could not be tracked by lru cache`\n )\n }\n\n await writeToCacheDir(\n this.cacheDir,\n cacheKey,\n value.extension,\n revalidate,\n expireAt,\n value.buffer,\n value.etag,\n value.upstreamEtag\n )\n } catch (err) {\n Log.error(`Failed to write image to cache ${cacheKey}`, err)\n }\n }\n}\nexport class ImageError extends Error {\n statusCode: number\n\n constructor(statusCode: number, message: string) {\n super(message)\n\n // ensure an error status is used > 400\n if (statusCode >= 400) {\n this.statusCode = statusCode\n } else {\n this.statusCode = 500\n }\n }\n}\n\nfunction parseCacheControl(\n str: string | null | undefined\n): Map<string, string> {\n const map = new Map<string, string>()\n if (!str) {\n return map\n }\n for (let directive of str.split(',')) {\n let [key, value] = directive.trim().split('=', 2)\n key = key.toLowerCase()\n if (value) {\n value = value.toLowerCase()\n }\n map.set(key, value)\n }\n return map\n}\n\nexport function getMaxAge(str: string | null | undefined): number {\n const map = parseCacheControl(str)\n if (map) {\n let age = map.get('s-maxage') || map.get('max-age') || ''\n if (age.startsWith('\"') && age.endsWith('\"')) {\n age = age.slice(1, -1)\n }\n const n = parseInt(age, 10)\n if (!isNaN(n)) {\n return n\n }\n }\n return 0\n}\nexport function getPreviouslyCachedImageOrNull(\n upstreamImage: ImageUpstream,\n previousCacheEntry: IncrementalCacheEntry | null | undefined\n): CachedImageValue | null {\n if (\n previousCacheEntry?.value?.kind === 'IMAGE' &&\n // Images that are SVGs, animated or failed the optimization previously end up using upstreamEtag as their etag as well,\n // in these cases we want to trigger a new \"optimization\" attempt.\n previousCacheEntry.value.upstreamEtag !== previousCacheEntry.value.etag &&\n // and the upstream etag is the same as the previous cache entry's\n upstreamImage.etag === previousCacheEntry.value.upstreamEtag\n ) {\n return previousCacheEntry.value\n }\n return null\n}\n\nexport async function optimizeImage({\n buffer,\n contentType,\n quality,\n width,\n height,\n concurrency,\n operationCache,\n limitInputPixels,\n sequentialRead,\n timeoutInSeconds,\n}: {\n buffer: Buffer\n contentType: string\n quality: number\n width: number\n height?: number\n concurrency?: number | null\n operationCache?: boolean | null | undefined\n limitInputPixels?: number\n sequentialRead?: boolean | null\n timeoutInSeconds?: number\n}): Promise<Buffer> {\n const sharp = getSharp(concurrency, operationCache)\n const transformer = sharp(buffer, {\n limitInputPixels,\n sequentialRead: sequentialRead ?? undefined,\n })\n .timeout({\n seconds: timeoutInSeconds ?? 7,\n })\n .rotate()\n\n if (height) {\n transformer.resize(width, height)\n } else {\n transformer.resize(width, undefined, {\n withoutEnlargement: true,\n })\n }\n\n if (contentType === AVIF) {\n transformer.avif({\n // Scale the quality to try and match webp. This ratio was derived\n // from sharp's default 80 (webp) and 50 (avif), and then verified\n // using dssim and ssimulacra2 visual quality tests.\n quality: Math.max(Math.round(quality * (50 / 80)), 1),\n effort: 3,\n })\n } else if (contentType === WEBP) {\n transformer.webp({ quality })\n } else if (contentType === PNG) {\n transformer.png({ quality })\n } else if (contentType === JPEG) {\n transformer.jpeg({ quality, mozjpeg: true })\n }\n\n const optimizedBuffer = await transformer.toBuffer()\n\n return optimizedBuffer\n}\n\nfunction isRedirect(statusCode: number) {\n return [301, 302, 303, 307, 308].includes(statusCode)\n}\n\nexport async function fetchExternalImage(\n href: string,\n dangerouslyAllowLocalIP: boolean,\n maximumResponseBody: number,\n count = 3\n): Promise<ImageUpstream> {\n if (!dangerouslyAllowLocalIP) {\n const { hostname } = new URL(href)\n let ips = [hostname]\n if (!isIP(hostname)) {\n const records = await lookup(hostname, {\n family: 0,\n all: true,\n hints: ALL,\n }).catch((_) => [{ address: hostname }])\n ips = records.map((record) => record.address)\n }\n const privateIps = ips.filter((ip) => isPrivateIp(ip))\n if (privateIps.length > 0) {\n Log.error(\n 'upstream image',\n href,\n 'hostname resolved to private IP',\n JSON.stringify(privateIps),\n 'If this is expected and you understand SSRF risk, use images.dangerouslyAllowLocalIP = true to continue.'\n )\n throw new ImageError(400, '\"url\" parameter is not allowed')\n }\n }\n const res = await fetch(href, {\n signal: AbortSignal.timeout(7_000),\n redirect: 'manual',\n }).catch((err) => err as Error)\n\n if (res instanceof Error) {\n const err = res as Error\n if (err.name === 'TimeoutError') {\n Log.error('upstream image response timed out for', href)\n throw new ImageError(\n 504,\n '\"url\" parameter is valid but upstream response timed out'\n )\n }\n throw err\n }\n\n const locationHeader = res.headers.get('Location')\n if (\n isRedirect(res.status) &&\n locationHeader &&\n URL.canParse(locationHeader, href)\n ) {\n if (count === 0) {\n Log.error('upstream image response had too many redirects', href)\n throw new ImageError(\n 508,\n '\"url\" parameter is valid but upstream response is invalid'\n )\n }\n const redirect = new URL(locationHeader, href).href\n return fetchExternalImage(\n redirect,\n dangerouslyAllowLocalIP,\n maximumResponseBody,\n count - 1\n )\n }\n\n if (!res.ok) {\n Log.error('upstream image response failed for', href, res.status)\n throw new ImageError(\n res.status,\n '\"url\" parameter is valid but upstream response is invalid'\n )\n }\n\n if (!res.body) {\n Log.error('upstream image response is empty for', href)\n throw new ImageError(\n 400,\n '\"url\" parameter is valid but upstream response is invalid'\n )\n }\n\n const chunks: Buffer[] = []\n let totalSize = 0\n\n for await (const c of res.body) {\n const chunk = Buffer.from(c)\n totalSize += chunk.byteLength\n if (totalSize > maximumResponseBody) {\n Log.error(\n 'upstream image response exceeded maximum size for',\n href,\n totalSize\n )\n throw new ImageError(\n 413,\n '\"url\" parameter is valid but upstream response is invalid'\n )\n }\n chunks.push(chunk)\n }\n\n const buffer = Buffer.concat(chunks)\n const contentType = res.headers.get('Content-Type')\n const cacheControl = res.headers.get('Cache-Control')\n const etag = extractEtag(res.headers.get('ETag'), buffer)\n return { buffer, contentType, cacheControl, etag }\n}\n\nexport async function fetchInternalImage(\n href: string,\n _req: IncomingMessage,\n _res: ServerResponse,\n maximumResponseBody: number,\n handleRequest: (\n newReq: IncomingMessage,\n newRes: ServerResponse,\n newParsedUrl?: NextUrlWithParsedQuery\n ) => Promise<void>\n): Promise<ImageUpstream> {\n try {\n // Coerce HEAD to GET to avoid issues with the image optimizer\n const method = !_req.method || _req.method === 'HEAD' ? 'GET' : _req.method\n\n const mocked = createRequestResponseMocks({\n url: href,\n method,\n socket: _req.socket,\n maximumResponseBody,\n })\n\n await handleRequest(mocked.req, mocked.res, parseReqUrl(href))\n await mocked.res.hasStreamed\n\n if (!mocked.res.statusCode) {\n Log.error('image response failed for', href, mocked.res.statusCode)\n throw new ImageError(\n mocked.res.statusCode,\n '\"url\" parameter is valid but internal response is invalid'\n )\n }\n\n if (mocked.res.buffers.length === 0) {\n Log.error('internal image response is empty for', href)\n throw new ImageError(\n 400,\n '\"url\" parameter is valid but internal response is invalid'\n )\n }\n\n const buffer = Buffer.concat(mocked.res.buffers)\n const contentType = mocked.res.getHeader('Content-Type')\n const cacheControl = mocked.res.getHeader('Cache-Control')\n const etag = extractEtag(mocked.res.getHeader('ETag'), buffer)\n\n return { buffer, contentType, cacheControl, etag }\n } catch (err) {\n if (err instanceof ImageError) {\n throw err\n }\n\n if (\n err &&\n typeof err === 'object' &&\n 'code' in err &&\n err.code === 'ERR_MAX_BODY_SIZE_EXCEEDED'\n ) {\n Log.error('internal image response exceeded maximum size for', href)\n throw new ImageError(\n 413,\n '\"url\" parameter is valid but internal response is invalid'\n )\n }\n\n Log.error('upstream image response failed for', href, err)\n throw new ImageError(\n 500,\n '\"url\" parameter is valid but upstream response is invalid'\n )\n }\n}\n\nexport async function imageOptimizer(\n imageUpstream: ImageUpstream,\n paramsResult: Pick<\n ImageParamsResult,\n 'href' | 'width' | 'quality' | 'mimeType'\n >,\n nextConfig: {\n experimental: Pick<\n NextConfigComplete['experimental'],\n | 'imgOptConcurrency'\n | 'imgOptOperationCache'\n | 'imgOptMaxInputPixels'\n | 'imgOptSequentialRead'\n | 'imgOptTimeoutInSeconds'\n >\n images: Pick<\n NextConfigComplete['images'],\n 'dangerouslyAllowSVG' | 'minimumCacheTTL'\n >\n },\n opts: {\n isDev?: boolean\n silent?: boolean\n previousCacheEntry?: IncrementalResponseCacheEntry | null\n }\n): Promise<{\n buffer: Buffer\n contentType: string\n maxAge: number\n etag: string\n upstreamEtag: string\n error?: unknown\n}> {\n const { href, quality, width, mimeType } = paramsResult\n const { buffer: upstreamBuffer, etag: upstreamEtag } = imageUpstream\n const maxAge = Math.max(\n nextConfig.images.minimumCacheTTL,\n getMaxAge(imageUpstream.cacheControl)\n )\n\n const upstreamType = await detectContentType(upstreamBuffer)\n\n if (\n !upstreamType ||\n !upstreamType.startsWith('image/') ||\n upstreamType.includes(',')\n ) {\n if (!opts.silent) {\n Log.error(\n \"The requested resource isn't a valid image for\",\n href,\n 'received',\n upstreamType\n )\n }\n throw new ImageError(400, \"The requested resource isn't a valid image.\")\n }\n if (\n upstreamType.startsWith('image/svg') &&\n !nextConfig.images.dangerouslyAllowSVG\n ) {\n if (!opts.silent) {\n Log.error(\n `The requested resource \"${href}\" has type \"${upstreamType}\" but dangerouslyAllowSVG is disabled. Consider adding the \"unoptimized\" property to the <Image>.`\n )\n }\n throw new ImageError(\n 400,\n '\"url\" parameter is valid but image type is not allowed'\n )\n }\n if (ANIMATABLE_TYPES.includes(upstreamType) && isAnimated(upstreamBuffer)) {\n if (!opts.silent) {\n Log.warnOnce(\n `The requested resource \"${href}\" is an animated image so it will not be optimized. Consider adding the \"unoptimized\" property to the <Image>.`\n )\n }\n return {\n buffer: upstreamBuffer,\n contentType: upstreamType,\n maxAge,\n etag: upstreamEtag,\n upstreamEtag,\n }\n }\n if (BYPASS_TYPES.includes(upstreamType)) {\n return {\n buffer: upstreamBuffer,\n contentType: upstreamType,\n maxAge,\n etag: upstreamEtag,\n upstreamEtag,\n }\n }\n\n let contentType: string\n\n if (mimeType) {\n contentType = mimeType\n } else if (\n getExtension(upstreamType) &&\n upstreamType !== WEBP &&\n upstreamType !== AVIF\n ) {\n contentType = upstreamType\n } else {\n contentType = JPEG\n }\n const previouslyCachedImage = getPreviouslyCachedImageOrNull(\n imageUpstream,\n opts.previousCacheEntry\n )\n if (previouslyCachedImage) {\n return {\n buffer: previouslyCachedImage.buffer,\n contentType,\n maxAge: opts?.previousCacheEntry?.cacheControl?.revalidate || maxAge,\n etag: previouslyCachedImage.etag,\n upstreamEtag: previouslyCachedImage.upstreamEtag,\n }\n }\n\n try {\n let optimizedBuffer = await optimizeImage({\n buffer: upstreamBuffer,\n contentType,\n quality,\n width,\n concurrency: nextConfig.experimental.imgOptConcurrency,\n operationCache: nextConfig.experimental.imgOptOperationCache,\n limitInputPixels: nextConfig.experimental.imgOptMaxInputPixels,\n sequentialRead: nextConfig.experimental.imgOptSequentialRead,\n timeoutInSeconds: nextConfig.experimental.imgOptTimeoutInSeconds,\n })\n if (opts.isDev && width <= BLUR_IMG_SIZE && quality === BLUR_QUALITY) {\n // During `next dev`, we don't want to generate blur placeholders with webpack\n // because it can delay starting the dev server. Instead, `next-image-loader.js`\n // will inline a special url to lazily generate the blur placeholder at request time.\n const meta = await getImageSize(optimizedBuffer)\n const blurOpts = {\n blurWidth: meta.width,\n blurHeight: meta.height,\n blurDataURL: `data:${contentType};base64,${optimizedBuffer.toString(\n 'base64'\n )}`,\n }\n optimizedBuffer = Buffer.from(unescape(getImageBlurSvg(blurOpts)))\n contentType = 'image/svg+xml'\n }\n return {\n buffer: optimizedBuffer,\n contentType,\n maxAge,\n etag: getImageEtag(optimizedBuffer),\n upstreamEtag,\n }\n } catch (error) {\n if (upstreamType) {\n // If we fail to optimize, fallback to the original image\n return {\n buffer: upstreamBuffer,\n contentType: upstreamType,\n maxAge: nextConfig.images.minimumCacheTTL,\n etag: upstreamEtag,\n upstreamEtag,\n error,\n }\n } else {\n throw new ImageError(\n 400,\n 'Unable to optimize image and unable to fallback to upstream image'\n )\n }\n }\n}\n\nfunction getFileNameWithExtension(\n url: string,\n contentType: string | null\n): string {\n const [urlWithoutQueryParams] = url.split('?', 1)\n const fileNameWithExtension = urlWithoutQueryParams.split('/').pop()\n if (!contentType || !fileNameWithExtension) {\n return 'image.bin'\n }\n\n const [fileName] = fileNameWithExtension.split('.', 1)\n const extension = getExtension(contentType)\n return `${fileName}.${extension}`\n}\n\nfunction setResponseHeaders(\n req: IncomingMessage,\n res: ServerResponse,\n url: string,\n etag: string,\n contentType: string | null,\n isStatic: boolean,\n xCache: XCacheHeader,\n imagesConfig: ImageConfigComplete,\n maxAge: number,\n isDev: boolean\n) {\n res.setHeader('Vary', 'Accept')\n res.setHeader(\n 'Cache-Control',\n isStatic\n ? 'public, max-age=315360000, immutable'\n : `public, max-age=${isDev ? 0 : maxAge}, must-revalidate`\n )\n if (sendEtagResponse(req, res, etag)) {\n // already called res.end() so we're finished\n return { finished: true }\n }\n if (contentType) {\n res.setHeader('Content-Type', contentType)\n }\n\n const fileName = getFileNameWithExtension(url, contentType)\n res.setHeader(\n 'Content-Disposition',\n contentDisposition(fileName, { type: imagesConfig.contentDispositionType })\n )\n\n res.setHeader('Content-Security-Policy', imagesConfig.contentSecurityPolicy)\n res.setHeader('X-Nextjs-Cache', xCache)\n\n return { finished: false }\n}\n\nexport function sendResponse(\n req: IncomingMessage,\n res: ServerResponse,\n url: string,\n extension: string,\n buffer: Buffer,\n etag: string,\n isStatic: boolean,\n xCache: XCacheHeader,\n imagesConfig: ImageConfigComplete,\n maxAge: number,\n isDev: boolean\n) {\n const contentType = getContentType(extension)\n const result = setResponseHeaders(\n req,\n res,\n url,\n etag,\n contentType,\n isStatic,\n xCache,\n imagesConfig,\n maxAge,\n isDev\n )\n if (!result.finished) {\n res.setHeader('Content-Length', Buffer.byteLength(buffer))\n // A response body must not be sent for HEAD requests\n if (req.method === 'HEAD') {\n res.end()\n } else {\n res.end(buffer)\n }\n }\n}\n\nexport async function getImageSize(buffer: Buffer): Promise<{\n width?: number\n height?: number\n}> {\n const { width, height } = imageSizeOf(buffer)\n return { width, height }\n}\n"],"names":["createHash","promises","mediaType","contentDisposition","imageSizeOf","detector","isAnimated","join","getImageBlurSvg","hasLocalMatch","hasRemoteMatch","createRequestResponseMocks","CachedRouteKind","IncrementalCacheKind","sendEtagResponse","getContentType","getExtension","Log","isError","isPrivateIp","getOrInitDiskLRU","parseUrl","parseReqUrl","InvariantError","lookup","isIP","ALL","AVIF","WEBP","PNG","JPEG","JXL","JP2","HEIC","GIF","SVG","ICO","ICNS","TIFF","BMP","PDF","CACHE_VERSION","ANIMATABLE_TYPES","BYPASS_TYPES","BLUR_IMG_SIZE","BLUR_QUALITY","_sharp","initCacheEntries","cacheDir","cacheKeys","readdir","catch","entries","cacheKey","expireAt","buffer","readFromCacheDir","push","key","size","byteLength","sort","a","b","getSharp","concurrency","operationCache","require","block","operation","unblock","cache","divisor","process","env","NODE_ENV","Math","floor","max","e","code","Error","getSupportedMimeType","options","accept","mimeType","includes","getHash","items","hash","item","update","String","digest","extractEtag","etag","imageBuffer","Buffer","from","toString","getImageEtag","image","writeToCacheDir","extension","maxAge","upstreamEtag","dir","filename","rm","recursive","force","mkdir","writeFile","files","file","maxAgeSt","expireAtSt","split","filePath","readFile","Number","deleteFromCacheDir","err","error","detectContentType","every","i","format","subarray","undefined","ImageOptimizerCache","validateParams","req","query","nextConfig","isDev","imageData","images","deviceSizes","imageSizes","domains","minimumCacheTTL","formats","remotePatterns","localPatterns","qualities","url","w","q","href","length","warnOnce","errorMessage","Array","isArray","startsWith","isAbsolute","test","decodeURIComponent","pathname","hrefParsed","URL","_error","protocol","width","parseInt","isNaN","sizes","isValidSize","quality","headers","isStatic","basePath","getCacheKey","constructor","distDir","cacheHandler","maximumDiskCacheSize","experimental","isrFlushToDisk","isDiskCacheEnabled","cacheDiskLRU","get","cacheData","kind","IMAGE","isFallback","value","now","Date","lastModified","revalidate","revalidateAfter","isStale","cacheControl","expire","_","lru","set","effectiveRevalidate","valueWithRevalidate","success","ImageError","statusCode","message","parseCacheControl","str","map","Map","directive","trim","toLowerCase","getMaxAge","age","endsWith","slice","n","getPreviouslyCachedImageOrNull","upstreamImage","previousCacheEntry","optimizeImage","contentType","height","limitInputPixels","sequentialRead","timeoutInSeconds","sharp","transformer","timeout","seconds","rotate","resize","withoutEnlargement","avif","round","effort","webp","png","jpeg","mozjpeg","optimizedBuffer","toBuffer","isRedirect","fetchExternalImage","dangerouslyAllowLocalIP","maximumResponseBody","count","hostname","ips","records","family","all","hints","address","record","privateIps","filter","ip","JSON","stringify","res","fetch","signal","AbortSignal","redirect","name","locationHeader","status","canParse","ok","body","chunks","totalSize","c","chunk","concat","fetchInternalImage","_req","_res","handleRequest","method","mocked","socket","hasStreamed","buffers","getHeader","imageOptimizer","imageUpstream","paramsResult","opts","upstreamBuffer","upstreamType","silent","dangerouslyAllowSVG","previouslyCachedImage","imgOptConcurrency","imgOptOperationCache","imgOptMaxInputPixels","imgOptSequentialRead","imgOptTimeoutInSeconds","meta","getImageSize","blurOpts","blurWidth","blurHeight","blurDataURL","unescape","getFileNameWithExtension","urlWithoutQueryParams","fileNameWithExtension","pop","fileName","setResponseHeaders","xCache","imagesConfig","setHeader","finished","type","contentDispositionType","contentSecurityPolicy","sendResponse","result","end"],"mappings":"AAAA,SAASA,UAAU,QAAQ,SAAQ;AACnC,SAASC,QAAQ,QAAQ,KAAI;AAE7B,SAASC,SAAS,QAAQ,kCAAiC;AAC3D,OAAOC,wBAAwB,yCAAwC;AACvE,OAAOC,iBAAiB,gCAA+B;AACvD,SAASC,QAAQ,QAAQ,gDAA+C;AACxE,OAAOC,gBAAgB,iCAAgC;AACvD,SAASC,IAAI,QAAQ,OAAM;AAC3B,SAASC,eAAe,QAAQ,+BAA8B;AAE9D,SAASC,aAAa,QAAQ,oCAAmC;AACjE,SAASC,cAAc,QAAQ,qCAAoC;AAEnE,SAASC,0BAA0B,QAAQ,qBAAoB;AAE/D,SACEC,eAAe,EACfC,oBAAoB,QAKf,mBAAkB;AAEzB,SAASC,gBAAgB,QAAQ,iBAAgB;AACjD,SAASC,cAAc,EAAEC,YAAY,QAAQ,iBAAgB;AAC7D,YAAYC,SAAS,sBAAqB;AAC1C,OAAOC,aAAa,kBAAiB;AACrC,SAASC,WAAW,QAAQ,kBAAiB;AAC7C,SAASC,gBAAgB,QAAQ,gCAA+B;AAChE,SAASC,QAAQ,EAAEC,WAAW,QAAQ,aAAY;AAElD,SAASC,cAAc,QAAQ,gCAA+B;AAC9D,SAASC,MAAM,QAAQ,eAAc;AACrC,SAASC,IAAI,QAAQ,MAAK;AAC1B,SAASC,GAAG,QAAQ,MAAK;AAIzB,MAAMC,OAAO;AACb,MAAMC,OAAO;AACb,MAAMC,MAAM;AACZ,MAAMC,OAAO;AACb,MAAMC,MAAM;AACZ,MAAMC,MAAM;AACZ,MAAMC,OAAO;AACb,MAAMC,MAAM;AACZ,MAAMC,MAAM;AACZ,MAAMC,MAAM;AACZ,MAAMC,OAAO;AACb,MAAMC,OAAO;AACb,MAAMC,MAAM;AACZ,MAAMC,MAAM;AACZ,MAAMC,gBAAgB;AACtB,MAAMC,mBAAmB;IAACd;IAAMC;IAAKK;CAAI;AACzC,MAAMS,eAAe;IAACR;IAAKC;IAAKC;IAAME;IAAKR;IAAKE;CAAK;AACrD,MAAMW,gBAAgB,EAAE,mCAAmC;;AAC3D,MAAMC,eAAe,GAAG,mCAAmC;;AAE3D,IAAIC;AAEJ,eAAeC,iBACbC,QAAgB;IAEhB,MAAMC,YAAY,MAAMhD,SAASiD,OAAO,CAACF,UAAUG,KAAK,CAAC,IAAM,EAAE;IACjE,MAAMC,UAAkE,EAAE;IAE1E,KAAK,MAAMC,YAAYJ,UAAW;QAChC,IAAI;YACF,MAAM,EAAEK,QAAQ,EAAEC,MAAM,EAAE,GAAG,MAAMC,iBAAiBR,UAAUK;YAC9DD,QAAQK,IAAI,CAAC;gBACXC,KAAKL;gBACLM,MAAMJ,OAAOK,UAAU;gBACvBN;YACF;QACF,EAAE,OAAM;QACN,4CAA4C;QAC9C;IACF;IAEA,mEAAmE;IACnE,OAAOF,QAAQS,IAAI,CAAC,CAACC,GAAGC,IAAMD,EAAER,QAAQ,GAAGS,EAAET,QAAQ;AACvD;AAEA,OAAO,SAASU,SACdC,WAAsC,EACtCC,cAA0C;IAE1C,IAAIpB,QAAQ;QACV,OAAOA;IACT;IACA,IAAI;QACFA,SAASqB,QAAQ;QACjBrB,OAAOsB,KAAK,CAAC;YAAEC,WAAW;gBAAC;aAAkB;QAAC;QAC9CvB,OAAOwB,OAAO,CAAC;YACbD,WAAW;gBACT;gBACA;gBACA;gBACA;gBACA;gBACA;gBACA;aACD;QACH;QACA,IAAI,OAAOH,mBAAmB,WAAW;YACvCpB,OAAOyB,KAAK,CAACL;QACf;QACA,IAAIpB,OAAOmB,WAAW,KAAK,GAAG;YAC5B,2DAA2D;YAC3D,8DAA8D;YAC9D,0DAA0D;YAC1D,MAAMO,UAAUC,QAAQC,GAAG,CAACC,QAAQ,KAAK,gBAAgB,IAAI;YAC7D7B,OAAOmB,WAAW,CAChBA,eAAeW,KAAKC,KAAK,CAACD,KAAKE,GAAG,CAAChC,OAAOmB,WAAW,KAAKO,SAAS;QAEvE;IACF,EAAE,OAAOO,GAAY;QACnB,IAAI7D,QAAQ6D,MAAMA,EAAEC,IAAI,KAAK,oBAAoB;YAC/C,MAAM,qBAEL,CAFK,IAAIC,MACR,yFADI,qBAAA;uBAAA;4BAAA;8BAAA;YAEN;QACF;QACA,MAAMF;IACR;IACA,OAAOjC;AACT;AAoBA,SAASoC,qBAAqBC,OAAiB,EAAEC,SAAS,EAAE;IAC1D,MAAMC,WAAWnF,UAAUkF,QAAQD;IACnC,OAAOC,OAAOE,QAAQ,CAACD,YAAYA,WAAW;AAChD;AAEA,OAAO,SAASE,QAAQC,KAAmC;IACzD,MAAMC,OAAOzF,WAAW;IACxB,KAAK,IAAI0F,QAAQF,MAAO;QACtB,IAAI,OAAOE,SAAS,UAAUD,KAAKE,MAAM,CAACC,OAAOF;aAC5C;YACHD,KAAKE,MAAM,CAACD;QACd;IACF;IACA,4DAA4D;IAC5D,OAAOD,KAAKI,MAAM,CAAC;AACrB;AAEA,OAAO,SAASC,YACdC,IAA+B,EAC/BC,WAAmB;IAEnB,IAAID,MAAM;QACR,yEAAyE;QACzE,iDAAiD;QACjD,OAAOE,OAAOC,IAAI,CAACH,MAAMI,QAAQ,CAAC;IACpC;IACA,OAAOC,aAAaJ;AACtB;AAEA,OAAO,SAASI,aAAaC,KAAa;IACxC,OAAOd,QAAQ;QAACc;KAAM;AACxB;AAEA,eAAeC,gBACbtD,QAAgB,EAChBK,QAAgB,EAChBkD,SAAiB,EACjBC,MAAc,EACdlD,QAAgB,EAChBC,MAAc,EACdwC,IAAY,EACZU,YAAoB;IAEpB,MAAMC,MAAMnG,KAAK,yBAAyB,GAAGyC,UAAUK;IACvD,MAAMsD,WAAWpG,KACf,yBAAyB,GACzBmG,KACA,GAAGF,OAAO,CAAC,EAAElD,SAAS,CAAC,EAAEyC,KAAK,CAAC,EAAEU,aAAa,CAAC,EAAEF,WAAW;IAG9D,MAAMtG,SAAS2G,EAAE,CAACF,KAAK;QAAEG,WAAW;QAAMC,OAAO;IAAK,GAAG3D,KAAK,CAAC,KAAO;IAEtE,MAAMlD,SAAS8G,KAAK,CAACL,KAAK;QAAEG,WAAW;IAAK;IAC5C,MAAM5G,SAAS+G,SAAS,CAACL,UAAUpD;AACrC;AAEA,eAAeC,iBAAiBR,QAAgB,EAAEK,QAAgB;IAChE,MAAMqD,MAAMnG,KAAK,yBAAyB,GAAGyC,UAAUK;IACvD,MAAM4D,QAAQ,MAAMhH,SAASiD,OAAO,CAACwD;IACrC,MAAMQ,OAAOD,KAAK,CAAC,EAAE;IACrB,IAAI,CAACC,MAAM;QACT,MAAM,qBAEL,CAFK,IAAIjC,MACR,CAAC,wBAAwB,EAAE5B,SAAS,oBAAoB,EAAEL,SAAS,CAAC,CAAC,GADjE,qBAAA;mBAAA;wBAAA;0BAAA;QAEN;IACF;IACA,MAAM,CAACmE,UAAUC,YAAYrB,MAAMU,cAAcF,UAAU,GAAGW,KAAKG,KAAK,CACtE,KACA;IAEF,MAAMC,WAAW/G,KAAK,yBAAyB,GAAGmG,KAAKQ;IACvD,MAAM3D,SAAS,MAAMtD,SAASsH,QAAQ,CAAC,yBAAyB,GAAGD;IACnE,MAAMhE,WAAWkE,OAAOJ;IACxB,MAAMZ,SAASgB,OAAOL;IACtB,OAAO;QAAEX;QAAQlD;QAAUyC;QAAMU;QAAclD;QAAQgD;IAAU;AACnE;AAEA,eAAekB,mBAAmBzE,QAAgB,EAAEK,QAAgB;IAClE,OAAOpD,SACJ2G,EAAE,CAACrG,KAAK,yBAAyB,GAAGyC,UAAUK,WAAW;QACxDwD,WAAW;QACXC,OAAO;IACT,GACC3D,KAAK,CAAC,CAACuE;QACNzG,IAAI0G,KAAK,CAAC,CAAC,2BAA2B,EAAEtE,UAAU,EAAEqE;IACtD;AACJ;AAEA;;;;CAIC,GACD,OAAO,eAAeE,kBACpBrE,MAAc;IAEd,IAAIA,OAAOK,UAAU,KAAK,GAAG;QAC3B,OAAO;IACT;IACA,IAAI;QAAC;QAAM;QAAM;KAAK,CAACiE,KAAK,CAAC,CAAC9D,GAAG+D,IAAMvE,MAAM,CAACuE,EAAE,KAAK/D,IAAI;QACvD,OAAOjC;IACT;IACA,IACE;QAAC;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;KAAK,CAAC+F,KAAK,CACpD,CAAC9D,GAAG+D,IAAMvE,MAAM,CAACuE,EAAE,KAAK/D,IAE1B;QACA,OAAOlC;IACT;IACA,IAAI;QAAC;QAAM;QAAM;QAAM;KAAK,CAACgG,KAAK,CAAC,CAAC9D,GAAG+D,IAAMvE,MAAM,CAACuE,EAAE,KAAK/D,IAAI;QAC7D,OAAO7B;IACT;IACA,IACE;QAAC;QAAM;QAAM;QAAM;QAAM;QAAG;QAAG;QAAG;QAAG;QAAM;QAAM;QAAM;KAAK,CAAC2F,KAAK,CAChE,CAAC9D,GAAG+D,IAAM,CAAC/D,KAAKR,MAAM,CAACuE,EAAE,KAAK/D,IAEhC;QACA,OAAOnC;IACT;IACA,IAAI;QAAC;QAAM;QAAM;QAAM;QAAM;KAAK,CAACiG,KAAK,CAAC,CAAC9D,GAAG+D,IAAMvE,MAAM,CAACuE,EAAE,KAAK/D,IAAI;QACnE,OAAO5B;IACT;IACA,IAAI;QAAC;QAAM;QAAM;QAAM;KAAK,CAAC0F,KAAK,CAAC,CAAC9D,GAAG+D,IAAMvE,MAAM,CAACuE,EAAE,KAAK/D,IAAI;QAC7D,OAAO5B;IACT;IACA,IACE;QAAC;QAAG;QAAG;QAAG;QAAG;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;KAAK,CAAC0F,KAAK,CAChE,CAAC9D,GAAG+D,IAAM,CAAC/D,KAAKR,MAAM,CAACuE,EAAE,KAAK/D,IAEhC;QACA,OAAOpC;IACT;IACA,IAAI;QAAC;QAAM;QAAM;QAAM;KAAK,CAACkG,KAAK,CAAC,CAAC9D,GAAG+D,IAAMvE,MAAM,CAACuE,EAAE,KAAK/D,IAAI;QAC7D,OAAO3B;IACT;IACA,IAAI;QAAC;QAAM;QAAM;QAAM;KAAK,CAACyF,KAAK,CAAC,CAAC9D,GAAG+D,IAAMvE,MAAM,CAACuE,EAAE,KAAK/D,IAAI;QAC7D,OAAO1B;IACT;IACA,IAAI;QAAC;QAAM;QAAM;QAAM;KAAK,CAACwF,KAAK,CAAC,CAAC9D,GAAG+D,IAAMvE,MAAM,CAACuE,EAAE,KAAK/D,IAAI;QAC7D,OAAOzB;IACT;IACA,IAAI;QAAC;QAAM;KAAK,CAACuF,KAAK,CAAC,CAAC9D,GAAG+D,IAAMvE,MAAM,CAACuE,EAAE,KAAK/D,IAAI;QACjD,OAAOxB;IACT;IACA,IAAI;QAAC;QAAM;KAAK,CAACsF,KAAK,CAAC,CAAC9D,GAAG+D,IAAMvE,MAAM,CAACuE,EAAE,KAAK/D,IAAI;QACjD,OAAOhC;IACT;IACA,IACE;QACE;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;KACnE,CAAC8F,KAAK,CAAC,CAAC9D,GAAG+D,IAAMvE,MAAM,CAACuE,EAAE,KAAK/D,IAChC;QACA,OAAOhC;IACT;IACA,IACE;QAAC;QAAG;QAAG;QAAG;QAAG;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;KAAK,CAAC8F,KAAK,CAChE,CAAC9D,GAAG+D,IAAM,CAAC/D,KAAKR,MAAM,CAACuE,EAAE,KAAK/D,IAEhC;QACA,OAAO9B;IACT;IACA,IAAI;QAAC;QAAM;QAAM;QAAM;QAAM;KAAK,CAAC4F,KAAK,CAAC,CAAC9D,GAAG+D,IAAMvE,MAAM,CAACuE,EAAE,KAAK/D,IAAI;QACnE,OAAOvB;IACT;IACA,IACE;QACE;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;QAAM;KACnE,CAACqF,KAAK,CAAC,CAAC9D,GAAG+D,IAAMvE,MAAM,CAACuE,EAAE,KAAK/D,IAChC;QACA,OAAO/B;IACT;IAEA,MAAM+F,SAAS1H,SAASkD,OAAOyE,QAAQ,CAAC,GAAG;IAE3C,OAAQD;QACN,KAAK;YACH,OAAOnG;QACT,KAAK;YACH,OAAOC;QACT,KAAK;YACH,OAAOC;QACT,KAAK;YACH,OAAOI;QACT,KAAK;YACH,OAAOC;QACT,KAAK;QACL,KAAK;YACH,OAAOJ;QACT,KAAK;YACH,OAAOC;QACT,KAAK;YACH,OAAOM;QACT,KAAK;YACH,OAAOC;QACT,KAAK;YACH,OAAOH;QACT,KAAK;YACH,OAAOC;QACT,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK;QACL,KAAK4F;YACH,OAAO,KAAK,sBAAsB;;QACpC;YACEF,QAAuB,mBAAmB;YAC1C,OAAO,KAAK,sBAAsB;;IACtC;AACF;AAEA,OAAO,MAAMG;IAOX,OAAOC,eACLC,GAAoB,EACpBC,KAAsC,EACtCC,UAA6B,EAC7BC,KAAc,EACgC;YASvBD,oBACDA,qBACJA;QAVlB,MAAME,YAAYF,WAAWG,MAAM;QACnC,MAAM,EACJC,cAAc,EAAE,EAChBC,aAAa,EAAE,EACfC,UAAU,EAAE,EACZC,kBAAkB,KAAK,EACvBC,UAAU;YAAC;SAAa,EACzB,GAAGN;QACJ,MAAMO,iBAAiBT,EAAAA,qBAAAA,WAAWG,MAAM,qBAAjBH,mBAAmBS,cAAc,KAAI,EAAE;QAC9D,MAAMC,iBAAgBV,sBAAAA,WAAWG,MAAM,qBAAjBH,oBAAmBU,aAAa;QACtD,MAAMC,aAAYX,sBAAAA,WAAWG,MAAM,qBAAjBH,oBAAmBW,SAAS;QAC9C,MAAM,EAAEC,GAAG,EAAEC,CAAC,EAAEC,CAAC,EAAE,GAAGf;QACtB,IAAIgB;QAEJ,IAAIT,QAAQU,MAAM,GAAG,GAAG;YACtBrI,IAAIsI,QAAQ,CACV;QAEJ;QAEA,IAAI,CAACL,KAAK;YACR,OAAO;gBAAEM,cAAc;YAA8B;QACvD,OAAO,IAAIC,MAAMC,OAAO,CAACR,MAAM;YAC7B,OAAO;gBAAEM,cAAc;YAAqC;QAC9D;QAEA,IAAIN,IAAII,MAAM,GAAG,MAAM;YACrB,OAAO;gBAAEE,cAAc;YAA8B;QACvD;QAEA,IAAIN,IAAIS,UAAU,CAAC,OAAO;YACxB,OAAO;gBACLH,cAAc;YAChB;QACF;QAEA,IAAII;QAEJ,IAAIV,IAAIS,UAAU,CAAC,MAAM;gBAKAtI;YAJvBgI,OAAOH;YACPU,aAAa;YACb,IACE,uBAAuBC,IAAI,CACzBC,mBAAmBzI,EAAAA,YAAAA,SAAS6H,yBAAT7H,UAAe0I,QAAQ,KAAI,MAEhD;gBACA,OAAO;oBACLP,cAAc;gBAChB;YACF;YACA,IAAI,CAAC/I,cAAcuI,eAAeE,MAAM;gBACtC,OAAO;oBAAEM,cAAc;gBAAiC;YAC1D;QACF,OAAO;YACL,IAAIQ;YAEJ,IAAI;gBACFA,aAAa,IAAIC,IAAIf;gBACrBG,OAAOW,WAAW7D,QAAQ;gBAC1ByD,aAAa;YACf,EAAE,OAAOM,QAAQ;gBACf,OAAO;oBAAEV,cAAc;gBAA6B;YACtD;YAEA,IAAI,CAAC;gBAAC;gBAAS;aAAS,CAAClE,QAAQ,CAAC0E,WAAWG,QAAQ,GAAG;gBACtD,OAAO;oBAAEX,cAAc;gBAA6B;YACtD;YAEA,IAAI,CAAC9I,eAAekI,SAASG,gBAAgBiB,aAAa;gBACxD,OAAO;oBAAER,cAAc;gBAAiC;YAC1D;QACF;QAEA,IAAI,CAACL,GAAG;YACN,OAAO;gBAAEK,cAAc;YAAoC;QAC7D,OAAO,IAAIC,MAAMC,OAAO,CAACP,IAAI;YAC3B,OAAO;gBAAEK,cAAc;YAA2C;QACpE,OAAO,IAAI,CAAC,WAAWK,IAAI,CAACV,IAAI;YAC9B,OAAO;gBACLK,cAAc;YAChB;QACF;QAEA,IAAI,CAACJ,GAAG;YACN,OAAO;gBAAEI,cAAc;YAAsC;QAC/D,OAAO,IAAIC,MAAMC,OAAO,CAACN,IAAI;YAC3B,OAAO;gBAAEI,cAAc;YAA6C;QACtE,OAAO,IAAI,CAAC,WAAWK,IAAI,CAACT,IAAI;YAC9B,OAAO;gBACLI,cACE;YACJ;QACF;QAEA,MAAMY,QAAQC,SAASlB,GAAG;QAE1B,IAAIiB,SAAS,KAAKE,MAAMF,QAAQ;YAC9B,OAAO;gBACLZ,cAAc;YAChB;QACF;QAEA,MAAMe,QAAQ;eAAK7B,eAAe,EAAE;eAAOC,cAAc,EAAE;SAAE;QAE7D,IAAIJ,OAAO;YACTgC,MAAM9G,IAAI,CAACb;QACb;QAEA,MAAM4H,cACJD,MAAMjF,QAAQ,CAAC8E,UAAW7B,SAAS6B,SAASxH;QAE9C,IAAI,CAAC4H,aAAa;YAChB,OAAO;gBACLhB,cAAc,CAAC,yBAAyB,EAAEY,MAAM,eAAe,CAAC;YAClE;QACF;QAEA,MAAMK,UAAUJ,SAASjB,GAAG;QAE5B,IAAIkB,MAAMG,YAAYA,UAAU,KAAKA,UAAU,KAAK;YAClD,OAAO;gBACLjB,cACE;YACJ;QACF;QAEA,IAAIP,WAAW;YACb,IAAIV,OAAO;gBACTU,UAAUxF,IAAI,CAACZ;YACjB;YAEA,IAAI,CAACoG,UAAU3D,QAAQ,CAACmF,UAAU;gBAChC,OAAO;oBACLjB,cAAc,CAAC,2BAA2B,EAAEJ,EAAE,eAAe,CAAC;gBAChE;YACF;QACF;QAEA,MAAM/D,WAAWH,qBAAqB4D,WAAW,EAAE,EAAEV,IAAIsC,OAAO,CAAC,SAAS;QAE1E,MAAMC,WACJzB,IAAIS,UAAU,CAAC,GAAGrB,WAAWsC,QAAQ,IAAI,GAAG,mBAAmB,CAAC,KAChE1B,IAAIS,UAAU,CACZ,GAAGrB,WAAWsC,QAAQ,IAAI,GAAG,6BAA6B,CAAC;QAG/D,OAAO;YACLvB;YACAkB;YACAX;YACAe;YACAP;YACAK;YACApF;YACAwD;QACF;IACF;IAEA,OAAOgC,YAAY,EACjBxB,IAAI,EACJe,KAAK,EACLK,OAAO,EACPpF,QAAQ,EAMT,EAAU;QACT,OAAOE,QAAQ;YAAC9C;YAAe4G;YAAMe;YAAOK;YAASpF;SAAS;IAChE;IAEAyF,YAAY,EACVC,OAAO,EACPzC,UAAU,EACV0C,YAAY,EAKb,CAAE;QACD,IAAI,CAAChI,QAAQ,GAAGzC,KAAK,yBAAyB,GAAGwK,SAAS,SAAS;QACnE,IAAI,CAACzC,UAAU,GAAGA;QAClB,IAAI,CAAC0C,YAAY,GAAGA;QAEpB,wDAAwD;QACxD,IACE,CAACA,gBACD1C,WAAWG,MAAM,CAACwC,oBAAoB,KAAK,KAC3C3C,WAAW4C,YAAY,CAACC,cAAc,EACtC;YACA,IAAI,CAACC,kBAAkB,GAAG;YAC1B,IAAI,CAACC,YAAY,GAAGjK,iBAClB,IAAI,CAAC4B,QAAQ,EACbsF,WAAWG,MAAM,CAACwC,oBAAoB,EACtClI,kBACA0E;QAEJ;IACF;IAEA,MAAM6D,IAAIjI,QAAgB,EAAiD;QACzE,gDAAgD;QAChD,IAAI,IAAI,CAAC2H,YAAY,EAAE;YACrB,IAAI;gBACF,MAAMO,YAAY,MAAM,IAAI,CAACP,YAAY,CAACM,GAAG,CAACjI,UAAU;oBACtDmI,MAAM3K,qBAAqB4K,KAAK;oBAChCC,YAAY;gBACd;gBAEA,IAAI,EAACH,6BAAAA,UAAWI,KAAK,GAAE;oBACrB,OAAO;gBACT;gBAEA,IAAIJ,UAAUI,KAAK,CAACH,IAAI,KAAK5K,gBAAgB6K,KAAK,EAAE;oBAClD,OAAO;gBACT;gBAEA,MAAMG,MAAMC,KAAKD,GAAG;gBACpB,MAAME,eAAeP,UAAUO,YAAY,IAAIF;gBAC/C,MAAMG,aACJ,OAAOR,UAAUI,KAAK,CAACI,UAAU,KAAK,WAClCR,UAAUI,KAAK,CAACI,UAAU,GAC1B,IAAI,CAACzD,UAAU,CAACG,MAAM,CAACI,eAAe;gBAC5C,MAAMmD,kBACJpH,KAAKE,GAAG,CAACiH,YAAY,IAAI,CAACzD,UAAU,CAACG,MAAM,CAACI,eAAe,IAAI,OAC/DiD;gBACF,MAAMG,UAAUD,kBAAkBJ;gBAElC,OAAO;oBACLD,OAAOJ,UAAUI,KAAK;oBACtBK;oBACAE,cAAc;wBAAEH;wBAAYI,QAAQlE;oBAAU;oBAC9CgE;gBACF;YACF,EAAE,OAAOG,GAAG;YACV,+DAA+D;YACjE;YACA,OAAO;QACT;QAEA,oDAAoD;QACpD,IAAI,CAAC,IAAI,CAAChB,kBAAkB,EAAE;YAC5B,OAAO;QACT;QAEA,gCAAgC;QAChC,IAAI;YACF,MAAMQ,MAAMC,KAAKD,GAAG;YACpB,MAAM,EAAEpF,MAAM,EAAElD,QAAQ,EAAEyC,IAAI,EAAEU,YAAY,EAAElD,MAAM,EAAEgD,SAAS,EAAE,GAC/D,MAAM/C,iBAAiB,IAAI,CAACR,QAAQ,EAAEK;YAExC,+CAA+C;YAC/C,MAAMgJ,MAAM,MAAM,IAAI,CAAChB,YAAY;YACnCgB,uBAAAA,IAAKf,GAAG,CAACjI;YAET,OAAO;gBACLsI,OAAO;oBACLH,MAAM5K,gBAAgB6K,KAAK;oBAC3B1F;oBACAxC;oBACAgD;oBACAE;gBACF;gBACAuF,iBACEpH,KAAKE,GAAG,CAAC0B,QAAQ,IAAI,CAAC8B,UAAU,CAACG,MAAM,CAACI,eAAe,IAAI,OAC3DgD,KAAKD,GAAG;gBACVM,cAAc;oBAAEH,YAAYvF;oBAAQ2F,QAAQlE;gBAAU;gBACtDgE,SAASL,MAAMtI;YACjB;QACF,EAAE,OAAO8I,GAAG;QACV,qDAAqD;QACvD;QACA,OAAO;IACT;IACA,MAAME,IACJjJ,QAAgB,EAChBsI,KAAmC,EACnC,EACEO,YAAY,EAGb,EACD;QACA,IAAIP,CAAAA,yBAAAA,MAAOH,IAAI,MAAK5K,gBAAgB6K,KAAK,EAAE;YACzC,MAAM,qBAAgE,CAAhE,IAAIxG,MAAM,wDAAV,qBAAA;uBAAA;4BAAA;8BAAA;YAA+D;QACvE;QAEA,MAAM8G,aAAaG,gCAAAA,aAAcH,UAAU;QAE3C,IAAI,OAAOA,eAAe,UAAU;YAClC,MAAM,qBAAiE,CAAjE,IAAIxK,eAAe,gDAAnB,qBAAA;uBAAA;4BAAA;8BAAA;YAAgE;QACxE;QAEA,gDAAgD;QAChD,IAAI,IAAI,CAACyJ,YAAY,EAAE;YACrB,IAAI;gBACF,sGAAsG;gBACtG,MAAMuB,sBAAsB3H,KAAKE,GAAG,CAClCiH,YACA,IAAI,CAACzD,UAAU,CAACG,MAAM,CAACI,eAAe;gBAExC,MAAM2D,sBAAsB;oBAC1B,GAAGb,KAAK;oBACRI,YAAYQ;gBACd;gBACA,MAAM,IAAI,CAACvB,YAAY,CAACsB,GAAG,CAACjJ,UAAUmJ,qBAAqB;oBACzDN,cAAc;wBACZH,YAAYQ;wBACZJ,MAAM,EAAED,gCAAAA,aAAcC,MAAM;oBAC9B;gBACF;YACF,EAAE,OAAOzE,KAAK;gBACZzG,IAAI0G,KAAK,CAAC,CAAC,sCAAsC,EAAEtE,UAAU,EAAEqE;YACjE;YACA;QACF;QAEA,oDAAoD;QACpD,IAAI,CAAC,IAAI,CAAC0D,kBAAkB,EAAE;YAC5B;QACF;QAEA,gCAAgC;QAChC,MAAM9H,WACJsB,KAAKE,GAAG,CAACiH,YAAY,IAAI,CAACzD,UAAU,CAACG,MAAM,CAACI,eAAe,IAAI,OAC/DgD,KAAKD,GAAG;QAEV,IAAI;YACF,MAAMS,MAAM,MAAM,IAAI,CAAChB,YAAY;YACnC,MAAMoB,UAAUJ,uBAAAA,IAAKC,GAAG,CAACjJ,UAAUsI,MAAMpI,MAAM,CAACK,UAAU;YAC1D,IAAI6I,YAAY,OAAO;gBACrB,MAAM,qBAEL,CAFK,IAAIxH,MACR,CAAC,cAAc,EAAE0G,MAAMpI,MAAM,CAACK,UAAU,CAAC,kCAAkC,CAAC,GADxE,qBAAA;2BAAA;gCAAA;kCAAA;gBAEN;YACF;YAEA,MAAM0C,gBACJ,IAAI,CAACtD,QAAQ,EACbK,UACAsI,MAAMpF,SAAS,EACfwF,YACAzI,UACAqI,MAAMpI,MAAM,EACZoI,MAAM5F,IAAI,EACV4F,MAAMlF,YAAY;QAEtB,EAAE,OAAOiB,KAAK;YACZzG,IAAI0G,KAAK,CAAC,CAAC,+BAA+B,EAAEtE,UAAU,EAAEqE;QAC1D;IACF;AACF;AACA,OAAO,MAAMgF,mBAAmBzH;IAG9B6F,YAAY6B,UAAkB,EAAEC,OAAe,CAAE;QAC/C,KAAK,CAACA;QAAN,qBAAc,CAAd,IAAc,EAAd,qBAAA;mBAAA;wBAAA;0BAAA;QAAa;QAEb,uCAAuC;QACvC,IAAID,cAAc,KAAK;YACrB,IAAI,CAACA,UAAU,GAAGA;QACpB,OAAO;YACL,IAAI,CAACA,UAAU,GAAG;QACpB;IACF;AACF;AAEA,SAASE,kBACPC,GAA8B;IAE9B,MAAMC,MAAM,IAAIC;IAChB,IAAI,CAACF,KAAK;QACR,OAAOC;IACT;IACA,KAAK,IAAIE,aAAaH,IAAIzF,KAAK,CAAC,KAAM;QACpC,IAAI,CAAC3D,KAAKiI,MAAM,GAAGsB,UAAUC,IAAI,GAAG7F,KAAK,CAAC,KAAK;QAC/C3D,MAAMA,IAAIyJ,WAAW;QACrB,IAAIxB,OAAO;YACTA,QAAQA,MAAMwB,WAAW;QAC3B;QACAJ,IAAIT,GAAG,CAAC5I,KAAKiI;IACf;IACA,OAAOoB;AACT;AAEA,OAAO,SAASK,UAAUN,GAA8B;IACtD,MAAMC,MAAMF,kBAAkBC;IAC9B,IAAIC,KAAK;QACP,IAAIM,MAAMN,IAAIzB,GAAG,CAAC,eAAeyB,IAAIzB,GAAG,CAAC,cAAc;QACvD,IAAI+B,IAAI1D,UAAU,CAAC,QAAQ0D,IAAIC,QAAQ,CAAC,MAAM;YAC5CD,MAAMA,IAAIE,KAAK,CAAC,GAAG,CAAC;QACtB;QACA,MAAMC,IAAInD,SAASgD,KAAK;QACxB,IAAI,CAAC/C,MAAMkD,IAAI;YACb,OAAOA;QACT;IACF;IACA,OAAO;AACT;AACA,OAAO,SAASC,+BACdC,aAA4B,EAC5BC,kBAA4D;QAG1DA;IADF,IACEA,CAAAA,uCAAAA,4BAAAA,mBAAoBhC,KAAK,qBAAzBgC,0BAA2BnC,IAAI,MAAK,WACpC,wHAAwH;IACxH,kEAAkE;IAClEmC,mBAAmBhC,KAAK,CAAClF,YAAY,KAAKkH,mBAAmBhC,KAAK,CAAC5F,IAAI,IACvE,kEAAkE;IAClE2H,cAAc3H,IAAI,KAAK4H,mBAAmBhC,KAAK,CAAClF,YAAY,EAC5D;QACA,OAAOkH,mBAAmBhC,KAAK;IACjC;IACA,OAAO;AACT;AAEA,OAAO,eAAeiC,cAAc,EAClCrK,MAAM,EACNsK,WAAW,EACXpD,OAAO,EACPL,KAAK,EACL0D,MAAM,EACN7J,WAAW,EACXC,cAAc,EACd6J,gBAAgB,EAChBC,cAAc,EACdC,gBAAgB,EAYjB;IACC,MAAMC,QAAQlK,SAASC,aAAaC;IACpC,MAAMiK,cAAcD,MAAM3K,QAAQ;QAChCwK;QACAC,gBAAgBA,kBAAkB/F;IACpC,GACGmG,OAAO,CAAC;QACPC,SAASJ,oBAAoB;IAC/B,GACCK,MAAM;IAET,IAAIR,QAAQ;QACVK,YAAYI,MAAM,CAACnE,OAAO0D;IAC5B,OAAO;QACLK,YAAYI,MAAM,CAACnE,OAAOnC,WAAW;YACnCuG,oBAAoB;QACtB;IACF;IAEA,IAAIX,gBAAgBlM,MAAM;QACxBwM,YAAYM,IAAI,CAAC;YACf,kEAAkE;YAClE,kEAAkE;YAClE,oDAAoD;YACpDhE,SAAS7F,KAAKE,GAAG,CAACF,KAAK8J,KAAK,CAACjE,UAAW,CAAA,KAAK,EAAC,IAAK;YACnDkE,QAAQ;QACV;IACF,OAAO,IAAId,gBAAgBjM,MAAM;QAC/BuM,YAAYS,IAAI,CAAC;YAAEnE;QAAQ;IAC7B,OAAO,IAAIoD,gBAAgBhM,KAAK;QAC9BsM,YAAYU,GAAG,CAAC;YAAEpE;QAAQ;IAC5B,OAAO,IAAIoD,gBAAgB/L,MAAM;QAC/BqM,YAAYW,IAAI,CAAC;YAAErE;YAASsE,SAAS;QAAK;IAC5C;IAEA,MAAMC,kBAAkB,MAAMb,YAAYc,QAAQ;IAElD,OAAOD;AACT;AAEA,SAASE,WAAWvC,UAAkB;IACpC,OAAO;QAAC;QAAK;QAAK;QAAK;QAAK;KAAI,CAACrH,QAAQ,CAACqH;AAC5C;AAEA,OAAO,eAAewC,mBACpB9F,IAAY,EACZ+F,uBAAgC,EAChCC,mBAA2B,EAC3BC,QAAQ,CAAC;IAET,IAAI,CAACF,yBAAyB;QAC5B,MAAM,EAAEG,QAAQ,EAAE,GAAG,IAAItF,IAAIZ;QAC7B,IAAImG,MAAM;YAACD;SAAS;QACpB,IAAI,CAAC9N,KAAK8N,WAAW;YACnB,MAAME,UAAU,MAAMjO,OAAO+N,UAAU;gBACrCG,QAAQ;gBACRC,KAAK;gBACLC,OAAOlO;YACT,GAAGyB,KAAK,CAAC,CAACiJ,IAAM;oBAAC;wBAAEyD,SAASN;oBAAS;iBAAE;YACvCC,MAAMC,QAAQ1C,GAAG,CAAC,CAAC+C,SAAWA,OAAOD,OAAO;QAC9C;QACA,MAAME,aAAaP,IAAIQ,MAAM,CAAC,CAACC,KAAO9O,YAAY8O;QAClD,IAAIF,WAAWzG,MAAM,GAAG,GAAG;YACzBrI,IAAI0G,KAAK,CACP,kBACA0B,MACA,mCACA6G,KAAKC,SAAS,CAACJ,aACf;YAEF,MAAM,qBAAqD,CAArD,IAAIrD,WAAW,KAAK,mCAApB,qBAAA;uBAAA;4BAAA;8BAAA;YAAoD;QAC5D;IACF;IACA,MAAM0D,MAAM,MAAMC,MAAMhH,MAAM;QAC5BiH,QAAQC,YAAYnC,OAAO,CAAC;QAC5BoC,UAAU;IACZ,GAAGrN,KAAK,CAAC,CAACuE,MAAQA;IAElB,IAAI0I,eAAenL,OAAO;QACxB,MAAMyC,MAAM0I;QACZ,IAAI1I,IAAI+I,IAAI,KAAK,gBAAgB;YAC/BxP,IAAI0G,KAAK,CAAC,yCAAyC0B;YACnD,MAAM,qBAGL,CAHK,IAAIqD,WACR,KACA,6DAFI,qBAAA;uBAAA;4BAAA;8BAAA;YAGN;QACF;QACA,MAAMhF;IACR;IAEA,MAAMgJ,iBAAiBN,IAAI1F,OAAO,CAACY,GAAG,CAAC;IACvC,IACE4D,WAAWkB,IAAIO,MAAM,KACrBD,kBACAzG,IAAI2G,QAAQ,CAACF,gBAAgBrH,OAC7B;QACA,IAAIiG,UAAU,GAAG;YACfrO,IAAI0G,KAAK,CAAC,kDAAkD0B;YAC5D,MAAM,qBAGL,CAHK,IAAIqD,WACR,KACA,8DAFI,qBAAA;uBAAA;4BAAA;8BAAA;YAGN;QACF;QACA,MAAM8D,WAAW,IAAIvG,IAAIyG,gBAAgBrH,MAAMA,IAAI;QACnD,OAAO8F,mBACLqB,UACApB,yBACAC,qBACAC,QAAQ;IAEZ;IAEA,IAAI,CAACc,IAAIS,EAAE,EAAE;QACX5P,IAAI0G,KAAK,CAAC,sCAAsC0B,MAAM+G,IAAIO,MAAM;QAChE,MAAM,qBAGL,CAHK,IAAIjE,WACR0D,IAAIO,MAAM,EACV,8DAFI,qBAAA;mBAAA;wBAAA;0BAAA;QAGN;IACF;IAEA,IAAI,CAACP,IAAIU,IAAI,EAAE;QACb7P,IAAI0G,KAAK,CAAC,wCAAwC0B;QAClD,MAAM,qBAGL,CAHK,IAAIqD,WACR,KACA,8DAFI,qBAAA;mBAAA;wBAAA;0BAAA;QAGN;IACF;IAEA,MAAMqE,SAAmB,EAAE;IAC3B,IAAIC,YAAY;IAEhB,WAAW,MAAMC,KAAKb,IAAIU,IAAI,CAAE;QAC9B,MAAMI,QAAQjL,OAAOC,IAAI,CAAC+K;QAC1BD,aAAaE,MAAMtN,UAAU;QAC7B,IAAIoN,YAAY3B,qBAAqB;YACnCpO,IAAI0G,KAAK,CACP,qDACA0B,MACA2H;YAEF,MAAM,qBAGL,CAHK,IAAItE,WACR,KACA,8DAFI,qBAAA;uBAAA;4BAAA;8BAAA;YAGN;QACF;QACAqE,OAAOtN,IAAI,CAACyN;IACd;IAEA,MAAM3N,SAAS0C,OAAOkL,MAAM,CAACJ;IAC7B,MAAMlD,cAAcuC,IAAI1F,OAAO,CAACY,GAAG,CAAC;IACpC,MAAMY,eAAekE,IAAI1F,OAAO,CAACY,GAAG,CAAC;IACrC,MAAMvF,OAAOD,YAAYsK,IAAI1F,OAAO,CAACY,GAAG,CAAC,SAAS/H;IAClD,OAAO;QAAEA;QAAQsK;QAAa3B;QAAcnG;IAAK;AACnD;AAEA,OAAO,eAAeqL,mBACpB/H,IAAY,EACZgI,IAAqB,EACrBC,IAAoB,EACpBjC,mBAA2B,EAC3BkC,aAIkB;IAElB,IAAI;QACF,8DAA8D;QAC9D,MAAMC,SAAS,CAACH,KAAKG,MAAM,IAAIH,KAAKG,MAAM,KAAK,SAAS,QAAQH,KAAKG,MAAM;QAE3E,MAAMC,SAAS9Q,2BAA2B;YACxCuI,KAAKG;YACLmI;YACAE,QAAQL,KAAKK,MAAM;YACnBrC;QACF;QAEA,MAAMkC,cAAcE,OAAOrJ,GAAG,EAAEqJ,OAAOrB,GAAG,EAAE9O,YAAY+H;QACxD,MAAMoI,OAAOrB,GAAG,CAACuB,WAAW;QAE5B,IAAI,CAACF,OAAOrB,GAAG,CAACzD,UAAU,EAAE;YAC1B1L,IAAI0G,KAAK,CAAC,6BAA6B0B,MAAMoI,OAAOrB,GAAG,CAACzD,UAAU;YAClE,MAAM,qBAGL,CAHK,IAAID,WACR+E,OAAOrB,GAAG,CAACzD,UAAU,EACrB,8DAFI,qBAAA;uBAAA;4BAAA;8BAAA;YAGN;QACF;QAEA,IAAI8E,OAAOrB,GAAG,CAACwB,OAAO,CAACtI,MAAM,KAAK,GAAG;YACnCrI,IAAI0G,KAAK,CAAC,wCAAwC0B;YAClD,MAAM,qBAGL,CAHK,IAAIqD,WACR,KACA,8DAFI,qBAAA;uBAAA;4BAAA;8BAAA;YAGN;QACF;QAEA,MAAMnJ,SAAS0C,OAAOkL,MAAM,CAACM,OAAOrB,GAAG,CAACwB,OAAO;QAC/C,MAAM/D,cAAc4D,OAAOrB,GAAG,CAACyB,SAAS,CAAC;QACzC,MAAM3F,eAAeuF,OAAOrB,GAAG,CAACyB,SAAS,CAAC;QAC1C,MAAM9L,OAAOD,YAAY2L,OAAOrB,GAAG,CAACyB,SAAS,CAAC,SAAStO;QAEvD,OAAO;YAAEA;YAAQsK;YAAa3B;YAAcnG;QAAK;IACnD,EAAE,OAAO2B,KAAK;QACZ,IAAIA,eAAegF,YAAY;YAC7B,MAAMhF;QACR;QAEA,IACEA,OACA,OAAOA,QAAQ,YACf,UAAUA,OACVA,IAAI1C,IAAI,KAAK,8BACb;YACA/D,IAAI0G,KAAK,CAAC,qDAAqD0B;YAC/D,MAAM,qBAGL,CAHK,IAAIqD,WACR,KACA,8DAFI,qBAAA;uBAAA;4BAAA;8BAAA;YAGN;QACF;QAEAzL,IAAI0G,KAAK,CAAC,sCAAsC0B,MAAM3B;QACtD,MAAM,qBAGL,CAHK,IAAIgF,WACR,KACA,8DAFI,qBAAA;mBAAA;wBAAA;0BAAA;QAGN;IACF;AACF;AAEA,OAAO,eAAeoF,eACpBC,aAA4B,EAC5BC,YAGC,EACD1J,UAaC,EACD2J,IAIC;IASD,MAAM,EAAE5I,IAAI,EAAEoB,OAAO,EAAEL,KAAK,EAAE/E,QAAQ,EAAE,GAAG2M;IAC3C,MAAM,EAAEzO,QAAQ2O,cAAc,EAAEnM,MAAMU,YAAY,EAAE,GAAGsL;IACvD,MAAMvL,SAAS5B,KAAKE,GAAG,CACrBwD,WAAWG,MAAM,CAACI,eAAe,EACjCuE,UAAU2E,cAAc7F,YAAY;IAGtC,MAAMiG,eAAe,MAAMvK,kBAAkBsK;IAE7C,IACE,CAACC,gBACD,CAACA,aAAaxI,UAAU,CAAC,aACzBwI,aAAa7M,QAAQ,CAAC,MACtB;QACA,IAAI,CAAC2M,KAAKG,MAAM,EAAE;YAChBnR,IAAI0G,KAAK,CACP,kDACA0B,MACA,YACA8I;QAEJ;QACA,MAAM,qBAAkE,CAAlE,IAAIzF,WAAW,KAAK,gDAApB,qBAAA;mBAAA;wBAAA;0BAAA;QAAiE;IACzE;IACA,IACEyF,aAAaxI,UAAU,CAAC,gBACxB,CAACrB,WAAWG,MAAM,CAAC4J,mBAAmB,EACtC;QACA,IAAI,CAACJ,KAAKG,MAAM,EAAE;YAChBnR,IAAI0G,KAAK,CACP,CAAC,wBAAwB,EAAE0B,KAAK,YAAY,EAAE8I,aAAa,iGAAiG,CAAC;QAEjK;QACA,MAAM,qBAGL,CAHK,IAAIzF,WACR,KACA,2DAFI,qBAAA;mBAAA;wBAAA;0BAAA;QAGN;IACF;IACA,IAAIhK,iBAAiB4C,QAAQ,CAAC6M,iBAAiB7R,WAAW4R,iBAAiB;QACzE,IAAI,CAACD,KAAKG,MAAM,EAAE;YAChBnR,IAAIsI,QAAQ,CACV,CAAC,wBAAwB,EAAEF,KAAK,8GAA8G,CAAC;QAEnJ;QACA,OAAO;YACL9F,QAAQ2O;YACRrE,aAAasE;YACb3L;YACAT,MAAMU;YACNA;QACF;IACF;IACA,IAAI9D,aAAa2C,QAAQ,CAAC6M,eAAe;QACvC,OAAO;YACL5O,QAAQ2O;YACRrE,aAAasE;YACb3L;YACAT,MAAMU;YACNA;QACF;IACF;IAEA,IAAIoH;IAEJ,IAAIxI,UAAU;QACZwI,cAAcxI;IAChB,OAAO,IACLrE,aAAamR,iBACbA,iBAAiBvQ,QACjBuQ,iBAAiBxQ,MACjB;QACAkM,cAAcsE;IAChB,OAAO;QACLtE,cAAc/L;IAChB;IACA,MAAMwQ,wBAAwB7E,+BAC5BsE,eACAE,KAAKtE,kBAAkB;IAEzB,IAAI2E,uBAAuB;YAIfL,uCAAAA;QAHV,OAAO;YACL1O,QAAQ+O,sBAAsB/O,MAAM;YACpCsK;YACArH,QAAQyL,CAAAA,yBAAAA,2BAAAA,KAAMtE,kBAAkB,sBAAxBsE,wCAAAA,yBAA0B/F,YAAY,qBAAtC+F,sCAAwClG,UAAU,KAAIvF;YAC9DT,MAAMuM,sBAAsBvM,IAAI;YAChCU,cAAc6L,sBAAsB7L,YAAY;QAClD;IACF;IAEA,IAAI;QACF,IAAIuI,kBAAkB,MAAMpB,cAAc;YACxCrK,QAAQ2O;YACRrE;YACApD;YACAL;YACAnG,aAAaqE,WAAW4C,YAAY,CAACqH,iBAAiB;YACtDrO,gBAAgBoE,WAAW4C,YAAY,CAACsH,oBAAoB;YAC5DzE,kBAAkBzF,WAAW4C,YAAY,CAACuH,oBAAoB;YAC9DzE,gBAAgB1F,WAAW4C,YAAY,CAACwH,oBAAoB;YAC5DzE,kBAAkB3F,WAAW4C,YAAY,CAACyH,sBAAsB;QAClE;QACA,IAAIV,KAAK1J,KAAK,IAAI6B,SAASxH,iBAAiB6H,YAAY5H,cAAc;YACpE,8EAA8E;YAC9E,gFAAgF;YAChF,qFAAqF;YACrF,MAAM+P,OAAO,MAAMC,aAAa7D;YAChC,MAAM8D,WAAW;gBACfC,WAAWH,KAAKxI,KAAK;gBACrB4I,YAAYJ,KAAK9E,MAAM;gBACvBmF,aAAa,CAAC,KAAK,EAAEpF,YAAY,QAAQ,EAAEmB,gBAAgB7I,QAAQ,CACjE,WACC;YACL;YACA6I,kBAAkB/I,OAAOC,IAAI,CAACgN,SAAS1S,gBAAgBsS;YACvDjF,cAAc;QAChB;QACA,OAAO;YACLtK,QAAQyL;YACRnB;YACArH;YACAT,MAAMK,aAAa4I;YACnBvI;QACF;IACF,EAAE,OAAOkB,OAAO;QACd,IAAIwK,cAAc;YAChB,yDAAyD;YACzD,OAAO;gBACL5O,QAAQ2O;gBACRrE,aAAasE;gBACb3L,QAAQ8B,WAAWG,MAAM,CAACI,eAAe;gBACzC9C,MAAMU;gBACNA;gBACAkB;YACF;QACF,OAAO;YACL,MAAM,qBAGL,CAHK,IAAI+E,WACR,KACA,sEAFI,qBAAA;uBAAA;4BAAA;8BAAA;YAGN;QACF;IACF;AACF;AAEA,SAASyG,yBACPjK,GAAW,EACX2E,WAA0B;IAE1B,MAAM,CAACuF,sBAAsB,GAAGlK,IAAI7B,KAAK,CAAC,KAAK;IAC/C,MAAMgM,wBAAwBD,sBAAsB/L,KAAK,CAAC,KAAKiM,GAAG;IAClE,IAAI,CAACzF,eAAe,CAACwF,uBAAuB;QAC1C,OAAO;IACT;IAEA,MAAM,CAACE,SAAS,GAAGF,sBAAsBhM,KAAK,CAAC,KAAK;IACpD,MAAMd,YAAYvF,aAAa6M;IAC/B,OAAO,GAAG0F,SAAS,CAAC,EAAEhN,WAAW;AACnC;AAEA,SAASiN,mBACPpL,GAAoB,EACpBgI,GAAmB,EACnBlH,GAAW,EACXnD,IAAY,EACZ8H,WAA0B,EAC1BlD,QAAiB,EACjB8I,MAAoB,EACpBC,YAAiC,EACjClN,MAAc,EACd+B,KAAc;IAEd6H,IAAIuD,SAAS,CAAC,QAAQ;IACtBvD,IAAIuD,SAAS,CACX,iBACAhJ,WACI,yCACA,CAAC,gBAAgB,EAAEpC,QAAQ,IAAI/B,OAAO,iBAAiB,CAAC;IAE9D,IAAI1F,iBAAiBsH,KAAKgI,KAAKrK,OAAO;QACpC,6CAA6C;QAC7C,OAAO;YAAE6N,UAAU;QAAK;IAC1B;IACA,IAAI/F,aAAa;QACfuC,IAAIuD,SAAS,CAAC,gBAAgB9F;IAChC;IAEA,MAAM0F,WAAWJ,yBAAyBjK,KAAK2E;IAC/CuC,IAAIuD,SAAS,CACX,uBACAxT,mBAAmBoT,UAAU;QAAEM,MAAMH,aAAaI,sBAAsB;IAAC;IAG3E1D,IAAIuD,SAAS,CAAC,2BAA2BD,aAAaK,qBAAqB;IAC3E3D,IAAIuD,SAAS,CAAC,kBAAkBF;IAEhC,OAAO;QAAEG,UAAU;IAAM;AAC3B;AAEA,OAAO,SAASI,aACd5L,GAAoB,EACpBgI,GAAmB,EACnBlH,GAAW,EACX3C,SAAiB,EACjBhD,MAAc,EACdwC,IAAY,EACZ4E,QAAiB,EACjB8I,MAAoB,EACpBC,YAAiC,EACjClN,MAAc,EACd+B,KAAc;IAEd,MAAMsF,cAAc9M,eAAewF;IACnC,MAAM0N,SAAST,mBACbpL,KACAgI,KACAlH,KACAnD,MACA8H,aACAlD,UACA8I,QACAC,cACAlN,QACA+B;IAEF,IAAI,CAAC0L,OAAOL,QAAQ,EAAE;QACpBxD,IAAIuD,SAAS,CAAC,kBAAkB1N,OAAOrC,UAAU,CAACL;QAClD,qDAAqD;QACrD,IAAI6E,IAAIoJ,MAAM,KAAK,QAAQ;YACzBpB,IAAI8D,GAAG;QACT,OAAO;YACL9D,IAAI8D,GAAG,CAAC3Q;QACV;IACF;AACF;AAEA,OAAO,eAAesP,aAAatP,MAAc;IAI/C,MAAM,EAAE6G,KAAK,EAAE0D,MAAM,EAAE,GAAG1N,YAAYmD;IACtC,OAAO;QAAE6G;QAAO0D;IAAO;AACzB","ignoreList":[0]}
|
|
@@ -11,7 +11,7 @@ import { hasCurrentAgentRules, writeAgentFiles } from './generate-agent-files';
|
|
|
11
11
|
* Called before "Ready in X" to show immediate feedback.
|
|
12
12
|
*/ export function logStartInfo({ networkUrl, appUrl, envInfo, logBundler }) {
|
|
13
13
|
const versionSuffix = logBundler ? ` (${bundlerName(getBundlerFromEnv())})` : '';
|
|
14
|
-
Log.bootstrap(`${bold(purple(`${Log.prefixes.ready} Next.js ${"16.3.
|
|
14
|
+
Log.bootstrap(`${bold(purple(`${Log.prefixes.ready} Next.js ${"16.3.4"}`))}${versionSuffix}`);
|
|
15
15
|
if (appUrl) {
|
|
16
16
|
Log.bootstrap(`- Local: ${appUrl}`);
|
|
17
17
|
}
|
|
@@ -109,7 +109,7 @@ export async function getRequestHandlers({ dir, port, isDev, onDevServerCleanup,
|
|
|
109
109
|
export async function startServer(serverOptions) {
|
|
110
110
|
const { dir, isDev, hostname, minimalMode, allowRetry, keepAliveTimeout, selfSignedCertificate, serverFastRefresh } = serverOptions;
|
|
111
111
|
let { port } = serverOptions;
|
|
112
|
-
process.title = `next-server (v${"16.3.
|
|
112
|
+
process.title = `next-server (v${"16.3.4"})`;
|
|
113
113
|
let handlersReady = ()=>{};
|
|
114
114
|
let handlersError = ()=>{};
|
|
115
115
|
let handlersPromise = new Promise((resolve, reject)=>{
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
export function isStableBuild() {
|
|
2
|
-
return !"16.3.
|
|
2
|
+
return !"16.3.4"?.includes('canary') && !process.env.__NEXT_TEST_MODE && !process.env.NEXT_PRIVATE_LOCAL_DEV;
|
|
3
3
|
}
|
|
4
4
|
export class CanaryOnlyConfigError extends Error {
|
|
5
5
|
constructor(arg){
|