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,