From 36b7a738d1ae9df3ff626b6528c4b14964a0b8d2 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 9 Jun 2026 02:28:58 +0000 Subject: [PATCH 1/2] feat: add telemetry foundation for APM integration Add shared createLogger utility and client-side telemetry sinks so debug console.log can be replaced with environment-aware logging. Sentry hooks are stubbed for web (window.Sentry) and API (SENTRY_DSN) until DSN is configured. Document observability env vars in .env.example. --- .env.example | 10 +- apps/api/src/middleware/monitoring.ts | 8 +- apps/api/src/types/env.ts | 2 + apps/api/src/utils/telemetry.ts | 31 +++++++ apps/web/package.json | 1 + .../src/lib/telemetry/createClientLogger.ts | 50 ++++++++++ apps/web/src/lib/telemetry/index.ts | 1 + .../src/lib/telemetry/sinks/consoleSink.ts | 26 ++++++ .../web/src/lib/telemetry/sinks/sentrySink.ts | 91 +++++++++++++++++++ package-lock.json | 1 + packages/utils/src/index.ts | 2 + packages/utils/src/telemetry/createLogger.ts | 66 ++++++++++++++ packages/utils/src/telemetry/index.ts | 8 ++ packages/utils/src/telemetry/types.ts | 41 +++++++++ 14 files changed, 333 insertions(+), 5 deletions(-) create mode 100644 apps/api/src/utils/telemetry.ts create mode 100644 apps/web/src/lib/telemetry/createClientLogger.ts create mode 100644 apps/web/src/lib/telemetry/index.ts create mode 100644 apps/web/src/lib/telemetry/sinks/consoleSink.ts create mode 100644 apps/web/src/lib/telemetry/sinks/sentrySink.ts create mode 100644 packages/utils/src/telemetry/createLogger.ts create mode 100644 packages/utils/src/telemetry/index.ts create mode 100644 packages/utils/src/telemetry/types.ts diff --git a/.env.example b/.env.example index 96b00e8c..cd2a7793 100644 --- a/.env.example +++ b/.env.example @@ -31,4 +31,12 @@ LOG_LEVEL=debug # PWA設定 # アプリケーション名(マニフェストとメタデータに使用) -NEXT_PUBLIC_APP_NAME=Sonory \ No newline at end of file +NEXT_PUBLIC_APP_NAME=Sonory + +# オブザーバビリティ(APM) +# ブラウザ + Next.js: https://sentry.io でプロジェクト作成後に設定 +NEXT_PUBLIC_SENTRY_DSN= +# Cloudflare Workers API: wrangler secret put SENTRY_DSN --env production +SENTRY_DSN= +# 本番以外で Sentry へ送る場合は true(通常は未設定で development はローカルのみ) +# NEXT_PUBLIC_SENTRY_ENABLED=false \ No newline at end of file diff --git a/apps/api/src/middleware/monitoring.ts b/apps/api/src/middleware/monitoring.ts index 96c6db62..7b1ec1bf 100644 --- a/apps/api/src/middleware/monitoring.ts +++ b/apps/api/src/middleware/monitoring.ts @@ -1,6 +1,7 @@ import type { Context, Next } from "hono" import type { Env } from "../index" import { logger } from "../utils/logger" +import { captureException } from "../utils/telemetry" /** * モニタリング・ログ基盤ミドルウェア @@ -38,10 +39,9 @@ export async function errorTracking( logger.error("Unhandled error occurred", errorDetails) - // TODO Phase 2以降: Sentryに送信 - // if (c.env.SENTRY_DSN) { - // await sendToSentry(errorDetails) - // } + if (c.env.SENTRY_DSN) { + await captureException(error, errorDetails) + } // エラーを再スロー(エラーハンドラーミドルウェアで処理) throw error diff --git a/apps/api/src/types/env.ts b/apps/api/src/types/env.ts index 5311982a..cc48121a 100644 --- a/apps/api/src/types/env.ts +++ b/apps/api/src/types/env.ts @@ -9,4 +9,6 @@ export interface Env { SUPABASE_SERVICE_KEY?: string PYTHON_AUDIO_ANALYZER_URL: string PYTHON_AUDIO_ANALYZER_TIMEOUT: string + /** Sentry DSN(`wrangler secret put SENTRY_DSN` で設定) */ + SENTRY_DSN?: string } diff --git a/apps/api/src/utils/telemetry.ts b/apps/api/src/utils/telemetry.ts new file mode 100644 index 00000000..02dd7c31 --- /dev/null +++ b/apps/api/src/utils/telemetry.ts @@ -0,0 +1,31 @@ +import type { LogContext } from "@sonory/utils" + +/** + * Workers 向けのエラー転送先。 + * + * @description + * Phase 2: `@sentry/cloudflare` 導入後に実装を差し替える。 + */ +export async function captureException( + error: unknown, + context?: LogContext, +): Promise { + // Sentry DSN 設定後: + // import * as Sentry from "@sentry/cloudflare" + // Sentry.captureException(error, { extra: context }) + void error + void context +} + +/** + * 構造化メトリクスを Workers Analytics Engine へ送るためのプレースホルダー。 + */ +export function recordMetric( + name: string, + value: number, + tags?: LogContext, +): void { + void name + void value + void tags +} diff --git a/apps/web/package.json b/apps/web/package.json index a0928d4c..8192ae58 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -29,6 +29,7 @@ "@mapbox/mapbox-gl-geocoder": "^5.1.2", "@opennextjs/cloudflare": "^1.19.11", "@sonory/shared-types": "*", + "@sonory/utils": "*", "@supabase/supabase-js": "^2.108.0", "@tanstack/react-query": "^5.101.0", "framer-motion": "^12.40.0", diff --git a/apps/web/src/lib/telemetry/createClientLogger.ts b/apps/web/src/lib/telemetry/createClientLogger.ts new file mode 100644 index 00000000..59fcb936 --- /dev/null +++ b/apps/web/src/lib/telemetry/createClientLogger.ts @@ -0,0 +1,50 @@ +import { createLogger, type Logger } from "@sonory/utils" + +import { createConsoleSink } from "./sinks/consoleSink" +import { createSentrySink } from "./sinks/sentrySink" + +const isDevelopment = process.env.NODE_ENV === "development" + +/** + * ブラウザ向けロガーを生成する。 + * + * @description + * - `debug` / `info`: 開発環境のみコンソール出力 + * - `warn` / `error`: 本番では Sentry へ転送(DSN 設定時) + * - 位置情報・音声 URL など PII は context に載せないこと + * + * @param namespace - ログの発生元(例: `"SoundPinMarkers"`) + * @returns 名前空間付きロガー + * + * @example + * ```ts + * const log = createClientLogger("recording") + * log.debug("Recorder started") + * log.error("Upload failed", { code: "NETWORK_ERROR" }) + * ``` + */ +export function createClientLogger(namespace: string): Logger { + const consoleSink = createConsoleSink() + const sentrySink = createSentrySink(namespace) + + return createLogger({ + namespace, + minLevel: isDevelopment ? "debug" : "warn", + sinks: { + debug: isDevelopment ? consoleSink.debug : undefined, + info: isDevelopment ? consoleSink.info : sentrySink.info, + warn: (message, context) => { + if (isDevelopment) { + consoleSink.warn(message, context) + } + sentrySink.warn(message, context) + }, + error: (message, context) => { + if (isDevelopment) { + consoleSink.error(message, context) + } + sentrySink.error(message, context) + }, + }, + }) +} diff --git a/apps/web/src/lib/telemetry/index.ts b/apps/web/src/lib/telemetry/index.ts new file mode 100644 index 00000000..8825e588 --- /dev/null +++ b/apps/web/src/lib/telemetry/index.ts @@ -0,0 +1 @@ +export { createClientLogger } from "./createClientLogger" diff --git a/apps/web/src/lib/telemetry/sinks/consoleSink.ts b/apps/web/src/lib/telemetry/sinks/consoleSink.ts new file mode 100644 index 00000000..8617ec5f --- /dev/null +++ b/apps/web/src/lib/telemetry/sinks/consoleSink.ts @@ -0,0 +1,26 @@ +import type { LogContext, LogLevel } from "@sonory/utils" + +/** + * 開発環境向けのコンソール出力シンク。 + */ +export function createConsoleSink(): Readonly< + Record void> +> { + const format = (message: string, context?: LogContext): string => + context === undefined ? message : `${message} ${JSON.stringify(context)}` + + return { + debug: (message, context) => { + console.debug(format(message, context)) + }, + info: (message, context) => { + console.info(format(message, context)) + }, + warn: (message, context) => { + console.warn(format(message, context)) + }, + error: (message, context) => { + console.error(format(message, context)) + }, + } +} diff --git a/apps/web/src/lib/telemetry/sinks/sentrySink.ts b/apps/web/src/lib/telemetry/sinks/sentrySink.ts new file mode 100644 index 00000000..8898928b --- /dev/null +++ b/apps/web/src/lib/telemetry/sinks/sentrySink.ts @@ -0,0 +1,91 @@ +import type { LogContext } from "@sonory/utils" + +/** + * Sentry SDK が提供する最小インターフェース。 + * + * @description + * `@sentry/nextjs` 導入後に `window.Sentry` へバインドされる想定。 + */ +interface SentryClient { + addBreadcrumb(breadcrumb: { + category: string + message: string + level?: "debug" | "info" | "warning" | "error" + data?: Record + }): void + captureException( + error: unknown, + context?: { extra?: Record }, + ): void + captureMessage( + message: string, + context?: { + level?: "warning" | "error" + extra?: Record + }, + ): void +} + +declare global { + interface Window { + Sentry?: SentryClient + } +} + +function getSentryClient(): SentryClient | undefined { + if (typeof window === "undefined") { + return undefined + } + + return window.Sentry +} + +/** + * Sentry 向けのブレッドクラム・エラー転送シンク。 + * + * @description + * DSN 未設定時は no-op。APM 導入後も呼び出し側の変更は不要。 + */ +export function createSentrySink(namespace: string): { + info(message: string, context?: LogContext): void + warn(message: string, context?: LogContext): void + error(message: string, context?: LogContext): void +} { + const toBreadcrumb = ( + level: "info" | "warning" | "error", + message: string, + context?: LogContext, + ): void => { + const sentry = getSentryClient() + if (!sentry) { + return + } + + sentry.addBreadcrumb({ + category: namespace, + message, + level: level === "warning" ? "warning" : level, + data: context, + }) + } + + return { + info: (message, context) => { + toBreadcrumb("info", message, context) + }, + warn: (message, context) => { + toBreadcrumb("warning", message, context) + getSentryClient()?.captureMessage(message, { + level: "warning", + extra: context, + }) + }, + error: (message, context) => { + toBreadcrumb("error", message, context) + getSentryClient()?.captureMessage(message, { + level: "error", + extra: context, + }) + }, + } +} diff --git a/package-lock.json b/package-lock.json index 7db38da4..dfc3758c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -60,6 +60,7 @@ "@mapbox/mapbox-gl-geocoder": "^5.1.2", "@opennextjs/cloudflare": "^1.19.11", "@sonory/shared-types": "*", + "@sonory/utils": "*", "@supabase/supabase-js": "^2.108.0", "@tanstack/react-query": "^5.101.0", "framer-motion": "^12.40.0", diff --git a/packages/utils/src/index.ts b/packages/utils/src/index.ts index 11583bc7..e1084aea 100644 --- a/packages/utils/src/index.ts +++ b/packages/utils/src/index.ts @@ -5,6 +5,8 @@ export * from "./audio.js" // 地理空間関連 export * from "./geo.js" +// テレメトリ関連 +export * from "./telemetry/index.js" // URL関連 export * from "./url.js" export * from "./validation.js" diff --git a/packages/utils/src/telemetry/createLogger.ts b/packages/utils/src/telemetry/createLogger.ts new file mode 100644 index 00000000..07096af2 --- /dev/null +++ b/packages/utils/src/telemetry/createLogger.ts @@ -0,0 +1,66 @@ +import type { LogContext, LogLevel, Logger, LoggerConfig } from "./types.js" + +const LOG_LEVEL_ORDER: Readonly> = { + debug: 0, + info: 1, + warn: 2, + error: 3, +} + +/** + * 指定レベル以上のログのみを出力するロガーを生成する。 + * + * @param config - 名前空間・最小レベル・出力先シンク + * @returns 構造化ログ用ロガー + * + * @example + * ```ts + * const logger = createLogger({ + * namespace: "map", + * minLevel: "info", + * sinks: { info: (message) => console.info(message) }, + * }) + * logger.info("Map initialized", { zoom: 12 }) + * ``` + */ +export function createLogger(config: LoggerConfig): Logger { + const shouldLog = (level: LogLevel): boolean => + LOG_LEVEL_ORDER[level] >= LOG_LEVEL_ORDER[config.minLevel] + + const emit = ( + level: LogLevel, + message: string, + context?: LogContext, + ): void => { + if (!shouldLog(level)) { + return + } + + const sink = config.sinks[level] + if (!sink) { + return + } + + const payload = + context === undefined + ? { namespace: config.namespace, message } + : { namespace: config.namespace, message, ...context } + + sink(message, payload) + } + + return { + debug: (message, context) => { + emit("debug", message, context) + }, + info: (message, context) => { + emit("info", message, context) + }, + warn: (message, context) => { + emit("warn", message, context) + }, + error: (message, context) => { + emit("error", message, context) + }, + } +} diff --git a/packages/utils/src/telemetry/index.ts b/packages/utils/src/telemetry/index.ts new file mode 100644 index 00000000..3374652a --- /dev/null +++ b/packages/utils/src/telemetry/index.ts @@ -0,0 +1,8 @@ +export { createLogger } from "./createLogger.js" +export type { + LogContext, + LogLevel, + LogSink, + Logger, + LoggerConfig, +} from "./types.js" diff --git a/packages/utils/src/telemetry/types.ts b/packages/utils/src/telemetry/types.ts new file mode 100644 index 00000000..71d8b094 --- /dev/null +++ b/packages/utils/src/telemetry/types.ts @@ -0,0 +1,41 @@ +/** + * テレメトリで扱うログレベル。 + */ +export type LogLevel = "debug" | "info" | "warn" | "error" + +/** + * 構造化ログに付与する追加コンテキスト。 + */ +export type LogContext = Readonly> + +/** + * ログを外部サービスへ転送するためのシンク。 + * + * @description + * APM(Sentry 等)や開発用コンソール出力を差し替え可能にする。 + */ +export interface LogSink { + readonly debug?: (message: string, context?: LogContext) => void + readonly info?: (message: string, context?: LogContext) => void + readonly warn?: (message: string, context?: LogContext) => void + readonly error?: (message: string, context?: LogContext) => void +} + +/** + * ロガー生成時の設定。 + */ +export interface LoggerConfig { + readonly namespace: string + readonly minLevel: LogLevel + readonly sinks: LogSink +} + +/** + * アプリケーション全体で利用するロガーインターフェース。 + */ +export interface Logger { + debug(message: string, context?: LogContext): void + info(message: string, context?: LogContext): void + warn(message: string, context?: LogContext): void + error(message: string, context?: LogContext): void +} From d64d8e6b2c6c4d9f1c32a3470012a89287a0f070 Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 9 Jun 2026 02:47:06 +0000 Subject: [PATCH 2/2] feat: integrate Sentry SDK for web and API Add @sentry/nextjs with instrumentation hooks and global error boundary. Add @sentry/hono middleware for the Cloudflare Workers API. DSN is read only from environment variables so secrets stay out of the repository. --- .env.example | 12 +- apps/api/package.json | 2 + apps/api/src/app.ts | 7 + apps/api/src/middleware/error.ts | 12 + apps/api/src/middleware/monitoring.ts | 2 +- apps/api/src/utils/sentryOptions.ts | 17 + apps/api/src/utils/telemetry.ts | 17 +- apps/api/tsconfig.json | 2 +- apps/web/instrumentation-client.ts | 9 + apps/web/instrumentation.ts | 16 + apps/web/next.config.ts | 10 +- apps/web/package.json | 1 + apps/web/sentry.edge.config.ts | 7 + apps/web/sentry.server.config.ts | 7 + apps/web/sentry.shared.config.ts | 28 + apps/web/src/app/global-error.tsx | 35 + .../web/src/lib/telemetry/sinks/sentrySink.ts | 56 +- package-lock.json | 1246 +++++++++++++++-- 18 files changed, 1288 insertions(+), 198 deletions(-) create mode 100644 apps/api/src/utils/sentryOptions.ts create mode 100644 apps/web/instrumentation-client.ts create mode 100644 apps/web/instrumentation.ts create mode 100644 apps/web/sentry.edge.config.ts create mode 100644 apps/web/sentry.server.config.ts create mode 100644 apps/web/sentry.shared.config.ts create mode 100644 apps/web/src/app/global-error.tsx diff --git a/.env.example b/.env.example index cd2a7793..b0529800 100644 --- a/.env.example +++ b/.env.example @@ -33,10 +33,12 @@ LOG_LEVEL=debug # アプリケーション名(マニフェストとメタデータに使用) NEXT_PUBLIC_APP_NAME=Sonory -# オブザーバビリティ(APM) -# ブラウザ + Next.js: https://sentry.io でプロジェクト作成後に設定 +# オブザーバビリティ(Sentry) +# 1. https://sentry.io でプロジェクト作成(web: Next.js / api: Cloudflare Workers) +# 2. 以下をローカル .env または Cloudflare / wrangler secret に設定(チャット等で共有しない) NEXT_PUBLIC_SENTRY_DSN= -# Cloudflare Workers API: wrangler secret put SENTRY_DSN --env production SENTRY_DSN= -# 本番以外で Sentry へ送る場合は true(通常は未設定で development はローカルのみ) -# NEXT_PUBLIC_SENTRY_ENABLED=false \ No newline at end of file +# ソースマップ自動アップロード(任意・CI 向け) +SENTRY_ORG= +SENTRY_PROJECT= +SENTRY_AUTH_TOKEN= \ No newline at end of file diff --git a/apps/api/package.json b/apps/api/package.json index 610a0f31..e8adcdda 100644 --- a/apps/api/package.json +++ b/apps/api/package.json @@ -27,6 +27,8 @@ "dependencies": { "@hono/zod-openapi": "^1.4.0", "@hono/zod-validator": "^0.8.0", + "@sentry/cloudflare": "^10.56.0", + "@sentry/hono": "^10.56.0", "@sonory/shared-types": "file:../../packages/shared-types", "@sonory/utils": "file:../../packages/utils", "@supabase/supabase-js": "^2.108.0", diff --git a/apps/api/src/app.ts b/apps/api/src/app.ts index 00bab741..044efdc4 100644 --- a/apps/api/src/app.ts +++ b/apps/api/src/app.ts @@ -1,4 +1,5 @@ import { OpenAPIHono } from "@hono/zod-openapi" +import { sentry } from "@sentry/hono/cloudflare" import { logger as honoLogger } from "hono/logger" import { requestId } from "hono/request-id" import { timing } from "hono/timing" @@ -10,6 +11,7 @@ import { healthRoutes } from "./routes/health" import pinsRoutes from "./routes/pins" import type { Env } from "./types/env" import { logger } from "./utils/logger" +import { createSentryOptions } from "./utils/sentryOptions" /** * OpenAPIHono アプリケーションを構築する。 @@ -17,6 +19,11 @@ import { logger } from "./utils/logger" export function createApp(): OpenAPIHono<{ Bindings: Env }> { const app = new OpenAPIHono<{ Bindings: Env }>() + app.use( + "*", + sentry(app, (env: Env) => createSentryOptions(env)), + ) + app.use("*", requestId()) app.use("*", timing()) app.use("*", honoLogger()) diff --git a/apps/api/src/middleware/error.ts b/apps/api/src/middleware/error.ts index 61462f80..1e27433c 100644 --- a/apps/api/src/middleware/error.ts +++ b/apps/api/src/middleware/error.ts @@ -2,6 +2,8 @@ import type { APIError } from "@sonory/shared-types" import { ERROR_CODES } from "@sonory/shared-types" import type { Context, Next } from "hono" import { HTTPException } from "hono/http-exception" +import type { Env } from "../types/env" +import { captureException } from "../utils/telemetry" // ERROR_CODESを再エクスポート export { ERROR_CODES } @@ -85,6 +87,16 @@ export const errorHandler = async (c: Context, next: Next) => { // その他のエラー console.error("Unhandled error:", error) + + const env = (c.env ?? {}) as Env + if (env.SENTRY_DSN) { + await captureException(error, { + requestId, + path: c.req.path, + method: c.req.method, + }) + } + const apiError: APIError = { code: ERROR_CODES.INTERNAL_SERVER_ERROR, message: "An unexpected error occurred", diff --git a/apps/api/src/middleware/monitoring.ts b/apps/api/src/middleware/monitoring.ts index 7b1ec1bf..b6bdfbd5 100644 --- a/apps/api/src/middleware/monitoring.ts +++ b/apps/api/src/middleware/monitoring.ts @@ -9,7 +9,7 @@ import { captureException } from "../utils/telemetry" * @description * Cloudflare Workers環境でのログ・メトリクス・エラー追跡を提供 * Phase 1: 基本的なログ機能を実装 - * Phase 2以降: Sentry連携やCloudflare Analytics統合を追加予定 + * Phase 2: Sentry連携(@sentry/hono)済み */ /** diff --git a/apps/api/src/utils/sentryOptions.ts b/apps/api/src/utils/sentryOptions.ts new file mode 100644 index 00000000..9e1cd5ea --- /dev/null +++ b/apps/api/src/utils/sentryOptions.ts @@ -0,0 +1,17 @@ +import type { CloudflareOptions } from "@sentry/cloudflare" +import type { Env } from "../types/env" + +/** + * Workers 環境向け Sentry オプションを生成する。 + */ +export function createSentryOptions(env: Env): CloudflareOptions { + const isProduction = env.ENVIRONMENT === "production" + + return { + dsn: env.SENTRY_DSN, + enabled: Boolean(env.SENTRY_DSN), + environment: env.ENVIRONMENT, + tracesSampleRate: isProduction ? 0.1 : 1, + sendDefaultPii: false, + } +} diff --git a/apps/api/src/utils/telemetry.ts b/apps/api/src/utils/telemetry.ts index 02dd7c31..02447e0b 100644 --- a/apps/api/src/utils/telemetry.ts +++ b/apps/api/src/utils/telemetry.ts @@ -1,20 +1,19 @@ +import * as Sentry from "@sentry/cloudflare" import type { LogContext } from "@sonory/utils" /** - * Workers 向けのエラー転送先。 - * - * @description - * Phase 2: `@sentry/cloudflare` 導入後に実装を差し替える。 + * Workers 向けのエラー転送。 */ export async function captureException( error: unknown, context?: LogContext, ): Promise { - // Sentry DSN 設定後: - // import * as Sentry from "@sentry/cloudflare" - // Sentry.captureException(error, { extra: context }) - void error - void context + if (context === undefined) { + Sentry.captureException(error) + return + } + + Sentry.captureException(error, { extra: { ...context } }) } /** diff --git a/apps/api/tsconfig.json b/apps/api/tsconfig.json index 86ded896..6ba708b8 100644 --- a/apps/api/tsconfig.json +++ b/apps/api/tsconfig.json @@ -6,7 +6,7 @@ "lib": ["ES2022"], "types": ["./worker-configuration.d.ts", "node"], "jsx": "react-jsx", - "moduleResolution": "node", + "moduleResolution": "bundler", "allowImportingTsExtensions": false, "noPropertyAccessFromIndexSignature": false, "moduleDetection": "force", diff --git a/apps/web/instrumentation-client.ts b/apps/web/instrumentation-client.ts new file mode 100644 index 00000000..cd8ea62f --- /dev/null +++ b/apps/web/instrumentation-client.ts @@ -0,0 +1,9 @@ +import * as Sentry from "@sentry/nextjs" + +import { getSentryOptions, isSentryEnabled } from "./sentry.shared.config" + +if (isSentryEnabled()) { + Sentry.init(getSentryOptions()) +} + +export const onRouterTransitionStart = Sentry.captureRouterTransitionStart diff --git a/apps/web/instrumentation.ts b/apps/web/instrumentation.ts new file mode 100644 index 00000000..de2e8626 --- /dev/null +++ b/apps/web/instrumentation.ts @@ -0,0 +1,16 @@ +import * as Sentry from "@sentry/nextjs" + +/** + * Next.js サーバー・Edge ランタイム向け Sentry 登録フック。 + */ +export async function register(): Promise { + if (process.env.NEXT_RUNTIME === "nodejs") { + await import("./sentry.server.config") + } + + if (process.env.NEXT_RUNTIME === "edge") { + await import("./sentry.edge.config") + } +} + +export const onRequestError = Sentry.captureRequestError diff --git a/apps/web/next.config.ts b/apps/web/next.config.ts index 77cdc7f9..5a2638c4 100644 --- a/apps/web/next.config.ts +++ b/apps/web/next.config.ts @@ -1,3 +1,4 @@ +import { withSentryConfig } from "@sentry/nextjs" import type { NextConfig } from "next" const withPWA = require("@ducanh2912/next-pwa").default({ @@ -43,4 +44,11 @@ const nextConfig: NextConfig = { }, } -export default withPWA(nextConfig) +const configWithPwa = withPWA(nextConfig) + +export default withSentryConfig(configWithPwa, { + org: process.env.SENTRY_ORG, + project: process.env.SENTRY_PROJECT, + authToken: process.env.SENTRY_AUTH_TOKEN, + silent: !process.env.CI, +}) diff --git a/apps/web/package.json b/apps/web/package.json index 8192ae58..22441ce4 100644 --- a/apps/web/package.json +++ b/apps/web/package.json @@ -28,6 +28,7 @@ "@ducanh2912/next-pwa": "^10.2.9", "@mapbox/mapbox-gl-geocoder": "^5.1.2", "@opennextjs/cloudflare": "^1.19.11", + "@sentry/nextjs": "^10.56.0", "@sonory/shared-types": "*", "@sonory/utils": "*", "@supabase/supabase-js": "^2.108.0", diff --git a/apps/web/sentry.edge.config.ts b/apps/web/sentry.edge.config.ts new file mode 100644 index 00000000..e7a15e51 --- /dev/null +++ b/apps/web/sentry.edge.config.ts @@ -0,0 +1,7 @@ +import * as Sentry from "@sentry/nextjs" + +import { getSentryOptions, isSentryEnabled } from "./sentry.shared.config" + +if (isSentryEnabled()) { + Sentry.init(getSentryOptions()) +} diff --git a/apps/web/sentry.server.config.ts b/apps/web/sentry.server.config.ts new file mode 100644 index 00000000..e7a15e51 --- /dev/null +++ b/apps/web/sentry.server.config.ts @@ -0,0 +1,7 @@ +import * as Sentry from "@sentry/nextjs" + +import { getSentryOptions, isSentryEnabled } from "./sentry.shared.config" + +if (isSentryEnabled()) { + Sentry.init(getSentryOptions()) +} diff --git a/apps/web/sentry.shared.config.ts b/apps/web/sentry.shared.config.ts new file mode 100644 index 00000000..a67a97d0 --- /dev/null +++ b/apps/web/sentry.shared.config.ts @@ -0,0 +1,28 @@ +import type { BrowserOptions, EdgeOptions, NodeOptions } from "@sentry/nextjs" + +const sentryDsn = process.env.NEXT_PUBLIC_SENTRY_DSN + +/** + * Sentry が有効かどうかを判定する。 + * + * @description + * DSN 未設定時は SDK を初期化せず、ローカル開発への影響を避ける。 + */ +export function isSentryEnabled(): boolean { + return Boolean(sentryDsn) +} + +/** + * Sentry 共通オプションを返す。 + */ +export function getSentryOptions(): BrowserOptions | NodeOptions | EdgeOptions { + const isProduction = process.env.NODE_ENV === "production" + + return { + dsn: sentryDsn, + enabled: isSentryEnabled(), + environment: process.env.NODE_ENV, + tracesSampleRate: isProduction ? 0.1 : 1, + sendDefaultPii: false, + } +} diff --git a/apps/web/src/app/global-error.tsx b/apps/web/src/app/global-error.tsx new file mode 100644 index 00000000..f397a003 --- /dev/null +++ b/apps/web/src/app/global-error.tsx @@ -0,0 +1,35 @@ +"use client" + +import * as Sentry from "@sentry/nextjs" +import { useEffect } from "react" + +interface GlobalErrorProps { + readonly error: Error & { digest?: string } + readonly reset: () => void +} + +/** + * アプリ全体の未処理エラーを捕捉し Sentry へ送信する。 + */ +export default function GlobalError({ + error, + reset, +}: GlobalErrorProps): React.JSX.Element { + useEffect(() => { + Sentry.captureException(error) + }, [error]) + + return ( + + +
+

問題が発生しました

+

しばらくしてからもう一度お試しください。

+ +
+ + + ) +} diff --git a/apps/web/src/lib/telemetry/sinks/sentrySink.ts b/apps/web/src/lib/telemetry/sinks/sentrySink.ts index 8898928b..ec7bc3fd 100644 --- a/apps/web/src/lib/telemetry/sinks/sentrySink.ts +++ b/apps/web/src/lib/telemetry/sinks/sentrySink.ts @@ -1,50 +1,11 @@ +import * as Sentry from "@sentry/nextjs" import type { LogContext } from "@sonory/utils" -/** - * Sentry SDK が提供する最小インターフェース。 - * - * @description - * `@sentry/nextjs` 導入後に `window.Sentry` へバインドされる想定。 - */ -interface SentryClient { - addBreadcrumb(breadcrumb: { - category: string - message: string - level?: "debug" | "info" | "warning" | "error" - data?: Record - }): void - captureException( - error: unknown, - context?: { extra?: Record }, - ): void - captureMessage( - message: string, - context?: { - level?: "warning" | "error" - extra?: Record - }, - ): void -} - -declare global { - interface Window { - Sentry?: SentryClient - } -} - -function getSentryClient(): SentryClient | undefined { - if (typeof window === "undefined") { - return undefined - } - - return window.Sentry -} - /** * Sentry 向けのブレッドクラム・エラー転送シンク。 * * @description - * DSN 未設定時は no-op。APM 導入後も呼び出し側の変更は不要。 + * DSN 未設定時は SDK 側で no-op になる。 */ export function createSentrySink(namespace: string): { info(message: string, context?: LogContext): void @@ -56,15 +17,10 @@ export function createSentrySink(namespace: string): { message: string, context?: LogContext, ): void => { - const sentry = getSentryClient() - if (!sentry) { - return - } - - sentry.addBreadcrumb({ + Sentry.addBreadcrumb({ category: namespace, message, - level: level === "warning" ? "warning" : level, + level, data: context, }) } @@ -75,14 +31,14 @@ export function createSentrySink(namespace: string): { }, warn: (message, context) => { toBreadcrumb("warning", message, context) - getSentryClient()?.captureMessage(message, { + Sentry.captureMessage(message, { level: "warning", extra: context, }) }, error: (message, context) => { toBreadcrumb("error", message, context) - getSentryClient()?.captureMessage(message, { + Sentry.captureMessage(message, { level: "error", extra: context, }) diff --git a/package-lock.json b/package-lock.json index dfc3758c..2887116f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,6 +35,8 @@ "dependencies": { "@hono/zod-openapi": "^1.4.0", "@hono/zod-validator": "^0.8.0", + "@sentry/cloudflare": "^10.56.0", + "@sentry/hono": "^10.56.0", "@sonory/shared-types": "file:../../packages/shared-types", "@sonory/utils": "file:../../packages/utils", "@supabase/supabase-js": "^2.108.0", @@ -59,6 +61,7 @@ "@ducanh2912/next-pwa": "^10.2.9", "@mapbox/mapbox-gl-geocoder": "^5.1.2", "@opennextjs/cloudflare": "^1.19.11", + "@sentry/nextjs": "^10.56.0", "@sonory/shared-types": "*", "@sonory/utils": "*", "@supabase/supabase-js": "^2.108.0", @@ -5725,6 +5728,101 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/@opentelemetry/api": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", + "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", + "license": "Apache-2.0", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/api-logs": { + "version": "0.214.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/api-logs/-/api-logs-0.214.0.tgz", + "integrity": "sha512-40lSJeqYO8Uz2Yj7u94/SJWE/wONa7rmMKjI1ZcIjgf3MHNHv1OZUCrCETGuaRF62d5pQD1wKIW+L4lmSMTzZA==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api": "^1.3.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/@opentelemetry/core": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/core/-/core-2.7.1.tgz", + "integrity": "sha512-QAqIj32AtK6+pEVNG7EOVxHdE06RP+FM5qpiEJ4RtDcFIqKUZHYhl7/7UY5efhwmwNAg7j8QbJVBLxMerc0+gw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.0.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/instrumentation": { + "version": "0.214.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/instrumentation/-/instrumentation-0.214.0.tgz", + "integrity": "sha512-MHqEX5Dk59cqVah5LiARMACku7jXSVk9iVDWOea4x3cr7VfdByeDCURK6o1lntT1JS/Tsovw01UJrBhN3/uC5w==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/api-logs": "0.214.0", + "import-in-the-middle": "^3.0.0", + "require-in-the-middle": "^8.0.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.3.0" + } + }, + "node_modules/@opentelemetry/resources": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/resources/-/resources-2.7.1.tgz", + "integrity": "sha512-DeT6KKolmC4e/dRQvMQ/RwlnzhaqeiFOXY5ngoOPJ07GgVVKxZOg9EcrNZb5aTzUn+iCrJldAgOfQm1O/QfPAQ==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/sdk-trace-base": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/sdk-trace-base/-/sdk-trace-base-2.7.1.tgz", + "integrity": "sha512-NAYIlsF8MPUsKqJMiDQJTMPOmlbawC1Iz/omMLygZ1C9am8fTKYjTaI+OZM+WTY3t3Glo0wnOg/6/pac6RGPPw==", + "license": "Apache-2.0", + "dependencies": { + "@opentelemetry/core": "2.7.1", + "@opentelemetry/resources": "2.7.1", + "@opentelemetry/semantic-conventions": "^1.29.0" + }, + "engines": { + "node": "^18.19.0 || >=20.6.0" + }, + "peerDependencies": { + "@opentelemetry/api": ">=1.3.0 <1.10.0" + } + }, + "node_modules/@opentelemetry/semantic-conventions": { + "version": "1.41.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.41.1.tgz", + "integrity": "sha512-/UhIkaZgPutTFmQ7RnIJGgDXZmtEJ7Dvi86xNTFWcnRxVRNk/aotsqDJYeEvDP+FSMB2SdW+pQzNMcWP0rwuNA==", + "license": "Apache-2.0", + "engines": { + "node": ">=14" + } + }, "node_modules/@oxfmt/binding-android-arm-eabi": { "version": "0.54.0", "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.54.0.tgz", @@ -6497,6 +6595,67 @@ "node": ">=10" } }, + "node_modules/@rollup/plugin-commonjs": { + "version": "28.0.1", + "resolved": "https://registry.npmjs.org/@rollup/plugin-commonjs/-/plugin-commonjs-28.0.1.tgz", + "integrity": "sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==", + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.0.1", + "commondir": "^1.0.1", + "estree-walker": "^2.0.2", + "fdir": "^6.2.0", + "is-reference": "1.2.1", + "magic-string": "^0.30.3", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=16.0.0 || 14 >= 14.17" + }, + "peerDependencies": { + "rollup": "^2.68.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/@rollup/plugin-commonjs/node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/@rollup/plugin-commonjs/node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/@rollup/plugin-node-resolve": { "version": "15.3.1", "resolved": "https://registry.npmjs.org/@rollup/plugin-node-resolve/-/plugin-node-resolve-15.3.1.tgz", @@ -6584,9 +6743,9 @@ } }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.52.3.tgz", - "integrity": "sha512-h6cqHGZ6VdnwliFG1NXvMPTy/9PS3h8oLh7ImwR+kl+oYnQizgjxsONmmPSb2C66RksfkfIxEVtDSEcJiO0tqw==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.61.1.tgz", + "integrity": "sha512-JnBB8MdXj45cajvTuO5FmPlvFVJRQgvrz1uSEl3NwqFnReAPGwb8EanbGi4z2nRaqLzjJSv5/JmycoTKlRZxHA==", "cpu": [ "arm" ], @@ -6597,9 +6756,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.52.3.tgz", - "integrity": "sha512-wd+u7SLT/u6knklV/ifG7gr5Qy4GUbH2hMWcDauPFJzmCZUAJ8L2bTkVXC2niOIxp8lk3iH/QX8kSrUxVZrOVw==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.61.1.tgz", + "integrity": "sha512-Jx2g7iSjw4AOT0HDPHM9RV3GNjRXwybWtSFZiZAYUTjUwjVrYIwq3kBf+LnhqJlzXFAqTAh2F7IGI+O568exPw==", "cpu": [ "arm64" ], @@ -6610,9 +6769,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.52.3.tgz", - "integrity": "sha512-lj9ViATR1SsqycwFkJCtYfQTheBdvlWJqzqxwc9f2qrcVrQaF/gCuBRTiTolkRWS6KvNxSk4KHZWG7tDktLgjg==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.61.1.tgz", + "integrity": "sha512-0F1L/Z3Eqv8mT2n3dCpeO8GcTvHvVqkP5/t6DMsn0KzhYVcg+s7Ncl5DS8qjKYEeio6Az0Gt6nyBORay5qIlCA==", "cpu": [ "arm64" ], @@ -6623,9 +6782,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.52.3.tgz", - "integrity": "sha512-+Dyo7O1KUmIsbzx1l+4V4tvEVnVQqMOIYtrxK7ncLSknl1xnMHLgn7gddJVrYPNZfEB8CIi3hK8gq8bDhb3h5A==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.61.1.tgz", + "integrity": "sha512-qLttcH871ujY4YcVfUSShhOw+CsoTatYz8gRbHO7Bb92QH059/P0y5do1KMs41fY0BpD2x4AJH/gID0zFiqVKQ==", "cpu": [ "x64" ], @@ -6636,9 +6795,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.52.3.tgz", - "integrity": "sha512-u9Xg2FavYbD30g3DSfNhxgNrxhi6xVG4Y6i9Ur1C7xUuGDW3banRbXj+qgnIrwRN4KeJ396jchwy9bCIzbyBEQ==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.61.1.tgz", + "integrity": "sha512-fUI4RapGE0Oh3mb8mgfvC1O2nU1RpDZUKnDQm3xB1Ipg7C2wTs5Kstz7G2uWK99a8S2yTMq8/P4uycwNa0nJyw==", "cpu": [ "arm64" ], @@ -6649,9 +6808,9 @@ ] }, "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.52.3.tgz", - "integrity": "sha512-5M8kyi/OX96wtD5qJR89a/3x5x8x5inXBZO04JWhkQb2JWavOWfjgkdvUqibGJeNNaz1/Z1PPza5/tAPXICI6A==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.61.1.tgz", + "integrity": "sha512-H5YrdvJaDtI/U9/emrD4b++xkvp3y/JvOe4rizHbxvkyMfRS/CiRYdji+Pl8D0brEaNFWUh1drQxgAGIl6Xudw==", "cpu": [ "x64" ], @@ -6662,9 +6821,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.52.3.tgz", - "integrity": "sha512-IoerZJ4l1wRMopEHRKOO16e04iXRDyZFZnNZKrWeNquh5d6bucjezgd+OxG03mOMTnS1x7hilzb3uURPkJ0OfA==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.61.1.tgz", + "integrity": "sha512-Q8CBCCQtDFrYtXoeUXSrnFXKOnyUhx6bz+SkL6A0E7V8kAiCJ5pamq1WtbfpVGhR5TSpXY6ak3avmDc5fHTyJA==", "cpu": [ "arm" ], @@ -6675,9 +6834,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.52.3.tgz", - "integrity": "sha512-ZYdtqgHTDfvrJHSh3W22TvjWxwOgc3ThK/XjgcNGP2DIwFIPeAPNsQxrJO5XqleSlgDux2VAoWQ5iJrtaC1TbA==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.61.1.tgz", + "integrity": "sha512-nwnhk1581l0FBVellGcVCAT0Oi06onEA3WB53sf01VO3I0UPBkMH9sXONYME2K0ovXcNayJfNtHfm6mpJElatQ==", "cpu": [ "arm" ], @@ -6688,9 +6847,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.52.3.tgz", - "integrity": "sha512-NcViG7A0YtuFDA6xWSgmFb6iPFzHlf5vcqb2p0lGEbT+gjrEEz8nC/EeDHvx6mnGXnGCC1SeVV+8u+smj0CeGQ==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.61.1.tgz", + "integrity": "sha512-x5Xr49hwt3hdW75UOZm3395YwwzPyauktslv29KpWL/T+vVAzoT3azLcTWv0eMciBNrx+DYjH4paehHoLpPvpg==", "cpu": [ "arm64" ], @@ -6701,9 +6860,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.52.3.tgz", - "integrity": "sha512-d3pY7LWno6SYNXRm6Ebsq0DJGoiLXTb83AIPCXl9fmtIQs/rXoS8SJxxUNtFbJ5MiOvs+7y34np77+9l4nfFMw==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.61.1.tgz", + "integrity": "sha512-unMS3H73DpaoPyyEVPjGKleM/s0mkmsauTENpw4INQY8y4+IuLNjkueQ5QCtC0D3N38Y38yhAU8OoZ20S2Tm6w==", "cpu": [ "arm64" ], @@ -6714,9 +6873,22 @@ ] }, "node_modules/@rollup/rollup-linux-loong64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.52.3.tgz", - "integrity": "sha512-3y5GA0JkBuirLqmjwAKwB0keDlI6JfGYduMlJD/Rl7fvb4Ni8iKdQs1eiunMZJhwDWdCvrcqXRY++VEBbvk6Eg==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.61.1.tgz", + "integrity": "sha512-zNZzGRnAhwjFEYmvphJRV5XaQGjs62cCmeYYHUT//NbvEnHauw+I85nGG+SiVg5ld4GX8D1IbKIX+ozITQnhMQ==", + "cpu": [ + "loong64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.61.1.tgz", + "integrity": "sha512-LdpWGL8X209B2SIvWjqlc8VZgM6PKfontSerGepuldQmHYrAOtnMCXeJkxXGbC+PPZVOuu5czJo7fNV6aeW8rQ==", "cpu": [ "loong64" ], @@ -6727,9 +6899,22 @@ ] }, "node_modules/@rollup/rollup-linux-ppc64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.52.3.tgz", - "integrity": "sha512-AUUH65a0p3Q0Yfm5oD2KVgzTKgwPyp9DSXc3UA7DtxhEb/WSPfbG4wqXeSN62OG5gSo18em4xv6dbfcUGXcagw==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.61.1.tgz", + "integrity": "sha512-EC5kTtNaNGOmbMGqar8dvJy6y/hg99GAwjfBz++pxZhQATXGcRjd6c5en5wcbru0vkRmiMGsQKdMJOOf6sza4g==", + "cpu": [ + "ppc64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.61.1.tgz", + "integrity": "sha512-8hiwp6D4acEcNK78I4rP0/XtS1sknWIAMJBPdR4l6zUtyTm5KiTDr5bXmWt4foY7nAN7AThDHgkLIEZOWKbzWw==", "cpu": [ "ppc64" ], @@ -6740,9 +6925,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.52.3.tgz", - "integrity": "sha512-1makPhFFVBqZE+XFg3Dkq+IkQ7JvmUrwwqaYBL2CE+ZpxPaqkGaiWFEWVGyvTwZace6WLJHwjVh/+CXbKDGPmg==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.61.1.tgz", + "integrity": "sha512-10dh/h/BqA7DuMPWSxkR8uks18FRwnwOEqr5zOTEl+NOwP/OMzKX8OFR/Of9xxDA7D5qef1Nzar5WDD2kCCr1g==", "cpu": [ "riscv64" ], @@ -6753,9 +6938,9 @@ ] }, "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.52.3.tgz", - "integrity": "sha512-OOFJa28dxfl8kLOPMUOQBCO6z3X2SAfzIE276fwT52uXDWUS178KWq0pL7d6p1kz7pkzA0yQwtqL0dEPoVcRWg==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.61.1.tgz", + "integrity": "sha512-YKJ5lg35DP17gcAOggnihe+APw9HLyj1Xn7gsmGumBJAUDa6NGXNixJzmkWLhcK9TOuuyQjdamzvJefkO7qHZQ==", "cpu": [ "riscv64" ], @@ -6766,9 +6951,9 @@ ] }, "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.52.3.tgz", - "integrity": "sha512-jMdsML2VI5l+V7cKfZx3ak+SLlJ8fKvLJ0Eoa4b9/vCUrzXKgoKxvHqvJ/mkWhFiyp88nCkM5S2v6nIwRtPcgg==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.61.1.tgz", + "integrity": "sha512-Mlil5G2Jj6a7B3LWGctg+XPL9vdXYuzCtNXfxOQ0nPjc2m6ueUktocPGH9bnAM0bNRKb/bAWTujUU7IJQdQA+g==", "cpu": [ "s390x" ], @@ -6778,96 +6963,781 @@ "linux" ] }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.52.3.tgz", - "integrity": "sha512-tPgGd6bY2M2LJTA1uGq8fkSPK8ZLYjDjY+ZLK9WHncCnfIz29LIXIqUgzCR0hIefzy6Hpbe8Th5WOSwTM8E7LA==", + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.61.1.tgz", + "integrity": "sha512-bVWIOIk6pV01p4CdUbPP7CJ/434z+OooYjDuFcR+44N35YvKUC66G8MGnvcWx5mWKW3g61J+t74l3Kj15Kwn2Q==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.61.1.tgz", + "integrity": "sha512-qy5pBvZbqNFheBz61R1rzsezjm0J7O2oNGoWtGoY89SZYLUfxAJTBAqDChqAIdB4rCiIbi9nF7yZ83GnNiLwSw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.61.1.tgz", + "integrity": "sha512-E83TXjI4zm0+5f2qO+UOudaCYIhYwpJ5jq6YCZNIZ+6CbfhKrkAGezeiASBL9ElxAxFsRS9ZhESv8mfnj6TKeg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.61.1.tgz", + "integrity": "sha512-fbWnKqVkjrJN38vNe3ahkbk6iejS/3b0Nt7EEtPpE6RBacZcGXNKbzfHN3GUUlXOPghUg0j6XUGrtjX9z1sIvA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.61.1.tgz", + "integrity": "sha512-ArMl38iVAbk0New1ogihQNY6iphLi4ZaRsa037gUzv5yeKPY8TD3Dmy4x2RNC1VztU/uqm+G+/RwFrSka3Oy2g==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.61.1.tgz", + "integrity": "sha512-0mYtjHS9ucAbcATycCNK9IGBk/cCe/ma7EmSLGZdsxnOA8cjRIyU04wDpVAD9NiOfLUR9KTxdiO53uOkherqjQ==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.61.1.tgz", + "integrity": "sha512-gK1iCEPfpoSG9wfBihXxvBMi8ZfcWffYkEsC/Eih+iFENTaewvNcrEQ69lIOWYO5pePHKLHHO7nq5AILGO/HQQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.61.1.tgz", + "integrity": "sha512-X+zaP2x+j4RXGfbp/seSoRHWnPxzApilDszisZxbYH5C/jTxFhCtDNdPGZb9lJyYPs24wGxruPF7Y+sIXt9Gzw==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sentry-internal/browser-utils": { + "version": "10.56.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/browser-utils/-/browser-utils-10.56.0.tgz", + "integrity": "sha512-I8tZWAFg8SZpD8BFUpglEtSTzhZjacmcThB5/Mlq/iFiiT8mBPG4ZWDWssSfmIBKvZywJZJ83uDA0+uiJU73Tw==", + "license": "MIT", + "dependencies": { + "@sentry/core": "10.56.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry-internal/feedback": { + "version": "10.56.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/feedback/-/feedback-10.56.0.tgz", + "integrity": "sha512-fkRR9JroESTIlErkht3OrH4DXKd/DbPozr2KLdX7boMo31hPu4cL9fuqzwOrwyDPRq9B4j+qEgIWB8JrTbgvmg==", + "license": "MIT", + "dependencies": { + "@sentry/core": "10.56.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry-internal/replay": { + "version": "10.56.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay/-/replay-10.56.0.tgz", + "integrity": "sha512-DjF09hpy3TF7Km/kOZc73YJmBqcbPCxuZ5rtRs+KtVHu3Vq48xeW83qKUcFEZv20ur9UD99OAJ/gaEt//1Qbwg==", + "license": "MIT", + "dependencies": { + "@sentry-internal/browser-utils": "10.56.0", + "@sentry/core": "10.56.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry-internal/replay-canvas": { + "version": "10.56.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/replay-canvas/-/replay-canvas-10.56.0.tgz", + "integrity": "sha512-SDg2K0CAZT/TnhrixQGwXoi6ZsWUB+DQy3UUk0bSQm6c/5k5zFBpGOiughQN+DYsDilKREfPKmUEEnqvUjm1HQ==", + "license": "MIT", + "dependencies": { + "@sentry-internal/replay": "10.56.0", + "@sentry/core": "10.56.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry-internal/server-utils": { + "version": "10.56.0", + "resolved": "https://registry.npmjs.org/@sentry-internal/server-utils/-/server-utils-10.56.0.tgz", + "integrity": "sha512-6kuZI/vAjyVKMm1cTzc2pdUmVR4Px4etMG6wnCPyFnwEaGbUKQnTynUBFpTuo/q6Js6QBQvhLNoAnO4YsOfW4w==", + "license": "MIT", + "dependencies": { + "@sentry/core": "10.56.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/babel-plugin-component-annotate": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@sentry/babel-plugin-component-annotate/-/babel-plugin-component-annotate-5.3.0.tgz", + "integrity": "sha512-p4q8gn8wcFqZGP/s2MnJCAAd8fTikaU6A0mM97RDHQgStcrYiaS0Sc5zUNfb1V+UOLPuvdEdL6MwyxfzjYJQTA==", + "license": "MIT", + "engines": { + "node": ">= 18" + } + }, + "node_modules/@sentry/browser": { + "version": "10.56.0", + "resolved": "https://registry.npmjs.org/@sentry/browser/-/browser-10.56.0.tgz", + "integrity": "sha512-80X3NmsGB6tLmfzXYdjzWWdVAdL5CRukGKLcRWIcNhgGjtskOmnzaGb93egEZGI5bUTbtONJ0oyscQ3Z9yoAtQ==", + "license": "MIT", + "dependencies": { + "@sentry-internal/browser-utils": "10.56.0", + "@sentry-internal/feedback": "10.56.0", + "@sentry-internal/replay": "10.56.0", + "@sentry-internal/replay-canvas": "10.56.0", + "@sentry/core": "10.56.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/bundler-plugin-core": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@sentry/bundler-plugin-core/-/bundler-plugin-core-5.3.0.tgz", + "integrity": "sha512-L5T60sWdAI3qWwdg3Ptwek/0TY59PERrxyqp4XMUkroayQvGd9r5dIW9Q1kSeXX9iJ442nXbFZKAOyCKV4Z13Q==", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.18.5", + "@sentry/babel-plugin-component-annotate": "5.3.0", + "@sentry/cli": "^2.58.5", + "dotenv": "^16.3.1", + "find-up": "^5.0.0", + "glob": "^13.0.6", + "magic-string": "~0.30.8" + }, + "engines": { + "node": ">= 18" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/balanced-match": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", + "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "license": "MIT", + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/brace-expansion": { + "version": "5.0.6", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.6.tgz", + "integrity": "sha512-kLpxurY4Z4r9sgMsyG0Z9uzsBlgiU/EFKhj/h91/8yHu0edo7XuixOIH3VcJ8kkxs6/jPzoI6U9Vj3WqbMQ94g==", + "license": "MIT", + "dependencies": { + "balanced-match": "^4.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/dotenv": { + "version": "16.6.1", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", + "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://dotenvx.com" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/glob": { + "version": "13.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-13.0.6.tgz", + "integrity": "sha512-Wjlyrolmm8uDpm/ogGyXZXb1Z+Ca2B8NbJwqBVg0axK9GbBeoS7yGV6vjXnYdGm6X53iehEuxxbyiKp8QmN4Vw==", + "license": "BlueOak-1.0.0", + "dependencies": { + "minimatch": "^10.2.2", + "minipass": "^7.1.3", + "path-scurry": "^2.0.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/lru-cache": { + "version": "11.5.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.5.1.tgz", + "integrity": "sha512-RPimw/7aMdv2oqRrxKwvZXcPfwBrn/JZ2xYcY9Hus/6LaS3VOAKVWKWgNLCFSiOm1ESXinjsDlidVU7JlnCN2A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": "20 || >=22" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/minimatch": { + "version": "10.2.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.2.5.tgz", + "integrity": "sha512-MULkVLfKGYDFYejP07QOurDLLQpcjk7Fw+7jXS2R2czRQzR56yHRveU5NDJEOviH+hETZKSkIk5c+T23GjFUMg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "brace-expansion": "^5.0.5" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/minipass": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.3.tgz", + "integrity": "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==", + "license": "BlueOak-1.0.0", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@sentry/bundler-plugin-core/node_modules/path-scurry": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.2.tgz", + "integrity": "sha512-3O/iVVsJAPsOnpwWIeD+d6z/7PmqApyQePUtCndjatj/9I5LylHvt5qluFaBT3I5h3r1ejfR056c+FCv+NnNXg==", + "license": "BlueOak-1.0.0", + "dependencies": { + "lru-cache": "^11.0.0", + "minipass": "^7.1.2" + }, + "engines": { + "node": "18 || 20 || >=22" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@sentry/cli": { + "version": "2.58.6", + "resolved": "https://registry.npmjs.org/@sentry/cli/-/cli-2.58.6.tgz", + "integrity": "sha512-baBcNPLLfUi9WuL+Tpri9BFaAdvugZIKelC5X0tt0Zdy+K0K+PCVSrnNmwMWU/HyaF/SEv6b6UHnXIdqanBlcg==", + "hasInstallScript": true, + "license": "FSL-1.1-MIT", + "dependencies": { + "https-proxy-agent": "^5.0.0", + "node-fetch": "^2.6.7", + "progress": "^2.0.3", + "proxy-from-env": "^1.1.0", + "which": "^2.0.2" + }, + "bin": { + "sentry-cli": "bin/sentry-cli" + }, + "engines": { + "node": ">= 10" + }, + "optionalDependencies": { + "@sentry/cli-darwin": "2.58.6", + "@sentry/cli-linux-arm": "2.58.6", + "@sentry/cli-linux-arm64": "2.58.6", + "@sentry/cli-linux-i686": "2.58.6", + "@sentry/cli-linux-x64": "2.58.6", + "@sentry/cli-win32-arm64": "2.58.6", + "@sentry/cli-win32-i686": "2.58.6", + "@sentry/cli-win32-x64": "2.58.6" + } + }, + "node_modules/@sentry/cli-darwin": { + "version": "2.58.6", + "resolved": "https://registry.npmjs.org/@sentry/cli-darwin/-/cli-darwin-2.58.6.tgz", + "integrity": "sha512-udAVvcyfNa0R+95GvPz/+43/N3TC0TYKdkQ7D7jhPSzbcMc7l2fxRNN5yB3UpCA5fWFnW4toeaqwDBhb/Wh3LA==", + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm": { + "version": "2.58.6", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm/-/cli-linux-arm-2.58.6.tgz", + "integrity": "sha512-pD0LAt5PcUzAinBwvDqc66x9+2CabHEv486yP0gRjWO7SakbaxmfVq/EXd8VLq/Tzi39LAu422UYK1lpW3MILw==", + "cpu": [ + "arm" + ], + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-arm64": { + "version": "2.58.6", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-arm64/-/cli-linux-arm64-2.58.6.tgz", + "integrity": "sha512-q8mEcNNmeXMy5i+jWT30TVpH7LcP4HD21CD5XRSPAd/a912HF6EpK0ybf/1USO14WOhoXbAGi9txwaWabSe33g==", + "cpu": [ + "arm64" + ], + "license": "FSL-1.1-MIT", + "optional": true, + "os": [ + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli-linux-i686": { + "version": "2.58.6", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-i686/-/cli-linux-i686-2.58.6.tgz", + "integrity": "sha512-q8vNJi1eOV/4vxAFWBsEwLHoSYapaZHIf4j76KJGJXFKTkEbsjCOOsKbwUIBTQQhRgV4DFWh3ryfsPS/que4Kg==", "cpu": [ - "x64" + "x86", + "ia32" ], - "license": "MIT", + "license": "FSL-1.1-MIT", "optional": true, "os": [ - "linux" - ] + "linux", + "freebsd", + "android" + ], + "engines": { + "node": ">=10" + } }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.52.3.tgz", - "integrity": "sha512-BCFkJjgk+WFzP+tcSMXq77ymAPIxsX9lFJWs+2JzuZTLtksJ2o5hvgTdIcZ5+oKzUDMwI0PfWzRBYAydAHF2Mw==", + "node_modules/@sentry/cli-linux-x64": { + "version": "2.58.6", + "resolved": "https://registry.npmjs.org/@sentry/cli-linux-x64/-/cli-linux-x64-2.58.6.tgz", + "integrity": "sha512-DZu956Mhi3ZRjTBe1WdbGV46ldVbA8d2rgp/fh51GsI25zjBHah4wZnPTSzpc+YqxU6pJpg579B/r3jrIK530Q==", "cpu": [ "x64" ], - "license": "MIT", + "license": "FSL-1.1-MIT", "optional": true, "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-openharmony-arm64": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.52.3.tgz", - "integrity": "sha512-KTD/EqjZF3yvRaWUJdD1cW+IQBk4fbQaHYJUmP8N4XoKFZilVL8cobFSTDnjTtxWJQ3JYaMgF4nObY/+nYkumA==", - "cpu": [ - "arm64" + "linux", + "freebsd", + "android" ], - "license": "MIT", - "optional": true, - "os": [ - "openharmony" - ] + "engines": { + "node": ">=10" + } }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.52.3.tgz", - "integrity": "sha512-+zteHZdoUYLkyYKObGHieibUFLbttX2r+58l27XZauq0tcWYYuKUwY2wjeCN9oK1Um2YgH2ibd6cnX/wFD7DuA==", + "node_modules/@sentry/cli-win32-arm64": { + "version": "2.58.6", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-arm64/-/cli-win32-arm64-2.58.6.tgz", + "integrity": "sha512-nj0Ff/kmAB73EPDhR8B4O9r+NUHK5GkPCkGWC+kXVemqAJWL5jcJ5KdxG0l/S0z6RoEoltID8/43/B+TaMlT7A==", "cpu": [ "arm64" ], - "license": "MIT", + "license": "FSL-1.1-MIT", "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=10" + } }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.52.3.tgz", - "integrity": "sha512-of1iHkTQSo3kr6dTIRX6t81uj/c/b15HXVsPcEElN5sS859qHrOepM5p9G41Hah+CTqSh2r8Bm56dL2z9UQQ7g==", + "node_modules/@sentry/cli-win32-i686": { + "version": "2.58.6", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-i686/-/cli-win32-i686-2.58.6.tgz", + "integrity": "sha512-WNZiDzPbgsEMQWq4avsQ391v/xWKJDIWWWo9GYl+N/w5qcYKkoDW7wQG7T9FasI6ENn68phChTOAPXXxbfAdOg==", "cpu": [ + "x86", "ia32" ], - "license": "MIT", + "license": "FSL-1.1-MIT", "optional": true, "os": [ "win32" - ] + ], + "engines": { + "node": ">=10" + } }, - "node_modules/@rollup/rollup-win32-x64-gnu": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.52.3.tgz", - "integrity": "sha512-s0hybmlHb56mWVZQj8ra9048/WZTPLILKxcvcq+8awSZmyiSUZjjem1AhU3Tf4ZKpYhK4mg36HtHDOe8QJS5PQ==", + "node_modules/@sentry/cli-win32-x64": { + "version": "2.58.6", + "resolved": "https://registry.npmjs.org/@sentry/cli-win32-x64/-/cli-win32-x64-2.58.6.tgz", + "integrity": "sha512-R35WJ17oF4D2eqI1DR2sQQqr0fjRTt5xoP16WrTu91XM2lndRMFsnjh+/GttbxapLCBNlrjzia99MJ0PZHZpgA==", "cpu": [ "x64" ], - "license": "MIT", + "license": "FSL-1.1-MIT", "optional": true, "os": [ "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.52.3.tgz", - "integrity": "sha512-zGIbEVVXVtauFgl3MRwGWEN36P5ZGenHRMgNw88X5wEhEBpq0XrMEZwOn07+ICrwM17XO5xfMZqh0OldCH5VTA==", - "cpu": [ - "x64" ], + "engines": { + "node": ">=10" + } + }, + "node_modules/@sentry/cli/node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", "license": "MIT", - "optional": true, - "os": [ - "win32" - ] + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/@sentry/cli/node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@sentry/cloudflare": { + "version": "10.56.0", + "resolved": "https://registry.npmjs.org/@sentry/cloudflare/-/cloudflare-10.56.0.tgz", + "integrity": "sha512-4PH6joEJbS2+f0yWSatE/vPfE4sbtDQxdPDcsiQ8642nEH8WxKIWWPgRknfLRClmShxzQpwDXJZRJc3rcm4QtQ==", + "license": "MIT", + "dependencies": { + "@opentelemetry/api": "^1.9.1", + "@sentry/core": "10.56.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.x" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + } + } + }, + "node_modules/@sentry/core": { + "version": "10.56.0", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-10.56.0.tgz", + "integrity": "sha512-L+u1dIz5SANrmST5jhIwETtt4apILgKrylv12X4hKJU0PvZl+NorjeV/ty3MwzpKQPg6b6q6qMOSLc1rLpy3iQ==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/hono": { + "version": "10.56.0", + "resolved": "https://registry.npmjs.org/@sentry/hono/-/hono-10.56.0.tgz", + "integrity": "sha512-laMFRd+3Z8Oc9jZEkI6n5GUK0sCgep/9bmeQqgtQbRQzHAibmejxd8ZUr2kaKVtqrNOVmLAdxRB/hizyR1tmeQ==", + "license": "MIT", + "dependencies": { + "@opentelemetry/api": "^1.9.1", + "@sentry/core": "10.56.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@cloudflare/workers-types": "^4.x", + "@sentry/bun": "10.56.0", + "@sentry/cloudflare": "10.56.0", + "@sentry/node": "10.56.0", + "hono": "^4.x" + }, + "peerDependenciesMeta": { + "@cloudflare/workers-types": { + "optional": true + }, + "@sentry/bun": { + "optional": true + }, + "@sentry/cloudflare": { + "optional": true + }, + "@sentry/node": { + "optional": true + } + } + }, + "node_modules/@sentry/nextjs": { + "version": "10.56.0", + "resolved": "https://registry.npmjs.org/@sentry/nextjs/-/nextjs-10.56.0.tgz", + "integrity": "sha512-63zg6UawJwW4pE+rpVj+pqy08TsaQUEfYXLITNGBmPdk4ZO7mrosYeMZ+efI1LlCmaEu0/78M/kvzPIdk33SYA==", + "license": "MIT", + "dependencies": { + "@opentelemetry/api": "^1.9.1", + "@opentelemetry/semantic-conventions": "^1.40.0", + "@rollup/plugin-commonjs": "28.0.1", + "@sentry-internal/browser-utils": "10.56.0", + "@sentry/bundler-plugin-core": "^5.3.0", + "@sentry/core": "10.56.0", + "@sentry/node": "10.56.0", + "@sentry/opentelemetry": "10.56.0", + "@sentry/react": "10.56.0", + "@sentry/vercel-edge": "10.56.0", + "@sentry/webpack-plugin": "^5.3.0", + "rollup": "^4.60.3", + "stacktrace-parser": "^0.1.11" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "next": "^13.2.0 || ^14.0 || ^15.0.0-rc.0 || ^16.0.0-0" + } + }, + "node_modules/@sentry/node": { + "version": "10.56.0", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-10.56.0.tgz", + "integrity": "sha512-qvgtXHkcR4CH3fh0VEVyw4Ysc6MMiAnm727NdTTm0yU5e53erCeo2521+yfJkqmRTGiOSgwA7B5Bs+ot9j0vFQ==", + "license": "MIT", + "dependencies": { + "@opentelemetry/api": "^1.9.1", + "@opentelemetry/core": "^2.6.1", + "@opentelemetry/instrumentation": "^0.214.0", + "@opentelemetry/sdk-trace-base": "^2.6.1", + "@opentelemetry/semantic-conventions": "^1.40.0", + "@sentry-internal/server-utils": "10.56.0", + "@sentry/core": "10.56.0", + "@sentry/node-core": "10.56.0", + "@sentry/opentelemetry": "10.56.0", + "import-in-the-middle": "^3.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/node-core": { + "version": "10.56.0", + "resolved": "https://registry.npmjs.org/@sentry/node-core/-/node-core-10.56.0.tgz", + "integrity": "sha512-61lD2Wjtv5Lw2F3lJarcD0ORjR4GlVxrEd6w6Of/uF3DH73dD6K3n/3wXEeCIRfV/kgiCFIrCIq76nz0LVgE5g==", + "license": "MIT", + "dependencies": { + "@sentry/core": "10.56.0", + "@sentry/opentelemetry": "10.56.0", + "import-in-the-middle": "^3.0.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^1.30.1 || ^2.1.0", + "@opentelemetry/exporter-trace-otlp-http": ">=0.57.0 <1", + "@opentelemetry/instrumentation": ">=0.57.1 <1", + "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0", + "@opentelemetry/semantic-conventions": "^1.39.0" + }, + "peerDependenciesMeta": { + "@opentelemetry/api": { + "optional": true + }, + "@opentelemetry/core": { + "optional": true + }, + "@opentelemetry/exporter-trace-otlp-http": { + "optional": true + }, + "@opentelemetry/instrumentation": { + "optional": true + }, + "@opentelemetry/sdk-trace-base": { + "optional": true + }, + "@opentelemetry/semantic-conventions": { + "optional": true + } + } + }, + "node_modules/@sentry/opentelemetry": { + "version": "10.56.0", + "resolved": "https://registry.npmjs.org/@sentry/opentelemetry/-/opentelemetry-10.56.0.tgz", + "integrity": "sha512-PtMudApHMHvttjos3b7JZ2gJ+nstHAOYE3vKPYB5o0WQO95ldiaYnpLKMCRIGZWF3Dk7ynrqqnBpn8LZLt+Mrg==", + "license": "MIT", + "dependencies": { + "@sentry/core": "10.56.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@opentelemetry/api": "^1.9.0", + "@opentelemetry/core": "^1.30.1 || ^2.1.0", + "@opentelemetry/sdk-trace-base": "^1.30.1 || ^2.1.0", + "@opentelemetry/semantic-conventions": "^1.39.0" + } + }, + "node_modules/@sentry/react": { + "version": "10.56.0", + "resolved": "https://registry.npmjs.org/@sentry/react/-/react-10.56.0.tgz", + "integrity": "sha512-HfPLyvnrydfyjRXw9Q0GMzj7w2YtEwuC9z5RrPUfarA2qpA0/J8cfGLzyFX2v0jBmA/kkj6J1uBUoSVhCTxFHg==", + "license": "MIT", + "dependencies": { + "@sentry/browser": "10.56.0", + "@sentry/core": "10.56.0" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "react": "^16.14.0 || 17.x || 18.x || 19.x" + } + }, + "node_modules/@sentry/vercel-edge": { + "version": "10.56.0", + "resolved": "https://registry.npmjs.org/@sentry/vercel-edge/-/vercel-edge-10.56.0.tgz", + "integrity": "sha512-2e5rtVjLpIVYKssFcTuKsNWYJeLAnNsQCcq7Mscw1rQal5UdBgxwclw7K2SN+QHDZlKradRBdhwOU0svENOnQw==", + "license": "MIT", + "dependencies": { + "@opentelemetry/api": "^1.9.1", + "@opentelemetry/resources": "^2.6.1", + "@sentry/core": "10.56.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@sentry/webpack-plugin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@sentry/webpack-plugin/-/webpack-plugin-5.3.0.tgz", + "integrity": "sha512-i3OQUrS0FZlXLgq57RIKDp+vHHzuvYKPCKewAPXULWKMsBXFGhP6veGRQ+6To/pmZkkXjEX5ofVNDy9C3jEPKQ==", + "license": "MIT", + "dependencies": { + "@sentry/bundler-plugin-core": "5.3.0" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "webpack": ">=5.0.0" + } }, "node_modules/@sindresorhus/is": { "version": "4.6.0", @@ -8129,9 +8999,9 @@ } }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz", + "integrity": "sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg==", "license": "MIT" }, "node_modules/@types/geojson": { @@ -8646,6 +9516,15 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, "node_modules/acorn-import-phases": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", @@ -9379,6 +10258,12 @@ "node": ">=8" } }, + "node_modules/cjs-module-lexer": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.2.0.tgz", + "integrity": "sha512-4bHTS2YuzUvtoLjdy+98ykbNB5jS0+07EvFNXerqZQJ89F7DI6ET7OQo/HJuW6K0aVsKA9hj9/RVb2kQVOrPDQ==", + "license": "MIT" + }, "node_modules/cli-cursor": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-5.0.0.tgz", @@ -9525,6 +10410,12 @@ "node": ">=4.0.0" } }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", + "license": "MIT" + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -11462,6 +12353,21 @@ "node": ">= 4" } }, + "node_modules/import-in-the-middle": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/import-in-the-middle/-/import-in-the-middle-3.0.2.tgz", + "integrity": "sha512-LGLYRl0A2gtyUJb2WDliBHmk6TtlHwdDjxonacZ8QrEs/ZW+YDgNv2QAfjRQWpS8HqvNcq6GGnN6jrOa5FysDQ==", + "license": "Apache-2.0", + "dependencies": { + "acorn": "^8.15.0", + "acorn-import-attributes": "^1.9.5", + "cjs-module-lexer": "^2.2.0", + "module-details-from-path": "^1.0.4" + }, + "engines": { + "node": ">=18" + } + }, "node_modules/indent-string": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", @@ -11826,6 +12732,15 @@ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", "license": "MIT" }, + "node_modules/is-reference": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-1.2.1.tgz", + "integrity": "sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -12759,7 +13674,6 @@ "version": "0.30.21", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" @@ -13066,6 +13980,12 @@ "obliterator": "^1.6.1" } }, + "node_modules/module-details-from-path": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/module-details-from-path/-/module-details-from-path-1.0.4.tgz", + "integrity": "sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==", + "license": "MIT" + }, "node_modules/motion": { "version": "12.40.0", "resolved": "https://registry.npmjs.org/motion/-/motion-12.40.0.tgz", @@ -14045,6 +14965,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/protocol-buffers-schema": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", @@ -14064,6 +14993,12 @@ "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, "node_modules/pump": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", @@ -14461,6 +15396,19 @@ "node": ">=0.10.0" } }, + "node_modules/require-in-the-middle": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/require-in-the-middle/-/require-in-the-middle-8.0.1.tgz", + "integrity": "sha512-QT7FVMXfWOYFbeRBF6nu+I6tr2Tf3u0q8RIEjNob/heKY/nh7drD/k7eeMFmSQgnTtCzLDcCu/XEnpW2wk4xCQ==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.5", + "module-details-from-path": "^1.0.3" + }, + "engines": { + "node": ">=9.3.0 || >=8.10.0 <9.0.0" + } + }, "node_modules/resolve": { "version": "1.22.10", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", @@ -14575,12 +15523,12 @@ "license": "Unlicense" }, "node_modules/rollup": { - "version": "4.52.3", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.52.3.tgz", - "integrity": "sha512-RIDh866U8agLgiIcdpB+COKnlCreHJLfIhWC3LVflku5YHfpnsIKigRZeFfMfCc4dVcqNVfQQ5gO/afOck064A==", + "version": "4.61.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.61.1.tgz", + "integrity": "sha512-I4KW6iuRpuu2uHBLraZ1wNZe0DP7lnRha+VJ9tNaYVaVgKhW0aI3h4RYnoRPeql0flHm/Co55b7snEDcOfOJrA==", "license": "MIT", "dependencies": { - "@types/estree": "1.0.8" + "@types/estree": "1.0.9" }, "bin": { "rollup": "dist/bin/rollup" @@ -14590,28 +15538,31 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.52.3", - "@rollup/rollup-android-arm64": "4.52.3", - "@rollup/rollup-darwin-arm64": "4.52.3", - "@rollup/rollup-darwin-x64": "4.52.3", - "@rollup/rollup-freebsd-arm64": "4.52.3", - "@rollup/rollup-freebsd-x64": "4.52.3", - "@rollup/rollup-linux-arm-gnueabihf": "4.52.3", - "@rollup/rollup-linux-arm-musleabihf": "4.52.3", - "@rollup/rollup-linux-arm64-gnu": "4.52.3", - "@rollup/rollup-linux-arm64-musl": "4.52.3", - "@rollup/rollup-linux-loong64-gnu": "4.52.3", - "@rollup/rollup-linux-ppc64-gnu": "4.52.3", - "@rollup/rollup-linux-riscv64-gnu": "4.52.3", - "@rollup/rollup-linux-riscv64-musl": "4.52.3", - "@rollup/rollup-linux-s390x-gnu": "4.52.3", - "@rollup/rollup-linux-x64-gnu": "4.52.3", - "@rollup/rollup-linux-x64-musl": "4.52.3", - "@rollup/rollup-openharmony-arm64": "4.52.3", - "@rollup/rollup-win32-arm64-msvc": "4.52.3", - "@rollup/rollup-win32-ia32-msvc": "4.52.3", - "@rollup/rollup-win32-x64-gnu": "4.52.3", - "@rollup/rollup-win32-x64-msvc": "4.52.3", + "@rollup/rollup-android-arm-eabi": "4.61.1", + "@rollup/rollup-android-arm64": "4.61.1", + "@rollup/rollup-darwin-arm64": "4.61.1", + "@rollup/rollup-darwin-x64": "4.61.1", + "@rollup/rollup-freebsd-arm64": "4.61.1", + "@rollup/rollup-freebsd-x64": "4.61.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.61.1", + "@rollup/rollup-linux-arm-musleabihf": "4.61.1", + "@rollup/rollup-linux-arm64-gnu": "4.61.1", + "@rollup/rollup-linux-arm64-musl": "4.61.1", + "@rollup/rollup-linux-loong64-gnu": "4.61.1", + "@rollup/rollup-linux-loong64-musl": "4.61.1", + "@rollup/rollup-linux-ppc64-gnu": "4.61.1", + "@rollup/rollup-linux-ppc64-musl": "4.61.1", + "@rollup/rollup-linux-riscv64-gnu": "4.61.1", + "@rollup/rollup-linux-riscv64-musl": "4.61.1", + "@rollup/rollup-linux-s390x-gnu": "4.61.1", + "@rollup/rollup-linux-x64-gnu": "4.61.1", + "@rollup/rollup-linux-x64-musl": "4.61.1", + "@rollup/rollup-openbsd-x64": "4.61.1", + "@rollup/rollup-openharmony-arm64": "4.61.1", + "@rollup/rollup-win32-arm64-msvc": "4.61.1", + "@rollup/rollup-win32-ia32-msvc": "4.61.1", + "@rollup/rollup-win32-x64-gnu": "4.61.1", + "@rollup/rollup-win32-x64-msvc": "4.61.1", "fsevents": "~2.3.2" } }, @@ -15254,6 +16205,27 @@ "dev": true, "license": "MIT" }, + "node_modules/stacktrace-parser": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/stacktrace-parser/-/stacktrace-parser-0.1.11.tgz", + "integrity": "sha512-WjlahMgHmCJpqzU8bIBy4qtsZdU9lRlcZE3Lvyej6t4tuOuv1vk57OW3MBrj6hXBFx/nNoC9MPMTcr5YA7NQbg==", + "license": "MIT", + "dependencies": { + "type-fest": "^0.7.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/stacktrace-parser/node_modules/type-fest": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.7.1.tgz", + "integrity": "sha512-Ne2YiiGN8bmrmJJEuTWTLJR32nh/JdL1+PSicowtNb0WFpn59GK8/lfD61bVtzguz7b3PBt74nxpv/Pw5po5Rg==", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, "node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", @@ -18055,6 +19027,18 @@ "node": "^20.19.0 || ^22.12.0 || >=23" } }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/youch": { "version": "4.1.0-beta.10", "resolved": "https://registry.npmjs.org/youch/-/youch-4.1.0-beta.10.tgz",