From 6a677b6fe1151d3ed50386a9da996d5c9548d276 Mon Sep 17 00:00:00 2001 From: FoxxMD Date: Thu, 25 Sep 2025 15:40:47 +0000 Subject: [PATCH] refactor: Move transform typings to own file --- src/backend/common/AbstractComponent.ts | 15 ++--- src/backend/common/infrastructure/Atomic.ts | 56 ------------------- .../common/infrastructure/Transform.ts | 54 ++++++++++++++++++ .../infrastructure/config/client/index.ts | 2 +- .../infrastructure/config/source/index.ts | 3 +- .../scrobblers/AbstractScrobbleClient.ts | 3 +- src/backend/sources/AbstractSource.ts | 3 +- src/backend/sources/DeezerInternalSource.ts | 5 +- src/backend/tests/component/component.test.ts | 3 +- src/backend/utils/PlayTransformUtils.ts | 9 ++- 10 files changed, 80 insertions(+), 73 deletions(-) create mode 100644 src/backend/common/infrastructure/Transform.ts diff --git a/src/backend/common/AbstractComponent.ts b/src/backend/common/AbstractComponent.ts index 349195d1..62b0a944 100644 --- a/src/backend/common/AbstractComponent.ts +++ b/src/backend/common/AbstractComponent.ts @@ -13,19 +13,20 @@ import { } from "../utils/PlayTransformUtils.js"; import { hasNodeNetworkException } from "./errors/NodeErrors.js"; import { hasUpstreamError } from "./errors/UpstreamError.js"; -import { - ConditionalSearchAndReplaceRegExp, - PlayTransformParts, PlayTransformPartsArray, - PlayTransformRules, - TRANSFORM_HOOK, - TransformHook -} from "./infrastructure/Atomic.js"; import { CommonClientConfig } from "./infrastructure/config/client/index.js"; import { CommonSourceConfig } from "./infrastructure/config/source/index.js"; import play = Simulate.play; import { WebhookPayload } from "./infrastructure/config/health/webhooks.js"; import { AuthCheckError, BuildDataError, ConnectionCheckError, ParseCacheError, PostInitError, TransformRulesError } from "./errors/MSErrors.js"; import { messageWithCauses, messageWithCausesTruncatedDefault } from "../utils/ErrorUtils.js"; +import { + ConditionalSearchAndReplaceRegExp, + PlayTransformParts, + PlayTransformPartsArray, + PlayTransformRules, + TRANSFORM_HOOK, + TransformHook +} from "./infrastructure/Transform.js"; export default abstract class AbstractComponent { requiresAuth: boolean = false; diff --git a/src/backend/common/infrastructure/Atomic.ts b/src/backend/common/infrastructure/Atomic.ts index 7c55abab..01f675f0 100644 --- a/src/backend/common/infrastructure/Atomic.ts +++ b/src/backend/common/infrastructure/Atomic.ts @@ -1,5 +1,4 @@ import { Logger } from '@foxxmd/logging'; -import { SearchAndReplaceRegExp } from "@foxxmd/regex-buddy-core"; import { Dayjs } from "dayjs"; import { Request, Response } from "express"; import { NextFunction, ParamsDictionary, Query } from "express-serve-static-core"; @@ -299,61 +298,6 @@ export type AbstractApiOptions = Record & { logger: Logger } export type keyOmit = T & { [P in U]?: never } -export interface ConditionalSearchAndReplaceRegExp extends SearchAndReplaceRegExp{ - when?: WhenConditionsConfig -} - -export type ConditionalSearchAndReplaceTerm = Omit - -export type SearchAndReplaceTerm = string | ConditionalSearchAndReplaceTerm; - -export type PlayTransformParts = PlayTransformPartsAtomic & { when?: WhenConditionsConfig }; - -export type PlayTransformPartsArray = PlayTransformParts[]; - -export type PlayTransformPartsConfig = PlayTransformPartsArray | PlayTransformParts; - -export interface PlayTransformPartsAtomic { - title?: T - artists?: T - album?: T -} - -export interface PlayTransformHooksConfig { - preCompare?: PlayTransformPartsConfig - compare?: { - candidate?: PlayTransformPartsConfig - existing?: PlayTransformPartsConfig - } - postCompare?: PlayTransformPartsConfig -} - -export interface PlayTransformHooks extends PlayTransformHooksConfig { - preCompare?: PlayTransformPartsArray - compare?: { - candidate?: PlayTransformPartsArray - existing?: PlayTransformPartsArray - } - postCompare?: PlayTransformPartsArray -} - -export type PlayTransformRules = PlayTransformHooks - -export type TransformHook = 'preCompare' | 'compare' | 'candidate' | 'existing' | 'postCompare'; -export const TRANSFORM_HOOK = { - preCompare: 'preCompare' as TransformHook, - candidate: 'candidate' as TransformHook, - existing: 'existing' as TransformHook, - postCompare: 'postCompare' as TransformHook, -} -export type PlayTransformConfig = PlayTransformHooksConfig; -export type PlayTransformOptions = PlayTransformConfig & { log?: boolean | 'all' } - -export type WhenParts = PlayTransformPartsAtomic; - -export type WhenConditions = WhenParts[]; -export type WhenConditionsConfig = WhenConditions; - export type WithRequiredProperty = Type & { [Property in Key]-?: Type[Property]; }; diff --git a/src/backend/common/infrastructure/Transform.ts b/src/backend/common/infrastructure/Transform.ts new file mode 100644 index 00000000..2c4e3e20 --- /dev/null +++ b/src/backend/common/infrastructure/Transform.ts @@ -0,0 +1,54 @@ +import { SearchAndReplaceRegExp } from "@foxxmd/regex-buddy-core"; + +export interface ConditionalSearchAndReplaceRegExp extends SearchAndReplaceRegExp { + when?: WhenConditionsConfig +} + +export type ConditionalSearchAndReplaceTerm = Omit +export type SearchAndReplaceTerm = string | ConditionalSearchAndReplaceTerm; +export type ExternalMetadataTerm = true | undefined; + +export type PlayTransformParts = PlayTransformPartsAtomic & { when?: WhenConditionsConfig }; +export type PlayTransformPartsArray = PlayTransformParts[]; +export type PlayTransformPartsConfig = PlayTransformPartsArray | PlayTransformParts; + +export interface PlayTransformPartsAtomic { + title?: T + artists?: T + album?: T +} + +export interface PlayTransformHooksConfig { + preCompare?: PlayTransformPartsConfig + compare?: { + candidate?: PlayTransformPartsConfig + existing?: PlayTransformPartsConfig + } + postCompare?: PlayTransformPartsConfig +} + +export interface PlayTransformHooks extends PlayTransformHooksConfig { + preCompare?: PlayTransformPartsArray + compare?: { + candidate?: PlayTransformPartsArray + existing?: PlayTransformPartsArray + } + postCompare?: PlayTransformPartsArray +} + +export type PlayTransformRules = PlayTransformHooks +export type TransformHook = 'preCompare' | 'compare' | 'candidate' | 'existing' | 'postCompare'; +export const TRANSFORM_HOOK = { + preCompare: 'preCompare' as TransformHook, + candidate: 'candidate' as TransformHook, + existing: 'existing' as TransformHook, + postCompare: 'postCompare' as TransformHook, +} +export type PlayTransformConfig = PlayTransformHooksConfig; +export type PlayTransformOptions = PlayTransformConfig & { log?: boolean | 'all' } +export type WhenParts = PlayTransformPartsAtomic; +export type WhenConditions = WhenParts[]; +export type WhenConditionsConfig = WhenConditions; + + +//export type PlayTransform \ No newline at end of file diff --git a/src/backend/common/infrastructure/config/client/index.ts b/src/backend/common/infrastructure/config/client/index.ts index dcd52ef1..61aa92a7 100644 --- a/src/backend/common/infrastructure/config/client/index.ts +++ b/src/backend/common/infrastructure/config/client/index.ts @@ -1,4 +1,4 @@ -import { PlayTransformConfig, PlayTransformOptions } from "../../Atomic.js"; +import { PlayTransformConfig, PlayTransformOptions } from "../../Transform.js"; import { CommonConfig, CommonData, RequestRetryOptions } from "../common.js"; /** diff --git a/src/backend/common/infrastructure/config/source/index.ts b/src/backend/common/infrastructure/config/source/index.ts index 666f7077..1f1848de 100644 --- a/src/backend/common/infrastructure/config/source/index.ts +++ b/src/backend/common/infrastructure/config/source/index.ts @@ -1,5 +1,6 @@ import { FileLogOptions, LogLevel } from "@foxxmd/logging"; -import { PlayTransformConfig, PlayTransformOptions } from "../../Atomic.js"; + +import { PlayTransformConfig, PlayTransformOptions } from "../../Transform.js"; import { CommonConfig, CommonData, RequestRetryOptions } from "../common.js"; export interface SourceRetryOptions extends RequestRetryOptions { diff --git a/src/backend/scrobblers/AbstractScrobbleClient.ts b/src/backend/scrobblers/AbstractScrobbleClient.ts index f827b64e..ec28c2e9 100644 --- a/src/backend/scrobblers/AbstractScrobbleClient.ts +++ b/src/backend/scrobblers/AbstractScrobbleClient.ts @@ -25,9 +25,10 @@ import { ScrobbledPlayObject, SourceIdentifier, TIME_WEIGHT, - TITLE_WEIGHT, TRANSFORM_HOOK, + TITLE_WEIGHT, } from "../common/infrastructure/Atomic.js"; import { CommonClientConfig, NowPlayingOptions, UpstreamRefreshOptions } from "../common/infrastructure/config/client/index.js"; +import { TRANSFORM_HOOK } from "../common/infrastructure/Transform.js"; import { Notifiers } from "../notifier/Notifiers.js"; import { comparingMultipleArtists, diff --git a/src/backend/sources/AbstractSource.ts b/src/backend/sources/AbstractSource.ts index 867fe620..da8ebaeb 100644 --- a/src/backend/sources/AbstractSource.ts +++ b/src/backend/sources/AbstractSource.ts @@ -18,9 +18,10 @@ import { PlayUserId, ProgressAwarePlayObject, SINGLE_USER_PLATFORM_ID, - SourceType, TRANSFORM_HOOK, + SourceType, } from "../common/infrastructure/Atomic.js"; import { SourceConfig } from "../common/infrastructure/config/source/sources.js"; +import { TRANSFORM_HOOK } from "../common/infrastructure/Transform.js"; import TupleMap from "../common/TupleMap.js"; import { difference, diff --git a/src/backend/sources/DeezerInternalSource.ts b/src/backend/sources/DeezerInternalSource.ts index a02ece7f..00d879c2 100644 --- a/src/backend/sources/DeezerInternalSource.ts +++ b/src/backend/sources/DeezerInternalSource.ts @@ -2,8 +2,9 @@ import dayjs from "dayjs"; import EventEmitter from "events"; import request, { Request, Response, SuperAgent } from 'superagent'; import { PlayObject, SOURCE_SOT, TA_CLOSE, TA_DURING, TA_EXACT, TA_FUZZY, TemporalAccuracy } from "../../core/Atomic.js"; -import { DEFAULT_RETRY_MULTIPLIER, FormatPlayObjectOptions, InternalConfig, TRANSFORM_HOOK } from "../common/infrastructure/Atomic.js"; +import { DEFAULT_RETRY_MULTIPLIER, FormatPlayObjectOptions, InternalConfig } from "../common/infrastructure/Atomic.js"; import { DeezerInternalSourceConfig, DeezerInternalTrackData, DeezerSourceConfig } from "../common/infrastructure/config/source/deezer.js"; +import { TRANSFORM_HOOK } from "../common/infrastructure/Transform.js"; import { parseRetryAfterSecsFromObj, playObjDataMatch, readJson, sleep, sortByOldestPlayDate, writeFile, } from "../utils.js"; import AbstractSource, { RecentlyPlayedOptions } from "./AbstractSource.js"; import { CookieJar, Cookie } from 'tough-cookie'; @@ -278,4 +279,4 @@ const buildInternalUrl = (method: string, token: string = ''): URL => { const u = new URL(`https://www.deezer.com/ajax/gw-light.php?${params.toString()}`); return u; -} \ No newline at end of file +} diff --git a/src/backend/tests/component/component.test.ts b/src/backend/tests/component/component.test.ts index fe2cab20..42624cfe 100644 --- a/src/backend/tests/component/component.test.ts +++ b/src/backend/tests/component/component.test.ts @@ -3,7 +3,8 @@ import chai, { assert, expect } from 'chai'; import asPromised from 'chai-as-promised'; import { after, before, describe, it } from 'mocha'; import AbstractComponent from "../../common/AbstractComponent.js"; -import { TRANSFORM_HOOK } from "../../common/infrastructure/Atomic.js"; + +import { TRANSFORM_HOOK } from "../../common/infrastructure/Transform.js"; import { isConditionalSearchAndReplace } from "../../utils/PlayTransformUtils.js"; import { asPlays, generatePlay, normalizePlays } from "../utils/PlayTestUtils.js"; diff --git a/src/backend/utils/PlayTransformUtils.ts b/src/backend/utils/PlayTransformUtils.ts index be507e85..c1f5d553 100644 --- a/src/backend/utils/PlayTransformUtils.ts +++ b/src/backend/utils/PlayTransformUtils.ts @@ -2,13 +2,16 @@ import { Logger, loggerTest } from "@foxxmd/logging"; import { searchAndReplace as searchAndReplaceFunc, testMaybeRegex as testMaybeRegexFunc } from "@foxxmd/regex-buddy-core"; import { ObjectPlayData, PlayObject } from "../../core/Atomic.js"; import { buildTrackString } from "../../core/StringUtils.js"; + import { ConditionalSearchAndReplaceRegExp, - PlayTransformParts, PlayTransformPartsArray, PlayTransformPartsConfig, PlayTransformRules, - SearchAndReplaceTerm, + PlayTransformParts, + PlayTransformPartsArray, + PlayTransformPartsConfig, + PlayTransformRules, SearchAndReplaceTerm, WhenConditionsConfig, WhenParts -} from "../common/infrastructure/Atomic.js"; +} from "../common/infrastructure/Transform.js"; export const isWhenCondition = (val: unknown): val is WhenParts => { if (val !== null && typeof val === 'object') { -- 2.51.2