From 2b19ec07fffb3970b6a3ba07ceca67ef7a9456cd Mon Sep 17 00:00:00 2001 From: admin Date: Thu, 18 Dec 2025 19:54:02 -0600 Subject: [PATCH] fix: resolve technical debt and npm vulnerabilities NPM Security (0 vulnerabilities remaining): - Add yarn resolutions for cross-spawn, brace-expansion, color-string, glob, postcss Bug fixes: - Bug-002: Use FirstOrDefault with null check (DownloadStationTaskProxyV2) - Bug-007: Fix inverted exception logic for magnet fallback (TorrentClientBase) - Bug-008: Fix stale closure using ref (MovieSearchInput) - Bug-009: Fix Number.Number.parseInt typos across 50+ files - Bug-010: Add regex timeout and Compiled flag (RegexReplace) - Bug-011: Add null checks for XML queries (ConfigFileProvider) - Bug-012: Remove empty touch handler (MovieDetails) - Bug-013: Use Path.GetFileName for safer check (InstallUpdateService) - Bug-014: Return Ok instead of Accepted for sync PUT (MovieController) - Bug-016: Fix double bracket typo in log message (InstallUpdateService) - Bug-017: Add console.warn to catch block (MovieTagInput) - Bug-018: Remove stray debug console.log (SignalRConnector) - Bug-019: Document disabled regex with ReDoS justification (Parser) --- .../History/Details/HistoryDetails.tsx | 6 +- .../AddNewMovie/AddNewMovieModalContent.js | 2 +- .../Import/ImportMovieConnector.js | 2 +- frontend/src/Collection/Collection.js | 2 +- .../Collection/Overview/CollectionOverview.js | 8 +- .../Overview/CollectionOverviews.js | 4 +- .../Filter/Builder/FilterBuilderRowValue.js | 2 +- frontend/src/Components/Form/NumberInput.tsx | 5 +- .../src/Components/Form/Select/UMaskInput.tsx | 2 +- .../src/Components/Form/Tag/MovieTagInput.tsx | 3 +- .../Page/Header/MovieSearchInput.tsx | 12 +- frontend/src/Components/Page/PageJumpBar.tsx | 2 +- .../Components/Page/Sidebar/PageSidebar.tsx | 4 +- .../Page/Toolbar/PageToolbarSection.tsx | 4 +- frontend/src/Components/SignalRConnector.js | 2 - .../TableOptionsColumnDragPreview.js | 8 +- frontend/src/Components/Tooltip/Tooltip.tsx | 6 +- frontend/src/DiscoverMovie/DiscoverMovie.js | 2 +- .../Overview/DiscoverMovieOverview.js | 8 +- .../Overview/DiscoverMovieOverviewInfo.js | 2 +- .../Overview/DiscoverMovieOverviews.js | 4 +- .../Posters/DiscoverMoviePosters.js | 8 +- .../Language/SelectLanguageModalContent.tsx | 2 +- .../Movie/SelectMovieModalContent.tsx | 2 +- .../Details/Credits/MovieCreditPosters.tsx | 4 +- frontend/src/Movie/Details/MovieDetails.tsx | 20 +-- frontend/src/Movie/Index/MovieIndex.tsx | 2 +- .../Index/Overview/MovieIndexOverview.tsx | 8 +- .../Index/Overview/MovieIndexOverviewInfo.tsx | 2 +- .../Index/Overview/MovieIndexOverviews.tsx | 12 +- .../Movie/Index/Posters/MovieIndexPosters.tsx | 12 +- .../src/Movie/Index/Posters/PosterDateRow.tsx | 5 +- .../src/Movie/Index/Table/MovieIndexTable.tsx | 4 +- .../MovieFile/Edit/FileEditModalContent.js | 2 +- .../Edit/FileEditModalContentConnector.js | 2 +- frontend/src/RootFolder/RootFolderRow.tsx | 2 +- .../Profiles/Delay/DelayProfileDragPreview.js | 2 +- .../Quality/EditQualityProfileModalContent.js | 2 +- ...EditQualityProfileModalContentConnector.js | 10 +- .../Quality/QualityProfileItemDragPreview.js | 8 +- .../Reducers/createSetSettingValueReducer.js | 2 +- .../Actions/Settings/qualityDefinitions.js | 2 +- .../createMovieCreditImportListSelector.ts | 2 +- frontend/src/System/Updates/Updates.tsx | 4 +- .../Array/getIndexOfFirstCharacter.js | 2 +- .../src/Utilities/Number/convertToBytes.js | 2 +- frontend/src/Utilities/Number/formatAge.js | 4 +- .../src/Utilities/Number/formatBitrate.ts | 2 +- frontend/src/Utilities/Number/formatBytes.ts | 2 +- .../src/Utilities/Table/getSelectedIds.ts | 5 +- package.json | 7 + .../Configuration/ConfigFileProvider.cs | 21 ++- .../Proxies/DownloadStationTaskProxyV2.cs | 7 +- .../Download/TorrentClientBase.cs | 2 +- src/NzbDrone.Core/Parser/Parser.cs | 7 +- src/NzbDrone.Core/Parser/RegexReplace.cs | 7 +- .../Update/InstallUpdateService.cs | 4 +- src/Radarr.Api.V3/Movies/MovieController.cs | 2 +- yarn.lock | 155 ++++++++---------- 59 files changed, 217 insertions(+), 221 deletions(-) diff --git a/frontend/src/Activity/History/Details/HistoryDetails.tsx b/frontend/src/Activity/History/Details/HistoryDetails.tsx index c39015ddd3..12cfd9a323 100644 --- a/frontend/src/Activity/History/Details/HistoryDetails.tsx +++ b/frontend/src/Activity/History/Details/HistoryDetails.tsx @@ -104,7 +104,7 @@ function HistoryDetails(props: Readonly) { {customFormatScore && customFormatScore !== '0' ? ( ) : null} @@ -230,7 +230,7 @@ function HistoryDetails(props: Readonly) { {customFormatScore && customFormatScore !== '0' ? ( ) : null} @@ -272,7 +272,7 @@ function HistoryDetails(props: Readonly) { {customFormatScore && customFormatScore !== '0' ? ( ) : null} diff --git a/frontend/src/AddMovie/AddNewMovie/AddNewMovieModalContent.js b/frontend/src/AddMovie/AddNewMovie/AddNewMovieModalContent.js index 176b2c6eee..52e0143558 100644 --- a/frontend/src/AddMovie/AddNewMovie/AddNewMovieModalContent.js +++ b/frontend/src/AddMovie/AddNewMovie/AddNewMovieModalContent.js @@ -24,7 +24,7 @@ class AddNewMovieModalContent extends Component { // Listeners onQualityProfileIdChange = ({ value }) => { - this.props.onInputChange({ name: 'qualityProfileId', value: Number.Number.parseInt(value) }); + this.props.onInputChange({ name: 'qualityProfileId', value: Number.parseInt(value) }); }; onAddMoviePress = () => { diff --git a/frontend/src/AddMovie/ImportMovie/Import/ImportMovieConnector.js b/frontend/src/AddMovie/ImportMovie/Import/ImportMovieConnector.js index bc75558e99..5447cb07f8 100644 --- a/frontend/src/AddMovie/ImportMovie/Import/ImportMovieConnector.js +++ b/frontend/src/AddMovie/ImportMovie/Import/ImportMovieConnector.js @@ -30,7 +30,7 @@ function createMapStateToProps() { items } = rootFolders; - const rootFolderId = Number.Number.parseInt(match.params.rootFolderId); + const rootFolderId = Number.parseInt(match.params.rootFolderId); const result = { rootFolderId, diff --git a/frontend/src/Collection/Collection.js b/frontend/src/Collection/Collection.js index 42c58de0c2..d493ccb05e 100644 --- a/frontend/src/Collection/Collection.js +++ b/frontend/src/Collection/Collection.js @@ -138,7 +138,7 @@ class Collection extends Component { const characters = _.reduce(items, (acc, item) => { let char = item.sortTitle.charAt(0); - if (!Number.Number.isNaN(char)) { + if (!Number.isNaN(char)) { char = '#'; } diff --git a/frontend/src/Collection/Overview/CollectionOverview.js b/frontend/src/Collection/Overview/CollectionOverview.js index c480997825..4f674fa776 100644 --- a/frontend/src/Collection/Overview/CollectionOverview.js +++ b/frontend/src/Collection/Overview/CollectionOverview.js @@ -23,10 +23,10 @@ import styles from './CollectionOverview.css'; import 'swiper/css'; import 'swiper/css/navigation'; -const columnPadding = Number.Number.parseInt(dimensions.movieIndexColumnPadding); -const columnPaddingSmallScreen = Number.Number.parseInt(dimensions.movieIndexColumnPaddingSmallScreen); -const defaultFontSize = Number.Number.parseInt(fonts.defaultFontSize); -const lineHeight = Number.Number.parseFloat(fonts.lineHeight); +const columnPadding = Number.parseInt(dimensions.movieIndexColumnPadding); +const columnPaddingSmallScreen = Number.parseInt(dimensions.movieIndexColumnPaddingSmallScreen); +const defaultFontSize = Number.parseInt(fonts.defaultFontSize); +const lineHeight = Number.parseFloat(fonts.lineHeight); // Hardcoded height beased on line-height of 32 + bottom margin of 10. 19 + 5 for List Row // Less side-effecty than using react-measure. diff --git a/frontend/src/Collection/Overview/CollectionOverviews.js b/frontend/src/Collection/Overview/CollectionOverviews.js index 4feee61605..aa503619ae 100644 --- a/frontend/src/Collection/Overview/CollectionOverviews.js +++ b/frontend/src/Collection/Overview/CollectionOverviews.js @@ -10,8 +10,8 @@ import CollectionOverviewConnector from './CollectionOverviewConnector'; import styles from './CollectionOverviews.css'; // Poster container dimensions -const columnPadding = Number.Number.parseInt(dimensions.movieIndexColumnPadding); -const columnPaddingSmallScreen = Number.Number.parseInt(dimensions.movieIndexColumnPaddingSmallScreen); +const columnPadding = Number.parseInt(dimensions.movieIndexColumnPadding); +const columnPaddingSmallScreen = Number.parseInt(dimensions.movieIndexColumnPaddingSmallScreen); function calculatePosterWidth(posterSize, isSmallScreen) { const maximumPosterWidth = isSmallScreen ? 152 : 162; diff --git a/frontend/src/Components/Filter/Builder/FilterBuilderRowValue.js b/frontend/src/Components/Filter/Builder/FilterBuilderRowValue.js index a1e2a9f98d..a7b5f319b3 100644 --- a/frontend/src/Components/Filter/Builder/FilterBuilderRowValue.js +++ b/frontend/src/Components/Filter/Builder/FilterBuilderRowValue.js @@ -50,7 +50,7 @@ function getValue(input, selectedFilterBuilderProp) { case 'tib': return convertToBytes(value, 4, true); default: - return Number.Number.parseInt(value); + return Number.parseInt(value); } } } diff --git a/frontend/src/Components/Form/NumberInput.tsx b/frontend/src/Components/Form/NumberInput.tsx index d7482bf842..d4e2a26833 100644 --- a/frontend/src/Components/Form/NumberInput.tsx +++ b/frontend/src/Components/Form/NumberInput.tsx @@ -13,7 +13,7 @@ function parseValue( return null; } - let newValue = isFloat ? Number.Number.parseFloat(value) : Number.Number.parseInt(value); + let newValue = isFloat ? Number.parseFloat(value) : Number.parseInt(value); if (min != null && newValue != null && newValue < min) { newValue = min; @@ -82,8 +82,7 @@ function NumberInput({ useEffect(() => { if ( - // @ts-expect-error inputValue may be null - !Number.Number.isNaN(inputValue) && + !Number.isNaN(inputValue) && inputValue !== previousValue && !isFocused.current ) { diff --git a/frontend/src/Components/Form/Select/UMaskInput.tsx b/frontend/src/Components/Form/Select/UMaskInput.tsx index 0c2aeb9efa..08a6dc28b0 100644 --- a/frontend/src/Components/Form/Select/UMaskInput.tsx +++ b/frontend/src/Components/Form/Select/UMaskInput.tsx @@ -77,7 +77,7 @@ export interface UMaskInputProps { } function UMaskInput({ name, value, onChange }: Readonly) { - const valueNum = Number.Number.parseInt(value, 8); + const valueNum = Number.parseInt(value, 8); const umaskNum = 0o777 & ~valueNum; const umask = umaskNum.toString(8).padStart(4, '0'); const folderNum = 0o777 & ~umaskNum; diff --git a/frontend/src/Components/Form/Tag/MovieTagInput.tsx b/frontend/src/Components/Form/Tag/MovieTagInput.tsx index 8797b50a04..74a2bc4c5f 100644 --- a/frontend/src/Components/Form/Tag/MovieTagInput.tsx +++ b/frontend/src/Components/Form/Tag/MovieTagInput.tsx @@ -23,7 +23,8 @@ const VALID_TAG_REGEX = new RegExp('[^-_a-z0-9]', 'i'); function isValidTag(tagName: string) { try { return !VALID_TAG_REGEX.test(tagName); - } catch { + } catch (e) { + console.warn('Tag validation failed:', e); return false; } } diff --git a/frontend/src/Components/Page/Header/MovieSearchInput.tsx b/frontend/src/Components/Page/Header/MovieSearchInput.tsx index 5cba4b6997..2433b7024b 100644 --- a/frontend/src/Components/Page/Header/MovieSearchInput.tsx +++ b/frontend/src/Components/Page/Header/MovieSearchInput.tsx @@ -125,7 +125,7 @@ function MovieSearchInput() { const { bindShortcut, unbindShortcut } = useKeyboardShortcuts(); const [value, setValue] = useState(''); - const [requestLoading, setRequestLoading] = useState(false); + const [_requestLoading, setRequestLoading] = useState(false); const [suggestions, setSuggestions] = useState([]); const autosuggestRef = useRef(null); @@ -133,6 +133,7 @@ function MovieSearchInput() { const worker = useRef(null); const isLoading = useRef(false); const requestValue = useRef(null); + const requestLoadingRef = useRef(false); const suggestionGroups = useMemo(() => { const result: Section[] = []; @@ -164,15 +165,18 @@ function MovieSearchInput() { if (!isLoading.current) { requestValue.current = null; + requestLoadingRef.current = false; setRequestLoading(false); } else if (value === requestValue.current) { setSuggestions(suggestions); requestValue.current = null; + requestLoadingRef.current = false; setRequestLoading(false); isLoading.current = false; // setLoading(false); } else { setSuggestions(suggestions); + requestLoadingRef.current = true; setRequestLoading(true); const payload = { @@ -192,9 +196,11 @@ function MovieSearchInput() { } requestValue.current = value; - setRequestLoading(true); - if (!requestLoading) { + if (!requestLoadingRef.current) { + requestLoadingRef.current = true; + setRequestLoading(true); + const payload = { value, movies, diff --git a/frontend/src/Components/Page/PageJumpBar.tsx b/frontend/src/Components/Page/PageJumpBar.tsx index 44ee051dc3..971b9686a3 100644 --- a/frontend/src/Components/Page/PageJumpBar.tsx +++ b/frontend/src/Components/Page/PageJumpBar.tsx @@ -4,7 +4,7 @@ import dimensions from 'Styles/Variables/dimensions'; import PageJumpBarItem, { PageJumpBarItemProps } from './PageJumpBarItem'; import styles from './PageJumpBar.css'; -const ITEM_HEIGHT = Number.Number.parseInt(dimensions.jumpBarItemHeight); +const ITEM_HEIGHT = Number.parseInt(dimensions.jumpBarItemHeight); export interface PageJumpBarItems { characters: Record; diff --git a/frontend/src/Components/Page/Sidebar/PageSidebar.tsx b/frontend/src/Components/Page/Sidebar/PageSidebar.tsx index d36e56c65f..bd9acd383a 100644 --- a/frontend/src/Components/Page/Sidebar/PageSidebar.tsx +++ b/frontend/src/Components/Page/Sidebar/PageSidebar.tsx @@ -23,8 +23,8 @@ import Messages from './Messages/Messages'; import PageSidebarItem from './PageSidebarItem'; import styles from './PageSidebar.css'; -const HEADER_HEIGHT = Number.Number.parseInt(dimensions.headerHeight); -const SIDEBAR_WIDTH = Number.Number.parseInt(dimensions.sidebarWidth); +const HEADER_HEIGHT = Number.parseInt(dimensions.headerHeight); +const SIDEBAR_WIDTH = Number.parseInt(dimensions.sidebarWidth); interface SidebarItem { iconName?: IconName; diff --git a/frontend/src/Components/Page/Toolbar/PageToolbarSection.tsx b/frontend/src/Components/Page/Toolbar/PageToolbarSection.tsx index 20cfc38068..be3878998a 100644 --- a/frontend/src/Components/Page/Toolbar/PageToolbarSection.tsx +++ b/frontend/src/Components/Page/Toolbar/PageToolbarSection.tsx @@ -12,8 +12,8 @@ import { PageToolbarButtonProps } from './PageToolbarButton'; import PageToolbarOverflowMenuItem from './PageToolbarOverflowMenuItem'; import styles from './PageToolbarSection.css'; -const BUTTON_WIDTH = Number.Number.parseInt(dimensions.toolbarButtonWidth); -const SEPARATOR_MARGIN = Number.Number.parseInt(dimensions.toolbarSeparatorMargin); +const BUTTON_WIDTH = Number.parseInt(dimensions.toolbarButtonWidth); +const SEPARATOR_MARGIN = Number.parseInt(dimensions.toolbarSeparatorMargin); const SEPARATOR_WIDTH = 2 * SEPARATOR_MARGIN + 1; export interface PageToolbarSectionProps { diff --git a/frontend/src/Components/SignalRConnector.js b/frontend/src/Components/SignalRConnector.js index 81c2f453f0..aa563ca073 100644 --- a/frontend/src/Components/SignalRConnector.js +++ b/frontend/src/Components/SignalRConnector.js @@ -261,8 +261,6 @@ class SignalRConnector extends Component { const action = body.action; const section = 'movieCollections'; - console.log(body); - if (action === 'updated') { this.props.dispatchUpdateItem({ section, ...body.resource }); } else if (action === 'deleted') { diff --git a/frontend/src/Components/Table/TableOptions/TableOptionsColumnDragPreview.js b/frontend/src/Components/Table/TableOptions/TableOptionsColumnDragPreview.js index 6870c23ab8..823b25f2e5 100644 --- a/frontend/src/Components/Table/TableOptions/TableOptionsColumnDragPreview.js +++ b/frontend/src/Components/Table/TableOptions/TableOptionsColumnDragPreview.js @@ -7,10 +7,10 @@ import dimensions from 'Styles/Variables/dimensions.js'; import TableOptionsColumn from './TableOptionsColumn'; import styles from './TableOptionsColumnDragPreview.css'; -const formGroupSmallWidth = Number.Number.parseInt(dimensions.formGroupSmallWidth); -const formLabelLargeWidth = Number.Number.parseInt(dimensions.formLabelLargeWidth); -const formLabelRightMarginWidth = Number.Number.parseInt(dimensions.formLabelRightMarginWidth); -const dragHandleWidth = Number.Number.parseInt(dimensions.dragHandleWidth); +const formGroupSmallWidth = Number.parseInt(dimensions.formGroupSmallWidth); +const formLabelLargeWidth = Number.parseInt(dimensions.formLabelLargeWidth); +const formLabelRightMarginWidth = Number.parseInt(dimensions.formLabelRightMarginWidth); +const dragHandleWidth = Number.parseInt(dimensions.dragHandleWidth); function collectDragLayer(monitor) { return { diff --git a/frontend/src/Components/Tooltip/Tooltip.tsx b/frontend/src/Components/Tooltip/Tooltip.tsx index 8ab8df5f55..8d8a39bb78 100644 --- a/frontend/src/Components/Tooltip/Tooltip.tsx +++ b/frontend/src/Components/Tooltip/Tooltip.tsx @@ -84,11 +84,11 @@ function Tooltip(props: Readonly) { const maxWidth = useMemo(() => { const windowWidth = window.innerWidth; - if (windowWidth >= Number.Number.parseInt(dimensions.breakpointLarge)) { + if (windowWidth >= Number.parseInt(dimensions.breakpointLarge)) { return 800; - } else if (windowWidth >= Number.Number.parseInt(dimensions.breakpointMedium)) { + } else if (windowWidth >= Number.parseInt(dimensions.breakpointMedium)) { return 650; - } else if (windowWidth >= Number.Number.parseInt(dimensions.breakpointSmall)) { + } else if (windowWidth >= Number.parseInt(dimensions.breakpointSmall)) { return 500; } diff --git a/frontend/src/DiscoverMovie/DiscoverMovie.js b/frontend/src/DiscoverMovie/DiscoverMovie.js index 3da8570beb..2dab093070 100644 --- a/frontend/src/DiscoverMovie/DiscoverMovie.js +++ b/frontend/src/DiscoverMovie/DiscoverMovie.js @@ -162,7 +162,7 @@ class DiscoverMovie extends Component { const characters = _.reduce(items, (acc, item) => { let char = item.sortTitle.charAt(0); - if (!Number.Number.isNaN(char)) { + if (!Number.isNaN(char)) { char = '#'; } diff --git a/frontend/src/DiscoverMovie/Overview/DiscoverMovieOverview.js b/frontend/src/DiscoverMovie/Overview/DiscoverMovieOverview.js index d05ad54ae6..8b6555e008 100644 --- a/frontend/src/DiscoverMovie/Overview/DiscoverMovieOverview.js +++ b/frontend/src/DiscoverMovie/Overview/DiscoverMovieOverview.js @@ -19,10 +19,10 @@ import translate from 'Utilities/String/translate'; import DiscoverMovieOverviewInfo from './DiscoverMovieOverviewInfo'; import styles from './DiscoverMovieOverview.css'; -const columnPadding = Number.Number.parseInt(dimensions.movieIndexColumnPadding); -const columnPaddingSmallScreen = Number.Number.parseInt(dimensions.movieIndexColumnPaddingSmallScreen); -const defaultFontSize = Number.Number.parseInt(fonts.defaultFontSize); -const lineHeight = Number.Number.parseFloat(fonts.lineHeight); +const columnPadding = Number.parseInt(dimensions.movieIndexColumnPadding); +const columnPaddingSmallScreen = Number.parseInt(dimensions.movieIndexColumnPaddingSmallScreen); +const defaultFontSize = Number.parseInt(fonts.defaultFontSize); +const lineHeight = Number.parseFloat(fonts.lineHeight); // Hardcoded height beased on line-height of 32 + bottom margin of 10. 19 + 5 for List Row // Less side-effecty than using react-measure. diff --git a/frontend/src/DiscoverMovie/Overview/DiscoverMovieOverviewInfo.js b/frontend/src/DiscoverMovie/Overview/DiscoverMovieOverviewInfo.js index 6a3dec0308..f9630e351f 100644 --- a/frontend/src/DiscoverMovie/Overview/DiscoverMovieOverviewInfo.js +++ b/frontend/src/DiscoverMovie/Overview/DiscoverMovieOverviewInfo.js @@ -7,7 +7,7 @@ import translate from 'Utilities/String/translate'; import DiscoverMovieOverviewInfoRow from './DiscoverMovieOverviewInfoRow'; import styles from './DiscoverMovieOverviewInfo.css'; -const infoRowHeight = Number.Number.parseInt(dimensions.movieIndexOverviewInfoRowHeight); +const infoRowHeight = Number.parseInt(dimensions.movieIndexOverviewInfoRowHeight); const rows = [ { diff --git a/frontend/src/DiscoverMovie/Overview/DiscoverMovieOverviews.js b/frontend/src/DiscoverMovie/Overview/DiscoverMovieOverviews.js index 7e8d234dbd..043c3e785e 100644 --- a/frontend/src/DiscoverMovie/Overview/DiscoverMovieOverviews.js +++ b/frontend/src/DiscoverMovie/Overview/DiscoverMovieOverviews.js @@ -10,8 +10,8 @@ import DiscoverMovieOverviewConnector from './DiscoverMovieOverviewConnector'; import styles from './DiscoverMovieOverviews.css'; // Poster container dimensions -const columnPadding = Number.Number.parseInt(dimensions.movieIndexColumnPadding); -const columnPaddingSmallScreen = Number.Number.parseInt(dimensions.movieIndexColumnPaddingSmallScreen); +const columnPadding = Number.parseInt(dimensions.movieIndexColumnPadding); +const columnPaddingSmallScreen = Number.parseInt(dimensions.movieIndexColumnPaddingSmallScreen); function calculatePosterWidth(posterSize, isSmallScreen) { const maximumPosterWidth = isSmallScreen ? 152 : 162; diff --git a/frontend/src/DiscoverMovie/Posters/DiscoverMoviePosters.js b/frontend/src/DiscoverMovie/Posters/DiscoverMoviePosters.js index 4cca9f8a47..5649c82f48 100644 --- a/frontend/src/DiscoverMovie/Posters/DiscoverMoviePosters.js +++ b/frontend/src/DiscoverMovie/Posters/DiscoverMoviePosters.js @@ -10,10 +10,10 @@ import DiscoverMoviePosterConnector from './DiscoverMoviePosterConnector'; import styles from './DiscoverMoviePosters.css'; // Poster container dimensions -const columnPadding = Number.Number.parseInt(dimensions.movieIndexColumnPadding); -const columnPaddingSmallScreen = Number.Number.parseInt(dimensions.movieIndexColumnPaddingSmallScreen); -const progressBarHeight = Number.Number.parseInt(dimensions.progressBarSmallHeight); -const detailedProgressBarHeight = Number.Number.parseInt(dimensions.progressBarMediumHeight); +const columnPadding = Number.parseInt(dimensions.movieIndexColumnPadding); +const columnPaddingSmallScreen = Number.parseInt(dimensions.movieIndexColumnPaddingSmallScreen); +const progressBarHeight = Number.parseInt(dimensions.progressBarSmallHeight); +const detailedProgressBarHeight = Number.parseInt(dimensions.progressBarMediumHeight); const additionalColumnCount = { small: 3, diff --git a/frontend/src/InteractiveImport/Language/SelectLanguageModalContent.tsx b/frontend/src/InteractiveImport/Language/SelectLanguageModalContent.tsx index 434865ef70..acf4b153e6 100644 --- a/frontend/src/InteractiveImport/Language/SelectLanguageModalContent.tsx +++ b/frontend/src/InteractiveImport/Language/SelectLanguageModalContent.tsx @@ -56,7 +56,7 @@ function SelectLanguageModalContent(props: Readonly { - const changedId = Number.Number.parseInt(name); + const changedId = Number.parseInt(name); let newLanguages = [...languageIds]; diff --git a/frontend/src/InteractiveImport/Movie/SelectMovieModalContent.tsx b/frontend/src/InteractiveImport/Movie/SelectMovieModalContent.tsx index 4d7feed877..bbeb955a1b 100644 --- a/frontend/src/InteractiveImport/Movie/SelectMovieModalContent.tsx +++ b/frontend/src/InteractiveImport/Movie/SelectMovieModalContent.tsx @@ -51,7 +51,7 @@ const columns = [ }, ]; -const bodyPadding = Number.Number.parseInt(dimensions.pageContentBodyPadding); +const bodyPadding = Number.parseInt(dimensions.pageContentBodyPadding); interface SelectMovieModalContentProps { modalTitle: string; diff --git a/frontend/src/Movie/Details/Credits/MovieCreditPosters.tsx b/frontend/src/Movie/Details/Credits/MovieCreditPosters.tsx index e4ef674ee1..058e8177ca 100644 --- a/frontend/src/Movie/Details/Credits/MovieCreditPosters.tsx +++ b/frontend/src/Movie/Details/Credits/MovieCreditPosters.tsx @@ -12,8 +12,8 @@ import 'swiper/css'; import 'swiper/css/navigation'; // Poster container dimensions -const columnPadding = Number.Number.parseInt(dimensions.movieIndexColumnPadding); -const columnPaddingSmallScreen = Number.Number.parseInt( +const columnPadding = Number.parseInt(dimensions.movieIndexColumnPadding); +const columnPaddingSmallScreen = Number.parseInt( dimensions.movieIndexColumnPaddingSmallScreen ); diff --git a/frontend/src/Movie/Details/MovieDetails.tsx b/frontend/src/Movie/Details/MovieDetails.tsx index 5bd360801d..9ad1743962 100644 --- a/frontend/src/Movie/Details/MovieDetails.tsx +++ b/frontend/src/Movie/Details/MovieDetails.tsx @@ -101,8 +101,8 @@ import MovieTags from './MovieTags'; import MovieTitlesTable from './Titles/MovieTitlesTable'; import styles from './MovieDetails.css'; -const defaultFontSize = Number.Number.parseInt(fonts.defaultFontSize); -const lineHeight = Number.Number.parseFloat(fonts.lineHeight); +const defaultFontSize = Number.parseInt(fonts.defaultFontSize); +const lineHeight = Number.parseFloat(fonts.lineHeight); function getFanartUrl(images: Image[]) { const image = images.find((image) => image.coverType === 'fanart'); @@ -417,12 +417,6 @@ function MovieDetails({ movieId }: Readonly) { touchStart.current = null; }, []); - const handleTouchMove = useCallback(() => { - if (!touchStart.current) { - return; - } - }, []); - const handleKeyUp = useCallback( (event: KeyboardEvent) => { if ( @@ -495,23 +489,15 @@ function MovieDetails({ movieId }: Readonly) { window.addEventListener('touchstart', handleTouchStart); window.addEventListener('touchend', handleTouchEnd); window.addEventListener('touchcancel', handleTouchCancel); - window.addEventListener('touchmove', handleTouchMove); window.addEventListener('keyup', handleKeyUp); return () => { window.removeEventListener('touchstart', handleTouchStart); window.removeEventListener('touchend', handleTouchEnd); window.removeEventListener('touchcancel', handleTouchCancel); - window.removeEventListener('touchmove', handleTouchMove); window.removeEventListener('keyup', handleKeyUp); }; - }, [ - handleTouchStart, - handleTouchEnd, - handleTouchCancel, - handleTouchMove, - handleKeyUp, - ]); + }, [handleTouchStart, handleTouchEnd, handleTouchCancel, handleKeyUp]); if (!movie) { return null; diff --git a/frontend/src/Movie/Index/MovieIndex.tsx b/frontend/src/Movie/Index/MovieIndex.tsx index 2bcc8ff97b..b9d7ae433f 100644 --- a/frontend/src/Movie/Index/MovieIndex.tsx +++ b/frontend/src/Movie/Index/MovieIndex.tsx @@ -206,7 +206,7 @@ const MovieIndex = withScrollPosition((props: Readonly) => { const characters = items.reduce((acc: Record, item) => { let char = item.sortTitle.charAt(0); - if (!Number.Number.isNaN(Number(char))) { + if (!Number.isNaN(Number(char))) { char = '#'; } diff --git a/frontend/src/Movie/Index/Overview/MovieIndexOverview.tsx b/frontend/src/Movie/Index/Overview/MovieIndexOverview.tsx index b2fac81968..4330b13e46 100644 --- a/frontend/src/Movie/Index/Overview/MovieIndexOverview.tsx +++ b/frontend/src/Movie/Index/Overview/MovieIndexOverview.tsx @@ -25,12 +25,12 @@ import MovieIndexOverviewInfo from './MovieIndexOverviewInfo'; import selectOverviewOptions from './selectOverviewOptions'; import styles from './MovieIndexOverview.css'; -const columnPadding = Number.Number.parseInt(dimensions.movieIndexColumnPadding); -const columnPaddingSmallScreen = Number.Number.parseInt( +const columnPadding = Number.parseInt(dimensions.movieIndexColumnPadding); +const columnPaddingSmallScreen = Number.parseInt( dimensions.movieIndexColumnPaddingSmallScreen ); -const defaultFontSize = Number.Number.parseInt(fonts.defaultFontSize); -const lineHeight = Number.Number.parseFloat(fonts.lineHeight); +const defaultFontSize = Number.parseInt(fonts.defaultFontSize); +const lineHeight = Number.parseFloat(fonts.lineHeight); // Hardcoded height beased on line-height of 32 + bottom margin of 10. // Less side-effecty than using react-measure. diff --git a/frontend/src/Movie/Index/Overview/MovieIndexOverviewInfo.tsx b/frontend/src/Movie/Index/Overview/MovieIndexOverviewInfo.tsx index 45a2572168..010e9b34d6 100644 --- a/frontend/src/Movie/Index/Overview/MovieIndexOverviewInfo.tsx +++ b/frontend/src/Movie/Index/Overview/MovieIndexOverviewInfo.tsx @@ -41,7 +41,7 @@ interface MovieIndexOverviewInfoProps { sortKey: string; } -const infoRowHeight = Number.Number.parseInt(dimensions.movieIndexOverviewInfoRowHeight); +const infoRowHeight = Number.parseInt(dimensions.movieIndexOverviewInfoRowHeight); const rows = [ { diff --git a/frontend/src/Movie/Index/Overview/MovieIndexOverviews.tsx b/frontend/src/Movie/Index/Overview/MovieIndexOverviews.tsx index 32b171074a..0691797e03 100644 --- a/frontend/src/Movie/Index/Overview/MovieIndexOverviews.tsx +++ b/frontend/src/Movie/Index/Overview/MovieIndexOverviews.tsx @@ -10,14 +10,14 @@ import MovieIndexOverview from './MovieIndexOverview'; import selectOverviewOptions from './selectOverviewOptions'; // Poster container dimensions -const columnPadding = Number.Number.parseInt(dimensions.movieIndexColumnPadding); -const columnPaddingSmallScreen = Number.Number.parseInt( +const columnPadding = Number.parseInt(dimensions.movieIndexColumnPadding); +const columnPaddingSmallScreen = Number.parseInt( dimensions.movieIndexColumnPaddingSmallScreen ); -const progressBarHeight = Number.Number.parseInt(dimensions.progressBarSmallHeight); -const detailedProgressBarHeight = Number.Number.parseInt(dimensions.progressBarMediumHeight); -const bodyPadding = Number.Number.parseInt(dimensions.pageContentBodyPadding); -const bodyPaddingSmallScreen = Number.Number.parseInt( +const progressBarHeight = Number.parseInt(dimensions.progressBarSmallHeight); +const detailedProgressBarHeight = Number.parseInt(dimensions.progressBarMediumHeight); +const bodyPadding = Number.parseInt(dimensions.pageContentBodyPadding); +const bodyPaddingSmallScreen = Number.parseInt( dimensions.pageContentBodyPaddingSmallScreen ); diff --git a/frontend/src/Movie/Index/Posters/MovieIndexPosters.tsx b/frontend/src/Movie/Index/Posters/MovieIndexPosters.tsx index 9be14a11d3..417dd77490 100644 --- a/frontend/src/Movie/Index/Posters/MovieIndexPosters.tsx +++ b/frontend/src/Movie/Index/Posters/MovieIndexPosters.tsx @@ -11,16 +11,16 @@ import Movie from 'Movie/Movie'; import dimensions from 'Styles/Variables/dimensions'; import getIndexOfFirstCharacter from 'Utilities/Array/getIndexOfFirstCharacter'; -const bodyPadding = Number.Number.parseInt(dimensions.pageContentBodyPadding); -const bodyPaddingSmallScreen = Number.Number.parseInt( +const bodyPadding = Number.parseInt(dimensions.pageContentBodyPadding); +const bodyPaddingSmallScreen = Number.parseInt( dimensions.pageContentBodyPaddingSmallScreen ); -const columnPadding = Number.Number.parseInt(dimensions.movieIndexColumnPadding); -const columnPaddingSmallScreen = Number.Number.parseInt( +const columnPadding = Number.parseInt(dimensions.movieIndexColumnPadding); +const columnPaddingSmallScreen = Number.parseInt( dimensions.movieIndexColumnPaddingSmallScreen ); -const progressBarHeight = Number.Number.parseInt(dimensions.progressBarSmallHeight); -const detailedProgressBarHeight = Number.Number.parseInt(dimensions.progressBarMediumHeight); +const progressBarHeight = Number.parseInt(dimensions.progressBarSmallHeight); +const detailedProgressBarHeight = Number.parseInt(dimensions.progressBarMediumHeight); const ADDITIONAL_COLUMN_COUNT: Record = { small: 3, diff --git a/frontend/src/Movie/Index/Posters/PosterDateRow.tsx b/frontend/src/Movie/Index/Posters/PosterDateRow.tsx index 350829d03e..707f158652 100644 --- a/frontend/src/Movie/Index/Posters/PosterDateRow.tsx +++ b/frontend/src/Movie/Index/Posters/PosterDateRow.tsx @@ -1,6 +1,5 @@ import React from 'react'; -import Icon from 'Components/Icon'; -import { IconDefinition } from 'Helpers/Props/icons'; +import Icon, { IconName } from 'Components/Icon'; import formatDate from 'Utilities/Date/formatDate'; import getRelativeDate from 'Utilities/Date/getRelativeDate'; import styles from './MovieIndexPoster.css'; @@ -8,7 +7,7 @@ import styles from './MovieIndexPoster.css'; interface PosterDateRowProps { show: boolean; date?: string; - icon: IconDefinition; + icon: IconName; label: string; shortDateFormat: string; longDateFormat: string; diff --git a/frontend/src/Movie/Index/Table/MovieIndexTable.tsx b/frontend/src/Movie/Index/Table/MovieIndexTable.tsx index 9fde01b60d..6c49b789ec 100644 --- a/frontend/src/Movie/Index/Table/MovieIndexTable.tsx +++ b/frontend/src/Movie/Index/Table/MovieIndexTable.tsx @@ -15,8 +15,8 @@ import MovieIndexRow from './MovieIndexRow'; import MovieIndexTableHeader from './MovieIndexTableHeader'; import styles from './MovieIndexTable.css'; -const bodyPadding = Number.Number.parseInt(dimensions.pageContentBodyPadding); -const bodyPaddingSmallScreen = Number.Number.parseInt( +const bodyPadding = Number.parseInt(dimensions.pageContentBodyPadding); +const bodyPaddingSmallScreen = Number.parseInt( dimensions.pageContentBodyPaddingSmallScreen ); diff --git a/frontend/src/MovieFile/Edit/FileEditModalContent.js b/frontend/src/MovieFile/Edit/FileEditModalContent.js index 49d0e86dcf..01f63bc174 100644 --- a/frontend/src/MovieFile/Edit/FileEditModalContent.js +++ b/frontend/src/MovieFile/Edit/FileEditModalContent.js @@ -47,7 +47,7 @@ class FileEditModalContent extends Component { // Listeners onQualityChange = ({ value }) => { - this.setState({ qualityId: Number.Number.parseInt(value) }); + this.setState({ qualityId: Number.parseInt(value) }); }; onInputChange = ({ name, value }) => { diff --git a/frontend/src/MovieFile/Edit/FileEditModalContentConnector.js b/frontend/src/MovieFile/Edit/FileEditModalContentConnector.js index 95a02f7db7..96d33cb271 100644 --- a/frontend/src/MovieFile/Edit/FileEditModalContentConnector.js +++ b/frontend/src/MovieFile/Edit/FileEditModalContentConnector.js @@ -74,7 +74,7 @@ class FileEditModalContentConnector extends Component { const languages = []; languageIds.forEach((languageId) => { - const language = this.props.languages.find((item) => item.id === Number.Number.parseInt(languageId)); + const language = this.props.languages.find((item) => item.id === Number.parseInt(languageId)); if (language !== undefined) { languages.push(language); diff --git a/frontend/src/RootFolder/RootFolderRow.tsx b/frontend/src/RootFolder/RootFolderRow.tsx index 89fef99917..ab31cb80cc 100644 --- a/frontend/src/RootFolder/RootFolderRow.tsx +++ b/frontend/src/RootFolder/RootFolderRow.tsx @@ -62,7 +62,7 @@ function RootFolderRow(props: Readonly) { - {isUnavailable || Number.Number.isNaN(Number(freeSpace)) + {isUnavailable || Number.isNaN(Number(freeSpace)) ? '-' : formatBytes(freeSpace)} diff --git a/frontend/src/Settings/Profiles/Delay/DelayProfileDragPreview.js b/frontend/src/Settings/Profiles/Delay/DelayProfileDragPreview.js index 408808c8d1..41340aaa22 100644 --- a/frontend/src/Settings/Profiles/Delay/DelayProfileDragPreview.js +++ b/frontend/src/Settings/Profiles/Delay/DelayProfileDragPreview.js @@ -7,7 +7,7 @@ import dimensions from 'Styles/Variables/dimensions.js'; import DelayProfile from './DelayProfile'; import styles from './DelayProfileDragPreview.css'; -const dragHandleWidth = Number.Number.parseInt(dimensions.dragHandleWidth); +const dragHandleWidth = Number.parseInt(dimensions.dragHandleWidth); function collectDragLayer(monitor) { return { diff --git a/frontend/src/Settings/Profiles/Quality/EditQualityProfileModalContent.js b/frontend/src/Settings/Profiles/Quality/EditQualityProfileModalContent.js index 586f939c59..9a6be47cd2 100644 --- a/frontend/src/Settings/Profiles/Quality/EditQualityProfileModalContent.js +++ b/frontend/src/Settings/Profiles/Quality/EditQualityProfileModalContent.js @@ -20,7 +20,7 @@ import QualityProfileFormatItems from './QualityProfileFormatItems'; import QualityProfileItems from './QualityProfileItems'; import styles from './EditQualityProfileModalContent.css'; -const MODAL_BODY_PADDING = Number.Number.parseInt(dimensions.modalBodyPadding); +const MODAL_BODY_PADDING = Number.parseInt(dimensions.modalBodyPadding); function getCustomFormatRender(formatItems, otherProps) { return ( diff --git a/frontend/src/Settings/Profiles/Quality/EditQualityProfileModalContentConnector.js b/frontend/src/Settings/Profiles/Quality/EditQualityProfileModalContentConnector.js index 9413b76c0d..bf6e3927e6 100644 --- a/frontend/src/Settings/Profiles/Quality/EditQualityProfileModalContentConnector.js +++ b/frontend/src/Settings/Profiles/Quality/EditQualityProfileModalContentConnector.js @@ -21,13 +21,13 @@ function parseIndex(index) { if (split.length === 1) { return [ null, - Number.Number.parseInt(split[0]) - 1 + Number.parseInt(split[0]) - 1 ]; } return [ - Number.Number.parseInt(split[0]) - 1, - Number.Number.parseInt(split[1]) - 1 + Number.parseInt(split[0]) - 1, + Number.parseInt(split[1]) - 1 ]; } @@ -202,7 +202,7 @@ class EditQualityProfileModalContentConnector extends Component { }; onCutoffChange = ({ name, value }) => { - const id = Number.Number.parseInt(value); + const id = Number.parseInt(value); const item = _.find(this.props.item.items.value, (i) => { if (i.quality) { return i.quality.id === id; @@ -218,7 +218,7 @@ class EditQualityProfileModalContentConnector extends Component { onLanguageChange = ({ name, value }) => { - const id = Number.Number.parseInt(value); + const id = Number.parseInt(value); const language = _.find(this.props.languages, (item) => item.key === id); diff --git a/frontend/src/Settings/Profiles/Quality/QualityProfileItemDragPreview.js b/frontend/src/Settings/Profiles/Quality/QualityProfileItemDragPreview.js index c322081c05..795de136cb 100644 --- a/frontend/src/Settings/Profiles/Quality/QualityProfileItemDragPreview.js +++ b/frontend/src/Settings/Profiles/Quality/QualityProfileItemDragPreview.js @@ -7,10 +7,10 @@ import dimensions from 'Styles/Variables/dimensions.js'; import QualityProfileItem from './QualityProfileItem'; import styles from './QualityProfileItemDragPreview.css'; -const formGroupExtraSmallWidth = Number.Number.parseInt(dimensions.formGroupExtraSmallWidth); -const formLabelSmallWidth = Number.Number.parseInt(dimensions.formLabelSmallWidth); -const formLabelRightMarginWidth = Number.Number.parseInt(dimensions.formLabelRightMarginWidth); -const dragHandleWidth = Number.Number.parseInt(dimensions.dragHandleWidth); +const formGroupExtraSmallWidth = Number.parseInt(dimensions.formGroupExtraSmallWidth); +const formLabelSmallWidth = Number.parseInt(dimensions.formLabelSmallWidth); +const formLabelRightMarginWidth = Number.parseInt(dimensions.formLabelRightMarginWidth); +const dragHandleWidth = Number.parseInt(dimensions.dragHandleWidth); function collectDragLayer(monitor) { return { diff --git a/frontend/src/Store/Actions/Creators/Reducers/createSetSettingValueReducer.js b/frontend/src/Store/Actions/Creators/Reducers/createSetSettingValueReducer.js index f0f191f4db..bd3daaa44a 100644 --- a/frontend/src/Store/Actions/Creators/Reducers/createSetSettingValueReducer.js +++ b/frontend/src/Store/Actions/Creators/Reducers/createSetSettingValueReducer.js @@ -15,7 +15,7 @@ function createSetSettingValueReducer(section) { let parsedValue = null; if (_.isNumber(currentValue) && value != null) { - parsedValue = Number.Number.parseInt(value); + parsedValue = Number.parseInt(value); } else { parsedValue = value; } diff --git a/frontend/src/Store/Actions/Settings/qualityDefinitions.js b/frontend/src/Store/Actions/Settings/qualityDefinitions.js index 43ab59c988..501c574416 100644 --- a/frontend/src/Store/Actions/Settings/qualityDefinitions.js +++ b/frontend/src/Store/Actions/Settings/qualityDefinitions.js @@ -58,7 +58,7 @@ export default { const qualityDefinitions = getState().settings.qualityDefinitions; const upatedDefinitions = Object.keys(qualityDefinitions.pendingChanges).map((key) => { - const id = Number.Number.parseInt(key); + const id = Number.parseInt(key); const pendingChanges = qualityDefinitions.pendingChanges[id] || {}; const item = _.find(qualityDefinitions.items, { id }); diff --git a/frontend/src/Store/Selectors/createMovieCreditImportListSelector.ts b/frontend/src/Store/Selectors/createMovieCreditImportListSelector.ts index f161e3213a..c3c9c1a843 100644 --- a/frontend/src/Store/Selectors/createMovieCreditImportListSelector.ts +++ b/frontend/src/Store/Selectors/createMovieCreditImportListSelector.ts @@ -13,7 +13,7 @@ function createMovieCreditImportListSelector(tmdbId: number) { (field) => field.name === 'personId' )?.value as string | null; - if (personIdValue && Number.Number.parseInt(personIdValue) === tmdbId) { + if (personIdValue && Number.parseInt(personIdValue) === tmdbId) { acc.push(importList); return acc; diff --git a/frontend/src/System/Updates/Updates.tsx b/frontend/src/System/Updates/Updates.tsx index 52c855c32f..8051ff1171 100644 --- a/frontend/src/System/Updates/Updates.tsx +++ b/frontend/src/System/Updates/Updates.tsx @@ -85,12 +85,12 @@ function Updates() { }; const { isMajorUpdate, hasUpdateToInstall } = useMemo(() => { - const majorVersion = Number.Number.parseInt( + const majorVersion = Number.parseInt( currentVersion.match(VERSION_REGEX)?.[0] ?? '0' ); const latestVersion = items[0]?.version; - const latestMajorVersion = Number.Number.parseInt( + const latestMajorVersion = Number.parseInt( latestVersion?.match(VERSION_REGEX)?.[0] ?? '0' ); diff --git a/frontend/src/Utilities/Array/getIndexOfFirstCharacter.js b/frontend/src/Utilities/Array/getIndexOfFirstCharacter.js index 295d63a62d..4dd2d7d779 100644 --- a/frontend/src/Utilities/Array/getIndexOfFirstCharacter.js +++ b/frontend/src/Utilities/Array/getIndexOfFirstCharacter.js @@ -3,7 +3,7 @@ export default function getIndexOfFirstCharacter(items, character) { const firstCharacter = item.sortTitle.charAt(0); if (character === '#') { - return !Number.Number.isNaN(firstCharacter); + return !Number.isNaN(firstCharacter); } return firstCharacter === character; diff --git a/frontend/src/Utilities/Number/convertToBytes.js b/frontend/src/Utilities/Number/convertToBytes.js index ffafb03888..9ac2364f7e 100644 --- a/frontend/src/Utilities/Number/convertToBytes.js +++ b/frontend/src/Utilities/Number/convertToBytes.js @@ -2,7 +2,7 @@ function convertToBytes(input, power, binaryPrefix) { const size = Number(input); - if (Number.Number.isNaN(size)) { + if (Number.isNaN(size)) { return ''; } diff --git a/frontend/src/Utilities/Number/formatAge.js b/frontend/src/Utilities/Number/formatAge.js index d5e63205cb..99a0319ad5 100644 --- a/frontend/src/Utilities/Number/formatAge.js +++ b/frontend/src/Utilities/Number/formatAge.js @@ -2,8 +2,8 @@ import translate from 'Utilities/String/translate'; function formatAge(age, ageHours, ageMinutes) { age = Math.round(age); - ageHours = Number.Number.parseFloat(ageHours); - ageMinutes = ageMinutes && Number.Number.parseFloat(ageMinutes); + ageHours = Number.parseFloat(ageHours); + ageMinutes = ageMinutes && Number.parseFloat(ageMinutes); if (age < 2 && ageHours) { if (ageHours < 2 && !!ageMinutes) { diff --git a/frontend/src/Utilities/Number/formatBitrate.ts b/frontend/src/Utilities/Number/formatBitrate.ts index 1a5d7ca364..d079138eed 100644 --- a/frontend/src/Utilities/Number/formatBitrate.ts +++ b/frontend/src/Utilities/Number/formatBitrate.ts @@ -3,7 +3,7 @@ import { filesize } from 'filesize'; function formatBitrate(input: string | number) { const size = Number(input); - if (Number.Number.isNaN(size)) { + if (Number.isNaN(size)) { return ''; } diff --git a/frontend/src/Utilities/Number/formatBytes.ts b/frontend/src/Utilities/Number/formatBytes.ts index 0dea95de55..ce07355480 100644 --- a/frontend/src/Utilities/Number/formatBytes.ts +++ b/frontend/src/Utilities/Number/formatBytes.ts @@ -3,7 +3,7 @@ import { filesize } from 'filesize'; function formatBytes(input: string | number) { const size = Number(input); - if (Number.Number.isNaN(size)) { + if (Number.isNaN(size)) { return ''; } diff --git a/frontend/src/Utilities/Table/getSelectedIds.ts b/frontend/src/Utilities/Table/getSelectedIds.ts index 49a16b3b6d..a2d72f5451 100644 --- a/frontend/src/Utilities/Table/getSelectedIds.ts +++ b/frontend/src/Utilities/Table/getSelectedIds.ts @@ -6,7 +6,10 @@ function getSelectedIds(selectedState: SelectedState): number[] { selectedState, (result: number[], value, id) => { if (value) { - result.push(Number.Number.parseInt(id)); + const parsed = Number.parseInt(id, 10); + if (!Number.isNaN(parsed)) { + result.push(parsed); + } } return result; diff --git a/package.json b/package.json index 64444fa374..0d032bc098 100644 --- a/package.json +++ b/package.json @@ -156,5 +156,12 @@ "volta": { "node": "20.11.1", "yarn": "1.22.19" + }, + "resolutions": { + "cross-spawn": "^7.0.6", + "brace-expansion": "^2.0.2", + "color-string": "^1.9.1", + "postcss-color-function/**/postcss": "^8.5.6", + "glob": "^11.1.0" } } diff --git a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs index 4f6953a21e..8adc774023 100644 --- a/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs +++ b/src/NzbDrone.Core/Configuration/ConfigFileProvider.cs @@ -326,7 +326,12 @@ public string GetValue(string key, object defaultValue, bool persist = true) return _cache.Get(key, () => { var xDoc = LoadConfigFile(); - var config = xDoc.Descendants(CONFIG_ELEMENT_NAME).Single(); + var config = xDoc.Descendants(CONFIG_ELEMENT_NAME).SingleOrDefault(); + + if (config == null) + { + return defaultValue.ToString(); + } var parentContainer = config; @@ -352,7 +357,12 @@ public void SetValue(string key, object value) { var valueString = value.ToString().Trim(); var xDoc = LoadConfigFile(); - var config = xDoc.Descendants(CONFIG_ELEMENT_NAME).Single(); + var config = xDoc.Descendants(CONFIG_ELEMENT_NAME).SingleOrDefault(); + + if (config == null) + { + return; + } var parentContainer = config; @@ -408,7 +418,12 @@ public void MigrateConfigFile() private void DeleteOldValues() { var xDoc = LoadConfigFile(); - var config = xDoc.Descendants(CONFIG_ELEMENT_NAME).Single(); + var config = xDoc.Descendants(CONFIG_ELEMENT_NAME).SingleOrDefault(); + + if (config == null) + { + return; + } var type = GetType(); var properties = type.GetProperties(); diff --git a/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationTaskProxyV2.cs b/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationTaskProxyV2.cs index 6ebb4a7caa..c7627986bc 100644 --- a/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationTaskProxyV2.cs +++ b/src/NzbDrone.Core/Download/Clients/DownloadStation/Proxies/DownloadStationTaskProxyV2.cs @@ -109,7 +109,12 @@ public IEnumerable GetTasks(DownloadStationSettings setting { foreach (var task in response.Data.Task) { - var taskTransfer = responseTransfer.Data.Task.Where(t => t.Id == task.Id).First(); + var taskTransfer = responseTransfer.Data.Task.FirstOrDefault(t => t.Id == task.Id); + + if (taskTransfer == null) + { + continue; + } var combinedTask = new DownloadStationTask { diff --git a/src/NzbDrone.Core/Download/TorrentClientBase.cs b/src/NzbDrone.Core/Download/TorrentClientBase.cs index 976562bc28..b7a18408ec 100644 --- a/src/NzbDrone.Core/Download/TorrentClientBase.cs +++ b/src/NzbDrone.Core/Download/TorrentClientBase.cs @@ -79,7 +79,7 @@ public override async Task Download(RemoteMovie remoteMovie, IIndexer in } catch (Exception ex) { - if (!magnetUrl.IsNullOrWhiteSpace()) + if (magnetUrl.IsNullOrWhiteSpace()) { throw; } diff --git a/src/NzbDrone.Core/Parser/Parser.cs b/src/NzbDrone.Core/Parser/Parser.cs index 7ef0633627..5a614c1efc 100644 --- a/src/NzbDrone.Core/Parser/Parser.cs +++ b/src/NzbDrone.Core/Parser/Parser.cs @@ -43,9 +43,10 @@ public static class Parser new Regex(@"^(?(?![(\[]).+?)?(?:(?:[-_\W](?<![)\[!]))*" + EditionRegex + @".{1,3}(?<year>(1(8|9)|20)\d{2}(?!p|i|\d+|\]|\W\d+)))+(\W+|_|$)(?!\\)", RegexOptions.IgnoreCase | RegexOptions.Compiled), - // Special, Despecialized, etc. Edition Movies, e.g: Mission.Impossible.3.2011.Special.Edition //TODO: Seems to slow down parsing heavily! - /*new Regex(@"^(?<title>(?![(\[]).+?)?(?:(?:[-_\W](?<![)\[!]))*(?<year>(19|20)\d{2}(?!p|i|(19|20)\d{2}|\]|\W(19|20)\d{2})))+(\W+|_|$)(?!\\)\(?(?<edition>(((Extended.|Ultimate.)?(Director.?s|Collector.?s|Theatrical|Ultimate|Final(?=(.(Cut|Edition|Version)))|Extended|Rogue|Special|Despecialized|\d{2,3}(th)?.Anniversary)(.(Cut|Edition|Version))?(.(Extended|Uncensored|Remastered|Unrated|Uncut|IMAX|Fan.?Edit))?|((Uncensored|Remastered|Unrated|Uncut|IMAX|Fan.?Edit|Edition|Restored|((2|3|4)in1))))))\)?", - RegexOptions.IgnoreCase | RegexOptions.Compiled),*/ + // DISABLED: Complex regex for edition movies with year before edition text + // e.g: Mission.Impossible.3.2011.Special.Edition + // Reason: Causes ReDoS-like performance degradation due to catastrophic backtracking + // Keep for reference; covered by simpler patterns above // Normal movie format, e.g: Mission.Impossible.3.2011 new Regex(@"^(?<title>(?![(\[]).+?)?(?:(?:[-_\W](?<![)\[!]))*(?<year>(1(8|9)|20)\d{2}(?!p|i|(1(8|9)|20)\d{2}|\]|\W(1(8|9)|20)\d{2})))+(\W+|_|$)(?!\\)", RegexOptions.IgnoreCase | RegexOptions.Compiled), diff --git a/src/NzbDrone.Core/Parser/RegexReplace.cs b/src/NzbDrone.Core/Parser/RegexReplace.cs index 456eefca08..1a2d81971a 100644 --- a/src/NzbDrone.Core/Parser/RegexReplace.cs +++ b/src/NzbDrone.Core/Parser/RegexReplace.cs @@ -1,22 +1,25 @@ +using System; using System.Text.RegularExpressions; namespace NzbDrone.Core.Parser { public class RegexReplace { + private static readonly TimeSpan RegexTimeout = TimeSpan.FromSeconds(5); + private readonly Regex _regex; private readonly string _replacementFormat; private readonly MatchEvaluator _replacementFunc; public RegexReplace(string pattern, string replacement, RegexOptions regexOptions) { - _regex = new Regex(pattern, regexOptions); + _regex = new Regex(pattern, regexOptions | RegexOptions.Compiled, RegexTimeout); _replacementFormat = replacement; } public RegexReplace(string pattern, MatchEvaluator replacement, RegexOptions regexOptions) { - _regex = new Regex(pattern, regexOptions); + _regex = new Regex(pattern, regexOptions | RegexOptions.Compiled, RegexTimeout); _replacementFunc = replacement; } diff --git a/src/NzbDrone.Core/Update/InstallUpdateService.cs b/src/NzbDrone.Core/Update/InstallUpdateService.cs index 0fe738bb5a..7d75cf3268 100644 --- a/src/NzbDrone.Core/Update/InstallUpdateService.cs +++ b/src/NzbDrone.Core/Update/InstallUpdateService.cs @@ -99,7 +99,7 @@ private bool InstallUpdate(UpdatePackage updatePackage) } } - if (_appFolderInfo.StartUpFolder.EndsWith("_output")) + if (Path.GetFileName(_appFolderInfo.StartUpFolder) == "_output") { _logger.ProgressDebug("Running in developer environment, not updating."); return false; @@ -181,7 +181,7 @@ private void EnsureValidBranch(UpdatePackage package) { try { - _logger.Info("Branch [{0}] is being redirected to [{1}]]", currentBranch, package.Branch); + _logger.Info("Branch [{0}] is being redirected to [{1}]", currentBranch, package.Branch); var config = new Dictionary<string, object>(); config["Branch"] = package.Branch; _configFileProvider.SaveConfigDictionary(config); diff --git a/src/Radarr.Api.V3/Movies/MovieController.cs b/src/Radarr.Api.V3/Movies/MovieController.cs index 444f9af48c..430f6c3085 100644 --- a/src/Radarr.Api.V3/Movies/MovieController.cs +++ b/src/Radarr.Api.V3/Movies/MovieController.cs @@ -273,7 +273,7 @@ public ActionResult<MovieResource> UpdateMovie([FromBody] MovieResource moviesRe BroadcastResourceChange(ModelAction.Updated, MapToResource(updatedMovie)); - return Accepted(moviesResource.Id); + return Ok(moviesResource); } [RestDeleteById] diff --git a/yarn.lock b/yarn.lock index 6568a76631..25fd42cfb1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1106,6 +1106,18 @@ resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz#4a2868d75d6d6963e423bcf90b7fd1be343409d3" integrity sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA== +"@isaacs/balanced-match@^4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz#3081dadbc3460661b751e7591d7faea5df39dd29" + integrity sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ== + +"@isaacs/brace-expansion@^5.0.0": + version "5.0.0" + resolved "https://registry.yarnpkg.com/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz#4b3dabab7d8e75a429414a96bd67bf4c1d13e0f3" + integrity sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA== + dependencies: + "@isaacs/balanced-match" "^4.0.1" + "@isaacs/cliui@^8.0.2": version "8.0.2" resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550" @@ -2187,18 +2199,10 @@ boolbase@^1.0.0: resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -brace-expansion@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" - integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== +brace-expansion@^1.1.7, brace-expansion@^2.0.1, brace-expansion@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.2.tgz#54fc53237a613d854c7bd37463aad17df87214e7" + integrity sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ== dependencies: balanced-match "^1.0.0" @@ -2331,7 +2335,7 @@ caniuse-lite@^1.0.30001716: resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz#dae13a9c80d517c30c6197515a96131c194d8f82" integrity sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw== -chalk@^2.4.1, chalk@^2.4.2: +chalk@^2.4.2: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -2435,12 +2439,13 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -color-string@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-0.3.0.tgz#27d46fb67025c5c2fa25993bfbf579e47841b991" - integrity sha512-sz29j1bmSDfoAxKIEU6zwoIZXN6BrFbAMIhfYCNyiZXBDuU/aiHlN84lp/xDzL2ubyFhLDobHIlU1X70XRrMDA== +color-string@^0.3.0, color-string@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.9.1.tgz#4467f9146f036f855b764dfb5bf8582bf342c7a4" + integrity sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg== dependencies: color-name "^1.0.0" + simple-swizzle "^0.2.2" color@^0.11.0: version "0.11.4" @@ -2491,11 +2496,6 @@ compress-commons@^4.1.2: normalize-path "^3.0.0" readable-stream "^3.6.0" -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== - connected-react-router@6.9.3: version "6.9.3" resolved "https://registry.yarnpkg.com/connected-react-router/-/connected-react-router-6.9.3.tgz#72300aca9f9d6f38e1f4a2901572faa02adec972" @@ -2590,10 +2590,10 @@ create-react-context@^0.3.0: gud "^1.0.0" warning "^4.0.3" -cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: - version "7.0.3" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" - integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== +cross-spawn@^7.0.2, cross-spawn@^7.0.3, cross-spawn@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== dependencies: path-key "^3.1.0" shebang-command "^2.0.0" @@ -3534,12 +3534,12 @@ for-each@^0.3.3: dependencies: is-callable "^1.1.3" -foreground-child@^3.1.0: - version "3.3.0" - resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.0.tgz#0ac8644c06e431439f8561db8ecf29a7b5519c77" - integrity sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg== +foreground-child@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f" + integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw== dependencies: - cross-spawn "^7.0.0" + cross-spawn "^7.0.6" signal-exit "^4.0.1" fork-ts-checker-webpack-plugin@8.0.0: @@ -3584,11 +3584,6 @@ fs-monkey@^1.0.4: resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.6.tgz#8ead082953e88d992cf3ff844faa907b26756da2" integrity sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg== -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== - fsevents@~2.3.2: version "2.3.3" resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" @@ -3692,30 +3687,18 @@ glob-to-regexp@^0.4.1: resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== -glob@^11.0.0: - version "11.0.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-11.0.0.tgz#6031df0d7b65eaa1ccb9b29b5ced16cea658e77e" - integrity sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g== +glob@^11.0.0, glob@^11.1.0, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.3: + version "11.1.0" + resolved "https://registry.yarnpkg.com/glob/-/glob-11.1.0.tgz#4f826576e4eb99c7dad383793d2f9f08f67e50a6" + integrity sha512-vuNwKSaKiqm7g0THUBu2x7ckSs3XJLXE+2ssL7/MfTGPLLcrJQ/4Uq1CjPTtO5cCIiRxqvN6Twy1qOwhL0Xjcw== dependencies: - foreground-child "^3.1.0" - jackspeak "^4.0.1" - minimatch "^10.0.0" + foreground-child "^3.3.1" + jackspeak "^4.1.1" + minimatch "^10.1.1" minipass "^7.1.2" package-json-from-dist "^1.0.0" path-scurry "^2.0.0" -glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.3: - version "7.2.3" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" - integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.1.1" - once "^1.3.0" - path-is-absolute "^1.0.0" - global-modules@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-2.0.0.tgz#997605ad2345f27f51539bea26574421215c7780" @@ -4000,15 +3983,7 @@ indent-string@^4.0.0: resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz#624f8f4497d619b2d9768531d58f4122854d7251" integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: +inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: version "2.0.4" resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -4060,6 +4035,11 @@ is-arrayish@^0.2.1: resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== +is-arrayish@^0.3.1: + version "0.3.4" + resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.4.tgz#1ee5553818511915685d33bb13d31bf854e5059d" + integrity sha512-m6UrgzFVUYawGBh1dUsWR5M2Clqic9RVXC/9f8ceNlv2IcO9j9J/z8UoCLPqtsPBFNzEpfR3xftohbfqDx8EQA== + is-async-function@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.0.0.tgz#8e4418efd3e5d3a6ebb0164c05ef5afb69aa9646" @@ -4307,10 +4287,10 @@ iterator.prototype@^1.1.3: reflect.getprototypeof "^1.0.4" set-function-name "^2.0.1" -jackspeak@^4.0.1: - version "4.0.2" - resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.0.2.tgz#11f9468a3730c6ff6f56823a820d7e3be9bef015" - integrity sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw== +jackspeak@^4.1.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-4.1.1.tgz#96876030f450502047fc7e8c7fcf8ce8124e43ae" + integrity sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ== dependencies: "@isaacs/cliui" "^8.0.2" @@ -4794,14 +4774,14 @@ mini-css-extract-plugin@2.9.1: schema-utils "^4.0.0" tapable "^2.2.1" -minimatch@^10.0.0: - version "10.0.1" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.0.1.tgz#ce0521856b453c86e25f2c4c0d03e6ff7ddc440b" - integrity sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ== +minimatch@^10.1.1: + version "10.1.1" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-10.1.1.tgz#e6e61b9b0c1dcab116b5a7d1458e8b6ae9e73a55" + integrity sha512-enIvLvRAFZYXJzkCYG5RKmPfrFArdLv+R+lbQ53BmIMLIry74bjKzX6iHAm8WYamJkhSSEabrWN5D97XnKObjQ== dependencies: - brace-expansion "^2.0.1" + "@isaacs/brace-expansion" "^5.0.0" -minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -5045,7 +5025,7 @@ object.values@^1.1.6, object.values@^1.2.0: define-properties "^1.2.1" es-object-atoms "^1.0.0" -once@^1.3.0, once@^1.4.0: +once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== @@ -5171,11 +5151,6 @@ path-exists@^5.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== - path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -5397,7 +5372,7 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@8.5.6: +postcss@8.5.6, postcss@^6.0.23, postcss@^8.5.6: version "8.5.6" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.6.tgz#2825006615a619b4f62a9e7426cc120b349a8f3c" integrity sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg== @@ -5406,15 +5381,6 @@ postcss@8.5.6: picocolors "^1.1.1" source-map-js "^1.2.1" -postcss@^6.0.23: - version "6.0.23" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.23.tgz#61c82cc328ac60e677645f979054eb98bc0e3324" - integrity sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag== - dependencies: - chalk "^2.4.1" - source-map "^0.6.1" - supports-color "^5.4.0" - postcss@^8.0.0, postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4.23, postcss@^8.4.32: version "8.5.0" resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.0.tgz#15244b9fd65f809b2819682456f0e7e1e30c145b" @@ -6301,6 +6267,13 @@ signal-exit@^4.0.1: resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== +simple-swizzle@^0.2.2: + version "0.2.4" + resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.4.tgz#a8d11a45a11600d6a1ecdff6363329e3648c3667" + integrity sha512-nAu1WFPQSMNr2Zn9PGSZK9AGn4t/y97lEm+MXTtUDwfP0ksAIX4nO+6ruD9Jwut4C49SB1Ws+fbXsm/yScWOHw== + dependencies: + is-arrayish "^0.3.1" + slash@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" @@ -6628,7 +6601,7 @@ sugarss@^4.0.1: resolved "https://registry.yarnpkg.com/sugarss/-/sugarss-4.0.1.tgz#128a783ed71ee0fc3b489ce1f7d5a89bc1e24383" integrity sha512-WCjS5NfuVJjkQzK10s8WOBY+hhDxxNt/N6ZaGwxFZ+wN3/lKKFSaaKUNecULcTTvE4urLcKaZFQD8vO0mOZujw== -supports-color@^5.3.0, supports-color@^5.4.0: +supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==