From c923cacc2c333db1cb1c01c40b265218b3b513d6 Mon Sep 17 00:00:00 2001 From: Charly Gomez Date: Wed, 4 Feb 2026 15:19:01 +0100 Subject: [PATCH 1/6] bump? --- .eslintignore | 1 - .eslintrc.js | 10 - .../data-forwarding/amazon-sqs/index.mdx | 6 +- .../data-forwarding/grafana/index.mdx | 5 +- .../integrations/data-forwarding/index.mdx | 5 +- .../data-forwarding/segment/index.mdx | 6 +- .../data-forwarding/splunk/index.mdx | 6 +- .../new-monitors-and-alerts/alerts/index.mdx | 2 +- .../alerts/notifications/index.mdx | 2 +- .../notifications/notification-settings.mdx | 3 +- .../alerts-backend-insights-migration.mdx | 3 +- .../monitors/index.mdx | 7 +- .../monitors/uptime-monitoring/index.mdx | 2 +- .../uptime-monitoring/uptime-tracing.mdx | 3 +- eslint.config.mjs | 28 + next-env.d.ts | 1 + next.config.ts | 9 +- package.json | 15 +- {src/pages => pages}/_error.jsx | 0 {src/pages => public}/geo-back.svg | 0 scripts/no-vercel-json-redirects.mjs | 2 +- src/components/codeTabs.tsx | 6 +- src/components/imageLightbox/index.tsx | 4 +- src/components/onboarding/index.tsx | 3 +- src/middleware.ts | 2 +- src/proxy.ts | 4207 +++++++++++++++++ tsconfig.json | 7 +- 27 files changed, 4299 insertions(+), 46 deletions(-) delete mode 100644 .eslintignore delete mode 100644 .eslintrc.js create mode 100644 eslint.config.mjs rename {src/pages => pages}/_error.jsx (100%) rename {src/pages => public}/geo-back.svg (100%) create mode 100644 src/proxy.ts diff --git a/.eslintignore b/.eslintignore deleted file mode 100644 index 199b0e5673faff..00000000000000 --- a/.eslintignore +++ /dev/null @@ -1 +0,0 @@ -.babelrc.js diff --git a/.eslintrc.js b/.eslintrc.js deleted file mode 100644 index 08a147474ab21e..00000000000000 --- a/.eslintrc.js +++ /dev/null @@ -1,10 +0,0 @@ -module.exports = { - extends: ['sentry-docs', 'plugin:@next/next/recommended'], - globals: { - Atomics: 'readonly', - SharedArrayBuffer: 'readonly', - }, - rules: { - 'import/no-nodejs-modules': 'off', - }, -}; diff --git a/docs/organization/integrations/data-forwarding/amazon-sqs/index.mdx b/docs/organization/integrations/data-forwarding/amazon-sqs/index.mdx index e718fe18da807b..1404abfc3b8d24 100644 --- a/docs/organization/integrations/data-forwarding/amazon-sqs/index.mdx +++ b/docs/organization/integrations/data-forwarding/amazon-sqs/index.mdx @@ -2,7 +2,9 @@ title: Amazon SQS sidebar_order: 3 description: >- - Learn about Sentry's Amazon SQS data forwarder, which enables creating custom data pipelines with Sentry errors through AWS. + Learn about Sentry's Amazon SQS data forwarder, which enables creating custom + data pipelines with Sentry errors through AWS. +og_image: /og-images/organization-integrations-data-forwarding-amazon-sqs.png --- Amazon SQS is a generic queueing service provided by Amazon Web Services that Sentry supports sending error events to. The SQS forwarder may be useful for building your own data pipelines that might require Sentry errors as a source to eventually compare with some other data living elsewhere. @@ -43,4 +45,4 @@ If you wish to modify your forwarder configuration per project, you can do so by - Unlike the other data forwarders, Sentry does not rate limit its sending of events to Amazon SQS. This is separate from the rate limit Amazon SQS enforces. Keep that in mind if you are noticing inconsistencies in your data, or missing events. - Double check that your specified region is correct, both when monitoring the queue/bucket in AWS, and configuring the forwarder in Sentry. Sentry expects the region in the format of `us-east-1`, `us-west-1`, etc. - If your Sentry event payloads are greater than 256KB and you have not provided an S3 Bucket, the event will _not_ be forwarded to your SQS queue. You'll need to setup an S3 Bucket for these events to be forwarded. -- If you are using an S3 Bucket, ensure it is in the same AWS region as the SQS queue otherwise you may experience issues with forwarding events. \ No newline at end of file +- If you are using an S3 Bucket, ensure it is in the same AWS region as the SQS queue otherwise you may experience issues with forwarding events. diff --git a/docs/organization/integrations/data-forwarding/grafana/index.mdx b/docs/organization/integrations/data-forwarding/grafana/index.mdx index 9b3c2814687748..db3aa67f684088 100644 --- a/docs/organization/integrations/data-forwarding/grafana/index.mdx +++ b/docs/organization/integrations/data-forwarding/grafana/index.mdx @@ -1,7 +1,10 @@ --- title: Grafana sidebar_order: 4 -description: "Learn about Sentry's Grafana integration, which allows you to query and visualize Sentry data within Grafana." +description: >- + Learn about Sentry's Grafana integration, which allows you to query and + visualize Sentry data within Grafana. +og_image: /og-images/organization-integrations-data-forwarding-grafana.png --- diff --git a/docs/organization/integrations/data-forwarding/index.mdx b/docs/organization/integrations/data-forwarding/index.mdx index 4e05c1ceb9dd1e..fd4a9290970677 100644 --- a/docs/organization/integrations/data-forwarding/index.mdx +++ b/docs/organization/integrations/data-forwarding/index.mdx @@ -1,7 +1,8 @@ --- -title: "Data Forwarding" +title: Data Forwarding sidebar_order: 60 -description: "Learn about forwarding processed events to third-party providers." +description: Learn about forwarding processed events to third-party providers. +og_image: /og-images/organization-integrations-data-forwarding.png --- diff --git a/docs/organization/integrations/data-forwarding/segment/index.mdx b/docs/organization/integrations/data-forwarding/segment/index.mdx index 190a0c322aac09..f2224637eaa59c 100644 --- a/docs/organization/integrations/data-forwarding/segment/index.mdx +++ b/docs/organization/integrations/data-forwarding/segment/index.mdx @@ -2,7 +2,9 @@ title: Segment sidebar_order: 2 description: >- - Learn about Sentry's Segment data forwarder, which enables tracking Sentry errors as Segment events. + Learn about Sentry's Segment data forwarder, which enables tracking Sentry + errors as Segment events. +og_image: /og-images/organization-integrations-data-forwarding-segment.png --- Segment is useful for collecting, responsibly managing, and integrating your customer data with many other applications, including Sentry. @@ -57,4 +59,4 @@ If you wish to modify your forwarder configuration per project, you can do so by }, "timestamp": "2017-05-20T15:29:06Z" } -``` \ No newline at end of file +``` diff --git a/docs/organization/integrations/data-forwarding/splunk/index.mdx b/docs/organization/integrations/data-forwarding/splunk/index.mdx index a5ae76ebb6b1f2..7186243a2a964a 100644 --- a/docs/organization/integrations/data-forwarding/splunk/index.mdx +++ b/docs/organization/integrations/data-forwarding/splunk/index.mdx @@ -2,7 +2,9 @@ title: Splunk sidebar_order: 1 description: >- - Learn about Sentry's Splunk data forwarder, which enables collecting Sentry Errors in your Splunk Cloud instance through an HTTP Event Collector. + Learn about Sentry's Splunk data forwarder, which enables collecting Sentry + Errors in your Splunk Cloud instance through an HTTP Event Collector. +og_image: /og-images/organization-integrations-data-forwarding-splunk.png --- Splunk is a popular business intelligence and analytics platform for collecting, storing and analyzing your data from whatever source you need, including Sentry. @@ -101,4 +103,4 @@ If you wish to modify your forwarder configuration per project, you can do so by ## Troubleshooting -- Sentry rate limits its sending of events to Splunk at approximately 1000 requests per second per _unique token_. This is separate from the rate limit Splunk enforces. Keep that in mind if you are noticing inconsistencies in your data, or missing events. \ No newline at end of file +- Sentry rate limits its sending of events to Splunk at approximately 1000 requests per second per _unique token_. This is separate from the rate limit Splunk enforces. Keep that in mind if you are noticing inconsistencies in your data, or missing events. diff --git a/docs/product/new-monitors-and-alerts/alerts/index.mdx b/docs/product/new-monitors-and-alerts/alerts/index.mdx index 09e2f6adcb9be0..3ae0b0805c29e3 100644 --- a/docs/product/new-monitors-and-alerts/alerts/index.mdx +++ b/docs/product/new-monitors-and-alerts/alerts/index.mdx @@ -2,7 +2,7 @@ title: Alerts description: Create custom Alerts to pair with Issues. sidebar_order: 60 -og_image: /og-images/product-alerts.png +og_image: /og-images/product-new-monitors-and-alerts-alerts.png --- diff --git a/docs/product/new-monitors-and-alerts/alerts/notifications/index.mdx b/docs/product/new-monitors-and-alerts/alerts/notifications/index.mdx index 66a7b6a689220b..7f0a3574aa6658 100644 --- a/docs/product/new-monitors-and-alerts/alerts/notifications/index.mdx +++ b/docs/product/new-monitors-and-alerts/alerts/notifications/index.mdx @@ -4,7 +4,7 @@ sidebar_order: 40 description: >- Learn about the types of notifications that Sentry sends you, and how to manage them. -og_image: /og-images/product-alerts-notifications.png +og_image: /og-images/product-new-monitors-and-alerts-alerts-notifications.png --- Sentry sends you notifications regarding workflow activities, [release deploys](/product/releases/), and [quota usage](/pricing/quotas/), as well as weekly reports. These notifications let you know about: diff --git a/docs/product/new-monitors-and-alerts/alerts/notifications/notification-settings.mdx b/docs/product/new-monitors-and-alerts/alerts/notifications/notification-settings.mdx index c44a515d034459..07dc3d42e5e934 100644 --- a/docs/product/new-monitors-and-alerts/alerts/notifications/notification-settings.mdx +++ b/docs/product/new-monitors-and-alerts/alerts/notifications/notification-settings.mdx @@ -2,7 +2,8 @@ title: Personal Notification Settings sidebar_order: null description: Learn how to manage your personal notifications settings. -og_image: /og-images/product-alerts-notifications-notification-settings.png +og_image: >- + /og-images/product-new-monitors-and-alerts-alerts-notifications-notification-settings.png --- You can update your personal notification settings for things like [workflow](/product/new-monitors-and-alerts/alerts/notifications/), deploy, issue alert, and [spike protection](/pricing/quotas/spike-protection/) by turning them on or off, specifying how you'd like to be notified (via email, Slack, or both), and more. Users who **aren't** on an [Enterprise](https://sentry.io/pricing/) plan can also configure their quota notifications. diff --git a/docs/product/new-monitors-and-alerts/monitors/crons/alerts-backend-insights-migration.mdx b/docs/product/new-monitors-and-alerts/monitors/crons/alerts-backend-insights-migration.mdx index 45ab3258daad76..a7f50e54f3b9d7 100644 --- a/docs/product/new-monitors-and-alerts/monitors/crons/alerts-backend-insights-migration.mdx +++ b/docs/product/new-monitors-and-alerts/monitors/crons/alerts-backend-insights-migration.mdx @@ -3,7 +3,8 @@ title: Cron Monitoring Updates for Developers noindex: true draft: true sidebar_hidden: true -og_image: /og-images/product-crons-alerts-backend-insights-migration.png +og_image: >- + /og-images/product-new-monitors-and-alerts-monitors-crons-alerts-backend-insights-migration.png --- The **Cron Monitoring** feature has been relocated and restructured to improve accessibility and functionality. Previously, it was found in the sidebar under **"Crons"**, but it has now been split into two different locations: diff --git a/docs/product/new-monitors-and-alerts/monitors/index.mdx b/docs/product/new-monitors-and-alerts/monitors/index.mdx index a89f8d27b4ce6e..59383f5aeea45b 100644 --- a/docs/product/new-monitors-and-alerts/monitors/index.mdx +++ b/docs/product/new-monitors-and-alerts/monitors/index.mdx @@ -1,7 +1,10 @@ --- title: Monitors -description: Generate issues and trigger alerts by creating custom monitors to track errors, performance, and metrics. +description: >- + Generate issues and trigger alerts by creating custom monitors to track + errors, performance, and metrics. sidebar_order: 70 +og_image: /og-images/product-new-monitors-and-alerts-monitors.png --- @@ -105,4 +108,4 @@ Monitors are a Project-level feature, but the permission set is organization-lev By clicking on a Monitor, you can view the details, edit the Monitor, or disable it. -The details page will show a high level chart of the Monitor's performance, the configuration, created issue, and connected automations. \ No newline at end of file +The details page will show a high level chart of the Monitor's performance, the configuration, created issue, and connected automations. diff --git a/docs/product/new-monitors-and-alerts/monitors/uptime-monitoring/index.mdx b/docs/product/new-monitors-and-alerts/monitors/uptime-monitoring/index.mdx index c7ab06a8e20bbd..65e54337dd9841 100644 --- a/docs/product/new-monitors-and-alerts/monitors/uptime-monitoring/index.mdx +++ b/docs/product/new-monitors-and-alerts/monitors/uptime-monitoring/index.mdx @@ -4,7 +4,7 @@ sidebar_order: 50 description: >- Learn how to help maintain uptime for your web services by monitoring relevant URLs with Sentry's Uptime Monitoring. -og_image: /og-images/product-uptime-monitoring.png +og_image: /og-images/product-new-monitors-and-alerts-monitors-uptime-monitoring.png --- Sentry's Uptime Monitoring lets you monitor the availability and reliability of your web services effortlessly. Once enabled, it continuously tracks configured URLs, delivering instant alerts and insights to quickly identify downtime and troubleshoot issues. diff --git a/docs/product/new-monitors-and-alerts/monitors/uptime-monitoring/uptime-tracing.mdx b/docs/product/new-monitors-and-alerts/monitors/uptime-monitoring/uptime-tracing.mdx index f2044d9ccecbda..206a3fd1a132f8 100644 --- a/docs/product/new-monitors-and-alerts/monitors/uptime-monitoring/uptime-tracing.mdx +++ b/docs/product/new-monitors-and-alerts/monitors/uptime-monitoring/uptime-tracing.mdx @@ -2,7 +2,8 @@ title: Distributed Tracing with Uptime sidebar_order: 52 description: Learn how to use distributed tracing to troubleshoot downtime. -og_image: /og-images/product-uptime-monitoring-uptime-tracing.png +og_image: >- + /og-images/product-new-monitors-and-alerts-monitors-uptime-monitoring-uptime-tracing.png --- Sentry's Uptime Monitoring uses [distributed tracing](/product/tracing/#whats-distributed-tracing) to track the flow and timing of requests and operations during uptime checks. This helps you quickly find the root cause of downtime by connecting related errors and performance data. diff --git a/eslint.config.mjs b/eslint.config.mjs new file mode 100644 index 00000000000000..a1d297e704c1ca --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,28 @@ +import {dirname} from 'path'; +import {fileURLToPath} from 'url'; +import {FlatCompat} from '@eslint/eslintrc'; + +const __filename = fileURLToPath(import.meta.url); +const __dirname = dirname(__filename); + +const compat = new FlatCompat({ + baseDirectory: __dirname, +}); + +export default [ + { + ignores: ['.babelrc.js'], + }, + ...compat.extends('sentry-docs', 'plugin:@next/next/recommended'), + { + languageOptions: { + globals: { + Atomics: 'readonly', + SharedArrayBuffer: 'readonly', + }, + }, + rules: { + 'import/no-nodejs-modules': 'off', + }, + }, +]; diff --git a/next-env.d.ts b/next-env.d.ts index 3cd7048ed9471e..2d5420ebae6395 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,6 +1,7 @@ /// /// /// +import "./.next/types/routes.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/next.config.ts b/next.config.ts index bf35ce67e9a10d..55b182b5d25260 100644 --- a/next.config.ts +++ b/next.config.ts @@ -118,6 +118,13 @@ const nextConfig = { images: { contentDispositionType: 'inline', // "open image in new tab" instead of downloading remotePatterns: REMOTE_IMAGE_PATTERNS, + // Next.js 16 requires localPatterns for images with query strings + // Omitting 'search' allows any query string (used for cache busting) + localPatterns: [ + { + pathname: '/**', + }, + ], }, webpack: (config, options) => { config.plugins.push( @@ -132,7 +139,7 @@ const nextConfig = { return config; }, env: { - // This is used on middleware + // This is used on proxy DEVELOPER_DOCS_: process.env.NEXT_PUBLIC_DEVELOPER_DOCS, }, redirects, diff --git a/package.json b/package.json index 8e76182dcc1e38..520ce138fdd05e 100644 --- a/package.json +++ b/package.json @@ -12,18 +12,18 @@ }, "private": true, "scripts": { - "dev:minimal": "pnpm enforce-redirects && concurrently \"node ./src/hotReloadWatcher.mjs\" \"next dev\"", - "dev": "pnpm enforce-redirects && concurrently \"pnpm sidecar\" \"node ./src/hotReloadWatcher.mjs\" \"next dev\"", + "dev:minimal": "pnpm enforce-redirects && concurrently \"node ./src/hotReloadWatcher.mjs\" \"next dev --webpack\"", + "dev": "pnpm enforce-redirects && concurrently \"pnpm sidecar\" \"node ./src/hotReloadWatcher.mjs\" \"next dev --webpack\"", "dev:developer-docs": "pnpm enforce-redirects && NEXT_PUBLIC_DEVELOPER_DOCS=1 pnpm dev", "build:developer-docs": "pnpm enforce-redirects && git submodule init && git submodule update && NEXT_PUBLIC_DEVELOPER_DOCS=1 pnpm build", - "build": "pnpm enforce-redirects && pnpm generate-og-images && pnpm generate-doctree && next build && pnpm generate-md-exports", + "build": "pnpm enforce-redirects && pnpm generate-og-images && pnpm generate-doctree && next build --webpack && pnpm generate-md-exports", "generate-md-exports": "node scripts/generate-md-exports.mjs", "generate-og-images": "ts-node scripts/add-og-images.ts", "generate-doctree": "esbuild scripts/generate-doctree.ts --bundle --platform=node --packages=external --outfile=.next/generate-doctree.mjs --format=esm && node .next/generate-doctree.mjs", "vercel:build:developer-docs": "pnpm enforce-redirects && git submodule init && git submodule update && NEXT_PUBLIC_DEVELOPER_DOCS=1 pnpm build", "start:dev": "NODE_ENV=development pnpm build && pnpm start", "start": "next start", - "lint": "next lint", + "lint": "eslint \"{src,app,scripts}/**/*.{ts,tsx,js,jsx}\"", "lint:ts": "tsc --skipLibCheck", "lint:eslint": "eslint \"{src,app,scripts}/**/*.{ts,tsx,js,jsx}\"", "lint:eslint:fix": "eslint --fix \"{src,app,scripts}/**/*.{ts,tsx,js,jsx}\"", @@ -86,7 +86,7 @@ "mdx-bundler": "^10.0.1", "mermaid": "^11.11.0", "micromark": "^4.0.0", - "next": "15.1.12", + "next": "^16.1.6", "next-plausible": "^3.12.4", "next-themes": "^0.3.0", "nextjs-toploader": "^1.6.6", @@ -147,7 +147,8 @@ "concurrently": "^9.1.0", "dotenv-cli": "^7.4.1", "eslint": "^8", - "eslint-config-next": "15.0.3", + "@eslint/eslintrc": "^3.2.0", + "eslint-config-next": "^16.1.6", "eslint-config-sentry-docs": "^2.10.0", "jest": "^29.5.0", "jest-dom": "^4.0.0", @@ -181,4 +182,4 @@ "node": "22.16.0", "pnpm": "10.30.0" } -} +} \ No newline at end of file diff --git a/src/pages/_error.jsx b/pages/_error.jsx similarity index 100% rename from src/pages/_error.jsx rename to pages/_error.jsx diff --git a/src/pages/geo-back.svg b/public/geo-back.svg similarity index 100% rename from src/pages/geo-back.svg rename to public/geo-back.svg diff --git a/scripts/no-vercel-json-redirects.mjs b/scripts/no-vercel-json-redirects.mjs index 9f154ae9f7193b..c8644405b7b73c 100644 --- a/scripts/no-vercel-json-redirects.mjs +++ b/scripts/no-vercel-json-redirects.mjs @@ -4,6 +4,6 @@ const vercelConfig = JSON.parse(readFileSync('./vercel.json', 'utf8')); if (vercelConfig.redirects && vercelConfig.redirects.length > 0) { throw new Error( - '🔴 ERROR: vercel.json redirects are not recommended.\n 👉 Please add dynamic redirects to redirects.js and static redirects to ./src/middleware.ts' + '🔴 ERROR: vercel.json redirects are not recommended.\n 👉 Please add dynamic redirects to redirects.js and static redirects to ./src/proxy.ts' ); } diff --git a/src/components/codeTabs.tsx b/src/components/codeTabs.tsx index 994cbf1be213fe..702930f529ff6b 100644 --- a/src/components/codeTabs.tsx +++ b/src/components/codeTabs.tsx @@ -55,7 +55,11 @@ export function CodeTabs({children}: CodeTabProps) { // The title is what we use for sorting and also for remembering the // selection. If there is no title fall back to the title cased language name // (or override from `LANGUAGES`). - const possibleChoices = codeBlocks.map(({props: {title, language}}) => { + const possibleChoices = codeBlocks.map(child => { + const props = child?.props; + const title = props?.title; + const language = props?.language; + if (title) { return title; } diff --git a/src/components/imageLightbox/index.tsx b/src/components/imageLightbox/index.tsx index a0c82a73feb2a0..f3e01cc42e4525 100644 --- a/src/components/imageLightbox/index.tsx +++ b/src/components/imageLightbox/index.tsx @@ -90,8 +90,8 @@ export function ImageLightbox({ }; // Filter out props that are incompatible with Next.js Image component - // Next.js Image has stricter typing for certain props like 'placeholder' - const {placeholder: _placeholder, ...imageCompatibleProps} = props; + // Next.js Image has stricter typing for certain props like 'placeholder' and 'preload' + const {placeholder: _placeholder, preload: _preload, ...imageCompatibleProps} = props; const renderImage = (isInline: boolean = true) => { const renderedSrc = getImageUrl(src, imgPath); diff --git a/src/components/onboarding/index.tsx b/src/components/onboarding/index.tsx index 41d440f0880c7e..0127dd3534948b 100644 --- a/src/components/onboarding/index.tsx +++ b/src/components/onboarding/index.tsx @@ -1,7 +1,6 @@ 'use client'; -// eslint-disable-next-line no-restricted-imports -- Required for JSX in test environment -import React, {ReactNode, useContext, useEffect, useReducer, useState} from 'react'; +import {type ReactNode, useContext, useEffect, useReducer, useState} from 'react'; import {QuestionMarkCircledIcon} from '@radix-ui/react-icons'; import * as Tooltip from '@radix-ui/react-tooltip'; import {Button, Checkbox, Theme} from '@radix-ui/themes'; diff --git a/src/middleware.ts b/src/middleware.ts index 16288c7ff2285c..e6b8cf104159e0 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -21,7 +21,7 @@ export const config = { }; // This function can be marked `async` if using `await` inside -export function middleware(request: NextRequest) { +export function proxy(request: NextRequest) { // First, handle canonical URL redirects for deprecated paths const canonicalRedirect = handleRedirects(request); if (canonicalRedirect) { diff --git a/src/proxy.ts b/src/proxy.ts new file mode 100644 index 00000000000000..a6706cee7126e1 --- /dev/null +++ b/src/proxy.ts @@ -0,0 +1,4207 @@ +import * as Sentry from '@sentry/nextjs'; +import type {NextRequest} from 'next/server'; +import {NextResponse} from 'next/server'; + +// This env var is set in next.config.js based on the `NEXT_PUBLIC_DEVELOPER_DOCS` env var at build time +// a workaround edge middleware not having access to env vars +const isDeveloperDocs = process.env.DEVELOPER_DOCS_; + +export const config = { + // learn more: https://nextjs.org/docs/pages/building-your-application/routing/middleware#matcher + matcher: [ + // Match all request paths except for the ones starting with: + // - api (API routes) + // - _next/static (static files) + // - _next/image (image optimization files) + // - favicon.ico (favicon file) + '/((?!api|_next/static|_next/image|favicon.ico).*)', + ], +}; + +// This function can be marked `async` if using `await` inside +export function proxy(request: NextRequest) { + // First, handle canonical URL redirects for deprecated paths + const canonicalRedirect = handleRedirects(request); + if (canonicalRedirect) { + return canonicalRedirect; + } + + // Then, check for AI/LLM clients and redirect to markdown if appropriate + return handleAIClientRedirect(request); +} + +// don't send Permanent Redirects (301) in dev mode - it gets cached for "localhost" by the browser +const redirectStatusCode = process.env.NODE_ENV === 'development' ? 302 : 301; + +/** + * Detects if the user agent belongs to an AI/LLM tool or development environment + * that would benefit from markdown format + */ +function isAIOrDevTool(userAgent: string): boolean { + const patterns = [ + /claude/i, // Claude Desktop/Code + /cursor/i, // Cursor IDE + /copilot/i, // GitHub Copilot + /chatgpt/i, // ChatGPT + /openai/i, // OpenAI tools + /anthropic/i, // Anthropic tools + /vscode/i, // VS Code extensions + /intellij/i, // IntelliJ plugins + /sublime/i, // Sublime Text plugins + /got/i, // Got HTTP library (sindresorhus/got) + // Add more patterns as needed + ]; + + return patterns.some(pattern => pattern.test(userAgent)); +} + +/** + * Detects if client wants markdown via Accept header (standards-compliant) + */ +function wantsMarkdownViaAccept(acceptHeader: string): boolean { + return ( + acceptHeader.includes('text/markdown') || + acceptHeader.includes('text/x-markdown') || + acceptHeader.includes('text/plain') + ); +} + +/** + * Detects if client wants markdown via Accept header or user-agent + */ +function wantsMarkdown(request: NextRequest): boolean { + const userAgent = request.headers.get('user-agent') || ''; + const acceptHeader = request.headers.get('accept') || ''; + + // Strategy 1: Accept header content negotiation (standards-compliant) + if (wantsMarkdownViaAccept(acceptHeader)) { + return true; + } + + // Strategy 2: User-agent detection (fallback for tools that don't set Accept) + return isAIOrDevTool(userAgent); +} + +/** + * Handles redirection to markdown versions for AI/LLM clients + */ +const handleAIClientRedirect = (request: NextRequest) => { + const userAgent = request.headers.get('user-agent') || ''; + const acceptHeader = request.headers.get('accept') || ''; + const url = request.nextUrl; + + // Determine if this will be served as markdown + const forceMarkdown = url.searchParams.get('format') === 'md'; + const clientWantsMarkdown = wantsMarkdown(request); + const willServeMarkdown = + (clientWantsMarkdown || forceMarkdown) && !url.pathname.endsWith('.md'); + + // Determine detection method for logging + const detectionMethod = wantsMarkdownViaAccept(acceptHeader) + ? 'Accept header' + : isAIOrDevTool(userAgent) + ? 'User-agent' + : 'Manual'; + + // Log user agent for debugging (only for non-static assets) + if ( + !url.pathname.startsWith('/_next/') && + !url.pathname.includes('.') && + !url.pathname.startsWith('/api/') + ) { + Sentry.logger.info(`Middleware request processed: ${url.pathname}`, { + urlPath: url.pathname, + acceptHeader: request.headers.get('accept') || '', + userAgent: request.headers.get('user-agent') || '', + contentType: willServeMarkdown ? 'markdown' : 'html', + detectionMethod: willServeMarkdown ? detectionMethod : null, + }); + } + + // Skip if already requesting a markdown file + if (url.pathname.endsWith('.md')) { + return undefined; + } + + // Skip API routes and static assets (should already be filtered by matcher) + if ( + url.pathname.startsWith('/api/') || + url.pathname.startsWith('/_next/') || + /\.(js|json|png|jpg|jpeg|gif|ico|pdf|css|woff|woff2|ttf|map|xml|txt|zip|svg)$/i.test( + url.pathname + ) + ) { + return undefined; + } + + // Check for markdown request (Accept header, user-agent, or manual) + if (clientWantsMarkdown || forceMarkdown) { + // Log the rewrite for debugging + Sentry.logger.info('Markdown rewrite triggered', { + urlPath: url.pathname, + detectionMethod: forceMarkdown ? 'Manual format=md' : detectionMethod, + targetUrl: url.pathname.replace(/\/+$/, '') + '.md', + }); + + // Create new URL with .md extension + const newUrl = url.clone(); + // Handle root path and ensure proper .md extension + let pathname = url.pathname === '/' ? '/index' : url.pathname; + // Remove all trailing slashes if present, then add .md + pathname = pathname.replace(/\/+$/, '') + '.md'; + newUrl.pathname = pathname; + + // Clean up the format query parameter if it was used + if (forceMarkdown) { + newUrl.searchParams.delete('format'); + } + + // Rewrite to serve markdown inline (same URL, different content) + // The next.config.ts rewrite rule maps *.md to /md-exports/*.md + return NextResponse.rewrite(newUrl); + } + + return undefined; +}; + +const handleRedirects = (request: NextRequest) => { + const urlPath = request.nextUrl.pathname; + + const redirectTo = redirectMap.get(urlPath); + if (redirectTo) { + return NextResponse.redirect(new URL(redirectTo, request.url), { + status: redirectStatusCode, + }); + } + + // If we don't find an exact match, we try to look for a :guide placeholder + const guidePlaceholder = '/guides/:guide/'; + const guideRegex = /\/guides\/(\w+)\//g; + const match = guideRegex.exec(urlPath); + + if (!match) { + return undefined; + } + + const pathWithPlaceholder = urlPath.replace(guideRegex, guidePlaceholder); + const guide = match[1]; + + const redirectToGuide = redirectMap.get(pathWithPlaceholder); + if (redirectToGuide) { + const finalRedirectToPath = redirectToGuide.replace( + guidePlaceholder, + `/guides/${guide}/` + ); + + return NextResponse.redirect(new URL(finalRedirectToPath, request.url), { + status: redirectStatusCode, + }); + } + + return undefined; +}; + +type Redirect = { + /** a string with a leading and a trailing slash */ + from: `/${string}/` | '/'; + to: string; +}; + +/** Note: if you want to set redirects for developer docs, set them below in `DEVELOPER_DOCS_REDIRECTS` */ +const USER_DOCS_REDIRECTS: Redirect[] = [ + { + from: '/platforms/python/http_errors/', + to: '/platforms/python/integrations/django/http_errors/', + }, + { + from: '/platforms/javascript/guides/react/configuration/integrations/trycatch/', + to: '/platforms/javascript/configuration/integrations/browserapierrors/', + }, + { + from: '/platforms/javascript/performance/instrumentation/custom-instrumentation/caches-module/', + to: '/platforms/javascript/guides/node/performance/instrumentation/custom-instrumentation/caches-module/', + }, + { + from: '/platforms/javascript/guides/nuxt/install/top-level-import/', + to: '/platforms/javascript/guides/nuxt/install/limited-server-tracing/', + }, + { + from: '/account/early-adopter-features/discord/', + to: '/organization/integrations/notification-incidents/discord/', + }, + { + from: '/platforms/python/migration/configuration/filtering/', + to: '/platforms/python/configuration/filtering/', + }, + { + from: '/organization/integrations/github/', + to: '/organization/integrations/source-code-mgmt/github/', + }, + { + from: '/organization/integrations/gitlab/', + to: '/organization/integrations/source-code-mgmt/gitlab/', + }, + { + from: '/organization/integrations/bitbucket/', + to: '/organization/integrations/source-code-mgmt/bitbucket/', + }, + { + from: '/organization/integrations/rookout/', + to: '/organization/integrations/debugging/rookout/', + }, + { + from: '/organization/integrations/split/', + to: '/organization/integrations/feature-flag/split/', + }, + { + from: '/organization/integrations/teamwork/', + to: '/organization/integrations/issue-tracking/teamwork/', + }, + { + from: '/organization/integrations/jira/', + to: '/organization/integrations/issue-tracking/jira/', + }, + { + from: '/organization/integrations/linear/', + to: '/organization/integrations/issue-tracking/linear/', + }, + { + from: '/organization/integrations/clickup/', + to: '/organization/integrations/issue-tracking/clickup/', + }, + { + from: '/organization/integrations/project-mgmt/shortcut/', + to: '/organization/integrations/issue-tracking/shortcut/', + }, + { + from: '/organization/integrations/slack/', + to: '/organization/integrations/notification-incidents/slack/', + }, + { + from: '/organization/integrations/pagerduty/', + to: '/organization/integrations/notification-incidents/pagerduty/', + }, + { + from: '/organization/integrations/vanta/', + to: '/organization/integrations/compliance/vanta/', + }, + { + from: '/organization/integrations/jam/', + to: '/organization/integrations/session-replay/jam/', + }, + { + from: '/organization/integrations/cloud-monitoring/cloudflare-workers/', + to: '/platforms/javascript/guides/cloudflare/', + }, + { + from: '/product/crons/getting-started/cli/', + to: '/cli/crons/', + }, + { + from: '/product/data-management-settings/dynamic-sampling/', + to: '/product/insights/overview/', + }, + { + from: '/product/data-management-settings/event-grouping/', + to: '/concepts/data-management/event-grouping/', + }, + { + from: '/product/data-management-settings/data-forwarding/', + to: '/concepts/data-management/data-forwarding/', + }, + { + from: '/product/data-management-settings/filtering/', + to: '/concepts/data-management/filtering/', + }, + { + from: '/platforms/data-management/', + to: '/concepts/data-management/', + }, + { + from: '/platforms/javascript/sourcemaps/troubleshooting/', + to: '/platforms/javascript/sourcemaps/', + }, + { + from: '/platforms/react-native/install/cocoapods/', + to: '/platforms/react-native/manual-setup/manual-setup/', + }, + { + from: '/platforms/react-native/install/', + to: '/platforms/react-native/manual-setup/manual-setup/', + }, + { + from: '/platforms/unity/data-management/event-grouping/sdk-fingerprinting/', + to: '/platforms/unity/usage/sdk-fingerprinting/', + }, + { + from: '/platforms/unity/native-support/building-ios/', + to: '/platforms/unity/native-support/', + }, + { + from: '/platforms/unity/unity-lite/', + to: '/platforms/unity/migration/', + }, + { + from: '/platforms/go/config/', + to: '/platforms/go/configuration/options/', + }, + { + from: '/platforms/go/goroutines/', + to: '/platforms/go/usage/concurrency/', + }, + { + from: '/platforms/go/concurrency/', + to: '/platforms/go/usage/concurrency/', + }, + { + from: '/platforms/go/panics/', + to: '/platforms/go/usage/panics/', + }, + { + from: '/platforms/go/serverless/', + to: '/platforms/go/usage/serverless/', + }, + { + from: '/platforms/go/fasthttp/', + to: '/platforms/go/guides/fasthttp/', + }, + { + from: '/platforms/go/fiber/', + to: '/platforms/go/guides/fiber/', + }, + { + from: '/platforms/go/echo/', + to: '/platforms/go/guides/echo/', + }, + { + from: '/platforms/go/iris/', + to: '/platforms/go/guides/iris/', + }, + { + from: '/platforms/go/negroni/', + to: '/platforms/go/guides/negroni/', + }, + { + from: '/platforms/go/zerolog/', + to: '/platforms/go/guides/zerolog/', + }, + { + from: '/platforms/go/slog/', + to: '/platforms/go/guides/slog/', + }, + { + from: '/platforms/go/logrus/', + to: '/platforms/go/guides/logrus/', + }, + { + from: '/clients/go/integrations/http/', + to: '/platforms/go/guides/http/', + }, + { + from: '/platforms/go/http/', + to: '/platforms/go/guides/http/', + }, + { + from: '/platforms/go/gin/', + to: '/platforms/go/guides/gin/', + }, + { + from: '/clients/go/config/', + to: '/platforms/go/legacy-sdk/config/', + }, + { + from: '/clients/go/index/', + to: '/platforms/go/legacy-sdk/', + }, + { + from: '/clients/go/integrations/', + to: '/platforms/go/legacy-sdk/integrations/', + }, + { + from: '/clients/go/usage/', + to: '/platforms/go/legacy-sdk/usage/', + }, + { + from: '/clients/go/context/', + to: '/platforms/go/legacy-sdk/context/', + }, + { + from: '/platforms/qt/', + to: '/platforms/native/guides/qt/', + }, + { + from: '/platforms/native/qt/', + to: '/platforms/native/guides/qt/', + }, + { + from: '/platforms/breakpad/', + to: '/platforms/native/guides/breakpad/', + }, + { + from: '/platforms/native/breakpad/', + to: '/platforms/native/guides/breakpad/', + }, + { + from: '/platforms/minidump/', + to: '/platforms/native/guides/minidumps/', + }, + { + from: '/platforms/native/minidump/', + to: '/platforms/native/guides/minidumps/', + }, + { + from: '/clients/minidump/', + to: '/platforms/native/guides/minidumps/', + }, + { + from: '/platforms/react-native/advanced-setup/', + to: '/platforms/react-native/manual-setup/manual-setup/', + }, + { + from: '/platforms/react-native/codepush/', + to: '/platforms/react-native/manual-setup/codepush/', + }, + { + from: '/platforms/react-native/hermes/', + to: '/platforms/react-native/manual-setup/hermes/', + }, + { + from: '/platforms/react-native/ram-bundles/', + to: '/platforms/react-native/manual-setup/ram-bundles/', + }, + { + from: '/platforms/react-native/performance/sampling/', + to: '/platforms/react-native/configuration/sampling/', + }, + { + from: '/platforms/react-native/configuration/integrations/plugin/', + to: '/platforms/react-native/integrations/plugin/', + }, + { + from: '/platforms/react-native/configuration/integrations/', + to: '/platforms/react-native/integrations/', + }, + { + from: '/platforms/react-native/configuration/integrations/custom/', + to: '/platforms/react-native/integrations/custom/', + }, + { + from: '/platforms/react-native/configuration/integrations/default/', + to: '/platforms/react-native/integrations/default/', + }, + { + from: '/platforms/react-native/configuration/integrations/redux/', + to: '/platforms/react-native/integrations/redux/', + }, + { + from: '/platforms/react-native/manual-setup/sourcemaps/', + to: '/platforms/react-native/sourcemaps/', + }, + { + from: '/platforms/react-native/touchevents/', + to: '/platforms/react-native/configuration/touchevents/', + }, + { + from: '/platforms/python/data-collected/', + to: '/platforms/python/data-management/data-collected/', + }, + { + from: '/platforms/python/flask/', + to: '/platforms/python/integrations/flask/', + }, + { + from: '/platforms/python/aiohttp/', + to: '/platforms/python/integrations/aiohttp/', + }, + { + from: '/platforms/python/gcp_functions/', + to: '/platforms/python/integrations/gcp-functions/', + }, + { + from: '/platforms/python/serverless/', + to: '/platforms/python/integrations/serverless/', + }, + { + from: '/clients/python/integrations/pyramid/', + to: '/platforms/python/integrations/pyramid/', + }, + { + from: '/platforms/python/pyramid/', + to: '/platforms/python/integrations/pyramid/', + }, + { + from: '/clients/python/integrations/starlette/', + to: '/platforms/python/integrations/starlette/', + }, + { + from: '/platforms/python/starlette/', + to: '/platforms/python/integrations/starlette/', + }, + { + from: '/clients/python/integrations/lambda/', + to: '/platforms/python/integrations/aws-lambda/', + }, + { + from: '/platforms/python/aws_lambda/', + to: '/platforms/python/integrations/aws-lambda/', + }, + { + from: '/platforms/python/airflow/', + to: '/platforms/python/integrations/airflow/', + }, + { + from: '/platforms/python/tornado/', + to: '/platforms/python/integrations/tornado/', + }, + { + from: '/clients/python/integrations/tornado/', + to: '/platforms/python/integrations/tornado/', + }, + { + from: '/platforms/python/chalice/', + to: '/platforms/python/integrations/chalice/', + }, + { + from: '/clients/python/integrations/fastapi/', + to: '/platforms/python/integrations/fastapi/', + }, + { + from: '/platforms/python/fastapi/', + to: '/platforms/python/integrations/fastapi/', + }, + { + from: '/platforms/python/sanic/', + to: '/platforms/python/integrations/sanic/', + }, + { + from: '/clients/python/integrations/starlite/', + to: '/platforms/python/integrations/starlite/', + }, + { + from: '/platforms/python/starlite/', + to: '/platforms/python/integrations/starlite/', + }, + { + from: '/clients/python/integrations/litestar/', + to: '/platforms/python/integrations/litestar/', + }, + { + from: '/platforms/python/litestar/', + to: '/platforms/python/integrations/litestar/', + }, + { + from: '/platforms/python/beam/', + to: '/platforms/python/integrations/beam/', + }, + { + from: '/clients/python/integrations/celery/', + to: '/platforms/python/integrations/celery/', + }, + { + from: '/platforms/python/celery/', + to: '/platforms/python/integrations/celery/', + }, + { + from: '/platforms/python/hints/', + to: '/platforms/python/integrations/celery/', + }, + { + from: '/clients/python/integrations/django/', + to: '/platforms/python/integrations/django/', + }, + { + from: '/platforms/python/django/', + to: '/platforms/python/integrations/django/', + }, + { + from: '/platforms/python/falcon/', + to: '/platforms/python/integrations/falcon/', + }, + { + from: '/clients/python/integrations/logging/', + to: '/platforms/python/integrations/logging/', + }, + { + from: '/platforms/python/logging/', + to: '/platforms/python/integrations/logging/', + }, + { + from: '/clients/python/integrations/rq/', + to: '/platforms/python/integrations/rq/', + }, + { + from: '/platforms/python/rq/', + to: '/platforms/python/integrations/rq/', + }, + { + from: '/clients/python/integrations/bottle/', + to: '/platforms/python/integrations/bottle/', + }, + { + from: '/platforms/python/bottle/', + to: '/platforms/python/integrations/bottle/', + }, + { + from: '/platforms/python/pyspark/', + to: '/platforms/python/integrations/spark/', + }, + { + from: '/platforms/python/integrations/pyspark/', + to: '/platforms/python/integrations/spark/', + }, + { + from: '/platforms/python/tryton/', + to: '/platforms/python/integrations/tryton/', + }, + { + from: '/platforms/python/integrations/feature-flags/launchdarkly/', + to: '/platforms/python/integrations/launchdarkly/', + }, + { + from: '/platforms/python/integrations/feature-flags/openfeature/', + to: '/platforms/python/integrations/openfeature/', + }, + { + from: '/platforms/python/integrations/feature-flags/unleash/', + to: '/platforms/python/integrations/unleash/', + }, + { + from: '/clients/python/breadcrumbs/', + to: '/platforms/python/legacy-sdk/breadcrumbs/', + }, + { + from: '/clients/python/platform-support/', + to: '/platforms/python/legacy-sdk/platform-support/', + }, + { + from: '/clients/python/integrations/', + to: '/platforms/python/legacy-sdk/integrations/', + }, + { + from: '/clients/python/api/', + to: '/platforms/python/legacy-sdk/api/', + }, + { + from: '/clients/python/advanced/', + to: '/platforms/python/legacy-sdk/advanced/', + }, + { + from: '/clients/python/usage/', + to: '/platforms/python/legacy-sdk/usage/', + }, + { + from: '/clients/python/transports/', + to: '/platforms/python/legacy-sdk/transports/', + }, + { + from: '/platforms/python/contextvars/', + to: '/platforms/python/troubleshooting/', + }, + { + from: '/platforms/dart/usage/advanced-usage/', + to: '/platforms/dart/integrations/http-integration/', + }, + { + from: '/platforms/dart/configuration/integrations/http-integration/', + to: '/platforms/dart/integrations/http-integration/', + }, + { + from: '/platforms/dart/configuration/integrations/file/', + to: '/platforms/dart/integrations/file/', + }, + { + from: '/platforms/dart/configuration/integrations/', + to: '/platforms/dart/integrations/', + }, + { + from: '/platforms/dart/configuration/integrations/logging/', + to: '/platforms/dart/integrations/logging/', + }, + { + from: '/platforms/dart/configuration/integrations/dio/', + to: '/platforms/dart/integrations/dio/', + }, + { + from: '/platforms/dart/configuration/integrations/firebase-remote-config/', + to: '/platforms/dart/integrations/firebase-remote-config/', + }, + { + from: '/quickstart/', + to: '/platforms/', + }, + { + from: '/clients/', + to: '/platforms/', + }, + { + from: '/platforms/perl/', + to: '/platforms/', + }, + { + from: '/platforms/node/guides/serverless-cloud/typescript/', + to: '/platforms/', + }, + { + from: '/clients/rust/', + to: '/platforms/rust/', + }, + { + from: '/platforms/rust/log/', + to: '/platforms/rust/', + }, + { + from: '/platforms/rust/profiling/', + to: '/platforms/rust/', + }, + { + from: '/platforms/rust/actix/', + to: '/platforms/rust/guides/actix-web/', + }, + { + from: '/platforms/rust/guides/actix-web/profiling/', + to: '/platforms/rust/guides/actix-web/', + }, + { + from: '/clients/java/modules/log4j2/', + to: '/platforms/java/legacy/log4j2/', + }, + { + from: '/clients/java/', + to: '/platforms/java/legacy/', + }, + { + from: '/clients/java/migration/', + to: '/platforms/java/legacy/migration/', + }, + { + from: '/clients/java/usage/', + to: '/platforms/java/legacy/usage/', + }, + { + from: '/clients/java/modules/appengine/', + to: '/platforms/java/legacy/google-app-engine/', + }, + { + from: '/clients/java/context/', + to: '/platforms/java/scope/', + }, + { + from: '/clients/java/modules/jul/', + to: '/platforms/java/guides/jul/', + }, + { + from: '/platforms/java/guides/jul/config/', + to: '/platforms/java/guides/jul/', + }, + { + from: '/clients/java/modules/logback/', + to: '/platforms/java/guides/logback/', + }, + { + from: '/platforms/java/guides/logback/config/', + to: '/platforms/java/guides/logback/', + }, + { + from: '/platforms/java/guides/spring/config/', + to: '/platforms/java/guides/spring/', + }, + { + from: '/platforms/java/guides/springboot/config/', + to: '/platforms/java/guides/spring-boot/', + }, + { + from: '/clients/php/integrations/monolog/', + to: '/platforms/php/', + }, + { + from: '/platforms/php/default-integrations/', + to: '/platforms/php/integrations/', + }, + { + from: '/platforms/php/guides/symfony/config/', + to: '/platforms/php/guides/symfony/configuration/symfony-options/', + }, + { + from: '/clients/php/integrations/symfony2/', + to: '/platforms/php/guides/symfony/', + }, + { + from: '/platforms/php/symfony/', + to: '/platforms/php/guides/symfony/', + }, + { + from: '/platforms/php/guides/symfony/performance/pm-integrations/', + to: '/platforms/php/guides/symfony/tracing/instrumentation/automatic-instrumentation/', + }, + { + from: '/clients/php/integrations/laravel/', + to: '/platforms/php/guides/laravel/', + }, + { + from: '/platforms/php/laravel/', + to: '/platforms/php/guides/laravel/', + }, + { + from: '/platforms/php/guides/laravel/lumen/', + to: '/platforms/php/guides/laravel/', + }, + { + from: '/platforms/php/guides/laravel/configuration/other-versions/laravel4/', + to: '/platforms/php/guides/laravel/other-versions/laravel4/', + }, + { + from: '/platforms/php/guides/laravel/other-versions/laravel5-6-7/', + to: '/platforms/php/guides/laravel/other-versions/', + }, + { + from: '/platforms/php/guides/laravel/configuration/other-versions/lumen/', + to: '/platforms/php/guides/laravel/other-versions/lumen/', + }, + { + from: '/clients/php/config/', + to: '/platforms/php/legacy-sdk/config/', + }, + { + from: '/clients/php/', + to: '/platforms/php/legacy-sdk/', + }, + { + from: '/clients/php/integrations/', + to: '/platforms/php/legacy-sdk/integrations/', + }, + { + from: '/clients/php/usage/', + to: '/platforms/php/legacy-sdk/usage/', + }, + { + from: '/platforms/dotnet/configuration/cli-integration/', + to: '/platforms/dotnet/configuration/msbuild/', + }, + { + from: '/platforms/dotnet/aspnetcore/', + to: '/platforms/dotnet/guides/aspnetcore/', + }, + { + from: '/platforms/dotnet/guides/aspnetcore/ignoring-exceptions/', + to: '/platforms/dotnet/guides/aspnetcore/', + }, + { + from: '/platforms/dotnet/log4net/', + to: '/platforms/dotnet/guides/log4net/', + }, + { + from: '/platforms/dotnet/microsoft-extensions-logging/', + to: '/platforms/dotnet/guides/extensions-logging/', + }, + { + from: '/platforms/dotnet/entityframework/', + to: '/platforms/dotnet/guides/entityframework/', + }, + { + from: '/platforms/dotnet/maui/', + to: '/platforms/dotnet/guides/maui/', + }, + { + from: '/platforms/dotnet/wpf/', + to: '/platforms/dotnet/guides/wpf/', + }, + { + from: '/platforms/dotnet/winforms/', + to: '/platforms/dotnet/guides/winforms/', + }, + { + from: '/platforms/dotnet/guides/winforms/ignoring-exceptions/', + to: '/platforms/dotnet/guides/winforms/', + }, + { + from: '/platforms/dotnet/google.cloud.functions/', + to: '/platforms/dotnet/guides/google-cloud-functions/', + }, + { + from: '/platforms/dotnet/winui/', + to: '/platforms/dotnet/guides/winui/', + }, + { + from: '/platforms/dotnet/serilog/', + to: '/platforms/dotnet/guides/serilog/', + }, + { + from: '/platforms/dotnet/uwp/', + to: '/platforms/dotnet/guides/uwp/', + }, + { + from: '/platforms/dotnet/nlog/', + to: '/platforms/dotnet/guides/nlog/', + }, + { + from: '/platforms/flutter/configuration/integrations/user-interaction-instrumentation/', + to: '/platforms/flutter/integrations/user-interaction-instrumentation/', + }, + { + from: '/platforms/flutter/configuration/integrations/', + to: '/platforms/flutter/integrations/', + }, + { + from: '/platforms/flutter/configuration/integrations/sqflite-instrumentation/', + to: '/platforms/flutter/integrations/sqflite-instrumentation/', + }, + { + from: '/platforms/flutter/usage/advanced-usage/', + to: '/platforms/flutter/troubleshooting/', + }, + { + from: '/platforms/android/manual-configuration/', + to: '/platforms/android/configuration/manual-init/', + }, + { + from: '/platforms/android/advanced-usage/', + to: '/platforms/android/configuration/using-ndk/', + }, + { + from: '/platforms/android/using-ndk/', + to: '/platforms/android/configuration/using-ndk/', + }, + { + from: '/platforms/android/gradle/', + to: '/platforms/android/configuration/gradle/', + }, + { + from: '/platforms/android/configuration/integrations/apollo3/', + to: '/platforms/android/integrations/apollo3/', + }, + { + from: '/platforms/android/configuration/integrations/', + to: '/platforms/android/integrations/', + }, + { + from: '/platforms/android/configuration/integrations/logcat/', + to: '/platforms/android/integrations/logcat/', + }, + { + from: '/platforms/android/configuration/jetpack-compose/', + to: '/platforms/android/integrations/jetpack-compose/', + }, + { + from: '/platforms/android/configuration/integrations/jetpack-compose/', + to: '/platforms/android/integrations/jetpack-compose/', + }, + { + from: '/platforms/android/configuration/integrations/navigation/', + to: '/platforms/android/integrations/navigation/', + }, + { + from: '/platforms/android/configuration/integrations/room-and-sqlite/', + to: '/platforms/android/integrations/room-and-sqlite/', + }, + { + from: '/platforms/android/configuration/integrations/file-io/', + to: '/platforms/android/integrations/file-io/', + }, + { + from: '/platforms/java/tracing/instrumentation/apollo/', + to: '/platforms/java/tracing/instrumentation/apollo4/', + }, + { + from: '/platforms/java/guides/spring/tracing/instrumentation/apollo/', + to: '/platforms/java/guides/spring/tracing/instrumentation/apollo4/', + }, + { + from: '/platforms/java/guides/spring-boot/tracing/instrumentation/apollo/', + to: '/platforms/java/guides/spring-boot/tracing/instrumentation/apollo4/', + }, + { + from: '/platforms/android/performance/instrumentation/apollo/', + to: '/platforms/android/integrations/apollo4/', + }, + { + from: '/platforms/android/configuration/integrations/apollo/', + to: '/platforms/android/integrations/apollo4/', + }, + { + from: '/platforms/android/integrations/apollo/', + to: '/platforms/android/integrations/apollo4/', + }, + { + from: '/platforms/android/configuration/integrations/fragment/', + to: '/platforms/android/integrations/fragment/', + }, + { + from: '/platforms/android/timber/', + to: '/platforms/android/integrations/timber/', + }, + { + from: '/platforms/android/guides/timber/', + to: '/platforms/android/integrations/timber/', + }, + { + from: '/platforms/android/configuration/integrations/timber/', + to: '/platforms/android/integrations/timber/', + }, + { + from: '/platforms/android/guides/okhttp/', + to: '/platforms/android/integrations/okhttp/', + }, + { + from: '/platforms/android/configuration/integrations/okhttp/', + to: '/platforms/android/integrations/okhttp/', + }, + { + from: '/platforms/android/migrate/', + to: '/platforms/android/migration/', + }, + { + from: '/platforms/android/proguard/', + to: '/platforms/android/enhance-errors/proguard/', + }, + { + from: '/platforms/android/source-context/', + to: '/platforms/android/enhance-errors/source-context/', + }, + { + from: '/platforms/android/kotlin-compiler-plugin/', + to: '/platforms/android/enhance-errors/kotlin-compiler-plugin/', + }, + { + from: '/platforms/javascript/configuration/integrations/plugin/', + to: '/platforms/javascript/configuration/integrations/', + }, + { + from: '/platforms/javascript/configuration/integrations/default/', + to: '/platforms/javascript/configuration/integrations/', + }, + { + from: '/platforms/javascript/integrations/custom/', + to: '/platforms/javascript/configuration/integrations/custom/', + }, + { + from: '/platforms/javascript/loader/', + to: '/platforms/javascript/install/loader/', + }, + { + from: '/platforms/javascript/install/lazy-load-sentry/', + to: '/platforms/javascript/install/loader/', + }, + { + from: '/platforms/javascript/install/cdn/', + to: '/platforms/javascript/install/loader/', + }, + { + from: '/platforms/javascript/integrations/rrweb/', + to: '/platforms/javascript/session-replay/', + }, + { + from: '/platforms/javascript/configuration/integrations/rrweb/', + to: '/platforms/javascript/session-replay/', + }, + { + from: '/platforms/javascript/guides/angular/configuration/integrations/rrweb/', + to: '/platforms/javascript/session-replay/', + }, + { + from: '/platforms/javascript/guides/capacitor/configuration/integrations/rrweb/', + to: '/platforms/javascript/session-replay/', + }, + { + from: '/platforms/javascript/guides/cordova/configuration/integrations/rrweb/', + to: '/platforms/javascript/session-replay/', + }, + { + from: '/platforms/javascript/guides/ember/configuration/integrations/rrweb/', + to: '/platforms/javascript/session-replay/', + }, + { + from: '/platforms/javascript/guides/gatsby/configuration/integrations/rrweb/', + to: '/platforms/javascript/session-replay/', + }, + { + from: '/platforms/javascript/guides/nextjs/configuration/integrations/rrweb/', + to: '/platforms/javascript/session-replay/', + }, + { + from: '/platforms/javascript/guides/react/configuration/integrations/rrweb/', + to: '/platforms/javascript/session-replay/', + }, + { + from: '/platforms/javascript/guides/remix/configuration/integrations/rrweb/', + to: '/platforms/javascript/session-replay/', + }, + { + from: '/platforms/javascript/guides/svelte/configuration/integrations/rrweb/', + to: '/platforms/javascript/session-replay/', + }, + { + from: '/platforms/javascript/guides/vue/configuration/integrations/rrweb/', + to: '/platforms/javascript/session-replay/', + }, + { + from: '/platforms/javascript/guides/wasm/configuration/integrations/rrweb/', + to: '/platforms/javascript/session-replay/', + }, + { + from: '/platforms/javascript/guides/remix/session-replay/custom-instrumentation/', + to: '/platforms/javascript/session-replay/', + }, + { + from: '/platforms/javascript/guides/remix/session-replay/custom-instrumentation/privacy-configuration/', + to: '/platforms/javascript/session-replay/', + }, + { + from: '/platforms/javascript/guides/gatsby/session-replay/custom-instrumentation/', + to: '/platforms/javascript/session-replay/', + }, + { + from: '/platforms/unreal/setup-crashreport/', + to: '/platforms/unreal/configuration/setup-crashreporter/', + }, + { + from: '/platforms/unreal/setup-crashreporter/', + to: '/platforms/unreal/configuration/setup-crashreporter/', + }, + { + from: '/platforms/unreal/debug-symbols/', + to: '/platforms/unreal/configuration/debug-symbols/', + }, + { + from: '/clients/ruby/config/', + to: '/platforms/ruby/configuration/options/', + }, + { + from: '/platforms/ruby/config/', + to: '/platforms/ruby/configuration/options/', + }, + { + from: '/contributing/approach/write-getting-started/', + to: '/contributing/approach/sdk-docs/write-getting-started/', + }, + { + from: '/contributing/approach/write-data-management/', + to: '/contributing/approach/sdk-docs/write-data-management/', + }, + { + from: '/contributing/approach/write-sdk-docs/', + to: '/contributing/approach/sdk-docs/', + }, + { + from: '/contributing/approach/write-configuration/', + to: '/contributing/approach/sdk-docs/write-configuration/', + }, + { + from: '/contributing/approach/common_content/', + to: '/contributing/approach/sdk-docs/common_content/', + }, + { + from: '/contributing/approach/write-performance/', + to: '/contributing/approach/sdk-docs/write-performance/', + }, + { + from: '/contributing/approach/write-enriching-events/', + to: '/contributing/approach/sdk-docs/write-enriching-events/', + }, + { + from: '/contributing/approach/write-usage/', + to: '/contributing/approach/sdk-docs/write-usage/', + }, + { + from: '/learn/releases/', + to: '/product/releases/', + }, + { + from: '/workflow/releases/', + to: '/product/releases/', + }, + { + from: '/workflow/releases/index/', + to: '/product/releases/', + }, + { + from: '/workflow/releases/release-automation/', + to: '/product/releases/', + }, + { + from: '/product/releases/release-automation/', + to: '/product/releases/', + }, + { + from: '/workflow/releases/health/', + to: '/product/releases/health/', + }, + { + from: '/product/releases/health/crash/', + to: '/product/releases/health/', + }, + { + from: '/product/releases/health/setup/', + to: '/product/releases/setup/', + }, + { + from: '/workflow/releases/release-automation/travis-ci/', + to: '/product/releases/setup/release-automation/travis-ci/', + }, + { + from: '/workflow/releases/release-automation/circleci/', + to: '/product/releases/setup/release-automation/circleci/', + }, + { + from: '/workflow/releases/release-automation/netlify/', + to: '/product/releases/setup/release-automation/netlify/', + }, + { + from: '/workflow/releases/release-automation/jenkins/', + to: '/product/releases/setup/release-automation/jenkins/', + }, + { + from: '/workflow/releases/release-automation/bitbucket-pipelines/', + to: '/product/releases/setup/release-automation/bitbucket-pipelines/', + }, + { + from: '/workflow/releases/release-automation/github-actions/', + to: '/product/releases/setup/release-automation/github-actions/', + }, + { + from: '/product/releases/setup/manual-setup-releases/', + to: '/product/releases/associate-commits/', + }, + { + from: '/product/releases/health/release-details/', + to: '/product/releases/release-details/', + }, + { + from: '/guides/integrate-frontend/upload-source-maps/', + to: '/product/sentry-basics/integrate-frontend/upload-source-maps/', + }, + { + from: '/product/sentry-basics/guides/integrate-frontend/upload-source-maps/', + to: '/product/sentry-basics/integrate-frontend/upload-source-maps/', + }, + { + from: '/guides/integrate-frontend/configure-scms/', + to: '/product/sentry-basics/integrate-frontend/configure-scms/', + }, + { + from: '/product/sentry-basics/guides/integrate-frontend/configure-scms/', + to: '/product/sentry-basics/integrate-frontend/configure-scms/', + }, + { + from: '/guides/integrate-frontend/', + to: '/product/sentry-basics/integrate-frontend/', + }, + { + from: '/product/sentry-basics/guides/integrate-frontend/', + to: '/product/sentry-basics/integrate-frontend/', + }, + { + from: '/product/sentry-basics/frontend/create-new-project/', + to: '/product/sentry-basics/integrate-frontend/', + }, + { + from: '/guides/integrate-frontend/create-new-project/', + to: '/product/sentry-basics/integrate-frontend/create-new-project/', + }, + { + from: '/product/sentry-basics/guides/integrate-frontend/create-new-project/', + to: '/product/sentry-basics/integrate-frontend/create-new-project/', + }, + { + from: '/guides/integrate-frontend/initialize-sentry-sdk/', + to: '/product/sentry-basics/integrate-frontend/initialize-sentry-sdk/', + }, + { + from: '/product/sentry-basics/guides/integrate-frontend/initialize-sentry-sdk/', + to: '/product/sentry-basics/integrate-frontend/initialize-sentry-sdk/', + }, + { + from: '/guides/integrate-frontend/generate-first-error/', + to: '/product/sentry-basics/integrate-frontend/generate-first-error/', + }, + { + from: '/product/sentry-basics/guides/integrate-frontend/generate-first-error/', + to: '/product/sentry-basics/integrate-frontend/generate-first-error/', + }, + { + from: '/basics/', + to: '/product/sentry-basics/', + }, + { + from: '/product/sentry-basics/guides/', + to: '/product/sentry-basics/', + }, + { + from: '/product/sentry-basics/tracing/', + to: '/product/sentry-basics/concepts/tracing/', + }, + { + from: '/performance/distributed-tracing/', + to: '/product/sentry-basics/concepts/tracing/distributed-tracing/', + }, + { + from: '/performance-monitoring/distributed-tracing/', + to: '/product/sentry-basics/concepts/tracing/distributed-tracing/', + }, + { + from: '/product/sentry-basics/guides/error-tracing/', + to: '/product/sentry-basics/concepts/tracing/distributed-tracing/', + }, + { + from: '/product/performance/distributed-tracing/', + to: '/product/sentry-basics/concepts/tracing/distributed-tracing/', + }, + { + from: '/product/sentry-basics/tracing/distributed-tracing/', + to: '/product/sentry-basics/concepts/tracing/distributed-tracing/', + }, + { + from: '/product/performance/trace-view/', + to: '/product/sentry-basics/concepts/tracing/trace-view/', + }, + { + from: '/product/sentry-basics/tracing/trace-view/', + to: '/product/sentry-basics/concepts/tracing/trace-view/', + }, + { + from: '/product/performance/event-detail/', + to: '/concepts/key-terms/tracing/trace-view/', + }, + { + from: '/product/sentry-basics/tracing/event-detail/', + to: '/product/sentry-basics/concepts/key-terms/tracing/trace-view/', + }, + { + from: '/concepts/key-terms/tracing/event-detail/', + to: '/concepts/key-terms/tracing/trace-view/', + }, + { + from: '/product/sentry-basics/dsn-explainer/', + to: '/product/sentry-basics/concepts/dsn-explainer/', + }, + { + from: '/enriching-error-data/environments/', + to: '/product/sentry-basics/concepts/environments/', + }, + { + from: '/learn/environments/', + to: '/product/sentry-basics/concepts/environments/', + }, + { + from: '/product/sentry-basics/environments/', + to: '/product/sentry-basics/concepts/environments/', + }, + { + from: '/product/sentry-basics/key-terms/', + to: '/product/sentry-basics/concepts/key-terms/', + }, + { + from: '/guides/enrich-data/', + to: '/product/sentry-basics/concepts/enrich-data/', + }, + { + from: '/product/sentry-basics/guides/enrich-data/', + to: '/product/sentry-basics/concepts/enrich-data/', + }, + { + from: '/product/sentry-basics/enrich-data/', + to: '/product/sentry-basics/concepts/enrich-data/', + }, + { + from: '/guides/integrate-backend/capturing-errors/', + to: '/product/sentry-basics/integrate-backend/capturing-errors/', + }, + { + from: '/product/sentry-basics/guides/integrate-backend/capturing-errors/', + to: '/product/sentry-basics/integrate-backend/capturing-errors/', + }, + { + from: '/guides/integrate-backend/', + to: '/product/sentry-basics/integrate-backend/', + }, + { + from: '/product/sentry-basics/guides/integrate-backend/', + to: '/product/sentry-basics/integrate-backend/', + }, + { + from: '/guides/integrate-backend/configuration-options/', + to: '/product/sentry-basics/integrate-backend/configuration-options/', + }, + { + from: '/product/sentry-basics/guides/integrate-backend/configuration-options/', + to: '/product/sentry-basics/integrate-backend/configuration-options/', + }, + { + from: '/guides/integrate-backend/getting-started/', + to: '/product/sentry-basics/integrate-backend/getting-started/', + }, + { + from: '/product/sentry-basics/guides/integrate-backend/getting-started/', + to: '/product/sentry-basics/integrate-backend/getting-started/', + }, + { + from: '/ssl/', + to: '/security-legal-pii/security/ssl/', + }, + { + from: '/ip-ranges/', + to: '/security-legal-pii/security/ip-ranges/', + }, + { + from: '/learn/security-policy-reporting/', + to: '/security-legal-pii/security/security-policy-reporting/', + }, + { + from: '/error-reporting/security-policy-reporting/', + to: '/security-legal-pii/security/security-policy-reporting/', + }, + { + from: '/platforms/javascript/troubleshooting/session-replay/', + to: '/platforms/javascript/session-replay/troubleshooting/', + }, + { + from: '/platforms/javascript/guides/:guide/troubleshooting/session-replay/', + to: '/platforms/javascript/session-replay/troubleshooting/', + }, + { + from: '/sdks/javascript/config/sourcemaps/', + to: '/platforms/javascript/sourcemaps/', + }, + { + from: '/platforms/javascript/sourcemaps/generation/', + to: '/platforms/javascript/sourcemaps/', + }, + { + from: '/platforms/javascript/sourcemaps/availability/', + to: '/platforms/javascript/sourcemaps/', + }, + { + from: '/platforms/javascript/configuration/sourcemaps/', + to: '/platforms/javascript/sourcemaps/', + }, + { + from: '/platforms/javascript/guides/docPlatform/sourcemaps/', + to: '/platforms/javascript/sourcemaps/', + }, + { + from: '/platforms/javascript/guides/:guide/sourcemaps/multiple-origins/', + to: '/platforms/javascript/guides/:guide/sourcemaps/', + }, + { + from: '/platforms/javascript/guides/:guide/sourcemaps/uploading-without-debug-ids/', + to: '/platforms/javascript/guides/:guide/sourcemaps/', + }, + { + from: '/platforms/javascript/sourcemaps/uploading-without-debug-ids/', + to: '/platforms/javascript/sourcemaps/troubleshooting_js/', + }, + { + from: '/platforms/javascript/sourcemaps/troubleshooting_js/verify-artifact-distribution-value-matches-value-configured-in-your-sdk/', + to: '/platforms/javascript/sourcemaps/troubleshooting_js/', + }, + { + from: '/platforms/javascript/sourcemaps/troubleshooting_js/uploading-without-debug-ids/', + to: '/platforms/javascript/sourcemaps/troubleshooting_js/legacy-uploading-methods/', + }, + { + from: '/platforms/javascript/sourcemaps/tools/webpack/', + to: '/platforms/javascript/sourcemaps/uploading/webpack/', + }, + { + from: '/platforms/javascript/sourcemaps/hosting-publicly/', + to: '/platforms/javascript/sourcemaps/uploading/hosting-publicly/', + }, + { + from: '/platforms/javascript/guides/cordova/troubleshooting/supported-browsers/', + to: '/platforms/javascript/guides/cordova/troubleshooting/', + }, + { + from: '/clients/cordova/ionic/', + to: '/platforms/javascript/guides/cordova/ionic/', + }, + { + from: '/sdks/react/integrations/vue-router/', + to: '/platforms/javascript/guides/vue/features/vue-router/', + }, + { + from: '/platforms/javascript/guides/vue/configuration/integrations/vue-router/', + to: '/platforms/javascript/guides/vue/features/vue-router/', + }, + { + from: '/platforms/javascript/vue/', + to: '/platforms/javascript/guides/vue/', + }, + { + from: '/clients/javascript/integrations/vue/', + to: '/platforms/javascript/guides/vue/', + }, + { + from: '/clients/javascript/integrations/angular/', + to: '/platforms/javascript/guides/angular/angular1/', + }, + { + from: '/platforms/javascript/gatsby/', + to: '/platforms/javascript/guides/gatsby/', + }, + { + from: '/platforms/javascript/guides/gatsby/errors/breadcrumbs/', + to: '/platforms/javascript/guides/gatsby/', + }, + { + from: '/clients/javascript/integrations/ember/', + to: '/platforms/javascript/guides/ember/', + }, + { + from: '/platforms/javascript/ember/', + to: '/platforms/javascript/guides/ember/', + }, + { + from: '/platforms/javascript/guides/electron/configuration/integrations/optional/', + to: '/platforms/javascript/guides/electron/configuration/integrations/electronminidump/', + }, + { + from: '/clients/electron/', + to: '/platforms/javascript/guides/electron/', + }, + { + from: '/platforms/javascript/electron/', + to: '/platforms/javascript/guides/electron/', + }, + { + from: '/platforms/electron/', + to: '/platforms/javascript/guides/electron/', + }, + { + from: '/platforms/javascript/electron/sourcemaps/', + to: '/platforms/javascript/guides/electron/', + }, + { + from: '/platforms/javascript/guides/electron/lazy-load-sentry/', + to: '/platforms/javascript/guides/electron/', + }, + { + from: '/sdks/react/integrations/redux/', + to: '/platforms/javascript/guides/react/features/redux/', + }, + { + from: '/platforms/javascript/guides/react/configuration/integrations/redux/', + to: '/platforms/javascript/guides/react/features/redux/', + }, + { + from: '/platforms/javascript/guides/react/integrations/react-router/', + to: '/platforms/javascript/guides/react/features/react-router/', + }, + { + from: '/platforms/javascript/guides/react/configuration/integrations/react-router/', + to: '/platforms/javascript/guides/react/features/react-router/', + }, + { + from: '/platforms/javascript/guides/session-replay/', + to: '/platforms/javascript/session-replay/', + }, + { + from: '/platforms/javascript/react/', + to: '/platforms/javascript/guides/react/', + }, + { + from: '/clients/javascript/integrations/react/', + to: '/platforms/javascript/guides/react/', + }, + { + from: '/sdks/react/', + to: '/platforms/javascript/guides/react/', + }, + { + from: '/platforms/react/', + to: '/platforms/javascript/guides/react/', + }, + { + from: '/clients/javascript/config/', + to: '/platforms/javascript/legacy-sdk/config/', + }, + { + from: '/clients/javascript/install/', + to: '/platforms/javascript/legacy-sdk/install/', + }, + { + from: '/clients/javascript/sourcemaps/', + to: '/platforms/javascript/legacy-sdk/sourcemaps/', + }, + { + from: '/clients/javascript/integrations/', + to: '/platforms/javascript/legacy-sdk/integrations/', + }, + { + from: '/clients/javascript/usage/', + to: '/platforms/javascript/legacy-sdk/usage/', + }, + { + from: '/clients/javascript/tips/', + to: '/platforms/javascript/legacy-sdk/tips/', + }, + { + from: '/platforms/node/pluggable-integrations/', + to: '/platforms/javascript/guides/node/configuration/integrations/', + }, + { + from: '/platforms/node/default-integrations/', + to: '/platforms/javascript/guides/node/configuration/integrations/', + }, + { + from: '/platforms/node/integrations/default-integrations/', + to: '/platforms/javascript/guides/node/configuration/integrations/', + }, + { + from: '/platforms/javascript/guides/:guide/configuration/integrations/pluggable-integrations/', + to: '/platforms/javascript/guides/:guide/configuration/integrations/', + }, + { + from: '/platforms/javascript/guides/:guide/configuration/integrations/default-integrations/', + to: '/platforms/javascript/guides/:guide/configuration/integrations/', + }, + { + from: '/platforms/node/sourcemaps/troubleshooting_js/uploading-without-debug-ids/', + to: '/platforms/javascript/guides/node/sourcemaps/troubleshooting_js/legacy-uploading-methods/', + }, + { + from: '/platforms/node/gcp_functions/', + to: '/platforms/javascript/guides/gcp-functions/', + }, + { + from: '/clients/node/integrations/express/', + to: '/platforms/javascript/guides/express/', + }, + { + from: '/platforms/node/express/', + to: '/platforms/javascript/guides/express/', + }, + { + from: '/platforms/node/guides/express/integrations/default-integrations/', + to: '/platforms/javascript/guides/express/', + }, + { + from: '/platforms/node/aws_lambda/', + to: '/platforms/javascript/guides/aws-lambda/', + }, + { + from: '/platforms/node/azure_functions/', + to: '/platforms/javascript/guides/azure-functions/', + }, + { + from: '/platforms/node/guides/azure-functions/typescript/', + to: '/platforms/javascript/guides/azure-functions/', + }, + { + from: '/clients/node/integrations/connect/', + to: '/platforms/javascript/guides/connect/', + }, + { + from: '/platforms/node/connect/', + to: '/platforms/javascript/guides/connect/', + }, + { + from: '/clients/node/integrations/koa/', + to: '/platforms/javascript/guides/koa/', + }, + { + from: '/platforms/node/koa/', + to: '/platforms/javascript/guides/koa/', + }, + { + from: '/platforms/node/guides/koa/typescript/', + to: '/platforms/javascript/guides/koa/', + }, + { + from: '/clients/node/config/', + to: '/platforms/javascript/guides/node/legacy-sdk/config/', + }, + { + from: '/clients/node/coffeescript/', + to: '/platforms/javascript/guides/node/legacy-sdk/coffeescript/', + }, + { + from: '/clients/node/sourcemaps/', + to: '/platforms/javascript/guides/node/legacy-sdk/sourcemaps/', + }, + { + from: '/clients/node/typescript/', + to: '/platforms/javascript/guides/node/legacy-sdk/typescript/', + }, + { + from: '/platforms/node/typescript/', + to: '/platforms/javascript/guides/node/legacy-sdk/typescript/', + }, + { + from: '/clients/node/integrations/', + to: '/platforms/javascript/guides/node/legacy-sdk/integrations/', + }, + { + from: '/clients/node/usage/', + to: '/platforms/javascript/guides/node/legacy-sdk/usage/', + }, + { + from: '/platforms/node/usage/set-level/', + to: '/platforms/javascript/guides/node/enriching-events/level/', + }, + { + from: '/platforms/node/usage/sdk-fingerprinting/', + to: '/platforms/javascript/guides/node/enriching-events/fingerprinting/', + }, + { + from: '/platforms/node/guides/:guide/usage/set-level/', + to: '/platforms/javascript/guides/:guide/enriching-events/level/', + }, + { + from: '/platforms/node/guides/:guide/usage/sdk-fingerprinting/', + to: '/platforms/javascript/guides/:guide/enriching-events/fingerprinting/', + }, + { + from: '/platforms/javascript/usage/set-level/', + to: '/platforms/javascript/enriching-events/level/', + }, + { + from: '/platforms/javascript/usage/sdk-fingerprinting/', + to: '/platforms/javascript/enriching-events/fingerprinting/', + }, + { + from: '/platforms/javascript/guides/:guide/usage/set-level/', + to: '/platforms/javascript/guides/:guide/enriching-events/level/', + }, + { + from: '/platforms/javascript/guides/:guide/usage/sdk-fingerprinting/', + to: '/platforms/javascript/guides/:guide/enriching-events/fingerprinting/', + }, + { + from: '/platforms/javascript/guides/:guide/tracing/instrumentation/opentelemetry/', + to: '/platforms/javascript/guides/:guide/opentelemetry/', + }, + // START redirecting deprecated generic metrics docs to concepts + { + from: '/platforms/apple/metrics/', + to: '/concepts/key-terms/tracing/span-metrics/', + }, + { + from: '/platforms/unity/metrics/', + to: '/concepts/key-terms/tracing/span-metrics/', + }, + // END redirecting deprecated generic metrics docs to concepts + { + from: '/learn/cli/configuration/', + to: '/cli/configuration/', + }, + { + from: '/learn/cli/', + to: '/cli/', + }, + { + from: '/learn/cli/releases/', + to: '/cli/releases/', + }, + { + from: '/cli/metrics/', + to: '/cli/send-event/', + }, + { + from: '/workflow/alerts-notifications/', + to: '/product/alerts/', + }, + { + from: '/product/alerts-notifications/', + to: '/product/alerts/', + }, + { + from: '/product/sentry-basics/guides/alert-notifications/', + to: '/product/alerts/', + }, + { + from: '/product/alerts/create-alerts/best-practices/', + to: '/product/alerts/best-practices/', + }, + { + from: '/product/sentry-basics/guides/alert-notifications/routing-alerts/', + to: '/product/alerts/create-alerts/routing-alerts/', + }, + { + from: '/product/sentry-basics/guides/alert-notifications/issue-alerts/', + to: '/product/alerts/create-alerts/issue-alert-config/', + }, + { + from: '/product/alerts/alert-settings/', + to: '/product/alerts/create-alerts/issue-alert-config/', + }, + { + from: '/product/alerts-notifications/alert-settings/', + to: '/product/alerts/create-alerts/issue-alert-config/', + }, + { + from: '/product/sentry-basics/guides/alert-notifications/metric-alerts/', + to: '/product/alerts/create-alerts/metric-alert-config/', + }, + { + from: '/workflow/alerts-notifications/alerts/', + to: '/product/alerts/alert-types/', + }, + { + from: '/workflow/notifications/alerts/', + to: '/product/alerts/alert-types/', + }, + { + from: '/product/alerts-notifications/alerts/', + to: '/product/alerts/alert-types/', + }, + { + from: '/product/alerts-notifications/metric-alerts/', + to: '/product/alerts/alert-types/', + }, + { + from: '/product/alerts-notifications/issue-alerts/', + to: '/product/alerts/alert-types/', + }, + { + from: '/product/alerts/create-alerts/crash-rate-alert-config/', + to: '/product/alerts/alert-types/', + }, + { + from: '/workflow/alerts-notifications/notifications/', + to: '/product/alerts/notifications/', + }, + { + from: '/workflow/notifications/workflow/', + to: '/product/alerts/notifications/', + }, + { + from: '/workflow/notifications/', + to: '/product/alerts/notifications/', + }, + { + from: '/product/notifications/', + to: '/product/alerts/notifications/', + }, + { + from: '/learn/notifications/', + to: '/product/alerts/notifications/', + }, + { + from: '/product/alerts-notifications/notifications/', + to: '/product/alerts/notifications/', + }, + { + from: '/product/sentry-basics/guides/alert-notifications/notifications/', + to: '/product/alerts/notifications/', + }, + { + from: '/workflow/integrations/amazon-sqs/', + to: '/organization/integrations/data-forwarding/amazon-sqs/', + }, + { + from: '/workflow/integrations/legacy-integrations/amazon-sqs/', + to: '/organization/integrations/data-forwarding/amazon-sqs/', + }, + { + from: '/product/integrations/amazon-sqs/', + to: '/organization/integrations/data-forwarding/amazon-sqs/', + }, + { + from: '/product/integrations/segment/', + to: '/organization/integrations/data-forwarding/segment/', + }, + { + from: '/workflow/integrations/splunk/', + to: '/organization/integrations/data-forwarding/splunk/', + }, + { + from: '/workflow/integrations/legacy-integrations/splunk/', + to: '/organization/integrations/data-forwarding/splunk/', + }, + { + from: '/product/integrations/splunk/', + to: '/organization/integrations/data-forwarding/splunk/', + }, + { + from: '/organization/integrations/data-visualization/splunk/', + to: '/organization/integrations/data-forwarding/splunk/', + }, + { + from: '/organization/integrations/data-visualization/segment/', + to: '/organization/integrations/data-forwarding/segment/', + }, + { + from: '/organization/integrations/data-visualization/amazon-sqs/', + to: '/organization/integrations/data-forwarding/amazon-sqs/', + }, + { + from: '/organization/integrations/data-visualization/grafana/', + to: '/organization/integrations/data-forwarding/grafana/', + }, + { + from: '/organization/integrations/data-visualization/', + to: '/organization/integrations/data-forwarding/', + }, + { + from: '/concepts/data-management/data-forwarding/', + to: '/organization/integrations/data-forwarding/', + }, + { + from: '/workflow/integrations/gitlab/', + to: '/organization/integrations/source-code-mgmt/gitlab/', + }, + { + from: '/workflow/integrations/global-integrations/gitlab/', + to: '/organization/integrations/source-code-mgmt/gitlab/', + }, + { + from: '/product/integrations/gitlab/', + to: '/organization/integrations/source-code-mgmt/gitlab/', + }, + { + from: '/workflow/integrations/azure-devops/', + to: '/organization/integrations/source-code-mgmt/azure-devops/', + }, + { + from: '/workflow/integrations/legacy-integrations/azure-devops/', + to: '/organization/integrations/source-code-mgmt/azure-devops/', + }, + { + from: '/workflow/integrations/global-integrations/azure-devops/', + to: '/organization/integrations/source-code-mgmt/azure-devops/', + }, + { + from: '/product/integrations/azure-devops/', + to: '/organization/integrations/source-code-mgmt/azure-devops/', + }, + { + from: '/integrations/azure-devops/', + to: '/organization/integrations/source-code-mgmt/azure-devops/', + }, + { + from: '/workflow/integrations/github/', + to: '/organization/integrations/source-code-mgmt/github/', + }, + { + from: '/workflow/integrations/legacy-integrations/github/', + to: '/organization/integrations/source-code-mgmt/github/', + }, + { + from: '/workflow/integrations/global-integrations/github/', + to: '/organization/integrations/source-code-mgmt/github/', + }, + { + from: '/product/integrations/github/', + to: '/organization/integrations/source-code-mgmt/github/', + }, + { + from: '/integrations/github-enterprise/', + to: '/organization/integrations/source-code-mgmt/github/', + }, + { + from: '/integrations/github/', + to: '/organization/integrations/source-code-mgmt/github/', + }, + { + from: '/workflow/integrations/bitbucket/', + to: '/organization/integrations/source-code-mgmt/bitbucket/', + }, + { + from: '/workflow/integrations/legacy-integrations/bitbucket/', + to: '/organization/integrations/source-code-mgmt/bitbucket/', + }, + { + from: '/workflow/integrations/global-integrations/bitbucket/', + to: '/organization/integrations/source-code-mgmt/bitbucket/', + }, + { + from: '/product/integrations/bitbucket/', + to: '/organization/integrations/source-code-mgmt/bitbucket/', + }, + { + from: '/integrations/bitbucket/', + to: '/organization/integrations/source-code-mgmt/bitbucket/', + }, + { + from: '/integrations/', + to: '/organization/integrations/', + }, + { + from: '/workflow/integrations/', + to: '/organization/integrations/', + }, + { + from: '/workflow/integrations/legacy-integrations/', + to: '/organization/integrations/', + }, + { + from: '/workflow/integrations/global-integrations/', + to: '/organization/integrations/', + }, + { + from: '/workflow/legacy-integrations/', + to: '/organization/integrations/', + }, + { + from: '/workflow/global-integrations/', + to: '/organization/integrations/', + }, + { + from: '/workflow/integrations/rookout/', + to: '/organization/integrations/debugging/rookout/', + }, + { + from: '/workflow/integrations/global-integrations/rookout/', + to: '/organization/integrations/debugging/rookout/', + }, + { + from: '/product/integrations/rookout/', + to: '/organization/integrations/debugging/rookout/', + }, + { + from: '/product/integrations/gcp-cloud-run/', + to: '/organization/integrations/cloud-monitoring/gcp-cloud-run/', + }, + { + from: '/product/integrations/aws-lambda/', + to: '/organization/integrations/cloud-monitoring/aws-lambda/', + }, + { + from: '/product/integrations/cloudflare-workers/', + to: '/platforms/javascript/guides/cloudflare/', + }, + { + from: '/product/integrations/vanta/', + to: '/organization/integrations/compliance/vanta/', + }, + { + from: '/product/integrations/truto/', + to: '/organization/integrations/compliance/truto/', + }, + { + from: '/integrations/discord/', + to: '/organization/integrations/notification-incidents/discord/', + }, + { + from: '/product/integrations/discord/', + to: '/organization/integrations/notification-incidents/discord/', + }, + { + from: '/product/accounts/early-adopter-features/discord/', + to: '/organization/integrations/notification-incidents/discord/', + }, + { + from: '/workflow/integrations/pagerduty/', + to: '/organization/integrations/notification-incidents/pagerduty/', + }, + { + from: '/workflow/integrations/legacy-integrations/pagerduty/', + to: '/organization/integrations/notification-incidents/pagerduty/', + }, + { + from: '/workflow/integrations/global-integrations/pagerduty/', + to: '/organization/integrations/notification-incidents/pagerduty/', + }, + { + from: '/product/integrations/pagerduty/', + to: '/organization/integrations/notification-incidents/pagerduty/', + }, + { + from: '/product/integrations/notification-incidents/amixr/', + to: '/organization/integrations/notification-incidents/', + }, + { + from: '/product/integrations/msteams/', + to: '/organization/integrations/notification-incidents/msteams/', + }, + { + from: '/product/integrations/rootly/', + to: '/organization/integrations/notification-incidents/rootly/', + }, + { + from: '/product/integrations/spikesh/', + to: '/product/integrations/notification-incidents/spikesh/', + }, + { + from: '/workflow/integrations/slack/', + to: '/product/integrations/notification-incidents/slack/', + }, + { + from: '/workflow/integrations/legacy-integrations/slack/', + to: '/product/integrations/notification-incidents/slack/', + }, + { + from: '/workflow/integrations/global-integrations/slack/', + to: '/product/integrations/notification-incidents/slack/', + }, + { + from: '/integrations/slack/', + to: '/product/integrations/notification-incidents/slack/', + }, + { + from: '/product/integrations/slack/', + to: '/product/integrations/notification-incidents/slack/', + }, + { + from: '/workflow/integrations/integration-platform/ui-components/', + to: '/product/integrations/integration-platform/ui-components/', + }, + { + from: '/workflow/integrations/integration-platform/', + to: '/product/integrations/integration-platform/', + }, + { + from: '/workflow/integrations/integration-platform/webhooks/', + to: '/product/integrations/integration-platform/webhooks/', + }, + { + from: '/product/integrations/openreplay/', + to: '/product/integrations/session-replay/openreplay/', + }, + { + from: '/product/integrations/fullstory/', + to: '/product/integrations/session-replay/fullstory/', + }, + { + from: '/product/integrations/jam/', + to: '/product/integrations/session-replay/jam/', + }, + { + from: '/product/integrations/atlas/', + to: '/product/integrations/session-replay/atlas/', + }, + { + from: '/workflow/integrations/split/', + to: '/product/integrations/feature-flag/split/', + }, + { + from: '/workflow/integrations/global-integrations/split/', + to: '/product/integrations/feature-flag/split/', + }, + { + from: '/product/integrations/split/', + to: '/product/integrations/feature-flag/split/', + }, + { + from: '/product/integrations/launchdarkly/', + to: '/product/integrations/feature-flag/launchdarkly/', + }, + { + from: '/workflow/integrations/vercel/', + to: '/product/integrations/deployment/vercel/', + }, + { + from: '/workflow/integrations/global-integrations/vercel/', + to: '/product/integrations/deployment/vercel/', + }, + { + from: '/product/integrations/vercel/', + to: '/product/integrations/deployment/vercel/', + }, + { + from: '/workflow/integrations/heroku/', + to: '/product/integrations/deployment/heroku/', + }, + { + from: '/workflow/integrations/legacy-integrations/gitlab/', + to: '/product/integrations/deployment/heroku/', + }, + { + from: '/product/integrations/heroku/', + to: '/product/integrations/deployment/heroku/', + }, + { + from: '/workflow/integrations/clubhouse/', + to: '/product/integrations/issue-tracking/shortcut/', + }, + { + from: '/workflow/integrations/legacy-integrations/clubhouse/', + to: '/product/integrations/issue-tracking/shortcut/', + }, + { + from: '/workflow/integrations/global-integrations/clubhouse/', + to: '/product/integrations/issue-tracking/shortcut/', + }, + { + from: '/product/integrations/clubhouse/', + to: '/product/integrations/issue-tracking/shortcut/', + }, + { + from: '/product/integrations/issue-tracking/clubhouse/', + to: '/product/integrations/issue-tracking/shortcut/', + }, + { + from: '/product/integrations/shortcut/', + to: '/product/integrations/issue-tracking/shortcut/', + }, + { + from: '/product/integrations/project-mgmt/shortcut/', + to: '/product/integrations/issue-tracking/shortcut/', + }, + { + from: '/product/integrations/sourcegraph/', + to: '/product/integrations/issue-tracking/sourcegraph/', + }, + { + from: '/product/integrations/incidentio/', + to: '/product/integrations/issue-tracking/incidentio/', + }, + { + from: '/product/integrations/height/', + to: '/product/integrations/issue-tracking/height/', + }, + { + from: '/product/integrations/project-mgmt/', + to: '/product/integrations/issue-tracking/', + }, + { + from: '/product/integrations/linear/', + to: '/product/integrations/issue-tracking/linear/', + }, + { + from: '/product/integrations/project-mgmt/linear/', + to: '/product/integrations/issue-tracking/linear/', + }, + { + from: '/workflow/integrations/clickup/', + to: '/product/integrations/issue-tracking/clickup/', + }, + { + from: '/integrations/clickup/', + to: '/product/integrations/issue-tracking/clickup/', + }, + { + from: '/workflow/integrations/global-integrations/clickup/', + to: '/product/integrations/issue-tracking/clickup/', + }, + { + from: '/product/integrations/clickup/', + to: '/product/integrations/issue-tracking/clickup/', + }, + { + from: '/product/integrations/project-mgmt/clickup/', + to: '/product/integrations/issue-tracking/clickup/', + }, + { + from: '/workflow/integrations/jira-server/', + to: '/product/integrations/issue-tracking/jira/', + }, + { + from: '/workflow/integrations/jira/', + to: '/product/integrations/issue-tracking/jira/', + }, + { + from: '/workflow/integrations/global-integrations/jira-server/', + to: '/product/integrations/issue-tracking/jira/', + }, + { + from: '/workflow/integrations/global-integrations/jira/', + to: '/product/integrations/issue-tracking/jira/', + }, + { + from: '/workflow/legacy-integrations/jira/', + to: '/product/integrations/issue-tracking/jira/', + }, + { + from: '/product/integrations/jira/', + to: '/product/integrations/issue-tracking/jira/', + }, + { + from: '/product/integrations/project-mgmt/jira/', + to: '/product/integrations/issue-tracking/jira/', + }, + { + from: '/integrations/jira/', + to: '/product/integrations/issue-tracking/jira/', + }, + { + from: '/workflow/integrations/asana/', + to: '/product/integrations/issue-tracking/asana/', + }, + { + from: '/workflow/integrations/legacy-integrations/asana/', + to: '/product/integrations/issue-tracking/asana/', + }, + { + from: '/workflow/integrations/global-integrations/asana/', + to: '/product/integrations/issue-tracking/asana/', + }, + { + from: '/product/integrations/asana/', + to: '/product/integrations/issue-tracking/asana/', + }, + { + from: '/product/integrations/project-mgmt/asana/', + to: '/product/integrations/issue-tracking/asana/', + }, + { + from: '/product/integrations/teamwork/', + to: '/product/integrations/issue-tracking/teamwork/', + }, + { + from: '/product/integrations/project-mgmt/teamwork/', + to: '/product/integrations/issue-tracking/teamwork/', + }, + { + from: '/workflow/user-settings/', + to: '/account/user-settings/', + }, + { + from: '/product/accounts/early-adopter/', + to: '/organization/early-adopter-features/', + }, + { + from: '/pricing/am2-pricing/', + to: '/pricing/legacy-pricing/', + }, + { + from: '/pricing/quotas/manage-event-stream-guide/adjusting-quotas/', + to: '/pricing/quotas/manage-event-stream-guide/#adjusting-quotas', + }, + { + from: '/learn/pricing/', + to: '/pricing/', + }, + { + from: '/product/pricing/', + to: '/pricing/', + }, + { + from: '/learn/quotas/', + to: '/pricing/quotas/', + }, + { + from: '/product/quotas/', + to: '/pricing/quotas/', + }, + { + from: '/learn/sensitive-data/', + to: '/security-legal-pii/scrubbing/', + }, + { + from: '/product/data-management-settings/dynamic-sampling/getting-started/', + to: '/pricing/quotas/', + }, + { + from: '/product/data-management-settings/dynamic-sampling/benefits-dynamic-sampling/', + to: '/pricing/quotas/', + }, + { + from: '/guides/manage-event-stream/', + to: '/pricing/quotas/manage-event-stream-guide/', + }, + { + from: '/learn/sso/', + to: '/organization/authentication/sso/', + }, + { + from: '/product/sso/', + to: '/organization/authentication/sso/', + }, + { + from: '/accounts/saml2/', + to: '/organization/authentication/sso/saml2/', + }, + { + from: '/guides/getting-started/', + to: '/organization/getting-started/', + }, + { + from: '/product/sentry-basics/guides/getting-started/', + to: '/organization/getting-started/', + }, + { + from: '/learn/membership/', + to: '/organization/membership/', + }, + { + from: '/product/membership/', + to: '/organization/membership/', + }, + { + from: '/guides/migration/', + to: '/product/accounts/migration/', + }, + { + from: '/product/sentry-basics/guides/migration/', + to: '/product/accounts/migration/', + }, + { + from: '/product/sentry-basics/migration/', + to: '/product/accounts/migration/', + }, + { + from: '/product/dashboards/customize-dashboards/', + to: '/product/dashboards/custom-dashboards/', + }, + { + from: '/workflow/visibility/', + to: '/product/dashboards/', + }, + { + from: '/workflow/dashboards/', + to: '/product/dashboards/', + }, + { + from: '/profiling/', + to: '/product/explore/profiling/', + }, + { + from: '/profiling/performance-overhead/', + to: '/product/explore/profiling/performance-overhead/', + }, + { + from: '/profiling/setup/', + to: '/product/explore/profiling/getting-started/', + }, + { + from: '/profiling/getting-started/', + to: '/product/explore/profiling/getting-started/', + }, + { + from: '/profiling/mobile-app-profiling/', + to: '/product/explore/profiling/mobile-app-profiling/', + }, + { + from: '/profiling/mobile-app-profiling/metrics/', + to: '/product/explore/profiling/mobile-app-profiling/metrics/', + }, + + { + from: '/data-management/rollups/', + to: '/concepts/data-management/event-grouping/', + }, + { + from: '/learn/rollups/', + to: '/concepts/data-management/event-grouping/', + }, + { + from: '/data-management/event-grouping/', + to: '/concepts/data-management/event-grouping/', + }, + { + from: '/product/data-management-settings/event-grouping/grouping-breakdown/', + to: '/concepts/data-management/event-grouping/', + }, + { + from: '/platforms/unity/data-management/event-grouping/', + to: '/concepts/data-management/event-grouping/', + }, + { + from: '/platforms/php/data-management/event-grouping/stack-trace-rules/', + to: '/concepts/data-management/event-grouping/', + }, + { + from: '/product/data-management-settings/event-grouping/server-side-fingerprinting/', + to: '/concepts/data-management/event-grouping/fingerprint-rules/', + }, + { + from: '/learn/data-forwarding/', + to: '/concepts/data-management/data-forwarding/', + }, + { + from: '/product/data-forwarding/', + to: '/concepts/data-management/data-forwarding/', + }, + { + from: '/data-management-settings/attachment-datascrubbing/', + to: '/security-legal-pii/scrubbing/attachment-scrubbing/', + }, + { + from: '/product/data-management-settings/advanced-datascrubbing/', + to: '/security-legal-pii/scrubbing/', + }, + { + from: '/data-management/advanced-datascrubbing/', + to: '/security-legal-pii/scrubbing/advanced-datascrubbing/', + }, + { + from: '/data-management-settings/advanced-datascrubbing/', + to: '/security-legal-pii/scrubbing/advanced-datascrubbing/', + }, + { + from: '/data-management-settings/server-side-scrubbing/', + to: '/security-legal-pii/scrubbing/server-side-scrubbing/', + }, + { + from: '/data-management-settings/event-pii-fields/', + to: '/security-legal-pii/scrubbing/server-side-scrubbing/event-pii-fields/', + }, + { + from: '/product/discover/', + to: '/product/explore/discover-queries/', + }, + { + from: '/workflow/discover/', + to: '/product/explore/discover-queries/', + }, + { + from: '/workflow/discover2/', + to: '/product/explore/discover-queries/', + }, + { + from: '/performance-monitoring/discover/', + to: '/product/explore/discover-queries/', + }, + { + from: '/performance/discover/', + to: '/product/explore/discover-queries/', + }, + { + from: '/guides/discover/', + to: '/product/explore/discover-queries/uncover-trends/', + }, + { + from: '/product/sentry-basics/guides/discover/', + to: '/product/explore/discover-queries/uncover-trends/', + }, + { + from: '/workflow/discover2/query-builder/', + to: '/product/explore/discover-queries/query-builder/', + }, + { + from: '/performance-monitoring/discover-queries/query-builder/', + to: '/product/explore/discover-queries/query-builder/', + }, + { + from: '/product/crons/alerts/', + to: '/product/crons/getting-started/', + }, + { + from: '/meta/relay/best-practices/', + to: '/product/relay/operating-guidelines/', + }, + { + from: '/product/relay/best-practices/', + to: '/product/relay/operating-guidelines/', + }, + { + from: '/meta/relay/', + to: '/product/relay/', + }, + { + from: '/product/security/relay/', + to: '/product/relay/', + }, + { + from: '/meta/relay/getting-started/', + to: '/product/relay/getting-started/', + }, + { + from: '/meta/relay/options/', + to: '/product/relay/options/', + }, + { + from: '/meta/relay/metrics/', + to: '/product/relay/monitoring/collected-metrics/', + }, + { + from: '/meta/relay/logging/', + to: '/product/relay/monitoring/', + }, + { + from: '/meta/relay/modes/', + to: '/product/relay/modes/', + }, + { + from: '/product/performance/', + to: '/product/sentry-basics/performance-monitoring/', + }, + { + from: '/product/performance/getting-started/', + to: '/product/insights/getting-started/', + }, + { + from: '/product/performance/filters-display/', + to: '/product/insights/overview/filters-display/', + }, + { + from: '/product/performance/filters-display/widgets/', + to: '/product/insights/overview/filters-display/widgets/', + }, + { + from: '/product/performance/trends/', + to: '/product/insights/overview/trends/', + }, + { + from: '/product/performance/transaction-summary/', + to: '/product/insights/overview/transaction-summary/', + }, + { + from: '/product/performance/metrics/', + to: '/product/insights/overview/metrics/', + }, + { + from: '/product/performance/performance-overhead/', + to: '/product/insights/performance-overhead/', + }, + { + from: '/product/performance/database/', + to: '/product/insights/backend/queries/', + }, + { + from: '/product/performance/query-insights/', + to: '/product/insights/backend/queries/', + }, + { + from: '/product/sentry-basics/metrics/', + to: '/product/insights/retention-priorities/', + }, + { + from: '/product/sentry-basics/sampling/', + to: '/product/insights/retention-priorities/', + }, + { + from: '/product/data-management-settings/server-side-sampling/', + to: '/product/insights/retention-priorities/', + }, + { + from: '/product/data-management-settings/server-side-sampling/getting-started/', + to: '/product/insights/retention-priorities/', + }, + { + from: '/product/data-management-settings/server-side-sampling/current-limitations/', + to: '/product/insights/retention-priorities/', + }, + { + from: '/product/data-management-settings/server-side-sampling/sampling-configurations/', + to: '/product/insights/retention-priorities/', + }, + { + from: '/product/data-management-settings/dynamic-sampling/current-limitations/', + to: '/product/insights/retention-priorities/', + }, + { + from: '/product/data-management-settings/dynamic-sampling/sampling-configurations/', + to: '/product/insights/retention-priorities/', + }, + { + from: '/product/performance/performance-at-scale/', + to: '/product/insights/retention-priorities/', + }, + { + from: '/product/performance/performance-at-scale/getting-started/', + to: '/product/insights/retention-priorities/', + }, + { + from: '/product/performance/performance-at-scale/benefits-performance-at-scale/', + to: '/product/insights/retention-priorities/', + }, + { + from: '/performance/', + to: '/product/insights/', + }, + { + from: '/performance/display/', + to: '/product/insights/', + }, + { + from: '/performance-monitoring/performance/', + to: '/product/insights/', + }, + { + from: '/performance/performance-tab/', + to: '/product/insights/overview', + }, + { + from: '/performance/performance-homepage/', + to: '/product/insights/', + }, + { + from: '/performance-monitoring/setup/', + to: '/product/insights/getting-started/', + }, + { + from: '/performance-monitoring/getting-started/', + to: '/product/insights/getting-started/', + }, + { + from: '/performance-monitoring/performance/metrics/', + to: '/product/insights/overview/metrics/', + }, + { + from: '/product/performance/display/', + to: '/product/insights/overview/filters-display/', + }, + { + from: '/product/issues/issue-owners/', + to: '/product/issues/ownership-rules/', + }, + { + from: '/product/issue-owners/', + to: '/product/issues/ownership-rules/', + }, + { + from: '/workflow/issue-owners/', + to: '/product/issues/ownership-rules/', + }, + { + from: '/learn/issue-owners/', + to: '/product/issues/ownership-rules/', + }, + { + from: '/features/owners/', + to: '/product/issues/ownership-rules/', + }, + { + from: '/product/sentry-basics/issue-owners/', + to: '/product/issues/ownership-rules/', + }, + { + from: '/product/releases/suspect-commits/', + to: '/product/issues/suspect-commits/', + }, + { + from: '/product/accounts/early-adopter-features/issue-archiving/', + to: '/product/issues/states-triage/', + }, + { + from: '/product/issues/performance-issues/regex-decoding-main-thread/', + to: '/product/issues/issue-details/performance-issues/regex-main-thread/', + }, + { + from: '/product/issues/performance-issues/consecutive-http/', + to: '/product/issues/issue-details/performance-issues/consecutive-http/', + }, + { + from: '/product/issues/performance-issues/slow-db-queries/', + to: '/product/issues/issue-details/performance-issues/slow-db-queries/', + }, + { + from: '/product/issues/performance-issues/image-decoding-main-thread/', + to: '/product/issues/issue-details/performance-issues/image-decoding-main-thread/', + }, + { + from: '/product/issues/performance-issues/', + to: '/product/issues/issue-details/performance-issues/', + }, + { + from: '/product/issues/issue-details/performance-issues/main-thread-io/', + to: '/product/issues/issue-details/performance-issues/', + }, + { + from: '/product/issues/performance-issues/n-one-queries/', + to: '/product/issues/issue-details/performance-issues/n-one-queries/', + }, + { + from: '/product/issues/performance-issues/uncompressed-asset/', + to: '/product/issues/issue-details/performance-issues/uncompressed-asset/', + }, + { + from: '/product/issues/performance-issues/consecutive-db-queries/', + to: '/product/issues/issue-details/performance-issues/consecutive-db-queries/', + }, + { + from: '/product/issues/performance-issues/json-decoding-main-thread/', + to: '/product/issues/issue-details/performance-issues/json-decoding-main-thread/', + }, + { + from: '/product/issues/performance-issues/http-overhead/', + to: '/product/issues/issue-details/performance-issues/http-overhead/', + }, + { + from: '/product/issues/performance-issues/large-render-blocking-asset/', + to: '/product/issues/issue-details/performance-issues/large-render-blocking-asset/', + }, + { + from: '/product/issues/performance-issues/frame-drop/', + to: '/product/issues/issue-details/performance-issues/frame-drop/', + }, + { + from: '/product/issues/performance-issues/large-http-payload/', + to: '/product/issues/issue-details/performance-issues/large-http-payload/', + }, + + { + from: '/learn/breadcrumbs/', + to: '/product/issues/issue-details/breadcrumbs/', + }, + { + from: '/product/issues/issue-details/suggested-fix/', + to: '/product/issues/issue-details/sentry-seer/', + }, + { + from: '/product/issues/issue-details/ai-suggested-solution/', + to: '/product/issues/issue-details/sentry-seer/', + }, + { + from: '/product/issues/issue-details/sentry-ai/', + to: '/product/issues/issue-details/sentry-seer/', + }, + { + from: '/guides/grouping-and-fingerprints/', + to: '/product/issues/grouping-and-fingerprints/', + }, + { + from: '/product/sentry-basics/guides/grouping-and-fingerprints/', + to: '/product/issues/grouping-and-fingerprints/', + }, + { + from: '/product/sentry-basics/grouping-and-fingerprints/', + to: '/product/issues/grouping-and-fingerprints/', + }, + { + from: '/product/accounts/quotas/org-stats/', + to: '/product/stats/', + }, + { + from: '/workflow/search/', + to: '/concepts/search/', + }, + { + from: '/product/search/', + to: '/concepts/search/', + }, + { + from: '/learn/search/', + to: '/concepts/search/', + }, + { + from: '/product/sentry-basics/search/', + to: '/concepts/search/', + }, + { + from: '/product/sentry-basics/search/saved-searches/', + to: '/concepts/search/saved-searches/', + }, + { + from: '/product/sentry-basics/search/searchable-properties/user-feedback/', + to: '/concepts/search/searchable-properties/user-feedback/', + }, + { + from: '/product/sentry-basics/search/searchable-properties/events/', + to: '/concepts/search/searchable-properties/events/', + }, + { + from: '/product/sentry-basics/search/searchable-properties/issues/', + to: '/concepts/search/searchable-properties/issues/', + }, + { + from: '/product/sentry-basics/search/searchable-properties/', + to: '/concepts/search/searchable-properties/', + }, + { + from: '/product/sentry-basics/search/searchable-properties/releases/', + to: '/concepts/search/searchable-properties/releases/', + }, + { + from: '/product/sentry-basics/search/searchable-properties/spans/', + to: '/concepts/search/searchable-properties/spans/', + }, + { + from: '/product/sentry-basics/search/searchable-properties/session-replay/', + to: '/concepts/search/searchable-properties/session-replay/', + }, + { + from: '/platforms/javascript/configuration/micro-frontend-support/', + to: '/platforms/javascript/best-practices/micro-frontends/', + }, + { + from: '/platforms/javascript/configuration/sentry-testkit/', + to: '/platforms/javascript/best-practices/sentry-testkit/', + }, + { + from: '/platforms/javascript/configuration/webworkers/', + to: '/platforms/javascript/best-practices/web-workers/', + }, + { + from: '/support/', + to: 'https://sentry.zendesk.com/hc/en-us/', + }, + { + from: '/clients/python/', + to: '/platforms/python/legacy-sdk/', + }, + { + from: '/platforms/javascript/config/sourcemaps/', + to: '/platforms/javascript/sourcemaps/', + }, + { + from: '/platforms/java/config/', + to: '/platforms/java/configuration/', + }, + { + from: '/platforms/native/attachments/', + to: '/platforms/native/enriching-error-data/attachments/', + }, + { + from: '/platforms/python/configuration/integrations/', + to: '/platforms/python/integrations/', + }, + { + from: '/platforms/python/redis/', + to: '/platforms/python/integrations/redis/', + }, + { + from: '/platforms/python/sqlalchemy/', + to: '/platforms/python/integrations/sqlalchemy/', + }, + { + from: '/platforms/python/pure_eval/', + to: '/platforms/python/integrations/pure_eval/', + }, + { + from: '/platforms/python/gnu_backtrace/', + to: '/platforms/python/integrations/gnu_backtrace/', + }, + { + from: '/learn/context/', + to: '/platform-redirect/?next=/enriching-events/context/', + }, + { + from: '/clients/java/config/', + to: '/platforms/java/configuration/', + }, + { + from: '/clientdev/interfaces/http/', + to: 'https://develop.sentry.dev/sdk/data-model/event-payloads/request', + }, + { + from: '/clients/csharp/', + to: '/platforms/dotnet/legacy-sdk/', + }, + { + from: '/clients/go/', + to: '/platforms/go/legacy-sdk/', + }, + { + from: '/clients/node/', + to: '/platforms/node/legacy-sdk/', + }, + { + from: '/clients/javascript/', + to: '/platforms/javascript/legacy-sdk/', + }, + { + from: '/clients/ruby/', + to: '/platforms/ruby/', + }, + { + from: '/clients/java/integrations/', + to: '/platforms/java/', + }, + { + from: '/clients/java/modules/android/', + to: '/platforms/android', + }, + { + from: '/clients/javascript/integrations/angular2/', + to: '/platforms/javascript/guides/angular/', + }, + { + from: '/clients/javascript/integrations/angularjs/', + to: '/platforms/javascript/guides/angular/', + }, + { + from: '/platforms/javascript/angular/', + to: '/platforms/javascript/guides/angular/', + }, + { + from: '/node/event-processors/', + to: '/platforms/node/enriching-events/event-processors/', + }, + { + from: '/platforms/node/guides/connect/event-processors/', + to: '/platforms/node/enriching-events/event-processors/', + }, + { + from: '/platforms/javascript/sourcemaps/uploading/multiple-origins/', + to: '/platforms/javascript/sourcemaps/troubleshooting_js/#multiple-origins', + }, + { + from: '/platforms/python/guides/celery/hints/', + to: '/platforms/python/integrations/celery/', + }, + { + from: '/platforms/python/guides/chalice/integrations/', + to: '/platforms/python/integrations/chalice/', + }, + { + from: '/platforms/unrealengine/', + to: '/platforms/unreal/', + }, + { + from: '/platforms/minidump/crashpad/', + to: '/platforms/native/guides/crashpad/', + }, + { + from: '/platforms/minidump/breakpad/', + to: '/platforms/native/guides/breakpad/', + }, + { + from: '/platforms/rust/usage/sdk-fingerprinting/', + to: '/product/data-management-settings/event-grouping/fingerprint-rules/', + }, + { + from: '/platforms/javascript/guides/angular/lazy-load-sentry/', + to: '/platforms/javascript/guides/angular/', + }, + { + from: '/platforms/java/guides/spring/data-management/data-forwarding/', + to: '/platforms/java/guides/spring/data-management/', + }, + { + from: '/platforms/android/usage/advanced-usage/', + to: '/platforms/android/usage/', + }, + { + from: '/platforms/javascript/guides/react/performance/included-instrumentation/', + to: '/platforms/javascript/guides/react/performance/instrumentation/', + }, + { + from: '/platforms/php/guides/symfony/data-management/data-forwarding/', + to: '/platforms/php/guides/symfony/data-management/', + }, + { + from: '/platforms/php/guides/laravel/configuration/transports/', + to: '/platforms/php/guides/laravel/configuration/laravel-options/', + }, + { + from: '/platforms/go/data-management/event-grouping/fingerprint-rules/', + to: '/platforms/go/data-management/', + }, + { + from: '/platforms/elixir/enriching-events/scopes/', + to: '/platforms/elixir/enriching-events/', + }, + { + from: '/platforms/android/performance/custom-instrumentation/', + to: '/platforms/android/performance/', + }, + { + from: '/platforms/elixir/data-management/event-grouping/', + to: '/platforms/elixir/data-management/', + }, + { + from: '/platforms/elixir/configuration/draining/', + to: '/platforms/elixir/configuration/', + }, + { + from: '/clients/ruby/integrations/rails/', + to: '/platforms/ruby/guides/rails/', + }, + { + from: '/platforms/java/configuration/integrations/', + to: '/platforms/java/integrations/', + }, + { + from: '/platforms/apple/configuration/integrations/', + to: '/platforms/apple/integrations/', + }, + { + from: '/platforms/javascript/guides/cordova/integrations/custom/', + to: '/platforms/javascript/guides/cordova/', + }, + { + from: '/platforms/javascript/guides/cordova/config/basics/', + to: '/platforms/javascript/guides/cordova/configuration/', + }, + { + from: '/platforms/javascript/guides/electron/data-management/event-grouping/grouping-enhancements/', + to: '/platforms/javascript/guides/electron/data-management/', + }, + { + from: '/platforms/javascript/guides/ember/configuration/other-versions/ember2/', + to: '/platforms/javascript/guides/ember/configuration/', + }, + { + from: '/platforms/javascript/guides/ember/configuration/other-versions/', + to: '/platforms/javascript/guides/ember/configuration/', + }, + { + from: '/platforms/javascript/guides/angular/components/', + to: '/platforms/javascript/guides/angular/', + }, + { + from: '/platforms/javascript/legacy-sdk/integrations/', + to: '/platforms/javascript/legacy-sdk/', + }, + { + from: '/platforms/javascript/guides/nextjs/manual/', + to: '/platforms/javascript/guides/nextjs/', + }, + { + from: '/platforms/javascript/guides/react/components/errorboundary/', + to: '/platforms/javascript/guides/react/', + }, + { + from: '/platforms/javascript/guides/react/components/profiler/', + to: '/platforms/javascript/guides/react/', + }, + { + from: '/platforms/javascript/guides/remix/install/cdn/', + to: '/platforms/javascript/guides/remix/#install', + }, + { + from: '/platforms/javascript/performance/capturing/group-transactions/', + to: '/platforms/javascript/performance/', + }, + { + from: '/platforms/javascript/sourcemaps/tools/', + to: '/platforms/javascript/sourcemaps/', + }, + { + from: '/product/accounts/pricing/', + to: '/pricing/', + }, + { + from: '/accounts/pricing/', + to: '/pricing/', + }, + { + from: '/product/account/pricing/', + to: '/pricing/', + }, + { + from: '/platforms/dotnet/compatibility/', + to: '/platforms/dotnet/', + }, + { + from: '/product/session-replay/protecting-user-privacy/', + to: '/security-legal-pii/scrubbing/protecting-user-privacy/', + }, + { + from: '/platforms/javascript/guides/react/features/component-tracking/', + to: '/platforms/javascript/guides/react/features/component-names/', + }, + { + from: '/product/accounts/early-adopter-features/', + to: '/organization/early-adopter-features/', + }, + { + from: '/product/accounts/choose-your-data-center/', + to: '/organization/data-storage-location/', + }, + { + from: '/product/accounts/membership/', + to: '/organization/membership/', + }, + { + from: '/product/accounts/sso/', + to: '/organization/authentication/sso/', + }, + { + from: '/product/accounts/sso/azure-sso/', + to: '/organization/authentication/sso/azure-sso/', + }, + { + from: '/product/accounts/sso/okta-sso/', + to: '/organization/authentication/sso/okta-sso/', + }, + { + from: '/product/accounts/sso/okta-sso/okta-scim/', + to: '/organization/authentication/sso/okta-sso/okta-scim/', + }, + { + from: '/product/accounts/sso/ping-sso/', + to: '/organization/authentication/sso/ping-sso/', + }, + { + from: '/product/accounts/sso/saml2/', + to: '/organization/authentication/sso/saml2/', + }, + { + from: '/product/accounts/getting-started/', + to: '/organization/getting-started/', + }, + { + from: '/product/accounts/require-2fa/', + to: '/organization/authentication/two-factor-authentication/', + }, + { + from: '/product/accounts/quotas/', + to: '/pricing/quotas/', + }, + { + from: '/product/accounts/quotas/spike-protection/', + to: '/pricing/quotas/spike-protection/', + }, + { + from: '/product/accounts/quotas/spend-allocation/', + to: '/pricing/quotas/spend-allocation/', + }, + { + from: '/product/accounts/quotas/manage-event-stream-guide/', + to: '/pricing/quotas/manage-event-stream-guide/', + }, + { + from: '/product/accounts/quotas/manage-transaction-quota/', + to: '/pricing/quotas/manage-transaction-quota/', + }, + { + from: '/product/accounts/quotas/manage-replay-quota/', + to: '/pricing/quotas/manage-replay-quota/', + }, + { + from: '/product/accounts/quotas/manage-attachments-quota/', + to: '/pricing/quotas/manage-attachments-quota/', + }, + { + from: '/product/accounts/quotas/manage-cron-monitors/', + to: '/pricing/quotas/manage-cron-monitors/', + }, + { + from: '/product/accounts/auth-tokens/', + to: '/account/auth-tokens/', + }, + { + from: '/product/accounts/user-settings/', + to: '/account/user-settings/', + }, + { + from: '/product/accounts/', + to: '/account/', + }, + { + from: '/account/getting-started/', + to: '/organization/getting-started/', + }, + { + from: '/account/membership/', + to: '/organization/membership/', + }, + { + from: '/account/early-adopter-features/', + to: '/organization/early-adopter-features/', + }, + { + from: '/account/quotas/', + to: '/pricing/quotas/', + }, + { + from: '/accounts/quotas/', + to: '/pricing/quotas/', + }, + { + from: '/organization/quotas/', + to: '/pricing/quotas/', + }, + { + from: '/account/sso/', + to: '/organization/authentication/sso/', + }, + { + from: '/product/ai-monitoring/', + to: '/product/insights/ai/agents/', + }, + { + from: '/product/insights/llm-monitoring/', + to: '/product/insights/ai/agents/', + }, + { + from: '/product/insights/llm-monitoring/getting-started/', + to: '/product/insights/ai/agents/getting-started/', + }, + { + from: '/product/insights/llm-monitoring/getting-started/the-dashboard/', + to: '/product/insights/ai/agents/getting-started/the-dashboard/', + }, + { + from: '/product/metrics/', + to: '/product/explore/metrics/', + }, + { + from: '/product/profiling/', + to: '/product/explore/profiling/', + }, + { + from: '/product/discover-queries/', + to: '/product/explore/discover-queries/', + }, + { + from: '/product/session-replay/', + to: '/product/explore/session-replay/', + }, + { + from: '/enriching-error-data/advanced-datascrubbing/', + to: '/concepts/data-management/advanced-datascrubbing/', + }, + { + from: '/data-management/advanced-datascrubbing/', + to: '/concepts/data-management/advanced-datascrubbing/', + }, + { + from: '/platforms/javascript/guides/react/features/component-tracking/', + to: '/platforms/javascript/guides/react/features/component-names/', + }, + { + from: '/platforms/rust/usage/sdk-fingerprinting/', + to: '/concepts/data-management/event-grouping/fingerprint-rules/', + }, + { + from: '/platforms/javascript/guides/angular/lazy-load-sentry/', + to: '/platforms/javascript/guides/angular/', + }, + { + from: '/platforms/java/guides/spring/data-management/data-forwarding/', + to: '/platforms/java/guides/spring/data-management/', + }, + { + from: '/support/', + to: 'https://sentry.zendesk.com/hc/en-us/', + }, + { + from: '/product/security-policy-reporting/', + to: '/security-legal-pii/security/security-policy-reporting/', + }, + { + from: '/product/session-replay/protecting-user-privacy/', + to: '/security-legal-pii/scrubbing/protecting-user-privacy/', + }, + { + from: '/product/data-management-settings/restrict-display/', + to: '/security-legal-pii/scrubbing/restrict-display/', + }, + { + from: '/product/performance/requests/', + to: '/product/insights/requests/', + }, + { + from: '/product/performance/queries/', + to: '/product/insights/queries/', + }, + { + from: '/product/performance/resources/', + to: '/product/insights/assets/', + }, + { + from: '/product/performance/assets/', + to: '/product/insights/assets/', + }, + { + from: '/product/performance/mobile-vitals/', + to: '/product/insights/mobile-vitals/', + }, + { + from: '/product/performance/mobile-vitals/screen-loads/', + to: '/product/insights/mobile-vitals/screen-loads/', + }, + { + from: '/product/performance/mobile-vitals/app-starts/', + to: '/product/insights/mobile-vitals/app-starts/', + }, + { + from: '/product/performance/web-vitals/', + to: '/product/insights/web-vitals/', + }, + { + from: '/product/performance/web-vitals/web-vitals-concepts/', + to: '/product/insights/web-vitals/web-vitals-concepts/', + }, + { + from: '/product/performance/caches/', + to: '/product/insights/caches/', + }, + { + from: '/product/performance/caches/cache-page/', + to: '/product/insights/caches/cache-page/', + }, + { + from: '/product/performance/queue-monitoring/', + to: '/product/insights/queue-monitoring/', + }, + { + from: '/product/performance/queue-monitoring/queues-page/', + to: '/product/insights/queue-monitoring/queues-page/', + }, + { + from: '/product/explore/session-replay/protecting-user-privacy/', + to: '/security-legal-pii/scrubbing/protecting-user-privacy/', + }, + { + from: '/account/choose-your-data-center/', + to: '/organization/data-storage-location/', + }, + { + from: '/account/early-adopter/', + to: '/organization/early-adopter-features/', + }, + { + from: '/account/quotas/spike-protection/', + to: '/pricing/quotas/spike-protection/', + }, + { + from: '/_platforms/', + to: '/platforms', + }, + { + from: '/accounts/require-2fa/', + to: '/organization/authentication/two-factor-authentication/', + }, + { + from: '/platforms/go/guides/fiber/user-feedback/configuration/', + to: '/platforms/go/user-feedback/', + }, + { + from: '/platforms/javascript/guides/', + to: '/platforms/javascript/', + }, + { + from: '/platforms/native/crashpad/', + to: '/platforms/native/guides/crashpad/', + }, + { + from: '/platforms/python/legacy-sdk/integrations/pylons/', + to: '/platforms/python/legacy-sdk/integrations/#pylons', + }, + { + from: '/concepts/data-management/event-grouping/grouping-breakdown/', + to: '/concepts/data-management/event-grouping/', + }, + { + from: '/product/explore/session-replay/performance-overhead/', + to: '/product/explore/session-replay/web/performance-overhead/', + }, + { + from: '/organization/integrations/project-mgmt/jira/', + to: '/organization/integrations/issue-tracking/jira/', + }, + { + from: '/organization/integrations/source-code-/', + to: '/organization/integrations/source-code-mgmt/', + }, + { + from: '/product/explore/session-replay/getting-started/', + to: '/product/explore/session-replay/', + }, + { + from: '/product/explore/session-replay/web/getting-started/', + to: '/product/explore/session-replay/web/', + }, + { + from: '/product/explore/session-replay/web/replay-page-and-filters/', + to: '/product/explore/session-replay/replay-page-and-filters/', + }, + { + from: '/product/explore/session-replay/web/replay-details/', + to: '/product/explore/session-replay/replay-details/', + }, + { + from: '/product/explore/session-replay/hydration-errors/', + to: '/product/issues/issue-details/replay-issues/hydration-error/', + }, + { + from: '/product/explore/session-replay/rage-dead-clicks/', + to: '/product/issues/issue-details/replay-issues/rage-clicks/', + }, + { + from: '/product/explore/session-replay/privacy/', + to: '/security-legal-pii/scrubbing/protecting-user-privacy/', + }, + { + from: '/product/teams/roles/', + to: '/organization/membership/#team-level-roles', + }, + { + from: '/enriching-error-data/additional-data/', + to: '/concepts/key-terms/enrich-data/', + }, + { + from: '/performance/instrumentation/automatic-instrumentation/', + to: '/tracing/instrumentation/automatic-instrumentation', + }, + { + from: '/concepts/key-terms/key-terms/tracing/trace-view/#operations-breakdown/', + to: '/product/insights/', + }, + { + from: '/platforms/javascript/guides/aws-lambda/container-image/', + to: '/platforms/javascript/guides/aws-lambda/install/', + }, + { + from: '/platforms/javascript/guides/aws-lambda/layer/', + to: '/platforms/javascript/guides/aws-lambda/install/', + }, + { + from: '/api/projects/post-project-service-hooks/', + to: '/api/projects/register-a-new-service-hook/', + }, + { + from: '/api/organizations/list-your-organizations/', + to: '/api/users/list-your-organizations/', + }, + { + from: '/clients/cocoa/', + to: '/platforms/apple/', + }, + { + from: '/clients/react-native/', + to: 'platforms/react-native/', + }, + { + from: '/learn/scopes/?platform=rust/', + to: '/platforms/rust/enriching-events/scopes/', + }, + { + from: '/platforms/android/android-video/', + to: '/platforms/android/', + }, + { + from: '/platforms/android/tracing/included-instrumentation/', + to: '/platforms/android/tracing/instrumentation/automatic-instrumentation', + }, + { + from: '/platforms/javascript/guides/cordova/tracing/trace-propagation/', + to: '/platforms/javascript/guides/cordova/tracing/instrumentation/custom-instrumentation/', + }, + { + from: '/platforms/javascript/pluggable-integrations/', + to: '/platforms/javascript/configuration/integrations/#lazy-loading-integrations', + }, + { + from: '/platforms/react-native/tracing/included-instrumentation/', + to: '/platforms/react-native/tracing/instrumentation/automatic-instrumentation/', + }, + { + from: '/platforms/rust/env_logger/index.html/', + to: '/platforms/rust/configuration/environments/', + }, + { + from: '/clients/cordova/', + to: '/platforms/javascript/guides/cordova/', + }, + { + from: '/organization/integrations/incidentio/', + to: '/organization/integrations/issue-tracking/incidentio/', + }, + { + from: '/contributing/onboarding-wizard/', + to: '/contributing/', + }, + { + from: '/security-legal-pii/security/security-policy-reporting/', + to: '/platform-redirect/?next=/security-policy-reporting/', + }, + /* Uptime Monitoring */ + { + from: '/product/alerts/uptime-monitoring/', + to: '/product/uptime-monitoring/', + }, + { + from: '/product/alerts/uptime-monitoring/automatic-detection/', + to: '/product/uptime-monitoring/automatic-detection/', + }, + { + from: '/product/alerts/uptime-monitoring/uptime-tracing/', + to: '/product/uptime-monitoring/uptime-tracing/', + }, + { + from: '/product/alerts/uptime-monitoring/troubleshooting/', + to: '/product/uptime-monitoring/troubleshooting/', + }, +]; + +const DEVELOPER_DOCS_REDIRECTS: Redirect[] = [ + { + from: '/', + to: '/getting-started/', + }, + { + from: '/docs-components/', + to: '/development/docs/', + }, + { + from: '/docs/', + to: '/development/docs/', + }, + { + from: '/inclusion/', + to: '/development/inclusive-language/', + }, + { + from: '/translations/', + to: '/development/translations/', + }, + { + from: '/environment/', + to: '/development/environment/', + }, + { + from: '/environment/pycharm/', + to: '/development/environment/pycharm/', + }, + { + from: '/environment/u2f/', + to: '/development/environment/u2f/', + }, + { + from: '/testing/', + to: '/development/testing/', + }, + { + from: '/philosophy/', + to: '/development/philosophy/', + }, + { + from: '/commit-messages/', + to: '/development/commit-messages/', + }, + { + from: '/code-review/', + to: '/development/code-review/', + }, + { + from: '/workflow/', + to: '/development/workflow/', + }, + { + from: '/continuous-integration/', + to: '/development/continuous-integration/', + }, + { + from: '/python-dependencies/', + to: '/development/python-dependencies/', + }, + { + from: '/rust/', + to: '/development/rust/', + }, + { + from: '/database-migrations/', + to: '/development/database-migrations/', + }, + { + from: '/testing/', + to: '/development/testing/', + }, + { + from: '/analytics/', + to: '/development/analytics/', + }, + { + from: '/architecture/', + to: '/application-architecture/', + }, + { + from: '/sentry-vs-getsentry/', + to: '/application/sentry-vs-getsentry/', + }, + { + from: '/config/', + to: '/application/config/', + }, + { + from: '/issue-platform/', + to: '/application/issue-platform/', + }, + { + from: '/issue-platform-detectors/', + to: '/application/issue-platform-detectors/', + }, + { + from: '/feature-flags/', + to: '/application/feature-flags/', + }, + { + from: '/feature-flags/flagpole/', + to: '/application/feature-flags/flagpole/', + }, + { + from: '/ab-testing/', + to: '/application/ab-testing/', + }, + { + from: '/options/', + to: '/application/options/', + }, + { + from: '/serializers/', + to: '/application/serializers/', + }, + { + from: '/grouping/', + to: '/application/grouping/', + }, + { + from: '/pii/', + to: '/application/pii/', + }, + { + from: '/pii/types/', + to: '/application/pii/types/', + }, + { + from: '/pii/methods/', + to: '/application/pii/methods/', + }, + { + from: '/pii/selectors/', + to: '/application/pii/selectors/', + }, + { + from: '/transaction-clustering/', + to: '/application/transaction-clustering/', + }, + { + from: '/dynamic-sampling/', + to: '/application/dynamic-sampling/', + }, + { + from: '/dynamic-sampling/architecture/', + to: '/application/dynamic-sampling/architecture/', + }, + { + from: '/dynamic-sampling/fidelity-and-biases/', + to: '/application/dynamic-sampling/fidelity-and-biases/', + }, + { + from: '/dynamic-sampling/the-big-picture/', + to: '/application/dynamic-sampling/the-big-picture/', + }, + { + from: '/feedback-architecture/', + to: '/application/feedback-architecture/', + }, + { + from: '/options/', + to: '/backend/options/', + }, + { + from: '/sdk/features/data-handling/', + to: '/sdk/expected-features/data-handling/', + }, + { + from: '/sdk/craft-quick-start/', + to: '/sdk/processes/releases/', + }, + { + from: '/sdk/check-ins/', + to: '/sdk/telemetry/check-ins/', + }, + { + from: '/sdk/profiles/', + to: '/sdk/telemetry/profiles/', + }, + { + from: '/sdk/distributed-tracing/', + to: '/sdk/telemetry/traces/distributed-tracing/', + }, + // New Sidebar structure + { + from: '/development/', + to: '/development-infrastructure/', + }, + { + from: '/development/environment/', + to: '/development-infrastructure/environment/', + }, + { + from: '/development/environment/ports/', + to: '/development-infrastructure/environment/ports/', + }, + { + from: '/development/environment/u2f/', + to: '/development-infrastructure/environment/u2f/', + }, + { + from: '/development/environment/pycharm/', + to: '/development-infrastructure/environment/pycharm/', + }, + { + from: '/development/commit-messages/', + to: '/engineering-practices/commit-messages/', + }, + { + from: '/development/code-review/', + to: '/engineering-practices/code-review/', + }, + { + from: '/development/documentation/', + to: '/engineering-practices/documentation/', + }, + { + from: '/development/workflow/', + to: '/development-infrastructure/workflow/', + }, + { + from: '/development/testing/', + to: '/development-infrastructure/testing/', + }, + { + from: '/development/continuous-integration/', + to: '/development-infrastructure/continuous-integration/', + }, + { + from: '/development/ngrok/', + to: '/development-infrastructure/ngrok/', + }, + { + from: '/development/devservices/', + to: '/development-infrastructure/devservices/', + }, + { + from: '/development/rust/', + to: '/engineering-practices/rust/', + }, + { + from: '/development/analytics/', + to: '/development-infrastructure/analytics/', + }, + { + from: '/application/', + to: '/application-architecture/', + }, + { + from: '/application/architecture/', + to: '/application-architecture/overview/', + }, + { + from: '/application/dynamic-sampling/', + to: '/application-architecture/dynamic-sampling/', + }, + { + from: '/application/dynamic-sampling/the-big-picture/', + to: '/application-architecture/dynamic-sampling/the-big-picture/', + }, + { + from: '/application/dynamic-sampling/fidelity-and-biases/', + to: '/application-architecture/dynamic-sampling/fidelity-and-biases/', + }, + { + from: '/application/dynamic-sampling/architecture/', + to: '/application-architecture/dynamic-sampling/architecture/', + }, + { + from: '/application/dynamic-sampling/outcomes/', + to: '/application-architecture/dynamic-sampling/outcomes/', + }, + { + from: '/application/feedback-architecture/', + to: '/application-architecture/feedback-architecture/', + }, + { + from: '/application/control-silo/', + to: '/application-architecture/multi-region-deployment/control-silo/', + }, + { + from: '/application/cross-region-replication/', + to: '/application-architecture/multi-region-deployment/cross-region-replication/', + }, + { + from: '/application/cross-region-rpc/', + to: '/application-architecture/multi-region-deployment/cross-region-rpc/', + }, + { + from: '/application/config/', + to: '/application-architecture/config/', + }, + { + from: '/application-architecture/config/', + to: '/backend/config/', + }, + { + from: '/application/sentry-vs-getsentry/', + to: '/application-architecture/sentry-vs-getsentry/', + }, + + { + from: '/frontend/development-server/', + to: '/development-infrastructure/frontend-development-server/', + }, + { + from: '/api-server/', + to: '/backend/', + }, + { + from: '/api-server/api/', + to: '/backend/api/', + }, + { + from: '/api-server/api/basics/', + to: '/backend/api/basics/', + }, + { + from: '/api-server/api/design/', + to: '/backend/api/design/', + }, + { + from: '/api-server/api/concepts/', + to: '/backend/api/concepts/', + }, + { + from: '/api-server/api/public/', + to: '/backend/api/public/', + }, + { + from: '/api-server/api/checklist/', + to: '/backend/api/checklist/', + }, + { + from: '/api-server/api/serializers/', + to: '/backend/api/serializers/', + }, + { + to: '/development-infrastructure/backend-development-server/', + from: '/backend/development-server/', + }, + { + from: '/backend/python-dependencies/', + to: '/development-infrastructure/python-dependencies/', + }, + { + from: '/backend/database-migrations/', + to: '/backend/application-domains/database-migrations/', + }, + { + from: '/api-server/application-domains/database-migrations/', + to: '/backend/application-domains/database-migrations/', + }, + { + from: '/backend/feature-flags/', + to: '/backend/application-domains/feature-flags/', + }, + { + from: '/api-server/application-domains/feature-flags/', + to: '/develop/application-domains/feature-flags/', + }, + { + from: '/backend/feature-flags/flagpole/', + to: '/backend/application-domains/feature-flags/flagpole/', + }, + { + from: '/api-server/application-domains/feature-flags/flagpole/', + to: '/develop/application-domains/feature-flags/flagpole/', + }, + { + from: '/backend/options/', + to: '/backend/application-domains/options/', + }, + { + from: '/api-server/application-domains/options/', + to: '/develop/application-domains/options/', + }, + { + from: '/backend/transaction-clustering/', + to: '/backend/application-domains/transaction-clustering/', + }, + { + from: '/api-server/application-domains/transaction-clustering/', + to: '/develop/application-domains/transaction-clustering/', + }, + { + from: '/backend/grouping/', + to: '/backend/application-domains/grouping/', + }, + { + from: '/api-server/application-domains/grouping/', + to: '/develop/application-domains/grouping/', + }, + { + from: '/backend/outboxes/', + to: '/backend/application-domains/outboxes/', + }, + { + from: '/api-server/application-domains/outboxes/', + to: '/develop/application-domains/outboxes/', + }, + { + from: '/backend/issue-platform-detectors/', + to: '/backend/issue-platform/writing-detectors/', + }, + { + from: '/api-server/issue-platform/writing-detectors/', + to: '/develop/issue-platform/writing-detectors/', + }, + { + from: '/api-server/issue-platform/', + to: '/develop/issue-platform/', + }, + { + from: '/backend/queue/', + to: '/backend/application-domains/asynchronous-workers/', + }, + { + from: '/api-server/application-domains/asynchronous-workers/', + to: '/develop/application-domains/asynchronous-workers/', + }, + { + from: '/backend/email/', + to: '/backend/application-domains/email/', + }, + { + from: '/api-server/application-domains/email/', + to: '/develop/application-domains/email/', + }, + { + from: '/backend/kafka/', + to: '/backend/application-domains/kafka/', + }, + { + from: '/api-server/application-domains/kafka/', + to: '/develop/application-domains/kafka/', + }, + { + from: '/backend/metrics/', + to: '/backend/application-domains/metrics/', + }, + { + from: '/api-server/application-domains/metrics/', + to: '/develop/application-domains/metrics/', + }, + { + from: '/backend/nodestore/', + to: '/backend/application-domains/nodestore/', + }, + { + from: '/api-server/application-domains/nodestore/', + to: '/develop/application-domains/nodestore/', + }, + { + from: '/backend/digests/', + to: '/backend/application-domains/digests/', + }, + { + from: '/api-server/application-domains/digests/', + to: '/develop/application-domains/digests/', + }, + { + from: '/backend/quotas/', + to: '/backend/application-domains/quotas/', + }, + { + from: '/api-server/application-domains/quotas/', + to: '/develop/application-domains/quotas/', + }, + { + from: '/backend/tsdb/', + to: '/backend/application-domains/tsdb/', + }, + { + from: '/api-server/application-domains/tsdb/', + to: '/develop/application-domains/tsdb/', + }, + { + from: '/backend/pii/', + to: '/backend/application-domains/pii/', + }, + { + from: '/api-server/application-domains/pii/', + to: '/develop/application-domains/pii/', + }, + { + from: '/backend/pii/methods/', + to: '/backend/application-domains/pii/methods/', + }, + { + from: '/api-server/application-domains/pii/methods/', + to: '/develop/application-domains/pii/methods/', + }, + { + from: '/backend/pii/types/', + to: '/backend/application-domains/pii/types/', + }, + { + from: '/api-server/application-domains/pii/types/', + to: '/develop/application-domains/pii/types/', + }, + { + from: '/backend/pii/selectors/', + to: '/backend/application-domains/pii/selectors/', + }, + { + from: '/api-server/application-domains/pii/selectors/', + to: '/develop/application-domains/pii/selectors/', + }, + { + from: '/backend/buffers/', + to: '/backend/application-domains/write-buffers/', + }, + { + from: '/api-server/application-domains/write-buffers/', + to: '/develop/application-domains/write-buffers/', + }, + { + from: '/backend/translations/', + to: '/backend/application-domains/translations/', + }, + { + from: '/api-server/application-domains/translations/', + to: '/develop/application-domains/translations/', + }, + { + from: '/backend/ab-testing/', + to: '/backend/application-domains/ab-testing/', + }, + { + from: '/api-server/application-domains/ab-testing/', + to: '/develop/application-domains/ab-testing/', + }, + /* Ingestion section rework */ + { + from: '/relay/', + to: '/ingestion/relay/', + }, + { + from: '/relay/projectconfig-versioning/', + to: '/ingestion/relay/projectconfig-versioning/', + }, + { + from: '/relay/transaction-span-ratelimits/', + to: '/ingestion/relay/transaction-span-ratelimits/', + }, + { + from: '/relay/relay-best-practices/', + to: '/ingestion/relay/relay-best-practices/', + }, + /* integration platform */ + { + from: '/organization/integrations/kitemaker/', + to: '/organization/integrations/issue-tracking/kitemaker/', + }, + { + from: '/organization/integrations/pagertree/', + to: '/organization/integrations/notification-incidents/pagertree/', + }, + { + from: '/organization/integrations/goast/', + to: '/organization/integrations/issue-tracking/goast/', + }, + { + from: '/organization/integrations/betterbugs/', + to: '/organization/integrations/session-replay/betterbugs/', + }, + { + from: '/organization/integrations/blar/', + to: '/organization/integrations/notification-incidents/blar/', + }, + { + from: '/organization/integrations/apigene/', + to: '/organization/integrations/debugging/apigene/', + }, + { + from: '/organization/integrations/revisedev/', + to: '/organization/integrations/debugging/revisedev/', + }, + { + from: '/organization/integrations/foamai/', + to: '/organization/integrations/debugging/foamai/', + }, + { + from: '/organization/integrations/telegram-alerts-bot/', + to: '/organization/integrations/notification-incidents/telegram-alerts-bot/', + }, + { + from: '/organization/integrations/vanta-eu/', + to: '/organization/integrations/compliance/vanta-eu/', + }, + { + from: '/organization/integrations/sourcery/', + to: '/organization/integrations/debugging/sourcery/', + }, + { + from: '/organization/integrations/codecomet/', + to: '/organization/integrations/debugging/codecomet/', + }, + { + from: '/organization/integrations/glueai/', + to: '/organization/integrations/notification-incidents/glueai/', + }, + { + from: '/organization/integrations/factory/', + to: '/organization/integrations/issue-tracking/factory/', + }, + { + from: '/organization/integrations/teamcamp/', + to: '/organization/integrations/issue-tracking/teamcamp/', + }, + { + from: '/organization/integrations/elba/', + to: '/organization/integrations/compliance/elba/', + }, +]; + +const redirectMap = new Map( + (isDeveloperDocs ? DEVELOPER_DOCS_REDIRECTS : USER_DOCS_REDIRECTS).map(r => [ + r.from as string, + r.to, + ]) +); diff --git a/tsconfig.json b/tsconfig.json index 78fb4418cffc22..367eec5d091434 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -12,7 +12,7 @@ "esnext" ], /* Specify library files to be included in the compilation. */ // "allowJs": true, /* Allow javascript files to be compiled. */ // "checkJs": true, /* Report errors in .js files. */ - "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ // "declaration": true, /* Generates corresponding '.d.ts' file. */ + "jsx": "react-jsx", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ // "declaration": true, /* Generates corresponding '.d.ts' file. */ // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ "sourceMap": true, /* Generates corresponding '.map' file. */ // "outFile": "./", /* Concatenate and emit output to single file. */ // "outDir": "./", /* Redirect output structure to the directory. */ @@ -21,7 +21,7 @@ // "removeComments": true, /* Do not emit comments to output. */ "noEmit": true, /* Do not emit outputs. */ // "importHelpers": true, /* Import emit helpers from 'tslib'. */ // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ - "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ /* Strict Type-Checking Options */// "strict": true /* Enable all strict type-checking options. */ + "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ /* Strict Type-Checking Options */ // "strict": true /* Enable all strict type-checking options. */ // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ // "strictNullChecks": true, /* Enable strict null checks. */ // "strictFunctionTypes": true, /* Enable strict checking of function types. */ @@ -83,6 +83,7 @@ "next-env.d.ts", ".next/types/**/*.ts", "**/*.ts", - "**/*.tsx" + "**/*.tsx", + ".next/dev/types/**/*.ts" ] } From 47306040c4c2a2b7a295b5dea0d83abaee01e646 Mon Sep 17 00:00:00 2001 From: Charly Gomez Date: Wed, 4 Feb 2026 15:46:44 +0100 Subject: [PATCH 2/6] . --- src/middleware.ts | 4424 --------------------------------------------- 1 file changed, 4424 deletions(-) delete mode 100644 src/middleware.ts diff --git a/src/middleware.ts b/src/middleware.ts deleted file mode 100644 index e6b8cf104159e0..00000000000000 --- a/src/middleware.ts +++ /dev/null @@ -1,4424 +0,0 @@ -import * as Sentry from '@sentry/nextjs'; -import type {NextRequest} from 'next/server'; -import {NextResponse, userAgent} from 'next/server'; - -import {AI_AGENT_PATTERN, type TrafficType} from './lib/trafficClassification'; - -// This env var is set in next.config.js based on the `NEXT_PUBLIC_DEVELOPER_DOCS` env var at build time -// a workaround edge middleware not having access to env vars -const isDeveloperDocs = process.env.DEVELOPER_DOCS_; - -export const config = { - // learn more: https://nextjs.org/docs/pages/building-your-application/routing/middleware#matcher - matcher: [ - // Match all request paths except for the ones starting with: - // - api (API routes) - // - _next/static (static files) - // - _next/image (image optimization files) - // - favicon.ico (favicon file) - '/((?!api|_next/static|_next/image|favicon.ico).*)', - ], -}; - -// This function can be marked `async` if using `await` inside -export function proxy(request: NextRequest) { - // First, handle canonical URL redirects for deprecated paths - const canonicalRedirect = handleRedirects(request); - if (canonicalRedirect) { - return canonicalRedirect; - } - - // Then, check for AI/LLM clients and redirect to markdown if appropriate - return handleAIClientRedirect(request); -} - -// don't send Permanent Redirects (301) in dev mode - it gets cached for "localhost" by the browser -const redirectStatusCode = process.env.NODE_ENV === 'development' ? 302 : 301; - -/** - * Detects if the user agent belongs to an AI/LLM tool or development environment - * that would benefit from markdown format. - * Uses shared AI_AGENT_PATTERN from trafficClassification.ts. - */ -function isAIOrDevTool(userAgentString: string): boolean { - return AI_AGENT_PATTERN.test(userAgentString); -} - -/** - * Traffic classification for metrics tracking. - * Uses Next.js userAgent() for enhanced bot detection plus custom AI agent patterns. - */ -function classifyTraffic(request: NextRequest): { - deviceType: string; - isBot: boolean; - trafficType: TrafficType; -} { - const userAgentString = request.headers.get('user-agent'); - - // No user-agent = unknown traffic - if (!userAgentString) { - return {trafficType: 'unknown', deviceType: 'unknown', isBot: false}; - } - - // Use Next.js built-in userAgent() for enhanced parsing - const ua = userAgent(request); - - // Check for AI agents first (higher priority than generic bot detection) - if (AI_AGENT_PATTERN.test(userAgentString)) { - return { - trafficType: 'ai_agent', - deviceType: ua.device.type || 'desktop', - isBot: true, - }; - } - - // Use Next.js isBot detection (covers major search engines, social crawlers, etc.) - if (ua.isBot) { - return { - trafficType: 'bot', - deviceType: ua.device.type || 'crawler', - isBot: true, - }; - } - - // Real user traffic - include device type for richer metrics - return { - trafficType: 'user', - deviceType: ua.device.type || 'desktop', - isBot: false, - }; -} - -/** - * Detects if client wants markdown via Accept header (standards-compliant) - */ -function wantsMarkdownViaAccept(acceptHeader: string): boolean { - return ( - acceptHeader.includes('text/markdown') || - acceptHeader.includes('text/x-markdown') || - acceptHeader.includes('text/plain') - ); -} - -/** - * Detects if client wants markdown via Accept header or user-agent - */ -function wantsMarkdown(request: NextRequest): boolean { - const uaString = request.headers.get('user-agent') || ''; - const acceptHeader = request.headers.get('accept') || ''; - - // Strategy 1: Accept header content negotiation (standards-compliant) - if (wantsMarkdownViaAccept(acceptHeader)) { - return true; - } - - // Strategy 2: User-agent detection (fallback for tools that don't set Accept) - return isAIOrDevTool(uaString); -} - -/** - * Creates request headers with traffic classification for downstream consumption. - * These headers are added to the REQUEST (not response) so tracesSampler can read them. - * Uses NextResponse.next({ request: { headers } }) pattern to modify the request. - */ -function createClassifiedRequestHeaders(request: NextRequest): Headers { - const classification = classifyTraffic(request); - const headers = new Headers(request.headers); - headers.set('x-traffic-type', classification.trafficType); - headers.set('x-device-type', classification.deviceType); - return headers; -} - -/** - * Creates a pass-through response with traffic classification headers on the request. - */ -function nextWithClassification(request: NextRequest): NextResponse { - return NextResponse.next({ - request: { - headers: createClassifiedRequestHeaders(request), - }, - }); -} - -/** - * Creates a rewrite response with traffic classification headers on the request. - */ -function rewriteWithClassification(request: NextRequest, destination: URL): NextResponse { - return NextResponse.rewrite(destination, { - request: { - headers: createClassifiedRequestHeaders(request), - }, - }); -} - -/** - * Handles redirection to markdown versions for AI/LLM clients - */ -const handleAIClientRedirect = (request: NextRequest) => { - const userAgentString = request.headers.get('user-agent') || ''; - const acceptHeader = request.headers.get('accept') || ''; - const url = request.nextUrl; - - // Determine if this will be served as markdown - const forceMarkdown = url.searchParams.get('format') === 'md'; - const clientWantsMarkdown = wantsMarkdown(request); - const willServeMarkdown = - (clientWantsMarkdown || forceMarkdown) && !url.pathname.endsWith('.md'); - - // Determine detection method for logging - const detectionMethod = wantsMarkdownViaAccept(acceptHeader) - ? 'Accept header' - : isAIOrDevTool(userAgentString) - ? 'User-agent' - : 'Manual'; - - // Log user agent for debugging (only for non-static assets) - if ( - !url.pathname.startsWith('/_next/') && - !url.pathname.includes('.') && - !url.pathname.startsWith('/api/') - ) { - Sentry.logger.info(`Middleware request processed: ${url.pathname}`, { - urlPath: url.pathname, - acceptHeader: request.headers.get('accept') || '', - userAgent: request.headers.get('user-agent') || '', - contentType: willServeMarkdown ? 'markdown' : 'html', - detectionMethod: willServeMarkdown ? detectionMethod : null, - }); - } - - // Skip if already requesting a markdown file - pass through with classification headers - if (url.pathname.endsWith('.md')) { - return nextWithClassification(request); - } - - // Skip API routes and static assets (should already be filtered by matcher) - // Pass through with classification headers - if ( - url.pathname.startsWith('/api/') || - url.pathname.startsWith('/_next/') || - /\.(js|json|png|jpg|jpeg|gif|ico|pdf|css|woff|woff2|ttf|map|xml|txt|zip|svg)$/i.test( - url.pathname - ) - ) { - return nextWithClassification(request); - } - - // Check for markdown request (Accept header, user-agent, or manual) - if (clientWantsMarkdown || forceMarkdown) { - // Log the rewrite for debugging - Sentry.logger.info('Markdown rewrite triggered', { - urlPath: url.pathname, - detectionMethod: forceMarkdown ? 'Manual format=md' : detectionMethod, - targetUrl: url.pathname.replace(/\/+$/, '') + '.md', - }); - - // Create new URL with .md extension - const newUrl = url.clone(); - // Handle root path and ensure proper .md extension - let pathname = url.pathname === '/' ? '/index' : url.pathname; - // Remove all trailing slashes if present, then add .md - pathname = pathname.replace(/\/+$/, '') + '.md'; - newUrl.pathname = pathname; - - // Clean up the format query parameter if it was used - if (forceMarkdown) { - newUrl.searchParams.delete('format'); - } - - // Rewrite to serve markdown inline (same URL, different content) - // The next.config.ts rewrite rule maps *.md to /md-exports/*.md - return rewriteWithClassification(request, newUrl); - } - - // Default: pass through with traffic classification headers - return nextWithClassification(request); -}; - -const handleRedirects = (request: NextRequest) => { - const urlPath = request.nextUrl.pathname; - - const redirectTo = redirectMap.get(urlPath); - if (redirectTo) { - return NextResponse.redirect(new URL(redirectTo, request.url), { - status: redirectStatusCode, - }); - } - - // If we don't find an exact match, we try to look for a :guide placeholder - const guidePlaceholder = '/guides/:guide/'; - const guideRegex = /\/guides\/(\w+)\//g; - const match = guideRegex.exec(urlPath); - - if (!match) { - return undefined; - } - - const pathWithPlaceholder = urlPath.replace(guideRegex, guidePlaceholder); - const guide = match[1]; - - const redirectToGuide = redirectMap.get(pathWithPlaceholder); - if (redirectToGuide) { - const finalRedirectToPath = redirectToGuide.replace( - guidePlaceholder, - `/guides/${guide}/` - ); - - return NextResponse.redirect(new URL(finalRedirectToPath, request.url), { - status: redirectStatusCode, - }); - } - - return undefined; -}; - -type Redirect = { - /** a string with a leading and a trailing slash */ - from: `/${string}/` | '/'; - to: string; -}; - -/** Note: if you want to set redirects for developer docs, set them below in `DEVELOPER_DOCS_REDIRECTS` */ -const USER_DOCS_REDIRECTS: Redirect[] = [ - { - from: '/platforms/python/http_errors/', - to: '/platforms/python/integrations/django/http_errors/', - }, - { - from: '/platforms/javascript/guides/react/configuration/integrations/trycatch/', - to: '/platforms/javascript/configuration/integrations/browserapierrors/', - }, - { - from: '/platforms/javascript/performance/instrumentation/custom-instrumentation/caches-module/', - to: '/platforms/javascript/guides/node/performance/instrumentation/custom-instrumentation/caches-module/', - }, - { - from: '/platforms/javascript/guides/nuxt/install/top-level-import/', - to: '/platforms/javascript/guides/nuxt/install/limited-server-tracing/', - }, - { - from: '/account/early-adopter-features/discord/', - to: '/organization/integrations/notification-incidents/discord/', - }, - { - from: '/platforms/python/migration/configuration/filtering/', - to: '/platforms/python/configuration/filtering/', - }, - { - from: '/organization/integrations/github/', - to: '/organization/integrations/source-code-mgmt/github/', - }, - { - from: '/organization/integrations/gitlab/', - to: '/organization/integrations/source-code-mgmt/gitlab/', - }, - { - from: '/organization/integrations/bitbucket/', - to: '/organization/integrations/source-code-mgmt/bitbucket/', - }, - { - from: '/organization/integrations/rookout/', - to: '/organization/integrations/debugging/rookout/', - }, - { - from: '/organization/integrations/split/', - to: '/organization/integrations/feature-flag/split/', - }, - { - from: '/organization/integrations/teamwork/', - to: '/organization/integrations/issue-tracking/teamwork/', - }, - { - from: '/organization/integrations/jira/', - to: '/organization/integrations/issue-tracking/jira/', - }, - { - from: '/organization/integrations/linear/', - to: '/organization/integrations/issue-tracking/linear/', - }, - { - from: '/organization/integrations/clickup/', - to: '/organization/integrations/issue-tracking/clickup/', - }, - { - from: '/organization/integrations/project-mgmt/shortcut/', - to: '/organization/integrations/issue-tracking/shortcut/', - }, - { - from: '/organization/integrations/slack/', - to: '/organization/integrations/notification-incidents/slack/', - }, - { - from: '/organization/integrations/pagerduty/', - to: '/organization/integrations/notification-incidents/pagerduty/', - }, - { - from: '/organization/integrations/vanta/', - to: '/organization/integrations/compliance/vanta/', - }, - { - from: '/organization/integrations/jam/', - to: '/organization/integrations/session-replay/jam/', - }, - { - from: '/organization/integrations/cloud-monitoring/cloudflare-workers/', - to: '/platforms/javascript/guides/cloudflare/', - }, - { - from: '/product/crons/getting-started/cli/', - to: '/cli/crons/', - }, - { - from: '/product/data-management-settings/dynamic-sampling/', - to: '/product/insights/overview/', - }, - { - from: '/product/data-management-settings/event-grouping/', - to: '/concepts/data-management/event-grouping/', - }, - { - from: '/product/data-management-settings/data-forwarding/', - to: '/concepts/data-management/data-forwarding/', - }, - { - from: '/product/data-management-settings/filtering/', - to: '/concepts/data-management/filtering/', - }, - { - from: '/platforms/data-management/', - to: '/concepts/data-management/', - }, - { - from: '/platforms/javascript/sourcemaps/troubleshooting/', - to: '/platforms/javascript/sourcemaps/', - }, - { - from: '/platforms/react-native/install/cocoapods/', - to: '/platforms/react-native/manual-setup/manual-setup/', - }, - { - from: '/platforms/react-native/install/', - to: '/platforms/react-native/manual-setup/manual-setup/', - }, - { - from: '/platforms/unity/data-management/event-grouping/sdk-fingerprinting/', - to: '/platforms/unity/usage/sdk-fingerprinting/', - }, - { - from: '/platforms/unity/native-support/building-ios/', - to: '/platforms/unity/native-support/', - }, - { - from: '/platforms/unity/unity-lite/', - to: '/platforms/unity/migration/', - }, - { - from: '/platforms/go/config/', - to: '/platforms/go/configuration/options/', - }, - { - from: '/platforms/go/goroutines/', - to: '/platforms/go/usage/concurrency/', - }, - { - from: '/platforms/go/concurrency/', - to: '/platforms/go/usage/concurrency/', - }, - { - from: '/platforms/go/panics/', - to: '/platforms/go/usage/panics/', - }, - { - from: '/platforms/go/serverless/', - to: '/platforms/go/usage/serverless/', - }, - { - from: '/platforms/go/fasthttp/', - to: '/platforms/go/guides/fasthttp/', - }, - { - from: '/platforms/go/fiber/', - to: '/platforms/go/guides/fiber/', - }, - { - from: '/platforms/go/echo/', - to: '/platforms/go/guides/echo/', - }, - { - from: '/platforms/go/iris/', - to: '/platforms/go/guides/iris/', - }, - { - from: '/platforms/go/negroni/', - to: '/platforms/go/guides/negroni/', - }, - { - from: '/platforms/go/zerolog/', - to: '/platforms/go/guides/zerolog/', - }, - { - from: '/platforms/go/slog/', - to: '/platforms/go/guides/slog/', - }, - { - from: '/platforms/go/logrus/', - to: '/platforms/go/guides/logrus/', - }, - { - from: '/clients/go/integrations/http/', - to: '/platforms/go/guides/http/', - }, - { - from: '/platforms/go/http/', - to: '/platforms/go/guides/http/', - }, - { - from: '/platforms/go/gin/', - to: '/platforms/go/guides/gin/', - }, - { - from: '/clients/go/config/', - to: '/platforms/go/legacy-sdk/config/', - }, - { - from: '/clients/go/index/', - to: '/platforms/go/legacy-sdk/', - }, - { - from: '/clients/go/integrations/', - to: '/platforms/go/legacy-sdk/integrations/', - }, - { - from: '/clients/go/usage/', - to: '/platforms/go/legacy-sdk/usage/', - }, - { - from: '/clients/go/context/', - to: '/platforms/go/legacy-sdk/context/', - }, - { - from: '/platforms/qt/', - to: '/platforms/native/guides/qt/', - }, - { - from: '/platforms/native/qt/', - to: '/platforms/native/guides/qt/', - }, - { - from: '/platforms/breakpad/', - to: '/platforms/native/guides/breakpad/', - }, - { - from: '/platforms/native/breakpad/', - to: '/platforms/native/guides/breakpad/', - }, - { - from: '/platforms/minidump/', - to: '/platforms/native/guides/minidumps/', - }, - { - from: '/platforms/native/minidump/', - to: '/platforms/native/guides/minidumps/', - }, - { - from: '/clients/minidump/', - to: '/platforms/native/guides/minidumps/', - }, - { - from: '/platforms/react-native/advanced-setup/', - to: '/platforms/react-native/manual-setup/manual-setup/', - }, - { - from: '/platforms/react-native/codepush/', - to: '/platforms/react-native/manual-setup/codepush/', - }, - { - from: '/platforms/react-native/hermes/', - to: '/platforms/react-native/manual-setup/hermes/', - }, - { - from: '/platforms/react-native/ram-bundles/', - to: '/platforms/react-native/manual-setup/ram-bundles/', - }, - { - from: '/platforms/react-native/performance/sampling/', - to: '/platforms/react-native/configuration/sampling/', - }, - { - from: '/platforms/react-native/configuration/integrations/plugin/', - to: '/platforms/react-native/integrations/plugin/', - }, - { - from: '/platforms/react-native/configuration/integrations/', - to: '/platforms/react-native/integrations/', - }, - { - from: '/platforms/react-native/configuration/integrations/custom/', - to: '/platforms/react-native/integrations/custom/', - }, - { - from: '/platforms/react-native/configuration/integrations/default/', - to: '/platforms/react-native/integrations/default/', - }, - { - from: '/platforms/react-native/configuration/integrations/redux/', - to: '/platforms/react-native/integrations/redux/', - }, - { - from: '/platforms/react-native/manual-setup/sourcemaps/', - to: '/platforms/react-native/sourcemaps/', - }, - { - from: '/platforms/react-native/touchevents/', - to: '/platforms/react-native/configuration/touchevents/', - }, - { - from: '/platforms/python/data-collected/', - to: '/platforms/python/data-management/data-collected/', - }, - { - from: '/platforms/python/flask/', - to: '/platforms/python/integrations/flask/', - }, - { - from: '/platforms/python/aiohttp/', - to: '/platforms/python/integrations/aiohttp/', - }, - { - from: '/platforms/python/gcp_functions/', - to: '/platforms/python/integrations/gcp-functions/', - }, - { - from: '/platforms/python/serverless/', - to: '/platforms/python/integrations/serverless/', - }, - { - from: '/clients/python/integrations/pyramid/', - to: '/platforms/python/integrations/pyramid/', - }, - { - from: '/platforms/python/pyramid/', - to: '/platforms/python/integrations/pyramid/', - }, - { - from: '/clients/python/integrations/starlette/', - to: '/platforms/python/integrations/starlette/', - }, - { - from: '/platforms/python/starlette/', - to: '/platforms/python/integrations/starlette/', - }, - { - from: '/clients/python/integrations/lambda/', - to: '/platforms/python/integrations/aws-lambda/', - }, - { - from: '/platforms/python/aws_lambda/', - to: '/platforms/python/integrations/aws-lambda/', - }, - { - from: '/platforms/python/airflow/', - to: '/platforms/python/integrations/airflow/', - }, - { - from: '/platforms/python/tornado/', - to: '/platforms/python/integrations/tornado/', - }, - { - from: '/clients/python/integrations/tornado/', - to: '/platforms/python/integrations/tornado/', - }, - { - from: '/platforms/python/chalice/', - to: '/platforms/python/integrations/chalice/', - }, - { - from: '/clients/python/integrations/fastapi/', - to: '/platforms/python/integrations/fastapi/', - }, - { - from: '/platforms/python/fastapi/', - to: '/platforms/python/integrations/fastapi/', - }, - { - from: '/platforms/python/sanic/', - to: '/platforms/python/integrations/sanic/', - }, - { - from: '/clients/python/integrations/starlite/', - to: '/platforms/python/integrations/starlite/', - }, - { - from: '/platforms/python/starlite/', - to: '/platforms/python/integrations/starlite/', - }, - { - from: '/clients/python/integrations/litestar/', - to: '/platforms/python/integrations/litestar/', - }, - { - from: '/platforms/python/litestar/', - to: '/platforms/python/integrations/litestar/', - }, - { - from: '/platforms/python/beam/', - to: '/platforms/python/integrations/beam/', - }, - { - from: '/clients/python/integrations/celery/', - to: '/platforms/python/integrations/celery/', - }, - { - from: '/platforms/python/celery/', - to: '/platforms/python/integrations/celery/', - }, - { - from: '/platforms/python/hints/', - to: '/platforms/python/integrations/celery/', - }, - { - from: '/clients/python/integrations/django/', - to: '/platforms/python/integrations/django/', - }, - { - from: '/platforms/python/django/', - to: '/platforms/python/integrations/django/', - }, - { - from: '/platforms/python/falcon/', - to: '/platforms/python/integrations/falcon/', - }, - { - from: '/clients/python/integrations/logging/', - to: '/platforms/python/integrations/logging/', - }, - { - from: '/platforms/python/logging/', - to: '/platforms/python/integrations/logging/', - }, - { - from: '/clients/python/integrations/rq/', - to: '/platforms/python/integrations/rq/', - }, - { - from: '/platforms/python/rq/', - to: '/platforms/python/integrations/rq/', - }, - { - from: '/clients/python/integrations/bottle/', - to: '/platforms/python/integrations/bottle/', - }, - { - from: '/platforms/python/bottle/', - to: '/platforms/python/integrations/bottle/', - }, - { - from: '/platforms/python/pyspark/', - to: '/platforms/python/integrations/spark/', - }, - { - from: '/platforms/python/integrations/pyspark/', - to: '/platforms/python/integrations/spark/', - }, - { - from: '/platforms/python/tryton/', - to: '/platforms/python/integrations/tryton/', - }, - { - from: '/platforms/python/integrations/feature-flags/launchdarkly/', - to: '/platforms/python/integrations/launchdarkly/', - }, - { - from: '/platforms/python/integrations/feature-flags/openfeature/', - to: '/platforms/python/integrations/openfeature/', - }, - { - from: '/platforms/python/integrations/feature-flags/unleash/', - to: '/platforms/python/integrations/unleash/', - }, - { - from: '/clients/python/breadcrumbs/', - to: '/platforms/python/legacy-sdk/breadcrumbs/', - }, - { - from: '/clients/python/platform-support/', - to: '/platforms/python/legacy-sdk/platform-support/', - }, - { - from: '/clients/python/integrations/', - to: '/platforms/python/legacy-sdk/integrations/', - }, - { - from: '/clients/python/api/', - to: '/platforms/python/legacy-sdk/api/', - }, - { - from: '/clients/python/advanced/', - to: '/platforms/python/legacy-sdk/advanced/', - }, - { - from: '/clients/python/usage/', - to: '/platforms/python/legacy-sdk/usage/', - }, - { - from: '/clients/python/transports/', - to: '/platforms/python/legacy-sdk/transports/', - }, - { - from: '/platforms/python/contextvars/', - to: '/platforms/python/troubleshooting/', - }, - { - from: '/platforms/dart/usage/advanced-usage/', - to: '/platforms/dart/integrations/http-integration/', - }, - { - from: '/platforms/dart/configuration/integrations/http-integration/', - to: '/platforms/dart/integrations/http-integration/', - }, - { - from: '/platforms/dart/configuration/integrations/file/', - to: '/platforms/dart/integrations/file/', - }, - { - from: '/platforms/dart/configuration/integrations/', - to: '/platforms/dart/integrations/', - }, - { - from: '/platforms/dart/configuration/integrations/logging/', - to: '/platforms/dart/integrations/logging/', - }, - { - from: '/platforms/dart/configuration/integrations/dio/', - to: '/platforms/dart/integrations/dio/', - }, - { - from: '/platforms/dart/configuration/integrations/firebase-remote-config/', - to: '/platforms/dart/integrations/firebase-remote-config/', - }, - { - from: '/quickstart/', - to: '/platforms/', - }, - { - from: '/clients/', - to: '/platforms/', - }, - { - from: '/platforms/perl/', - to: '/platforms/', - }, - { - from: '/platforms/node/guides/serverless-cloud/typescript/', - to: '/platforms/', - }, - { - from: '/clients/rust/', - to: '/platforms/rust/', - }, - { - from: '/platforms/rust/log/', - to: '/platforms/rust/', - }, - { - from: '/platforms/rust/profiling/', - to: '/platforms/rust/', - }, - { - from: '/platforms/rust/actix/', - to: '/platforms/rust/guides/actix-web/', - }, - { - from: '/platforms/rust/guides/actix-web/profiling/', - to: '/platforms/rust/guides/actix-web/', - }, - { - from: '/clients/java/modules/log4j2/', - to: '/platforms/java/legacy/log4j2/', - }, - { - from: '/clients/java/', - to: '/platforms/java/legacy/', - }, - { - from: '/clients/java/migration/', - to: '/platforms/java/legacy/migration/', - }, - { - from: '/clients/java/usage/', - to: '/platforms/java/legacy/usage/', - }, - { - from: '/clients/java/modules/appengine/', - to: '/platforms/java/legacy/google-app-engine/', - }, - { - from: '/clients/java/context/', - to: '/platforms/java/scope/', - }, - { - from: '/clients/java/modules/jul/', - to: '/platforms/java/guides/jul/', - }, - { - from: '/platforms/java/guides/jul/config/', - to: '/platforms/java/guides/jul/', - }, - { - from: '/clients/java/modules/logback/', - to: '/platforms/java/guides/logback/', - }, - { - from: '/platforms/java/guides/logback/config/', - to: '/platforms/java/guides/logback/', - }, - { - from: '/platforms/java/guides/spring/config/', - to: '/platforms/java/guides/spring/', - }, - { - from: '/platforms/java/guides/springboot/config/', - to: '/platforms/java/guides/spring-boot/', - }, - { - from: '/clients/php/integrations/monolog/', - to: '/platforms/php/', - }, - { - from: '/platforms/php/default-integrations/', - to: '/platforms/php/integrations/', - }, - { - from: '/platforms/php/guides/symfony/config/', - to: '/platforms/php/guides/symfony/configuration/symfony-options/', - }, - { - from: '/clients/php/integrations/symfony2/', - to: '/platforms/php/guides/symfony/', - }, - { - from: '/platforms/php/symfony/', - to: '/platforms/php/guides/symfony/', - }, - { - from: '/platforms/php/guides/symfony/performance/pm-integrations/', - to: '/platforms/php/guides/symfony/tracing/instrumentation/automatic-instrumentation/', - }, - { - from: '/clients/php/integrations/laravel/', - to: '/platforms/php/guides/laravel/', - }, - { - from: '/platforms/php/laravel/', - to: '/platforms/php/guides/laravel/', - }, - { - from: '/platforms/php/guides/laravel/lumen/', - to: '/platforms/php/guides/laravel/', - }, - { - from: '/platforms/php/guides/laravel/configuration/other-versions/laravel4/', - to: '/platforms/php/guides/laravel/other-versions/laravel4/', - }, - { - from: '/platforms/php/guides/laravel/other-versions/laravel5-6-7/', - to: '/platforms/php/guides/laravel/other-versions/', - }, - { - from: '/platforms/php/guides/laravel/configuration/other-versions/lumen/', - to: '/platforms/php/guides/laravel/other-versions/lumen/', - }, - { - from: '/clients/php/config/', - to: '/platforms/php/legacy-sdk/config/', - }, - { - from: '/clients/php/', - to: '/platforms/php/legacy-sdk/', - }, - { - from: '/clients/php/integrations/', - to: '/platforms/php/legacy-sdk/integrations/', - }, - { - from: '/clients/php/usage/', - to: '/platforms/php/legacy-sdk/usage/', - }, - { - from: '/platforms/dotnet/configuration/cli-integration/', - to: '/platforms/dotnet/configuration/msbuild/', - }, - { - from: '/platforms/dotnet/aspnetcore/', - to: '/platforms/dotnet/guides/aspnetcore/', - }, - { - from: '/platforms/dotnet/guides/aspnetcore/ignoring-exceptions/', - to: '/platforms/dotnet/guides/aspnetcore/', - }, - { - from: '/platforms/dotnet/log4net/', - to: '/platforms/dotnet/guides/log4net/', - }, - { - from: '/platforms/dotnet/microsoft-extensions-logging/', - to: '/platforms/dotnet/guides/extensions-logging/', - }, - { - from: '/platforms/dotnet/entityframework/', - to: '/platforms/dotnet/guides/entityframework/', - }, - { - from: '/platforms/dotnet/maui/', - to: '/platforms/dotnet/guides/maui/', - }, - { - from: '/platforms/dotnet/wpf/', - to: '/platforms/dotnet/guides/wpf/', - }, - { - from: '/platforms/dotnet/winforms/', - to: '/platforms/dotnet/guides/winforms/', - }, - { - from: '/platforms/dotnet/guides/winforms/ignoring-exceptions/', - to: '/platforms/dotnet/guides/winforms/', - }, - { - from: '/platforms/dotnet/google.cloud.functions/', - to: '/platforms/dotnet/guides/google-cloud-functions/', - }, - { - from: '/platforms/dotnet/winui/', - to: '/platforms/dotnet/guides/winui/', - }, - { - from: '/platforms/dotnet/serilog/', - to: '/platforms/dotnet/guides/serilog/', - }, - { - from: '/platforms/dotnet/uwp/', - to: '/platforms/dotnet/guides/uwp/', - }, - { - from: '/platforms/dotnet/nlog/', - to: '/platforms/dotnet/guides/nlog/', - }, - { - from: '/platforms/flutter/configuration/integrations/user-interaction-instrumentation/', - to: '/platforms/flutter/integrations/user-interaction-instrumentation/', - }, - { - from: '/platforms/flutter/configuration/integrations/', - to: '/platforms/flutter/integrations/', - }, - { - from: '/platforms/flutter/configuration/integrations/sqflite-instrumentation/', - to: '/platforms/flutter/integrations/sqflite-instrumentation/', - }, - { - from: '/platforms/flutter/usage/advanced-usage/', - to: '/platforms/flutter/troubleshooting/', - }, - { - from: '/platforms/android/manual-configuration/', - to: '/platforms/android/manual-setup/', - }, - { - from: '/platforms/android/configuration/manual-init/', - to: '/platforms/android/manual-setup/', - }, - { - from: '/platforms/android/advanced-usage/', - to: '/platforms/android/configuration/using-ndk/', - }, - { - from: '/platforms/android/using-ndk/', - to: '/platforms/android/configuration/using-ndk/', - }, - { - from: '/platforms/android/gradle/', - to: '/platforms/android/configuration/gradle/', - }, - { - from: '/platforms/android/configuration/integrations/apollo3/', - to: '/platforms/android/integrations/apollo3/', - }, - { - from: '/platforms/android/configuration/integrations/', - to: '/platforms/android/integrations/', - }, - { - from: '/platforms/android/configuration/integrations/logcat/', - to: '/platforms/android/integrations/logcat/', - }, - { - from: '/platforms/android/configuration/jetpack-compose/', - to: '/platforms/android/integrations/jetpack-compose/', - }, - { - from: '/platforms/android/configuration/integrations/jetpack-compose/', - to: '/platforms/android/integrations/jetpack-compose/', - }, - { - from: '/platforms/android/configuration/integrations/navigation/', - to: '/platforms/android/integrations/navigation/', - }, - { - from: '/platforms/android/configuration/integrations/room-and-sqlite/', - to: '/platforms/android/integrations/room-and-sqlite/', - }, - { - from: '/platforms/android/configuration/integrations/file-io/', - to: '/platforms/android/integrations/file-io/', - }, - { - from: '/platforms/java/tracing/instrumentation/apollo/', - to: '/platforms/java/tracing/instrumentation/apollo4/', - }, - { - from: '/platforms/java/guides/spring/tracing/instrumentation/apollo/', - to: '/platforms/java/guides/spring/tracing/instrumentation/apollo4/', - }, - { - from: '/platforms/java/guides/spring-boot/tracing/instrumentation/apollo/', - to: '/platforms/java/guides/spring-boot/tracing/instrumentation/apollo4/', - }, - { - from: '/platforms/android/performance/instrumentation/apollo/', - to: '/platforms/android/integrations/apollo4/', - }, - { - from: '/platforms/android/configuration/integrations/apollo/', - to: '/platforms/android/integrations/apollo4/', - }, - { - from: '/platforms/android/integrations/apollo/', - to: '/platforms/android/integrations/apollo4/', - }, - { - from: '/platforms/android/configuration/integrations/fragment/', - to: '/platforms/android/integrations/fragment/', - }, - { - from: '/platforms/android/timber/', - to: '/platforms/android/integrations/timber/', - }, - { - from: '/platforms/android/guides/timber/', - to: '/platforms/android/integrations/timber/', - }, - { - from: '/platforms/android/configuration/integrations/timber/', - to: '/platforms/android/integrations/timber/', - }, - { - from: '/platforms/android/guides/okhttp/', - to: '/platforms/android/integrations/okhttp/', - }, - { - from: '/platforms/android/configuration/integrations/okhttp/', - to: '/platforms/android/integrations/okhttp/', - }, - { - from: '/platforms/android/migrate/', - to: '/platforms/android/migration/', - }, - { - from: '/platforms/android/proguard/', - to: '/platforms/android/enhance-errors/proguard/', - }, - { - from: '/platforms/android/source-context/', - to: '/platforms/android/enhance-errors/source-context/', - }, - { - from: '/platforms/android/kotlin-compiler-plugin/', - to: '/platforms/android/enhance-errors/kotlin-compiler-plugin/', - }, - { - from: '/platforms/javascript/configuration/integrations/plugin/', - to: '/platforms/javascript/configuration/integrations/', - }, - { - from: '/platforms/javascript/configuration/integrations/default/', - to: '/platforms/javascript/configuration/integrations/', - }, - { - from: '/platforms/javascript/integrations/custom/', - to: '/platforms/javascript/configuration/integrations/custom/', - }, - { - from: '/platforms/javascript/loader/', - to: '/platforms/javascript/install/loader/', - }, - { - from: '/platforms/javascript/install/lazy-load-sentry/', - to: '/platforms/javascript/install/loader/', - }, - { - from: '/platforms/javascript/install/cdn/', - to: '/platforms/javascript/install/loader/', - }, - { - from: '/platforms/javascript/integrations/rrweb/', - to: '/platforms/javascript/session-replay/', - }, - { - from: '/platforms/javascript/configuration/integrations/rrweb/', - to: '/platforms/javascript/session-replay/', - }, - { - from: '/platforms/javascript/guides/angular/configuration/integrations/rrweb/', - to: '/platforms/javascript/session-replay/', - }, - { - from: '/platforms/javascript/guides/capacitor/configuration/integrations/rrweb/', - to: '/platforms/javascript/session-replay/', - }, - { - from: '/platforms/javascript/guides/cordova/configuration/integrations/rrweb/', - to: '/platforms/javascript/session-replay/', - }, - { - from: '/platforms/javascript/guides/ember/configuration/integrations/rrweb/', - to: '/platforms/javascript/session-replay/', - }, - { - from: '/platforms/javascript/guides/gatsby/configuration/integrations/rrweb/', - to: '/platforms/javascript/session-replay/', - }, - { - from: '/platforms/javascript/guides/nextjs/configuration/integrations/rrweb/', - to: '/platforms/javascript/session-replay/', - }, - { - from: '/platforms/javascript/guides/react/configuration/integrations/rrweb/', - to: '/platforms/javascript/session-replay/', - }, - { - from: '/platforms/javascript/guides/remix/configuration/integrations/rrweb/', - to: '/platforms/javascript/session-replay/', - }, - { - from: '/platforms/javascript/guides/svelte/configuration/integrations/rrweb/', - to: '/platforms/javascript/session-replay/', - }, - { - from: '/platforms/javascript/guides/vue/configuration/integrations/rrweb/', - to: '/platforms/javascript/session-replay/', - }, - { - from: '/platforms/javascript/guides/wasm/configuration/integrations/rrweb/', - to: '/platforms/javascript/session-replay/', - }, - { - from: '/platforms/javascript/guides/remix/session-replay/custom-instrumentation/', - to: '/platforms/javascript/session-replay/', - }, - { - from: '/platforms/javascript/guides/remix/session-replay/custom-instrumentation/privacy-configuration/', - to: '/platforms/javascript/session-replay/', - }, - { - from: '/platforms/javascript/guides/gatsby/session-replay/custom-instrumentation/', - to: '/platforms/javascript/session-replay/', - }, - { - from: '/platforms/unreal/setup-crashreport/', - to: '/platforms/unreal/configuration/setup-crashreporter/', - }, - { - from: '/platforms/unreal/setup-crashreporter/', - to: '/platforms/unreal/configuration/setup-crashreporter/', - }, - { - from: '/platforms/unreal/debug-symbols/', - to: '/platforms/unreal/configuration/debug-symbols/', - }, - { - from: '/clients/ruby/config/', - to: '/platforms/ruby/configuration/options/', - }, - { - from: '/platforms/ruby/config/', - to: '/platforms/ruby/configuration/options/', - }, - { - from: '/contributing/approach/write-getting-started/', - to: '/contributing/approach/sdk-docs/write-getting-started/', - }, - { - from: '/contributing/approach/write-data-management/', - to: '/contributing/approach/sdk-docs/write-data-management/', - }, - { - from: '/contributing/approach/write-sdk-docs/', - to: '/contributing/approach/sdk-docs/', - }, - { - from: '/contributing/approach/write-configuration/', - to: '/contributing/approach/sdk-docs/write-configuration/', - }, - { - from: '/contributing/approach/common_content/', - to: '/contributing/approach/sdk-docs/common_content/', - }, - { - from: '/contributing/approach/write-performance/', - to: '/contributing/approach/sdk-docs/write-performance/', - }, - { - from: '/contributing/approach/write-enriching-events/', - to: '/contributing/approach/sdk-docs/write-enriching-events/', - }, - { - from: '/contributing/approach/write-usage/', - to: '/contributing/approach/sdk-docs/write-usage/', - }, - { - from: '/learn/releases/', - to: '/product/releases/', - }, - { - from: '/workflow/releases/', - to: '/product/releases/', - }, - { - from: '/workflow/releases/index/', - to: '/product/releases/', - }, - { - from: '/workflow/releases/release-automation/', - to: '/product/releases/', - }, - { - from: '/product/releases/release-automation/', - to: '/product/releases/', - }, - { - from: '/workflow/releases/health/', - to: '/product/releases/health/', - }, - { - from: '/product/releases/health/crash/', - to: '/product/releases/health/', - }, - { - from: '/product/releases/health/setup/', - to: '/product/releases/setup/', - }, - { - from: '/workflow/releases/release-automation/travis-ci/', - to: '/product/releases/setup/release-automation/travis-ci/', - }, - { - from: '/workflow/releases/release-automation/circleci/', - to: '/product/releases/setup/release-automation/circleci/', - }, - { - from: '/workflow/releases/release-automation/netlify/', - to: '/product/releases/setup/release-automation/netlify/', - }, - { - from: '/workflow/releases/release-automation/jenkins/', - to: '/product/releases/setup/release-automation/jenkins/', - }, - { - from: '/workflow/releases/release-automation/bitbucket-pipelines/', - to: '/product/releases/setup/release-automation/bitbucket-pipelines/', - }, - { - from: '/workflow/releases/release-automation/github-actions/', - to: '/product/releases/setup/release-automation/github-actions/', - }, - { - from: '/product/releases/setup/manual-setup-releases/', - to: '/product/releases/associate-commits/', - }, - { - from: '/product/releases/health/release-details/', - to: '/product/releases/release-details/', - }, - { - from: '/guides/integrate-frontend/upload-source-maps/', - to: '/product/sentry-basics/integrate-frontend/upload-source-maps/', - }, - { - from: '/product/sentry-basics/guides/integrate-frontend/upload-source-maps/', - to: '/product/sentry-basics/integrate-frontend/upload-source-maps/', - }, - { - from: '/guides/integrate-frontend/configure-scms/', - to: '/product/sentry-basics/integrate-frontend/configure-scms/', - }, - { - from: '/product/sentry-basics/guides/integrate-frontend/configure-scms/', - to: '/product/sentry-basics/integrate-frontend/configure-scms/', - }, - { - from: '/guides/integrate-frontend/', - to: '/product/sentry-basics/integrate-frontend/', - }, - { - from: '/product/sentry-basics/guides/integrate-frontend/', - to: '/product/sentry-basics/integrate-frontend/', - }, - { - from: '/product/sentry-basics/frontend/create-new-project/', - to: '/product/sentry-basics/integrate-frontend/', - }, - { - from: '/guides/integrate-frontend/create-new-project/', - to: '/product/sentry-basics/integrate-frontend/create-new-project/', - }, - { - from: '/product/sentry-basics/guides/integrate-frontend/create-new-project/', - to: '/product/sentry-basics/integrate-frontend/create-new-project/', - }, - { - from: '/guides/integrate-frontend/initialize-sentry-sdk/', - to: '/product/sentry-basics/integrate-frontend/initialize-sentry-sdk/', - }, - { - from: '/product/sentry-basics/guides/integrate-frontend/initialize-sentry-sdk/', - to: '/product/sentry-basics/integrate-frontend/initialize-sentry-sdk/', - }, - { - from: '/guides/integrate-frontend/generate-first-error/', - to: '/product/sentry-basics/integrate-frontend/generate-first-error/', - }, - { - from: '/product/sentry-basics/guides/integrate-frontend/generate-first-error/', - to: '/product/sentry-basics/integrate-frontend/generate-first-error/', - }, - { - from: '/basics/', - to: '/product/sentry-basics/', - }, - { - from: '/product/sentry-basics/guides/', - to: '/product/sentry-basics/', - }, - { - from: '/product/sentry-basics/tracing/', - to: '/product/sentry-basics/concepts/tracing/', - }, - { - from: '/performance/distributed-tracing/', - to: '/product/sentry-basics/concepts/tracing/distributed-tracing/', - }, - { - from: '/performance-monitoring/distributed-tracing/', - to: '/product/sentry-basics/concepts/tracing/distributed-tracing/', - }, - { - from: '/product/sentry-basics/guides/error-tracing/', - to: '/product/sentry-basics/concepts/tracing/distributed-tracing/', - }, - { - from: '/product/performance/distributed-tracing/', - to: '/product/sentry-basics/concepts/tracing/distributed-tracing/', - }, - { - from: '/product/sentry-basics/tracing/distributed-tracing/', - to: '/product/sentry-basics/concepts/tracing/distributed-tracing/', - }, - { - from: '/product/performance/trace-view/', - to: '/product/sentry-basics/concepts/tracing/trace-view/', - }, - { - from: '/product/sentry-basics/tracing/trace-view/', - to: '/product/sentry-basics/concepts/tracing/trace-view/', - }, - { - from: '/product/performance/event-detail/', - to: '/concepts/key-terms/tracing/trace-view/', - }, - { - from: '/product/sentry-basics/tracing/event-detail/', - to: '/product/sentry-basics/concepts/key-terms/tracing/trace-view/', - }, - { - from: '/concepts/key-terms/tracing/event-detail/', - to: '/concepts/key-terms/tracing/trace-view/', - }, - { - from: '/product/sentry-basics/dsn-explainer/', - to: '/product/sentry-basics/concepts/dsn-explainer/', - }, - { - from: '/enriching-error-data/environments/', - to: '/product/sentry-basics/concepts/environments/', - }, - { - from: '/learn/environments/', - to: '/product/sentry-basics/concepts/environments/', - }, - { - from: '/product/sentry-basics/environments/', - to: '/product/sentry-basics/concepts/environments/', - }, - { - from: '/product/sentry-basics/key-terms/', - to: '/product/sentry-basics/concepts/key-terms/', - }, - { - from: '/guides/enrich-data/', - to: '/product/sentry-basics/concepts/enrich-data/', - }, - { - from: '/product/sentry-basics/guides/enrich-data/', - to: '/product/sentry-basics/concepts/enrich-data/', - }, - { - from: '/product/sentry-basics/enrich-data/', - to: '/product/sentry-basics/concepts/enrich-data/', - }, - { - from: '/guides/integrate-backend/capturing-errors/', - to: '/product/sentry-basics/integrate-backend/capturing-errors/', - }, - { - from: '/product/sentry-basics/guides/integrate-backend/capturing-errors/', - to: '/product/sentry-basics/integrate-backend/capturing-errors/', - }, - { - from: '/guides/integrate-backend/', - to: '/product/sentry-basics/integrate-backend/', - }, - { - from: '/product/sentry-basics/guides/integrate-backend/', - to: '/product/sentry-basics/integrate-backend/', - }, - { - from: '/guides/integrate-backend/configuration-options/', - to: '/product/sentry-basics/integrate-backend/configuration-options/', - }, - { - from: '/product/sentry-basics/guides/integrate-backend/configuration-options/', - to: '/product/sentry-basics/integrate-backend/configuration-options/', - }, - { - from: '/guides/integrate-backend/getting-started/', - to: '/product/sentry-basics/integrate-backend/getting-started/', - }, - { - from: '/product/sentry-basics/guides/integrate-backend/getting-started/', - to: '/product/sentry-basics/integrate-backend/getting-started/', - }, - { - from: '/ssl/', - to: '/security-legal-pii/security/ssl/', - }, - { - from: '/ip-ranges/', - to: '/security-legal-pii/security/ip-ranges/', - }, - { - from: '/learn/security-policy-reporting/', - to: '/security-legal-pii/security/security-policy-reporting/', - }, - { - from: '/error-reporting/security-policy-reporting/', - to: '/security-legal-pii/security/security-policy-reporting/', - }, - { - from: '/platforms/javascript/troubleshooting/session-replay/', - to: '/platforms/javascript/session-replay/troubleshooting/', - }, - { - from: '/platforms/javascript/guides/:guide/troubleshooting/session-replay/', - to: '/platforms/javascript/session-replay/troubleshooting/', - }, - { - from: '/sdks/javascript/config/sourcemaps/', - to: '/platforms/javascript/sourcemaps/', - }, - { - from: '/platforms/javascript/sourcemaps/generation/', - to: '/platforms/javascript/sourcemaps/', - }, - { - from: '/platforms/javascript/sourcemaps/availability/', - to: '/platforms/javascript/sourcemaps/', - }, - { - from: '/platforms/javascript/configuration/sourcemaps/', - to: '/platforms/javascript/sourcemaps/', - }, - { - from: '/platforms/javascript/guides/docPlatform/sourcemaps/', - to: '/platforms/javascript/sourcemaps/', - }, - { - from: '/platforms/javascript/guides/:guide/sourcemaps/multiple-origins/', - to: '/platforms/javascript/guides/:guide/sourcemaps/', - }, - { - from: '/platforms/javascript/guides/:guide/sourcemaps/uploading-without-debug-ids/', - to: '/platforms/javascript/guides/:guide/sourcemaps/', - }, - { - from: '/platforms/javascript/sourcemaps/uploading-without-debug-ids/', - to: '/platforms/javascript/sourcemaps/troubleshooting_js/', - }, - { - from: '/platforms/javascript/sourcemaps/troubleshooting_js/verify-artifact-distribution-value-matches-value-configured-in-your-sdk/', - to: '/platforms/javascript/sourcemaps/troubleshooting_js/', - }, - { - from: '/platforms/javascript/sourcemaps/troubleshooting_js/uploading-without-debug-ids/', - to: '/platforms/javascript/sourcemaps/troubleshooting_js/legacy-uploading-methods/', - }, - { - from: '/platforms/javascript/sourcemaps/tools/webpack/', - to: '/platforms/javascript/sourcemaps/uploading/webpack/', - }, - { - from: '/platforms/javascript/sourcemaps/hosting-publicly/', - to: '/platforms/javascript/sourcemaps/uploading/hosting-publicly/', - }, - { - from: '/platforms/javascript/guides/cordova/troubleshooting/supported-browsers/', - to: '/platforms/javascript/guides/cordova/troubleshooting/', - }, - { - from: '/clients/cordova/ionic/', - to: '/platforms/javascript/guides/cordova/ionic/', - }, - { - from: '/sdks/react/integrations/vue-router/', - to: '/platforms/javascript/guides/vue/features/vue-router/', - }, - { - from: '/platforms/javascript/guides/vue/configuration/integrations/vue-router/', - to: '/platforms/javascript/guides/vue/features/vue-router/', - }, - { - from: '/platforms/javascript/vue/', - to: '/platforms/javascript/guides/vue/', - }, - { - from: '/clients/javascript/integrations/vue/', - to: '/platforms/javascript/guides/vue/', - }, - { - from: '/clients/javascript/integrations/angular/', - to: '/platforms/javascript/guides/angular/angular1/', - }, - { - from: '/platforms/javascript/gatsby/', - to: '/platforms/javascript/guides/gatsby/', - }, - { - from: '/platforms/javascript/guides/gatsby/errors/breadcrumbs/', - to: '/platforms/javascript/guides/gatsby/', - }, - { - from: '/clients/javascript/integrations/ember/', - to: '/platforms/javascript/guides/ember/', - }, - { - from: '/platforms/javascript/ember/', - to: '/platforms/javascript/guides/ember/', - }, - { - from: '/platforms/javascript/guides/electron/configuration/integrations/optional/', - to: '/platforms/javascript/guides/electron/configuration/integrations/electronminidump/', - }, - { - from: '/clients/electron/', - to: '/platforms/javascript/guides/electron/', - }, - { - from: '/platforms/javascript/electron/', - to: '/platforms/javascript/guides/electron/', - }, - { - from: '/platforms/electron/', - to: '/platforms/javascript/guides/electron/', - }, - { - from: '/platforms/javascript/electron/sourcemaps/', - to: '/platforms/javascript/guides/electron/', - }, - { - from: '/platforms/javascript/guides/electron/lazy-load-sentry/', - to: '/platforms/javascript/guides/electron/', - }, - { - from: '/sdks/react/integrations/redux/', - to: '/platforms/javascript/guides/react/features/redux/', - }, - { - from: '/platforms/javascript/guides/react/configuration/integrations/redux/', - to: '/platforms/javascript/guides/react/features/redux/', - }, - { - from: '/platforms/javascript/guides/react/integrations/react-router/', - to: '/platforms/javascript/guides/react/features/react-router/', - }, - { - from: '/platforms/javascript/guides/react/configuration/integrations/react-router/', - to: '/platforms/javascript/guides/react/features/react-router/', - }, - { - from: '/platforms/javascript/guides/session-replay/', - to: '/platforms/javascript/session-replay/', - }, - { - from: '/platforms/javascript/react/', - to: '/platforms/javascript/guides/react/', - }, - { - from: '/clients/javascript/integrations/react/', - to: '/platforms/javascript/guides/react/', - }, - { - from: '/sdks/react/', - to: '/platforms/javascript/guides/react/', - }, - { - from: '/platforms/react/', - to: '/platforms/javascript/guides/react/', - }, - { - from: '/clients/javascript/config/', - to: '/platforms/javascript/legacy-sdk/config/', - }, - { - from: '/clients/javascript/install/', - to: '/platforms/javascript/legacy-sdk/install/', - }, - { - from: '/clients/javascript/sourcemaps/', - to: '/platforms/javascript/legacy-sdk/sourcemaps/', - }, - { - from: '/clients/javascript/integrations/', - to: '/platforms/javascript/legacy-sdk/integrations/', - }, - { - from: '/clients/javascript/usage/', - to: '/platforms/javascript/legacy-sdk/usage/', - }, - { - from: '/clients/javascript/tips/', - to: '/platforms/javascript/legacy-sdk/tips/', - }, - { - from: '/platforms/node/pluggable-integrations/', - to: '/platforms/javascript/guides/node/configuration/integrations/', - }, - { - from: '/platforms/node/default-integrations/', - to: '/platforms/javascript/guides/node/configuration/integrations/', - }, - { - from: '/platforms/node/integrations/default-integrations/', - to: '/platforms/javascript/guides/node/configuration/integrations/', - }, - { - from: '/platforms/javascript/guides/:guide/configuration/integrations/pluggable-integrations/', - to: '/platforms/javascript/guides/:guide/configuration/integrations/', - }, - { - from: '/platforms/javascript/guides/:guide/configuration/integrations/default-integrations/', - to: '/platforms/javascript/guides/:guide/configuration/integrations/', - }, - { - from: '/platforms/node/sourcemaps/troubleshooting_js/uploading-without-debug-ids/', - to: '/platforms/javascript/guides/node/sourcemaps/troubleshooting_js/legacy-uploading-methods/', - }, - { - from: '/platforms/node/gcp_functions/', - to: '/platforms/javascript/guides/gcp-functions/', - }, - { - from: '/clients/node/integrations/express/', - to: '/platforms/javascript/guides/express/', - }, - { - from: '/platforms/node/express/', - to: '/platforms/javascript/guides/express/', - }, - { - from: '/platforms/node/guides/express/integrations/default-integrations/', - to: '/platforms/javascript/guides/express/', - }, - { - from: '/platforms/node/aws_lambda/', - to: '/platforms/javascript/guides/aws-lambda/', - }, - { - from: '/platforms/node/azure_functions/', - to: '/platforms/javascript/guides/azure-functions/', - }, - { - from: '/platforms/node/guides/azure-functions/typescript/', - to: '/platforms/javascript/guides/azure-functions/', - }, - { - from: '/clients/node/integrations/connect/', - to: '/platforms/javascript/guides/connect/', - }, - { - from: '/platforms/node/connect/', - to: '/platforms/javascript/guides/connect/', - }, - { - from: '/clients/node/integrations/koa/', - to: '/platforms/javascript/guides/koa/', - }, - { - from: '/platforms/node/koa/', - to: '/platforms/javascript/guides/koa/', - }, - { - from: '/platforms/node/guides/koa/typescript/', - to: '/platforms/javascript/guides/koa/', - }, - { - from: '/clients/node/config/', - to: '/platforms/javascript/guides/node/legacy-sdk/config/', - }, - { - from: '/clients/node/coffeescript/', - to: '/platforms/javascript/guides/node/legacy-sdk/coffeescript/', - }, - { - from: '/clients/node/sourcemaps/', - to: '/platforms/javascript/guides/node/legacy-sdk/sourcemaps/', - }, - { - from: '/clients/node/typescript/', - to: '/platforms/javascript/guides/node/legacy-sdk/typescript/', - }, - { - from: '/platforms/node/typescript/', - to: '/platforms/javascript/guides/node/legacy-sdk/typescript/', - }, - { - from: '/clients/node/integrations/', - to: '/platforms/javascript/guides/node/legacy-sdk/integrations/', - }, - { - from: '/clients/node/usage/', - to: '/platforms/javascript/guides/node/legacy-sdk/usage/', - }, - { - from: '/platforms/node/usage/set-level/', - to: '/platforms/javascript/guides/node/enriching-events/level/', - }, - { - from: '/platforms/node/usage/sdk-fingerprinting/', - to: '/platforms/javascript/guides/node/enriching-events/fingerprinting/', - }, - { - from: '/platforms/node/guides/:guide/usage/set-level/', - to: '/platforms/javascript/guides/:guide/enriching-events/level/', - }, - { - from: '/platforms/node/guides/:guide/usage/sdk-fingerprinting/', - to: '/platforms/javascript/guides/:guide/enriching-events/fingerprinting/', - }, - { - from: '/platforms/javascript/usage/set-level/', - to: '/platforms/javascript/enriching-events/level/', - }, - { - from: '/platforms/javascript/usage/sdk-fingerprinting/', - to: '/platforms/javascript/enriching-events/fingerprinting/', - }, - { - from: '/platforms/javascript/guides/:guide/usage/set-level/', - to: '/platforms/javascript/guides/:guide/enriching-events/level/', - }, - { - from: '/platforms/javascript/guides/:guide/usage/sdk-fingerprinting/', - to: '/platforms/javascript/guides/:guide/enriching-events/fingerprinting/', - }, - { - from: '/platforms/javascript/guides/:guide/tracing/instrumentation/opentelemetry/', - to: '/platforms/javascript/guides/:guide/opentelemetry/', - }, - { - from: '/learn/cli/configuration/', - to: '/cli/configuration/', - }, - { - from: '/learn/cli/', - to: '/cli/', - }, - { - from: '/learn/cli/releases/', - to: '/cli/releases/', - }, - { - from: '/cli/metrics/', - to: '/cli/send-event/', - }, - { - from: '/workflow/alerts-notifications/', - to: '/product/alerts/', - }, - { - from: '/product/alerts-notifications/', - to: '/product/alerts/', - }, - { - from: '/product/sentry-basics/guides/alert-notifications/', - to: '/product/alerts/', - }, - { - from: '/product/alerts/create-alerts/best-practices/', - to: '/product/alerts/best-practices/', - }, - { - from: '/product/sentry-basics/guides/alert-notifications/routing-alerts/', - to: '/product/alerts/create-alerts/routing-alerts/', - }, - { - from: '/product/sentry-basics/guides/alert-notifications/issue-alerts/', - to: '/product/alerts/create-alerts/issue-alert-config/', - }, - { - from: '/product/alerts/alert-settings/', - to: '/product/alerts/create-alerts/issue-alert-config/', - }, - { - from: '/product/alerts-notifications/alert-settings/', - to: '/product/alerts/create-alerts/issue-alert-config/', - }, - { - from: '/product/sentry-basics/guides/alert-notifications/metric-alerts/', - to: '/product/alerts/create-alerts/metric-alert-config/', - }, - { - from: '/workflow/alerts-notifications/alerts/', - to: '/product/alerts/alert-types/', - }, - { - from: '/workflow/notifications/alerts/', - to: '/product/alerts/alert-types/', - }, - { - from: '/product/alerts-notifications/alerts/', - to: '/product/alerts/alert-types/', - }, - { - from: '/product/alerts-notifications/metric-alerts/', - to: '/product/alerts/alert-types/', - }, - { - from: '/product/alerts-notifications/issue-alerts/', - to: '/product/alerts/alert-types/', - }, - { - from: '/product/alerts/create-alerts/crash-rate-alert-config/', - to: '/product/alerts/alert-types/', - }, - { - from: '/workflow/alerts-notifications/notifications/', - to: '/product/alerts/notifications/', - }, - { - from: '/workflow/notifications/workflow/', - to: '/product/alerts/notifications/', - }, - { - from: '/workflow/notifications/', - to: '/product/alerts/notifications/', - }, - { - from: '/product/notifications/', - to: '/product/alerts/notifications/', - }, - { - from: '/learn/notifications/', - to: '/product/alerts/notifications/', - }, - { - from: '/product/alerts-notifications/notifications/', - to: '/product/alerts/notifications/', - }, - { - from: '/product/sentry-basics/guides/alert-notifications/notifications/', - to: '/product/alerts/notifications/', - }, - { - from: '/workflow/integrations/amazon-sqs/', - to: '/organization/integrations/data-forwarding/amazon-sqs/', - }, - { - from: '/workflow/integrations/legacy-integrations/amazon-sqs/', - to: '/organization/integrations/data-forwarding/amazon-sqs/', - }, - { - from: '/product/integrations/amazon-sqs/', - to: '/organization/integrations/data-forwarding/amazon-sqs/', - }, - { - from: '/product/integrations/segment/', - to: '/organization/integrations/data-forwarding/segment/', - }, - { - from: '/workflow/integrations/splunk/', - to: '/organization/integrations/data-forwarding/splunk/', - }, - { - from: '/workflow/integrations/legacy-integrations/splunk/', - to: '/organization/integrations/data-forwarding/splunk/', - }, - { - from: '/product/integrations/splunk/', - to: '/organization/integrations/data-forwarding/splunk/', - }, - { - from: '/organization/integrations/data-visualization/splunk/', - to: '/organization/integrations/data-forwarding/splunk/', - }, - { - from: '/organization/integrations/data-visualization/segment/', - to: '/organization/integrations/data-forwarding/segment/', - }, - { - from: '/organization/integrations/data-visualization/amazon-sqs/', - to: '/organization/integrations/data-forwarding/amazon-sqs/', - }, - { - from: '/organization/integrations/data-visualization/grafana/', - to: '/organization/integrations/data-forwarding/grafana/', - }, - { - from: '/organization/integrations/data-visualization/', - to: '/organization/integrations/data-forwarding/', - }, - { - from: '/concepts/data-management/data-forwarding/', - to: '/organization/integrations/data-forwarding/', - }, - { - from: '/concepts/otlp/otlp-logs/', - to: '/concepts/otlp/direct/logs/', - }, - { - from: '/concepts/otlp/otlp-traces/', - to: '/concepts/otlp/direct/traces/', - }, - { - from: '/product/drains/integration/vercel/', - to: '/product/drains/vercel/', - }, - { - from: '/product/drains/integration/cloudflare/', - to: '/product/drains/cloudflare/', - }, - { - from: '/product/drains/integration/heroku/', - to: '/product/drains/heroku/', - }, - { - from: '/product/drains/integration/openrouter/', - to: '/product/drains/openrouter/', - }, - { - from: '/product/drains/integration/supabase/', - to: '/product/drains/supabase/', - }, - { - from: '/product/drains/integration/shopify-hydrogen/', - to: '/product/drains/shopify-hydrogen/', - }, - { - from: '/product/drains/integration/opentelemetry-collector/', - to: '/concepts/otlp/forwarding/pipelines/collector/', - }, - { - from: '/product/drains/integration/vector/', - to: '/concepts/otlp/forwarding/pipelines/vector/', - }, - { - from: '/product/drains/integration/fluentbit/', - to: '/concepts/otlp/forwarding/pipelines/fluentbit/', - }, - { - from: '/product/drains/otlp-guides/aws-cloudwatch/', - to: '/concepts/otlp/forwarding/sources/aws-cloudwatch/', - }, - { - from: '/product/drains/otlp-guides/kafka/', - to: '/concepts/otlp/forwarding/sources/kafka/', - }, - { - from: '/product/drains/otlp-guides/nginx/', - to: '/concepts/otlp/forwarding/sources/nginx/', - }, - { - from: '/product/drains/otlp-guides/syslog/', - to: '/concepts/otlp/forwarding/sources/syslog/', - }, - { - from: '/product/drains/otlp-guides/windows-events/', - to: '/concepts/otlp/forwarding/sources/windows-events/', - }, - { - from: '/workflow/integrations/gitlab/', - to: '/organization/integrations/source-code-mgmt/gitlab/', - }, - { - from: '/workflow/integrations/global-integrations/gitlab/', - to: '/organization/integrations/source-code-mgmt/gitlab/', - }, - { - from: '/product/integrations/gitlab/', - to: '/organization/integrations/source-code-mgmt/gitlab/', - }, - { - from: '/workflow/integrations/azure-devops/', - to: '/organization/integrations/source-code-mgmt/azure-devops/', - }, - { - from: '/workflow/integrations/legacy-integrations/azure-devops/', - to: '/organization/integrations/source-code-mgmt/azure-devops/', - }, - { - from: '/workflow/integrations/global-integrations/azure-devops/', - to: '/organization/integrations/source-code-mgmt/azure-devops/', - }, - { - from: '/product/integrations/azure-devops/', - to: '/organization/integrations/source-code-mgmt/azure-devops/', - }, - { - from: '/integrations/azure-devops/', - to: '/organization/integrations/source-code-mgmt/azure-devops/', - }, - { - from: '/workflow/integrations/github/', - to: '/organization/integrations/source-code-mgmt/github/', - }, - { - from: '/workflow/integrations/legacy-integrations/github/', - to: '/organization/integrations/source-code-mgmt/github/', - }, - { - from: '/workflow/integrations/global-integrations/github/', - to: '/organization/integrations/source-code-mgmt/github/', - }, - { - from: '/product/integrations/github/', - to: '/organization/integrations/source-code-mgmt/github/', - }, - { - from: '/integrations/github-enterprise/', - to: '/organization/integrations/source-code-mgmt/github/', - }, - { - from: '/integrations/github/', - to: '/organization/integrations/source-code-mgmt/github/', - }, - { - from: '/workflow/integrations/bitbucket/', - to: '/organization/integrations/source-code-mgmt/bitbucket/', - }, - { - from: '/workflow/integrations/legacy-integrations/bitbucket/', - to: '/organization/integrations/source-code-mgmt/bitbucket/', - }, - { - from: '/workflow/integrations/global-integrations/bitbucket/', - to: '/organization/integrations/source-code-mgmt/bitbucket/', - }, - { - from: '/product/integrations/bitbucket/', - to: '/organization/integrations/source-code-mgmt/bitbucket/', - }, - { - from: '/integrations/bitbucket/', - to: '/organization/integrations/source-code-mgmt/bitbucket/', - }, - { - from: '/integrations/', - to: '/organization/integrations/', - }, - { - from: '/workflow/integrations/', - to: '/organization/integrations/', - }, - { - from: '/workflow/integrations/legacy-integrations/', - to: '/organization/integrations/', - }, - { - from: '/workflow/integrations/global-integrations/', - to: '/organization/integrations/', - }, - { - from: '/workflow/legacy-integrations/', - to: '/organization/integrations/', - }, - { - from: '/workflow/global-integrations/', - to: '/organization/integrations/', - }, - { - from: '/workflow/integrations/rookout/', - to: '/organization/integrations/debugging/rookout/', - }, - { - from: '/workflow/integrations/global-integrations/rookout/', - to: '/organization/integrations/debugging/rookout/', - }, - { - from: '/product/integrations/rookout/', - to: '/organization/integrations/debugging/rookout/', - }, - { - from: '/product/integrations/gcp-cloud-run/', - to: '/organization/integrations/cloud-monitoring/gcp-cloud-run/', - }, - { - from: '/product/integrations/aws-lambda/', - to: '/organization/integrations/cloud-monitoring/aws-lambda/', - }, - { - from: '/product/integrations/cloudflare-workers/', - to: '/platforms/javascript/guides/cloudflare/', - }, - { - from: '/product/integrations/vanta/', - to: '/organization/integrations/compliance/vanta/', - }, - { - from: '/product/integrations/truto/', - to: '/organization/integrations/compliance/truto/', - }, - { - from: '/integrations/discord/', - to: '/organization/integrations/notification-incidents/discord/', - }, - { - from: '/product/integrations/discord/', - to: '/organization/integrations/notification-incidents/discord/', - }, - { - from: '/product/accounts/early-adopter-features/discord/', - to: '/organization/integrations/notification-incidents/discord/', - }, - { - from: '/workflow/integrations/pagerduty/', - to: '/organization/integrations/notification-incidents/pagerduty/', - }, - { - from: '/workflow/integrations/legacy-integrations/pagerduty/', - to: '/organization/integrations/notification-incidents/pagerduty/', - }, - { - from: '/workflow/integrations/global-integrations/pagerduty/', - to: '/organization/integrations/notification-incidents/pagerduty/', - }, - { - from: '/product/integrations/pagerduty/', - to: '/organization/integrations/notification-incidents/pagerduty/', - }, - { - from: '/product/integrations/notification-incidents/amixr/', - to: '/organization/integrations/notification-incidents/', - }, - { - from: '/product/integrations/msteams/', - to: '/organization/integrations/notification-incidents/msteams/', - }, - { - from: '/product/integrations/rootly/', - to: '/organization/integrations/notification-incidents/rootly/', - }, - { - from: '/product/integrations/spikesh/', - to: '/product/integrations/notification-incidents/spikesh/', - }, - { - from: '/workflow/integrations/slack/', - to: '/product/integrations/notification-incidents/slack/', - }, - { - from: '/workflow/integrations/legacy-integrations/slack/', - to: '/product/integrations/notification-incidents/slack/', - }, - { - from: '/workflow/integrations/global-integrations/slack/', - to: '/product/integrations/notification-incidents/slack/', - }, - { - from: '/integrations/slack/', - to: '/product/integrations/notification-incidents/slack/', - }, - { - from: '/product/integrations/slack/', - to: '/product/integrations/notification-incidents/slack/', - }, - { - from: '/workflow/integrations/integration-platform/ui-components/', - to: '/product/integrations/integration-platform/ui-components/', - }, - { - from: '/workflow/integrations/integration-platform/', - to: '/product/integrations/integration-platform/', - }, - { - from: '/workflow/integrations/integration-platform/webhooks/', - to: '/product/integrations/integration-platform/webhooks/', - }, - { - from: '/product/integrations/openreplay/', - to: '/product/integrations/session-replay/openreplay/', - }, - { - from: '/product/integrations/fullstory/', - to: '/product/integrations/session-replay/fullstory/', - }, - { - from: '/product/integrations/jam/', - to: '/product/integrations/session-replay/jam/', - }, - { - from: '/product/integrations/atlas/', - to: '/product/integrations/session-replay/atlas/', - }, - { - from: '/workflow/integrations/split/', - to: '/product/integrations/feature-flag/split/', - }, - { - from: '/workflow/integrations/global-integrations/split/', - to: '/product/integrations/feature-flag/split/', - }, - { - from: '/product/integrations/split/', - to: '/product/integrations/feature-flag/split/', - }, - { - from: '/product/integrations/launchdarkly/', - to: '/product/integrations/feature-flag/launchdarkly/', - }, - { - from: '/workflow/integrations/vercel/', - to: '/product/integrations/deployment/vercel/', - }, - { - from: '/workflow/integrations/global-integrations/vercel/', - to: '/product/integrations/deployment/vercel/', - }, - { - from: '/product/integrations/vercel/', - to: '/product/integrations/deployment/vercel/', - }, - { - from: '/workflow/integrations/heroku/', - to: '/product/integrations/deployment/heroku/', - }, - { - from: '/workflow/integrations/legacy-integrations/gitlab/', - to: '/product/integrations/deployment/heroku/', - }, - { - from: '/product/integrations/heroku/', - to: '/product/integrations/deployment/heroku/', - }, - { - from: '/workflow/integrations/clubhouse/', - to: '/product/integrations/issue-tracking/shortcut/', - }, - { - from: '/workflow/integrations/legacy-integrations/clubhouse/', - to: '/product/integrations/issue-tracking/shortcut/', - }, - { - from: '/workflow/integrations/global-integrations/clubhouse/', - to: '/product/integrations/issue-tracking/shortcut/', - }, - { - from: '/product/integrations/clubhouse/', - to: '/product/integrations/issue-tracking/shortcut/', - }, - { - from: '/product/integrations/issue-tracking/clubhouse/', - to: '/product/integrations/issue-tracking/shortcut/', - }, - { - from: '/product/integrations/shortcut/', - to: '/product/integrations/issue-tracking/shortcut/', - }, - { - from: '/product/integrations/project-mgmt/shortcut/', - to: '/product/integrations/issue-tracking/shortcut/', - }, - { - from: '/product/integrations/sourcegraph/', - to: '/product/integrations/issue-tracking/sourcegraph/', - }, - { - from: '/product/integrations/incidentio/', - to: '/product/integrations/issue-tracking/incidentio/', - }, - { - from: '/product/integrations/height/', - to: '/product/integrations/issue-tracking/height/', - }, - { - from: '/product/integrations/project-mgmt/', - to: '/product/integrations/issue-tracking/', - }, - { - from: '/product/integrations/linear/', - to: '/product/integrations/issue-tracking/linear/', - }, - { - from: '/product/integrations/project-mgmt/linear/', - to: '/product/integrations/issue-tracking/linear/', - }, - { - from: '/workflow/integrations/clickup/', - to: '/product/integrations/issue-tracking/clickup/', - }, - { - from: '/integrations/clickup/', - to: '/product/integrations/issue-tracking/clickup/', - }, - { - from: '/workflow/integrations/global-integrations/clickup/', - to: '/product/integrations/issue-tracking/clickup/', - }, - { - from: '/product/integrations/clickup/', - to: '/product/integrations/issue-tracking/clickup/', - }, - { - from: '/product/integrations/project-mgmt/clickup/', - to: '/product/integrations/issue-tracking/clickup/', - }, - { - from: '/workflow/integrations/jira-server/', - to: '/product/integrations/issue-tracking/jira/', - }, - { - from: '/workflow/integrations/jira/', - to: '/product/integrations/issue-tracking/jira/', - }, - { - from: '/workflow/integrations/global-integrations/jira-server/', - to: '/product/integrations/issue-tracking/jira/', - }, - { - from: '/workflow/integrations/global-integrations/jira/', - to: '/product/integrations/issue-tracking/jira/', - }, - { - from: '/workflow/legacy-integrations/jira/', - to: '/product/integrations/issue-tracking/jira/', - }, - { - from: '/product/integrations/jira/', - to: '/product/integrations/issue-tracking/jira/', - }, - { - from: '/product/integrations/project-mgmt/jira/', - to: '/product/integrations/issue-tracking/jira/', - }, - { - from: '/integrations/jira/', - to: '/product/integrations/issue-tracking/jira/', - }, - { - from: '/workflow/integrations/asana/', - to: '/product/integrations/issue-tracking/asana/', - }, - { - from: '/workflow/integrations/legacy-integrations/asana/', - to: '/product/integrations/issue-tracking/asana/', - }, - { - from: '/workflow/integrations/global-integrations/asana/', - to: '/product/integrations/issue-tracking/asana/', - }, - { - from: '/product/integrations/asana/', - to: '/product/integrations/issue-tracking/asana/', - }, - { - from: '/product/integrations/project-mgmt/asana/', - to: '/product/integrations/issue-tracking/asana/', - }, - { - from: '/product/integrations/teamwork/', - to: '/product/integrations/issue-tracking/teamwork/', - }, - { - from: '/product/integrations/project-mgmt/teamwork/', - to: '/product/integrations/issue-tracking/teamwork/', - }, - { - from: '/workflow/user-settings/', - to: '/account/user-settings/', - }, - { - from: '/product/accounts/early-adopter/', - to: '/organization/early-adopter-features/', - }, - { - from: '/pricing/am2-pricing/', - to: '/pricing/legacy-pricing/', - }, - { - from: '/pricing/quotas/manage-event-stream-guide/adjusting-quotas/', - to: '/pricing/quotas/manage-event-stream-guide/#adjusting-quotas', - }, - { - from: '/learn/pricing/', - to: '/pricing/', - }, - { - from: '/product/pricing/', - to: '/pricing/', - }, - { - from: '/learn/quotas/', - to: '/pricing/quotas/', - }, - { - from: '/product/quotas/', - to: '/pricing/quotas/', - }, - { - from: '/learn/sensitive-data/', - to: '/security-legal-pii/scrubbing/', - }, - { - from: '/product/data-management-settings/dynamic-sampling/getting-started/', - to: '/pricing/quotas/', - }, - { - from: '/product/data-management-settings/dynamic-sampling/benefits-dynamic-sampling/', - to: '/pricing/quotas/', - }, - { - from: '/guides/manage-event-stream/', - to: '/pricing/quotas/manage-event-stream-guide/', - }, - { - from: '/learn/sso/', - to: '/organization/authentication/sso/', - }, - { - from: '/product/sso/', - to: '/organization/authentication/sso/', - }, - { - from: '/accounts/saml2/', - to: '/organization/authentication/sso/saml2/', - }, - { - from: '/guides/getting-started/', - to: '/organization/getting-started/', - }, - { - from: '/product/sentry-basics/guides/getting-started/', - to: '/organization/getting-started/', - }, - { - from: '/learn/membership/', - to: '/organization/membership/', - }, - { - from: '/product/membership/', - to: '/organization/membership/', - }, - { - from: '/guides/migration/', - to: '/product/accounts/migration/', - }, - { - from: '/product/sentry-basics/guides/migration/', - to: '/product/accounts/migration/', - }, - { - from: '/product/sentry-basics/migration/', - to: '/product/accounts/migration/', - }, - { - from: '/product/dashboards/customize-dashboards/', - to: '/product/dashboards/custom-dashboards/', - }, - { - from: '/workflow/visibility/', - to: '/product/dashboards/', - }, - { - from: '/workflow/dashboards/', - to: '/product/dashboards/', - }, - { - from: '/profiling/', - to: '/product/explore/profiling/', - }, - { - from: '/profiling/performance-overhead/', - to: '/product/explore/profiling/performance-overhead/', - }, - { - from: '/profiling/setup/', - to: '/product/explore/profiling/getting-started/', - }, - { - from: '/profiling/getting-started/', - to: '/product/explore/profiling/getting-started/', - }, - { - from: '/profiling/mobile-app-profiling/', - to: '/product/explore/profiling/mobile-app-profiling/', - }, - { - from: '/profiling/mobile-app-profiling/metrics/', - to: '/product/explore/profiling/mobile-app-profiling/metrics/', - }, - - { - from: '/data-management/rollups/', - to: '/concepts/data-management/event-grouping/', - }, - { - from: '/learn/rollups/', - to: '/concepts/data-management/event-grouping/', - }, - { - from: '/data-management/event-grouping/', - to: '/concepts/data-management/event-grouping/', - }, - { - from: '/product/data-management-settings/event-grouping/grouping-breakdown/', - to: '/concepts/data-management/event-grouping/', - }, - { - from: '/platforms/unity/data-management/event-grouping/', - to: '/concepts/data-management/event-grouping/', - }, - { - from: '/platforms/php/data-management/event-grouping/stack-trace-rules/', - to: '/concepts/data-management/event-grouping/', - }, - { - from: '/product/data-management-settings/event-grouping/server-side-fingerprinting/', - to: '/concepts/data-management/event-grouping/fingerprint-rules/', - }, - { - from: '/learn/data-forwarding/', - to: '/concepts/data-management/data-forwarding/', - }, - { - from: '/product/data-forwarding/', - to: '/concepts/data-management/data-forwarding/', - }, - { - from: '/data-management-settings/attachment-datascrubbing/', - to: '/security-legal-pii/scrubbing/attachment-scrubbing/', - }, - { - from: '/product/data-management-settings/advanced-datascrubbing/', - to: '/security-legal-pii/scrubbing/', - }, - { - from: '/data-management/advanced-datascrubbing/', - to: '/security-legal-pii/scrubbing/advanced-datascrubbing/', - }, - { - from: '/data-management-settings/advanced-datascrubbing/', - to: '/security-legal-pii/scrubbing/advanced-datascrubbing/', - }, - { - from: '/data-management-settings/server-side-scrubbing/', - to: '/security-legal-pii/scrubbing/server-side-scrubbing/', - }, - { - from: '/data-management-settings/event-pii-fields/', - to: '/security-legal-pii/scrubbing/server-side-scrubbing/event-pii-fields/', - }, - { - from: '/product/discover/', - to: '/product/explore/discover-queries/', - }, - { - from: '/workflow/discover/', - to: '/product/explore/discover-queries/', - }, - { - from: '/workflow/discover2/', - to: '/product/explore/discover-queries/', - }, - { - from: '/performance-monitoring/discover/', - to: '/product/explore/discover-queries/', - }, - { - from: '/performance/discover/', - to: '/product/explore/discover-queries/', - }, - { - from: '/guides/discover/', - to: '/product/explore/discover-queries/uncover-trends/', - }, - { - from: '/product/sentry-basics/guides/discover/', - to: '/product/explore/discover-queries/uncover-trends/', - }, - { - from: '/workflow/discover2/query-builder/', - to: '/product/explore/discover-queries/query-builder/', - }, - { - from: '/performance-monitoring/discover-queries/query-builder/', - to: '/product/explore/discover-queries/query-builder/', - }, - { - from: '/product/crons/alerts/', - to: '/product/crons/getting-started/', - }, - { - from: '/meta/relay/best-practices/', - to: '/product/relay/operating-guidelines/', - }, - { - from: '/product/relay/best-practices/', - to: '/product/relay/operating-guidelines/', - }, - { - from: '/meta/relay/', - to: '/product/relay/', - }, - { - from: '/product/security/relay/', - to: '/product/relay/', - }, - { - from: '/meta/relay/getting-started/', - to: '/product/relay/getting-started/', - }, - { - from: '/meta/relay/options/', - to: '/product/relay/options/', - }, - { - from: '/meta/relay/metrics/', - to: '/product/relay/monitoring/collected-metrics/', - }, - { - from: '/meta/relay/logging/', - to: '/product/relay/monitoring/', - }, - { - from: '/meta/relay/modes/', - to: '/product/relay/modes/', - }, - { - from: '/product/performance/', - to: '/product/sentry-basics/performance-monitoring/', - }, - { - from: '/product/performance/getting-started/', - to: '/product/insights/getting-started/', - }, - { - from: '/product/performance/filters-display/', - to: '/product/insights/overview/filters-display/', - }, - { - from: '/product/performance/filters-display/widgets/', - to: '/product/insights/overview/filters-display/widgets/', - }, - { - from: '/product/performance/trends/', - to: '/product/insights/overview/trends/', - }, - { - from: '/product/performance/transaction-summary/', - to: '/product/insights/overview/transaction-summary/', - }, - { - from: '/product/performance/metrics/', - to: '/product/insights/overview/metrics/', - }, - { - from: '/product/performance/performance-overhead/', - to: '/product/insights/performance-overhead/', - }, - { - from: '/product/performance/database/', - to: '/product/insights/backend/queries/', - }, - { - from: '/product/performance/query-insights/', - to: '/product/insights/backend/queries/', - }, - { - from: '/product/sentry-basics/metrics/', - to: '/product/insights/retention-priorities/', - }, - { - from: '/product/sentry-basics/sampling/', - to: '/product/insights/retention-priorities/', - }, - { - from: '/product/data-management-settings/server-side-sampling/', - to: '/product/insights/retention-priorities/', - }, - { - from: '/product/data-management-settings/server-side-sampling/getting-started/', - to: '/product/insights/retention-priorities/', - }, - { - from: '/product/data-management-settings/server-side-sampling/current-limitations/', - to: '/product/insights/retention-priorities/', - }, - { - from: '/product/data-management-settings/server-side-sampling/sampling-configurations/', - to: '/product/insights/retention-priorities/', - }, - { - from: '/product/data-management-settings/dynamic-sampling/current-limitations/', - to: '/product/insights/retention-priorities/', - }, - { - from: '/product/data-management-settings/dynamic-sampling/sampling-configurations/', - to: '/product/insights/retention-priorities/', - }, - { - from: '/product/performance/performance-at-scale/', - to: '/product/insights/retention-priorities/', - }, - { - from: '/product/performance/performance-at-scale/getting-started/', - to: '/product/insights/retention-priorities/', - }, - { - from: '/product/performance/performance-at-scale/benefits-performance-at-scale/', - to: '/product/insights/retention-priorities/', - }, - { - from: '/performance/', - to: '/product/insights/', - }, - { - from: '/performance/display/', - to: '/product/insights/', - }, - { - from: '/performance-monitoring/performance/', - to: '/product/insights/', - }, - { - from: '/performance/performance-tab/', - to: '/product/insights/overview', - }, - { - from: '/performance/performance-homepage/', - to: '/product/insights/', - }, - { - from: '/performance-monitoring/setup/', - to: '/product/insights/getting-started/', - }, - { - from: '/performance-monitoring/getting-started/', - to: '/product/insights/getting-started/', - }, - { - from: '/performance-monitoring/performance/metrics/', - to: '/product/insights/overview/metrics/', - }, - { - from: '/product/performance/display/', - to: '/product/insights/overview/filters-display/', - }, - { - from: '/product/issues/issue-owners/', - to: '/product/issues/ownership-rules/', - }, - { - from: '/product/issue-owners/', - to: '/product/issues/ownership-rules/', - }, - { - from: '/workflow/issue-owners/', - to: '/product/issues/ownership-rules/', - }, - { - from: '/learn/issue-owners/', - to: '/product/issues/ownership-rules/', - }, - { - from: '/features/owners/', - to: '/product/issues/ownership-rules/', - }, - { - from: '/product/sentry-basics/issue-owners/', - to: '/product/issues/ownership-rules/', - }, - { - from: '/product/releases/suspect-commits/', - to: '/product/issues/suspect-commits/', - }, - { - from: '/product/accounts/early-adopter-features/issue-archiving/', - to: '/product/issues/states-triage/', - }, - { - from: '/product/issues/performance-issues/regex-decoding-main-thread/', - to: '/product/issues/issue-details/performance-issues/regex-main-thread/', - }, - { - from: '/product/issues/performance-issues/consecutive-http/', - to: '/product/issues/issue-details/performance-issues/consecutive-http/', - }, - { - from: '/product/issues/performance-issues/slow-db-queries/', - to: '/product/issues/issue-details/performance-issues/slow-db-queries/', - }, - { - from: '/product/issues/performance-issues/image-decoding-main-thread/', - to: '/product/issues/issue-details/performance-issues/image-decoding-main-thread/', - }, - { - from: '/product/issues/performance-issues/', - to: '/product/issues/issue-details/performance-issues/', - }, - { - from: '/product/issues/issue-details/performance-issues/main-thread-io/', - to: '/product/issues/issue-details/performance-issues/', - }, - { - from: '/product/issues/performance-issues/n-one-queries/', - to: '/product/issues/issue-details/performance-issues/n-one-queries/', - }, - { - from: '/product/issues/performance-issues/uncompressed-asset/', - to: '/product/issues/issue-details/performance-issues/uncompressed-asset/', - }, - { - from: '/product/issues/performance-issues/consecutive-db-queries/', - to: '/product/issues/issue-details/performance-issues/consecutive-db-queries/', - }, - { - from: '/product/issues/performance-issues/json-decoding-main-thread/', - to: '/product/issues/issue-details/performance-issues/json-decoding-main-thread/', - }, - { - from: '/product/issues/performance-issues/http-overhead/', - to: '/product/issues/issue-details/performance-issues/http-overhead/', - }, - { - from: '/product/issues/performance-issues/large-render-blocking-asset/', - to: '/product/issues/issue-details/performance-issues/large-render-blocking-asset/', - }, - { - from: '/product/issues/performance-issues/frame-drop/', - to: '/product/issues/issue-details/performance-issues/frame-drop/', - }, - { - from: '/product/issues/performance-issues/large-http-payload/', - to: '/product/issues/issue-details/performance-issues/large-http-payload/', - }, - - { - from: '/learn/breadcrumbs/', - to: '/product/issues/issue-details/breadcrumbs/', - }, - { - from: '/product/issues/issue-details/suggested-fix/', - to: '/product/issues/issue-details/sentry-seer/', - }, - { - from: '/product/issues/issue-details/ai-suggested-solution/', - to: '/product/issues/issue-details/sentry-seer/', - }, - { - from: '/product/issues/issue-details/sentry-ai/', - to: '/product/issues/issue-details/sentry-seer/', - }, - { - from: '/guides/grouping-and-fingerprints/', - to: '/product/issues/grouping-and-fingerprints/', - }, - { - from: '/product/sentry-basics/guides/grouping-and-fingerprints/', - to: '/product/issues/grouping-and-fingerprints/', - }, - { - from: '/product/sentry-basics/grouping-and-fingerprints/', - to: '/product/issues/grouping-and-fingerprints/', - }, - { - from: '/product/accounts/quotas/org-stats/', - to: '/product/stats/', - }, - { - from: '/workflow/search/', - to: '/concepts/search/', - }, - { - from: '/product/search/', - to: '/concepts/search/', - }, - { - from: '/learn/search/', - to: '/concepts/search/', - }, - { - from: '/product/sentry-basics/search/', - to: '/concepts/search/', - }, - { - from: '/product/sentry-basics/search/saved-searches/', - to: '/concepts/search/saved-searches/', - }, - { - from: '/product/sentry-basics/search/searchable-properties/user-feedback/', - to: '/concepts/search/searchable-properties/user-feedback/', - }, - { - from: '/product/sentry-basics/search/searchable-properties/events/', - to: '/concepts/search/searchable-properties/events/', - }, - { - from: '/product/sentry-basics/search/searchable-properties/issues/', - to: '/concepts/search/searchable-properties/issues/', - }, - { - from: '/product/sentry-basics/search/searchable-properties/', - to: '/concepts/search/searchable-properties/', - }, - { - from: '/product/sentry-basics/search/searchable-properties/releases/', - to: '/concepts/search/searchable-properties/releases/', - }, - { - from: '/product/sentry-basics/search/searchable-properties/spans/', - to: '/concepts/search/searchable-properties/spans/', - }, - { - from: '/product/sentry-basics/search/searchable-properties/session-replay/', - to: '/concepts/search/searchable-properties/session-replay/', - }, - { - from: '/platforms/javascript/configuration/micro-frontend-support/', - to: '/platforms/javascript/best-practices/micro-frontends/', - }, - { - from: '/platforms/javascript/configuration/sentry-testkit/', - to: '/platforms/javascript/best-practices/sentry-testkit/', - }, - { - from: '/platforms/javascript/configuration/webworkers/', - to: '/platforms/javascript/best-practices/web-workers/', - }, - { - from: '/support/', - to: 'https://sentry.zendesk.com/hc/en-us/', - }, - { - from: '/clients/python/', - to: '/platforms/python/legacy-sdk/', - }, - { - from: '/platforms/javascript/config/sourcemaps/', - to: '/platforms/javascript/sourcemaps/', - }, - { - from: '/platforms/java/config/', - to: '/platforms/java/configuration/', - }, - { - from: '/platforms/native/attachments/', - to: '/platforms/native/enriching-error-data/attachments/', - }, - { - from: '/platforms/python/configuration/integrations/', - to: '/platforms/python/integrations/', - }, - { - from: '/platforms/python/redis/', - to: '/platforms/python/integrations/redis/', - }, - { - from: '/platforms/python/sqlalchemy/', - to: '/platforms/python/integrations/sqlalchemy/', - }, - { - from: '/platforms/python/pure_eval/', - to: '/platforms/python/integrations/pure_eval/', - }, - { - from: '/platforms/python/gnu_backtrace/', - to: '/platforms/python/integrations/gnu_backtrace/', - }, - { - from: '/learn/context/', - to: '/platform-redirect/?next=/enriching-events/context/', - }, - { - from: '/clients/java/config/', - to: '/platforms/java/configuration/', - }, - { - from: '/clientdev/interfaces/http/', - to: 'https://develop.sentry.dev/sdk/foundation/data-model/event-payloads/request', - }, - { - from: '/clients/csharp/', - to: '/platforms/dotnet/legacy-sdk/', - }, - { - from: '/clients/go/', - to: '/platforms/go/legacy-sdk/', - }, - { - from: '/clients/node/', - to: '/platforms/node/legacy-sdk/', - }, - { - from: '/clients/javascript/', - to: '/platforms/javascript/legacy-sdk/', - }, - { - from: '/clients/ruby/', - to: '/platforms/ruby/', - }, - { - from: '/clients/java/integrations/', - to: '/platforms/java/', - }, - { - from: '/clients/java/modules/android/', - to: '/platforms/android', - }, - { - from: '/clients/javascript/integrations/angular2/', - to: '/platforms/javascript/guides/angular/', - }, - { - from: '/clients/javascript/integrations/angularjs/', - to: '/platforms/javascript/guides/angular/', - }, - { - from: '/platforms/javascript/angular/', - to: '/platforms/javascript/guides/angular/', - }, - { - from: '/node/event-processors/', - to: '/platforms/node/enriching-events/event-processors/', - }, - { - from: '/platforms/node/guides/connect/event-processors/', - to: '/platforms/node/enriching-events/event-processors/', - }, - { - from: '/platforms/javascript/sourcemaps/uploading/multiple-origins/', - to: '/platforms/javascript/sourcemaps/troubleshooting_js/#multiple-origins', - }, - { - from: '/platforms/python/guides/celery/hints/', - to: '/platforms/python/integrations/celery/', - }, - { - from: '/platforms/python/guides/chalice/integrations/', - to: '/platforms/python/integrations/chalice/', - }, - { - from: '/platforms/unrealengine/', - to: '/platforms/unreal/', - }, - { - from: '/platforms/minidump/crashpad/', - to: '/platforms/native/guides/crashpad/', - }, - { - from: '/platforms/minidump/breakpad/', - to: '/platforms/native/guides/breakpad/', - }, - { - from: '/platforms/rust/usage/sdk-fingerprinting/', - to: '/product/data-management-settings/event-grouping/fingerprint-rules/', - }, - { - from: '/platforms/javascript/guides/angular/lazy-load-sentry/', - to: '/platforms/javascript/guides/angular/', - }, - { - from: '/platforms/java/guides/spring/data-management/data-forwarding/', - to: '/platforms/java/guides/spring/data-management/', - }, - { - from: '/platforms/android/usage/advanced-usage/', - to: '/platforms/android/usage/', - }, - { - from: '/platforms/javascript/guides/react/performance/included-instrumentation/', - to: '/platforms/javascript/guides/react/performance/instrumentation/', - }, - { - from: '/platforms/php/guides/symfony/data-management/data-forwarding/', - to: '/platforms/php/guides/symfony/data-management/', - }, - { - from: '/platforms/php/guides/laravel/configuration/transports/', - to: '/platforms/php/guides/laravel/configuration/laravel-options/', - }, - { - from: '/platforms/go/data-management/event-grouping/fingerprint-rules/', - to: '/platforms/go/data-management/', - }, - { - from: '/platforms/elixir/enriching-events/scopes/', - to: '/platforms/elixir/enriching-events/', - }, - { - from: '/platforms/android/performance/custom-instrumentation/', - to: '/platforms/android/performance/', - }, - { - from: '/platforms/elixir/data-management/event-grouping/', - to: '/platforms/elixir/data-management/', - }, - { - from: '/platforms/elixir/configuration/draining/', - to: '/platforms/elixir/configuration/', - }, - { - from: '/clients/ruby/integrations/rails/', - to: '/platforms/ruby/guides/rails/', - }, - { - from: '/platforms/java/configuration/integrations/', - to: '/platforms/java/integrations/', - }, - { - from: '/platforms/apple/configuration/integrations/', - to: '/platforms/apple/integrations/', - }, - { - from: '/platforms/javascript/guides/cordova/integrations/custom/', - to: '/platforms/javascript/guides/cordova/', - }, - { - from: '/platforms/javascript/guides/cordova/config/basics/', - to: '/platforms/javascript/guides/cordova/configuration/', - }, - { - from: '/platforms/javascript/guides/electron/data-management/event-grouping/grouping-enhancements/', - to: '/platforms/javascript/guides/electron/data-management/', - }, - { - from: '/platforms/javascript/guides/ember/configuration/other-versions/ember2/', - to: '/platforms/javascript/guides/ember/configuration/', - }, - { - from: '/platforms/javascript/guides/ember/configuration/other-versions/', - to: '/platforms/javascript/guides/ember/configuration/', - }, - { - from: '/platforms/javascript/guides/angular/components/', - to: '/platforms/javascript/guides/angular/', - }, - { - from: '/platforms/javascript/legacy-sdk/integrations/', - to: '/platforms/javascript/legacy-sdk/', - }, - { - from: '/platforms/javascript/guides/nextjs/manual/', - to: '/platforms/javascript/guides/nextjs/', - }, - { - from: '/platforms/javascript/guides/react/components/errorboundary/', - to: '/platforms/javascript/guides/react/', - }, - { - from: '/platforms/javascript/guides/react/components/profiler/', - to: '/platforms/javascript/guides/react/', - }, - { - from: '/platforms/javascript/guides/remix/install/cdn/', - to: '/platforms/javascript/guides/remix/#install', - }, - { - from: '/platforms/javascript/performance/capturing/group-transactions/', - to: '/platforms/javascript/performance/', - }, - { - from: '/platforms/javascript/sourcemaps/tools/', - to: '/platforms/javascript/sourcemaps/', - }, - { - from: '/product/accounts/pricing/', - to: '/pricing/', - }, - { - from: '/accounts/pricing/', - to: '/pricing/', - }, - { - from: '/product/account/pricing/', - to: '/pricing/', - }, - { - from: '/platforms/dotnet/compatibility/', - to: '/platforms/dotnet/', - }, - { - from: '/product/session-replay/protecting-user-privacy/', - to: '/security-legal-pii/scrubbing/protecting-user-privacy/', - }, - { - from: '/platforms/javascript/guides/react/features/component-tracking/', - to: '/platforms/javascript/guides/react/features/component-names/', - }, - { - from: '/product/accounts/early-adopter-features/', - to: '/organization/early-adopter-features/', - }, - { - from: '/product/accounts/choose-your-data-center/', - to: '/organization/data-storage-location/', - }, - { - from: '/product/accounts/membership/', - to: '/organization/membership/', - }, - { - from: '/product/accounts/sso/', - to: '/organization/authentication/sso/', - }, - { - from: '/product/accounts/sso/azure-sso/', - to: '/organization/authentication/sso/azure-sso/', - }, - { - from: '/product/accounts/sso/okta-sso/', - to: '/organization/authentication/sso/okta-sso/', - }, - { - from: '/product/accounts/sso/okta-sso/okta-scim/', - to: '/organization/authentication/sso/okta-sso/okta-scim/', - }, - { - from: '/product/accounts/sso/ping-sso/', - to: '/organization/authentication/sso/ping-sso/', - }, - { - from: '/product/accounts/sso/saml2/', - to: '/organization/authentication/sso/saml2/', - }, - { - from: '/product/accounts/getting-started/', - to: '/organization/getting-started/', - }, - { - from: '/product/accounts/require-2fa/', - to: '/organization/authentication/two-factor-authentication/', - }, - { - from: '/product/accounts/quotas/', - to: '/pricing/quotas/', - }, - { - from: '/product/accounts/quotas/spike-protection/', - to: '/pricing/quotas/spike-protection/', - }, - { - from: '/product/accounts/quotas/spend-allocation/', - to: '/pricing/quotas/spend-allocation/', - }, - { - from: '/product/accounts/quotas/manage-event-stream-guide/', - to: '/pricing/quotas/manage-event-stream-guide/', - }, - { - from: '/product/accounts/quotas/manage-transaction-quota/', - to: '/pricing/quotas/manage-transaction-quota/', - }, - { - from: '/product/accounts/quotas/manage-replay-quota/', - to: '/pricing/quotas/manage-replay-quota/', - }, - { - from: '/product/accounts/quotas/manage-attachments-quota/', - to: '/pricing/quotas/manage-attachments-quota/', - }, - { - from: '/product/accounts/quotas/manage-cron-monitors/', - to: '/pricing/quotas/manage-cron-monitors/', - }, - { - from: '/product/accounts/auth-tokens/', - to: '/account/auth-tokens/', - }, - { - from: '/product/accounts/user-settings/', - to: '/account/user-settings/', - }, - { - from: '/product/accounts/', - to: '/account/', - }, - { - from: '/account/getting-started/', - to: '/organization/getting-started/', - }, - { - from: '/account/membership/', - to: '/organization/membership/', - }, - { - from: '/account/early-adopter-features/', - to: '/organization/early-adopter-features/', - }, - { - from: '/account/quotas/', - to: '/pricing/quotas/', - }, - { - from: '/accounts/quotas/', - to: '/pricing/quotas/', - }, - { - from: '/organization/quotas/', - to: '/pricing/quotas/', - }, - { - from: '/account/sso/', - to: '/organization/authentication/sso/', - }, - { - from: '/product/ai-monitoring/', - to: '/product/insights/ai/agents/', - }, - { - from: '/product/insights/llm-monitoring/', - to: '/product/insights/ai/agents/', - }, - { - from: '/product/insights/llm-monitoring/getting-started/', - to: '/product/insights/ai/agents/getting-started/', - }, - { - from: '/product/insights/llm-monitoring/getting-started/the-dashboard/', - to: '/product/insights/ai/agents/getting-started/the-dashboard/', - }, - { - from: '/product/metrics/', - to: '/product/explore/metrics/', - }, - { - from: '/product/profiling/', - to: '/product/explore/profiling/', - }, - { - from: '/product/discover-queries/', - to: '/product/explore/discover-queries/', - }, - { - from: '/product/session-replay/', - to: '/product/explore/session-replay/', - }, - { - from: '/enriching-error-data/advanced-datascrubbing/', - to: '/concepts/data-management/advanced-datascrubbing/', - }, - { - from: '/data-management/advanced-datascrubbing/', - to: '/concepts/data-management/advanced-datascrubbing/', - }, - { - from: '/platforms/javascript/guides/react/features/component-tracking/', - to: '/platforms/javascript/guides/react/features/component-names/', - }, - { - from: '/platforms/rust/usage/sdk-fingerprinting/', - to: '/concepts/data-management/event-grouping/fingerprint-rules/', - }, - { - from: '/platforms/javascript/guides/angular/lazy-load-sentry/', - to: '/platforms/javascript/guides/angular/', - }, - { - from: '/platforms/java/guides/spring/data-management/data-forwarding/', - to: '/platforms/java/guides/spring/data-management/', - }, - { - from: '/support/', - to: 'https://sentry.zendesk.com/hc/en-us/', - }, - { - from: '/product/security-policy-reporting/', - to: '/security-legal-pii/security/security-policy-reporting/', - }, - { - from: '/product/session-replay/protecting-user-privacy/', - to: '/security-legal-pii/scrubbing/protecting-user-privacy/', - }, - { - from: '/product/data-management-settings/restrict-display/', - to: '/security-legal-pii/scrubbing/restrict-display/', - }, - { - from: '/product/performance/requests/', - to: '/product/insights/requests/', - }, - { - from: '/product/performance/queries/', - to: '/product/insights/queries/', - }, - { - from: '/product/performance/resources/', - to: '/product/insights/assets/', - }, - { - from: '/product/performance/assets/', - to: '/product/insights/assets/', - }, - { - from: '/product/performance/mobile-vitals/', - to: '/product/insights/mobile-vitals/', - }, - { - from: '/product/performance/mobile-vitals/screen-loads/', - to: '/product/insights/mobile-vitals/screen-loads/', - }, - { - from: '/product/performance/mobile-vitals/app-starts/', - to: '/product/insights/mobile-vitals/app-starts/', - }, - { - from: '/product/performance/web-vitals/', - to: '/product/insights/web-vitals/', - }, - { - from: '/product/performance/web-vitals/web-vitals-concepts/', - to: '/product/insights/web-vitals/web-vitals-concepts/', - }, - { - from: '/product/performance/caches/', - to: '/product/insights/caches/', - }, - { - from: '/product/performance/caches/cache-page/', - to: '/product/insights/caches/cache-page/', - }, - { - from: '/product/performance/queue-monitoring/', - to: '/product/insights/queue-monitoring/', - }, - { - from: '/product/performance/queue-monitoring/queues-page/', - to: '/product/insights/queue-monitoring/queues-page/', - }, - { - from: '/product/explore/session-replay/protecting-user-privacy/', - to: '/security-legal-pii/scrubbing/protecting-user-privacy/', - }, - { - from: '/account/choose-your-data-center/', - to: '/organization/data-storage-location/', - }, - { - from: '/account/early-adopter/', - to: '/organization/early-adopter-features/', - }, - { - from: '/account/quotas/spike-protection/', - to: '/pricing/quotas/spike-protection/', - }, - { - from: '/_platforms/', - to: '/platforms', - }, - { - from: '/accounts/require-2fa/', - to: '/organization/authentication/two-factor-authentication/', - }, - { - from: '/platforms/go/guides/fiber/user-feedback/configuration/', - to: '/platforms/go/user-feedback/', - }, - { - from: '/platforms/javascript/guides/', - to: '/platforms/javascript/', - }, - { - from: '/platforms/native/crashpad/', - to: '/platforms/native/guides/crashpad/', - }, - { - from: '/platforms/python/legacy-sdk/integrations/pylons/', - to: '/platforms/python/legacy-sdk/integrations/#pylons', - }, - { - from: '/concepts/data-management/event-grouping/grouping-breakdown/', - to: '/concepts/data-management/event-grouping/', - }, - { - from: '/product/explore/session-replay/performance-overhead/', - to: '/product/explore/session-replay/web/performance-overhead/', - }, - { - from: '/organization/integrations/project-mgmt/jira/', - to: '/organization/integrations/issue-tracking/jira/', - }, - { - from: '/organization/integrations/source-code-/', - to: '/organization/integrations/source-code-mgmt/', - }, - { - from: '/product/explore/session-replay/getting-started/', - to: '/product/explore/session-replay/', - }, - { - from: '/product/explore/session-replay/web/getting-started/', - to: '/product/explore/session-replay/web/', - }, - { - from: '/product/explore/session-replay/web/replay-page-and-filters/', - to: '/product/explore/session-replay/replay-page-and-filters/', - }, - { - from: '/product/explore/session-replay/web/replay-details/', - to: '/product/explore/session-replay/replay-details/', - }, - { - from: '/product/explore/session-replay/hydration-errors/', - to: '/product/issues/issue-details/replay-issues/hydration-error/', - }, - { - from: '/product/explore/session-replay/rage-dead-clicks/', - to: '/product/issues/issue-details/replay-issues/rage-clicks/', - }, - { - from: '/product/explore/session-replay/privacy/', - to: '/security-legal-pii/scrubbing/protecting-user-privacy/', - }, - { - from: '/product/teams/roles/', - to: '/organization/membership/#team-level-roles', - }, - { - from: '/enriching-error-data/additional-data/', - to: '/concepts/key-terms/enrich-data/', - }, - { - from: '/performance/instrumentation/automatic-instrumentation/', - to: '/tracing/instrumentation/automatic-instrumentation', - }, - { - from: '/concepts/key-terms/key-terms/tracing/trace-view/#operations-breakdown/', - to: '/product/insights/', - }, - { - from: '/platforms/javascript/guides/aws-lambda/container-image/', - to: '/platforms/javascript/guides/aws-lambda/install/', - }, - { - from: '/platforms/javascript/guides/aws-lambda/layer/', - to: '/platforms/javascript/guides/aws-lambda/install/', - }, - { - from: '/api/projects/post-project-service-hooks/', - to: '/api/projects/register-a-new-service-hook/', - }, - { - from: '/api/organizations/list-your-organizations/', - to: '/api/users/list-your-organizations/', - }, - { - from: '/clients/cocoa/', - to: '/platforms/apple/', - }, - { - from: '/clients/react-native/', - to: 'platforms/react-native/', - }, - { - from: '/learn/scopes/?platform=rust/', - to: '/platforms/rust/enriching-events/scopes/', - }, - { - from: '/platforms/android/android-video/', - to: '/platforms/android/', - }, - { - from: '/platforms/android/tracing/included-instrumentation/', - to: '/platforms/android/tracing/instrumentation/automatic-instrumentation', - }, - { - from: '/platforms/javascript/guides/cordova/tracing/trace-propagation/', - to: '/platforms/javascript/guides/cordova/tracing/instrumentation/custom-instrumentation/', - }, - { - from: '/platforms/javascript/pluggable-integrations/', - to: '/platforms/javascript/configuration/integrations/#lazy-loading-integrations', - }, - { - from: '/platforms/react-native/tracing/included-instrumentation/', - to: '/platforms/react-native/tracing/instrumentation/automatic-instrumentation/', - }, - { - from: '/platforms/rust/env_logger/index.html/', - to: '/platforms/rust/configuration/environments/', - }, - { - from: '/clients/cordova/', - to: '/platforms/javascript/guides/cordova/', - }, - { - from: '/organization/integrations/incidentio/', - to: '/organization/integrations/issue-tracking/incidentio/', - }, - { - from: '/contributing/onboarding-wizard/', - to: '/contributing/', - }, - { - from: '/security-legal-pii/security/security-policy-reporting/', - to: '/platform-redirect/?next=/security-policy-reporting/', - }, - /* Uptime Monitoring */ - { - from: '/product/alerts/uptime-monitoring/', - to: '/product/uptime-monitoring/', - }, - { - from: '/product/alerts/uptime-monitoring/automatic-detection/', - to: '/product/uptime-monitoring/automatic-detection/', - }, - { - from: '/product/alerts/uptime-monitoring/uptime-tracing/', - to: '/product/uptime-monitoring/uptime-tracing/', - }, - { - from: '/product/alerts/uptime-monitoring/troubleshooting/', - to: '/product/uptime-monitoring/troubleshooting/', - }, -]; - -const DEVELOPER_DOCS_REDIRECTS: Redirect[] = [ - { - from: '/', - to: '/getting-started/', - }, - { - from: '/docs-components/', - to: '/development/docs/', - }, - { - from: '/docs/', - to: '/development/docs/', - }, - { - from: '/inclusion/', - to: '/development/inclusive-language/', - }, - { - from: '/translations/', - to: '/development/translations/', - }, - { - from: '/environment/', - to: '/development/environment/', - }, - { - from: '/environment/pycharm/', - to: '/development/environment/pycharm/', - }, - { - from: '/environment/u2f/', - to: '/development/environment/u2f/', - }, - { - from: '/testing/', - to: '/development/testing/', - }, - { - from: '/philosophy/', - to: '/development/philosophy/', - }, - { - from: '/commit-messages/', - to: '/development/commit-messages/', - }, - { - from: '/code-review/', - to: '/development/code-review/', - }, - { - from: '/workflow/', - to: '/development/workflow/', - }, - { - from: '/continuous-integration/', - to: '/development/continuous-integration/', - }, - { - from: '/python-dependencies/', - to: '/development/python-dependencies/', - }, - { - from: '/rust/', - to: '/development/rust/', - }, - { - from: '/database-migrations/', - to: '/development/database-migrations/', - }, - { - from: '/testing/', - to: '/development/testing/', - }, - { - from: '/analytics/', - to: '/development/analytics/', - }, - { - from: '/architecture/', - to: '/application-architecture/', - }, - { - from: '/sentry-vs-getsentry/', - to: '/application/sentry-vs-getsentry/', - }, - { - from: '/config/', - to: '/application/config/', - }, - { - from: '/issue-platform/', - to: '/application/issue-platform/', - }, - { - from: '/issue-platform-detectors/', - to: '/application/issue-platform-detectors/', - }, - { - from: '/feature-flags/', - to: '/application/feature-flags/', - }, - { - from: '/feature-flags/flagpole/', - to: '/application/feature-flags/flagpole/', - }, - { - from: '/ab-testing/', - to: '/application/ab-testing/', - }, - { - from: '/options/', - to: '/application/options/', - }, - { - from: '/serializers/', - to: '/application/serializers/', - }, - { - from: '/grouping/', - to: '/application/grouping/', - }, - { - from: '/pii/', - to: '/application/pii/', - }, - { - from: '/pii/types/', - to: '/application/pii/types/', - }, - { - from: '/pii/methods/', - to: '/application/pii/methods/', - }, - { - from: '/pii/selectors/', - to: '/application/pii/selectors/', - }, - { - from: '/transaction-clustering/', - to: '/application/transaction-clustering/', - }, - { - from: '/dynamic-sampling/', - to: '/application/dynamic-sampling/', - }, - { - from: '/dynamic-sampling/architecture/', - to: '/application/dynamic-sampling/architecture/', - }, - { - from: '/dynamic-sampling/fidelity-and-biases/', - to: '/application/dynamic-sampling/fidelity-and-biases/', - }, - { - from: '/dynamic-sampling/the-big-picture/', - to: '/application/dynamic-sampling/the-big-picture/', - }, - { - from: '/feedback-architecture/', - to: '/application/feedback-architecture/', - }, - { - from: '/options/', - to: '/backend/options/', - }, - { - from: '/sdk/features/data-handling/', - to: '/sdk/expected-features/data-handling/', - }, - { - from: '/sdk/craft-quick-start/', - to: '/sdk/processes/releases/', - }, - { - from: '/sdk/check-ins/', - to: '/sdk/telemetry/check-ins/', - }, - { - from: '/sdk/profiles/', - to: '/sdk/telemetry/profiles/', - }, - { - from: '/sdk/distributed-tracing/', - to: '/sdk/telemetry/traces/distributed-tracing/', - }, - // New Sidebar structure - { - from: '/development/', - to: '/development-infrastructure/', - }, - { - from: '/development/environment/', - to: '/development-infrastructure/environment/', - }, - { - from: '/development/environment/ports/', - to: '/development-infrastructure/environment/ports/', - }, - { - from: '/development/environment/u2f/', - to: '/development-infrastructure/environment/u2f/', - }, - { - from: '/development/environment/pycharm/', - to: '/development-infrastructure/environment/pycharm/', - }, - { - from: '/development/commit-messages/', - to: '/engineering-practices/commit-messages/', - }, - { - from: '/development/code-review/', - to: '/engineering-practices/code-review/', - }, - { - from: '/development/documentation/', - to: '/engineering-practices/documentation/', - }, - { - from: '/development/workflow/', - to: '/development-infrastructure/workflow/', - }, - { - from: '/development/testing/', - to: '/development-infrastructure/testing/', - }, - { - from: '/development/continuous-integration/', - to: '/development-infrastructure/continuous-integration/', - }, - { - from: '/development/ngrok/', - to: '/development-infrastructure/ngrok/', - }, - { - from: '/development/devservices/', - to: '/development-infrastructure/devservices/', - }, - { - from: '/development/rust/', - to: '/engineering-practices/rust/', - }, - { - from: '/development/analytics/', - to: '/development-infrastructure/analytics/', - }, - { - from: '/application/', - to: '/application-architecture/', - }, - { - from: '/application/architecture/', - to: '/application-architecture/overview/', - }, - { - from: '/application/dynamic-sampling/', - to: '/application-architecture/dynamic-sampling/', - }, - { - from: '/application/dynamic-sampling/the-big-picture/', - to: '/application-architecture/dynamic-sampling/the-big-picture/', - }, - { - from: '/application/dynamic-sampling/fidelity-and-biases/', - to: '/application-architecture/dynamic-sampling/fidelity-and-biases/', - }, - { - from: '/application/dynamic-sampling/architecture/', - to: '/application-architecture/dynamic-sampling/architecture/', - }, - { - from: '/application/dynamic-sampling/outcomes/', - to: '/application-architecture/dynamic-sampling/outcomes/', - }, - { - from: '/application/feedback-architecture/', - to: '/application-architecture/feedback-architecture/', - }, - { - from: '/application/control-silo/', - to: '/application-architecture/multi-region-deployment/control-silo/', - }, - { - from: '/application/cross-region-replication/', - to: '/application-architecture/multi-region-deployment/cross-region-replication/', - }, - { - from: '/application/cross-region-rpc/', - to: '/application-architecture/multi-region-deployment/cross-region-rpc/', - }, - { - from: '/application/config/', - to: '/application-architecture/config/', - }, - { - from: '/application-architecture/config/', - to: '/backend/config/', - }, - { - from: '/application/sentry-vs-getsentry/', - to: '/application-architecture/sentry-vs-getsentry/', - }, - - { - from: '/frontend/development-server/', - to: '/development-infrastructure/frontend-development-server/', - }, - { - from: '/api-server/', - to: '/backend/', - }, - { - from: '/api-server/api/', - to: '/backend/api/', - }, - { - from: '/api-server/api/basics/', - to: '/backend/api/basics/', - }, - { - from: '/api-server/api/design/', - to: '/backend/api/design/', - }, - { - from: '/api-server/api/concepts/', - to: '/backend/api/concepts/', - }, - { - from: '/api-server/api/public/', - to: '/backend/api/public/', - }, - { - from: '/api-server/api/checklist/', - to: '/backend/api/checklist/', - }, - { - from: '/api-server/api/serializers/', - to: '/backend/api/serializers/', - }, - { - to: '/development-infrastructure/backend-development-server/', - from: '/backend/development-server/', - }, - { - from: '/backend/python-dependencies/', - to: '/development-infrastructure/python-dependencies/', - }, - { - from: '/backend/database-migrations/', - to: '/backend/application-domains/database-migrations/', - }, - { - from: '/api-server/application-domains/database-migrations/', - to: '/backend/application-domains/database-migrations/', - }, - { - from: '/backend/feature-flags/', - to: '/backend/application-domains/feature-flags/', - }, - { - from: '/api-server/application-domains/feature-flags/', - to: '/develop/application-domains/feature-flags/', - }, - { - from: '/backend/feature-flags/flagpole/', - to: '/backend/application-domains/feature-flags/flagpole/', - }, - { - from: '/api-server/application-domains/feature-flags/flagpole/', - to: '/develop/application-domains/feature-flags/flagpole/', - }, - { - from: '/backend/options/', - to: '/backend/application-domains/options/', - }, - { - from: '/api-server/application-domains/options/', - to: '/develop/application-domains/options/', - }, - { - from: '/backend/transaction-clustering/', - to: '/backend/application-domains/transaction-clustering/', - }, - { - from: '/api-server/application-domains/transaction-clustering/', - to: '/develop/application-domains/transaction-clustering/', - }, - { - from: '/backend/grouping/', - to: '/backend/application-domains/grouping/', - }, - { - from: '/api-server/application-domains/grouping/', - to: '/develop/application-domains/grouping/', - }, - { - from: '/backend/outboxes/', - to: '/backend/application-domains/outboxes/', - }, - { - from: '/api-server/application-domains/outboxes/', - to: '/develop/application-domains/outboxes/', - }, - { - from: '/backend/issue-platform-detectors/', - to: '/backend/issue-platform/writing-detectors/', - }, - { - from: '/api-server/issue-platform/writing-detectors/', - to: '/develop/issue-platform/writing-detectors/', - }, - { - from: '/api-server/issue-platform/', - to: '/develop/issue-platform/', - }, - { - from: '/backend/queue/', - to: '/backend/application-domains/asynchronous-workers/', - }, - { - from: '/api-server/application-domains/asynchronous-workers/', - to: '/develop/application-domains/asynchronous-workers/', - }, - { - from: '/backend/email/', - to: '/backend/application-domains/email/', - }, - { - from: '/api-server/application-domains/email/', - to: '/develop/application-domains/email/', - }, - { - from: '/backend/kafka/', - to: '/backend/application-domains/kafka/', - }, - { - from: '/api-server/application-domains/kafka/', - to: '/develop/application-domains/kafka/', - }, - { - from: '/backend/metrics/', - to: '/backend/application-domains/metrics/', - }, - { - from: '/api-server/application-domains/metrics/', - to: '/develop/application-domains/metrics/', - }, - { - from: '/backend/nodestore/', - to: '/backend/application-domains/nodestore/', - }, - { - from: '/api-server/application-domains/nodestore/', - to: '/develop/application-domains/nodestore/', - }, - { - from: '/backend/digests/', - to: '/backend/application-domains/digests/', - }, - { - from: '/api-server/application-domains/digests/', - to: '/develop/application-domains/digests/', - }, - { - from: '/backend/quotas/', - to: '/backend/application-domains/quotas/', - }, - { - from: '/api-server/application-domains/quotas/', - to: '/develop/application-domains/quotas/', - }, - { - from: '/backend/tsdb/', - to: '/backend/application-domains/tsdb/', - }, - { - from: '/api-server/application-domains/tsdb/', - to: '/develop/application-domains/tsdb/', - }, - { - from: '/backend/pii/', - to: '/backend/application-domains/pii/', - }, - { - from: '/api-server/application-domains/pii/', - to: '/develop/application-domains/pii/', - }, - { - from: '/backend/pii/methods/', - to: '/backend/application-domains/pii/methods/', - }, - { - from: '/api-server/application-domains/pii/methods/', - to: '/develop/application-domains/pii/methods/', - }, - { - from: '/backend/pii/types/', - to: '/backend/application-domains/pii/types/', - }, - { - from: '/api-server/application-domains/pii/types/', - to: '/develop/application-domains/pii/types/', - }, - { - from: '/backend/pii/selectors/', - to: '/backend/application-domains/pii/selectors/', - }, - { - from: '/api-server/application-domains/pii/selectors/', - to: '/develop/application-domains/pii/selectors/', - }, - { - from: '/backend/buffers/', - to: '/backend/application-domains/write-buffers/', - }, - { - from: '/api-server/application-domains/write-buffers/', - to: '/develop/application-domains/write-buffers/', - }, - { - from: '/backend/translations/', - to: '/backend/application-domains/translations/', - }, - { - from: '/api-server/application-domains/translations/', - to: '/develop/application-domains/translations/', - }, - { - from: '/backend/ab-testing/', - to: '/backend/application-domains/ab-testing/', - }, - { - from: '/api-server/application-domains/ab-testing/', - to: '/develop/application-domains/ab-testing/', - }, - /* Ingestion section rework */ - { - from: '/relay/', - to: '/ingestion/relay/', - }, - { - from: '/relay/projectconfig-versioning/', - to: '/ingestion/relay/projectconfig-versioning/', - }, - { - from: '/relay/transaction-span-ratelimits/', - to: '/ingestion/relay/transaction-span-ratelimits/', - }, - { - from: '/relay/relay-best-practices/', - to: '/ingestion/relay/relay-best-practices/', - }, - /* integration platform */ - { - from: '/organization/integrations/kitemaker/', - to: '/organization/integrations/issue-tracking/kitemaker/', - }, - { - from: '/organization/integrations/pagertree/', - to: '/organization/integrations/notification-incidents/pagertree/', - }, - { - from: '/organization/integrations/goast/', - to: '/organization/integrations/issue-tracking/goast/', - }, - { - from: '/organization/integrations/betterbugs/', - to: '/organization/integrations/session-replay/betterbugs/', - }, - { - from: '/organization/integrations/blar/', - to: '/organization/integrations/notification-incidents/blar/', - }, - { - from: '/organization/integrations/apigene/', - to: '/organization/integrations/debugging/apigene/', - }, - { - from: '/organization/integrations/revisedev/', - to: '/organization/integrations/debugging/revisedev/', - }, - { - from: '/organization/integrations/foamai/', - to: '/organization/integrations/debugging/foamai/', - }, - { - from: '/organization/integrations/telegram-alerts-bot/', - to: '/organization/integrations/notification-incidents/telegram-alerts-bot/', - }, - { - from: '/organization/integrations/vanta-eu/', - to: '/organization/integrations/compliance/vanta-eu/', - }, - { - from: '/organization/integrations/sourcery/', - to: '/organization/integrations/debugging/sourcery/', - }, - { - from: '/organization/integrations/codecomet/', - to: '/organization/integrations/debugging/codecomet/', - }, - { - from: '/organization/integrations/glueai/', - to: '/organization/integrations/notification-incidents/glueai/', - }, - { - from: '/organization/integrations/factory/', - to: '/organization/integrations/issue-tracking/factory/', - }, - { - from: '/organization/integrations/teamcamp/', - to: '/organization/integrations/issue-tracking/teamcamp/', - }, - { - from: '/organization/integrations/elba/', - to: '/organization/integrations/compliance/elba/', - }, - { - from: '/sdk/philosophy/', - to: '/sdk/getting-started/philosophy/', - }, - { - from: '/sdk/data-model/envelopes/', - to: '/sdk/foundations/data-model/envelopes/', - }, - { - from: '/sdk/data-model/envelope-items/', - to: '/sdk/foundations/data-model/envelope-items/', - }, - { - from: '/sdk/expected-features/rate-limiting/', - to: '/sdk/foundations/transport/rate-limiting/', - }, - { - from: '/sdk/overview/', - to: '/sdk/foundations/overview/', - }, - { - from: '/sdk/data-model/', - to: '/sdk/foundations/data-model/', - }, - { - from: '/sdk/data-model/event-payloads/', - to: '/sdk/foundations/data-model/event-payloads/', - }, - { - from: '/sdk/data-model/event-payloads/breadcrumbs/', - to: '/sdk/foundations/data-model/event-payloads/breadcrumbs/', - }, - { - from: '/sdk/data-model/event-payloads/contexts/', - to: '/sdk/foundations/data-model/event-payloads/contexts/', - }, - { - from: '/sdk/data-model/event-payloads/debugmeta/', - to: '/sdk/foundations/data-model/event-payloads/debugmeta/', - }, - { - from: '/sdk/data-model/event-payloads/exception/', - to: '/sdk/foundations/data-model/event-payloads/exception/', - }, - { - from: '/sdk/data-model/event-payloads/lockreason/', - to: '/sdk/foundations/data-model/event-payloads/lockreason/', - }, - { - from: '/sdk/data-model/event-payloads/message/', - to: '/sdk/foundations/data-model/event-payloads/message/', - }, - { - from: '/sdk/data-model/event-payloads/replay-recording/', - to: '/sdk/foundations/data-model/event-payloads/replay-recording/', - }, - { - from: '/sdk/data-model/event-payloads/request/', - to: '/sdk/foundations/data-model/event-payloads/request/', - }, - { - from: '/sdk/data-model/event-payloads/sdk/', - to: '/sdk/foundations/data-model/event-payloads/sdk/', - }, - { - from: '/sdk/data-model/event-payloads/span/', - to: '/sdk/foundations/data-model/event-payloads/span/', - }, - { - from: '/sdk/data-model/event-payloads/stacktrace/', - to: '/sdk/foundations/data-model/event-payloads/stacktrace/', - }, - { - from: '/sdk/data-model/event-payloads/template/', - to: '/sdk/foundations/data-model/event-payloads/template/', - }, - { - from: '/sdk/data-model/event-payloads/threads/', - to: '/sdk/foundations/data-model/event-payloads/threads/', - }, - { - from: '/sdk/data-model/event-payloads/transaction/', - to: '/sdk/foundations/data-model/event-payloads/transaction/', - }, - { - from: '/sdk/data-model/event-payloads/user/', - to: '/sdk/foundations/data-model/event-payloads/user/', - }, -]; - -const redirectMap = new Map( - (isDeveloperDocs ? DEVELOPER_DOCS_REDIRECTS : USER_DOCS_REDIRECTS).map(r => [ - r.from as string, - r.to, - ]) -); From 6bb9ced23f46655e3e5d6d52d6b3d5168a6689b2 Mon Sep 17 00:00:00 2001 From: Charly Gomez Date: Wed, 4 Feb 2026 16:23:29 +0100 Subject: [PATCH 3/6] fix eslint --- eslint.config.mjs | 5 ++++- package.json | 3 ++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/eslint.config.mjs b/eslint.config.mjs index a1d297e704c1ca..7fe2953892fc87 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,5 +1,6 @@ import {dirname} from 'path'; import {fileURLToPath} from 'url'; + import {FlatCompat} from '@eslint/eslintrc'; const __filename = fileURLToPath(import.meta.url); @@ -9,7 +10,7 @@ const compat = new FlatCompat({ baseDirectory: __dirname, }); -export default [ +const config = [ { ignores: ['.babelrc.js'], }, @@ -26,3 +27,5 @@ export default [ }, }, ]; + +export default config; diff --git a/package.json b/package.json index 520ce138fdd05e..b1132fadbba80f 100644 --- a/package.json +++ b/package.json @@ -167,7 +167,8 @@ "overrides": { "dompurify": "3.2.4", "@types/dompurify": "3.0.5", - "@types/node": "^22" + "@types/node": "^22", + "es-iterator-helpers": "1.2.1" }, "onlyBuiltDependencies": [ "@parcel/watcher", From e01c8eab4365e0d8903fa25570329d88951fad73 Mon Sep 17 00:00:00 2001 From: Charly Gomez Date: Wed, 4 Feb 2026 17:18:33 +0100 Subject: [PATCH 4/6] . --- next.config.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/next.config.ts b/next.config.ts index 55b182b5d25260..a37ef0648c29d9 100644 --- a/next.config.ts +++ b/next.config.ts @@ -32,6 +32,23 @@ const sharedExcludes = [ 'node_modules/remark-mdx-images/**/*', 'node_modules/unified/**/*', 'node_modules/rollup/**/*', + // ESLint/TypeScript - build-time only + 'node_modules/eslint/**/*', + 'node_modules/eslint-*/**/*', + 'node_modules/@eslint/**/*', + 'node_modules/@typescript-eslint/**/*', + 'node_modules/typescript/**/*', + // Mermaid dependencies (build-time diagram generation) + 'node_modules/cytoscape/**/*', + 'node_modules/cytoscape-*/**/*', + // Development/test tools + 'node_modules/vitest/**/*', + 'node_modules/vite/**/*', + 'node_modules/@vitest/**/*', + // Platform-specific SWC binaries (Vercel uses linux-x64) + 'node_modules/@next/swc-darwin-*/**/*', + 'node_modules/@next/swc-win32-*/**/*', + 'node_modules/@next/swc-linux-arm*/**/*', ]; const outputFileTracingExcludes = process.env.NEXT_PUBLIC_DEVELOPER_DOCS From abd6a2fd531afca18f48c8510b6334395a68cd3a Mon Sep 17 00:00:00 2001 From: Charly Gomez Date: Thu, 5 Feb 2026 11:15:54 +0100 Subject: [PATCH 5/6] add more excludes --- next.config.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/next.config.ts b/next.config.ts index a37ef0648c29d9..4aae6a06a20df3 100644 --- a/next.config.ts +++ b/next.config.ts @@ -67,6 +67,12 @@ const outputFileTracingExcludes = process.env.NEXT_PUBLIC_DEVELOPER_DOCS 'node_modules/prettier/plugins', 'node_modules/rollup/dist', 'public/og-images/**/*', + // Exclude static assets that don't need to be in the serverless function + 'public/mdx-images/**/*', + 'public/md-exports/**/*', + 'public/pdfs/**/*', + '**/*.gif', + '**/*.pdf', ], 'sitemap.xml': [ 'public/mdx-images/**/*', From 15e724c11b217a325ddcd184ba8e8ce30a87ab81 Mon Sep 17 00:00:00 2001 From: Charly Gomez Date: Wed, 18 Feb 2026 13:40:25 +0100 Subject: [PATCH 6/6] lock --- pnpm-lock.yaml | 620 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 469 insertions(+), 151 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0cc772d42a60e9..7bd869d9d8a1b0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -8,6 +8,7 @@ overrides: dompurify: 3.2.4 '@types/dompurify': 3.0.5 '@types/node': ^22 + es-iterator-helpers: 1.2.1 importers: @@ -90,7 +91,7 @@ importers: version: 10.39.0 '@sentry/nextjs': specifier: ^10.27.0 - version: 10.39.0(@opentelemetry/context-async-hooks@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0))(next@15.1.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react@19.2.4)(webpack@5.105.2(esbuild@0.25.12)) + version: 10.39.0(@opentelemetry/context-async-hooks@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react@19.2.4)(webpack@5.105.2(esbuild@0.25.12)) '@types/mdx': specifier: ^2.0.9 version: 2.0.13 @@ -161,17 +162,17 @@ importers: specifier: ^4.0.0 version: 4.0.2 next: - specifier: 15.1.12 - version: 15.1.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) + specifier: ^16.1.6 + version: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) next-plausible: specifier: ^3.12.4 - version: 3.12.5(next@15.1.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 3.12.5(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) next-themes: specifier: ^0.3.0 version: 0.3.0(react-dom@19.2.4(react@19.2.4))(react@19.2.4) nextjs-toploader: specifier: ^1.6.6 - version: 1.6.12(next@15.1.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + version: 1.6.12(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4) p-limit: specifier: ^6.2.0 version: 6.2.0 @@ -286,7 +287,10 @@ importers: version: 7.28.5(@babel/core@7.29.0) '@codecov/nextjs-webpack-plugin': specifier: ^1.9.0 - version: 1.9.1(next@15.1.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(webpack@5.105.2(esbuild@0.25.12)) + version: 1.9.1(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(webpack@5.105.2(esbuild@0.25.12)) + '@eslint/eslintrc': + specifier: ^3.2.0 + version: 3.3.3 '@spotlightjs/spotlight': specifier: ^2.5.0 version: 2.13.3 @@ -339,8 +343,8 @@ importers: specifier: ^8 version: 8.57.1 eslint-config-next: - specifier: 15.0.3 - version: 15.0.3(eslint@8.57.1)(typescript@5.9.3) + specifier: ^16.1.6 + version: 16.1.6(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) eslint-config-sentry-docs: specifier: ^2.10.0 version: 2.10.0(eslint@8.57.1)(jest@29.7.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.19.11)(typescript@5.9.3)))(typescript@5.9.3) @@ -1301,6 +1305,10 @@ packages: resolution: {integrity: sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + '@eslint/eslintrc@3.3.3': + resolution: {integrity: sha512-Kr+LPIUVKz2qkx1HAMH8q1q6azbqBAsXJUxBl/ODDuVPX45Z9DfwB8tPjTi6nNZ8BuM3nbJxC5zCAg5elnBUTQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@eslint/js@8.57.1': resolution: {integrity: sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1362,64 +1370,138 @@ packages: '@iconify/utils@3.1.0': resolution: {integrity: sha512-Zlzem1ZXhI1iHeeERabLNzBHdOa4VhQbqAcOQaMKuTuyZCpwKbC2R4Dd0Zo3g9EAc+Y4fiarO8HIHRAth7+skw==} + '@img/colour@1.0.0': + resolution: {integrity: sha512-A5P/LfWGFSl6nsckYtjw9da+19jB8hkJ6ACTGcDfEJ0aE+l2n2El7dsVM7UVHZQ9s2lmYMWlrS21YLy2IR1LUw==} + engines: {node: '>=18'} + '@img/sharp-darwin-arm64@0.33.5': resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] + '@img/sharp-darwin-arm64@0.34.5': + resolution: {integrity: sha512-imtQ3WMJXbMY4fxb/Ndp6HBTNVtWCUI0WdobyheGf5+ad6xX8VIDO8u2xE4qc/fr08CKG/7dDseFtn6M6g/r3w==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + '@img/sharp-darwin-x64@0.33.5': resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] + '@img/sharp-darwin-x64@0.34.5': + resolution: {integrity: sha512-YNEFAF/4KQ/PeW0N+r+aVVsoIY0/qxxikF2SWdp+NRkmMB7y9LBZAVqQ4yhGCm/H3H270OSykqmQMKLBhBJDEw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.0.4': resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.2.4': + resolution: {integrity: sha512-zqjjo7RatFfFoP0MkQ51jfuFZBnVE2pRiaydKJ1G/rHZvnsrHAOcQALIi9sA5co5xenQdTugCvtb1cuf78Vf4g==} + cpu: [arm64] + os: [darwin] + '@img/sharp-libvips-darwin-x64@1.0.4': resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] + '@img/sharp-libvips-darwin-x64@1.2.4': + resolution: {integrity: sha512-1IOd5xfVhlGwX+zXv2N93k0yMONvUlANylbJw1eTah8K/Jtpi15KC+WSiaX/nBmbm2HxRM1gZ0nSdjSsrZbGKg==} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-linux-arm64@1.0.4': resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] libc: [glibc] + '@img/sharp-libvips-linux-arm64@1.2.4': + resolution: {integrity: sha512-excjX8DfsIcJ10x1Kzr4RcWe1edC9PquDRRPx3YVCvQv+U5p7Yin2s32ftzikXojb1PIFc/9Mt28/y+iRklkrw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] libc: [glibc] + '@img/sharp-libvips-linux-arm@1.2.4': + resolution: {integrity: sha512-bFI7xcKFELdiNCVov8e44Ia4u2byA+l3XtsAj+Q8tfCwO6BQ8iDojYdvoPMqsKDkuoOo+X6HZA0s0q11ANMQ8A==} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-ppc64@1.2.4': + resolution: {integrity: sha512-FMuvGijLDYG6lW+b/UvyilUWu5Ayu+3r2d1S8notiGCIyYU/76eig1UfMmkZ7vwgOrzKzlQbFSuQfgm7GYUPpA==} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-libvips-linux-riscv64@1.2.4': + resolution: {integrity: sha512-oVDbcR4zUC0ce82teubSm+x6ETixtKZBh/qbREIOcI3cULzDyb18Sr/Wcyx7NRQeQzOiHTNbZFF1UwPS2scyGA==} + cpu: [riscv64] + os: [linux] + libc: [glibc] + '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] libc: [glibc] + '@img/sharp-libvips-linux-s390x@1.2.4': + resolution: {integrity: sha512-qmp9VrzgPgMoGZyPvrQHqk02uyjA0/QrTO26Tqk6l4ZV0MPWIW6LTkqOIov+J1yEu7MbFQaDpwdwJKhbJvuRxQ==} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] libc: [glibc] + '@img/sharp-libvips-linux-x64@1.2.4': + resolution: {integrity: sha512-tJxiiLsmHc9Ax1bz3oaOYBURTXGIRDODBqhveVHonrHJ9/+k89qbLl0bcJns+e4t4rvaNBxaEZsFtSfAdquPrw==} + cpu: [x64] + os: [linux] + libc: [glibc] + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] libc: [musl] + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + resolution: {integrity: sha512-FVQHuwx1IIuNow9QAbYUzJ+En8KcVm9Lk5+uGUQJHaZmMECZmOlix9HnH7n1TRkXMS0pGxIJokIVB9SuqZGGXw==} + cpu: [arm64] + os: [linux] + libc: [musl] + '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] libc: [musl] + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + resolution: {integrity: sha512-+LpyBk7L44ZIXwz/VYfglaX/okxezESc6UxDSoyo2Ks6Jxc4Y7sGjpgU9s4PMgqgjj1gZCylTieNamqA1MF7Dg==} + cpu: [x64] + os: [linux] + libc: [musl] + '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1427,6 +1509,13 @@ packages: os: [linux] libc: [glibc] + '@img/sharp-linux-arm64@0.34.5': + resolution: {integrity: sha512-bKQzaJRY/bkPOXyKx5EVup7qkaojECG6NLYswgktOZjaXecSAeCWiZwwiFf3/Y+O1HrauiE3FVsGxFg8c24rZg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1434,6 +1523,27 @@ packages: os: [linux] libc: [glibc] + '@img/sharp-linux-arm@0.34.5': + resolution: {integrity: sha512-9dLqsvwtg1uuXBGZKsxem9595+ujv0sJ6Vi8wcTANSFpwV/GONat5eCkzQo/1O6zRIkh0m/8+5BjrRr7jDUSZw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-ppc64@0.34.5': + resolution: {integrity: sha512-7zznwNaqW6YtsfrGGDA6BRkISKAAE1Jo0QdpNYXNMHu2+0dTrPflTLNkpc8l7MUP5M16ZJcUvysVWWrMefZquA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ppc64] + os: [linux] + libc: [glibc] + + '@img/sharp-linux-riscv64@0.34.5': + resolution: {integrity: sha512-51gJuLPTKa7piYPaVs8GmByo7/U7/7TZOq+cnXJIHZKavIRHAP77e3N2HEl3dgiqdD/w0yUfiJnII77PuDDFdw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [riscv64] + os: [linux] + libc: [glibc] + '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1441,6 +1551,13 @@ packages: os: [linux] libc: [glibc] + '@img/sharp-linux-s390x@0.34.5': + resolution: {integrity: sha512-nQtCk0PdKfho3eC5MrbQoigJ2gd1CgddUMkabUj+rBevs8tZ2cULOx46E7oyX+04WGfABgIwmMC0VqieTiR4jg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + libc: [glibc] + '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1448,6 +1565,13 @@ packages: os: [linux] libc: [glibc] + '@img/sharp-linux-x64@0.34.5': + resolution: {integrity: sha512-MEzd8HPKxVxVenwAa+JRPwEC7QFjoPWuS5NZnBt6B3pu7EG2Ge0id1oLHZpPJdn3OQK+BQDiw9zStiHBTJQQQQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [glibc] + '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1455,6 +1579,13 @@ packages: os: [linux] libc: [musl] + '@img/sharp-linuxmusl-arm64@0.34.5': + resolution: {integrity: sha512-fprJR6GtRsMt6Kyfq44IsChVZeGN97gTD331weR1ex1c1rypDEABN6Tm2xa1wE6lYb5DdEnk03NZPqA7Id21yg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + libc: [musl] + '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} @@ -1462,23 +1593,53 @@ packages: os: [linux] libc: [musl] + '@img/sharp-linuxmusl-x64@0.34.5': + resolution: {integrity: sha512-Jg8wNT1MUzIvhBFxViqrEhWDGzqymo3sV7z7ZsaWbZNDLXRJZoRGrjulp60YYtV4wfY8VIKcWidjojlLcWrd8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + libc: [musl] + '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] + '@img/sharp-wasm32@0.34.5': + resolution: {integrity: sha512-OdWTEiVkY2PHwqkbBI8frFxQQFekHaSSkUIJkwzclWZe64O1X4UlUjqqqLaPbUpMOQk6FBu/HtlGXNblIs0huw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + + '@img/sharp-win32-arm64@0.34.5': + resolution: {integrity: sha512-WQ3AgWCWYSb2yt+IG8mnC6Jdk9Whs7O0gxphblsLvdhSpSTtmu69ZG1Gkb6NuvxsNACwiPV6cNSZNzt0KPsw7g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [win32] + '@img/sharp-win32-ia32@0.33.5': resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] + '@img/sharp-win32-ia32@0.34.5': + resolution: {integrity: sha512-FV9m/7NmeCmSHDD5j4+4pNI8Cp3aW+JvLoXcTUo0IqyjSfAZJ8dIUmijx1qaJsIiU+Hosw6xM5KijAWRJCSgNg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + '@img/sharp-win32-x64@0.33.5': resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] + '@img/sharp-win32-x64@0.34.5': + resolution: {integrity: sha512-+29YMsqY2/9eFEiW93eqWnuLcWcufowXewwSNIT6UwZdUUCrM3oFjMWH/Z6/TMmb4hlFenmfAVbpWeup2jryCw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -1607,60 +1768,60 @@ packages: '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} - '@next/env@15.1.12': - resolution: {integrity: sha512-EWKXZKsd9ZNn+gLqOtfwH2PQyWuWFmpLldjStw7mZgWgKu56vaqNkAGQrys2g5ER4CNXEDz3Khj2tD1pnsT9Uw==} + '@next/env@16.1.6': + resolution: {integrity: sha512-N1ySLuZjnAtN3kFnwhAwPvZah8RJxKasD7x1f8shFqhncnWZn4JMfg37diLNuoHsLAlrDfM3g4mawVdtAG8XLQ==} - '@next/eslint-plugin-next@15.0.3': - resolution: {integrity: sha512-3Ln/nHq2V+v8uIaxCR6YfYo7ceRgZNXfTd3yW1ukTaFbO+/I8jNakrjYWODvG9BuR2v5kgVtH/C8r0i11quOgw==} + '@next/eslint-plugin-next@16.1.6': + resolution: {integrity: sha512-/Qq3PTagA6+nYVfryAtQ7/9FEr/6YVyvOtl6rZnGsbReGLf0jZU6gkpr1FuChAQpvV46a78p4cmHOVP8mbfSMQ==} - '@next/swc-darwin-arm64@15.1.9': - resolution: {integrity: sha512-sQF6MfW4nk0PwMYYq8xNgqyxZJGIJV16QqNDgaZ5ze9YoVzm4/YNx17X0exZudayjL9PF0/5RGffDtzXapch0Q==} + '@next/swc-darwin-arm64@16.1.6': + resolution: {integrity: sha512-wTzYulosJr/6nFnqGW7FrG3jfUUlEf8UjGA0/pyypJl42ExdVgC6xJgcXQ+V8QFn6niSG2Pb8+MIG1mZr2vczw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-x64@15.1.9': - resolution: {integrity: sha512-fp0c1rB6jZvdSDhprOur36xzQvqelAkNRXM/An92sKjjtaJxjlqJR8jiQLQImPsClIu8amQn+ZzFwl1lsEf62w==} + '@next/swc-darwin-x64@16.1.6': + resolution: {integrity: sha512-BLFPYPDO+MNJsiDWbeVzqvYd4NyuRrEYVB5k2N3JfWncuHAy2IVwMAOlVQDFjj+krkWzhY2apvmekMkfQR0CUQ==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-linux-arm64-gnu@15.1.9': - resolution: {integrity: sha512-77rYykF6UtaXvxh9YyRIKoaYPI6/YX6cy8j1DL5/1XkjbfOwFDfTEhH7YGPqG/ePl+emBcbDYC2elgEqY2e+ag==} + '@next/swc-linux-arm64-gnu@16.1.6': + resolution: {integrity: sha512-OJYkCd5pj/QloBvoEcJ2XiMnlJkRv9idWA/j0ugSuA34gMT6f5b7vOiCQHVRpvStoZUknhl6/UxOXL4OwtdaBw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [glibc] - '@next/swc-linux-arm64-musl@15.1.9': - resolution: {integrity: sha512-uZ1HazKcyWC7RA6j+S/8aYgvxmDqwnG+gE5S9MhY7BTMj7ahXKunpKuX8/BA2M7OvINLv7LTzoobQbw928p3WA==} + '@next/swc-linux-arm64-musl@16.1.6': + resolution: {integrity: sha512-S4J2v+8tT3NIO9u2q+S0G5KdvNDjXfAv06OhfOzNDaBn5rw84DGXWndOEB7d5/x852A20sW1M56vhC/tRVbccQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] libc: [musl] - '@next/swc-linux-x64-gnu@15.1.9': - resolution: {integrity: sha512-gQIX1d3ct2RBlgbbWOrp+SHExmtmFm/HSW1Do5sSGMDyzbkYhS2sdq5LRDJWWsQu+/MqpgJHqJT6ORolKp/U1g==} + '@next/swc-linux-x64-gnu@16.1.6': + resolution: {integrity: sha512-2eEBDkFlMMNQnkTyPBhQOAyn2qMxyG2eE7GPH2WIDGEpEILcBPI/jdSv4t6xupSP+ot/jkfrCShLAa7+ZUPcJQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [glibc] - '@next/swc-linux-x64-musl@15.1.9': - resolution: {integrity: sha512-fJOwxAbCeq6Vo7pXZGDP6iA4+yIBGshp7ie2Evvge7S7lywyg7b/SGqcvWq/jYcmd0EbXdb7hBfdqSQwTtGTPg==} + '@next/swc-linux-x64-musl@16.1.6': + resolution: {integrity: sha512-oicJwRlyOoZXVlxmIMaTq7f8pN9QNbdes0q2FXfRsPhfCi8n8JmOZJm5oo1pwDaFbnnD421rVU409M3evFbIqg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] libc: [musl] - '@next/swc-win32-arm64-msvc@15.1.9': - resolution: {integrity: sha512-crfbUkAd9PVg9nGfyjSzQbz82dPvc4pb1TeP0ZaAdGzTH6OfTU9kxidpFIogw0DYIEadI7hRSvuihy2NezkaNQ==} + '@next/swc-win32-arm64-msvc@16.1.6': + resolution: {integrity: sha512-gQmm8izDTPgs+DCWH22kcDmuUp7NyiJgEl18bcr8irXA5N2m2O+JQIr6f3ct42GOs9c0h8QF3L5SzIxcYAAXXw==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-x64-msvc@15.1.9': - resolution: {integrity: sha512-SBB0oA4E2a0axUrUwLqXlLkSn+bRx9OWU6LheqmRrO53QEAJP7JquKh3kF0jRzmlYOWFZtQwyIWJMEJMtvvDcQ==} + '@next/swc-win32-x64-msvc@16.1.6': + resolution: {integrity: sha512-NRfO39AIrzBnixKbjuo2YiYhB6o9d8v/ymU9m/Xk8cyVk+k7XylniXkHwjs4s70wedVffc6bQNbufk5v0xEm0A==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -3126,9 +3287,6 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@rushstack/eslint-patch@1.15.0': - resolution: {integrity: sha512-ojSshQPKwVvSMR8yT2L/QtUkV5SXi/IfDiJ4/8d6UbTPjiHVmxZzUAzGD8Tzks1b9+qQkZa0isUOvYObedITaw==} - '@sentry-internal/browser-utils@10.39.0': resolution: {integrity: sha512-W6WODonMGiI13Az5P7jd/m2lj/JpIyuVKg7wE4X+YdlMehLspAv6I7gRE4OBSumS14ZjdaYDpD/lwtnBwKAzcA==} engines: {node: '>=18'} @@ -3539,9 +3697,6 @@ packages: engines: {node: '>=18'} hasBin: true - '@swc/counter@0.1.3': - resolution: {integrity: sha512-e2BR4lsJkkRlKZ/qCHPw9ZaSxc0MVUd7gtbtaB7aMvHeJVYe8sOB8DBZkP2DtISHGSku9sCK6T6cnY0CtXrOCQ==} - '@swc/helpers@0.5.15': resolution: {integrity: sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==} @@ -4480,10 +4635,6 @@ packages: buffer-from@1.1.2: resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} - busboy@1.6.0: - resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} - engines: {node: '>=10.16.0'} - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -5109,8 +5260,8 @@ packages: resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==} engines: {node: '>= 0.4'} - es-iterator-helpers@1.2.2: - resolution: {integrity: sha512-BrUQ0cPTB/IwXj23HtwHjS9n7O4h9FX94b4xc5zlTHxeLgTAdzYUDyy6KdExAl9lbN5rtfe44xpjpmj9grxs5w==} + es-iterator-helpers@1.2.1: + resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==} engines: {node: '>= 0.4'} es-module-lexer@1.7.0: @@ -5175,10 +5326,10 @@ packages: engines: {node: '>=6.0'} hasBin: true - eslint-config-next@15.0.3: - resolution: {integrity: sha512-IGP2DdQQrgjcr4mwFPve4DrCqo7CVVez1WoYY47XwKSrYO4hC0Dlb+iJA60i0YfICOzgNADIb8r28BpQ5Zs0wg==} + eslint-config-next@16.1.6: + resolution: {integrity: sha512-vKq40io2B0XtkkNDYyleATwblNt8xuh3FWp8SpSz3pt7P01OkBFlKsJZ2mWt5WsCySlDQLckb1zMY9yE9Qy0LA==} peerDependencies: - eslint: ^7.23.0 || ^8.0.0 || ^9.0.0 + eslint: '>=9.0.0' typescript: '>=3.3.1' peerDependenciesMeta: typescript: @@ -5289,9 +5440,9 @@ packages: peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 - eslint-plugin-react-hooks@5.2.0: - resolution: {integrity: sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==} - engines: {node: '>=10'} + eslint-plugin-react-hooks@7.0.1: + resolution: {integrity: sha512-O0d0m04evaNzEPoSW+59Mezf8Qt0InfgGIBJnpC0h3NH/WjUAR7BIKUfysC6todmtiZ/A0oUVS8Gce0WhBrHsA==} + engines: {node: '>=18'} peerDependencies: eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0 @@ -5332,6 +5483,10 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + eslint-visitor-keys@5.0.0: resolution: {integrity: sha512-A0XeIi7CXU7nPlfHS9loMYEKxUaONu/hTEzHTGba9Huu94Cq1hPivf+DE5erJozZOky0LfvXAyrV/tcswpLI0Q==} engines: {node: ^20.19.0 || ^22.13.0 || >=24} @@ -5342,6 +5497,10 @@ packages: deprecated: This version is no longer supported. Please see https://eslint.org/version-support for other options. hasBin: true + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + espree@9.6.1: resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -5634,6 +5793,14 @@ packages: resolution: {integrity: sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==} engines: {node: '>=8'} + globals@14.0.0: + resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} + engines: {node: '>=18'} + + globals@16.4.0: + resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} + engines: {node: '>=18'} + globalthis@1.0.4: resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==} engines: {node: '>= 0.4'} @@ -5794,6 +5961,12 @@ packages: hastscript@9.0.1: resolution: {integrity: sha512-g7df9rMFX/SPi34tyGCyUBREQoKkapwdY/T04Qn9TDWfHhAYt4/I0gMVirzK5wEzeUqIjEB+LXC/ypb7Aqno5w==} + hermes-estree@0.25.1: + resolution: {integrity: sha512-0wUoCcLp+5Ev5pDW2OriHC2MJCbwLwuRx+gAqMTOkGKJJiBCLjtrvy4PWUGn6MIVefecRpzoOZ/UV6iGdOr+Cw==} + + hermes-parser@0.25.1: + resolution: {integrity: sha512-6pEjquH3rqaI6cYAXYPcz9MS4rY6R4ngRgrgfDshRptUZIc3lw0MCIJIGDj9++mfySOuPTHB4nrSW99BCvOPIA==} + hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} @@ -6744,13 +6917,13 @@ packages: react: ^16.8 || ^17 || ^18 react-dom: ^16.8 || ^17 || ^18 - next@15.1.12: - resolution: {integrity: sha512-fClyhVCGTATGYBnETgKAi7YU5+bSwzM5rqNsY3Dg5wBoBMwE0NSvWA3fzwYj0ijl+LMeiV8P2QAnUFpeqDfTgw==} - engines: {node: ^18.18.0 || ^19.8.0 || >= 20.0.0} + next@16.1.6: + resolution: {integrity: sha512-hkyRkcu5x/41KoqnROkfTm2pZVbKxvbZRuNvKXLRXxs3VfyO0WhY50TQS40EuKO9SW3rBj/sF3WbVwDACeMZyw==} + engines: {node: '>=20.9.0'} hasBin: true peerDependencies: '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.41.2 + '@playwright/test': ^1.51.1 babel-plugin-react-compiler: '*' react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 @@ -7566,6 +7739,10 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.34.5: + resolution: {integrity: sha512-Ou9I5Ft9WNcCbXrU9cMgPBcCK8LiwLqcbywW3t4oDV37n1pzpuNLsYiAV8eODnjbtQlSDwZ2cUEeQz4E54Hltg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -7672,10 +7849,6 @@ packages: stream-shift@1.0.3: resolution: {integrity: sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ==} - streamsearch@1.1.0: - resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} - engines: {node: '>=10.0.0'} - string-length@4.0.2: resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} engines: {node: '>=10'} @@ -8027,6 +8200,13 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} + typescript-eslint@8.56.0: + resolution: {integrity: sha512-c7toRLrotJ9oixgdW7liukZpsnq5CZ7PuKztubGYlNppuTqhIoWfhgHo/7EU0v06gS2l/x0i2NEFK1qMIf0rIg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 || ^10.0.0 + typescript: '>=4.8.4 <6.0.0' + typescript@5.9.3: resolution: {integrity: sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==} engines: {node: '>=14.17'} @@ -8539,6 +8719,12 @@ packages: resolution: {integrity: sha512-4LCcse/U2MHZ63HAJVE+v71o7yOdIe4cZ70Wpf8D/IyjDKYQLV5GD46B+hSTjJsvV5PztjvHoU580EftxjDZFQ==} engines: {node: '>=12.20'} + zod-validation-error@4.0.2: + resolution: {integrity: sha512-Q6/nZLe6jxuU80qb/4uJ4t5v2VEZ44lzQjPDhYJNztRQ4wyWc6VF3D3Kb/fAuPetZQnhS3hnajCf9CsWesghLQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + zod: ^3.25.0 || ^4.0.0 + zod@3.25.76: resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} @@ -9468,11 +9654,11 @@ snapshots: unplugin: 1.16.1 zod: 3.25.76 - '@codecov/nextjs-webpack-plugin@1.9.1(next@15.1.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(webpack@5.105.2(esbuild@0.25.12))': + '@codecov/nextjs-webpack-plugin@1.9.1(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(webpack@5.105.2(esbuild@0.25.12))': dependencies: '@codecov/bundler-plugin-core': 1.9.1 '@codecov/webpack-plugin': 1.9.1(webpack@5.105.2(esbuild@0.25.12)) - next: 15.1.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) + next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) unplugin: 1.16.1 webpack: 5.105.2(esbuild@0.25.12) @@ -9790,6 +9976,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@eslint/eslintrc@3.3.3': + dependencies: + ajv: 6.12.6 + debug: 4.4.3 + espree: 10.4.0 + globals: 14.0.0 + ignore: 5.3.2 + import-fresh: 3.3.1 + js-yaml: 4.1.1 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + '@eslint/js@8.57.1': {} '@fal-works/esbuild-plugin-global-externals@2.1.2': {} @@ -9863,81 +10063,178 @@ snapshots: '@iconify/types': 2.0.0 mlly: 1.8.0 + '@img/colour@1.0.0': + optional: true + '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true + '@img/sharp-darwin-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.2.4 + optional: true + '@img/sharp-darwin-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true + '@img/sharp-darwin-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.2.4 + optional: true + '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true + '@img/sharp-libvips-darwin-arm64@1.2.4': + optional: true + '@img/sharp-libvips-darwin-x64@1.0.4': optional: true + '@img/sharp-libvips-darwin-x64@1.2.4': + optional: true + '@img/sharp-libvips-linux-arm64@1.0.4': optional: true + '@img/sharp-libvips-linux-arm64@1.2.4': + optional: true + '@img/sharp-libvips-linux-arm@1.0.5': optional: true + '@img/sharp-libvips-linux-arm@1.2.4': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.2.4': + optional: true + + '@img/sharp-libvips-linux-riscv64@1.2.4': + optional: true + '@img/sharp-libvips-linux-s390x@1.0.4': optional: true + '@img/sharp-libvips-linux-s390x@1.2.4': + optional: true + '@img/sharp-libvips-linux-x64@1.0.4': optional: true + '@img/sharp-libvips-linux-x64@1.2.4': + optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.2.4': + optional: true + '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-x64@1.2.4': + optional: true + '@img/sharp-linux-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true + '@img/sharp-linux-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.2.4 + optional: true + '@img/sharp-linux-arm@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.0.5 optional: true + '@img/sharp-linux-arm@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.2.4 + optional: true + + '@img/sharp-linux-ppc64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-ppc64': 1.2.4 + optional: true + + '@img/sharp-linux-riscv64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-riscv64': 1.2.4 + optional: true + '@img/sharp-linux-s390x@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.0.4 optional: true + '@img/sharp-linux-s390x@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.2.4 + optional: true + '@img/sharp-linux-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.0.4 optional: true + '@img/sharp-linux-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.2.4 + optional: true + '@img/sharp-linuxmusl-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true + '@img/sharp-linuxmusl-arm64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + optional: true + '@img/sharp-linuxmusl-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true + '@img/sharp-linuxmusl-x64@0.34.5': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + optional: true + '@img/sharp-wasm32@0.33.5': dependencies: '@emnapi/runtime': 1.8.1 optional: true + '@img/sharp-wasm32@0.34.5': + dependencies: + '@emnapi/runtime': 1.8.1 + optional: true + + '@img/sharp-win32-arm64@0.34.5': + optional: true + '@img/sharp-win32-ia32@0.33.5': optional: true + '@img/sharp-win32-ia32@0.34.5': + optional: true + '@img/sharp-win32-x64@0.33.5': optional: true + '@img/sharp-win32-x64@0.34.5': + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -10215,34 +10512,34 @@ snapshots: '@tybys/wasm-util': 0.10.1 optional: true - '@next/env@15.1.12': {} + '@next/env@16.1.6': {} - '@next/eslint-plugin-next@15.0.3': + '@next/eslint-plugin-next@16.1.6': dependencies: fast-glob: 3.3.1 - '@next/swc-darwin-arm64@15.1.9': + '@next/swc-darwin-arm64@16.1.6': optional: true - '@next/swc-darwin-x64@15.1.9': + '@next/swc-darwin-x64@16.1.6': optional: true - '@next/swc-linux-arm64-gnu@15.1.9': + '@next/swc-linux-arm64-gnu@16.1.6': optional: true - '@next/swc-linux-arm64-musl@15.1.9': + '@next/swc-linux-arm64-musl@16.1.6': optional: true - '@next/swc-linux-x64-gnu@15.1.9': + '@next/swc-linux-x64-gnu@16.1.6': optional: true - '@next/swc-linux-x64-musl@15.1.9': + '@next/swc-linux-x64-musl@16.1.6': optional: true - '@next/swc-win32-arm64-msvc@15.1.9': + '@next/swc-win32-arm64-msvc@16.1.6': optional: true - '@next/swc-win32-x64-msvc@15.1.9': + '@next/swc-win32-x64-msvc@16.1.6': optional: true '@nodelib/fs.scandir@2.1.5': @@ -11813,8 +12110,6 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@rushstack/eslint-patch@1.15.0': {} - '@sentry-internal/browser-utils@10.39.0': dependencies: '@sentry/core': 10.39.0 @@ -11918,7 +12213,7 @@ snapshots: '@sentry/core@8.55.0': {} - '@sentry/nextjs@10.39.0(@opentelemetry/context-async-hooks@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0))(next@15.1.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react@19.2.4)(webpack@5.105.2(esbuild@0.25.12))': + '@sentry/nextjs@10.39.0(@opentelemetry/context-async-hooks@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.5.1(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.5.1(@opentelemetry/api@1.9.0))(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react@19.2.4)(webpack@5.105.2(esbuild@0.25.12))': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.39.0 @@ -11931,7 +12226,7 @@ snapshots: '@sentry/react': 10.39.0(react@19.2.4) '@sentry/vercel-edge': 10.39.0 '@sentry/webpack-plugin': 4.9.1(webpack@5.105.2(esbuild@0.25.12)) - next: 15.1.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) + next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) rollup: 4.57.1 stacktrace-parser: 0.1.11 transitivePeerDependencies: @@ -12449,8 +12744,6 @@ snapshots: transitivePeerDependencies: - supports-color - '@swc/counter@0.1.3': {} - '@swc/helpers@0.5.15': dependencies: tslib: 2.8.1 @@ -13559,10 +13852,6 @@ snapshots: buffer-from@1.1.2: {} - busboy@1.6.0: - dependencies: - streamsearch: 1.1.0 - cac@6.7.14: {} call-bind-apply-helpers@1.0.2: @@ -14248,7 +14537,7 @@ snapshots: es-errors@1.3.0: {} - es-iterator-helpers@1.2.2: + es-iterator-helpers@1.2.1: dependencies: call-bind: 1.0.8 call-bound: 1.0.4 @@ -14382,22 +14671,22 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-config-next@15.0.3(eslint@8.57.1)(typescript@5.9.3): + eslint-config-next@16.1.6(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3): dependencies: - '@next/eslint-plugin-next': 15.0.3 - '@rushstack/eslint-patch': 1.15.0 - '@typescript-eslint/eslint-plugin': 8.56.0(@typescript-eslint/parser@8.56.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) - '@typescript-eslint/parser': 8.56.0(eslint@8.57.1)(typescript@5.9.3) + '@next/eslint-plugin-next': 16.1.6 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.56.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-jsx-a11y: 6.10.2(eslint@8.57.1) eslint-plugin-react: 7.37.5(eslint@8.57.1) - eslint-plugin-react-hooks: 5.2.0(eslint@8.57.1) + eslint-plugin-react-hooks: 7.0.1(eslint@8.57.1) + globals: 16.4.0 + typescript-eslint: 8.56.0(eslint@8.57.1)(typescript@5.9.3) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: + - '@typescript-eslint/parser' - eslint-import-resolver-webpack - eslint-plugin-import-x - supports-color @@ -14411,7 +14700,7 @@ snapshots: eslint-config-sentry: 2.10.0(eslint@8.57.1) eslint-config-sentry-react: 2.10.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-plugin-import@2.32.0)(eslint-plugin-jest@27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.19.11)(typescript@5.9.3)))(typescript@5.9.3))(eslint-plugin-react@7.37.5(eslint@8.57.1))(eslint@8.57.1)(typescript@5.9.3) eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.19.11)(typescript@5.9.3)))(typescript@5.9.3) eslint-plugin-no-lookahead-lookbehind-regexp: 0.3.0(eslint@8.57.1) eslint-plugin-react: 7.37.5(eslint@8.57.1) @@ -14428,7 +14717,7 @@ snapshots: dependencies: eslint: 8.57.1 eslint-config-sentry: 2.10.0(eslint@8.57.1) - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) eslint-plugin-jest: 27.9.0(@typescript-eslint/eslint-plugin@6.21.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(jest@29.7.0(@types/node@22.19.11)(babel-plugin-macros@3.1.0)(ts-node@10.9.2(@types/node@22.19.11)(typescript@5.9.3)))(typescript@5.9.3) eslint-plugin-jest-dom: 5.5.0(eslint@8.57.1) eslint-plugin-react: 7.37.5(eslint@8.57.1) @@ -14464,11 +14753,11 @@ snapshots: tinyglobby: 0.2.15 unrs-resolver: 1.11.1 optionalDependencies: - eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1) + eslint-plugin-import: 2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1))(eslint@8.57.1): + eslint-module-utils@2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: debug: 3.2.7 optionalDependencies: @@ -14479,18 +14768,7 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.1(@typescript-eslint/parser@8.56.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): - dependencies: - debug: 3.2.7 - optionalDependencies: - '@typescript-eslint/parser': 8.56.0(eslint@8.57.1)(typescript@5.9.3) - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1) - transitivePeerDependencies: - - supports-color - - eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1): + eslint-plugin-import@2.32.0(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.9 @@ -14501,7 +14779,7 @@ snapshots: doctrine: 2.1.0 eslint: 8.57.1 eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.32.0)(eslint@8.57.1))(eslint@8.57.1) + eslint-module-utils: 2.12.1(@typescript-eslint/parser@6.21.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -14519,35 +14797,6 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.32.0(@typescript-eslint/parser@8.56.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1): - dependencies: - '@rtsao/scc': 1.1.0 - array-includes: 3.1.9 - array.prototype.findlastindex: 1.2.6 - array.prototype.flat: 1.3.3 - array.prototype.flatmap: 1.3.3 - debug: 3.2.7 - doctrine: 2.1.0 - eslint: 8.57.1 - eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.1(@typescript-eslint/parser@8.56.0(eslint@8.57.1)(typescript@5.9.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) - hasown: 2.0.2 - is-core-module: 2.16.1 - is-glob: 4.0.3 - minimatch: 3.1.2 - object.fromentries: 2.0.8 - object.groupby: 1.0.3 - object.values: 1.2.1 - semver: 6.3.1 - string.prototype.trimend: 1.0.9 - tsconfig-paths: 3.15.0 - optionalDependencies: - '@typescript-eslint/parser': 8.56.0(eslint@8.57.1)(typescript@5.9.3) - transitivePeerDependencies: - - eslint-import-resolver-typescript - - eslint-import-resolver-webpack - - supports-color - eslint-plugin-jest-dom@5.5.0(eslint@8.57.1): dependencies: '@babel/runtime': 7.28.6 @@ -14594,9 +14843,16 @@ snapshots: dependencies: eslint: 8.57.1 - eslint-plugin-react-hooks@5.2.0(eslint@8.57.1): + eslint-plugin-react-hooks@7.0.1(eslint@8.57.1): dependencies: + '@babel/core': 7.29.0 + '@babel/parser': 7.29.0 eslint: 8.57.1 + hermes-parser: 0.25.1 + zod: 3.25.76 + zod-validation-error: 4.0.2(zod@3.25.76) + transitivePeerDependencies: + - supports-color eslint-plugin-react@7.37.5(eslint@8.57.1): dependencies: @@ -14605,7 +14861,7 @@ snapshots: array.prototype.flatmap: 1.3.3 array.prototype.tosorted: 1.1.4 doctrine: 2.1.0 - es-iterator-helpers: 1.2.2 + es-iterator-helpers: 1.2.1 eslint: 8.57.1 estraverse: 5.3.0 hasown: 2.0.2 @@ -14655,6 +14911,8 @@ snapshots: eslint-visitor-keys@3.4.3: {} + eslint-visitor-keys@4.2.1: {} + eslint-visitor-keys@5.0.0: {} eslint@8.57.1: @@ -14700,6 +14958,12 @@ snapshots: transitivePeerDependencies: - supports-color + espree@10.4.0: + dependencies: + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 + espree@9.6.1: dependencies: acorn: 8.15.0 @@ -15031,6 +15295,10 @@ snapshots: dependencies: type-fest: 0.20.2 + globals@14.0.0: {} + + globals@16.4.0: {} + globalthis@1.0.4: dependencies: define-properties: 1.2.1 @@ -15343,6 +15611,12 @@ snapshots: property-information: 7.1.0 space-separated-tokens: 2.0.2 + hermes-estree@0.25.1: {} + + hermes-parser@0.25.1: + dependencies: + hermes-estree: 0.25.1 + hoist-non-react-statics@3.3.2: dependencies: react-is: 16.13.1 @@ -16806,9 +17080,9 @@ snapshots: neo-async@2.6.2: {} - next-plausible@3.12.5(next@15.1.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + next-plausible@3.12.5(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - next: 15.1.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) + next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) react: 19.2.4 react-dom: 19.2.4(react@19.2.4) @@ -16817,36 +17091,35 @@ snapshots: react: 19.2.4 react-dom: 19.2.4(react@19.2.4) - next@15.1.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3): + next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3): dependencies: - '@next/env': 15.1.12 - '@swc/counter': 0.1.3 + '@next/env': 16.1.6 '@swc/helpers': 0.5.15 - busboy: 1.6.0 + baseline-browser-mapping: 2.9.19 caniuse-lite: 1.0.30001770 postcss: 8.4.31 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) styled-jsx: 5.1.6(@babel/core@7.29.0)(babel-plugin-macros@3.1.0)(react@19.2.4) optionalDependencies: - '@next/swc-darwin-arm64': 15.1.9 - '@next/swc-darwin-x64': 15.1.9 - '@next/swc-linux-arm64-gnu': 15.1.9 - '@next/swc-linux-arm64-musl': 15.1.9 - '@next/swc-linux-x64-gnu': 15.1.9 - '@next/swc-linux-x64-musl': 15.1.9 - '@next/swc-win32-arm64-msvc': 15.1.9 - '@next/swc-win32-x64-msvc': 15.1.9 + '@next/swc-darwin-arm64': 16.1.6 + '@next/swc-darwin-x64': 16.1.6 + '@next/swc-linux-arm64-gnu': 16.1.6 + '@next/swc-linux-arm64-musl': 16.1.6 + '@next/swc-linux-x64-gnu': 16.1.6 + '@next/swc-linux-x64-musl': 16.1.6 + '@next/swc-win32-arm64-msvc': 16.1.6 + '@next/swc-win32-x64-msvc': 16.1.6 '@opentelemetry/api': 1.9.0 sass: 1.97.3 - sharp: 0.33.5 + sharp: 0.34.5 transitivePeerDependencies: - '@babel/core' - babel-plugin-macros - nextjs-toploader@1.6.12(next@15.1.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4): + nextjs-toploader@1.6.12(next@16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3))(react-dom@19.2.4(react@19.2.4))(react@19.2.4): dependencies: - next: 15.1.12(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) + next: 16.1.6(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(babel-plugin-macros@3.1.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(sass@1.97.3) nprogress: 0.2.0 prop-types: 15.8.1 react: 19.2.4 @@ -17977,6 +18250,38 @@ snapshots: '@img/sharp-win32-ia32': 0.33.5 '@img/sharp-win32-x64': 0.33.5 + sharp@0.34.5: + dependencies: + '@img/colour': 1.0.0 + detect-libc: 2.1.2 + semver: 7.7.4 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.5 + '@img/sharp-darwin-x64': 0.34.5 + '@img/sharp-libvips-darwin-arm64': 1.2.4 + '@img/sharp-libvips-darwin-x64': 1.2.4 + '@img/sharp-libvips-linux-arm': 1.2.4 + '@img/sharp-libvips-linux-arm64': 1.2.4 + '@img/sharp-libvips-linux-ppc64': 1.2.4 + '@img/sharp-libvips-linux-riscv64': 1.2.4 + '@img/sharp-libvips-linux-s390x': 1.2.4 + '@img/sharp-libvips-linux-x64': 1.2.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.2.4 + '@img/sharp-libvips-linuxmusl-x64': 1.2.4 + '@img/sharp-linux-arm': 0.34.5 + '@img/sharp-linux-arm64': 0.34.5 + '@img/sharp-linux-ppc64': 0.34.5 + '@img/sharp-linux-riscv64': 0.34.5 + '@img/sharp-linux-s390x': 0.34.5 + '@img/sharp-linux-x64': 0.34.5 + '@img/sharp-linuxmusl-arm64': 0.34.5 + '@img/sharp-linuxmusl-x64': 0.34.5 + '@img/sharp-wasm32': 0.34.5 + '@img/sharp-win32-arm64': 0.34.5 + '@img/sharp-win32-ia32': 0.34.5 + '@img/sharp-win32-x64': 0.34.5 + optional: true + shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 @@ -18076,8 +18381,6 @@ snapshots: stream-shift@1.0.3: {} - streamsearch@1.1.0: {} - string-length@4.0.2: dependencies: char-regex: 1.0.2 @@ -18461,6 +18764,17 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 + typescript-eslint@8.56.0(eslint@8.57.1)(typescript@5.9.3): + dependencies: + '@typescript-eslint/eslint-plugin': 8.56.0(@typescript-eslint/parser@8.56.0(eslint@8.57.1)(typescript@5.9.3))(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/parser': 8.56.0(eslint@8.57.1)(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.56.0(typescript@5.9.3) + '@typescript-eslint/utils': 8.56.0(eslint@8.57.1)(typescript@5.9.3) + eslint: 8.57.1 + typescript: 5.9.3 + transitivePeerDependencies: + - supports-color + typescript@5.9.3: {} ufo@1.6.3: {} @@ -19039,6 +19353,10 @@ snapshots: yocto-queue@1.2.2: {} + zod-validation-error@4.0.2(zod@3.25.76): + dependencies: + zod: 3.25.76 + zod@3.25.76: {} zwitch@2.0.4: {}