next 16.2.0-canary.1 → 16.2.0-canary.2

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.
Files changed (97) hide show
  1. package/dist/.build-commit +1 -1
  2. package/dist/bin/next +2 -2
  3. package/dist/build/define-env.js +1 -1
  4. package/dist/build/define-env.js.map +1 -1
  5. package/dist/build/index.js +3 -3
  6. package/dist/build/swc/index.js +1 -1
  7. package/dist/build/webpack-config.js +3 -3
  8. package/dist/bundle-analyzer/404.html +2 -2
  9. package/dist/bundle-analyzer/__next.__PAGE__.txt +1 -1
  10. package/dist/bundle-analyzer/__next._full.txt +1 -1
  11. package/dist/bundle-analyzer/__next._head.txt +1 -1
  12. package/dist/bundle-analyzer/__next._index.txt +1 -1
  13. package/dist/bundle-analyzer/__next._tree.txt +1 -1
  14. package/dist/bundle-analyzer/_not-found/__next._full.txt +1 -1
  15. package/dist/bundle-analyzer/_not-found/__next._head.txt +1 -1
  16. package/dist/bundle-analyzer/_not-found/__next._index.txt +1 -1
  17. package/dist/bundle-analyzer/_not-found/__next._not-found.__PAGE__.txt +1 -1
  18. package/dist/bundle-analyzer/_not-found/__next._not-found.txt +1 -1
  19. package/dist/bundle-analyzer/_not-found/__next._tree.txt +1 -1
  20. package/dist/bundle-analyzer/_not-found.html +2 -2
  21. package/dist/bundle-analyzer/_not-found.txt +1 -1
  22. package/dist/bundle-analyzer/index.html +2 -2
  23. package/dist/bundle-analyzer/index.txt +1 -1
  24. package/dist/client/app-bootstrap.js +1 -1
  25. package/dist/client/index.js +1 -1
  26. package/dist/compiled/next-devtools/index.js +1 -1
  27. package/dist/compiled/next-devtools/index.js.map +1 -1
  28. package/dist/compiled/next-server/pages-api.runtime.prod.js +1 -1
  29. package/dist/compiled/next-server/pages-api.runtime.prod.js.map +1 -1
  30. package/dist/compiled/next-server/pages.runtime.prod.js +1 -1
  31. package/dist/compiled/next-server/pages.runtime.prod.js.map +1 -1
  32. package/dist/compiled/next-server/server.runtime.prod.js +1 -1
  33. package/dist/compiled/next-server/server.runtime.prod.js.map +1 -1
  34. package/dist/esm/build/define-env.js +1 -1
  35. package/dist/esm/build/define-env.js.map +1 -1
  36. package/dist/esm/build/index.js +3 -3
  37. package/dist/esm/build/swc/index.js +1 -1
  38. package/dist/esm/build/webpack-config.js +3 -3
  39. package/dist/esm/client/app-bootstrap.js +1 -1
  40. package/dist/esm/client/index.js +1 -1
  41. package/dist/esm/next-devtools/shared/stack-frame.js +5 -5
  42. package/dist/esm/next-devtools/shared/stack-frame.js.map +1 -1
  43. package/dist/esm/next-devtools/shared/webpack-module-path.js +1 -1
  44. package/dist/esm/next-devtools/shared/webpack-module-path.js.map +1 -1
  45. package/dist/esm/server/config-schema.js +7 -0
  46. package/dist/esm/server/config-schema.js.map +1 -1
  47. package/dist/esm/server/config-shared.js.map +1 -1
  48. package/dist/esm/server/config.js +23 -6
  49. package/dist/esm/server/config.js.map +1 -1
  50. package/dist/esm/server/dev/browser-logs/receive-logs.js +1 -3
  51. package/dist/esm/server/dev/browser-logs/receive-logs.js.map +1 -1
  52. package/dist/esm/server/dev/browser-logs/source-map.js +1 -4
  53. package/dist/esm/server/dev/browser-logs/source-map.js.map +1 -1
  54. package/dist/esm/server/dev/hot-reloader-turbopack.js +4 -3
  55. package/dist/esm/server/dev/hot-reloader-turbopack.js.map +1 -1
  56. package/dist/esm/server/dev/hot-reloader-webpack.js +4 -3
  57. package/dist/esm/server/dev/hot-reloader-webpack.js.map +1 -1
  58. package/dist/esm/server/dev/middleware-webpack.js +2 -2
  59. package/dist/esm/server/dev/middleware-webpack.js.map +1 -1
  60. package/dist/esm/server/lib/app-info-log.js +1 -1
  61. package/dist/esm/server/lib/start-server.js +1 -1
  62. package/dist/esm/shared/lib/errors/canary-only-config-error.js +1 -1
  63. package/dist/next-devtools/dev-overlay/components/call-stack-frame/call-stack-frame.d.ts +1 -1
  64. package/dist/next-devtools/shared/stack-frame.d.ts +1 -1
  65. package/dist/next-devtools/shared/stack-frame.js +9 -9
  66. package/dist/next-devtools/shared/stack-frame.js.map +1 -1
  67. package/dist/next-devtools/shared/webpack-module-path.d.ts +1 -1
  68. package/dist/next-devtools/shared/webpack-module-path.js +4 -4
  69. package/dist/next-devtools/shared/webpack-module-path.js.map +1 -1
  70. package/dist/server/config-schema.js +7 -0
  71. package/dist/server/config-schema.js.map +1 -1
  72. package/dist/server/config-shared.d.ts +10 -0
  73. package/dist/server/config-shared.js.map +1 -1
  74. package/dist/server/config.js +23 -6
  75. package/dist/server/config.js.map +1 -1
  76. package/dist/server/dev/browser-logs/receive-logs.d.ts +1 -5
  77. package/dist/server/dev/browser-logs/receive-logs.js +1 -3
  78. package/dist/server/dev/browser-logs/receive-logs.js.map +1 -1
  79. package/dist/server/dev/browser-logs/source-map.d.ts +1 -4
  80. package/dist/server/dev/browser-logs/source-map.js +1 -4
  81. package/dist/server/dev/browser-logs/source-map.js.map +1 -1
  82. package/dist/server/dev/hot-reloader-turbopack.js +4 -3
  83. package/dist/server/dev/hot-reloader-turbopack.js.map +1 -1
  84. package/dist/server/dev/hot-reloader-webpack.js +4 -3
  85. package/dist/server/dev/hot-reloader-webpack.js.map +1 -1
  86. package/dist/server/dev/middleware-webpack.js +1 -1
  87. package/dist/server/dev/middleware-webpack.js.map +1 -1
  88. package/dist/server/lib/app-info-log.js +1 -1
  89. package/dist/server/lib/start-server.js +1 -1
  90. package/dist/shared/lib/errors/canary-only-config-error.js +1 -1
  91. package/dist/telemetry/anonymous-meta.js +1 -1
  92. package/dist/telemetry/events/session-stopped.js +2 -2
  93. package/dist/telemetry/events/version.js +2 -2
  94. package/package.json +15 -15
  95. /package/dist/bundle-analyzer/_next/static/{nf72XAMLkW3IWwd7evK6l → H1pZGGFy24tVYIk0cE8HL}/_buildManifest.js +0 -0
  96. /package/dist/bundle-analyzer/_next/static/{nf72XAMLkW3IWwd7evK6l → H1pZGGFy24tVYIk0cE8HL}/_clientMiddlewareManifest.json +0 -0
  97. /package/dist/bundle-analyzer/_next/static/{nf72XAMLkW3IWwd7evK6l → H1pZGGFy24tVYIk0cE8HL}/_ssgManifest.js +0 -0
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/server/dev/browser-logs/receive-logs.ts"],"sourcesContent":["import { cyan, dim, red, yellow } from '../../../lib/picocolors'\nimport type { Project } from '../../../build/swc/types'\nimport util from 'util'\nimport {\n getConsoleLocation,\n getSourceMappedStackFrames,\n withLocation,\n type MappingContext,\n} from './source-map'\nimport {\n type ServerLogEntry,\n type LogMethod,\n type ConsoleEntry,\n UNDEFINED_MARKER,\n} from '../../../next-devtools/shared/forward-logs-shared'\nimport { formatConsoleArgs } from '../../../client/lib/console'\nimport { getFileLogger } from './file-logger'\n\nexport function restoreUndefined(x: any): any {\n if (x === UNDEFINED_MARKER) return undefined\n if (Array.isArray(x)) return x.map(restoreUndefined)\n if (x && typeof x === 'object') {\n for (let k in x) {\n x[k] = restoreUndefined(x[k])\n }\n }\n return x\n}\n\nfunction cleanConsoleArgsForFileLogging(args: any[]): string {\n /**\n * Use formatConsoleArgs to strip out background and color format specifiers\n * and keep only the original string content for file logging\n */\n try {\n return formatConsoleArgs(args)\n } catch {\n // Fallback to simple string conversion if formatting fails\n return args\n .map((arg) =>\n typeof arg === 'string' ? arg : util.inspect(arg, { depth: 2 })\n )\n .join(' ')\n }\n}\n\nconst methods: Array<LogMethod> = [\n 'log',\n 'info',\n 'warn',\n 'debug',\n 'table',\n 'error',\n 'assert',\n 'dir',\n 'dirxml',\n 'group',\n 'groupCollapsed',\n 'groupEnd',\n]\n\nconst methodsToSkipInspect = new Set([\n 'table',\n 'dir',\n 'dirxml',\n 'group',\n 'groupCollapsed',\n 'groupEnd',\n])\n\n// we aren't overriding console, we're just making a (slightly convoluted) helper for replaying user console methods\nconst forwardConsole: typeof console = {\n ...console,\n ...Object.fromEntries(\n methods.map((method) => [\n method,\n (...args: Array<any>) =>\n (console[method] as any)(\n ...args.map((arg) =>\n methodsToSkipInspect.has(method) ||\n typeof arg !== 'object' ||\n arg === null\n ? arg\n : // we hardcode depth:Infinity to allow the true depth to be configured by the serialization done in the browser (which is controlled by user)\n util.inspect(arg, { depth: Infinity, colors: true })\n )\n ),\n ])\n ),\n}\n\nasync function deserializeArgData(arg: any) {\n try {\n // we want undefined to be represented as it would be in the browser from the user's perspective (otherwise it would be stripped away/shown as null)\n if (arg === UNDEFINED_MARKER) {\n return restoreUndefined(arg)\n }\n\n return restoreUndefined(JSON.parse(arg))\n } catch {\n return arg\n }\n}\n\nconst colorError = (\n mapped: Awaited<ReturnType<typeof getSourceMappedStackFrames>>,\n config?: {\n prefix?: string\n applyColor?: boolean\n }\n) => {\n const colorFn =\n config?.applyColor === undefined || config.applyColor ? red : <T>(x: T) => x\n switch (mapped.kind) {\n case 'mapped-stack':\n case 'stack': {\n return (\n (config?.prefix ? colorFn(config?.prefix) : '') +\n `\\n${colorFn(mapped.stack)}`\n )\n }\n case 'with-frame-code': {\n return (\n (config?.prefix ? colorFn(config?.prefix) : '') +\n `\\n${colorFn(mapped.stack)}\\n${mapped.frameCode}`\n )\n }\n // a more sophisticated version of this allows the user to config if they want ignored frames (but we need to be sure to source map them)\n case 'all-ignored': {\n return config?.prefix ? colorFn(config?.prefix) : ''\n }\n default: {\n }\n }\n mapped satisfies never\n}\n\nfunction processConsoleFormatStrings(args: any[]): any[] {\n /**\n * this handles the case formatting is applied to the console log\n * otherwise we will see the format specifier directly in the terminal output\n */\n if (args.length > 0 && typeof args[0] === 'string') {\n const formatString = args[0]\n if (\n formatString.includes('%s') ||\n formatString.includes('%d') ||\n formatString.includes('%i') ||\n formatString.includes('%f') ||\n formatString.includes('%o') ||\n formatString.includes('%O') ||\n formatString.includes('%c')\n ) {\n try {\n const formatted = util.format(...args)\n return [formatted]\n } catch {\n return args\n }\n }\n }\n return args\n}\n\n// in the case of logging errors, we want to strip formatting\n// modifiers since we apply our own custom coloring to error\n// stacks and code blocks, and otherwise it would conflict\n// and cause awful output\nexport function stripFormatSpecifiers(args: any[]): any[] {\n if (args.length === 0 || typeof args[0] !== 'string') return args\n\n const fmtIn = String(args[0])\n const rest = args.slice(1)\n\n if (!fmtIn.includes('%')) return args\n\n let fmtOut = ''\n let argPtr = 0\n\n for (let i = 0; i < fmtIn.length; i++) {\n if (fmtIn[i] !== '%') {\n fmtOut += fmtIn[i]\n continue\n }\n\n if (fmtIn[i + 1] === '%') {\n fmtOut += '%'\n i++\n continue\n }\n\n const token = fmtIn[++i]\n\n if (!token) {\n fmtOut += '%'\n continue\n }\n\n if ('csdifoOj'.includes(token) || token === 'O') {\n if (argPtr < rest.length) {\n if (token === 'c') {\n argPtr++\n } else if (token === 'o' || token === 'O' || token === 'j') {\n const obj = rest[argPtr++]\n fmtOut += util.inspect(obj, { depth: 2, colors: false })\n } else {\n // string(...) is safe for remaining specifiers\n fmtOut += String(rest[argPtr++])\n }\n }\n continue\n }\n\n fmtOut += '%' + token\n }\n\n const result = [fmtOut]\n if (argPtr < rest.length) {\n result.push(...rest.slice(argPtr))\n }\n\n return result\n}\n\nasync function prepareFormattedErrorArgs(\n entry: Extract<ServerLogEntry, { kind: 'formatted-error' }>,\n ctx: MappingContext,\n distDir: string\n) {\n const mapped = await getSourceMappedStackFrames(entry.stack, ctx, distDir)\n return [colorError(mapped, { prefix: entry.prefix })]\n}\n\nasync function prepareConsoleArgs(\n entry: Extract<ServerLogEntry, { kind: 'console' }>,\n ctx: MappingContext,\n distDir: string\n) {\n const deserialized = await Promise.all(\n entry.args.map(async (arg) => {\n if (arg.kind === 'arg') {\n const data = await deserializeArgData(arg.data)\n if (entry.method === 'warn' && typeof data === 'string') {\n return yellow(data)\n }\n return data\n }\n if (!arg.stack) return red(arg.prefix)\n const mapped = await getSourceMappedStackFrames(arg.stack, ctx, distDir)\n return colorError(mapped, { prefix: arg.prefix, applyColor: false })\n })\n )\n\n return processConsoleFormatStrings(deserialized)\n}\n\nasync function prepareConsoleErrorArgs(\n entry: Extract<ServerLogEntry, { kind: 'any-logged-error' }>,\n ctx: MappingContext,\n distDir: string\n) {\n const deserialized = await Promise.all(\n entry.args.map(async (arg) => {\n if (arg.kind === 'arg') {\n if (arg.isRejectionMessage) return red(arg.data)\n return deserializeArgData(arg.data)\n }\n if (!arg.stack) return red(arg.prefix)\n const mapped = await getSourceMappedStackFrames(arg.stack, ctx, distDir)\n return colorError(mapped, { prefix: arg.prefix })\n })\n )\n\n const mappedStack = await getSourceMappedStackFrames(\n entry.consoleErrorStack,\n ctx,\n distDir\n )\n\n /**\n * don't show the stack + codeblock when there are errors present, since:\n * - it will look overwhelming to see 2 stacks and 2 code blocks\n * - the user already knows where the console.error is at because we append the location\n */\n const location = getConsoleLocation(mappedStack)\n if (entry.args.some((a) => a.kind === 'formatted-error-arg')) {\n const result = stripFormatSpecifiers(deserialized)\n if (location) {\n result.push(dim(`(${location})`))\n }\n return result\n }\n const result = [\n ...processConsoleFormatStrings(deserialized),\n colorError(mappedStack),\n ]\n if (location) {\n result.push(dim(`(${location})`))\n }\n return result\n}\n\nasync function handleTable(\n entry: ConsoleEntry<string>,\n browserPrefix: string,\n ctx: MappingContext,\n distDir: string\n) {\n const deserializedArgs = await Promise.all(\n entry.args.map(async (arg: any) => {\n if (arg.kind === 'formatted-error-arg') {\n return { stack: arg.stack }\n }\n return deserializeArgData(arg.data)\n })\n )\n\n const location = await (async () => {\n if (!entry.consoleMethodStack) {\n return\n }\n const frames = await getSourceMappedStackFrames(\n entry.consoleMethodStack,\n ctx,\n distDir\n )\n return getConsoleLocation(frames)\n })()\n\n // we can't inline pass browser prefix, but it looks better multiline for table anyways\n forwardConsole.log(browserPrefix)\n forwardConsole.table(...deserializedArgs)\n if (location) {\n forwardConsole.log(dim(`(${location})`))\n }\n}\n\nasync function handleTrace(\n entry: ConsoleEntry<string>,\n browserPrefix: string,\n ctx: MappingContext,\n distDir: string\n) {\n const deserializedArgs = await Promise.all(\n entry.args.map(async (arg: any) => {\n if (arg.kind === 'formatted-error-arg') {\n if (!arg.stack) return red(arg.prefix)\n const mapped = await getSourceMappedStackFrames(arg.stack, ctx, distDir)\n return colorError(mapped, { prefix: arg.prefix })\n }\n return deserializeArgData(arg.data)\n })\n )\n\n if (!entry.consoleMethodStack) {\n forwardConsole.log(\n browserPrefix,\n ...deserializedArgs,\n '[Trace unavailable]'\n )\n return\n }\n\n // TODO(rob): refactor so we can re-use result and not re-run the entire source map to avoid trivial post processing\n const [mapped, mappedIgnored] = await Promise.all([\n getSourceMappedStackFrames(entry.consoleMethodStack, ctx, distDir, false),\n getSourceMappedStackFrames(entry.consoleMethodStack, ctx, distDir),\n ])\n\n const location = getConsoleLocation(mappedIgnored)\n forwardConsole.log(\n browserPrefix,\n ...deserializedArgs,\n `\\n${mapped.stack}`,\n ...(location ? [`\\n${dim(`(${location})`)}`] : [])\n )\n}\n\nasync function handleDir(\n entry: ConsoleEntry<string>,\n browserPrefix: string,\n ctx: MappingContext,\n distDir: string\n) {\n const loggableEntry = await prepareConsoleArgs(entry, ctx, distDir)\n const consoleMethod =\n (forwardConsole as any)[entry.method] || forwardConsole.log\n\n if (entry.consoleMethodStack) {\n const mapped = await getSourceMappedStackFrames(\n entry.consoleMethodStack,\n ctx,\n distDir\n )\n const location = dim(`(${getConsoleLocation(mapped)})`)\n const originalWrite = process.stdout.write.bind(process.stdout)\n let captured = ''\n process.stdout.write = (chunk) => {\n captured += chunk\n return true\n }\n try {\n consoleMethod(...loggableEntry)\n } finally {\n process.stdout.write = originalWrite\n }\n const preserved = captured.replace(/\\r?\\n$/, '')\n originalWrite(`${browserPrefix}${preserved} ${location}\\n`)\n return\n }\n consoleMethod(browserPrefix, ...loggableEntry)\n}\n\nasync function handleDefaultConsole(\n entry: ConsoleEntry<string>,\n browserPrefix: string,\n ctx: MappingContext,\n distDir: string,\n config: BrowserLogConfig,\n isServerLog: boolean\n) {\n const consoleArgs = await prepareConsoleArgs(entry, ctx, distDir)\n const withStackEntry = await withLocation(\n {\n original: consoleArgs,\n stack: (entry as any).consoleMethodStack || null,\n },\n ctx,\n distDir,\n config\n )\n const consoleMethod = forwardConsole[entry.method] || forwardConsole.log\n ;(consoleMethod as (...args: any[]) => void)(browserPrefix, ...withStackEntry)\n\n // Process enqueued logs and write to file\n // Log to file with correct source based on context\n const fileLogger = getFileLogger()\n\n // Use cleaned console args to strip out background and color format specifiers\n const message = cleanConsoleArgsForFileLogging(consoleArgs)\n if (isServerLog) {\n fileLogger.logServer(entry.method.toUpperCase(), message)\n } else {\n fileLogger.logBrowser(entry.method.toUpperCase(), message)\n }\n}\n\ntype LogLevel = 'error' | 'warn' | 'verbose'\n\ntype BrowserLogConfig =\n | boolean\n | LogLevel\n | { level?: LogLevel; showSourceLocation?: boolean }\n\n// Log levels from most severe to least severe\n// Lower index = more severe\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n verbose: 2,\n}\n\n// Map console methods to log levels\nconst METHOD_TO_LEVEL: Record<string, LogLevel> = {\n error: 'error',\n warn: 'warn',\n info: 'verbose',\n log: 'verbose',\n debug: 'verbose',\n table: 'verbose',\n trace: 'verbose',\n dir: 'verbose',\n dirxml: 'verbose',\n assert: 'error',\n group: 'verbose',\n groupCollapsed: 'verbose',\n groupEnd: 'verbose',\n}\n\nfunction shouldShowEntry(\n entry: ServerLogEntry,\n config: BrowserLogConfig\n): boolean {\n // If config is false, don't show any entries\n if (config === false) {\n return false\n }\n\n // Determine the effective minimum log level\n const minLevel: LogLevel =\n typeof config === 'string'\n ? config\n : config === true\n ? 'verbose' // true means show everything\n : typeof config === 'object'\n ? (config.level ?? 'verbose') // object config defaults to verbose for backward compatibility\n : 'warn' // default for new installations\n\n const minPriority = LOG_LEVEL_PRIORITY[minLevel]\n\n // formatted-error and any-logged-error are always treated as errors\n if (entry.kind === 'formatted-error' || entry.kind === 'any-logged-error') {\n return LOG_LEVEL_PRIORITY['error'] <= minPriority\n }\n\n if (entry.kind === 'console') {\n const entryLevel = METHOD_TO_LEVEL[entry.method] || 'log'\n return LOG_LEVEL_PRIORITY[entryLevel] <= minPriority\n }\n\n return false\n}\n\nexport async function handleLog(\n entries: ServerLogEntry[],\n ctx: MappingContext,\n distDir: string,\n config: BrowserLogConfig\n): Promise<void> {\n // Determine the source based on the context\n const isServerLog = ctx.isServer || ctx.isEdgeServer\n const browserPrefix = isServerLog ? cyan('[server]') : cyan('[browser]')\n const fileLogger = getFileLogger()\n\n for (const entry of entries) {\n // Filter entries based on config mode\n if (!shouldShowEntry(entry, config)) {\n continue\n }\n try {\n switch (entry.kind) {\n case 'console': {\n switch (entry.method) {\n case 'table': {\n // timeout based abort on source mapping result\n await handleTable(entry, browserPrefix, ctx, distDir)\n break\n }\n // ignore frames\n case 'trace': {\n await handleTrace(entry, browserPrefix, ctx, distDir)\n break\n }\n case 'dir': {\n await handleDir(entry, browserPrefix, ctx, distDir)\n break\n }\n case 'dirxml': {\n // xml log thing maybe needs an impl\n // fallthrough\n }\n case 'group':\n case 'groupCollapsed':\n case 'groupEnd': {\n // [browser] undefined (app/page.tsx:8:11) console.group\n // fallthrough\n }\n case 'assert': {\n // check console assert\n // fallthrough\n }\n case 'log':\n case 'info':\n case 'debug':\n case 'error':\n case 'warn': {\n await handleDefaultConsole(\n entry,\n browserPrefix,\n ctx,\n distDir,\n config,\n isServerLog\n )\n break\n }\n default: {\n entry satisfies never\n }\n }\n break\n }\n // any logged errors are anything that are logged as \"red\" in the browser but aren't only an Error (console.error, Promise.reject(100))\n case 'any-logged-error': {\n const consoleArgs = await prepareConsoleErrorArgs(entry, ctx, distDir)\n forwardConsole.error(browserPrefix, ...consoleArgs)\n\n // Process enqueued logs and write to file\n fileLogger.logBrowser(\n 'ERROR',\n cleanConsoleArgsForFileLogging(consoleArgs)\n )\n break\n }\n // formatted error is an explicit error event (rejections, uncaught errors)\n case 'formatted-error': {\n const formattedArgs = await prepareFormattedErrorArgs(\n entry,\n ctx,\n distDir\n )\n forwardConsole.error(browserPrefix, ...formattedArgs)\n\n // Process enqueued logs and write to file\n fileLogger.logBrowser(\n 'ERROR',\n cleanConsoleArgsForFileLogging(formattedArgs)\n )\n break\n }\n default: {\n }\n }\n } catch {\n switch (entry.kind) {\n case 'any-logged-error': {\n const consoleArgs = await prepareConsoleErrorArgs(entry, ctx, distDir)\n forwardConsole.error(browserPrefix, ...consoleArgs)\n // Process enqueued logs and write to file\n fileLogger.logBrowser(\n 'ERROR',\n cleanConsoleArgsForFileLogging(consoleArgs)\n )\n break\n }\n case 'console': {\n const consoleMethod =\n forwardConsole[entry.method] || forwardConsole.log\n const consoleArgs = await prepareConsoleArgs(entry, ctx, distDir)\n ;(consoleMethod as (...args: any[]) => void)(\n browserPrefix,\n ...consoleArgs\n )\n\n // Process enqueued logs and write to file\n fileLogger.logBrowser(\n 'ERROR',\n cleanConsoleArgsForFileLogging(consoleArgs)\n )\n break\n }\n case 'formatted-error': {\n forwardConsole.error(browserPrefix, `${entry.prefix}\\n`, entry.stack)\n\n // Process enqueued logs and write to file\n fileLogger.logBrowser(\n 'ERROR',\n cleanConsoleArgsForFileLogging([`${entry.prefix}\\n${entry.stack}`])\n )\n break\n }\n default: {\n }\n }\n }\n }\n}\n\n// the data is used later when we need to get sourcemaps for error stacks\nexport async function receiveBrowserLogsWebpack(opts: {\n entries: ServerLogEntry[]\n router: 'app' | 'pages'\n sourceType?: 'server' | 'edge-server'\n clientStats: () => any\n serverStats: () => any\n edgeServerStats: () => any\n rootDirectory: string\n distDir: string\n config: BrowserLogConfig\n}): Promise<void> {\n const {\n entries,\n router,\n sourceType,\n clientStats,\n serverStats,\n edgeServerStats,\n rootDirectory,\n distDir,\n } = opts\n\n const isAppDirectory = router === 'app'\n const isServer = sourceType === 'server'\n const isEdgeServer = sourceType === 'edge-server'\n\n const ctx: MappingContext = {\n bundler: 'webpack',\n isServer,\n isEdgeServer,\n isAppDirectory,\n clientStats,\n serverStats,\n edgeServerStats,\n rootDirectory,\n }\n\n await handleLog(entries, ctx, distDir, opts.config)\n}\n\nexport async function receiveBrowserLogsTurbopack(opts: {\n entries: ServerLogEntry[]\n router: 'app' | 'pages'\n sourceType?: 'server' | 'edge-server'\n project: Project\n projectPath: string\n distDir: string\n config: BrowserLogConfig\n}): Promise<void> {\n const { entries, router, sourceType, project, projectPath, distDir } = opts\n\n const isAppDirectory = router === 'app'\n const isServer = sourceType === 'server'\n const isEdgeServer = sourceType === 'edge-server'\n\n const ctx: MappingContext = {\n bundler: 'turbopack',\n project,\n projectPath,\n isServer,\n isEdgeServer,\n isAppDirectory,\n }\n\n await handleLog(entries, ctx, distDir, opts.config)\n}\n\n// Handle client file logs (always logged regardless of terminal flag)\nexport async function handleClientFileLogs(\n logs: Array<{ timestamp: string; level: string; message: string }>\n): Promise<void> {\n const fileLogger = getFileLogger()\n\n for (const log of logs) {\n fileLogger.logBrowser(log.level, log.message)\n }\n}\n"],"names":["cyan","dim","red","yellow","util","getConsoleLocation","getSourceMappedStackFrames","withLocation","UNDEFINED_MARKER","formatConsoleArgs","getFileLogger","restoreUndefined","x","undefined","Array","isArray","map","k","cleanConsoleArgsForFileLogging","args","arg","inspect","depth","join","methods","methodsToSkipInspect","Set","forwardConsole","console","Object","fromEntries","method","has","Infinity","colors","deserializeArgData","JSON","parse","colorError","mapped","config","colorFn","applyColor","kind","prefix","stack","frameCode","processConsoleFormatStrings","length","formatString","includes","formatted","format","stripFormatSpecifiers","fmtIn","String","rest","slice","fmtOut","argPtr","i","token","obj","result","push","prepareFormattedErrorArgs","entry","ctx","distDir","prepareConsoleArgs","deserialized","Promise","all","data","prepareConsoleErrorArgs","isRejectionMessage","mappedStack","consoleErrorStack","location","some","a","handleTable","browserPrefix","deserializedArgs","consoleMethodStack","frames","log","table","handleTrace","mappedIgnored","handleDir","loggableEntry","consoleMethod","originalWrite","process","stdout","write","bind","captured","chunk","preserved","replace","handleDefaultConsole","isServerLog","consoleArgs","withStackEntry","original","fileLogger","message","logServer","toUpperCase","logBrowser","LOG_LEVEL_PRIORITY","error","warn","verbose","METHOD_TO_LEVEL","info","debug","trace","dir","dirxml","assert","group","groupCollapsed","groupEnd","shouldShowEntry","minLevel","level","minPriority","entryLevel","handleLog","entries","isServer","isEdgeServer","formattedArgs","receiveBrowserLogsWebpack","opts","router","sourceType","clientStats","serverStats","edgeServerStats","rootDirectory","isAppDirectory","bundler","receiveBrowserLogsTurbopack","project","projectPath","handleClientFileLogs","logs"],"mappings":"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","ignoreList":[0]}
1
+ {"version":3,"sources":["../../../../../src/server/dev/browser-logs/receive-logs.ts"],"sourcesContent":["import { cyan, dim, red, yellow } from '../../../lib/picocolors'\nimport type { Project } from '../../../build/swc/types'\nimport util from 'util'\nimport {\n getConsoleLocation,\n getSourceMappedStackFrames,\n withLocation,\n type MappingContext,\n} from './source-map'\nimport {\n type ServerLogEntry,\n type LogMethod,\n type ConsoleEntry,\n UNDEFINED_MARKER,\n} from '../../../next-devtools/shared/forward-logs-shared'\nimport { formatConsoleArgs } from '../../../client/lib/console'\nimport { getFileLogger } from './file-logger'\n\nexport function restoreUndefined(x: any): any {\n if (x === UNDEFINED_MARKER) return undefined\n if (Array.isArray(x)) return x.map(restoreUndefined)\n if (x && typeof x === 'object') {\n for (let k in x) {\n x[k] = restoreUndefined(x[k])\n }\n }\n return x\n}\n\nfunction cleanConsoleArgsForFileLogging(args: any[]): string {\n /**\n * Use formatConsoleArgs to strip out background and color format specifiers\n * and keep only the original string content for file logging\n */\n try {\n return formatConsoleArgs(args)\n } catch {\n // Fallback to simple string conversion if formatting fails\n return args\n .map((arg) =>\n typeof arg === 'string' ? arg : util.inspect(arg, { depth: 2 })\n )\n .join(' ')\n }\n}\n\nconst methods: Array<LogMethod> = [\n 'log',\n 'info',\n 'warn',\n 'debug',\n 'table',\n 'error',\n 'assert',\n 'dir',\n 'dirxml',\n 'group',\n 'groupCollapsed',\n 'groupEnd',\n]\n\nconst methodsToSkipInspect = new Set([\n 'table',\n 'dir',\n 'dirxml',\n 'group',\n 'groupCollapsed',\n 'groupEnd',\n])\n\n// we aren't overriding console, we're just making a (slightly convoluted) helper for replaying user console methods\nconst forwardConsole: typeof console = {\n ...console,\n ...Object.fromEntries(\n methods.map((method) => [\n method,\n (...args: Array<any>) =>\n (console[method] as any)(\n ...args.map((arg) =>\n methodsToSkipInspect.has(method) ||\n typeof arg !== 'object' ||\n arg === null\n ? arg\n : // we hardcode depth:Infinity to allow the true depth to be configured by the serialization done in the browser (which is controlled by user)\n util.inspect(arg, { depth: Infinity, colors: true })\n )\n ),\n ])\n ),\n}\n\nasync function deserializeArgData(arg: any) {\n try {\n // we want undefined to be represented as it would be in the browser from the user's perspective (otherwise it would be stripped away/shown as null)\n if (arg === UNDEFINED_MARKER) {\n return restoreUndefined(arg)\n }\n\n return restoreUndefined(JSON.parse(arg))\n } catch {\n return arg\n }\n}\n\nconst colorError = (\n mapped: Awaited<ReturnType<typeof getSourceMappedStackFrames>>,\n config?: {\n prefix?: string\n applyColor?: boolean\n }\n) => {\n const colorFn =\n config?.applyColor === undefined || config.applyColor ? red : <T>(x: T) => x\n switch (mapped.kind) {\n case 'mapped-stack':\n case 'stack': {\n return (\n (config?.prefix ? colorFn(config?.prefix) : '') +\n `\\n${colorFn(mapped.stack)}`\n )\n }\n case 'with-frame-code': {\n return (\n (config?.prefix ? colorFn(config?.prefix) : '') +\n `\\n${colorFn(mapped.stack)}\\n${mapped.frameCode}`\n )\n }\n // a more sophisticated version of this allows the user to config if they want ignored frames (but we need to be sure to source map them)\n case 'all-ignored': {\n return config?.prefix ? colorFn(config?.prefix) : ''\n }\n default: {\n }\n }\n mapped satisfies never\n}\n\nfunction processConsoleFormatStrings(args: any[]): any[] {\n /**\n * this handles the case formatting is applied to the console log\n * otherwise we will see the format specifier directly in the terminal output\n */\n if (args.length > 0 && typeof args[0] === 'string') {\n const formatString = args[0]\n if (\n formatString.includes('%s') ||\n formatString.includes('%d') ||\n formatString.includes('%i') ||\n formatString.includes('%f') ||\n formatString.includes('%o') ||\n formatString.includes('%O') ||\n formatString.includes('%c')\n ) {\n try {\n const formatted = util.format(...args)\n return [formatted]\n } catch {\n return args\n }\n }\n }\n return args\n}\n\n// in the case of logging errors, we want to strip formatting\n// modifiers since we apply our own custom coloring to error\n// stacks and code blocks, and otherwise it would conflict\n// and cause awful output\nexport function stripFormatSpecifiers(args: any[]): any[] {\n if (args.length === 0 || typeof args[0] !== 'string') return args\n\n const fmtIn = String(args[0])\n const rest = args.slice(1)\n\n if (!fmtIn.includes('%')) return args\n\n let fmtOut = ''\n let argPtr = 0\n\n for (let i = 0; i < fmtIn.length; i++) {\n if (fmtIn[i] !== '%') {\n fmtOut += fmtIn[i]\n continue\n }\n\n if (fmtIn[i + 1] === '%') {\n fmtOut += '%'\n i++\n continue\n }\n\n const token = fmtIn[++i]\n\n if (!token) {\n fmtOut += '%'\n continue\n }\n\n if ('csdifoOj'.includes(token) || token === 'O') {\n if (argPtr < rest.length) {\n if (token === 'c') {\n argPtr++\n } else if (token === 'o' || token === 'O' || token === 'j') {\n const obj = rest[argPtr++]\n fmtOut += util.inspect(obj, { depth: 2, colors: false })\n } else {\n // string(...) is safe for remaining specifiers\n fmtOut += String(rest[argPtr++])\n }\n }\n continue\n }\n\n fmtOut += '%' + token\n }\n\n const result = [fmtOut]\n if (argPtr < rest.length) {\n result.push(...rest.slice(argPtr))\n }\n\n return result\n}\n\nasync function prepareFormattedErrorArgs(\n entry: Extract<ServerLogEntry, { kind: 'formatted-error' }>,\n ctx: MappingContext,\n distDir: string\n) {\n const mapped = await getSourceMappedStackFrames(entry.stack, ctx, distDir)\n return [colorError(mapped, { prefix: entry.prefix })]\n}\n\nasync function prepareConsoleArgs(\n entry: Extract<ServerLogEntry, { kind: 'console' }>,\n ctx: MappingContext,\n distDir: string\n) {\n const deserialized = await Promise.all(\n entry.args.map(async (arg) => {\n if (arg.kind === 'arg') {\n const data = await deserializeArgData(arg.data)\n if (entry.method === 'warn' && typeof data === 'string') {\n return yellow(data)\n }\n return data\n }\n if (!arg.stack) return red(arg.prefix)\n const mapped = await getSourceMappedStackFrames(arg.stack, ctx, distDir)\n return colorError(mapped, { prefix: arg.prefix, applyColor: false })\n })\n )\n\n return processConsoleFormatStrings(deserialized)\n}\n\nasync function prepareConsoleErrorArgs(\n entry: Extract<ServerLogEntry, { kind: 'any-logged-error' }>,\n ctx: MappingContext,\n distDir: string\n) {\n const deserialized = await Promise.all(\n entry.args.map(async (arg) => {\n if (arg.kind === 'arg') {\n if (arg.isRejectionMessage) return red(arg.data)\n return deserializeArgData(arg.data)\n }\n if (!arg.stack) return red(arg.prefix)\n const mapped = await getSourceMappedStackFrames(arg.stack, ctx, distDir)\n return colorError(mapped, { prefix: arg.prefix })\n })\n )\n\n const mappedStack = await getSourceMappedStackFrames(\n entry.consoleErrorStack,\n ctx,\n distDir\n )\n\n /**\n * don't show the stack + codeblock when there are errors present, since:\n * - it will look overwhelming to see 2 stacks and 2 code blocks\n * - the user already knows where the console.error is at because we append the location\n */\n const location = getConsoleLocation(mappedStack)\n if (entry.args.some((a) => a.kind === 'formatted-error-arg')) {\n const result = stripFormatSpecifiers(deserialized)\n if (location) {\n result.push(dim(`(${location})`))\n }\n return result\n }\n const result = [\n ...processConsoleFormatStrings(deserialized),\n colorError(mappedStack),\n ]\n if (location) {\n result.push(dim(`(${location})`))\n }\n return result\n}\n\nasync function handleTable(\n entry: ConsoleEntry<string>,\n browserPrefix: string,\n ctx: MappingContext,\n distDir: string\n) {\n const deserializedArgs = await Promise.all(\n entry.args.map(async (arg: any) => {\n if (arg.kind === 'formatted-error-arg') {\n return { stack: arg.stack }\n }\n return deserializeArgData(arg.data)\n })\n )\n\n const location = await (async () => {\n if (!entry.consoleMethodStack) {\n return\n }\n const frames = await getSourceMappedStackFrames(\n entry.consoleMethodStack,\n ctx,\n distDir\n )\n return getConsoleLocation(frames)\n })()\n\n // we can't inline pass browser prefix, but it looks better multiline for table anyways\n forwardConsole.log(browserPrefix)\n forwardConsole.table(...deserializedArgs)\n if (location) {\n forwardConsole.log(dim(`(${location})`))\n }\n}\n\nasync function handleTrace(\n entry: ConsoleEntry<string>,\n browserPrefix: string,\n ctx: MappingContext,\n distDir: string\n) {\n const deserializedArgs = await Promise.all(\n entry.args.map(async (arg: any) => {\n if (arg.kind === 'formatted-error-arg') {\n if (!arg.stack) return red(arg.prefix)\n const mapped = await getSourceMappedStackFrames(arg.stack, ctx, distDir)\n return colorError(mapped, { prefix: arg.prefix })\n }\n return deserializeArgData(arg.data)\n })\n )\n\n if (!entry.consoleMethodStack) {\n forwardConsole.log(\n browserPrefix,\n ...deserializedArgs,\n '[Trace unavailable]'\n )\n return\n }\n\n // TODO(rob): refactor so we can re-use result and not re-run the entire source map to avoid trivial post processing\n const [mapped, mappedIgnored] = await Promise.all([\n getSourceMappedStackFrames(entry.consoleMethodStack, ctx, distDir, false),\n getSourceMappedStackFrames(entry.consoleMethodStack, ctx, distDir),\n ])\n\n const location = getConsoleLocation(mappedIgnored)\n forwardConsole.log(\n browserPrefix,\n ...deserializedArgs,\n `\\n${mapped.stack}`,\n ...(location ? [`\\n${dim(`(${location})`)}`] : [])\n )\n}\n\nasync function handleDir(\n entry: ConsoleEntry<string>,\n browserPrefix: string,\n ctx: MappingContext,\n distDir: string\n) {\n const loggableEntry = await prepareConsoleArgs(entry, ctx, distDir)\n const consoleMethod =\n (forwardConsole as any)[entry.method] || forwardConsole.log\n\n if (entry.consoleMethodStack) {\n const mapped = await getSourceMappedStackFrames(\n entry.consoleMethodStack,\n ctx,\n distDir\n )\n const location = dim(`(${getConsoleLocation(mapped)})`)\n const originalWrite = process.stdout.write.bind(process.stdout)\n let captured = ''\n process.stdout.write = (chunk) => {\n captured += chunk\n return true\n }\n try {\n consoleMethod(...loggableEntry)\n } finally {\n process.stdout.write = originalWrite\n }\n const preserved = captured.replace(/\\r?\\n$/, '')\n originalWrite(`${browserPrefix}${preserved} ${location}\\n`)\n return\n }\n consoleMethod(browserPrefix, ...loggableEntry)\n}\n\nasync function handleDefaultConsole(\n entry: ConsoleEntry<string>,\n browserPrefix: string,\n ctx: MappingContext,\n distDir: string,\n config: BrowserLogConfig,\n isServerLog: boolean\n) {\n const consoleArgs = await prepareConsoleArgs(entry, ctx, distDir)\n const withStackEntry = await withLocation(\n {\n original: consoleArgs,\n stack: (entry as any).consoleMethodStack || null,\n },\n ctx,\n distDir,\n config\n )\n const consoleMethod = forwardConsole[entry.method] || forwardConsole.log\n ;(consoleMethod as (...args: any[]) => void)(browserPrefix, ...withStackEntry)\n\n // Process enqueued logs and write to file\n // Log to file with correct source based on context\n const fileLogger = getFileLogger()\n\n // Use cleaned console args to strip out background and color format specifiers\n const message = cleanConsoleArgsForFileLogging(consoleArgs)\n if (isServerLog) {\n fileLogger.logServer(entry.method.toUpperCase(), message)\n } else {\n fileLogger.logBrowser(entry.method.toUpperCase(), message)\n }\n}\n\ntype LogLevel = 'error' | 'warn' | 'verbose'\n\ntype BrowserLogConfig = boolean | 'error' | 'warn'\n\n// Log levels from most severe to least severe\n// Lower index = more severe\nconst LOG_LEVEL_PRIORITY: Record<LogLevel, number> = {\n error: 0,\n warn: 1,\n verbose: 2,\n}\n\n// Map console methods to log levels\nconst METHOD_TO_LEVEL: Record<string, LogLevel> = {\n error: 'error',\n warn: 'warn',\n info: 'verbose',\n log: 'verbose',\n debug: 'verbose',\n table: 'verbose',\n trace: 'verbose',\n dir: 'verbose',\n dirxml: 'verbose',\n assert: 'error',\n group: 'verbose',\n groupCollapsed: 'verbose',\n groupEnd: 'verbose',\n}\n\nfunction shouldShowEntry(\n entry: ServerLogEntry,\n config: BrowserLogConfig\n): boolean {\n // If config is false, don't show any entries\n if (config === false) {\n return false\n }\n\n // Determine the effective minimum log level\n const minLevel: LogLevel = typeof config === 'string' ? config : 'verbose' // true means show everything\n\n const minPriority = LOG_LEVEL_PRIORITY[minLevel]\n\n // formatted-error and any-logged-error are always treated as errors\n if (entry.kind === 'formatted-error' || entry.kind === 'any-logged-error') {\n return LOG_LEVEL_PRIORITY['error'] <= minPriority\n }\n\n if (entry.kind === 'console') {\n const entryLevel = METHOD_TO_LEVEL[entry.method] || 'log'\n return LOG_LEVEL_PRIORITY[entryLevel] <= minPriority\n }\n\n return false\n}\n\nexport async function handleLog(\n entries: ServerLogEntry[],\n ctx: MappingContext,\n distDir: string,\n config: BrowserLogConfig\n): Promise<void> {\n // Determine the source based on the context\n const isServerLog = ctx.isServer || ctx.isEdgeServer\n const browserPrefix = isServerLog ? cyan('[server]') : cyan('[browser]')\n const fileLogger = getFileLogger()\n\n for (const entry of entries) {\n // Filter entries based on config mode\n if (!shouldShowEntry(entry, config)) {\n continue\n }\n try {\n switch (entry.kind) {\n case 'console': {\n switch (entry.method) {\n case 'table': {\n // timeout based abort on source mapping result\n await handleTable(entry, browserPrefix, ctx, distDir)\n break\n }\n // ignore frames\n case 'trace': {\n await handleTrace(entry, browserPrefix, ctx, distDir)\n break\n }\n case 'dir': {\n await handleDir(entry, browserPrefix, ctx, distDir)\n break\n }\n case 'dirxml': {\n // xml log thing maybe needs an impl\n // fallthrough\n }\n case 'group':\n case 'groupCollapsed':\n case 'groupEnd': {\n // [browser] undefined (app/page.tsx:8:11) console.group\n // fallthrough\n }\n case 'assert': {\n // check console assert\n // fallthrough\n }\n case 'log':\n case 'info':\n case 'debug':\n case 'error':\n case 'warn': {\n await handleDefaultConsole(\n entry,\n browserPrefix,\n ctx,\n distDir,\n config,\n isServerLog\n )\n break\n }\n default: {\n entry satisfies never\n }\n }\n break\n }\n // any logged errors are anything that are logged as \"red\" in the browser but aren't only an Error (console.error, Promise.reject(100))\n case 'any-logged-error': {\n const consoleArgs = await prepareConsoleErrorArgs(entry, ctx, distDir)\n forwardConsole.error(browserPrefix, ...consoleArgs)\n\n // Process enqueued logs and write to file\n fileLogger.logBrowser(\n 'ERROR',\n cleanConsoleArgsForFileLogging(consoleArgs)\n )\n break\n }\n // formatted error is an explicit error event (rejections, uncaught errors)\n case 'formatted-error': {\n const formattedArgs = await prepareFormattedErrorArgs(\n entry,\n ctx,\n distDir\n )\n forwardConsole.error(browserPrefix, ...formattedArgs)\n\n // Process enqueued logs and write to file\n fileLogger.logBrowser(\n 'ERROR',\n cleanConsoleArgsForFileLogging(formattedArgs)\n )\n break\n }\n default: {\n }\n }\n } catch {\n switch (entry.kind) {\n case 'any-logged-error': {\n const consoleArgs = await prepareConsoleErrorArgs(entry, ctx, distDir)\n forwardConsole.error(browserPrefix, ...consoleArgs)\n // Process enqueued logs and write to file\n fileLogger.logBrowser(\n 'ERROR',\n cleanConsoleArgsForFileLogging(consoleArgs)\n )\n break\n }\n case 'console': {\n const consoleMethod =\n forwardConsole[entry.method] || forwardConsole.log\n const consoleArgs = await prepareConsoleArgs(entry, ctx, distDir)\n ;(consoleMethod as (...args: any[]) => void)(\n browserPrefix,\n ...consoleArgs\n )\n\n // Process enqueued logs and write to file\n fileLogger.logBrowser(\n 'ERROR',\n cleanConsoleArgsForFileLogging(consoleArgs)\n )\n break\n }\n case 'formatted-error': {\n forwardConsole.error(browserPrefix, `${entry.prefix}\\n`, entry.stack)\n\n // Process enqueued logs and write to file\n fileLogger.logBrowser(\n 'ERROR',\n cleanConsoleArgsForFileLogging([`${entry.prefix}\\n${entry.stack}`])\n )\n break\n }\n default: {\n }\n }\n }\n }\n}\n\n// the data is used later when we need to get sourcemaps for error stacks\nexport async function receiveBrowserLogsWebpack(opts: {\n entries: ServerLogEntry[]\n router: 'app' | 'pages'\n sourceType?: 'server' | 'edge-server'\n clientStats: () => any\n serverStats: () => any\n edgeServerStats: () => any\n rootDirectory: string\n distDir: string\n config: BrowserLogConfig\n}): Promise<void> {\n const {\n entries,\n router,\n sourceType,\n clientStats,\n serverStats,\n edgeServerStats,\n rootDirectory,\n distDir,\n } = opts\n\n const isAppDirectory = router === 'app'\n const isServer = sourceType === 'server'\n const isEdgeServer = sourceType === 'edge-server'\n\n const ctx: MappingContext = {\n bundler: 'webpack',\n isServer,\n isEdgeServer,\n isAppDirectory,\n clientStats,\n serverStats,\n edgeServerStats,\n rootDirectory,\n }\n\n await handleLog(entries, ctx, distDir, opts.config)\n}\n\nexport async function receiveBrowserLogsTurbopack(opts: {\n entries: ServerLogEntry[]\n router: 'app' | 'pages'\n sourceType?: 'server' | 'edge-server'\n project: Project\n projectPath: string\n distDir: string\n config: BrowserLogConfig\n}): Promise<void> {\n const { entries, router, sourceType, project, projectPath, distDir } = opts\n\n const isAppDirectory = router === 'app'\n const isServer = sourceType === 'server'\n const isEdgeServer = sourceType === 'edge-server'\n\n const ctx: MappingContext = {\n bundler: 'turbopack',\n project,\n projectPath,\n isServer,\n isEdgeServer,\n isAppDirectory,\n }\n\n await handleLog(entries, ctx, distDir, opts.config)\n}\n\n// Handle client file logs (always logged regardless of terminal flag)\nexport async function handleClientFileLogs(\n logs: Array<{ timestamp: string; level: string; message: string }>\n): Promise<void> {\n const fileLogger = getFileLogger()\n\n for (const log of logs) {\n fileLogger.logBrowser(log.level, log.message)\n }\n}\n"],"names":["cyan","dim","red","yellow","util","getConsoleLocation","getSourceMappedStackFrames","withLocation","UNDEFINED_MARKER","formatConsoleArgs","getFileLogger","restoreUndefined","x","undefined","Array","isArray","map","k","cleanConsoleArgsForFileLogging","args","arg","inspect","depth","join","methods","methodsToSkipInspect","Set","forwardConsole","console","Object","fromEntries","method","has","Infinity","colors","deserializeArgData","JSON","parse","colorError","mapped","config","colorFn","applyColor","kind","prefix","stack","frameCode","processConsoleFormatStrings","length","formatString","includes","formatted","format","stripFormatSpecifiers","fmtIn","String","rest","slice","fmtOut","argPtr","i","token","obj","result","push","prepareFormattedErrorArgs","entry","ctx","distDir","prepareConsoleArgs","deserialized","Promise","all","data","prepareConsoleErrorArgs","isRejectionMessage","mappedStack","consoleErrorStack","location","some","a","handleTable","browserPrefix","deserializedArgs","consoleMethodStack","frames","log","table","handleTrace","mappedIgnored","handleDir","loggableEntry","consoleMethod","originalWrite","process","stdout","write","bind","captured","chunk","preserved","replace","handleDefaultConsole","isServerLog","consoleArgs","withStackEntry","original","fileLogger","message","logServer","toUpperCase","logBrowser","LOG_LEVEL_PRIORITY","error","warn","verbose","METHOD_TO_LEVEL","info","debug","trace","dir","dirxml","assert","group","groupCollapsed","groupEnd","shouldShowEntry","minLevel","minPriority","entryLevel","handleLog","entries","isServer","isEdgeServer","formattedArgs","receiveBrowserLogsWebpack","opts","router","sourceType","clientStats","serverStats","edgeServerStats","rootDirectory","isAppDirectory","bundler","receiveBrowserLogsTurbopack","project","projectPath","handleClientFileLogs","logs","level"],"mappings":"AAAA,SAASA,IAAI,EAAEC,GAAG,EAAEC,GAAG,EAAEC,MAAM,QAAQ,0BAAyB;AAEhE,OAAOC,UAAU,OAAM;AACvB,SACEC,kBAAkB,EAClBC,0BAA0B,EAC1BC,YAAY,QAEP,eAAc;AACrB,SAIEC,gBAAgB,QACX,oDAAmD;AAC1D,SAASC,iBAAiB,QAAQ,8BAA6B;AAC/D,SAASC,aAAa,QAAQ,gBAAe;AAE7C,OAAO,SAASC,iBAAiBC,CAAM;IACrC,IAAIA,MAAMJ,kBAAkB,OAAOK;IACnC,IAAIC,MAAMC,OAAO,CAACH,IAAI,OAAOA,EAAEI,GAAG,CAACL;IACnC,IAAIC,KAAK,OAAOA,MAAM,UAAU;QAC9B,IAAK,IAAIK,KAAKL,EAAG;YACfA,CAAC,CAACK,EAAE,GAAGN,iBAAiBC,CAAC,CAACK,EAAE;QAC9B;IACF;IACA,OAAOL;AACT;AAEA,SAASM,+BAA+BC,IAAW;IACjD;;;GAGC,GACD,IAAI;QACF,OAAOV,kBAAkBU;IAC3B,EAAE,OAAM;QACN,2DAA2D;QAC3D,OAAOA,KACJH,GAAG,CAAC,CAACI,MACJ,OAAOA,QAAQ,WAAWA,MAAMhB,KAAKiB,OAAO,CAACD,KAAK;gBAAEE,OAAO;YAAE,IAE9DC,IAAI,CAAC;IACV;AACF;AAEA,MAAMC,UAA4B;IAChC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD;AAED,MAAMC,uBAAuB,IAAIC,IAAI;IACnC;IACA;IACA;IACA;IACA;IACA;CACD;AAED,oHAAoH;AACpH,MAAMC,iBAAiC;IACrC,GAAGC,OAAO;IACV,GAAGC,OAAOC,WAAW,CACnBN,QAAQR,GAAG,CAAC,CAACe,SAAW;YACtBA;YACA,CAAC,GAAGZ,OACF,AAACS,OAAO,CAACG,OAAO,IACXZ,KAAKH,GAAG,CAAC,CAACI,MACXK,qBAAqBO,GAAG,CAACD,WACzB,OAAOX,QAAQ,YACfA,QAAQ,OACJA,MAEAhB,KAAKiB,OAAO,CAACD,KAAK;wBAAEE,OAAOW;wBAAUC,QAAQ;oBAAK;SAG7D,EACF;AACH;AAEA,eAAeC,mBAAmBf,GAAQ;IACxC,IAAI;QACF,oJAAoJ;QACpJ,IAAIA,QAAQZ,kBAAkB;YAC5B,OAAOG,iBAAiBS;QAC1B;QAEA,OAAOT,iBAAiByB,KAAKC,KAAK,CAACjB;IACrC,EAAE,OAAM;QACN,OAAOA;IACT;AACF;AAEA,MAAMkB,aAAa,CACjBC,QACAC;IAKA,MAAMC,UACJD,CAAAA,0BAAAA,OAAQE,UAAU,MAAK7B,aAAa2B,OAAOE,UAAU,GAAGxC,MAAM,CAAIU,IAASA;IAC7E,OAAQ2B,OAAOI,IAAI;QACjB,KAAK;QACL,KAAK;YAAS;gBACZ,OACE,AAACH,CAAAA,CAAAA,0BAAAA,OAAQI,MAAM,IAAGH,QAAQD,0BAAAA,OAAQI,MAAM,IAAI,EAAC,IAC7C,CAAC,EAAE,EAAEH,QAAQF,OAAOM,KAAK,GAAG;YAEhC;QACA,KAAK;YAAmB;gBACtB,OACE,AAACL,CAAAA,CAAAA,0BAAAA,OAAQI,MAAM,IAAGH,QAAQD,0BAAAA,OAAQI,MAAM,IAAI,EAAC,IAC7C,CAAC,EAAE,EAAEH,QAAQF,OAAOM,KAAK,EAAE,EAAE,EAAEN,OAAOO,SAAS,EAAE;YAErD;QACA,yIAAyI;QACzI,KAAK;YAAe;gBAClB,OAAON,CAAAA,0BAAAA,OAAQI,MAAM,IAAGH,QAAQD,0BAAAA,OAAQI,MAAM,IAAI;YACpD;QACA;YAAS,CACT;IACF;IACAL;AACF;AAEA,SAASQ,4BAA4B5B,IAAW;IAC9C;;;GAGC,GACD,IAAIA,KAAK6B,MAAM,GAAG,KAAK,OAAO7B,IAAI,CAAC,EAAE,KAAK,UAAU;QAClD,MAAM8B,eAAe9B,IAAI,CAAC,EAAE;QAC5B,IACE8B,aAAaC,QAAQ,CAAC,SACtBD,aAAaC,QAAQ,CAAC,SACtBD,aAAaC,QAAQ,CAAC,SACtBD,aAAaC,QAAQ,CAAC,SACtBD,aAAaC,QAAQ,CAAC,SACtBD,aAAaC,QAAQ,CAAC,SACtBD,aAAaC,QAAQ,CAAC,OACtB;YACA,IAAI;gBACF,MAAMC,YAAY/C,KAAKgD,MAAM,IAAIjC;gBACjC,OAAO;oBAACgC;iBAAU;YACpB,EAAE,OAAM;gBACN,OAAOhC;YACT;QACF;IACF;IACA,OAAOA;AACT;AAEA,6DAA6D;AAC7D,4DAA4D;AAC5D,0DAA0D;AAC1D,yBAAyB;AACzB,OAAO,SAASkC,sBAAsBlC,IAAW;IAC/C,IAAIA,KAAK6B,MAAM,KAAK,KAAK,OAAO7B,IAAI,CAAC,EAAE,KAAK,UAAU,OAAOA;IAE7D,MAAMmC,QAAQC,OAAOpC,IAAI,CAAC,EAAE;IAC5B,MAAMqC,OAAOrC,KAAKsC,KAAK,CAAC;IAExB,IAAI,CAACH,MAAMJ,QAAQ,CAAC,MAAM,OAAO/B;IAEjC,IAAIuC,SAAS;IACb,IAAIC,SAAS;IAEb,IAAK,IAAIC,IAAI,GAAGA,IAAIN,MAAMN,MAAM,EAAEY,IAAK;QACrC,IAAIN,KAAK,CAACM,EAAE,KAAK,KAAK;YACpBF,UAAUJ,KAAK,CAACM,EAAE;YAClB;QACF;QAEA,IAAIN,KAAK,CAACM,IAAI,EAAE,KAAK,KAAK;YACxBF,UAAU;YACVE;YACA;QACF;QAEA,MAAMC,QAAQP,KAAK,CAAC,EAAEM,EAAE;QAExB,IAAI,CAACC,OAAO;YACVH,UAAU;YACV;QACF;QAEA,IAAI,WAAWR,QAAQ,CAACW,UAAUA,UAAU,KAAK;YAC/C,IAAIF,SAASH,KAAKR,MAAM,EAAE;gBACxB,IAAIa,UAAU,KAAK;oBACjBF;gBACF,OAAO,IAAIE,UAAU,OAAOA,UAAU,OAAOA,UAAU,KAAK;oBAC1D,MAAMC,MAAMN,IAAI,CAACG,SAAS;oBAC1BD,UAAUtD,KAAKiB,OAAO,CAACyC,KAAK;wBAAExC,OAAO;wBAAGY,QAAQ;oBAAM;gBACxD,OAAO;oBACL,+CAA+C;oBAC/CwB,UAAUH,OAAOC,IAAI,CAACG,SAAS;gBACjC;YACF;YACA;QACF;QAEAD,UAAU,MAAMG;IAClB;IAEA,MAAME,SAAS;QAACL;KAAO;IACvB,IAAIC,SAASH,KAAKR,MAAM,EAAE;QACxBe,OAAOC,IAAI,IAAIR,KAAKC,KAAK,CAACE;IAC5B;IAEA,OAAOI;AACT;AAEA,eAAeE,0BACbC,KAA2D,EAC3DC,GAAmB,EACnBC,OAAe;IAEf,MAAM7B,SAAS,MAAMjC,2BAA2B4D,MAAMrB,KAAK,EAAEsB,KAAKC;IAClE,OAAO;QAAC9B,WAAWC,QAAQ;YAAEK,QAAQsB,MAAMtB,MAAM;QAAC;KAAG;AACvD;AAEA,eAAeyB,mBACbH,KAAmD,EACnDC,GAAmB,EACnBC,OAAe;IAEf,MAAME,eAAe,MAAMC,QAAQC,GAAG,CACpCN,MAAM/C,IAAI,CAACH,GAAG,CAAC,OAAOI;QACpB,IAAIA,IAAIuB,IAAI,KAAK,OAAO;YACtB,MAAM8B,OAAO,MAAMtC,mBAAmBf,IAAIqD,IAAI;YAC9C,IAAIP,MAAMnC,MAAM,KAAK,UAAU,OAAO0C,SAAS,UAAU;gBACvD,OAAOtE,OAAOsE;YAChB;YACA,OAAOA;QACT;QACA,IAAI,CAACrD,IAAIyB,KAAK,EAAE,OAAO3C,IAAIkB,IAAIwB,MAAM;QACrC,MAAML,SAAS,MAAMjC,2BAA2Bc,IAAIyB,KAAK,EAAEsB,KAAKC;QAChE,OAAO9B,WAAWC,QAAQ;YAAEK,QAAQxB,IAAIwB,MAAM;YAAEF,YAAY;QAAM;IACpE;IAGF,OAAOK,4BAA4BuB;AACrC;AAEA,eAAeI,wBACbR,KAA4D,EAC5DC,GAAmB,EACnBC,OAAe;IAEf,MAAME,eAAe,MAAMC,QAAQC,GAAG,CACpCN,MAAM/C,IAAI,CAACH,GAAG,CAAC,OAAOI;QACpB,IAAIA,IAAIuB,IAAI,KAAK,OAAO;YACtB,IAAIvB,IAAIuD,kBAAkB,EAAE,OAAOzE,IAAIkB,IAAIqD,IAAI;YAC/C,OAAOtC,mBAAmBf,IAAIqD,IAAI;QACpC;QACA,IAAI,CAACrD,IAAIyB,KAAK,EAAE,OAAO3C,IAAIkB,IAAIwB,MAAM;QACrC,MAAML,SAAS,MAAMjC,2BAA2Bc,IAAIyB,KAAK,EAAEsB,KAAKC;QAChE,OAAO9B,WAAWC,QAAQ;YAAEK,QAAQxB,IAAIwB,MAAM;QAAC;IACjD;IAGF,MAAMgC,cAAc,MAAMtE,2BACxB4D,MAAMW,iBAAiB,EACvBV,KACAC;IAGF;;;;GAIC,GACD,MAAMU,WAAWzE,mBAAmBuE;IACpC,IAAIV,MAAM/C,IAAI,CAAC4D,IAAI,CAAC,CAACC,IAAMA,EAAErC,IAAI,KAAK,wBAAwB;QAC5D,MAAMoB,SAASV,sBAAsBiB;QACrC,IAAIQ,UAAU;YACZf,OAAOC,IAAI,CAAC/D,IAAI,CAAC,CAAC,EAAE6E,SAAS,CAAC,CAAC;QACjC;QACA,OAAOf;IACT;IACA,MAAMA,SAAS;WACVhB,4BAA4BuB;QAC/BhC,WAAWsC;KACZ;IACD,IAAIE,UAAU;QACZf,OAAOC,IAAI,CAAC/D,IAAI,CAAC,CAAC,EAAE6E,SAAS,CAAC,CAAC;IACjC;IACA,OAAOf;AACT;AAEA,eAAekB,YACbf,KAA2B,EAC3BgB,aAAqB,EACrBf,GAAmB,EACnBC,OAAe;IAEf,MAAMe,mBAAmB,MAAMZ,QAAQC,GAAG,CACxCN,MAAM/C,IAAI,CAACH,GAAG,CAAC,OAAOI;QACpB,IAAIA,IAAIuB,IAAI,KAAK,uBAAuB;YACtC,OAAO;gBAAEE,OAAOzB,IAAIyB,KAAK;YAAC;QAC5B;QACA,OAAOV,mBAAmBf,IAAIqD,IAAI;IACpC;IAGF,MAAMK,WAAW,MAAM,AAAC,CAAA;QACtB,IAAI,CAACZ,MAAMkB,kBAAkB,EAAE;YAC7B;QACF;QACA,MAAMC,SAAS,MAAM/E,2BACnB4D,MAAMkB,kBAAkB,EACxBjB,KACAC;QAEF,OAAO/D,mBAAmBgF;IAC5B,CAAA;IAEA,uFAAuF;IACvF1D,eAAe2D,GAAG,CAACJ;IACnBvD,eAAe4D,KAAK,IAAIJ;IACxB,IAAIL,UAAU;QACZnD,eAAe2D,GAAG,CAACrF,IAAI,CAAC,CAAC,EAAE6E,SAAS,CAAC,CAAC;IACxC;AACF;AAEA,eAAeU,YACbtB,KAA2B,EAC3BgB,aAAqB,EACrBf,GAAmB,EACnBC,OAAe;IAEf,MAAMe,mBAAmB,MAAMZ,QAAQC,GAAG,CACxCN,MAAM/C,IAAI,CAACH,GAAG,CAAC,OAAOI;QACpB,IAAIA,IAAIuB,IAAI,KAAK,uBAAuB;YACtC,IAAI,CAACvB,IAAIyB,KAAK,EAAE,OAAO3C,IAAIkB,IAAIwB,MAAM;YACrC,MAAML,SAAS,MAAMjC,2BAA2Bc,IAAIyB,KAAK,EAAEsB,KAAKC;YAChE,OAAO9B,WAAWC,QAAQ;gBAAEK,QAAQxB,IAAIwB,MAAM;YAAC;QACjD;QACA,OAAOT,mBAAmBf,IAAIqD,IAAI;IACpC;IAGF,IAAI,CAACP,MAAMkB,kBAAkB,EAAE;QAC7BzD,eAAe2D,GAAG,CAChBJ,kBACGC,kBACH;QAEF;IACF;IAEA,oHAAoH;IACpH,MAAM,CAAC5C,QAAQkD,cAAc,GAAG,MAAMlB,QAAQC,GAAG,CAAC;QAChDlE,2BAA2B4D,MAAMkB,kBAAkB,EAAEjB,KAAKC,SAAS;QACnE9D,2BAA2B4D,MAAMkB,kBAAkB,EAAEjB,KAAKC;KAC3D;IAED,MAAMU,WAAWzE,mBAAmBoF;IACpC9D,eAAe2D,GAAG,CAChBJ,kBACGC,kBACH,CAAC,EAAE,EAAE5C,OAAOM,KAAK,EAAE,KACfiC,WAAW;QAAC,CAAC,EAAE,EAAE7E,IAAI,CAAC,CAAC,EAAE6E,SAAS,CAAC,CAAC,GAAG;KAAC,GAAG,EAAE;AAErD;AAEA,eAAeY,UACbxB,KAA2B,EAC3BgB,aAAqB,EACrBf,GAAmB,EACnBC,OAAe;IAEf,MAAMuB,gBAAgB,MAAMtB,mBAAmBH,OAAOC,KAAKC;IAC3D,MAAMwB,gBACJ,AAACjE,cAAsB,CAACuC,MAAMnC,MAAM,CAAC,IAAIJ,eAAe2D,GAAG;IAE7D,IAAIpB,MAAMkB,kBAAkB,EAAE;QAC5B,MAAM7C,SAAS,MAAMjC,2BACnB4D,MAAMkB,kBAAkB,EACxBjB,KACAC;QAEF,MAAMU,WAAW7E,IAAI,CAAC,CAAC,EAAEI,mBAAmBkC,QAAQ,CAAC,CAAC;QACtD,MAAMsD,gBAAgBC,QAAQC,MAAM,CAACC,KAAK,CAACC,IAAI,CAACH,QAAQC,MAAM;QAC9D,IAAIG,WAAW;QACfJ,QAAQC,MAAM,CAACC,KAAK,GAAG,CAACG;YACtBD,YAAYC;YACZ,OAAO;QACT;QACA,IAAI;YACFP,iBAAiBD;QACnB,SAAU;YACRG,QAAQC,MAAM,CAACC,KAAK,GAAGH;QACzB;QACA,MAAMO,YAAYF,SAASG,OAAO,CAAC,UAAU;QAC7CR,cAAc,GAAGX,gBAAgBkB,UAAU,CAAC,EAAEtB,SAAS,EAAE,CAAC;QAC1D;IACF;IACAc,cAAcV,kBAAkBS;AAClC;AAEA,eAAeW,qBACbpC,KAA2B,EAC3BgB,aAAqB,EACrBf,GAAmB,EACnBC,OAAe,EACf5B,MAAwB,EACxB+D,WAAoB;IAEpB,MAAMC,cAAc,MAAMnC,mBAAmBH,OAAOC,KAAKC;IACzD,MAAMqC,iBAAiB,MAAMlG,aAC3B;QACEmG,UAAUF;QACV3D,OAAO,AAACqB,MAAckB,kBAAkB,IAAI;IAC9C,GACAjB,KACAC,SACA5B;IAEF,MAAMoD,gBAAgBjE,cAAc,CAACuC,MAAMnC,MAAM,CAAC,IAAIJ,eAAe2D,GAAG;IACtEM,cAA2CV,kBAAkBuB;IAE/D,0CAA0C;IAC1C,mDAAmD;IACnD,MAAME,aAAajG;IAEnB,+EAA+E;IAC/E,MAAMkG,UAAU1F,+BAA+BsF;IAC/C,IAAID,aAAa;QACfI,WAAWE,SAAS,CAAC3C,MAAMnC,MAAM,CAAC+E,WAAW,IAAIF;IACnD,OAAO;QACLD,WAAWI,UAAU,CAAC7C,MAAMnC,MAAM,CAAC+E,WAAW,IAAIF;IACpD;AACF;AAMA,8CAA8C;AAC9C,4BAA4B;AAC5B,MAAMI,qBAA+C;IACnDC,OAAO;IACPC,MAAM;IACNC,SAAS;AACX;AAEA,oCAAoC;AACpC,MAAMC,kBAA4C;IAChDH,OAAO;IACPC,MAAM;IACNG,MAAM;IACN/B,KAAK;IACLgC,OAAO;IACP/B,OAAO;IACPgC,OAAO;IACPC,KAAK;IACLC,QAAQ;IACRC,QAAQ;IACRC,OAAO;IACPC,gBAAgB;IAChBC,UAAU;AACZ;AAEA,SAASC,gBACP5D,KAAqB,EACrB1B,MAAwB;IAExB,6CAA6C;IAC7C,IAAIA,WAAW,OAAO;QACpB,OAAO;IACT;IAEA,4CAA4C;IAC5C,MAAMuF,WAAqB,OAAOvF,WAAW,WAAWA,SAAS,UAAU,6BAA6B;;IAExG,MAAMwF,cAAchB,kBAAkB,CAACe,SAAS;IAEhD,oEAAoE;IACpE,IAAI7D,MAAMvB,IAAI,KAAK,qBAAqBuB,MAAMvB,IAAI,KAAK,oBAAoB;QACzE,OAAOqE,kBAAkB,CAAC,QAAQ,IAAIgB;IACxC;IAEA,IAAI9D,MAAMvB,IAAI,KAAK,WAAW;QAC5B,MAAMsF,aAAab,eAAe,CAAClD,MAAMnC,MAAM,CAAC,IAAI;QACpD,OAAOiF,kBAAkB,CAACiB,WAAW,IAAID;IAC3C;IAEA,OAAO;AACT;AAEA,OAAO,eAAeE,UACpBC,OAAyB,EACzBhE,GAAmB,EACnBC,OAAe,EACf5B,MAAwB;IAExB,4CAA4C;IAC5C,MAAM+D,cAAcpC,IAAIiE,QAAQ,IAAIjE,IAAIkE,YAAY;IACpD,MAAMnD,gBAAgBqB,cAAcvG,KAAK,cAAcA,KAAK;IAC5D,MAAM2G,aAAajG;IAEnB,KAAK,MAAMwD,SAASiE,QAAS;QAC3B,sCAAsC;QACtC,IAAI,CAACL,gBAAgB5D,OAAO1B,SAAS;YACnC;QACF;QACA,IAAI;YACF,OAAQ0B,MAAMvB,IAAI;gBAChB,KAAK;oBAAW;wBACd,OAAQuB,MAAMnC,MAAM;4BAClB,KAAK;gCAAS;oCACZ,+CAA+C;oCAC/C,MAAMkD,YAAYf,OAAOgB,eAAef,KAAKC;oCAC7C;gCACF;4BACA,gBAAgB;4BAChB,KAAK;gCAAS;oCACZ,MAAMoB,YAAYtB,OAAOgB,eAAef,KAAKC;oCAC7C;gCACF;4BACA,KAAK;gCAAO;oCACV,MAAMsB,UAAUxB,OAAOgB,eAAef,KAAKC;oCAC3C;gCACF;4BACA,KAAK;gCAAU;gCACb,oCAAoC;gCACpC,cAAc;gCAChB;4BACA,KAAK;4BACL,KAAK;4BACL,KAAK;gCAAY;gCACf,wDAAwD;gCACxD,cAAc;gCAChB;4BACA,KAAK;gCAAU;gCACb,uBAAuB;gCACvB,cAAc;gCAChB;4BACA,KAAK;4BACL,KAAK;4BACL,KAAK;4BACL,KAAK;4BACL,KAAK;gCAAQ;oCACX,MAAMkC,qBACJpC,OACAgB,eACAf,KACAC,SACA5B,QACA+D;oCAEF;gCACF;4BACA;gCAAS;oCACPrC;gCACF;wBACF;wBACA;oBACF;gBACA,uIAAuI;gBACvI,KAAK;oBAAoB;wBACvB,MAAMsC,cAAc,MAAM9B,wBAAwBR,OAAOC,KAAKC;wBAC9DzC,eAAesF,KAAK,CAAC/B,kBAAkBsB;wBAEvC,0CAA0C;wBAC1CG,WAAWI,UAAU,CACnB,SACA7F,+BAA+BsF;wBAEjC;oBACF;gBACA,2EAA2E;gBAC3E,KAAK;oBAAmB;wBACtB,MAAM8B,gBAAgB,MAAMrE,0BAC1BC,OACAC,KACAC;wBAEFzC,eAAesF,KAAK,CAAC/B,kBAAkBoD;wBAEvC,0CAA0C;wBAC1C3B,WAAWI,UAAU,CACnB,SACA7F,+BAA+BoH;wBAEjC;oBACF;gBACA;oBAAS,CACT;YACF;QACF,EAAE,OAAM;YACN,OAAQpE,MAAMvB,IAAI;gBAChB,KAAK;oBAAoB;wBACvB,MAAM6D,cAAc,MAAM9B,wBAAwBR,OAAOC,KAAKC;wBAC9DzC,eAAesF,KAAK,CAAC/B,kBAAkBsB;wBACvC,0CAA0C;wBAC1CG,WAAWI,UAAU,CACnB,SACA7F,+BAA+BsF;wBAEjC;oBACF;gBACA,KAAK;oBAAW;wBACd,MAAMZ,gBACJjE,cAAc,CAACuC,MAAMnC,MAAM,CAAC,IAAIJ,eAAe2D,GAAG;wBACpD,MAAMkB,cAAc,MAAMnC,mBAAmBH,OAAOC,KAAKC;wBACvDwB,cACAV,kBACGsB;wBAGL,0CAA0C;wBAC1CG,WAAWI,UAAU,CACnB,SACA7F,+BAA+BsF;wBAEjC;oBACF;gBACA,KAAK;oBAAmB;wBACtB7E,eAAesF,KAAK,CAAC/B,eAAe,GAAGhB,MAAMtB,MAAM,CAAC,EAAE,CAAC,EAAEsB,MAAMrB,KAAK;wBAEpE,0CAA0C;wBAC1C8D,WAAWI,UAAU,CACnB,SACA7F,+BAA+B;4BAAC,GAAGgD,MAAMtB,MAAM,CAAC,EAAE,EAAEsB,MAAMrB,KAAK,EAAE;yBAAC;wBAEpE;oBACF;gBACA;oBAAS,CACT;YACF;QACF;IACF;AACF;AAEA,yEAAyE;AACzE,OAAO,eAAe0F,0BAA0BC,IAU/C;IACC,MAAM,EACJL,OAAO,EACPM,MAAM,EACNC,UAAU,EACVC,WAAW,EACXC,WAAW,EACXC,eAAe,EACfC,aAAa,EACb1E,OAAO,EACR,GAAGoE;IAEJ,MAAMO,iBAAiBN,WAAW;IAClC,MAAML,WAAWM,eAAe;IAChC,MAAML,eAAeK,eAAe;IAEpC,MAAMvE,MAAsB;QAC1B6E,SAAS;QACTZ;QACAC;QACAU;QACAJ;QACAC;QACAC;QACAC;IACF;IAEA,MAAMZ,UAAUC,SAAShE,KAAKC,SAASoE,KAAKhG,MAAM;AACpD;AAEA,OAAO,eAAeyG,4BAA4BT,IAQjD;IACC,MAAM,EAAEL,OAAO,EAAEM,MAAM,EAAEC,UAAU,EAAEQ,OAAO,EAAEC,WAAW,EAAE/E,OAAO,EAAE,GAAGoE;IAEvE,MAAMO,iBAAiBN,WAAW;IAClC,MAAML,WAAWM,eAAe;IAChC,MAAML,eAAeK,eAAe;IAEpC,MAAMvE,MAAsB;QAC1B6E,SAAS;QACTE;QACAC;QACAf;QACAC;QACAU;IACF;IAEA,MAAMb,UAAUC,SAAShE,KAAKC,SAASoE,KAAKhG,MAAM;AACpD;AAEA,sEAAsE;AACtE,OAAO,eAAe4G,qBACpBC,IAAkE;IAElE,MAAM1C,aAAajG;IAEnB,KAAK,MAAM4E,OAAO+D,KAAM;QACtB1C,WAAWI,UAAU,CAACzB,IAAIgE,KAAK,EAAEhE,IAAIsB,OAAO;IAC9C;AACF","ignoreList":[0]}
@@ -159,10 +159,7 @@ function formatStackFrame(frame) {
159
159
  return ` at ${functionName} (${location})`;
160
160
  }
161
161
  // appends the source mapped location of the console method
162
- export const withLocation = async ({ original, stack }, ctx, distDir, config)=>{
163
- if (typeof config === 'object' && config.showSourceLocation === false) {
164
- return original;
165
- }
162
+ export const withLocation = async ({ original, stack }, ctx, distDir, _config)=>{
166
163
  if (!stack) {
167
164
  return original;
168
165
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/server/dev/browser-logs/source-map.ts"],"sourcesContent":["import { getOriginalStackFrames as getOriginalStackFramesWebpack } from '../middleware-webpack'\nimport { getOriginalStackFrames as getOriginalStackFramesTurbopack } from '../middleware-turbopack'\nimport type { Project } from '../../../build/swc/types'\nimport { dim } from '../../../lib/picocolors'\nimport { parseStack, type StackFrame } from '../../lib/parse-stack'\nimport path from 'path'\nimport { LRUCache } from '../../lib/lru-cache'\n\ntype WebpackMappingContext = {\n bundler: 'webpack'\n isServer: boolean\n isEdgeServer: boolean\n isAppDirectory: boolean\n clientStats: () => any\n serverStats: () => any\n edgeServerStats: () => any\n rootDirectory: string\n}\n\ntype TurbopackMappingContext = {\n bundler: 'turbopack'\n isServer: boolean\n isEdgeServer: boolean\n isAppDirectory: boolean\n project: Project\n projectPath: string\n}\n\nexport type MappingContext = WebpackMappingContext | TurbopackMappingContext\n\n// TODO: handle server vs browser error source mapping correctly\nexport async function mapFramesUsingBundler(\n frames: StackFrame[],\n ctx: MappingContext\n) {\n switch (ctx.bundler) {\n case 'webpack': {\n const {\n isServer,\n isEdgeServer,\n isAppDirectory,\n clientStats,\n serverStats,\n edgeServerStats,\n rootDirectory,\n } = ctx\n const res = await getOriginalStackFramesWebpack({\n isServer,\n isEdgeServer,\n isAppDirectory,\n frames,\n clientStats,\n serverStats,\n edgeServerStats,\n rootDirectory,\n })\n return res\n }\n case 'turbopack': {\n const { project, projectPath, isServer, isEdgeServer, isAppDirectory } =\n ctx\n const res = await getOriginalStackFramesTurbopack({\n project,\n projectPath,\n frames,\n isServer,\n isEdgeServer,\n isAppDirectory,\n })\n\n return res\n }\n default: {\n return null!\n }\n }\n}\n\n// converts _next/static/chunks/... to file:///.next/static/chunks/... for parseStack\n// todo: where does next dev overlay handle this case and re-use that logic\nfunction preprocessStackTrace(stackTrace: string, distDir?: string): string {\n return stackTrace\n .split('\\n')\n .map((line) => {\n const match = line.match(/^(\\s*at\\s+.*?)\\s+\\(([^)]+)\\)$/)\n if (match) {\n const [, prefix, location] = match\n\n if (location.startsWith('_next/static/') && distDir) {\n const normalizedDistDir = distDir\n .replace(/\\\\/g, '/')\n .replace(/\\/$/, '')\n\n const absolutePath =\n normalizedDistDir + '/' + location.slice('_next/'.length)\n const fileUrl = `file://${path.resolve(absolutePath)}`\n\n return `${prefix} (${fileUrl})`\n }\n }\n\n return line\n })\n .join('\\n')\n}\n\nconst cache = new LRUCache<\n Awaited<ReturnType<typeof getSourceMappedStackFramesInternal>>\n>(25)\nasync function getSourceMappedStackFramesInternal(\n stackTrace: string,\n ctx: MappingContext,\n distDir: string,\n ignore = true\n) {\n try {\n const normalizedStack = preprocessStackTrace(stackTrace, distDir)\n const frames = parseStack(normalizedStack, distDir)\n\n if (frames.length === 0) {\n return {\n kind: 'stack' as const,\n stack: stackTrace,\n }\n }\n\n const mappingResults = await mapFramesUsingBundler(frames, ctx)\n\n const processedFrames = mappingResults\n .map((result, index) => ({\n result,\n originalFrame: frames[index],\n }))\n .map(({ result, originalFrame }) => {\n if (result.status === 'rejected') {\n return {\n kind: 'rejected' as const,\n frameText: formatStackFrame(originalFrame),\n codeFrame: null,\n }\n }\n\n const { originalStackFrame, originalCodeFrame } = result.value\n if (originalStackFrame?.ignored && ignore) {\n return {\n kind: 'ignored' as const,\n }\n }\n\n // should we apply this generally to dev overlay (dev overlay does not ignore chrome-extension://)\n if (originalStackFrame?.file?.startsWith('chrome-extension://')) {\n return {\n kind: 'ignored' as const,\n }\n }\n\n return {\n kind: 'success' as const,\n // invariant: if result is not rejected and not ignored, then original stack frame exists\n // verifiable by tracing `getOriginalStackFrame`. The invariant exists because of bad types\n frameText: formatStackFrame(originalStackFrame!),\n codeFrame: originalCodeFrame,\n }\n })\n\n const allIgnored = processedFrames.every(\n (frame) => frame.kind === 'ignored'\n )\n\n // we want to handle **all** ignored vs all/some rejected differently\n // if all are ignored we should show no frames\n // if all are rejected, we want to fallback to showing original stack frames\n if (allIgnored) {\n return {\n kind: 'all-ignored' as const,\n }\n }\n\n const filteredFrames = processedFrames.filter(\n (frame) => frame.kind !== 'ignored'\n )\n\n if (filteredFrames.length === 0) {\n return {\n kind: 'stack' as const,\n stack: stackTrace,\n }\n }\n\n const stackOutput = filteredFrames\n .map((frame) => frame.frameText)\n .join('\\n')\n const firstFrameCode = filteredFrames.find(\n (frame) => frame.codeFrame\n )?.codeFrame\n\n if (firstFrameCode) {\n return {\n kind: 'with-frame-code' as const,\n frameCode: firstFrameCode,\n stack: stackOutput,\n frames: filteredFrames,\n }\n }\n // i don't think this a real case, but good for exhaustion\n return {\n kind: 'mapped-stack' as const,\n stack: stackOutput,\n frames: filteredFrames,\n }\n } catch (error) {\n return {\n kind: 'stack' as const,\n stack: stackTrace,\n }\n }\n}\n\n// todo: cache the actual async call, not the wrapper with post processing\nexport async function getSourceMappedStackFrames(\n stackTrace: string,\n ctx: MappingContext,\n distDir: string,\n ignore = true\n) {\n const cacheKey = `sm_${stackTrace}-${ctx.bundler}-${ctx.isAppDirectory}-${ctx.isEdgeServer}-${ctx.isServer}-${distDir}-${ignore}`\n\n const cacheItem = cache.get(cacheKey)\n if (cacheItem) {\n return cacheItem\n }\n\n const result = await getSourceMappedStackFramesInternal(\n stackTrace,\n ctx,\n distDir,\n ignore\n )\n cache.set(cacheKey, result)\n return result\n}\n\nfunction formatStackFrame(frame: StackFrame): string {\n const functionName = frame.methodName || '<anonymous>'\n const location =\n frame.file && frame.line1\n ? `${frame.file}:${frame.line1}${frame.column1 ? `:${frame.column1}` : ''}`\n : frame.file || '<unknown>'\n\n return ` at ${functionName} (${location})`\n}\n\n// appends the source mapped location of the console method\nexport const withLocation = async (\n {\n original,\n stack,\n }: {\n original: Array<any>\n stack: string | null\n },\n ctx: MappingContext,\n distDir: string,\n config:\n | boolean\n | 'error'\n | 'warn'\n | 'verbose'\n | { level?: 'error' | 'warn' | 'verbose'; showSourceLocation?: boolean }\n) => {\n if (typeof config === 'object' && config.showSourceLocation === false) {\n return original\n }\n if (!stack) {\n return original\n }\n\n const res = await getSourceMappedStackFrames(stack, ctx, distDir)\n const location = getConsoleLocation(res)\n\n if (!location) {\n return original\n }\n\n return [...original, dim(`(${location})`)]\n}\n\nexport const getConsoleLocation = (\n mapped: Awaited<ReturnType<typeof getSourceMappedStackFrames>>\n) => {\n if (mapped.kind !== 'mapped-stack' && mapped.kind !== 'with-frame-code') {\n return null\n }\n\n const first = mapped.frames.at(0)\n\n if (!first) {\n return null\n }\n\n // we don't want to show the name of parent function (at <fn> thing in stack), just source location for minimal noise\n const match = first.frameText.match(/\\(([^)]+)\\)/)\n const locationText = match ? match[1] : first.frameText\n return locationText\n}\n"],"names":["getOriginalStackFrames","getOriginalStackFramesWebpack","getOriginalStackFramesTurbopack","dim","parseStack","path","LRUCache","mapFramesUsingBundler","frames","ctx","bundler","isServer","isEdgeServer","isAppDirectory","clientStats","serverStats","edgeServerStats","rootDirectory","res","project","projectPath","preprocessStackTrace","stackTrace","distDir","split","map","line","match","prefix","location","startsWith","normalizedDistDir","replace","absolutePath","slice","length","fileUrl","resolve","join","cache","getSourceMappedStackFramesInternal","ignore","filteredFrames","normalizedStack","kind","stack","mappingResults","processedFrames","result","index","originalFrame","originalStackFrame","status","frameText","formatStackFrame","codeFrame","originalCodeFrame","value","ignored","file","allIgnored","every","frame","filter","stackOutput","firstFrameCode","find","frameCode","error","getSourceMappedStackFrames","cacheKey","cacheItem","get","set","functionName","methodName","line1","column1","withLocation","original","config","showSourceLocation","getConsoleLocation","mapped","first","at","locationText"],"mappings":"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","ignoreList":[0]}
1
+ {"version":3,"sources":["../../../../../src/server/dev/browser-logs/source-map.ts"],"sourcesContent":["import { getOriginalStackFrames as getOriginalStackFramesWebpack } from '../middleware-webpack'\nimport { getOriginalStackFrames as getOriginalStackFramesTurbopack } from '../middleware-turbopack'\nimport type { Project } from '../../../build/swc/types'\nimport { dim } from '../../../lib/picocolors'\nimport { parseStack, type StackFrame } from '../../lib/parse-stack'\nimport path from 'path'\nimport { LRUCache } from '../../lib/lru-cache'\n\ntype WebpackMappingContext = {\n bundler: 'webpack'\n isServer: boolean\n isEdgeServer: boolean\n isAppDirectory: boolean\n clientStats: () => any\n serverStats: () => any\n edgeServerStats: () => any\n rootDirectory: string\n}\n\ntype TurbopackMappingContext = {\n bundler: 'turbopack'\n isServer: boolean\n isEdgeServer: boolean\n isAppDirectory: boolean\n project: Project\n projectPath: string\n}\n\nexport type MappingContext = WebpackMappingContext | TurbopackMappingContext\n\n// TODO: handle server vs browser error source mapping correctly\nexport async function mapFramesUsingBundler(\n frames: StackFrame[],\n ctx: MappingContext\n) {\n switch (ctx.bundler) {\n case 'webpack': {\n const {\n isServer,\n isEdgeServer,\n isAppDirectory,\n clientStats,\n serverStats,\n edgeServerStats,\n rootDirectory,\n } = ctx\n const res = await getOriginalStackFramesWebpack({\n isServer,\n isEdgeServer,\n isAppDirectory,\n frames,\n clientStats,\n serverStats,\n edgeServerStats,\n rootDirectory,\n })\n return res\n }\n case 'turbopack': {\n const { project, projectPath, isServer, isEdgeServer, isAppDirectory } =\n ctx\n const res = await getOriginalStackFramesTurbopack({\n project,\n projectPath,\n frames,\n isServer,\n isEdgeServer,\n isAppDirectory,\n })\n\n return res\n }\n default: {\n return null!\n }\n }\n}\n\n// converts _next/static/chunks/... to file:///.next/static/chunks/... for parseStack\n// todo: where does next dev overlay handle this case and re-use that logic\nfunction preprocessStackTrace(stackTrace: string, distDir?: string): string {\n return stackTrace\n .split('\\n')\n .map((line) => {\n const match = line.match(/^(\\s*at\\s+.*?)\\s+\\(([^)]+)\\)$/)\n if (match) {\n const [, prefix, location] = match\n\n if (location.startsWith('_next/static/') && distDir) {\n const normalizedDistDir = distDir\n .replace(/\\\\/g, '/')\n .replace(/\\/$/, '')\n\n const absolutePath =\n normalizedDistDir + '/' + location.slice('_next/'.length)\n const fileUrl = `file://${path.resolve(absolutePath)}`\n\n return `${prefix} (${fileUrl})`\n }\n }\n\n return line\n })\n .join('\\n')\n}\n\nconst cache = new LRUCache<\n Awaited<ReturnType<typeof getSourceMappedStackFramesInternal>>\n>(25)\nasync function getSourceMappedStackFramesInternal(\n stackTrace: string,\n ctx: MappingContext,\n distDir: string,\n ignore = true\n) {\n try {\n const normalizedStack = preprocessStackTrace(stackTrace, distDir)\n const frames = parseStack(normalizedStack, distDir)\n\n if (frames.length === 0) {\n return {\n kind: 'stack' as const,\n stack: stackTrace,\n }\n }\n\n const mappingResults = await mapFramesUsingBundler(frames, ctx)\n\n const processedFrames = mappingResults\n .map((result, index) => ({\n result,\n originalFrame: frames[index],\n }))\n .map(({ result, originalFrame }) => {\n if (result.status === 'rejected') {\n return {\n kind: 'rejected' as const,\n frameText: formatStackFrame(originalFrame),\n codeFrame: null,\n }\n }\n\n const { originalStackFrame, originalCodeFrame } = result.value\n if (originalStackFrame?.ignored && ignore) {\n return {\n kind: 'ignored' as const,\n }\n }\n\n // should we apply this generally to dev overlay (dev overlay does not ignore chrome-extension://)\n if (originalStackFrame?.file?.startsWith('chrome-extension://')) {\n return {\n kind: 'ignored' as const,\n }\n }\n\n return {\n kind: 'success' as const,\n // invariant: if result is not rejected and not ignored, then original stack frame exists\n // verifiable by tracing `getOriginalStackFrame`. The invariant exists because of bad types\n frameText: formatStackFrame(originalStackFrame!),\n codeFrame: originalCodeFrame,\n }\n })\n\n const allIgnored = processedFrames.every(\n (frame) => frame.kind === 'ignored'\n )\n\n // we want to handle **all** ignored vs all/some rejected differently\n // if all are ignored we should show no frames\n // if all are rejected, we want to fallback to showing original stack frames\n if (allIgnored) {\n return {\n kind: 'all-ignored' as const,\n }\n }\n\n const filteredFrames = processedFrames.filter(\n (frame) => frame.kind !== 'ignored'\n )\n\n if (filteredFrames.length === 0) {\n return {\n kind: 'stack' as const,\n stack: stackTrace,\n }\n }\n\n const stackOutput = filteredFrames\n .map((frame) => frame.frameText)\n .join('\\n')\n const firstFrameCode = filteredFrames.find(\n (frame) => frame.codeFrame\n )?.codeFrame\n\n if (firstFrameCode) {\n return {\n kind: 'with-frame-code' as const,\n frameCode: firstFrameCode,\n stack: stackOutput,\n frames: filteredFrames,\n }\n }\n // i don't think this a real case, but good for exhaustion\n return {\n kind: 'mapped-stack' as const,\n stack: stackOutput,\n frames: filteredFrames,\n }\n } catch (error) {\n return {\n kind: 'stack' as const,\n stack: stackTrace,\n }\n }\n}\n\n// todo: cache the actual async call, not the wrapper with post processing\nexport async function getSourceMappedStackFrames(\n stackTrace: string,\n ctx: MappingContext,\n distDir: string,\n ignore = true\n) {\n const cacheKey = `sm_${stackTrace}-${ctx.bundler}-${ctx.isAppDirectory}-${ctx.isEdgeServer}-${ctx.isServer}-${distDir}-${ignore}`\n\n const cacheItem = cache.get(cacheKey)\n if (cacheItem) {\n return cacheItem\n }\n\n const result = await getSourceMappedStackFramesInternal(\n stackTrace,\n ctx,\n distDir,\n ignore\n )\n cache.set(cacheKey, result)\n return result\n}\n\nfunction formatStackFrame(frame: StackFrame): string {\n const functionName = frame.methodName || '<anonymous>'\n const location =\n frame.file && frame.line1\n ? `${frame.file}:${frame.line1}${frame.column1 ? `:${frame.column1}` : ''}`\n : frame.file || '<unknown>'\n\n return ` at ${functionName} (${location})`\n}\n\n// appends the source mapped location of the console method\nexport const withLocation = async (\n {\n original,\n stack,\n }: {\n original: Array<any>\n stack: string | null\n },\n ctx: MappingContext,\n distDir: string,\n _config: boolean | 'error' | 'warn'\n) => {\n if (!stack) {\n return original\n }\n\n const res = await getSourceMappedStackFrames(stack, ctx, distDir)\n const location = getConsoleLocation(res)\n\n if (!location) {\n return original\n }\n\n return [...original, dim(`(${location})`)]\n}\n\nexport const getConsoleLocation = (\n mapped: Awaited<ReturnType<typeof getSourceMappedStackFrames>>\n) => {\n if (mapped.kind !== 'mapped-stack' && mapped.kind !== 'with-frame-code') {\n return null\n }\n\n const first = mapped.frames.at(0)\n\n if (!first) {\n return null\n }\n\n // we don't want to show the name of parent function (at <fn> thing in stack), just source location for minimal noise\n const match = first.frameText.match(/\\(([^)]+)\\)/)\n const locationText = match ? match[1] : first.frameText\n return locationText\n}\n"],"names":["getOriginalStackFrames","getOriginalStackFramesWebpack","getOriginalStackFramesTurbopack","dim","parseStack","path","LRUCache","mapFramesUsingBundler","frames","ctx","bundler","isServer","isEdgeServer","isAppDirectory","clientStats","serverStats","edgeServerStats","rootDirectory","res","project","projectPath","preprocessStackTrace","stackTrace","distDir","split","map","line","match","prefix","location","startsWith","normalizedDistDir","replace","absolutePath","slice","length","fileUrl","resolve","join","cache","getSourceMappedStackFramesInternal","ignore","filteredFrames","normalizedStack","kind","stack","mappingResults","processedFrames","result","index","originalFrame","originalStackFrame","status","frameText","formatStackFrame","codeFrame","originalCodeFrame","value","ignored","file","allIgnored","every","frame","filter","stackOutput","firstFrameCode","find","frameCode","error","getSourceMappedStackFrames","cacheKey","cacheItem","get","set","functionName","methodName","line1","column1","withLocation","original","_config","getConsoleLocation","mapped","first","at","locationText"],"mappings":"AAAA,SAASA,0BAA0BC,6BAA6B,QAAQ,wBAAuB;AAC/F,SAASD,0BAA0BE,+BAA+B,QAAQ,0BAAyB;AAEnG,SAASC,GAAG,QAAQ,0BAAyB;AAC7C,SAASC,UAAU,QAAyB,wBAAuB;AACnE,OAAOC,UAAU,OAAM;AACvB,SAASC,QAAQ,QAAQ,sBAAqB;AAwB9C,gEAAgE;AAChE,OAAO,eAAeC,sBACpBC,MAAoB,EACpBC,GAAmB;IAEnB,OAAQA,IAAIC,OAAO;QACjB,KAAK;YAAW;gBACd,MAAM,EACJC,QAAQ,EACRC,YAAY,EACZC,cAAc,EACdC,WAAW,EACXC,WAAW,EACXC,eAAe,EACfC,aAAa,EACd,GAAGR;gBACJ,MAAMS,MAAM,MAAMjB,8BAA8B;oBAC9CU;oBACAC;oBACAC;oBACAL;oBACAM;oBACAC;oBACAC;oBACAC;gBACF;gBACA,OAAOC;YACT;QACA,KAAK;YAAa;gBAChB,MAAM,EAAEC,OAAO,EAAEC,WAAW,EAAET,QAAQ,EAAEC,YAAY,EAAEC,cAAc,EAAE,GACpEJ;gBACF,MAAMS,MAAM,MAAMhB,gCAAgC;oBAChDiB;oBACAC;oBACAZ;oBACAG;oBACAC;oBACAC;gBACF;gBAEA,OAAOK;YACT;QACA;YAAS;gBACP,OAAO;YACT;IACF;AACF;AAEA,qFAAqF;AACrF,2EAA2E;AAC3E,SAASG,qBAAqBC,UAAkB,EAAEC,OAAgB;IAChE,OAAOD,WACJE,KAAK,CAAC,MACNC,GAAG,CAAC,CAACC;QACJ,MAAMC,QAAQD,KAAKC,KAAK,CAAC;QACzB,IAAIA,OAAO;YACT,MAAM,GAAGC,QAAQC,SAAS,GAAGF;YAE7B,IAAIE,SAASC,UAAU,CAAC,oBAAoBP,SAAS;gBACnD,MAAMQ,oBAAoBR,QACvBS,OAAO,CAAC,OAAO,KACfA,OAAO,CAAC,OAAO;gBAElB,MAAMC,eACJF,oBAAoB,MAAMF,SAASK,KAAK,CAAC,SAASC,MAAM;gBAC1D,MAAMC,UAAU,CAAC,OAAO,EAAE/B,KAAKgC,OAAO,CAACJ,eAAe;gBAEtD,OAAO,GAAGL,OAAO,EAAE,EAAEQ,QAAQ,CAAC,CAAC;YACjC;QACF;QAEA,OAAOV;IACT,GACCY,IAAI,CAAC;AACV;AAEA,MAAMC,QAAQ,IAAIjC,SAEhB;AACF,eAAekC,mCACblB,UAAkB,EAClBb,GAAmB,EACnBc,OAAe,EACfkB,SAAS,IAAI;IAEb,IAAI;YA6EqBC;QA5EvB,MAAMC,kBAAkBtB,qBAAqBC,YAAYC;QACzD,MAAMf,SAASJ,WAAWuC,iBAAiBpB;QAE3C,IAAIf,OAAO2B,MAAM,KAAK,GAAG;YACvB,OAAO;gBACLS,MAAM;gBACNC,OAAOvB;YACT;QACF;QAEA,MAAMwB,iBAAiB,MAAMvC,sBAAsBC,QAAQC;QAE3D,MAAMsC,kBAAkBD,eACrBrB,GAAG,CAAC,CAACuB,QAAQC,QAAW,CAAA;gBACvBD;gBACAE,eAAe1C,MAAM,CAACyC,MAAM;YAC9B,CAAA,GACCxB,GAAG,CAAC,CAAC,EAAEuB,MAAM,EAAEE,aAAa,EAAE;gBAiBzBC;YAhBJ,IAAIH,OAAOI,MAAM,KAAK,YAAY;gBAChC,OAAO;oBACLR,MAAM;oBACNS,WAAWC,iBAAiBJ;oBAC5BK,WAAW;gBACb;YACF;YAEA,MAAM,EAAEJ,kBAAkB,EAAEK,iBAAiB,EAAE,GAAGR,OAAOS,KAAK;YAC9D,IAAIN,CAAAA,sCAAAA,mBAAoBO,OAAO,KAAIjB,QAAQ;gBACzC,OAAO;oBACLG,MAAM;gBACR;YACF;YAEA,kGAAkG;YAClG,IAAIO,uCAAAA,2BAAAA,mBAAoBQ,IAAI,qBAAxBR,yBAA0BrB,UAAU,CAAC,wBAAwB;gBAC/D,OAAO;oBACLc,MAAM;gBACR;YACF;YAEA,OAAO;gBACLA,MAAM;gBACN,yFAAyF;gBACzF,2FAA2F;gBAC3FS,WAAWC,iBAAiBH;gBAC5BI,WAAWC;YACb;QACF;QAEF,MAAMI,aAAab,gBAAgBc,KAAK,CACtC,CAACC,QAAUA,MAAMlB,IAAI,KAAK;QAG5B,qEAAqE;QACrE,8CAA8C;QAC9C,4EAA4E;QAC5E,IAAIgB,YAAY;YACd,OAAO;gBACLhB,MAAM;YACR;QACF;QAEA,MAAMF,iBAAiBK,gBAAgBgB,MAAM,CAC3C,CAACD,QAAUA,MAAMlB,IAAI,KAAK;QAG5B,IAAIF,eAAeP,MAAM,KAAK,GAAG;YAC/B,OAAO;gBACLS,MAAM;gBACNC,OAAOvB;YACT;QACF;QAEA,MAAM0C,cAActB,eACjBjB,GAAG,CAAC,CAACqC,QAAUA,MAAMT,SAAS,EAC9Bf,IAAI,CAAC;QACR,MAAM2B,kBAAiBvB,uBAAAA,eAAewB,IAAI,CACxC,CAACJ,QAAUA,MAAMP,SAAS,sBADLb,qBAEpBa,SAAS;QAEZ,IAAIU,gBAAgB;YAClB,OAAO;gBACLrB,MAAM;gBACNuB,WAAWF;gBACXpB,OAAOmB;gBACPxD,QAAQkC;YACV;QACF;QACA,0DAA0D;QAC1D,OAAO;YACLE,MAAM;YACNC,OAAOmB;YACPxD,QAAQkC;QACV;IACF,EAAE,OAAO0B,OAAO;QACd,OAAO;YACLxB,MAAM;YACNC,OAAOvB;QACT;IACF;AACF;AAEA,0EAA0E;AAC1E,OAAO,eAAe+C,2BACpB/C,UAAkB,EAClBb,GAAmB,EACnBc,OAAe,EACfkB,SAAS,IAAI;IAEb,MAAM6B,WAAW,CAAC,GAAG,EAAEhD,WAAW,CAAC,EAAEb,IAAIC,OAAO,CAAC,CAAC,EAAED,IAAII,cAAc,CAAC,CAAC,EAAEJ,IAAIG,YAAY,CAAC,CAAC,EAAEH,IAAIE,QAAQ,CAAC,CAAC,EAAEY,QAAQ,CAAC,EAAEkB,QAAQ;IAEjI,MAAM8B,YAAYhC,MAAMiC,GAAG,CAACF;IAC5B,IAAIC,WAAW;QACb,OAAOA;IACT;IAEA,MAAMvB,SAAS,MAAMR,mCACnBlB,YACAb,KACAc,SACAkB;IAEFF,MAAMkC,GAAG,CAACH,UAAUtB;IACpB,OAAOA;AACT;AAEA,SAASM,iBAAiBQ,KAAiB;IACzC,MAAMY,eAAeZ,MAAMa,UAAU,IAAI;IACzC,MAAM9C,WACJiC,MAAMH,IAAI,IAAIG,MAAMc,KAAK,GACrB,GAAGd,MAAMH,IAAI,CAAC,CAAC,EAAEG,MAAMc,KAAK,GAAGd,MAAMe,OAAO,GAAG,CAAC,CAAC,EAAEf,MAAMe,OAAO,EAAE,GAAG,IAAI,GACzEf,MAAMH,IAAI,IAAI;IAEpB,OAAO,CAAC,OAAO,EAAEe,aAAa,EAAE,EAAE7C,SAAS,CAAC,CAAC;AAC/C;AAEA,2DAA2D;AAC3D,OAAO,MAAMiD,eAAe,OAC1B,EACEC,QAAQ,EACRlC,KAAK,EAIN,EACDpC,KACAc,SACAyD;IAEA,IAAI,CAACnC,OAAO;QACV,OAAOkC;IACT;IAEA,MAAM7D,MAAM,MAAMmD,2BAA2BxB,OAAOpC,KAAKc;IACzD,MAAMM,WAAWoD,mBAAmB/D;IAEpC,IAAI,CAACW,UAAU;QACb,OAAOkD;IACT;IAEA,OAAO;WAAIA;QAAU5E,IAAI,CAAC,CAAC,EAAE0B,SAAS,CAAC,CAAC;KAAE;AAC5C,EAAC;AAED,OAAO,MAAMoD,qBAAqB,CAChCC;IAEA,IAAIA,OAAOtC,IAAI,KAAK,kBAAkBsC,OAAOtC,IAAI,KAAK,mBAAmB;QACvE,OAAO;IACT;IAEA,MAAMuC,QAAQD,OAAO1E,MAAM,CAAC4E,EAAE,CAAC;IAE/B,IAAI,CAACD,OAAO;QACV,OAAO;IACT;IAEA,qHAAqH;IACrH,MAAMxD,QAAQwD,MAAM9B,SAAS,CAAC1B,KAAK,CAAC;IACpC,MAAM0D,eAAe1D,QAAQA,KAAK,CAAC,EAAE,GAAGwD,MAAM9B,SAAS;IACvD,OAAOgC;AACT,EAAC","ignoreList":[0]}
@@ -97,7 +97,7 @@ export async function createHotReloaderTurbopack(opts, serverFields, distDir, re
97
97
  }
98
98
  const hasRewrites = opts.fsChecker.rewrites.afterFiles.length > 0 || opts.fsChecker.rewrites.beforeFiles.length > 0 || opts.fsChecker.rewrites.fallback.length > 0;
99
99
  const hotReloaderSpan = trace('hot-reloader', undefined, {
100
- version: "16.2.0-canary.1"
100
+ version: "16.2.0-canary.2"
101
101
  });
102
102
  // Ensure the hotReloaderSpan is flushed immediately as it's the parentSpan for all processing
103
103
  // of the current `next dev` invocation.
@@ -731,7 +731,8 @@ export async function createHotReloaderTurbopack(opts, serverFields, distDir, re
731
731
  break;
732
732
  case 'browser-logs':
733
733
  {
734
- if (nextConfig.experimental.browserDebugInfoInTerminal) {
734
+ const browserToTerminalConfig = nextConfig.logging && nextConfig.logging.browserToTerminal;
735
+ if (browserToTerminalConfig) {
735
736
  await receiveBrowserLogsTurbopack({
736
737
  entries: parsedData.entries,
737
738
  router: parsedData.router,
@@ -739,7 +740,7 @@ export async function createHotReloaderTurbopack(opts, serverFields, distDir, re
739
740
  project,
740
741
  projectPath,
741
742
  distDir,
742
- config: nextConfig.experimental.browserDebugInfoInTerminal
743
+ config: browserToTerminalConfig
743
744
  });
744
745
  }
745
746
  break;