From ab373eab8151b173563460cef98e011d26ad8cc9 Mon Sep 17 00:00:00 2001 From: Eric Dahl Date: Wed, 23 Sep 2026 16:11:16 -0400 Subject: [PATCH] feat: report errors to self-hosted GlitchTip Adds the Sentry SDK pointed at the self-hosted GlitchTip instance at errors.ericdahl.dev, covering client, server and edge runtimes. Server errors had no reporting at all before this; PostHog only captured client exceptions. Shared options live in app/lib/observability/sentry-options.ts so the behaviour is testable: disabled without a DSN (and always disabled under test), client reads only NEXT_PUBLIC_SENTRY_DSN so no server-only DSN can reach the bundle, and release comes from Coolify's SOURCE_COMMIT. SDK v11 collects cookies, HTTP headers and query params by default. This app carries Neon Auth session cookies and node auth tokens, so every dataCollection category is turned off explicitly. Replay and tracing are pinned off: GlitchTip implements neither fully. Source map upload is disabled until an upload step and auth token exist. PostHog is left untouched, including capture_exceptions. --- app/lib/observability/sentry-options.ts | 75 ++ instrumentation-client.ts | 19 + instrumentation.ts | 16 + next.config.ts | 9 +- package.json | 1 + sentry.edge.config.ts | 14 + sentry.server.config.ts | 14 + tests/observability/sentry-options.test.ts | 137 +++ yarn.lock | 981 ++++++++++++++++++++- 9 files changed, 1261 insertions(+), 5 deletions(-) create mode 100644 app/lib/observability/sentry-options.ts create mode 100644 instrumentation.ts create mode 100644 sentry.edge.config.ts create mode 100644 sentry.server.config.ts create mode 100644 tests/observability/sentry-options.test.ts diff --git a/app/lib/observability/sentry-options.ts b/app/lib/observability/sentry-options.ts new file mode 100644 index 0000000..a3629b3 --- /dev/null +++ b/app/lib/observability/sentry-options.ts @@ -0,0 +1,75 @@ +/** + * Shared Sentry SDK options for the self-hosted GlitchTip instance. + * + * GlitchTip speaks the Sentry protocol but does not implement session replay + * and only partially implements performance tracing, so those are pinned off + * here rather than left to SDK defaults. + */ + +export type SentryRuntime = 'client' | 'server' | 'edge'; + +/** + * Every category below defaults to `true` in the SDK. This app carries Neon + * Auth session cookies and node auth tokens, so each one is turned off + * explicitly rather than trusted to a default. + */ +export interface SentryDataCollection { + userInfo: false; + cookies: false; + httpHeaders: false; + httpBodies: []; + urlQueryParams: false; +} + +export interface SentryOptions { + enabled: boolean; + dsn: string | undefined; + environment: string; + release: string | undefined; + tracesSampleRate: number; + replaysSessionSampleRate: number; + replaysOnErrorSampleRate: number; + dataCollection: SentryDataCollection; +} + +type Env = Record; + +function readValue(env: Env, key: string): string | undefined { + const value = env[key]?.trim(); + return value ? value : undefined; +} + +function readDsn(runtime: SentryRuntime, env: Env): string | undefined { + // The client bundle must only ever see the public DSN; reading SENTRY_DSN + // here would inline a server-only value into JavaScript we ship to browsers. + if (runtime === 'client') return readValue(env, 'NEXT_PUBLIC_SENTRY_DSN'); + return readValue(env, 'SENTRY_DSN') ?? readValue(env, 'NEXT_PUBLIC_SENTRY_DSN'); +} + +export function buildSentryOptions( + runtime: SentryRuntime, + env: Env = process.env as Env, +): SentryOptions { + const dsn = readDsn(runtime, env); + const nodeEnv = readValue(env, 'NODE_ENV') ?? 'development'; + + return { + // Without a DSN there is nowhere to send events, and the test suite must + // never reach the network even if one happens to be exported. + enabled: Boolean(dsn) && nodeEnv !== 'test', + dsn, + environment: readValue(env, 'SENTRY_ENVIRONMENT') ?? nodeEnv, + // Coolify exposes the deployed commit as SOURCE_COMMIT. + release: readValue(env, 'SENTRY_RELEASE') ?? readValue(env, 'SOURCE_COMMIT'), + tracesSampleRate: 0, + replaysSessionSampleRate: 0, + replaysOnErrorSampleRate: 0, + dataCollection: { + userInfo: false, + cookies: false, + httpHeaders: false, + httpBodies: [], + urlQueryParams: false, + }, + }; +} diff --git a/instrumentation-client.ts b/instrumentation-client.ts index b8ebf26..57d4d0c 100644 --- a/instrumentation-client.ts +++ b/instrumentation-client.ts @@ -1,5 +1,8 @@ +import * as Sentry from '@sentry/nextjs'; import posthog from 'posthog-js'; +import { buildSentryOptions } from '@/app/lib/observability/sentry-options'; + posthog.init(process.env.NEXT_PUBLIC_POSTHOG_PROJECT_TOKEN!, { api_host: '/ingest', ui_host: 'https://us.posthog.com', @@ -7,3 +10,19 @@ posthog.init(process.env.NEXT_PUBLIC_POSTHOG_PROJECT_TOKEN!, { capture_exceptions: true, debug: process.env.NODE_ENV === 'development', }); + +const sentryOptions = buildSentryOptions('client'); + +Sentry.init({ + enabled: sentryOptions.enabled, + dsn: sentryOptions.dsn, + environment: sentryOptions.environment, + release: sentryOptions.release, + tracesSampleRate: sentryOptions.tracesSampleRate, + // GlitchTip has no replay ingest, so never record or send one. + replaysSessionSampleRate: sentryOptions.replaysSessionSampleRate, + replaysOnErrorSampleRate: sentryOptions.replaysOnErrorSampleRate, + dataCollection: sentryOptions.dataCollection, +}); + +export const onRouterTransitionStart = Sentry.captureRouterTransitionStart; diff --git a/instrumentation.ts b/instrumentation.ts new file mode 100644 index 0000000..94533a1 --- /dev/null +++ b/instrumentation.ts @@ -0,0 +1,16 @@ +import * as Sentry from '@sentry/nextjs'; + +export async function register() { + if (process.env.NEXT_RUNTIME === 'nodejs') { + await import('./sentry.server.config'); + } + + if (process.env.NEXT_RUNTIME === 'edge') { + await import('./sentry.edge.config'); + } +} + +// Reports errors thrown inside route handlers, server components, and +// middleware. The WebSocket server in server.ts sits outside Next's request +// lifecycle, so errors there are only caught by the SDK's global handlers. +export const onRequestError = Sentry.captureRequestError; diff --git a/next.config.ts b/next.config.ts index d45918d..549abd7 100644 --- a/next.config.ts +++ b/next.config.ts @@ -1,3 +1,4 @@ +import { withSentryConfig } from '@sentry/nextjs/config'; import type { NextConfig } from 'next'; const nextConfig: NextConfig = { @@ -20,4 +21,10 @@ const nextConfig: NextConfig = { skipTrailingSlashRedirect: true, }; -export default nextConfig; +export default withSentryConfig(nextConfig, { + // Source map upload needs a GlitchTip auth token and an upload step in CI; + // until that exists, keep builds quiet rather than warning on every run. + sourcemaps: { disable: true }, + telemetry: false, + silent: true, +}); diff --git a/package.json b/package.json index 5b45ee5..060d116 100644 --- a/package.json +++ b/package.json @@ -20,6 +20,7 @@ "db:push": "drizzle-kit push" }, "dependencies": { + "@sentry/nextjs": "^11.0.0", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", "drizzle-orm": "^0.45.1", diff --git a/sentry.edge.config.ts b/sentry.edge.config.ts new file mode 100644 index 0000000..1def1f4 --- /dev/null +++ b/sentry.edge.config.ts @@ -0,0 +1,14 @@ +import * as Sentry from '@sentry/nextjs'; + +import { buildSentryOptions } from '@/app/lib/observability/sentry-options'; + +const options = buildSentryOptions('edge'); + +Sentry.init({ + enabled: options.enabled, + dsn: options.dsn, + environment: options.environment, + release: options.release, + tracesSampleRate: options.tracesSampleRate, + dataCollection: options.dataCollection, +}); diff --git a/sentry.server.config.ts b/sentry.server.config.ts new file mode 100644 index 0000000..4162391 --- /dev/null +++ b/sentry.server.config.ts @@ -0,0 +1,14 @@ +import * as Sentry from '@sentry/nextjs'; + +import { buildSentryOptions } from '@/app/lib/observability/sentry-options'; + +const options = buildSentryOptions('server'); + +Sentry.init({ + enabled: options.enabled, + dsn: options.dsn, + environment: options.environment, + release: options.release, + tracesSampleRate: options.tracesSampleRate, + dataCollection: options.dataCollection, +}); diff --git a/tests/observability/sentry-options.test.ts b/tests/observability/sentry-options.test.ts new file mode 100644 index 0000000..ab52d73 --- /dev/null +++ b/tests/observability/sentry-options.test.ts @@ -0,0 +1,137 @@ +import { describe, expect, test } from 'vitest'; + +import { buildSentryOptions } from '@/app/lib/observability/sentry-options'; + +describe('buildSentryOptions', () => { + test('is disabled when no DSN is configured', () => { + const options = buildSentryOptions('server', { NODE_ENV: 'production' }); + + expect(options.enabled).toBe(false); + expect(options.dsn).toBeUndefined(); + }); + + test('stays disabled during tests even when a DSN is present', () => { + const options = buildSentryOptions('server', { + NODE_ENV: 'test', + SENTRY_DSN: 'https://key@errors.example.dev/1', + }); + + expect(options.enabled).toBe(false); + }); + + test('client only reads the public DSN', () => { + const options = buildSentryOptions('client', { + NODE_ENV: 'production', + SENTRY_DSN: 'https://server-only@errors.example.dev/1', + NEXT_PUBLIC_SENTRY_DSN: 'https://public@errors.example.dev/1', + }); + + expect(options.dsn).toBe('https://public@errors.example.dev/1'); + }); + + test('client ignores a server-only DSN so it never reaches the bundle', () => { + const options = buildSentryOptions('client', { + NODE_ENV: 'production', + SENTRY_DSN: 'https://server-only@errors.example.dev/1', + }); + + expect(options.dsn).toBeUndefined(); + expect(options.enabled).toBe(false); + }); + + test('server falls back to the public DSN when no private one is set', () => { + const options = buildSentryOptions('server', { + NODE_ENV: 'production', + NEXT_PUBLIC_SENTRY_DSN: 'https://public@errors.example.dev/1', + }); + + expect(options.dsn).toBe('https://public@errors.example.dev/1'); + expect(options.enabled).toBe(true); + }); + + test('server prefers the private DSN over the public one', () => { + const options = buildSentryOptions('server', { + NODE_ENV: 'production', + SENTRY_DSN: 'https://private@errors.example.dev/1', + NEXT_PUBLIC_SENTRY_DSN: 'https://public@errors.example.dev/1', + }); + + expect(options.dsn).toBe('https://private@errors.example.dev/1'); + }); + + test('treats a blank DSN as absent', () => { + const options = buildSentryOptions('server', { + NODE_ENV: 'production', + SENTRY_DSN: ' ', + }); + + expect(options.dsn).toBeUndefined(); + expect(options.enabled).toBe(false); + }); + + test('environment defaults to NODE_ENV and can be overridden', () => { + const fromNodeEnv = buildSentryOptions('server', { + NODE_ENV: 'production', + SENTRY_DSN: 'https://key@errors.example.dev/1', + }); + expect(fromNodeEnv.environment).toBe('production'); + + const overridden = buildSentryOptions('server', { + NODE_ENV: 'production', + SENTRY_ENVIRONMENT: 'preview', + SENTRY_DSN: 'https://key@errors.example.dev/1', + }); + expect(overridden.environment).toBe('preview'); + }); + + test('release comes from SOURCE_COMMIT, or SENTRY_RELEASE when set', () => { + const fromCommit = buildSentryOptions('server', { + NODE_ENV: 'production', + SOURCE_COMMIT: 'abc1234', + }); + expect(fromCommit.release).toBe('abc1234'); + + const explicit = buildSentryOptions('server', { + NODE_ENV: 'production', + SOURCE_COMMIT: 'abc1234', + SENTRY_RELEASE: 'clawproxy@1.2.3', + }); + expect(explicit.release).toBe('clawproxy@1.2.3'); + + const blank = buildSentryOptions('server', { + NODE_ENV: 'production', + SOURCE_COMMIT: '', + }); + expect(blank.release).toBeUndefined(); + }); + + test('uses GlitchTip-safe defaults', () => { + const options = buildSentryOptions('client', { + NODE_ENV: 'production', + NEXT_PUBLIC_SENTRY_DSN: 'https://public@errors.example.dev/1', + }); + + // GlitchTip has no session replay and only partial performance support. + expect(options.tracesSampleRate).toBe(0); + expect(options.replaysSessionSampleRate).toBe(0); + expect(options.replaysOnErrorSampleRate).toBe(0); + }); + + test('opts out of every data category the SDK collects by default', () => { + // SDK v11 collects cookies, headers and query params unless told otherwise. + // This app carries Neon Auth session cookies and node auth tokens, so all + // of it must stay out of error reports. + const options = buildSentryOptions('server', { + NODE_ENV: 'production', + SENTRY_DSN: 'https://key@errors.example.dev/1', + }); + + expect(options.dataCollection).toEqual({ + userInfo: false, + cookies: false, + httpHeaders: false, + httpBodies: [], + urlQueryParams: false, + }); + }); +}); diff --git a/yarn.lock b/yarn.lock index d93fd17..0211179 100644 --- a/yarn.lock +++ b/yarn.lock @@ -56,6 +56,17 @@ __metadata: languageName: node linkType: hard +"@babel/code-frame@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/code-frame@npm:7.29.7" + dependencies: + "@babel/helper-validator-identifier": "npm:^7.29.7" + js-tokens: "npm:^4.0.0" + picocolors: "npm:^1.1.1" + checksum: 10c0/169fc2080169a40c1760155eaaaf739bcb882df0bec76a83adbda5493645bc17270a3434b8848c494b1933e96fe1d147370001e3cda09a39f43ae30f08ef2069 + languageName: node + linkType: hard + "@babel/compat-data@npm:^7.28.6": version: 7.29.0 resolution: "@babel/compat-data@npm:7.29.0" @@ -63,6 +74,36 @@ __metadata: languageName: node linkType: hard +"@babel/compat-data@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/compat-data@npm:7.29.7" + checksum: 10c0/47913f05e08a45a1c9df38c02b4b49e391005085b489432647a1abe112e5d9c75e3be8ea5972b7f6da4ec5d1339922ceb9ea02b8a25d4ed1cb8636e5261f344e + languageName: node + linkType: hard + +"@babel/core@npm:^7.18.5": + version: 7.29.7 + resolution: "@babel/core@npm:7.29.7" + dependencies: + "@babel/code-frame": "npm:^7.29.7" + "@babel/generator": "npm:^7.29.7" + "@babel/helper-compilation-targets": "npm:^7.29.7" + "@babel/helper-module-transforms": "npm:^7.29.7" + "@babel/helpers": "npm:^7.29.7" + "@babel/parser": "npm:^7.29.7" + "@babel/template": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + "@jridgewell/remapping": "npm:^2.3.5" + convert-source-map: "npm:^2.0.0" + debug: "npm:^4.1.0" + gensync: "npm:^1.0.0-beta.2" + json5: "npm:^2.2.3" + semver: "npm:^6.3.1" + checksum: 10c0/112fb09c24de7a1de64d1de2c31fe65c4e6af4cb2fb6e6d99ea5373e6fc51e75b88581c0efae4c4c68f119a02a988c7106e95011a41530a2fb8ed793c7eaa07b + languageName: node + linkType: hard + "@babel/core@npm:^7.24.4, @babel/core@npm:^7.28.0": version: 7.29.0 resolution: "@babel/core@npm:7.29.0" @@ -99,6 +140,19 @@ __metadata: languageName: node linkType: hard +"@babel/generator@npm:^7.29.7, @babel/generator@npm:^7.29.8": + version: 7.29.8 + resolution: "@babel/generator@npm:7.29.8" + dependencies: + "@babel/parser": "npm:^7.29.8" + "@babel/types": "npm:^7.29.8" + "@jridgewell/gen-mapping": "npm:^0.3.12" + "@jridgewell/trace-mapping": "npm:^0.3.28" + jsesc: "npm:^3.0.2" + checksum: 10c0/7b896696314a659652393b76d78276e236acd0f7fae40a9a1af7f01c76aeafc630dd0966aad6f9386d35d7c674a8e6e2d8e217c44d25fb11460e68afa9ba8441 + languageName: node + linkType: hard + "@babel/helper-annotate-as-pure@npm:^7.27.3": version: 7.27.3 resolution: "@babel/helper-annotate-as-pure@npm:7.27.3" @@ -121,6 +175,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-compilation-targets@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-compilation-targets@npm:7.29.7" + dependencies: + "@babel/compat-data": "npm:^7.29.7" + "@babel/helper-validator-option": "npm:^7.29.7" + browserslist: "npm:^4.24.0" + lru-cache: "npm:^5.1.1" + semver: "npm:^6.3.1" + checksum: 10c0/4c15fd4c69a0a7047799a28a88460c19cede0a0ee8af994ea169114986f4af48b92c7393a4a3fee0456c11a656eece3448a6ed06354453d6c27cccf17195453b + languageName: node + linkType: hard + "@babel/helper-create-class-features-plugin@npm:^7.28.6": version: 7.28.6 resolution: "@babel/helper-create-class-features-plugin@npm:7.28.6" @@ -145,6 +212,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-globals@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-globals@npm:7.29.7" + checksum: 10c0/f38417c40b1129a1b2b519ca961b9040c8827d1444fd74068702286b91b77089431dc76b6b9d5c1496e5da2a4f3ad329c6946e688ba3fa0d1d0b3d2b4f34f36a + languageName: node + linkType: hard + "@babel/helper-member-expression-to-functions@npm:^7.28.5": version: 7.28.5 resolution: "@babel/helper-member-expression-to-functions@npm:7.28.5" @@ -165,6 +239,16 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-imports@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-module-imports@npm:7.29.7" + dependencies: + "@babel/traverse": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + checksum: 10c0/6adf60d97356027413342a092f818d9678c4f5caff716a33e3284b5ae14e47a9e88059d421dde4ee4894691260039a12602c0e7becadc175602194b40dfa345d + languageName: node + linkType: hard + "@babel/helper-module-transforms@npm:^7.28.6": version: 7.28.6 resolution: "@babel/helper-module-transforms@npm:7.28.6" @@ -178,6 +262,19 @@ __metadata: languageName: node linkType: hard +"@babel/helper-module-transforms@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-module-transforms@npm:7.29.7" + dependencies: + "@babel/helper-module-imports": "npm:^7.29.7" + "@babel/helper-validator-identifier": "npm:^7.29.7" + "@babel/traverse": "npm:^7.29.7" + peerDependencies: + "@babel/core": ^7.0.0 + checksum: 10c0/ee5a2172c24a42be696836f4b0d947489c9729d8adf5821885cf77d1ad5333e3c447368e9a71f67df1099570490553dccf9f888ef0a92a48aa63cb086bd8c7e1 + languageName: node + linkType: hard + "@babel/helper-optimise-call-expression@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-optimise-call-expression@npm:7.27.1" @@ -224,6 +321,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-string-parser@npm:7.29.7" + checksum: 10c0/194bc0f1716e396d5ffde56ad6119745fb9557662c98611590e5e454906783a4ccb21ce93056b8eb69a4909044834e45d96e50ac695bbe9e3221648fe033c06c + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.28.5": version: 7.28.5 resolution: "@babel/helper-validator-identifier@npm:7.28.5" @@ -231,6 +335,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-identifier@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-validator-identifier@npm:7.29.7" + checksum: 10c0/4795354e7ae0dcafa72de1cd04ec51252dc1498517170beaf019e03effc5b7bf13c6b21a3949a77e07b8125be7f106ed1131350d8ebd4566ae874094a726d62b + languageName: node + linkType: hard + "@babel/helper-validator-option@npm:^7.27.1": version: 7.27.1 resolution: "@babel/helper-validator-option@npm:7.27.1" @@ -238,6 +349,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-validator-option@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helper-validator-option@npm:7.29.7" + checksum: 10c0/d2a06c6d0ac40ba4a2f219fc2cab249c7a94bacdb2686273b7f9598571c908809b48468ff588915a346e6cc7296f60b581023d1d498b747fed06f779d335c2cc + languageName: node + linkType: hard + "@babel/helpers@npm:^7.28.6": version: 7.29.2 resolution: "@babel/helpers@npm:7.29.2" @@ -248,6 +366,16 @@ __metadata: languageName: node linkType: hard +"@babel/helpers@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/helpers@npm:7.29.7" + dependencies: + "@babel/template": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + checksum: 10c0/218e8d10953647c9f44775f5a022b227a182674853b5ea8631889deb7e1a3e4bc870388aaecf59bb8bd92a87f9a96220ed3f70a35bffec6bcf9169ecb67891ac + languageName: node + linkType: hard + "@babel/parser@npm:^7.24.4, @babel/parser@npm:^7.28.0, @babel/parser@npm:^7.28.6, @babel/parser@npm:^7.29.0": version: 7.29.2 resolution: "@babel/parser@npm:7.29.2" @@ -259,6 +387,17 @@ __metadata: languageName: node linkType: hard +"@babel/parser@npm:^7.29.7, @babel/parser@npm:^7.29.8": + version: 7.29.9 + resolution: "@babel/parser@npm:7.29.9" + dependencies: + "@babel/types": "npm:^7.29.8" + bin: + parser: ./bin/babel-parser.js + checksum: 10c0/171b16eb4527cdbbb72cb98710f91acb22356e2c40196ba3b7a1b84efa8c55d0b0992f399c8c675c3e17f67fd133676c5c4118e5f20db243f427c8b29b0c3f40 + languageName: node + linkType: hard + "@babel/plugin-syntax-jsx@npm:^7.27.1": version: 7.28.6 resolution: "@babel/plugin-syntax-jsx@npm:7.28.6" @@ -334,6 +473,17 @@ __metadata: languageName: node linkType: hard +"@babel/template@npm:^7.29.7": + version: 7.29.7 + resolution: "@babel/template@npm:7.29.7" + dependencies: + "@babel/code-frame": "npm:^7.29.7" + "@babel/parser": "npm:^7.29.7" + "@babel/types": "npm:^7.29.7" + checksum: 10c0/8bb7f900dcab0e9e1c5ffbc33ca10e0d26b7b2e2ca804becb73ee771b9c4ed6e2908a4ae4a14c08560febb45d2b6b9a173955e42ad404d05f8b04840a14d9c58 + languageName: node + linkType: hard + "@babel/traverse@npm:^7.27.1, @babel/traverse@npm:^7.28.5, @babel/traverse@npm:^7.28.6, @babel/traverse@npm:^7.29.0": version: 7.29.0 resolution: "@babel/traverse@npm:7.29.0" @@ -349,6 +499,21 @@ __metadata: languageName: node linkType: hard +"@babel/traverse@npm:^7.29.7": + version: 7.29.8 + resolution: "@babel/traverse@npm:7.29.8" + dependencies: + "@babel/code-frame": "npm:^7.29.7" + "@babel/generator": "npm:^7.29.8" + "@babel/helper-globals": "npm:^7.29.7" + "@babel/parser": "npm:^7.29.8" + "@babel/template": "npm:^7.29.7" + "@babel/types": "npm:^7.29.8" + debug: "npm:^4.3.1" + checksum: 10c0/87a28989c434add26d787776ac6d30f749b89cb030f2a605c89f671a516a6fa165ac0476f07e2b69feed70128b2734cae1cbbf41dfe95ccf22081bd8f8b91923 + languageName: node + linkType: hard + "@babel/types@npm:^7.27.1, @babel/types@npm:^7.27.3, @babel/types@npm:^7.28.5, @babel/types@npm:^7.28.6, @babel/types@npm:^7.29.0": version: 7.29.0 resolution: "@babel/types@npm:7.29.0" @@ -359,6 +524,16 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.29.7, @babel/types@npm:^7.29.8": + version: 7.29.8 + resolution: "@babel/types@npm:7.29.8" + dependencies: + "@babel/helper-string-parser": "npm:^7.29.7" + "@babel/helper-validator-identifier": "npm:^7.29.7" + checksum: 10c0/be7c279f0abf2a086c633e21b49c7ca80275d05283cc5a268b67a708c9914bd0c944f1422b3eb3cb37682a2af5d560abf520ccf9b01b53ecbfe6b71fbc3fdde6 + languageName: node + linkType: hard + "@bcoe/v8-coverage@npm:^1.0.2": version: 1.0.2 resolution: "@bcoe/v8-coverage@npm:1.0.2" @@ -1610,6 +1785,13 @@ __metadata: languageName: node linkType: hard +"@napi-rs/lzma-linux-x64-gnu@npm:1.5.1": + version: 1.5.1 + resolution: "@napi-rs/lzma-linux-x64-gnu@npm:1.5.1" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + "@napi-rs/wasm-runtime@npm:^0.2.11": version: 0.2.12 resolution: "@napi-rs/wasm-runtime@npm:0.2.12" @@ -1830,6 +2012,13 @@ __metadata: languageName: node linkType: hard +"@opentelemetry/api@npm:^1.9.1": + version: 1.9.1 + resolution: "@opentelemetry/api@npm:1.9.1" + checksum: 10c0/c608485fc8b5a91e1f7e05e843b45b509307456b31cd2ad365933d90813e40ebfedf179f1451c762037e82d7c76aa8500e95d2da3609f640a1206cde5322cd14 + languageName: node + linkType: hard + "@opentelemetry/core@npm:2.2.0": version: 2.2.0 resolution: "@opentelemetry/core@npm:2.2.0" @@ -1965,6 +2154,139 @@ __metadata: languageName: node linkType: hard +"@oxc-parser/binding-android-arm-eabi@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-android-arm-eabi@npm:0.143.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@oxc-parser/binding-android-arm64@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-android-arm64@npm:0.143.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-parser/binding-darwin-arm64@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-darwin-arm64@npm:0.143.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-parser/binding-darwin-x64@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-darwin-x64@npm:0.143.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@oxc-parser/binding-freebsd-x64@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-freebsd-x64@npm:0.143.0" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-arm-gnueabihf@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-linux-arm-gnueabihf@npm:0.143.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-arm-musleabihf@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-linux-arm-musleabihf@npm:0.143.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-arm64-gnu@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-linux-arm64-gnu@npm:0.143.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-arm64-musl@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-linux-arm64-musl@npm:0.143.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-ppc64-gnu@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-linux-ppc64-gnu@npm:0.143.0" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-riscv64-gnu@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-linux-riscv64-gnu@npm:0.143.0" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-riscv64-musl@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-linux-riscv64-musl@npm:0.143.0" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-s390x-gnu@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-linux-s390x-gnu@npm:0.143.0" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-x64-gnu@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-linux-x64-gnu@npm:0.143.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@oxc-parser/binding-linux-x64-musl@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-linux-x64-musl@npm:0.143.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@oxc-parser/binding-openharmony-arm64@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-openharmony-arm64@npm:0.143.0" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-parser/binding-win32-arm64-msvc@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-win32-arm64-msvc@npm:0.143.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@oxc-parser/binding-win32-ia32-msvc@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-win32-ia32-msvc@npm:0.143.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@oxc-parser/binding-win32-x64-msvc@npm:0.143.0": + version: 0.143.0 + resolution: "@oxc-parser/binding-win32-x64-msvc@npm:0.143.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@oxc-project/types@npm:=0.120.0": version: 0.120.0 resolution: "@oxc-project/types@npm:0.120.0" @@ -1972,6 +2294,13 @@ __metadata: languageName: node linkType: hard +"@oxc-project/types@npm:^0.143.0": + version: 0.143.0 + resolution: "@oxc-project/types@npm:0.143.0" + checksum: 10c0/f450bdc6ebd69b09b5d77c1ca45369f9e1a2b69d21f9dfcdaaa2379e8d5228bfdd014e77bef9bc21ca5fd118fb9e2213d30d8eb70299f03b1aac5ee1ab2802ba + languageName: node + linkType: hard + "@polka/url@npm:^1.0.0-next.24": version: 1.0.0-next.29 resolution: "@polka/url@npm:1.0.0-next.29" @@ -3499,6 +3828,217 @@ __metadata: languageName: node linkType: hard +"@rollup/plugin-commonjs@npm:28.0.1": + version: 28.0.1 + resolution: "@rollup/plugin-commonjs@npm:28.0.1" + dependencies: + "@rollup/pluginutils": "npm:^5.0.1" + commondir: "npm:^1.0.1" + estree-walker: "npm:^2.0.2" + fdir: "npm:^6.2.0" + is-reference: "npm:1.2.1" + magic-string: "npm:^0.30.3" + picomatch: "npm:^4.0.2" + peerDependencies: + rollup: ^2.68.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/15d73306f539763a4b0d5723a0be9099b56d07118ff12b4c7f4c04b26e762076706e9f88a45f131d639ed9b7bd52e51facf93f2ca265b994172677b48ca705fe + languageName: node + linkType: hard + +"@rollup/pluginutils@npm:^5.0.1": + version: 5.4.0 + resolution: "@rollup/pluginutils@npm:5.4.0" + dependencies: + "@types/estree": "npm:^1.0.0" + estree-walker: "npm:^2.0.2" + picomatch: "npm:^4.0.2" + peerDependencies: + rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 + peerDependenciesMeta: + rollup: + optional: true + checksum: 10c0/ccc2cbd3a05df642df60ab05ffb81b2e564bd945e2a118bb8a474ea75b941033c8f44273133d4865643cca1492d0c80b14de1281f74779a64285a80fc3a194d8 + languageName: node + linkType: hard + +"@rollup/rollup-android-arm-eabi@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.63.4" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-android-arm64@npm:4.63.4" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-darwin-arm64@npm:4.63.4" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-darwin-x64@npm:4.63.4" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-arm64@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-freebsd-arm64@npm:4.63.4" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-freebsd-x64@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-freebsd-x64@npm:4.63.4" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.63.4" + conditions: os=linux & cpu=arm & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-musleabihf@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-linux-arm-musleabihf@npm:4.63.4" + conditions: os=linux & cpu=arm & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.63.4" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.63.4" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-loong64-gnu@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-linux-loong64-gnu@npm:4.63.4" + conditions: os=linux & cpu=loong64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-loong64-musl@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-linux-loong64-musl@npm:4.63.4" + conditions: os=linux & cpu=loong64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-ppc64-gnu@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-linux-ppc64-gnu@npm:4.63.4" + conditions: os=linux & cpu=ppc64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-ppc64-musl@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-linux-ppc64-musl@npm:4.63.4" + conditions: os=linux & cpu=ppc64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-gnu@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-linux-riscv64-gnu@npm:4.63.4" + conditions: os=linux & cpu=riscv64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-riscv64-musl@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-linux-riscv64-musl@npm:4.63.4" + conditions: os=linux & cpu=riscv64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-s390x-gnu@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-linux-s390x-gnu@npm:4.63.4" + conditions: os=linux & cpu=s390x & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.63.4" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.63.4" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-openbsd-x64@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-openbsd-x64@npm:4.63.4" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-openharmony-arm64@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-openharmony-arm64@npm:4.63.4" + conditions: os=openharmony & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.63.4" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.63.4" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-gnu@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-win32-x64-gnu@npm:4.63.4" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.63.4": + version: 4.63.4 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.63.4" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@rtsao/scc@npm:^1.1.0": version: 1.1.0 resolution: "@rtsao/scc@npm:1.1.0" @@ -3513,6 +4053,200 @@ __metadata: languageName: node linkType: hard +"@sentry/browser-utils@npm:11.0.0": + version: 11.0.0 + resolution: "@sentry/browser-utils@npm:11.0.0" + dependencies: + "@sentry/conventions": "npm:^0.23.0" + "@sentry/core": "npm:11.0.0" + web-vitals: "npm:^6.1.1" + checksum: 10c0/dc926eb528ba2fcf64e5ab29b307810e15ae0dffff26558b59d1ec0e96f8e46ef9e834482e35fcdd25fc684e67143e16e668a5e571122217fc0ac34b32a8d92f + languageName: node + linkType: hard + +"@sentry/browser@npm:11.0.0": + version: 11.0.0 + resolution: "@sentry/browser@npm:11.0.0" + dependencies: + "@sentry/browser-utils": "npm:11.0.0" + "@sentry/conventions": "npm:^0.23.0" + "@sentry/core": "npm:11.0.0" + "@sentry/feedback": "npm:11.0.0" + "@sentry/replay": "npm:11.0.0" + "@sentry/replay-canvas": "npm:11.0.0" + checksum: 10c0/91162f27e3392e9053a910b0da0beeca30086bc18cc3c6b59a7e00f1442d48351a65ef25c13fdd4a12b7ea08b788ddb2e4b948d5c8710394925c83defefdd6f8 + languageName: node + linkType: hard + +"@sentry/bundler-plugins@npm:11.0.0": + version: 11.0.0 + resolution: "@sentry/bundler-plugins@npm:11.0.0" + dependencies: + "@babel/core": "npm:^7.18.5" + "@sentry/core": "npm:11.0.0" + dotenv: "npm:^17.4.2" + glob: "npm:^13.0.6" + magic-string: "npm:~0.30.8" + oxc-parser: "npm:^0.143.0" + sentry: "npm:^0.44.0" + supports-color: "npm:^8.1.1" + peerDependencies: + rollup: ">=3.2.0" + webpack: ">=5.1.0" + peerDependenciesMeta: + rollup: + optional: true + webpack: + optional: true + checksum: 10c0/ac35073650fda040279220ca867ceef49a2ec1be40873525e67b6bb885d9c69d8c9525bfb1cab86d6f97dd288516f581c0a99dea9ff6131a931e11c45527794f + languageName: node + linkType: hard + +"@sentry/conventions@npm:^0.23.0": + version: 0.23.0 + resolution: "@sentry/conventions@npm:0.23.0" + checksum: 10c0/d15b6eae5aaada35226a9c55279b97bc363c588ef0faf34506152d46aca12e48590ee45a4338de7fefce46bb46424285bc0ce16fa57151175d0d41f54b282a0c + languageName: node + linkType: hard + +"@sentry/core@npm:11.0.0": + version: 11.0.0 + resolution: "@sentry/core@npm:11.0.0" + dependencies: + "@sentry/conventions": "npm:^0.23.0" + checksum: 10c0/8e9a2b182f978fc3eaca1d7d6d5331385dd00c88affb9c6b58713985a1cb718b65c2b5bb2389ad1534197d62a729bdae1335eac2cb14cc8df97c6dcfa88da5f3 + languageName: node + linkType: hard + +"@sentry/feedback@npm:11.0.0": + version: 11.0.0 + resolution: "@sentry/feedback@npm:11.0.0" + dependencies: + "@sentry/core": "npm:11.0.0" + checksum: 10c0/70ca645f56c8d1e80c34f47389198ed1ea82ceb5407ed70540718e228576bab22d6808cb5c965211d6e4f607621a058d8c895d9d0ac0cabe5fb15eb185bca3ca + languageName: node + linkType: hard + +"@sentry/nextjs@npm:^11.0.0": + version: 11.0.0 + resolution: "@sentry/nextjs@npm:11.0.0" + dependencies: + "@opentelemetry/api": "npm:^1.9.1" + "@rollup/plugin-commonjs": "npm:28.0.1" + "@sentry/browser-utils": "npm:11.0.0" + "@sentry/bundler-plugins": "npm:11.0.0" + "@sentry/conventions": "npm:^0.23.0" + "@sentry/core": "npm:11.0.0" + "@sentry/node": "npm:11.0.0" + "@sentry/opentelemetry": "npm:11.0.0" + "@sentry/react": "npm:11.0.0" + "@sentry/server-runtime-injection": "npm:11.0.0" + "@sentry/server-utils": "npm:11.0.0" + "@sentry/vercel-edge": "npm:11.0.0" + rollup: "npm:^4.60.3" + stacktrace-parser: "npm:^0.1.11" + peerDependencies: + next: ^14.0 || ^15.0.0-rc.0 || ^16.0.0-0 + checksum: 10c0/3c7d3bf83c5e3079db95c5b7e7a14b1b8ba6ba5b6db47717ad9db1a72e6ec2be9282dea47472c5a9706422bfb9e7392e74169fed7ab756b5f4fa1112bc78c8c0 + languageName: node + linkType: hard + +"@sentry/node@npm:11.0.0": + version: 11.0.0 + resolution: "@sentry/node@npm:11.0.0" + dependencies: + "@opentelemetry/api": "npm:^1.9.1" + "@sentry/bundler-plugins": "npm:11.0.0" + "@sentry/conventions": "npm:^0.23.0" + "@sentry/core": "npm:11.0.0" + "@sentry/opentelemetry": "npm:11.0.0" + "@sentry/server-runtime-injection": "npm:11.0.0" + "@sentry/server-utils": "npm:11.0.0" + checksum: 10c0/c7c8cef94921963d2acdacdf50a62fe5fbe4162a36cb6d168d8a263abe3006b46c685b82f392434a08706b969e07515a9a1af180c4af9473e5b609e9c73548a0 + languageName: node + linkType: hard + +"@sentry/opentelemetry@npm:11.0.0": + version: 11.0.0 + resolution: "@sentry/opentelemetry@npm:11.0.0" + dependencies: + "@sentry/conventions": "npm:^0.23.0" + "@sentry/core": "npm:11.0.0" + peerDependencies: + "@opentelemetry/api": ^1.9.0 + checksum: 10c0/0af9c727f59bb8785454506cb671c8985a9f0a50915d8cd1d2043451df2d317fe4fe4e2565ba148346672196585ea7194ff54f5b8b13eef82bc305be4d111749 + languageName: node + linkType: hard + +"@sentry/react@npm:11.0.0": + version: 11.0.0 + resolution: "@sentry/react@npm:11.0.0" + dependencies: + "@sentry/browser": "npm:11.0.0" + "@sentry/conventions": "npm:^0.23.0" + "@sentry/core": "npm:11.0.0" + peerDependencies: + react: 17.x || 18.x || 19.x + react-router: 6.x || 7.x || 8.x + peerDependenciesMeta: + react-router: + optional: true + checksum: 10c0/51d436f2ec644c05ad23cdcdb85a567860adc93bcd36fd3f7503b1425dcebe6c16b00765560277a6814ddc4f095c62fc04dc911a81e83021d1601fbec0ff35a3 + languageName: node + linkType: hard + +"@sentry/replay-canvas@npm:11.0.0": + version: 11.0.0 + resolution: "@sentry/replay-canvas@npm:11.0.0" + dependencies: + "@sentry/core": "npm:11.0.0" + "@sentry/replay": "npm:11.0.0" + checksum: 10c0/5257c5733569b59fa0e5f8998bbec4f035816b09c2ee260f53e09fce6686d813e4ba96f176ad8ecb04ada20f6ebc0992400a4aa498784acdad6685e797fde7df + languageName: node + linkType: hard + +"@sentry/replay@npm:11.0.0": + version: 11.0.0 + resolution: "@sentry/replay@npm:11.0.0" + dependencies: + "@sentry/browser-utils": "npm:11.0.0" + "@sentry/core": "npm:11.0.0" + checksum: 10c0/75e1de1a24fd25c8704b0d22dfb892cd7bb6d6a13577f63a6467241bab46aefa00e6b2e470548f43a910c050d031c4a3414f015f15492d0003bceac8f070c889 + languageName: node + linkType: hard + +"@sentry/server-runtime-injection@npm:11.0.0": + version: 11.0.0 + resolution: "@sentry/server-runtime-injection@npm:11.0.0" + dependencies: + "@sentry/core": "npm:11.0.0" + "@sentry/server-utils": "npm:11.0.0" + checksum: 10c0/1620c420a2636b26c90bd9c558f240a2df4a6568f66d297b5c38a11f8f745af4e7808ec6c81d0f7251cb7679e4d469cfbeb6228cd05c2e3d791b9efd7c78ae61 + languageName: node + linkType: hard + +"@sentry/server-utils@npm:11.0.0": + version: 11.0.0 + resolution: "@sentry/server-utils@npm:11.0.0" + dependencies: + "@opentelemetry/api": "npm:^1.9.1" + "@sentry/conventions": "npm:^0.23.0" + "@sentry/core": "npm:11.0.0" + checksum: 10c0/9fce34e644bf71787712c040237e9ce478377c95dad29bfd84f28a944bd1c5a4c0c49d35625a342d97570eab0c97b7fae58817ac86bd5b7985df5b94c2732e64 + languageName: node + linkType: hard + +"@sentry/vercel-edge@npm:11.0.0": + version: 11.0.0 + resolution: "@sentry/vercel-edge@npm:11.0.0" + dependencies: + "@opentelemetry/api": "npm:^1.9.1" + "@sentry/core": "npm:11.0.0" + "@sentry/server-utils": "npm:11.0.0" + checksum: 10c0/150640972eb117b6463e771a4ecc0a6f523c0ee7f2eacb36e837de4aab36cae298c6a694e9d51eac7ee799cd8e8f4b799130b4b50a6a997b39d7a28598daaaf7 + languageName: node + linkType: hard + "@sindresorhus/merge-streams@npm:^4.0.0": version: 4.0.0 resolution: "@sindresorhus/merge-streams@npm:4.0.0" @@ -3813,6 +4547,13 @@ __metadata: languageName: node linkType: hard +"@types/estree@npm:*, @types/estree@npm:1.0.9": + version: 1.0.9 + resolution: "@types/estree@npm:1.0.9" + checksum: 10c0/3ad3286ca2988cd550dafb8f2ad599c8474868e954fa601a36655bdfefd8039f7c714b8c1c7f2ae219ffbd58bd4660e66fa7479a0120fc02d4777057d4865387 + languageName: node + linkType: hard + "@types/estree@npm:^1.0.0, @types/estree@npm:^1.0.6": version: 1.0.8 resolution: "@types/estree@npm:1.0.8" @@ -4820,6 +5561,7 @@ __metadata: version: 0.0.0-use.local resolution: "clawproxy@workspace:." dependencies: + "@sentry/nextjs": "npm:^11.0.0" "@tailwindcss/postcss": "npm:^4" "@types/node": "npm:^20" "@types/react": "npm:^19" @@ -4941,6 +5683,13 @@ __metadata: languageName: node linkType: hard +"commondir@npm:^1.0.1": + version: 1.0.1 + resolution: "commondir@npm:1.0.1" + checksum: 10c0/33a124960e471c25ee19280c9ce31ccc19574b566dc514fe4f4ca4c34fa8b0b57cf437671f5de380e11353ea9426213fca17687dd2ef03134fea2dbc53809fd6 + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -5374,6 +6123,13 @@ __metadata: languageName: node linkType: hard +"dotenv@npm:^17.4.2": + version: 17.4.2 + resolution: "dotenv@npm:17.4.2" + checksum: 10c0/164f8e77a646c8446867d5b588d26ea6005c8ea7c5eb41cf926f6113d23f2191355f6e0cfd95ea9bab98394a5b0a3f1e51a8399711b666fe55cc7b0bd745f942 + languageName: node + linkType: hard + "drizzle-kit@npm:^0.31.10": version: 0.31.10 resolution: "drizzle-kit@npm:0.31.10" @@ -6311,6 +7067,13 @@ __metadata: languageName: node linkType: hard +"estree-walker@npm:^2.0.2": + version: 2.0.2 + resolution: "estree-walker@npm:2.0.2" + checksum: 10c0/53a6c54e2019b8c914dc395890153ffdc2322781acf4bd7d1a32d7aedc1710807bdcd866ac133903d5629ec601fbb50abe8c2e5553c7f5a0afdd9b6af6c945af + languageName: node + linkType: hard + "estree-walker@npm:^3.0.3": version: 3.0.3 resolution: "estree-walker@npm:3.0.3" @@ -6674,7 +7437,7 @@ __metadata: languageName: node linkType: hard -"fsevents@npm:~2.3.3": +"fsevents@npm:~2.3.2, fsevents@npm:~2.3.3": version: 2.3.3 resolution: "fsevents@npm:2.3.3" dependencies: @@ -6684,7 +7447,7 @@ __metadata: languageName: node linkType: hard -"fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": +"fsevents@patch:fsevents@npm%3A~2.3.2#optional!builtin, fsevents@patch:fsevents@npm%3A~2.3.3#optional!builtin": version: 2.3.3 resolution: "fsevents@patch:fsevents@npm%3A2.3.3#optional!builtin::version=2.3.3&hash=df0bf1" dependencies: @@ -6853,7 +7616,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^13.0.0": +"glob@npm:^13.0.0, glob@npm:^13.0.6": version: 13.0.6 resolution: "glob@npm:13.0.6" dependencies: @@ -7400,6 +8163,15 @@ __metadata: languageName: node linkType: hard +"is-reference@npm:1.2.1": + version: 1.2.1 + resolution: "is-reference@npm:1.2.1" + dependencies: + "@types/estree": "npm:*" + checksum: 10c0/7dc819fc8de7790264a0a5d531164f9f5b9ef5aa1cd05f35322d14db39c8a2ec78fd5d4bf57f9789f3ddd2b3abeea7728432b759636157a42db12a9e8c3b549b + languageName: node + linkType: hard + "is-regex@npm:^1.2.1": version: 1.2.1 resolution: "is-regex@npm:1.2.1" @@ -8014,7 +8786,7 @@ __metadata: languageName: node linkType: hard -"magic-string@npm:^0.30.21": +"magic-string@npm:^0.30.21, magic-string@npm:^0.30.3, magic-string@npm:~0.30.8": version: 0.30.21 resolution: "magic-string@npm:0.30.21" dependencies: @@ -8674,6 +9446,73 @@ __metadata: languageName: node linkType: hard +"oxc-parser@npm:^0.143.0": + version: 0.143.0 + resolution: "oxc-parser@npm:0.143.0" + dependencies: + "@oxc-parser/binding-android-arm-eabi": "npm:0.143.0" + "@oxc-parser/binding-android-arm64": "npm:0.143.0" + "@oxc-parser/binding-darwin-arm64": "npm:0.143.0" + "@oxc-parser/binding-darwin-x64": "npm:0.143.0" + "@oxc-parser/binding-freebsd-x64": "npm:0.143.0" + "@oxc-parser/binding-linux-arm-gnueabihf": "npm:0.143.0" + "@oxc-parser/binding-linux-arm-musleabihf": "npm:0.143.0" + "@oxc-parser/binding-linux-arm64-gnu": "npm:0.143.0" + "@oxc-parser/binding-linux-arm64-musl": "npm:0.143.0" + "@oxc-parser/binding-linux-ppc64-gnu": "npm:0.143.0" + "@oxc-parser/binding-linux-riscv64-gnu": "npm:0.143.0" + "@oxc-parser/binding-linux-riscv64-musl": "npm:0.143.0" + "@oxc-parser/binding-linux-s390x-gnu": "npm:0.143.0" + "@oxc-parser/binding-linux-x64-gnu": "npm:0.143.0" + "@oxc-parser/binding-linux-x64-musl": "npm:0.143.0" + "@oxc-parser/binding-openharmony-arm64": "npm:0.143.0" + "@oxc-parser/binding-win32-arm64-msvc": "npm:0.143.0" + "@oxc-parser/binding-win32-ia32-msvc": "npm:0.143.0" + "@oxc-parser/binding-win32-x64-msvc": "npm:0.143.0" + "@oxc-project/types": "npm:^0.143.0" + dependenciesMeta: + "@oxc-parser/binding-android-arm-eabi": + optional: true + "@oxc-parser/binding-android-arm64": + optional: true + "@oxc-parser/binding-darwin-arm64": + optional: true + "@oxc-parser/binding-darwin-x64": + optional: true + "@oxc-parser/binding-freebsd-x64": + optional: true + "@oxc-parser/binding-linux-arm-gnueabihf": + optional: true + "@oxc-parser/binding-linux-arm-musleabihf": + optional: true + "@oxc-parser/binding-linux-arm64-gnu": + optional: true + "@oxc-parser/binding-linux-arm64-musl": + optional: true + "@oxc-parser/binding-linux-ppc64-gnu": + optional: true + "@oxc-parser/binding-linux-riscv64-gnu": + optional: true + "@oxc-parser/binding-linux-riscv64-musl": + optional: true + "@oxc-parser/binding-linux-s390x-gnu": + optional: true + "@oxc-parser/binding-linux-x64-gnu": + optional: true + "@oxc-parser/binding-linux-x64-musl": + optional: true + "@oxc-parser/binding-openharmony-arm64": + optional: true + "@oxc-parser/binding-win32-arm64-msvc": + optional: true + "@oxc-parser/binding-win32-ia32-msvc": + optional: true + "@oxc-parser/binding-win32-x64-msvc": + optional: true + checksum: 10c0/95af8d9595df5e27d9f1ed59f6e02aa66883c4d1cc2add56b0b474daa43099e9742316786bfc396fd4a88f496d034f06ea59de6b9740208461c8a99dae28fa1f + languageName: node + linkType: hard + "p-limit@npm:^3.0.2": version: 3.1.0 resolution: "p-limit@npm:3.1.0" @@ -9480,6 +10319,99 @@ __metadata: languageName: node linkType: hard +"rollup@npm:^4.60.3": + version: 4.63.4 + resolution: "rollup@npm:4.63.4" + dependencies: + "@napi-rs/lzma-linux-x64-gnu": "npm:1.5.1" + "@rollup/rollup-android-arm-eabi": "npm:4.63.4" + "@rollup/rollup-android-arm64": "npm:4.63.4" + "@rollup/rollup-darwin-arm64": "npm:4.63.4" + "@rollup/rollup-darwin-x64": "npm:4.63.4" + "@rollup/rollup-freebsd-arm64": "npm:4.63.4" + "@rollup/rollup-freebsd-x64": "npm:4.63.4" + "@rollup/rollup-linux-arm-gnueabihf": "npm:4.63.4" + "@rollup/rollup-linux-arm-musleabihf": "npm:4.63.4" + "@rollup/rollup-linux-arm64-gnu": "npm:4.63.4" + "@rollup/rollup-linux-arm64-musl": "npm:4.63.4" + "@rollup/rollup-linux-loong64-gnu": "npm:4.63.4" + "@rollup/rollup-linux-loong64-musl": "npm:4.63.4" + "@rollup/rollup-linux-ppc64-gnu": "npm:4.63.4" + "@rollup/rollup-linux-ppc64-musl": "npm:4.63.4" + "@rollup/rollup-linux-riscv64-gnu": "npm:4.63.4" + "@rollup/rollup-linux-riscv64-musl": "npm:4.63.4" + "@rollup/rollup-linux-s390x-gnu": "npm:4.63.4" + "@rollup/rollup-linux-x64-gnu": "npm:4.63.4" + "@rollup/rollup-linux-x64-musl": "npm:4.63.4" + "@rollup/rollup-openbsd-x64": "npm:4.63.4" + "@rollup/rollup-openharmony-arm64": "npm:4.63.4" + "@rollup/rollup-win32-arm64-msvc": "npm:4.63.4" + "@rollup/rollup-win32-ia32-msvc": "npm:4.63.4" + "@rollup/rollup-win32-x64-gnu": "npm:4.63.4" + "@rollup/rollup-win32-x64-msvc": "npm:4.63.4" + "@types/estree": "npm:1.0.9" + fsevents: "npm:~2.3.2" + dependenciesMeta: + "@napi-rs/lzma-linux-x64-gnu": + optional: true + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-freebsd-arm64": + optional: true + "@rollup/rollup-freebsd-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm-musleabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-loong64-gnu": + optional: true + "@rollup/rollup-linux-loong64-musl": + optional: true + "@rollup/rollup-linux-ppc64-gnu": + optional: true + "@rollup/rollup-linux-ppc64-musl": + optional: true + "@rollup/rollup-linux-riscv64-gnu": + optional: true + "@rollup/rollup-linux-riscv64-musl": + optional: true + "@rollup/rollup-linux-s390x-gnu": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-openbsd-x64": + optional: true + "@rollup/rollup-openharmony-arm64": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-gnu": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true + fsevents: + optional: true + bin: + rollup: dist/bin/rollup + checksum: 10c0/fb0aa9242126b8d01196a394edc98423d36e802d13741f9ec6f58559cda783b5e6d46a160f5cf8be6492c13df46786253c0a45267f0dac0294f6ca7d926ea916 + languageName: node + linkType: hard + "router@npm:^2.2.0": version: 2.2.0 resolution: "router@npm:2.2.0" @@ -9603,6 +10535,15 @@ __metadata: languageName: node linkType: hard +"sentry@npm:^0.44.0": + version: 0.44.1 + resolution: "sentry@npm:0.44.1" + bin: + sentry: dist/bin.cjs + checksum: 10c0/9fcbaf3761c0229460a48747f2ca744e1451462e59773e9fef21aa7bc394a3b8336fb490b5ff0873084bbd0c93019eb4c86a8c00412781359c370d4cb341e9a6 + languageName: node + linkType: hard + "serve-static@npm:^2.2.0": version: 2.2.1 resolution: "serve-static@npm:2.2.1" @@ -9972,6 +10913,15 @@ __metadata: languageName: node linkType: hard +"stacktrace-parser@npm:^0.1.11": + version: 0.1.11 + resolution: "stacktrace-parser@npm:0.1.11" + dependencies: + type-fest: "npm:^0.7.1" + checksum: 10c0/4633d9afe8cd2f6c7fb2cebdee3cc8de7fd5f6f9736645fd08c0f66872a303061ce9cc0ccf46f4216dc94a7941b56e331012398dc0024dc25e46b5eb5d4ff018 + languageName: node + linkType: hard + "statuses@npm:^2.0.1, statuses@npm:^2.0.2, statuses@npm:~2.0.2": version: 2.0.2 resolution: "statuses@npm:2.0.2" @@ -10194,6 +11144,15 @@ __metadata: languageName: node linkType: hard +"supports-color@npm:^8.1.1": + version: 8.1.1 + resolution: "supports-color@npm:8.1.1" + dependencies: + has-flag: "npm:^4.0.0" + checksum: 10c0/ea1d3c275dd604c974670f63943ed9bd83623edc102430c05adb8efc56ba492746b6e95386e7831b872ec3807fd89dd8eb43f735195f37b5ec343e4234cc7e89 + languageName: node + linkType: hard + "supports-preserve-symlinks-flag@npm:^1.0.0": version: 1.0.0 resolution: "supports-preserve-symlinks-flag@npm:1.0.0" @@ -10427,6 +11386,13 @@ __metadata: languageName: node linkType: hard +"type-fest@npm:^0.7.1": + version: 0.7.1 + resolution: "type-fest@npm:0.7.1" + checksum: 10c0/ce6b5ef806a76bf08d0daa78d65e61f24d9a0380bd1f1df36ffb61f84d14a0985c3a921923cf4b97831278cb6fa9bf1b89c751df09407e0510b14e8c081e4e0f + languageName: node + linkType: hard + "type-fest@npm:^5.2.0": version: 5.5.0 resolution: "type-fest@npm:5.5.0" @@ -10911,6 +11877,13 @@ __metadata: languageName: node linkType: hard +"web-vitals@npm:^6.1.1": + version: 6.2.2 + resolution: "web-vitals@npm:6.2.2" + checksum: 10c0/dda70c450470680decfe6cb4e04550b28843e697b1ed7634e51fb1e14b2c4056daffa66b593ab3f8134a8f214c885a4913353b34836273f72d73036a561a12dc + languageName: node + linkType: hard + "webidl-conversions@npm:^8.0.1": version: 8.0.1 resolution: "webidl-conversions@npm:8.0.1"