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..7fe2953892fc87 --- /dev/null +++ b/eslint.config.mjs @@ -0,0 +1,31 @@ +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, +}); + +const config = [ + { + ignores: ['.babelrc.js'], + }, + ...compat.extends('sentry-docs', 'plugin:@next/next/recommended'), + { + languageOptions: { + globals: { + Atomics: 'readonly', + SharedArrayBuffer: 'readonly', + }, + }, + rules: { + 'import/no-nodejs-modules': 'off', + }, + }, +]; + +export default config; 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..4aae6a06a20df3 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 @@ -50,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/**/*', @@ -118,6 +141,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 +162,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..b1132fadbba80f 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", @@ -166,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", @@ -181,4 +183,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/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: {} 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/proxy.ts similarity index 93% rename from src/middleware.ts rename to src/proxy.ts index 16288c7ff2285c..a6706cee7126e1 100644 --- a/src/middleware.ts +++ b/src/proxy.ts @@ -1,8 +1,6 @@ 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'; +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 @@ -21,7 +19,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) { @@ -37,56 +35,24 @@ 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. + * that would benefit from markdown format */ -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}; - } +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 + ]; - // 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, - }; + return patterns.some(pattern => pattern.test(userAgent)); } /** @@ -104,7 +70,7 @@ function wantsMarkdownViaAccept(acceptHeader: string): boolean { * Detects if client wants markdown via Accept header or user-agent */ function wantsMarkdown(request: NextRequest): boolean { - const uaString = request.headers.get('user-agent') || ''; + const userAgent = request.headers.get('user-agent') || ''; const acceptHeader = request.headers.get('accept') || ''; // Strategy 1: Accept header content negotiation (standards-compliant) @@ -113,49 +79,14 @@ function wantsMarkdown(request: NextRequest): boolean { } // 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), - }, - }); + return isAIOrDevTool(userAgent); } /** * Handles redirection to markdown versions for AI/LLM clients */ const handleAIClientRedirect = (request: NextRequest) => { - const userAgentString = request.headers.get('user-agent') || ''; + const userAgent = request.headers.get('user-agent') || ''; const acceptHeader = request.headers.get('accept') || ''; const url = request.nextUrl; @@ -168,7 +99,7 @@ const handleAIClientRedirect = (request: NextRequest) => { // Determine detection method for logging const detectionMethod = wantsMarkdownViaAccept(acceptHeader) ? 'Accept header' - : isAIOrDevTool(userAgentString) + : isAIOrDevTool(userAgent) ? 'User-agent' : 'Manual'; @@ -187,13 +118,12 @@ const handleAIClientRedirect = (request: NextRequest) => { }); } - // Skip if already requesting a markdown file - pass through with classification headers + // Skip if already requesting a markdown file if (url.pathname.endsWith('.md')) { - return nextWithClassification(request); + return undefined; } // 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/') || @@ -201,7 +131,7 @@ const handleAIClientRedirect = (request: NextRequest) => { url.pathname ) ) { - return nextWithClassification(request); + return undefined; } // Check for markdown request (Accept header, user-agent, or manual) @@ -228,11 +158,10 @@ const handleAIClientRedirect = (request: NextRequest) => { // 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); + return NextResponse.rewrite(newUrl); } - // Default: pass through with traffic classification headers - return nextWithClassification(request); + return undefined; }; const handleRedirects = (request: NextRequest) => { @@ -1022,11 +951,7 @@ const USER_DOCS_REDIRECTS: Redirect[] = [ }, { from: '/platforms/android/manual-configuration/', - to: '/platforms/android/manual-setup/', - }, - { - from: '/platforms/android/configuration/manual-init/', - to: '/platforms/android/manual-setup/', + to: '/platforms/android/configuration/manual-init/', }, { from: '/platforms/android/advanced-usage/', @@ -1844,6 +1769,16 @@ const USER_DOCS_REDIRECTS: Redirect[] = [ 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/', @@ -2000,70 +1935,6 @@ const USER_DOCS_REDIRECTS: Redirect[] = [ 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/', @@ -3072,7 +2943,7 @@ const USER_DOCS_REDIRECTS: Redirect[] = [ }, { from: '/clientdev/interfaces/http/', - to: 'https://develop.sentry.dev/sdk/foundation/data-model/event-payloads/request', + to: 'https://develop.sentry.dev/sdk/data-model/event-payloads/request', }, { from: '/clients/csharp/', @@ -4326,94 +4197,6 @@ const DEVELOPER_DOCS_REDIRECTS: Redirect[] = [ 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( 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" ] }