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)
This commit is contained in:
admin 2025-12-18 19:54:02 -06:00
parent 5c51367bec
commit 2b19ec07ff
59 changed files with 217 additions and 221 deletions

View file

@ -104,7 +104,7 @@ function HistoryDetails(props: Readonly<HistoryDetailsProps>) {
{customFormatScore && customFormatScore !== '0' ? (
<DescriptionListItem
title={translate('CustomFormatScore')}
data={formatCustomFormatScore(Number.Number.parseInt(customFormatScore))}
data={formatCustomFormatScore(Number.parseInt(customFormatScore))}
/>
) : null}
@ -230,7 +230,7 @@ function HistoryDetails(props: Readonly<HistoryDetailsProps>) {
{customFormatScore && customFormatScore !== '0' ? (
<DescriptionListItem
title={translate('CustomFormatScore')}
data={formatCustomFormatScore(Number.Number.parseInt(customFormatScore))}
data={formatCustomFormatScore(Number.parseInt(customFormatScore))}
/>
) : null}
@ -272,7 +272,7 @@ function HistoryDetails(props: Readonly<HistoryDetailsProps>) {
{customFormatScore && customFormatScore !== '0' ? (
<DescriptionListItem
title={translate('CustomFormatScore')}
data={formatCustomFormatScore(Number.Number.parseInt(customFormatScore))}
data={formatCustomFormatScore(Number.parseInt(customFormatScore))}
/>
) : null}

View file

@ -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 = () => {

View file

@ -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,

View file

@ -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 = '#';
}

View file

@ -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.

View file

@ -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;

View file

@ -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);
}
}
}

View file

@ -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
) {

View file

@ -77,7 +77,7 @@ export interface UMaskInputProps {
}
function UMaskInput({ name, value, onChange }: Readonly<UMaskInputProps>) {
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;

View file

@ -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;
}
}

View file

@ -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<MovieSuggestion[]>([]);
const autosuggestRef = useRef<Autosuggest>(null);
@ -133,6 +133,7 @@ function MovieSearchInput() {
const worker = useRef<Worker | null>(null);
const isLoading = useRef(false);
const requestValue = useRef<string | null>(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,

View file

@ -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<string, number>;

View file

@ -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;

View file

@ -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 {

View file

@ -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') {

View file

@ -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 {

View file

@ -84,11 +84,11 @@ function Tooltip(props: Readonly<TooltipProps>) {
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;
}

View file

@ -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 = '#';
}

View file

@ -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.

View file

@ -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 = [
{

View file

@ -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;

View file

@ -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,

View file

@ -56,7 +56,7 @@ function SelectLanguageModalContent(props: Readonly<SelectLanguageModalContentPr
const onLanguageChange = useCallback(
({ name, value }: { name: string; value: boolean }) => {
const changedId = Number.Number.parseInt(name);
const changedId = Number.parseInt(name);
let newLanguages = [...languageIds];

View file

@ -51,7 +51,7 @@ const columns = [
},
];
const bodyPadding = Number.Number.parseInt(dimensions.pageContentBodyPadding);
const bodyPadding = Number.parseInt(dimensions.pageContentBodyPadding);
interface SelectMovieModalContentProps {
modalTitle: string;

View file

@ -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
);

View file

@ -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<MovieDetailsProps>) {
touchStart.current = null;
}, []);
const handleTouchMove = useCallback(() => {
if (!touchStart.current) {
return;
}
}, []);
const handleKeyUp = useCallback(
(event: KeyboardEvent) => {
if (
@ -495,23 +489,15 @@ function MovieDetails({ movieId }: Readonly<MovieDetailsProps>) {
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;

View file

@ -206,7 +206,7 @@ const MovieIndex = withScrollPosition((props: Readonly<MovieIndexProps>) => {
const characters = items.reduce((acc: Record<string, number>, item) => {
let char = item.sortTitle.charAt(0);
if (!Number.Number.isNaN(Number(char))) {
if (!Number.isNaN(Number(char))) {
char = '#';
}

View file

@ -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.

View file

@ -41,7 +41,7 @@ interface MovieIndexOverviewInfoProps {
sortKey: string;
}
const infoRowHeight = Number.Number.parseInt(dimensions.movieIndexOverviewInfoRowHeight);
const infoRowHeight = Number.parseInt(dimensions.movieIndexOverviewInfoRowHeight);
const rows = [
{

View file

@ -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
);

View file

@ -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<string, number> = {
small: 3,

View file

@ -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;

View file

@ -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
);

View file

@ -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 }) => {

View file

@ -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);

View file

@ -62,7 +62,7 @@ function RootFolderRow(props: Readonly<RootFolderRowProps>) {
</TableRowCell>
<TableRowCell className={styles.freeSpace}>
{isUnavailable || Number.Number.isNaN(Number(freeSpace))
{isUnavailable || Number.isNaN(Number(freeSpace))
? '-'
: formatBytes(freeSpace)}
</TableRowCell>

View file

@ -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 {

View file

@ -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 (

View file

@ -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);

View file

@ -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 {

View file

@ -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;
}

View file

@ -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 });

View file

@ -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;

View file

@ -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'
);

View file

@ -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;

View file

@ -2,7 +2,7 @@
function convertToBytes(input, power, binaryPrefix) {
const size = Number(input);
if (Number.Number.isNaN(size)) {
if (Number.isNaN(size)) {
return '';
}

View file

@ -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) {

View file

@ -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 '';
}

View file

@ -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 '';
}

View file

@ -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;

View file

@ -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"
}
}

View file

@ -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();

View file

@ -109,7 +109,12 @@ public IEnumerable<DownloadStationTask> 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
{

View file

@ -79,7 +79,7 @@ public override async Task<string> Download(RemoteMovie remoteMovie, IIndexer in
}
catch (Exception ex)
{
if (!magnetUrl.IsNullOrWhiteSpace())
if (magnetUrl.IsNullOrWhiteSpace())
{
throw;
}

View file

@ -43,9 +43,10 @@ public static class Parser
new Regex(@"^(?<title>(?![(\[]).+?)?(?:(?:[-_\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),

View file

@ -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;
}

View file

@ -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);

View file

@ -273,7 +273,7 @@ public ActionResult<MovieResource> UpdateMovie([FromBody] MovieResource moviesRe
BroadcastResourceChange(ModelAction.Updated, MapToResource(updatedMovie));
return Accepted(moviesResource.Id);
return Ok(moviesResource);
}
[RestDeleteById]

155
yarn.lock
View file

@ -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==