mirror of
https://github.com/tinyhumansai/openhuman.git
synced 2026-07-30 23:14:37 +00:00
Add Sentry integration for error reporting and user analytics consent
- Introduced Sentry for error tracking, initialized in the application to capture errors while respecting user privacy. - Added a new analytics service to manage user consent for data collection, ensuring only non-personal data is sent to Sentry. - Updated Redux state to track user analytics preferences and modified onboarding steps to include analytics consent. - Enhanced the PrivacyPanel component to allow users to toggle analytics sharing. - Removed the AnalyticsStep from onboarding as its functionality is now integrated into the PrivacyPanel. This update improves error reporting capabilities while prioritizing user privacy and consent.
This commit is contained in:
@@ -152,6 +152,7 @@ Set in `.env` (Vite exposes `VITE_*` prefixed vars):
|
||||
| `VITE_TELEGRAM_API_HASH` | Telegram MTProto API hash |
|
||||
| `VITE_TELEGRAM_BOT_USERNAME` | Telegram bot username |
|
||||
| `VITE_TELEGRAM_BOT_ID` | Telegram bot numeric ID |
|
||||
| `VITE_SENTRY_DSN` | Sentry DSN for error reporting (optional) |
|
||||
| `VITE_DEBUG` | Debug mode flag |
|
||||
|
||||
Production defaults are in `src/utils/config.ts`.
|
||||
|
||||
@@ -17,6 +17,7 @@
|
||||
},
|
||||
"dependencies": {
|
||||
"@reduxjs/toolkit": "^2.11.2",
|
||||
"@sentry/react": "^10.38.0",
|
||||
"@tauri-apps/api": "^2",
|
||||
"@tauri-apps/plugin-deep-link": "^2",
|
||||
"@tauri-apps/plugin-opener": "^2",
|
||||
|
||||
+3
-3
@@ -1,6 +1,7 @@
|
||||
import { HashRouter as Router } from "react-router-dom";
|
||||
import { Provider } from "react-redux";
|
||||
import { PersistGate } from "redux-persist/integration/react";
|
||||
import * as Sentry from "@sentry/react";
|
||||
import { store, persistor } from "./store";
|
||||
import UserProvider from "./providers/UserProvider";
|
||||
import SocketProvider from "./providers/SocketProvider";
|
||||
@@ -9,7 +10,7 @@ import AppRoutes from "./AppRoutes";
|
||||
|
||||
function App() {
|
||||
return (
|
||||
<>
|
||||
<Sentry.ErrorBoundary fallback={<div>Something went wrong.</div>}>
|
||||
<Provider store={store}>
|
||||
<PersistGate loading={null} persistor={persistor}>
|
||||
<UserProvider>
|
||||
@@ -31,8 +32,7 @@ function App() {
|
||||
</UserProvider>
|
||||
</PersistGate>
|
||||
</Provider>
|
||||
|
||||
</>
|
||||
</Sentry.ErrorBoundary>
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,8 +1,25 @@
|
||||
import { useSettingsNavigation } from "../hooks/useSettingsNavigation";
|
||||
import { useAppSelector, useAppDispatch } from "../../../store/hooks";
|
||||
import { setAnalyticsForUser } from "../../../store/authSlice";
|
||||
import { syncAnalyticsConsent } from "../../../services/analytics";
|
||||
import SettingsHeader from "../components/SettingsHeader";
|
||||
|
||||
const PrivacyPanel = () => {
|
||||
const { navigateBack } = useSettingsNavigation();
|
||||
const dispatch = useAppDispatch();
|
||||
const user = useAppSelector((state) => state.user.user);
|
||||
const analyticsEnabled = useAppSelector((state) => {
|
||||
const userId = state.user.user?._id;
|
||||
if (!userId) return false;
|
||||
return state.auth.isAnalyticsEnabledByUser[userId] === true;
|
||||
});
|
||||
|
||||
const handleToggleAnalytics = () => {
|
||||
if (!user?._id) return;
|
||||
const newValue = !analyticsEnabled;
|
||||
dispatch(setAnalyticsForUser({ userId: user._id, enabled: newValue }));
|
||||
syncAnalyticsConsent(newValue);
|
||||
};
|
||||
|
||||
return (
|
||||
<div className="overflow-hidden h-full flex flex-col">
|
||||
@@ -13,34 +30,64 @@ const PrivacyPanel = () => {
|
||||
/>
|
||||
|
||||
<div className="flex-1 overflow-y-auto">
|
||||
<div className="p-4 h-full flex items-center justify-center">
|
||||
<div className="text-center">
|
||||
<div className="w-16 h-16 mx-auto mb-4 bg-stone-700/50 rounded-full flex items-center justify-center">
|
||||
<div className="p-4 space-y-6">
|
||||
{/* Analytics Section */}
|
||||
<div>
|
||||
<h3 className="text-xs font-semibold uppercase tracking-wider text-stone-400 mb-3 px-1">
|
||||
Analytics
|
||||
</h3>
|
||||
<div className="bg-stone-800/50 rounded-xl border border-stone-700/50 overflow-hidden">
|
||||
<div className="flex items-center justify-between p-4">
|
||||
<div className="flex-1 mr-4">
|
||||
<p className="text-sm font-medium text-white">
|
||||
Share Anonymized Usage Data
|
||||
</p>
|
||||
<p className="text-xs text-stone-400 mt-1 leading-relaxed">
|
||||
Help improve AlphaHuman by sharing anonymous crash reports
|
||||
and usage analytics. No personal data, messages, or wallet
|
||||
information is ever collected.
|
||||
</p>
|
||||
</div>
|
||||
<button
|
||||
onClick={handleToggleAnalytics}
|
||||
className={`relative inline-flex h-6 w-11 flex-shrink-0 cursor-pointer rounded-full border-2 border-transparent transition-colors duration-200 ease-in-out focus:outline-none ${
|
||||
analyticsEnabled ? "bg-primary-500" : "bg-stone-600"
|
||||
}`}
|
||||
role="switch"
|
||||
aria-checked={analyticsEnabled}
|
||||
>
|
||||
<span
|
||||
className={`pointer-events-none inline-block h-5 w-5 transform rounded-full bg-white shadow ring-0 transition duration-200 ease-in-out ${
|
||||
analyticsEnabled ? "translate-x-5" : "translate-x-0"
|
||||
}`}
|
||||
/>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{/* Info Box */}
|
||||
<div className="p-4 bg-stone-800/30 rounded-xl border border-stone-700/30">
|
||||
<div className="flex items-start space-x-3">
|
||||
<svg
|
||||
className="w-8 h-8 text-stone-400"
|
||||
fill="none"
|
||||
stroke="currentColor"
|
||||
viewBox="0 0 24 24"
|
||||
className="w-5 h-5 text-stone-400 mt-0.5 flex-shrink-0"
|
||||
fill="currentColor"
|
||||
viewBox="0 0 20 20"
|
||||
>
|
||||
<path
|
||||
strokeLinecap="round"
|
||||
strokeLinejoin="round"
|
||||
strokeWidth={2}
|
||||
d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"
|
||||
fillRule="evenodd"
|
||||
d="M18 10a8 8 0 11-16 0 8 8 0 0116 0zm-7-4a1 1 0 11-2 0 1 1 0 012 0zM9 9a1 1 0 000 2v3a1 1 0 001 1h1a1 1 0 100-2v-3a1 1 0 00-1-1H9z"
|
||||
clipRule="evenodd"
|
||||
/>
|
||||
</svg>
|
||||
</div>
|
||||
<h3 className="text-lg font-medium text-white mb-2">
|
||||
Privacy & Security
|
||||
</h3>
|
||||
<p className="text-stone-400 text-sm max-w-sm mx-auto">
|
||||
Manage your privacy settings, data retention policies, and
|
||||
security preferences.
|
||||
</p>
|
||||
<div className="mt-6">
|
||||
<span className="px-4 py-2 text-sm font-medium rounded-full border bg-stone-700/30 text-stone-300 border-stone-600/50">
|
||||
Coming Soon
|
||||
</span>
|
||||
<div>
|
||||
<p className="text-xs text-stone-400 leading-relaxed">
|
||||
When enabled, we collect only crash information, device type,
|
||||
and the file location of errors. We never access your messages,
|
||||
session data, wallet keys, or any personally identifiable
|
||||
information.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -5,6 +5,10 @@ import React from "react";
|
||||
import ReactDOM from "react-dom/client";
|
||||
import App from "./App";
|
||||
import "./index.css";
|
||||
import { initSentry } from "./services/analytics";
|
||||
|
||||
// Initialize Sentry early (before React renders)
|
||||
initSentry();
|
||||
|
||||
// Deep link listener - lazy import to avoid running before Tauri IPC is ready
|
||||
import("./utils/desktopDeepLinkListener").then((m) => {
|
||||
|
||||
@@ -7,7 +7,6 @@ import ProgressIndicator from "../../components/ProgressIndicator";
|
||||
import LottieAnimation from "../../components/LottieAnimation";
|
||||
import FeaturesStep from "./steps/FeaturesStep";
|
||||
import PrivacyStep from "./steps/PrivacyStep";
|
||||
import AnalyticsStep from "./steps/AnalyticsStep";
|
||||
import ConnectStep from "./steps/ConnectStep";
|
||||
import GetStartedStep from "./steps/GetStartedStep";
|
||||
|
||||
@@ -16,15 +15,14 @@ const Onboarding = () => {
|
||||
const dispatch = useAppDispatch();
|
||||
const user = useAppSelector((state) => state.user.user);
|
||||
const [currentStep, setCurrentStep] = useState(1);
|
||||
const totalSteps = 5;
|
||||
const totalSteps = 4;
|
||||
|
||||
// Lottie animation files for each step
|
||||
const stepAnimations = [
|
||||
"/lottie/wave.json", // Step 1 - Features
|
||||
"/lottie/safe3.json", // Step 2 - Privacy
|
||||
"/lottie/analytics.json", // Step 3 - Analytics
|
||||
"/lottie/connect2.json", // Step 4 - Connect
|
||||
"/lottie/trophy.json", // Step 5 - Get Started
|
||||
"/lottie/connect2.json", // Step 3 - Connect
|
||||
"/lottie/trophy.json", // Step 4 - Get Started
|
||||
];
|
||||
|
||||
const handleNext = () => {
|
||||
@@ -59,10 +57,8 @@ const Onboarding = () => {
|
||||
case 2:
|
||||
return <PrivacyStep onNext={handleNext} />;
|
||||
case 3:
|
||||
return <AnalyticsStep onNext={handleNext} />;
|
||||
case 4:
|
||||
return <ConnectStep onNext={handleNext} />;
|
||||
case 5:
|
||||
case 4:
|
||||
return <GetStartedStep onComplete={handleComplete} />;
|
||||
default:
|
||||
return <FeaturesStep onNext={handleNext} />;
|
||||
@@ -81,14 +77,6 @@ const Onboarding = () => {
|
||||
</div>
|
||||
<ProgressIndicator currentStep={currentStep} totalSteps={totalSteps} />
|
||||
{renderStep()}
|
||||
{/* {currentStep > 1 && (
|
||||
<button
|
||||
onClick={handleBack}
|
||||
className="mt-6 outline-none border-none w-full opacity-60 hover:opacity-100 text-sm font-medium transition-opacity"
|
||||
>
|
||||
← Back
|
||||
</button>
|
||||
)} */}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { useState } from "react";
|
||||
|
||||
interface AnalyticsStepProps {
|
||||
onNext: () => void;
|
||||
onNext: (analyticsEnabled: boolean) => void;
|
||||
}
|
||||
|
||||
const AnalyticsStep = ({ onNext }: AnalyticsStepProps) => {
|
||||
@@ -113,7 +113,7 @@ const AnalyticsStep = ({ onNext }: AnalyticsStepProps) => {
|
||||
</div>
|
||||
|
||||
<button
|
||||
onClick={onNext}
|
||||
onClick={() => onNext(selectedOption === "shareAnalytics")}
|
||||
className="btn-primary w-full py-2.5 text-sm font-medium rounded-xl"
|
||||
>
|
||||
Continue
|
||||
|
||||
@@ -0,0 +1,135 @@
|
||||
/**
|
||||
* Analytics & Sentry service
|
||||
*
|
||||
* Manages Sentry error reporting gated behind user analytics consent.
|
||||
* Designed to capture ONLY:
|
||||
* - Error message & stack trace
|
||||
* - Device / browser metadata (via Sentry's default user-agent parsing)
|
||||
* - Source file location (via source maps)
|
||||
*
|
||||
* Explicitly strips:
|
||||
* - All breadcrumbs (console, click, network, etc.)
|
||||
* - Redux state / localStorage / sessionStorage
|
||||
* - User PII (IP address, cookies)
|
||||
* - Request bodies / headers
|
||||
* - Session replay
|
||||
*/
|
||||
|
||||
import * as Sentry from "@sentry/react";
|
||||
import { store } from "../store";
|
||||
|
||||
const SENTRY_DSN = import.meta.env.VITE_SENTRY_DSN as string | undefined;
|
||||
const IS_DEV = Boolean(import.meta.env.DEV) || import.meta.env.MODE === "development";
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Helpers
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/** Check if the current user has opted into analytics. */
|
||||
export function isAnalyticsEnabled(): boolean {
|
||||
const state = store.getState();
|
||||
const userId = state.user?.user?._id;
|
||||
if (!userId) return false;
|
||||
return state.auth.isAnalyticsEnabledByUser[userId] === true;
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Sentry initialisation
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
export function initSentry(): void {
|
||||
if (!SENTRY_DSN) return;
|
||||
|
||||
Sentry.init({
|
||||
dsn: SENTRY_DSN,
|
||||
environment: IS_DEV ? "development" : "production",
|
||||
enabled: !IS_DEV, // disable in dev builds
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// Privacy: disable EVERYTHING that could leak sensitive state
|
||||
// -----------------------------------------------------------------------
|
||||
|
||||
// No session replay
|
||||
replaysSessionSampleRate: 0,
|
||||
replaysOnErrorSampleRate: 0,
|
||||
|
||||
// No performance / tracing
|
||||
tracesSampleRate: 0,
|
||||
|
||||
// No breadcrumbs at all (console, clicks, network, etc.)
|
||||
defaultIntegrations: false,
|
||||
integrations: [
|
||||
// Only keep the bare-minimum integrations for stack traces
|
||||
Sentry.functionToStringIntegration(),
|
||||
Sentry.linkedErrorsIntegration(),
|
||||
Sentry.dedupeIntegration(),
|
||||
Sentry.browserApiErrorsIntegration(),
|
||||
Sentry.globalHandlersIntegration(),
|
||||
],
|
||||
|
||||
// Strip IP address
|
||||
sendDefaultPii: false,
|
||||
|
||||
// -----------------------------------------------------------------------
|
||||
// Gate every event behind the user's analytics consent flag
|
||||
// -----------------------------------------------------------------------
|
||||
beforeSend(event) {
|
||||
if (!isAnalyticsEnabled()) return null;
|
||||
|
||||
// Strip any breadcrumbs that somehow snuck in
|
||||
event.breadcrumbs = [];
|
||||
|
||||
// Strip request data (cookies, headers, body)
|
||||
delete event.request;
|
||||
|
||||
// Strip user PII — keep only a stable anonymous ID
|
||||
const userId = store.getState().user?.user?._id;
|
||||
event.user = userId ? { id: userId } : undefined;
|
||||
|
||||
// Strip any extra/contexts that could contain Redux or localStorage data
|
||||
delete event.extra;
|
||||
event.contexts = {
|
||||
// Keep only OS / browser / device metadata
|
||||
os: event.contexts?.os,
|
||||
browser: event.contexts?.browser,
|
||||
device: event.contexts?.device,
|
||||
};
|
||||
|
||||
return event;
|
||||
},
|
||||
|
||||
beforeSendTransaction() {
|
||||
// Block all transactions (performance traces)
|
||||
return null;
|
||||
},
|
||||
|
||||
// Ignore common non-actionable errors
|
||||
ignoreErrors: [
|
||||
"ResizeObserver loop",
|
||||
"Network request failed",
|
||||
"Load failed",
|
||||
"AbortError",
|
||||
],
|
||||
});
|
||||
}
|
||||
|
||||
// ---------------------------------------------------------------------------
|
||||
// Consent sync — call when the user toggles analytics on/off
|
||||
// ---------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Re-sync Sentry's enabled state after the user changes their consent.
|
||||
* Called from onboarding and settings.
|
||||
*/
|
||||
export function syncAnalyticsConsent(enabled: boolean): void {
|
||||
const client = Sentry.getClient();
|
||||
if (!client) return;
|
||||
|
||||
if (enabled) {
|
||||
// Client is already initialised; events will pass through beforeSend
|
||||
// because isAnalyticsEnabled() will now return true.
|
||||
} else {
|
||||
// Flush any pending events, then future events will be dropped by beforeSend.
|
||||
void Sentry.flush(2000);
|
||||
}
|
||||
}
|
||||
+11
-1
@@ -5,11 +5,14 @@ export interface AuthState {
|
||||
token: string | null;
|
||||
/** Onboarding completion per user id */
|
||||
isOnboardedByUser: Record<string, boolean>;
|
||||
/** Analytics consent per user id (opt-in during onboarding) */
|
||||
isAnalyticsEnabledByUser: Record<string, boolean>;
|
||||
}
|
||||
|
||||
const initialState: AuthState = {
|
||||
token: null,
|
||||
isOnboardedByUser: {},
|
||||
isAnalyticsEnabledByUser: {},
|
||||
};
|
||||
|
||||
const authSlice = createSlice({
|
||||
@@ -29,6 +32,13 @@ const authSlice = createSlice({
|
||||
const { userId, value } = action.payload;
|
||||
state.isOnboardedByUser[userId] = value;
|
||||
},
|
||||
setAnalyticsForUser: (
|
||||
state,
|
||||
action: PayloadAction<{ userId: string; enabled: boolean }>,
|
||||
) => {
|
||||
const { userId, enabled } = action.payload;
|
||||
state.isAnalyticsEnabledByUser[userId] = enabled;
|
||||
},
|
||||
},
|
||||
});
|
||||
|
||||
@@ -41,5 +51,5 @@ export const clearToken = createAsyncThunk(
|
||||
},
|
||||
);
|
||||
|
||||
export const { setToken, setOnboardedForUser } = authSlice.actions;
|
||||
export const { setToken, setOnboardedForUser, setAnalyticsForUser } = authSlice.actions;
|
||||
export default authSlice.reducer;
|
||||
|
||||
+1
-1
@@ -24,7 +24,7 @@ import { initialState as telegramInitialState } from "./telegram/types";
|
||||
const authPersistConfig = {
|
||||
key: "auth",
|
||||
storage,
|
||||
whitelist: ["token", "isOnboardedByUser"],
|
||||
whitelist: ["token", "isOnboardedByUser", "isAnalyticsEnabledByUser"],
|
||||
};
|
||||
|
||||
// Strip volatile runtime fields from each per-user Telegram state on rehydrate.
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.6.tgz"
|
||||
integrity sha512-2lfu57JtzctfIrcGMz992hyLlByuzgIk58+hhGCxjKZ3rWI82NnVLjXcaTqkI2NvlcvOskZaiZ5kjUALo3Lpxg==
|
||||
|
||||
"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.28.0":
|
||||
"@babel/core@^7.28.0":
|
||||
version "7.28.6"
|
||||
resolved "https://registry.npmjs.org/@babel/core/-/core-7.28.6.tgz"
|
||||
integrity sha512-H3mcG6ZDLTlYfaSNi0iOKkigqMFvkTKlGUYlD8GW7nNOYRrevuA46iTypPyv+06V3fEmvvazfntkBU34L0azAw==
|
||||
@@ -180,16 +180,16 @@
|
||||
resolved "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz"
|
||||
integrity sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==
|
||||
|
||||
"@esbuild/android-arm@0.27.2":
|
||||
version "0.27.2"
|
||||
resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz"
|
||||
integrity sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==
|
||||
|
||||
"@esbuild/android-arm64@0.27.2":
|
||||
version "0.27.2"
|
||||
resolved "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz"
|
||||
integrity sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==
|
||||
|
||||
"@esbuild/android-arm@0.27.2":
|
||||
version "0.27.2"
|
||||
resolved "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz"
|
||||
integrity sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==
|
||||
|
||||
"@esbuild/android-x64@0.27.2":
|
||||
version "0.27.2"
|
||||
resolved "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz"
|
||||
@@ -215,16 +215,16 @@
|
||||
resolved "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz"
|
||||
integrity sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==
|
||||
|
||||
"@esbuild/linux-arm@0.27.2":
|
||||
version "0.27.2"
|
||||
resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz"
|
||||
integrity sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==
|
||||
|
||||
"@esbuild/linux-arm64@0.27.2":
|
||||
version "0.27.2"
|
||||
resolved "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz"
|
||||
integrity sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==
|
||||
|
||||
"@esbuild/linux-arm@0.27.2":
|
||||
version "0.27.2"
|
||||
resolved "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz"
|
||||
integrity sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==
|
||||
|
||||
"@esbuild/linux-ia32@0.27.2":
|
||||
version "0.27.2"
|
||||
resolved "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz"
|
||||
@@ -347,7 +347,7 @@
|
||||
"@nodelib/fs.stat" "2.0.5"
|
||||
run-parallel "^1.1.9"
|
||||
|
||||
"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5":
|
||||
"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2":
|
||||
version "2.0.5"
|
||||
resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
|
||||
integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==
|
||||
@@ -520,6 +520,60 @@
|
||||
resolved "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.56.0.tgz"
|
||||
integrity sha512-H8AE9Ur/t0+1VXujj90w0HrSOuv0Nq9r1vSZF2t5km20NTfosQsGGUXDaKdQZzwuLts7IyL1fYT4hM95TI9c4g==
|
||||
|
||||
"@sentry-internal/browser-utils@10.38.0":
|
||||
version "10.38.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry-internal/browser-utils/-/browser-utils-10.38.0.tgz#576780062808bd3bae21476393f50caf9acbe12f"
|
||||
integrity sha512-UOJtYmdcxHCcV0NPfXFff/a95iXl/E0EhuQ1y0uE0BuZDMupWSF5t2BgC4HaE5Aw3RTjDF3XkSHWoIF6ohy7eA==
|
||||
dependencies:
|
||||
"@sentry/core" "10.38.0"
|
||||
|
||||
"@sentry-internal/feedback@10.38.0":
|
||||
version "10.38.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry-internal/feedback/-/feedback-10.38.0.tgz#c15b00513cddfbe839dbb86684115ec4860abd58"
|
||||
integrity sha512-JXneg9zRftyfy1Fyfc39bBlF/Qd8g4UDublFFkVvdc1S6JQPlK+P6q22DKz3Pc8w3ySby+xlIq/eTu9Pzqi4KA==
|
||||
dependencies:
|
||||
"@sentry/core" "10.38.0"
|
||||
|
||||
"@sentry-internal/replay-canvas@10.38.0":
|
||||
version "10.38.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry-internal/replay-canvas/-/replay-canvas-10.38.0.tgz#40fc937e2d05f9819b68c4c5d4d69e789c324823"
|
||||
integrity sha512-OXWM9jEqNYh4VTvrMu7v+z1anz+QKQ/fZXIZdsO7JTT2lGNZe58UUMeoq386M+Saxen8F9SUH7yTORy/8KI5qw==
|
||||
dependencies:
|
||||
"@sentry-internal/replay" "10.38.0"
|
||||
"@sentry/core" "10.38.0"
|
||||
|
||||
"@sentry-internal/replay@10.38.0":
|
||||
version "10.38.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry-internal/replay/-/replay-10.38.0.tgz#b901acf514265bf882e3e4ad849e6d9dd8276633"
|
||||
integrity sha512-YWIkL6/dnaiQyFiZXJ/nN+NXGv/15z45ia86bE/TMq01CubX/DUOilgsFz0pk2v/pg3tp/U2MskLO9Hz0cnqeg==
|
||||
dependencies:
|
||||
"@sentry-internal/browser-utils" "10.38.0"
|
||||
"@sentry/core" "10.38.0"
|
||||
|
||||
"@sentry/browser@10.38.0":
|
||||
version "10.38.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/browser/-/browser-10.38.0.tgz#2409e3982756ae8a0b3e46c701a51b63d4ed84cc"
|
||||
integrity sha512-3phzp1YX4wcQr9mocGWKbjv0jwtuoDBv7+Y6Yfrys/kwyaL84mDLjjQhRf4gL5SX7JdYkhBp4WaiNlR0UC4kTA==
|
||||
dependencies:
|
||||
"@sentry-internal/browser-utils" "10.38.0"
|
||||
"@sentry-internal/feedback" "10.38.0"
|
||||
"@sentry-internal/replay" "10.38.0"
|
||||
"@sentry-internal/replay-canvas" "10.38.0"
|
||||
"@sentry/core" "10.38.0"
|
||||
|
||||
"@sentry/core@10.38.0":
|
||||
version "10.38.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/core/-/core-10.38.0.tgz#391f2535fde084e3eff4b1d2d634aa5619629b34"
|
||||
integrity sha512-1pubWDZE5y5HZEPMAZERP4fVl2NH3Ihp1A+vMoVkb3Qc66Diqj1WierAnStlZP7tCx0TBa0dK85GTW/ZFYyB9g==
|
||||
|
||||
"@sentry/react@^10.38.0":
|
||||
version "10.38.0"
|
||||
resolved "https://registry.yarnpkg.com/@sentry/react/-/react-10.38.0.tgz#e9a8509694aff12132791410db96fa2aed9a06d6"
|
||||
integrity sha512-3UiKo6QsqTyPGUt0XWRY9KLaxc/cs6Kz4vlldBSOXEL6qPDL/EfpwNJT61osRo81VFWu8pKu7ZY2bvLPryrnBQ==
|
||||
dependencies:
|
||||
"@sentry/browser" "10.38.0"
|
||||
"@sentry/core" "10.38.0"
|
||||
|
||||
"@socket.io/component-emitter@~3.1.0":
|
||||
version "3.1.2"
|
||||
resolved "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz"
|
||||
@@ -693,7 +747,7 @@
|
||||
resolved "https://registry.npmjs.org/@types/deep-eql/-/deep-eql-4.0.2.tgz"
|
||||
integrity sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==
|
||||
|
||||
"@types/estree@^1.0.0", "@types/estree@1.0.8":
|
||||
"@types/estree@1.0.8", "@types/estree@^1.0.0":
|
||||
version "1.0.8"
|
||||
resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz"
|
||||
integrity sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==
|
||||
@@ -708,7 +762,7 @@
|
||||
resolved "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz"
|
||||
integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==
|
||||
|
||||
"@types/node@^20.0.0 || ^22.0.0 || >=24.0.0", "@types/node@^20.19.0 || >=22.12.0", "@types/node@^25.0.10":
|
||||
"@types/node@^25.0.10":
|
||||
version "25.0.10"
|
||||
resolved "https://registry.npmjs.org/@types/node/-/node-25.0.10.tgz"
|
||||
integrity sha512-zWW5KPngR/yvakJgGOmZ5vTBemDoSqF3AcV/LrO5u5wTWyEAVVh+IT39G4gtyAkh3CtTZs8aX/yRM82OfzHJRg==
|
||||
@@ -737,7 +791,7 @@
|
||||
"@types/history" "^4.7.11"
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react@*", "@types/react@^18.2.25 || ^19", "@types/react@^19.1.8", "@types/react@^19.2.0", "@types/react@>=18.0.0":
|
||||
"@types/react@*", "@types/react@^19.1.8":
|
||||
version "19.2.9"
|
||||
resolved "https://registry.npmjs.org/@types/react/-/react-19.2.9.tgz"
|
||||
integrity sha512-Lpo8kgb/igvMIPeNV2rsYKTgaORYdO1XGVZ4Qz3akwOj0ySGYMPlQWa8BaLn0G63D1aSaAQ5ldR06wCpChQCjA==
|
||||
@@ -939,17 +993,7 @@ binary-extensions@^2.0.0:
|
||||
resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz"
|
||||
integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==
|
||||
|
||||
bn.js@^4.0.0:
|
||||
version "4.12.2"
|
||||
resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz"
|
||||
integrity sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==
|
||||
|
||||
bn.js@^4.1.0:
|
||||
version "4.12.2"
|
||||
resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz"
|
||||
integrity sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==
|
||||
|
||||
bn.js@^4.11.9:
|
||||
bn.js@^4.0.0, bn.js@^4.1.0, bn.js@^4.11.9:
|
||||
version "4.12.2"
|
||||
resolved "https://registry.npmjs.org/bn.js/-/bn.js-4.12.2.tgz"
|
||||
integrity sha512-n4DSx829VRTRByMRGdjQ9iqsN0Bh4OolPsFnaZBLcbi8iXcB+kJ9s7EnRt4wILZNV3kPLHkRVfOc/HvhC3ovDw==
|
||||
@@ -1040,7 +1084,7 @@ browserify-zlib@^0.2.0:
|
||||
dependencies:
|
||||
pako "~1.0.5"
|
||||
|
||||
browserslist@^4.24.0, browserslist@^4.28.1, "browserslist@>= 4.21.0":
|
||||
browserslist@^4.24.0, browserslist@^4.28.1:
|
||||
version "4.28.1"
|
||||
resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.28.1.tgz"
|
||||
integrity sha512-ZC5Bd0LgJXgwGqUknZY/vkUQ04r8NXnJZ3yYi4vDmSiZmC/pdSN0NbNRPxZpbtO4uAfDUAFffO8IZoM3Gj8IkA==
|
||||
@@ -1243,7 +1287,7 @@ csstype@^3.2.2:
|
||||
resolved "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz"
|
||||
integrity sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==
|
||||
|
||||
d@^1.0.1, d@^1.0.2, d@1:
|
||||
d@1, d@^1.0.1, d@^1.0.2:
|
||||
version "1.0.2"
|
||||
resolved "https://registry.npmjs.org/d/-/d-1.0.2.tgz"
|
||||
integrity sha512-MOqHvMWF9/9MX6nza0KgvFH4HpMU0EF5uUDXqX/BtxtU8NfB0QzRtJ8Oe/6SuS4kbhyzVJwjd97EA4PKrzJ8bw==
|
||||
@@ -1633,7 +1677,7 @@ get-proto@^1.0.1:
|
||||
dunder-proto "^1.0.1"
|
||||
es-object-atoms "^1.0.0"
|
||||
|
||||
glob-parent@^5.1.2:
|
||||
glob-parent@^5.1.2, glob-parent@~5.1.2:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
|
||||
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
|
||||
@@ -1647,13 +1691,6 @@ glob-parent@^6.0.2:
|
||||
dependencies:
|
||||
is-glob "^4.0.3"
|
||||
|
||||
glob-parent@~5.1.2:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
|
||||
integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
|
||||
dependencies:
|
||||
is-glob "^4.0.1"
|
||||
|
||||
gopd@^1.0.1, gopd@^1.2.0:
|
||||
version "1.2.0"
|
||||
resolved "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz"
|
||||
@@ -1755,7 +1792,7 @@ ieee754@^1.1.13, ieee754@^1.2.1:
|
||||
resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz"
|
||||
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
|
||||
|
||||
immer@^11.0.0, immer@>=9.0.6:
|
||||
immer@^11.0.0:
|
||||
version "11.1.3"
|
||||
resolved "https://registry.npmjs.org/immer/-/immer-11.1.3.tgz"
|
||||
integrity sha512-6jQTc5z0KJFtr1UgFpIL3N9XSC3saRaI9PwWtzM2pSqkNGtiNkYY2OSwkOGDK2XcTRcLb1pi/aNkKZz0nxVH4Q==
|
||||
@@ -2036,16 +2073,16 @@ minimalistic-crypto-utils@^1.0.1:
|
||||
resolved "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz"
|
||||
integrity sha512-JIYlbt6g8i5jKfJ3xz7rF0LXmv2TkDxBLUkiBeZ7bAx4GnnNMr8xFpGnOxn6GhTEHx3SjRrZEoU+j04prX1ktg==
|
||||
|
||||
ms@^2.1.3:
|
||||
version "2.1.3"
|
||||
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
|
||||
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
|
||||
|
||||
ms@2.0.0:
|
||||
version "2.0.0"
|
||||
resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
|
||||
integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
|
||||
|
||||
ms@^2.1.3:
|
||||
version "2.1.3"
|
||||
resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
|
||||
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
|
||||
|
||||
mz@^2.7.0:
|
||||
version "2.7.0"
|
||||
resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz"
|
||||
@@ -2242,22 +2279,12 @@ picocolors@^1.1.1:
|
||||
resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz"
|
||||
integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==
|
||||
|
||||
picomatch@^2.0.4:
|
||||
picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
|
||||
version "2.3.1"
|
||||
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
|
||||
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
|
||||
|
||||
picomatch@^2.2.1:
|
||||
version "2.3.1"
|
||||
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
|
||||
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
|
||||
|
||||
picomatch@^2.3.1:
|
||||
version "2.3.1"
|
||||
resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
|
||||
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
|
||||
|
||||
"picomatch@^3 || ^4", picomatch@^4.0.2, picomatch@^4.0.3:
|
||||
picomatch@^4.0.2, picomatch@^4.0.3:
|
||||
version "4.0.3"
|
||||
resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz"
|
||||
integrity sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==
|
||||
@@ -2314,22 +2341,6 @@ postcss-nested@^6.2.0:
|
||||
dependencies:
|
||||
postcss-selector-parser "^6.1.1"
|
||||
|
||||
postcss-selector-parser@^6.1.1:
|
||||
version "6.1.2"
|
||||
resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz"
|
||||
integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==
|
||||
dependencies:
|
||||
cssesc "^3.0.0"
|
||||
util-deprecate "^1.0.2"
|
||||
|
||||
postcss-selector-parser@^6.1.2:
|
||||
version "6.1.2"
|
||||
resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz"
|
||||
integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==
|
||||
dependencies:
|
||||
cssesc "^3.0.0"
|
||||
util-deprecate "^1.0.2"
|
||||
|
||||
postcss-selector-parser@6.0.10:
|
||||
version "6.0.10"
|
||||
resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz"
|
||||
@@ -2338,12 +2349,20 @@ postcss-selector-parser@6.0.10:
|
||||
cssesc "^3.0.0"
|
||||
util-deprecate "^1.0.2"
|
||||
|
||||
postcss-selector-parser@^6.1.1, postcss-selector-parser@^6.1.2:
|
||||
version "6.1.2"
|
||||
resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz"
|
||||
integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==
|
||||
dependencies:
|
||||
cssesc "^3.0.0"
|
||||
util-deprecate "^1.0.2"
|
||||
|
||||
postcss-value-parser@^4.0.0, postcss-value-parser@^4.2.0:
|
||||
version "4.2.0"
|
||||
resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz"
|
||||
integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
|
||||
|
||||
postcss@^8.0.0, postcss@^8.1.0, postcss@^8.2.14, postcss@^8.4.21, postcss@^8.4.47, postcss@^8.5.6, postcss@>=8.0.9:
|
||||
postcss@^8.4.47, postcss@^8.5.6:
|
||||
version "8.5.6"
|
||||
resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz"
|
||||
integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==
|
||||
@@ -2416,14 +2435,14 @@ randomfill@^1.0.4:
|
||||
randombytes "^2.0.5"
|
||||
safe-buffer "^5.1.0"
|
||||
|
||||
"react-dom@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", react-dom@^19.1.0, react-dom@>=18:
|
||||
react-dom@^19.1.0:
|
||||
version "19.2.4"
|
||||
resolved "https://registry.npmjs.org/react-dom/-/react-dom-19.2.4.tgz"
|
||||
integrity sha512-AXJdLo8kgMbimY95O2aKQqsz2iWi9jMgKJhRBAxECE4IFxfcazB2LmzloIoibJI3C12IlY20+KFaLv+71bUJeQ==
|
||||
dependencies:
|
||||
scheduler "^0.27.0"
|
||||
|
||||
"react-redux@^7.2.1 || ^8.1.3 || ^9.0.0", react-redux@^9.2.0:
|
||||
react-redux@^9.2.0:
|
||||
version "9.2.0"
|
||||
resolved "https://registry.npmjs.org/react-redux/-/react-redux-9.2.0.tgz"
|
||||
integrity sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==
|
||||
@@ -2451,7 +2470,7 @@ react-router@7.13.0:
|
||||
cookie "^1.0.1"
|
||||
set-cookie-parser "^2.6.0"
|
||||
|
||||
"react@^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0", "react@^16.9.0 || ^17.0.0 || ^18 || ^19", "react@^18.0 || ^19", react@^19.1.0, react@^19.2.4, react@>=18, react@>=18.0.0:
|
||||
react@^19.1.0:
|
||||
version "19.2.4"
|
||||
resolved "https://registry.npmjs.org/react/-/react-19.2.4.tgz"
|
||||
integrity sha512-9nfp2hYpCwOjAN+8TZFGhtWEwgvWHXqESH8qT89AT/lWklpLON22Lc8pEtnpsZz7VmawabSU0gCjnj8aC0euHQ==
|
||||
@@ -2514,7 +2533,7 @@ redux-thunk@^3.1.0:
|
||||
resolved "https://registry.npmjs.org/redux-thunk/-/redux-thunk-3.1.0.tgz"
|
||||
integrity sha512-NW2r5T6ksUKXCabzhL9z+h206HQw/NJkcLm1GPImRQ8IzfXwRGqjVhKJGauHirT0DAuyy6hjdnMZaRoAcy0Klw==
|
||||
|
||||
redux@^5.0.0, redux@^5.0.1, redux@>4.0.0:
|
||||
redux@^5.0.0, redux@^5.0.1:
|
||||
version "5.0.1"
|
||||
resolved "https://registry.npmjs.org/redux/-/redux-5.0.1.tgz"
|
||||
integrity sha512-M9/ELqF6fy8FwmkpnF0S3YKOqMyoWJ4+CS5Efg2ct3oY9daQvd/Pc71FpGZsVsbl3Cpb+IIcjBDUnnyBdQbq4w==
|
||||
@@ -2546,7 +2565,7 @@ ripemd160@^2.0.0, ripemd160@^2.0.1, ripemd160@^2.0.3:
|
||||
hash-base "^3.1.2"
|
||||
inherits "^2.0.4"
|
||||
|
||||
rollup@^1.20.0||^2.0.0||^3.0.0||^4.0.0, rollup@^4.43.0:
|
||||
rollup@^4.43.0:
|
||||
version "4.56.0"
|
||||
resolved "https://registry.npmjs.org/rollup/-/rollup-4.56.0.tgz"
|
||||
integrity sha512-9FwVqlgUHzbXtDg9RCMgodF3Ua4Na6Gau+Sdt9vyCN4RhHfVKX2DCHy3BjMLTDd47ITDhYAnTwGulWTblJSDLg==
|
||||
@@ -2592,12 +2611,7 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2,
|
||||
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
|
||||
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
|
||||
|
||||
safe-buffer@~5.1.0:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
|
||||
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
|
||||
|
||||
safe-buffer@~5.1.1:
|
||||
safe-buffer@~5.1.0, safe-buffer@~5.1.1:
|
||||
version "5.1.2"
|
||||
resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
|
||||
integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
|
||||
@@ -2815,7 +2829,7 @@ supports-preserve-symlinks-flag@^1.0.0:
|
||||
resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
|
||||
integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
|
||||
|
||||
tailwindcss@^3.4.19, "tailwindcss@>=3.0.0 || >= 3.0.0-alpha.1 || >= 4.0.0-alpha.20 || >= 4.0.0-beta.1", "tailwindcss@>=3.0.0 || insiders || >=4.0.0-alpha.20 || >=4.0.0-beta.1":
|
||||
tailwindcss@^3.4.19:
|
||||
version "3.4.19"
|
||||
resolved "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.19.tgz"
|
||||
integrity sha512-3ofp+LL8E+pK/JuPLPggVAIaEuhvIz4qNcf3nA1Xn2o/7fb7s/TYpHhwGDv1ZU3PkBluUVaF8PyCHcm48cKLWQ==
|
||||
@@ -2993,12 +3007,12 @@ url@^0.11.4:
|
||||
punycode "^1.4.1"
|
||||
qs "^6.12.3"
|
||||
|
||||
use-sync-external-store@^1.4.0, use-sync-external-store@>=1.2.0:
|
||||
use-sync-external-store@^1.4.0:
|
||||
version "1.6.0"
|
||||
resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz"
|
||||
integrity sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==
|
||||
|
||||
utf-8-validate@^5.0.2, utf-8-validate@^5.0.5, utf-8-validate@>=5.0.2:
|
||||
utf-8-validate@^5.0.2, utf-8-validate@^5.0.5:
|
||||
version "5.0.10"
|
||||
resolved "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.10.tgz"
|
||||
integrity sha512-Z6czzLq4u8fPOyx7TU6X3dvUZVvoJmxSQ+IcrlmagKhilxlhZgxPK6C5Jqbkw1IDUmFTM+cz9QDnnLTwDz/2gQ==
|
||||
@@ -3029,7 +3043,7 @@ vite-plugin-node-polyfills@^0.25.0:
|
||||
"@rollup/plugin-inject" "^5.0.5"
|
||||
node-stdlib-browser "^1.3.1"
|
||||
|
||||
"vite@^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", "vite@^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", "vite@^6.0.0 || ^7.0.0", "vite@^6.0.0 || ^7.0.0-0", vite@^7.0.4:
|
||||
"vite@^6.0.0 || ^7.0.0", vite@^7.0.4:
|
||||
version "7.3.1"
|
||||
resolved "https://registry.npmjs.org/vite/-/vite-7.3.1.tgz"
|
||||
integrity sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA==
|
||||
@@ -3043,7 +3057,7 @@ vite-plugin-node-polyfills@^0.25.0:
|
||||
optionalDependencies:
|
||||
fsevents "~2.3.3"
|
||||
|
||||
vitest@^4.0.18, vitest@4.0.18:
|
||||
vitest@^4.0.18:
|
||||
version "4.0.18"
|
||||
resolved "https://registry.npmjs.org/vitest/-/vitest-4.0.18.tgz"
|
||||
integrity sha512-hOQuK7h0FGKgBAas7v0mSAsnvrIgAvWmRFjmzpJ7SwFHH3g1k2u37JtYwOwmEKhK6ZO3v9ggDBBm0La1LCK4uQ==
|
||||
|
||||
Reference in New Issue
Block a user