Files
klz-cables.com/.pnpm-store/v10/files/40/56669a4cce109d18dcecf78064ef5cc4fad9f9eb1e5d29829b24dd188e708f47dac4b1004ee3ee6e5d4e1db03b4fc613daa0b238e91caa47a2a26cc40c818c
Marc Mintel 5397309103
Some checks failed
Build & Deploy / 🔍 Prepare (push) Successful in 20s
Build & Deploy / 🧪 QA (push) Failing after 34s
Build & Deploy / 🏗️ Build (push) Has started running
Build & Deploy / 🚀 Deploy (push) Has been cancelled
Build & Deploy / 🧪 Smoke Test (push) Has been cancelled
Build & Deploy / ⚡ Lighthouse (push) Has been cancelled
Build & Deploy / 🔔 Notify (push) Has been cancelled
fix(products): fix breadcrumbs and product filtering (backport from main)
2026-02-24 16:04:21 +01:00

1 line
18 KiB
Plaintext

{"version":3,"file":"devErrorSymbolicationEventProcessor.js","sources":["../../../src/common/devErrorSymbolicationEventProcessor.ts"],"sourcesContent":["import type { Event, EventHint } from '@sentry/core';\nimport { debug, GLOBAL_OBJ, parseSemver, suppressTracing } from '@sentry/core';\nimport type { StackFrame } from 'stacktrace-parser';\nimport * as stackTraceParser from 'stacktrace-parser';\nimport { DEBUG_BUILD } from './debug-build';\n\ntype OriginalStackFrameResponse = {\n originalStackFrame: StackFrame;\n originalCodeFrame: string | null;\n sourcePackage?: string;\n};\n\nconst globalWithInjectedValues = GLOBAL_OBJ as typeof GLOBAL_OBJ & {\n _sentryBasePath?: string;\n _sentryNextJsVersion: string | undefined;\n};\n\n/**\n * Constructs the base URL for the Next.js dev server, including the port and base path.\n * Returns only the base path when running in the browser (client-side) for relative URLs.\n */\nfunction getDevServerBaseUrl(): string {\n let basePath = process.env._sentryBasePath ?? globalWithInjectedValues._sentryBasePath ?? '';\n\n // Prefix the basepath with a slash if it doesn't have one\n if (basePath !== '' && !basePath.match(/^\\//)) {\n basePath = `/${basePath}`;\n }\n\n // eslint-disable-next-line no-restricted-globals\n if (typeof window !== 'undefined') {\n return basePath;\n }\n\n const devServerPort = process.env.PORT || '3000';\n return `http://localhost:${devServerPort}${basePath}`;\n}\n\n/**\n * Fetches a URL with a 3-second timeout using AbortController.\n */\nasync function fetchWithTimeout(url: string, options: RequestInit = {}): Promise<Response> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), 3000);\n\n return suppressTracing(() =>\n fetch(url, {\n ...options,\n signal: controller.signal,\n }).finally(() => {\n clearTimeout(timer);\n }),\n );\n}\n\n/**\n * Event processor that will symbolicate errors by using the webpack/nextjs dev server that is used to show stack traces\n * in the dev overlay.\n */\nexport async function devErrorSymbolicationEventProcessor(event: Event, hint: EventHint): Promise<Event | null> {\n // Filter out spans for requests resolving source maps for stack frames in dev mode\n if (event.type === 'transaction') {\n event.spans = event.spans?.filter(span => {\n const httpUrlAttribute: unknown = span.data?.['http.url'];\n if (typeof httpUrlAttribute === 'string') {\n return !httpUrlAttribute.includes('__nextjs_original-stack-frame'); // could also be __nextjs_original-stack-frames (plural)\n }\n\n return true;\n });\n }\n\n // Due to changes across Next.js versions, there are a million things that can go wrong here so we just try-catch the\n // entire event processor. Symbolicated stack traces are just a nice to have.\n try {\n if (hint.originalException && hint.originalException instanceof Error && hint.originalException.stack) {\n const frames = stackTraceParser.parse(hint.originalException.stack);\n const nextJsVersion = globalWithInjectedValues._sentryNextJsVersion;\n\n // If we for whatever reason don't have a Next.js version,\n // we don't want to symbolicate as this previously lead to infinite loops\n if (!nextJsVersion) {\n return event;\n }\n\n const parsedNextjsVersion = parseSemver(nextJsVersion);\n\n let resolvedFrames: ({\n originalCodeFrame: string | null;\n originalStackFrame: (StackFrame & { line1?: number; column1?: number }) | null;\n } | null)[];\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (parsedNextjsVersion.major! > 15 || (parsedNextjsVersion.major === 15 && parsedNextjsVersion.minor! >= 2)) {\n const r = await resolveStackFrames(frames);\n if (r === null) {\n return event;\n }\n resolvedFrames = r;\n } else {\n resolvedFrames = await Promise.all(\n frames.map(frame => resolveStackFrame(frame, hint.originalException as Error)),\n );\n }\n\n if (event.exception?.values?.[0]?.stacktrace?.frames) {\n event.exception.values[0].stacktrace.frames = event.exception.values[0].stacktrace.frames.map(\n (frame, i, frames) => {\n const resolvedFrame = resolvedFrames[frames.length - 1 - i];\n if (!resolvedFrame?.originalStackFrame || !resolvedFrame.originalCodeFrame) {\n return {\n ...frame,\n platform: frame.filename?.startsWith('node:internal') ? 'nodejs' : undefined, // simple hack that will prevent a source mapping error from showing up\n in_app: false,\n };\n }\n\n const { contextLine, preContextLines, postContextLines } = parseOriginalCodeFrame(\n resolvedFrame.originalCodeFrame,\n );\n\n return {\n ...frame,\n pre_context: preContextLines,\n context_line: contextLine,\n post_context: postContextLines,\n function: resolvedFrame.originalStackFrame.methodName,\n filename: resolvedFrame.originalStackFrame.file\n ? stripWebpackInternalPrefix(resolvedFrame.originalStackFrame.file)\n : undefined,\n lineno:\n resolvedFrame.originalStackFrame.lineNumber || resolvedFrame.originalStackFrame.line1 || undefined,\n colno: resolvedFrame.originalStackFrame.column || resolvedFrame.originalStackFrame.column1 || undefined,\n };\n },\n );\n }\n }\n } catch {\n return event;\n }\n\n return event;\n}\n\nasync function resolveStackFrame(\n frame: StackFrame,\n error: Error,\n): Promise<{ originalCodeFrame: string | null; originalStackFrame: StackFrame | null } | null> {\n try {\n if (!(frame.file?.startsWith('webpack-internal:') || frame.file?.startsWith('file:'))) {\n return null;\n }\n\n const params = new URLSearchParams();\n params.append('isServer', String(false)); // doesn't matter since it is overwritten by isAppDirectory\n params.append('isEdgeServer', String(false)); // doesn't matter since it is overwritten by isAppDirectory\n params.append('isAppDirectory', String(true)); // will force server to do more thorough checking\n params.append('errorMessage', error.toString());\n Object.keys(frame).forEach(key => {\n params.append(key, (frame[key as keyof typeof frame] ?? '').toString());\n });\n\n const baseUrl = getDevServerBaseUrl();\n const res = await fetchWithTimeout(`${baseUrl}/__nextjs_original-stack-frame?${params.toString()}`);\n\n if (!res.ok || res.status === 204) {\n return null;\n }\n\n const body: OriginalStackFrameResponse = await res.json();\n\n return {\n originalCodeFrame: body.originalCodeFrame,\n originalStackFrame: body.originalStackFrame,\n };\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to symbolicate event with Next.js dev server', e);\n return null;\n }\n}\n\nasync function resolveStackFrames(\n frames: StackFrame[],\n): Promise<{ originalCodeFrame: string | null; originalStackFrame: StackFrame | null }[] | null> {\n try {\n const postBody = {\n frames: frames\n .filter(frame => {\n return !!frame.file;\n })\n .map(frame => {\n // https://github.com/vercel/next.js/blob/df0573a478baa8b55478a7963c473dddd59a5e40/packages/next/src/client/components/react-dev-overlay/server/middleware-turbopack.ts#L129\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n frame.file = frame.file!.replace(/^rsc:\\/\\/React\\/[^/]+\\//, '').replace(/\\?\\d+$/, '');\n\n return {\n file: frame.file,\n methodName: frame.methodName ?? '<unknown>',\n arguments: [],\n lineNumber: frame.lineNumber ?? 0,\n column: frame.column ?? 0,\n line1: frame.lineNumber ?? 0,\n column1: frame.column ?? 0,\n };\n }),\n isServer: false,\n isEdgeServer: false,\n isAppDirectory: true,\n };\n\n const baseUrl = getDevServerBaseUrl();\n const res = await fetchWithTimeout(`${baseUrl}/__nextjs_original-stack-frames`, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify(postBody),\n });\n\n if (!res.ok || res.status === 204) {\n return null;\n }\n\n const body: { value: OriginalStackFrameResponse }[] = await res.json();\n\n return body.map(frame => {\n return {\n originalCodeFrame: frame.value.originalCodeFrame,\n originalStackFrame: frame.value.originalStackFrame,\n };\n });\n } catch (e) {\n DEBUG_BUILD && debug.error('Failed to symbolicate event with Next.js dev server', e);\n return null;\n }\n}\n\nfunction parseOriginalCodeFrame(codeFrame: string): {\n contextLine: string | undefined;\n preContextLines: string[];\n postContextLines: string[];\n} {\n const preProcessedLines = codeFrame\n // Remove ASCII control characters that are used for syntax highlighting\n .replace(\n // eslint-disable-next-line no-control-regex\n /[\\u001b\\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g, // https://stackoverflow.com/a/29497680\n '',\n )\n .split('\\n')\n // Remove line that is supposed to indicate where the error happened\n .filter(line => !line.match(/^\\s*\\|/))\n // Find the error line\n .map(line => ({\n line,\n isErrorLine: !!line.match(/^>/),\n }))\n // Remove the leading part that is just for prettier output\n .map(lineObj => ({\n ...lineObj,\n line: lineObj.line.replace(/^.*\\|/, ''),\n }));\n\n const preContextLines = [];\n let contextLine: string | undefined = undefined;\n const postContextLines = [];\n\n let reachedContextLine = false;\n\n for (const preProcessedLine of preProcessedLines) {\n if (preProcessedLine.isErrorLine) {\n contextLine = preProcessedLine.line;\n reachedContextLine = true;\n } else if (reachedContextLine) {\n postContextLines.push(preProcessedLine.line);\n } else {\n preContextLines.push(preProcessedLine.line);\n }\n }\n\n return {\n contextLine,\n preContextLines,\n postContextLines,\n };\n}\n\n/**\n * Strips webpack-internal prefixes from filenames to clean up stack traces.\n *\n * Examples:\n * - \"webpack-internal:///./components/file.tsx\" -> \"./components/file.tsx\"\n * - \"webpack-internal:///(app-pages-browser)/./components/file.tsx\" -> \"./components/file.tsx\"\n */\nfunction stripWebpackInternalPrefix(filename: string): string | undefined {\n if (!filename) {\n return filename;\n }\n\n const webpackInternalRegex = /^webpack-internal:(?:\\/+)?(?:\\([^)]*\\)\\/)?(.+)$/;\n const match = filename.match(webpackInternalRegex);\n\n return match ? match[1] : filename;\n}\n"],"names":["GLOBAL_OBJ","suppressTracing","parseSemver","DEBUG_BUILD","debug"],"mappings":"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"}