diff --git a/.editorconfig b/.editorconfig index d6d2e0f442..a05d4393c0 100644 --- a/.editorconfig +++ b/.editorconfig @@ -5,7 +5,7 @@ root = true # NOTE: Requires **VS2019 16.3** or later # Stylecop.ruleset -# Description: Rules for Radarr +# Description: Rules for Aletheia # Code files [*.cs] @@ -18,12 +18,6 @@ indent_size = 4 # Sort using and Import directives with System.* appearing first dotnet_sort_system_directives_first = true -# Avoid "this." and "Me." if not necessary -dotnet_style_qualification_for_field = false:refactoring -dotnet_style_qualification_for_property = false:refactoring -dotnet_style_qualification_for_method = false:refactoring -dotnet_style_qualification_for_event = false:refactoring - # Indentation preferences csharp_indent_block_contents = true csharp_indent_braces = false @@ -32,10 +26,13 @@ csharp_indent_case_contents_when_block = true csharp_indent_switch_labels = true csharp_indent_labels = flush_left +# Avoid "this." and "Me." if not necessary dotnet_style_qualification_for_field = false:suggestion dotnet_style_qualification_for_property = false:suggestion dotnet_style_qualification_for_method = false:suggestion dotnet_style_qualification_for_event = false:suggestion + +# Naming conventions dotnet_naming_style.instance_field_style.capitalization = camel_case dotnet_naming_style.instance_field_style.required_prefix = _ diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index cbed6163cd..05b482d089 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -93,10 +93,21 @@ jobs: cp _tests/net8.0/linux-x64/publish/*.json _tests/ 2>/dev/null || true find _tests -name "Radarr.Test.Dummy" -exec chmod a+x {} \; - - name: Test with coverage + - name: Unit tests with coverage shell: bash run: ./test.sh Linux Unit Coverage + - name: Integration tests + shell: bash + run: | + mkdir -p bin + cp -r _output/net8.0/linux-x64/publish/* bin/ + chmod +x bin/Radarr + ./test.sh Linux Integration Test + # Integration tests may fail in CI without full environment setup + # Remove continue-on-error once tests are stable + continue-on-error: true + - name: Report test results uses: dorny/test-reporter@v2 if: always() diff --git a/frontend/src/Activity/Blocklist/BlocklistFilterModal.tsx b/frontend/src/Activity/Blocklist/BlocklistFilterModal.tsx index 62e9e4c0a3..7819bad7d2 100644 --- a/frontend/src/Activity/Blocklist/BlocklistFilterModal.tsx +++ b/frontend/src/Activity/Blocklist/BlocklistFilterModal.tsx @@ -27,7 +27,9 @@ interface BlocklistFilterModalProps { isOpen: boolean; } -export default function BlocklistFilterModal(props: Readonly) { +export default function BlocklistFilterModal( + props: Readonly +) { const sectionItems = useSelector(createBlocklistSelector()); const filterBuilderProps = useSelector(createFilterBuilderPropsSelector()); const customFilterType = 'blocklist'; diff --git a/frontend/src/Activity/History/HistoryEventTypeCell.tsx b/frontend/src/Activity/History/HistoryEventTypeCell.tsx index e78f659574..8aad02b41d 100644 --- a/frontend/src/Activity/History/HistoryEventTypeCell.tsx +++ b/frontend/src/Activity/History/HistoryEventTypeCell.tsx @@ -74,7 +74,10 @@ interface HistoryEventTypeCellProps { data: HistoryData; } -function HistoryEventTypeCell({ eventType, data }: Readonly) { +function HistoryEventTypeCell({ + eventType, + data, +}: Readonly) { const iconName = getIconName(eventType, data); const iconKind = getIconKind(eventType); const tooltip = getTooltip(eventType, data); diff --git a/frontend/src/Activity/History/HistoryFilterModal.tsx b/frontend/src/Activity/History/HistoryFilterModal.tsx index 66218c1c18..bf607039aa 100644 --- a/frontend/src/Activity/History/HistoryFilterModal.tsx +++ b/frontend/src/Activity/History/HistoryFilterModal.tsx @@ -27,7 +27,9 @@ interface HistoryFilterModalProps { isOpen: boolean; } -export default function HistoryFilterModal(props: Readonly) { +export default function HistoryFilterModal( + props: Readonly +) { const sectionItems = useSelector(createHistorySelector()); const filterBuilderProps = useSelector(createFilterBuilderPropsSelector()); const customFilterType = 'history'; diff --git a/frontend/src/Activity/Queue/QueueFilterModal.tsx b/frontend/src/Activity/Queue/QueueFilterModal.tsx index 7bdf399f96..464a6b97cb 100644 --- a/frontend/src/Activity/Queue/QueueFilterModal.tsx +++ b/frontend/src/Activity/Queue/QueueFilterModal.tsx @@ -27,7 +27,9 @@ interface QueueFilterModalProps { isOpen: boolean; } -export default function QueueFilterModal(props: Readonly) { +export default function QueueFilterModal( + props: Readonly +) { const sectionItems = useSelector(createQueueSelector()); const filterBuilderProps = useSelector(createFilterBuilderPropsSelector()); const customFilterType = 'queue'; diff --git a/frontend/src/App/State/AppSectionState.ts b/frontend/src/App/State/AppSectionState.ts index 34b5af597e..26f4e1be29 100644 --- a/frontend/src/App/State/AppSectionState.ts +++ b/frontend/src/App/State/AppSectionState.ts @@ -63,8 +63,7 @@ export interface AppSectionItemState { } export interface AppSectionProviderState - extends AppSectionDeleteState, - AppSectionSaveState { + extends AppSectionDeleteState, AppSectionSaveState { isFetching: boolean; isPopulated: boolean; isTesting?: boolean; diff --git a/frontend/src/App/State/BlocklistAppState.ts b/frontend/src/App/State/BlocklistAppState.ts index 004a30732e..70a40d8b6b 100644 --- a/frontend/src/App/State/BlocklistAppState.ts +++ b/frontend/src/App/State/BlocklistAppState.ts @@ -6,7 +6,8 @@ import AppSectionState, { } from './AppSectionState'; interface BlocklistAppState - extends AppSectionState, + extends + AppSectionState, AppSectionFilterState, PagedAppSectionState, TableAppSectionState { diff --git a/frontend/src/App/State/CalendarAppState.ts b/frontend/src/App/State/CalendarAppState.ts index 0fcf1692da..c0d9fa0ea2 100644 --- a/frontend/src/App/State/CalendarAppState.ts +++ b/frontend/src/App/State/CalendarAppState.ts @@ -15,8 +15,7 @@ interface CalendarOptions { } interface CalendarAppState - extends AppSectionState, - AppSectionFilterState { + extends AppSectionState, AppSectionFilterState { searchMissingCommandId: number | null; start: moment.Moment; end: moment.Moment; diff --git a/frontend/src/App/State/CustomFiltersAppState.ts b/frontend/src/App/State/CustomFiltersAppState.ts index 6ac4820c74..8939860c53 100644 --- a/frontend/src/App/State/CustomFiltersAppState.ts +++ b/frontend/src/App/State/CustomFiltersAppState.ts @@ -4,7 +4,6 @@ import AppSectionState, { import { CustomFilter } from './AppState'; interface CustomFiltersAppState - extends AppSectionState, - AppSectionDeleteState {} + extends AppSectionState, AppSectionDeleteState {} export default CustomFiltersAppState; diff --git a/frontend/src/App/State/HistoryAppState.ts b/frontend/src/App/State/HistoryAppState.ts index fd2bf01062..93d71505e4 100644 --- a/frontend/src/App/State/HistoryAppState.ts +++ b/frontend/src/App/State/HistoryAppState.ts @@ -8,7 +8,8 @@ import History from 'typings/History'; export type MovieHistoryAppState = AppSectionState; interface HistoryAppState - extends AppSectionState, + extends + AppSectionState, AppSectionFilterState, PagedAppSectionState, TableAppSectionState {} diff --git a/frontend/src/App/State/MovieCollectionAppState.ts b/frontend/src/App/State/MovieCollectionAppState.ts index 6e32527850..9ac423a040 100644 --- a/frontend/src/App/State/MovieCollectionAppState.ts +++ b/frontend/src/App/State/MovieCollectionAppState.ts @@ -6,7 +6,8 @@ import AppSectionState, { import MovieCollection from 'typings/MovieCollection'; interface MovieCollectionAppState - extends AppSectionState, + extends + AppSectionState, AppSectionFilterState, AppSectionSaveState { itemMap: Record; diff --git a/frontend/src/App/State/MovieFilesAppState.ts b/frontend/src/App/State/MovieFilesAppState.ts index 2821e91128..a29434b6c8 100644 --- a/frontend/src/App/State/MovieFilesAppState.ts +++ b/frontend/src/App/State/MovieFilesAppState.ts @@ -4,7 +4,6 @@ import AppSectionState, { import { MovieFile } from 'MovieFile/MovieFile'; interface MovieFilesAppState - extends AppSectionState, - AppSectionDeleteState {} + extends AppSectionState, AppSectionDeleteState {} export default MovieFilesAppState; diff --git a/frontend/src/App/State/MoviesAppState.ts b/frontend/src/App/State/MoviesAppState.ts index d9b78d8cab..e8d6db03d9 100644 --- a/frontend/src/App/State/MoviesAppState.ts +++ b/frontend/src/App/State/MoviesAppState.ts @@ -56,9 +56,7 @@ export interface MovieIndexAppState { } interface MoviesAppState - extends AppSectionState, - AppSectionDeleteState, - AppSectionSaveState { + extends AppSectionState, AppSectionDeleteState, AppSectionSaveState { itemMap: Record; deleteOptions: { diff --git a/frontend/src/App/State/QueueAppState.ts b/frontend/src/App/State/QueueAppState.ts index cde6131755..c905704f8a 100644 --- a/frontend/src/App/State/QueueAppState.ts +++ b/frontend/src/App/State/QueueAppState.ts @@ -22,7 +22,8 @@ export interface QueueDetailsAppState extends AppSectionState { } export interface QueuePagedAppState - extends AppSectionState, + extends + AppSectionState, AppSectionFilterState, PagedAppSectionState, TableAppSectionState { diff --git a/frontend/src/App/State/ReleasesAppState.ts b/frontend/src/App/State/ReleasesAppState.ts index 350f6eac8e..55db0416e6 100644 --- a/frontend/src/App/State/ReleasesAppState.ts +++ b/frontend/src/App/State/ReleasesAppState.ts @@ -4,7 +4,6 @@ import AppSectionState, { import Release from 'typings/Release'; interface ReleasesAppState - extends AppSectionState, - AppSectionFilterState {} + extends AppSectionState, AppSectionFilterState {} export default ReleasesAppState; diff --git a/frontend/src/App/State/RootFolderAppState.ts b/frontend/src/App/State/RootFolderAppState.ts index 9e636c95f4..b28c19ba93 100644 --- a/frontend/src/App/State/RootFolderAppState.ts +++ b/frontend/src/App/State/RootFolderAppState.ts @@ -5,7 +5,8 @@ import AppSectionState, { import RootFolder from 'typings/RootFolder'; interface RootFolderAppState - extends AppSectionState, + extends + AppSectionState, AppSectionDeleteState, AppSectionSaveState {} diff --git a/frontend/src/App/State/SettingsAppState.ts b/frontend/src/App/State/SettingsAppState.ts index a970afb8be..7042fe6ce0 100644 --- a/frontend/src/App/State/SettingsAppState.ts +++ b/frontend/src/App/State/SettingsAppState.ts @@ -32,44 +32,46 @@ type Presets = T & { }; export interface AutoTaggingAppState - extends AppSectionState, + extends + AppSectionState, AppSectionDeleteState, AppSectionSaveState {} export interface AutoTaggingSpecificationAppState - extends AppSectionState, + extends + AppSectionState, AppSectionDeleteState, AppSectionSaveState, AppSectionSchemaState {} export interface DelayProfileAppState - extends AppSectionState, + extends + AppSectionState, AppSectionDeleteState, AppSectionSaveState {} export interface DownloadClientAppState - extends AppSectionState, + extends + AppSectionState, AppSectionDeleteState, AppSectionSaveState { isTestingAll: boolean; } export interface GeneralAppState - extends AppSectionItemState, - AppSectionSaveState {} + extends AppSectionItemState, AppSectionSaveState {} export interface MediaManagementAppState - extends AppSectionItemState, - AppSectionSaveState {} + extends AppSectionItemState, AppSectionSaveState {} export interface NamingAppState - extends AppSectionItemState, - AppSectionSaveState {} + extends AppSectionItemState, AppSectionSaveState {} export type NamingExamplesAppState = AppSectionItemState; export interface ImportListAppState - extends AppSectionState, + extends + AppSectionState, AppSectionDeleteState, AppSectionSaveState, AppSectionSchemaState> { @@ -77,11 +79,11 @@ export interface ImportListAppState } export interface IndexerOptionsAppState - extends AppSectionItemState, - AppSectionSaveState {} + extends AppSectionItemState, AppSectionSaveState {} export interface IndexerAppState - extends AppSectionState, + extends + AppSectionState, AppSectionDeleteState, AppSectionSaveState, AppSectionSchemaState> { @@ -89,30 +91,30 @@ export interface IndexerAppState } export interface NotificationAppState - extends AppSectionState, - AppSectionDeleteState {} + extends AppSectionState, AppSectionDeleteState {} export interface QualityProfilesAppState - extends AppSectionState, + extends + AppSectionState, AppSectionItemSchemaState {} export interface ReleaseProfilesAppState - extends AppSectionState, - AppSectionSaveState { + extends AppSectionState, AppSectionSaveState { pendingChanges: Partial; } export interface CustomFormatAppState - extends AppSectionState, + extends + AppSectionState, AppSectionDeleteState, AppSectionSaveState {} export interface ImportListOptionsSettingsAppState - extends AppSectionItemState, - AppSectionSaveState {} + extends AppSectionItemState, AppSectionSaveState {} export interface ImportListExclusionsSettingsAppState - extends AppSectionState, + extends + AppSectionState, AppSectionSaveState, PagedAppSectionState, AppSectionDeleteState { diff --git a/frontend/src/App/State/TagsAppState.ts b/frontend/src/App/State/TagsAppState.ts index 9b66303316..1b9060c3e1 100644 --- a/frontend/src/App/State/TagsAppState.ts +++ b/frontend/src/App/State/TagsAppState.ts @@ -21,7 +21,8 @@ export interface TagDetail extends ModelBase { } export interface TagDetailAppState - extends AppSectionState, + extends + AppSectionState, AppSectionDeleteState, AppSectionSaveState {} diff --git a/frontend/src/App/State/WantedAppState.ts b/frontend/src/App/State/WantedAppState.ts index ef63a8d38f..89cd5dd970 100644 --- a/frontend/src/App/State/WantedAppState.ts +++ b/frontend/src/App/State/WantedAppState.ts @@ -10,13 +10,15 @@ interface WantedMovie extends Movie { } interface WantedCutoffUnmetAppState - extends AppSectionState, + extends + AppSectionState, AppSectionFilterState, PagedAppSectionState, TableAppSectionState {} interface WantedMissingAppState - extends AppSectionState, + extends + AppSectionState, AppSectionFilterState, PagedAppSectionState, TableAppSectionState {} diff --git a/frontend/src/Calendar/CalendarFilterModal.tsx b/frontend/src/Calendar/CalendarFilterModal.tsx index cf7800b39b..fa31e6797c 100644 --- a/frontend/src/Calendar/CalendarFilterModal.tsx +++ b/frontend/src/Calendar/CalendarFilterModal.tsx @@ -27,7 +27,9 @@ interface CalendarFilterModalProps { isOpen: boolean; } -export default function CalendarFilterModal(props: Readonly) { +export default function CalendarFilterModal( + props: Readonly +) { const sectionItems = useSelector(createCalendarSelector()); const filterBuilderProps = useSelector(createFilterBuilderPropsSelector()); const customFilterType = 'calendar'; diff --git a/frontend/src/Calendar/Header/CalendarHeaderViewButton.tsx b/frontend/src/Calendar/Header/CalendarHeaderViewButton.tsx index d75943668f..4c5b812a83 100644 --- a/frontend/src/Calendar/Header/CalendarHeaderViewButton.tsx +++ b/frontend/src/Calendar/Header/CalendarHeaderViewButton.tsx @@ -3,8 +3,10 @@ import { CalendarView } from 'Calendar/calendarViews'; import Button, { ButtonProps } from 'Components/Link/Button'; import titleCase from 'Utilities/String/titleCase'; -interface CalendarHeaderViewButtonProps - extends Omit { +interface CalendarHeaderViewButtonProps extends Omit< + ButtonProps, + 'children' | 'onPress' +> { view: CalendarView; selectedView: CalendarView; onPress: (view: CalendarView) => void; diff --git a/frontend/src/Collection/AddNewMovieCollectionMovieModal.tsx b/frontend/src/Collection/AddNewMovieCollectionMovieModal.tsx index 261f1ff8dc..c98f1bd0cb 100644 --- a/frontend/src/Collection/AddNewMovieCollectionMovieModal.tsx +++ b/frontend/src/Collection/AddNewMovieCollectionMovieModal.tsx @@ -7,8 +7,7 @@ import AddNewMovieCollectionMovieModalContent, { AddNewMovieCollectionMovieModalContentProps, } from './AddNewMovieCollectionMovieModalContent'; -interface AddNewCollectionMovieModalProps - extends AddNewMovieCollectionMovieModalContentProps { +interface AddNewCollectionMovieModalProps extends AddNewMovieCollectionMovieModalContentProps { isOpen: boolean; } diff --git a/frontend/src/Collection/Edit/EditMovieCollectionModal.tsx b/frontend/src/Collection/Edit/EditMovieCollectionModal.tsx index 207a69affc..be029e7661 100644 --- a/frontend/src/Collection/Edit/EditMovieCollectionModal.tsx +++ b/frontend/src/Collection/Edit/EditMovieCollectionModal.tsx @@ -6,8 +6,7 @@ import EditMovieCollectionModalContent, { EditMovieCollectionModalContentProps, } from './EditMovieCollectionModalContent'; -interface EditMovieCollectionModalProps - extends EditMovieCollectionModalContentProps { +interface EditMovieCollectionModalProps extends EditMovieCollectionModalContentProps { isOpen: boolean; } diff --git a/frontend/src/Components/DescriptionList/DescriptionListItemTitle.tsx b/frontend/src/Components/DescriptionList/DescriptionListItemTitle.tsx index f4b137a4eb..01a9644e64 100644 --- a/frontend/src/Components/DescriptionList/DescriptionListItemTitle.tsx +++ b/frontend/src/Components/DescriptionList/DescriptionListItemTitle.tsx @@ -6,7 +6,9 @@ export interface DescriptionListItemTitleProps { children?: ReactNode; } -function DescriptionListItemTitle(props: Readonly) { +function DescriptionListItemTitle( + props: Readonly +) { const { className = styles.title, children } = props; return
{children}
; diff --git a/frontend/src/Components/FieldSet.tsx b/frontend/src/Components/FieldSet.tsx index 791b603a86..e4baa4ca80 100644 --- a/frontend/src/Components/FieldSet.tsx +++ b/frontend/src/Components/FieldSet.tsx @@ -10,7 +10,11 @@ interface FieldSetProps { children?: React.ReactNode; } -function FieldSet({ size = sizes.MEDIUM, legend, children }: Readonly) { +function FieldSet({ + size = sizes.MEDIUM, + legend, + children, +}: Readonly) { return (
void; } -function FileBrowserModalContent(props: Readonly) { +function FileBrowserModalContent( + props: Readonly +) { const { name, value, includeFiles = true, onChange, onModalClose } = props; const dispatch = useDispatch(); diff --git a/frontend/src/Components/Filter/Builder/LanguageFilterBuilderRowValue.tsx b/frontend/src/Components/Filter/Builder/LanguageFilterBuilderRowValue.tsx index 01daeda274..0feb593a55 100644 --- a/frontend/src/Components/Filter/Builder/LanguageFilterBuilderRowValue.tsx +++ b/frontend/src/Components/Filter/Builder/LanguageFilterBuilderRowValue.tsx @@ -4,7 +4,9 @@ import createLanguagesSelector from 'Store/Selectors/createLanguagesSelector'; import FilterBuilderRowValue from './FilterBuilderRowValue'; import FilterBuilderRowValueProps from './FilterBuilderRowValueProps'; -function LanguageFilterBuilderRowValue(props: Readonly) { +function LanguageFilterBuilderRowValue( + props: Readonly +) { const { items } = useSelector(createLanguagesSelector()); return ; diff --git a/frontend/src/Components/Filter/Builder/MovieFilterBuilderRowValue.tsx b/frontend/src/Components/Filter/Builder/MovieFilterBuilderRowValue.tsx index 0b658687a1..dc877bab7e 100644 --- a/frontend/src/Components/Filter/Builder/MovieFilterBuilderRowValue.tsx +++ b/frontend/src/Components/Filter/Builder/MovieFilterBuilderRowValue.tsx @@ -6,7 +6,9 @@ import sortByProp from 'Utilities/Array/sortByProp'; import FilterBuilderRowValue from './FilterBuilderRowValue'; import FilterBuilderRowValueProps from './FilterBuilderRowValueProps'; -function MovieFilterBuilderRowValue(props: Readonly) { +function MovieFilterBuilderRowValue( + props: Readonly +) { const allMovies: Movie[] = useSelector(createAllMoviesSelector()); const tagList = allMovies diff --git a/frontend/src/Components/Filter/Builder/QueueStatusFilterBuilderRowValue.tsx b/frontend/src/Components/Filter/Builder/QueueStatusFilterBuilderRowValue.tsx index d5ea15b73f..8a88b837dd 100644 --- a/frontend/src/Components/Filter/Builder/QueueStatusFilterBuilderRowValue.tsx +++ b/frontend/src/Components/Filter/Builder/QueueStatusFilterBuilderRowValue.tsx @@ -60,7 +60,9 @@ const statusTagList = [ }, ]; -function QueueStatusFilterBuilderRowValue(props: Readonly) { +function QueueStatusFilterBuilderRowValue( + props: Readonly +) { return ; } diff --git a/frontend/src/Components/Form/AutoSuggestInput.tsx b/frontend/src/Components/Form/AutoSuggestInput.tsx index b3a7c31b0f..312fb0945d 100644 --- a/frontend/src/Components/Form/AutoSuggestInput.tsx +++ b/frontend/src/Components/Form/AutoSuggestInput.tsx @@ -25,8 +25,10 @@ import usePrevious from 'Helpers/Hooks/usePrevious'; import { InputChanged } from 'typings/inputs'; import styles from './AutoSuggestInput.css'; -interface AutoSuggestInputProps - extends Omit, 'renderInputComponent' | 'inputProps'> { +interface AutoSuggestInputProps extends Omit< + AutosuggestPropsBase, + 'renderInputComponent' | 'inputProps' +> { forwardedRef?: MutableRefObject | null>; className?: string; inputContainerClassName?: string; diff --git a/frontend/src/Components/Form/FormInputGroup.tsx b/frontend/src/Components/Form/FormInputGroup.tsx index 5a4136687e..2ce93775dd 100644 --- a/frontend/src/Components/Form/FormInputGroup.tsx +++ b/frontend/src/Components/Form/FormInputGroup.tsx @@ -90,65 +90,68 @@ const componentMap: Record = { type PickProps = C extends 'text' ? TextInputProps : C extends 'autoComplete' - ? AutoCompleteInputProps - : C extends 'availabilitySelect' - ? AvailabilitySelectInputProps - : C extends 'captcha' - ? CaptchaInputProps - : C extends 'check' - ? CheckInputProps - : C extends 'date' - ? TextInputProps - : C extends 'device' - ? DeviceInputProps - : C extends 'downloadClientSelect' - ? DownloadClientSelectInputProps - : C extends 'dynamicSelect' - ? ProviderOptionSelectInputProps - : C extends 'file' - ? TextInputProps - : C extends 'float' - ? TextInputProps - : C extends 'indexerFlagsSelect' - ? IndexerFlagsSelectInputProps - : C extends 'indexerSelect' - ? IndexerSelectInputProps - : C extends 'keyValueList' - ? KeyValueListInputProps - : C extends 'languageSelect' - ? LanguageSelectInputProps - : C extends 'monitorMoviesSelect' - ? MonitorMoviesSelectInputProps - : C extends 'movieTag' - ? MovieTagInputProps - : C extends 'number' - ? NumberInputProps - : C extends 'oauth' - ? OAuthInputProps - : C extends 'password' - ? TextInputProps - : C extends 'path' - ? PathInputProps - : C extends 'qualityProfileSelect' - ? QualityProfileSelectInputProps - : C extends 'rootFolderSelect' - ? RootFolderSelectInputProps - : C extends 'select' - ? // eslint-disable-next-line @typescript-eslint/no-explicit-any - EnhancedSelectInputProps - : C extends 'tag' - ? MovieTagInputProps - : C extends 'tagSelect' - ? TagSelectInputProps - : C extends 'text' - ? TextInputProps - : C extends 'textArea' - ? TextAreaProps - : C extends 'textTag' - ? TextTagInputProps - : C extends 'umask' - ? UMaskInputProps - : never; + ? AutoCompleteInputProps + : C extends 'availabilitySelect' + ? AvailabilitySelectInputProps + : C extends 'captcha' + ? CaptchaInputProps + : C extends 'check' + ? CheckInputProps + : C extends 'date' + ? TextInputProps + : C extends 'device' + ? DeviceInputProps + : C extends 'downloadClientSelect' + ? DownloadClientSelectInputProps + : C extends 'dynamicSelect' + ? ProviderOptionSelectInputProps + : C extends 'file' + ? TextInputProps + : C extends 'float' + ? TextInputProps + : C extends 'indexerFlagsSelect' + ? IndexerFlagsSelectInputProps + : C extends 'indexerSelect' + ? IndexerSelectInputProps + : C extends 'keyValueList' + ? KeyValueListInputProps + : C extends 'languageSelect' + ? LanguageSelectInputProps + : C extends 'monitorMoviesSelect' + ? MonitorMoviesSelectInputProps + : C extends 'movieTag' + ? MovieTagInputProps + : C extends 'number' + ? NumberInputProps + : C extends 'oauth' + ? OAuthInputProps + : C extends 'password' + ? TextInputProps + : C extends 'path' + ? PathInputProps + : C extends 'qualityProfileSelect' + ? QualityProfileSelectInputProps + : C extends 'rootFolderSelect' + ? RootFolderSelectInputProps + : C extends 'select' + ? EnhancedSelectInputProps< + // eslint-disable-next-line @typescript-eslint/no-explicit-any + any, + V + > + : C extends 'tag' + ? MovieTagInputProps + : C extends 'tagSelect' + ? TagSelectInputProps + : C extends 'text' + ? TextInputProps + : C extends 'textArea' + ? TextAreaProps + : C extends 'textTag' + ? TextTagInputProps + : C extends 'umask' + ? UMaskInputProps + : never; export interface FormInputGroupValues { key: T; diff --git a/frontend/src/Components/Form/NumberInput.tsx b/frontend/src/Components/Form/NumberInput.tsx index d4e2a26833..5aae884462 100644 --- a/frontend/src/Components/Form/NumberInput.tsx +++ b/frontend/src/Components/Form/NumberInput.tsx @@ -24,8 +24,10 @@ function parseValue( return newValue; } -export interface NumberInputProps - extends Omit { +export interface NumberInputProps extends Omit< + TextInputProps, + 'value' | 'onChange' +> { value?: number | null; min?: number; max?: number; diff --git a/frontend/src/Components/Form/Select/AvailabilitySelectInput.tsx b/frontend/src/Components/Form/Select/AvailabilitySelectInput.tsx index a0a6d93540..541ff756cd 100644 --- a/frontend/src/Components/Form/Select/AvailabilitySelectInput.tsx +++ b/frontend/src/Components/Form/Select/AvailabilitySelectInput.tsx @@ -5,11 +5,10 @@ import EnhancedSelectInput, { EnhancedSelectInputValue, } from './EnhancedSelectInput'; -export interface AvailabilitySelectInputProps - extends Omit< - EnhancedSelectInputProps, string>, - 'values' - > { +export interface AvailabilitySelectInputProps extends Omit< + EnhancedSelectInputProps, string>, + 'values' +> { includeNoChange?: boolean; includeNoChangeDisabled?: boolean; includeMixed?: boolean; @@ -42,7 +41,9 @@ const movieAvailabilityOptions: IMovieAvailabilityOption[] = [ }, ]; -function AvailabilitySelectInput(props: Readonly) { +function AvailabilitySelectInput( + props: Readonly +) { const { includeNoChange = false, includeNoChangeDisabled = true, diff --git a/frontend/src/Components/Form/Select/DownloadClientSelectInput.tsx b/frontend/src/Components/Form/Select/DownloadClientSelectInput.tsx index 42c99e4dc2..bc50b5a6cd 100644 --- a/frontend/src/Components/Form/Select/DownloadClientSelectInput.tsx +++ b/frontend/src/Components/Form/Select/DownloadClientSelectInput.tsx @@ -51,11 +51,10 @@ function createDownloadClientsSelector( ); } -export interface DownloadClientSelectInputProps - extends Omit< - EnhancedSelectInputProps, number>, - 'values' - > { +export interface DownloadClientSelectInputProps extends Omit< + EnhancedSelectInputProps, number>, + 'values' +> { name: string; value: number; includeAny?: boolean; diff --git a/frontend/src/Components/Form/Select/EnhancedSelectInput.tsx b/frontend/src/Components/Form/Select/EnhancedSelectInput.tsx index abf6a34a79..939ed396e1 100644 --- a/frontend/src/Components/Form/Select/EnhancedSelectInput.tsx +++ b/frontend/src/Components/Form/Select/EnhancedSelectInput.tsx @@ -119,7 +119,7 @@ export interface EnhancedSelectInputValue { export interface EnhancedSelectInputProps< T extends EnhancedSelectInputValue, - V + V, > { className?: string; disabledClassName?: string; diff --git a/frontend/src/Components/Form/Select/HintedSelectInputOption.tsx b/frontend/src/Components/Form/Select/HintedSelectInputOption.tsx index 9aa61869ce..525a315e57 100644 --- a/frontend/src/Components/Form/Select/HintedSelectInputOption.tsx +++ b/frontend/src/Components/Form/Select/HintedSelectInputOption.tsx @@ -5,15 +5,19 @@ import EnhancedSelectInputOption, { } from './EnhancedSelectInputOption'; import styles from './HintedSelectInputOption.css'; -interface HintedSelectInputOptionProps - extends Omit { +interface HintedSelectInputOptionProps extends Omit< + EnhancedSelectInputOptionProps, + 'isSelected' +> { value: string; hint?: React.ReactNode; dividerAfter?: boolean; isSelected?: boolean; } -function HintedSelectInputOption(props: Readonly) { +function HintedSelectInputOption( + props: Readonly +) { const { id, value, diff --git a/frontend/src/Components/Form/Select/HintedSelectInputSelectedValue.tsx b/frontend/src/Components/Form/Select/HintedSelectInputSelectedValue.tsx index 7c4cba1154..68aff3d67a 100644 --- a/frontend/src/Components/Form/Select/HintedSelectInputSelectedValue.tsx +++ b/frontend/src/Components/Form/Select/HintedSelectInputSelectedValue.tsx @@ -15,7 +15,7 @@ interface HintedSelectInputSelectedValueProps { function HintedSelectInputSelectedValue< T extends EnhancedSelectInputValue, - V extends number | string + V extends number | string, >(props: HintedSelectInputSelectedValueProps) { const { selectedValue, diff --git a/frontend/src/Components/Form/Select/MonitorMoviesSelectInput.tsx b/frontend/src/Components/Form/Select/MonitorMoviesSelectInput.tsx index 6ca79850dd..b9ed2c0738 100644 --- a/frontend/src/Components/Form/Select/MonitorMoviesSelectInput.tsx +++ b/frontend/src/Components/Form/Select/MonitorMoviesSelectInput.tsx @@ -6,16 +6,17 @@ import EnhancedSelectInput, { EnhancedSelectInputValue, } from './EnhancedSelectInput'; -export interface MonitorMoviesSelectInputProps - extends Omit< - EnhancedSelectInputProps, string>, - 'values' - > { +export interface MonitorMoviesSelectInputProps extends Omit< + EnhancedSelectInputProps, string>, + 'values' +> { includeNoChange?: boolean; includeMixed?: boolean; } -function MonitorMoviesSelectInput(props: Readonly) { +function MonitorMoviesSelectInput( + props: Readonly +) { const { includeNoChange = false, includeMixed = false, diff --git a/frontend/src/Components/Form/Select/ProviderOptionSelectInput.tsx b/frontend/src/Components/Form/Select/ProviderOptionSelectInput.tsx index 1f5fffe4cc..4997b82e38 100644 --- a/frontend/src/Components/Form/Select/ProviderOptionSelectInput.tsx +++ b/frontend/src/Components/Form/Select/ProviderOptionSelectInput.tsx @@ -69,11 +69,10 @@ function createProviderOptionsSelector( ); } -export interface ProviderOptionSelectInputProps - extends Omit< - EnhancedSelectInputProps, unknown>, - 'values' - > { +export interface ProviderOptionSelectInputProps extends Omit< + EnhancedSelectInputProps, unknown>, + 'values' +> { provider: string; providerData: ProviderOptions; name: string; diff --git a/frontend/src/Components/Form/Select/QualityProfileSelectInput.tsx b/frontend/src/Components/Form/Select/QualityProfileSelectInput.tsx index b31af8768e..e4a844c7df 100644 --- a/frontend/src/Components/Form/Select/QualityProfileSelectInput.tsx +++ b/frontend/src/Components/Form/Select/QualityProfileSelectInput.tsx @@ -56,14 +56,13 @@ function createQualityProfilesSelector( ); } -export interface QualityProfileSelectInputProps - extends Omit< - EnhancedSelectInputProps< - EnhancedSelectInputValue, - number | string - >, - 'values' - > { +export interface QualityProfileSelectInputProps extends Omit< + EnhancedSelectInputProps< + EnhancedSelectInputValue, + number | string + >, + 'values' +> { name: string; includeNoChange?: boolean; includeNoChangeDisabled?: boolean; diff --git a/frontend/src/Components/Form/Select/RootFolderSelectInput.tsx b/frontend/src/Components/Form/Select/RootFolderSelectInput.tsx index 92064405a8..2c64fe1078 100644 --- a/frontend/src/Components/Form/Select/RootFolderSelectInput.tsx +++ b/frontend/src/Components/Form/Select/RootFolderSelectInput.tsx @@ -19,17 +19,15 @@ import RootFolderSelectInputSelectedValue from './RootFolderSelectInputSelectedV const ADD_NEW_KEY = 'addNew'; -export interface RootFolderSelectInputValue - extends EnhancedSelectInputValue { +export interface RootFolderSelectInputValue extends EnhancedSelectInputValue { freeSpace?: number; isMissing?: boolean; } -export interface RootFolderSelectInputProps - extends Omit< - EnhancedSelectInputProps, string>, - 'value' | 'values' - > { +export interface RootFolderSelectInputProps extends Omit< + EnhancedSelectInputProps, string>, + 'value' | 'values' +> { name: string; value?: string; includeMissingValue?: boolean; diff --git a/frontend/src/Components/Form/Select/RootFolderSelectInputOption.tsx b/frontend/src/Components/Form/Select/RootFolderSelectInputOption.tsx index e7856ccd45..7524e5d474 100644 --- a/frontend/src/Components/Form/Select/RootFolderSelectInputOption.tsx +++ b/frontend/src/Components/Form/Select/RootFolderSelectInputOption.tsx @@ -7,8 +7,7 @@ import EnhancedSelectInputOption, { } from './EnhancedSelectInputOption'; import styles from './RootFolderSelectInputOption.css'; -interface RootFolderSelectInputOptionProps - extends EnhancedSelectInputOptionProps { +interface RootFolderSelectInputOptionProps extends EnhancedSelectInputOptionProps { id: string; value: string; freeSpace?: number; diff --git a/frontend/src/Components/Form/SelectInput.tsx b/frontend/src/Components/Form/SelectInput.tsx index c3a1240769..9490da7db4 100644 --- a/frontend/src/Components/Form/SelectInput.tsx +++ b/frontend/src/Components/Form/SelectInput.tsx @@ -8,8 +8,10 @@ import React, { import { InputChanged } from 'typings/inputs'; import styles from './SelectInput.css'; -export interface SelectInputOption - extends Pick, 'disabled'> { +export interface SelectInputOption extends Pick< + ComponentProps<'option'>, + 'disabled' +> { key: string | number; value: string | number | (() => string | number); } diff --git a/frontend/src/Components/Form/Tag/TextTagInput.tsx b/frontend/src/Components/Form/Tag/TextTagInput.tsx index f601c98091..cd5e29c5f2 100644 --- a/frontend/src/Components/Form/Tag/TextTagInput.tsx +++ b/frontend/src/Components/Form/Tag/TextTagInput.tsx @@ -8,11 +8,10 @@ interface TextTag extends TagBase { name: string; } -export interface TextTagInputProps - extends Omit< - TagInputProps, - 'tags' | 'tagList' | 'onTagAdd' | 'onTagDelete' - > { +export interface TextTagInputProps extends Omit< + TagInputProps, + 'tags' | 'tagList' | 'onTagAdd' | 'onTagDelete' +> { name: string; value: string | string[]; onChange: (change: InputChanged) => unknown; diff --git a/frontend/src/Components/Icon.tsx b/frontend/src/Components/Icon.tsx index 622f77aae6..9889e2868b 100644 --- a/frontend/src/Components/Icon.tsx +++ b/frontend/src/Components/Icon.tsx @@ -11,11 +11,10 @@ import styles from './Icon.css'; export type IconName = FontAwesomeIconProps['icon']; export type IconKind = Extract; -export interface IconProps - extends Omit< - FontAwesomeIconProps, - 'icon' | 'spin' | 'name' | 'title' | 'size' - > { +export interface IconProps extends Omit< + FontAwesomeIconProps, + 'icon' | 'spin' | 'name' | 'title' | 'size' +> { containerClassName?: ComponentProps<'span'>['className']; name: IconName; kind?: IconKind; diff --git a/frontend/src/Components/Link/IconButton.tsx b/frontend/src/Components/Link/IconButton.tsx index 3cba9fbfd2..82ed2fb40c 100644 --- a/frontend/src/Components/Link/IconButton.tsx +++ b/frontend/src/Components/Link/IconButton.tsx @@ -6,7 +6,8 @@ import Link, { LinkProps } from './Link'; import styles from './IconButton.css'; export interface IconButtonProps - extends Omit, + extends + Omit, Pick { iconClassName?: IconProps['className']; } diff --git a/frontend/src/Components/MediaTypeBadge.tsx b/frontend/src/Components/MediaTypeBadge.tsx index 3d4d0fa6c0..110cea48bf 100644 --- a/frontend/src/Components/MediaTypeBadge.tsx +++ b/frontend/src/Components/MediaTypeBadge.tsx @@ -33,7 +33,10 @@ function getLabelForMediaType(mediaType?: MediaType) { } } -function MediaTypeBadge({ mediaType, className }: Readonly) { +function MediaTypeBadge({ + mediaType, + className, +}: Readonly) { return (