Files
klz-cables.com/.pnpm-store/v10/files/74/a5df56a32faea9bfa7d7d86e4a3cb73a91ca33eb58f04f67718505a195f863636a29c42234ead929c8c98b2060c53b5900c13bc71c912a4f243cd1915da7de
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":"appRouterRoutingInstrumentation.js","sources":["../../../../src/client/routing/appRouterRoutingInstrumentation.ts"],"sourcesContent":["import type { Client, Span } from '@sentry/core';\nimport {\n browserPerformanceTimeOrigin,\n GLOBAL_OBJ,\n SEMANTIC_ATTRIBUTE_SENTRY_OP,\n SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN,\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n} from '@sentry/core';\nimport { startBrowserTracingNavigationSpan, startBrowserTracingPageLoadSpan, WINDOW } from '@sentry/react';\nimport { maybeParameterizeRoute } from './parameterization';\n\nexport const INCOMPLETE_APP_ROUTER_INSTRUMENTATION_TRANSACTION_NAME = 'incomplete-app-router-transaction';\n\n/**\n * This mutable keeps track of what router navigation instrumentation mechanism we are using.\n *\n * The default one is 'router-patch' which is a way of instrumenting that worked up until Next.js 15.3.0 was released.\n * For this method we took the global router instance and simply monkey patched all the router methods like push(), replace(), and so on.\n * This worked because Next.js itself called the router methods for things like the <Link /> component.\n * Vercel decided that it is not good to call these public API methods from within the framework so they switched to an internal system that completely bypasses our monkey patching. This happened in 15.3.0.\n *\n * We raised with Vercel that this breaks our SDK so together with them we came up with an API for `instrumentation-client.ts` called `onRouterTransitionStart` that is called whenever a navigation is kicked off.\n *\n * Now we have the problem of version compatibility.\n * For older Next.js versions we cannot use the new hook so we need to always patch the router.\n * For newer Next.js versions we cannot know whether the user actually registered our handler for the `onRouterTransitionStart` hook, so we need to wait until it was called at least once before switching the instrumentation mechanism.\n * The problem is, that the user may still have registered a hook and then call a patched router method.\n * First, the monkey patched router method will be called, starting a navigation span, then the hook will also called.\n * We need to handle this case and not create two separate navigation spans but instead update the current navigation span and then switch to the new instrumentation mode.\n * This is all denoted by this `navigationRoutingMode` variable.\n */\nlet navigationRoutingMode: 'router-patch' | 'transition-start-hook' = 'router-patch';\n\nconst currentRouterPatchingNavigationSpanRef: NavigationSpanRef = { current: undefined };\n\n/** Instruments the Next.js app router for pageloads. */\nexport function appRouterInstrumentPageLoad(client: Client): void {\n const parameterizedPathname = maybeParameterizeRoute(WINDOW.location.pathname);\n const origin = browserPerformanceTimeOrigin();\n startBrowserTracingPageLoadSpan(client, {\n name: parameterizedPathname ?? WINDOW.location.pathname,\n // pageload should always start at timeOrigin (and needs to be in s, not ms)\n startTime: origin ? origin / 1000 : undefined,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'pageload',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.pageload.nextjs.app_router_instrumentation',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: parameterizedPathname ? 'route' : 'url',\n },\n });\n}\n\ninterface NavigationSpanRef {\n current: Span | undefined;\n}\n\ninterface NextRouter {\n back: () => void;\n forward: () => void;\n push: (target: string) => void;\n replace: (target: string) => void;\n}\n\n// Yes, yes, I know we shouldn't depend on these internals. But that's where we are at. We write the ugly code, so you don't have to.\nconst GLOBAL_OBJ_WITH_NEXT_ROUTER = GLOBAL_OBJ as typeof GLOBAL_OBJ & {\n // Available until 13.4.4-canary.3 - https://github.com/vercel/next.js/pull/50210\n nd?: {\n router?: NextRouter;\n };\n // Available from 13.4.4-canary.4 - https://github.com/vercel/next.js/pull/50210\n next?: {\n router?: NextRouter;\n };\n};\n\nconst globalWithInjectedBasePath = GLOBAL_OBJ as typeof GLOBAL_OBJ & {\n _sentryBasePath: string | undefined;\n};\n\n/*\n * The routing instrumentation needs to handle a few cases:\n * - Router operations:\n * - router.push() (either explicitly called or implicitly through <Link /> tags)\n * - router.replace() (either explicitly called or implicitly through <Link replace /> tags)\n * - router.back()\n * - router.forward()\n * - Browser operations:\n * - native Browser-back / popstate event (implicitly called by router.back())\n * - native Browser-forward / popstate event (implicitly called by router.forward())\n */\n\n/** Instruments the Next.js app router for navigation. */\nexport function appRouterInstrumentNavigation(client: Client): void {\n routerTransitionHandler = (href, navigationType) => {\n const basePath = process.env._sentryBasePath ?? globalWithInjectedBasePath._sentryBasePath;\n const normalizedHref = basePath && !href.startsWith(basePath) ? `${basePath}${href}` : href;\n const unparameterizedPathname = new URL(normalizedHref, WINDOW.location.href).pathname;\n const parameterizedPathname = maybeParameterizeRoute(unparameterizedPathname);\n const pathname = parameterizedPathname ?? unparameterizedPathname;\n\n if (navigationRoutingMode === 'router-patch') {\n navigationRoutingMode = 'transition-start-hook';\n }\n\n const currentNavigationSpan = currentRouterPatchingNavigationSpanRef.current;\n if (currentNavigationSpan) {\n currentNavigationSpan.updateName(pathname);\n currentNavigationSpan.setAttributes({\n 'navigation.type': `router.${navigationType}`,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: parameterizedPathname ? 'route' : 'url',\n });\n currentRouterPatchingNavigationSpanRef.current = undefined;\n } else {\n startBrowserTracingNavigationSpan(client, {\n name: pathname,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.nextjs.app_router_instrumentation',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: parameterizedPathname ? 'route' : 'url',\n 'navigation.type': `router.${navigationType}`,\n },\n });\n }\n };\n\n WINDOW.addEventListener('popstate', () => {\n const parameterizedPathname = maybeParameterizeRoute(WINDOW.location.pathname);\n if (currentRouterPatchingNavigationSpanRef.current?.isRecording()) {\n currentRouterPatchingNavigationSpanRef.current.updateName(parameterizedPathname ?? WINDOW.location.pathname);\n currentRouterPatchingNavigationSpanRef.current.setAttribute(\n SEMANTIC_ATTRIBUTE_SENTRY_SOURCE,\n parameterizedPathname ? 'route' : 'url',\n );\n } else {\n currentRouterPatchingNavigationSpanRef.current = startBrowserTracingNavigationSpan(client, {\n name: parameterizedPathname ?? WINDOW.location.pathname,\n attributes: {\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.nextjs.app_router_instrumentation',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: parameterizedPathname ? 'route' : 'url',\n 'navigation.type': 'browser.popstate',\n },\n });\n }\n });\n\n let routerPatched = false;\n let triesToFindRouter = 0;\n const MAX_TRIES_TO_FIND_ROUTER = 500;\n const ROUTER_AVAILABILITY_CHECK_INTERVAL_MS = 20;\n const checkForRouterAvailabilityInterval = setInterval(() => {\n triesToFindRouter++;\n const router = GLOBAL_OBJ_WITH_NEXT_ROUTER?.next?.router ?? GLOBAL_OBJ_WITH_NEXT_ROUTER?.nd?.router;\n\n if (routerPatched || triesToFindRouter > MAX_TRIES_TO_FIND_ROUTER) {\n clearInterval(checkForRouterAvailabilityInterval);\n } else if (router) {\n clearInterval(checkForRouterAvailabilityInterval);\n routerPatched = true;\n\n patchRouter(client, router, currentRouterPatchingNavigationSpanRef);\n\n // If the router at any point gets overridden - patch again\n (['nd', 'next'] as const).forEach(globalValueName => {\n const globalValue = GLOBAL_OBJ_WITH_NEXT_ROUTER[globalValueName];\n if (globalValue) {\n GLOBAL_OBJ_WITH_NEXT_ROUTER[globalValueName] = new Proxy(globalValue, {\n set(target, p, newValue) {\n if (p === 'router' && typeof newValue === 'object' && newValue !== null) {\n patchRouter(client, newValue, currentRouterPatchingNavigationSpanRef);\n }\n\n // @ts-expect-error we cannot possibly type this\n target[p] = newValue;\n return true;\n },\n });\n }\n });\n }\n }, ROUTER_AVAILABILITY_CHECK_INTERVAL_MS);\n}\n\nfunction transactionNameifyRouterArgument(target: string): string {\n try {\n // We provide an arbitrary base because we only care about the pathname and it makes URL parsing more resilient.\n return new URL(target, 'http://example.com/').pathname;\n } catch {\n return '/';\n }\n}\n\nconst patchedRouters = new WeakSet<NextRouter>();\n\nfunction patchRouter(client: Client, router: NextRouter, currentNavigationSpanRef: NavigationSpanRef): void {\n if (patchedRouters.has(router)) {\n return;\n }\n patchedRouters.add(router);\n\n (['back', 'forward', 'push', 'replace'] as const).forEach(routerFunctionName => {\n if (router?.[routerFunctionName]) {\n // @ts-expect-error Weird type error related to not knowing how to associate return values with the individual functions - we can just ignore\n router[routerFunctionName] = new Proxy(router[routerFunctionName], {\n apply(target, thisArg, argArray) {\n if (navigationRoutingMode !== 'router-patch') {\n return target.apply(thisArg, argArray);\n }\n\n let transactionName = INCOMPLETE_APP_ROUTER_INSTRUMENTATION_TRANSACTION_NAME;\n const transactionAttributes: Record<string, string> = {\n [SEMANTIC_ATTRIBUTE_SENTRY_OP]: 'navigation',\n [SEMANTIC_ATTRIBUTE_SENTRY_ORIGIN]: 'auto.navigation.nextjs.app_router_instrumentation',\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: 'url',\n };\n\n const href = argArray[0];\n const basePath = process.env._sentryBasePath ?? globalWithInjectedBasePath._sentryBasePath;\n const normalizedHref =\n basePath && typeof href === 'string' && !href.startsWith(basePath) ? `${basePath}${href}` : href;\n if (routerFunctionName === 'push') {\n transactionName = transactionNameifyRouterArgument(normalizedHref);\n transactionAttributes['navigation.type'] = 'router.push';\n } else if (routerFunctionName === 'replace') {\n transactionName = transactionNameifyRouterArgument(normalizedHref);\n transactionAttributes['navigation.type'] = 'router.replace';\n } else if (routerFunctionName === 'back') {\n transactionAttributes['navigation.type'] = 'router.back';\n } else if (routerFunctionName === 'forward') {\n transactionAttributes['navigation.type'] = 'router.forward';\n }\n\n const parameterizedPathname = maybeParameterizeRoute(transactionName);\n\n currentNavigationSpanRef.current = startBrowserTracingNavigationSpan(client, {\n name: parameterizedPathname ?? transactionName,\n attributes: {\n ...transactionAttributes,\n [SEMANTIC_ATTRIBUTE_SENTRY_SOURCE]: parameterizedPathname ? 'route' : 'url',\n },\n });\n\n return target.apply(thisArg, argArray);\n },\n });\n }\n });\n}\n\nlet routerTransitionHandler: undefined | ((href: string, navigationType: string) => void) = undefined;\n\n/**\n * A handler for Next.js' `onRouterTransitionStart` hook in `instrumentation-client.ts` to record navigation spans in Sentry.\n */\nexport function captureRouterTransitionStart(href: string, navigationType: string): void {\n if (routerTransitionHandler) {\n routerTransitionHandler(href, navigationType);\n }\n}\n"],"names":[],"mappings":"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"}