From 0da9f2098e55488d9d9db10d04113db7dac9629b Mon Sep 17 00:00:00 2001 From: DIYgod Date: Wed, 18 Feb 2026 23:16:00 +0800 Subject: [PATCH] feat: migrate desktop/mobile error tracking to posthog (#4858) * feat: migrate desktop and mobile error tracking to PostHog * fix(mobile): remove unsupported tab bar minimize API * Revert "fix(mobile): remove unsupported tab bar minimize API" This reverts commit e234dda51257dc6810f0f78e06ee918adf2214b0. --- apps/desktop/configs/vite.render.config.ts | 34 - apps/desktop/layer/main/package.json | 1 - .../layer/main/src/before-bootstrap.ts | 8 - apps/desktop/layer/main/src/sentry.ts | 41 - apps/desktop/layer/renderer/package.json | 2 +- .../components/common/AppErrorBoundary.tsx | 4 +- .../src/components/common/ErrorBoundary.tsx | 55 + .../src/components/common/ErrorElement.tsx | 7 +- .../src/components/common/NotFound.tsx | 3 +- .../markdown/renderers/BlockErrorBoundary.tsx | 10 +- .../src/components/ui/media/Media.tsx | 2 +- .../renderer/src/initialize/analytics.ts | 5 + .../layer/renderer/src/initialize/helper.ts | 6 +- .../layer/renderer/src/initialize/index.ts | 2 - .../renderer/src/initialize/sentry.config.ts | 83 -- .../layer/renderer/src/initialize/sentry.ts | 32 - apps/desktop/layer/renderer/src/lib/issues.ts | 2 +- .../ai-chat/components/3d-models/AISpline.ts | 3 +- .../components/layouts/AIErrorFallback.tsx | 2 +- .../components/layouts/ChatInterface.tsx | 2 +- .../components/message/AIMessageParts.tsx | 2 +- .../entry-content/EntryContentForPreview.tsx | 2 +- .../entry-content/EntryRenderError.tsx | 2 +- .../components/layouts/ArticleLayout.tsx | 2 +- apps/desktop/layer/renderer/src/router.tsx | 6 +- .../desktop/layer/renderer/src/router.web.tsx | 6 +- apps/desktop/package.json | 1 - apps/desktop/vite.config.ts | 2 +- apps/mobile/app.config.ts | 8 - .../mobile/ios/Folo.xcodeproj/project.pbxproj | 19 +- apps/mobile/ios/sentry.properties | 4 - apps/mobile/metro.config.js | 4 +- apps/mobile/package.json | 1 - .../src/components/common/ErrorBoundary.tsx | 6 +- apps/mobile/src/initialize/analytics.ts | 21 +- apps/mobile/src/initialize/index.ts | 3 - apps/mobile/src/initialize/sentry.ts | 11 - apps/mobile/src/main.tsx | 3 +- .../internal/tracker/src/adapters/base.ts | 10 + .../internal/tracker/src/adapters/index.ts | 2 +- .../internal/tracker/src/adapters/posthog.ts | 15 +- packages/internal/tracker/src/index.ts | 1 + packages/internal/tracker/src/manager.ts | 27 + patches/@sentry__electron.patch | 46 - pnpm-lock.yaml | 1060 +---------------- pnpm-workspace.yaml | 2 - 46 files changed, 171 insertions(+), 1399 deletions(-) delete mode 100644 apps/desktop/layer/main/src/sentry.ts create mode 100644 apps/desktop/layer/renderer/src/components/common/ErrorBoundary.tsx delete mode 100644 apps/desktop/layer/renderer/src/initialize/sentry.config.ts delete mode 100644 apps/desktop/layer/renderer/src/initialize/sentry.ts delete mode 100644 apps/mobile/ios/sentry.properties delete mode 100644 apps/mobile/src/initialize/sentry.ts delete mode 100644 patches/@sentry__electron.patch diff --git a/apps/desktop/configs/vite.render.config.ts b/apps/desktop/configs/vite.render.config.ts index 286dac8cd..9b3dc821f 100644 --- a/apps/desktop/configs/vite.render.config.ts +++ b/apps/desktop/configs/vite.render.config.ts @@ -1,7 +1,6 @@ import { readFileSync } from "node:fs" import { fileURLToPath } from "node:url" -import { sentryVitePlugin } from "@sentry/vite-plugin" import react from "@vitejs/plugin-react" import { codeInspectorPlugin } from "code-inspector-plugin" import { dirname, resolve } from "pathe" @@ -17,9 +16,6 @@ import i18nCompleteness from "../plugins/vite/utils/i18n-completeness" const pkgDir = resolve(dirname(fileURLToPath(import.meta.url)), "..") const pkg = JSON.parse(readFileSync(resolve(pkgDir, "./package.json"), "utf8")) -const isCI = process.env.CI === "true" || process.env.CI === "1" -const mode = process.argv.find((arg) => arg.startsWith("--mode"))?.split("=")[1] -const isStaging = mode === "staging" const getChangelogFileContent = () => { const { version: pkgVersion } = pkg @@ -76,36 +72,6 @@ export const viteRenderBaseConfig = { }), circularImportRefreshPlugin(), - sentryVitePlugin({ - org: "follow-rg", - project: "follow", - disable: !isCI, - bundleSizeOptimizations: { - excludeDebugStatements: true, - - // Only relevant if you added `replayIntegration` - excludeReplayIframe: true, - excludeReplayShadowDom: true, - excludeReplayWorker: true, - }, - moduleMetadata: { - appVersion: process.env.NODE_ENV === "development" ? "dev" : pkg.version, - electron: false, - }, - sourcemaps: { - filesToDeleteAfterUpload: isStaging - ? [] - : [ - "out/web/assets/*.js.map", - "out/web/vendor/*.js.map", - "out/rn-web/assets/*.js.map", - "out/rn-web/vendor/*.js.map", - "dist/renderer/assets/*.js.map", - "dist/renderer/vendor/*.css.map", - ], - }, - }), - astPlugin, customI18nHmrPlugin(), ], diff --git a/apps/desktop/layer/main/package.json b/apps/desktop/layer/main/package.json index c5169a9a1..4ef8afbe9 100644 --- a/apps/desktop/layer/main/package.json +++ b/apps/desktop/layer/main/package.json @@ -28,7 +28,6 @@ "@follow/shared": "workspace:*", "@follow/utils": "workspace:*", "@openpanel/web": "1.0.7", - "@sentry/electron": "7.2.0", "builder-util-runtime": "9.5.1", "electron-context-menu": "4.1.1", "electron-ipc-decorator": "0.2.0", diff --git a/apps/desktop/layer/main/src/before-bootstrap.ts b/apps/desktop/layer/main/src/before-bootstrap.ts index 797f0ef36..789e5e040 100644 --- a/apps/desktop/layer/main/src/before-bootstrap.ts +++ b/apps/desktop/layer/main/src/before-bootstrap.ts @@ -1,14 +1,8 @@ import { app, protocol } from "electron" import path from "pathe" -import { initializeSentry } from "./sentry" - if (import.meta.env.DEV) app.setPath("userData", path.join(app.getPath("appData"), "Folo(dev)")) protocol.registerSchemesAsPrivileged([ - { - scheme: "sentry-ipc", - privileges: { bypassCSP: true, corsEnabled: true, supportFetchAPI: true, secure: true }, - }, { scheme: "app", privileges: { @@ -19,5 +13,3 @@ protocol.registerSchemesAsPrivileged([ }, }, ]) -// Solve Sentry SDK should be initialized before the Electron app 'ready' event is fired -initializeSentry() diff --git a/apps/desktop/layer/main/src/sentry.ts b/apps/desktop/layer/main/src/sentry.ts deleted file mode 100644 index 78a1651ae..000000000 --- a/apps/desktop/layer/main/src/sentry.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { captureConsoleIntegration, init, setTag } from "@sentry/electron/main" -import { app } from "electron" -import { FetchError } from "ofetch" - -import { DEVICE_ID } from "./constants/system" - -export const initializeSentry = () => { - init({ - dsn: process.env.VITE_SENTRY_DSN, - integrations: [ - captureConsoleIntegration({ - levels: ["error"], - }), - ], - - beforeSend(event, hint) { - const error = hint.originalException - - if ( - error instanceof Error && - (/Network Error/i.test(error.message) || - /Fetch Error/i.test(error.message) || - /XHR Error/i.test(error.message) || - /adsbygoogle/i.test(error.message) || - /Failed to fetch/i.test(error.message) || - error.message.includes("fetch failed")) - ) { - return null - } - - if (error instanceof FetchError) { - return null - } - - return event - }, - }) - setTag("device_id", DEVICE_ID) - setTag("app_version", app.getVersion()) - setTag("build", "electron") -} diff --git a/apps/desktop/layer/renderer/package.json b/apps/desktop/layer/renderer/package.json index fe80b58b8..9e85f7bc6 100644 --- a/apps/desktop/layer/renderer/package.json +++ b/apps/desktop/layer/renderer/package.json @@ -38,7 +38,6 @@ "@radix-ui/react-popover": "1.1.15", "@radix-ui/react-slider": "1.3.6", "@radix-ui/react-slot": "1.2.4", - "@sentry/react": "10.38.0", "@shikijs/transformers": "3.22.0", "@splinetool/react-spline": "4.1.0", "@tanstack/query-sync-storage-persister": "5.90.22", @@ -88,6 +87,7 @@ "react": "19.0.0", "react-blurhash": "0.3.0", "react-dom": "19.0.0", + "react-error-boundary": "6.1.0", "react-fast-compare": "3.2.2", "react-fast-marquee": "1.6.5", "react-google-recaptcha-v3": "1.11.0", diff --git a/apps/desktop/layer/renderer/src/components/common/AppErrorBoundary.tsx b/apps/desktop/layer/renderer/src/components/common/AppErrorBoundary.tsx index dc88723a4..f4af73c41 100644 --- a/apps/desktop/layer/renderer/src/components/common/AppErrorBoundary.tsx +++ b/apps/desktop/layer/renderer/src/components/common/AppErrorBoundary.tsx @@ -1,11 +1,11 @@ -import type { FallbackRender } from "@sentry/react" -import { ErrorBoundary } from "@sentry/react" import type { FC, PropsWithChildren } from "react" import { createElement, Suspense, useCallback } from "react" import { getErrorFallback } from "../errors" import type { ErrorComponentType } from "../errors/enum" import PageErrorFallback from "../errors/PageError" +import type { FallbackRender } from "./ErrorBoundary" +import { ErrorBoundary } from "./ErrorBoundary" export interface AppErrorBoundaryProps extends PropsWithChildren { height?: number | string diff --git a/apps/desktop/layer/renderer/src/components/common/ErrorBoundary.tsx b/apps/desktop/layer/renderer/src/components/common/ErrorBoundary.tsx new file mode 100644 index 000000000..6697c8a63 --- /dev/null +++ b/apps/desktop/layer/renderer/src/components/common/ErrorBoundary.tsx @@ -0,0 +1,55 @@ +import { tracker } from "@follow/tracker" +import type { PropsWithChildren, ReactNode } from "react" +import type { FallbackProps } from "react-error-boundary" +import { ErrorBoundary as ReactErrorBoundary } from "react-error-boundary" + +export type ErrorFallbackProps = Omit & + FallbackProps & { + resetError: () => void + } +export type FallbackRender = (props: ErrorFallbackProps) => ReactNode + +interface ErrorBoundaryProps extends PropsWithChildren { + fallback?: FallbackRender + fallbackRender?: FallbackRender + handled?: boolean + beforeCapture?: (scope: unknown, error: unknown) => unknown +} + +const emptyFallback: FallbackRender = () => null + +export const ErrorBoundary = ({ + children, + fallback, + fallbackRender, + beforeCapture, +}: ErrorBoundaryProps) => { + const renderFallback = fallbackRender ?? fallback ?? emptyFallback + + const handleError = (rawError: unknown, info: { componentStack?: string | null }) => { + const error = rawError instanceof Error ? rawError : new Error(String(rawError)) + + if (beforeCapture?.(info, error) === false) { + return + } + + void tracker.manager.captureException(error, { + source: "desktop_error_boundary", + component_stack: info.componentStack, + }) + } + + return ( + + renderFallback({ + ...props, + resetError: props.resetErrorBoundary, + }) + } + > + {children} + + ) +} diff --git a/apps/desktop/layer/renderer/src/components/common/ErrorElement.tsx b/apps/desktop/layer/renderer/src/components/common/ErrorElement.tsx index e0d2fb3fc..fda2cef9f 100644 --- a/apps/desktop/layer/renderer/src/components/common/ErrorElement.tsx +++ b/apps/desktop/layer/renderer/src/components/common/ErrorElement.tsx @@ -1,5 +1,5 @@ import { Button } from "@follow/components/ui/button/index.js" -import { captureException } from "@sentry/react" +import { tracker } from "@follow/tracker" import { useEffect, useRef } from "react" import { isRouteErrorResponse, useNavigate, useRouteError } from "react-router" import { toast } from "sonner" @@ -27,8 +27,9 @@ export function ErrorElement() { useEffect(() => { console.error("Error handled by React Router default ErrorBoundary:", error) - - captureException(error) + void tracker.manager.captureException(error, { + source: "desktop_router_error_element", + }) }, [error]) const reloadRef = useRef(false) diff --git a/apps/desktop/layer/renderer/src/components/common/NotFound.tsx b/apps/desktop/layer/renderer/src/components/common/NotFound.tsx index a710569df..8b648f561 100644 --- a/apps/desktop/layer/renderer/src/components/common/NotFound.tsx +++ b/apps/desktop/layer/renderer/src/components/common/NotFound.tsx @@ -1,7 +1,6 @@ import { Logo } from "@follow/components/icons/logo.jsx" import { Button } from "@follow/components/ui/button/index.js" import { ELECTRON_BUILD } from "@follow/shared/constants" -import { captureException } from "@sentry/react" import { useEffect } from "react" import type { Location } from "react-router" import { Navigate, useLocation, useNavigate } from "react-router" @@ -33,7 +32,7 @@ export const NotFound = () => { if (!ELECTRON_BUILD) { return } - captureException( + console.error( new AccessNotFoundError( "Electron app got to a 404 page, this should not happen", location.pathname, diff --git a/apps/desktop/layer/renderer/src/components/ui/markdown/renderers/BlockErrorBoundary.tsx b/apps/desktop/layer/renderer/src/components/ui/markdown/renderers/BlockErrorBoundary.tsx index add31c61e..153682f16 100644 --- a/apps/desktop/layer/renderer/src/components/ui/markdown/renderers/BlockErrorBoundary.tsx +++ b/apps/desktop/layer/renderer/src/components/ui/markdown/renderers/BlockErrorBoundary.tsx @@ -1,10 +1,14 @@ -import { captureException } from "@sentry/react" +import { tracker } from "@follow/tracker" import { useEffect } from "react" export const BlockError = (props: { error: any; message: string }) => { useEffect(() => { - captureException(props.error) - }, []) + console.error(props.error) + void tracker.manager.captureException(props.error, { + source: "desktop_markdown_block_error", + message: props.message, + }) + }, [props.error, props.message]) return (
{props.message} diff --git a/apps/desktop/layer/renderer/src/components/ui/media/Media.tsx b/apps/desktop/layer/renderer/src/components/ui/media/Media.tsx index 9cad8181b..ca8b2cd78 100644 --- a/apps/desktop/layer/renderer/src/components/ui/media/Media.tsx +++ b/apps/desktop/layer/renderer/src/components/ui/media/Media.tsx @@ -1,6 +1,5 @@ import { nextFrame } from "@follow/utils/dom" import { cn } from "@follow/utils/utils" -import { ErrorBoundary } from "@sentry/react" import { useForceUpdate } from "motion/react" import type { FC, ImgHTMLAttributes, VideoHTMLAttributes } from "react" import * as React from "react" @@ -11,6 +10,7 @@ import { useEventCallback } from "usehooks-ts" import { useGetImageProxyUrl } from "~/lib/img-proxy" import { saveImageDimensionsToDb } from "~/store/image/db" +import { ErrorBoundary } from "../../common/ErrorBoundary" import { useMediaContainerWidth, usePreviewMedia } from "./hooks" import { MediaInfoRecordContext } from "./MediaInfoRecordContext" import type { VideoPlayerRef } from "./VideoPlayer" diff --git a/apps/desktop/layer/renderer/src/initialize/analytics.ts b/apps/desktop/layer/renderer/src/initialize/analytics.ts index d1c4d7c1d..cd027c7c3 100644 --- a/apps/desktop/layer/renderer/src/initialize/analytics.ts +++ b/apps/desktop/layer/renderer/src/initialize/analytics.ts @@ -30,6 +30,11 @@ export const initAnalytics = async () => { api_host: env.VITE_POSTHOG_HOST, person_profiles: "identified_only", defaults: "2025-05-24", + capture_exceptions: { + capture_unhandled_errors: true, + capture_unhandled_rejections: true, + capture_console_errors: false, + }, }), ) diff --git a/apps/desktop/layer/renderer/src/initialize/helper.ts b/apps/desktop/layer/renderer/src/initialize/helper.ts index da5ea036f..d3d5a1046 100644 --- a/apps/desktop/layer/renderer/src/initialize/helper.ts +++ b/apps/desktop/layer/renderer/src/initialize/helper.ts @@ -1,10 +1,6 @@ import { tracker } from "@follow/tracker" import type { AuthUser } from "@follow-app/client-sdk" -export const setIntegrationIdentify = async (user: AuthUser) => { +export const setIntegrationIdentify = (user: AuthUser) => { tracker.identify(user) - await import("@sentry/react").then(({ setTag }) => { - setTag("user_id", user.id) - setTag("user_name", user.name) - }) } diff --git a/apps/desktop/layer/renderer/src/initialize/index.ts b/apps/desktop/layer/renderer/src/initialize/index.ts index 1e7fd4c95..ff9028aa7 100644 --- a/apps/desktop/layer/renderer/src/initialize/index.ts +++ b/apps/desktop/layer/renderer/src/initialize/index.ts @@ -16,7 +16,6 @@ import { appLog } from "../lib/log" import { initAnalytics } from "./analytics" import { registerHistoryStack } from "./history" import { doMigration } from "./migrates" -import { initSentry } from "./sentry" import { initializeSettings } from "./settings" declare global { @@ -82,7 +81,6 @@ export const initializeApp = async () => { apm("initializeSettings", initializeSettings) - initSentry() await apm("i18n", initI18n) apm("setting sync", () => { diff --git a/apps/desktop/layer/renderer/src/initialize/sentry.config.ts b/apps/desktop/layer/renderer/src/initialize/sentry.config.ts deleted file mode 100644 index e1d902723..000000000 --- a/apps/desktop/layer/renderer/src/initialize/sentry.config.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { env } from "@follow/shared/env.desktop" -import type { BrowserOptions } from "@sentry/react" -import { - captureConsoleIntegration, - eventFiltersIntegration, - httpClientIntegration, - moduleMetadataIntegration, - reactRouterV6BrowserTracingIntegration, -} from "@sentry/react" -import { useEffect } from "react" -import { createRoutesFromChildren, matchRoutes, useLocation, useNavigationType } from "react-router" - -const ERROR_PATTERNS = [ - /Network Error/i, - /Fetch Error/i, - /XHR Error/i, - /adsbygoogle/i, - /Failed to fetch/i, - "FetchError", - "FollowAuthError", - "fetch failed", - "Unable to open cursor", - "Document is not focused.", - "Tracker", - "HTTP Client Error", - // Biz errors - "Chain aborted", - "The database connection is closing", - "NotSupportedError", - "Request failed", - "The user rejected the request", - "TypeError: Failed to fetch", - "ResizeObserver loop completed with undelivered notifications", - "ResizeObserver loop limit exceeded", - "A mutation operation was attempted on a database that did not allow mutations", - "401", - "HTTP Client Error with status code: ", - "DatabaseClosedError", - "SecurityError", - "NotFoundError", - "Large Render Blocking Asset", -] - -export const SentryConfig: BrowserOptions = { - dsn: env.VITE_SENTRY_DSN, - environment: RELEASE_CHANNEL, - integrations: [ - eventFiltersIntegration(), - moduleMetadataIntegration(), - httpClientIntegration(), - reactRouterV6BrowserTracingIntegration({ - useEffect, - useLocation, - useNavigationType, - createRoutesFromChildren, - matchRoutes, - }), - captureConsoleIntegration({ - levels: ["error"], - }), - ], - ignoreErrors: ERROR_PATTERNS, - // Performance Monitoring - tracesSampleRate: 1, // Capture 100% of the transactions - // Set 'tracePropagationTargets' to control for which URLs distributed tracing should be enabled - tracePropagationTargets: ["localhost", env.VITE_API_URL], - // Session Replay - replaysSessionSampleRate: 0.1, // This sets the sample rate at 10%. You may want to change it to 100% while in development and then sample at a lower rate in production. - replaysOnErrorSampleRate: 1, - - beforeSend(event, hint) { - const error = hint.originalException - - if (error instanceof Error && "traceId" in error && error.traceId) { - event.tags = { - ...event.tags, - traceId: error.traceId as string, - } - } - - return event - }, -} diff --git a/apps/desktop/layer/renderer/src/initialize/sentry.ts b/apps/desktop/layer/renderer/src/initialize/sentry.ts deleted file mode 100644 index 4b4983d56..000000000 --- a/apps/desktop/layer/renderer/src/initialize/sentry.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { ELECTRON_BUILD } from "@follow/shared/constants" -import { whoami } from "@follow/store/user/getters" -import { appSessionTraceId } from "@follow/utils/environment" -import { version } from "@pkg" -import { nanoid } from "nanoid" - -import { SentryConfig } from "./sentry.config" - -Object.defineProperty(window.Error.prototype, "traceId", { - get() { - if (!this._traceId) { - this._traceId = nanoid() - } - return this._traceId - }, -}) -export const initSentry = async () => { - if (!window.SENTRY_RELEASE) return - if (import.meta.env.DEV) return - const Sentry = await import("@sentry/react") - Sentry.init(SentryConfig) - - const user = whoami() - if (user) { - Sentry.setTag("user_id", user.id) - Sentry.setTag("user_name", user.name) - } - - Sentry.setTag("session_trace_id", appSessionTraceId) - Sentry.setTag("app_version", version) - Sentry.setTag("build", ELECTRON_BUILD ? "electron" : "web") -} diff --git a/apps/desktop/layer/renderer/src/lib/issues.ts b/apps/desktop/layer/renderer/src/lib/issues.ts index 8a657f7be..885e20cea 100644 --- a/apps/desktop/layer/renderer/src/lib/issues.ts +++ b/apps/desktop/layer/renderer/src/lib/issues.ts @@ -32,7 +32,7 @@ export const getNewIssueUrl = ({ if (title) searchParams.set("title", title) if (error && "traceId" in error && error.traceId) { - nextBody += `\n\n### Sentry Trace ID\n${error.traceId}` + nextBody += `\n\n### Trace ID\n${error.traceId}` } searchParams.set("body", nextBody) diff --git a/apps/desktop/layer/renderer/src/modules/ai-chat/components/3d-models/AISpline.ts b/apps/desktop/layer/renderer/src/modules/ai-chat/components/3d-models/AISpline.ts index bc77396ec..e1f4bca9e 100644 --- a/apps/desktop/layer/renderer/src/modules/ai-chat/components/3d-models/AISpline.ts +++ b/apps/desktop/layer/renderer/src/modules/ai-chat/components/3d-models/AISpline.ts @@ -1,7 +1,8 @@ import { cn } from "@follow/utils" -import { ErrorBoundary } from "@sentry/react" import { createElement, lazy, Suspense } from "react" +import { ErrorBoundary } from "~/components/common/ErrorBoundary" + const AISplineLoader = lazy(() => import("./AISplineLoader").then((res) => ({ default: res.AISplineLoader })), ) diff --git a/apps/desktop/layer/renderer/src/modules/ai-chat/components/layouts/AIErrorFallback.tsx b/apps/desktop/layer/renderer/src/modules/ai-chat/components/layouts/AIErrorFallback.tsx index ae3430024..891bd14b4 100644 --- a/apps/desktop/layer/renderer/src/modules/ai-chat/components/layouts/AIErrorFallback.tsx +++ b/apps/desktop/layer/renderer/src/modules/ai-chat/components/layouts/AIErrorFallback.tsx @@ -1,6 +1,6 @@ import { Button } from "@follow/components/ui/button/index.js" -import type { FallbackRender } from "@sentry/react" +import type { FallbackRender } from "~/components/common/ErrorBoundary" import { attachOpenInEditor } from "~/lib/dev" import { FeedbackIssue } from "../../../../components/common/ErrorElement" diff --git a/apps/desktop/layer/renderer/src/modules/ai-chat/components/layouts/ChatInterface.tsx b/apps/desktop/layer/renderer/src/modules/ai-chat/components/layouts/ChatInterface.tsx index 9c239170a..58e0d1a7f 100644 --- a/apps/desktop/layer/renderer/src/modules/ai-chat/components/layouts/ChatInterface.tsx +++ b/apps/desktop/layer/renderer/src/modules/ai-chat/components/layouts/ChatInterface.tsx @@ -11,7 +11,6 @@ import { useUserRole } from "@follow/store/user/hooks" import { tracker } from "@follow/tracker" import { detectIsEditableElement, nextFrame } from "@follow/utils" import type { ConfigResponse } from "@follow-app/client-sdk" -import { ErrorBoundary } from "@sentry/react" import type { EditorState } from "lexical" import { createEditor } from "lexical" import { nanoid } from "nanoid" @@ -21,6 +20,7 @@ import { useEventCallback, useEventListener } from "usehooks-ts" import { useAISettingKey } from "~/atoms/settings/ai" import { useActionLanguage } from "~/atoms/settings/general" +import { ErrorBoundary } from "~/components/common/ErrorBoundary" import { ROUTE_FEED_IN_FOLDER } from "~/constants" import { getRouteParams } from "~/hooks/biz/useRouteParams" import { useRequireLogin } from "~/hooks/common/useRequireLogin" diff --git a/apps/desktop/layer/renderer/src/modules/ai-chat/components/message/AIMessageParts.tsx b/apps/desktop/layer/renderer/src/modules/ai-chat/components/message/AIMessageParts.tsx index d2c777539..e3492336e 100644 --- a/apps/desktop/layer/renderer/src/modules/ai-chat/components/message/AIMessageParts.tsx +++ b/apps/desktop/layer/renderer/src/modules/ai-chat/components/message/AIMessageParts.tsx @@ -1,10 +1,10 @@ import "@xyflow/react/dist/style.css" import { alwaysFalse } from "@follow/utils" -import { ErrorBoundary } from "@sentry/react" import type { ReasoningUIPart, TextUIPart, ToolUIPart } from "ai" import * as React from "react" +import { ErrorBoundary } from "~/components/common/ErrorBoundary" import type { AIDisplayFlowTool, BizUIMessage, BizUITools } from "~/modules/ai-chat/store/types" import { useChatStatus } from "../../store/hooks" diff --git a/apps/desktop/layer/renderer/src/modules/entry-content/EntryContentForPreview.tsx b/apps/desktop/layer/renderer/src/modules/entry-content/EntryContentForPreview.tsx index 466c7b4a9..2aae911c4 100644 --- a/apps/desktop/layer/renderer/src/modules/entry-content/EntryContentForPreview.tsx +++ b/apps/desktop/layer/renderer/src/modules/entry-content/EntryContentForPreview.tsx @@ -6,12 +6,12 @@ import { useIsInbox } from "@follow/store/inbox/hooks" import { thenable } from "@follow/utils" import { stopPropagation } from "@follow/utils/dom" import { clsx } from "@follow/utils/utils" -import { ErrorBoundary } from "@sentry/react" import * as React from "react" import { memo } from "react" import { useEntryIsInReadability } from "~/atoms/readability" import { useUISettingKey } from "~/atoms/settings/ui" +import { ErrorBoundary } from "~/components/common/ErrorBoundary" import { ShadowDOM } from "~/components/common/ShadowDOM" import { useRenderStyle } from "~/hooks/biz/useRenderStyle" import { useRouteParamsSelector } from "~/hooks/biz/useRouteParams" diff --git a/apps/desktop/layer/renderer/src/modules/entry-content/components/entry-content/EntryRenderError.tsx b/apps/desktop/layer/renderer/src/modules/entry-content/components/entry-content/EntryRenderError.tsx index 500adc304..e39deb194 100644 --- a/apps/desktop/layer/renderer/src/modules/entry-content/components/entry-content/EntryRenderError.tsx +++ b/apps/desktop/layer/renderer/src/modules/entry-content/components/entry-content/EntryRenderError.tsx @@ -1,7 +1,7 @@ import { Button } from "@follow/components/ui/button/index.js" -import type { FallbackRender } from "@sentry/react" import { useTranslation } from "react-i18next" +import type { FallbackRender } from "~/components/common/ErrorBoundary" import { getNewIssueUrl } from "~/lib/issues" export const EntryRenderError: FallbackRender = ({ error }) => { diff --git a/apps/desktop/layer/renderer/src/modules/entry-content/components/layouts/ArticleLayout.tsx b/apps/desktop/layer/renderer/src/modules/entry-content/components/layouts/ArticleLayout.tsx index 9896e0911..2ade2e699 100644 --- a/apps/desktop/layer/renderer/src/modules/entry-content/components/layouts/ArticleLayout.tsx +++ b/apps/desktop/layer/renderer/src/modules/entry-content/components/layouts/ArticleLayout.tsx @@ -5,7 +5,6 @@ import { useEntry } from "@follow/store/entry/hooks" import { useFeedById } from "@follow/store/feed/hooks" import { useIsInbox } from "@follow/store/inbox/hooks" import { cn } from "@follow/utils" -import { ErrorBoundary } from "@sentry/react" import { useCallback, useEffect, useMemo, useRef, useState } from "react" import { @@ -15,6 +14,7 @@ import { useAIPanelVisibility, } from "~/atoms/settings/ai" import { useUISettingKey } from "~/atoms/settings/ui" +import { ErrorBoundary } from "~/components/common/ErrorBoundary" import { ShadowDOM } from "~/components/common/ShadowDOM" import type { TocRef } from "~/components/ui/markdown/components/Toc" import { useInPeekModal } from "~/components/ui/modal/inspire/InPeekModal" diff --git a/apps/desktop/layer/renderer/src/router.tsx b/apps/desktop/layer/renderer/src/router.tsx index 80e8bf822..38b59a9c0 100644 --- a/apps/desktop/layer/renderer/src/router.tsx +++ b/apps/desktop/layer/renderer/src/router.tsx @@ -1,5 +1,4 @@ import { IN_ELECTRON } from "@follow/shared/constants" -import { wrapCreateBrowserRouterV7 } from "@sentry/react" import { createBrowserRouter, createHashRouter } from "react-router" import { Component as App } from "./App" @@ -8,11 +7,8 @@ import { NotFound } from "./components/common/NotFound" // @ts-ignore import { routes as tree } from "./generated-routes" -let routerCreator = +const routerCreator = IN_ELECTRON || globalThis["__DEBUG_PROXY__"] ? createHashRouter : createBrowserRouter -if (window.SENTRY_RELEASE) { - routerCreator = wrapCreateBrowserRouterV7(routerCreator) -} export const router = routerCreator([ { diff --git a/apps/desktop/layer/renderer/src/router.web.tsx b/apps/desktop/layer/renderer/src/router.web.tsx index 71dae9901..9c59111f6 100644 --- a/apps/desktop/layer/renderer/src/router.web.tsx +++ b/apps/desktop/layer/renderer/src/router.web.tsx @@ -1,5 +1,4 @@ import { IN_ELECTRON } from "@follow/shared/constants" -import { wrapCreateBrowserRouterV7 } from "@sentry/react" import { createBrowserRouter, createHashRouter } from "react-router" import { ErrorElement } from "./components/common/ErrorElement" @@ -7,11 +6,8 @@ import { NotFound } from "./components/common/NotFound" // @ts-ignore import { routes as tree } from "./generated-routes" -let routerCreator = +const routerCreator = IN_ELECTRON || globalThis["__DEBUG_PROXY__"] ? createHashRouter : createBrowserRouter -if (window.SENTRY_RELEASE) { - routerCreator = wrapCreateBrowserRouterV7(routerCreator) -} export const router = routerCreator([ { diff --git a/apps/desktop/package.json b/apps/desktop/package.json index b5f096a51..85aa9cc57 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -52,7 +52,6 @@ "@follow/shared": "workspace:*", "@follow/utils": "workspace:*", "@pengx17/electron-forge-maker-appimage": "1.2.1", - "@sentry/vite-plugin": "4.9.1", "@types/html-minifier-terser": "7.0.2", "@types/js-yaml": "4.0.9", "@vitejs/plugin-legacy": "7.2.1", diff --git a/apps/desktop/vite.config.ts b/apps/desktop/vite.config.ts index 210e05483..ea4b9f22d 100644 --- a/apps/desktop/vite.config.ts +++ b/apps/desktop/vite.config.ts @@ -285,7 +285,7 @@ export default ({ mode }) => { ], ["tldts"], - ["@sentry/react", "@openpanel/web"], + ["@openpanel/web"], ["zod", "react-hook-form", "@hookform/resolvers"], ]), diff --git a/apps/mobile/app.config.ts b/apps/mobile/app.config.ts index 558eecdb7..8413bbe26 100644 --- a/apps/mobile/app.config.ts +++ b/apps/mobile/app.config.ts @@ -137,14 +137,6 @@ export default ({ config }: ConfigContext): ExpoConfig => { require("./plugins/with-android-manifest-plugin.js"), "expo-secure-store", "@react-native-firebase/app", - [ - "@sentry/react-native/expo", - { - url: "https://sentry.io/", - project: "react-native", - organization: "follow-rg", - }, - ], [ "expo-image-picker", { diff --git a/apps/mobile/ios/Folo.xcodeproj/project.pbxproj b/apps/mobile/ios/Folo.xcodeproj/project.pbxproj index 2e77781b5..19f5238e0 100644 --- a/apps/mobile/ios/Folo.xcodeproj/project.pbxproj +++ b/apps/mobile/ios/Folo.xcodeproj/project.pbxproj @@ -170,7 +170,6 @@ 800E24972A6A228C8D4807E9 /* [CP] Copy Pods Resources */, 6E4ADCBDA5B760296BAE78FA /* [CP] Embed Pods Frameworks */, 8F2D99FDEA6998C9D98BD7E0 /* [CP-User] [RNFB] Core Configuration */, - 3B0B406257C84B7586048134 /* Upload Debug Symbols to Sentry */, ); buildRules = ( ); @@ -243,7 +242,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios absolute | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n# Source .xcode.env.updates if it exists to allow\n# SKIP_BUNDLING to be unset if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.updates\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.updates\"\nfi\n# Source local changes to allow overrides\n# if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n/bin/sh `\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('@sentry/react-native/package.json')) + '/scripts/sentry-xcode.sh'\"` `\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n"; + shellScript = "if [[ -f \"$PODS_ROOT/../.xcode.env\" ]]; then\n source \"$PODS_ROOT/../.xcode.env\"\nfi\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n# The project root by default is one level up from the ios directory\nexport PROJECT_ROOT=\"$PROJECT_DIR\"/..\n\nif [[ \"$CONFIGURATION\" = *Debug* ]]; then\n export SKIP_BUNDLING=1\nfi\nif [[ -z \"$ENTRY_FILE\" ]]; then\n # Set the entry JS file using the bundler's entry resolution.\n export ENTRY_FILE=\"$(\"$NODE_BINARY\" -e \"require('expo/scripts/resolveAppEntry')\" \"$PROJECT_ROOT\" ios absolute | tail -n 1)\"\nfi\n\nif [[ -z \"$CLI_PATH\" ]]; then\n # Use Expo CLI\n export CLI_PATH=\"$(\"$NODE_BINARY\" --print \"require.resolve('@expo/cli', { paths: [require.resolve('expo/package.json')] })\")\"\nfi\nif [[ -z \"$BUNDLE_COMMAND\" ]]; then\n # Default Expo CLI command for bundling\n export BUNDLE_COMMAND=\"export:embed\"\nfi\n\n# Source .xcode.env.updates if it exists to allow\n# SKIP_BUNDLING to be unset if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.updates\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.updates\"\nfi\n# Source local changes to allow overrides\n# if needed\nif [[ -f \"$PODS_ROOT/../.xcode.env.local\" ]]; then\n source \"$PODS_ROOT/../.xcode.env.local\"\nfi\n\n/bin/sh `\"$NODE_BINARY\" --print \"require('path').dirname(require.resolve('react-native/package.json')) + '/scripts/react-native-xcode.sh'\"`\n\n"; }; 08A4A3CD28434E44B6B9DE2E /* [CP] Check Pods Manifest.lock */ = { isa = PBXShellScriptBuildPhase; @@ -267,20 +266,6 @@ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; showEnvVarsInLog = 0; }; - 3B0B406257C84B7586048134 /* Upload Debug Symbols to Sentry */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Upload Debug Symbols to Sentry"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "/bin/sh ../../../node_modules/@sentry/react-native/scripts/sentry-xcode-debug-files.sh\n"; - }; 6E4ADCBDA5B760296BAE78FA /* [CP] Embed Pods Frameworks */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -335,7 +320,6 @@ "${PODS_CONFIGURATION_BUILD_DIR}/React-Core/React-Core_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/React-cxxreact/React-cxxreact_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/SDWebImage/SDWebImage.bundle", - "${PODS_CONFIGURATION_BUILD_DIR}/Sentry/Sentry.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/SnapKit/SnapKit_Privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/boost/boost_privacy.bundle", "${PODS_CONFIGURATION_BUILD_DIR}/expo-dev-launcher/EXDevLauncher.bundle", @@ -374,7 +358,6 @@ "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-Core_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/React-cxxreact_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SDWebImage.bundle", - "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/Sentry.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/SnapKit_Privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/boost_privacy.bundle", "${TARGET_BUILD_DIR}/${UNLOCALIZED_RESOURCES_FOLDER_PATH}/EXDevLauncher.bundle", diff --git a/apps/mobile/ios/sentry.properties b/apps/mobile/ios/sentry.properties deleted file mode 100644 index 1d60fc6ad..000000000 --- a/apps/mobile/ios/sentry.properties +++ /dev/null @@ -1,4 +0,0 @@ -defaults.url=https://sentry.io/ -defaults.org=follow-rg -defaults.project=react-native -# Using SENTRY_AUTH_TOKEN environment variable \ No newline at end of file diff --git a/apps/mobile/metro.config.js b/apps/mobile/metro.config.js index 818f9fa64..b87c18ec0 100644 --- a/apps/mobile/metro.config.js +++ b/apps/mobile/metro.config.js @@ -1,9 +1,9 @@ +const { getDefaultConfig } = require("expo/metro-config") const { withNativeWind } = require("nativewind/metro") const path = require("pathe") const { wrapWithReanimatedMetroConfig } = require("react-native-reanimated/metro-config") -const { getSentryExpoConfig } = require("@sentry/react-native/metro") -const config = getSentryExpoConfig(__dirname, { isCSSEnabled: true }) +const config = getDefaultConfig(__dirname, { isCSSEnabled: true }) const workspaceRoot = path.resolve(__dirname, "../..") config.resolver.sourceExts.push("sql") diff --git a/apps/mobile/package.json b/apps/mobile/package.json index dde6ff611..0d79d1424 100644 --- a/apps/mobile/package.json +++ b/apps/mobile/package.json @@ -43,7 +43,6 @@ "@react-native-masked-view/masked-view": "0.3.2", "@react-native-menu/menu": "2.0.0", "@react-native-picker/picker": "2.11.1", - "@sentry/react-native": "7.2.0", "@shopify/flash-list": "2.0.2", "@tanstack/query-sync-storage-persister": "5.90.22", "@tanstack/react-query": "5.90.21", diff --git a/apps/mobile/src/components/common/ErrorBoundary.tsx b/apps/mobile/src/components/common/ErrorBoundary.tsx index e03a90f51..2011c721d 100644 --- a/apps/mobile/src/components/common/ErrorBoundary.tsx +++ b/apps/mobile/src/components/common/ErrorBoundary.tsx @@ -1,5 +1,5 @@ import { useTypeScriptHappyCallback } from "@follow/hooks" -import { captureException } from "@sentry/react-native" +import { tracker } from "@follow/tracker" import type { FC } from "react" import { createElement, useEffect } from "react" import { ErrorBoundary as ReactErrorBoundary } from "react-error-boundary" @@ -52,8 +52,10 @@ const defaultFallbackRender = ({ error }: { error: Error }) => { } const ErrorReport = ({ error }: { error: Error }) => { useEffect(() => { - captureException(error) console.error(error) + void tracker.manager.captureException(error, { + source: "mobile_error_boundary", + }) }, [error]) return null } diff --git a/apps/mobile/src/initialize/analytics.ts b/apps/mobile/src/initialize/analytics.ts index e8d033796..4e777fcda 100644 --- a/apps/mobile/src/initialize/analytics.ts +++ b/apps/mobile/src/initialize/analytics.ts @@ -10,9 +10,19 @@ import { proxyEnv } from "../lib/proxy-env" export const initAnalytics = async () => { setFirebaseTracker(getAnalytics()) - const user = whoami() - if (user) { - tracker.identify(user as AuthUser) + if (proxyEnv.POSTHOG_KEY) { + setPostHogTracker( + new PostHog(proxyEnv.POSTHOG_KEY, { + host: proxyEnv.POSTHOG_HOST, + errorTracking: { + autocapture: { + uncaughtExceptions: true, + unhandledRejections: true, + console: false, + }, + }, + }), + ) } tracker.manager.appendUserProperties({ @@ -21,8 +31,9 @@ export const initAnalytics = async () => { buildId: nativeBuildVersion, }) - if (proxyEnv.POSTHOG_KEY) { - setPostHogTracker(new PostHog(proxyEnv.POSTHOG_KEY)) + const user = whoami() + if (user) { + tracker.identify(user as AuthUser) } // op.setGlobalProperties({ diff --git a/apps/mobile/src/initialize/index.ts b/apps/mobile/src/initialize/index.ts index bc7d58d1f..e9c957fa4 100644 --- a/apps/mobile/src/initialize/index.ts +++ b/apps/mobile/src/initialize/index.ts @@ -13,7 +13,6 @@ import { initDeviceType } from "./device" import { hydrateQueryClient, hydrateSettings } from "./hydrate" import { migrateDatabase } from "./migration" import { initializePlayer } from "./player" -import { initializeSentry } from "./sentry" /* eslint-disable no-console */ export const initializeApp = async () => { @@ -21,8 +20,6 @@ export const initializeApp = async () => { const now = Date.now() - initializeSentry() - await initDeviceType() await initializeDB() void apm("migrateLegacyApiSession", migrateLegacyApiSession).catch((error) => { diff --git a/apps/mobile/src/initialize/sentry.ts b/apps/mobile/src/initialize/sentry.ts deleted file mode 100644 index c3974521c..000000000 --- a/apps/mobile/src/initialize/sentry.ts +++ /dev/null @@ -1,11 +0,0 @@ -import * as Sentry from "@sentry/react-native" - -export const initializeSentry = () => { - // Unlike Sentry on other platforms, you do not need to import anything to use tracing on React Native - Sentry.init({ - dsn: "https://cbfecd786e09a9481676655a4da88a7e@o4507542488023040.ingest.us.sentry.io/4509926421102593", - // We recommend adjusting this value in production, or using tracesSampler - // for finer control - tracesSampleRate: 1, - }) -} diff --git a/apps/mobile/src/main.tsx b/apps/mobile/src/main.tsx index 31e3d3e92..9dd2a39c2 100644 --- a/apps/mobile/src/main.tsx +++ b/apps/mobile/src/main.tsx @@ -2,7 +2,6 @@ import "./global.css" import "./polyfill" import { apiContext, authClientContext, queryClientContext } from "@follow/store/context" -import * as Sentry from "@sentry/react-native" import { registerRootComponent } from "expo" import { Image } from "expo-image" import { LinearGradient } from "expo-linear-gradient" @@ -45,7 +44,7 @@ enableFreeze(true) initializeApp() registerSitemap() initializeI18n() -registerRootComponent(Sentry.wrap(RootComponent)) +registerRootComponent(RootComponent) function RootComponent() { const { t } = useTranslation() diff --git a/packages/internal/tracker/src/adapters/base.ts b/packages/internal/tracker/src/adapters/base.ts index 9b087c213..41864c70e 100644 --- a/packages/internal/tracker/src/adapters/base.ts +++ b/packages/internal/tracker/src/adapters/base.ts @@ -11,6 +11,11 @@ export type TrackPayload = { properties?: Record } +export type CaptureExceptionPayload = { + error: unknown + properties?: Record +} + export interface TrackerAdapter { /** * Initialize the tracker adapter @@ -22,6 +27,11 @@ export interface TrackerAdapter { */ track: (payload: TrackPayload) => Promise | void + /** + * Capture an exception + */ + captureException?: (payload: CaptureExceptionPayload) => Promise | void + /** * Identify a user */ diff --git a/packages/internal/tracker/src/adapters/index.ts b/packages/internal/tracker/src/adapters/index.ts index 578f50555..0c62ca0c5 100644 --- a/packages/internal/tracker/src/adapters/index.ts +++ b/packages/internal/tracker/src/adapters/index.ts @@ -1,4 +1,4 @@ -export type { IdentifyPayload, TrackerAdapter, TrackPayload } from "./base" +export type { CaptureExceptionPayload, IdentifyPayload, TrackerAdapter, TrackPayload } from "./base" export { FirebaseAdapter, type FirebaseAdapterConfig } from "./firebase" export { OpenPanelAdapter, type OpenPanelAdapterConfig } from "./openpanel" export { PostHogAdapter, type PostHogAdapterConfig } from "./posthog" diff --git a/packages/internal/tracker/src/adapters/posthog.ts b/packages/internal/tracker/src/adapters/posthog.ts index 185647fbb..715f317d3 100644 --- a/packages/internal/tracker/src/adapters/posthog.ts +++ b/packages/internal/tracker/src/adapters/posthog.ts @@ -1,7 +1,7 @@ import type { PostHog } from "posthog-js" import type PostHogReactNative from "posthog-react-native" -import type { IdentifyPayload, TrackerAdapter, TrackPayload } from "./base" +import type { CaptureExceptionPayload, IdentifyPayload, TrackerAdapter, TrackPayload } from "./base" export interface PostHogAdapterConfig { instance: PostHog | PostHogReactNative @@ -31,6 +31,19 @@ export class PostHogAdapter implements TrackerAdapter { } } + async captureException({ error, properties }: CaptureExceptionPayload): Promise { + if (!this.isEnabled()) return + + try { + this.posthogInstance.captureException( + error, + properties as Parameters[1], + ) + } catch (captureError) { + console.error("[PostHog] Failed to capture exception:", captureError) + } + } + async identify(payload: IdentifyPayload): Promise { if (!this.isEnabled()) return diff --git a/packages/internal/tracker/src/index.ts b/packages/internal/tracker/src/index.ts index d74c04b3f..9d38cc0ce 100644 --- a/packages/internal/tracker/src/index.ts +++ b/packages/internal/tracker/src/index.ts @@ -10,6 +10,7 @@ export const setProxyTracker = improvedTrackManager.setProxyTracker.bind(improve export const tracker = new TrackerPoints() export { + type CaptureExceptionPayload, FirebaseAdapter, type FirebaseAdapterConfig, type IdentifyPayload, diff --git a/packages/internal/tracker/src/manager.ts b/packages/internal/tracker/src/manager.ts index e29b671d9..0da737485 100644 --- a/packages/internal/tracker/src/manager.ts +++ b/packages/internal/tracker/src/manager.ts @@ -93,6 +93,33 @@ export class TrackerManager { await this.executeTrackingForAdapters(enabledAdapters, payload) } + /** + * Capture an exception across all enabled adapters + */ + async captureException(error: unknown, properties?: Record): Promise { + const enabledAdapters = this.getEnabledAdapters() + + if (enabledAdapters.length === 0) { + console.warn("[TrackerManager] No enabled adapters found for exception capture") + return + } + + const promises = enabledAdapters.map(async (adapter) => { + if (!adapter.captureException) return + + try { + await Promise.resolve(adapter.captureException({ error, properties })) + } catch (captureError) { + console.error( + `[TrackerManager] Failed to capture exception with adapter "${adapter.getName()}":`, + captureError, + ) + } + }) + + await Promise.allSettled(promises) + } + /** * Identify a user across all enabled adapters */ diff --git a/patches/@sentry__electron.patch b/patches/@sentry__electron.patch deleted file mode 100644 index 463490cd8..000000000 --- a/patches/@sentry__electron.patch +++ /dev/null @@ -1,46 +0,0 @@ -diff --git a/esm/main/ipc.js b/esm/main/ipc.js -index 2fdc06044866a4f4c3420bd8b4a5d2788faa3e4e..7f0250b911871aa12e379d848a6a5b5668bdb282 100644 ---- a/esm/main/ipc.js -+++ b/esm/main/ipc.js -@@ -130,18 +130,6 @@ function configureProtocol(client, ipcUtil, options) { - if (app.isReady()) { - throw new Error("Sentry SDK should be initialized before the Electron app 'ready' event is fired"); - } -- const scheme = { -- scheme: ipcUtil.namespace, -- privileges: { bypassCSP: true, corsEnabled: true, supportFetchAPI: true, secure: true }, -- }; -- protocol.registerSchemesAsPrivileged([scheme]); -- // We Proxy this function so that later user calls to registerSchemesAsPrivileged don't overwrite our custom scheme -- // eslint-disable-next-line @typescript-eslint/unbound-method -- protocol.registerSchemesAsPrivileged = new Proxy(protocol.registerSchemesAsPrivileged, { -- apply: (target, __, args) => { -- target([...args[0], scheme]); -- }, -- }); - const rendererStatusChanged = createRendererEventLoopBlockStatusHandler(client); - app - .whenReady() -diff --git a/main/ipc.js b/main/ipc.js -index 3cdf12e818890effadc0d5188fe104549c846b97..597ea1aabc2314e306864c562d9609541fc3edfe 100644 ---- a/main/ipc.js -+++ b/main/ipc.js -@@ -130,18 +130,6 @@ function configureProtocol(client, ipcUtil, options) { - if (electron.app.isReady()) { - throw new Error("Sentry SDK should be initialized before the Electron app 'ready' event is fired"); - } -- const scheme = { -- scheme: ipcUtil.namespace, -- privileges: { bypassCSP: true, corsEnabled: true, supportFetchAPI: true, secure: true }, -- }; -- electron.protocol.registerSchemesAsPrivileged([scheme]); -- // We Proxy this function so that later user calls to registerSchemesAsPrivileged don't overwrite our custom scheme -- // eslint-disable-next-line @typescript-eslint/unbound-method -- electron.protocol.registerSchemesAsPrivileged = new Proxy(electron.protocol.registerSchemesAsPrivileged, { -- apply: (target, __, args) => { -- target([...args[0], scheme]); -- }, -- }); - const rendererStatusChanged = rendererAnr.createRendererEventLoopBlockStatusHandler(client); - electron.app - .whenReady() diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e59b6bbd2..17d6c9f11 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -49,9 +49,6 @@ patchedDependencies: '@pengx17/electron-forge-maker-appimage': hash: 5b5ab1ba36e8c0d7ffee912ebf29c1a18bc101c9c661ceb1bb0bda3deaf4c667 path: patches/@pengx17__electron-forge-maker-appimage.patch - '@sentry/electron': - hash: c53ad89ecd1e379589255a5f24f183dc3b3779c8cc70629689cc866e69e07738 - path: patches/@sentry__electron.patch daisyui@4.12.24: hash: d393ab1cbfbfcff21dce0796a59c2d8a37e2c6dd634a8ab476cbc67e47b93d9c path: patches/daisyui@4.12.24.patch @@ -228,9 +225,6 @@ importers: '@pengx17/electron-forge-maker-appimage': specifier: 1.2.1 version: 1.2.1(patch_hash=5b5ab1ba36e8c0d7ffee912ebf29c1a18bc101c9c661ceb1bb0bda3deaf4c667)(dmg-builder@24.13.3)(electron-builder-squirrel-windows@24.13.3) - '@sentry/vite-plugin': - specifier: 4.9.1 - version: 4.9.1(encoding@0.1.13) '@types/html-minifier-terser': specifier: 7.0.2 version: 7.0.2 @@ -354,9 +348,6 @@ importers: '@openpanel/web': specifier: 1.0.7 version: 1.0.7 - '@sentry/electron': - specifier: 7.2.0 - version: 7.2.0(patch_hash=c53ad89ecd1e379589255a5f24f183dc3b3779c8cc70629689cc866e69e07738) builder-util-runtime: specifier: 9.5.1 version: 9.5.1 @@ -520,9 +511,6 @@ importers: '@radix-ui/react-slot': specifier: 1.2.4 version: 1.2.4(@types/react@19.1.17)(react@19.1.0) - '@sentry/react': - specifier: 10.38.0 - version: 10.38.0(react@19.1.0) '@shikijs/transformers': specifier: 3.22.0 version: 3.22.0 @@ -670,6 +658,9 @@ importers: react-dom: specifier: 19.1.0 version: 19.1.0(react@19.1.0) + react-error-boundary: + specifier: 6.1.0 + version: 6.1.0(react@19.1.0) react-fast-compare: specifier: 3.2.2 version: 3.2.2 @@ -875,9 +866,6 @@ importers: '@react-native-picker/picker': specifier: 2.11.1 version: 2.11.1(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0)(utf-8-validate@6.0.5))(react@19.1.0) - '@sentry/react-native': - specifier: 7.2.0 - version: 7.2.0(encoding@0.1.13)(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0)(utf-8-validate@6.0.5))(react@19.1.0) '@shopify/flash-list': specifier: 2.0.2 version: 2.0.2(@babel/runtime@7.28.6)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0)(utf-8-validate@6.0.5))(react@19.1.0) @@ -5801,200 +5789,10 @@ packages: '@openpanel/web@1.0.7': resolution: {integrity: sha512-lhZCIjUSy5XCcTyzHisehJkdr2/PPEEpMbc8cKtg/5zqxGhHLWIoOiLDjD357KGaxzHg43QVWPe5YBO+Wpto0A==} - '@opentelemetry/api-logs@0.204.0': - resolution: {integrity: sha512-DqxY8yoAaiBPivoJD4UtgrMS8gEmzZ5lnaxzPojzLVHBGqPxgWm4zcuvcUHZiqQ6kRX2Klel2r9y8cA2HAtqpw==} - engines: {node: '>=8.0.0'} - - '@opentelemetry/api-logs@0.57.2': - resolution: {integrity: sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==} - engines: {node: '>=14'} - '@opentelemetry/api@1.9.0': resolution: {integrity: sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==} engines: {node: '>=8.0.0'} - '@opentelemetry/context-async-hooks@2.1.0': - resolution: {integrity: sha512-zOyetmZppnwTyPrt4S7jMfXiSX9yyfF0hxlA8B5oo2TtKl+/RGCy7fi4DrBfIf3lCPrkKsRBWZZD7RFojK7FDg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/core@2.1.0': - resolution: {integrity: sha512-RMEtHsxJs/GiHHxYT58IY57UXAQTuUnZVco6ymDEqTNlJKTimM4qPUPVe8InNFyBjhHBEAx4k3Q8LtNayBsbUQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.0.0 <1.10.0' - - '@opentelemetry/instrumentation-amqplib@0.51.0': - resolution: {integrity: sha512-XGmjYwjVRktD4agFnWBWQXo9SiYHKBxR6Ag3MLXwtLE4R99N3a08kGKM5SC1qOFKIELcQDGFEFT9ydXMH00Luw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-connect@0.48.0': - resolution: {integrity: sha512-OMjc3SFL4pC16PeK+tDhwP7MRvDPalYCGSvGqUhX5rASkI2H0RuxZHOWElYeXkV0WP+70Gw6JHWac/2Zqwmhdw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-dataloader@0.22.0': - resolution: {integrity: sha512-bXnTcwtngQsI1CvodFkTemrrRSQjAjZxqHVc+CJZTDnidT0T6wt3jkKhnsjU/Kkkc0lacr6VdRpCu2CUWa0OKw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-express@0.53.0': - resolution: {integrity: sha512-r/PBafQmFYRjuxLYEHJ3ze1iBnP2GDA1nXOSS6E02KnYNZAVjj6WcDA1MSthtdAUUK0XnotHvvWM8/qz7DMO5A==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-fs@0.24.0': - resolution: {integrity: sha512-HjIxJ6CBRD770KNVaTdMXIv29Sjz4C1kPCCK5x1Ujpc6SNnLGPqUVyJYZ3LUhhnHAqdbrl83ogVWjCgeT4Q0yw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-generic-pool@0.48.0': - resolution: {integrity: sha512-TLv/On8pufynNR+pUbpkyvuESVASZZKMlqCm4bBImTpXKTpqXaJJ3o/MUDeMlM91rpen+PEv2SeyOKcHCSlgag==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-graphql@0.52.0': - resolution: {integrity: sha512-3fEJ8jOOMwopvldY16KuzHbRhPk8wSsOTSF0v2psmOCGewh6ad+ZbkTx/xyUK9rUdUMWAxRVU0tFpj4Wx1vkPA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-hapi@0.51.0': - resolution: {integrity: sha512-qyf27DaFNL1Qhbo/da+04MSCw982B02FhuOS5/UF+PMhM61CcOiu7fPuXj8TvbqyReQuJFljXE6UirlvoT/62g==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-http@0.204.0': - resolution: {integrity: sha512-1afJYyGRA4OmHTv0FfNTrTAzoEjPQUYgd+8ih/lX0LlZBnGio/O80vxA0lN3knsJPS7FiDrsDrWq25K7oAzbkw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-ioredis@0.52.0': - resolution: {integrity: sha512-rUvlyZwI90HRQPYicxpDGhT8setMrlHKokCtBtZgYxQWRF5RBbG4q0pGtbZvd7kyseuHbFpA3I/5z7M8b/5ywg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-kafkajs@0.14.0': - resolution: {integrity: sha512-kbB5yXS47dTIdO/lfbbXlzhvHFturbux4EpP0+6H78Lk0Bn4QXiZQW7rmZY1xBCY16mNcCb8Yt0mhz85hTnSVA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-knex@0.49.0': - resolution: {integrity: sha512-NKsRRT27fbIYL4Ix+BjjP8h4YveyKc+2gD6DMZbr5R5rUeDqfC8+DTfIt3c3ex3BIc5Vvek4rqHnN7q34ZetLQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-koa@0.52.0': - resolution: {integrity: sha512-JJSBYLDx/mNSy8Ibi/uQixu2rH0bZODJa8/cz04hEhRaiZQoeJ5UrOhO/mS87IdgVsHrnBOsZ6vDu09znupyuA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-lru-memoizer@0.49.0': - resolution: {integrity: sha512-ctXu+O/1HSadAxtjoEg2w307Z5iPyLOMM8IRNwjaKrIpNAthYGSOanChbk1kqY6zU5CrpkPHGdAT6jk8dXiMqw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mongodb@0.57.0': - resolution: {integrity: sha512-KD6Rg0KSHWDkik+qjIOWoksi1xqSpix8TSPfquIK1DTmd9OTFb5PHmMkzJe16TAPVEuElUW8gvgP59cacFcrMQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mongoose@0.51.0': - resolution: {integrity: sha512-gwWaAlhhV2By7XcbyU3DOLMvzsgeaymwP/jktDC+/uPkCmgB61zurwqOQdeiRq9KAf22Y2dtE5ZLXxytJRbEVA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mysql2@0.51.0': - resolution: {integrity: sha512-zT2Wg22Xn43RyfU3NOUmnFtb5zlDI0fKcijCj9AcK9zuLZ4ModgtLXOyBJSSfO+hsOCZSC1v/Fxwj+nZJFdzLQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-mysql@0.50.0': - resolution: {integrity: sha512-duKAvMRI3vq6u9JwzIipY9zHfikN20bX05sL7GjDeLKr2qV0LQ4ADtKST7KStdGcQ+MTN5wghWbbVdLgNcB3rA==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-pg@0.57.0': - resolution: {integrity: sha512-dWLGE+r5lBgm2A8SaaSYDE3OKJ/kwwy5WLyGyzor8PLhUL9VnJRiY6qhp4njwhnljiLtzeffRtG2Mf/YyWLeTw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-redis@0.53.0': - resolution: {integrity: sha512-WUHV8fr+8yo5RmzyU7D5BIE1zwiaNQcTyZPwtxlfr7px6NYYx7IIpSihJK7WA60npWynfxxK1T67RAVF0Gdfjg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-tedious@0.23.0': - resolution: {integrity: sha512-3TMTk/9VtlRonVTaU4tCzbg4YqW+Iq/l5VnN2e5whP6JgEg/PKfrGbqQ+CxQWNLfLaQYIUgEZqAn5gk/inh1uQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation-undici@0.15.0': - resolution: {integrity: sha512-sNFGA/iCDlVkNjzTzPRcudmI11vT/WAfAguRdZY9IspCw02N4WSC72zTuQhSMheh2a1gdeM9my1imnKRvEEvEg==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.7.0 - - '@opentelemetry/instrumentation@0.204.0': - resolution: {integrity: sha512-vV5+WSxktzoMP8JoYWKeopChy6G3HKk4UQ2hESCRDUUTZqQ3+nM3u8noVG0LmNfRWwcFBnbZ71GKC7vaYYdJ1g==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/instrumentation@0.57.2': - resolution: {integrity: sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==} - engines: {node: '>=14'} - peerDependencies: - '@opentelemetry/api': ^1.3.0 - - '@opentelemetry/redis-common@0.38.2': - resolution: {integrity: sha512-1BCcU93iwSRZvDAgwUxC/DV4T/406SkMfxGqu5ojc3AvNI+I9GhV7v0J1HljsczuuhcnFLYqD5VmwVXfCGHzxA==} - engines: {node: ^18.19.0 || >=20.6.0} - - '@opentelemetry/resources@2.1.0': - resolution: {integrity: sha512-1CJjf3LCvoefUOgegxi8h6r4B/wLSzInyhGP2UmIBYNlo4Qk5CZ73e1eEyWmfXvFtm1ybkmfb2DqWvspsYLrWw==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/sdk-trace-base@2.1.0': - resolution: {integrity: sha512-uTX9FBlVQm4S2gVQO1sb5qyBLq/FPjbp+tmGoxu4tIgtYGmBYB44+KX/725RFDe30yBSaA9Ml9fqphe1hbUyLQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': '>=1.3.0 <1.10.0' - - '@opentelemetry/semantic-conventions@1.37.0': - resolution: {integrity: sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==} - engines: {node: '>=14'} - - '@opentelemetry/sql-common@0.41.2': - resolution: {integrity: sha512-4mhWm3Z8z+i508zQJ7r6Xi7y4mmoJpdvH0fZPFRkWrdp5fq7hhZ2HhYokEOLkfqSMgPR4Z9EyB3DBkbKGOqZiQ==} - engines: {node: ^18.19.0 || >=20.6.0} - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@oxc-project/types@0.112.0': resolution: {integrity: sha512-m6RebKHIRsax2iCwVpYW2ErQwa4ywHJrE4sCK3/8JK8ZZAWOKXaRJFl/uP51gaVyyXlaS4+chU1nSCdzYf6QqQ==} @@ -6076,11 +5874,6 @@ packages: peerDependencies: preact: 10.x - '@prisma/instrumentation@6.15.0': - resolution: {integrity: sha512-6TXaH6OmDkMOQvOxwLZ8XS51hU2v4A3vmE2pSijCIiGRJYyNeMcL6nMHQMyYdZRD8wl7LF3Wzc+AMPMV/9Oo7A==} - peerDependencies: - '@opentelemetry/api': ^1.8 - '@protobufjs/aspromise@1.1.2': resolution: {integrity: sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==} @@ -7251,259 +7044,36 @@ packages: '@segment/loosely-validate-event@2.0.0': resolution: {integrity: sha512-ZMCSfztDBqwotkl848ODgVcAmN4OItEWDCkshcKz0/W6gGSQayuuCtWV/MlodFivAZD793d6UgANd6wCXUfrIw==} - '@sentry-internal/browser-utils@10.12.0': - resolution: {integrity: sha512-dozbx389jhKynj0d657FsgbBVOar7pX3mb6GjqCxslXF0VKpZH2Xks0U32RgDY/nK27O+o095IWz7YvjVmPkDw==} - engines: {node: '>=18'} - - '@sentry-internal/browser-utils@10.17.0': - resolution: {integrity: sha512-jXC7dtItZYNGP+K9Lo+3MWaWaGVI6uDIPGB9BAZkZntc/1lGfhMPm7Fo2qb1N1bUP0vOTJ2TmSUA8GNxyxgekQ==} - engines: {node: '>=18'} - '@sentry-internal/browser-utils@10.38.0': resolution: {integrity: sha512-UOJtYmdcxHCcV0NPfXFff/a95iXl/E0EhuQ1y0uE0BuZDMupWSF5t2BgC4HaE5Aw3RTjDF3XkSHWoIF6ohy7eA==} engines: {node: '>=18'} - '@sentry-internal/feedback@10.12.0': - resolution: {integrity: sha512-0+7ceO6yQPPqfxRc9ue/xoPHKcnB917ezPaehGQNfAFNQB9PNTG1y55+8mRu0Fw+ANbZeCt/HyoCmXuRdxmkpg==} - engines: {node: '>=18'} - - '@sentry-internal/feedback@10.17.0': - resolution: {integrity: sha512-KIIF/dDQqYENbx4vn6B0evy/qx1QtEZsSZRvXNX6tUm14CCyrZeDymBMyEzu8RQ5PeZXibbPEkz7xOXiG3q+eQ==} - engines: {node: '>=18'} - '@sentry-internal/feedback@10.38.0': resolution: {integrity: sha512-JXneg9zRftyfy1Fyfc39bBlF/Qd8g4UDublFFkVvdc1S6JQPlK+P6q22DKz3Pc8w3ySby+xlIq/eTu9Pzqi4KA==} engines: {node: '>=18'} - '@sentry-internal/replay-canvas@10.12.0': - resolution: {integrity: sha512-W/z1/+69i3INNfPjD1KuinSNaRQaApjzwb37IFmiyF440F93hxmEYgXHk3poOlYYaigl2JMYbysGPWOiXnqUXA==} - engines: {node: '>=18'} - - '@sentry-internal/replay-canvas@10.17.0': - resolution: {integrity: sha512-GXKZIraXrboP03+XS+KwkkKVJO+cSlM0HrfjePSfFqiNbbnjRhOLekoLuDvvH/ZEXPUoUJD1We5IPBg+sZZQfQ==} - engines: {node: '>=18'} - '@sentry-internal/replay-canvas@10.38.0': resolution: {integrity: sha512-OXWM9jEqNYh4VTvrMu7v+z1anz+QKQ/fZXIZdsO7JTT2lGNZe58UUMeoq386M+Saxen8F9SUH7yTORy/8KI5qw==} engines: {node: '>=18'} - '@sentry-internal/replay@10.12.0': - resolution: {integrity: sha512-/1093gSNGN5KlOBsuyAl33JkzGiG38kCnxswQLZWpPpR6LBbR1Ddb18HjhDpoQNNEZybJBgJC3a5NKl43C2TSQ==} - engines: {node: '>=18'} - - '@sentry-internal/replay@10.17.0': - resolution: {integrity: sha512-9kirOPp3wbf+TMyHmA8iStKAysklZPcrPlB0v2zh0qRj1zNFY0xAD2WSgxuCvD9rEo5qKhmAKcaT7Ujin64uSw==} - engines: {node: '>=18'} - '@sentry-internal/replay@10.38.0': resolution: {integrity: sha512-YWIkL6/dnaiQyFiZXJ/nN+NXGv/15z45ia86bE/TMq01CubX/DUOilgsFz0pk2v/pg3tp/U2MskLO9Hz0cnqeg==} engines: {node: '>=18'} - '@sentry/babel-plugin-component-annotate@4.3.0': - resolution: {integrity: sha512-OuxqBprXRyhe8Pkfyz/4yHQJc5c3lm+TmYWSSx8u48g5yKewSQDOxkiLU5pAk3WnbLPy8XwU/PN+2BG0YFU9Nw==} - engines: {node: '>= 14'} - - '@sentry/babel-plugin-component-annotate@4.9.1': - resolution: {integrity: sha512-0gEoi2Lb54MFYPOmdTfxlNKxI7kCOvNV7gP8lxMXJ7nCazF5OqOOZIVshfWjDLrc0QrSV6XdVvwPV9GDn4wBMg==} - engines: {node: '>= 14'} - - '@sentry/browser@10.12.0': - resolution: {integrity: sha512-lKyaB2NFmr7SxPjmMTLLhQ7xfxaY3kdkMhpzuRI5qwOngtKt4+FtvNYHRuz+PTtEFv4OaHhNNbRn6r91gWguQg==} - engines: {node: '>=18'} - - '@sentry/browser@10.17.0': - resolution: {integrity: sha512-X4OiGECzkp6tIyAKXB/9beBC2oX1xKOEkDo4v/phIKGPzrmQ4o55j2a6/V20jSfSN7w+kfZ56ILE71SzC9w1aQ==} - engines: {node: '>=18'} - '@sentry/browser@10.38.0': resolution: {integrity: sha512-3phzp1YX4wcQr9mocGWKbjv0jwtuoDBv7+Y6Yfrys/kwyaL84mDLjjQhRf4gL5SX7JdYkhBp4WaiNlR0UC4kTA==} engines: {node: '>=18'} - '@sentry/bundler-plugin-core@4.9.1': - resolution: {integrity: sha512-moii+w7N8k8WdvkX7qCDY9iRBlhgHlhTHTUQwF2FNMhBHuqlNpVcSJJqJMjFUQcjYMBDrZgxhfKV18bt5ixwlQ==} - engines: {node: '>= 14'} - - '@sentry/cli-darwin@2.55.0': - resolution: {integrity: sha512-jGHE7SHHzqXUmnsmRLgorVH6nmMmTjQQXdPZbSL5tRtH8d3OIYrVNr5D72DSgD26XAPBDMV0ibqOQ9NKoiSpfA==} - engines: {node: '>=10'} - os: [darwin] - - '@sentry/cli-darwin@2.58.4': - resolution: {integrity: sha512-kbTD+P4X8O+nsNwPxCywtj3q22ecyRHWff98rdcmtRrvwz8CKi/T4Jxn/fnn2i4VEchy08OWBuZAqaA5Kh2hRQ==} - engines: {node: '>=10'} - os: [darwin] - - '@sentry/cli-linux-arm64@2.55.0': - resolution: {integrity: sha512-jNB/0/gFcOuDCaY/TqeuEpsy/k52dwyk1SOV3s1ku4DUsln6govTppeAGRewY3T1Rj9B2vgIWTrnB8KVh9+Rgg==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux, freebsd, android] - - '@sentry/cli-linux-arm64@2.58.4': - resolution: {integrity: sha512-0g0KwsOozkLtzN8/0+oMZoOuQ0o7W6O+hx+ydVU1bktaMGKEJLMAWxOQNjsh1TcBbNIXVOKM/I8l0ROhaAb8Ig==} - engines: {node: '>=10'} - cpu: [arm64] - os: [linux, freebsd, android] - - '@sentry/cli-linux-arm@2.55.0': - resolution: {integrity: sha512-ATjU0PsiWADSPLF/kZroLZ7FPKd5W9TDWHVkKNwIUNTei702LFgTjNeRwOIzTgSvG3yTmVEqtwFQfFN/7hnVXQ==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux, freebsd, android] - - '@sentry/cli-linux-arm@2.58.4': - resolution: {integrity: sha512-rdQ8beTwnN48hv7iV7e7ZKucPec5NJkRdrrycMJMZlzGBPi56LqnclgsHySJ6Kfq506A2MNuQnKGaf/sBC9REA==} - engines: {node: '>=10'} - cpu: [arm] - os: [linux, freebsd, android] - - '@sentry/cli-linux-i686@2.55.0': - resolution: {integrity: sha512-8LZjo6PncTM6bWdaggscNOi5r7F/fqRREsCwvd51dcjGj7Kp1plqo9feEzYQ+jq+KUzVCiWfHrUjddFmYyZJrg==} - engines: {node: '>=10'} - cpu: [x86, ia32] - os: [linux, freebsd, android] - - '@sentry/cli-linux-i686@2.58.4': - resolution: {integrity: sha512-NseoIQAFtkziHyjZNPTu1Gm1opeQHt7Wm1LbLrGWVIRvUOzlslO9/8i6wETUZ6TjlQxBVRgd3Q0lRBG2A8rFYA==} - engines: {node: '>=10'} - cpu: [x86, ia32] - os: [linux, freebsd, android] - - '@sentry/cli-linux-x64@2.55.0': - resolution: {integrity: sha512-5LUVvq74Yj2cZZy5g5o/54dcWEaX4rf3myTHy73AKhRj1PABtOkfexOLbF9xSrZy95WXWaXyeH+k5n5z/vtHfA==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux, freebsd, android] - - '@sentry/cli-linux-x64@2.58.4': - resolution: {integrity: sha512-d3Arz+OO/wJYTqCYlSN3Ktm+W8rynQ/IMtSZLK8nu0ryh5mJOh+9XlXY6oDXw4YlsM8qCRrNquR8iEI1Y/IH+Q==} - engines: {node: '>=10'} - cpu: [x64] - os: [linux, freebsd, android] - - '@sentry/cli-win32-arm64@2.55.0': - resolution: {integrity: sha512-cWIQdzm1pfLwPARsV6dUb8TVd6Y3V1A2VWxjTons3Ift6GvtVmiAe0OWL8t2Yt95i8v61kTD/6Tq21OAaogqzA==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - - '@sentry/cli-win32-arm64@2.58.4': - resolution: {integrity: sha512-bqYrF43+jXdDBh0f8HIJU3tbvlOFtGyRjHB8AoRuMQv9TEDUfENZyCelhdjA+KwDKYl48R1Yasb4EHNzsoO83w==} - engines: {node: '>=10'} - cpu: [arm64] - os: [win32] - - '@sentry/cli-win32-i686@2.55.0': - resolution: {integrity: sha512-ldepCn2t9r4I0wvgk7NRaA7coJyy4rTQAzM66u9j5nTEsUldf66xym6esd5ZZRAaJUjffqvHqUIr/lrieTIrVg==} - engines: {node: '>=10'} - cpu: [x86, ia32] - os: [win32] - - '@sentry/cli-win32-i686@2.58.4': - resolution: {integrity: sha512-3triFD6jyvhVcXOmGyttf+deKZcC1tURdhnmDUIBkiDPJKGT/N5xa4qAtHJlAB/h8L9jgYih9bvJnvvFVM7yug==} - engines: {node: '>=10'} - cpu: [x86, ia32] - os: [win32] - - '@sentry/cli-win32-x64@2.55.0': - resolution: {integrity: sha512-4hPc/I/9tXx+HLTdTGwlagtAfDSIa2AoTUP30tl32NAYQhx9a6niUbPAemK2qfxesiufJ7D2djX83rCw6WnJVA==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - - '@sentry/cli-win32-x64@2.58.4': - resolution: {integrity: sha512-cSzN4PjM1RsCZ4pxMjI0VI7yNCkxiJ5jmWncyiwHXGiXrV1eXYdQ3n1LhUYLZ91CafyprR0OhDcE+RVZ26Qb5w==} - engines: {node: '>=10'} - cpu: [x64] - os: [win32] - - '@sentry/cli@2.55.0': - resolution: {integrity: sha512-cynvcIM2xL8ddwELyFRSpZQw4UtFZzoM2rId2l9vg7+wDREPDocMJB9lEQpBIo3eqhp9JswqUT037yjO6iJ5Sw==} - engines: {node: '>= 10'} - hasBin: true - - '@sentry/cli@2.58.4': - resolution: {integrity: sha512-ArDrpuS8JtDYEvwGleVE+FgR+qHaOp77IgdGSacz6SZy6Lv90uX0Nu4UrHCQJz8/xwIcNxSqnN22lq0dH4IqTg==} - engines: {node: '>= 10'} - hasBin: true - - '@sentry/core@10.12.0': - resolution: {integrity: sha512-Jrf0Yo7DvmI/ZQcvBnA0xKNAFkJlVC/fMlvcin+5IrFNRcqOToZ2vtF+XqTgjRZymXQNE8s1QTD7IomPHk0TAw==} - engines: {node: '>=18'} - - '@sentry/core@10.17.0': - resolution: {integrity: sha512-UVIvxSzS0n5QbIDPyFf0WX9I77Of1bcr6a0sCEKfjhJGmGQ8mFWoWgR2gF4wcPw60XUrzbryCr79eOsIHLQ5cw==} - engines: {node: '>=18'} - '@sentry/core@10.38.0': resolution: {integrity: sha512-1pubWDZE5y5HZEPMAZERP4fVl2NH3Ihp1A+vMoVkb3Qc66Diqj1WierAnStlZP7tCx0TBa0dK85GTW/ZFYyB9g==} engines: {node: '>=18'} - '@sentry/electron@7.2.0': - resolution: {integrity: sha512-MuLJhjhklVVU3iSN/XfRShZX2Ng6sWrffiSQYIjyYy56WY/0xpEEXG5EKzM9RvrLn2D5abKpdnty/ql6rrPZ3g==} - peerDependencies: - '@sentry/node-native': 10.17.0 - peerDependenciesMeta: - '@sentry/node-native': - optional: true - - '@sentry/node-core@10.17.0': - resolution: {integrity: sha512-x6av2pFtsAeN+nZKkhI07cOCugTKux908DCGBlwQEw8ZjghcO5jn3unfAlKZqxZ0ktWgBcSrCM/iJ5Gk2nxPFg==} - engines: {node: '>=18'} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 - '@opentelemetry/core': ^1.30.1 || ^2.1.0 - '@opentelemetry/instrumentation': '>=0.57.1 <1' - '@opentelemetry/resources': ^1.30.1 || ^2.1.0 - '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 - '@opentelemetry/semantic-conventions': ^1.37.0 - - '@sentry/node@10.17.0': - resolution: {integrity: sha512-rM+ANC4NKkYHAFa73lqBXq024/YrflcUKBxkqSuo/0jc/Q/svLZfoZ8FW0IVZ4uhXXFZL3PZbkceZYmoOG9ePg==} - engines: {node: '>=18'} - - '@sentry/opentelemetry@10.17.0': - resolution: {integrity: sha512-kZONokjkIQjhDUEZLsi7TZ1Bay0g4VFC2rT1MvZqa1fkFZff7Th9qQr0Lv7gt3nrbD6qIctEzmpf75OQN1cR8A==} - engines: {node: '>=18'} - peerDependencies: - '@opentelemetry/api': ^1.9.0 - '@opentelemetry/context-async-hooks': ^1.30.1 || ^2.1.0 - '@opentelemetry/core': ^1.30.1 || ^2.1.0 - '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 - '@opentelemetry/semantic-conventions': ^1.37.0 - - '@sentry/react-native@7.2.0': - resolution: {integrity: sha512-rjqYgEjntPz1sPysud78wi4B9ui7LBVPsG6qr8s/htLMYho9GPGFA5dF+eqsQWqMX8NDReAxNkLTC4+gCNklLQ==} - hasBin: true - peerDependencies: - expo: '>=49.0.0' - react: 19.1.0 - react-native: '>=0.65.0' - peerDependenciesMeta: - expo: - optional: true - - '@sentry/react@10.12.0': - resolution: {integrity: sha512-TpqgdoYbkf5JynmmW2oQhHQ/h5w+XPYk0cEb/UrsGlvJvnBSR+5tgh0AqxCSi3gvtp82rAXI5w1TyRPBbhLDBw==} - engines: {node: '>=18'} - peerDependencies: - react: 19.1.0 - '@sentry/react@10.38.0': resolution: {integrity: sha512-3UiKo6QsqTyPGUt0XWRY9KLaxc/cs6Kz4vlldBSOXEL6qPDL/EfpwNJT61osRo81VFWu8pKu7ZY2bvLPryrnBQ==} engines: {node: '>=18'} peerDependencies: react: 19.1.0 - '@sentry/types@10.12.0': - resolution: {integrity: sha512-sKGj3l3V8ZKISh2Tu88bHfnm5ztkRtSLdmpZ6TmCeJdSM9pV+RRd6CMJ0RnSEXmYHselPNUod521t2NQFd4W1w==} - engines: {node: '>=18'} - - '@sentry/vite-plugin@4.9.1': - resolution: {integrity: sha512-Tlyg2cyFYp/icX58GWvfpvZr9NLdLs2/xyFVyS8pQ0faZWmoXic3FMzoXYHV1gsdMbL1Yy5WQvGJy8j1rS8LGA==} - engines: {node: '>= 14'} - '@shikijs/core@3.22.0': resolution: {integrity: sha512-iAlTtSDDbJiRpvgL5ugKEATDtHdUVkqgHDm/gbD2ZS9c88mx7G1zSYjjOxp5Qa0eaW0MAQosFRmJSk354PRoQA==} @@ -7752,9 +7322,6 @@ packages: '@types/cli-progress@3.11.6': resolution: {integrity: sha512-cE3+jb9WRlu+uOSAugewNpITJDt1VF8dHOopPO4IABFc3SXYL5WE/+PTz/FCdZRRfIujiWW3n3aMbv1eIGVRWA==} - '@types/connect@3.4.38': - resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} - '@types/d3-color@3.1.3': resolution: {integrity: sha512-iO90scth9WAbmgv7ogoq57O9YpKmFBbmoEoCHDB2xMBY0+/KVrqAaCDyCE16dUspeOvIxFFRI+0sEtqDqy2b4A==} @@ -7848,9 +7415,6 @@ packages: '@types/mute-stream@0.0.4': resolution: {integrity: sha512-CPM9nzrCPPJHQNA9keH9CVkVI+WR5kMa+7XEs5jcGQ0VoAGnLv242w8lIVgwAEfmE4oufJRaTc9PNLQl0ioAow==} - '@types/mysql@2.15.27': - resolution: {integrity: sha512-YfWiV16IY0OeBfBCk8+hXKmdTKrKlwKN1MNKAPBu5JYxLwBEZl7QzeEpGnlZb3VMGJrrGmB84gXiH+ofs/TezA==} - '@types/node@16.9.1': resolution: {integrity: sha512-QpLcX9ZSsq3YYUUnD3nFDY8H7wctAhQj/TFKL8Ya8v5fMm3CFXxo8zStsLAl780ltoYoo1WvKUVGBQK+1ifr7g==} @@ -7878,9 +7442,6 @@ packages: '@types/normalize-package-data@2.4.4': resolution: {integrity: sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==} - '@types/pg-pool@2.0.6': - resolution: {integrity: sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==} - '@types/pg@8.15.5': resolution: {integrity: sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==} @@ -7912,18 +7473,12 @@ packages: '@types/semver@7.7.1': resolution: {integrity: sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==} - '@types/shimmer@1.2.0': - resolution: {integrity: sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==} - '@types/stack-utils@2.0.3': resolution: {integrity: sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==} '@types/tar@6.1.13': resolution: {integrity: sha512-IznnlmU5f4WcGTh2ltRu/Ijpmk8wiWXfF0VA4s+HPjHZgvFggk1YaIkbo5krX/zUCzWF8N/l4+W/LNxnvAJ8nw==} - '@types/tedious@4.0.14': - resolution: {integrity: sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==} - '@types/trusted-types@2.0.7': resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==} @@ -9270,9 +8825,6 @@ packages: cjs-module-lexer@1.2.3: resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} - cjs-module-lexer@1.4.3: - resolution: {integrity: sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==} - clamp@1.0.1: resolution: {integrity: sha512-kgMuFyE78OC6Dyu3Dy7vcx4uy97EIbVxJB/B0eJ3bUNAkwdNcxYzgKltnyADiYwsR7SEqkkUPsEUT//OVS6XMA==} @@ -11385,9 +10937,6 @@ packages: resolution: {integrity: sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==} engines: {node: '>= 6'} - forwarded-parse@2.1.2: - resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} - foxact@0.2.52: resolution: {integrity: sha512-cc3ydJkM/mYkof1/ofI4VlVAiRyfsSDsHRC4UIAXQcnUXCuo0rXM66Zy1ggdxAXL03ikHnh3bPnQ7AYuI/Yzow==} peerDependencies: @@ -12022,9 +11571,6 @@ packages: resolution: {integrity: sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==} engines: {node: '>=6'} - import-in-the-middle@1.15.0: - resolution: {integrity: sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==} - import-without-cache@0.2.5: resolution: {integrity: sha512-B6Lc2s6yApwnD2/pMzFh/d5AVjdsDXjgkeJ766FmFuJELIGHNycKRj+l3A39yZPM4CchqNCB4RITEAYB1KUM6A==} engines: {node: '>=20.19.0'} @@ -12999,10 +12545,6 @@ packages: magic-string@0.30.21: resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==} - magic-string@0.30.8: - resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==} - engines: {node: '>=12'} - make-error@1.3.6: resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} @@ -13413,9 +12955,6 @@ packages: mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} - module-details-from-path@1.0.4: - resolution: {integrity: sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==} - moment@2.30.1: resolution: {integrity: sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==} @@ -15308,10 +14847,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - require-in-the-middle@7.5.2: - resolution: {integrity: sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==} - engines: {node: '>=8.6.0'} - require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} @@ -15678,9 +15213,6 @@ packages: shiki@3.22.0: resolution: {integrity: sha512-LBnhsoYEe0Eou4e1VgJACes+O6S6QC0w71fCSp5Oya79inkwkm15gQ1UF6VtQ8j/taMDh79hAB49WUk8ALQW3g==} - shimmer@1.2.1: - resolution: {integrity: sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==} - side-channel-list@1.0.0: resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==} engines: {node: '>= 0.4'} @@ -16192,6 +15724,7 @@ packages: tar@7.5.7: resolution: {integrity: sha512-fov56fJiRuThVFXD6o6/Q354S7pnWMJIVlDBYijsTNx6jKSE4pvrDTs6lUnmGvNyfJwFQQwWy3owKz1ucIhveQ==} engines: {node: '>=18'} + deprecated: Old versions of tar are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me temp-dir@2.0.0: resolution: {integrity: sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==} @@ -16785,9 +16318,6 @@ packages: resolution: {integrity: sha512-1ow2FlRznoSKE7Fjk2bSxqDsvHyj/O876RqsNlipsM6A+I91t7Mi+jG7tCNNcl3vZx14z4pGXBLSl8KOPrMuFQ==} engines: {node: '>=20.19.0'} - unplugin@1.0.1: - resolution: {integrity: sha512-aqrHaVBWW1JVKBHmGo33T5TxeL0qWzfvjWokObHA9bYmN7eNDkwOxmLjhioHl9878qDFMAaT51XNroRyuz7WxA==} - unplugin@2.1.0: resolution: {integrity: sha512-us4j03/499KhbGP8BU7Hrzrgseo+KdfJYWcbcajCOqsAyb8Gk0Yn2kiUIcZISYCb1JFaZfIuG3b42HmguVOKCQ==} engines: {node: '>=18.12.0'} @@ -17105,9 +16635,6 @@ packages: resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} engines: {node: '>=10.13.0'} - webpack-virtual-modules@0.5.0: - resolution: {integrity: sha512-kyDivFZ7ZM0BVOUteVbDFhlRt7Ah/CSPwJdi8hBpkK7QLumUqdLtVfm/PX/hkcnrvr0i77fO5+TjZ94Pe+C9iw==} - webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} @@ -22939,258 +22466,8 @@ snapshots: dependencies: '@openpanel/sdk': 1.0.4 - '@opentelemetry/api-logs@0.204.0': - dependencies: - '@opentelemetry/api': 1.9.0 - - '@opentelemetry/api-logs@0.57.2': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api@1.9.0': {} - '@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - - '@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/instrumentation-amqplib@0.51.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-connect@0.48.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - '@types/connect': 3.4.38 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-dataloader@0.22.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-express@0.53.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-fs@0.24.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-generic-pool@0.48.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-graphql@0.52.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-hapi@0.51.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-http@0.204.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - forwarded-parse: 2.1.2 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-ioredis@0.52.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.38.2 - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-kafkajs@0.14.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-knex@0.49.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-koa@0.52.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-lru-memoizer@0.49.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mongodb@0.57.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mongoose@0.51.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mysql2@0.51.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-mysql@0.50.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - '@types/mysql': 2.15.27 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-pg@0.57.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - '@opentelemetry/sql-common': 0.41.2(@opentelemetry/api@1.9.0) - '@types/pg': 8.15.5 - '@types/pg-pool': 2.0.6 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-redis@0.53.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/redis-common': 0.38.2 - '@opentelemetry/semantic-conventions': 1.37.0 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-tedious@0.23.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - '@types/tedious': 4.0.14 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation-undici@0.15.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation@0.204.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.204.0 - import-in-the-middle: 1.15.0 - require-in-the-middle: 7.5.2 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/instrumentation@0.57.2(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/api-logs': 0.57.2 - '@types/shimmer': 1.2.0 - import-in-the-middle: 1.15.0 - require-in-the-middle: 7.5.2 - semver: 7.7.4 - shimmer: 1.2.1 - transitivePeerDependencies: - - supports-color - - '@opentelemetry/redis-common@0.38.2': {} - - '@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - - '@opentelemetry/semantic-conventions@1.37.0': {} - - '@opentelemetry/sql-common@0.41.2(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@oxc-project/types@0.112.0': {} '@peculiar/asn1-android@2.5.0': @@ -23331,13 +22608,6 @@ snapshots: '@preact/signals-core': 1.11.0 preact: 10.26.9 - '@prisma/instrumentation@6.15.0(@opentelemetry/api@1.9.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/instrumentation': 0.57.2(@opentelemetry/api@1.9.0) - transitivePeerDependencies: - - supports-color - '@protobufjs/aspromise@1.1.2': {} '@protobufjs/base64@1.1.2': {} @@ -24496,80 +23766,24 @@ snapshots: component-type: 1.2.2 join-component: 1.1.0 - '@sentry-internal/browser-utils@10.12.0': - dependencies: - '@sentry/core': 10.12.0 - - '@sentry-internal/browser-utils@10.17.0': - dependencies: - '@sentry/core': 10.17.0 - '@sentry-internal/browser-utils@10.38.0': dependencies: '@sentry/core': 10.38.0 - '@sentry-internal/feedback@10.12.0': - dependencies: - '@sentry/core': 10.12.0 - - '@sentry-internal/feedback@10.17.0': - dependencies: - '@sentry/core': 10.17.0 - '@sentry-internal/feedback@10.38.0': dependencies: '@sentry/core': 10.38.0 - '@sentry-internal/replay-canvas@10.12.0': - dependencies: - '@sentry-internal/replay': 10.12.0 - '@sentry/core': 10.12.0 - - '@sentry-internal/replay-canvas@10.17.0': - dependencies: - '@sentry-internal/replay': 10.17.0 - '@sentry/core': 10.17.0 - '@sentry-internal/replay-canvas@10.38.0': dependencies: '@sentry-internal/replay': 10.38.0 '@sentry/core': 10.38.0 - '@sentry-internal/replay@10.12.0': - dependencies: - '@sentry-internal/browser-utils': 10.12.0 - '@sentry/core': 10.12.0 - - '@sentry-internal/replay@10.17.0': - dependencies: - '@sentry-internal/browser-utils': 10.17.0 - '@sentry/core': 10.17.0 - '@sentry-internal/replay@10.38.0': dependencies: '@sentry-internal/browser-utils': 10.38.0 '@sentry/core': 10.38.0 - '@sentry/babel-plugin-component-annotate@4.3.0': {} - - '@sentry/babel-plugin-component-annotate@4.9.1': {} - - '@sentry/browser@10.12.0': - dependencies: - '@sentry-internal/browser-utils': 10.12.0 - '@sentry-internal/feedback': 10.12.0 - '@sentry-internal/replay': 10.12.0 - '@sentry-internal/replay-canvas': 10.12.0 - '@sentry/core': 10.12.0 - - '@sentry/browser@10.17.0': - dependencies: - '@sentry-internal/browser-utils': 10.17.0 - '@sentry-internal/feedback': 10.17.0 - '@sentry-internal/replay': 10.17.0 - '@sentry-internal/replay-canvas': 10.17.0 - '@sentry/core': 10.17.0 - '@sentry/browser@10.38.0': dependencies: '@sentry-internal/browser-utils': 10.38.0 @@ -24578,225 +23792,14 @@ snapshots: '@sentry-internal/replay-canvas': 10.38.0 '@sentry/core': 10.38.0 - '@sentry/bundler-plugin-core@4.9.1(encoding@0.1.13)': - dependencies: - '@babel/core': 7.29.0 - '@sentry/babel-plugin-component-annotate': 4.9.1 - '@sentry/cli': 2.58.4(encoding@0.1.13) - dotenv: 16.6.1 - find-up: 5.0.0 - glob: 10.5.0 - magic-string: 0.30.8 - unplugin: 1.0.1 - transitivePeerDependencies: - - encoding - - supports-color - - '@sentry/cli-darwin@2.55.0': - optional: true - - '@sentry/cli-darwin@2.58.4': - optional: true - - '@sentry/cli-linux-arm64@2.55.0': - optional: true - - '@sentry/cli-linux-arm64@2.58.4': - optional: true - - '@sentry/cli-linux-arm@2.55.0': - optional: true - - '@sentry/cli-linux-arm@2.58.4': - optional: true - - '@sentry/cli-linux-i686@2.55.0': - optional: true - - '@sentry/cli-linux-i686@2.58.4': - optional: true - - '@sentry/cli-linux-x64@2.55.0': - optional: true - - '@sentry/cli-linux-x64@2.58.4': - optional: true - - '@sentry/cli-win32-arm64@2.55.0': - optional: true - - '@sentry/cli-win32-arm64@2.58.4': - optional: true - - '@sentry/cli-win32-i686@2.55.0': - optional: true - - '@sentry/cli-win32-i686@2.58.4': - optional: true - - '@sentry/cli-win32-x64@2.55.0': - optional: true - - '@sentry/cli-win32-x64@2.58.4': - optional: true - - '@sentry/cli@2.55.0(encoding@0.1.13)': - dependencies: - https-proxy-agent: 5.0.1 - node-fetch: 2.7.0(encoding@0.1.13) - progress: 2.0.3 - proxy-from-env: 1.1.0 - which: 2.0.2 - optionalDependencies: - '@sentry/cli-darwin': 2.55.0 - '@sentry/cli-linux-arm': 2.55.0 - '@sentry/cli-linux-arm64': 2.55.0 - '@sentry/cli-linux-i686': 2.55.0 - '@sentry/cli-linux-x64': 2.55.0 - '@sentry/cli-win32-arm64': 2.55.0 - '@sentry/cli-win32-i686': 2.55.0 - '@sentry/cli-win32-x64': 2.55.0 - transitivePeerDependencies: - - encoding - - supports-color - - '@sentry/cli@2.58.4(encoding@0.1.13)': - dependencies: - https-proxy-agent: 5.0.1 - node-fetch: 2.7.0(encoding@0.1.13) - progress: 2.0.3 - proxy-from-env: 1.1.0 - which: 2.0.2 - optionalDependencies: - '@sentry/cli-darwin': 2.58.4 - '@sentry/cli-linux-arm': 2.58.4 - '@sentry/cli-linux-arm64': 2.58.4 - '@sentry/cli-linux-i686': 2.58.4 - '@sentry/cli-linux-x64': 2.58.4 - '@sentry/cli-win32-arm64': 2.58.4 - '@sentry/cli-win32-i686': 2.58.4 - '@sentry/cli-win32-x64': 2.58.4 - transitivePeerDependencies: - - encoding - - supports-color - - '@sentry/core@10.12.0': {} - - '@sentry/core@10.17.0': {} - '@sentry/core@10.38.0': {} - '@sentry/electron@7.2.0(patch_hash=c53ad89ecd1e379589255a5f24f183dc3b3779c8cc70629689cc866e69e07738)': - dependencies: - '@sentry/browser': 10.17.0 - '@sentry/core': 10.17.0 - '@sentry/node': 10.17.0 - transitivePeerDependencies: - - supports-color - - '@sentry/node-core@10.17.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.204.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - '@sentry/core': 10.17.0 - '@sentry/opentelemetry': 10.17.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) - import-in-the-middle: 1.15.0 - - '@sentry/node@10.17.0': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-amqplib': 0.51.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-connect': 0.48.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-dataloader': 0.22.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-express': 0.53.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-fs': 0.24.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-generic-pool': 0.48.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-graphql': 0.52.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-hapi': 0.51.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-http': 0.204.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-ioredis': 0.52.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-kafkajs': 0.14.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-knex': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-koa': 0.52.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-lru-memoizer': 0.49.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongodb': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mongoose': 0.51.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql': 0.50.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-mysql2': 0.51.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-pg': 0.57.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-redis': 0.53.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-tedious': 0.23.0(@opentelemetry/api@1.9.0) - '@opentelemetry/instrumentation-undici': 0.15.0(@opentelemetry/api@1.9.0) - '@opentelemetry/resources': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - '@prisma/instrumentation': 6.15.0(@opentelemetry/api@1.9.0) - '@sentry/core': 10.17.0 - '@sentry/node-core': 10.17.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.204.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) - '@sentry/opentelemetry': 10.17.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0) - import-in-the-middle: 1.15.0 - minimatch: 9.0.5 - transitivePeerDependencies: - - supports-color - - '@sentry/opentelemetry@10.17.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.1.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.37.0)': - dependencies: - '@opentelemetry/api': 1.9.0 - '@opentelemetry/context-async-hooks': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/core': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/sdk-trace-base': 2.1.0(@opentelemetry/api@1.9.0) - '@opentelemetry/semantic-conventions': 1.37.0 - '@sentry/core': 10.17.0 - - '@sentry/react-native@7.2.0(encoding@0.1.13)(expo@54.0.33)(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0)(utf-8-validate@6.0.5))(react@19.1.0)': - dependencies: - '@sentry/babel-plugin-component-annotate': 4.3.0 - '@sentry/browser': 10.12.0 - '@sentry/cli': 2.55.0(encoding@0.1.13) - '@sentry/core': 10.12.0 - '@sentry/react': 10.12.0(react@19.1.0) - '@sentry/types': 10.12.0 - react: 19.1.0 - react-native: 0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0)(utf-8-validate@6.0.5) - optionalDependencies: - expo: 54.0.33(@babel/core@7.29.0)(@expo/metro-runtime@6.1.2)(bufferutil@4.1.0)(graphql@16.8.1)(react-native-webview@13.15.0(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0)(utf-8-validate@6.0.5))(react@19.1.0))(react-native@0.81.5(@babel/core@7.29.0)(@types/react@19.1.17)(bufferutil@4.1.0)(react@19.1.0)(utf-8-validate@6.0.5))(react@19.1.0)(utf-8-validate@6.0.5) - transitivePeerDependencies: - - encoding - - supports-color - - '@sentry/react@10.12.0(react@19.1.0)': - dependencies: - '@sentry/browser': 10.12.0 - '@sentry/core': 10.12.0 - hoist-non-react-statics: 3.3.2 - react: 19.1.0 - '@sentry/react@10.38.0(react@19.1.0)': dependencies: '@sentry/browser': 10.38.0 '@sentry/core': 10.38.0 react: 19.1.0 - '@sentry/types@10.12.0': - dependencies: - '@sentry/core': 10.12.0 - - '@sentry/vite-plugin@4.9.1(encoding@0.1.13)': - dependencies: - '@sentry/bundler-plugin-core': 4.9.1(encoding@0.1.13) - unplugin: 1.0.1 - transitivePeerDependencies: - - encoding - - supports-color - '@shikijs/core@3.22.0': dependencies: '@shikijs/types': 3.22.0 @@ -25089,10 +24092,6 @@ snapshots: dependencies: '@types/node': 25.2.3 - '@types/connect@3.4.38': - dependencies: - '@types/node': 25.2.3 - '@types/d3-color@3.1.3': {} '@types/d3-drag@3.0.7': @@ -25193,10 +24192,6 @@ snapshots: dependencies: '@types/node': 25.2.3 - '@types/mysql@2.15.27': - dependencies: - '@types/node': 25.2.3 - '@types/node@16.9.1': {} '@types/node@18.19.130': @@ -25229,15 +24224,12 @@ snapshots: '@types/normalize-package-data@2.4.4': {} - '@types/pg-pool@2.0.6': - dependencies: - '@types/pg': 8.15.5 - '@types/pg@8.15.5': dependencies: '@types/node': 25.2.3 pg-protocol: 1.11.0 pg-types: 2.2.0 + optional: true '@types/plist@3.0.5': dependencies: @@ -25269,8 +24261,6 @@ snapshots: '@types/semver@7.7.1': {} - '@types/shimmer@1.2.0': {} - '@types/stack-utils@2.0.3': {} '@types/tar@6.1.13': @@ -25278,10 +24268,6 @@ snapshots: '@types/node': 25.2.3 minipass: 4.2.8 - '@types/tedious@4.0.14': - dependencies: - '@types/node': 25.2.3 - '@types/trusted-types@2.0.7': {} '@types/unist@2.0.11': {} @@ -26995,8 +25981,6 @@ snapshots: cjs-module-lexer@1.2.3: {} - cjs-module-lexer@1.4.3: {} - clamp@1.0.1: {} class-variance-authority@0.7.1: @@ -29727,8 +28711,6 @@ snapshots: hasown: 2.0.2 mime-types: 2.1.35 - forwarded-parse@2.1.2: {} - foxact@0.2.52(react-dom@19.1.0(react@19.1.0))(react@19.1.0): dependencies: client-only: 0.0.1 @@ -30557,13 +29539,6 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-in-the-middle@1.15.0: - dependencies: - acorn: 8.15.0 - acorn-import-attributes: 1.9.5(acorn@8.15.0) - cjs-module-lexer: 1.4.3 - module-details-from-path: 1.0.4 - import-without-cache@0.2.5: {} imul@1.0.1: @@ -31510,10 +30485,6 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.5 - magic-string@0.30.8: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.5 - make-error@1.3.6: {} make-fetch-happen@10.2.1: @@ -32269,8 +31240,6 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.3 - module-details-from-path@1.0.4: {} - moment@2.30.1: optional: true @@ -34189,14 +33158,6 @@ snapshots: require-from-string@2.0.2: {} - require-in-the-middle@7.5.2: - dependencies: - debug: 4.4.3(supports-color@8.1.1) - module-details-from-path: 1.0.4 - resolve: 1.22.11 - transitivePeerDependencies: - - supports-color - require-main-filename@2.0.0: {} require-resolve@0.0.2: @@ -34665,8 +33626,6 @@ snapshots: '@shikijs/vscode-textmate': 10.0.2 '@types/hast': 3.0.4 - shimmer@1.2.1: {} - side-channel-list@1.0.0: dependencies: es-errors: 1.3.0 @@ -35818,13 +34777,6 @@ snapshots: magic-string-ast: 1.0.3 unplugin: 3.0.0 - unplugin@1.0.1: - dependencies: - acorn: 8.15.0 - chokidar: 3.6.0 - webpack-sources: 3.3.3 - webpack-virtual-modules: 0.5.0 - unplugin@2.1.0: dependencies: acorn: 8.15.0 @@ -36170,8 +35122,6 @@ snapshots: webpack-sources@3.3.3: {} - webpack-virtual-modules@0.5.0: {} - webpack-virtual-modules@0.6.2: {} webpack@5.105.2: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 744766d3a..3020ca577 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -17,7 +17,6 @@ ignorePatchFailures: false onlyBuiltDependencies: - "@firebase/util" - - "@sentry/cli" - "@tsslint/core" - "@tsslint/eslint" - bufferutil @@ -59,7 +58,6 @@ patchedDependencies: "@microflash/remark-callout-directives": patches/@microflash__remark-callout-directives.patch "@mozilla/readability@0.6.0": patches/@mozilla__readability@0.6.0.patch "@pengx17/electron-forge-maker-appimage": patches/@pengx17__electron-forge-maker-appimage.patch - "@sentry/electron": patches/@sentry__electron.patch daisyui@4.12.24: patches/daisyui@4.12.24.patch re-resizable@6.11.2: patches/re-resizable@6.11.2.patch react-native-sheet-transitions: patches/react-native-sheet-transitions.patch