From fbdd50445349c9865cb0c52cf67d5fa94c9e688b Mon Sep 17 00:00:00 2001 From: FoxxMD Date: Thu, 9 Jul 2026 19:52:13 +0000 Subject: [PATCH] fxi: Fix linting rules related to functions and error causes --- .../common/database/drizzle/repositories/BaseRepository.ts | 2 +- src/backend/common/vendor/LastfmApiClient.ts | 3 ++- src/backend/scrobblers/AbstractScrobbleClient.ts | 1 + src/backend/sources/MPRISSource.ts | 3 +++ src/backend/sources/SpotifySource.ts | 3 ++- src/backend/tests/database/drizzle.test.ts | 4 +--- src/backend/utils/ValidationUtils.ts | 2 +- src/client/logs/LogsSection.tsx | 4 ++-- 8 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/backend/common/database/drizzle/repositories/BaseRepository.ts b/src/backend/common/database/drizzle/repositories/BaseRepository.ts index 149c2385..99bcfc59 100644 --- a/src/backend/common/database/drizzle/repositories/BaseRepository.ts +++ b/src/backend/common/database/drizzle/repositories/BaseRepository.ts @@ -46,7 +46,7 @@ export abstract class DrizzleBaseRepository { } async updateById(id: number, data: Partial): Promise { - assert(id !== null && id !== undefined, `${typeof id === null ? 'null' : 'undefined'} given for entity id`); + assert(id !== null && id !== undefined, `${id === null ? 'null' : 'undefined'} given for entity id`); await this.db.update(this.table).set(data).where(eq(this.table.id, id)); } diff --git a/src/backend/common/vendor/LastfmApiClient.ts b/src/backend/common/vendor/LastfmApiClient.ts index 982070b0..a5546a36 100644 --- a/src/backend/common/vendor/LastfmApiClient.ts +++ b/src/backend/common/vendor/LastfmApiClient.ts @@ -237,6 +237,7 @@ export default class LastfmApiClient extends AbstractApiClient implements Pagina return true; } catch (e) { const hint = e.error?.cause?.message ?? undefined; + // eslint-disable-next-line preserve-caught-error throw new Error(`Could not connect to ${this.upstreamName} API server${hint !== undefined ? ` (${hint})` : ''}`, { cause: e.error ?? e }); } } @@ -385,7 +386,7 @@ export default class LastfmApiClient extends AbstractApiClient implements Pagina } = resp; const correctedResp: Writeable = { ...restResp, - // @ts-expect-error + // @ts-expect-error this is fine recenttracks: { ...rest, track: [], diff --git a/src/backend/scrobblers/AbstractScrobbleClient.ts b/src/backend/scrobblers/AbstractScrobbleClient.ts index 0be341e5..f30ce159 100644 --- a/src/backend/scrobblers/AbstractScrobbleClient.ts +++ b/src/backend/scrobblers/AbstractScrobbleClient.ts @@ -1614,6 +1614,7 @@ export default abstract class AbstractScrobbleClient extends AbstractComponent i if(sourcePlayerData === undefined) { return; } + // eslint-disable-next-line prefer-const let [shouldUpdate, npUpdateTopReason] = this.shouldUpdatePlayingNow(sourcePlayerData); let clientReason: string | undefined; if(!shouldUpdate) { diff --git a/src/backend/sources/MPRISSource.ts b/src/backend/sources/MPRISSource.ts index f3559158..777649ae 100644 --- a/src/backend/sources/MPRISSource.ts +++ b/src/backend/sources/MPRISSource.ts @@ -183,6 +183,7 @@ export class MPRISSource extends MemorySource { // microseconds return dayjs.duration({milliseconds: Number(pos / 1000)}).asSeconds(); } catch(e) { + // eslint-disable-next-line preserve-caught-error throw new Error('Could not get player Position', {cause: convertDBusExceptionToError(e)}); } } @@ -192,6 +193,7 @@ export class MPRISSource extends MemorySource { const status = await props['PlaybackStatus']; return status as PlaybackStatus; } catch (e) { + // eslint-disable-next-line preserve-caught-error throw new Error('Could not get player PlaybackStatus', {cause: convertDBusExceptionToError(e)}) } } @@ -201,6 +203,7 @@ export class MPRISSource extends MemorySource { const metadata = await props['Metadata']; return this.metadataToPlain(metadata); } catch(e) { + // eslint-disable-next-line preserve-caught-error throw new Error('Could not get player Metadata', {cause: convertDBusExceptionToError(e)}); } } diff --git a/src/backend/sources/SpotifySource.ts b/src/backend/sources/SpotifySource.ts index a8301b8f..3292542b 100644 --- a/src/backend/sources/SpotifySource.ts +++ b/src/backend/sources/SpotifySource.ts @@ -40,6 +40,7 @@ import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; import { MemoryPositionalSource } from "./MemoryPositionalSource.ts"; import { baseFormatPlayObj } from "../utils/PlayTransformUtils.ts"; import { createGetScrobblesForTimeRangeFunc } from "../utils/ListenFetchUtils.ts"; +import { SimpleError } from "../common/errors/MSErrors.ts"; const scopes = ['user-read-recently-played', 'user-read-currently-playing', 'user-read-playback-state', 'user-read-playback-position']; const state = 'random'; @@ -550,7 +551,7 @@ export default class SpotifySource extends MemoryPositionalSource implements Pag const spotifyError = new UpstreamError('Spotify API call failed', {cause: e}); if (e.statusCode === 401 && !hasApiPermissionError(e)) { if (this.spotifyApi.getRefreshToken() === undefined) { - throw new Error('Access token was not valid and no refresh token was present') + throw new SimpleError('Access token was not valid and no refresh token was present', {cause: e}); } this.logger.debug('Access token was not valid, attempting to refresh'); diff --git a/src/backend/tests/database/drizzle.test.ts b/src/backend/tests/database/drizzle.test.ts index fcbf4c17..369cc80a 100644 --- a/src/backend/tests/database/drizzle.test.ts +++ b/src/backend/tests/database/drizzle.test.ts @@ -15,7 +15,6 @@ import { generatePlayWithLifecycle, generateRandomObj } from '../../../core/test import { formatNumber, generateArray } from '../../../core/DataUtils.ts'; import { objectsEqual } from '../../utils/DataUtils.ts'; import { eq, sql } from 'drizzle-orm'; -import { type PlaySelect } from '../../common/database/drizzle/drizzleTypes.ts'; import { loggerDebug } from '@foxxmd/logging'; import { transientDb } from '../utils/TransientTestUtils.ts'; import { getRoot } from '../../ioc.ts'; @@ -531,9 +530,8 @@ describe('Repository Operations', function () { fixtureCreatePlay({ componentId: component[0].id, play: generatePlay({}, {source: 'test2'}) }) ]).returning(); - let result: PlaySelect[]; // https://github.com/drizzle-team/drizzle-orm/discussions/938#discussioncomment-6542336 - result = await db.query.plays.findMany({ + const result = await db.query.plays.findMany({ where: { AND: [ { diff --git a/src/backend/utils/ValidationUtils.ts b/src/backend/utils/ValidationUtils.ts index e4c41cfb..8fa64b49 100644 --- a/src/backend/utils/ValidationUtils.ts +++ b/src/backend/utils/ValidationUtils.ts @@ -96,7 +96,7 @@ const getSchemaFunc = async () => { const module = await import(resolve(projectDir, schemaFuncPath)) schemaFetchFunc = module.getSchemaForType; } catch (e) { - throw new Error(`Could not load module from path: ${schemaFuncPath}`); + throw new Error(`Could not load module from path: ${schemaFuncPath}`, {cause: e}); } return schemaFetchFunc; } diff --git a/src/client/logs/LogsSection.tsx b/src/client/logs/LogsSection.tsx index 7f380bc4..fe8d2fe5 100644 --- a/src/client/logs/LogsSection.tsx +++ b/src/client/logs/LogsSection.tsx @@ -26,7 +26,7 @@ let list = createFixedList(50); interface LogLevelButtonProps { name: string, active: boolean, - onClick: Function + onClick: (val: number) => void } const LogLevelButton = (props: LogLevelButtonProps) => { const {name, active, onClick} = props; @@ -34,7 +34,7 @@ const LogLevelButton = (props: LogLevelButtonProps) => { const className = active ? "mx-1" : "capitalize underline cursor-pointer mx-1"; return {name.toUpperCase()}; } -const LogLimitButton = (props: {val: number, active: boolean, onClick: Function}) => { +const LogLimitButton = (props: {val: number, active: boolean, onClick: (val: number) => void}) => { const {val, active, onClick} = props; const click = useCallback(() => active ? null : onClick(val), [onClick, val, active]); const className = active ? "mx-1" : "capitalize underline cursor-pointer mx-1"; -- 2.51.2