From fd8afc437445d743cbbbf8bf81a706aaeb58f526 Mon Sep 17 00:00:00 2001
From: Harshith Mohan <26010946+harshithmohan@users.noreply.github.com>
Date: Sun, 15 Dec 2024 16:36:24 +0530
Subject: [PATCH 1/3] Add missing-episodes util
---
.../Utilities/ReleaseManagement/Episode.tsx | 11 +-
.../ReleaseManagement/SeriesList.tsx | 82 +++++++++--
.../Utilities/ReleaseManagement/Title.tsx | 2 +
src/core/react-query/episode/mutations.ts | 4 +-
.../react-query/release-management/queries.ts | 9 +-
.../react-query/release-management/types.ts | 8 ++
src/core/router/index.tsx | 3 +-
src/pages/utilities/ReleaseManagement.tsx | 127 ++++++++++++++----
8 files changed, 193 insertions(+), 53 deletions(-)
diff --git a/src/components/Utilities/ReleaseManagement/Episode.tsx b/src/components/Utilities/ReleaseManagement/Episode.tsx
index a87d96fdd..751278100 100644
--- a/src/components/Utilities/ReleaseManagement/Episode.tsx
+++ b/src/components/Utilities/ReleaseManagement/Episode.tsx
@@ -5,13 +5,14 @@ import { countBy, flatMap, forEach, map, toNumber } from 'lodash';
import FileInfo from '@/components/FileInfo';
import Select from '@/components/Input/Select';
+import { ReleaseManagementItemType } from '@/core/react-query/release-management/types';
import { getEpisodePrefix } from '@/core/utilities/getEpisodePrefix';
import type { ReleaseManagementOptionsType } from '@/components/Utilities/constants';
import type { EpisodeType } from '@/core/types/api/episode';
type Props = {
- type: 'multiples' | 'duplicates';
+ type: ReleaseManagementItemType;
episode: EpisodeType | undefined;
setFileOptions: (options: ReleaseManagementOptionsType) => void;
};
@@ -22,7 +23,7 @@ const Episode = ({ episode, setFileOptions, type }: Props) => {
const tempOptions: ReleaseManagementOptionsType = {};
if (!episode) return tempOptions;
- if (type === 'multiples') {
+ if (type === ReleaseManagementItemType.MultipleReleases) {
forEach(episode.Files, (file) => {
if (file.IsVariation) tempOptions[file.ID] = 'variation';
else tempOptions[file.ID] = 'keep';
@@ -61,7 +62,7 @@ const Episode = ({ episode, setFileOptions, type }: Props) => {
{optionCounts.keep ?? 0}
Kept |
- {type === 'multiples' && (
+ {type === ReleaseManagementItemType.MultipleReleases && (
<>
{optionCounts.variation ?? 0}
Variation |
@@ -72,7 +73,7 @@ const Episode = ({ episode, setFileOptions, type }: Props) => {
- {type === 'duplicates' && flatMap(episode.Files, file =>
+ {type === ReleaseManagementItemType.DuplicateFiles && flatMap(episode.Files, file =>
map(file.Locations, (location, index) => {
const absolutePath = location.AbsolutePath ?? '??';
const fileName = absolutePath.split(/[/\\]+/).pop();
@@ -131,7 +132,7 @@ const Episode = ({ episode, setFileOptions, type }: Props) => {
);
}))}
- {type === 'multiples' && episode.Files?.map(file => (
+ {type === ReleaseManagementItemType.MultipleReleases && episode.Files?.map(file => (
= {
};
type Props = {
- type: 'multiples' | 'duplicates';
+ type: ReleaseManagementItemType;
ignoreVariations: boolean;
+ onlyCollecting: boolean;
onlyFinishedSeries: boolean;
setSelectedEpisode: (episode: EpisodeType) => void;
+ setSelectedEpisodes: (episodes: EpisodeType[]) => void;
setSelectedSeriesId: (id: number) => void;
setSeriesCount: (count: number) => void;
};
const SeriesList = (
- { ignoreVariations, onlyFinishedSeries, setSelectedEpisode, setSelectedSeriesId, setSeriesCount, type }: Props,
+ {
+ ignoreVariations,
+ onlyCollecting,
+ onlyFinishedSeries,
+ setSelectedEpisode,
+ setSelectedEpisodes,
+ setSelectedSeriesId,
+ setSeriesCount,
+ type,
+ }: Props,
) => {
const [selectedSeries, setSelectedSeries] = useState(0);
- const seriesQuery = useReleaseManagementSeries(type, { ignoreVariations, onlyFinishedSeries, pageSize: 25 });
+ const seriesQuery = useReleaseManagementSeries(
+ type,
+ { ignoreVariations, collecting: onlyCollecting, onlyFinishedSeries, pageSize: 25 },
+ );
const [series, seriesCount] = useFlattenListResult(seriesQuery.data);
const episodesQuery = useReleaseManagementSeriesEpisodes(
type,
selectedSeries,
- { ignoreVariations, includeDataFrom: ['AniDB'], includeAbsolutePaths: true, pageSize: 25 },
+ {
+ ignoreVariations,
+ collecting: onlyCollecting,
+ includeDataFrom: ['AniDB'],
+ includeAbsolutePaths: true,
+ pageSize: 25,
+ },
selectedSeries > 0,
);
const [episodes, episodeCount] = useFlattenListResult(episodesQuery.data);
+ const {
+ handleRowSelect,
+ rowSelection,
+ selectedRows,
+ setRowSelection,
+ } = useRowSelection
(episodes);
+
+ useEffect(() => {
+ setSelectedEpisodes(selectedRows);
+ }, [selectedRows, setSelectedEpisodes]);
+
+ const handleEpisodeSelect = useEventCallback((episodeId: number, select: boolean) => {
+ if (type === ReleaseManagementItemType.MissingEpisodes) handleRowSelect(episodeId, select);
+ else setSelectedEpisode(episodes.filter(episode => episode.IDs.ID === episodeId)[0]);
+ });
+
useEffect(() => {
setSelectedSeriesId(selectedSeries);
setSeriesCount(seriesCount);
@@ -161,10 +200,26 @@ const SeriesList = (
setSelectedSeries(0);
}, [seriesQuery.data]);
- const episodeColumns = useMemo(() => [
- episodeNameColumn,
- type === 'multiples' ? multiplesEpisodeFileCountColumn : duplicatesEpisodeFileCountColumn,
- ], [type]);
+ const episodeColumns = useMemo(() => {
+ if (type !== ReleaseManagementItemType.MissingEpisodes) {
+ return [
+ episodeNameColumn,
+ type === ReleaseManagementItemType.MultipleReleases
+ ? multiplesEpisodeFileCountColumn
+ : duplicatesEpisodeFileCountColumn,
+ ];
+ }
+
+ return [
+ episodeNameColumn,
+ {
+ id: 'selected-count',
+ name: selectedRows.length > 0 ? `${selectedRows.length} Selected` : '',
+ className: 'w-28 text-panel-text-important',
+ item: () => ,
+ },
+ ];
+ }, [selectedRows.length, type]);
return (
<>
@@ -178,7 +233,9 @@ const SeriesList = (
{!seriesQuery.isPending && seriesCount === 0 && (
No series with
- {type === 'multiples' ? ' multiple releases!' : ' duplicate files!'}
+ {type === ReleaseManagementItemType.MultipleReleases && ' multiple releases!'}
+ {type === ReleaseManagementItemType.DuplicateFiles && ' duplicate files!'}
+ {type === ReleaseManagementItemType.MissingEpisodes && ' missing episodes!'}
)}
@@ -197,7 +254,7 @@ const SeriesList = (
- {selectedSeries === 0 &&
Select Series to Populate
}
+ {selectedSeries === 0 &&
Select series to populate
}
{selectedSeries > 0 && episodesQuery.isPending && (
@@ -213,8 +270,9 @@ const SeriesList = (
isFetchingNextPage={episodesQuery.isFetchingNextPage}
rows={episodes}
skipSort
- handleRowSelect={(id, _) => setSelectedEpisode(episodes.filter(episode => episode.IDs.ID === id)[0])}
- rowSelection={{}}
+ handleRowSelect={handleEpisodeSelect}
+ rowSelection={rowSelection}
+ setSelectedRows={setRowSelection}
/>
)}
diff --git a/src/components/Utilities/ReleaseManagement/Title.tsx b/src/components/Utilities/ReleaseManagement/Title.tsx
index 1fdcb7089..c65fd24fd 100644
--- a/src/components/Utilities/ReleaseManagement/Title.tsx
+++ b/src/components/Utilities/ReleaseManagement/Title.tsx
@@ -21,6 +21,8 @@ const Title = () => (
|
+
|
+
);
diff --git a/src/core/react-query/episode/mutations.ts b/src/core/react-query/episode/mutations.ts
index 10f86f99e..bd2b15de5 100644
--- a/src/core/react-query/episode/mutations.ts
+++ b/src/core/react-query/episode/mutations.ts
@@ -9,7 +9,7 @@ import type { ListResultType } from '@/core/types/api';
import type { EpisodeType } from '@/core/types/api/episode';
import type { InfiniteData } from '@tanstack/react-query';
-export const useHideEpisodeMutation = (seriesId: number, nextUp = false) =>
+export const useHideEpisodeMutation = (seriesId?: number, nextUp = false) =>
useMutation({
mutationFn: ({ episodeId, hidden }: HideEpisodeRequestType) =>
axios.post(
@@ -23,6 +23,8 @@ export const useHideEpisodeMutation = (seriesId: number, nextUp = false) =>
},
),
onSuccess: () => {
+ if (!seriesId) return;
+
invalidateQueries(['series', seriesId, 'data']);
if (nextUp) {
diff --git a/src/core/react-query/release-management/queries.ts b/src/core/react-query/release-management/queries.ts
index 1ad7de7db..7ff0cf32e 100644
--- a/src/core/react-query/release-management/queries.ts
+++ b/src/core/react-query/release-management/queries.ts
@@ -3,6 +3,7 @@ import { useInfiniteQuery } from '@tanstack/react-query';
import { axios } from '@/core/axios';
import type {
+ ReleaseManagementItemType,
ReleaseManagementSeriesEpisodesType,
ReleaseManagementSeriesRequestType,
} from '@/core/react-query/release-management/types';
@@ -11,14 +12,14 @@ import type { EpisodeType } from '@/core/types/api/episode';
import type { ReleaseManagementSeriesType } from '@/core/types/api/series';
export const useReleaseManagementSeries = (
- type: 'multiples' | 'duplicates',
+ type: ReleaseManagementItemType,
params: ReleaseManagementSeriesRequestType,
) =>
useInfiniteQuery>({
queryKey: ['release-management', 'series', type, params],
queryFn: ({ pageParam }) =>
axios.get(
- `ReleaseManagement/${type === 'multiples' ? 'MultipleReleases' : 'DuplicateFiles'}/Series`,
+ `ReleaseManagement/${type}/Series`,
{
params: {
...params,
@@ -35,7 +36,7 @@ export const useReleaseManagementSeries = (
});
export const useReleaseManagementSeriesEpisodes = (
- type: 'multiples' | 'duplicates',
+ type: ReleaseManagementItemType,
seriesId: number,
params: ReleaseManagementSeriesEpisodesType,
enabled = true,
@@ -44,7 +45,7 @@ export const useReleaseManagementSeriesEpisodes = (
queryKey: ['release-management', 'series', 'episodes', type, seriesId, params],
queryFn: ({ pageParam }) =>
axios.get(
- `ReleaseManagement/${type === 'multiples' ? 'MultipleReleases' : 'DuplicateFiles'}/Series/${seriesId}/Episodes`,
+ `ReleaseManagement/${type}/Series/${seriesId}/Episodes`,
{
params: {
...params,
diff --git a/src/core/react-query/release-management/types.ts b/src/core/react-query/release-management/types.ts
index 17b4575e6..d5c97a157 100644
--- a/src/core/react-query/release-management/types.ts
+++ b/src/core/react-query/release-management/types.ts
@@ -1,9 +1,16 @@
import type { PaginationType } from '@/core/types/api';
import type { DataSourceType } from '@/core/types/api/common';
+export enum ReleaseManagementItemType {
+ MultipleReleases = 'MultipleReleases',
+ DuplicateFiles = 'DuplicateFiles',
+ MissingEpisodes = 'MissingEpisodes',
+}
+
export type ReleaseManagementSeriesRequestType = {
ignoreVariations?: boolean;
includeDataFrom?: DataSourceType[];
+ collecting?: boolean;
onlyFinishedSeries?: boolean;
} & PaginationType;
@@ -12,5 +19,6 @@ export type ReleaseManagementSeriesEpisodesType = {
includeFiles?: boolean;
includeMediaInfo?: boolean;
includeAbsolutePaths?: boolean;
+ collecting?: boolean;
ignoreVariations?: boolean;
} & PaginationType;
diff --git a/src/core/router/index.tsx b/src/core/router/index.tsx
index d9db4e36e..22bde907a 100644
--- a/src/core/router/index.tsx
+++ b/src/core/router/index.tsx
@@ -91,8 +91,7 @@ const router = sentryCreateBrowserRouter(
} />
} />
} />
- } />
- } />
+ } />
} />
} />
} />
diff --git a/src/pages/utilities/ReleaseManagement.tsx b/src/pages/utilities/ReleaseManagement.tsx
index 8fe6d52d4..ded42060a 100644
--- a/src/pages/utilities/ReleaseManagement.tsx
+++ b/src/pages/utilities/ReleaseManagement.tsx
@@ -1,5 +1,12 @@
-import React, { useEffect, useState } from 'react';
-import { mdiCloseCircleOutline, mdiFileDocumentMultipleOutline, mdiRefresh, mdiSelectMultiple } from '@mdi/js';
+import React, { useEffect, useMemo, useState } from 'react';
+import { useParams } from 'react-router';
+import {
+ mdiCloseCircleOutline,
+ mdiEyeOffOutline,
+ mdiFileDocumentMultipleOutline,
+ mdiRefresh,
+ mdiSelectMultiple,
+} from '@mdi/js';
import { Icon } from '@mdi/react';
import cx from 'classnames';
import { map, toNumber } from 'lodash';
@@ -16,43 +23,64 @@ import QuickSelectModal from '@/components/Utilities/ReleaseManagement/QuickSele
import SeriesList from '@/components/Utilities/ReleaseManagement/SeriesList';
import Title from '@/components/Utilities/ReleaseManagement/Title';
import MenuButton from '@/components/Utilities/Unrecognized/MenuButton';
+import { useHideEpisodeMutation } from '@/core/react-query/episode/mutations';
import {
useDeleteFileLocationMutation,
useDeleteFileMutation,
useMarkVariationMutation,
} from '@/core/react-query/file/mutations';
import { invalidateQueries, resetQueries } from '@/core/react-query/queryClient';
+import { ReleaseManagementItemType } from '@/core/react-query/release-management/types';
import useEventCallback from '@/hooks/useEventCallback';
import type { ReleaseManagementOptionsType } from '@/components/Utilities/constants';
import type { EpisodeType } from '@/core/types/api/episode';
import type { AxiosResponse } from 'axios';
-type Props = {
- type: 'multiples' | 'duplicates';
-};
+const titleMap = {
+ [ReleaseManagementItemType.MultipleReleases]: 'Multiple Releases',
+ [ReleaseManagementItemType.DuplicateFiles]: 'Duplicate Files',
+ [ReleaseManagementItemType.MissingEpisodes]: 'Missing Episodes',
+} as const;
+
+const ReleaseManagement = () => {
+ const { itemType } = useParams();
+
+ const type = useMemo(() => {
+ if (itemType === 'duplicates') return ReleaseManagementItemType.DuplicateFiles;
+ if (itemType === 'missing-episodes') return ReleaseManagementItemType.MissingEpisodes;
+ return ReleaseManagementItemType.MultipleReleases;
+ }, [itemType]);
-const ReleaseManagement = ({ type }: Props) => {
- const [ignoreVariations, toggleIgnoreVariations] = useToggle(true);
- const [onlyFinishedSeries, toggleOnlyFinishedSeries] = useToggle(false);
+ const [ignoreVariations, toggleIgnoreVariations, setIgnoreVariations] = useToggle(true);
+ const [onlyCollecting, toggleOnlyCollecting, setOnlyCollecting] = useToggle(false);
+ const [onlyFinishedSeries, toggleOnlyFinishedSeries, setOnlyFinishedSeries] = useToggle(false);
const [seriesCount, setSeriesCount] = useState(0);
const [selectedSeries, setSelectedSeries] = useState(0);
const [selectedEpisode, setSelectedEpisode] = useState();
+ const [selectedEpisodes, setSelectedEpisodes] = useState([]);
const [operationsPending, setOperationsPending] = useState(false);
const [fileOptions, setFileOptions] = useState({});
const [showQuickSelectModal, toggleShowQuickSelectModal] = useToggle(false);
- useEffect(() => () => {
+ useEffect(() => {
+ setIgnoreVariations(true);
+ setOnlyCollecting(false);
+ setOnlyFinishedSeries(false);
setSelectedSeries(0);
- }, []);
+ setSelectedEpisode(undefined);
+ setSelectedEpisodes([]);
+ }, [itemType, setIgnoreVariations, setOnlyCollecting, setOnlyFinishedSeries]);
const { mutateAsync: deleteFile } = useDeleteFileMutation();
const { mutateAsync: markVariation } = useMarkVariationMutation();
const { mutateAsync: deleteFileLocation } = useDeleteFileLocationMutation();
+ const { mutateAsync: hideEpisode } = useHideEpisodeMutation();
- const handleCheckboxChange = (checkboxType: 'variations' | 'series') => {
- if (checkboxType === 'variations') toggleIgnoreVariations();
- if (checkboxType === 'series') toggleOnlyFinishedSeries();
+ const handleCheckboxChange = (event: React.ChangeEvent) => {
+ if (event.target.id === 'ignore-variations') toggleIgnoreVariations();
+ if (event.target.id === 'only-collecting') toggleOnlyCollecting();
+ if (event.target.id === 'only-finished-series') toggleOnlyFinishedSeries();
};
const confirmChanges = useEventCallback(() => {
@@ -60,7 +88,7 @@ const ReleaseManagement = ({ type }: Props) => {
let operations: (Promise> | null)[];
- if (type === 'multiples') {
+ if (type === ReleaseManagementItemType.MultipleReleases) {
operations = map(fileOptions, (option, id) => {
if (!selectedEpisode) return null;
@@ -88,9 +116,24 @@ const ReleaseManagement = ({ type }: Props) => {
});
});
+ const hideEpisodes = useEventCallback(() => {
+ setOperationsPending(true);
+
+ const operations = map(selectedEpisodes, episode => hideEpisode({ episodeId: episode.IDs.ID, hidden: true }));
+
+ Promise.all(operations)
+ .then(() => toast.success('Successful!'))
+ .catch(() => toast.error('One or more operations failed!'))
+ .finally(() => {
+ setOperationsPending(false);
+ resetQueries(['release-management']);
+ setSelectedEpisodes([]);
+ });
+ });
+
return (
<>
- {`${type === 'multiples' ? 'Multiple Releases' : 'Duplicate Files'} | Shoko`}
+ {`${titleMap[type]} | Shoko`}
} options={
}>
@@ -106,20 +149,30 @@ const ReleaseManagement = ({ type }: Props) => {
name="Refresh"
/>
- {type === 'multiples' && (
+ {type === ReleaseManagementItemType.MultipleReleases && (
handleCheckboxChange('variations')}
+ onChange={handleCheckboxChange}
label="Ignore Variations"
labelRight
/>
)}
+ {type === ReleaseManagementItemType.MissingEpisodes && (
+
+ )}
+
handleCheckboxChange('series')}
+ onChange={handleCheckboxChange}
label="Only Finished Series"
labelRight
/>
@@ -137,7 +190,7 @@ const ReleaseManagement = ({ type }: Props) => {
{/* */}
{/* )} */}
- {(type === 'multiples' && !selectedEpisode) && (
+ {(type === ReleaseManagementItemType.MultipleReleases && !selectedEpisode) && (
)}
+ {(type === ReleaseManagementItemType.MissingEpisodes) && (
+
+ )}
+
{selectedEpisode && (
Date: Sun, 15 Dec 2024 16:55:58 +0530
Subject: [PATCH 2/3] Prepare for react-router v7
---
src/core/router/index.tsx | 12 +++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)
diff --git a/src/core/router/index.tsx b/src/core/router/index.tsx
index 22bde907a..0e74430e6 100644
--- a/src/core/router/index.tsx
+++ b/src/core/router/index.tsx
@@ -129,6 +129,11 @@ const router = sentryCreateBrowserRouter(
,
),
+ {
+ future: {
+ v7_relativeSplatPath: true,
+ },
+ },
);
const Router = () => {
@@ -158,7 +163,12 @@ const Router = () => {
return (
-
+
);
From 22a66dd071cdaab093314e0a4fc6597382edaeea Mon Sep 17 00:00:00 2001
From: Harshith Mohan <26010946+harshithmohan@users.noreply.github.com>
Date: Sun, 15 Dec 2024 17:28:46 +0530
Subject: [PATCH 3/3] Update react-router to v7, update other deps
---
.eslintrc.json | 1 +
package.json | 31 +-
pnpm-lock.yaml | 781 +++++++++---------
src/components/Collection/CollectionTitle.tsx | 3 +-
src/components/Collection/CollectionView.tsx | 2 +-
.../Collection/Episode/EpisodeSummary.tsx | 2 +-
src/components/Collection/ListViewItem.tsx | 2 +-
src/components/Collection/PosterViewItem.tsx | 2 +-
.../EditSeriesTabs/DeleteActionsTab.tsx | 4 +-
src/components/Collection/SeriesInfo.tsx | 4 +-
src/components/Collection/SeriesMetadata.tsx | 4 +-
src/components/Collection/SeriesUserStats.tsx | 2 +-
src/components/Collection/TagButton.tsx | 4 +-
.../Collection/Tags/TagDetailsModal.tsx | 2 +-
src/components/Collection/TimelineSidebar.tsx | 2 +-
src/components/Collection/Tmdb/EpisodeRow.tsx | 2 +-
.../Collection/Tmdb/EpisodeSelect.tsx | 2 +-
src/components/Collection/Tmdb/MovieRow.tsx | 2 +-
.../Collection/Tmdb/TmdbLinkSelectPanel.tsx | 3 +-
src/components/Collection/Tmdb/TopPanel.tsx | 4 +-
src/components/Dialogs/FilterPresetsModal.tsx | 2 +-
src/components/ErrorBoundary.tsx | 5 +-
src/components/Layout/LinkMenuItem.tsx | 2 +-
src/components/Layout/TopNav.tsx | 5 +-
src/components/SeriesPoster.tsx | 2 +-
.../Utilities/ReleaseManagement/Title.tsx | 2 +-
.../Utilities/Unrecognized/Title.tsx | 2 +-
src/core/router/index.tsx | 17 +-
src/core/util.ts | 2 +-
src/hooks/useFirstRunSettingsContext.tsx | 2 +-
src/hooks/useNavigateVoid.ts | 15 +
src/hooks/useSettingsContext.ts | 2 +-
src/main.tsx | 4 +-
src/pages/SentryErrorBoundaryWrapper.tsx | 6 +-
src/pages/collection/Collection.tsx | 6 +-
src/pages/collection/Series.tsx | 6 +-
src/pages/collection/series/SeriesCredits.tsx | 2 +-
.../collection/series/SeriesEpisodes.tsx | 2 +-
.../collection/series/SeriesFileSummary.tsx | 2 +-
src/pages/collection/series/SeriesImages.tsx | 6 +-
.../collection/series/SeriesOverview.tsx | 2 +-
src/pages/collection/series/SeriesTags.tsx | 2 +-
src/pages/collection/series/TmdbLinking.tsx | 6 +-
src/pages/dashboard/DashboardPage.tsx | 2 +-
.../dashboard/panels/CollectionStats.tsx | 5 +-
src/pages/firstrun/Acknowledgement.tsx | 4 +-
src/pages/firstrun/AniDBAccount.tsx | 4 +-
src/pages/firstrun/FirstRunPage.tsx | 6 +-
src/pages/firstrun/Footer.tsx | 4 +-
src/pages/firstrun/LocalAccount.tsx | 4 +-
src/pages/firstrun/StartServer.tsx | 5 +-
src/pages/login/LoginPage.tsx | 5 +-
src/pages/settings/SettingsPage.tsx | 3 +-
src/pages/utilities/FileSearch.tsx | 5 +-
.../utilities/SeriesWithoutFilesUtility.tsx | 2 +-
.../UnrecognizedUtilityTabs/LinkFilesTab.tsx | 5 +-
.../UnrecognizedTab.tsx | 6 +-
57 files changed, 533 insertions(+), 488 deletions(-)
create mode 100644 src/hooks/useNavigateVoid.ts
diff --git a/.eslintrc.json b/.eslintrc.json
index 8e056123e..b3d82d536 100644
--- a/.eslintrc.json
+++ b/.eslintrc.json
@@ -105,6 +105,7 @@
{ "group": ["usehooks-ts"], "importNames": ["useCopyToClipboard"], "message": "Please use copyToClipboard from @/core/util instead." }
],
"paths": [
+ { "name": "react-router", "importNames": ["useNavigate"], "message": "Please use @/hooks/useNavigateVoid instead." },
{ "name": "usehooks-ts", "importNames": ["useEventCallback"], "message": "Please use @/hooks/useEventCallback instead." }
]
}
diff --git a/package.json b/package.json
index ed04d3174..d499e88a0 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "shoko-webui",
- "version": "2.1.4-dev",
+ "version": "2.2.0-dev",
"private": true,
"sideEffects": false,
"engines": {
@@ -16,12 +16,12 @@
"@mdi/react": "^1.6.1",
"@microsoft/signalr": "^8.0.7",
"@monaco-editor/react": "^4.6.0",
- "@reduxjs/toolkit": "^2.4.0",
- "@sentry/browser": "^8.42.0",
- "@sentry/react": "^8.42.0",
- "@tanstack/react-query": "^5.62.3",
- "@tanstack/react-query-devtools": "^5.62.3",
- "@tanstack/react-virtual": "^3.11.0",
+ "@reduxjs/toolkit": "^2.5.0",
+ "@sentry/browser": "^8.45.0",
+ "@sentry/react": "^8.45.0",
+ "@tanstack/react-query": "^5.62.7",
+ "@tanstack/react-query-devtools": "^5.62.7",
+ "@tanstack/react-virtual": "^3.11.1",
"axios": "^1.7.9",
"classnames": "^2.5.1",
"copy-to-clipboard": "^3.3.3",
@@ -30,7 +30,7 @@
"format-thousands": "^2.0.0",
"immer": "^10.1.1",
"lodash": "^4.17.21",
- "monaco-editor": "^0.52.0",
+ "monaco-editor": "^0.52.2",
"pretty-bytes": "^6.1.1",
"react": "^19.0.0",
"react-animate-height": "^3.2.3",
@@ -38,17 +38,16 @@
"react-dom": "^19.0.0",
"react-grid-layout": "^1.5.0",
"react-modal": "^3.16.1",
- "react-redux": "^9.1.2",
+ "react-redux": "^9.2.0",
"react-resizable": "^3.0.5",
"react-responsive": "^10.0.0",
- "react-router": "^6.28.0",
- "react-router-dom": "^6.28.0",
+ "react-router": "^7.0.2",
"react-toastify": "^10.0.6",
"react-tooltip": "^5.28.0",
"react-use-measure": "^2.1.1",
"redux": "^5.0.1",
"semver": "^7.6.3",
- "simple-icons": "^13.20.0",
+ "simple-icons": "^13.21.0",
"use-immer": "^0.10.0",
"usehooks-ts": "^3.1.0"
},
@@ -59,10 +58,10 @@
"@tanstack/eslint-plugin-query": "^5.62.1",
"@types/format-thousands": "^2.0.3",
"@types/lodash": "^4.17.13",
- "@types/node": "^22.10.1",
+ "@types/node": "^22.10.2",
"@types/react": "^19.0.1",
"@types/react-avatar-editor": "^13.0.3",
- "@types/react-dom": "^19.0.1",
+ "@types/react-dom": "^19.0.2",
"@types/react-grid-layout": "^1.3.5",
"@types/react-modal": "^3.16.3",
"@types/react-redux": "^7.1.34",
@@ -84,11 +83,11 @@
"eslint-plugin-sort-destructure-keys": "^2.0.0",
"eslint-plugin-tailwindcss": "^3.17.5",
"husky": "^9.1.7",
- "lint-staged": "^15.2.10",
+ "lint-staged": "^15.2.11",
"postcss": "^8.4.49",
"postcss-import": "^16.1.0",
"postcss-load-config": "^6.0.1",
- "postcss-preset-env": "^10.1.1",
+ "postcss-preset-env": "^10.1.2",
"stylelint": "^16.11.0",
"stylelint-config-standard": "^36.0.1",
"stylelint-config-tailwindcss": "^0.0.7",
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index d1f58aebd..13857a2d7 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -31,25 +31,25 @@ importers:
version: 8.0.7
'@monaco-editor/react':
specifier: ^4.6.0
- version: 4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ version: 4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@reduxjs/toolkit':
- specifier: ^2.4.0
- version: 2.4.0(react-redux@9.1.2(@types/react@19.0.1)(react@19.0.0)(redux@5.0.1))(react@19.0.0)
+ specifier: ^2.5.0
+ version: 2.5.0(react-redux@9.2.0(@types/react@19.0.1)(react@19.0.0)(redux@5.0.1))(react@19.0.0)
'@sentry/browser':
- specifier: ^8.42.0
- version: 8.42.0
+ specifier: ^8.45.0
+ version: 8.45.0
'@sentry/react':
- specifier: ^8.42.0
- version: 8.42.0(react@19.0.0)
+ specifier: ^8.45.0
+ version: 8.45.0(react@19.0.0)
'@tanstack/react-query':
- specifier: ^5.62.3
- version: 5.62.3(react@19.0.0)
+ specifier: ^5.62.7
+ version: 5.62.7(react@19.0.0)
'@tanstack/react-query-devtools':
- specifier: ^5.62.3
- version: 5.62.3(@tanstack/react-query@5.62.3(react@19.0.0))(react@19.0.0)
+ specifier: ^5.62.7
+ version: 5.62.7(@tanstack/react-query@5.62.7(react@19.0.0))(react@19.0.0)
'@tanstack/react-virtual':
- specifier: ^3.11.0
- version: 3.11.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ specifier: ^3.11.1
+ version: 3.11.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
axios:
specifier: ^1.7.9
version: 1.7.9
@@ -75,8 +75,8 @@ importers:
specifier: ^4.17.21
version: 4.17.21
monaco-editor:
- specifier: ^0.52.0
- version: 0.52.0
+ specifier: ^0.52.2
+ version: 0.52.2
pretty-bytes:
specifier: ^6.1.1
version: 6.1.1
@@ -99,8 +99,8 @@ importers:
specifier: ^3.16.1
version: 3.16.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react-redux:
- specifier: ^9.1.2
- version: 9.1.2(@types/react@19.0.1)(react@19.0.0)(redux@5.0.1)
+ specifier: ^9.2.0
+ version: 9.2.0(@types/react@19.0.1)(react@19.0.0)(redux@5.0.1)
react-resizable:
specifier: ^3.0.5
version: 3.0.5(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
@@ -108,11 +108,8 @@ importers:
specifier: ^10.0.0
version: 10.0.0(react@19.0.0)
react-router:
- specifier: ^6.28.0
- version: 6.28.0(react@19.0.0)
- react-router-dom:
- specifier: ^6.28.0
- version: 6.28.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ specifier: ^7.0.2
+ version: 7.0.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react-toastify:
specifier: ^10.0.6
version: 10.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
@@ -129,8 +126,8 @@ importers:
specifier: ^7.6.3
version: 7.6.3
simple-icons:
- specifier: ^13.20.0
- version: 13.20.0
+ specifier: ^13.21.0
+ version: 13.21.0
use-immer:
specifier: ^0.10.0
version: 0.10.0(immer@10.1.1)(react@19.0.0)
@@ -157,8 +154,8 @@ importers:
specifier: ^4.17.13
version: 4.17.13
'@types/node':
- specifier: ^22.10.1
- version: 22.10.1
+ specifier: ^22.10.2
+ version: 22.10.2
'@types/react':
specifier: ^19.0.1
version: 19.0.1
@@ -166,8 +163,8 @@ importers:
specifier: ^13.0.3
version: 13.0.3
'@types/react-dom':
- specifier: ^19.0.1
- version: 19.0.1
+ specifier: ^19.0.2
+ version: 19.0.2(@types/react@19.0.1)
'@types/react-grid-layout':
specifier: ^1.3.5
version: 1.3.5
@@ -188,7 +185,7 @@ importers:
version: 7.18.0(eslint@8.57.1)(typescript@5.6.3)
'@vitejs/plugin-react':
specifier: ^4.3.4
- version: 4.3.4(vite@6.0.3(@types/node@22.10.1)(jiti@1.21.6)(yaml@2.6.1))
+ version: 4.3.4(vite@6.0.3(@types/node@22.10.2)(jiti@1.21.6)(yaml@2.6.1))
cross-env:
specifier: ^7.0.3
version: 7.0.3
@@ -232,8 +229,8 @@ importers:
specifier: ^9.1.7
version: 9.1.7
lint-staged:
- specifier: ^15.2.10
- version: 15.2.10
+ specifier: ^15.2.11
+ version: 15.2.11
postcss:
specifier: ^8.4.49
version: 8.4.49
@@ -244,8 +241,8 @@ importers:
specifier: ^6.0.1
version: 6.0.1(jiti@1.21.6)(postcss@8.4.49)(yaml@2.6.1)
postcss-preset-env:
- specifier: ^10.1.1
- version: 10.1.1(postcss@8.4.49)
+ specifier: ^10.1.2
+ version: 10.1.2(postcss@8.4.49)
stylelint:
specifier: ^16.11.0
version: 16.11.0(typescript@5.6.3)
@@ -266,7 +263,7 @@ importers:
version: 5.6.3
vite:
specifier: ^6.0.3
- version: 6.0.3(@types/node@22.10.1)(jiti@1.21.6)(yaml@2.6.1)
+ version: 6.0.3(@types/node@22.10.2)(jiti@1.21.6)(yaml@2.6.1)
vite-plugin-webpackchunkname:
specifier: ^1.0.3
version: 1.0.3(rollup@4.28.1)
@@ -904,8 +901,8 @@ packages:
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
engines: {node: '>=12'}
- '@jridgewell/gen-mapping@0.3.5':
- resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
+ '@jridgewell/gen-mapping@0.3.8':
+ resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==}
engines: {node: '>=6.0.0'}
'@jridgewell/resolve-uri@3.1.2':
@@ -994,10 +991,10 @@ packages:
peerDependencies:
react: ^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1
- '@reduxjs/toolkit@2.4.0':
- resolution: {integrity: sha512-wJZEuSKj14tvNfxiIiJws0tQN77/rDqucBq528ApebMIRHyWpCanJVQRxQ8WWZC19iCDKxDsGlbAir3F1layxA==}
+ '@reduxjs/toolkit@2.5.0':
+ resolution: {integrity: sha512-awNe2oTodsZ6LmRqmkFhtb/KH03hUhxOamEQy411m3Njj3BbFvoBovxo4Q1cBWnV1ErprVj9MlF0UPXkng0eyg==}
peerDependencies:
- react: ^16.9.0 || ^17.0.0 || ^18
+ react: ^16.9.0 || ^17.0.0 || ^18 || ^19
react-redux: ^7.2.1 || ^8.1.3 || ^9.0.0
peerDependenciesMeta:
react:
@@ -1005,10 +1002,6 @@ packages:
react-redux:
optional: true
- '@remix-run/router@1.21.0':
- resolution: {integrity: sha512-xfSkCAchbdG5PnbrKqFWwia4Bi61nH+wm8wLEqfHDyp7Y3dZzgqS2itV8i4gAq9pC2HsTpwyBC6Ds8VHZ96JlA==}
- engines: {node: '>=14.0.0'}
-
'@rollup/plugin-alias@5.1.1':
resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==}
engines: {node: '>=14.0.0'}
@@ -1125,28 +1118,28 @@ packages:
'@rtsao/scc@1.1.0':
resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
- '@sentry-internal/browser-utils@8.42.0':
- resolution: {integrity: sha512-xzgRI0wglKYsPrna574w1t38aftuvo44gjOKFvPNGPnYfiW9y4m+64kUz3JFbtanvOrKPcaITpdYiB4DeJXEbA==}
+ '@sentry-internal/browser-utils@8.45.0':
+ resolution: {integrity: sha512-MX/E/C+W5I9jkGD1PsbZ2hpCc7YuizNKmEbuGPxQPfUSIPrdE2wpo6ZfIhEbxq9m/trl1oRCN4PXi3BB7dlYYg==}
engines: {node: '>=14.18'}
- '@sentry-internal/feedback@8.42.0':
- resolution: {integrity: sha512-dkIw5Wdukwzngg5gNJ0QcK48LyJaMAnBspqTqZ3ItR01STi6Z+6+/Bt5XgmrvDgRD+FNBinflc5zMmfdFXXhvw==}
+ '@sentry-internal/feedback@8.45.0':
+ resolution: {integrity: sha512-WerpfkKrKPAlnQuqjEgKXZtrx68cla7GyOkNOeL40JQbY4/By4Qjx1atUOmgk/FdjrCLPw+jQQY9pXRpMRqqRw==}
engines: {node: '>=14.18'}
- '@sentry-internal/replay-canvas@8.42.0':
- resolution: {integrity: sha512-XrPErqVhPsPh/oFLVKvz7Wb+Fi2J1zCPLeZCxWqFuPWI2agRyLVu0KvqJyzSpSrRAEJC/XFzuSVILlYlXXSfgA==}
+ '@sentry-internal/replay-canvas@8.45.0':
+ resolution: {integrity: sha512-LZ8kBuzO5gutDiWnCyYEzBMDLq9PIllcsWsXRpKoau0Zqs3DbyRolI11dNnxmUSh7UW21FksxBpqn5yPmUMbag==}
engines: {node: '>=14.18'}
- '@sentry-internal/replay@8.42.0':
- resolution: {integrity: sha512-oNcJEBlDfXnRFYC5Mxj5fairyZHNqlnU4g8kPuztB9G5zlsyLgWfPxzcn1ixVQunth2/WZRklDi4o1ZfyHww7w==}
+ '@sentry-internal/replay@8.45.0':
+ resolution: {integrity: sha512-SOFwFpzx0B6lxhLl2hBnxvybo7gdB5TMY8dOHMwXgk5A2+BXvSpvWXnr33yqUlBmC8R3LeFTB3C0plzM5lhkJg==}
engines: {node: '>=14.18'}
'@sentry/babel-plugin-component-annotate@2.22.7':
resolution: {integrity: sha512-aa7XKgZMVl6l04NY+3X7BP7yvQ/s8scn8KzQfTLrGRarziTlMGrsCOBQtCNWXOPEbtxAIHpZ9dsrAn5EJSivOQ==}
engines: {node: '>= 14'}
- '@sentry/browser@8.42.0':
- resolution: {integrity: sha512-lStrEk609KJHwXfDrOgoYVVoFFExixHywxSExk7ZDtwj2YPv6r6Y1gogvgr7dAZj7jWzadHkxZ33l9EOSJBfug==}
+ '@sentry/browser@8.45.0':
+ resolution: {integrity: sha512-Y+BcfpXY1eEkOYOzgLGkx1YH940uMAymYOxfSZSvC+Vx6xHuaGT05mIFef/aeZbyu2AUs6JjdvD1BRBZlHg78w==}
engines: {node: '>=14.18'}
'@sentry/bundler-plugin-core@2.22.7':
@@ -1199,12 +1192,12 @@ packages:
engines: {node: '>= 10'}
hasBin: true
- '@sentry/core@8.42.0':
- resolution: {integrity: sha512-ac6O3pgoIbU6rpwz6LlwW0wp3/GAHuSI0C5IsTgIY6baN8rOBnlAtG6KrHDDkGmUQ2srxkDJu9n1O6Td3cBCqw==}
+ '@sentry/core@8.45.0':
+ resolution: {integrity: sha512-4YTuBipWSh4JrtSYS5GxUQBAcAgOIkEoFfFbwVcr3ivijOacJLRXTBn3rpcy1CKjBq0PHDGR+2RGRYC+bNAMxg==}
engines: {node: '>=14.18'}
- '@sentry/react@8.42.0':
- resolution: {integrity: sha512-UBi/WM4oMa+kOA99R7t7Ke57zq6uQw6mALYW4fJ+wuhHZJBLDDDHSGpEUhdWuQ1oWQv/laT34DGS44PJOjfeAg==}
+ '@sentry/react@8.45.0':
+ resolution: {integrity: sha512-xuJBDATJKAHOxpR5IBfGFWJxXb05GMPGGpk8UoWai1Mh50laAQ0/WW+5sDAKrCjXoA+JZ6fb3DP8EE2X93n1nw==}
engines: {node: '>=14.18'}
peerDependencies:
react: ^16.14.0 || 17.x || 18.x || 19.x
@@ -1233,25 +1226,25 @@ packages:
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
- '@tanstack/query-core@5.62.3':
- resolution: {integrity: sha512-Jp/nYoz8cnO7kqhOlSv8ke/0MJRJVGuZ0P/JO9KQ+f45mpN90hrerzavyTKeSoT/pOzeoOUkv1Xd0wPsxAWXfg==}
+ '@tanstack/query-core@5.62.7':
+ resolution: {integrity: sha512-fgpfmwatsrUal6V+8EC2cxZIQVl9xvL7qYa03gsdsCy985UTUlS4N+/3hCzwR0PclYDqisca2AqR1BVgJGpUDA==}
'@tanstack/query-devtools@5.61.4':
resolution: {integrity: sha512-21Tw+u8E3IJJj4A/Bct4H0uBaDTEu7zBrR79FeSyY+mS2gx5/m316oDtJiKkILc819VSTYt+sFzODoJNcpPqZQ==}
- '@tanstack/react-query-devtools@5.62.3':
- resolution: {integrity: sha512-4iaQap/iP5ErS094u1WehFntHtjRo6g5HJMvyHovBVbsxnvgPc6AtKAw7qxPPoKy6Wj5Bew0045eYP5phiiBmw==}
+ '@tanstack/react-query-devtools@5.62.7':
+ resolution: {integrity: sha512-wxXsdTZJRs//hMtJMU5aNlUaTclRFPqLvDNeWbRj8YpGD3aoo4zyu53W55W2DY16+ycg3fti21uCW4N9oyj91w==}
peerDependencies:
- '@tanstack/react-query': ^5.62.3
+ '@tanstack/react-query': ^5.62.7
react: ^18 || ^19
- '@tanstack/react-query@5.62.3':
- resolution: {integrity: sha512-y2zDNKuhgiuMgsKkqd4AcsLIBiCfEO8U11AdrtAUihmLbRNztPrlcZqx2lH1GacZsx+y1qRRbCcJLYTtF1vKsw==}
+ '@tanstack/react-query@5.62.7':
+ resolution: {integrity: sha512-+xCtP4UAFDTlRTYyEjLx0sRtWyr5GIk7TZjZwBu4YaNahi3Rt2oMyRqfpfVrtwsqY2sayP4iXVCwmC+ZqqFmuw==}
peerDependencies:
react: ^18 || ^19
- '@tanstack/react-virtual@3.11.0':
- resolution: {integrity: sha512-liRl34SrQm54NZdf22d/H4a7GucPNCxBSJdWWZlUrF1E1oXcZ3/GfRRHFDUJXwEuTfjtyp0X6NnUK7bhIuDzoQ==}
+ '@tanstack/react-virtual@3.11.1':
+ resolution: {integrity: sha512-orn2QNe5tF6SqjucHJ6cKTKcRDe3GG7bcYqPNn72Yejj7noECdzgAyRfGt2pGDPemhYim3d1HIR/dgruCnLfUA==}
peerDependencies:
react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0
@@ -1271,6 +1264,9 @@ packages:
'@types/babel__traverse@7.20.6':
resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==}
+ '@types/cookie@0.6.0':
+ resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
+
'@types/estree@1.0.6':
resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
@@ -1286,14 +1282,16 @@ packages:
'@types/lodash@4.17.13':
resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==}
- '@types/node@22.10.1':
- resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==}
+ '@types/node@22.10.2':
+ resolution: {integrity: sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==}
'@types/react-avatar-editor@13.0.3':
resolution: {integrity: sha512-icRAOKLKjkIsExFAiFSquztByJwpyTKEgnBRYSuLG2V81bM3LtQZi7hRS+Hr+4AXreq0yNRjVZiMOVeEeh6DLg==}
- '@types/react-dom@19.0.1':
- resolution: {integrity: sha512-hljHij7MpWPKF6u5vojuyfV0YA4YURsQG7KT6SzV0Zs2BXAtgdTxG6A229Ub/xiWV4w/7JL8fi6aAyjshH4meA==}
+ '@types/react-dom@19.0.2':
+ resolution: {integrity: sha512-c1s+7TKFaDRRxr1TxccIX2u7sfCnc3RxkVyBIUA2lCpyqCF+QoAwQ/CBg7bsMdVwP120HEH143VQezKtef5nCg==}
+ peerDependencies:
+ '@types/react': ^19.0.0
'@types/react-grid-layout@1.3.5':
resolution: {integrity: sha512-WH/po1gcEcoR6y857yAnPGug+ZhkF4PaTUxgAbwfeSH/QOgVSakKHBXoPGad/sEznmkiaK3pqHk+etdWisoeBQ==}
@@ -1310,8 +1308,8 @@ packages:
'@types/semver@7.5.8':
resolution: {integrity: sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==}
- '@types/use-sync-external-store@0.0.3':
- resolution: {integrity: sha512-EwmlvuaxPNej9+T4v5AuBPJa2x2UOJVdjCtDHgcDqitUeOtjnJKJ+apYjVcAoBEMjKW1VVFGZLUb5+qqa09XFA==}
+ '@types/use-sync-external-store@0.0.6':
+ resolution: {integrity: sha512-zFDAD+tlpf2r4asuHEj0XH6pY6i0g5NeAHPn+15wk3BV6JA69eERFXC1gyGThDkVa1zCyKr5jox1+2LbV/AMLg==}
'@typescript-eslint/eslint-plugin@7.18.0':
resolution: {integrity: sha512-94EQTWZ40mzBc42ATNIBimBEDltSJ9RQHCC8vc/PDbxi4k8dVwUAv4o98dk50M1zB+JGFxp43FP7f8+FP8R6Sw==}
@@ -1338,8 +1336,8 @@ packages:
resolution: {integrity: sha512-jjhdIE/FPF2B7Z1uzc6i3oWKbGcHb87Qw7AWj6jmEqNOfDFbJWtjt/XfwCpvNkpGWlcJaog5vTR+VV8+w9JflA==}
engines: {node: ^18.18.0 || >=20.0.0}
- '@typescript-eslint/scope-manager@8.17.0':
- resolution: {integrity: sha512-/ewp4XjvnxaREtqsZjF4Mfn078RD/9GmiEAtTeLQ7yFdKnqwTOgRMSvFz4et9U5RiJQ15WTGXPLj89zGusvxBg==}
+ '@typescript-eslint/scope-manager@8.18.0':
+ resolution: {integrity: sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/type-utils@7.18.0':
@@ -1356,8 +1354,8 @@ packages:
resolution: {integrity: sha512-iZqi+Ds1y4EDYUtlOOC+aUmxnE9xS/yCigkjA7XpTKV6nCBd3Hp/PRGGmdwnfkV2ThMyYldP1wRpm/id99spTQ==}
engines: {node: ^18.18.0 || >=20.0.0}
- '@typescript-eslint/types@8.17.0':
- resolution: {integrity: sha512-gY2TVzeve3z6crqh2Ic7Cr+CAv6pfb0Egee7J5UAVWCpVvDI/F71wNfolIim4FE6hT15EbpZFVUj9j5i38jYXA==}
+ '@typescript-eslint/types@8.18.0':
+ resolution: {integrity: sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@typescript-eslint/typescript-estree@7.18.0':
@@ -1369,14 +1367,11 @@ packages:
typescript:
optional: true
- '@typescript-eslint/typescript-estree@8.17.0':
- resolution: {integrity: sha512-JqkOopc1nRKZpX+opvKqnM3XUlM7LpFMD0lYxTqOTKQfCWAmxw45e3qlOCsEqEB2yuacujivudOFpCnqkBDNMw==}
+ '@typescript-eslint/typescript-estree@8.18.0':
+ resolution: {integrity: sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
+ typescript: '>=4.8.4 <5.8.0'
'@typescript-eslint/utils@7.18.0':
resolution: {integrity: sha512-kK0/rNa2j74XuHVcoCZxdFBMF+aq/vH83CXAOHieC+2Gis4mF8jJXT5eAfyD3K0sAxtPuwxaIOIOvhwzVDt/kw==}
@@ -1384,22 +1379,19 @@ packages:
peerDependencies:
eslint: ^8.56.0
- '@typescript-eslint/utils@8.17.0':
- resolution: {integrity: sha512-bQC8BnEkxqG8HBGKwG9wXlZqg37RKSMY7v/X8VEWD8JG2JuTHuNK0VFvMPMUKQcbk6B+tf05k+4AShAEtCtJ/w==}
+ '@typescript-eslint/utils@8.18.0':
+ resolution: {integrity: sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
eslint: ^8.57.0 || ^9.0.0
- typescript: '*'
- peerDependenciesMeta:
- typescript:
- optional: true
+ typescript: '>=4.8.4 <5.8.0'
'@typescript-eslint/visitor-keys@7.18.0':
resolution: {integrity: sha512-cDF0/Gf81QpY3xYyJKDV14Zwdmid5+uuENhjH2EqFaF0ni+yAyq/LzMaIJdhNJXZI7uLzwIlA+V7oWoyn6Curg==}
engines: {node: ^18.18.0 || >=20.0.0}
- '@typescript-eslint/visitor-keys@8.17.0':
- resolution: {integrity: sha512-1Hm7THLpO6ww5QU6H/Qp+AusUUl+z/CAm3cNZZ0jQvon9yicgO7Rwd+/WWRpMKLYV6p2UvdbR27c86rzCPpreg==}
+ '@typescript-eslint/visitor-keys@8.18.0':
+ resolution: {integrity: sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
'@ungap/structured-clone@1.2.1':
@@ -1587,19 +1579,23 @@ packages:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
- browserslist@4.24.2:
- resolution: {integrity: sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==}
+ browserslist@4.24.3:
+ resolution: {integrity: sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==}
engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
hasBin: true
- call-bind-apply-helpers@1.0.0:
- resolution: {integrity: sha512-CCKAP2tkPau7D3GE8+V8R6sQubA9R5foIzGp+85EXCVSCivuxBNAWqcpn72PKYiIcqoViv/kcUDpaEIMBVi1lQ==}
+ call-bind-apply-helpers@1.0.1:
+ resolution: {integrity: sha512-BhYE+WDaywFg2TBWYNXAE+8B1ATnThNBqXHP5nQu0jWJdVvY2hvkpyB3qOmtmDePiS5/BDQ8wASEWGMWRG148g==}
engines: {node: '>= 0.4'}
call-bind@1.0.8:
resolution: {integrity: sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==}
engines: {node: '>= 0.4'}
+ call-bound@1.0.2:
+ resolution: {integrity: sha512-0lk0PHFe/uz0vl527fG9CgdE9WdafjDbCXvBbs+LUv000TVt2Jjhqbs4Jwm8gz070w8xXyEAxrPOMullsxXeGg==}
+ engines: {node: '>= 0.4'}
+
callsites@3.1.0:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
@@ -1608,8 +1604,8 @@ packages:
resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==}
engines: {node: '>= 6'}
- caniuse-lite@1.0.30001687:
- resolution: {integrity: sha512-0S/FDhf4ZiqrTUiQ39dKeUjYRjkv7lOZU1Dgif2rIqrTzX/1wV2hfKu9TOm1IHkdSijfLswxTFzl/cvir+SLSQ==}
+ caniuse-lite@1.0.30001688:
+ resolution: {integrity: sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==}
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
@@ -1676,6 +1672,10 @@ packages:
convert-source-map@2.0.0:
resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
+ cookie@1.0.2:
+ resolution: {integrity: sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==}
+ engines: {node: '>=18'}
+
copy-to-clipboard@3.3.3:
resolution: {integrity: sha512-2KV8NhB5JqC3ky0r9PMCAZKbUHSwtEo4CwCs0KXgruG43gX5PMqDEBbVU4OUzw2MuAWUfsuFmWvEKG5QRfSnJA==}
@@ -1713,8 +1713,8 @@ packages:
resolution: {integrity: sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==}
engines: {node: '>=12 || >=16'}
- css-has-pseudo@7.0.1:
- resolution: {integrity: sha512-EOcoyJt+OsuKfCADgLT7gADZI5jMzIe/AeI6MeAYKiFBDmNmM7kk46DtSfMj5AohUJisqVzopBpnQTlvbyaBWg==}
+ css-has-pseudo@7.0.2:
+ resolution: {integrity: sha512-nzol/h+E0bId46Kn2dQH5VElaknX2Sr0hFuB/1EomdC7j+OISt2ZzK7EHX9DZDY53WbIVAR7FYKSO2XnSf07MQ==}
engines: {node: '>=18'}
peerDependencies:
postcss: ^8.4
@@ -1732,8 +1732,8 @@ packages:
resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0}
- cssdb@8.2.2:
- resolution: {integrity: sha512-Z3kpWyvN68aKyeMxOUGmffQeHjvrzDxbre2B2ikr/WqQ4ZMkhHu2nOD6uwSeq3TpuOYU7ckvmJRAUIt6orkYUg==}
+ cssdb@8.2.3:
+ resolution: {integrity: sha512-9BDG5XmJrJQQnJ51VFxXCAtpZ5ebDlAREmO8sxMOVU0aSxN/gocbctjIG5LMh3WBUq+xTlb/jw2LoljBEqraTA==}
cssesc@3.0.0:
resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==}
@@ -1772,15 +1772,6 @@ packages:
supports-color:
optional: true
- debug@4.3.7:
- resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
-
debug@4.4.0:
resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
engines: {node: '>=6.0'}
@@ -1846,8 +1837,8 @@ packages:
eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
- electron-to-chromium@1.5.71:
- resolution: {integrity: sha512-dB68l59BI75W1BUGVTAEJy45CEVuEGy9qPVVQ8pnHyHMn36PLPPoE1mjLH+lo9rKulO3HC2OhbACI/8tCqJBcA==}
+ electron-to-chromium@1.5.73:
+ resolution: {integrity: sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==}
emoji-regex@10.4.0:
resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
@@ -2201,8 +2192,8 @@ packages:
resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==}
engines: {node: '>=18'}
- get-intrinsic@1.2.5:
- resolution: {integrity: sha512-Y4+pKa7XeRUPWFNvOOYHkRYrfzW07oraURSvjDmRVOJ748OrVmeXtpE4+GCEHncjCjkTxPNRt8kEbxDhsn6VTg==}
+ get-intrinsic@1.2.6:
+ resolution: {integrity: sha512-qxsEs+9A+u85HhllWJJFicJfPDhRmjzoYdl64aMWW9yRIJmSyxdn8IEkuIM530/7T+lv0TIHd8L6Q/ra0tEoeA==}
engines: {node: '>= 0.4'}
get-stream@8.0.1:
@@ -2351,8 +2342,8 @@ packages:
ini@1.3.8:
resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==}
- internal-slot@1.0.7:
- resolution: {integrity: sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==}
+ internal-slot@1.1.0:
+ resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
engines: {node: '>= 0.4'}
is-array-buffer@3.0.4:
@@ -2374,8 +2365,8 @@ packages:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'}
- is-boolean-object@1.2.0:
- resolution: {integrity: sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw==}
+ is-boolean-object@1.2.1:
+ resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==}
engines: {node: '>= 0.4'}
is-bun-module@1.3.0:
@@ -2385,16 +2376,16 @@ packages:
resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
engines: {node: '>= 0.4'}
- is-core-module@2.15.1:
- resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==}
+ is-core-module@2.16.0:
+ resolution: {integrity: sha512-urTSINYfAYgcbLb0yDQ6egFm6h3Mo1DcF9EkyXSRjjzdHbsulg01qhwWuXdOoUBuTkbQ80KDboXa0vFJ+BDH+g==}
engines: {node: '>= 0.4'}
- is-data-view@1.0.1:
- resolution: {integrity: sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==}
+ is-data-view@1.0.2:
+ resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
engines: {node: '>= 0.4'}
- is-date-object@1.0.5:
- resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==}
+ is-date-object@1.1.0:
+ resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
engines: {node: '>= 0.4'}
is-extglob@2.1.1:
@@ -2449,8 +2440,8 @@ packages:
resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==}
engines: {node: '>=0.10.0'}
- is-regex@1.2.0:
- resolution: {integrity: sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==}
+ is-regex@1.2.1:
+ resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
engines: {node: '>= 0.4'}
is-set@2.0.3:
@@ -2469,8 +2460,8 @@ packages:
resolution: {integrity: sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==}
engines: {node: '>= 0.4'}
- is-symbol@1.1.0:
- resolution: {integrity: sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A==}
+ is-symbol@1.1.1:
+ resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
engines: {node: '>= 0.4'}
is-typed-array@1.1.13:
@@ -2481,8 +2472,9 @@ packages:
resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
engines: {node: '>= 0.4'}
- is-weakref@1.0.2:
- resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==}
+ is-weakref@1.1.0:
+ resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==}
+ engines: {node: '>= 0.4'}
is-weakset@2.0.3:
resolution: {integrity: sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==}
@@ -2494,8 +2486,8 @@ packages:
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
- iterator.prototype@1.1.3:
- resolution: {integrity: sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==}
+ iterator.prototype@1.1.4:
+ resolution: {integrity: sha512-x4WH0BWmrMmg4oHHl+duwubhrvczGlyuGAZu3nvrf0UXOfPu8IhZObFEr7DE/iv01YgVZrsOiRcqw2srkKEDIA==}
engines: {node: '>= 0.4'}
jackspeak@3.4.3:
@@ -2512,8 +2504,8 @@ packages:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
- jsesc@3.0.2:
- resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
+ jsesc@3.1.0:
+ resolution: {integrity: sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==}
engines: {node: '>=6'}
hasBin: true
@@ -2577,8 +2569,8 @@ packages:
lines-and-columns@1.2.4:
resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==}
- lint-staged@15.2.10:
- resolution: {integrity: sha512-5dY5t743e1byO19P9I4b3x8HJwalIznL5E1FWYnU6OWw33KxNBSLAc6Cy7F2PsFEO8FKnLwjwm5hx7aMF0jzZg==}
+ lint-staged@15.2.11:
+ resolution: {integrity: sha512-Ev6ivCTYRTGs9ychvpVw35m/bcNDuBN+mnTeObCL5h+boS5WzBEC6LHI4I9F/++sZm1m+J2LEiy0gxL/R9TBqQ==}
engines: {node: '>=18.12.0'}
hasBin: true
@@ -2616,8 +2608,8 @@ packages:
lru-cache@5.1.1:
resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
- magic-string@0.30.14:
- resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==}
+ magic-string@0.30.15:
+ resolution: {integrity: sha512-zXeaYRgZ6ldS1RJJUrMrYgNJ4fdwnyI6tVqoiIhyCyv5IVTK9BU8Ic2l253GGETQHxI4HNUwhJ3fjDhKqEoaAw==}
magic-string@0.30.8:
resolution: {integrity: sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==}
@@ -2626,6 +2618,10 @@ packages:
matchmediaquery@0.4.2:
resolution: {integrity: sha512-wrZpoT50ehYOudhDjt/YvUJc6eUzcdFPdmbizfgvswCKNHD1/OBOHYJpHie+HXpu6bSkEGieFMYk6VuutaiRfA==}
+ math-intrinsics@1.0.0:
+ resolution: {integrity: sha512-4MqMiKP90ybymYvsut0CH2g4XWbfLtmlCkXmtmdcDCxNB+mQcu1w/1+L/VD7vi/PSv7X2JYV7SCcR+jiPXnQtA==}
+ engines: {node: '>= 0.4'}
+
mathml-tag-names@2.1.3:
resolution: {integrity: sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==}
@@ -2688,8 +2684,8 @@ packages:
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
engines: {node: '>=16 || 14 >=14.17'}
- monaco-editor@0.52.0:
- resolution: {integrity: sha512-OeWhNpABLCeTqubfqLMXGsqf6OmPU6pHM85kF3dhy6kq5hnhuVS1p3VrEW/XhWHc71P2tHyS5JFySD8mgs1crw==}
+ monaco-editor@0.52.2:
+ resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==}
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
@@ -2717,8 +2713,8 @@ packages:
encoding:
optional: true
- node-releases@2.0.18:
- resolution: {integrity: sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==}
+ node-releases@2.0.19:
+ resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
normalize-path@3.0.0:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
@@ -3065,8 +3061,8 @@ packages:
peerDependencies:
postcss: ^8.4
- postcss-preset-env@10.1.1:
- resolution: {integrity: sha512-wqqsnBFD6VIwcHHRbhjTOcOi4qRVlB26RwSr0ordPj7OubRRxdWebv/aLjKLRR8zkZrbxZyuus03nOIgC5elMQ==}
+ postcss-preset-env@10.1.2:
+ resolution: {integrity: sha512-OqUBZ9ByVfngWhMNuBEMy52Izj07oIFA6K/EOGBlaSv+P12MiE1+S2cqXtS1VuW82demQ/Tzc7typYk3uHunkA==}
engines: {node: '>=18'}
peerDependencies:
postcss: ^8.4
@@ -3193,11 +3189,11 @@ packages:
react: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18
react-dom: ^0.14.0 || ^15.0.0 || ^16 || ^17 || ^18
- react-redux@9.1.2:
- resolution: {integrity: sha512-0OA4dhM1W48l3uzmv6B7TXPCGmokUU4p1M44DGN2/D9a1FjVPukVjER1PcPX97jIg6aUeLq1XJo1IpfbgULn0w==}
+ react-redux@9.2.0:
+ resolution: {integrity: sha512-ROY9fvHhwOD9ySfrF0wmvu//bKCQ6AeZZq1nJNtbDC+kk5DuSuNX/n6YWYF/SYy7bSba4D4FSz8DJeKY/S/r+g==}
peerDependencies:
- '@types/react': ^18.2.25
- react: ^18.0
+ '@types/react': ^18.2.25 || ^19
+ react: ^18.0 || ^19
redux: ^5.0.0
peerDependenciesMeta:
'@types/react':
@@ -3220,18 +3216,15 @@ packages:
peerDependencies:
react: '>=16.8.0'
- react-router-dom@6.28.0:
- resolution: {integrity: sha512-kQ7Unsl5YdyOltsPGl31zOjLrDv+m2VcIEcIHqYYD3Lp0UppLjrzcfJqDJwXxFw3TH/yvapbnUvPlAj7Kx5nbg==}
- engines: {node: '>=14.0.0'}
- peerDependencies:
- react: '>=16.8'
- react-dom: '>=16.8'
-
- react-router@6.28.0:
- resolution: {integrity: sha512-HrYdIFqdrnhDw0PqG/AKjAqEqM7AvxCz0DQ4h2W8k6nqmc5uRBYDag0SBxx9iYz5G8gnuNVLzUe13wl9eAsXXg==}
- engines: {node: '>=14.0.0'}
+ react-router@7.0.2:
+ resolution: {integrity: sha512-m5AcPfTRUcjwmhBzOJGEl6Y7+Crqyju0+TgTQxoS4SO+BkWbhOrcfZNq6wSWdl2BBbJbsAoBUb8ZacOFT+/JlA==}
+ engines: {node: '>=20.0.0'}
peerDependencies:
- react: '>=16.8'
+ react: '>=18'
+ react-dom: '>=18'
+ peerDependenciesMeta:
+ react-dom:
+ optional: true
react-toastify@10.0.6:
resolution: {integrity: sha512-yYjp+omCDf9lhZcrZHKbSq7YMuK0zcYkDFTzfRFgTXkTFHZ1ToxwAonzA4JI5CxA91JpjFLmwEsZEgfYfOqI1A==}
@@ -3308,8 +3301,8 @@ packages:
resolve-pkg-maps@1.0.0:
resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==}
- resolve@1.22.8:
- resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
+ resolve@1.22.9:
+ resolution: {integrity: sha512-QxrmX1DzraFIi9PxdG5VkRfRwIgjwyud+z/iBwfRRrVmHc+P9Q7u2lSSpQ6bjr2gy5lrqIiU9vb6iAeGf2400A==}
hasBin: true
resolve@2.0.0-next.5:
@@ -3340,12 +3333,12 @@ packages:
run-parallel@1.2.0:
resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==}
- safe-array-concat@1.1.2:
- resolution: {integrity: sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==}
+ safe-array-concat@1.1.3:
+ resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
engines: {node: '>=0.4'}
- safe-regex-test@1.0.3:
- resolution: {integrity: sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==}
+ safe-regex-test@1.1.0:
+ resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
engines: {node: '>= 0.4'}
scheduler@0.25.0:
@@ -3382,16 +3375,28 @@ packages:
resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==}
engines: {node: '>=8'}
- side-channel@1.0.6:
- resolution: {integrity: sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==}
+ side-channel-list@1.0.0:
+ resolution: {integrity: sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-map@1.0.1:
+ resolution: {integrity: sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==}
+ engines: {node: '>= 0.4'}
+
+ side-channel-weakmap@1.0.2:
+ resolution: {integrity: sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==}
+ engines: {node: '>= 0.4'}
+
+ side-channel@1.1.0:
+ resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==}
engines: {node: '>= 0.4'}
signal-exit@4.1.0:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
- simple-icons@13.20.0:
- resolution: {integrity: sha512-8IQSSOaXhgG9fH0dJsUmlMlo0Jt0Xd1MwxsK75TlRZO0FR7P5UQ8TEaIPOwlRMHd/FzZJ0R3vFHW0kOH7PbdMw==}
+ simple-icons@13.21.0:
+ resolution: {integrity: sha512-LI5pVJPBv6oc79OMsffwb6kEqnmB8P1Cjg1crNUlhsxPETQ5UzbCKQdxU+7MW6+DD1qfPkla/vSKlLD4IfyXpQ==}
engines: {node: '>=0.12.18'}
slash@3.0.0:
@@ -3447,12 +3452,13 @@ packages:
string.prototype.repeat@1.0.0:
resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==}
- string.prototype.trim@1.2.9:
- resolution: {integrity: sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==}
+ string.prototype.trim@1.2.10:
+ resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
engines: {node: '>= 0.4'}
- string.prototype.trimend@1.0.8:
- resolution: {integrity: sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==}
+ string.prototype.trimend@1.0.9:
+ resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
+ engines: {node: '>= 0.4'}
string.prototype.trimstart@1.0.8:
resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
@@ -3592,6 +3598,9 @@ packages:
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
+ turbo-stream@2.4.0:
+ resolution: {integrity: sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g==}
+
type-check@0.4.0:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
@@ -3734,8 +3743,8 @@ packages:
resolution: {integrity: sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==}
engines: {node: '>= 0.4'}
- which-builtin-type@1.2.0:
- resolution: {integrity: sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==}
+ which-builtin-type@1.2.1:
+ resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
engines: {node: '>= 0.4'}
which-collection@1.0.2:
@@ -3801,11 +3810,6 @@ packages:
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
engines: {node: '>= 6'}
- yaml@2.5.1:
- resolution: {integrity: sha512-bLQOjaX/ADgQ20isPJRvF0iRUHIxVhYvr53Of7wGcWlO2jvtUlH5m87DsmulFVxRpNLOnI4tB6p/oh8D7kpn9Q==}
- engines: {node: '>= 14'}
- hasBin: true
-
yaml@2.6.1:
resolution: {integrity: sha512-7r0XPzioN/Q9kXBro/XPnA6kznR73DHq+GXh5ON7ZozRO6aMjbmiBuKste2wslTFkC5d1dw0GooOCepZXJ2SAg==}
engines: {node: '>= 14'}
@@ -3821,7 +3825,7 @@ snapshots:
'@ampproject/remapping@2.3.0':
dependencies:
- '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/gen-mapping': 0.3.8
'@jridgewell/trace-mapping': 0.3.25
'@babel/code-frame@7.26.2':
@@ -3856,15 +3860,15 @@ snapshots:
dependencies:
'@babel/parser': 7.26.3
'@babel/types': 7.26.3
- '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/gen-mapping': 0.3.8
'@jridgewell/trace-mapping': 0.3.25
- jsesc: 3.0.2
+ jsesc: 3.1.0
'@babel/helper-compilation-targets@7.25.9':
dependencies:
'@babel/compat-data': 7.26.3
'@babel/helper-validator-option': 7.25.9
- browserslist: 4.24.2
+ browserslist: 4.24.3
lru-cache: 5.1.1
semver: 6.3.1
@@ -3875,7 +3879,7 @@ snapshots:
'@babel/helper-plugin-utils': 7.25.9
debug: 4.4.0
lodash.debounce: 4.0.8
- resolve: 1.22.8
+ resolve: 1.22.9
transitivePeerDependencies:
- supports-color
@@ -4374,7 +4378,7 @@ snapshots:
'@floating-ui/react': 0.26.28(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
'@react-aria/focus': 3.19.0(react@19.0.0)
'@react-aria/interactions': 3.22.5(react@19.0.0)
- '@tanstack/react-virtual': 3.11.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
+ '@tanstack/react-virtual': 3.11.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)
react: 19.0.0
react-dom: 19.0.0(react@19.0.0)
@@ -4390,7 +4394,7 @@ snapshots:
raf-schd: 4.0.3
react: 19.0.0
react-dom: 19.0.0(react@19.0.0)
- react-redux: 9.1.2(@types/react@19.0.1)(react@19.0.0)(redux@5.0.1)
+ react-redux: 9.2.0(@types/react@19.0.1)(react@19.0.0)(redux@5.0.1)
redux: 5.0.1
use-memo-one: 1.1.3(react@19.0.0)
transitivePeerDependencies:
@@ -4417,7 +4421,7 @@ snapshots:
wrap-ansi: 8.1.0
wrap-ansi-cjs: wrap-ansi@7.0.0
- '@jridgewell/gen-mapping@0.3.5':
+ '@jridgewell/gen-mapping@0.3.8':
dependencies:
'@jridgewell/set-array': 1.2.1
'@jridgewell/sourcemap-codec': 1.5.0
@@ -4452,15 +4456,15 @@ snapshots:
- encoding
- utf-8-validate
- '@monaco-editor/loader@1.4.0(monaco-editor@0.52.0)':
+ '@monaco-editor/loader@1.4.0(monaco-editor@0.52.2)':
dependencies:
- monaco-editor: 0.52.0
+ monaco-editor: 0.52.2
state-local: 1.0.7
- '@monaco-editor/react@4.6.0(monaco-editor@0.52.0)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ '@monaco-editor/react@4.6.0(monaco-editor@0.52.2)(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
dependencies:
- '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.0)
- monaco-editor: 0.52.0
+ '@monaco-editor/loader': 1.4.0(monaco-editor@0.52.2)
+ monaco-editor: 0.52.2
react: 19.0.0
react-dom: 19.0.0(react@19.0.0)
@@ -4521,7 +4525,7 @@ snapshots:
dependencies:
react: 19.0.0
- '@reduxjs/toolkit@2.4.0(react-redux@9.1.2(@types/react@19.0.1)(react@19.0.0)(redux@5.0.1))(react@19.0.0)':
+ '@reduxjs/toolkit@2.5.0(react-redux@9.2.0(@types/react@19.0.1)(react@19.0.0)(redux@5.0.1))(react@19.0.0)':
dependencies:
immer: 10.1.1
redux: 5.0.1
@@ -4529,9 +4533,7 @@ snapshots:
reselect: 5.1.1
optionalDependencies:
react: 19.0.0
- react-redux: 9.1.2(@types/react@19.0.1)(react@19.0.0)(redux@5.0.1)
-
- '@remix-run/router@1.21.0': {}
+ react-redux: 9.2.0(@types/react@19.0.1)(react@19.0.0)(redux@5.0.1)
'@rollup/plugin-alias@5.1.1(rollup@4.28.1)':
optionalDependencies:
@@ -4604,33 +4606,33 @@ snapshots:
'@rtsao/scc@1.1.0': {}
- '@sentry-internal/browser-utils@8.42.0':
+ '@sentry-internal/browser-utils@8.45.0':
dependencies:
- '@sentry/core': 8.42.0
+ '@sentry/core': 8.45.0
- '@sentry-internal/feedback@8.42.0':
+ '@sentry-internal/feedback@8.45.0':
dependencies:
- '@sentry/core': 8.42.0
+ '@sentry/core': 8.45.0
- '@sentry-internal/replay-canvas@8.42.0':
+ '@sentry-internal/replay-canvas@8.45.0':
dependencies:
- '@sentry-internal/replay': 8.42.0
- '@sentry/core': 8.42.0
+ '@sentry-internal/replay': 8.45.0
+ '@sentry/core': 8.45.0
- '@sentry-internal/replay@8.42.0':
+ '@sentry-internal/replay@8.45.0':
dependencies:
- '@sentry-internal/browser-utils': 8.42.0
- '@sentry/core': 8.42.0
+ '@sentry-internal/browser-utils': 8.45.0
+ '@sentry/core': 8.45.0
'@sentry/babel-plugin-component-annotate@2.22.7': {}
- '@sentry/browser@8.42.0':
+ '@sentry/browser@8.45.0':
dependencies:
- '@sentry-internal/browser-utils': 8.42.0
- '@sentry-internal/feedback': 8.42.0
- '@sentry-internal/replay': 8.42.0
- '@sentry-internal/replay-canvas': 8.42.0
- '@sentry/core': 8.42.0
+ '@sentry-internal/browser-utils': 8.45.0
+ '@sentry-internal/feedback': 8.45.0
+ '@sentry-internal/replay': 8.45.0
+ '@sentry-internal/replay-canvas': 8.45.0
+ '@sentry/core': 8.45.0
'@sentry/bundler-plugin-core@2.22.7':
dependencies:
@@ -4686,12 +4688,12 @@ snapshots:
- encoding
- supports-color
- '@sentry/core@8.42.0': {}
+ '@sentry/core@8.45.0': {}
- '@sentry/react@8.42.0(react@19.0.0)':
+ '@sentry/react@8.45.0(react@19.0.0)':
dependencies:
- '@sentry/browser': 8.42.0
- '@sentry/core': 8.42.0
+ '@sentry/browser': 8.45.0
+ '@sentry/core': 8.45.0
hoist-non-react-statics: 3.3.2
react: 19.0.0
@@ -4725,28 +4727,28 @@ snapshots:
'@tanstack/eslint-plugin-query@5.62.1(eslint@8.57.1)(typescript@5.6.3)':
dependencies:
- '@typescript-eslint/utils': 8.17.0(eslint@8.57.1)(typescript@5.6.3)
+ '@typescript-eslint/utils': 8.18.0(eslint@8.57.1)(typescript@5.6.3)
eslint: 8.57.1
transitivePeerDependencies:
- supports-color
- typescript
- '@tanstack/query-core@5.62.3': {}
+ '@tanstack/query-core@5.62.7': {}
'@tanstack/query-devtools@5.61.4': {}
- '@tanstack/react-query-devtools@5.62.3(@tanstack/react-query@5.62.3(react@19.0.0))(react@19.0.0)':
+ '@tanstack/react-query-devtools@5.62.7(@tanstack/react-query@5.62.7(react@19.0.0))(react@19.0.0)':
dependencies:
'@tanstack/query-devtools': 5.61.4
- '@tanstack/react-query': 5.62.3(react@19.0.0)
+ '@tanstack/react-query': 5.62.7(react@19.0.0)
react: 19.0.0
- '@tanstack/react-query@5.62.3(react@19.0.0)':
+ '@tanstack/react-query@5.62.7(react@19.0.0)':
dependencies:
- '@tanstack/query-core': 5.62.3
+ '@tanstack/query-core': 5.62.7
react: 19.0.0
- '@tanstack/react-virtual@3.11.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
+ '@tanstack/react-virtual@3.11.1(react-dom@19.0.0(react@19.0.0))(react@19.0.0)':
dependencies:
'@tanstack/virtual-core': 3.10.9
react: 19.0.0
@@ -4775,6 +4777,8 @@ snapshots:
dependencies:
'@babel/types': 7.26.3
+ '@types/cookie@0.6.0': {}
+
'@types/estree@1.0.6': {}
'@types/format-thousands@2.0.3': {}
@@ -4788,7 +4792,7 @@ snapshots:
'@types/lodash@4.17.13': {}
- '@types/node@22.10.1':
+ '@types/node@22.10.2':
dependencies:
undici-types: 6.20.0
@@ -4796,7 +4800,7 @@ snapshots:
dependencies:
'@types/react': 19.0.1
- '@types/react-dom@19.0.1':
+ '@types/react-dom@19.0.2(@types/react@19.0.1)':
dependencies:
'@types/react': 19.0.1
@@ -4821,7 +4825,7 @@ snapshots:
'@types/semver@7.5.8': {}
- '@types/use-sync-external-store@0.0.3': {}
+ '@types/use-sync-external-store@0.0.6': {}
'@typescript-eslint/eslint-plugin@7.18.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint@8.57.1)(typescript@5.6.3)':
dependencies:
@@ -4859,10 +4863,10 @@ snapshots:
'@typescript-eslint/types': 7.18.0
'@typescript-eslint/visitor-keys': 7.18.0
- '@typescript-eslint/scope-manager@8.17.0':
+ '@typescript-eslint/scope-manager@8.18.0':
dependencies:
- '@typescript-eslint/types': 8.17.0
- '@typescript-eslint/visitor-keys': 8.17.0
+ '@typescript-eslint/types': 8.18.0
+ '@typescript-eslint/visitor-keys': 8.18.0
'@typescript-eslint/type-utils@7.18.0(eslint@8.57.1)(typescript@5.6.3)':
dependencies:
@@ -4878,7 +4882,7 @@ snapshots:
'@typescript-eslint/types@7.18.0': {}
- '@typescript-eslint/types@8.17.0': {}
+ '@typescript-eslint/types@8.18.0': {}
'@typescript-eslint/typescript-estree@7.18.0(typescript@5.6.3)':
dependencies:
@@ -4895,17 +4899,16 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/typescript-estree@8.17.0(typescript@5.6.3)':
+ '@typescript-eslint/typescript-estree@8.18.0(typescript@5.6.3)':
dependencies:
- '@typescript-eslint/types': 8.17.0
- '@typescript-eslint/visitor-keys': 8.17.0
+ '@typescript-eslint/types': 8.18.0
+ '@typescript-eslint/visitor-keys': 8.18.0
debug: 4.4.0
fast-glob: 3.3.2
is-glob: 4.0.3
minimatch: 9.0.5
semver: 7.6.3
ts-api-utils: 1.4.3(typescript@5.6.3)
- optionalDependencies:
typescript: 5.6.3
transitivePeerDependencies:
- supports-color
@@ -4921,14 +4924,13 @@ snapshots:
- supports-color
- typescript
- '@typescript-eslint/utils@8.17.0(eslint@8.57.1)(typescript@5.6.3)':
+ '@typescript-eslint/utils@8.18.0(eslint@8.57.1)(typescript@5.6.3)':
dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1)
- '@typescript-eslint/scope-manager': 8.17.0
- '@typescript-eslint/types': 8.17.0
- '@typescript-eslint/typescript-estree': 8.17.0(typescript@5.6.3)
+ '@typescript-eslint/scope-manager': 8.18.0
+ '@typescript-eslint/types': 8.18.0
+ '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.6.3)
eslint: 8.57.1
- optionalDependencies:
typescript: 5.6.3
transitivePeerDependencies:
- supports-color
@@ -4938,21 +4940,21 @@ snapshots:
'@typescript-eslint/types': 7.18.0
eslint-visitor-keys: 3.4.3
- '@typescript-eslint/visitor-keys@8.17.0':
+ '@typescript-eslint/visitor-keys@8.18.0':
dependencies:
- '@typescript-eslint/types': 8.17.0
+ '@typescript-eslint/types': 8.18.0
eslint-visitor-keys: 4.2.0
'@ungap/structured-clone@1.2.1': {}
- '@vitejs/plugin-react@4.3.4(vite@6.0.3(@types/node@22.10.1)(jiti@1.21.6)(yaml@2.6.1))':
+ '@vitejs/plugin-react@4.3.4(vite@6.0.3(@types/node@22.10.2)(jiti@1.21.6)(yaml@2.6.1))':
dependencies:
'@babel/core': 7.26.0
'@babel/plugin-transform-react-jsx-self': 7.25.9(@babel/core@7.26.0)
'@babel/plugin-transform-react-jsx-source': 7.25.9(@babel/core@7.26.0)
'@types/babel__core': 7.20.5
react-refresh: 0.14.2
- vite: 6.0.3(@types/node@22.10.1)(jiti@1.21.6)(yaml@2.6.1)
+ vite: 6.0.3(@types/node@22.10.2)(jiti@1.21.6)(yaml@2.6.1)
transitivePeerDependencies:
- supports-color
@@ -5034,7 +5036,7 @@ snapshots:
define-properties: 1.2.1
es-abstract: 1.23.5
es-object-atoms: 1.0.0
- get-intrinsic: 1.2.5
+ get-intrinsic: 1.2.6
is-string: 1.1.0
array-union@2.1.0: {}
@@ -5086,7 +5088,7 @@ snapshots:
define-properties: 1.2.1
es-abstract: 1.23.5
es-errors: 1.3.0
- get-intrinsic: 1.2.5
+ get-intrinsic: 1.2.6
is-array-buffer: 3.0.4
is-shared-array-buffer: 1.0.3
@@ -5098,8 +5100,8 @@ snapshots:
autoprefixer@10.4.20(postcss@8.4.49):
dependencies:
- browserslist: 4.24.2
- caniuse-lite: 1.0.30001687
+ browserslist: 4.24.3
+ caniuse-lite: 1.0.30001688
fraction.js: 4.3.7
normalize-range: 0.1.2
picocolors: 1.1.1
@@ -5165,30 +5167,35 @@ snapshots:
dependencies:
fill-range: 7.1.1
- browserslist@4.24.2:
+ browserslist@4.24.3:
dependencies:
- caniuse-lite: 1.0.30001687
- electron-to-chromium: 1.5.71
- node-releases: 2.0.18
- update-browserslist-db: 1.1.1(browserslist@4.24.2)
+ caniuse-lite: 1.0.30001688
+ electron-to-chromium: 1.5.73
+ node-releases: 2.0.19
+ update-browserslist-db: 1.1.1(browserslist@4.24.3)
- call-bind-apply-helpers@1.0.0:
+ call-bind-apply-helpers@1.0.1:
dependencies:
es-errors: 1.3.0
function-bind: 1.1.2
call-bind@1.0.8:
dependencies:
- call-bind-apply-helpers: 1.0.0
+ call-bind-apply-helpers: 1.0.1
es-define-property: 1.0.1
- get-intrinsic: 1.2.5
+ get-intrinsic: 1.2.6
set-function-length: 1.2.2
+ call-bound@1.0.2:
+ dependencies:
+ call-bind: 1.0.8
+ get-intrinsic: 1.2.6
+
callsites@3.1.0: {}
camelcase-css@2.0.1: {}
- caniuse-lite@1.0.30001687: {}
+ caniuse-lite@1.0.30001688: {}
chalk@4.1.2:
dependencies:
@@ -5248,13 +5255,15 @@ snapshots:
convert-source-map@2.0.0: {}
+ cookie@1.0.2: {}
+
copy-to-clipboard@3.3.3:
dependencies:
toggle-selection: 1.0.6
core-js-compat@3.39.0:
dependencies:
- browserslist: 4.24.2
+ browserslist: 4.24.3
cosmiconfig@9.0.0(typescript@5.6.3):
dependencies:
@@ -5286,7 +5295,7 @@ snapshots:
css-functions-list@3.2.3: {}
- css-has-pseudo@7.0.1(postcss@8.4.49):
+ css-has-pseudo@7.0.2(postcss@8.4.49):
dependencies:
'@csstools/selector-specificity': 5.0.0(postcss-selector-parser@7.0.0)
postcss: 8.4.49
@@ -5304,7 +5313,7 @@ snapshots:
mdn-data: 2.12.2
source-map-js: 1.2.1
- cssdb@8.2.2: {}
+ cssdb@8.2.3: {}
cssesc@3.0.0: {}
@@ -5316,19 +5325,19 @@ snapshots:
dependencies:
call-bind: 1.0.8
es-errors: 1.3.0
- is-data-view: 1.0.1
+ is-data-view: 1.0.2
data-view-byte-length@1.0.1:
dependencies:
call-bind: 1.0.8
es-errors: 1.3.0
- is-data-view: 1.0.1
+ is-data-view: 1.0.2
data-view-byte-offset@1.0.0:
dependencies:
call-bind: 1.0.8
es-errors: 1.3.0
- is-data-view: 1.0.1
+ is-data-view: 1.0.2
dayjs@1.11.13: {}
@@ -5338,10 +5347,6 @@ snapshots:
dependencies:
ms: 2.1.3
- debug@4.3.7:
- dependencies:
- ms: 2.1.3
-
debug@4.4.0:
dependencies:
ms: 2.1.3
@@ -5402,13 +5407,13 @@ snapshots:
dunder-proto@1.0.0:
dependencies:
- call-bind-apply-helpers: 1.0.0
+ call-bind-apply-helpers: 1.0.1
es-errors: 1.3.0
gopd: 1.2.0
eastasianwidth@0.2.0: {}
- electron-to-chromium@1.5.71: {}
+ electron-to-chromium@1.5.73: {}
emoji-regex@10.4.0: {}
@@ -5444,7 +5449,7 @@ snapshots:
es-set-tostringtag: 2.0.3
es-to-primitive: 1.3.0
function.prototype.name: 1.1.6
- get-intrinsic: 1.2.5
+ get-intrinsic: 1.2.6
get-symbol-description: 1.0.2
globalthis: 1.0.4
gopd: 1.2.0
@@ -5452,24 +5457,24 @@ snapshots:
has-proto: 1.2.0
has-symbols: 1.1.0
hasown: 2.0.2
- internal-slot: 1.0.7
+ internal-slot: 1.1.0
is-array-buffer: 3.0.4
is-callable: 1.2.7
- is-data-view: 1.0.1
+ is-data-view: 1.0.2
is-negative-zero: 2.0.3
- is-regex: 1.2.0
+ is-regex: 1.2.1
is-shared-array-buffer: 1.0.3
is-string: 1.1.0
is-typed-array: 1.1.13
- is-weakref: 1.0.2
+ is-weakref: 1.1.0
object-inspect: 1.13.3
object-keys: 1.1.1
object.assign: 4.1.5
regexp.prototype.flags: 1.5.3
- safe-array-concat: 1.1.2
- safe-regex-test: 1.0.3
- string.prototype.trim: 1.2.9
- string.prototype.trimend: 1.0.8
+ safe-array-concat: 1.1.3
+ safe-regex-test: 1.1.0
+ string.prototype.trim: 1.2.10
+ string.prototype.trimend: 1.0.9
string.prototype.trimstart: 1.0.8
typed-array-buffer: 1.0.2
typed-array-byte-length: 1.0.1
@@ -5490,15 +5495,15 @@ snapshots:
es-errors: 1.3.0
es-set-tostringtag: 2.0.3
function-bind: 1.1.2
- get-intrinsic: 1.2.5
+ get-intrinsic: 1.2.6
globalthis: 1.0.4
gopd: 1.2.0
has-property-descriptors: 1.0.2
has-proto: 1.2.0
has-symbols: 1.1.0
- internal-slot: 1.0.7
- iterator.prototype: 1.1.3
- safe-array-concat: 1.1.2
+ internal-slot: 1.1.0
+ iterator.prototype: 1.1.4
+ safe-array-concat: 1.1.3
es-module-lexer@1.5.4: {}
@@ -5508,7 +5513,7 @@ snapshots:
es-set-tostringtag@2.0.3:
dependencies:
- get-intrinsic: 1.2.5
+ get-intrinsic: 1.2.6
has-tostringtag: 1.0.2
hasown: 2.0.2
@@ -5519,8 +5524,8 @@ snapshots:
es-to-primitive@1.3.0:
dependencies:
is-callable: 1.2.7
- is-date-object: 1.0.5
- is-symbol: 1.1.0
+ is-date-object: 1.1.0
+ is-symbol: 1.1.1
esbuild@0.24.0:
optionalDependencies:
@@ -5585,8 +5590,8 @@ snapshots:
eslint-import-resolver-node@0.3.9:
dependencies:
debug: 3.2.7
- is-core-module: 2.15.1
- resolve: 1.22.8
+ is-core-module: 2.16.0
+ resolve: 1.22.9
transitivePeerDependencies:
- supports-color
@@ -5630,14 +5635,14 @@ snapshots:
eslint-import-resolver-node: 0.3.9
eslint-module-utils: 2.12.0(@typescript-eslint/parser@7.18.0(eslint@8.57.1)(typescript@5.6.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.7.0)(eslint@8.57.1)
hasown: 2.0.2
- is-core-module: 2.15.1
+ is-core-module: 2.16.0
is-glob: 4.0.3
minimatch: 3.1.2
object.fromentries: 2.0.8
object.groupby: 1.0.3
object.values: 1.2.0
semver: 6.3.1
- string.prototype.trimend: 1.0.8
+ string.prototype.trimend: 1.0.9
tsconfig-paths: 3.15.0
optionalDependencies:
'@typescript-eslint/parser': 7.18.0(eslint@8.57.1)(typescript@5.6.3)
@@ -5662,7 +5667,7 @@ snapshots:
language-tags: 1.0.9
minimatch: 3.1.2
object.fromentries: 2.0.8
- safe-regex-test: 1.0.3
+ safe-regex-test: 1.1.0
string.prototype.includes: 2.0.1
eslint-plugin-react-hooks@4.6.2(eslint@8.57.1):
@@ -5902,16 +5907,18 @@ snapshots:
get-east-asian-width@1.3.0: {}
- get-intrinsic@1.2.5:
+ get-intrinsic@1.2.6:
dependencies:
- call-bind-apply-helpers: 1.0.0
+ call-bind-apply-helpers: 1.0.1
dunder-proto: 1.0.0
es-define-property: 1.0.1
es-errors: 1.3.0
+ es-object-atoms: 1.0.0
function-bind: 1.1.2
gopd: 1.2.0
has-symbols: 1.1.0
hasown: 2.0.2
+ math-intrinsics: 1.0.0
get-stream@8.0.1: {}
@@ -5919,7 +5926,7 @@ snapshots:
dependencies:
call-bind: 1.0.8
es-errors: 1.3.0
- get-intrinsic: 1.2.5
+ get-intrinsic: 1.2.6
get-tsconfig@4.8.1:
dependencies:
@@ -6059,16 +6066,16 @@ snapshots:
ini@1.3.8: {}
- internal-slot@1.0.7:
+ internal-slot@1.1.0:
dependencies:
es-errors: 1.3.0
hasown: 2.0.2
- side-channel: 1.0.6
+ side-channel: 1.1.0
is-array-buffer@3.0.4:
dependencies:
call-bind: 1.0.8
- get-intrinsic: 1.2.5
+ get-intrinsic: 1.2.6
is-arrayish@0.2.1: {}
@@ -6084,9 +6091,9 @@ snapshots:
dependencies:
binary-extensions: 2.3.0
- is-boolean-object@1.2.0:
+ is-boolean-object@1.2.1:
dependencies:
- call-bind: 1.0.8
+ call-bound: 1.0.2
has-tostringtag: 1.0.2
is-bun-module@1.3.0:
@@ -6095,16 +6102,19 @@ snapshots:
is-callable@1.2.7: {}
- is-core-module@2.15.1:
+ is-core-module@2.16.0:
dependencies:
hasown: 2.0.2
- is-data-view@1.0.1:
+ is-data-view@1.0.2:
dependencies:
+ call-bound: 1.0.2
+ get-intrinsic: 1.2.6
is-typed-array: 1.1.13
- is-date-object@1.0.5:
+ is-date-object@1.1.0:
dependencies:
+ call-bound: 1.0.2
has-tostringtag: 1.0.2
is-extglob@2.1.1: {}
@@ -6144,9 +6154,9 @@ snapshots:
is-plain-object@5.0.0: {}
- is-regex@1.2.0:
+ is-regex@1.2.1:
dependencies:
- call-bind: 1.0.8
+ call-bound: 1.0.2
gopd: 1.2.0
has-tostringtag: 1.0.2
hasown: 2.0.2
@@ -6164,11 +6174,11 @@ snapshots:
call-bind: 1.0.8
has-tostringtag: 1.0.2
- is-symbol@1.1.0:
+ is-symbol@1.1.1:
dependencies:
- call-bind: 1.0.8
+ call-bound: 1.0.2
has-symbols: 1.1.0
- safe-regex-test: 1.0.3
+ safe-regex-test: 1.1.0
is-typed-array@1.1.13:
dependencies:
@@ -6176,23 +6186,24 @@ snapshots:
is-weakmap@2.0.2: {}
- is-weakref@1.0.2:
+ is-weakref@1.1.0:
dependencies:
- call-bind: 1.0.8
+ call-bound: 1.0.2
is-weakset@2.0.3:
dependencies:
call-bind: 1.0.8
- get-intrinsic: 1.2.5
+ get-intrinsic: 1.2.6
isarray@2.0.5: {}
isexe@2.0.0: {}
- iterator.prototype@1.1.3:
+ iterator.prototype@1.1.4:
dependencies:
- define-properties: 1.2.1
- get-intrinsic: 1.2.5
+ define-data-property: 1.1.4
+ es-object-atoms: 1.0.0
+ get-intrinsic: 1.2.6
has-symbols: 1.1.0
reflect.getprototypeof: 1.0.8
set-function-name: 2.0.2
@@ -6211,7 +6222,7 @@ snapshots:
dependencies:
argparse: 2.0.1
- jsesc@3.0.2: {}
+ jsesc@3.1.0: {}
json-buffer@3.0.1: {}
@@ -6261,18 +6272,18 @@ snapshots:
lines-and-columns@1.2.4: {}
- lint-staged@15.2.10:
+ lint-staged@15.2.11:
dependencies:
chalk: 5.3.0
commander: 12.1.0
- debug: 4.3.7
+ debug: 4.4.0
execa: 8.0.1
lilconfig: 3.1.3
listr2: 8.2.5
micromatch: 4.0.8
pidtree: 0.6.0
string-argv: 0.3.2
- yaml: 2.5.1
+ yaml: 2.6.1
transitivePeerDependencies:
- supports-color
@@ -6315,7 +6326,7 @@ snapshots:
dependencies:
yallist: 3.1.1
- magic-string@0.30.14:
+ magic-string@0.30.15:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
@@ -6327,6 +6338,8 @@ snapshots:
dependencies:
css-mediaquery: 0.1.2
+ math-intrinsics@1.0.0: {}
+
mathml-tag-names@2.1.3: {}
mdn-data@2.12.2: {}
@@ -6372,7 +6385,7 @@ snapshots:
minipass@7.1.2: {}
- monaco-editor@0.52.0: {}
+ monaco-editor@0.52.2: {}
ms@2.1.3: {}
@@ -6392,7 +6405,7 @@ snapshots:
dependencies:
whatwg-url: 5.0.0
- node-releases@2.0.18: {}
+ node-releases@2.0.19: {}
normalize-path@3.0.0: {}
@@ -6612,21 +6625,21 @@ snapshots:
postcss: 8.4.49
postcss-value-parser: 4.2.0
read-cache: 1.0.0
- resolve: 1.22.8
+ resolve: 1.22.9
postcss-import@15.1.0(postcss@8.4.49):
dependencies:
postcss: 8.4.49
postcss-value-parser: 4.2.0
read-cache: 1.0.0
- resolve: 1.22.8
+ resolve: 1.22.9
postcss-import@16.1.0(postcss@8.4.49):
dependencies:
postcss: 8.4.49
postcss-value-parser: 4.2.0
read-cache: 1.0.0
- resolve: 1.22.8
+ resolve: 1.22.9
postcss-js@4.0.1(postcss@8.4.49):
dependencies:
@@ -6704,7 +6717,7 @@ snapshots:
postcss: 8.4.49
postcss-value-parser: 4.2.0
- postcss-preset-env@10.1.1(postcss@8.4.49):
+ postcss-preset-env@10.1.2(postcss@8.4.49):
dependencies:
'@csstools/postcss-cascade-layers': 5.0.1(postcss@8.4.49)
'@csstools/postcss-color-function': 4.0.6(postcss@8.4.49)
@@ -6739,11 +6752,11 @@ snapshots:
'@csstools/postcss-trigonometric-functions': 4.0.5(postcss@8.4.49)
'@csstools/postcss-unset-value': 4.0.0(postcss@8.4.49)
autoprefixer: 10.4.20(postcss@8.4.49)
- browserslist: 4.24.2
+ browserslist: 4.24.3
css-blank-pseudo: 7.0.1(postcss@8.4.49)
- css-has-pseudo: 7.0.1(postcss@8.4.49)
+ css-has-pseudo: 7.0.2(postcss@8.4.49)
css-prefers-color-scheme: 10.0.0(postcss@8.4.49)
- cssdb: 8.2.2
+ cssdb: 8.2.3
postcss: 8.4.49
postcss-attribute-case-insensitive: 7.0.1(postcss@8.4.49)
postcss-clamp: 4.1.0(postcss@8.4.49)
@@ -6889,9 +6902,9 @@ snapshots:
react-lifecycles-compat: 3.0.4
warning: 4.0.3
- react-redux@9.1.2(@types/react@19.0.1)(react@19.0.0)(redux@5.0.1):
+ react-redux@9.2.0(@types/react@19.0.1)(react@19.0.0)(redux@5.0.1):
dependencies:
- '@types/use-sync-external-store': 0.0.3
+ '@types/use-sync-external-store': 0.0.6
react: 19.0.0
use-sync-external-store: 1.4.0(react@19.0.0)
optionalDependencies:
@@ -6916,17 +6929,15 @@ snapshots:
react: 19.0.0
shallow-equal: 3.1.0
- react-router-dom@6.28.0(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
+ react-router@7.0.2(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies:
- '@remix-run/router': 1.21.0
+ '@types/cookie': 0.6.0
+ cookie: 1.0.2
react: 19.0.0
+ set-cookie-parser: 2.7.1
+ turbo-stream: 2.4.0
+ optionalDependencies:
react-dom: 19.0.0(react@19.0.0)
- react-router: 6.28.0(react@19.0.0)
-
- react-router@6.28.0(react@19.0.0):
- dependencies:
- '@remix-run/router': 1.21.0
- react: 19.0.0
react-toastify@10.0.6(react-dom@19.0.0(react@19.0.0))(react@19.0.0):
dependencies:
@@ -6974,9 +6985,9 @@ snapshots:
dunder-proto: 1.0.0
es-abstract: 1.23.5
es-errors: 1.3.0
- get-intrinsic: 1.2.5
+ get-intrinsic: 1.2.6
gopd: 1.2.0
- which-builtin-type: 1.2.0
+ which-builtin-type: 1.2.1
regenerator-runtime@0.14.1: {}
@@ -7001,15 +7012,15 @@ snapshots:
resolve-pkg-maps@1.0.0: {}
- resolve@1.22.8:
+ resolve@1.22.9:
dependencies:
- is-core-module: 2.15.1
+ is-core-module: 2.16.0
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
resolve@2.0.0-next.5:
dependencies:
- is-core-module: 2.15.1
+ is-core-module: 2.16.0
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
@@ -7055,18 +7066,19 @@ snapshots:
dependencies:
queue-microtask: 1.2.3
- safe-array-concat@1.1.2:
+ safe-array-concat@1.1.3:
dependencies:
call-bind: 1.0.8
- get-intrinsic: 1.2.5
+ call-bound: 1.0.2
+ get-intrinsic: 1.2.6
has-symbols: 1.1.0
isarray: 2.0.5
- safe-regex-test@1.0.3:
+ safe-regex-test@1.1.0:
dependencies:
- call-bind: 1.0.8
+ call-bound: 1.0.2
es-errors: 1.3.0
- is-regex: 1.2.0
+ is-regex: 1.2.1
scheduler@0.25.0: {}
@@ -7081,7 +7093,7 @@ snapshots:
define-data-property: 1.1.4
es-errors: 1.3.0
function-bind: 1.1.2
- get-intrinsic: 1.2.5
+ get-intrinsic: 1.2.6
gopd: 1.2.0
has-property-descriptors: 1.0.2
@@ -7100,16 +7112,37 @@ snapshots:
shebang-regex@3.0.0: {}
- side-channel@1.0.6:
+ side-channel-list@1.0.0:
dependencies:
- call-bind: 1.0.8
es-errors: 1.3.0
- get-intrinsic: 1.2.5
object-inspect: 1.13.3
+ side-channel-map@1.0.1:
+ dependencies:
+ call-bound: 1.0.2
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.6
+ object-inspect: 1.13.3
+
+ side-channel-weakmap@1.0.2:
+ dependencies:
+ call-bound: 1.0.2
+ es-errors: 1.3.0
+ get-intrinsic: 1.2.6
+ object-inspect: 1.13.3
+ side-channel-map: 1.0.1
+
+ side-channel@1.1.0:
+ dependencies:
+ es-errors: 1.3.0
+ object-inspect: 1.13.3
+ side-channel-list: 1.0.0
+ side-channel-map: 1.0.1
+ side-channel-weakmap: 1.0.2
+
signal-exit@4.1.0: {}
- simple-icons@13.20.0: {}
+ simple-icons@13.21.0: {}
slash@3.0.0: {}
@@ -7168,29 +7201,33 @@ snapshots:
es-abstract: 1.23.5
es-errors: 1.3.0
es-object-atoms: 1.0.0
- get-intrinsic: 1.2.5
+ get-intrinsic: 1.2.6
gopd: 1.2.0
has-symbols: 1.1.0
- internal-slot: 1.0.7
+ internal-slot: 1.1.0
regexp.prototype.flags: 1.5.3
set-function-name: 2.0.2
- side-channel: 1.0.6
+ side-channel: 1.1.0
string.prototype.repeat@1.0.0:
dependencies:
define-properties: 1.2.1
es-abstract: 1.23.5
- string.prototype.trim@1.2.9:
+ string.prototype.trim@1.2.10:
dependencies:
call-bind: 1.0.8
+ call-bound: 1.0.2
+ define-data-property: 1.1.4
define-properties: 1.2.1
es-abstract: 1.23.5
es-object-atoms: 1.0.0
+ has-property-descriptors: 1.0.2
- string.prototype.trimend@1.0.8:
+ string.prototype.trimend@1.0.9:
dependencies:
call-bind: 1.0.8
+ call-bound: 1.0.2
define-properties: 1.2.1
es-object-atoms: 1.0.0
@@ -7276,7 +7313,7 @@ snapshots:
sucrase@3.35.0:
dependencies:
- '@jridgewell/gen-mapping': 0.3.5
+ '@jridgewell/gen-mapping': 0.3.8
commander: 4.1.1
glob: 10.4.5
lines-and-columns: 1.2.4
@@ -7338,7 +7375,7 @@ snapshots:
postcss-selector-parser: 6.1.2
postcss-value-parser: 4.2.0
quick-lru: 5.1.1
- resolve: 1.22.8
+ resolve: 1.22.9
transitivePeerDependencies:
- ts-node
@@ -7364,7 +7401,7 @@ snapshots:
postcss-load-config: 4.0.2(postcss@8.4.49)
postcss-nested: 6.2.0(postcss@8.4.49)
postcss-selector-parser: 6.1.2
- resolve: 1.22.8
+ resolve: 1.22.9
sucrase: 3.35.0
transitivePeerDependencies:
- ts-node
@@ -7413,6 +7450,8 @@ snapshots:
tslib@2.8.1: {}
+ turbo-stream@2.4.0: {}
+
type-check@0.4.0:
dependencies:
prelude-ls: 1.2.1
@@ -7472,9 +7511,9 @@ snapshots:
webpack-sources: 3.2.3
webpack-virtual-modules: 0.5.0
- update-browserslist-db@1.1.1(browserslist@4.24.2):
+ update-browserslist-db@1.1.1(browserslist@4.24.3):
dependencies:
- browserslist: 4.24.2
+ browserslist: 4.24.3
escalade: 3.2.0
picocolors: 1.1.1
@@ -7512,17 +7551,17 @@ snapshots:
'@rollup/plugin-alias': 5.1.1(rollup@4.28.1)
'@rollup/pluginutils': 5.1.3(rollup@4.28.1)
es-module-lexer: 1.5.4
- magic-string: 0.30.14
+ magic-string: 0.30.15
transitivePeerDependencies:
- rollup
- vite@6.0.3(@types/node@22.10.1)(jiti@1.21.6)(yaml@2.6.1):
+ vite@6.0.3(@types/node@22.10.2)(jiti@1.21.6)(yaml@2.6.1):
dependencies:
esbuild: 0.24.0
postcss: 8.4.49
rollup: 4.28.1
optionalDependencies:
- '@types/node': 22.10.1
+ '@types/node': 22.10.2
fsevents: 2.3.3
jiti: 1.21.6
yaml: 2.6.1
@@ -7545,22 +7584,22 @@ snapshots:
which-boxed-primitive@1.1.0:
dependencies:
is-bigint: 1.1.0
- is-boolean-object: 1.2.0
+ is-boolean-object: 1.2.1
is-number-object: 1.1.0
is-string: 1.1.0
- is-symbol: 1.1.0
+ is-symbol: 1.1.1
- which-builtin-type@1.2.0:
+ which-builtin-type@1.2.1:
dependencies:
- call-bind: 1.0.8
+ call-bound: 1.0.2
function.prototype.name: 1.1.6
has-tostringtag: 1.0.2
is-async-function: 2.0.0
- is-date-object: 1.0.5
+ is-date-object: 1.1.0
is-finalizationregistry: 1.1.0
is-generator-function: 1.0.10
- is-regex: 1.2.0
- is-weakref: 1.0.2
+ is-regex: 1.2.1
+ is-weakref: 1.1.0
isarray: 2.0.5
which-boxed-primitive: 1.1.0
which-collection: 1.0.2
@@ -7624,8 +7663,6 @@ snapshots:
yaml@1.10.2: {}
- yaml@2.5.1: {}
-
yaml@2.6.1: {}
yocto-queue@0.1.0: {}
diff --git a/src/components/Collection/CollectionTitle.tsx b/src/components/Collection/CollectionTitle.tsx
index 3a0e4eb86..2c6489e11 100644
--- a/src/components/Collection/CollectionTitle.tsx
+++ b/src/components/Collection/CollectionTitle.tsx
@@ -1,7 +1,6 @@
import React from 'react';
import { useDispatch } from 'react-redux';
-import { useParams } from 'react-router';
-import { Link } from 'react-router-dom';
+import { Link, useParams } from 'react-router';
import { mdiChevronRight } from '@mdi/js';
import { Icon } from '@mdi/react';
import cx from 'classnames';
diff --git a/src/components/Collection/CollectionView.tsx b/src/components/Collection/CollectionView.tsx
index 9f0ec402b..902b4beee 100644
--- a/src/components/Collection/CollectionView.tsx
+++ b/src/components/Collection/CollectionView.tsx
@@ -1,5 +1,5 @@
import React, { useMemo } from 'react';
-import { useOutletContext } from 'react-router-dom';
+import { useOutletContext } from 'react-router';
import useMeasure from 'react-use-measure';
import { mdiLoading } from '@mdi/js';
import { Icon } from '@mdi/react';
diff --git a/src/components/Collection/Episode/EpisodeSummary.tsx b/src/components/Collection/Episode/EpisodeSummary.tsx
index 9c4960617..61606c511 100644
--- a/src/components/Collection/Episode/EpisodeSummary.tsx
+++ b/src/components/Collection/Episode/EpisodeSummary.tsx
@@ -1,6 +1,6 @@
import React from 'react';
import AnimateHeight from 'react-animate-height';
-import { useOutletContext } from 'react-router-dom';
+import { useOutletContext } from 'react-router';
import {
mdiCheckboxBlankCircleOutline,
mdiCheckboxMarkedCircleOutline,
diff --git a/src/components/Collection/ListViewItem.tsx b/src/components/Collection/ListViewItem.tsx
index d46be2918..5883213a5 100644
--- a/src/components/Collection/ListViewItem.tsx
+++ b/src/components/Collection/ListViewItem.tsx
@@ -1,5 +1,5 @@
import React, { useMemo } from 'react';
-import { Link } from 'react-router-dom';
+import { Link } from 'react-router';
import {
mdiAlertCircleOutline,
mdiCalendarMonthOutline,
diff --git a/src/components/Collection/PosterViewItem.tsx b/src/components/Collection/PosterViewItem.tsx
index 4fb29f418..a4b781eaf 100644
--- a/src/components/Collection/PosterViewItem.tsx
+++ b/src/components/Collection/PosterViewItem.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import { Link } from 'react-router-dom';
+import { Link } from 'react-router';
import { mdiCheckboxMarkedCircleOutline, mdiPencilCircleOutline } from '@mdi/js';
import { Icon } from '@mdi/react';
import { reduce } from 'lodash';
diff --git a/src/components/Collection/Series/EditSeriesTabs/DeleteActionsTab.tsx b/src/components/Collection/Series/EditSeriesTabs/DeleteActionsTab.tsx
index b78daad70..58eaa3aee 100644
--- a/src/components/Collection/Series/EditSeriesTabs/DeleteActionsTab.tsx
+++ b/src/components/Collection/Series/EditSeriesTabs/DeleteActionsTab.tsx
@@ -1,16 +1,16 @@
import React from 'react';
-import { useNavigate } from 'react-router-dom';
import Action from '@/components/Collection/Series/EditSeriesTabs/Action';
import toast from '@/components/Toast';
import { useDeleteSeriesMutation } from '@/core/react-query/series/mutations';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
type Props = {
seriesId: number;
};
const DeleteActionsTab = ({ seriesId }: Props) => {
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const { mutate: deleteSeries } = useDeleteSeriesMutation();
diff --git a/src/components/Collection/SeriesInfo.tsx b/src/components/Collection/SeriesInfo.tsx
index 1eb25e769..554e879a0 100644
--- a/src/components/Collection/SeriesInfo.tsx
+++ b/src/components/Collection/SeriesInfo.tsx
@@ -1,7 +1,6 @@
import React, { useMemo } from 'react';
import { useDispatch } from 'react-redux';
import { useParams } from 'react-router';
-import { useNavigate } from 'react-router-dom';
import cx from 'classnames';
import { toNumber } from 'lodash';
@@ -10,6 +9,7 @@ import { resetFilter, setFilterValues } from '@/core/slices/collection';
import { convertTimeSpanToMs, dayjs } from '@/core/util';
import { addFilterCriteriaToStore } from '@/core/utilities/filter';
import useEventCallback from '@/hooks/useEventCallback';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
import type { SeriesType } from '@/core/types/api/series';
import type { WebuiSeriesDetailsType } from '@/core/types/api/webui';
@@ -22,7 +22,7 @@ const SeriesInfo = ({ series }: SeriesInfoProps) => {
const { seriesId } = useParams();
const dispatch = useDispatch();
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
// Series Data;
const seriesOverviewQuery = useSeriesOverviewQuery(toNumber(seriesId!), !!seriesId);
diff --git a/src/components/Collection/SeriesMetadata.tsx b/src/components/Collection/SeriesMetadata.tsx
index 0cc2296e8..e85e35134 100644
--- a/src/components/Collection/SeriesMetadata.tsx
+++ b/src/components/Collection/SeriesMetadata.tsx
@@ -1,5 +1,4 @@
import React, { useMemo } from 'react';
-import { useNavigate } from 'react-router-dom';
import { mdiCloseCircleOutline, mdiOpenInNew, mdiPencilCircleOutline, mdiPlusCircleOutline } from '@mdi/js';
import { Icon } from '@mdi/react';
@@ -7,6 +6,7 @@ import Button from '@/components/Input/Button';
import { invalidateQueries } from '@/core/react-query/queryClient';
import { useDeleteTmdbLinkMutation } from '@/core/react-query/tmdb/mutations';
import useEventCallback from '@/hooks/useEventCallback';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
type Props = {
id?: number;
@@ -16,7 +16,7 @@ type Props = {
};
const MetadataLink = ({ id, seriesId, site, type }: Props) => {
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const { mutate: deleteTmdbLink } = useDeleteTmdbLinkMutation(seriesId, type ?? 'Movie');
const siteLink = useMemo(() => {
diff --git a/src/components/Collection/SeriesUserStats.tsx b/src/components/Collection/SeriesUserStats.tsx
index 78b7f2d0b..396469f00 100644
--- a/src/components/Collection/SeriesUserStats.tsx
+++ b/src/components/Collection/SeriesUserStats.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import { Link } from 'react-router-dom';
+import { Link } from 'react-router';
import SeriesRating from '@/components/Collection/Series/SeriesRating';
import { formatThousand } from '@/core/util';
diff --git a/src/components/Collection/TagButton.tsx b/src/components/Collection/TagButton.tsx
index d863dd1ff..5855bbad1 100644
--- a/src/components/Collection/TagButton.tsx
+++ b/src/components/Collection/TagButton.tsx
@@ -1,6 +1,5 @@
import React from 'react';
import { useDispatch } from 'react-redux';
-import { useNavigate } from 'react-router-dom';
import { mdiTagTextOutline } from '@mdi/js';
import { Icon } from '@mdi/react';
import cx from 'classnames';
@@ -9,6 +8,7 @@ import Button from '@/components/Input/Button';
import { resetFilter, setFilterTag } from '@/core/slices/collection';
import { addFilterCriteriaToStore } from '@/core/utilities/filter';
import useEventCallback from '@/hooks/useEventCallback';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
type Props = {
tagType: 'User' | 'AniDB';
@@ -18,7 +18,7 @@ type Props = {
const TagButton = React.memo(({ tagType, text, type }: Props) => {
const dispatch = useDispatch();
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const handleClick = useEventCallback(() => {
dispatch(resetFilter());
addFilterCriteriaToStore('HasTag').then(() => {
diff --git a/src/components/Collection/Tags/TagDetailsModal.tsx b/src/components/Collection/Tags/TagDetailsModal.tsx
index 042ea4957..e743b3793 100644
--- a/src/components/Collection/Tags/TagDetailsModal.tsx
+++ b/src/components/Collection/Tags/TagDetailsModal.tsx
@@ -1,5 +1,5 @@
import React, { useMemo, useRef } from 'react';
-import { Link } from 'react-router-dom';
+import { Link } from 'react-router';
import { mdiLoading, mdiOpenInNew } from '@mdi/js';
import Icon from '@mdi/react';
import { useVirtualizer } from '@tanstack/react-virtual';
diff --git a/src/components/Collection/TimelineSidebar.tsx b/src/components/Collection/TimelineSidebar.tsx
index 4ab9ac7f8..b96ea390b 100644
--- a/src/components/Collection/TimelineSidebar.tsx
+++ b/src/components/Collection/TimelineSidebar.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import { Link } from 'react-router-dom';
+import { Link } from 'react-router';
import BackgroundImagePlaceholderDiv from '@/components/BackgroundImagePlaceholderDiv';
import ShokoPanel from '@/components/Panels/ShokoPanel';
diff --git a/src/components/Collection/Tmdb/EpisodeRow.tsx b/src/components/Collection/Tmdb/EpisodeRow.tsx
index ff4dab27b..dc6b20bea 100644
--- a/src/components/Collection/Tmdb/EpisodeRow.tsx
+++ b/src/components/Collection/Tmdb/EpisodeRow.tsx
@@ -1,5 +1,5 @@
import React, { useMemo } from 'react';
-import { useSearchParams } from 'react-router-dom';
+import { useSearchParams } from 'react-router';
import { mdiLoading } from '@mdi/js';
import { Icon } from '@mdi/react';
import cx from 'classnames';
diff --git a/src/components/Collection/Tmdb/EpisodeSelect.tsx b/src/components/Collection/Tmdb/EpisodeSelect.tsx
index f034ea791..db9b4f277 100644
--- a/src/components/Collection/Tmdb/EpisodeSelect.tsx
+++ b/src/components/Collection/Tmdb/EpisodeSelect.tsx
@@ -1,5 +1,5 @@
import React, { useEffect, useMemo, useState } from 'react';
-import { useSearchParams } from 'react-router-dom';
+import { useSearchParams } from 'react-router';
import { Listbox, ListboxButton, ListboxOption, ListboxOptions, Transition } from '@headlessui/react';
import { mdiChevronDown, mdiLoading, mdiMagnify } from '@mdi/js';
import { Icon } from '@mdi/react';
diff --git a/src/components/Collection/Tmdb/MovieRow.tsx b/src/components/Collection/Tmdb/MovieRow.tsx
index 567322cb5..e71c4f94f 100644
--- a/src/components/Collection/Tmdb/MovieRow.tsx
+++ b/src/components/Collection/Tmdb/MovieRow.tsx
@@ -1,5 +1,5 @@
import React, { useMemo } from 'react';
-import { useSearchParams } from 'react-router-dom';
+import { useSearchParams } from 'react-router';
import { mdiLinkOff, mdiLinkPlus, mdiLoading } from '@mdi/js';
import { Icon } from '@mdi/react';
import cx from 'classnames';
diff --git a/src/components/Collection/Tmdb/TmdbLinkSelectPanel.tsx b/src/components/Collection/Tmdb/TmdbLinkSelectPanel.tsx
index 1b67a4f79..ea4fb5b26 100644
--- a/src/components/Collection/Tmdb/TmdbLinkSelectPanel.tsx
+++ b/src/components/Collection/Tmdb/TmdbLinkSelectPanel.tsx
@@ -1,6 +1,5 @@
import React, { useEffect, useMemo, useState } from 'react';
-import { useParams } from 'react-router';
-import { useSearchParams } from 'react-router-dom';
+import { useParams, useSearchParams } from 'react-router';
import { mdiFilmstrip, mdiLoading, mdiMagnify, mdiOpenInNew, mdiTelevision } from '@mdi/js';
import { Icon } from '@mdi/react';
import cx from 'classnames';
diff --git a/src/components/Collection/Tmdb/TopPanel.tsx b/src/components/Collection/Tmdb/TopPanel.tsx
index 62c7f93dd..99bc6548f 100644
--- a/src/components/Collection/Tmdb/TopPanel.tsx
+++ b/src/components/Collection/Tmdb/TopPanel.tsx
@@ -1,5 +1,4 @@
import React, { useMemo } from 'react';
-import { useNavigate } from 'react-router-dom';
import { mdiLinkPlus } from '@mdi/js';
import { Icon } from '@mdi/react';
import cx from 'classnames';
@@ -9,6 +8,7 @@ import Button from '@/components/Input/Button';
import ShokoPanel from '@/components/Panels/ShokoPanel';
import ItemCount from '@/components/Utilities/ItemCount';
import { MatchRatingType } from '@/core/types/api/episode';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
import type { TmdbEpisodeXrefType } from '@/core/types/api/tmdb';
@@ -23,7 +23,7 @@ type Props = {
const TopPanel = (props: Props) => {
const { createInProgress, disableCreateLink, handleCreateLink, seriesId, xrefs, xrefsCount } = props;
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const flatXrefs = useMemo(
() => {
diff --git a/src/components/Dialogs/FilterPresetsModal.tsx b/src/components/Dialogs/FilterPresetsModal.tsx
index b1dd890f5..7c39c5222 100644
--- a/src/components/Dialogs/FilterPresetsModal.tsx
+++ b/src/components/Dialogs/FilterPresetsModal.tsx
@@ -1,6 +1,6 @@
import React, { useEffect, useMemo, useRef, useState } from 'react';
import { useDispatch } from 'react-redux';
-import { Link } from 'react-router-dom';
+import { Link } from 'react-router';
import { mdiLoading, mdiMagnify } from '@mdi/js';
import { Icon } from '@mdi/react';
import { useVirtualizer } from '@tanstack/react-virtual';
diff --git a/src/components/ErrorBoundary.tsx b/src/components/ErrorBoundary.tsx
index 03538b458..a7d10fe08 100644
--- a/src/components/ErrorBoundary.tsx
+++ b/src/components/ErrorBoundary.tsx
@@ -1,6 +1,6 @@
import React, { useState } from 'react';
import { useDispatch } from 'react-redux';
-import { useNavigate, useRouteError } from 'react-router-dom';
+import { useRouteError } from 'react-router';
import ShokoMascot from '@/../images/shoko_mascot.png';
import Button from '@/components/Input/Button';
@@ -8,6 +8,7 @@ import Events from '@/core/events';
import { useVersionQuery } from '@/core/react-query/init/queries';
import { useUpdateWebuiMutation } from '@/core/react-query/webui/mutations';
import useEventCallback from '@/hooks/useEventCallback';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
type RouteError = {
data: string;
@@ -19,7 +20,7 @@ type RouteError = {
const ErrorBoundary = ({ error, resetError }: { error?: Error, resetError?: () => void }) => {
const dispatch = useDispatch();
const routeError = useRouteError() as RouteError;
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const versionQuery = useVersionQuery();
const { isPending: isUpdateWebuiPending, mutate: updateWebui } = useUpdateWebuiMutation();
diff --git a/src/components/Layout/LinkMenuItem.tsx b/src/components/Layout/LinkMenuItem.tsx
index 23c72e39c..1d5d83ea7 100644
--- a/src/components/Layout/LinkMenuItem.tsx
+++ b/src/components/Layout/LinkMenuItem.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import { NavLink } from 'react-router-dom';
+import { NavLink } from 'react-router';
import { Icon } from '@mdi/react';
import cx from 'classnames';
diff --git a/src/components/Layout/TopNav.tsx b/src/components/Layout/TopNav.tsx
index 42ced171d..ee35b1e51 100644
--- a/src/components/Layout/TopNav.tsx
+++ b/src/components/Layout/TopNav.tsx
@@ -1,7 +1,7 @@
import React, { useMemo, useState } from 'react';
import AnimateHeight from 'react-animate-height';
import { useDispatch, useSelector } from 'react-redux';
-import { Link, NavLink, useLocation, useNavigate } from 'react-router-dom';
+import { Link, NavLink, useLocation } from 'react-router';
import {
mdiCogOutline,
mdiDownloadCircleOutline,
@@ -45,6 +45,7 @@ import { useUpdateWebuiMutation } from '@/core/react-query/webui/mutations';
import { useWebuiUpdateCheckQuery } from '@/core/react-query/webui/queries';
import { NetworkAvailabilityEnum } from '@/core/signalr/types';
import useEventCallback from '@/hooks/useEventCallback';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
import AniDBBanDetectionItem from './AniDBBanDetectionItem';
@@ -72,7 +73,7 @@ const QueueCount = () => {
function TopNav() {
const dispatch = useDispatch();
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const { pathname } = useLocation();
const networkStatus = useSelector((state: RootState) => state.mainpage.networkStatus);
diff --git a/src/components/SeriesPoster.tsx b/src/components/SeriesPoster.tsx
index 50c92fad3..1fcf0dbd0 100644
--- a/src/components/SeriesPoster.tsx
+++ b/src/components/SeriesPoster.tsx
@@ -1,5 +1,5 @@
import React, { useMemo } from 'react';
-import { Link } from 'react-router-dom';
+import { Link } from 'react-router';
import cx from 'classnames';
import BackgroundImagePlaceholderDiv from '@/components/BackgroundImagePlaceholderDiv';
diff --git a/src/components/Utilities/ReleaseManagement/Title.tsx b/src/components/Utilities/ReleaseManagement/Title.tsx
index c65fd24fd..f75a4e9c3 100644
--- a/src/components/Utilities/ReleaseManagement/Title.tsx
+++ b/src/components/Utilities/ReleaseManagement/Title.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import { NavLink } from 'react-router-dom';
+import { NavLink } from 'react-router';
import { mdiChevronRight } from '@mdi/js';
import { Icon } from '@mdi/react';
diff --git a/src/components/Utilities/Unrecognized/Title.tsx b/src/components/Utilities/Unrecognized/Title.tsx
index 20caef864..9fc8f0b65 100644
--- a/src/components/Utilities/Unrecognized/Title.tsx
+++ b/src/components/Utilities/Unrecognized/Title.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import { NavLink } from 'react-router-dom';
+import { NavLink } from 'react-router';
import { mdiChevronRight } from '@mdi/js';
import { Icon } from '@mdi/react';
diff --git a/src/core/router/index.tsx b/src/core/router/index.tsx
index 0e74430e6..42c3df537 100644
--- a/src/core/router/index.tsx
+++ b/src/core/router/index.tsx
@@ -1,8 +1,7 @@
/* global globalThis */
import React, { useEffect, useRef, useState } from 'react';
import { useSelector } from 'react-redux';
-import { Navigate, Route } from 'react-router';
-import { RouterProvider, createBrowserRouter, createRoutesFromElements } from 'react-router-dom';
+import { Navigate, Route, RouterProvider, createBrowserRouter, createRoutesFromElements } from 'react-router';
import * as Sentry from '@sentry/react';
import ErrorBoundary from '@/components/ErrorBoundary';
@@ -53,7 +52,7 @@ import AuthenticatedRoute from './AuthenticatedRoute';
import type { RootState } from '@/core/store';
-const sentryCreateBrowserRouter = Sentry.wrapCreateBrowserRouter(createBrowserRouter);
+const sentryCreateBrowserRouter = Sentry.wrapCreateBrowserRouterV7(createBrowserRouter);
const router = sentryCreateBrowserRouter(
createRoutesFromElements(
@@ -129,11 +128,6 @@ const router = sentryCreateBrowserRouter(
,
),
- {
- future: {
- v7_relativeSplatPath: true,
- },
- },
);
const Router = () => {
@@ -163,12 +157,7 @@ const Router = () => {
return (
-
+
);
diff --git a/src/core/util.ts b/src/core/util.ts
index 73ace109e..fed753c08 100644
--- a/src/core/util.ts
+++ b/src/core/util.ts
@@ -29,7 +29,7 @@ export function isDebug() {
return DEV;
}
-export const minimumSupportedServerVersion = '5.0.0.86';
+export const minimumSupportedServerVersion = '5.0.0.89';
export const parseServerVersion = (version: string) => {
const semverVersion = semver.coerce(version)?.raw;
diff --git a/src/hooks/useFirstRunSettingsContext.tsx b/src/hooks/useFirstRunSettingsContext.tsx
index 23a8819df..2fa8fb725 100644
--- a/src/hooks/useFirstRunSettingsContext.tsx
+++ b/src/hooks/useFirstRunSettingsContext.tsx
@@ -1,4 +1,4 @@
-import { useOutletContext } from 'react-router-dom';
+import { useOutletContext } from 'react-router';
import type { SettingsContextType } from '@/core/types/context';
diff --git a/src/hooks/useNavigateVoid.ts b/src/hooks/useNavigateVoid.ts
new file mode 100644
index 000000000..b88c5889f
--- /dev/null
+++ b/src/hooks/useNavigateVoid.ts
@@ -0,0 +1,15 @@
+// eslint-disable-next-line no-restricted-imports
+import { useNavigate } from 'react-router';
+import type { NavigateOptions, To } from 'react-router';
+
+type NavigateFunctionVoid = {
+ (to: To, options?: NavigateOptions): void;
+ (delta: number): void;
+};
+
+// React Router v7 uses return type for `navigate` function as Promise | void
+// This causes the linter to complain about not catching errors on navigate calls
+// But the return type is actually void for BrowserRouter, so we can safely ignore the type
+const useNavigateVoid = () => useNavigate() as NavigateFunctionVoid;
+
+export default useNavigateVoid;
diff --git a/src/hooks/useSettingsContext.ts b/src/hooks/useSettingsContext.ts
index 36ff12a83..662a3e9d9 100644
--- a/src/hooks/useSettingsContext.ts
+++ b/src/hooks/useSettingsContext.ts
@@ -1,4 +1,4 @@
-import { useOutletContext } from 'react-router-dom';
+import { useOutletContext } from 'react-router';
import type { SettingsContextType } from '@/core/types/context';
diff --git a/src/main.tsx b/src/main.tsx
index 01a7ce743..942636e14 100644
--- a/src/main.tsx
+++ b/src/main.tsx
@@ -1,5 +1,5 @@
import React from 'react';
-import { createRoutesFromChildren, matchRoutes, useLocation, useNavigationType } from 'react-router-dom';
+import { createRoutesFromChildren, matchRoutes, useLocation, useNavigationType } from 'react-router';
import * as Sentry from '@sentry/react';
import { createRoot } from 'react-dom/client';
@@ -13,7 +13,7 @@ if (!isDebug()) {
environment: 'production',
release: `shoko-webui@${uiVersion()}`,
integrations: [
- Sentry.reactRouterV6BrowserTracingIntegration({
+ Sentry.reactRouterV7BrowserTracingIntegration({
useEffect: React.useEffect,
useLocation,
useNavigationType,
diff --git a/src/pages/SentryErrorBoundaryWrapper.tsx b/src/pages/SentryErrorBoundaryWrapper.tsx
index 3792a9d7a..56870b996 100644
--- a/src/pages/SentryErrorBoundaryWrapper.tsx
+++ b/src/pages/SentryErrorBoundaryWrapper.tsx
@@ -1,16 +1,16 @@
import React, { useEffect } from 'react';
-import { Outlet } from 'react-router';
-import { useLocation, useNavigate } from 'react-router-dom';
+import { Outlet, useLocation } from 'react-router';
import * as Sentry from '@sentry/react';
import semver from 'semver';
import ErrorBoundary from '@/components/ErrorBoundary';
import { useVersionQuery } from '@/core/react-query/init/queries';
import { getParsedSupportedServerVersion, isDebug, parseServerVersion } from '@/core/util';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
const SentryErrorBoundaryWrapper = () => {
const { pathname } = useLocation();
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const versionQuery = useVersionQuery();
useEffect(() => {
diff --git a/src/pages/collection/Collection.tsx b/src/pages/collection/Collection.tsx
index 28b8172d8..c99816c32 100644
--- a/src/pages/collection/Collection.tsx
+++ b/src/pages/collection/Collection.tsx
@@ -1,7 +1,6 @@
import React, { useEffect, useMemo, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
-import { useParams } from 'react-router';
-import { useLocation, useNavigate, useSearchParams } from 'react-router-dom';
+import { useLocation, useParams, useSearchParams } from 'react-router';
import cx from 'classnames';
import { cloneDeep, toNumber } from 'lodash';
import { useDebounceValue, useToggle } from 'usehooks-ts';
@@ -27,6 +26,7 @@ import { resetFilter } from '@/core/slices/collection';
import { buildFilter } from '@/core/utilities/filter';
import useEventCallback from '@/hooks/useEventCallback';
import useFlattenListResult from '@/hooks/useFlattenListResult';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
import type { RootState } from '@/core/store';
import type { FilterCondition, FilterType, SortingCriteria } from '@/core/types/api/filter';
@@ -89,7 +89,7 @@ function Collection() {
const isLiveFilter = useMemo(() => pathname.endsWith('/live'), [pathname]);
const dispatch = useDispatch();
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const [searchParams, setSearchParams] = useSearchParams();
const groupSearch = useMemo(() => searchParams.get('q') ?? '', [searchParams]);
diff --git a/src/pages/collection/Series.tsx b/src/pages/collection/Series.tsx
index b6228cbb7..4c92a0d44 100644
--- a/src/pages/collection/Series.tsx
+++ b/src/pages/collection/Series.tsx
@@ -1,7 +1,6 @@
import React, { useEffect, useMemo, useState } from 'react';
import { useDispatch } from 'react-redux';
-import { Outlet, useParams } from 'react-router';
-import { Link, NavLink, useNavigate, useOutletContext } from 'react-router-dom';
+import { Link, NavLink, Outlet, useOutletContext, useParams } from 'react-router';
import useMeasure from 'react-use-measure';
import {
mdiAccountGroupOutline,
@@ -26,6 +25,7 @@ import { useSeriesImagesQuery, useSeriesQuery } from '@/core/react-query/series/
import { useSettingsQuery } from '@/core/react-query/settings/queries';
import { setSeriesId } from '@/core/slices/modals/editSeries';
import useEventCallback from '@/hooks/useEventCallback';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
import type { SeriesContextType } from '@/components/Collection/constants';
import type { ImageType } from '@/core/types/api/common';
@@ -52,7 +52,7 @@ const getImagePath = ({ ID, Source, Type }: ImageType) => `/api/v3/Image/${Sourc
const languageMapping = { 'x-jat': 'ja', 'x-kot': 'ko', 'x-zht': 'zh-hans' };
const Series = () => {
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const { seriesId } = useParams();
const seriesQuery = useSeriesQuery(toNumber(seriesId!), { includeDataFrom: ['AniDB', 'TMDB'] }, !!seriesId);
diff --git a/src/pages/collection/series/SeriesCredits.tsx b/src/pages/collection/series/SeriesCredits.tsx
index d6d2b155f..19d4e5e82 100644
--- a/src/pages/collection/series/SeriesCredits.tsx
+++ b/src/pages/collection/series/SeriesCredits.tsx
@@ -1,5 +1,5 @@
import React, { useMemo, useState } from 'react';
-import { useOutletContext } from 'react-router-dom';
+import { useOutletContext } from 'react-router';
import CreditsSearchAndFilterPanel from '@/components/Collection/Credits/CreditsSearchAndFilterPanel';
import StaffPanelVirtualizer from '@/components/Collection/Credits/CreditsStaffVirtualizer';
diff --git a/src/pages/collection/series/SeriesEpisodes.tsx b/src/pages/collection/series/SeriesEpisodes.tsx
index ae76ac647..73ffabf46 100644
--- a/src/pages/collection/series/SeriesEpisodes.tsx
+++ b/src/pages/collection/series/SeriesEpisodes.tsx
@@ -1,5 +1,5 @@
import React, { useEffect, useMemo, useState } from 'react';
-import { useOutletContext, useSearchParams } from 'react-router-dom';
+import { useOutletContext, useSearchParams } from 'react-router';
import { mdiCloseCircleOutline, mdiEyeOutline, mdiLoading } from '@mdi/js';
import { Icon } from '@mdi/react';
import { useVirtualizer } from '@tanstack/react-virtual';
diff --git a/src/pages/collection/series/SeriesFileSummary.tsx b/src/pages/collection/series/SeriesFileSummary.tsx
index e3a7f0bdf..46031743b 100644
--- a/src/pages/collection/series/SeriesFileSummary.tsx
+++ b/src/pages/collection/series/SeriesFileSummary.tsx
@@ -1,5 +1,5 @@
import React, { useState } from 'react';
-import { useOutletContext } from 'react-router-dom';
+import { useOutletContext } from 'react-router';
import { mdiLoading } from '@mdi/js';
import { Icon } from '@mdi/react';
diff --git a/src/pages/collection/series/SeriesImages.tsx b/src/pages/collection/series/SeriesImages.tsx
index d94b38c07..0842f6575 100644
--- a/src/pages/collection/series/SeriesImages.tsx
+++ b/src/pages/collection/series/SeriesImages.tsx
@@ -1,6 +1,5 @@
import React, { useMemo, useState } from 'react';
-import { useNavigate, useParams } from 'react-router';
-import { useOutletContext } from 'react-router-dom';
+import { useOutletContext, useParams } from 'react-router';
import { mdiStarCircleOutline } from '@mdi/js';
import { Icon } from '@mdi/react';
import cx from 'classnames';
@@ -14,6 +13,7 @@ import toast from '@/components/Toast';
import { useChangeSeriesImageMutation } from '@/core/react-query/series/mutations';
import { useSeriesImagesQuery } from '@/core/react-query/series/queries';
import useEventCallback from '@/hooks/useEventCallback';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
import type { SeriesContextType } from '@/components/Collection/constants';
import type { ImageType } from '@/core/types/api/common';
@@ -43,7 +43,7 @@ const SeriesImages = () => {
const { series } = useOutletContext();
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const tabType = useMemo(() => {
if (!imageType) return 'Posters';
diff --git a/src/pages/collection/series/SeriesOverview.tsx b/src/pages/collection/series/SeriesOverview.tsx
index 065372d27..a2887319b 100644
--- a/src/pages/collection/series/SeriesOverview.tsx
+++ b/src/pages/collection/series/SeriesOverview.tsx
@@ -1,5 +1,5 @@
import React, { useMemo, useState } from 'react';
-import { useOutletContext } from 'react-router-dom';
+import { useOutletContext } from 'react-router';
import { mdiEarth, mdiOpenInNew } from '@mdi/js';
import { Icon } from '@mdi/react';
import cx from 'classnames';
diff --git a/src/pages/collection/series/SeriesTags.tsx b/src/pages/collection/series/SeriesTags.tsx
index 3d67fecb9..241cb112a 100644
--- a/src/pages/collection/series/SeriesTags.tsx
+++ b/src/pages/collection/series/SeriesTags.tsx
@@ -1,5 +1,5 @@
import React, { useMemo, useState } from 'react';
-import { useOutletContext } from 'react-router-dom';
+import { useOutletContext } from 'react-router';
import { mdiLoading, mdiTagTextOutline } from '@mdi/js';
import { Icon } from '@mdi/react';
import { useDebounceValue, useToggle } from 'usehooks-ts';
diff --git a/src/pages/collection/series/TmdbLinking.tsx b/src/pages/collection/series/TmdbLinking.tsx
index 9bda336a9..398bc6155 100644
--- a/src/pages/collection/series/TmdbLinking.tsx
+++ b/src/pages/collection/series/TmdbLinking.tsx
@@ -1,6 +1,5 @@
import React, { useMemo, useState } from 'react';
-import { useParams } from 'react-router';
-import { useNavigate, useOutletContext, useSearchParams } from 'react-router-dom';
+import { useOutletContext, useParams, useSearchParams } from 'react-router';
import { mdiLoading, mdiOpenInNew, mdiPencilCircleOutline } from '@mdi/js';
import { Icon } from '@mdi/react';
import { useVirtualizer } from '@tanstack/react-virtual';
@@ -33,6 +32,7 @@ import {
import { EpisodeTypeEnum, MatchRatingType } from '@/core/types/api/episode';
import useEventCallback from '@/hooks/useEventCallback';
import useFlattenListResult from '@/hooks/useFlattenListResult';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
import type { SeriesContextType } from '@/components/Collection/constants';
import type { TmdbEpisodeXrefMappingRequestType } from '@/core/react-query/tmdb/types';
@@ -41,7 +41,7 @@ import type { TmdbEpisodeXrefType } from '@/core/types/api/tmdb';
const TmdbLinking = () => {
const seriesId = toNumber(useParams().seriesId);
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
if (seriesId === 0) {
navigate('..');
}
diff --git a/src/pages/dashboard/DashboardPage.tsx b/src/pages/dashboard/DashboardPage.tsx
index e1c6ba608..f68065356 100644
--- a/src/pages/dashboard/DashboardPage.tsx
+++ b/src/pages/dashboard/DashboardPage.tsx
@@ -1,7 +1,7 @@
import React, { useEffect, useState } from 'react';
import { Responsive, WidthProvider } from 'react-grid-layout';
import { useDispatch, useSelector } from 'react-redux';
-import { useLocation } from 'react-router-dom';
+import { useLocation } from 'react-router';
import { mdiMenuDown } from '@mdi/js';
import { Icon } from '@mdi/react';
import { produce } from 'immer';
diff --git a/src/pages/dashboard/panels/CollectionStats.tsx b/src/pages/dashboard/panels/CollectionStats.tsx
index 1c6b5fda0..cbb354ec1 100644
--- a/src/pages/dashboard/panels/CollectionStats.tsx
+++ b/src/pages/dashboard/panels/CollectionStats.tsx
@@ -1,6 +1,6 @@
import React from 'react';
import { useDispatch, useSelector } from 'react-redux';
-import { Link, useNavigate } from 'react-router-dom';
+import { Link } from 'react-router';
import prettyBytes from 'pretty-bytes';
import ShokoPanel from '@/components/Panels/ShokoPanel';
@@ -8,6 +8,7 @@ import { useDashbordStatsQuery } from '@/core/react-query/dashboard/queries';
import { resetFilter } from '@/core/slices/collection';
import { addFilterCriteriaToStore } from '@/core/utilities/filter';
import useEventCallback from '@/hooks/useEventCallback';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
import type { RootState } from '@/core/store';
@@ -15,7 +16,7 @@ const Item = (
{ filter, link, title, value = 0 }: { title: string, value?: string | number, link?: string, filter?: string },
) => {
const dispatch = useDispatch();
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const handleMissingFilter = useEventCallback((filterName: string) => {
dispatch(resetFilter());
addFilterCriteriaToStore(filterName).then(() => {
diff --git a/src/pages/firstrun/Acknowledgement.tsx b/src/pages/firstrun/Acknowledgement.tsx
index 403ef9566..15c992933 100644
--- a/src/pages/firstrun/Acknowledgement.tsx
+++ b/src/pages/firstrun/Acknowledgement.tsx
@@ -1,18 +1,18 @@
import React from 'react';
import { useDispatch } from 'react-redux';
-import { useNavigate } from 'react-router-dom';
import Button from '@/components/Input/Button';
import TransitionDiv from '@/components/TransitionDiv';
import { useServerStatusQuery } from '@/core/react-query/init/queries';
import { setSaved as setFirstRunSaved } from '@/core/slices/firstrun';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
function Acknowledgement() {
const dispatch = useDispatch();
const serverStatusQuery = useServerStatusQuery();
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const handleNext = () => {
dispatch(setFirstRunSaved('acknowledgement'));
diff --git a/src/pages/firstrun/AniDBAccount.tsx b/src/pages/firstrun/AniDBAccount.tsx
index 944e83162..a2659100c 100644
--- a/src/pages/firstrun/AniDBAccount.tsx
+++ b/src/pages/firstrun/AniDBAccount.tsx
@@ -1,12 +1,12 @@
import React, { useState } from 'react';
import { useDispatch } from 'react-redux';
-import { useNavigate } from 'react-router-dom';
import Input from '@/components/Input/Input';
import TransitionDiv from '@/components/TransitionDiv';
import { useAniDBTestLoginMutation } from '@/core/react-query/settings/mutations';
import { setSaved as setFirstRunSaved, unsetSaved as unsetFirstRunSaved } from '@/core/slices/firstrun';
import useFirstRunSettingsContext from '@/hooks/useFirstRunSettingsContext';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
import Footer from './Footer';
@@ -20,7 +20,7 @@ function AniDBAccount() {
} = useFirstRunSettingsContext();
const dispatch = useDispatch();
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const { isPending: isAnidbLoginPending, mutate: testAniDbLogin } = useAniDBTestLoginMutation();
const [anidbStatus, setAnidbStatus] = useState({ type: 'success', text: '' });
diff --git a/src/pages/firstrun/FirstRunPage.tsx b/src/pages/firstrun/FirstRunPage.tsx
index b3c5e0e1e..1fb1e0585 100644
--- a/src/pages/firstrun/FirstRunPage.tsx
+++ b/src/pages/firstrun/FirstRunPage.tsx
@@ -1,7 +1,6 @@
import React, { useEffect, useMemo, useState } from 'react';
import { useSelector } from 'react-redux';
-import { Outlet } from 'react-router';
-import { useLocation, useNavigate } from 'react-router-dom';
+import { Outlet, useLocation } from 'react-router';
import { mdiCheckboxBlankCircleOutline, mdiCheckboxMarkedCircleOutline, mdiCircleHalfFull, mdiLoading } from '@mdi/js';
import { Icon } from '@mdi/react';
import { siDiscord } from 'simple-icons';
@@ -11,6 +10,7 @@ import ShokoIcon from '@/components/ShokoIcon';
import { useServerStatusQuery, useVersionQuery } from '@/core/react-query/init/queries';
import { usePatchSettingsMutation } from '@/core/react-query/settings/mutations';
import { useSettingsQuery } from '@/core/react-query/settings/queries';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
import type { RootState } from '@/core/store';
@@ -37,7 +37,7 @@ const MenuItem = ({ id, text }: { text: string, id: string }) => {
};
function FirstRunPage() {
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const versionQuery = useVersionQuery();
const settingsQuery = useSettingsQuery();
diff --git a/src/pages/firstrun/Footer.tsx b/src/pages/firstrun/Footer.tsx
index 5a195a02f..db8323684 100644
--- a/src/pages/firstrun/Footer.tsx
+++ b/src/pages/firstrun/Footer.tsx
@@ -1,10 +1,10 @@
import React from 'react';
-import { useNavigate } from 'react-router-dom';
import cx from 'classnames';
import Button from '@/components/Input/Button';
import { useRunActionMutation } from '@/core/react-query/action/mutations';
import useEventCallback from '@/hooks/useEventCallback';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
import type { TestStatusType } from '@/core/slices/firstrun';
@@ -19,7 +19,7 @@ type Props = {
};
function Footer(props: Props) {
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const { mutate: runAction } = useRunActionMutation();
diff --git a/src/pages/firstrun/LocalAccount.tsx b/src/pages/firstrun/LocalAccount.tsx
index a14454f9b..b7bcdcddb 100644
--- a/src/pages/firstrun/LocalAccount.tsx
+++ b/src/pages/firstrun/LocalAccount.tsx
@@ -1,12 +1,12 @@
import React, { useEffect, useState } from 'react';
import { useDispatch } from 'react-redux';
-import { useNavigate } from 'react-router-dom';
import Input from '@/components/Input/Input';
import TransitionDiv from '@/components/TransitionDiv';
import { useSetDefaultUserMutation } from '@/core/react-query/init/mutations';
import { useDefaultUserQuery } from '@/core/react-query/init/queries';
import { setSaved as setFirstRunSaved, setUser as setUserState } from '@/core/slices/firstrun';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
import Footer from './Footer';
@@ -14,7 +14,7 @@ import type { TestStatusType } from '@/core/slices/firstrun';
function LocalAccount() {
const dispatch = useDispatch();
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const { isPending: createUserPending, mutate: createUser } = useSetDefaultUserMutation();
const defaultUserQuery = useDefaultUserQuery();
diff --git a/src/pages/firstrun/StartServer.tsx b/src/pages/firstrun/StartServer.tsx
index cb366fcbc..f50d14870 100644
--- a/src/pages/firstrun/StartServer.tsx
+++ b/src/pages/firstrun/StartServer.tsx
@@ -1,6 +1,6 @@
import React, { useEffect, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
-import { useNavigate, useOutletContext } from 'react-router-dom';
+import { useOutletContext } from 'react-router';
import Button from '@/components/Input/Button';
import TransitionDiv from '@/components/TransitionDiv';
@@ -8,6 +8,7 @@ import { useLoginMutation } from '@/core/react-query/auth/mutations';
import { useStartServerMutation } from '@/core/react-query/init/mutations';
import { useServerStatusQuery } from '@/core/react-query/init/queries';
import { setSaved as setFirstRunSaved } from '@/core/slices/firstrun';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
import Footer from './Footer';
@@ -19,7 +20,7 @@ type OutletContextType = {
function StartServer() {
const dispatch = useDispatch();
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const [pollingInterval, setPollingInterval] = useState(0);
diff --git a/src/pages/login/LoginPage.tsx b/src/pages/login/LoginPage.tsx
index 322658b92..1e22f9032 100644
--- a/src/pages/login/LoginPage.tsx
+++ b/src/pages/login/LoginPage.tsx
@@ -1,6 +1,6 @@
import React, { useEffect, useMemo, useState } from 'react';
import { useSelector } from 'react-redux';
-import { useNavigate, useSearchParams } from 'react-router-dom';
+import { useSearchParams } from 'react-router';
import { Slide, ToastContainer } from 'react-toastify';
import {
mdiAlertCircleOutline,
@@ -23,11 +23,12 @@ import { useLoginMutation } from '@/core/react-query/auth/mutations';
import { useRandomImageMetadataQuery } from '@/core/react-query/image/queries';
import { useServerStatusQuery, useVersionQuery } from '@/core/react-query/init/queries';
import { ImageTypeEnum } from '@/core/types/api/common';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
import type { RootState } from '@/core/store';
function LoginPage() {
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const [searchParams, setSearchParams] = useSearchParams();
const apiSession = useSelector((state: RootState) => state.apiSession);
diff --git a/src/pages/settings/SettingsPage.tsx b/src/pages/settings/SettingsPage.tsx
index a23a58ca5..cc1007a2a 100644
--- a/src/pages/settings/SettingsPage.tsx
+++ b/src/pages/settings/SettingsPage.tsx
@@ -1,8 +1,7 @@
/* global globalThis */
import React, { useEffect, useMemo, useRef, useState } from 'react';
import { useDispatch } from 'react-redux';
-import { Outlet } from 'react-router';
-import { NavLink, useLocation } from 'react-router-dom';
+import { NavLink, Outlet, useLocation } from 'react-router';
import useMeasure from 'react-use-measure';
import { mdiLoading } from '@mdi/js';
import { Icon } from '@mdi/react';
diff --git a/src/pages/utilities/FileSearch.tsx b/src/pages/utilities/FileSearch.tsx
index 056ea239a..c0d53147a 100644
--- a/src/pages/utilities/FileSearch.tsx
+++ b/src/pages/utilities/FileSearch.tsx
@@ -1,6 +1,6 @@
import React, { useMemo, useState } from 'react';
import { useDispatch } from 'react-redux';
-import { Link, useNavigate } from 'react-router-dom';
+import { Link } from 'react-router';
import {
mdiChevronLeft,
mdiChevronRight,
@@ -47,6 +47,7 @@ import getEd2kLink from '@/core/utilities/getEd2kLink';
import useEventCallback from '@/hooks/useEventCallback';
import useFlattenListResult from '@/hooks/useFlattenListResult';
import useMediaInfo from '@/hooks/useMediaInfo';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
import useRowSelection from '@/hooks/useRowSelection';
import useTableSearchSortCriteria from '@/hooks/utilities/useTableSearchSortCriteria';
@@ -65,7 +66,7 @@ const Menu = (
} = props;
const dispatch = useDispatch();
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const [showConfirmModal, setShowConfirmModal] = useState(false);
diff --git a/src/pages/utilities/SeriesWithoutFilesUtility.tsx b/src/pages/utilities/SeriesWithoutFilesUtility.tsx
index a6f59e854..a9cd68612 100644
--- a/src/pages/utilities/SeriesWithoutFilesUtility.tsx
+++ b/src/pages/utilities/SeriesWithoutFilesUtility.tsx
@@ -1,5 +1,5 @@
import React, { useState } from 'react';
-import { Link } from 'react-router-dom';
+import { Link } from 'react-router';
import {
mdiCloseCircleOutline,
mdiLoading,
diff --git a/src/pages/utilities/UnrecognizedUtilityTabs/LinkFilesTab.tsx b/src/pages/utilities/UnrecognizedUtilityTabs/LinkFilesTab.tsx
index ad70421e2..92ac90cff 100644
--- a/src/pages/utilities/UnrecognizedUtilityTabs/LinkFilesTab.tsx
+++ b/src/pages/utilities/UnrecognizedUtilityTabs/LinkFilesTab.tsx
@@ -1,6 +1,6 @@
// This is the least maintainable file in the entire codebase
import React, { useEffect, useMemo, useState } from 'react';
-import { useLocation, useNavigate } from 'react-router-dom';
+import { useLocation } from 'react-router';
import {
mdiLink,
mdiLoading,
@@ -47,6 +47,7 @@ import { SeriesTypeEnum } from '@/core/types/api/series';
import { formatThousand } from '@/core/util';
import { detectShow, findMostCommonShowName } from '@/core/utilities/auto-match-logic';
import useEventCallback from '@/hooks/useEventCallback';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
import type { FileType } from '@/core/types/api/file';
import type { SeriesAniDBSearchResult } from '@/core/types/api/series';
@@ -190,7 +191,7 @@ const AnimeSelectPanel = (
};
function LinkFilesTab() {
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const { selectedRows } = (useLocation().state ?? { selectedRows: [] }) as { selectedRows: FileType[] };
const [{ createdNewSeries, isLinking, isLinkingRunning }, setLoading] = useState({
isLinking: false,
diff --git a/src/pages/utilities/UnrecognizedUtilityTabs/UnrecognizedTab.tsx b/src/pages/utilities/UnrecognizedUtilityTabs/UnrecognizedTab.tsx
index ad550f658..565b0358d 100644
--- a/src/pages/utilities/UnrecognizedUtilityTabs/UnrecognizedTab.tsx
+++ b/src/pages/utilities/UnrecognizedUtilityTabs/UnrecognizedTab.tsx
@@ -1,6 +1,5 @@
import React, { useMemo, useState } from 'react';
import { useDispatch, useSelector } from 'react-redux';
-import { useNavigate } from 'react-router-dom';
import useMeasure from 'react-use-measure';
import {
mdiCloseCircleOutline,
@@ -49,6 +48,7 @@ import { FileSortCriteriaEnum } from '@/core/types/api/file';
import getEd2kLink from '@/core/utilities/getEd2kLink';
import useEventCallback from '@/hooks/useEventCallback';
import useFlattenListResult from '@/hooks/useFlattenListResult';
+import useNavigateVoid from '@/hooks/useNavigateVoid';
import useRowSelection from '@/hooks/useRowSelection';
import useTableSearchSortCriteria from '@/hooks/utilities/useTableSearchSortCriteria';
@@ -71,7 +71,7 @@ const Menu = (
} = props;
const dispatch = useDispatch();
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const [showConfirmModal, setShowConfirmModal] = useState(false);
@@ -240,7 +240,7 @@ const Menu = (
};
function UnrecognizedTab() {
- const navigate = useNavigate();
+ const navigate = useNavigateVoid();
const {
debouncedSearch,