From c92cc9f3ff1c2a464ab43648acbc9728ed1edb72 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Thu, 27 Nov 2025 21:59:15 +0100 Subject: [PATCH 01/19] 1 --- examples/sentry/.gitignore | 6 + examples/sentry/README.md | 62 ++++ examples/sentry/package.json | 26 ++ examples/sentry/pages/+config.ts | 47 +++ examples/sentry/pages/index/+Page.tsx | 64 +++++ examples/sentry/server/index.ts | 13 + examples/sentry/tsconfig.json | 19 ++ examples/sentry/vite.config.ts | 11 + packages/vike-react-sentry/.gitignore | 2 + packages/vike-react-sentry/CHANGELOG.md | 6 + packages/vike-react-sentry/README.md | 269 ++++++++++++++++++ packages/vike-react-sentry/package.json | 73 +++++ .../src/integration/+config.ts | 74 +++++ .../src/integration/Head.tsx | 32 +++ .../src/integration/onCreateGlobalContext.ts | 63 ++++ .../src/integration/onError.ts | 12 + .../vike-react-sentry/src/plugin/index.ts | 46 +++ .../vike-react-sentry/src/utils/assert.ts | 8 + packages/vike-react-sentry/tsconfig.json | 21 ++ 19 files changed, 854 insertions(+) create mode 100644 examples/sentry/.gitignore create mode 100644 examples/sentry/README.md create mode 100644 examples/sentry/package.json create mode 100644 examples/sentry/pages/+config.ts create mode 100644 examples/sentry/pages/index/+Page.tsx create mode 100644 examples/sentry/server/index.ts create mode 100644 examples/sentry/tsconfig.json create mode 100644 examples/sentry/vite.config.ts create mode 100644 packages/vike-react-sentry/.gitignore create mode 100644 packages/vike-react-sentry/CHANGELOG.md create mode 100644 packages/vike-react-sentry/README.md create mode 100644 packages/vike-react-sentry/package.json create mode 100644 packages/vike-react-sentry/src/integration/+config.ts create mode 100644 packages/vike-react-sentry/src/integration/Head.tsx create mode 100644 packages/vike-react-sentry/src/integration/onCreateGlobalContext.ts create mode 100644 packages/vike-react-sentry/src/integration/onError.ts create mode 100644 packages/vike-react-sentry/src/plugin/index.ts create mode 100644 packages/vike-react-sentry/src/utils/assert.ts create mode 100644 packages/vike-react-sentry/tsconfig.json diff --git a/examples/sentry/.gitignore b/examples/sentry/.gitignore new file mode 100644 index 000000000..89b4b9a5c --- /dev/null +++ b/examples/sentry/.gitignore @@ -0,0 +1,6 @@ +dist/ +node_modules/ +.DS_Store +*.log +.env +.env.local diff --git a/examples/sentry/README.md b/examples/sentry/README.md new file mode 100644 index 000000000..a3c628d86 --- /dev/null +++ b/examples/sentry/README.md @@ -0,0 +1,62 @@ +# Vike + React + Sentry Example + +This example demonstrates how to integrate Sentry error tracking with a Vike + React application. + +## Features + +- ✅ Client-side error tracking +- ✅ Server-side error tracking +- ✅ Automatic error boundaries +- ✅ Distributed tracing (server → client) +- ✅ Source map uploads for production debugging + +## Setup + +1. Install dependencies: + +```bash +pnpm install +``` + +2. Configure Sentry DSN in `pages/+config.ts` + +3. Run development server: + +```bash +pnpm dev +``` + +4. Build for production: + +```bash +pnpm build +pnpm prod +``` + +## Configuration + +Edit `pages/+config.ts` to configure Sentry options: + +```typescript +sentry: { + dsn: 'YOUR_SENTRY_DSN', + environment: 'production', + client: { + // Client-specific options + }, + server: { + // Server-specific options + }, + vitePlugin: { + // Sourcemap upload options + org: 'your-org', + project: 'your-project', + authToken: process.env.SENTRY_AUTH_TOKEN + } +} +``` + +## Learn More + +- [Vike Documentation](https://vike.dev) +- [Sentry Documentation](https://docs.sentry.io) diff --git a/examples/sentry/package.json b/examples/sentry/package.json new file mode 100644 index 000000000..fcaf8866c --- /dev/null +++ b/examples/sentry/package.json @@ -0,0 +1,26 @@ +{ + "scripts": { + "dev": "vike dev", + "build": "vike build", + "prod": "vike build && node ./dist/server/index.mjs" + }, + "dependencies": { + "@photonjs/hono": "^0.1.7", + "@sentry/react": "^10.22.0", + "@sentry/node": "^10.22.0", + "@sentry/vite-plugin": "^4.6.0", + "@types/react": "^19.1.13", + "@types/react-dom": "^19.1.9", + "@vitejs/plugin-react": "^5.0.3", + "hono": "^4.7.14", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "typescript": "^5.9.2", + "vike": "^0.4.242", + "vike-photon": "^0.1.20", + "vike-react": "0.6.10", + "vike-react-sentry": "0.1.0", + "vite": "^7.1.7" + }, + "type": "module" +} diff --git a/examples/sentry/pages/+config.ts b/examples/sentry/pages/+config.ts new file mode 100644 index 000000000..9ff8d7da3 --- /dev/null +++ b/examples/sentry/pages/+config.ts @@ -0,0 +1,47 @@ +export { config } + +import type { Config } from 'vike/types' +import vikeReact from 'vike-react/config' +import vikePhoton from 'vike-photon/config' +import vikeReactSentry from 'vike-react-sentry/config' + +const config = { + title: 'Vike + React + Sentry Example', + + extends: [vikeReact, vikePhoton, vikeReactSentry], + + // Photon configuration + photon: { + server: 'server/index.ts' + }, + + // Sentry configuration + sentry: { + // ⚠️ Replace with your actual Sentry DSN + // Get it from: https://sentry.io/settings/[your-org]/projects/[your-project]/keys/ + dsn: 'https://8de66fe8dda3a86d986df8ee3aa09f72@o4510438936412161.ingest.de.sentry.io/4510438941655120', + + // Common options for both client and server + environment: process.env.NODE_ENV || 'development', + tracesSampleRate: 1.0, + + // Client-specific configuration (browser) + client: { + // You can add custom beforeSend, integrations, etc. + // These will override the defaults + }, + + // Server-specific configuration (Node.js) + server: { + // Server-specific options + }, + + // Vite plugin configuration for sourcemap uploads (optional) + // Uncomment and configure for production builds + // vitePlugin: { + // org: 'your-sentry-org', + // project: 'your-sentry-project', + // authToken: process.env.SENTRY_AUTH_TOKEN, + // } + } +} satisfies Config diff --git a/examples/sentry/pages/index/+Page.tsx b/examples/sentry/pages/index/+Page.tsx new file mode 100644 index 000000000..42e175dd8 --- /dev/null +++ b/examples/sentry/pages/index/+Page.tsx @@ -0,0 +1,64 @@ +export { Page } + +import { useState } from 'react' + +function Page() { + const [count, setCount] = useState(0) + + const throwError = () => { + throw new Error('This is a test error sent to Sentry!') + } + + const throwAsyncError = async () => { + await new Promise(resolve => setTimeout(resolve, 100)) + throw new Error('This is an async error sent to Sentry!') + } + + return ( +
+

Vike + React + Sentry Example

+ +

+ This example demonstrates Sentry error tracking integration with Vike. +

+ +
+

Counter: {count}

+ +
+ +
+

Test Error Tracking

+

Click these buttons to send test errors to Sentry:

+ +
+ + + +
+
+ +
+

Configuration

+

Edit pages/+config.ts to configure your Sentry DSN and options.

+
    +
  • Client-side errors are automatically captured
  • +
  • Server-side errors are automatically captured
  • +
  • Distributed tracing connects server and client errors
  • +
+
+
+ ) +} diff --git a/examples/sentry/server/index.ts b/examples/sentry/server/index.ts new file mode 100644 index 000000000..9a26080c3 --- /dev/null +++ b/examples/sentry/server/index.ts @@ -0,0 +1,13 @@ +import { Hono } from 'hono' +import { apply, serve } from '@photonjs/hono' + +function startServer() { + const app = new Hono() + + // Apply Vike and Vike extensions middleware + apply(app) + + return serve(app) +} + +export default startServer() diff --git a/examples/sentry/tsconfig.json b/examples/sentry/tsconfig.json new file mode 100644 index 000000000..6f6b091be --- /dev/null +++ b/examples/sentry/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "strict": true, + "module": "ES2020", + "moduleResolution": "bundler", + "target": "ES2020", + "lib": ["DOM", "DOM.Iterable", "ESNext"], + "types": ["vite/client"], + "jsx": "react", + "skipLibCheck": true, + "esModuleInterop": true + }, + "include": [ + "**/*", + // Include .test* files + // https://github.com/microsoft/TypeScript/issues/49555 + "**/.*" + ] +} diff --git a/examples/sentry/vite.config.ts b/examples/sentry/vite.config.ts new file mode 100644 index 000000000..1a725dce7 --- /dev/null +++ b/examples/sentry/vite.config.ts @@ -0,0 +1,11 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react' +import vike from 'vike/plugin' + + +export default defineConfig({ + plugins: [ + react(), + vike(), + ] +}) diff --git a/packages/vike-react-sentry/.gitignore b/packages/vike-react-sentry/.gitignore new file mode 100644 index 000000000..b0a5c349c --- /dev/null +++ b/packages/vike-react-sentry/.gitignore @@ -0,0 +1,2 @@ +/node_modules/ +/dist/ diff --git a/packages/vike-react-sentry/CHANGELOG.md b/packages/vike-react-sentry/CHANGELOG.md new file mode 100644 index 000000000..c8d9314c4 --- /dev/null +++ b/packages/vike-react-sentry/CHANGELOG.md @@ -0,0 +1,6 @@ +# Changelog + +## 0.1.0 + +Initial release. + diff --git a/packages/vike-react-sentry/README.md b/packages/vike-react-sentry/README.md new file mode 100644 index 000000000..980a8535c --- /dev/null +++ b/packages/vike-react-sentry/README.md @@ -0,0 +1,269 @@ +# vike-react-sentry + +Full-featured Sentry integration for `vike-react`. + +[Installation](#installation) +[Configuration](#configuration) +[Features](#features) + +## Installation + +1. Install dependencies: + ```bash + pnpm add @sentry/react @sentry/node @sentry/vite-plugin vike-react-sentry + ``` + +2. Extend `+config.js`: + ```js + // pages/+config.js + + import vikeReact from 'vike-react/config' + import vikeReactSentry from 'vike-react-sentry/config' + + export default { + extends: [vikeReact, vikeReactSentry] + } + ``` + +3. Configure Sentry in `+sentry.js` (or in `+config.js`): + ```js + // pages/+sentry.js + + export default { + // Common options (applied to both client and server) + dsn: 'your-sentry-dsn', + environment: import.meta.env.MODE, + tracesSampleRate: 1.0, + + // Client-specific options + client: { + // Optional: Configure which domains should receive trace headers + tracePropagationTargets: ['localhost', /^https:\/\/yourapi\.com/], + }, + + // Server-specific options (optional) + server: { + // Add server-specific overrides here if needed + } + } + ``` + +That's it! Distributed tracing, error monitoring, and sourcemap upload are all configured automatically. + +### Common Options + +You can specify common options at the root level that will be applied to both client and server: + +- `dsn` - Sentry DSN (Data Source Name) +- `environment` - Environment name (e.g., 'production', 'development') +- `release` - Release version identifier +- `debug` - Enable debug mode +- `sampleRate` - Sample rate for error events (0.0 to 1.0) +- `tracesSampleRate` - Sample rate for performance tracing (0.0 to 1.0) +- `enabled` - Enable or disable Sentry +- `maxBreadcrumbs` - Maximum number of breadcrumbs +- `sendDefaultPii` - Send default PII (Personally Identifiable Information) + +Client and server specific options will override common options. + +## Configuration + +### `sentry.client` + +Client-side (browser) Sentry configuration. Can be an object or a function that receives `pageContext`: + +```js +// Static configuration +export default { + sentry: { + client: { + dsn: 'your-sentry-dsn', + environment: 'production', + tracesSampleRate: 1.0, + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1.0, + } + } +} + +// Dynamic configuration +export default { + sentry: { + client: (pageContext) => ({ + dsn: 'your-sentry-dsn', + environment: pageContext.config.environment, + user: pageContext.user, + }) + } +} +``` + +See [Sentry React documentation](https://docs.sentry.io/platforms/javascript/guides/react/configuration/options/) for all available options. + +### `sentry.server` + +Server-side (Node.js) Sentry configuration. Can be an object or a function that receives `pageContext`: + +```js +export default { + sentry: { + server: { + dsn: 'your-sentry-dsn', + environment: 'production', + tracesSampleRate: 1.0, + } + } +} +``` + +See [Sentry Node.js documentation](https://docs.sentry.io/platforms/javascript/guides/node/configuration/options/) for all available options. + +### Vite Plugin (Sourcemap Upload) + +The Sentry Vite plugin handles automatic sourcemap upload during build. Configure it in your `+sentry.js` or `+config.js`: + +```js +// pages/+sentry.js + +export default { + client: { + dsn: 'your-sentry-dsn', + environment: import.meta.env.MODE, + }, + server: { + dsn: 'your-sentry-dsn', + environment: import.meta.env.MODE, + }, + vitePlugin: { + org: 'your-org', + project: 'your-project', + authToken: process.env.SENTRY_AUTH_TOKEN, + // Optional: additional configuration + sourcemaps: { + assets: './dist/**', + }, + } +} +``` + +The Vite plugin is **automatically added** when you configure `sentry.vitePlugin` in your Sentry config. The plugin reads the configuration from your `+sentry.js` or `+config.js` file, so you don't need to manually add it to `vite.config.js`. + +See [Sentry Vite Plugin documentation](https://docs.sentry.io/platforms/javascript/sourcemaps/uploading/vite/) for all available options. + +## Distributed Tracing + +This extension **automatically enables distributed tracing** between client and server out of the box! No additional configuration required. + +### How It Works + +1. **Client → Server**: When the client makes HTTP requests, trace headers (`sentry-trace` and `baggage`) are automatically attached +2. **Server Processing**: The middleware extracts these headers and continues the trace on the server +3. **Server → Client**: The server injects trace meta tags into the HTML, allowing the client to continue the trace after hydration + +The `browserTracingIntegration()` is **enabled by default**, so distributed tracing works immediately after installation. + +### Optional Configuration + +You can customize trace propagation targets to control which domains receive trace headers: + +```js +// pages/+sentry.js +export default { + client: { + dsn: 'your-sentry-dsn', + tracesSampleRate: 1.0, + // Optional: Configure which domains should receive trace headers + // By default, traces are sent to same-origin requests + tracePropagationTargets: [ + 'localhost', + /^https:\/\/yourapi\.com/, + /^https:\/\/yourdomain\.com/, + ], + }, + server: { + dsn: 'your-sentry-dsn', + tracesSampleRate: 1.0, + } +} +``` + +### Custom Integrations + +If you need to customize integrations, set `integrations` to an empty array in your config to disable defaults, then configure them in a separate `+integrations.client.ts` file: + +```js +// pages/+sentry.js +export default { + client: { + dsn: 'your-sentry-dsn', + integrations: [], // Disable default integrations + } +} +``` + +```ts +// pages/+integrations.client.ts +import * as Sentry from '@sentry/react' + +// Configure custom integrations +Sentry.getClient()?.addIntegration(Sentry.browserTracingIntegration()) +Sentry.getClient()?.addIntegration(Sentry.replayIntegration()) +``` + +> **Note**: The default `browserTracingIntegration()` is only added if you don't specify `integrations` in your config. If you set `integrations` (even to an empty array), you're responsible for adding all integrations you need. + +**Important**: Make sure your server allows the `sentry-trace` and `baggage` headers in CORS configuration if your client and server are on different domains. + +## Features + +- **Distributed Tracing**: Automatic trace propagation between client and server (enabled by default) +- **Browser Tracing**: `browserTracingIntegration()` enabled by default for performance monitoring +- Early client-side initialization (before React renders) +- Client-side error monitoring with React Error Boundary +- Server-side error monitoring with onError hook +- Automatic request isolation +- Automatic sourcemap upload during build +- Request context tracking on the server +- Support for both static and dynamic configuration +- TypeScript support +- Zero-config setup - works out of the box + +## How It Works + +### Client-Side + +1. **Early Initialization**: Sentry is initialized at the **top level** of the `+client.ts` module, **before any React code runs**, ensuring all errors are captured from the very beginning. The configuration is exposed via a virtual module that reads from your `+sentry.js` config. +2. **Error Boundary**: The `Wrapper` component wraps your app with `Sentry.ErrorBoundary` to catch React component errors +3. **Static Configuration Only**: Client-side initialization only supports static configuration objects. Dynamic configuration (functions) is not supported for early initialization since `pageContext` is not available at module load time. + +### Server-Side + +1. **Global Initialization**: Sentry is initialized once when the server starts via the `onCreateGlobalContext` hook +2. **Trace Extraction**: Middleware extracts `sentry-trace` and `baggage` headers from incoming requests +3. **Trace Continuation**: Uses `Sentry.continueTrace()` to continue distributed traces from the client +4. **Trace Injection**: The `Head` component injects trace meta tags into HTML for client-side continuation +5. **Error Handling**: The `onError` hook captures all server-side errors and sends them to Sentry +6. **Request Context**: Middleware adds request information (URL, method, headers) to each error report +7. **Request Isolation**: Sentry SDK v10+ automatically isolates error contexts per request + +### Session Management + +Sentry maintains **separate sessions** for client and server: + +- **Server-side**: One Sentry instance per server process, with automatic request isolation +- **Client-side**: One Sentry instance per browser session +- **Linking**: Errors from both environments are sent to the same Sentry project (using the same DSN), allowing distributed tracing and full visibility + +### Distributed Tracing Flow + +1. **Initial Page Load**: Server starts a new trace and injects it into HTML via `` tags +2. **Client Hydration**: Client SDK automatically reads the meta tags and continues the server's trace +3. **Client Navigation**: Client starts new traces for each navigation +4. **API Requests**: Client automatically attaches trace headers to requests matching `tracePropagationTargets` +5. **Server Processing**: Server middleware extracts headers and continues the trace +6. **End-to-End Visibility**: View the complete request flow in Sentry's Performance monitoring + +### Request Isolation + +The middleware adds request context (URL, method, headers) to each server-side request's Sentry scope. Sentry SDK v10+ automatically creates isolated scopes per request, so this context doesn't leak between concurrent requests. + diff --git a/packages/vike-react-sentry/package.json b/packages/vike-react-sentry/package.json new file mode 100644 index 000000000..4953d68bd --- /dev/null +++ b/packages/vike-react-sentry/package.json @@ -0,0 +1,73 @@ +{ + "name": "vike-react-sentry", + "version": "0.1.0", + "homepage": "https://github.com/vikejs/vike-react/tree/main/packages/vike-react-sentry#readme", + "type": "module", + "exports": { + "./config": "./dist/integration/+config.js", + "./plugin": "./dist/plugin/index.js", + "./__internal/integration/Head": "./dist/integration/Head.js", + "./__internal/integration/onCreateGlobalContext": "./dist/integration/onCreateGlobalContext.js", + "./__internal/integration/client": "./dist/integration/client.js", + "./__internal/integration/onError": "./dist/integration/onError.js" + }, + "scripts": { + "dev": "tsc --watch", + "build": "rimraf dist/ && tsc", + "release": "release-me patch", + "release:minor": "release-me minor", + "release:commit": "release-me commit" + }, + "peerDependencies": { + "@sentry/react": ">=10.0.0", + "@sentry/node": ">=10.0.0", + "@sentry/vite-plugin": ">=4.0.0", + "react": ">=18.0.0", + "react-dom": ">=18.0.0", + "vike-react": ">=0.6.4" + }, + "devDependencies": { + "@brillout/release-me": "^0.4.8", + "@sentry/react": "^10.22.0", + "@sentry/node": "^10.22.0", + "@sentry/vite-plugin": "^4.6.0", + "@types/node": "^24.0.8", + "@types/react": "^19.1.13", + "@types/react-dom": "^19.1.9", + "@universal-middleware/core": "^0.4.13", + "react": "^19.2.0", + "react-dom": "^19.2.0", + "rimraf": "^5.0.5", + "typescript": "^5.9.2", + "vike": "^0.4.242", + "vike-react": "0.6.10", + "vite": "^7.1.7" + }, + "dependencies": { + "@universal-middleware/core": "^0.4.13" + }, + "typesVersions": { + "*": { + "config": [ + "dist/integration/+config.d.ts" + ], + "plugin": [ + "dist/plugin/index.d.ts" + ], + "__internal/integration/onCreateGlobalContext": [ + "dist/integration/onCreateGlobalContext.d.ts" + ], + "__internal/integration/client": [ + "dist/integration/client.d.ts" + ], + "__internal/integration/onError": [ + "dist/integration/onError.d.ts" + ] + } + }, + "files": [ + "dist" + ], + "license": "MIT" +} + diff --git a/packages/vike-react-sentry/src/integration/+config.ts b/packages/vike-react-sentry/src/integration/+config.ts new file mode 100644 index 000000000..ae78a8f7a --- /dev/null +++ b/packages/vike-react-sentry/src/integration/+config.ts @@ -0,0 +1,74 @@ +export { config as default } + +import type { Config } from 'vike/types' +import type * as SentryReact from '@sentry/react' +import type * as SentryNode from '@sentry/node' +import type { SentryVitePluginOptions } from '@sentry/vite-plugin' +import { vikeReactSentry} from '../plugin/index.js' + +import 'vike-react/config' + +const config = { + name: 'vike-react-sentry', + require: { + 'vike-react': '>=0.6.4', + }, + Head: 'import:vike-react-sentry/__internal/integration/Head:Head', + onCreateGlobalContext: 'import:vike-react-sentry/__internal/integration/onCreateGlobalContext:onCreateGlobalContext', + onError: 'import:vike-react-sentry/__internal/integration/onError:onError', + meta: { + sentry: { + env: { + server: true, + client: true, + config: true, + }, + global: true + }, + }, + vite: { + plugins: [vikeReactSentry()], + }, +} satisfies Config + +export interface SentryCommonOptions { + /** Sentry DSN (Data Source Name) */ + dsn?: string + /** Environment name (e.g., 'production', 'development') */ + environment?: string + /** Release version identifier */ + release?: string + /** Enable debug mode */ + debug?: boolean + /** Sample rate for error events (0.0 to 1.0) */ + sampleRate?: number + /** Sample rate for performance tracing (0.0 to 1.0) */ + tracesSampleRate?: number + /** Enable or disable Sentry */ + enabled?: boolean + /** Maximum number of breadcrumbs */ + maxBreadcrumbs?: number + /** Send default PII (Personally Identifiable Information) */ + sendDefaultPii?: boolean +} + +export interface SentryConfig extends SentryCommonOptions { + /** Sentry configuration for the client (browser) */ + client?: SentryReact.BrowserOptions + + /** Sentry configuration for the server (Node.js) */ + server?: SentryNode.NodeOptions + + /** Sentry Vite plugin configuration for sourcemap upload */ + vitePlugin?: SentryVitePluginOptions +} + +declare global { + namespace Vike { + interface Config { + /** Sentry configuration for client, server, and build-time */ + sentry?: SentryConfig + } + } +} + diff --git a/packages/vike-react-sentry/src/integration/Head.tsx b/packages/vike-react-sentry/src/integration/Head.tsx new file mode 100644 index 000000000..f862cb0e4 --- /dev/null +++ b/packages/vike-react-sentry/src/integration/Head.tsx @@ -0,0 +1,32 @@ +export { Head } + +import React from 'react' +import * as Sentry from '@sentry/node' + +// Inject Sentry trace meta tags into the HTML head for distributed tracing +// This allows the client-side SDK to continue the trace started on the server +function Head() { + // Only inject trace data if Sentry is initialized + if (!Sentry.getClient()) { + return null + } + + // Get trace data from Sentry + const traceData = Sentry.getTraceData() + + // Return the meta tags as proper React elements + // Fields may include: + // - sentry-trace: Sentry's proprietary trace header + // - baggage: Dynamic sampling context + // - traceparent: W3C Trace Context header (only if propagateTraceparent is enabled) + return ( + <> + {traceData['sentry-trace'] && ( + + )} + {traceData.baggage && } + {traceData.traceparent && } + + ) +} + diff --git a/packages/vike-react-sentry/src/integration/onCreateGlobalContext.ts b/packages/vike-react-sentry/src/integration/onCreateGlobalContext.ts new file mode 100644 index 000000000..cce20a877 --- /dev/null +++ b/packages/vike-react-sentry/src/integration/onCreateGlobalContext.ts @@ -0,0 +1,63 @@ +export { onCreateGlobalContext } + +import * as SentryNode from '@sentry/node' +import * as SentryReact from '@sentry/react' +import type { ErrorEvent, EventHint } from '@sentry/react' +import type { PageContext } from 'vike/types' + +async function onCreateGlobalContext(globalContext: { config: PageContext['config'] }): Promise { + const sentryConfig = globalContext.config.sentry + + if (!sentryConfig) return + + if (import.meta.env.SSR) { + // Server-side initialization + if (sentryConfig.server && !SentryNode.getClient()) { + const { client, vitePlugin, server, ...commonOptions } = sentryConfig + + const finalConfig = { + ...commonOptions, + ...server, // User overrides (including functions!) + } + + // This has to run before server entry is imported + // https://docs.sentry.io/platforms/javascript/guides/node/install/esm-without-import/ + SentryNode.init(finalConfig) + } + } else { + // Client-side initialization + if (sentryConfig.client && !SentryReact.getClient()) { + const { client, vitePlugin, server, ...commonOptions } = sentryConfig + + const finalConfig = { + ...commonOptions, + // Default integrations if not provided + integrations: [SentryReact.browserTracingIntegration()], + // Default beforeSend to filter out Sentry's own errors + beforeSend: (event: ErrorEvent, hint: EventHint) => { + if ( + hint.originalException && + typeof hint.originalException === 'object' && + 'message' in hint.originalException + ) { + const message = String(hint.originalException.message).toLowerCase() + if ( + message.includes('sentry') || + message.includes('ingest.us.sentry.io') || + (message.includes('failed to fetch') && event.request?.url?.includes('sentry.io')) + ) { + return null + } + } + if (event.request?.url?.includes('sentry.io') || event.request?.url?.includes('ingest.us.sentry.io')) { + return null + } + return event + }, + ...client, // User overrides (including functions!) + } + + SentryReact.init(finalConfig) + } + } +} diff --git a/packages/vike-react-sentry/src/integration/onError.ts b/packages/vike-react-sentry/src/integration/onError.ts new file mode 100644 index 000000000..ab55cc1de --- /dev/null +++ b/packages/vike-react-sentry/src/integration/onError.ts @@ -0,0 +1,12 @@ +export { onError } + +import * as Sentry from '@sentry/node' + +// Handle errors on the server side +function onError(error: unknown): void { + // Only capture if Sentry is initialized + if (Sentry.getClient()) { + Sentry.captureException(error) + } +} + diff --git a/packages/vike-react-sentry/src/plugin/index.ts b/packages/vike-react-sentry/src/plugin/index.ts new file mode 100644 index 000000000..b05763a16 --- /dev/null +++ b/packages/vike-react-sentry/src/plugin/index.ts @@ -0,0 +1,46 @@ +export { vikeReactSentry } + +import { sentryVitePlugin } from '@sentry/vite-plugin' +import type { SentryVitePluginOptions } from '@sentry/vite-plugin' +import { getVikeConfig } from 'vike/plugin' +import type { Plugin } from 'vite' +import type { SentryConfig } from '../integration/+config.js' + +// Return `PluginInterop` instead of `Plugin` to avoid type mismatch upon different Vite versions +const vikeReactSentry = async () => { + const plugins: Plugin[] = [] + + // Wait for vike config to be available + await new Promise((resolve) => setTimeout(resolve, 100)) + + // Get sentry config from vike config + const vikeConfig = getVikeConfig({}) + const sentryConfig = vikeConfig.config.sentry as SentryConfig | undefined + + // Extract common options and vitePlugin config + const { client, server, vitePlugin, ...commonOptions } = sentryConfig || {} + + // Merge common options (like release) into vitePlugin config + // VitePlugin uses: release (nested as release.name), org, project, authToken, url, debug + let vitePluginOptions = vitePlugin + + if (vitePluginOptions && commonOptions.release) { + vitePluginOptions = { + ...vitePluginOptions, + release: { + name: commonOptions.release, + ...vitePluginOptions.release, + }, + } + } + + // Add Sentry Vite plugin if options are provided + // This handles sourcemap upload during build + // sentryVitePlugin returns an array of plugins + if (vitePluginOptions) { + const sentryPlugins = sentryVitePlugin(vitePluginOptions) + plugins.push(...sentryPlugins) + } + + return plugins +} diff --git a/packages/vike-react-sentry/src/utils/assert.ts b/packages/vike-react-sentry/src/utils/assert.ts new file mode 100644 index 000000000..405c0e2fb --- /dev/null +++ b/packages/vike-react-sentry/src/utils/assert.ts @@ -0,0 +1,8 @@ +export { assertUsage } + +function assertUsage(condition: unknown, message: string): asserts condition { + if (!condition) { + throw new Error(`[vike-react-sentry] ${message}`) + } +} + diff --git a/packages/vike-react-sentry/tsconfig.json b/packages/vike-react-sentry/tsconfig.json new file mode 100644 index 000000000..d10460e03 --- /dev/null +++ b/packages/vike-react-sentry/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compilerOptions": { + "outDir": "./dist/", + "target": "ES2020", + "module": "Node16", + "moduleResolution": "Node16", + "lib": ["ES2021", "DOM", "DOM.Iterable"], + "types": ["vite/client"], + "strict": true, + "noUncheckedIndexedAccess": true, + "noImplicitAny": true, + "declaration": true, + "noEmitOnError": false, + "rootDir": "./src/", + "esModuleInterop": true, + "skipLibCheck": true, + "jsx": "react" + }, + "include": ["./src"] +} + From 0e40b1527d05239b459aeb824710ad7c66661b32 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Thu, 27 Nov 2025 22:40:41 +0100 Subject: [PATCH 02/19] Refactor code structure for improved readability and maintainability --- examples/sentry/package.json | 2 +- packages/vike-react-query/package.json | 2 +- packages/vike-react-sentry/package.json | 8 +- .../onCreateGlobalContext-client.ts | 20 + .../onCreateGlobalContext-server.ts | 21 + .../src/integration/onCreateGlobalContext.ts | 63 - .../vike-react-sentry/src/plugin/index.ts | 12 +- packages/vike-react-zustand/package.json | 2 +- packages/vike-react/package.json | 2 +- pnpm-lock.yaml | 1970 ++++++++++++++++- 10 files changed, 2020 insertions(+), 82 deletions(-) create mode 100644 packages/vike-react-sentry/src/integration/onCreateGlobalContext-client.ts create mode 100644 packages/vike-react-sentry/src/integration/onCreateGlobalContext-server.ts delete mode 100644 packages/vike-react-sentry/src/integration/onCreateGlobalContext.ts diff --git a/examples/sentry/package.json b/examples/sentry/package.json index fcaf8866c..b5fcf7372 100644 --- a/examples/sentry/package.json +++ b/examples/sentry/package.json @@ -16,7 +16,7 @@ "react": "^19.2.0", "react-dom": "^19.2.0", "typescript": "^5.9.2", - "vike": "^0.4.242", + "vike": "^0.4.247", "vike-photon": "^0.1.20", "vike-react": "0.6.10", "vike-react-sentry": "0.1.0", diff --git a/packages/vike-react-query/package.json b/packages/vike-react-query/package.json index 27a137360..2de2be5da 100644 --- a/packages/vike-react-query/package.json +++ b/packages/vike-react-query/package.json @@ -23,7 +23,7 @@ "@tanstack/react-query": ">=5.0.0", "react": ">=18.0.0", "react-streaming": ">=0.4.6", - "vike": ">=0.4.242", + "vike": ">=0.4.247", "vike-react": ">=0.6.8" }, "devDependencies": { diff --git a/packages/vike-react-sentry/package.json b/packages/vike-react-sentry/package.json index 4953d68bd..80fde0ce7 100644 --- a/packages/vike-react-sentry/package.json +++ b/packages/vike-react-sentry/package.json @@ -7,7 +7,10 @@ "./config": "./dist/integration/+config.js", "./plugin": "./dist/plugin/index.js", "./__internal/integration/Head": "./dist/integration/Head.js", - "./__internal/integration/onCreateGlobalContext": "./dist/integration/onCreateGlobalContext.js", + "./__internal/integration/onCreateGlobalContext": { + "browser": "./dist/integration/onCreateGlobalContext-client.js", + "default": "./dist/integration/onCreateGlobalContext-server.js" + }, "./__internal/integration/client": "./dist/integration/client.js", "./__internal/integration/onError": "./dist/integration/onError.js" }, @@ -39,7 +42,7 @@ "react-dom": "^19.2.0", "rimraf": "^5.0.5", "typescript": "^5.9.2", - "vike": "^0.4.242", + "vike": "^0.4.247", "vike-react": "0.6.10", "vite": "^7.1.7" }, @@ -70,4 +73,3 @@ ], "license": "MIT" } - diff --git a/packages/vike-react-sentry/src/integration/onCreateGlobalContext-client.ts b/packages/vike-react-sentry/src/integration/onCreateGlobalContext-client.ts new file mode 100644 index 000000000..c3a88d5a0 --- /dev/null +++ b/packages/vike-react-sentry/src/integration/onCreateGlobalContext-client.ts @@ -0,0 +1,20 @@ +export { onCreateGlobalContext } + +import * as SentryReact from '@sentry/react' +import type { PageContext } from 'vike/types' + +async function onCreateGlobalContext(globalContext: { config: PageContext['config'] }): Promise { + const sentryConfig = globalContext.config.sentry + if (!sentryConfig) return + if (sentryConfig.client && !SentryReact.getClient()) { + const { client, vitePlugin, server, ...commonOptions } = sentryConfig + + const finalConfig = { + ...commonOptions, + integrations: [SentryReact.browserTracingIntegration()], + ...client, + } + + SentryReact.init(finalConfig) + } +} diff --git a/packages/vike-react-sentry/src/integration/onCreateGlobalContext-server.ts b/packages/vike-react-sentry/src/integration/onCreateGlobalContext-server.ts new file mode 100644 index 000000000..2da6a5ffe --- /dev/null +++ b/packages/vike-react-sentry/src/integration/onCreateGlobalContext-server.ts @@ -0,0 +1,21 @@ +export { onCreateGlobalContext } + +import * as SentryNode from '@sentry/node' +import type { PageContext } from 'vike/types' + +async function onCreateGlobalContext(globalContext: { config: PageContext['config'] }): Promise { + const sentryConfig = globalContext.config.sentry + if (!sentryConfig) return + if (sentryConfig.server && !SentryNode.getClient()) { + const { client, vitePlugin, server, ...commonOptions } = sentryConfig + + const finalConfig = { + ...commonOptions, + ...server, + } + + // This has to run before server entry is imported + // https://docs.sentry.io/platforms/javascript/guides/node/install/esm-without-import/ + SentryNode.init(finalConfig) + } +} diff --git a/packages/vike-react-sentry/src/integration/onCreateGlobalContext.ts b/packages/vike-react-sentry/src/integration/onCreateGlobalContext.ts deleted file mode 100644 index cce20a877..000000000 --- a/packages/vike-react-sentry/src/integration/onCreateGlobalContext.ts +++ /dev/null @@ -1,63 +0,0 @@ -export { onCreateGlobalContext } - -import * as SentryNode from '@sentry/node' -import * as SentryReact from '@sentry/react' -import type { ErrorEvent, EventHint } from '@sentry/react' -import type { PageContext } from 'vike/types' - -async function onCreateGlobalContext(globalContext: { config: PageContext['config'] }): Promise { - const sentryConfig = globalContext.config.sentry - - if (!sentryConfig) return - - if (import.meta.env.SSR) { - // Server-side initialization - if (sentryConfig.server && !SentryNode.getClient()) { - const { client, vitePlugin, server, ...commonOptions } = sentryConfig - - const finalConfig = { - ...commonOptions, - ...server, // User overrides (including functions!) - } - - // This has to run before server entry is imported - // https://docs.sentry.io/platforms/javascript/guides/node/install/esm-without-import/ - SentryNode.init(finalConfig) - } - } else { - // Client-side initialization - if (sentryConfig.client && !SentryReact.getClient()) { - const { client, vitePlugin, server, ...commonOptions } = sentryConfig - - const finalConfig = { - ...commonOptions, - // Default integrations if not provided - integrations: [SentryReact.browserTracingIntegration()], - // Default beforeSend to filter out Sentry's own errors - beforeSend: (event: ErrorEvent, hint: EventHint) => { - if ( - hint.originalException && - typeof hint.originalException === 'object' && - 'message' in hint.originalException - ) { - const message = String(hint.originalException.message).toLowerCase() - if ( - message.includes('sentry') || - message.includes('ingest.us.sentry.io') || - (message.includes('failed to fetch') && event.request?.url?.includes('sentry.io')) - ) { - return null - } - } - if (event.request?.url?.includes('sentry.io') || event.request?.url?.includes('ingest.us.sentry.io')) { - return null - } - return event - }, - ...client, // User overrides (including functions!) - } - - SentryReact.init(finalConfig) - } - } -} diff --git a/packages/vike-react-sentry/src/plugin/index.ts b/packages/vike-react-sentry/src/plugin/index.ts index b05763a16..2f5916a11 100644 --- a/packages/vike-react-sentry/src/plugin/index.ts +++ b/packages/vike-react-sentry/src/plugin/index.ts @@ -1,7 +1,6 @@ export { vikeReactSentry } import { sentryVitePlugin } from '@sentry/vite-plugin' -import type { SentryVitePluginOptions } from '@sentry/vite-plugin' import { getVikeConfig } from 'vike/plugin' import type { Plugin } from 'vite' import type { SentryConfig } from '../integration/+config.js' @@ -14,16 +13,12 @@ const vikeReactSentry = async () => { await new Promise((resolve) => setTimeout(resolve, 100)) // Get sentry config from vike config - const vikeConfig = getVikeConfig({}) + const vikeConfig = getVikeConfig() const sentryConfig = vikeConfig.config.sentry as SentryConfig | undefined - // Extract common options and vitePlugin config const { client, server, vitePlugin, ...commonOptions } = sentryConfig || {} - - // Merge common options (like release) into vitePlugin config - // VitePlugin uses: release (nested as release.name), org, project, authToken, url, debug let vitePluginOptions = vitePlugin - + if (vitePluginOptions && commonOptions.release) { vitePluginOptions = { ...vitePluginOptions, @@ -34,9 +29,6 @@ const vikeReactSentry = async () => { } } - // Add Sentry Vite plugin if options are provided - // This handles sourcemap upload during build - // sentryVitePlugin returns an array of plugins if (vitePluginOptions) { const sentryPlugins = sentryVitePlugin(vitePluginOptions) plugins.push(...sentryPlugins) diff --git a/packages/vike-react-zustand/package.json b/packages/vike-react-zustand/package.json index 4d54a5304..7e8fe8504 100644 --- a/packages/vike-react-zustand/package.json +++ b/packages/vike-react-zustand/package.json @@ -20,7 +20,7 @@ "react": ">=18.0.0", "react-dom": ">=18.0.0", "react-streaming": ">=0.3.42", - "vike": ">=0.4.242", + "vike": ">=0.4.247", "vike-react": ">=0.4.13", "zustand": ">=5.0.0" }, diff --git a/packages/vike-react/package.json b/packages/vike-react/package.json index 9f6a573fa..27ec0d1d4 100644 --- a/packages/vike-react/package.json +++ b/packages/vike-react/package.json @@ -32,7 +32,7 @@ "peerDependencies": { "react": ">=19", "react-dom": ">=19", - "vike": ">=0.4.242" + "vike": ">=0.4.247" }, "scripts": { "dev": "tsc --watch", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b24565bd5..091877a9b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -198,6 +198,57 @@ importers: specifier: ^7.1.7 version: 7.2.6(@types/node@24.0.8) + examples/sentry: + dependencies: + '@photonjs/hono': + specifier: ^0.1.7 + version: 0.1.7(hono@4.10.7)(srvx@0.9.6)(vite@7.2.6(@types/node@24.0.8)) + '@sentry/node': + specifier: ^10.22.0 + version: 10.27.0 + '@sentry/react': + specifier: ^10.22.0 + version: 10.27.0(react@19.2.1) + '@sentry/vite-plugin': + specifier: ^4.6.0 + version: 4.6.1 + '@types/react': + specifier: ^19.1.13 + version: 19.2.7 + '@types/react-dom': + specifier: ^19.1.9 + version: 19.2.3(@types/react@19.2.7) + '@vitejs/plugin-react': + specifier: ^5.0.3 + version: 5.1.1(vite@7.2.6(@types/node@24.0.8)) + hono: + specifier: ^4.7.14 + version: 4.10.7 + react: + specifier: ^19.2.0 + version: 19.2.1 + react-dom: + specifier: ^19.2.0 + version: 19.2.1(react@19.2.1) + typescript: + specifier: ^5.9.2 + version: 5.9.3 + vike: + specifier: ^0.4.247 + version: 0.4.249(react-streaming@0.4.14(react@19.2.1))(vite@7.2.6) + vike-photon: + specifier: ^0.1.20 + version: 0.1.23(@photonjs/core@0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.2.6(@types/node@24.0.8)))(@photonjs/runtime@0.1.10(hono@4.10.7)(rollup@4.46.2)(vite@7.2.6(@types/node@24.0.8)))(hono@4.10.7)(rollup@4.46.2)(srvx@0.9.6)(vike@0.4.249(react-streaming@0.4.14(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.2.6(@types/node@24.0.8)))(vite@7.2.6(@types/node@24.0.8)) + vike-react: + specifier: 0.6.10 + version: 0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.249(react-streaming@0.4.14(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.2.6(@types/node@24.0.8))) + vike-react-sentry: + specifier: 0.1.0 + version: link:../../packages/vike-react-sentry + vite: + specifier: ^7.1.7 + version: 7.2.6(@types/node@24.0.8) + examples/zustand: dependencies: '@types/react': @@ -478,6 +529,55 @@ importers: specifier: 0.6.14 version: link:../vike-react + packages/vike-react-sentry: + dependencies: + '@universal-middleware/core': + specifier: ^0.4.13 + version: 0.4.13(hono@4.10.7)(srvx@0.9.6) + devDependencies: + '@brillout/release-me': + specifier: ^0.4.8 + version: 0.4.11(conventional-commits-filter@5.0.0) + '@sentry/node': + specifier: ^10.22.0 + version: 10.27.0 + '@sentry/react': + specifier: ^10.22.0 + version: 10.27.0(react@19.2.1) + '@sentry/vite-plugin': + specifier: ^4.6.0 + version: 4.6.1 + '@types/node': + specifier: ^24.0.8 + version: 24.0.8 + '@types/react': + specifier: ^19.1.13 + version: 19.2.7 + '@types/react-dom': + specifier: ^19.1.9 + version: 19.2.3(@types/react@19.2.7) + react: + specifier: ^19.2.0 + version: 19.2.1 + react-dom: + specifier: ^19.2.0 + version: 19.2.1(react@19.2.1) + rimraf: + specifier: ^5.0.5 + version: 5.0.10 + typescript: + specifier: ^5.9.2 + version: 5.9.3 + vike: + specifier: ^0.4.247 + version: 0.4.249(react-streaming@0.4.14(react@19.2.1))(vite@7.2.6) + vike-react: + specifier: 0.6.10 + version: 0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.249(react-streaming@0.4.14(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.2.6(@types/node@24.0.8))) + vite: + specifier: ^7.1.7 + version: 7.2.6(@types/node@24.0.8) + packages/vike-react-styled-components: devDependencies: '@brillout/release-me': @@ -629,6 +729,12 @@ packages: peerDependencies: react: '>=16.9.0' + '@apm-js-collab/code-transformer@0.8.2': + resolution: {integrity: sha512-YRjJjNq5KFSjDUoqu5pFUWrrsvGOxl6c3bu+uMFc9HNNptZ2rNU/TI2nLw4jnhQNtka972Ee2m3uqbvDQtPeCA==} + + '@apm-js-collab/tracing-hooks@0.3.1': + resolution: {integrity: sha512-Vu1CbmPURlN5fTboVuKMoJjbO5qcq9fA5YXpskx3dXe/zTBvjODFoerw+69rVBlRLrJpwPqSDqEuJDEKIrTldw==} + '@apollo/client-react-streaming@0.11.11': resolution: {integrity: sha512-h7u/D5GDq5mn2BXaWBiK9z+i90mzmBCnOeRt4Iarc1qwTt40Q4u2yEXPw8ma1BywZ2uLJyVuAb6EyA605eqeEQ==} peerDependencies: @@ -883,6 +989,15 @@ packages: resolution: {integrity: sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==} engines: {node: '>=18'} + '@emnapi/core@1.7.1': + resolution: {integrity: sha512-o1uhUASyo921r2XtHYOHy7gdkGLge8ghBEQHMWmyJFoXlpU58kIrhhN3w26lpQb6dspetweapMn2CSNwQ8I4wg==} + + '@emnapi/runtime@1.7.1': + resolution: {integrity: sha512-PVtJr5CmLwYAU9PZDMITZoR5iAOShYREoR45EyyLrbntV50mdePTgUn4AmOw90Ifcj+x2kRjdzr1HP3RrNiHGA==} + + '@emnapi/wasi-threads@1.1.0': + resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} + '@emotion/babel-plugin@11.13.5': resolution: {integrity: sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==} @@ -1260,6 +1375,10 @@ packages: resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} @@ -1273,9 +1392,20 @@ packages: '@jridgewell/sourcemap-codec@1.5.0': resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==} + '@jridgewell/sourcemap-codec@1.5.5': + resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} + '@jridgewell/trace-mapping@0.3.30': resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} + '@mapbox/node-pre-gyp@2.0.3': + resolution: {integrity: sha512-uwPAhccfFJlsfCxMYTwOdVfOz3xqyj8xYL3zJj8f0pb30tLohnnFPhLuqp4/qoEz8sNxe4SESZedcBojRefIzg==} + engines: {node: '>=18'} + hasBin: true + + '@napi-rs/wasm-runtime@1.0.7': + resolution: {integrity: sha512-SeDnOO0Tk7Okiq6DbXmmBODgOAb9dp9gjlphokTUxmt8U3liIP1ZsozBahH69j/RJv+Rfs6IwUKHTgQYJ/HBAw==} + '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} engines: {node: '>= 8'} @@ -1288,9 +1418,231 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@opentelemetry/api-logs@0.208.0': + resolution: {integrity: sha512-CjruKY9V6NMssL/T1kAFgzosF1v9o6oeN+aX5JB/C/xPNtmgIJqcXHG7fA82Ou1zCpWGl4lROQUKwUNE1pMCyg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/api@1.9.0': + resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} + engines: {node: '>=8.0.0'} + + '@opentelemetry/context-async-hooks@2.2.0': + resolution: {integrity: sha512-qRkLWiUEZNAmYapZ7KGS5C4OmBLcP/H2foXeOEaowYCR0wi89fHejrfYfbuLVCMLp/dWZXKvQusdbUEZjERfwQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/core@2.2.0': + resolution: {integrity: sha512-FuabnnUm8LflnieVxs6eP7Z383hgQU4W1e3KJS6aOG3RxWxcHyBxH8fDMHNgu/gFx/M2jvTOW/4/PHhLz6bjWw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.10.0' + + '@opentelemetry/instrumentation-amqplib@0.55.0': + resolution: {integrity: sha512-5ULoU8p+tWcQw5PDYZn8rySptGSLZHNX/7srqo2TioPnAAcvTy6sQFQXsNPrAnyRRtYGMetXVyZUy5OaX1+IfA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-connect@0.52.0': + resolution: {integrity: sha512-GXPxfNB5szMbV3I9b7kNWSmQBoBzw7MT0ui6iU/p+NIzVx3a06Ri2cdQO7tG9EKb4aKSLmfX9Cw5cKxXqX6Ohg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-dataloader@0.26.0': + resolution: {integrity: sha512-P2BgnFfTOarZ5OKPmYfbXfDFjQ4P9WkQ1Jji7yH5/WwB6Wm/knynAoA1rxbjWcDlYupFkyT0M1j6XLzDzy0aCA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-express@0.57.0': + resolution: {integrity: sha512-HAdx/o58+8tSR5iW+ru4PHnEejyKrAy9fYFhlEI81o10nYxrGahnMAHWiSjhDC7UQSY3I4gjcPgSKQz4rm/asg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-fs@0.28.0': + resolution: {integrity: sha512-FFvg8fq53RRXVBRHZViP+EMxMR03tqzEGpuq55lHNbVPyFklSVfQBN50syPhK5UYYwaStx0eyCtHtbRreusc5g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-generic-pool@0.52.0': + resolution: {integrity: sha512-ISkNcv5CM2IwvsMVL31Tl61/p2Zm2I2NAsYq5SSBgOsOndT0TjnptjufYVScCnD5ZLD1tpl4T3GEYULLYOdIdQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-graphql@0.56.0': + resolution: {integrity: sha512-IPvNk8AFoVzTAM0Z399t34VDmGDgwT6rIqCUug8P9oAGerl2/PEIYMPOl/rerPGu+q8gSWdmbFSjgg7PDVRd3Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-hapi@0.55.0': + resolution: {integrity: sha512-prqAkRf9e4eEpy4G3UcR32prKE8NLNlA90TdEU1UsghOTg0jUvs40Jz8LQWFEs5NbLbXHYGzB4CYVkCI8eWEVQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-http@0.208.0': + resolution: {integrity: sha512-rhmK46DRWEbQQB77RxmVXGyjs6783crXCnFjYQj+4tDH/Kpv9Rbg3h2kaNyp5Vz2emF1f9HOQQvZoHzwMWOFZQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-ioredis@0.56.0': + resolution: {integrity: sha512-XSWeqsd3rKSsT3WBz/JKJDcZD4QYElZEa0xVdX8f9dh4h4QgXhKRLorVsVkK3uXFbC2sZKAS2Ds+YolGwD83Dg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-kafkajs@0.18.0': + resolution: {integrity: sha512-KCL/1HnZN5zkUMgPyOxfGjLjbXjpd4odDToy+7c+UsthIzVLFf99LnfIBE8YSSrYE4+uS7OwJMhvhg3tWjqMBg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-knex@0.53.0': + resolution: {integrity: sha512-xngn5cH2mVXFmiT1XfQ1aHqq1m4xb5wvU6j9lSgLlihJ1bXzsO543cpDwjrZm2nMrlpddBf55w8+bfS4qDh60g==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-koa@0.57.0': + resolution: {integrity: sha512-3JS8PU/D5E3q295mwloU2v7c7/m+DyCqdu62BIzWt+3u9utjxC9QS7v6WmUNuoDN3RM+Q+D1Gpj13ERo+m7CGg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + + '@opentelemetry/instrumentation-lru-memoizer@0.53.0': + resolution: {integrity: sha512-LDwWz5cPkWWr0HBIuZUjslyvijljTwmwiItpMTHujaULZCxcYE9eU44Qf/pbVC8TulT0IhZi+RoGvHKXvNhysw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongodb@0.61.0': + resolution: {integrity: sha512-OV3i2DSoY5M/pmLk+68xr5RvkHU8DRB3DKMzYJdwDdcxeLs62tLbkmRyqJZsYf3Ht7j11rq35pHOWLuLzXL7pQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mongoose@0.55.0': + resolution: {integrity: sha512-5afj0HfF6aM6Nlqgu6/PPHFk8QBfIe3+zF9FGpX76jWPS0/dujoEYn82/XcLSaW5LPUDW8sni+YeK0vTBNri+w==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql2@0.55.0': + resolution: {integrity: sha512-0cs8whQG55aIi20gnK8B7cco6OK6N+enNhW0p5284MvqJ5EPi+I1YlWsWXgzv/V2HFirEejkvKiI4Iw21OqDWg==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-mysql@0.54.0': + resolution: {integrity: sha512-bqC1YhnwAeWmRzy1/Xf9cDqxNG2d/JDkaxnqF5N6iJKN1eVWI+vg7NfDkf52/Nggp3tl1jcC++ptC61BD6738A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-pg@0.61.0': + resolution: {integrity: sha512-UeV7KeTnRSM7ECHa3YscoklhUtTQPs6V6qYpG283AB7xpnPGCUCUfECFT9jFg6/iZOQTt3FHkB1wGTJCNZEvPw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-redis@0.57.0': + resolution: {integrity: sha512-bCxTHQFXzrU3eU1LZnOZQ3s5LURxQPDlU3/upBzlWY77qOI1GZuGofazj3jtzjctMJeBEJhNwIFEgRPBX1kp/Q==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-tedious@0.27.0': + resolution: {integrity: sha512-jRtyUJNZppPBjPae4ZjIQ2eqJbcRaRfJkr0lQLHFmOU/no5A6e9s1OHLd5XZyZoBJ/ymngZitanyRRA5cniseA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/instrumentation-undici@0.19.0': + resolution: {integrity: sha512-Pst/RhR61A2OoZQZkn6OLpdVpXp6qn3Y92wXa6umfJe9rV640r4bc6SWvw4pPN6DiQqPu2c8gnSSZPDtC6JlpQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.7.0 + + '@opentelemetry/instrumentation@0.208.0': + resolution: {integrity: sha512-Eju0L4qWcQS+oXxi6pgh7zvE2byogAkcsVv0OjHF/97iOz1N/aKE6etSGowYkie+YA1uo6DNwdSxaaNnLvcRlA==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.3.0 + + '@opentelemetry/redis-common@0.38.2': + resolution: {integrity: sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==} + engines: {node: ^18.19.0 || >=20.6.0} + + '@opentelemetry/resources@2.2.0': + resolution: {integrity: sha512-1pNQf/JazQTMA0BiO5NINUzH0cbLbbl7mntLa4aJNmCCXSj0q03T5ZXXL0zw4G55TjdL9Tz32cznGClf+8zr5A==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/sdk-trace-base@2.2.0': + resolution: {integrity: sha512-xWQgL0Bmctsalg6PaXExmzdedSp3gyKV8mQBwK/j9VGdCDu2fmXIb2gAehBKbkXCpJ4HPkgv3QfoJWRT4dHWbw==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.10.0' + + '@opentelemetry/semantic-conventions@1.38.0': + resolution: {integrity: sha512-kocjix+/sSggfJhwXqClZ3i9Y/MI0fp7b+g7kCRm6psy2dsf8uApTRclwG18h8Avm7C9+fnt+O36PspJ/OzoWg==} + engines: {node: '>=14'} + + '@opentelemetry/sql-common@0.41.2': + resolution: {integrity: sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==} + engines: {node: ^18.19.0 || >=20.6.0} + peerDependencies: + '@opentelemetry/api': ^1.1.0 + + '@oxc-project/types@0.98.0': + resolution: {integrity: sha512-Vzmd6FsqVuz5HQVcRC/hrx7Ujo3WEVeQP7C2UNP5uy1hUY4SQvMB+93jxkI1KRHz9a/6cni3glPOtvteN+zpsw==} + '@pandacss/is-valid-prop@0.41.0': resolution: {integrity: sha512-BE6h6CsJk14ugIRrsazJtN3fcg+KDFRat1Bs93YFKH6jd4DOb1yUyVvC70jKqPVvg70zEcV8acZ7VdcU5TLu+w==} + '@photonjs/core@0.1.13': + resolution: {integrity: sha512-lAYBNK3fpCv3zX2rp980X3cBCCHkapeT8dDptQsM+lZGvWthXd1xN7PgoTCCNl9tiyxh3EIp5FzGi5d78aU1Nw==} + peerDependencies: + vite: '>=7.1' + peerDependenciesMeta: + vite: + optional: true + + '@photonjs/hono@0.1.7': + resolution: {integrity: sha512-ZuSedHVzjiXadLvWmpMk5oIGyr2b7mrDLzX1T/TPICaN4+JPUu5F1Iam28t2lxOZCVF55zD8d1MsT3YhuEEmWQ==} + peerDependencies: + '@hono/node-server': ^1 + vite: '>=7.1' + peerDependenciesMeta: + '@hono/node-server': + optional: true + vite: + optional: true + + '@photonjs/runtime@0.1.10': + resolution: {integrity: sha512-aDWUNHkiD/dcmJn2x6Q4+Pl2I4Pa5elIFI/aSgRccIJip1Zle1Eh7s4S6s0k6uF85uD25ux4uViQFkL4QjZZuw==} + peerDependencies: + vite: '>=7.1' + peerDependenciesMeta: + vite: + optional: true + + '@photonjs/srvx@0.1.7': + resolution: {integrity: sha512-gXuTcr/jGRcEq0ocpUi71ytF08OLFfspcXcimnbpY4CD54XxnYQQpAsA3tqvrrzkBL9ll3JbiNCWocbCLdYerg==} + peerDependencies: + vite: '>=7.1' + peerDependenciesMeta: + vite: + optional: true + '@pkgjs/parseargs@0.11.0': resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} @@ -1298,6 +1650,11 @@ packages: '@polka/url@1.0.0-next.28': resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + '@prisma/instrumentation@6.19.0': + resolution: {integrity: sha512-QcuYy25pkXM8BJ37wVFBO7Zh34nyRV1GOb2n3lPkkbRYfl4hWl3PTcImP41P0KrzVXfa/45p6eVCos27x3exIg==} + peerDependencies: + '@opentelemetry/api': ^1.8 + '@rc-component/async-validator@5.0.4': resolution: {integrity: sha512-qgGdcVIF604M9EqjNF0hbUTz42bz/RDtxWdWuU5EQe3hi7M8ob54B6B35rOsvX5eSvIHIzT9iH1R3n+hk3CGfg==} engines: {node: '>=14.x'} @@ -1364,9 +1721,104 @@ packages: react-redux: optional: true + '@rolldown/binding-android-arm64@1.0.0-beta.51': + resolution: {integrity: sha512-Ctn8FUXKWWQI9pWC61P1yumS9WjQtelNS9riHwV7oCkknPGaAry4o7eFx2KgoLMnI2BgFJYpW7Im8/zX3BuONg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.51': + resolution: {integrity: sha512-EL1aRW2Oq15ShUEkBPsDtLMO8GTqfb/ktM/dFaVzXKQiEE96Ss6nexMgfgQrg8dGnNpndFyffVDb5IdSibsu1g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.51': + resolution: {integrity: sha512-uGtYKlFen9pMIPvkHPWZVDtmYhMQi5g5Ddsndg1gf3atScKYKYgs5aDP4DhHeTwGXQglhfBG7lEaOIZ4UAIWww==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.51': + resolution: {integrity: sha512-JRoVTQtHYbZj1P07JLiuTuXjiBtIa7ag7/qgKA6CIIXnAcdl4LrOf7nfDuHPJcuRKaP5dzecMgY99itvWfmUFQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.51': + resolution: {integrity: sha512-BKATVnpPZ0TYBW9XfDwyd4kPGgvf964HiotIwUgpMrFOFYWqpZ+9ONNzMV4UFAYC7Hb5C2qgYQk/qj2OnAd4RQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.51': + resolution: {integrity: sha512-xLd7da5jkfbVsBCm1buIRdWtuXY8+hU3+6ESXY/Tk5X5DPHaifrUblhYDgmA34dQt6WyNC2kfXGgrduPEvDI6Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.51': + resolution: {integrity: sha512-EQFXTgHxxTzv3t5EmjUP/DfxzFYx9sMndfLsYaAY4DWF6KsK1fXGYsiupif6qPTViPC9eVmRm78q0pZU/kuIPg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.51': + resolution: {integrity: sha512-p5P6Xpa68w3yFaAdSzIZJbj+AfuDnMDqNSeglBXM7UlJT14Q4zwK+rV+8Mhp9MiUb4XFISZtbI/seBprhkQbiQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.51': + resolution: {integrity: sha512-sNVVyLa8HB8wkFipdfz1s6i0YWinwpbMWk5hO5S+XAYH2UH67YzUT13gs6wZTKg2x/3gtgXzYnHyF5wMIqoDAw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.51': + resolution: {integrity: sha512-e/JMTz9Q8+T3g/deEi8DK44sFWZWGKr9AOCW5e8C8SCVWzAXqYXAG7FXBWBNzWEZK0Rcwo9TQHTQ9Q0gXgdCaA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.51': + resolution: {integrity: sha512-We3LWqSu6J9s5Y0MK+N7fUiiu37aBGPG3Pc347EoaROuAwkCS2u9xJ5dpIyLW4B49CIbS3KaPmn4kTgPb3EyPw==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.51': + resolution: {integrity: sha512-fj56buHRuMM+r/cb6ZYfNjNvO/0xeFybI6cTkTROJatdP4fvmQ1NS8D/Lm10FCSDEOkqIz8hK3TGpbAThbPHsA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.51': + resolution: {integrity: sha512-fkqEqaeEx8AySXiDm54b/RdINb3C0VovzJA3osMhZsbn6FoD73H0AOIiaVAtGr6x63hefruVKTX8irAm4Jkt2w==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.51': + resolution: {integrity: sha512-CWuLG/HMtrVcjKGa0C4GnuxONrku89g0+CsH8nT0SNhOtREXuzwgjIXNJImpE/A/DMf9JF+1Xkrq/YRr+F/rCg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.0-beta.47': resolution: {integrity: sha512-8QagwMH3kNCuzD8EWL8R2YPW5e4OrHNSAHRFDdmFqEwEaD/KcNKjVoumo+gP2vW5eKB2UPbM6vTYiGZX0ixLnw==} + '@rolldown/pluginutils@1.0.0-beta.51': + resolution: {integrity: sha512-51/8cNXMrqWqX3o8DZidhwz1uYq0BhHDDSfVygAND1Skx5s1TDw3APSSxCMcFFedwgqGcx34gRouwY+m404BBQ==} + + '@rollup/pluginutils@5.3.0': + resolution: {integrity: sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==} + engines: {node: '>=14.0.0'} + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + '@rollup/rollup-android-arm-eabi@4.46.2': resolution: {integrity: sha512-Zj3Hl6sN34xJtMv7Anwb5Gu01yujyE/cLBDB2gnHTAHaWS1Z38L7kuSG+oAh0giZMqG060f/YBStXtMH6FvPMA==} cpu: [arm] @@ -1467,6 +1919,126 @@ packages: cpu: [x64] os: [win32] + '@sentry-internal/browser-utils@10.27.0': + resolution: {integrity: sha512-17tO6AXP+rmVQtLJ3ROQJF2UlFmvMWp7/8RDT5x9VM0w0tY31z8Twc0gw2KA7tcDxa5AaHDUbf9heOf+R6G6ow==} + engines: {node: '>=18'} + + '@sentry-internal/feedback@10.27.0': + resolution: {integrity: sha512-UecsIDJcv7VBwycge/MDvgSRxzevDdcItE1i0KSwlPz00rVVxLY9kV28PJ4I2E7r6/cIaP9BkbWegCEcv09NuA==} + engines: {node: '>=18'} + + '@sentry-internal/replay-canvas@10.27.0': + resolution: {integrity: sha512-inhsRYSVBpu3BI1kZphXj6uB59baJpYdyHeIPCiTfdFNBE5tngNH0HS/aedZ1g9zICw290lwvpuyrWJqp4VBng==} + engines: {node: '>=18'} + + '@sentry-internal/replay@10.27.0': + resolution: {integrity: sha512-tKSzHq1hNzB619Ssrqo25cqdQJ84R3xSSLsUWEnkGO/wcXJvpZy94gwdoS+KmH18BB1iRRRGtnMxZcUkiPSesw==} + engines: {node: '>=18'} + + '@sentry/babel-plugin-component-annotate@4.6.1': + resolution: {integrity: sha512-aSIk0vgBqv7PhX6/Eov+vlI4puCE0bRXzUG5HdCsHBpAfeMkI8Hva6kSOusnzKqs8bf04hU7s3Sf0XxGTj/1AA==} + engines: {node: '>= 14'} + + '@sentry/browser@10.27.0': + resolution: {integrity: sha512-G8q362DdKp9y1b5qkQEmhTFzyWTOVB0ps1rflok0N6bVA75IEmSDX1pqJsNuY3qy14VsVHYVwQBJQsNltQLS0g==} + engines: {node: '>=18'} + + '@sentry/bundler-plugin-core@4.6.1': + resolution: {integrity: sha512-WPeRbnMXm927m4Kr69NTArPfI+p5/34FHftdCRI3LFPMyhZDzz6J3wLy4hzaVUgmMf10eLzmq2HGEMvpQmdynA==} + engines: {node: '>= 14'} + + '@sentry/cli-darwin@2.58.2': + resolution: {integrity: sha512-MArsb3zLhA2/cbd4rTm09SmTpnEuZCoZOpuZYkrpDw1qzBVJmRFA1W1hGAQ9puzBIk/ubY3EUhhzuU3zN2uD6w==} + engines: {node: '>=10'} + os: [darwin] + + '@sentry/cli-linux-arm64@2.58.2': + resolution: {integrity: sha512-ay3OeObnbbPrt45cjeUyQjsx5ain1laj1tRszWj37NkKu55NZSp4QCg1gGBZ0gBGhckI9nInEsmKtix00alw2g==} + engines: {node: '>=10'} + cpu: [arm64] + os: [linux, freebsd, android] + + '@sentry/cli-linux-arm@2.58.2': + resolution: {integrity: sha512-HU9lTCzcHqCz/7Mt5n+cv+nFuJdc1hGD2h35Uo92GgxX3/IujNvOUfF+nMX9j6BXH6hUt73R5c0Ycq9+a3Parg==} + engines: {node: '>=10'} + cpu: [arm] + os: [linux, freebsd, android] + + '@sentry/cli-linux-i686@2.58.2': + resolution: {integrity: sha512-CN9p0nfDFsAT1tTGBbzOUGkIllwS3hygOUyTK7LIm9z+UHw5uNgNVqdM/3Vg+02ymjkjISNB3/+mqEM5osGXdA==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [linux, freebsd, android] + + '@sentry/cli-linux-x64@2.58.2': + resolution: {integrity: sha512-oX/LLfvWaJO50oBVOn4ZvG2SDWPq0MN8SV9eg5tt2nviq+Ryltfr7Rtoo+HfV+eyOlx1/ZXhq9Wm7OT3cQuz+A==} + engines: {node: '>=10'} + cpu: [x64] + os: [linux, freebsd, android] + + '@sentry/cli-win32-arm64@2.58.2': + resolution: {integrity: sha512-+cl3x2HPVMpoSVGVM1IDWlAEREZrrVQj4xBb0TRKII7g3hUxRsAIcsrr7+tSkie++0FuH4go/b5fGAv51OEF3w==} + engines: {node: '>=10'} + cpu: [arm64] + os: [win32] + + '@sentry/cli-win32-i686@2.58.2': + resolution: {integrity: sha512-omFVr0FhzJ8oTJSg1Kf+gjLgzpYklY0XPfLxZ5iiMiYUKwF5uo1RJRdkUOiEAv0IqpUKnmKcmVCLaDxsWclB7Q==} + engines: {node: '>=10'} + cpu: [x86, ia32] + os: [win32] + + '@sentry/cli-win32-x64@2.58.2': + resolution: {integrity: sha512-2NAFs9UxVbRztQbgJSP5i8TB9eJQ7xraciwj/93djrSMHSEbJ0vC47TME0iifgvhlHMs5vqETOKJtfbbpQAQFA==} + engines: {node: '>=10'} + cpu: [x64] + os: [win32] + + '@sentry/cli@2.58.2': + resolution: {integrity: sha512-U4u62V4vaTWF+o40Mih8aOpQKqKUbZQt9A3LorIJwaE3tO3XFLRI70eWtW2se1Qmy0RZ74zB14nYcFNFl2t4Rw==} + engines: {node: '>= 10'} + hasBin: true + + '@sentry/core@10.27.0': + resolution: {integrity: sha512-Zc68kdH7tWTDtDbV1zWIbo3Jv0fHAU2NsF5aD2qamypKgfSIMSbWVxd22qZyDBkaX8gWIPm/0Sgx6aRXRBXrYQ==} + engines: {node: '>=18'} + + '@sentry/node-core@10.27.0': + resolution: {integrity: sha512-Dzo1I64Psb7AkpyKVUlR9KYbl4wcN84W4Wet3xjLmVKMgrCo2uAT70V4xIacmoMH5QLZAx0nGfRy9yRCd4nzBg==} + engines: {node: '>=18'} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 || ^2.2.0 + '@opentelemetry/core': ^1.30.1 || ^2.1.0 || ^2.2.0 + '@opentelemetry/instrumentation': '>=0.57.1 <1' + '@opentelemetry/resources': ^1.30.1 || ^2.1.0 || ^2.2.0 + '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 || ^2.2.0 + '@opentelemetry/semantic-conventions': ^1.37.0 + + '@sentry/node@10.27.0': + resolution: {integrity: sha512-1cQZ4+QqV9juW64Jku1SMSz+PoZV+J59lotz4oYFvCNYzex8hRAnDKvNiKW1IVg5mEEkz98mg1fvcUtiw7GTiQ==} + engines: {node: '>=18'} + + '@sentry/opentelemetry@10.27.0': + resolution: {integrity: sha512-z2vXoicuGiqlRlgL9HaYJgkin89ncMpNQy0Kje6RWyhpzLe8BRgUXlgjux7WrSrcbopDdC1OttSpZsJ/Wjk7fg==} + engines: {node: '>=18'} + peerDependencies: + '@opentelemetry/api': ^1.9.0 + '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 || ^2.2.0 + '@opentelemetry/core': ^1.30.1 || ^2.1.0 || ^2.2.0 + '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 || ^2.2.0 + '@opentelemetry/semantic-conventions': ^1.37.0 + + '@sentry/react@10.27.0': + resolution: {integrity: sha512-xoIRBlO1IhLX/O9aQgVYW1F3Qhw8TdkOiZjh6mrPsnCpBLufsQ4aS1nDQi9miZuWeslW0s2zNy0ACBpICZR/sw==} + engines: {node: '>=18'} + peerDependencies: + react: ^16.14.0 || 17.x || 18.x || 19.x + + '@sentry/vite-plugin@4.6.1': + resolution: {integrity: sha512-Qvys1y3o8/bfL3ikrHnJS9zxdjt0z3POshdBl3967UcflrTqBmnGNkcVk53SlmtJWIfh85fgmrLvGYwZ2YiqNg==} + engines: {node: '>= 14'} + '@simple-libs/child-process-utils@1.0.1': resolution: {integrity: sha512-3nWd8irxvDI6v856wpPCHZ+08iQR0oHTZfzAZmnbsLzf+Sf1odraP6uKOHDZToXq3RPRV/LbqGVlSCogm9cJjg==} engines: {node: '>=18'} @@ -1503,6 +2075,9 @@ packages: react: ^18.0.0 react-dom: ^18.0.0 + '@tybys/wasm-util@0.10.1': + resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==} + '@types/aria-query@5.0.4': resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==} @@ -1521,12 +2096,18 @@ packages: '@types/chai@5.2.2': resolution: {integrity: sha512-8kB30R7Hwqf40JPiKhVzodJs2Qc1ZJ5zuT3uzw5Hq/dhNCl3G3l83jfpdI1e20BP348+fV7VIL/+FxaXkqBmWg==} + '@types/connect@3.4.38': + resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} + '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} + '@types/mysql@2.15.27': + resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==} + '@types/node@22.15.34': resolution: {integrity: sha512-8Y6E5WUupYy1Dd0II32BsWAx5MWdcnRd8L84Oys3veg1YrYtNtzgO4CFhiBg6MDSjk7Ay36HYOnU7/tuOzIzcw==} @@ -1539,6 +2120,12 @@ packages: '@types/parse-json@4.0.2': resolution: {integrity: sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==} + '@types/pg-pool@2.0.6': + resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} + + '@types/pg@8.15.6': + resolution: {integrity: sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==} + '@types/react-dom@18.3.5': resolution: {integrity: sha512-P4t6saawp+b/dFrUr2cvkVsfvPguwsxtH6dNIYRllMsefqFzkZk5UIjzyDOv5g1dXIPdG4Sp1yCR4Z6RCUsG/Q==} peerDependencies: @@ -1555,9 +2142,67 @@ packages: '@types/stylis@4.2.5': resolution: {integrity: sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==} + '@types/tedious@4.0.14': + resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} + '@types/use-sync-external-store@0.0.6': resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==} + '@universal-middleware/cloudflare@0.4.10': + resolution: {integrity: sha512-ZY+N0KKoH+H+BB3wsaD5yqTiiFtX7uklPyCBqGLqEijOtZA5ZgFIExfWDjiIUjezUBAbRB8kUZ/WlPITY+hyTg==} + + '@universal-middleware/compress@0.2.34': + resolution: {integrity: sha512-zpLaiHHEfx1ouahZ+NKc5UScsiRAsEn+wiwWMH55JAEeUQ73zymw3e1kZg45Tr/oQh8X3PL0YrRKXDdc5Lt8WA==} + + '@universal-middleware/core@0.4.13': + resolution: {integrity: sha512-k2zv5/zLWPUBxIZp/QTxkiVkG4EyqO+X6ABszBKg8ZmZpTp5ljd8uiIWdnMpSDDIN72R99RxtaMi0/vXNB75/w==} + peerDependencies: + '@cloudflare/workers-types': ^4.20251014.0 + '@hattip/core': ^0.0.49 + '@types/express': ^4 || ^5 + '@webroute/route': ^0.8.0 + elysia: ^1.4.11 + fastify: ^5.6.1 + h3: ^1.15.4 + hono: ^4.10.2 + srvx: ^0.8 || ^0.9 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + '@hattip/core': + optional: true + '@types/express': + optional: true + '@webroute/route': + optional: true + elysia: + optional: true + fastify: + optional: true + h3: + optional: true + hono: + optional: true + srvx: + optional: true + + '@universal-middleware/express@0.4.22': + resolution: {integrity: sha512-4aIrnK52NJmYKokZnwpWja/vT2m/HoZ8zxQyYLdokkSQdx0B1k1VsmYGeWENvpDQBgLjnfyvDzyaxch6Tib/hA==} + + '@universal-middleware/hono@0.4.17': + resolution: {integrity: sha512-NKO42xEv4oQ/fvMg4NN3je+bhBymIHi5mFWjyxAtb5ewbtkCZs9eb+aBNO+Ai1FEy2jQpkBEJMvclW5eohFw9g==} + + '@universal-middleware/sirv@0.1.24': + resolution: {integrity: sha512-BshKQ6hsb3mbgIyFguyf6QEjqAFGW2KGLd3j/N1aK2b1bicD2elsWOD5UYSb0b84VHglGmISqOu30FbfMWhMgg==} + + '@universal-middleware/srvx@0.1.1': + resolution: {integrity: sha512-nTy4BZvaEI+rFO8sWEVvZrZWwFuqEXlXPNvIBAfl16+nKcorwiwm1x+qzuDrSqLd/kr5LSsGR3/KenTvESS9dQ==} + + '@vercel/nft@0.30.4': + resolution: {integrity: sha512-wE6eAGSXScra60N2l6jWvNtVK0m+sh873CpfZW4KI2v8EHuUQp+mSEi4T+IcdPCSEDgCdAS/7bizbhQlkjzrSA==} + engines: {node: '>=18'} + hasBin: true + '@vitejs/plugin-react@5.1.1': resolution: {integrity: sha512-WQfkSw0QbQ5aJ2CHYw23ZGkqnRwqKHD/KYsMeTkZzPT4Jcf0DcBxBtwMJxnu6E7oxw5+JC6ZAiePgh28uJ1HBA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1810,11 +2455,29 @@ packages: '@zag-js/utils@0.82.2': resolution: {integrity: sha512-tN87VEEoo240O2CzQdHvtBVPF8hHqLdpNzDT+obNIQrRj4wbNQ5Ze3Zwrd6/SoBe7ImKgkwbAlgu4k5+v9sDcA==} + abbrev@3.0.1: + resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} + engines: {node: ^18.17.0 || >=20.5.0} + + acorn-import-attributes@1.9.5: + resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} + peerDependencies: + acorn: ^8 + acorn@8.14.1: resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} engines: {node: '>=0.4.0'} hasBin: true + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + + agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + agent-base@7.1.3: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} @@ -1845,6 +2508,10 @@ packages: react: '>=16.9.0' react-dom: '>=16.9.0' + anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + aria-query@5.1.3: resolution: {integrity: sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==} @@ -1862,6 +2529,9 @@ packages: resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==} engines: {node: '>=12'} + async-sema@3.1.1: + resolution: {integrity: sha512-tLRNUXati5MFePdAk8dw7Qt7DpxPB60ofAgn8WRhW6a2rcimZnYBP9oxHiv0OHy+Wz7kPMG+t4LGdt31+4EmGg==} + asynckit@0.4.0: resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} @@ -1876,6 +2546,13 @@ packages: balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + + bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + brace-expansion@2.0.1: resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} @@ -1936,6 +2613,17 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} + + cjs-module-lexer@1.4.3: + resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} + classnames@2.5.1: resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==} @@ -1963,6 +2651,13 @@ packages: compute-scroll-into-view@3.1.1: resolution: {integrity: sha512-VRhuHOLoKYOy4UbilLbUzbYg93XLjv2PncJC50EuTWPA3gaja1UjBsUP/D/9/juV3vQFr6XBEzn9KCAHdUvOHw==} + confbox@0.2.2: + resolution: {integrity: sha512-1NB+BKqhtNipMsov4xI/NnhCKp9XG9NamYp5PVm9klAT0fsrNPjaFICsCFhNhwZJKNh7zB/3q8qXz0E9oaMNtQ==} + + consola@3.4.2: + resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==} + engines: {node: ^14.18.0 || >=16.10.0} + conventional-changelog-angular@8.0.0: resolution: {integrity: sha512-CLf+zr6St0wIxos4bmaKHRXWAcsCXrJU6F4VdNDrGRK3B8LDLKoX3zuMV5GhtbGkVR/LohZ6MT6im43vZLSjmA==} engines: {node: '>=18'} @@ -2071,6 +2766,10 @@ packages: resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} engines: {node: '>=0.4.0'} + detect-libc@2.1.2: + resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==} + engines: {node: '>=8'} + devalue@4.3.3: resolution: {integrity: sha512-UH8EL6H2ifcY8TbD2QsxwCC/pr5xSwPvv85LrLXVihmHVC3T3YqTCIwnR5ak0yO1KYqlxrPVOA/JVZJYPy2ATg==} @@ -2081,6 +2780,10 @@ packages: resolution: {integrity: sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==} engines: {node: '>=8'} + dotenv@16.6.1: + resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} + engines: {node: '>=12'} + dunder-proto@1.0.1: resolution: {integrity: sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==} engines: {node: '>= 0.4'} @@ -2144,6 +2847,9 @@ packages: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} + estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} @@ -2155,6 +2861,9 @@ packages: resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} + exsolve@1.0.8: + resolution: {integrity: sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==} + fast-glob@3.3.3: resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} @@ -2181,6 +2890,9 @@ packages: resolution: {integrity: sha512-7yAQpD2UMJzLi1Dqv7qFYnPbaPx7ZfFK6PiIxQ4PfkGPyNyl2Ugx+a/umUonmKqjhM4DnfbMvdX6otXq83soQQ==} engines: {node: ^12.20 || >= 14.13} + file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + fill-range@7.1.1: resolution: {integrity: sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==} engines: {node: '>=8'} @@ -2188,6 +2900,10 @@ packages: find-root@1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} + find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -2204,6 +2920,9 @@ packages: resolution: {integrity: sha512-buewHzMvYL29jdeQTVILecSaZKnt/RJWjoZCF5OW60Z67/GmSLBkOFM7qh1PI3zFNtJbaZL5eQu1vLfazOwj4g==} engines: {node: '>=12.20.0'} + forwarded-parse@2.1.2: + resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} + fsevents@2.3.3: resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} @@ -2242,10 +2961,17 @@ packages: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true + glob@10.5.0: + resolution: {integrity: sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==} + hasBin: true + gopd@1.2.0: resolution: {integrity: sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==} engines: {node: '>= 0.4'} + graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + graphql-tag@2.12.6: resolution: {integrity: sha512-FdSNcu2QQcWnM2VNvSCCDCVS5PpPqpzgFT8+GXzqJuoDd0CBncxCY278u4mhRO7tMgo2JjgJA5aZ+nWSQ/Z+xg==} engines: {node: '>=10'} @@ -2287,6 +3013,10 @@ packages: hoist-non-react-statics@3.3.2: resolution: {integrity: sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==} + hono@4.10.7: + resolution: {integrity: sha512-icXIITfw/07Q88nLSkB9aiUrd8rYzSweK681Kjo/TSggaGbOX4RRyxxm71v+3PC8C/j+4rlxGeoTRxQDkaJkUw==} + engines: {node: '>=16.9.0'} + hosted-git-info@8.1.0: resolution: {integrity: sha512-Rw/B2DNQaPBICNXEm8balFz9a6WpZrkCGpcWFpy7nCj+NyhSdqXipmfvtmWt9xGfp0wZnBxB+iVpLmQMYt47Tw==} engines: {node: ^18.17.0 || >=20.5.0} @@ -2299,6 +3029,10 @@ packages: resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==} engines: {node: '>= 14'} + https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + https-proxy-agent@7.0.6: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} @@ -2318,6 +3052,9 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} + import-in-the-middle@2.0.0: + resolution: {integrity: sha512-yNZhyQYqXpkT0AKq3F3KLasUSK4fHvebNH5hOsKQw2dhGSALvQ4U0BqUc5suziKvydO5u5hgN2hy1RJaho8U5A==} + internal-slot@1.1.0: resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==} engines: {node: '>= 0.4'} @@ -2337,6 +3074,10 @@ packages: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + is-boolean-object@1.2.2: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} @@ -2463,6 +3204,10 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + loose-envify@1.4.0: resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} hasBin: true @@ -2486,6 +3231,13 @@ packages: magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} + magic-string@0.30.21: + resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} + + magic-string@0.30.8: + resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} + engines: {node: '>=12'} + math-intrinsics@1.1.0: resolution: {integrity: sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==} engines: {node: '>= 0.4'} @@ -2528,6 +3280,13 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} + minizlib@3.1.0: + resolution: {integrity: sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw==} + engines: {node: '>= 18'} + + module-details-from-path@1.0.4: + resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} + mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} @@ -2548,17 +3307,39 @@ packages: engines: {node: '>=10.5.0'} deprecated: Use your platform's native DOMException instead + node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + node-fetch@3.3.2: resolution: {integrity: sha512-dRB78srN/l6gqWulah9SrxeYnxeddIG30+GOqK/9OlLVyLg3HPnr6SqOWTWOXKRwC2eGYCkZ59NNuSgvSrpgOA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + node-gyp-build@4.8.4: + resolution: {integrity: sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==} + hasBin: true + node-releases@2.0.19: resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==} + nopt@8.1.0: + resolution: {integrity: sha512-ieGu42u/Qsa4TFktmaKEwM6MQH0pOWnaB3htzh0JRtx84+Mebc0cbZYN5bC+6WTZ4+77xrL9Pn5m7CV6VIkV7A==} + engines: {node: ^18.17.0 || >=20.5.0} + hasBin: true + normalize-package-data@7.0.0: resolution: {integrity: sha512-k6U0gKRIuNCTkwHGZqblCfLfBRh+w1vI6tBo+IeJwq2M8FUiOqhX7GH+GArQGScA7azd1WfyRCvxoXDO3hQDIA==} engines: {node: ^18.17.0 || >=20.5.0} + normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + npm-run-path@4.0.1: resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} engines: {node: '>=8'} @@ -2593,6 +3374,14 @@ packages: optimism@0.18.1: resolution: {integrity: sha512-mLXNwWPa9dgFyDqkNi54sjDyNJ9/fTI6WGBLgnXku1vdKY/jovHfZT5r+aiVeFFLOz+foPNOm5YJ4mqgld2GBQ==} + p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + + p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} @@ -2607,6 +3396,10 @@ packages: parse5@7.2.1: resolution: {integrity: sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==} + path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -2635,6 +3428,17 @@ packages: perfect-freehand@1.2.2: resolution: {integrity: sha512-eh31l019WICQ03pkF3FSzHxB8n07ItqIQ++G5UV8JX0zVOXzgTGCqnRR0jJ2h9U8/2uW4W4mtGJELt9kEV0CFQ==} + pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + + pg-protocol@1.10.3: + resolution: {integrity: sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==} + + pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + picocolors@1.1.1: resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} @@ -2650,6 +3454,9 @@ packages: resolution: {integrity: sha512-o8mkY4E/+LNUf6LzX96ht6k6CEDi65k9G2rjMtBe9Oo+VPKSvl+0GKHuH/AlG+GA5LPG/i5hrekkxUc3s2HU+Q==} hasBin: true + pkg-types@2.3.0: + resolution: {integrity: sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==} + playwright-chromium@1.57.0: resolution: {integrity: sha512-GCVVTbmIDrZuBxWYoQ70rehRXMb3Q7ccENe63a+rGTWwypeVAgh/DD5o5QQ898oer5pdIv3vGINUlEkHtOZQEw==} engines: {node: '>=18'} @@ -2679,6 +3486,22 @@ packages: resolution: {integrity: sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==} engines: {node: ^10 || ^12 || >=14} + postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + + postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + + postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + + postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + prettier@3.5.3: resolution: {integrity: sha512-QQtaxnoDJeAkDvDKWCLiwIXkTgRhwYDEQCghU9Z6q03iyek/rxRh/2lC3HB7P8sWT2xC/y5JDctPLBIGzHKbhw==} engines: {node: '>=14'} @@ -2688,12 +3511,19 @@ packages: resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + progress@2.0.3: + resolution: {integrity: sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==} + engines: {node: '>=0.4.0'} + prop-types@15.8.1: resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==} proxy-compare@3.0.1: resolution: {integrity: sha512-V9plBAt3qjMlS1+nC8771KNf6oJ12gExvaxnNzN/9yVRLdTv/lc+oJlnSzrdYDAvBfTStPCoiaCOTmTs0adv7Q==} + proxy-from-env@1.1.0: + resolution: {integrity: sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==} + proxy-memoize@3.0.1: resolution: {integrity: sha512-VDdG/VYtOgdGkWJx7y0o7p+zArSf2383Isci8C+BP3YXgMYDoPd3cCBjw0JdWb6YBb9sFiOPbAADDVTPJnh+9g==} @@ -2983,6 +3813,10 @@ packages: resolution: {integrity: sha512-DGrYcCWK7tvYMnWh79yrPHt+vdx9tY+1gPZa7nJQtO/p8bLTDaHp4dzwEhQB7pZ4Xe3ok4XKuEPrVuc+wlpkmw==} engines: {node: '>=0.10.0'} + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + redux-thunk@3.1.0: resolution: {integrity: sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==} peerDependencies: @@ -2998,6 +3832,10 @@ packages: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} + regexparam@3.0.0: + resolution: {integrity: sha512-RSYAtP31mvYLkAHrOlh25pCNQ5hWnT106VukGaaFfuJrZFkGRX5GhUAdPqpSDXxOhA2c4akmRuplv1mRqnBn6Q==} + engines: {node: '>=8'} + rehackt@0.1.0: resolution: {integrity: sha512-7kRDOuLHB87D/JESKxQoRwv4DzbIdwkAGQ7p6QKGdVlY1IZheUnVhlk/4UZlNUVxdAXpyxikE3URsG067ybVzw==} peerDependencies: @@ -3009,6 +3847,10 @@ packages: react: optional: true + require-in-the-middle@8.0.1: + resolution: {integrity: sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==} + engines: {node: '>=9.3.0 || >=8.10.0 <9.0.0'} + requires-port@1.0.0: resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} @@ -3022,6 +3864,10 @@ packages: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} + resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + resolve@1.22.10: resolution: {integrity: sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==} engines: {node: '>= 0.4'} @@ -3035,6 +3881,11 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true + rolldown@1.0.0-beta.51: + resolution: {integrity: sha512-ZRLgPlS91l4JztLYEZnmMcd3Umcla1hkXJgiEiR4HloRJBBoeaX8qogTu5Jfu36rRMVLndzqYv0h+M5gJAkUfg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup@4.46.2: resolution: {integrity: sha512-WMmLFI+Boh6xbop+OAGo9cQ3OgX9MIg7xOQjn+pTCwOkk+FNDAeAemXkJ3HzDJrVXleLOFVa1ipuc1AmEx1Dwg==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -3151,9 +4002,20 @@ packages: spdx-license-ids@3.0.21: resolution: {integrity: sha512-Bvg/8F5XephndSK3JffaRqdT+gyhfqIPwDHpX80tJrF8QQRYMo8sNMeaZ2Dp5+jhwKnUmIOyFFQfHRkjJm5nXg==} + srvx@0.9.6: + resolution: {integrity: sha512-5L4rT6qQqqb+xcoDoklUgCNdmzqJ6vbcDRwPVGRXewF55IJH0pqh0lQlrJ266ZWTKJ4mfeioqHQJeAYesS+RrQ==} + engines: {node: '>=20.16.0'} + hasBin: true + stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} + standaloner@0.1.10: + resolution: {integrity: sha512-ludcfacLKvLYfB+/XgMifuK1AErPJqj4kI8E0vujn7NltoSVeMjYoOzV6gu8sbfD1Lqf3883P/Pm0BZ5zfKOFQ==} + + standaloner@0.1.11: + resolution: {integrity: sha512-JeLFj5rKTmy3UJj7/oGUVnmFaBIWmJQVP5Hv3s2D6Ju8kVPZYbGxOhMQS45QiEr2V0ngI83d/Vv4Zh62Ojs/rQ==} + std-env@3.9.0: resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} @@ -3231,6 +4093,10 @@ packages: symbol-tree@3.2.4: resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + tar@7.5.2: + resolution: {integrity: sha512-7NyxrTE4Anh8km8iEy7o0QYPs+0JKBTj5ZaqHg6B39erLg0qYXN3BijtShwbsNSvQ+LN75+KV+C4QR/f6Gwnpg==} + engines: {node: '>=18'} + throttle-debounce@5.0.2: resolution: {integrity: sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==} engines: {node: '>=12.22'} @@ -3257,6 +4123,13 @@ packages: resolution: {integrity: sha512-t2T/WLB2WRgZ9EpE4jgPJ9w+i66UZfDc8wHh0xrwiRNN+UwH98GIJkTeZqX9rg0i0ptwzqW+uYeIF0T4F8LR7A==} engines: {node: '>=14.0.0'} + tldts-core@7.0.19: + resolution: {integrity: sha512-lJX2dEWx0SGH4O6p+7FPwYmJ/bu1JbcGJ8RLaG9b7liIgZ85itUVEPbMtWRVrde/0fnDPEPHW10ZsKW3kVsE9A==} + + tldts@7.0.19: + resolution: {integrity: sha512-8PWx8tvC4jDB39BQw1m4x8y5MH1BcQ5xHeL2n7UVFulMPH/3Q0uiamahFJ3lXA0zO2SUyRXuVVbWSDmstlt9YA==} + hasBin: true + to-regex-range@5.0.1: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} @@ -3272,10 +4145,21 @@ packages: resolution: {integrity: sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==} engines: {node: '>=6'} + tough-cookie@6.0.0: + resolution: {integrity: sha512-kXuRi1mtaKMrsLUxz3sQYvVl37B0Ns6MzfrtV5DvJceE9bPyspOqk9xxv7XbZWcfLWbFmm997vl83qUWVJA64w==} + engines: {node: '>=16'} + + tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tr46@5.1.0: resolution: {integrity: sha512-IUWnUK7ADYR5Sl1fZlO1INDUhVhatWl7BtJWsIhwJ0UAK7ilzzIa8uIqOO/aYVWHZPJkKbEL+362wrzoeRF7bw==} engines: {node: '>=18'} + ts-deepmerge@7.0.3: + resolution: {integrity: sha512-Du/ZW2RfwV/D4cmA5rXafYjBQVuvu4qGiEEla4EmEHVHgRdx68Gftx7i66jn2bzHPwSVZY36Ae6OuDn9el4ZKA==} + engines: {node: '>=14.13.1'} + ts-invariant@0.10.3: resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==} engines: {node: '>=8'} @@ -3310,6 +4194,9 @@ packages: resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} engines: {node: '>= 4.0.0'} + unplugin@1.0.1: + resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} + update-browserslist-db@1.1.3: resolution: {integrity: sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==} hasBin: true @@ -3330,6 +4217,30 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + vike-photon@0.1.23: + resolution: {integrity: sha512-QKIKj3AoG9W8jVGlMZTL9cZVvphfGWa9OWXROTTUp90dm8aMv9rU7OWCwz7kPqhKUI2QmUKGhWjgqOESun9ULg==} + peerDependencies: + '@photonjs/cloudflare': '>=0.0.9' + '@photonjs/core': ^0.1.0 + '@photonjs/runtime': ^0.1.0 + '@photonjs/vercel': ^0.1.1 + vike: '>=0.4.244' + vite: '>=7.1' + peerDependenciesMeta: + '@photonjs/cloudflare': + optional: true + '@photonjs/vercel': + optional: true + vite: + optional: true + + vike-react@0.6.10: + resolution: {integrity: sha512-LzV3ZuFovlzkaWiXO9PQeiW56szVo5rM4h8UJeb58dUpAVzcjxvDoM0Q+2vinJisVrml5Wp+DjN0qWQHUu5UQQ==} + peerDependencies: + react: '>=19' + react-dom: '>=19' + vike: '>=0.4.182' + vike@0.4.249: resolution: {integrity: sha512-ZQpfmIclLCCLD9dsjTOwoczdjHJ7JrGww4b4vg3FpfrFZcSoNcrEtrwgbSqw9lMuYnkbfXPKFxwOf8VVp9Uftw==} engines: {node: '>=20.19.0'} @@ -3427,10 +4338,20 @@ packages: resolution: {integrity: sha512-d2JWLCivmZYTSIoge9MsgFCZrt571BikcWGYkjC1khllbTeDlGqZ2D8vD8E/lJa8WGWbb7Plm8/XJYV7IJHZZw==} engines: {node: '>= 8'} + webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webidl-conversions@7.0.0: resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==} engines: {node: '>=12'} + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + engines: {node: '>=10.13.0'} + + webpack-virtual-modules@0.5.0: + resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} + whatwg-encoding@3.1.1: resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==} engines: {node: '>=18'} @@ -3443,6 +4364,9 @@ packages: resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==} engines: {node: '>=18'} + whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -3495,19 +4419,34 @@ packages: xmlchars@2.2.0: resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + yallist@3.1.1: resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} + yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} + yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + zen-observable-ts@1.2.5: resolution: {integrity: sha512-QZWQekv6iB72Naeake9hS1KxHlotfRpe+WGNbNx5/ta+R3DNjVO2bswf63gXlWDcs+EMd7XY8HfVQyP1X6T4Zg==} zen-observable@0.8.15: resolution: {integrity: sha512-PQ2PC7R9rslx84ndNBZB/Dkv8V8fZEpk83RLgXtYd0fwUgEjseMn1Dgajh2x6S8QbZAFa9p2qVCEuYZNgve0dQ==} + zod@4.1.13: + resolution: {integrity: sha512-AvvthqfqrAhNH9dnfmrfKzX5upOdjUVJYFqNSlkmGf64gRaTzlPwz99IHYnVs28qYAybvAlBV+H7pn0saFY4Ig==} + zustand@5.0.8: resolution: {integrity: sha512-gyPKpIaxY9XcO2vSMrLbiER7QMAMGOQZVRdJ6Zi782jkbzZygq5GI9nG8g+sMgitRtndwaBSl7uiqC49o1SSiw==} engines: {node: '>=12.20.0'} @@ -3577,6 +4516,16 @@ snapshots: resize-observer-polyfill: 1.5.1 throttle-debounce: 5.0.2 + '@apm-js-collab/code-transformer@0.8.2': {} + + '@apm-js-collab/tracing-hooks@0.3.1': + dependencies: + '@apm-js-collab/code-transformer': 0.8.2 + debug: 4.4.1 + module-details-from-path: 1.0.4 + transitivePeerDependencies: + - supports-color + '@apollo/client-react-streaming@0.11.11(@apollo/client@3.13.5(@types/react@19.2.7)(graphql@16.10.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(graphql@16.10.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@apollo/client': 3.13.5(@types/react@19.2.7)(graphql@16.10.0)(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -3913,6 +4862,22 @@ snapshots: '@csstools/css-tokenizer@3.0.3': {} + '@emnapi/core@1.7.1': + dependencies: + '@emnapi/wasi-threads': 1.1.0 + tslib: 2.8.1 + optional: true + + '@emnapi/runtime@1.7.1': + dependencies: + tslib: 2.8.1 + optional: true + + '@emnapi/wasi-threads@1.1.0': + dependencies: + tslib: 2.8.1 + optional: true + '@emotion/babel-plugin@11.13.5': dependencies: '@babel/helper-module-imports': 7.27.1 @@ -4172,6 +5137,10 @@ snapshots: wrap-ansi: 8.1.0 wrap-ansi-cjs: wrap-ansi@7.0.0 + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + '@jridgewell/gen-mapping@0.3.13': dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -4186,11 +5155,33 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.0': {} + '@jridgewell/sourcemap-codec@1.5.5': {} + '@jridgewell/trace-mapping@0.3.30': dependencies: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.0 + '@mapbox/node-pre-gyp@2.0.3': + dependencies: + consola: 3.4.2 + detect-libc: 2.1.2 + https-proxy-agent: 7.0.6 + node-fetch: 2.7.0 + nopt: 8.1.0 + semver: 7.7.1 + tar: 7.5.2 + transitivePeerDependencies: + - encoding + - supports-color + + '@napi-rs/wasm-runtime@1.0.7': + dependencies: + '@emnapi/core': 1.7.1 + '@emnapi/runtime': 1.7.1 + '@tybys/wasm-util': 0.10.1 + optional: true + '@nodelib/fs.scandir@2.1.5': dependencies: '@nodelib/fs.stat': 2.0.5 @@ -4203,13 +5194,334 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.19.1 + '@opentelemetry/api-logs@0.208.0': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/api@1.9.0': {} + + '@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + + '@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/semantic-conventions': 1.38.0 + + '@opentelemetry/instrumentation-amqplib@0.55.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-connect@0.52.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + '@types/connect': 3.4.38 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-dataloader@0.26.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-express@0.57.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-fs@0.28.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-generic-pool@0.52.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-graphql@0.56.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-hapi@0.55.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-http@0.208.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + forwarded-parse: 2.1.2 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-ioredis@0.56.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.38.2 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-kafkajs@0.18.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-knex@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-koa@0.57.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-lru-memoizer@0.53.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongodb@0.61.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mongoose@0.55.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql2@0.55.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-mysql@0.54.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@types/mysql': 2.15.27 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-pg@0.61.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) + '@types/pg': 8.15.6 + '@types/pg-pool': 2.0.6 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-redis@0.57.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/redis-common': 0.38.2 + '@opentelemetry/semantic-conventions': 1.38.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-tedious@0.27.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@types/tedious': 4.0.14 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation-undici@0.19.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/api-logs': 0.208.0 + import-in-the-middle: 2.0.0 + require-in-the-middle: 8.0.1 + transitivePeerDependencies: + - supports-color + + '@opentelemetry/redis-common@0.38.2': {} + + '@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + + '@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + + '@opentelemetry/semantic-conventions@1.38.0': {} + + '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + + '@oxc-project/types@0.98.0': {} + '@pandacss/is-valid-prop@0.41.0': {} + '@photonjs/core@0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.2.6(@types/node@24.0.8))': + dependencies: + '@brillout/vite-plugin-server-entry': 0.7.15 + '@universal-middleware/cloudflare': 0.4.10(hono@4.10.7)(srvx@0.9.6) + '@universal-middleware/compress': 0.2.34 + '@universal-middleware/core': 0.4.13(hono@4.10.7)(srvx@0.9.6) + '@universal-middleware/express': 0.4.22(hono@4.10.7)(srvx@0.9.6) + '@universal-middleware/sirv': 0.1.24 + estree-walker: 3.0.3 + ts-deepmerge: 7.0.3 + zod: 4.1.13 + optionalDependencies: + vite: 7.2.6(@types/node@24.0.8) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@types/express' + - '@webroute/route' + - elysia + - fastify + - h3 + - hono + - srvx + + '@photonjs/hono@0.1.7(hono@4.10.7)(srvx@0.9.6)(vite@7.2.6(@types/node@24.0.8))': + dependencies: + '@photonjs/core': 0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.2.6(@types/node@24.0.8)) + '@universal-middleware/hono': 0.4.17(hono@4.10.7)(srvx@0.9.6) + optionalDependencies: + vite: 7.2.6(@types/node@24.0.8) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@types/express' + - '@webroute/route' + - elysia + - fastify + - h3 + - hono + - srvx + + '@photonjs/runtime@0.1.10(hono@4.10.7)(rollup@4.46.2)(vite@7.2.6(@types/node@24.0.8))': + dependencies: + '@photonjs/core': 0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.2.6(@types/node@24.0.8)) + '@photonjs/srvx': 0.1.7(hono@4.10.7)(srvx@0.9.6)(vite@7.2.6(@types/node@24.0.8)) + '@universal-middleware/core': 0.4.13(hono@4.10.7)(srvx@0.9.6) + '@universal-middleware/sirv': 0.1.24 + srvx: 0.9.6 + standaloner: 0.1.10(rollup@4.46.2) + optionalDependencies: + vite: 7.2.6(@types/node@24.0.8) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@types/express' + - '@webroute/route' + - elysia + - encoding + - fastify + - h3 + - hono + - rollup + - supports-color + + '@photonjs/srvx@0.1.7(hono@4.10.7)(srvx@0.9.6)(vite@7.2.6(@types/node@24.0.8))': + dependencies: + '@photonjs/core': 0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.2.6(@types/node@24.0.8)) + '@universal-middleware/srvx': 0.1.1(hono@4.10.7)(srvx@0.9.6) + optionalDependencies: + vite: 7.2.6(@types/node@24.0.8) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@types/express' + - '@webroute/route' + - elysia + - fastify + - h3 + - hono + - srvx + '@pkgjs/parseargs@0.11.0': optional: true '@polka/url@1.0.0-next.28': {} + '@prisma/instrumentation@6.19.0(@opentelemetry/api@1.9.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + transitivePeerDependencies: + - supports-color + '@rc-component/async-validator@5.0.4': dependencies: '@babel/runtime': 7.26.10 @@ -4291,8 +5603,62 @@ snapshots: react: 19.2.1 react-redux: 9.2.0(@types/react@19.2.7)(react@19.2.1)(redux@5.0.1) + '@rolldown/binding-android-arm64@1.0.0-beta.51': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.51': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.51': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.51': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.51': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.51': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.51': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.51': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.51': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.51': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.51': + dependencies: + '@napi-rs/wasm-runtime': 1.0.7 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.51': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.51': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.51': + optional: true + '@rolldown/pluginutils@1.0.0-beta.47': {} + '@rolldown/pluginutils@1.0.0-beta.51': {} + + '@rollup/pluginutils@5.3.0(rollup@4.46.2)': + dependencies: + '@types/estree': 1.0.8 + estree-walker: 2.0.2 + picomatch: 4.0.3 + optionalDependencies: + rollup: 4.46.2 + '@rollup/rollup-android-arm-eabi@4.46.2': optional: true @@ -4353,6 +5719,174 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.46.2': optional: true + '@sentry-internal/browser-utils@10.27.0': + dependencies: + '@sentry/core': 10.27.0 + + '@sentry-internal/feedback@10.27.0': + dependencies: + '@sentry/core': 10.27.0 + + '@sentry-internal/replay-canvas@10.27.0': + dependencies: + '@sentry-internal/replay': 10.27.0 + '@sentry/core': 10.27.0 + + '@sentry-internal/replay@10.27.0': + dependencies: + '@sentry-internal/browser-utils': 10.27.0 + '@sentry/core': 10.27.0 + + '@sentry/babel-plugin-component-annotate@4.6.1': {} + + '@sentry/browser@10.27.0': + dependencies: + '@sentry-internal/browser-utils': 10.27.0 + '@sentry-internal/feedback': 10.27.0 + '@sentry-internal/replay': 10.27.0 + '@sentry-internal/replay-canvas': 10.27.0 + '@sentry/core': 10.27.0 + + '@sentry/bundler-plugin-core@4.6.1': + dependencies: + '@babel/core': 7.28.5 + '@sentry/babel-plugin-component-annotate': 4.6.1 + '@sentry/cli': 2.58.2 + dotenv: 16.6.1 + find-up: 5.0.0 + glob: 10.5.0 + magic-string: 0.30.8 + unplugin: 1.0.1 + transitivePeerDependencies: + - encoding + - supports-color + + '@sentry/cli-darwin@2.58.2': + optional: true + + '@sentry/cli-linux-arm64@2.58.2': + optional: true + + '@sentry/cli-linux-arm@2.58.2': + optional: true + + '@sentry/cli-linux-i686@2.58.2': + optional: true + + '@sentry/cli-linux-x64@2.58.2': + optional: true + + '@sentry/cli-win32-arm64@2.58.2': + optional: true + + '@sentry/cli-win32-i686@2.58.2': + optional: true + + '@sentry/cli-win32-x64@2.58.2': + optional: true + + '@sentry/cli@2.58.2': + dependencies: + https-proxy-agent: 5.0.1 + node-fetch: 2.7.0 + progress: 2.0.3 + proxy-from-env: 1.1.0 + which: 2.0.2 + optionalDependencies: + '@sentry/cli-darwin': 2.58.2 + '@sentry/cli-linux-arm': 2.58.2 + '@sentry/cli-linux-arm64': 2.58.2 + '@sentry/cli-linux-i686': 2.58.2 + '@sentry/cli-linux-x64': 2.58.2 + '@sentry/cli-win32-arm64': 2.58.2 + '@sentry/cli-win32-i686': 2.58.2 + '@sentry/cli-win32-x64': 2.58.2 + transitivePeerDependencies: + - encoding + - supports-color + + '@sentry/core@10.27.0': {} + + '@sentry/node-core@10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)': + dependencies: + '@apm-js-collab/tracing-hooks': 0.3.1 + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + '@sentry/core': 10.27.0 + '@sentry/opentelemetry': 10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) + import-in-the-middle: 2.0.0 + transitivePeerDependencies: + - supports-color + + '@sentry/node@10.27.0': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-amqplib': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-connect': 0.52.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-dataloader': 0.26.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-express': 0.57.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-fs': 0.28.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-generic-pool': 0.52.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-graphql': 0.56.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-hapi': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-http': 0.208.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-ioredis': 0.56.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-kafkajs': 0.18.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-knex': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-koa': 0.57.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-lru-memoizer': 0.53.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongodb': 0.61.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mongoose': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql': 0.54.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-mysql2': 0.55.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-pg': 0.61.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-redis': 0.57.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-tedious': 0.27.0(@opentelemetry/api@1.9.0) + '@opentelemetry/instrumentation-undici': 0.19.0(@opentelemetry/api@1.9.0) + '@opentelemetry/resources': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + '@prisma/instrumentation': 6.19.0(@opentelemetry/api@1.9.0) + '@sentry/core': 10.27.0 + '@sentry/node-core': 10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.208.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) + '@sentry/opentelemetry': 10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0) + import-in-the-middle: 2.0.0 + minimatch: 9.0.5 + transitivePeerDependencies: + - supports-color + + '@sentry/opentelemetry@10.27.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.2.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.38.0)': + dependencies: + '@opentelemetry/api': 1.9.0 + '@opentelemetry/context-async-hooks': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/core': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/sdk-trace-base': 2.2.0(@opentelemetry/api@1.9.0) + '@opentelemetry/semantic-conventions': 1.38.0 + '@sentry/core': 10.27.0 + + '@sentry/react@10.27.0(react@19.2.1)': + dependencies: + '@sentry/browser': 10.27.0 + '@sentry/core': 10.27.0 + hoist-non-react-statics: 3.3.2 + react: 19.2.1 + + '@sentry/vite-plugin@4.6.1': + dependencies: + '@sentry/bundler-plugin-core': 4.6.1 + unplugin: 1.0.1 + transitivePeerDependencies: + - encoding + - supports-color + '@simple-libs/child-process-utils@1.0.1': dependencies: '@simple-libs/stream-utils': 1.1.0 @@ -4397,6 +5931,11 @@ snapshots: transitivePeerDependencies: - '@types/react' + '@tybys/wasm-util@0.10.1': + dependencies: + tslib: 2.8.1 + optional: true + '@types/aria-query@5.0.4': {} '@types/babel__core@7.20.5': @@ -4424,10 +5963,18 @@ snapshots: dependencies: '@types/deep-eql': 4.0.2 + '@types/connect@3.4.38': + dependencies: + '@types/node': 24.0.8 + '@types/deep-eql@4.0.2': {} '@types/estree@1.0.8': {} + '@types/mysql@2.15.27': + dependencies: + '@types/node': 24.0.8 + '@types/node@22.15.34': dependencies: undici-types: 6.21.0 @@ -4440,6 +5987,16 @@ snapshots: '@types/parse-json@4.0.2': {} + '@types/pg-pool@2.0.6': + dependencies: + '@types/pg': 8.15.6 + + '@types/pg@8.15.6': + dependencies: + '@types/node': 24.0.8 + pg-protocol: 1.10.3 + pg-types: 2.2.0 + '@types/react-dom@18.3.5(@types/react@19.2.7)': dependencies: '@types/react': 19.2.7 @@ -4454,8 +6011,102 @@ snapshots: '@types/stylis@4.2.5': {} + '@types/tedious@4.0.14': + dependencies: + '@types/node': 24.0.8 + '@types/use-sync-external-store@0.0.6': {} + '@universal-middleware/cloudflare@0.4.10(hono@4.10.7)(srvx@0.9.6)': + dependencies: + '@universal-middleware/core': 0.4.13(hono@4.10.7)(srvx@0.9.6) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@types/express' + - '@webroute/route' + - elysia + - fastify + - h3 + - hono + - srvx + + '@universal-middleware/compress@0.2.34': {} + + '@universal-middleware/core@0.4.13(hono@4.10.7)(srvx@0.9.6)': + dependencies: + regexparam: 3.0.0 + tough-cookie: 6.0.0 + optionalDependencies: + hono: 4.10.7 + srvx: 0.9.6 + + '@universal-middleware/express@0.4.22(hono@4.10.7)(srvx@0.9.6)': + dependencies: + '@universal-middleware/core': 0.4.13(hono@4.10.7)(srvx@0.9.6) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@types/express' + - '@webroute/route' + - elysia + - fastify + - h3 + - hono + - srvx + + '@universal-middleware/hono@0.4.17(hono@4.10.7)(srvx@0.9.6)': + dependencies: + '@universal-middleware/core': 0.4.13(hono@4.10.7)(srvx@0.9.6) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@types/express' + - '@webroute/route' + - elysia + - fastify + - h3 + - hono + - srvx + + '@universal-middleware/sirv@0.1.24': + dependencies: + mrmime: 2.0.1 + totalist: 3.0.1 + + '@universal-middleware/srvx@0.1.1(hono@4.10.7)(srvx@0.9.6)': + dependencies: + '@universal-middleware/core': 0.4.13(hono@4.10.7)(srvx@0.9.6) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@types/express' + - '@webroute/route' + - elysia + - fastify + - h3 + - hono + - srvx + + '@vercel/nft@0.30.4(rollup@4.46.2)': + dependencies: + '@mapbox/node-pre-gyp': 2.0.3 + '@rollup/pluginutils': 5.3.0(rollup@4.46.2) + acorn: 8.15.0 + acorn-import-attributes: 1.9.5(acorn@8.15.0) + async-sema: 3.1.1 + bindings: 1.5.0 + estree-walker: 2.0.2 + glob: 10.5.0 + graceful-fs: 4.2.11 + node-gyp-build: 4.8.4 + picomatch: 4.0.3 + resolve-from: 5.0.0 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + '@vitejs/plugin-react@5.1.1(vite@7.2.6(@types/node@24.0.8))': dependencies: '@babel/core': 7.28.5 @@ -4983,8 +6634,26 @@ snapshots: '@zag-js/utils@0.82.2': {} + abbrev@3.0.1: {} + + acorn-import-attributes@1.9.5(acorn@8.14.1): + dependencies: + acorn: 8.14.1 + + acorn-import-attributes@1.9.5(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn@8.14.1: {} + acorn@8.15.0: {} + + agent-base@6.0.2: + dependencies: + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + agent-base@7.1.3: {} ansi-regex@5.0.1: {} @@ -5057,6 +6726,11 @@ snapshots: - luxon - moment + anymatch@3.1.3: + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + aria-query@5.1.3: dependencies: deep-equal: 2.2.3 @@ -5072,6 +6746,8 @@ snapshots: assertion-error@2.0.1: {} + async-sema@3.1.1: {} + asynckit@0.4.0: {} available-typed-arrays@1.0.7: @@ -5086,6 +6762,12 @@ snapshots: balanced-match@1.0.2: {} + binary-extensions@2.3.0: {} + + bindings@1.5.0: + dependencies: + file-uri-to-path: 1.0.0 + brace-expansion@2.0.1: dependencies: balanced-match: 1.0.2 @@ -5157,6 +6839,22 @@ snapshots: check-error@2.1.1: {} + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + chownr@3.0.0: {} + + cjs-module-lexer@1.4.3: {} + classnames@2.5.1: {} client-only@0.0.1: {} @@ -5180,6 +6878,10 @@ snapshots: compute-scroll-into-view@3.1.1: {} + confbox@0.2.2: {} + + consola@3.4.2: {} + conventional-changelog-angular@8.0.0: dependencies: compare-func: 2.0.0 @@ -5307,6 +7009,8 @@ snapshots: delayed-stream@1.0.0: {} + detect-libc@2.1.2: {} + devalue@4.3.3: {} dom-accessibility-api@0.5.16: {} @@ -5315,6 +7019,8 @@ snapshots: dependencies: is-obj: 2.0.0 + dotenv@16.6.1: {} + dunder-proto@1.0.1: dependencies: call-bind-apply-helpers: 1.0.2 @@ -5423,6 +7129,8 @@ snapshots: escape-string-regexp@4.0.0: {} + estree-walker@2.0.2: {} + estree-walker@3.0.3: dependencies: '@types/estree': 1.0.8 @@ -5441,6 +7149,8 @@ snapshots: expect-type@1.2.1: {} + exsolve@1.0.8: {} + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 @@ -5468,12 +7178,19 @@ snapshots: node-domexception: 1.0.0 web-streams-polyfill: 3.3.3 + file-uri-to-path@1.0.0: {} + fill-range@7.1.1: dependencies: to-regex-range: 5.0.1 find-root@1.1.0: {} + find-up@5.0.0: + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -5494,6 +7211,8 @@ snapshots: dependencies: fetch-blob: 3.2.0 + forwarded-parse@2.1.2: {} + fsevents@2.3.3: optional: true @@ -5538,8 +7257,19 @@ snapshots: package-json-from-dist: 1.0.1 path-scurry: 1.11.1 + glob@10.5.0: + dependencies: + foreground-child: 3.3.1 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + gopd@1.2.0: {} + graceful-fs@4.2.11: {} + graphql-tag@2.12.6(graphql@16.10.0): dependencies: graphql: 16.10.0 @@ -5578,6 +7308,8 @@ snapshots: dependencies: react-is: 16.13.1 + hono@4.10.7: {} + hosted-git-info@8.1.0: dependencies: lru-cache: 10.4.3 @@ -5593,6 +7325,13 @@ snapshots: transitivePeerDependencies: - supports-color + https-proxy-agent@5.0.1: + dependencies: + agent-base: 6.0.2 + debug: 4.4.1 + transitivePeerDependencies: + - supports-color + https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 @@ -5613,6 +7352,13 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-in-the-middle@2.0.0: + dependencies: + acorn: 8.14.1 + acorn-import-attributes: 1.9.5(acorn@8.14.1) + cjs-module-lexer: 1.4.3 + module-details-from-path: 1.0.4 + internal-slot@1.1.0: dependencies: es-errors: 1.3.0 @@ -5636,6 +7382,10 @@ snapshots: dependencies: has-bigints: 1.1.0 + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + is-boolean-object@1.2.2: dependencies: call-bound: 1.0.4 @@ -5762,6 +7512,10 @@ snapshots: lines-and-columns@1.2.4: {} + locate-path@6.0.0: + dependencies: + p-locate: 5.0.0 + loose-envify@1.4.0: dependencies: js-tokens: 4.0.0 @@ -5784,6 +7538,14 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.21: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.5 + + magic-string@0.30.8: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + math-intrinsics@1.1.0: {} meow@13.2.0: {} @@ -5813,6 +7575,12 @@ snapshots: minipass@7.1.2: {} + minizlib@3.1.0: + dependencies: + minipass: 7.1.2 + + module-details-from-path@1.0.4: {} + mrmime@2.0.1: {} ms@2.1.3: {} @@ -5823,20 +7591,32 @@ snapshots: node-domexception@1.0.0: {} + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + node-fetch@3.3.2: dependencies: data-uri-to-buffer: 4.0.1 fetch-blob: 3.2.0 formdata-polyfill: 4.0.10 + node-gyp-build@4.8.4: {} + node-releases@2.0.19: {} + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + normalize-package-data@7.0.0: dependencies: hosted-git-info: 8.1.0 semver: 7.7.1 validate-npm-package-license: 3.0.4 + normalize-path@3.0.0: {} + npm-run-path@4.0.1: dependencies: path-key: 3.1.1 @@ -5874,6 +7654,14 @@ snapshots: '@wry/trie': 0.5.0 tslib: 2.8.1 + p-limit@3.1.0: + dependencies: + yocto-queue: 0.1.0 + + p-locate@5.0.0: + dependencies: + p-limit: 3.1.0 + package-json-from-dist@1.0.1: {} parent-module@1.0.1: @@ -5891,6 +7679,8 @@ snapshots: dependencies: entities: 4.5.0 + path-exists@4.0.0: {} + path-key@3.1.1: {} path-parse@1.0.7: {} @@ -5910,6 +7700,18 @@ snapshots: perfect-freehand@1.2.2: {} + pg-int8@1.0.1: {} + + pg-protocol@1.10.3: {} + + pg-types@2.2.0: + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -5920,6 +7722,12 @@ snapshots: dependencies: pngjs: 6.0.0 + pkg-types@2.3.0: + dependencies: + confbox: 0.2.2 + exsolve: 1.0.8 + pathe: 2.0.3 + playwright-chromium@1.57.0: dependencies: playwright-core: 1.57.0 @@ -5944,6 +7752,16 @@ snapshots: picocolors: 1.1.1 source-map-js: 1.2.1 + postgres-array@2.0.0: {} + + postgres-bytea@1.0.0: {} + + postgres-date@1.0.7: {} + + postgres-interval@1.2.0: + dependencies: + xtend: 4.0.2 + prettier@3.5.3: {} pretty-format@27.5.1: @@ -5952,6 +7770,8 @@ snapshots: ansi-styles: 5.2.0 react-is: 17.0.2 + progress@2.0.3: {} + prop-types@15.8.1: dependencies: loose-envify: 1.4.0 @@ -5960,6 +7780,8 @@ snapshots: proxy-compare@3.0.1: {} + proxy-from-env@1.1.0: {} + proxy-memoize@3.0.1: dependencies: proxy-compare: 3.0.1 @@ -6331,6 +8153,10 @@ snapshots: react@19.2.1: {} + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + redux-thunk@3.1.0(redux@5.0.1): dependencies: redux: 5.0.1 @@ -6348,11 +8174,20 @@ snapshots: gopd: 1.2.0 set-function-name: 2.0.2 + regexparam@3.0.0: {} + rehackt@0.1.0(@types/react@19.2.7)(react@19.2.1): optionalDependencies: '@types/react': 19.2.7 react: 19.2.1 + require-in-the-middle@8.0.1: + dependencies: + debug: 4.4.1 + module-details-from-path: 1.0.4 + transitivePeerDependencies: + - supports-color + requires-port@1.0.0: {} reselect@5.1.1: {} @@ -6361,6 +8196,8 @@ snapshots: resolve-from@4.0.0: {} + resolve-from@5.0.0: {} + resolve@1.22.10: dependencies: is-core-module: 2.16.1 @@ -6373,6 +8210,26 @@ snapshots: dependencies: glob: 10.4.5 + rolldown@1.0.0-beta.51: + dependencies: + '@oxc-project/types': 0.98.0 + '@rolldown/pluginutils': 1.0.0-beta.51 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.51 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.51 + '@rolldown/binding-darwin-x64': 1.0.0-beta.51 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.51 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.51 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.51 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.51 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.51 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.51 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.51 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.51 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.51 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.51 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.51 + rollup@4.46.2: dependencies: '@types/estree': 1.0.8 @@ -6518,8 +8375,34 @@ snapshots: spdx-license-ids@3.0.21: {} + srvx@0.9.6: {} + stackback@0.0.2: {} + standaloner@0.1.10(rollup@4.46.2): + dependencies: + '@vercel/nft': 0.30.4(rollup@4.46.2) + acorn: 8.15.0 + estree-walker: 3.0.3 + magic-string: 0.30.21 + rolldown: 1.0.0-beta.51 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + + standaloner@0.1.11(rollup@4.46.2): + dependencies: + '@vercel/nft': 0.30.4(rollup@4.46.2) + acorn: 8.15.0 + estree-walker: 3.0.3 + magic-string: 0.30.21 + rolldown: 1.0.0-beta.51 + transitivePeerDependencies: + - encoding + - rollup + - supports-color + std-env@3.9.0: {} stop-iteration-iterator@1.1.0: @@ -6590,6 +8473,14 @@ snapshots: symbol-tree@3.2.4: {} + tar@7.5.2: + dependencies: + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.1.0 + yallist: 5.0.0 + throttle-debounce@5.0.2: {} tinybench@2.9.0: {} @@ -6607,6 +8498,12 @@ snapshots: tinyspy@4.0.3: {} + tldts-core@7.0.19: {} + + tldts@7.0.19: + dependencies: + tldts-core: 7.0.19 + to-regex-range@5.0.1: dependencies: is-number: 7.0.0 @@ -6622,10 +8519,18 @@ snapshots: universalify: 0.2.0 url-parse: 1.5.10 + tough-cookie@6.0.0: + dependencies: + tldts: 7.0.19 + + tr46@0.0.3: {} + tr46@5.1.0: dependencies: punycode: 2.3.1 + ts-deepmerge@7.0.3: {} + ts-invariant@0.10.3: dependencies: tslib: 2.8.1 @@ -6647,6 +8552,13 @@ snapshots: universalify@0.2.0: {} + unplugin@1.0.1: + dependencies: + acorn: 8.14.1 + chokidar: 3.6.0 + webpack-sources: 3.3.3 + webpack-virtual-modules: 0.5.0 + update-browserslist-db@1.1.3(browserslist@4.24.4): dependencies: browserslist: 4.24.4 @@ -6669,6 +8581,41 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + vike-photon@0.1.23(@photonjs/core@0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.2.6(@types/node@24.0.8)))(@photonjs/runtime@0.1.10(hono@4.10.7)(rollup@4.46.2)(vite@7.2.6(@types/node@24.0.8)))(hono@4.10.7)(rollup@4.46.2)(srvx@0.9.6)(vike@0.4.249(react-streaming@0.4.14(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.2.6(@types/node@24.0.8)))(vite@7.2.6(@types/node@24.0.8)): + dependencies: + '@brillout/picocolors': 1.0.29 + '@brillout/vite-plugin-server-entry': 0.7.15 + '@photonjs/core': 0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.2.6(@types/node@24.0.8)) + '@photonjs/runtime': 0.1.10(hono@4.10.7)(rollup@4.46.2)(vite@7.2.6(@types/node@24.0.8)) + '@universal-middleware/compress': 0.2.34 + '@universal-middleware/core': 0.4.13(hono@4.10.7)(srvx@0.9.6) + '@universal-middleware/sirv': 0.1.24 + pkg-types: 2.3.0 + standaloner: 0.1.11(rollup@4.46.2) + vike: 0.4.249(react-streaming@0.4.14(react@19.2.1))(vite@7.2.6) + optionalDependencies: + vite: 7.2.6(@types/node@24.0.8) + transitivePeerDependencies: + - '@cloudflare/workers-types' + - '@hattip/core' + - '@types/express' + - '@webroute/route' + - elysia + - encoding + - fastify + - h3 + - hono + - rollup + - srvx + - supports-color + + vike-react@0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.249(react-streaming@0.4.14(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.2.6(@types/node@24.0.8))): + dependencies: + react: 19.2.1 + react-dom: 19.2.1(react@19.2.1) + react-streaming: 0.4.14(react-dom@19.2.1(react@19.2.1))(react@19.2.1) + vike: 0.4.249(react-streaming@0.4.14(react@19.2.1))(vite@7.2.6) + vike@0.4.249(react-streaming@0.4.14(react@19.2.1))(vite@7.2.6): dependencies: '@brillout/import': 0.2.6 @@ -6676,12 +8623,12 @@ snapshots: '@brillout/picocolors': 1.0.29 '@brillout/require-shim': 0.1.2 '@brillout/vite-plugin-server-entry': 0.7.15 - acorn: 8.14.1 + acorn: 8.15.0 cac: 6.7.14 es-module-lexer: 1.7.0 esbuild: 0.25.1 json5: 2.2.3 - magic-string: 0.30.17 + magic-string: 0.30.21 picomatch: 4.0.3 semver: 7.7.1 sirv: 3.0.1 @@ -6774,8 +8721,14 @@ snapshots: web-streams-polyfill@3.3.3: {} + webidl-conversions@3.0.1: {} + webidl-conversions@7.0.0: {} + webpack-sources@3.3.3: {} + + webpack-virtual-modules@0.5.0: {} + whatwg-encoding@3.1.1: dependencies: iconv-lite: 0.6.3 @@ -6787,6 +8740,11 @@ snapshots: tr46: 5.1.0 webidl-conversions: 7.0.0 + whatwg-url@5.0.0: + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -6841,16 +8799,24 @@ snapshots: xmlchars@2.2.0: {} + xtend@4.0.2: {} + yallist@3.1.1: {} + yallist@5.0.0: {} + yaml@1.10.2: {} + yocto-queue@0.1.0: {} + zen-observable-ts@1.2.5: dependencies: zen-observable: 0.8.15 zen-observable@0.8.15: {} + zod@4.1.13: {} + zustand@5.0.8(@types/react@19.2.7)(immer@10.1.3)(react@19.2.1)(use-sync-external-store@1.4.0(react@19.2.1)): optionalDependencies: '@types/react': 19.2.7 From bf74ae8152e5cf081001f08a0af95f1fe633d9e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Mon, 15 Dec 2025 00:32:41 +0100 Subject: [PATCH 03/19] fix: update server path in photon config and add server entry plugin for Sentry instrumentation --- examples/sentry/pages/+config.ts | 2 +- packages/vike-react-sentry/package.json | 2 ++ .../onCreateGlobalContext-server.ts | 2 -- .../vike-react-sentry/src/plugin/index.ts | 24 +++++++++++++++++++ pnpm-lock.yaml | 20 ++++------------ 5 files changed, 31 insertions(+), 19 deletions(-) diff --git a/examples/sentry/pages/+config.ts b/examples/sentry/pages/+config.ts index 9ff8d7da3..7b14dad84 100644 --- a/examples/sentry/pages/+config.ts +++ b/examples/sentry/pages/+config.ts @@ -12,7 +12,7 @@ const config = { // Photon configuration photon: { - server: 'server/index.ts' + server: '../server/index.ts' }, // Sentry configuration diff --git a/packages/vike-react-sentry/package.json b/packages/vike-react-sentry/package.json index 80fde0ce7..89c5a52b3 100644 --- a/packages/vike-react-sentry/package.json +++ b/packages/vike-react-sentry/package.json @@ -22,6 +22,7 @@ "release:commit": "release-me commit" }, "peerDependencies": { + "@brillout/vite-plugin-server-entry": ">=0.7.0", "@sentry/react": ">=10.0.0", "@sentry/node": ">=10.0.0", "@sentry/vite-plugin": ">=4.0.0", @@ -31,6 +32,7 @@ }, "devDependencies": { "@brillout/release-me": "^0.4.8", + "@brillout/vite-plugin-server-entry": "^0.7.15", "@sentry/react": "^10.22.0", "@sentry/node": "^10.22.0", "@sentry/vite-plugin": "^4.6.0", diff --git a/packages/vike-react-sentry/src/integration/onCreateGlobalContext-server.ts b/packages/vike-react-sentry/src/integration/onCreateGlobalContext-server.ts index 2da6a5ffe..29cf61092 100644 --- a/packages/vike-react-sentry/src/integration/onCreateGlobalContext-server.ts +++ b/packages/vike-react-sentry/src/integration/onCreateGlobalContext-server.ts @@ -14,8 +14,6 @@ async function onCreateGlobalContext(globalContext: { config: PageContext['confi ...server, } - // This has to run before server entry is imported - // https://docs.sentry.io/platforms/javascript/guides/node/install/esm-without-import/ SentryNode.init(finalConfig) } } diff --git a/packages/vike-react-sentry/src/plugin/index.ts b/packages/vike-react-sentry/src/plugin/index.ts index 2f5916a11..c2eefbbc5 100644 --- a/packages/vike-react-sentry/src/plugin/index.ts +++ b/packages/vike-react-sentry/src/plugin/index.ts @@ -1,6 +1,7 @@ export { vikeReactSentry } import { sentryVitePlugin } from '@sentry/vite-plugin' +import { serverProductionEntryPlugin } from '@brillout/vite-plugin-server-entry/plugin' import { getVikeConfig } from 'vike/plugin' import type { Plugin } from 'vite' import type { SentryConfig } from '../integration/+config.js' @@ -34,5 +35,28 @@ const vikeReactSentry = async () => { plugins.push(...sentryPlugins) } + // Add server production entry plugin to inject Sentry instrumentation + // This preloads OpenTelemetry instrumentation before any other server code is imported, + // which is required for ESM instrumentation (e.g., to instrument database drivers, HTTP clients, etc.) + // https://docs.sentry.io/platforms/javascript/guides/node/install/esm-without-import/ + // + // We use preloadOpenTelemetry() to set up instrumentation hooks without initializing Sentry. + // The actual Sentry.init() with config will be called later via onCreateGlobalContext. + plugins.push( + ...serverProductionEntryPlugin({ + getServerProductionEntry: () => { + return ` +// vike-react-sentry: Preload OpenTelemetry instrumentation for ESM +// This runs before the main server entry to enable monkey-patching of libraries +// The actual Sentry.init() with config will be called later via onCreateGlobalContext +// https://docs.sentry.io/platforms/javascript/guides/node/install/esm-without-import/ +import { preloadOpenTelemetry } from '@sentry/node'; +preloadOpenTelemetry(); +` + }, + libraryName: 'vike-react-sentry', + }), + ) + return plugins } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 091877a9b..fe365ec4e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -538,6 +538,9 @@ importers: '@brillout/release-me': specifier: ^0.4.8 version: 0.4.11(conventional-commits-filter@5.0.0) + '@brillout/vite-plugin-server-entry': + specifier: ^0.7.15 + version: 0.7.15 '@sentry/node': specifier: ^10.22.0 version: 10.27.0 @@ -4010,9 +4013,6 @@ packages: stackback@0.0.2: resolution: {integrity: sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==} - standaloner@0.1.10: - resolution: {integrity: sha512-ludcfacLKvLYfB+/XgMifuK1AErPJqj4kI8E0vujn7NltoSVeMjYoOzV6gu8sbfD1Lqf3883P/Pm0BZ5zfKOFQ==} - standaloner@0.1.11: resolution: {integrity: sha512-JeLFj5rKTmy3UJj7/oGUVnmFaBIWmJQVP5Hv3s2D6Ju8kVPZYbGxOhMQS45QiEr2V0ngI83d/Vv4Zh62Ojs/rQ==} @@ -5477,7 +5477,7 @@ snapshots: '@universal-middleware/core': 0.4.13(hono@4.10.7)(srvx@0.9.6) '@universal-middleware/sirv': 0.1.24 srvx: 0.9.6 - standaloner: 0.1.10(rollup@4.46.2) + standaloner: 0.1.11(rollup@4.46.2) optionalDependencies: vite: 7.2.6(@types/node@24.0.8) transitivePeerDependencies: @@ -8379,18 +8379,6 @@ snapshots: stackback@0.0.2: {} - standaloner@0.1.10(rollup@4.46.2): - dependencies: - '@vercel/nft': 0.30.4(rollup@4.46.2) - acorn: 8.15.0 - estree-walker: 3.0.3 - magic-string: 0.30.21 - rolldown: 1.0.0-beta.51 - transitivePeerDependencies: - - encoding - - rollup - - supports-color - standaloner@0.1.11(rollup@4.46.2): dependencies: '@vercel/nft': 0.30.4(rollup@4.46.2) From 86f4a680dc61a68ed2c2d490cc47419ab5304eac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Mon, 15 Dec 2025 00:33:06 +0100 Subject: [PATCH 04/19] refactor: remove redundant comments regarding Sentry instrumentation setup --- packages/vike-react-sentry/src/plugin/index.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/packages/vike-react-sentry/src/plugin/index.ts b/packages/vike-react-sentry/src/plugin/index.ts index c2eefbbc5..82ceabdc8 100644 --- a/packages/vike-react-sentry/src/plugin/index.ts +++ b/packages/vike-react-sentry/src/plugin/index.ts @@ -35,13 +35,6 @@ const vikeReactSentry = async () => { plugins.push(...sentryPlugins) } - // Add server production entry plugin to inject Sentry instrumentation - // This preloads OpenTelemetry instrumentation before any other server code is imported, - // which is required for ESM instrumentation (e.g., to instrument database drivers, HTTP clients, etc.) - // https://docs.sentry.io/platforms/javascript/guides/node/install/esm-without-import/ - // - // We use preloadOpenTelemetry() to set up instrumentation hooks without initializing Sentry. - // The actual Sentry.init() with config will be called later via onCreateGlobalContext. plugins.push( ...serverProductionEntryPlugin({ getServerProductionEntry: () => { From 1ce4aa725c0f806c31979f6a5cba1c659508e7b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Mon, 15 Dec 2025 01:46:13 +0100 Subject: [PATCH 05/19] refactor: update Sentry configuration and improve plugin integration --- examples/sentry/.gitignore | 2 ++ examples/sentry/pages/+config.ts | 3 +-- .../src/integration/+config.ts | 6 ++---- .../vike-react-sentry/src/plugin/index.ts | 21 ++++++++++++------- 4 files changed, 19 insertions(+), 13 deletions(-) diff --git a/examples/sentry/.gitignore b/examples/sentry/.gitignore index 89b4b9a5c..c24c6c95b 100644 --- a/examples/sentry/.gitignore +++ b/examples/sentry/.gitignore @@ -4,3 +4,5 @@ node_modules/ *.log .env .env.local +.env.production + diff --git a/examples/sentry/pages/+config.ts b/examples/sentry/pages/+config.ts index 7b14dad84..773174765 100644 --- a/examples/sentry/pages/+config.ts +++ b/examples/sentry/pages/+config.ts @@ -39,8 +39,7 @@ const config = { // Vite plugin configuration for sourcemap uploads (optional) // Uncomment and configure for production builds // vitePlugin: { - // org: 'your-sentry-org', - // project: 'your-sentry-project', + // project: 'your-project-name', // authToken: process.env.SENTRY_AUTH_TOKEN, // } } diff --git a/packages/vike-react-sentry/src/integration/+config.ts b/packages/vike-react-sentry/src/integration/+config.ts index ae78a8f7a..1781e3ee5 100644 --- a/packages/vike-react-sentry/src/integration/+config.ts +++ b/packages/vike-react-sentry/src/integration/+config.ts @@ -4,7 +4,7 @@ import type { Config } from 'vike/types' import type * as SentryReact from '@sentry/react' import type * as SentryNode from '@sentry/node' import type { SentryVitePluginOptions } from '@sentry/vite-plugin' -import { vikeReactSentry} from '../plugin/index.js' +import { getViteConfig } from '../plugin/index.js' import 'vike-react/config' @@ -26,9 +26,7 @@ const config = { global: true }, }, - vite: { - plugins: [vikeReactSentry()], - }, + vite: getViteConfig, } satisfies Config export interface SentryCommonOptions { diff --git a/packages/vike-react-sentry/src/plugin/index.ts b/packages/vike-react-sentry/src/plugin/index.ts index 82ceabdc8..6ed81628e 100644 --- a/packages/vike-react-sentry/src/plugin/index.ts +++ b/packages/vike-react-sentry/src/plugin/index.ts @@ -1,15 +1,12 @@ -export { vikeReactSentry } +export { getViteConfig } import { sentryVitePlugin } from '@sentry/vite-plugin' import { serverProductionEntryPlugin } from '@brillout/vite-plugin-server-entry/plugin' import { getVikeConfig } from 'vike/plugin' -import type { Plugin } from 'vite' +import type { Plugin, InlineConfig } from 'vite' import type { SentryConfig } from '../integration/+config.js' -// Return `PluginInterop` instead of `Plugin` to avoid type mismatch upon different Vite versions -const vikeReactSentry = async () => { - const plugins: Plugin[] = [] - +async function getViteConfig(): Promise { // Wait for vike config to be available await new Promise((resolve) => setTimeout(resolve, 100)) @@ -30,6 +27,8 @@ const vikeReactSentry = async () => { } } + const plugins: Plugin[] = [] + if (vitePluginOptions) { const sentryPlugins = sentryVitePlugin(vitePluginOptions) plugins.push(...sentryPlugins) @@ -51,5 +50,13 @@ preloadOpenTelemetry(); }), ) - return plugins + return { + plugins, + // Enable sourcemaps for Sentry if vitePlugin is configured + ...(vitePluginOptions && { + build: { + sourcemap: true, + }, + }), + } } From 108bd39a90e76a76a46e58fde99f603d3470bf1e Mon Sep 17 00:00:00 2001 From: Romuald Brillout Date: Wed, 17 Dec 2025 15:52:37 +0100 Subject: [PATCH 06/19] align tsconfig.json --- packages/vike-react-sentry/tsconfig.json | 35 ++++++++++++++---------- 1 file changed, 21 insertions(+), 14 deletions(-) diff --git a/packages/vike-react-sentry/tsconfig.json b/packages/vike-react-sentry/tsconfig.json index d10460e03..abdf7fb0a 100644 --- a/packages/vike-react-sentry/tsconfig.json +++ b/packages/vike-react-sentry/tsconfig.json @@ -1,21 +1,28 @@ { + "include": ["./src"], + "exclude": ["**/*.spec.ts"], "compilerOptions": { - "outDir": "./dist/", - "target": "ES2020", - "module": "Node16", - "moduleResolution": "Node16", - "lib": ["ES2021", "DOM", "DOM.Iterable"], - "types": ["vite/client"], + // Misc + "skipLibCheck": true, + "noErrorTruncation": true, + // Strictness "strict": true, "noUncheckedIndexedAccess": true, - "noImplicitAny": true, - "declaration": true, - "noEmitOnError": false, - "rootDir": "./src/", + "noUnusedLocals": true, + "noUnusedParameters": true, + // Resolution "esModuleInterop": true, - "skipLibCheck": true, + "moduleResolution": "Node16", + // Libs + "lib": ["DOM", "DOM.Iterable", "ES2022"], + "types": ["vite/client", "vike-react"], + // Output + "target": "ES2020", + "module": "Node16", + "outDir": "./dist/", + "rootDir": "./src/", + "declaration": true, + // React "jsx": "react" - }, - "include": ["./src"] + } } - From 7f34286eb6a1cdb8b4d62b6e479573d34c0c69a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Wed, 17 Dec 2025 22:20:59 +0100 Subject: [PATCH 07/19] feat: enhance Sentry integration with new configuration options and utility functions --- examples/sentry/pages/+config.ts | 38 +--- examples/sentry/pages/my-ingetration.ts | 3 + packages/vike-react-sentry/package.json | 4 + .../src/integration/+config.ts | 49 +---- .../onCreateGlobalContext-client.ts | 21 ++- .../onCreateGlobalContext-server.ts | 21 ++- .../vike-react-sentry/src/plugin/index.ts | 169 +++++++++++++++--- packages/vike-react-sentry/src/types.ts | 20 +++ .../vike-react-sentry/src/utils/assignDeep.ts | 32 ++++ .../vike-react-sentry/src/utils/resolveDsn.ts | 3 + packages/vike-react-sentry/tsconfig.json | 2 +- 11 files changed, 244 insertions(+), 118 deletions(-) create mode 100644 examples/sentry/pages/my-ingetration.ts create mode 100644 packages/vike-react-sentry/src/types.ts create mode 100644 packages/vike-react-sentry/src/utils/assignDeep.ts create mode 100644 packages/vike-react-sentry/src/utils/resolveDsn.ts diff --git a/examples/sentry/pages/+config.ts b/examples/sentry/pages/+config.ts index 773174765..48a562004 100644 --- a/examples/sentry/pages/+config.ts +++ b/examples/sentry/pages/+config.ts @@ -4,43 +4,17 @@ import type { Config } from 'vike/types' import vikeReact from 'vike-react/config' import vikePhoton from 'vike-photon/config' import vikeReactSentry from 'vike-react-sentry/config' +import { myIntegration } from './my-ingetration' const config = { title: 'Vike + React + Sentry Example', - extends: [vikeReact, vikePhoton, vikeReactSentry], - + sentry: { + tracesSampleRate: 1.0, + dsn: "https://8de66fe8dda3a86d986df8ee3aa09f72@o4510438936412161.ingest.de.sentry.io/4510438941655120" + }, // Photon configuration photon: { - server: '../server/index.ts' + server: '../server/index.ts', }, - - // Sentry configuration - sentry: { - // ⚠️ Replace with your actual Sentry DSN - // Get it from: https://sentry.io/settings/[your-org]/projects/[your-project]/keys/ - dsn: 'https://8de66fe8dda3a86d986df8ee3aa09f72@o4510438936412161.ingest.de.sentry.io/4510438941655120', - - // Common options for both client and server - environment: process.env.NODE_ENV || 'development', - tracesSampleRate: 1.0, - - // Client-specific configuration (browser) - client: { - // You can add custom beforeSend, integrations, etc. - // These will override the defaults - }, - - // Server-specific configuration (Node.js) - server: { - // Server-specific options - }, - - // Vite plugin configuration for sourcemap uploads (optional) - // Uncomment and configure for production builds - // vitePlugin: { - // project: 'your-project-name', - // authToken: process.env.SENTRY_AUTH_TOKEN, - // } - } } satisfies Config diff --git a/examples/sentry/pages/my-ingetration.ts b/examples/sentry/pages/my-ingetration.ts new file mode 100644 index 000000000..8155ee813 --- /dev/null +++ b/examples/sentry/pages/my-ingetration.ts @@ -0,0 +1,3 @@ +export const myIntegration = () =>{ + +} diff --git a/packages/vike-react-sentry/package.json b/packages/vike-react-sentry/package.json index 89c5a52b3..61c909506 100644 --- a/packages/vike-react-sentry/package.json +++ b/packages/vike-react-sentry/package.json @@ -6,6 +6,7 @@ "exports": { "./config": "./dist/integration/+config.js", "./plugin": "./dist/plugin/index.js", + "./types": "./dist/types.js", "./__internal/integration/Head": "./dist/integration/Head.js", "./__internal/integration/onCreateGlobalContext": { "browser": "./dist/integration/onCreateGlobalContext-client.js", @@ -59,6 +60,9 @@ "plugin": [ "dist/plugin/index.d.ts" ], + "types": [ + "dist/types.d.ts" + ], "__internal/integration/onCreateGlobalContext": [ "dist/integration/onCreateGlobalContext.d.ts" ], diff --git a/packages/vike-react-sentry/src/integration/+config.ts b/packages/vike-react-sentry/src/integration/+config.ts index 1781e3ee5..95674638a 100644 --- a/packages/vike-react-sentry/src/integration/+config.ts +++ b/packages/vike-react-sentry/src/integration/+config.ts @@ -1,12 +1,10 @@ export { config as default } import type { Config } from 'vike/types' -import type * as SentryReact from '@sentry/react' -import type * as SentryNode from '@sentry/node' -import type { SentryVitePluginOptions } from '@sentry/vite-plugin' import { getViteConfig } from '../plugin/index.js' - import 'vike-react/config' +import { SentryOptions } from '../types.js' +import { SentryVitePluginOptions } from '@sentry/vite-plugin' const config = { name: 'vike-react-sentry', @@ -23,50 +21,21 @@ const config = { client: true, config: true, }, - global: true + global: true, + cumulative: true, }, }, vite: getViteConfig, } satisfies Config -export interface SentryCommonOptions { - /** Sentry DSN (Data Source Name) */ - dsn?: string - /** Environment name (e.g., 'production', 'development') */ - environment?: string - /** Release version identifier */ - release?: string - /** Enable debug mode */ - debug?: boolean - /** Sample rate for error events (0.0 to 1.0) */ - sampleRate?: number - /** Sample rate for performance tracing (0.0 to 1.0) */ - tracesSampleRate?: number - /** Enable or disable Sentry */ - enabled?: boolean - /** Maximum number of breadcrumbs */ - maxBreadcrumbs?: number - /** Send default PII (Personally Identifiable Information) */ - sendDefaultPii?: boolean -} - -export interface SentryConfig extends SentryCommonOptions { - /** Sentry configuration for the client (browser) */ - client?: SentryReact.BrowserOptions - - /** Sentry configuration for the server (Node.js) */ - server?: SentryNode.NodeOptions - - /** Sentry Vite plugin configuration for sourcemap upload */ - vitePlugin?: SentryVitePluginOptions -} - declare global { namespace Vike { interface Config { - /** Sentry configuration for client, server, and build-time */ - sentry?: SentryConfig + sentry?: SentryOptions + } + + interface ConfigResolved { + sentry?: SentryOptions[] } } } - diff --git a/packages/vike-react-sentry/src/integration/onCreateGlobalContext-client.ts b/packages/vike-react-sentry/src/integration/onCreateGlobalContext-client.ts index c3a88d5a0..dc1bf0b85 100644 --- a/packages/vike-react-sentry/src/integration/onCreateGlobalContext-client.ts +++ b/packages/vike-react-sentry/src/integration/onCreateGlobalContext-client.ts @@ -2,19 +2,18 @@ export { onCreateGlobalContext } import * as SentryReact from '@sentry/react' import type { PageContext } from 'vike/types' +import { resolveDsn } from '../utils/resolveDsn.js' +import { assignDeep } from '../utils/assignDeep.js' async function onCreateGlobalContext(globalContext: { config: PageContext['config'] }): Promise { - const sentryConfig = globalContext.config.sentry - if (!sentryConfig) return - if (sentryConfig.client && !SentryReact.getClient()) { - const { client, vitePlugin, server, ...commonOptions } = sentryConfig - - const finalConfig = { - ...commonOptions, + if (!globalContext.config.sentry?.length) return + const clientConfig = globalContext.config.sentry.reverse().reduce((acc, curr) => assignDeep(acc, curr), {}) + if (!clientConfig) return + if (!SentryReact.getClient()) { + SentryReact.init({ integrations: [SentryReact.browserTracingIntegration()], - ...client, - } - - SentryReact.init(finalConfig) + ...clientConfig, + dsn: resolveDsn(clientConfig.dsn), + }) } } diff --git a/packages/vike-react-sentry/src/integration/onCreateGlobalContext-server.ts b/packages/vike-react-sentry/src/integration/onCreateGlobalContext-server.ts index 29cf61092..0013c98bf 100644 --- a/packages/vike-react-sentry/src/integration/onCreateGlobalContext-server.ts +++ b/packages/vike-react-sentry/src/integration/onCreateGlobalContext-server.ts @@ -2,18 +2,17 @@ export { onCreateGlobalContext } import * as SentryNode from '@sentry/node' import type { PageContext } from 'vike/types' +import { resolveDsn } from '../utils/resolveDsn.js' +import { assignDeep } from '../utils/assignDeep.js' async function onCreateGlobalContext(globalContext: { config: PageContext['config'] }): Promise { - const sentryConfig = globalContext.config.sentry - if (!sentryConfig) return - if (sentryConfig.server && !SentryNode.getClient()) { - const { client, vitePlugin, server, ...commonOptions } = sentryConfig - - const finalConfig = { - ...commonOptions, - ...server, - } - - SentryNode.init(finalConfig) + if (!globalContext.config.sentry?.length) return + const serverConfig = globalContext.config.sentry.reverse().reduce((acc, curr) => assignDeep(acc, curr), {}) + if (!serverConfig) return + if (!SentryNode.getClient()) { + SentryNode.init({ + ...serverConfig, + dsn: resolveDsn(serverConfig.dsn), + }) } } diff --git a/packages/vike-react-sentry/src/plugin/index.ts b/packages/vike-react-sentry/src/plugin/index.ts index 6ed81628e..4499bb133 100644 --- a/packages/vike-react-sentry/src/plugin/index.ts +++ b/packages/vike-react-sentry/src/plugin/index.ts @@ -1,39 +1,106 @@ export { getViteConfig } -import { sentryVitePlugin } from '@sentry/vite-plugin' +import { sentryVitePlugin, SentryVitePluginOptions } from '@sentry/vite-plugin' import { serverProductionEntryPlugin } from '@brillout/vite-plugin-server-entry/plugin' import { getVikeConfig } from 'vike/plugin' import type { Plugin, InlineConfig } from 'vite' -import type { SentryConfig } from '../integration/+config.js' +import { assertUsage } from '../utils/assert.js' +import { assignDeep } from '../utils/assignDeep.js' -async function getViteConfig(): Promise { - // Wait for vike config to be available - await new Promise((resolve) => setTimeout(resolve, 100)) - - // Get sentry config from vike config - const vikeConfig = getVikeConfig() - const sentryConfig = vikeConfig.config.sentry as SentryConfig | undefined - - const { client, server, vitePlugin, ...commonOptions } = sentryConfig || {} - let vitePluginOptions = vitePlugin - - if (vitePluginOptions && commonOptions.release) { - vitePluginOptions = { - ...vitePluginOptions, - release: { - name: commonOptions.release, - ...vitePluginOptions.release, - }, - } - } +// Cache for auto-detected project info to avoid multiple API calls (global to survive module reloads) +declare global { + var __vike_react_sentry_vite_options_promise: Promise | undefined +} +async function getViteConfig(): Promise { const plugins: Plugin[] = [] + plugins.push({ + enforce: 'post', + name: 'vike-react-sentry:config-resolver', + configResolved() { + globalThis.__vike_react_sentry_vite_options_promise ??= (async () => { + const vikeConfig = getVikeConfig() + const sentryConfigRaw = vikeConfig.config.sentry || [] + const sentryConfig = sentryConfigRaw.toReversed().reduce((acc, curr) => assignDeep(acc, curr), {}) + const effectiveDsn = sentryConfig.dsn || process.env['PUBLIC_ENV__SENTRY_DSN'] + assertUsage( + !process.env['SENTRY_DSN'], + 'SENTRY_DSN is not supported. Use PUBLIC_ENV__SENTRY_DSN instead, or set dsn in your sentry config.', + ) + assertUsage( + effectiveDsn, + 'Sentry DSN is required. Set PUBLIC_ENV__SENTRY_DSN env var, or set dsn in your sentry config.', + ) + + let vitePluginOptions = sentryConfig.vite + // Resolve env fallbacks for vitePlugin options (effect doesn't have access to .env file vars) + if (vitePluginOptions || process.env['SENTRY_AUTH_TOKEN']) { + vitePluginOptions = { + ...vitePluginOptions, + authToken: vitePluginOptions?.authToken || process.env['SENTRY_AUTH_TOKEN'], + org: vitePluginOptions?.org || process.env['SENTRY_ORG'], + project: vitePluginOptions?.project || process.env['SENTRY_PROJECT'], + url: vitePluginOptions?.url || process.env['SENTRY_URL'], + } + } + if (vitePluginOptions && sentryConfig.release) { + vitePluginOptions = { + ...vitePluginOptions, + release: { + name: sentryConfig.release, + ...vitePluginOptions.release, + }, + } + } + + // Auto-detect project and org slug from DSN if not provided + if (vitePluginOptions && !vitePluginOptions.project && !vitePluginOptions.org) { + const authToken = vitePluginOptions.authToken + const sentryUrl = vitePluginOptions.url + const projectId = getProjectIdFromDsn(effectiveDsn) + + if (authToken && projectId) { + const projectInfo = await getProjectInfoFromApi(authToken, projectId, effectiveDsn, sentryUrl) + if (projectInfo) { + vitePluginOptions = { + ...vitePluginOptions, + project: projectInfo.projectSlug, + org: projectInfo.orgSlug, + } + } + } + } + + // Cache resolved config globally to make it accessible in onCreateGlobalContext + return vitePluginOptions + })() + }, + }) + + if (!globalThis.__vike_react_sentry_vite_options_promise) { + return { + plugins, + } + } + const vitePluginOptions = await globalThis.__vike_react_sentry_vite_options_promise if (vitePluginOptions) { const sentryPlugins = sentryVitePlugin(vitePluginOptions) plugins.push(...sentryPlugins) } + plugins.push({ + name: 'vike-react-sentry:remove-sensitive-info', + buildStart(options) { + const vikeConfig = getVikeConfig() + const sentryConfigRaw = vikeConfig.config.sentry || [] + // Remove sensitive info from serialized config + for (const e of sentryConfigRaw) { + delete e.vite + } + }, + }) + plugins.push( ...serverProductionEntryPlugin({ getServerProductionEntry: () => { @@ -51,8 +118,10 @@ preloadOpenTelemetry(); ) return { + resolve: { + noExternal: 'vike-react-sentry', + }, plugins, - // Enable sourcemaps for Sentry if vitePlugin is configured ...(vitePluginOptions && { build: { sourcemap: true, @@ -60,3 +129,57 @@ preloadOpenTelemetry(); }), } } + +/** Parse project ID from DSN. Format: https://{PUBLIC_KEY}@{HOST}/{PROJECT_ID} */ +function getProjectIdFromDsn(dsn: string): string | undefined { + const match = dsn.match(/\/(\d+)$/) + return match?.[1] +} + +/** + * Extract API base URL from DSN + * DSN host like "o123.ingest.de.sentry.io" -> "https://de.sentry.io" + */ +function getApiUrlFromDsn(dsn: string): string | undefined { + try { + const url = new URL(dsn) + const match = url.hostname.match(/ingest\.(.+)$/) + return match ? `https://${match[1]}` : undefined + } catch { + return undefined + } +} + +/** Fetch project and org slug from Sentry API. Results are cached globally. */ +async function getProjectInfoFromApi( + authToken: string, + projectId: string, + dsn: string, + url?: string, +): Promise<{ projectSlug: string; orgSlug: string } | null> { + const effectiveUrl = url || getApiUrlFromDsn(dsn) || 'https://sentry.io' + + try { + const response = await fetch(`${effectiveUrl}/api/0/projects/`, { + headers: { Authorization: `Bearer ${authToken}` }, + }) + if (!response.ok) { + return null + } + const projects = (await response.json()) as Array<{ + id: string + slug: string + organization: { slug: string } + }> + const project = projects.find((p) => p.id === projectId) + if (!project) { + return null + } + return { + projectSlug: project.slug, + orgSlug: project.organization.slug, + } + } catch { + return null + } +} diff --git a/packages/vike-react-sentry/src/types.ts b/packages/vike-react-sentry/src/types.ts new file mode 100644 index 000000000..70d71b885 --- /dev/null +++ b/packages/vike-react-sentry/src/types.ts @@ -0,0 +1,20 @@ +import type * as SentryReact from '@sentry/react' +import type * as SentryNode from '@sentry/node' +import type { SentryVitePluginOptions } from '@sentry/vite-plugin' + +export interface SentryNodeOptions extends SentryNode.NodeOptions {} +export interface SentryReactOptions extends SentryReact.BrowserOptions {} +export type SentryOptions = Pick< + SentryNodeOptions & SentryReactOptions, + | 'dsn' + | 'environment' + | 'release' + | 'debug' + | 'sampleRate' + | 'tracesSampleRate' + | 'enabled' + | 'maxBreadcrumbs' + | 'sendDefaultPii' +> & { + vite?: SentryVitePluginOptions +} diff --git a/packages/vike-react-sentry/src/utils/assignDeep.ts b/packages/vike-react-sentry/src/utils/assignDeep.ts new file mode 100644 index 000000000..ce3f340c8 --- /dev/null +++ b/packages/vike-react-sentry/src/utils/assignDeep.ts @@ -0,0 +1,32 @@ +// Credits: https://github.com/radashi-org/radashi/blob/main/src/object/assign.ts + +export { assignDeep } + +function assignDeep(initial: Record, override: Record) { + if (!initial || !override) { + return initial ?? override ?? {} + } + for (const key of Object.keys(override)) { + initial[key] = + isPlainObject(initial[key]) && isPlainObject(override[key]) + ? assignDeep(initial[key], override[key]) + : override[key] + } + return initial +} + +function isPlainObject(value: any): value is object { + if (typeof value !== 'object' || value === null) { + return false + } + + const prototype = Object.getPrototypeOf(value) + return ( + // Fast path for most common objects. + prototype === Object.prototype || + // Support objects created without a prototype. + prototype === null || + // Support plain objects from other realms. + Object.getPrototypeOf(prototype) === null + ) +} diff --git a/packages/vike-react-sentry/src/utils/resolveDsn.ts b/packages/vike-react-sentry/src/utils/resolveDsn.ts new file mode 100644 index 000000000..f14137c0d --- /dev/null +++ b/packages/vike-react-sentry/src/utils/resolveDsn.ts @@ -0,0 +1,3 @@ +export function resolveDsn(configDsn: string | undefined): string | undefined { + return configDsn || import.meta.env.PUBLIC_ENV__SENTRY_DSN +} diff --git a/packages/vike-react-sentry/tsconfig.json b/packages/vike-react-sentry/tsconfig.json index abdf7fb0a..d29d2c4bc 100644 --- a/packages/vike-react-sentry/tsconfig.json +++ b/packages/vike-react-sentry/tsconfig.json @@ -14,7 +14,7 @@ "esModuleInterop": true, "moduleResolution": "Node16", // Libs - "lib": ["DOM", "DOM.Iterable", "ES2022"], + "lib": ["DOM", "DOM.Iterable", "ES2023"], "types": ["vite/client", "vike-react"], // Output "target": "ES2020", From 8324d9ca4592c529dab74b6ec75b3eb8a9886731 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Wed, 17 Dec 2025 22:35:53 +0100 Subject: [PATCH 08/19] minor --- examples/sentry/pages/my-ingetration.ts | 3 --- 1 file changed, 3 deletions(-) delete mode 100644 examples/sentry/pages/my-ingetration.ts diff --git a/examples/sentry/pages/my-ingetration.ts b/examples/sentry/pages/my-ingetration.ts deleted file mode 100644 index 8155ee813..000000000 --- a/examples/sentry/pages/my-ingetration.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const myIntegration = () =>{ - -} From 540635c571ae79303abaa9833b2f4ad41db9f556 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Wed, 17 Dec 2025 23:10:10 +0100 Subject: [PATCH 09/19] add function config support and separate sentryVite config --- examples/sentry/pages/+config.ts | 1 - examples/sentry/pages/+sentry.client.ts | 8 ++++++ examples/sentry/pages/+sentry.server.ts | 8 ++++++ .../src/integration/+config.ts | 17 +++++++++--- .../onCreateGlobalContext-client.ts | 13 ++++++--- .../onCreateGlobalContext-server.ts | 13 ++++++--- .../vike-react-sentry/src/plugin/index.ts | 27 +++++++++---------- packages/vike-react-sentry/src/types.ts | 5 +--- 8 files changed, 63 insertions(+), 29 deletions(-) create mode 100644 examples/sentry/pages/+sentry.client.ts create mode 100644 examples/sentry/pages/+sentry.server.ts diff --git a/examples/sentry/pages/+config.ts b/examples/sentry/pages/+config.ts index 48a562004..fb9c226d7 100644 --- a/examples/sentry/pages/+config.ts +++ b/examples/sentry/pages/+config.ts @@ -4,7 +4,6 @@ import type { Config } from 'vike/types' import vikeReact from 'vike-react/config' import vikePhoton from 'vike-photon/config' import vikeReactSentry from 'vike-react-sentry/config' -import { myIntegration } from './my-ingetration' const config = { title: 'Vike + React + Sentry Example', diff --git a/examples/sentry/pages/+sentry.client.ts b/examples/sentry/pages/+sentry.client.ts new file mode 100644 index 000000000..eff3d5dca --- /dev/null +++ b/examples/sentry/pages/+sentry.client.ts @@ -0,0 +1,8 @@ +import { SentryReactOptions } from 'vike-react-sentry/types' +import type { GlobalContextClient } from 'vike/types' + +export default function (globalContextClient: GlobalContextClient): SentryReactOptions { + return { + tracesSampleRate: 0.2, + } +} diff --git a/examples/sentry/pages/+sentry.server.ts b/examples/sentry/pages/+sentry.server.ts new file mode 100644 index 000000000..72dd783f1 --- /dev/null +++ b/examples/sentry/pages/+sentry.server.ts @@ -0,0 +1,8 @@ +import { SentryNodeOptions } from 'vike-react-sentry/types' +import type { GlobalContextServer } from 'vike/types' + +export default function (globalContextServer: GlobalContextServer): SentryNodeOptions { + return { + tracesSampleRate: 0.1, + } +} diff --git a/packages/vike-react-sentry/src/integration/+config.ts b/packages/vike-react-sentry/src/integration/+config.ts index 95674638a..e44a43d02 100644 --- a/packages/vike-react-sentry/src/integration/+config.ts +++ b/packages/vike-react-sentry/src/integration/+config.ts @@ -4,7 +4,7 @@ import type { Config } from 'vike/types' import { getViteConfig } from '../plugin/index.js' import 'vike-react/config' import { SentryOptions } from '../types.js' -import { SentryVitePluginOptions } from '@sentry/vite-plugin' +import type { SentryVitePluginOptions } from '@sentry/vite-plugin' const config = { name: 'vike-react-sentry', @@ -24,6 +24,15 @@ const config = { global: true, cumulative: true, }, + sentryVite: { + env: { + server: false, + client: false, + config: true, + }, + global: true, + cumulative: false, + }, }, vite: getViteConfig, } satisfies Config @@ -31,11 +40,13 @@ const config = { declare global { namespace Vike { interface Config { - sentry?: SentryOptions + sentry?: SentryOptions | ((globalContext: GlobalContext) => SentryOptions) + sentryVite?: SentryVitePluginOptions } interface ConfigResolved { - sentry?: SentryOptions[] + sentry?: (SentryOptions | ((globalContext: GlobalContext) => SentryOptions))[] + sentryVite?: SentryVitePluginOptions } } } diff --git a/packages/vike-react-sentry/src/integration/onCreateGlobalContext-client.ts b/packages/vike-react-sentry/src/integration/onCreateGlobalContext-client.ts index dc1bf0b85..ce323e22a 100644 --- a/packages/vike-react-sentry/src/integration/onCreateGlobalContext-client.ts +++ b/packages/vike-react-sentry/src/integration/onCreateGlobalContext-client.ts @@ -1,13 +1,20 @@ export { onCreateGlobalContext } import * as SentryReact from '@sentry/react' -import type { PageContext } from 'vike/types' +import type { GlobalContextClient } from 'vike/types' import { resolveDsn } from '../utils/resolveDsn.js' import { assignDeep } from '../utils/assignDeep.js' +import { SentryOptions } from '../types.js' -async function onCreateGlobalContext(globalContext: { config: PageContext['config'] }): Promise { +async function onCreateGlobalContext(globalContext: GlobalContextClient): Promise { if (!globalContext.config.sentry?.length) return - const clientConfig = globalContext.config.sentry.reverse().reduce((acc, curr) => assignDeep(acc, curr), {}) + const clientConfig = globalContext.config.sentry.reverse().reduce((acc, curr) => { + if (typeof curr === 'function') { + curr = curr(globalContext) + } + return assignDeep(acc, curr) + }, {}) as SentryOptions + if (!clientConfig) return if (!SentryReact.getClient()) { SentryReact.init({ diff --git a/packages/vike-react-sentry/src/integration/onCreateGlobalContext-server.ts b/packages/vike-react-sentry/src/integration/onCreateGlobalContext-server.ts index 0013c98bf..188264620 100644 --- a/packages/vike-react-sentry/src/integration/onCreateGlobalContext-server.ts +++ b/packages/vike-react-sentry/src/integration/onCreateGlobalContext-server.ts @@ -1,13 +1,20 @@ export { onCreateGlobalContext } import * as SentryNode from '@sentry/node' -import type { PageContext } from 'vike/types' +import type { GlobalContextServer } from 'vike/types' import { resolveDsn } from '../utils/resolveDsn.js' import { assignDeep } from '../utils/assignDeep.js' +import { SentryOptions } from '../types.js' -async function onCreateGlobalContext(globalContext: { config: PageContext['config'] }): Promise { +async function onCreateGlobalContext(globalContext: GlobalContextServer): Promise { if (!globalContext.config.sentry?.length) return - const serverConfig = globalContext.config.sentry.reverse().reduce((acc, curr) => assignDeep(acc, curr), {}) + const serverConfig = globalContext.config.sentry.reverse().reduce((acc, curr) => { + if (typeof curr === 'function') { + curr = curr(globalContext) + } + return assignDeep(acc, curr) + }, {}) as SentryOptions + if (!serverConfig) return if (!SentryNode.getClient()) { SentryNode.init({ diff --git a/packages/vike-react-sentry/src/plugin/index.ts b/packages/vike-react-sentry/src/plugin/index.ts index 4499bb133..2c05c1d52 100644 --- a/packages/vike-react-sentry/src/plugin/index.ts +++ b/packages/vike-react-sentry/src/plugin/index.ts @@ -6,6 +6,7 @@ import { getVikeConfig } from 'vike/plugin' import type { Plugin, InlineConfig } from 'vite' import { assertUsage } from '../utils/assert.js' import { assignDeep } from '../utils/assignDeep.js' +import { SentryOptions } from '../types.js' // Cache for auto-detected project info to avoid multiple API calls (global to survive module reloads) declare global { @@ -21,18 +22,26 @@ async function getViteConfig(): Promise { globalThis.__vike_react_sentry_vite_options_promise ??= (async () => { const vikeConfig = getVikeConfig() const sentryConfigRaw = vikeConfig.config.sentry || [] - const sentryConfig = sentryConfigRaw.toReversed().reduce((acc, curr) => assignDeep(acc, curr), {}) - const effectiveDsn = sentryConfig.dsn || process.env['PUBLIC_ENV__SENTRY_DSN'] + + const sentryConfig = sentryConfigRaw.toReversed().reduce((acc, curr) => { + if (typeof curr === 'function') { + // skip function configs as we don't have access to globalContext here + curr = {} + } + return assignDeep(acc, curr) + }, {}) as SentryOptions + assertUsage( !process.env['SENTRY_DSN'], 'SENTRY_DSN is not supported. Use PUBLIC_ENV__SENTRY_DSN instead, or set dsn in your sentry config.', ) + const effectiveDsn = sentryConfig.dsn || process.env['PUBLIC_ENV__SENTRY_DSN'] assertUsage( effectiveDsn, 'Sentry DSN is required. Set PUBLIC_ENV__SENTRY_DSN env var, or set dsn in your sentry config.', ) - let vitePluginOptions = sentryConfig.vite + let vitePluginOptions = vikeConfig.config.sentryVite // Resolve env fallbacks for vitePlugin options (effect doesn't have access to .env file vars) if (vitePluginOptions || process.env['SENTRY_AUTH_TOKEN']) { vitePluginOptions = { @@ -89,18 +98,6 @@ async function getViteConfig(): Promise { plugins.push(...sentryPlugins) } - plugins.push({ - name: 'vike-react-sentry:remove-sensitive-info', - buildStart(options) { - const vikeConfig = getVikeConfig() - const sentryConfigRaw = vikeConfig.config.sentry || [] - // Remove sensitive info from serialized config - for (const e of sentryConfigRaw) { - delete e.vite - } - }, - }) - plugins.push( ...serverProductionEntryPlugin({ getServerProductionEntry: () => { diff --git a/packages/vike-react-sentry/src/types.ts b/packages/vike-react-sentry/src/types.ts index 70d71b885..e9067ce84 100644 --- a/packages/vike-react-sentry/src/types.ts +++ b/packages/vike-react-sentry/src/types.ts @@ -1,6 +1,5 @@ import type * as SentryReact from '@sentry/react' import type * as SentryNode from '@sentry/node' -import type { SentryVitePluginOptions } from '@sentry/vite-plugin' export interface SentryNodeOptions extends SentryNode.NodeOptions {} export interface SentryReactOptions extends SentryReact.BrowserOptions {} @@ -15,6 +14,4 @@ export type SentryOptions = Pick< | 'enabled' | 'maxBreadcrumbs' | 'sendDefaultPii' -> & { - vite?: SentryVitePluginOptions -} +> From 0252b6df1d86f776106dee371f1fab2d6dcd0edd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Thu, 18 Dec 2025 04:13:13 +0100 Subject: [PATCH 10/19] run format --- examples/sentry/pages/+config.ts | 2 +- examples/sentry/pages/index/+Page.tsx | 42 ++++++++++++------- examples/sentry/server/index.ts | 4 +- examples/sentry/vite.config.ts | 6 +-- .../src/integration/Head.tsx | 5 +-- .../src/integration/onError.ts | 1 - .../vike-react-sentry/src/utils/assert.ts | 1 - 7 files changed, 32 insertions(+), 29 deletions(-) diff --git a/examples/sentry/pages/+config.ts b/examples/sentry/pages/+config.ts index fb9c226d7..71c2e2de4 100644 --- a/examples/sentry/pages/+config.ts +++ b/examples/sentry/pages/+config.ts @@ -10,7 +10,7 @@ const config = { extends: [vikeReact, vikePhoton, vikeReactSentry], sentry: { tracesSampleRate: 1.0, - dsn: "https://8de66fe8dda3a86d986df8ee3aa09f72@o4510438936412161.ingest.de.sentry.io/4510438941655120" + dsn: 'https://8de66fe8dda3a86d986df8ee3aa09f72@o4510438936412161.ingest.de.sentry.io/4510438941655120', }, // Photon configuration photon: { diff --git a/examples/sentry/pages/index/+Page.tsx b/examples/sentry/pages/index/+Page.tsx index 42e175dd8..af27bad19 100644 --- a/examples/sentry/pages/index/+Page.tsx +++ b/examples/sentry/pages/index/+Page.tsx @@ -10,40 +10,50 @@ function Page() { } const throwAsyncError = async () => { - await new Promise(resolve => setTimeout(resolve, 100)) + await new Promise((resolve) => setTimeout(resolve, 100)) throw new Error('This is an async error sent to Sentry!') } return (

Vike + React + Sentry Example

- -

- This example demonstrates Sentry error tracking integration with Vike. -

+ +

This example demonstrates Sentry error tracking integration with Vike.

Counter: {count}

- +

Test Error Tracking

Click these buttons to send test errors to Sentry:

- +
- - - @@ -52,7 +62,9 @@ function Page() {

Configuration

-

Edit pages/+config.ts to configure your Sentry DSN and options.

+

+ Edit pages/+config.ts to configure your Sentry DSN and options. +

  • Client-side errors are automatically captured
  • Server-side errors are automatically captured
  • diff --git a/examples/sentry/server/index.ts b/examples/sentry/server/index.ts index 9a26080c3..a0a826fab 100644 --- a/examples/sentry/server/index.ts +++ b/examples/sentry/server/index.ts @@ -3,10 +3,10 @@ import { apply, serve } from '@photonjs/hono' function startServer() { const app = new Hono() - + // Apply Vike and Vike extensions middleware apply(app) - + return serve(app) } diff --git a/examples/sentry/vite.config.ts b/examples/sentry/vite.config.ts index 1a725dce7..991ded960 100644 --- a/examples/sentry/vite.config.ts +++ b/examples/sentry/vite.config.ts @@ -2,10 +2,6 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react' import vike from 'vike/plugin' - export default defineConfig({ - plugins: [ - react(), - vike(), - ] + plugins: [react(), vike()], }) diff --git a/packages/vike-react-sentry/src/integration/Head.tsx b/packages/vike-react-sentry/src/integration/Head.tsx index f862cb0e4..3332a5188 100644 --- a/packages/vike-react-sentry/src/integration/Head.tsx +++ b/packages/vike-react-sentry/src/integration/Head.tsx @@ -21,12 +21,9 @@ function Head() { // - traceparent: W3C Trace Context header (only if propagateTraceparent is enabled) return ( <> - {traceData['sentry-trace'] && ( - - )} + {traceData['sentry-trace'] && } {traceData.baggage && } {traceData.traceparent && } ) } - diff --git a/packages/vike-react-sentry/src/integration/onError.ts b/packages/vike-react-sentry/src/integration/onError.ts index ab55cc1de..8d29b1d29 100644 --- a/packages/vike-react-sentry/src/integration/onError.ts +++ b/packages/vike-react-sentry/src/integration/onError.ts @@ -9,4 +9,3 @@ function onError(error: unknown): void { Sentry.captureException(error) } } - diff --git a/packages/vike-react-sentry/src/utils/assert.ts b/packages/vike-react-sentry/src/utils/assert.ts index 405c0e2fb..6c72f5fab 100644 --- a/packages/vike-react-sentry/src/utils/assert.ts +++ b/packages/vike-react-sentry/src/utils/assert.ts @@ -5,4 +5,3 @@ function assertUsage(condition: unknown, message: string): asserts condition { throw new Error(`[vike-react-sentry] ${message}`) } } - From a66a60cce5627a47d52fc40cf0db48ea9d28725b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Thu, 18 Dec 2025 04:31:40 +0100 Subject: [PATCH 11/19] docs: update README.md --- packages/vike-react-sentry/README.md | 326 +++++++++++---------------- 1 file changed, 128 insertions(+), 198 deletions(-) diff --git a/packages/vike-react-sentry/README.md b/packages/vike-react-sentry/README.md index 980a8535c..57026bfc4 100644 --- a/packages/vike-react-sentry/README.md +++ b/packages/vike-react-sentry/README.md @@ -1,18 +1,34 @@ -# vike-react-sentry + -Full-featured Sentry integration for `vike-react`. +[![npm version](https://img.shields.io/npm/v/vike-react-sentry)](https://www.npmjs.com/package/vike-react-sentry) -[Installation](#installation) -[Configuration](#configuration) -[Features](#features) +# `vike-react-sentry` -## Installation +Integrates [Sentry](https://sentry.io) error tracking and performance monitoring into your [`vike-react`](https://vike.dev/vike-react) app. -1. Install dependencies: - ```bash - pnpm add @sentry/react @sentry/node @sentry/vite-plugin vike-react-sentry - ``` +Features: +- Browser and server error tracking +- Performance monitoring and tracing +- Automatic source map upload +- Works out of the box with minimal configuration + +
    + +**Table of Contents** + +[Installation](#installation) +[Basic usage](#basic-usage) +[Example](#example) +[Customization](#customization) +[Settings](#settings) +[Version history](#version-history) +[See also](#see-also) + +
    +## Installation + +1. `npm install vike-react-sentry @sentry/react @sentry/node @sentry/vite-plugin` 2. Extend `+config.js`: ```js // pages/+config.js @@ -21,249 +37,163 @@ Full-featured Sentry integration for `vike-react`. import vikeReactSentry from 'vike-react-sentry/config' export default { + // ... extends: [vikeReact, vikeReactSentry] } ``` +3. Add environment variables to your `.env` file: + ```bash + # Required: Your Sentry DSN (public, safe to expose to the browser) + PUBLIC_ENV__SENTRY_DSN=https://xxxxx@xxxxx.ingest.sentry.io/xxxxx -3. Configure Sentry in `+sentry.js` (or in `+config.js`): - ```js - // pages/+sentry.js - - export default { - // Common options (applied to both client and server) - dsn: 'your-sentry-dsn', - environment: import.meta.env.MODE, - tracesSampleRate: 1.0, - - // Client-specific options - client: { - // Optional: Configure which domains should receive trace headers - tracePropagationTargets: ['localhost', /^https:\/\/yourapi\.com/], - }, - - // Server-specific options (optional) - server: { - // Add server-specific overrides here if needed - } - } + # Required for source map upload: Sentry Auth Token + # Create at https://sentry.io/settings/account/api/auth-tokens/ + # Required scopes: project:read, project:releases, project:write + SENTRY_AUTH_TOKEN=sntrys_xxxxx ``` -That's it! Distributed tracing, error monitoring, and sourcemap upload are all configured automatically. +> [!NOTE] +> The `vike-react-sentry` extension requires [`vike-react`](https://vike.dev/vike-react). -### Common Options +
    -You can specify common options at the root level that will be applied to both client and server: +## Basic usage -- `dsn` - Sentry DSN (Data Source Name) -- `environment` - Environment name (e.g., 'production', 'development') -- `release` - Release version identifier -- `debug` - Enable debug mode -- `sampleRate` - Sample rate for error events (0.0 to 1.0) -- `tracesSampleRate` - Sample rate for performance tracing (0.0 to 1.0) -- `enabled` - Enable or disable Sentry -- `maxBreadcrumbs` - Maximum number of breadcrumbs -- `sendDefaultPii` - Send default PII (Personally Identifiable Information) +That's it! With the configuration above, `vike-react-sentry` will automatically: +- Initialize Sentry on both client and server +- Track errors and exceptions +- Enable browser tracing for performance monitoring +- Upload source maps during production builds (when `SENTRY_AUTH_TOKEN` is set) -Client and server specific options will override common options. - -## Configuration - -### `sentry.client` - -Client-side (browser) Sentry configuration. Can be an object or a function that receives `pageContext`: +You can optionally configure Sentry options in your `+config.js`: ```js -// Static configuration -export default { - sentry: { - client: { - dsn: 'your-sentry-dsn', - environment: 'production', - tracesSampleRate: 1.0, - replaysSessionSampleRate: 0.1, - replaysOnErrorSampleRate: 1.0, - } - } -} +// pages/+config.js -// Dynamic configuration export default { sentry: { - client: (pageContext) => ({ - dsn: 'your-sentry-dsn', - environment: pageContext.config.environment, - user: pageContext.user, - }) + tracesSampleRate: 1.0, // Capture 100% of transactions for tracing + debug: true, // Enable debug mode during development } } ``` -See [Sentry React documentation](https://docs.sentry.io/platforms/javascript/guides/react/configuration/options/) for all available options. +
    -### `sentry.server` +## Example -Server-side (Node.js) Sentry configuration. Can be an object or a function that receives `pageContext`: +See [examples/sentry](https://github.com/vikejs/vike-react/tree/main/examples/sentry) for a full working example. -```js -export default { - sentry: { - server: { - dsn: 'your-sentry-dsn', - environment: 'production', - tracesSampleRate: 1.0, - } - } -} -``` +
    -See [Sentry Node.js documentation](https://docs.sentry.io/platforms/javascript/guides/node/configuration/options/) for all available options. +## Customization -### Vite Plugin (Sourcemap Upload) +For advanced customization, you can create Sentry configuration files: -The Sentry Vite plugin handles automatic sourcemap upload during build. Configure it in your `+sentry.js` or `+config.js`: +### `+sentry.js` (shared configuration) ```js // pages/+sentry.js +// Environment: client, server -export default { - client: { - dsn: 'your-sentry-dsn', - environment: import.meta.env.MODE, - }, - server: { - dsn: 'your-sentry-dsn', - environment: import.meta.env.MODE, - }, - vitePlugin: { - org: 'your-org', - project: 'your-project', - authToken: process.env.SENTRY_AUTH_TOKEN, - // Optional: additional configuration - sourcemaps: { - assets: './dist/**', - }, - } -} +export default (globalContext) => ({ + tracesSampleRate: 1.0, + environment: globalContext.isProduction ? 'production' : 'development', +}) ``` -The Vite plugin is **automatically added** when you configure `sentry.vitePlugin` in your Sentry config. The plugin reads the configuration from your `+sentry.js` or `+config.js` file, so you don't need to manually add it to `vite.config.js`. - -See [Sentry Vite Plugin documentation](https://docs.sentry.io/platforms/javascript/sourcemaps/uploading/vite/) for all available options. +### `+sentry.client.js` (client-only configuration) -## Distributed Tracing +```js +// pages/+sentry.client.js +// Environment: client + +export default (globalContext) => ({ + // Client-specific integrations + integrations: [ + // Add custom browser integrations here + ], +}) +``` -This extension **automatically enables distributed tracing** between client and server out of the box! No additional configuration required. +### `+sentry.server.js` (server-only configuration) -### How It Works +```js +// pages/+sentry.server.js +// Environment: server + +export default (globalContext) => ({ + // Server-specific integrations + integrations: [ + // Add custom Node.js integrations here + ], +}) +``` -1. **Client → Server**: When the client makes HTTP requests, trace headers (`sentry-trace` and `baggage`) are automatically attached -2. **Server Processing**: The middleware extracts these headers and continues the trace on the server -3. **Server → Client**: The server injects trace meta tags into the HTML, allowing the client to continue the trace after hydration +
    -The `browserTracingIntegration()` is **enabled by default**, so distributed tracing works immediately after installation. +## Settings -### Optional Configuration +### `sentry` -You can customize trace propagation targets to control which domains receive trace headers: +Sentry SDK configuration options shared between client and server: -```js -// pages/+sentry.js -export default { - client: { - dsn: 'your-sentry-dsn', - tracesSampleRate: 1.0, - // Optional: Configure which domains should receive trace headers - // By default, traces are sent to same-origin requests - tracePropagationTargets: [ - 'localhost', - /^https:\/\/yourapi\.com/, - /^https:\/\/yourdomain\.com/, - ], - }, - server: { - dsn: 'your-sentry-dsn', - tracesSampleRate: 1.0, - } +```ts +interface SentryOptions { + dsn?: string // Sentry DSN (can also use PUBLIC_ENV__SENTRY_DSN env var) + environment?: string // Environment name (e.g., 'production', 'staging') + release?: string // Release version + debug?: boolean // Enable debug mode + sampleRate?: number // Error sample rate (0.0 to 1.0) + tracesSampleRate?: number // Transaction sample rate (0.0 to 1.0) + enabled?: boolean // Enable/disable Sentry + maxBreadcrumbs?: number // Maximum number of breadcrumbs + sendDefaultPii?: boolean // Send default PII data } ``` -### Custom Integrations +### `sentryVite` -If you need to customize integrations, set `integrations` to an empty array in your config to disable defaults, then configure them in a separate `+integrations.client.ts` file: +Sentry Vite plugin configuration for source map upload. This is automatically configured when `SENTRY_AUTH_TOKEN` is set, but can be customized: ```js -// pages/+sentry.js +// pages/+config.js + export default { - client: { - dsn: 'your-sentry-dsn', - integrations: [], // Disable default integrations + sentryVite: { + authToken: process.env.SENTRY_AUTH_TOKEN, // Auto-detected from env + org: 'your-org', // Auto-detected from DSN + project: 'your-project', // Auto-detected from DSN + // ... other @sentry/vite-plugin options } } ``` -```ts -// pages/+integrations.client.ts -import * as Sentry from '@sentry/react' - -// Configure custom integrations -Sentry.getClient()?.addIntegration(Sentry.browserTracingIntegration()) -Sentry.getClient()?.addIntegration(Sentry.replayIntegration()) -``` - -> **Note**: The default `browserTracingIntegration()` is only added if you don't specify `integrations` in your config. If you set `integrations` (even to an empty array), you're responsible for adding all integrations you need. - -**Important**: Make sure your server allows the `sentry-trace` and `baggage` headers in CORS configuration if your client and server are on different domains. - -## Features - -- **Distributed Tracing**: Automatic trace propagation between client and server (enabled by default) -- **Browser Tracing**: `browserTracingIntegration()` enabled by default for performance monitoring -- Early client-side initialization (before React renders) -- Client-side error monitoring with React Error Boundary -- Server-side error monitoring with onError hook -- Automatic request isolation -- Automatic sourcemap upload during build -- Request context tracking on the server -- Support for both static and dynamic configuration -- TypeScript support -- Zero-config setup - works out of the box - -## How It Works - -### Client-Side - -1. **Early Initialization**: Sentry is initialized at the **top level** of the `+client.ts` module, **before any React code runs**, ensuring all errors are captured from the very beginning. The configuration is exposed via a virtual module that reads from your `+sentry.js` config. -2. **Error Boundary**: The `Wrapper` component wraps your app with `Sentry.ErrorBoundary` to catch React component errors -3. **Static Configuration Only**: Client-side initialization only supports static configuration objects. Dynamic configuration (functions) is not supported for early initialization since `pageContext` is not available at module load time. - -### Server-Side - -1. **Global Initialization**: Sentry is initialized once when the server starts via the `onCreateGlobalContext` hook -2. **Trace Extraction**: Middleware extracts `sentry-trace` and `baggage` headers from incoming requests -3. **Trace Continuation**: Uses `Sentry.continueTrace()` to continue distributed traces from the client -4. **Trace Injection**: The `Head` component injects trace meta tags into HTML for client-side continuation -5. **Error Handling**: The `onError` hook captures all server-side errors and sends them to Sentry -6. **Request Context**: Middleware adds request information (URL, method, headers) to each error report -7. **Request Isolation**: Sentry SDK v10+ automatically isolates error contexts per request +> [!NOTE] +> When using a **personal auth token** with `SENTRY_AUTH_TOKEN`, `org` and `project` are automatically detected from your DSN using the Sentry API. Organization-scoped tokens don't support the required API permissions, so you'll need to set `SENTRY_PROJECT` manually if using those. -### Session Management +### Environment Variables -Sentry maintains **separate sessions** for client and server: +| Variable | Description | +|----------|-------------| +| `PUBLIC_ENV__SENTRY_DSN` | Your Sentry DSN (required). Public and safe for browser. | +| `SENTRY_AUTH_TOKEN` | Auth token for source map upload. Create at [Sentry Auth Tokens](https://sentry.io/settings/auth-tokens/). Required scopes: `project:read`, `project:releases`, `project:write`. | +| `SENTRY_ORG` | Organization slug (optional, auto-detected from DSN). | +| `SENTRY_PROJECT` | Project slug (optional, auto-detected from DSN). | +| `SENTRY_URL` | Custom Sentry URL for self-hosted instances. | -- **Server-side**: One Sentry instance per server process, with automatic request isolation -- **Client-side**: One Sentry instance per browser session -- **Linking**: Errors from both environments are sent to the same Sentry project (using the same DSN), allowing distributed tracing and full visibility +
    -### Distributed Tracing Flow +## Version history -1. **Initial Page Load**: Server starts a new trace and injects it into HTML via `` tags -2. **Client Hydration**: Client SDK automatically reads the meta tags and continues the server's trace -3. **Client Navigation**: Client starts new traces for each navigation -4. **API Requests**: Client automatically attaches trace headers to requests matching `tracePropagationTargets` -5. **Server Processing**: Server middleware extracts headers and continues the trace -6. **End-to-End Visibility**: View the complete request flow in Sentry's Performance monitoring +See [CHANGELOG.md](https://github.com/vikejs/vike-react/blob/main/packages/vike-react-sentry/CHANGELOG.md). -### Request Isolation +
    -The middleware adds request context (URL, method, headers) to each server-side request's Sentry scope. Sentry SDK v10+ automatically creates isolated scopes per request, so this context doesn't leak between concurrent requests. +## See also +- [Sentry Documentation](https://docs.sentry.io/) +- [Sentry React SDK](https://docs.sentry.io/platforms/javascript/guides/react/) +- [Sentry Node SDK](https://docs.sentry.io/platforms/javascript/guides/node/) +- [Vike Documentation](https://vike.dev) +- [`vike-react`](https://github.com/vikejs/vike-react/tree/main/packages/vike-react#readme) From dd221bc8dea5dc2035260caed2433d44c9615b05 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Thu, 18 Dec 2025 04:32:31 +0100 Subject: [PATCH 12/19] minor --- packages/vike-react-sentry/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/vike-react-sentry/README.md b/packages/vike-react-sentry/README.md index 57026bfc4..cf9f78fda 100644 --- a/packages/vike-react-sentry/README.md +++ b/packages/vike-react-sentry/README.md @@ -49,7 +49,7 @@ Features: # Required for source map upload: Sentry Auth Token # Create at https://sentry.io/settings/account/api/auth-tokens/ # Required scopes: project:read, project:releases, project:write - SENTRY_AUTH_TOKEN=sntrys_xxxxx + SENTRY_AUTH_TOKEN=sntryu_xxxxx ``` > [!NOTE] From 63937e0e7607502ac37ee777813d11b906499c31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Tue, 6 Jan 2026 23:50:28 +0100 Subject: [PATCH 13/19] feat: add hook wrapper for instrumentation with Sentry --- examples/sentry/pages/+sentry.client.ts | 2 +- examples/sentry/pages/+sentry.server.ts | 2 +- package.json | 7 +- packages/vike-react-sentry/package.json | 7 + .../src/integration/+config.ts | 1 + .../src/integration/onError.ts | 18 +- .../src/integration/onHookCall-client.ts | 62 +++ .../src/integration/onHookCall-server.ts | 62 +++ .../vike-react-sentry/src/utils/assert.ts | 7 + packages/vike-react-sentry/src/utils/error.ts | 11 + pnpm-lock.yaml | 367 +++--------------- vike-hook-wrapper-issue.md | 117 ++++++ 12 files changed, 347 insertions(+), 316 deletions(-) create mode 100644 packages/vike-react-sentry/src/integration/onHookCall-client.ts create mode 100644 packages/vike-react-sentry/src/integration/onHookCall-server.ts create mode 100644 packages/vike-react-sentry/src/utils/error.ts create mode 100644 vike-hook-wrapper-issue.md diff --git a/examples/sentry/pages/+sentry.client.ts b/examples/sentry/pages/+sentry.client.ts index eff3d5dca..f2c0a61d9 100644 --- a/examples/sentry/pages/+sentry.client.ts +++ b/examples/sentry/pages/+sentry.client.ts @@ -3,6 +3,6 @@ import type { GlobalContextClient } from 'vike/types' export default function (globalContextClient: GlobalContextClient): SentryReactOptions { return { - tracesSampleRate: 0.2, + tracesSampleRate: 1, } } diff --git a/examples/sentry/pages/+sentry.server.ts b/examples/sentry/pages/+sentry.server.ts index 72dd783f1..43836f7dd 100644 --- a/examples/sentry/pages/+sentry.server.ts +++ b/examples/sentry/pages/+sentry.server.ts @@ -3,6 +3,6 @@ import type { GlobalContextServer } from 'vike/types' export default function (globalContextServer: GlobalContextServer): SentryNodeOptions { return { - tracesSampleRate: 0.1, + tracesSampleRate: 1, } } diff --git a/package.json b/package.json index 885f29f83..271344872 100644 --- a/package.json +++ b/package.json @@ -31,5 +31,10 @@ "playwright-chromium": "^1.57.0", "prettier": "^3.2.5" }, - "packageManager": "pnpm@9.4.0" + "packageManager": "pnpm@9.4.0", + "pnpm": { + "overrides": { + "vike": "0.4.250-commit-6161324" + } + } } diff --git a/packages/vike-react-sentry/package.json b/packages/vike-react-sentry/package.json index 61c909506..c0a44f86a 100644 --- a/packages/vike-react-sentry/package.json +++ b/packages/vike-react-sentry/package.json @@ -12,6 +12,10 @@ "browser": "./dist/integration/onCreateGlobalContext-client.js", "default": "./dist/integration/onCreateGlobalContext-server.js" }, + "./__internal/integration/onHookCall": { + "browser": "./dist/integration/onHookCall-client.js", + "default": "./dist/integration/onHookCall-server.js" + }, "./__internal/integration/client": "./dist/integration/client.js", "./__internal/integration/onError": "./dist/integration/onError.js" }, @@ -71,6 +75,9 @@ ], "__internal/integration/onError": [ "dist/integration/onError.d.ts" + ], + "__internal/integration/onHookCall": [ + "dist/integration/onHookCall.d.ts" ] } }, diff --git a/packages/vike-react-sentry/src/integration/+config.ts b/packages/vike-react-sentry/src/integration/+config.ts index e44a43d02..b4ca1d995 100644 --- a/packages/vike-react-sentry/src/integration/+config.ts +++ b/packages/vike-react-sentry/src/integration/+config.ts @@ -14,6 +14,7 @@ const config = { Head: 'import:vike-react-sentry/__internal/integration/Head:Head', onCreateGlobalContext: 'import:vike-react-sentry/__internal/integration/onCreateGlobalContext:onCreateGlobalContext', onError: 'import:vike-react-sentry/__internal/integration/onError:onError', + onHookCall: 'import:vike-react-sentry/__internal/integration/onHookCall:onHookCall', meta: { sentry: { env: { diff --git a/packages/vike-react-sentry/src/integration/onError.ts b/packages/vike-react-sentry/src/integration/onError.ts index 8d29b1d29..af145818f 100644 --- a/packages/vike-react-sentry/src/integration/onError.ts +++ b/packages/vike-react-sentry/src/integration/onError.ts @@ -1,11 +1,17 @@ -export { onError } - import * as Sentry from '@sentry/node' +import { isErrorSeen } from '../utils/error.js' +import type { Config } from 'vike/types' +import { assert } from '../utils/assert.js' // Handle errors on the server side -function onError(error: unknown): void { - // Only capture if Sentry is initialized - if (Sentry.getClient()) { - Sentry.captureException(error) +export const onError: Config['onError'] = (error) => { + assert( + error && typeof error === 'object' && 'getOriginalError' in error && typeof error.getOriginalError === 'function', + ) + const original = error.getOriginalError() + if (Sentry.getClient() && !isErrorSeen(original)) { + { + Sentry.captureException(original) + } } } diff --git a/packages/vike-react-sentry/src/integration/onHookCall-client.ts b/packages/vike-react-sentry/src/integration/onHookCall-client.ts new file mode 100644 index 000000000..d8e97a071 --- /dev/null +++ b/packages/vike-react-sentry/src/integration/onHookCall-client.ts @@ -0,0 +1,62 @@ +import { Config } from 'vike/types' +import * as Sentry from '@sentry/react' +import { markErrorAsSeen } from '../utils/error.js' + +/** + * Vike onHookCall configuration for Sentry integration (client-side). + * Provides automatic tracing and error capture for all Vike hooks. + */ +export const onHookCall: Config['onHookCall'] = async (hook, pageContext) => { + if (!Sentry.getClient() || hook.name === 'onError') { + return hook.call() + } + + // Extract useful context for Sentry + const url = pageContext?.urlOriginal ?? 'unknown' + const pageId = pageContext?.pageId ?? 'unknown' + const routeParams = pageContext?.routeParams ?? {} + + // withScope ensures any error captured during hook execution has Vike context + return Sentry.withScope((scope) => { + scope.setTag('vike.hook', hook.name) + scope.setTag('vike.page', pageId) + scope.setContext('vike', { + hook: hook.name, + filePath: hook.filePath, + pageId, + url, + routeParams, + }) + + return Sentry.startSpan( + { + name: hook.name, + op: 'vike.hook', + attributes: { + 'vike.hook.name': hook.name, + 'vike.hook.file': hook.filePath, + 'vike.page.id': pageId, + 'vike.url': url, + ...Object.entries(routeParams).reduce( + (acc, [key, value]) => ({ + ...acc, + [`vike.route.${key}`]: value, + }), + {}, + ), + }, + }, + async (span) => { + try { + await hook.call() + } catch (error) { + markErrorAsSeen(error) + span.setStatus({ + code: 2, + }) + Sentry.captureException(error) + } + }, + ) + }) +} diff --git a/packages/vike-react-sentry/src/integration/onHookCall-server.ts b/packages/vike-react-sentry/src/integration/onHookCall-server.ts new file mode 100644 index 000000000..9411956a3 --- /dev/null +++ b/packages/vike-react-sentry/src/integration/onHookCall-server.ts @@ -0,0 +1,62 @@ +import { Config } from 'vike/types' +import * as Sentry from '@sentry/node' +import { markErrorAsSeen } from '../utils/error.js' + +/** + * Vike onHookCall configuration for Sentry integration. + * Provides automatic tracing and error capture for all Vike hooks. + */ +export const onHookCall: Config['onHookCall'] = async (hook, pageContext) => { + if (!Sentry.getClient() || hook.name === 'onError') { + return hook.call() + } + + // Extract useful context for Sentry + const url = pageContext?.urlOriginal ?? 'unknown' + const pageId = pageContext?.pageId ?? 'unknown' + const routeParams = pageContext?.routeParams ?? {} + + // withScope ensures any error captured during hook execution has Vike context + return Sentry.withScope((scope) => { + scope.setTag('vike.hook', hook.name) + scope.setTag('vike.page', pageId) + scope.setContext('vike', { + hook: hook.name, + filePath: hook.filePath, + pageId, + url, + routeParams, + }) + + return Sentry.startSpan( + { + name: hook.name, + op: 'vike.hook', + attributes: { + 'vike.hook.name': hook.name, + 'vike.hook.file': hook.filePath, + 'vike.page.id': pageId, + 'vike.url': url, + ...Object.entries(routeParams).reduce( + (acc, [key, value]) => ({ + ...acc, + [`vike.route.${key}`]: value, + }), + {}, + ), + }, + }, + async (span) => { + try { + await hook.call() + } catch (error) { + markErrorAsSeen(error) + span.setStatus({ + code: 2, + }) + Sentry.captureException(error) + } + }, + ) + }) +} diff --git a/packages/vike-react-sentry/src/utils/assert.ts b/packages/vike-react-sentry/src/utils/assert.ts index 6c72f5fab..504c011ed 100644 --- a/packages/vike-react-sentry/src/utils/assert.ts +++ b/packages/vike-react-sentry/src/utils/assert.ts @@ -1,7 +1,14 @@ export { assertUsage } +export { assert } function assertUsage(condition: unknown, message: string): asserts condition { if (!condition) { throw new Error(`[vike-react-sentry] ${message}`) } } + +function assert(condition: unknown, message?: string): asserts condition { + if (!condition) { + throw new Error(`[vike-react-sentry] ${message}`) + } +} diff --git a/packages/vike-react-sentry/src/utils/error.ts b/packages/vike-react-sentry/src/utils/error.ts new file mode 100644 index 000000000..fa2e008fd --- /dev/null +++ b/packages/vike-react-sentry/src/utils/error.ts @@ -0,0 +1,11 @@ +const seenError = Symbol.for('vike-react-sentry-seen-error') + +export const markErrorAsSeen = (error: unknown): void => { + if (typeof error === 'object' && error !== null) { + ;(error as any)[seenError] = true + } +} + +export const isErrorSeen = (error: unknown): boolean => { + return typeof error === 'object' && error !== null && Boolean((error as any)[seenError]) +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b2f1895d9..5a00b62cc 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + vike: 0.4.250-commit-6161324 + importers: .: @@ -54,8 +57,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.250-commit-6161324 + version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../../packages/vike-react @@ -93,8 +96,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.250-commit-6161324 + version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../../packages/vike-react @@ -114,8 +117,8 @@ importers: specifier: ^19.2.1 version: 19.2.1(react@19.2.1) vike: - specifier: ^0.4.249 - version: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.250-commit-6161324 + version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../../packages/vike-react @@ -147,8 +150,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.250-commit-6161324 + version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../../packages/vike-react @@ -186,8 +189,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.250-commit-6161324 + version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../../packages/vike-react @@ -234,14 +237,14 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.247 - version: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.250-commit-6161324 + version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-photon: specifier: ^0.1.20 - version: 0.1.23(@photonjs/core@0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.3.0(@types/node@24.0.8)))(@photonjs/runtime@0.1.10(hono@4.10.7)(rollup@4.46.2)(vite@7.3.0(@types/node@24.0.8)))(hono@4.10.7)(rollup@4.46.2)(srvx@0.9.6)(vike@0.4.249(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)))(vite@7.3.0(@types/node@24.0.8)) + version: 0.1.23(@photonjs/core@0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.3.0(@types/node@24.0.8)))(@photonjs/runtime@0.1.10(hono@4.10.7)(rollup@4.46.2)(vite@7.3.0(@types/node@24.0.8)))(hono@4.10.7)(rollup@4.46.2)(srvx@0.9.6)(vike@0.4.250-commit-6161324(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.10 - version: 0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.249(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8))) + version: 0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.250-commit-6161324(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8))) vike-react-sentry: specifier: 0.1.0 version: link:../../packages/vike-react-sentry @@ -273,8 +276,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.250-commit-6161324 + version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../../packages/vike-react @@ -322,8 +325,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.250-commit-6161324 + version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vite: specifier: ^7.3.0 version: 7.3.0(@types/node@24.0.8) @@ -352,8 +355,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.250-commit-6161324 + version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -404,8 +407,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.250-commit-6161324 + version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -437,8 +440,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.250-commit-6161324 + version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -486,8 +489,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.250-commit-6161324 + version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -523,8 +526,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.250-commit-6161324 + version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -575,11 +578,11 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.247 - version: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.250-commit-6161324 + version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.10 - version: 0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.249(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8))) + version: 0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.250-commit-6161324(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8))) vite: specifier: ^7.1.7 version: 7.3.0(@types/node@24.0.8) @@ -605,8 +608,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.250-commit-6161324 + version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -635,8 +638,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.250-commit-6161324 + version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -687,8 +690,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.250-commit-6161324 + version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -928,6 +931,9 @@ packages: '@brillout/picocolors@1.0.29': resolution: {integrity: sha512-EKkqdFJD+CeP6GfpZNcWcCCXS5o0HFXhwISoN5JnHG/kplVE2MmF23eKtl4JRKU1rkR7s3kFIKiJf15aV/Uodg==} + '@brillout/picocolors@1.0.30': + resolution: {integrity: sha512-xJjdgyN1H0qh2nB2xlzazIipiDixuUd9oD5msh/Qv5bXJG9j8MSD/m4lREt6Z10ej6FF31b8vB4tdT7lDUbiyA==} + '@brillout/release-me@0.4.12': resolution: {integrity: sha512-0ONZeh7jt+7sZ94bZs0tnGaCQxFTgj7XFybG4jZkQxJJV81DXxzS1WT8aw86j37vO9irw9sShnqJzWE8/aPEqQ==} hasBin: true @@ -1069,12 +1075,6 @@ packages: cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.1': - resolution: {integrity: sha512-kfYGy8IdzTGy+z0vFGvExZtxkFlA4zAxgKEahG9KE1ScBjpQnFsNOX8KTU5ojNru5ed5CVoJYXFtoxaq5nFbjQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - '@esbuild/aix-ppc64@0.27.2': resolution: {integrity: sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==} engines: {node: '>=18'} @@ -1087,12 +1087,6 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.25.1': - resolution: {integrity: sha512-50tM0zCJW5kGqgG7fQ7IHvQOcAn9TKiVRuQ/lN0xR+T2lzEFvAi1ZcS8DiksFcEpf1t/GYOeOfCAgDHFpkiSmA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.27.2': resolution: {integrity: sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==} engines: {node: '>=18'} @@ -1105,12 +1099,6 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.25.1': - resolution: {integrity: sha512-dp+MshLYux6j/JjdqVLnMglQlFu+MuVeNrmT5nk6q07wNhCdSnB7QZj+7G8VMUGh1q+vj2Bq8kRsuyA00I/k+Q==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.27.2': resolution: {integrity: sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==} engines: {node: '>=18'} @@ -1123,12 +1111,6 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.25.1': - resolution: {integrity: sha512-GCj6WfUtNldqUzYkN/ITtlhwQqGWu9S45vUXs7EIYf+7rCiiqH9bCloatO9VhxsL0Pji+PF4Lz2XXCES+Q8hDw==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.27.2': resolution: {integrity: sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==} engines: {node: '>=18'} @@ -1141,12 +1123,6 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.25.1': - resolution: {integrity: sha512-5hEZKPf+nQjYoSr/elb62U19/l1mZDdqidGfmFutVUjjUZrOazAtwK+Kr+3y0C/oeJfLlxo9fXb1w7L+P7E4FQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.27.2': resolution: {integrity: sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==} engines: {node: '>=18'} @@ -1159,12 +1135,6 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.1': - resolution: {integrity: sha512-hxVnwL2Dqs3fM1IWq8Iezh0cX7ZGdVhbTfnOy5uURtao5OIVCEyj9xIzemDi7sRvKsuSdtCAhMKarxqtlyVyfA==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.27.2': resolution: {integrity: sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==} engines: {node: '>=18'} @@ -1177,12 +1147,6 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.25.1': - resolution: {integrity: sha512-1MrCZs0fZa2g8E+FUo2ipw6jw5qqQiH+tERoS5fAfKnRx6NXH31tXBKI3VpmLijLH6yriMZsxJtaXUyFt/8Y4A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.27.2': resolution: {integrity: sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==} engines: {node: '>=18'} @@ -1195,12 +1159,6 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.1': - resolution: {integrity: sha512-0IZWLiTyz7nm0xuIs0q1Y3QWJC52R8aSXxe40VUxm6BB1RNmkODtW6LHvWRrGiICulcX7ZvyH6h5fqdLu4gkww==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.27.2': resolution: {integrity: sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==} engines: {node: '>=18'} @@ -1213,12 +1171,6 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.1': - resolution: {integrity: sha512-jaN3dHi0/DDPelk0nLcXRm1q7DNJpjXy7yWaWvbfkPvI+7XNSc/lDOnCLN7gzsyzgu6qSAmgSvP9oXAhP973uQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.27.2': resolution: {integrity: sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==} engines: {node: '>=18'} @@ -1231,12 +1183,6 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.1': - resolution: {integrity: sha512-NdKOhS4u7JhDKw9G3cY6sWqFcnLITn6SqivVArbzIaf3cemShqfLGHYMx8Xlm/lBit3/5d7kXvriTUGa5YViuQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.27.2': resolution: {integrity: sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==} engines: {node: '>=18'} @@ -1249,12 +1195,6 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.25.1': - resolution: {integrity: sha512-OJykPaF4v8JidKNGz8c/q1lBO44sQNUQtq1KktJXdBLn1hPod5rE/Hko5ugKKZd+D2+o1a9MFGUEIUwO2YfgkQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.27.2': resolution: {integrity: sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==} engines: {node: '>=18'} @@ -1267,12 +1207,6 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.1': - resolution: {integrity: sha512-nGfornQj4dzcq5Vp835oM/o21UMlXzn79KobKlcs3Wz9smwiifknLy4xDCLUU0BWp7b/houtdrgUz7nOGnfIYg==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.27.2': resolution: {integrity: sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==} engines: {node: '>=18'} @@ -1285,12 +1219,6 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.1': - resolution: {integrity: sha512-1osBbPEFYwIE5IVB/0g2X6i1qInZa1aIoj1TdL4AaAb55xIIgbg8Doq6a5BzYWgr+tEcDzYH67XVnTmUzL+nXg==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.27.2': resolution: {integrity: sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==} engines: {node: '>=18'} @@ -1303,12 +1231,6 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.1': - resolution: {integrity: sha512-/6VBJOwUf3TdTvJZ82qF3tbLuWsscd7/1w+D9LH0W/SqUgM5/JJD0lrJ1fVIfZsqB6RFmLCe0Xz3fmZc3WtyVg==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.27.2': resolution: {integrity: sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==} engines: {node: '>=18'} @@ -1321,12 +1243,6 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.25.1': - resolution: {integrity: sha512-nSut/Mx5gnilhcq2yIMLMe3Wl4FK5wx/o0QuuCLMtmJn+WeWYoEGDN1ipcN72g1WHsnIbxGXd4i/MF0gTcuAjQ==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.27.2': resolution: {integrity: sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==} engines: {node: '>=18'} @@ -1339,12 +1255,6 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.25.1': - resolution: {integrity: sha512-cEECeLlJNfT8kZHqLarDBQso9a27o2Zd2AQ8USAEoGtejOrCYHNtKP8XQhMDJMtthdF4GBmjR2au3x1udADQQQ==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.27.2': resolution: {integrity: sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==} engines: {node: '>=18'} @@ -1357,24 +1267,12 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.25.1': - resolution: {integrity: sha512-xbfUhu/gnvSEg+EGovRc+kjBAkrvtk38RlerAzQxvMzlB4fXpCFCeUAYzJvrnhFtdeyVCDANSjJvOvGYoeKzFA==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.27.2': resolution: {integrity: sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.1': - resolution: {integrity: sha512-O96poM2XGhLtpTh+s4+nP7YCCAfb4tJNRVZHfIE7dgmax+yMP2WgMd2OecBuaATHKTHsLWHQeuaxMRnCsH8+5g==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - '@esbuild/netbsd-arm64@0.27.2': resolution: {integrity: sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==} engines: {node: '>=18'} @@ -1387,12 +1285,6 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.1': - resolution: {integrity: sha512-X53z6uXip6KFXBQ+Krbx25XHV/NCbzryM6ehOAeAil7X7oa4XIq+394PWGnwaSQ2WRA0KI6PUO6hTO5zeF5ijA==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.27.2': resolution: {integrity: sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==} engines: {node: '>=18'} @@ -1405,12 +1297,6 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-arm64@0.25.1': - resolution: {integrity: sha512-Na9T3szbXezdzM/Kfs3GcRQNjHzM6GzFBeU1/6IV/npKP5ORtp9zbQjvkDJ47s6BCgaAZnnnu/cY1x342+MvZg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - '@esbuild/openbsd-arm64@0.27.2': resolution: {integrity: sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==} engines: {node: '>=18'} @@ -1423,12 +1309,6 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.1': - resolution: {integrity: sha512-T3H78X2h1tszfRSf+txbt5aOp/e7TAz3ptVKu9Oyir3IAOFPGV6O9c2naym5TOriy1l0nNf6a4X5UXRZSGX/dw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.27.2': resolution: {integrity: sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==} engines: {node: '>=18'} @@ -1447,12 +1327,6 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.25.1': - resolution: {integrity: sha512-2H3RUvcmULO7dIE5EWJH8eubZAI4xw54H1ilJnRNZdeo8dTADEZ21w6J22XBkXqGJbe0+wnNJtw3UXRoLJnFEg==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.27.2': resolution: {integrity: sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==} engines: {node: '>=18'} @@ -1465,12 +1339,6 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.25.1': - resolution: {integrity: sha512-GE7XvrdOzrb+yVKB9KsRMq+7a2U/K5Cf/8grVFRAGJmfADr/e/ODQ134RK2/eeHqYV5eQRFxb1hY7Nr15fv1NQ==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.27.2': resolution: {integrity: sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==} engines: {node: '>=18'} @@ -1483,12 +1351,6 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.1': - resolution: {integrity: sha512-uOxSJCIcavSiT6UnBhBzE8wy3n0hOkJsBOzy7HDAuTDE++1DJMRRVCPGisULScHL+a/ZwdXPpXD3IyFKjA7K8A==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.27.2': resolution: {integrity: sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==} engines: {node: '>=18'} @@ -1501,12 +1363,6 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.25.1': - resolution: {integrity: sha512-Y1EQdcfwMSeQN/ujR5VayLOJ1BHaK+ssyk0AEzPjC+t1lITgsnccPqFjb6V+LsTp/9Iov4ysfjxLaGJ9RPtkVg==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.27.2': resolution: {integrity: sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==} engines: {node: '>=18'} @@ -2996,11 +2852,6 @@ packages: engines: {node: '>=18'} hasBin: true - esbuild@0.25.1: - resolution: {integrity: sha512-BGO5LtrGC7vxnqucAe/rmvKdJllfGaYWdyABvyMoXQlfYMb2bbRuReWR5tEGE//4LcNJj9XrkovTqNYRFZHAMQ==} - engines: {node: '>=18'} - hasBin: true - esbuild@0.27.2: resolution: {integrity: sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==} engines: {node: '>=18'} @@ -4388,7 +4239,7 @@ packages: '@photonjs/core': ^0.1.0 '@photonjs/runtime': ^0.1.0 '@photonjs/vercel': ^0.1.1 - vike: '>=0.4.244' + vike: 0.4.250-commit-6161324 vite: '>=7.1' peerDependenciesMeta: '@photonjs/cloudflare': @@ -4403,10 +4254,10 @@ packages: peerDependencies: react: '>=19' react-dom: '>=19' - vike: '>=0.4.182' + vike: 0.4.250-commit-6161324 - vike@0.4.249: - resolution: {integrity: sha512-ZQpfmIclLCCLD9dsjTOwoczdjHJ7JrGww4b4vg3FpfrFZcSoNcrEtrwgbSqw9lMuYnkbfXPKFxwOf8VVp9Uftw==} + vike@0.4.250-commit-6161324: + resolution: {integrity: sha512-6Yzr3g9BFw+UGBxrguhxGpm8XQDLEMRpeEs3b5OL3oZ+jDQM1d/5Bd2++qMnFW9gmPyvLlG14R/IgV+rzhDQlA==} engines: {node: '>=20.19.0'} hasBin: true peerDependencies: @@ -4945,6 +4796,8 @@ snapshots: '@brillout/picocolors@1.0.29': {} + '@brillout/picocolors@1.0.30': {} + '@brillout/release-me@0.4.12(conventional-commits-filter@5.0.0)': dependencies: '@brillout/picocolors': 1.0.29 @@ -5125,186 +4978,123 @@ snapshots: '@esbuild/aix-ppc64@0.23.1': optional: true - '@esbuild/aix-ppc64@0.25.1': - optional: true - '@esbuild/aix-ppc64@0.27.2': optional: true '@esbuild/android-arm64@0.23.1': optional: true - '@esbuild/android-arm64@0.25.1': - optional: true - '@esbuild/android-arm64@0.27.2': optional: true '@esbuild/android-arm@0.23.1': optional: true - '@esbuild/android-arm@0.25.1': - optional: true - '@esbuild/android-arm@0.27.2': optional: true '@esbuild/android-x64@0.23.1': optional: true - '@esbuild/android-x64@0.25.1': - optional: true - '@esbuild/android-x64@0.27.2': optional: true '@esbuild/darwin-arm64@0.23.1': optional: true - '@esbuild/darwin-arm64@0.25.1': - optional: true - '@esbuild/darwin-arm64@0.27.2': optional: true '@esbuild/darwin-x64@0.23.1': optional: true - '@esbuild/darwin-x64@0.25.1': - optional: true - '@esbuild/darwin-x64@0.27.2': optional: true '@esbuild/freebsd-arm64@0.23.1': optional: true - '@esbuild/freebsd-arm64@0.25.1': - optional: true - '@esbuild/freebsd-arm64@0.27.2': optional: true '@esbuild/freebsd-x64@0.23.1': optional: true - '@esbuild/freebsd-x64@0.25.1': - optional: true - '@esbuild/freebsd-x64@0.27.2': optional: true '@esbuild/linux-arm64@0.23.1': optional: true - '@esbuild/linux-arm64@0.25.1': - optional: true - '@esbuild/linux-arm64@0.27.2': optional: true '@esbuild/linux-arm@0.23.1': optional: true - '@esbuild/linux-arm@0.25.1': - optional: true - '@esbuild/linux-arm@0.27.2': optional: true '@esbuild/linux-ia32@0.23.1': optional: true - '@esbuild/linux-ia32@0.25.1': - optional: true - '@esbuild/linux-ia32@0.27.2': optional: true '@esbuild/linux-loong64@0.23.1': optional: true - '@esbuild/linux-loong64@0.25.1': - optional: true - '@esbuild/linux-loong64@0.27.2': optional: true '@esbuild/linux-mips64el@0.23.1': optional: true - '@esbuild/linux-mips64el@0.25.1': - optional: true - '@esbuild/linux-mips64el@0.27.2': optional: true '@esbuild/linux-ppc64@0.23.1': optional: true - '@esbuild/linux-ppc64@0.25.1': - optional: true - '@esbuild/linux-ppc64@0.27.2': optional: true '@esbuild/linux-riscv64@0.23.1': optional: true - '@esbuild/linux-riscv64@0.25.1': - optional: true - '@esbuild/linux-riscv64@0.27.2': optional: true '@esbuild/linux-s390x@0.23.1': optional: true - '@esbuild/linux-s390x@0.25.1': - optional: true - '@esbuild/linux-s390x@0.27.2': optional: true '@esbuild/linux-x64@0.23.1': optional: true - '@esbuild/linux-x64@0.25.1': - optional: true - '@esbuild/linux-x64@0.27.2': optional: true - '@esbuild/netbsd-arm64@0.25.1': - optional: true - '@esbuild/netbsd-arm64@0.27.2': optional: true '@esbuild/netbsd-x64@0.23.1': optional: true - '@esbuild/netbsd-x64@0.25.1': - optional: true - '@esbuild/netbsd-x64@0.27.2': optional: true '@esbuild/openbsd-arm64@0.23.1': optional: true - '@esbuild/openbsd-arm64@0.25.1': - optional: true - '@esbuild/openbsd-arm64@0.27.2': optional: true '@esbuild/openbsd-x64@0.23.1': optional: true - '@esbuild/openbsd-x64@0.25.1': - optional: true - '@esbuild/openbsd-x64@0.27.2': optional: true @@ -5314,36 +5104,24 @@ snapshots: '@esbuild/sunos-x64@0.23.1': optional: true - '@esbuild/sunos-x64@0.25.1': - optional: true - '@esbuild/sunos-x64@0.27.2': optional: true '@esbuild/win32-arm64@0.23.1': optional: true - '@esbuild/win32-arm64@0.25.1': - optional: true - '@esbuild/win32-arm64@0.27.2': optional: true '@esbuild/win32-ia32@0.23.1': optional: true - '@esbuild/win32-ia32@0.25.1': - optional: true - '@esbuild/win32-ia32@0.27.2': optional: true '@esbuild/win32-x64@0.23.1': optional: true - '@esbuild/win32-x64@0.25.1': - optional: true - '@esbuild/win32-x64@0.27.2': optional: true @@ -7339,34 +7117,6 @@ snapshots: '@esbuild/win32-ia32': 0.23.1 '@esbuild/win32-x64': 0.23.1 - esbuild@0.25.1: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.1 - '@esbuild/android-arm': 0.25.1 - '@esbuild/android-arm64': 0.25.1 - '@esbuild/android-x64': 0.25.1 - '@esbuild/darwin-arm64': 0.25.1 - '@esbuild/darwin-x64': 0.25.1 - '@esbuild/freebsd-arm64': 0.25.1 - '@esbuild/freebsd-x64': 0.25.1 - '@esbuild/linux-arm': 0.25.1 - '@esbuild/linux-arm64': 0.25.1 - '@esbuild/linux-ia32': 0.25.1 - '@esbuild/linux-loong64': 0.25.1 - '@esbuild/linux-mips64el': 0.25.1 - '@esbuild/linux-ppc64': 0.25.1 - '@esbuild/linux-riscv64': 0.25.1 - '@esbuild/linux-s390x': 0.25.1 - '@esbuild/linux-x64': 0.25.1 - '@esbuild/netbsd-arm64': 0.25.1 - '@esbuild/netbsd-x64': 0.25.1 - '@esbuild/openbsd-arm64': 0.25.1 - '@esbuild/openbsd-x64': 0.25.1 - '@esbuild/sunos-x64': 0.25.1 - '@esbuild/win32-arm64': 0.25.1 - '@esbuild/win32-ia32': 0.25.1 - '@esbuild/win32-x64': 0.25.1 - esbuild@0.27.2: optionalDependencies: '@esbuild/aix-ppc64': 0.27.2 @@ -8840,7 +8590,7 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vike-photon@0.1.23(@photonjs/core@0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.3.0(@types/node@24.0.8)))(@photonjs/runtime@0.1.10(hono@4.10.7)(rollup@4.46.2)(vite@7.3.0(@types/node@24.0.8)))(hono@4.10.7)(rollup@4.46.2)(srvx@0.9.6)(vike@0.4.249(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)))(vite@7.3.0(@types/node@24.0.8)): + vike-photon@0.1.23(@photonjs/core@0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.3.0(@types/node@24.0.8)))(@photonjs/runtime@0.1.10(hono@4.10.7)(rollup@4.46.2)(vite@7.3.0(@types/node@24.0.8)))(hono@4.10.7)(rollup@4.46.2)(srvx@0.9.6)(vike@0.4.250-commit-6161324(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)))(vite@7.3.0(@types/node@24.0.8)): dependencies: '@brillout/picocolors': 1.0.29 '@brillout/vite-plugin-server-entry': 0.7.15 @@ -8851,7 +8601,7 @@ snapshots: '@universal-middleware/sirv': 0.1.24 pkg-types: 2.3.0 standaloner: 0.1.11(rollup@4.46.2) - vike: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + vike: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) optionalDependencies: vite: 7.3.0(@types/node@24.0.8) transitivePeerDependencies: @@ -8868,24 +8618,25 @@ snapshots: - srvx - supports-color - vike-react@0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.249(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8))): + vike-react@0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.250-commit-6161324(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8))): dependencies: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) react-streaming: 0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - vike: 0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + vike: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) - vike@0.4.249(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)): + vike@0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)): dependencies: + '@babel/core': 7.28.5 + '@babel/types': 7.28.5 '@brillout/import': 0.2.6 '@brillout/json-serializer': 0.5.21 - '@brillout/picocolors': 1.0.29 + '@brillout/picocolors': 1.0.30 '@brillout/require-shim': 0.1.2 '@brillout/vite-plugin-server-entry': 0.7.15 - acorn: 8.15.0 cac: 6.7.14 es-module-lexer: 1.7.0 - esbuild: 0.25.1 + esbuild: 0.27.2 json5: 2.2.3 magic-string: 0.30.21 picomatch: 4.0.3 @@ -8896,6 +8647,8 @@ snapshots: optionalDependencies: react-streaming: 0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1) vite: 7.3.0(@types/node@24.0.8) + transitivePeerDependencies: + - supports-color vite-node@3.2.4(@types/node@24.0.8): dependencies: diff --git a/vike-hook-wrapper-issue.md b/vike-hook-wrapper-issue.md new file mode 100644 index 000000000..cafd08ea7 --- /dev/null +++ b/vike-hook-wrapper-issue.md @@ -0,0 +1,117 @@ +# Feature Request: Cumulative hook wrapper for instrumentation (Sentry, OpenTelemetry, etc.) + +## Problem + +When integrating observability tools like Sentry or OpenTelemetry with Vike, we need to wrap hook executions with spans/traces. This is essential for: + +- Measuring execution time of `+data`, `+guard`, `+onBeforeRender`, `+onRenderHtml`, etc. +- Providing users insight into which hooks are slow +- Proper distributed tracing + +### The Challenge + +Sentry (and OpenTelemetry) spans work with **async local storage** and depend on the **call stack**. This means we need to actually **wrap** the hook function execution: + +```ts +Sentry.startSpan( + { + name: "pages/product/+data", + op: "vike.hook", + attributes: { hookName: "data", pageId, urlOriginal }, + }, + async () => { + // The actual +data hook runs here + return await dataHook(pageContext) + }, +); +``` + +We cannot use before/after style hooks because the span context is lost. + +## Proposed Solution + +Add a **cumulative global hook wrapper** to vike: + +```ts +// vike-react-sentry/+config.ts +import * as Sentry from "@sentry/node" + +export default { + onWrapHook: (hookInfo, execHook) => { + return Sentry.startSpan( + { + name: hookInfo.hookFilePath, // e.g. "pages/product/+data" + op: "vike.hook", + attributes: { + "vike.hookName": hookInfo.hookName, + "vike.pageId": hookInfo.pageId, + }, + }, + () => execHook() + ) + }, + meta: { + onWrapHook: { + env: { server: true, client: true }, + cumulative: true, // Multiple wrappers compose + } + } +} +``` + +### Hook Info + +The `hookInfo` parameter should include: +- `hookName`: e.g. `"data"`, `"guard"`, `"onRenderHtml"`, `"onBeforeRender"` +- `hookFilePath`: e.g. `"pages/product/+data"`, `"vike-react/__internal/integration/onRenderHtml"` +- `pageContext`: (or relevant subset like `pageId`, `urlOriginal`, `urlPathname`) + +### Cumulative Behavior + +Multiple wrappers should compose, allowing: +- `vike-react-sentry` to add Sentry spans +- User to add custom logging/timing +- Other extensions to add their instrumentation + +```ts +// All these wrappers compose +onWrapHook: [sentryWrapper, otelWrapper, loggingWrapper] +``` + +### Implementation Location + +Vike controls all `+` file exports. When these are loaded and made available via `pageContext.config` or `pageContext.exports`, vike could wrap all callable exports with the wrapper. + +This would cover: +- **Built-in hooks**: `+data`, `+guard`, `+onBeforeRender`, `+onRenderHtml`, etc. (currently in `execHookDirectAsync`) +- **Custom config functions**: `+ApolloClient`, `+QueryClient`, or any user-defined `+` file that exports a function + +When a function is exported from a `+` file and later called (either by vike internally or by extensions via `pageContext.config.X()`), the wrapper would be applied. + +## Use Cases + +1. **Sentry Integration** (`vike-react-sentry`): Wrap all hooks with Sentry spans +2. **OpenTelemetry**: Distributed tracing with OTEL spans +3. **Custom Logging**: Log hook execution times +4. **Performance Monitoring**: Track slow hooks +5. **Debugging**: Add context around hook execution + +## Expected Result + +With this feature, `vike-react-sentry` could provide traces like: + +``` +vike:request (150ms) +├── +guard (5ms) +├── +data (80ms) +│ └── db.query (75ms) +├── +onBeforeRender (10ms) +└── +onRenderHtml (55ms) + └── react:render (50ms) +``` + +This gives users great insight into their app's performance and helps identify bottlenecks. + +## Related + +- vike-react-sentry: https://github.com/vikejs/vike-react/tree/main/packages/vike-react-sentry From b3ad69c79d8fd57712a6cbbca030fe2bbf192cd4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Wed, 7 Jan 2026 00:02:45 +0100 Subject: [PATCH 14/19] docs: update README.md to include Vike hooks instrumentation with onHookCall --- packages/vike-react-sentry/README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/vike-react-sentry/README.md b/packages/vike-react-sentry/README.md index cf9f78fda..654a5f07d 100644 --- a/packages/vike-react-sentry/README.md +++ b/packages/vike-react-sentry/README.md @@ -62,6 +62,7 @@ Features: That's it! With the configuration above, `vike-react-sentry` will automatically: - Initialize Sentry on both client and server - Track errors and exceptions +- Instrument Vike hooks using [onHookCall](https://vike.dev/onHookCall) - Enable browser tracing for performance monitoring - Upload source maps during production builds (when `SENTRY_AUTH_TOKEN` is set) From 2243d2426edcba23ef9c848dcca1314e57fd9604 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Tue, 13 Jan 2026 07:35:11 +0100 Subject: [PATCH 15/19] chore: update vike dependency to version 0.4.252 across all packages --- examples/sentry/package.json | 2 +- package.json | 7 +- packages/vike-react-query/package.json | 2 +- packages/vike-react-sentry/package.json | 2 +- packages/vike-react-zustand/package.json | 2 +- packages/vike-react/package.json | 2 +- pnpm-lock.yaml | 111 ++++++++++++----------- 7 files changed, 65 insertions(+), 63 deletions(-) diff --git a/examples/sentry/package.json b/examples/sentry/package.json index b5fcf7372..aab59d030 100644 --- a/examples/sentry/package.json +++ b/examples/sentry/package.json @@ -16,7 +16,7 @@ "react": "^19.2.0", "react-dom": "^19.2.0", "typescript": "^5.9.2", - "vike": "^0.4.247", + "vike": "^0.4.252", "vike-photon": "^0.1.20", "vike-react": "0.6.10", "vike-react-sentry": "0.1.0", diff --git a/package.json b/package.json index 271344872..885f29f83 100644 --- a/package.json +++ b/package.json @@ -31,10 +31,5 @@ "playwright-chromium": "^1.57.0", "prettier": "^3.2.5" }, - "packageManager": "pnpm@9.4.0", - "pnpm": { - "overrides": { - "vike": "0.4.250-commit-6161324" - } - } + "packageManager": "pnpm@9.4.0" } diff --git a/packages/vike-react-query/package.json b/packages/vike-react-query/package.json index c31fad7b4..af5c01572 100644 --- a/packages/vike-react-query/package.json +++ b/packages/vike-react-query/package.json @@ -23,7 +23,7 @@ "@tanstack/react-query": ">=5.0.0", "react": ">=18.0.0", "react-streaming": ">=0.4.6", - "vike": ">=0.4.247", + "vike": ">=0.4.252", "vike-react": ">=0.6.8" }, "devDependencies": { diff --git a/packages/vike-react-sentry/package.json b/packages/vike-react-sentry/package.json index c0a44f86a..ec52de058 100644 --- a/packages/vike-react-sentry/package.json +++ b/packages/vike-react-sentry/package.json @@ -49,7 +49,7 @@ "react-dom": "^19.2.0", "rimraf": "^5.0.5", "typescript": "^5.9.2", - "vike": "^0.4.247", + "vike": "^0.4.252", "vike-react": "0.6.10", "vite": "^7.1.7" }, diff --git a/packages/vike-react-zustand/package.json b/packages/vike-react-zustand/package.json index f56b03e45..0404ba4b2 100644 --- a/packages/vike-react-zustand/package.json +++ b/packages/vike-react-zustand/package.json @@ -20,7 +20,7 @@ "react": ">=18.0.0", "react-dom": ">=18.0.0", "react-streaming": ">=0.3.42", - "vike": ">=0.4.247", + "vike": ">=0.4.252", "vike-react": ">=0.4.13", "zustand": ">=5.0.0" }, diff --git a/packages/vike-react/package.json b/packages/vike-react/package.json index f81e8b0c2..fc77abfa5 100644 --- a/packages/vike-react/package.json +++ b/packages/vike-react/package.json @@ -32,7 +32,7 @@ "peerDependencies": { "react": ">=19", "react-dom": ">=19", - "vike": ">=0.4.247" + "vike": ">=0.4.252" }, "scripts": { "dev": "tsc --watch", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5a00b62cc..160dcc079 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,9 +4,6 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false -overrides: - vike: 0.4.250-commit-6161324 - importers: .: @@ -57,8 +54,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: 0.4.250-commit-6161324 - version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: ^0.4.249 + version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../../packages/vike-react @@ -96,8 +93,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 vike: - specifier: 0.4.250-commit-6161324 - version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: ^0.4.249 + version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../../packages/vike-react @@ -117,8 +114,8 @@ importers: specifier: ^19.2.1 version: 19.2.1(react@19.2.1) vike: - specifier: 0.4.250-commit-6161324 - version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: ^0.4.249 + version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../../packages/vike-react @@ -150,8 +147,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: 0.4.250-commit-6161324 - version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: ^0.4.249 + version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../../packages/vike-react @@ -189,8 +186,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: 0.4.250-commit-6161324 - version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: ^0.4.249 + version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../../packages/vike-react @@ -237,14 +234,14 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: 0.4.250-commit-6161324 - version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: ^0.4.252 + version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-photon: specifier: ^0.1.20 - version: 0.1.23(@photonjs/core@0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.3.0(@types/node@24.0.8)))(@photonjs/runtime@0.1.10(hono@4.10.7)(rollup@4.46.2)(vite@7.3.0(@types/node@24.0.8)))(hono@4.10.7)(rollup@4.46.2)(srvx@0.9.6)(vike@0.4.250-commit-6161324(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)))(vite@7.3.0(@types/node@24.0.8)) + version: 0.1.23(@photonjs/core@0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.3.0(@types/node@24.0.8)))(@photonjs/runtime@0.1.10(hono@4.10.7)(rollup@4.46.2)(vite@7.3.0(@types/node@24.0.8)))(hono@4.10.7)(rollup@4.46.2)(srvx@0.9.6)(vike@0.4.252(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.10 - version: 0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.250-commit-6161324(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8))) + version: 0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.252(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8))) vike-react-sentry: specifier: 0.1.0 version: link:../../packages/vike-react-sentry @@ -276,8 +273,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 vike: - specifier: 0.4.250-commit-6161324 - version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: ^0.4.249 + version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../../packages/vike-react @@ -325,8 +322,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: 0.4.250-commit-6161324 - version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: ^0.4.249 + version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vite: specifier: ^7.3.0 version: 7.3.0(@types/node@24.0.8) @@ -355,8 +352,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: 0.4.250-commit-6161324 - version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: ^0.4.249 + version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -407,8 +404,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: 0.4.250-commit-6161324 - version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: ^0.4.249 + version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -440,8 +437,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: 0.4.250-commit-6161324 - version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: ^0.4.249 + version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -489,8 +486,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: 0.4.250-commit-6161324 - version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: ^0.4.249 + version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -526,8 +523,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: 0.4.250-commit-6161324 - version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: ^0.4.249 + version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -578,11 +575,11 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: 0.4.250-commit-6161324 - version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: ^0.4.252 + version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.10 - version: 0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.250-commit-6161324(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8))) + version: 0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.252(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8))) vite: specifier: ^7.1.7 version: 7.3.0(@types/node@24.0.8) @@ -608,8 +605,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: 0.4.250-commit-6161324 - version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: ^0.4.249 + version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -633,13 +630,13 @@ importers: version: 5.0.10 styled-jsx: specifier: ^5.1.6 - version: 5.1.6(react@19.2.1) + version: 5.1.6(@babel/core@7.28.5)(react@19.2.1) typescript: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: 0.4.250-commit-6161324 - version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: ^0.4.249 + version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -690,8 +687,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: 0.4.250-commit-6161324 - version: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: ^0.4.249 + version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -954,6 +951,9 @@ packages: '@brillout/vite-plugin-server-entry@0.7.15': resolution: {integrity: sha512-0ClgcmjkhJoHbI6KhbjZlXMeA9qn/EPLXEVssjCE6IVYnVb4bTYuq635c44n7jV3GkjcgFHCQWBmNw0OAGiUvQ==} + '@brillout/vite-plugin-server-entry@0.7.17': + resolution: {integrity: sha512-MfvSytYl51J2B+RrHvRXMdRNc1U2lHG/K9Gw05/jdPY2iYU2YQKdEzsPswfEWnt3fd1TrXF27h/fx5DIRn19jw==} + '@chakra-ui/react@3.13.0': resolution: {integrity: sha512-HqFXuVhiQCftQT5+/9F6w0aZufHgvaSr7jJoMP+BUxihF6uaSSW2YHy2eKK4a5SWNLMOnZHYQbUUrC3WSGcYxg==} peerDependencies: @@ -4239,7 +4239,7 @@ packages: '@photonjs/core': ^0.1.0 '@photonjs/runtime': ^0.1.0 '@photonjs/vercel': ^0.1.1 - vike: 0.4.250-commit-6161324 + vike: '>=0.4.244' vite: '>=7.1' peerDependenciesMeta: '@photonjs/cloudflare': @@ -4254,10 +4254,10 @@ packages: peerDependencies: react: '>=19' react-dom: '>=19' - vike: 0.4.250-commit-6161324 + vike: '>=0.4.182' - vike@0.4.250-commit-6161324: - resolution: {integrity: sha512-6Yzr3g9BFw+UGBxrguhxGpm8XQDLEMRpeEs3b5OL3oZ+jDQM1d/5Bd2++qMnFW9gmPyvLlG14R/IgV+rzhDQlA==} + vike@0.4.252: + resolution: {integrity: sha512-hH3q92yYupWth4fN6TYAK62JLmZELrWXUpna0+n20iEVFT+x917ah7q2zxR+oLhVq8eeDNPHn47OOMUCjUS9nw==} engines: {node: '>=20.19.0'} hasBin: true peerDependencies: @@ -4836,6 +4836,11 @@ snapshots: '@brillout/import': 0.2.6 '@brillout/picocolors': 1.0.29 + '@brillout/vite-plugin-server-entry@0.7.17': + dependencies: + '@brillout/import': 0.2.6 + '@brillout/picocolors': 1.0.30 + '@chakra-ui/react@3.13.0(@emotion/react@11.14.0(@types/react@19.2.7)(react@19.2.1))(react-dom@19.2.1(react@19.2.1))(react@19.2.1)': dependencies: '@ark-ui/react': 4.9.2(react-dom@19.2.1(react@19.2.1))(react@19.2.1) @@ -8461,10 +8466,12 @@ snapshots: stylis: 4.3.2 tslib: 2.6.2 - styled-jsx@5.1.6(react@19.2.1): + styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.2.1): dependencies: client-only: 0.0.1 react: 19.2.1 + optionalDependencies: + '@babel/core': 7.28.5 stylis@4.2.0: {} @@ -8590,7 +8597,7 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vike-photon@0.1.23(@photonjs/core@0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.3.0(@types/node@24.0.8)))(@photonjs/runtime@0.1.10(hono@4.10.7)(rollup@4.46.2)(vite@7.3.0(@types/node@24.0.8)))(hono@4.10.7)(rollup@4.46.2)(srvx@0.9.6)(vike@0.4.250-commit-6161324(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)))(vite@7.3.0(@types/node@24.0.8)): + vike-photon@0.1.23(@photonjs/core@0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.3.0(@types/node@24.0.8)))(@photonjs/runtime@0.1.10(hono@4.10.7)(rollup@4.46.2)(vite@7.3.0(@types/node@24.0.8)))(hono@4.10.7)(rollup@4.46.2)(srvx@0.9.6)(vike@0.4.252(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)))(vite@7.3.0(@types/node@24.0.8)): dependencies: '@brillout/picocolors': 1.0.29 '@brillout/vite-plugin-server-entry': 0.7.15 @@ -8601,7 +8608,7 @@ snapshots: '@universal-middleware/sirv': 0.1.24 pkg-types: 2.3.0 standaloner: 0.1.11(rollup@4.46.2) - vike: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + vike: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) optionalDependencies: vite: 7.3.0(@types/node@24.0.8) transitivePeerDependencies: @@ -8618,14 +8625,14 @@ snapshots: - srvx - supports-color - vike-react@0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.250-commit-6161324(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8))): + vike-react@0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.252(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8))): dependencies: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) react-streaming: 0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - vike: 0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + vike: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) - vike@0.4.250-commit-6161324(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)): + vike@0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)): dependencies: '@babel/core': 7.28.5 '@babel/types': 7.28.5 @@ -8633,7 +8640,7 @@ snapshots: '@brillout/json-serializer': 0.5.21 '@brillout/picocolors': 1.0.30 '@brillout/require-shim': 0.1.2 - '@brillout/vite-plugin-server-entry': 0.7.15 + '@brillout/vite-plugin-server-entry': 0.7.17 cac: 6.7.14 es-module-lexer: 1.7.0 esbuild: 0.27.2 From 6e1c6f542e4b2de7a27bca479ed8794e37ad66a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Tue, 13 Jan 2026 07:57:38 +0100 Subject: [PATCH 16/19] refactor --- examples/sentry/.env.example | 7 +++++++ examples/sentry/pages/+config.ts | 3 ++- examples/sentry/pages/+sentry.client.ts | 8 -------- examples/sentry/pages/+sentry.server.ts | 8 -------- examples/sentry/tsconfig.json | 2 +- packages/vike-react-sentry/src/integration/Head.tsx | 2 +- .../src/integration/onCreateGlobalContext-client.ts | 2 +- packages/vike-react-sentry/src/plugin/index.ts | 4 +++- packages/vike-react-sentry/src/types.ts | 2 ++ 9 files changed, 17 insertions(+), 21 deletions(-) create mode 100644 examples/sentry/.env.example delete mode 100644 examples/sentry/pages/+sentry.client.ts delete mode 100644 examples/sentry/pages/+sentry.server.ts diff --git a/examples/sentry/.env.example b/examples/sentry/.env.example new file mode 100644 index 000000000..143d0b451 --- /dev/null +++ b/examples/sentry/.env.example @@ -0,0 +1,7 @@ +# Required: Your Sentry DSN (public, safe to expose to the browser) +PUBLIC_ENV__SENTRY_DSN=https://xxxxx@xxxxx.ingest.sentry.io/xxxxx + +# Required for source map upload: Sentry Auth Token +# Create at https://sentry.io/settings/account/api/auth-tokens/ +# Required scopes: project:read, project:releases, project:write +SENTRY_AUTH_TOKEN=sntryu_xxxxx diff --git a/examples/sentry/pages/+config.ts b/examples/sentry/pages/+config.ts index 71c2e2de4..ba4ab7fa6 100644 --- a/examples/sentry/pages/+config.ts +++ b/examples/sentry/pages/+config.ts @@ -10,7 +10,8 @@ const config = { extends: [vikeReact, vikePhoton, vikeReactSentry], sentry: { tracesSampleRate: 1.0, - dsn: 'https://8de66fe8dda3a86d986df8ee3aa09f72@o4510438936412161.ingest.de.sentry.io/4510438941655120', + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1.0, }, // Photon configuration photon: { diff --git a/examples/sentry/pages/+sentry.client.ts b/examples/sentry/pages/+sentry.client.ts deleted file mode 100644 index f2c0a61d9..000000000 --- a/examples/sentry/pages/+sentry.client.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { SentryReactOptions } from 'vike-react-sentry/types' -import type { GlobalContextClient } from 'vike/types' - -export default function (globalContextClient: GlobalContextClient): SentryReactOptions { - return { - tracesSampleRate: 1, - } -} diff --git a/examples/sentry/pages/+sentry.server.ts b/examples/sentry/pages/+sentry.server.ts deleted file mode 100644 index 43836f7dd..000000000 --- a/examples/sentry/pages/+sentry.server.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { SentryNodeOptions } from 'vike-react-sentry/types' -import type { GlobalContextServer } from 'vike/types' - -export default function (globalContextServer: GlobalContextServer): SentryNodeOptions { - return { - tracesSampleRate: 1, - } -} diff --git a/examples/sentry/tsconfig.json b/examples/sentry/tsconfig.json index 6f6b091be..8df2db5f2 100644 --- a/examples/sentry/tsconfig.json +++ b/examples/sentry/tsconfig.json @@ -6,7 +6,7 @@ "target": "ES2020", "lib": ["DOM", "DOM.Iterable", "ESNext"], "types": ["vite/client"], - "jsx": "react", + "jsx": "react-jsx", "skipLibCheck": true, "esModuleInterop": true }, diff --git a/packages/vike-react-sentry/src/integration/Head.tsx b/packages/vike-react-sentry/src/integration/Head.tsx index 3332a5188..200e457d8 100644 --- a/packages/vike-react-sentry/src/integration/Head.tsx +++ b/packages/vike-react-sentry/src/integration/Head.tsx @@ -18,7 +18,7 @@ function Head() { // Fields may include: // - sentry-trace: Sentry's proprietary trace header // - baggage: Dynamic sampling context - // - traceparent: W3C Trace Context header (only if propagateTraceparent is enabled) + // - traceparent: W3C Trace Context header return ( <> {traceData['sentry-trace'] && } diff --git a/packages/vike-react-sentry/src/integration/onCreateGlobalContext-client.ts b/packages/vike-react-sentry/src/integration/onCreateGlobalContext-client.ts index ce323e22a..8c8d46ed7 100644 --- a/packages/vike-react-sentry/src/integration/onCreateGlobalContext-client.ts +++ b/packages/vike-react-sentry/src/integration/onCreateGlobalContext-client.ts @@ -18,7 +18,7 @@ async function onCreateGlobalContext(globalContext: GlobalContextClient): Promis if (!clientConfig) return if (!SentryReact.getClient()) { SentryReact.init({ - integrations: [SentryReact.browserTracingIntegration()], + integrations: [SentryReact.browserTracingIntegration(), SentryReact.replayIntegration()], ...clientConfig, dsn: resolveDsn(clientConfig.dsn), }) diff --git a/packages/vike-react-sentry/src/plugin/index.ts b/packages/vike-react-sentry/src/plugin/index.ts index 2c05c1d52..d57b186a0 100644 --- a/packages/vike-react-sentry/src/plugin/index.ts +++ b/packages/vike-react-sentry/src/plugin/index.ts @@ -24,13 +24,15 @@ async function getViteConfig(): Promise { const sentryConfigRaw = vikeConfig.config.sentry || [] const sentryConfig = sentryConfigRaw.toReversed().reduce((acc, curr) => { + // skip function configs if (typeof curr === 'function') { - // skip function configs as we don't have access to globalContext here curr = {} } return assignDeep(acc, curr) }, {}) as SentryOptions + // Assumes the client and server uses the same DSN + // If different DSNs are needed, we can enable SENTRY_DSN later assertUsage( !process.env['SENTRY_DSN'], 'SENTRY_DSN is not supported. Use PUBLIC_ENV__SENTRY_DSN instead, or set dsn in your sentry config.', diff --git a/packages/vike-react-sentry/src/types.ts b/packages/vike-react-sentry/src/types.ts index e9067ce84..ab7b6fb18 100644 --- a/packages/vike-react-sentry/src/types.ts +++ b/packages/vike-react-sentry/src/types.ts @@ -14,4 +14,6 @@ export type SentryOptions = Pick< | 'enabled' | 'maxBreadcrumbs' | 'sendDefaultPii' + | 'replaysSessionSampleRate' + | 'replaysOnErrorSampleRate' > From d81d70477b2cf6d2622418be914cb1d7af682669 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Tue, 13 Jan 2026 08:00:40 +0100 Subject: [PATCH 17/19] minor --- packages/vike-react-sentry/src/integration/Head.tsx | 1 - packages/vike-react-sentry/src/plugin/index.ts | 1 - 2 files changed, 2 deletions(-) diff --git a/packages/vike-react-sentry/src/integration/Head.tsx b/packages/vike-react-sentry/src/integration/Head.tsx index 200e457d8..0e203e59b 100644 --- a/packages/vike-react-sentry/src/integration/Head.tsx +++ b/packages/vike-react-sentry/src/integration/Head.tsx @@ -6,7 +6,6 @@ import * as Sentry from '@sentry/node' // Inject Sentry trace meta tags into the HTML head for distributed tracing // This allows the client-side SDK to continue the trace started on the server function Head() { - // Only inject trace data if Sentry is initialized if (!Sentry.getClient()) { return null } diff --git a/packages/vike-react-sentry/src/plugin/index.ts b/packages/vike-react-sentry/src/plugin/index.ts index d57b186a0..5d3ce6474 100644 --- a/packages/vike-react-sentry/src/plugin/index.ts +++ b/packages/vike-react-sentry/src/plugin/index.ts @@ -105,7 +105,6 @@ async function getViteConfig(): Promise { getServerProductionEntry: () => { return ` // vike-react-sentry: Preload OpenTelemetry instrumentation for ESM -// This runs before the main server entry to enable monkey-patching of libraries // The actual Sentry.init() with config will be called later via onCreateGlobalContext // https://docs.sentry.io/platforms/javascript/guides/node/install/esm-without-import/ import { preloadOpenTelemetry } from '@sentry/node'; From 016ddd5bc85946e2328b4ad2180593431ec4751c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Tue, 13 Jan 2026 08:23:24 +0100 Subject: [PATCH 18/19] refactor --- packages/vike-react-sentry/package.json | 12 ++++-------- .../vike-react-sentry/src/integration/+config.ts | 10 ++++++++-- ...ext-client.ts => onCreateGlobalContext.client.ts} | 0 ...ext-server.ts => onCreateGlobalContext.server.ts} | 0 .../{onHookCall-client.ts => onHookCall.client.ts} | 0 .../{onHookCall-server.ts => onHookCall.server.ts} | 0 6 files changed, 12 insertions(+), 10 deletions(-) rename packages/vike-react-sentry/src/integration/{onCreateGlobalContext-client.ts => onCreateGlobalContext.client.ts} (100%) rename packages/vike-react-sentry/src/integration/{onCreateGlobalContext-server.ts => onCreateGlobalContext.server.ts} (100%) rename packages/vike-react-sentry/src/integration/{onHookCall-client.ts => onHookCall.client.ts} (100%) rename packages/vike-react-sentry/src/integration/{onHookCall-server.ts => onHookCall.server.ts} (100%) diff --git a/packages/vike-react-sentry/package.json b/packages/vike-react-sentry/package.json index ec52de058..60c6badbb 100644 --- a/packages/vike-react-sentry/package.json +++ b/packages/vike-react-sentry/package.json @@ -8,14 +8,10 @@ "./plugin": "./dist/plugin/index.js", "./types": "./dist/types.js", "./__internal/integration/Head": "./dist/integration/Head.js", - "./__internal/integration/onCreateGlobalContext": { - "browser": "./dist/integration/onCreateGlobalContext-client.js", - "default": "./dist/integration/onCreateGlobalContext-server.js" - }, - "./__internal/integration/onHookCall": { - "browser": "./dist/integration/onHookCall-client.js", - "default": "./dist/integration/onHookCall-server.js" - }, + "./__internal/integration/onCreateGlobalContext.server": "./dist/integration/onCreateGlobalContext.server.js", + "./__internal/integration/onCreateGlobalContext.client": "./dist/integration/onCreateGlobalContext.client.js", + "./__internal/integration/onHookCall.server": "./dist/integration/onHookCall.server.js", + "./__internal/integration/onHookCall.client": "./dist/integration/onHookCall.client.js", "./__internal/integration/client": "./dist/integration/client.js", "./__internal/integration/onError": "./dist/integration/onError.js" }, diff --git a/packages/vike-react-sentry/src/integration/+config.ts b/packages/vike-react-sentry/src/integration/+config.ts index b4ca1d995..e56ac7dc6 100644 --- a/packages/vike-react-sentry/src/integration/+config.ts +++ b/packages/vike-react-sentry/src/integration/+config.ts @@ -12,9 +12,15 @@ const config = { 'vike-react': '>=0.6.4', }, Head: 'import:vike-react-sentry/__internal/integration/Head:Head', - onCreateGlobalContext: 'import:vike-react-sentry/__internal/integration/onCreateGlobalContext:onCreateGlobalContext', + onCreateGlobalContext: [ + 'import:vike-react-sentry/__internal/integration/onCreateGlobalContext.server:onCreateGlobalContext', + 'import:vike-react-sentry/__internal/integration/onCreateGlobalContext.client:onCreateGlobalContext', + ], onError: 'import:vike-react-sentry/__internal/integration/onError:onError', - onHookCall: 'import:vike-react-sentry/__internal/integration/onHookCall:onHookCall', + onHookCall: [ + 'import:vike-react-sentry/__internal/integration/onHookCall.server:onHookCall', + 'import:vike-react-sentry/__internal/integration/onHookCall.client:onHookCall', + ], meta: { sentry: { env: { diff --git a/packages/vike-react-sentry/src/integration/onCreateGlobalContext-client.ts b/packages/vike-react-sentry/src/integration/onCreateGlobalContext.client.ts similarity index 100% rename from packages/vike-react-sentry/src/integration/onCreateGlobalContext-client.ts rename to packages/vike-react-sentry/src/integration/onCreateGlobalContext.client.ts diff --git a/packages/vike-react-sentry/src/integration/onCreateGlobalContext-server.ts b/packages/vike-react-sentry/src/integration/onCreateGlobalContext.server.ts similarity index 100% rename from packages/vike-react-sentry/src/integration/onCreateGlobalContext-server.ts rename to packages/vike-react-sentry/src/integration/onCreateGlobalContext.server.ts diff --git a/packages/vike-react-sentry/src/integration/onHookCall-client.ts b/packages/vike-react-sentry/src/integration/onHookCall.client.ts similarity index 100% rename from packages/vike-react-sentry/src/integration/onHookCall-client.ts rename to packages/vike-react-sentry/src/integration/onHookCall.client.ts diff --git a/packages/vike-react-sentry/src/integration/onHookCall-server.ts b/packages/vike-react-sentry/src/integration/onHookCall.server.ts similarity index 100% rename from packages/vike-react-sentry/src/integration/onHookCall-server.ts rename to packages/vike-react-sentry/src/integration/onHookCall.server.ts From 58c6361d61bd6acc676b99e79e5cfc73a671fcd1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Horv=C3=A1th=20D=C3=A1niel?= Date: Thu, 15 Jan 2026 13:14:45 +0100 Subject: [PATCH 19/19] feat: integrate Sentry with adaptive sampling and error tracking --- examples/sentry/pages/+config.ts | 5 - package.json | 7 +- packages/vike-react-sentry/package.json | 1 - .../src/integration/constants.ts | 2 + .../src/integration/defaults-client.ts | 20 ++++ .../src/integration/defaults-server.ts | 16 ++++ .../onCreateGlobalContext.client.ts | 9 +- .../onCreateGlobalContext.server.ts | 10 +- .../src/integration/onHookCall.client.ts | 13 +-- .../src/integration/onHookCall.server.ts | 12 +-- packages/vike-react-sentry/src/utils/error.ts | 12 +++ pnpm-lock.yaml | 95 ++++++++++--------- 12 files changed, 117 insertions(+), 85 deletions(-) create mode 100644 packages/vike-react-sentry/src/integration/constants.ts create mode 100644 packages/vike-react-sentry/src/integration/defaults-client.ts create mode 100644 packages/vike-react-sentry/src/integration/defaults-server.ts diff --git a/examples/sentry/pages/+config.ts b/examples/sentry/pages/+config.ts index ba4ab7fa6..3ef184e02 100644 --- a/examples/sentry/pages/+config.ts +++ b/examples/sentry/pages/+config.ts @@ -8,11 +8,6 @@ import vikeReactSentry from 'vike-react-sentry/config' const config = { title: 'Vike + React + Sentry Example', extends: [vikeReact, vikePhoton, vikeReactSentry], - sentry: { - tracesSampleRate: 1.0, - replaysSessionSampleRate: 0.1, - replaysOnErrorSampleRate: 1.0, - }, // Photon configuration photon: { server: '../server/index.ts', diff --git a/package.json b/package.json index 885f29f83..78c77856c 100644 --- a/package.json +++ b/package.json @@ -31,5 +31,10 @@ "playwright-chromium": "^1.57.0", "prettier": "^3.2.5" }, - "packageManager": "pnpm@9.4.0" + "packageManager": "pnpm@9.4.0", + "pnpm": { + "overrides": { + "vike": "0.4.252-commit-7f781cf" + } + } } diff --git a/packages/vike-react-sentry/package.json b/packages/vike-react-sentry/package.json index 60c6badbb..c5afb31ca 100644 --- a/packages/vike-react-sentry/package.json +++ b/packages/vike-react-sentry/package.json @@ -12,7 +12,6 @@ "./__internal/integration/onCreateGlobalContext.client": "./dist/integration/onCreateGlobalContext.client.js", "./__internal/integration/onHookCall.server": "./dist/integration/onHookCall.server.js", "./__internal/integration/onHookCall.client": "./dist/integration/onHookCall.client.js", - "./__internal/integration/client": "./dist/integration/client.js", "./__internal/integration/onError": "./dist/integration/onError.js" }, "scripts": { diff --git a/packages/vike-react-sentry/src/integration/constants.ts b/packages/vike-react-sentry/src/integration/constants.ts new file mode 100644 index 000000000..a2aa6ee4b --- /dev/null +++ b/packages/vike-react-sentry/src/integration/constants.ts @@ -0,0 +1,2 @@ +export const TRACE_DEFAULT_SAMPLE_RATE = 0.2 +export const TRACE_DEFAULT_SAMPLE_RATE_ERROR = 1.0 diff --git a/packages/vike-react-sentry/src/integration/defaults-client.ts b/packages/vike-react-sentry/src/integration/defaults-client.ts new file mode 100644 index 000000000..d7f26a505 --- /dev/null +++ b/packages/vike-react-sentry/src/integration/defaults-client.ts @@ -0,0 +1,20 @@ +import { SentryReactOptions } from '../types.js' +import { resolveDsn } from '../utils/resolveDsn.js' +import * as SentryReact from '@sentry/react' +import { TRACE_DEFAULT_SAMPLE_RATE, TRACE_DEFAULT_SAMPLE_RATE_ERROR } from './constants.js' + +export const DEFAULT_SENTRY_CLIENT_SETTINGS = (clientConfig: SentryReactOptions) => + ({ + environment: clientConfig.environment || import.meta.env.MODE || 'production', + replaysSessionSampleRate: 0.1, + replaysOnErrorSampleRate: 1.0, + integrations: [SentryReact.browserTracingIntegration(), SentryReact.replayIntegration()], + dsn: resolveDsn(clientConfig.dsn), + tracesSampler: (samplingContext) => { + const { attributes, inheritOrSampleWith } = samplingContext + if (attributes?.hasRecentErrors === true) { + return TRACE_DEFAULT_SAMPLE_RATE_ERROR + } + return inheritOrSampleWith(clientConfig.tracesSampleRate || TRACE_DEFAULT_SAMPLE_RATE) + }, + }) as SentryReactOptions diff --git a/packages/vike-react-sentry/src/integration/defaults-server.ts b/packages/vike-react-sentry/src/integration/defaults-server.ts new file mode 100644 index 000000000..81e9ca629 --- /dev/null +++ b/packages/vike-react-sentry/src/integration/defaults-server.ts @@ -0,0 +1,16 @@ +import { SentryNodeOptions } from '../types.js' +import { resolveDsn } from '../utils/resolveDsn.js' +import { TRACE_DEFAULT_SAMPLE_RATE, TRACE_DEFAULT_SAMPLE_RATE_ERROR } from './constants.js' + +export const DEFAULT_SENTRY_SERVER_SETTINGS = (serverConfig: SentryNodeOptions) => + ({ + environment: serverConfig.environment || import.meta.env.MODE || 'production', + dsn: resolveDsn(serverConfig.dsn), + tracesSampler: (samplingContext) => { + const { attributes, inheritOrSampleWith } = samplingContext + if (attributes?.hasRecentErrors === true) { + return TRACE_DEFAULT_SAMPLE_RATE_ERROR + } + return inheritOrSampleWith(serverConfig.tracesSampleRate || TRACE_DEFAULT_SAMPLE_RATE) + }, + }) as SentryNodeOptions diff --git a/packages/vike-react-sentry/src/integration/onCreateGlobalContext.client.ts b/packages/vike-react-sentry/src/integration/onCreateGlobalContext.client.ts index 8c8d46ed7..d16a2e085 100644 --- a/packages/vike-react-sentry/src/integration/onCreateGlobalContext.client.ts +++ b/packages/vike-react-sentry/src/integration/onCreateGlobalContext.client.ts @@ -2,25 +2,22 @@ export { onCreateGlobalContext } import * as SentryReact from '@sentry/react' import type { GlobalContextClient } from 'vike/types' -import { resolveDsn } from '../utils/resolveDsn.js' import { assignDeep } from '../utils/assignDeep.js' import { SentryOptions } from '../types.js' +import { DEFAULT_SENTRY_CLIENT_SETTINGS } from './defaults-client.js' async function onCreateGlobalContext(globalContext: GlobalContextClient): Promise { - if (!globalContext.config.sentry?.length) return - const clientConfig = globalContext.config.sentry.reverse().reduce((acc, curr) => { + const clientConfig = (globalContext.config.sentry || []).reverse().reduce((acc, curr) => { if (typeof curr === 'function') { curr = curr(globalContext) } return assignDeep(acc, curr) }, {}) as SentryOptions - if (!clientConfig) return if (!SentryReact.getClient()) { SentryReact.init({ - integrations: [SentryReact.browserTracingIntegration(), SentryReact.replayIntegration()], + ...DEFAULT_SENTRY_CLIENT_SETTINGS(clientConfig), ...clientConfig, - dsn: resolveDsn(clientConfig.dsn), }) } } diff --git a/packages/vike-react-sentry/src/integration/onCreateGlobalContext.server.ts b/packages/vike-react-sentry/src/integration/onCreateGlobalContext.server.ts index 188264620..e386db2c0 100644 --- a/packages/vike-react-sentry/src/integration/onCreateGlobalContext.server.ts +++ b/packages/vike-react-sentry/src/integration/onCreateGlobalContext.server.ts @@ -2,24 +2,22 @@ export { onCreateGlobalContext } import * as SentryNode from '@sentry/node' import type { GlobalContextServer } from 'vike/types' -import { resolveDsn } from '../utils/resolveDsn.js' -import { assignDeep } from '../utils/assignDeep.js' import { SentryOptions } from '../types.js' +import { assignDeep } from '../utils/assignDeep.js' +import { DEFAULT_SENTRY_SERVER_SETTINGS } from './defaults-server.js' async function onCreateGlobalContext(globalContext: GlobalContextServer): Promise { - if (!globalContext.config.sentry?.length) return - const serverConfig = globalContext.config.sentry.reverse().reduce((acc, curr) => { + const serverConfig = (globalContext.config.sentry || []).reverse().reduce((acc, curr) => { if (typeof curr === 'function') { curr = curr(globalContext) } return assignDeep(acc, curr) }, {}) as SentryOptions - if (!serverConfig) return if (!SentryNode.getClient()) { SentryNode.init({ + ...DEFAULT_SENTRY_SERVER_SETTINGS(serverConfig), ...serverConfig, - dsn: resolveDsn(serverConfig.dsn), }) } } diff --git a/packages/vike-react-sentry/src/integration/onHookCall.client.ts b/packages/vike-react-sentry/src/integration/onHookCall.client.ts index d8e97a071..f1b8370b5 100644 --- a/packages/vike-react-sentry/src/integration/onHookCall.client.ts +++ b/packages/vike-react-sentry/src/integration/onHookCall.client.ts @@ -1,6 +1,6 @@ import { Config } from 'vike/types' import * as Sentry from '@sentry/react' -import { markErrorAsSeen } from '../utils/error.js' +import { markErrorAsSeen, recordError, hasRecentErrors } from '../utils/error.js' /** * Vike onHookCall configuration for Sentry integration (client-side). @@ -14,7 +14,6 @@ export const onHookCall: Config['onHookCall'] = async (hook, pageContext) => { // Extract useful context for Sentry const url = pageContext?.urlOriginal ?? 'unknown' const pageId = pageContext?.pageId ?? 'unknown' - const routeParams = pageContext?.routeParams ?? {} // withScope ensures any error captured during hook execution has Vike context return Sentry.withScope((scope) => { @@ -25,7 +24,6 @@ export const onHookCall: Config['onHookCall'] = async (hook, pageContext) => { filePath: hook.filePath, pageId, url, - routeParams, }) return Sentry.startSpan( @@ -37,13 +35,7 @@ export const onHookCall: Config['onHookCall'] = async (hook, pageContext) => { 'vike.hook.file': hook.filePath, 'vike.page.id': pageId, 'vike.url': url, - ...Object.entries(routeParams).reduce( - (acc, [key, value]) => ({ - ...acc, - [`vike.route.${key}`]: value, - }), - {}, - ), + hasRecentErrors: hasRecentErrors(), }, }, async (span) => { @@ -51,6 +43,7 @@ export const onHookCall: Config['onHookCall'] = async (hook, pageContext) => { await hook.call() } catch (error) { markErrorAsSeen(error) + recordError() span.setStatus({ code: 2, }) diff --git a/packages/vike-react-sentry/src/integration/onHookCall.server.ts b/packages/vike-react-sentry/src/integration/onHookCall.server.ts index 9411956a3..0cfa20881 100644 --- a/packages/vike-react-sentry/src/integration/onHookCall.server.ts +++ b/packages/vike-react-sentry/src/integration/onHookCall.server.ts @@ -1,6 +1,6 @@ import { Config } from 'vike/types' import * as Sentry from '@sentry/node' -import { markErrorAsSeen } from '../utils/error.js' +import { hasRecentErrors, markErrorAsSeen } from '../utils/error.js' /** * Vike onHookCall configuration for Sentry integration. @@ -14,7 +14,6 @@ export const onHookCall: Config['onHookCall'] = async (hook, pageContext) => { // Extract useful context for Sentry const url = pageContext?.urlOriginal ?? 'unknown' const pageId = pageContext?.pageId ?? 'unknown' - const routeParams = pageContext?.routeParams ?? {} // withScope ensures any error captured during hook execution has Vike context return Sentry.withScope((scope) => { @@ -25,7 +24,6 @@ export const onHookCall: Config['onHookCall'] = async (hook, pageContext) => { filePath: hook.filePath, pageId, url, - routeParams, }) return Sentry.startSpan( @@ -37,13 +35,7 @@ export const onHookCall: Config['onHookCall'] = async (hook, pageContext) => { 'vike.hook.file': hook.filePath, 'vike.page.id': pageId, 'vike.url': url, - ...Object.entries(routeParams).reduce( - (acc, [key, value]) => ({ - ...acc, - [`vike.route.${key}`]: value, - }), - {}, - ), + hasRecentErrors: hasRecentErrors(), }, }, async (span) => { diff --git a/packages/vike-react-sentry/src/utils/error.ts b/packages/vike-react-sentry/src/utils/error.ts index fa2e008fd..b71575674 100644 --- a/packages/vike-react-sentry/src/utils/error.ts +++ b/packages/vike-react-sentry/src/utils/error.ts @@ -9,3 +9,15 @@ export const markErrorAsSeen = (error: unknown): void => { export const isErrorSeen = (error: unknown): boolean => { return typeof error === 'object' && error !== null && Boolean((error as any)[seenError]) } + +// Track recent errors for adaptive sampling +let lastErrorTimestamp: number | null = null +const RECENT_ERROR_WINDOW = 5 * 60 * 1000 // 5 minutes + +export const hasRecentErrors = (): boolean => { + return lastErrorTimestamp !== null && Date.now() - lastErrorTimestamp < RECENT_ERROR_WINDOW +} + +export const recordError = (): void => { + lastErrorTimestamp = Date.now() +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 160dcc079..3917da1dd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,9 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +overrides: + vike: 0.4.252-commit-7f781cf + importers: .: @@ -54,8 +57,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.252-commit-7f781cf + version: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../../packages/vike-react @@ -93,8 +96,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.252-commit-7f781cf + version: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../../packages/vike-react @@ -114,8 +117,8 @@ importers: specifier: ^19.2.1 version: 19.2.1(react@19.2.1) vike: - specifier: ^0.4.249 - version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.252-commit-7f781cf + version: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../../packages/vike-react @@ -147,8 +150,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.252-commit-7f781cf + version: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../../packages/vike-react @@ -186,8 +189,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.252-commit-7f781cf + version: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../../packages/vike-react @@ -234,14 +237,14 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.252 - version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.252-commit-7f781cf + version: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-photon: specifier: ^0.1.20 - version: 0.1.23(@photonjs/core@0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.3.0(@types/node@24.0.8)))(@photonjs/runtime@0.1.10(hono@4.10.7)(rollup@4.46.2)(vite@7.3.0(@types/node@24.0.8)))(hono@4.10.7)(rollup@4.46.2)(srvx@0.9.6)(vike@0.4.252(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)))(vite@7.3.0(@types/node@24.0.8)) + version: 0.1.23(@photonjs/core@0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.3.0(@types/node@24.0.8)))(@photonjs/runtime@0.1.10(hono@4.10.7)(rollup@4.46.2)(vite@7.3.0(@types/node@24.0.8)))(hono@4.10.7)(rollup@4.46.2)(srvx@0.9.6)(vike@0.4.252-commit-7f781cf(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.10 - version: 0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.252(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8))) + version: 0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.252-commit-7f781cf(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8))) vike-react-sentry: specifier: 0.1.0 version: link:../../packages/vike-react-sentry @@ -273,8 +276,8 @@ importers: specifier: ^5.9.3 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.252-commit-7f781cf + version: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../../packages/vike-react @@ -322,8 +325,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.252-commit-7f781cf + version: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vite: specifier: ^7.3.0 version: 7.3.0(@types/node@24.0.8) @@ -352,8 +355,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.252-commit-7f781cf + version: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -404,8 +407,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.252-commit-7f781cf + version: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -437,8 +440,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.252-commit-7f781cf + version: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -486,8 +489,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.252-commit-7f781cf + version: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -523,8 +526,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.252-commit-7f781cf + version: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -575,11 +578,11 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.252 - version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.252-commit-7f781cf + version: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.10 - version: 0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.252(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8))) + version: 0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.252-commit-7f781cf(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8))) vite: specifier: ^7.1.7 version: 7.3.0(@types/node@24.0.8) @@ -605,8 +608,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.252-commit-7f781cf + version: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -635,8 +638,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.252-commit-7f781cf + version: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -687,8 +690,8 @@ importers: specifier: ^5.9.2 version: 5.9.3 vike: - specifier: ^0.4.249 - version: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + specifier: 0.4.252-commit-7f781cf + version: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) vike-react: specifier: 0.6.15 version: link:../vike-react @@ -4239,7 +4242,7 @@ packages: '@photonjs/core': ^0.1.0 '@photonjs/runtime': ^0.1.0 '@photonjs/vercel': ^0.1.1 - vike: '>=0.4.244' + vike: 0.4.252-commit-7f781cf vite: '>=7.1' peerDependenciesMeta: '@photonjs/cloudflare': @@ -4254,10 +4257,10 @@ packages: peerDependencies: react: '>=19' react-dom: '>=19' - vike: '>=0.4.182' + vike: 0.4.252-commit-7f781cf - vike@0.4.252: - resolution: {integrity: sha512-hH3q92yYupWth4fN6TYAK62JLmZELrWXUpna0+n20iEVFT+x917ah7q2zxR+oLhVq8eeDNPHn47OOMUCjUS9nw==} + vike@0.4.252-commit-7f781cf: + resolution: {integrity: sha512-EruDmaMPSdSOsos3VZ8HhMYQd88ZP3afks6rKsnx4fV4wfpMpDyXYc9FYOmAzHCwkwaIXEZevku/aa67K5ZQxg==} engines: {node: '>=20.19.0'} hasBin: true peerDependencies: @@ -8597,7 +8600,7 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 - vike-photon@0.1.23(@photonjs/core@0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.3.0(@types/node@24.0.8)))(@photonjs/runtime@0.1.10(hono@4.10.7)(rollup@4.46.2)(vite@7.3.0(@types/node@24.0.8)))(hono@4.10.7)(rollup@4.46.2)(srvx@0.9.6)(vike@0.4.252(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)))(vite@7.3.0(@types/node@24.0.8)): + vike-photon@0.1.23(@photonjs/core@0.1.13(hono@4.10.7)(srvx@0.9.6)(vite@7.3.0(@types/node@24.0.8)))(@photonjs/runtime@0.1.10(hono@4.10.7)(rollup@4.46.2)(vite@7.3.0(@types/node@24.0.8)))(hono@4.10.7)(rollup@4.46.2)(srvx@0.9.6)(vike@0.4.252-commit-7f781cf(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)))(vite@7.3.0(@types/node@24.0.8)): dependencies: '@brillout/picocolors': 1.0.29 '@brillout/vite-plugin-server-entry': 0.7.15 @@ -8608,7 +8611,7 @@ snapshots: '@universal-middleware/sirv': 0.1.24 pkg-types: 2.3.0 standaloner: 0.1.11(rollup@4.46.2) - vike: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + vike: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) optionalDependencies: vite: 7.3.0(@types/node@24.0.8) transitivePeerDependencies: @@ -8625,14 +8628,14 @@ snapshots: - srvx - supports-color - vike-react@0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.252(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8))): + vike-react@0.6.10(react-dom@19.2.1(react@19.2.1))(react@19.2.1)(vike@0.4.252-commit-7f781cf(react-streaming@0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1))(vite@7.3.0(@types/node@24.0.8))): dependencies: react: 19.2.1 react-dom: 19.2.1(react@19.2.1) react-streaming: 0.4.15(react-dom@19.2.1(react@19.2.1))(react@19.2.1) - vike: 0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) + vike: 0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)) - vike@0.4.252(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)): + vike@0.4.252-commit-7f781cf(react-streaming@0.4.15(react@19.2.1))(vite@7.3.0(@types/node@24.0.8)): dependencies: '@babel/core': 7.28.5 '@babel/types': 7.28.5