diff --git a/.oxlintrc.jsonc b/.oxlintrc.jsonc index 60a4be73..4f74228b 100644 --- a/.oxlintrc.jsonc +++ b/.oxlintrc.jsonc @@ -132,6 +132,9 @@ "prefer-template": "error", "prefer-exponentiation-operator": "error", "prefer-object-spread": "error", + "arrow-body-style": ["error", "as-needed"], + "prefer-destructuring": "error", + "no-nested-ternary": "error", "prefer-promise-reject-errors": [ "error", { diff --git a/src/base/hooks/useBackButton.ts b/src/base/hooks/useBackButton.ts index bce5819c..bc7d0902 100644 --- a/src/base/hooks/useBackButton.ts +++ b/src/base/hooks/useBackButton.ts @@ -32,7 +32,7 @@ export const useBackButton = () => { return 0; } - const previousPage = historyToCheck.slice(-2)[0]; + const [previousPage] = historyToCheck.slice(-2); const isPreviousPageCurrentPage = previousPage === location.pathname; const ignorePreviousPage = PAGES_TO_IGNORE.some((page) => !!previousPage.match(page)); diff --git a/src/features/browse/sources/Sources.tsx b/src/features/browse/sources/Sources.tsx index 62650071..982c7a56 100644 --- a/src/features/browse/sources/Sources.tsx +++ b/src/features/browse/sources/Sources.tsx @@ -162,7 +162,7 @@ export function Sources({ tabsMenuHeight }: { tabsMenuHeight: number }) { ); }} itemContent={(index, groupIndex) => { - const language = sourcesByLanguage[groupIndex][0]; + const [language] = sourcesByLanguage[groupIndex]; const source = visibleSources[index]; return ( diff --git a/src/features/chapter/components/actions/ChaptersDownloadActionMenuItems.tsx b/src/features/chapter/components/actions/ChaptersDownloadActionMenuItems.tsx index c7b8b45d..584f0b29 100644 --- a/src/features/chapter/components/actions/ChaptersDownloadActionMenuItems.tsx +++ b/src/features/chapter/components/actions/ChaptersDownloadActionMenuItems.tsx @@ -86,7 +86,7 @@ const handleDownload = async ( return; } - const mangaId = mangaIds[0]; + const [mangaId] = mangaIds; const manga = Mangas.getFromCache( mangaId, gql` diff --git a/src/features/manga/hooks/useManageMangaLibraryState.tsx b/src/features/manga/hooks/useManageMangaLibraryState.tsx index 7ac1b0ee..98034d1e 100644 --- a/src/features/manga/hooks/useManageMangaLibraryState.tsx +++ b/src/features/manga/hooks/useManageMangaLibraryState.tsx @@ -86,8 +86,7 @@ export const useManageMangaLibraryState = ( let showAddToLibraryCategorySelectDialog: boolean; try { - showAddToLibraryCategorySelectDialog = (await getMetadataServerSettings()) - .showAddToLibraryCategorySelectDialog; + ({ showAddToLibraryCategorySelectDialog } = await getMetadataServerSettings()); } catch (e) { makeToast(t`Unable to load data`, 'error', getErrorMessage(e)); return; diff --git a/src/features/metadata/services/MetadataMigrations.ts b/src/features/metadata/services/MetadataMigrations.ts index 23a2021f..b115c31b 100644 --- a/src/features/metadata/services/MetadataMigrations.ts +++ b/src/features/metadata/services/MetadataMigrations.ts @@ -175,7 +175,7 @@ const getOutdatedMetadataKeys = (metadata: Metadata | undefined, migrationId: nu ); return Object.keys(metadata).filter((key) => { - const appKeyPrefixOfKey = key.split('_')[0]; + const [appKeyPrefixOfKey] = key.split('_'); const isMetadataKeyOfApp = [...oldAppKeyPrefixes, APP_METADATA_KEY_PREFIX].includes(appKeyPrefixOfKey); if (!isMetadataKeyOfApp) { @@ -367,7 +367,7 @@ export const applyMetadataMigrations = ( METADATA_MIGRATIONS.forEach((migration, index) => { const migrationId = index + 1; - const metadataToMigrate = migrationToMetadata[migrationId - 1][1]; + const [, metadataToMigrate] = migrationToMetadata[migrationId - 1]; const isMigrationRequired = appliedMigrationId < migrationId; if (!isMigrationRequired) { diff --git a/src/lib/Queue.ts b/src/lib/Queue.ts index 84af0dc4..bc9305c3 100644 --- a/src/lib/Queue.ts +++ b/src/lib/Queue.ts @@ -79,9 +79,9 @@ export class Queue { } private getNextItemToProcess(): { key: Key; fn: QueueItemFunction; promise: ControlledPromise } { - const [key] = [...this.pendingKeyToPriorityMap.entries()].toSorted( + const [[key]] = [...this.pendingKeyToPriorityMap.entries()].toSorted( ([, priorityA], [, priorityB]) => priorityB - priorityA, - )[0]; + ); const fn = this.pendingKeyToFnMap.get(key) as () => PromiseLike | T; const promise = this.pendingKeyToPromiseMap.get(key) as ControlledPromise; diff --git a/src/lib/zustand/ZustandUtil.ts b/src/lib/zustand/ZustandUtil.ts index b317ebdc..78b3386a 100644 --- a/src/lib/zustand/ZustandUtil.ts +++ b/src/lib/zustand/ZustandUtil.ts @@ -45,7 +45,7 @@ export class ZustandUtil { const fn = args[0] as (state: unknown) => unknown; selector = sliceKey !== undefined ? (state: State) => fn(state[sliceKey]) : fn; } else if (args.length === 1) { - const key = args[0]; + const [key] = args; selector = sliceKey !== undefined ? (state: State) => (state[sliceKey] as Record)[key as PropertyKey] @@ -66,7 +66,7 @@ export class ZustandUtil { static createActionName(...names: string[]) { const storeAndSlices = names.slice(0, -1); - const action = names.slice(-1)[0]; + const [action] = names.slice(-1); return `${storeAndSlices.join(':')}/${action}`; } diff --git a/tools/scripts/manga/generateMangaTypeTags.ts b/tools/scripts/manga/generateMangaTypeTags.ts index db8b23b2..d85d58fb 100644 --- a/tools/scripts/manga/generateMangaTypeTags.ts +++ b/tools/scripts/manga/generateMangaTypeTags.ts @@ -33,7 +33,7 @@ const extractTranslations = (poContent: string): Map => return translations; } - const msgId = msgIdMatch[1]; + const [, msgId] = msgIdMatch; if (!TARGET_MSG_IDS.has(msgId as MangaTypeMsgId)) { return translations; } diff --git a/tools/scripts/release/TranslationChangelog.utils.ts b/tools/scripts/release/TranslationChangelog.utils.ts index 4724b9ec..13c356fb 100644 --- a/tools/scripts/release/TranslationChangelog.utils.ts +++ b/tools/scripts/release/TranslationChangelog.utils.ts @@ -119,7 +119,7 @@ const doesLanguageOfChangeMeetTranslatePercentThreshold = ( stats: WeblateLanguageStatistic[], ): boolean => { // format: 'https://hosted.weblate.org/api/translations/suwayomi/suwayomi-webui/ar/' - const code = change.translation.split('/').slice(-2)[0]; + const [code] = change.translation.split('/').slice(-2); const langaugeStats = getWeblateLanguageStatsFor(code, stats); return meetsTranslatedPercentThreshold(langaugeStats.translated_percent); @@ -209,10 +209,10 @@ const getKnownContributorsByLanguage = async (): Promise = {}; changelogLanguageLines.forEach((languageLine) => { const languageChangeRegex = /^- (.*) \(by (.*)\)$/g; - const languageChangeRegexMatch = [...languageLine.matchAll(languageChangeRegex)][0]; + const [languageChangeRegexMatch] = [...languageLine.matchAll(languageChangeRegex)]; - const language = languageChangeRegexMatch[1]; - const contributors = languageChangeRegexMatch[2].split(', '); + const [, language, contributorsRaw] = languageChangeRegexMatch; + const contributors = contributorsRaw.split(', '); const knownContributors = contributorByLanguage[language] ?? []; contributorByLanguage[language] = [...new Set([...knownContributors, ...contributors])];