From 945f494a2e84cf56f870e27775ba69300afd88be Mon Sep 17 00:00:00 2001 From: FoxxMD Date: Fri, 10 Jul 2026 16:47:38 +0000 Subject: [PATCH] fix: top-level type import syntax see eslint.config.js comments --- eslint.config.js | 40 ++++++ src/backend/common/AbstractComponent.ts | 24 ++-- src/backend/common/AbstractInitializable.ts | 4 +- src/backend/common/Cache.ts | 3 +- src/backend/common/MaybeLogger.ts | 2 +- src/backend/common/database/Database.ts | 4 +- .../appMigrations/001_lifecycleLoc.ts | 4 +- src/backend/common/database/appMigrator.ts | 4 +- .../common/database/drizzle/drizzleTypes.ts | 6 +- .../common/database/drizzle/drizzleUtils.ts | 4 +- .../common/database/drizzle/entityUtils.ts | 8 +- .../common/database/drizzle/logContext.ts | 2 +- .../drizzle/repositories/BaseRepository.ts | 8 +- .../repositories/ComponentRepository.ts | 6 +- .../repositories/PlayHistoricalRepository.ts | 8 +- .../drizzle/repositories/PlayRepository.ts | 8 +- .../drizzle/repositories/QueueRepository.ts | 4 +- .../common/database/drizzle/schema/schema.ts | 8 +- src/backend/common/errors/ErrorUtils.ts | 2 +- src/backend/common/errors/MSErrors.ts | 2 +- src/backend/common/errors/UpstreamError.ts | 2 +- src/backend/common/infrastructure/Atomic.ts | 33 +---- src/backend/common/infrastructure/Job.ts | 2 +- .../common/infrastructure/config/aioConfig.ts | 20 +-- .../infrastructure/config/client/atproto.ts | 2 +- .../infrastructure/config/client/clients.ts | 36 ++--- .../infrastructure/config/client/discord.ts | 4 +- .../infrastructure/config/client/index.ts | 8 +- .../infrastructure/config/client/koito.ts | 6 +- .../infrastructure/config/client/lastfm.ts | 4 +- .../infrastructure/config/client/librefm.ts | 6 +- .../config/client/listenbrainz.ts | 6 +- .../infrastructure/config/client/maloja.ts | 6 +- .../infrastructure/config/client/rocksky.ts | 4 +- .../infrastructure/config/client/tealfm.ts | 8 +- .../common/infrastructure/config/database.ts | 4 +- .../infrastructure/config/source/azuracast.ts | 2 +- .../config/source/chromecast.ts | 2 +- .../infrastructure/config/source/deezer.ts | 6 +- .../config/source/endpointlfm.ts | 2 +- .../config/source/endpointlz.ts | 2 +- .../infrastructure/config/source/icecast.ts | 2 +- .../infrastructure/config/source/index.ts | 10 +- .../infrastructure/config/source/jellyfin.ts | 4 +- .../infrastructure/config/source/jriver.ts | 4 +- .../infrastructure/config/source/kodi.ts | 4 +- .../infrastructure/config/source/koito.ts | 6 +- .../infrastructure/config/source/lastfm.ts | 6 +- .../infrastructure/config/source/librefm.ts | 6 +- .../config/source/listenbrainz.ts | 6 +- .../infrastructure/config/source/maloja.ts | 6 +- .../infrastructure/config/source/mopidy.ts | 4 +- .../infrastructure/config/source/mpd.ts | 4 +- .../infrastructure/config/source/mpris.ts | 2 +- .../infrastructure/config/source/musiccast.ts | 5 +- .../infrastructure/config/source/musikcube.ts | 2 +- .../infrastructure/config/source/plex.ts | 4 +- .../infrastructure/config/source/rocksky.ts | 6 +- .../infrastructure/config/source/sonos.ts | 4 +- .../infrastructure/config/source/sources.ts | 124 ++++-------------- .../infrastructure/config/source/spotify.ts | 4 +- .../infrastructure/config/source/subsonic.ts | 4 +- .../infrastructure/config/source/tealfm.ts | 6 +- .../infrastructure/config/source/vlc.ts | 6 +- .../config/source/webscrobbler.ts | 2 +- .../infrastructure/config/source/ymbridge.ts | 4 +- .../infrastructure/config/source/ytmusic.ts | 4 +- src/backend/common/logging.ts | 3 +- .../common/transforms/AbstractTransformer.ts | 11 +- .../transforms/AtomicPartsTransformer.ts | 2 +- .../transforms/MusicbrainzTransformer.ts | 10 +- .../common/transforms/NativeTransformer.ts | 8 +- .../common/transforms/TransformerManager.ts | 10 +- .../common/transforms/UserTransformer.ts | 6 +- .../common/vendor/AbstractApiClient.ts | 4 +- src/backend/common/vendor/JRiverApiClient.ts | 5 +- src/backend/common/vendor/KodiApiClient.ts | 8 +- src/backend/common/vendor/LastfmApiClient.ts | 8 +- .../common/vendor/ListenbrainzApiClient.ts | 7 +- src/backend/common/vendor/RockSkyApiClient.ts | 19 +-- .../vendor/atproto/ATProtoAppApiClient.ts | 6 +- .../ATProtoUnauthenticatedApiClient.ts | 2 +- .../atproto/AbstractATProtoApiClient.ts | 13 +- src/backend/common/vendor/atproto/atUtils.ts | 8 +- .../vendor/azuracast/AzuracastApiClient.ts | 8 +- .../chromecast/ChromecastClientUtils.ts | 9 +- .../common/vendor/chromecast/interfaces.ts | 8 +- .../vendor/discord/DiscordAbstractClient.ts | 6 +- .../common/vendor/discord/DiscordIPCClient.ts | 6 +- .../common/vendor/discord/DiscordUtils.ts | 2 +- .../common/vendor/discord/DiscordWSClient.ts | 2 +- .../common/vendor/koito/KoitoApiClient.ts | 13 +- .../common/vendor/listenbrainz/lzUtils.ts | 6 +- .../common/vendor/maloja/MalojaApiClient.ts | 9 +- .../common/vendor/maloja/interfaces.ts | 2 +- .../vendor/musicbrainz/CoverArtApiClient.ts | 6 +- .../musicbrainz/MusicbrainzApiClient.ts | 10 +- .../common/vendor/rocksky/interfaces.ts | 2 +- .../common/vendor/subsonic/interfaces.ts | 2 +- .../common/vendor/teal/TealApiClient.ts | 14 +- src/backend/index.ts | 2 +- src/backend/ioc.ts | 8 +- .../notifier/AbstractWebhookNotifier.ts | 7 +- .../notifier/AppriseWebhookNotifier.ts | 14 +- src/backend/notifier/GotifyWebhookNotifier.ts | 6 +- src/backend/notifier/Notifiers.ts | 12 +- src/backend/notifier/NtfyWebhookNotifier.ts | 6 +- .../AbstractHistoricalScrobbleClient.ts | 8 +- .../scrobblers/AbstractScrobbleClient.ts | 20 +-- src/backend/scrobblers/DiscordScrobbler.ts | 12 +- src/backend/scrobblers/KoitoScrobbler.ts | 10 +- src/backend/scrobblers/LastfmScrobbler.ts | 10 +- src/backend/scrobblers/LibrefmScrobbler.ts | 10 +- .../scrobblers/ListenbrainzScrobbler.ts | 10 +- src/backend/scrobblers/MalojaScrobbler.ts | 12 +- src/backend/scrobblers/RockskyScrobbler.ts | 10 +- src/backend/scrobblers/ScrobbleClients.ts | 38 +++--- src/backend/scrobblers/TealfmScrobbler.ts | 10 +- src/backend/server/api.ts | 18 +-- src/backend/server/auth.ts | 22 ++-- src/backend/server/deezerRoutes.ts | 8 +- src/backend/server/endpointLastfmRoutes.ts | 9 +- .../server/endpointListenbrainzRoutes.ts | 11 +- src/backend/server/index.ts | 6 +- src/backend/server/middleware.ts | 14 +- src/backend/server/webscrobblerRoutes.ts | 4 +- src/backend/sources/AbstractSource.ts | 15 ++- src/backend/sources/AzuracastSource.ts | 13 +- src/backend/sources/ChromecastSource.ts | 17 +-- src/backend/sources/DeezerInternalSource.ts | 11 +- src/backend/sources/DeezerSource.ts | 6 +- src/backend/sources/EndpointLastfmSource.ts | 15 +-- .../sources/EndpointListenbrainzSource.ts | 21 ++- src/backend/sources/IcecastSource.ts | 10 +- src/backend/sources/JRiverSource.ts | 10 +- src/backend/sources/JellyfinApiSource.ts | 17 +-- src/backend/sources/KodiSource.ts | 10 +- src/backend/sources/KoitoSource.ts | 8 +- src/backend/sources/LastfmSource.ts | 16 +-- src/backend/sources/LibrefmSource.ts | 10 +- src/backend/sources/ListenbrainzSource.ts | 16 +-- src/backend/sources/MPDSource.ts | 15 +-- src/backend/sources/MPRISSource.ts | 19 +-- src/backend/sources/MalojaSource.ts | 8 +- src/backend/sources/MemoryPositionalSource.ts | 13 +- src/backend/sources/MemorySource.ts | 18 +-- src/backend/sources/MopidySource.ts | 8 +- src/backend/sources/MusicCastSource.ts | 6 +- src/backend/sources/MusikcubeSource.ts | 17 +-- .../PlayerState/AbstractPlayerState.ts | 17 +-- .../sources/PlayerState/GenericPlayerState.ts | 13 +- .../PlayerState/JellyfinPlayerState.ts | 9 +- .../sources/PlayerState/ListenProgress.ts | 2 +- .../sources/PlayerState/ListenRange.ts | 5 +- .../PlayerState/NowPlayingPlayerState.ts | 2 +- .../sources/PlayerState/PlexPlayerState.ts | 8 +- .../PlayerState/PositionalPlayerState.ts | 10 +- .../PlayerState/SubsonicPlayerState.ts | 2 +- src/backend/sources/PlexApiSource.ts | 24 ++-- src/backend/sources/RockskySource.ts | 8 +- src/backend/sources/ScrobbleSources.ts | 97 +++++++------- src/backend/sources/SonosSource.ts | 19 +-- src/backend/sources/SpotifySource.ts | 8 +- src/backend/sources/SubsonicSource.ts | 17 +-- src/backend/sources/TealfmSource.ts | 8 +- src/backend/sources/VLCSource.ts | 14 +- src/backend/sources/WebScrobblerSource.ts | 20 ++- src/backend/sources/YTMusicSource.ts | 8 +- .../sources/YandexMusicBridgeSource.ts | 10 +- .../ingressNotifiers/IngressNotifier.ts | 4 +- .../ingressNotifiers/LFMEndpointNotifier.ts | 6 +- .../ingressNotifiers/LZEndpointNotifier.ts | 4 +- .../ingressNotifiers/WebhookNotifier.ts | 4 +- src/backend/tasks/retentionCleanup.ts | 4 +- .../tests/component/transformers.test.ts | 4 +- src/backend/tests/config/config.test.ts | 4 +- .../database/testAppMigrations/001_testFoo.ts | 2 +- src/backend/tests/jellyfin/jellyfin.test.ts | 6 +- .../tests/listenbrainz/listenbrainz.test.ts | 6 +- .../tests/musicbrainz/musicbrainz.test.ts | 2 +- src/backend/tests/musiccast/musiccast.test.ts | 4 +- src/backend/tests/player/player.test.ts | 8 +- src/backend/tests/plays/playParsing.test.ts | 2 +- src/backend/tests/plex/plex.test.ts | 8 +- src/backend/tests/scrobbler/TestScrobbler.ts | 13 +- .../tests/scrobbler/scrobblers.test.ts | 4 +- src/backend/tests/sonos/sonos.test.ts | 2 +- src/backend/tests/source/TestSource.ts | 2 +- src/backend/tests/source/source.test.ts | 10 +- src/backend/tests/utils/databaseFixtures.ts | 6 +- src/backend/tests/utils/networking.ts | 2 +- .../tests/utils/playComparisons.test.ts | 2 +- src/backend/tests/ytm/ytm.test.ts | 4 +- src/backend/utils.ts | 6 +- src/backend/utils/AsyncUtils.ts | 2 +- src/backend/utils/DataUtils.ts | 2 +- src/backend/utils/ListenFetchUtils.ts | 6 +- src/backend/utils/MDNSUtils.ts | 4 +- src/backend/utils/NetworkUtils.ts | 6 +- src/backend/utils/PlayComparisonUtils.ts | 6 +- src/backend/utils/PlayTransformUtils.ts | 7 +- src/backend/utils/RequestUtils.ts | 11 +- src/backend/utils/SchemaUtils.ts | 3 +- src/backend/utils/StringUtils.ts | 2 +- src/backend/utils/TimeUtils.ts | 8 +- src/backend/utils/ValidationUtils.ts | 4 +- src/client/AppNext.tsx | 2 +- src/client/components/ActivityTimeline.tsx | 8 +- src/client/components/AppHeader.tsx | 2 +- src/client/components/ArtistCreditDisplay.tsx | 2 +- src/client/components/Badges.tsx | 2 +- src/client/components/DateDisplay.tsx | 5 +- src/client/components/ExpandCollapse.tsx | 2 +- src/client/components/ExternaLinksMenu.tsx | 2 +- src/client/components/ExternalLink.tsx | 2 +- src/client/components/LogsNext.tsx | 2 +- src/client/components/PlayData.tsx | 2 +- src/client/components/PlayDisplay.tsx | 2 +- .../components/ScrobbleActionResult.tsx | 2 +- src/client/components/ScrobbleMatchResult.tsx | 2 +- src/client/components/TextMuted.tsx | 5 +- src/client/components/Tooltip.tsx | 2 +- src/client/components/TransformSteps.tsx | 2 +- src/client/components/Typography.tsx | 2 +- src/client/components/chakraPlayer/Player.tsx | 2 +- src/client/components/icons/AnimatedIcons.tsx | 2 +- src/client/components/icons/ChakraIcons.tsx | 7 +- .../msComponent/MSComponentDetailed.tsx | 2 +- .../msComponent/MSComponentList.tsx | 2 +- src/client/components/msComponent/Stats.tsx | 2 +- .../components/playActivity/ActivityList.tsx | 4 +- .../components/playActivity/ListFilters.tsx | 8 +- .../components/playActivity/ListParts.tsx | 9 +- .../playActivity/VirtualListDynamic.tsx | 2 +- src/client/components/player/PlayerInfo.tsx | 2 +- .../statusCard/ClientStatusCard.tsx | 2 +- .../statusCard/SourceStatusCard.tsx | 2 +- src/client/deadLetter/DeadPage.tsx | 2 +- src/client/deadLetter/deadLetterDucks.ts | 2 +- src/client/logs/LogsSection.tsx | 2 +- src/client/logs/logDucks.ts | 2 +- src/client/queries/index.ts | 2 +- src/client/recent/recentDucks.ts | 2 +- src/client/scrobbled/scrobbledDucks.ts | 2 +- src/client/status/StatusSection.tsx | 2 +- src/client/status/ducks.ts | 2 +- src/client/status/statusApi.ts | 2 +- src/client/utils/ComponentUtils.tsx | 5 +- src/client/utils/index.tsx | 5 +- src/core/Api.ts | 4 +- src/core/Atomic.ts | 105 ++++++++++++++- src/core/PlayUtils.ts | 2 +- src/core/Transform.ts | 2 +- src/core/tests/utils/PlayTestUtils.ts | 12 +- src/core/tests/utils/apiFixtures.ts | 18 +-- src/core/tests/utils/fixtures.ts | 20 +-- .../component/ComponentStatDead.stories.tsx | 2 +- .../component/ComponentStatLive.stories.tsx | 2 +- .../component/ComponentStatQueued.stories.tsx | 2 +- .../component/ComponentSummary.stories.tsx | 2 +- src/stories/component/Player.stories.tsx | 2 +- .../miscComponents/ErrorAlert.stories.tsx | 2 +- .../pages/ComponentDetailed.stories.tsx | 3 +- src/stories/pages/ComponentList.stories.tsx | 2 +- src/stories/plays/ActivityList.stories.tsx | 5 +- src/stories/plays/PlayInfo.stories.tsx | 2 +- .../plays/listFilters/PlayFilters.stories.tsx | 2 +- 267 files changed, 1112 insertions(+), 1068 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index fd38c86b..d831a43c 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -74,6 +74,36 @@ export default defineConfig([ }, rules: { ...defaultRules, + // https://typescript-eslint.io/rules/consistent-type-imports/#comparison-with-importsnotusedasvalues--verbatimmodulesyntax + // + // when using tsconfig compiler verbatimModuleSyntax and EX import {type Foo, type Bar} from 'a'; + // true => typescript will *still* import a module if all types are inline + // false => typescript will erase the entire module import + // + // we need to use verbatimModuleSyntax: true for nodejs type stripping compatibility so + // its important that we use top-level type imports so we don't accidentally import server-side modules into frontend + // but can still use types where necessary + // + // this rule *should* do this...it does detect imports that are typed but not explicitly declared + // but its not moving inline -> top-level + "@typescript-eslint/consistent-type-imports": [ + "error", + { + prefer: 'type-imports', + fixStyle: "separate-type-imports" + } + ], + // however, import/consistent-type-specifier-style from eslint-plugin-import *does* move inline => top-level + // but it does not yet support eslint10 :( + // + // TODO eventually add this once plugin-import supports eslint10 + // https://github.com/import-js/eslint-plugin-import + // https://github.com/import-js/eslint-plugin-import/blob/main/docs/rules/consistent-type-specifier-style.md + // -- this enforces that type-only imports are fixed to top-level type imports IE + // import {type Foo, type Bar} from 'a'; => import type { Foo, Bar} from 'a'; + // "import/consistent-type-specifier-style": [ + // "error", "prefer-top-level-if-only-type-imports" + // ] }, extends: [ tsEslint.configs.recommended, @@ -148,7 +178,9 @@ export default defineConfig([ { type: 'frontend', mode: 'file', pattern: 'src/client/**/*' }, { type: 'config', mode: 'file', pattern: 'config/*.example' }, { type: 'core', mode: 'file', pattern: ['src/core/!(tests)/**','src/core/!(tests)'] }, + { type: 'core-tests', mode: 'file', pattern: ['src/core/tests/**'] }, { type: 'backend', mode: 'file', pattern: 'src/backend/**/*' }, + { type: 'stories', mode: 'file', pattern: ['src/stories/**/*', '.storybook/**'] }, ], // So it understands TS path aliases when resolving imports 'import/resolver': { @@ -173,6 +205,14 @@ export default defineConfig([ from: 'backend', allow: ['backend', 'core', 'config'], // backend can use itself + core }, + { + from: 'stories', + allow: ['stories', 'core', 'frontend', 'core-tests'], // backend can use itself + core + }, + { + from: 'core-tests', + allow: ['core', 'core-tests'], // backend can use itself + core + }, ], }, ], diff --git a/src/backend/common/AbstractComponent.ts b/src/backend/common/AbstractComponent.ts index 9d75257b..41df684f 100644 --- a/src/backend/common/AbstractComponent.ts +++ b/src/backend/common/AbstractComponent.ts @@ -2,11 +2,11 @@ import { childLogger, type Logger } from "@foxxmd/logging"; import { cacheFunctions, } from "@foxxmd/regex-buddy-core"; -import EventEmitter from "events"; -import { type ComponentType, type LifecycleInput, type LifecycleStep, type PlayData, type PlayObject } from "../../core/Atomic.ts"; +import type EventEmitter from "events"; +import type {ComponentType, LifecycleInput, LifecycleStep, PlayData, PlayObject} from "../../core/Atomic.ts"; import { buildTrackString } from "../../core/StringUtils.ts"; -import { type CommonClientConfig } from "./infrastructure/config/client/index.ts"; -import { type CommonSourceConfig } from "./infrastructure/config/source/index.ts"; +import type {CommonClientConfig} from "./infrastructure/config/client/index.ts"; +import type {CommonSourceConfig} from "./infrastructure/config/source/index.ts"; import { mergeSimpleError, SimpleError, SkipTransformStageError, StagePrerequisiteError, StageTransformError, TransformRulesError } from "./errors/MSErrors.ts"; import { FLOW_CONTROL_TERM, @@ -16,29 +16,29 @@ import { type TransformHook } from "../../core/Transform.ts"; import AbstractInitializable from "./AbstractInitializable.ts"; -import TransformerManager from "./transforms/TransformerManager.ts"; +import type TransformerManager from "./transforms/TransformerManager.ts"; import { getRoot } from "../ioc.ts"; import { nanoid } from "nanoid"; import { isDebugMode } from "../utils.ts"; import { findCauseByFunc, findCauseByReference } from "../utils/ErrorUtils.ts"; import { hashObject, parseArrayFromMaybeString } from "../utils/StringUtils.ts"; import { playContentInvariantTransform } from "../utils/PlayComparisonUtils.ts"; -import { MSCache } from "./Cache.ts"; +import type { MSCache } from "./Cache.ts"; import { diffObjects, diffObjectsConsoleOutput, patchObject } from "../../core/DataUtils.ts"; import clone from "clone"; import { loggerNoop } from "./MaybeLogger.ts"; import { objectsEqual } from "../utils/DataUtils.ts"; -import { type RetentionOptions } from "./infrastructure/config/database.ts"; +import type {RetentionOptions} from "./infrastructure/config/database.ts"; import { getRetentionCompactAfterFromEnv, getRetentionDeleteAfterFromEnv, isCompactableProperty, parseRetentionOptions, parseRetentionOptionsDurations } from "./database/Database.ts"; -import { type DbConcrete } from "./database/drizzle/drizzleUtils.ts"; -import { type ComponentSelect } from "./database/drizzle/drizzleTypes.ts"; +import type {DbConcrete} from "./database/drizzle/drizzleUtils.ts"; +import type {ComponentSelect} from "./database/drizzle/drizzleTypes.ts"; import { DrizzlePlayRepository } from "./database/drizzle/repositories/PlayRepository.ts"; -import { type ClientType } from "./infrastructure/config/client/clients.ts"; -import { type SourceType } from "./infrastructure/config/source/sources.ts"; +import type {ClientType} from "../../core/Atomic.ts"; +import type {SourceType} from "../../core/Atomic.ts"; import { DrizzleComponentRepository } from "./database/drizzle/repositories/ComponentRepository.ts"; import dayjs from "dayjs"; import { COMPONENT_STATE, type ComponentCommonApi, type ComponentCommonApiJson, type ComponentState, type PlayApiCommonDetailed } from "../../core/Api.ts"; -import { type WebhookPayload } from "./infrastructure/config/health/webhooks.ts"; +import type {WebhookPayload} from "./infrastructure/config/health/webhooks.ts"; import type { MarkRequired } from "ts-essentials"; import { serializeError } from "serialize-error"; diff --git a/src/backend/common/AbstractInitializable.ts b/src/backend/common/AbstractInitializable.ts index 69e3221f..fce0ef75 100644 --- a/src/backend/common/AbstractInitializable.ts +++ b/src/backend/common/AbstractInitializable.ts @@ -1,8 +1,8 @@ -import { type Logger } from "@foxxmd/logging"; +import type { Logger } from "@foxxmd/logging"; import {truncateStringToLength } from "../../core/StringUtils.ts"; import { hasNodeNetworkException } from "./errors/NodeErrors.ts"; import { hasUpstreamError } from "./errors/UpstreamError.ts"; -import { type WebhookPayload } from "./infrastructure/config/health/webhooks.ts"; +import type {WebhookPayload} from "./infrastructure/config/health/webhooks.ts"; import { AuthCheckError, BuildDataError, ConnectionCheckError, ParseCacheError, PostInitError, StageError } from "./errors/MSErrors.ts"; import { messageWithCausesTruncatedDefault } from "../../core/ErrorUtils.ts"; import { spawn } from 'abort-controller-x'; diff --git a/src/backend/common/Cache.ts b/src/backend/common/Cache.ts index 2c2d538b..5077c36a 100644 --- a/src/backend/common/Cache.ts +++ b/src/backend/common/Cache.ts @@ -19,7 +19,8 @@ import { Typeson } from 'typeson'; import { builtin } from 'typeson-registry'; import { loggerNoop } from './MaybeLogger.ts'; const configDir = process.env.CONFIG_DIR || path.resolve(projectDir, `./config`); -import prom, { Gauge } from 'prom-client'; +import type { Gauge } from 'prom-client'; +import prom from 'prom-client'; import { nonEmptyStringOrDefault } from '../../core/StringUtils.ts'; dayjs.extend(utc) diff --git a/src/backend/common/MaybeLogger.ts b/src/backend/common/MaybeLogger.ts index d8059f9c..cb2c8f17 100644 --- a/src/backend/common/MaybeLogger.ts +++ b/src/backend/common/MaybeLogger.ts @@ -1,4 +1,4 @@ -import { type Logger } from "@foxxmd/logging"; +import type { Logger } from "@foxxmd/logging"; export class MaybeLogger { diff --git a/src/backend/common/database/Database.ts b/src/backend/common/database/Database.ts index 72279498..5f3fd74b 100644 --- a/src/backend/common/database/Database.ts +++ b/src/backend/common/database/Database.ts @@ -3,8 +3,8 @@ import * as path from 'path'; import { childLogger, type Logger } from '@foxxmd/logging'; import { loggerNoop } from '../MaybeLogger.ts'; import { COMPACTABLE, type CompactableProperty, DEFAULT_RETENTION_COMPACT_AFTER, DEFAULT_RETENTION_DELETE_AFTER, type RetentionConfigValue, type RetentionOption, type RetentionValue, type RetentionValueUnparsed } from '../infrastructure/config/database.ts'; -import { type DurationValue } from '../infrastructure/Atomic.ts'; -import { type Duration } from 'dayjs/plugin/duration.js'; +import type {DurationValue} from '../infrastructure/Atomic.ts'; +import type {Duration} from 'dayjs/plugin/duration.js'; import dayjs from 'dayjs'; import { parseDurationFromDurationValue } from '../../utils/TimeUtils.ts'; import assert from 'node:assert'; diff --git a/src/backend/common/database/appMigrations/001_lifecycleLoc.ts b/src/backend/common/database/appMigrations/001_lifecycleLoc.ts index bfd120ac..5ed47494 100644 --- a/src/backend/common/database/appMigrations/001_lifecycleLoc.ts +++ b/src/backend/common/database/appMigrations/001_lifecycleLoc.ts @@ -1,9 +1,9 @@ import type { SqliteDatabase, Migration } from 'sqlite-up'; -import { type MigrateBaseContext } from '../appMigrator.ts'; +import type {MigrateBaseContext} from '../appMigrator.ts'; import { plays as drizzlePlays } from '../drizzle/schema/schema.ts'; import clone from 'clone'; import { eq } from 'drizzle-orm'; -import { type PlayLifecycle, type PlayObject } from '../../../../core/Atomic.ts'; +import type {PlayLifecycle, PlayObject} from '../../../../core/Atomic.ts'; export const up: Migration['up'] = async (db: SqliteDatabase, ctx: MigrateBaseContext): Promise => { diff --git a/src/backend/common/database/appMigrator.ts b/src/backend/common/database/appMigrator.ts index ad430e00..3dd233be 100644 --- a/src/backend/common/database/appMigrator.ts +++ b/src/backend/common/database/appMigrator.ts @@ -1,10 +1,10 @@ -import { type DbConcrete } from "./drizzle/drizzleUtils.ts"; +import type {DbConcrete} from "./drizzle/drizzleUtils.ts"; import { loggerNoop } from "../MaybeLogger.ts"; import * as path from 'path'; import { childLogger, type Logger } from "@foxxmd/logging"; import { projectDir } from "../index.ts"; import { Migrator } from 'sqlite-up'; -import { type MigrationStatus } from "../infrastructure/Atomic.ts"; +import type {MigrationStatus} from "../infrastructure/Atomic.ts"; export interface MigrateBaseContext { db: DbConcrete diff --git a/src/backend/common/database/drizzle/drizzleTypes.ts b/src/backend/common/database/drizzle/drizzleTypes.ts index 44351e3f..3e8bed84 100644 --- a/src/backend/common/database/drizzle/drizzleTypes.ts +++ b/src/backend/common/database/drizzle/drizzleTypes.ts @@ -1,6 +1,6 @@ -import { type DBQueryConfig, type DBQueryConfigWith, type KnownKeysOnly, type RelationFieldsFilterInternals, type BuildQueryResult, type RelationsFilter } from "drizzle-orm"; -import { components, componentMigrations, playInputs, plays, queueStates, relations, playsHistorical } from "./schema/schema.ts"; -import {type TSchema, type TableName } from "./schema/schema.ts"; +import type {DBQueryConfig, DBQueryConfigWith, KnownKeysOnly, RelationFieldsFilterInternals, BuildQueryResult, RelationsFilter} from "drizzle-orm"; +import type { components, componentMigrations, playInputs, plays, queueStates, relations, playsHistorical } from "./schema/schema.ts"; +import type {TSchema, TableName} from "./schema/schema.ts"; export type ComponentNew = typeof components.$inferInsert; diff --git a/src/backend/common/database/drizzle/drizzleUtils.ts b/src/backend/common/database/drizzle/drizzleUtils.ts index 33c538ad..86986342 100644 --- a/src/backend/common/database/drizzle/drizzleUtils.ts +++ b/src/backend/common/database/drizzle/drizzleUtils.ts @@ -1,6 +1,6 @@ import { drizzle } from 'drizzle-orm/node-sqlite'; import { migrate } from 'drizzle-orm/node-sqlite/migrator'; -import { BaseSQLiteDatabase } from "drizzle-orm/sqlite-core"; +import type { BaseSQLiteDatabase } from "drizzle-orm/sqlite-core"; import { sql as dsl, type Logger as DrizzleLogger } from 'drizzle-orm'; import * as fs from 'fs/promises'; import * as path from 'path'; @@ -12,7 +12,7 @@ import { projectDir } from '../../index.ts'; import { relations } from './schema/schema.ts'; import { addToContext, executeQuery } from './logContext.ts'; import { migrateApp, getAppMigrationStatus } from '../appMigrator.ts'; -import { type MigrationStatus } from '../../infrastructure/Atomic.ts'; +import type {MigrationStatus} from '../../infrastructure/Atomic.ts'; export async function getDbMigrationStatus(dbVal: string | DbConcrete, opts: {logger?: Logger, migrationsFolder?: string} = {}): Promise { const { diff --git a/src/backend/common/database/drizzle/entityUtils.ts b/src/backend/common/database/drizzle/entityUtils.ts index 382c8688..5056bc63 100644 --- a/src/backend/common/database/drizzle/entityUtils.ts +++ b/src/backend/common/database/drizzle/entityUtils.ts @@ -1,8 +1,8 @@ import assert from "node:assert"; -import { type PlayHistoricalNew, type PlayHistoricalSelect, type PlayNew, type PlaySelect, type PlaySelectWithQueueStates } from "./drizzleTypes.ts"; -import { type PlayInputNew } from "./drizzleTypes.ts"; -import { type QueueStateNew } from "./drizzleTypes.ts"; -import { type ComponentNew } from "./drizzleTypes.ts"; +import type {PlayHistoricalNew, PlayHistoricalSelect, PlayNew, PlaySelect, PlaySelectWithQueueStates} from "./drizzleTypes.ts"; +import type {PlayInputNew} from "./drizzleTypes.ts"; +import type {QueueStateNew} from "./drizzleTypes.ts"; +import type {ComponentNew} from "./drizzleTypes.ts"; import type { MarkOptional } from "ts-essentials"; import { CLIENT_DEAD_QUEUE, type DeadLetterScrobble, type ErrorLike, type PlayObject } from "../../../../core/Atomic.ts"; import dayjs from "dayjs"; diff --git a/src/backend/common/database/drizzle/logContext.ts b/src/backend/common/database/drizzle/logContext.ts index c12c9a4a..81830b0d 100644 --- a/src/backend/common/database/drizzle/logContext.ts +++ b/src/backend/common/database/drizzle/logContext.ts @@ -1,4 +1,4 @@ -import { type Logger } from '@foxxmd/logging' +import type { Logger } from '@foxxmd/logging' import { AsyncLocalStorage } from 'async_hooks' // based on https://numeric.substack.com/p/upgrading-drizzleorm-logging-with diff --git a/src/backend/common/database/drizzle/repositories/BaseRepository.ts b/src/backend/common/database/drizzle/repositories/BaseRepository.ts index 99bcfc59..8613f4b8 100644 --- a/src/backend/common/database/drizzle/repositories/BaseRepository.ts +++ b/src/backend/common/database/drizzle/repositories/BaseRepository.ts @@ -1,13 +1,13 @@ import { childLogger, type Logger } from "@foxxmd/logging"; -import { type DbConcrete } from "../drizzleUtils.ts"; -import { type Dayjs } from "dayjs"; +import type { DbConcrete } from "../drizzleUtils.ts"; +import type { Dayjs } from "dayjs"; import { type RelationsFieldFilter, eq, inArray } from "drizzle-orm"; import { loggerNoop } from "../../../MaybeLogger.ts"; import { capitalize } from "../../../../../core/StringUtils.ts"; import { getConfigByTableName, type TableName } from "../schema/schema.ts"; import assert from 'node:assert'; -import { Cacheable } from "cacheable"; -import { type DateLike } from "../../../../../core/Atomic.ts"; +import type { Cacheable } from "cacheable"; +import type { DateLike } from "../../../../../core/Atomic.ts"; import type { CompareDateBetween, CompareDateSingle } from "../../../../../core/Api.ts"; export interface DrizzleRepositoryOpts { diff --git a/src/backend/common/database/drizzle/repositories/ComponentRepository.ts b/src/backend/common/database/drizzle/repositories/ComponentRepository.ts index 68e279a7..1d5c178f 100644 --- a/src/backend/common/database/drizzle/repositories/ComponentRepository.ts +++ b/src/backend/common/database/drizzle/repositories/ComponentRepository.ts @@ -1,9 +1,9 @@ import { DrizzleBaseRepository, type DrizzleRepositoryOpts } from "./BaseRepository.ts"; -import { type DbConcrete } from "../drizzleUtils.ts"; -import { type ComponentSelect, type FindWhere } from "../drizzleTypes.ts"; +import type {DbConcrete} from "../drizzleUtils.ts"; +import type {ComponentSelect, FindWhere} from "../drizzleTypes.ts"; import { components } from "../schema/schema.ts"; import { generateComponentEntity } from "../entityUtils.ts"; -import { type ComponentType } from "../../../../../core/Atomic.ts"; +import type {ComponentType} from "../../../../../core/Atomic.ts"; export class DrizzleComponentRepository extends DrizzleBaseRepository<'components'> { diff --git a/src/backend/common/database/drizzle/repositories/PlayHistoricalRepository.ts b/src/backend/common/database/drizzle/repositories/PlayHistoricalRepository.ts index c67885db..0ff92cf3 100644 --- a/src/backend/common/database/drizzle/repositories/PlayHistoricalRepository.ts +++ b/src/backend/common/database/drizzle/repositories/PlayHistoricalRepository.ts @@ -2,17 +2,17 @@ import { type DbConcrete, runTransaction } from "../drizzleUtils.ts"; import { type PlayObject, TA_DEFAULT_ACCURACY, type TemporalAccuracy } from "../../../../../core/Atomic.ts"; import { generatePlayEntity, hydratePlaySelect, type PlayHydateOptions, type PlayHistoricalEntityOpts } from "../entityUtils.ts"; import { plays, playsHistorical } from "../schema/schema.ts"; -import { type FindWhere, type FindMany, type WhereClause, type PlayHistoricalSelect, type PlayHistoricalNew } from "../drizzleTypes.ts";; +import type {FindWhere, FindMany, WhereClause, PlayHistoricalSelect, PlayHistoricalNew} from "../drizzleTypes.ts";; import type { MarkOptional } from "ts-essentials"; import { removeUndefinedKeys } from '../../../../../core/DataUtils.ts'; -import { type Dayjs } from "dayjs"; +import type {Dayjs} from "dayjs"; import { inArray, sql } from "drizzle-orm"; import { buildDateCompare, type CompareDateOp, type ComponentConstrainedRepoOpts, DrizzleBaseRepository, type DrizzleRepositoryOpts } from "./BaseRepository.ts"; -import { type PaginatedResponse } from "../../../../../core/Api.ts"; +import type {PaginatedResponse} from "../../../../../core/Api.ts"; import { hashObject } from "../../../../utils/StringUtils.ts"; import { playContentBasicInvariantTransform, playMbidIdentifier } from "../../../../utils/PlayComparisonUtils.ts"; import { comparePlayTemporally, getTemporalAccuracyCloseVal, hasAcceptableTemporalAccuracy } from "../../../../utils/TimeUtils.ts"; -import { type SourceType } from "../../../infrastructure/config/source/sources.ts"; +import type {SourceType} from "../../../../../core/Atomic.ts"; import { getTemporallyCloseDateCompareOp } from "./PlayRepository.ts"; // https://github.com/drizzle-team/drizzle-orm/issues/695 may be useful for typing models with relations? diff --git a/src/backend/common/database/drizzle/repositories/PlayRepository.ts b/src/backend/common/database/drizzle/repositories/PlayRepository.ts index ecfdbdd3..aa513323 100644 --- a/src/backend/common/database/drizzle/repositories/PlayRepository.ts +++ b/src/backend/common/database/drizzle/repositories/PlayRepository.ts @@ -10,14 +10,14 @@ import { playContentBasicInvariantTransform, playMbidIdentifier } from "../../.. import { hashObject } from "../../../../utils/StringUtils.ts"; import { comparePlayTemporally, getTemporalAccuracyCloseVal, hasAcceptableTemporalAccuracy } from "../../../../utils/TimeUtils.ts"; import { type CompactableProperty, type RetentionOptions, retentionPlayTypes } from "../../../infrastructure/config/database.ts"; -import { type SourceType } from "../../../infrastructure/config/source/sources.ts"; -import { type FindMany, type FindWhere, type FindWith, type PlayInputNew, type PlayNew, type PlaySelect, type PlaySelectWithQueueStates, type PlayWith, type QueueStateSelect, type WhereClause } from "../drizzleTypes.ts"; +import type {SourceType} from "../../../../../core/Atomic.ts"; +import type {FindMany, FindWhere, FindWith, PlayInputNew, PlayNew, PlaySelect, PlaySelectWithQueueStates, PlayWith, QueueStateSelect, WhereClause} from "../drizzleTypes.ts"; import { type DbConcrete, runTransaction } from "../drizzleUtils.ts"; import { generateInputEntity, generatePlayEntity, hydratePlaySelect, type PlayEntityOpts, type PlayHydateOptions } from "../entityUtils.ts"; import { playInputs, plays, relations } from "../schema/schema.ts"; import { buildDateCompare, type CompareDateOp, type ComponentConstrainedRepoOpts, DrizzleBaseRepository, type DrizzleRepositoryOpts } from "./BaseRepository.ts"; -import { type PaginatedResponse } from "../../../../../core/Api.ts"; -import { type PaginatedQueryResponse } from "../../../../../core/Api.ts"; +import type {PaginatedResponse} from "../../../../../core/Api.ts"; +import type {PaginatedQueryResponse} from "../../../../../core/Api.ts"; ; // https://github.com/drizzle-team/drizzle-orm/issues/695 may be useful for typing models with relations? diff --git a/src/backend/common/database/drizzle/repositories/QueueRepository.ts b/src/backend/common/database/drizzle/repositories/QueueRepository.ts index f0d8a40c..8a5a4eba 100644 --- a/src/backend/common/database/drizzle/repositories/QueueRepository.ts +++ b/src/backend/common/database/drizzle/repositories/QueueRepository.ts @@ -1,7 +1,7 @@ import { eq, and, lte, inArray } from "drizzle-orm"; import { DrizzleBaseRepository, type DrizzleRepositoryOpts } from "./BaseRepository.ts"; -import { type DbConcrete } from "../drizzleUtils.ts"; -import { type QueueStateSelect } from "../drizzleTypes.ts"; +import type {DbConcrete} from "../drizzleUtils.ts"; +import type {QueueStateSelect} from "../drizzleTypes.ts"; import { queueStates } from "../schema/schema.ts"; import { CLIENT_DEAD_QUEUE } from "../../../../../core/Atomic.ts"; export class DrizzleQueueRepository extends DrizzleBaseRepository<'queueStates'> { diff --git a/src/backend/common/database/drizzle/schema/schema.ts b/src/backend/common/database/drizzle/schema/schema.ts index 8e90cb0e..46f0c3ce 100644 --- a/src/backend/common/database/drizzle/schema/schema.ts +++ b/src/backend/common/database/drizzle/schema/schema.ts @@ -1,10 +1,10 @@ import { integer, sqliteTable, text, index, uniqueIndex, customType, type AnySQLiteColumn } from "drizzle-orm/sqlite-core"; import { defineRelations } from 'drizzle-orm'; import dayjs, { type Dayjs } from "dayjs"; -import { type ErrorLike, type PlayObject } from "../../../../../core/Atomic.ts"; +import { COMPONENT_TYPE_CLIENT, COMPONENT_TYPE_SOURCE, type ErrorLike, type PlayObject } from "../../../../../core/Atomic.ts"; import { asPlayCheap } from "../../../../../core/PlayMarshalUtils.ts"; -import { type ExternalMetadataTerm, type PlayTransformPartsConfig, type SearchAndReplaceTerm } from "../../../../../core/Transform.ts"; -import { type JobRangeCount, type JobRangeTime } from "../../../infrastructure/Job.ts"; +import type {ExternalMetadataTerm, PlayTransformPartsConfig, SearchAndReplaceTerm} from "../../../../../core/Transform.ts"; +import type {JobRangeCount, JobRangeTime} from "../../../infrastructure/Job.ts"; import { serializeError, deserializeError } from "serialize-error"; import { generatePlayUid } from "../../../../../core/StringUtils.ts"; @@ -165,7 +165,7 @@ export const components = sqliteTable("components", { id: integer({ mode: 'number' }).primaryKey(), // user-provided id uid: text({ length: 200 }).notNull(), - mode: text({enum: ['source','client']}).notNull(), + mode: text({enum: [COMPONENT_TYPE_SOURCE,COMPONENT_TYPE_CLIENT]}).notNull(), // spotify, lastfm, etc... type: text({length: 50}).notNull(), // vanity display name diff --git a/src/backend/common/errors/ErrorUtils.ts b/src/backend/common/errors/ErrorUtils.ts index 882fa0aa..98942a46 100644 --- a/src/backend/common/errors/ErrorUtils.ts +++ b/src/backend/common/errors/ErrorUtils.ts @@ -1,4 +1,4 @@ -import { type ResponseError } from "superagent"; +import type {ResponseError} from "superagent"; export const isSuperAgentResponseError = (e: any): e is ResponseError => { return typeof e === 'object' diff --git a/src/backend/common/errors/MSErrors.ts b/src/backend/common/errors/MSErrors.ts index 628ced96..f5543a2d 100644 --- a/src/backend/common/errors/MSErrors.ts +++ b/src/backend/common/errors/MSErrors.ts @@ -3,7 +3,7 @@ import mergeErrorCause from 'merge-error-cause'; import { findCauseByFunc, isAbortReasonErrorLike } from "../../utils/ErrorUtils.ts"; import { UpstreamError, type UpstreamErrorOptions } from "./UpstreamError.ts"; import {addKnownErrorConstructor, serializeError} from 'serialize-error'; -import { type LifecycleInput } from "../../../core/Atomic.ts"; +import type {LifecycleInput} from "../../../core/Atomic.ts"; export abstract class NamedError extends Error { public abstract name: string; diff --git a/src/backend/common/errors/UpstreamError.ts b/src/backend/common/errors/UpstreamError.ts index f0452fe5..ec8ad3e3 100644 --- a/src/backend/common/errors/UpstreamError.ts +++ b/src/backend/common/errors/UpstreamError.ts @@ -1,4 +1,4 @@ -import { Response } from 'superagent'; +import type { Response } from 'superagent'; import { findCauseByFunc } from "../../utils/ErrorUtils.ts"; import { addKnownErrorConstructor } from 'serialize-error'; diff --git a/src/backend/common/infrastructure/Atomic.ts b/src/backend/common/infrastructure/Atomic.ts index 821edea2..bfdf9381 100644 --- a/src/backend/common/infrastructure/Atomic.ts +++ b/src/backend/common/infrastructure/Atomic.ts @@ -1,13 +1,13 @@ -import { type Logger, type LogDataPretty } from '@foxxmd/logging'; +import type { Logger, LogDataPretty } from '@foxxmd/logging'; import type { Dayjs, ManipulateType } from "dayjs"; -import { type Request, type Response } from "express"; +import type { Request, Response } from "express"; import type { NextFunction, ParamsDictionary, Query } from "express-serve-static-core"; -import { FixedSizeList } from 'fixed-size-list'; +import type { FixedSizeList } from 'fixed-size-list'; import { type DeviceId, type ErrorLike, isPlayObject, type PlayMeta, type PlayObject, type PlayObjectMinimal, type PlayPlatformId, type PlayUserId, type UnixTimestamp } from "../../../core/Atomic.ts"; -import TupleMap from "../TupleMap.ts"; -import { MusicBrainzApi } from 'musicbrainz-api'; -import type { SourceType } from './config/source/sources.ts'; -import { type ClientType, clientTypes } from './config/client/clients.ts'; +import type TupleMap from "../TupleMap.ts"; +import type { MusicBrainzApi } from 'musicbrainz-api'; +import type { ReportedPlayerStatus, SourceType } from "../../../core/Atomic.ts"; +import type { ClientType } from "../../../core/Atomic.ts"; import assert from 'assert'; export interface LeveledLogData extends LogDataPretty { @@ -16,10 +16,6 @@ export interface LeveledLogData extends LogDataPretty { export const lowGranularitySources: SourceType[] = ['subsonic', 'ytmusic']; -export const isClientType = (data: string): data is ClientType => { - return clientTypes.includes(data as ClientType); -} - export interface ComponentIdentifier { type: SourceType | ClientType name: string @@ -55,21 +51,6 @@ export interface InternalConfig { export type InternalConfigOptional = Omit -export type ReportedPlayerStatus = 'playing' | 'stopped' | 'paused' | 'unknown'; -export const REPORTED_PLAYER_STATUSES = { - playing: 'playing' as ReportedPlayerStatus, - stopped: 'stopped' as ReportedPlayerStatus, - paused: 'paused' as ReportedPlayerStatus, - unknown: 'unknown' as ReportedPlayerStatus -} - -export type CalculatedPlayerStatus = ReportedPlayerStatus | 'stale' | 'orphaned'; -export const CALCULATED_PLAYER_STATUSES = { - ...REPORTED_PLAYER_STATUSES, - stale: 'stale' as CalculatedPlayerStatus, - orphaned: 'orphaned' as CalculatedPlayerStatus, -} - export type ConfigureAsSource = 'source'; export type ConfigureAsClient = 'client'; export type ConfigureAs = ConfigureAsSource | ConfigureAsClient; diff --git a/src/backend/common/infrastructure/Job.ts b/src/backend/common/infrastructure/Job.ts index 4d35b60a..ac6360b6 100644 --- a/src/backend/common/infrastructure/Job.ts +++ b/src/backend/common/infrastructure/Job.ts @@ -1,4 +1,4 @@ -import { type UnixTimestamp } from "../../../core/Atomic.ts" +import type {UnixTimestamp} from "../../../core/Atomic.ts"; export interface JobParameters { /** maximum number of results to get for the entire job */ diff --git a/src/backend/common/infrastructure/config/aioConfig.ts b/src/backend/common/infrastructure/config/aioConfig.ts index dc2d7503..fec1e277 100644 --- a/src/backend/common/infrastructure/config/aioConfig.ts +++ b/src/backend/common/infrastructure/config/aioConfig.ts @@ -1,13 +1,13 @@ -import { type LogOptions } from "@foxxmd/logging"; -import { type ClientAIOConfig } from "./client/clients.ts"; -import { type CommonClientOptions } from "./client/index.ts"; -import { type RequestRetryOptions } from "./common.ts"; -import { type WebhookConfig } from "./health/webhooks.ts"; -import { type CommonSourceOptions, type SourceRetryOptions } from "./source/index.ts"; -import { type SourceAIOConfig } from "./source/sources.ts"; -import { type CacheConfigUser, type DurationValue } from "../Atomic.ts"; -import { type TransformerCommonConfig } from "../../../../core/Atomic.ts"; -import { type RetentionConfig } from "./database.ts"; +import type { LogOptions } from "@foxxmd/logging"; +import type { ClientAIOConfig } from "./client/clients.ts"; +import type { CommonClientOptions } from "./client/index.ts"; +import type { RequestRetryOptions } from "./common.ts"; +import type { WebhookConfig } from "./health/webhooks.ts"; +import type { CommonSourceOptions, SourceRetryOptions } from "./source/index.ts"; +import type { SourceAIOConfig } from "./source/sources.ts"; +import type { CacheConfigUser, DurationValue } from "../Atomic.ts"; +import type { TransformerCommonConfig } from "../../../../core/Atomic.ts"; +import type { RetentionConfig } from "./database.ts"; export interface SourceDefaults extends CommonSourceOptions { diff --git a/src/backend/common/infrastructure/config/client/atproto.ts b/src/backend/common/infrastructure/config/client/atproto.ts index 2e0042be..cd36258a 100644 --- a/src/backend/common/infrastructure/config/client/atproto.ts +++ b/src/backend/common/infrastructure/config/client/atproto.ts @@ -1,4 +1,4 @@ -import { type AtprotoDid } from "@atcute/lexicons/syntax"; +import type {AtprotoDid} from "@atcute/lexicons/syntax"; export interface ATProtoUserIdentifierData { /** diff --git a/src/backend/common/infrastructure/config/client/clients.ts b/src/backend/common/infrastructure/config/client/clients.ts index 90125948..7adb0b9d 100644 --- a/src/backend/common/infrastructure/config/client/clients.ts +++ b/src/backend/common/infrastructure/config/client/clients.ts @@ -1,11 +1,11 @@ -import { type KoitoClientAIOConfig, type KoitoClientConfig } from "./koito.ts"; -import { type LastfmClientAIOConfig, type LastfmClientConfig } from "./lastfm.ts"; -import { type ListenBrainzClientAIOConfig, type ListenBrainzClientConfig } from "./listenbrainz.ts"; -import { type MalojaClientAIOConfig, type MalojaClientConfig } from "./maloja.ts"; -import { type TealClientAIOConfig, type TealClientConfig } from "./tealfm.ts"; -import { type RockSkyClientAIOConfig, type RockSkyClientConfig } from "./rocksky.ts"; -import { type LibrefmClientConfig, type LibrefmClientAIOConfig } from "./librefm.ts"; -import { type DiscordClientAIOConfig, type DiscordClientConfig } from "./discord.ts"; +import type {KoitoClientAIOConfig, KoitoClientConfig} from "./koito.ts"; +import type {LastfmClientAIOConfig, LastfmClientConfig} from "./lastfm.ts"; +import type {ListenBrainzClientAIOConfig, ListenBrainzClientConfig} from "./listenbrainz.ts"; +import type {MalojaClientAIOConfig, MalojaClientConfig} from "./maloja.ts"; +import type {TealClientAIOConfig, TealClientConfig} from "./tealfm.ts"; +import type {RockSkyClientAIOConfig, RockSkyClientConfig} from "./rocksky.ts"; +import type {LibrefmClientConfig, LibrefmClientAIOConfig} from "./librefm.ts"; +import type {DiscordClientAIOConfig, DiscordClientConfig} from "./discord.ts"; export type ClientConfig = MalojaClientConfig @@ -57,23 +57,3 @@ export const clientInterfaces = [ ...atomicClientInterfaces ]; -export type ClientType = - 'maloja' - | 'lastfm' - | 'librefm' - | 'listenbrainz' - | 'koito' - | 'tealfm' - | 'rocksky' - | 'discord'; - -export const clientTypes: ClientType[] = [ - 'maloja', - 'lastfm', - 'librefm', - 'listenbrainz', - 'koito', - 'tealfm', - 'rocksky', - 'discord' -]; \ No newline at end of file diff --git a/src/backend/common/infrastructure/config/client/discord.ts b/src/backend/common/infrastructure/config/client/discord.ts index 196a3565..f93f918b 100644 --- a/src/backend/common/infrastructure/config/client/discord.ts +++ b/src/backend/common/infrastructure/config/client/discord.ts @@ -1,5 +1,5 @@ -import { type CommonClientConfig, type CommonClientData } from "./index.ts" -import { type ComponentType } from "../../../../../core/Atomic.ts" +import type {CommonClientConfig, CommonClientData} from "./index.ts"; +import type {ComponentType} from "../../../../../core/Atomic.ts"; export interface DiscordData { token?: string diff --git a/src/backend/common/infrastructure/config/client/index.ts b/src/backend/common/infrastructure/config/client/index.ts index 140beb35..b85b8ca5 100644 --- a/src/backend/common/infrastructure/config/client/index.ts +++ b/src/backend/common/infrastructure/config/client/index.ts @@ -1,7 +1,7 @@ -import { type DurationValue } from "../../Atomic.ts"; -import { type PlayTransformOptions } from "../../../../../core/Transform.ts"; -import { type CommonConfig, type RequestRetryOptions } from "../common.ts"; -import { type RetentionConfig } from "../database.ts"; +import type {DurationValue} from "../../Atomic.ts"; +import type {PlayTransformOptions} from "../../../../../core/Transform.ts"; +import type {CommonConfig, RequestRetryOptions} from "../common.ts"; +import type {RetentionConfig} from "../database.ts"; /** * Scrobble matching (between new source track and existing client scrobbles) logging options. Used for debugging. diff --git a/src/backend/common/infrastructure/config/client/koito.ts b/src/backend/common/infrastructure/config/client/koito.ts index f73fdfe6..01a80172 100644 --- a/src/backend/common/infrastructure/config/client/koito.ts +++ b/src/backend/common/infrastructure/config/client/koito.ts @@ -1,6 +1,6 @@ -import { type ComponentType, type UnixTimestamp } from "../../../../../core/Atomic.ts" -import { type RequestRetryOptions } from "../common.ts" -import { type CommonClientConfig, type CommonClientData } from "./index.ts" +import type {ComponentType, UnixTimestamp} from "../../../../../core/Atomic.ts"; +import type {RequestRetryOptions} from "../common.ts"; +import type {CommonClientConfig, CommonClientData} from "./index.ts"; export interface ListensResponse { items: ListenObjectResponse[] diff --git a/src/backend/common/infrastructure/config/client/lastfm.ts b/src/backend/common/infrastructure/config/client/lastfm.ts index 3533eae3..25c67e94 100644 --- a/src/backend/common/infrastructure/config/client/lastfm.ts +++ b/src/backend/common/infrastructure/config/client/lastfm.ts @@ -1,5 +1,5 @@ -import { type RequestRetryOptions } from "../common.ts"; -import { type CommonClientConfig, type CommonClientData, type CommonClientOptions, type NowPlayingOptions } from "./index.ts"; +import type {RequestRetryOptions} from "../common.ts"; +import type {CommonClientConfig, CommonClientData, CommonClientOptions, NowPlayingOptions} from "./index.ts"; export interface LastfmData extends CommonClientData, RequestRetryOptions { /** diff --git a/src/backend/common/infrastructure/config/client/librefm.ts b/src/backend/common/infrastructure/config/client/librefm.ts index 63b27470..2353ded3 100644 --- a/src/backend/common/infrastructure/config/client/librefm.ts +++ b/src/backend/common/infrastructure/config/client/librefm.ts @@ -1,6 +1,6 @@ -import { type RequestRetryOptions } from "../common.ts"; -import { type CommonClientConfig, type CommonClientData } from "./index.ts"; -import { type LastfmClientOptions } from "./lastfm.ts"; +import type {RequestRetryOptions} from "../common.ts"; +import type {CommonClientConfig, CommonClientData} from "./index.ts"; +import type {LastfmClientOptions} from "./lastfm.ts"; export interface LibrefmData extends CommonClientData, RequestRetryOptions { /** diff --git a/src/backend/common/infrastructure/config/client/listenbrainz.ts b/src/backend/common/infrastructure/config/client/listenbrainz.ts index d6d85846..802b2651 100644 --- a/src/backend/common/infrastructure/config/client/listenbrainz.ts +++ b/src/backend/common/infrastructure/config/client/listenbrainz.ts @@ -1,6 +1,6 @@ -import { type ComponentType } from "../../../../../core/Atomic.ts"; -import { type RequestRetryOptions } from "../common.ts"; -import { type CommonClientConfig, type CommonClientData } from "./index.ts"; +import type {ComponentType} from "../../../../../core/Atomic.ts"; +import type {RequestRetryOptions} from "../common.ts"; +import type {CommonClientConfig, CommonClientData} from "./index.ts"; export interface ListenBrainzData extends RequestRetryOptions{ /** diff --git a/src/backend/common/infrastructure/config/client/maloja.ts b/src/backend/common/infrastructure/config/client/maloja.ts index f5a2fb87..18cbe6ed 100644 --- a/src/backend/common/infrastructure/config/client/maloja.ts +++ b/src/backend/common/infrastructure/config/client/maloja.ts @@ -1,6 +1,6 @@ -import { type ComponentType } from "../../../../../core/Atomic.ts"; -import { type RequestRetryOptions } from "../common.ts"; -import { type CommonClientConfig, type CommonClientData } from "./index.ts"; +import type {ComponentType} from "../../../../../core/Atomic.ts"; +import type {RequestRetryOptions} from "../common.ts"; +import type {CommonClientConfig, CommonClientData} from "./index.ts"; export interface MalojaData extends RequestRetryOptions { /** diff --git a/src/backend/common/infrastructure/config/client/rocksky.ts b/src/backend/common/infrastructure/config/client/rocksky.ts index 0ae28374..9fa76126 100644 --- a/src/backend/common/infrastructure/config/client/rocksky.ts +++ b/src/backend/common/infrastructure/config/client/rocksky.ts @@ -1,5 +1,5 @@ -import { type RequestRetryOptions } from "../common.ts"; -import { type CommonClientConfig, type CommonClientData, type CommonClientOptions, type NowPlayingOptions } from "./index.ts"; +import type {RequestRetryOptions} from "../common.ts"; +import type {CommonClientConfig, CommonClientData, CommonClientOptions, NowPlayingOptions} from "./index.ts"; export interface RockSkyData extends RequestRetryOptions{ diff --git a/src/backend/common/infrastructure/config/client/tealfm.ts b/src/backend/common/infrastructure/config/client/tealfm.ts index ee846256..71faaaba 100644 --- a/src/backend/common/infrastructure/config/client/tealfm.ts +++ b/src/backend/common/infrastructure/config/client/tealfm.ts @@ -1,7 +1,7 @@ -import { type ComponentType } from "../../../../../core/Atomic.ts" -import { type RequestRetryOptions } from "../common.ts" -import { type ATProtoAppData, type ATProtoUserIdentifierData } from "./atproto.ts" -import { type CommonClientConfig, type CommonClientData, type CommonClientOptions } from "./index.ts" +import type {ComponentType} from "../../../../../core/Atomic.ts"; +import type {RequestRetryOptions} from "../common.ts"; +import type {ATProtoAppData, ATProtoUserIdentifierData} from "./atproto.ts"; +import type {CommonClientConfig, CommonClientData, CommonClientOptions} from "./index.ts"; export type TealData = RequestRetryOptions & ATProtoUserIdentifierData & Partial & { /** diff --git a/src/backend/common/infrastructure/config/database.ts b/src/backend/common/infrastructure/config/database.ts index dc4ee226..01cf2808 100644 --- a/src/backend/common/infrastructure/config/database.ts +++ b/src/backend/common/infrastructure/config/database.ts @@ -1,5 +1,5 @@ -import { type Duration } from "dayjs/plugin/duration.js"; -import { type DurationValue } from "../Atomic.ts"; +import type {Duration} from "dayjs/plugin/duration.js"; +import type {DurationValue} from "../Atomic.ts"; export type RetentionPlayType = 'failed' | 'completed' | 'duped'; export const retentionPlayTypes: RetentionPlayType[] = ['failed','completed','duped']; diff --git a/src/backend/common/infrastructure/config/source/azuracast.ts b/src/backend/common/infrastructure/config/source/azuracast.ts index c54d76be..16738997 100644 --- a/src/backend/common/infrastructure/config/source/azuracast.ts +++ b/src/backend/common/infrastructure/config/source/azuracast.ts @@ -1,4 +1,4 @@ -import { type CommonSourceConfig, type CommonSourceData, type CommonSourceOptions, type ManualListeningOptions } from "./index.ts"; +import type {CommonSourceConfig, CommonSourceData, CommonSourceOptions, ManualListeningOptions} from "./index.ts"; export interface AzuraStationInfoResponse { id: string diff --git a/src/backend/common/infrastructure/config/source/chromecast.ts b/src/backend/common/infrastructure/config/source/chromecast.ts index 5c1e4494..25b1177f 100644 --- a/src/backend/common/infrastructure/config/source/chromecast.ts +++ b/src/backend/common/infrastructure/config/source/chromecast.ts @@ -1,4 +1,4 @@ -import { type CommonSourceConfig, type CommonSourceData } from "./index.ts"; +import type {CommonSourceConfig, CommonSourceData} from "./index.ts"; export interface ChromecastData extends CommonSourceData { /** diff --git a/src/backend/common/infrastructure/config/source/deezer.ts b/src/backend/common/infrastructure/config/source/deezer.ts index 5a858945..2c3c6ff4 100644 --- a/src/backend/common/infrastructure/config/source/deezer.ts +++ b/src/backend/common/infrastructure/config/source/deezer.ts @@ -1,6 +1,6 @@ -import { type Second } from "../../../../../core/Atomic.ts"; -import { type PollingOptions } from "../common.ts"; -import { type CommonSourceConfig, type CommonSourceData, type CommonSourceOptions } from "./index.ts"; +import type {Second} from "../../../../../core/Atomic.ts"; +import type {PollingOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData, CommonSourceOptions} from "./index.ts"; export interface DeezerData extends CommonSourceData, PollingOptions { /** diff --git a/src/backend/common/infrastructure/config/source/endpointlfm.ts b/src/backend/common/infrastructure/config/source/endpointlfm.ts index 79331e8a..019ae6c0 100644 --- a/src/backend/common/infrastructure/config/source/endpointlfm.ts +++ b/src/backend/common/infrastructure/config/source/endpointlfm.ts @@ -1,4 +1,4 @@ -import { type CommonSourceConfig, type CommonSourceData } from "./index.ts"; +import type {CommonSourceConfig, CommonSourceData} from "./index.ts"; export interface LastFMEndpointData extends CommonSourceData { /** diff --git a/src/backend/common/infrastructure/config/source/endpointlz.ts b/src/backend/common/infrastructure/config/source/endpointlz.ts index 24090569..61427633 100644 --- a/src/backend/common/infrastructure/config/source/endpointlz.ts +++ b/src/backend/common/infrastructure/config/source/endpointlz.ts @@ -1,4 +1,4 @@ -import { type CommonSourceConfig, type CommonSourceData } from "./index.ts"; +import type {CommonSourceConfig, CommonSourceData} from "./index.ts"; export interface ListenbrainzEndpointData extends CommonSourceData { /** diff --git a/src/backend/common/infrastructure/config/source/icecast.ts b/src/backend/common/infrastructure/config/source/icecast.ts index 70b9293b..daf3dcef 100644 --- a/src/backend/common/infrastructure/config/source/icecast.ts +++ b/src/backend/common/infrastructure/config/source/icecast.ts @@ -1,4 +1,4 @@ -import { type CommonSourceConfig, type CommonSourceData, type CommonSourceOptions, type ManualListeningOptions } from "./index.ts"; +import type {CommonSourceConfig, CommonSourceData, CommonSourceOptions, ManualListeningOptions} from "./index.ts"; export interface IcecastMetadata { diff --git a/src/backend/common/infrastructure/config/source/index.ts b/src/backend/common/infrastructure/config/source/index.ts index ec287171..b58ab78f 100644 --- a/src/backend/common/infrastructure/config/source/index.ts +++ b/src/backend/common/infrastructure/config/source/index.ts @@ -1,9 +1,9 @@ -import { type FileLogOptions, type LogLevel } from "@foxxmd/logging"; +import type { FileLogOptions, LogLevel } from "@foxxmd/logging"; -import { type PlayTransformOptions } from "../../../../../core/Transform.ts"; -import { type CommonConfig, type RequestRetryOptions } from "../common.ts"; -import { type RetentionConfig } from "../database.ts"; -import { type DurationValue } from "../../Atomic.ts"; +import type { PlayTransformOptions } from "../../../../../core/Transform.ts"; +import type { CommonConfig, RequestRetryOptions } from "../common.ts"; +import type { RetentionConfig } from "../database.ts"; +import type { DurationValue } from "../../Atomic.ts"; export interface SourceRetryOptions extends RequestRetryOptions { /** diff --git a/src/backend/common/infrastructure/config/source/jellyfin.ts b/src/backend/common/infrastructure/config/source/jellyfin.ts index f92ec8b4..0328eec6 100644 --- a/src/backend/common/infrastructure/config/source/jellyfin.ts +++ b/src/backend/common/infrastructure/config/source/jellyfin.ts @@ -1,5 +1,5 @@ -import { type CommonSourceConfig, type CommonSourceData, type CommonSourceOptions } from "./index.ts"; -import { +import type {CommonSourceConfig, CommonSourceData, CommonSourceOptions} from "./index.ts"; +import type { // @ts-expect-error weird typings? CollectionType, // @ts-expect-error weird typings? diff --git a/src/backend/common/infrastructure/config/source/jriver.ts b/src/backend/common/infrastructure/config/source/jriver.ts index 20d6ef97..1d4f5e33 100644 --- a/src/backend/common/infrastructure/config/source/jriver.ts +++ b/src/backend/common/infrastructure/config/source/jriver.ts @@ -1,5 +1,5 @@ -import { type PollingOptions, type RequestRetryOptions } from "../common.ts"; -import { type CommonSourceConfig, type CommonSourceData } from "./index.ts"; +import type {PollingOptions, RequestRetryOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData} from "./index.ts"; export interface JRiverData extends CommonSourceData, PollingOptions, RequestRetryOptions { /** diff --git a/src/backend/common/infrastructure/config/source/kodi.ts b/src/backend/common/infrastructure/config/source/kodi.ts index df830e2a..6c71d4c2 100644 --- a/src/backend/common/infrastructure/config/source/kodi.ts +++ b/src/backend/common/infrastructure/config/source/kodi.ts @@ -1,5 +1,5 @@ -import { type PollingOptions } from "../common.ts"; -import { type CommonSourceConfig, type CommonSourceData } from "./index.ts"; +import type {PollingOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData} from "./index.ts"; export interface KodiData extends CommonSourceData, PollingOptions { diff --git a/src/backend/common/infrastructure/config/source/koito.ts b/src/backend/common/infrastructure/config/source/koito.ts index cace0007..784bb018 100644 --- a/src/backend/common/infrastructure/config/source/koito.ts +++ b/src/backend/common/infrastructure/config/source/koito.ts @@ -1,6 +1,6 @@ -import { type KoitoData } from "../client/koito.ts"; -import { type PollingOptions } from "../common.ts"; -import { type CommonSourceConfig, type CommonSourceData } from "./index.ts"; +import type {KoitoData} from "../client/koito.ts"; +import type {PollingOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData} from "./index.ts"; export interface KoitoSourceData extends KoitoData, CommonSourceData, PollingOptions { } diff --git a/src/backend/common/infrastructure/config/source/lastfm.ts b/src/backend/common/infrastructure/config/source/lastfm.ts index 9c8f8991..4fb02ca3 100644 --- a/src/backend/common/infrastructure/config/source/lastfm.ts +++ b/src/backend/common/infrastructure/config/source/lastfm.ts @@ -1,6 +1,6 @@ -import { type LastfmData } from "../client/lastfm.ts"; -import { type PollingOptions } from "../common.ts"; -import { type CommonSourceConfig, type CommonSourceData } from "./index.ts"; +import type {LastfmData} from "../client/lastfm.ts"; +import type {PollingOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData} from "./index.ts"; export interface LastFmSourceData extends CommonSourceData, PollingOptions, LastfmData{} diff --git a/src/backend/common/infrastructure/config/source/librefm.ts b/src/backend/common/infrastructure/config/source/librefm.ts index 589a6511..2637e6a8 100644 --- a/src/backend/common/infrastructure/config/source/librefm.ts +++ b/src/backend/common/infrastructure/config/source/librefm.ts @@ -1,6 +1,6 @@ -import { type LibrefmData } from "../client/librefm.ts"; -import { type PollingOptions } from "../common.ts"; -import { type CommonSourceConfig, type CommonSourceData } from "./index.ts"; +import type {LibrefmData} from "../client/librefm.ts"; +import type {PollingOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData} from "./index.ts"; export interface librefmSourceData extends CommonSourceData, PollingOptions, LibrefmData{} diff --git a/src/backend/common/infrastructure/config/source/listenbrainz.ts b/src/backend/common/infrastructure/config/source/listenbrainz.ts index b3a1cb75..029fde0b 100644 --- a/src/backend/common/infrastructure/config/source/listenbrainz.ts +++ b/src/backend/common/infrastructure/config/source/listenbrainz.ts @@ -1,6 +1,6 @@ -import { type ListenBrainzData } from "../client/listenbrainz.ts"; -import { type PollingOptions } from "../common.ts"; -import { type CommonSourceConfig, type CommonSourceData } from "./index.ts"; +import type {ListenBrainzData} from "../client/listenbrainz.ts"; +import type {PollingOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData} from "./index.ts"; export interface ListenBrainzSourceData extends ListenBrainzData, CommonSourceData, PollingOptions { } diff --git a/src/backend/common/infrastructure/config/source/maloja.ts b/src/backend/common/infrastructure/config/source/maloja.ts index 30020a02..67fed754 100644 --- a/src/backend/common/infrastructure/config/source/maloja.ts +++ b/src/backend/common/infrastructure/config/source/maloja.ts @@ -1,6 +1,6 @@ -import { type MalojaData } from "../client/maloja.ts"; -import { type PollingOptions } from "../common.ts"; -import { type CommonSourceConfig, type CommonSourceData } from "./index.ts"; +import type {MalojaData} from "../client/maloja.ts"; +import type {PollingOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData} from "./index.ts"; export interface MalojaSourceData extends MalojaData, CommonSourceData, PollingOptions { } diff --git a/src/backend/common/infrastructure/config/source/mopidy.ts b/src/backend/common/infrastructure/config/source/mopidy.ts index de7336fe..5acd3b93 100644 --- a/src/backend/common/infrastructure/config/source/mopidy.ts +++ b/src/backend/common/infrastructure/config/source/mopidy.ts @@ -1,5 +1,5 @@ -import { type PollingOptions } from "../common.ts"; -import { type CommonSourceConfig, type CommonSourceData } from "./index.ts"; +import type {PollingOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData} from "./index.ts"; export interface MopidyData extends CommonSourceData, PollingOptions { /** diff --git a/src/backend/common/infrastructure/config/source/mpd.ts b/src/backend/common/infrastructure/config/source/mpd.ts index fd500aa0..d6f31913 100644 --- a/src/backend/common/infrastructure/config/source/mpd.ts +++ b/src/backend/common/infrastructure/config/source/mpd.ts @@ -1,5 +1,5 @@ -import { type PollingOptions } from "../common.ts"; -import { type CommonSourceConfig, type CommonSourceData, type CommonSourceOptions } from "./index.ts"; +import type {PollingOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData, CommonSourceOptions} from "./index.ts"; export interface MPDData extends CommonSourceData, PollingOptions { /** diff --git a/src/backend/common/infrastructure/config/source/mpris.ts b/src/backend/common/infrastructure/config/source/mpris.ts index 53c23e86..d5ad3395 100644 --- a/src/backend/common/infrastructure/config/source/mpris.ts +++ b/src/backend/common/infrastructure/config/source/mpris.ts @@ -1,4 +1,4 @@ -import { type CommonSourceConfig, type CommonSourceData } from "./index.ts"; +import type {CommonSourceConfig, CommonSourceData} from "./index.ts"; export const PLAYBACK_STATUS_PLAYING = 'Playing'; export const PLAYBACK_STATUS_PAUSED = 'Paused'; diff --git a/src/backend/common/infrastructure/config/source/musiccast.ts b/src/backend/common/infrastructure/config/source/musiccast.ts index 68eb360b..5c433056 100644 --- a/src/backend/common/infrastructure/config/source/musiccast.ts +++ b/src/backend/common/infrastructure/config/source/musiccast.ts @@ -1,5 +1,6 @@ -import { REPORTED_PLAYER_STATUSES, type ReportedPlayerStatus } from "../../Atomic.ts"; -import { type CommonSourceConfig, type CommonSourceData } from "./index.ts"; +import { REPORTED_PLAYER_STATUSES } from '../../../../../core/Atomic.ts'; +import type {ReportedPlayerStatus} from '../../../../../core/Atomic.ts'; +import type {CommonSourceConfig, CommonSourceData} from "./index.ts"; export type PlaybackStatus = 'play' | 'stop' | 'pause' | 'fast_reverse' | 'fast_forward' diff --git a/src/backend/common/infrastructure/config/source/musikcube.ts b/src/backend/common/infrastructure/config/source/musikcube.ts index 26153f5a..bcbc6dc2 100644 --- a/src/backend/common/infrastructure/config/source/musikcube.ts +++ b/src/backend/common/infrastructure/config/source/musikcube.ts @@ -1,4 +1,4 @@ -import { type CommonSourceConfig, type CommonSourceData } from "./index.ts"; +import type {CommonSourceConfig, CommonSourceData} from "./index.ts"; export const PLAYBACK_STATUS_PLAYING_MC = 'playing'; export const PLAYBACK_STATUS_PAUSED_MC = 'paused'; diff --git a/src/backend/common/infrastructure/config/source/plex.ts b/src/backend/common/infrastructure/config/source/plex.ts index df1b066f..54882b75 100644 --- a/src/backend/common/infrastructure/config/source/plex.ts +++ b/src/backend/common/infrastructure/config/source/plex.ts @@ -1,5 +1,5 @@ -import { type PollingOptions } from "../common.ts"; -import { type CommonSourceConfig, type CommonSourceData, type CommonSourceOptions } from "./index.ts"; +import type {PollingOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData, CommonSourceOptions} from "./index.ts"; export interface PlexApiData extends CommonSourceData, PollingOptions { token?: string diff --git a/src/backend/common/infrastructure/config/source/rocksky.ts b/src/backend/common/infrastructure/config/source/rocksky.ts index 3032ef87..df1d03c1 100644 --- a/src/backend/common/infrastructure/config/source/rocksky.ts +++ b/src/backend/common/infrastructure/config/source/rocksky.ts @@ -1,6 +1,6 @@ -import { type RockSkyData, type RockSkyOptions } from "../client/rocksky.ts"; -import { type PollingOptions } from "../common.ts"; -import { type CommonSourceConfig, type CommonSourceData, type CommonSourceOptions } from "./index.ts"; +import type {RockSkyData, RockSkyOptions} from "../client/rocksky.ts"; +import type {PollingOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData, CommonSourceOptions} from "./index.ts"; export interface RockskySourceData extends RockSkyData, CommonSourceData, PollingOptions { } diff --git a/src/backend/common/infrastructure/config/source/sonos.ts b/src/backend/common/infrastructure/config/source/sonos.ts index f3c7b026..df55522f 100644 --- a/src/backend/common/infrastructure/config/source/sonos.ts +++ b/src/backend/common/infrastructure/config/source/sonos.ts @@ -1,5 +1,5 @@ -import { type PollingOptions } from "../common.ts"; -import { type CommonSourceConfig, type CommonSourceData, type CommonSourceOptions } from "./index.ts"; +import type {PollingOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData, CommonSourceOptions} from "./index.ts"; export interface SonosData extends CommonSourceData, PollingOptions { /** diff --git a/src/backend/common/infrastructure/config/source/sources.ts b/src/backend/common/infrastructure/config/source/sources.ts index 32629757..e12dfbb1 100644 --- a/src/backend/common/infrastructure/config/source/sources.ts +++ b/src/backend/common/infrastructure/config/source/sources.ts @@ -1,32 +1,32 @@ -import { type AzuracastSourceAIOConfig, type AzuracastSourceConfig } from "./azuracast.ts"; -import { type ChromecastSourceAIOConfig, type ChromecastSourceConfig } from "./chromecast.ts"; -import { type ListenbrainzEndpointSourceAIOConfig, type ListenbrainzEndpointSourceConfig } from "./endpointlz.ts"; -import { type LastFMEndpointSourceAIOConfig, type LastFMEndpointSourceConfig } from "./endpointlfm.ts"; -import { type DeezerInternalSourceConfig, type DeezerSourceConfig, type DeezerCompatConfig, type DeezerAIOCompatConfig } from "./deezer.ts"; -import { type JellyApiSourceAIOConfig, type JellyApiSourceConfig } from "./jellyfin.ts"; -import { type JRiverSourceAIOConfig, type JRiverSourceConfig } from "./jriver.ts"; -import { type KodiSourceAIOConfig, type KodiSourceConfig } from "./kodi.ts"; -import { type LastFmSouceAIOConfig, type LastfmSourceConfig } from "./lastfm.ts"; -import { type ListenBrainzSourceAIOConfig, type ListenBrainzSourceConfig } from "./listenbrainz.ts"; -import { type MopidySourceAIOConfig, type MopidySourceConfig } from "./mopidy.ts"; -import { type MPDSourceAIOConfig, type MPDSourceConfig } from "./mpd.ts"; -import { type MPRISSourceAIOConfig, type MPRISSourceConfig } from "./mpris.ts"; -import { type MusikcubeSourceAIOConfig, type MusikcubeSourceConfig } from "./musikcube.ts"; -import { type MusicCastSourceConfig, type MusicCastSourceAIOConfig } from "./musiccast.ts"; -import { type PlexApiSourceConfig, type PlexApiSourceAIOConfig } from "./plex.ts"; -import { type SpotifySourceAIOConfig, type SpotifySourceConfig } from "./spotify.ts"; -import { type SubsonicSourceAIOConfig, type SubSonicSourceConfig } from "./subsonic.ts"; -import { type VLCSourceAIOConfig, type VLCSourceConfig } from "./vlc.ts"; -import { type WebScrobblerSourceAIOConfig, type WebScrobblerSourceConfig } from "./webscrobbler.ts"; -import { type YTMusicSourceAIOConfig, type YTMusicSourceConfig } from "./ytmusic.ts"; -import { type YandexMusicBridgeSourceAIOConfig, type YandexMusicBridgeSourceConfig } from "./ymbridge.ts"; -import { type IcecastSourceAIOConfig, type IcecastSourceConfig } from "./icecast.ts"; -import { type KoitoSourceAIOConfig, type KoitoSourceConfig } from "./koito.ts"; -import { type MalojaSourceAIOConfig, type MalojaSourceConfig } from "./maloja.ts"; -import { type TealSourceAIOConfig, type TealSourceConfig } from "./tealfm.ts"; -import { type RockskySourceAIOConfig, type RockskySourceConfig } from "./rocksky.ts"; -import { type LibrefmSouceAIOConfig, type LibrefmSourceConfig } from "./librefm.ts"; -import { type SonosSourceAIOConfig, type SonosSourceConfig } from "./sonos.ts"; +import type {AzuracastSourceAIOConfig, AzuracastSourceConfig} from "./azuracast.ts"; +import type {ChromecastSourceAIOConfig, ChromecastSourceConfig} from "./chromecast.ts"; +import type {ListenbrainzEndpointSourceAIOConfig, ListenbrainzEndpointSourceConfig} from "./endpointlz.ts"; +import type {LastFMEndpointSourceAIOConfig, LastFMEndpointSourceConfig} from "./endpointlfm.ts"; +import type {DeezerInternalSourceConfig, DeezerSourceConfig, DeezerCompatConfig, DeezerAIOCompatConfig} from "./deezer.ts"; +import type {JellyApiSourceAIOConfig, JellyApiSourceConfig} from "./jellyfin.ts"; +import type {JRiverSourceAIOConfig, JRiverSourceConfig} from "./jriver.ts"; +import type {KodiSourceAIOConfig, KodiSourceConfig} from "./kodi.ts"; +import type {LastFmSouceAIOConfig, LastfmSourceConfig} from "./lastfm.ts"; +import type {ListenBrainzSourceAIOConfig, ListenBrainzSourceConfig} from "./listenbrainz.ts"; +import type {MopidySourceAIOConfig, MopidySourceConfig} from "./mopidy.ts"; +import type {MPDSourceAIOConfig, MPDSourceConfig} from "./mpd.ts"; +import type {MPRISSourceAIOConfig, MPRISSourceConfig} from "./mpris.ts"; +import type {MusikcubeSourceAIOConfig, MusikcubeSourceConfig} from "./musikcube.ts"; +import type {MusicCastSourceConfig, MusicCastSourceAIOConfig} from "./musiccast.ts"; +import type {PlexApiSourceConfig, PlexApiSourceAIOConfig} from "./plex.ts"; +import type {SpotifySourceAIOConfig, SpotifySourceConfig} from "./spotify.ts"; +import type {SubsonicSourceAIOConfig, SubSonicSourceConfig} from "./subsonic.ts"; +import type {VLCSourceAIOConfig, VLCSourceConfig} from "./vlc.ts"; +import type {WebScrobblerSourceAIOConfig, WebScrobblerSourceConfig} from "./webscrobbler.ts"; +import type {YTMusicSourceAIOConfig, YTMusicSourceConfig} from "./ytmusic.ts"; +import type {YandexMusicBridgeSourceAIOConfig, YandexMusicBridgeSourceConfig} from "./ymbridge.ts"; +import type {IcecastSourceAIOConfig, IcecastSourceConfig} from "./icecast.ts"; +import type {KoitoSourceAIOConfig, KoitoSourceConfig} from "./koito.ts"; +import type {MalojaSourceAIOConfig, MalojaSourceConfig} from "./maloja.ts"; +import type {TealSourceAIOConfig, TealSourceConfig} from "./tealfm.ts"; +import type {RockskySourceAIOConfig, RockskySourceConfig} from "./rocksky.ts"; +import type {LibrefmSouceAIOConfig, LibrefmSourceConfig} from "./librefm.ts"; +import type {SonosSourceAIOConfig, SonosSourceConfig} from "./sonos.ts"; export type SourceConfig = @@ -130,69 +130,6 @@ export type RockskySourceConfigs = RockskySourceConfig[]; export type SonosSourceConfigs = SonosSourceConfig[]; -export type SourceType = - 'spotify' - | 'plex' - | 'subsonic' - | 'jellyfin' - | 'lastfm' - | 'librefm' - | 'deezer' - | 'endpointlz' - | 'endpointlfm' - | 'ytmusic' - | 'ymbridge' - | 'mpris' - | 'mopidy' - | 'musiccast' - | 'listenbrainz' - | 'jriver' - | 'kodi' - | 'webscrobbler' - | 'chromecast' - | 'maloja' - | 'musikcube' - | 'mpd' - | 'vlc' - | 'icecast' - | 'azuracast' - | 'koito' - | 'tealfm' - | 'rocksky' - | 'sonos'; - -export const sourceTypes: SourceType[] = [ - 'spotify', - 'plex', - 'subsonic', - 'jellyfin', - 'lastfm', - 'librefm', - 'deezer', - 'endpointlz', - 'endpointlfm', - 'ytmusic', - 'ymbridge', - 'mpris', - 'mopidy', - 'musiccast', - 'listenbrainz', - 'jriver', - 'kodi', - 'webscrobbler', - 'chromecast', - 'maloja', - 'musikcube', - 'mpd', - 'vlc', - 'icecast', - 'azuracast', - 'koito', - 'tealfm', - 'rocksky', - 'sonos' -]; - export const atomicSourceInterfaces = [ 'SpotifySourceConfig', 'PlexApiSourceConfig', @@ -230,7 +167,4 @@ export const sourceInterfaces = [ ...atomicSourceInterfaces ]; -export const isSourceType = (data: string): data is SourceType => { - return sourceTypes.includes(data as SourceType); -}; diff --git a/src/backend/common/infrastructure/config/source/spotify.ts b/src/backend/common/infrastructure/config/source/spotify.ts index 86c6987c..ab94ca20 100644 --- a/src/backend/common/infrastructure/config/source/spotify.ts +++ b/src/backend/common/infrastructure/config/source/spotify.ts @@ -1,5 +1,5 @@ -import { type PollingOptions } from "../common.ts"; -import { type CommonSourceConfig, type CommonSourceData } from "./index.ts"; +import type {PollingOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData} from "./index.ts"; export interface SpotifySourceData extends CommonSourceData, PollingOptions { /** diff --git a/src/backend/common/infrastructure/config/source/subsonic.ts b/src/backend/common/infrastructure/config/source/subsonic.ts index 2a166ebf..aa917e03 100644 --- a/src/backend/common/infrastructure/config/source/subsonic.ts +++ b/src/backend/common/infrastructure/config/source/subsonic.ts @@ -1,5 +1,5 @@ -import { type PollingOptions } from "../common.ts"; -import { type CommonSourceConfig, type CommonSourceData } from "./index.ts"; +import type {PollingOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData} from "./index.ts"; export interface SubsonicData extends CommonSourceData, PollingOptions { /** diff --git a/src/backend/common/infrastructure/config/source/tealfm.ts b/src/backend/common/infrastructure/config/source/tealfm.ts index 9315b642..802db69d 100644 --- a/src/backend/common/infrastructure/config/source/tealfm.ts +++ b/src/backend/common/infrastructure/config/source/tealfm.ts @@ -1,6 +1,6 @@ -import { type TealData, type TealOptions } from "../client/tealfm.ts" -import { type PollingOptions } from "../common.ts" -import { type CommonSourceConfig, type CommonSourceData, type CommonSourceOptions } from "./index.ts" +import type {TealData, TealOptions} from "../client/tealfm.ts"; +import type {PollingOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData, CommonSourceOptions} from "./index.ts"; export interface TealSourceData extends TealData, CommonSourceData, PollingOptions { diff --git a/src/backend/common/infrastructure/config/source/vlc.ts b/src/backend/common/infrastructure/config/source/vlc.ts index 63ccd807..f75c829f 100644 --- a/src/backend/common/infrastructure/config/source/vlc.ts +++ b/src/backend/common/infrastructure/config/source/vlc.ts @@ -1,6 +1,6 @@ -import { type VlcMeta } from "vlc-client/dist/Types.js"; -import { type PollingOptions } from "../common.ts"; -import { type CommonSourceConfig, type CommonSourceData, type CommonSourceOptions } from "./index.ts"; +import type {VlcMeta} from "vlc-client/dist/Types.js"; +import type {PollingOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData, CommonSourceOptions} from "./index.ts"; export interface VLCData extends CommonSourceData, PollingOptions { /** diff --git a/src/backend/common/infrastructure/config/source/webscrobbler.ts b/src/backend/common/infrastructure/config/source/webscrobbler.ts index f3362bad..f90d1c67 100644 --- a/src/backend/common/infrastructure/config/source/webscrobbler.ts +++ b/src/backend/common/infrastructure/config/source/webscrobbler.ts @@ -1,4 +1,4 @@ -import { type CommonSourceConfig, type CommonSourceData } from "./index.ts"; +import type {CommonSourceConfig, CommonSourceData} from "./index.ts"; export interface WebScrobblerData extends CommonSourceData { /** diff --git a/src/backend/common/infrastructure/config/source/ymbridge.ts b/src/backend/common/infrastructure/config/source/ymbridge.ts index b11484c8..b9dde3a8 100644 --- a/src/backend/common/infrastructure/config/source/ymbridge.ts +++ b/src/backend/common/infrastructure/config/source/ymbridge.ts @@ -1,5 +1,5 @@ -import { type PollingOptions } from "../common.ts"; -import { type CommonSourceConfig, type CommonSourceData } from "./index.ts"; +import type {PollingOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData} from "./index.ts"; export interface YandexMusicBridgeData extends CommonSourceData, PollingOptions { /** URL of the local Python bridge, for example http://yandex-music-bridge:9980 */ diff --git a/src/backend/common/infrastructure/config/source/ytmusic.ts b/src/backend/common/infrastructure/config/source/ytmusic.ts index 4e40bd99..1d08c42a 100644 --- a/src/backend/common/infrastructure/config/source/ytmusic.ts +++ b/src/backend/common/infrastructure/config/source/ytmusic.ts @@ -1,5 +1,5 @@ -import { type PollingOptions } from "../common.ts"; -import { type CommonSourceConfig, type CommonSourceData, type CommonSourceOptions } from "./index.ts"; +import type {PollingOptions} from "../common.ts"; +import type {CommonSourceConfig, CommonSourceData, CommonSourceOptions} from "./index.ts"; export interface InnertubeOptions { /** diff --git a/src/backend/common/logging.ts b/src/backend/common/logging.ts index 43dbbda4..0773beb8 100644 --- a/src/backend/common/logging.ts +++ b/src/backend/common/logging.ts @@ -1,6 +1,7 @@ import { type FileLogOptions, type Logger, loggerAppRolling, type LogLevel, type LogLevelStreamEntry, type LogOptions, parseLogOptions } from '@foxxmd/logging'; import { buildDestinationJsonPrettyStream, buildDestinationRollingFile, buildDestinationStdout, buildLogger } from "@foxxmd/logging/factory"; -import { PassThrough, Transform } from "node:stream"; +import type { Transform } from "node:stream"; +import { PassThrough } from "node:stream"; import path from "path"; import process from "process"; import { projectDir } from "./index.ts"; diff --git a/src/backend/common/transforms/AbstractTransformer.ts b/src/backend/common/transforms/AbstractTransformer.ts index 10e2de12..c2bc8c73 100644 --- a/src/backend/common/transforms/AbstractTransformer.ts +++ b/src/backend/common/transforms/AbstractTransformer.ts @@ -1,15 +1,16 @@ import { childLogger, type Logger } from "@foxxmd/logging"; -import { type PlayObject, type TransformerCommon, type TransformerCommonConfig } from "../../../core/Atomic.ts"; +import type { PlayObject, TransformerCommon, TransformerCommonConfig } from "../../../core/Atomic.ts"; import { isStageTyped, testWhenConditions } from "../../utils/PlayTransformUtils.ts"; import AbstractInitializable from "../AbstractInitializable.ts"; -import { type StageConfig } from "../../../core/Transform.ts"; -import { cacheFunctions, parseToRegexOrLiteralSearch, testMaybeRegex, searchAndReplace} from "@foxxmd/regex-buddy-core"; -import { Cacheable } from "cacheable"; +import type { StageConfig } from "../../../core/Transform.ts"; +import type { cacheFunctions} from "@foxxmd/regex-buddy-core"; +import { parseToRegexOrLiteralSearch, testMaybeRegex, searchAndReplace} from "@foxxmd/regex-buddy-core"; +import type { Cacheable } from "cacheable"; import { hashObject } from "../../utils/StringUtils.ts"; import { playContentInvariantTransform } from "../../utils/PlayComparisonUtils.ts"; import { SkipTransformStageError, StagePrerequisiteError } from "../errors/MSErrors.ts"; import { capitalize } from "../../../core/StringUtils.ts"; -import { type StaggerOptions } from "../../utils/AsyncUtils.ts"; +import type { StaggerOptions } from "../../utils/AsyncUtils.ts"; export interface TransformerOptions { logger: Logger diff --git a/src/backend/common/transforms/AtomicPartsTransformer.ts b/src/backend/common/transforms/AtomicPartsTransformer.ts index e3f6b7ee..75e4cf36 100644 --- a/src/backend/common/transforms/AtomicPartsTransformer.ts +++ b/src/backend/common/transforms/AtomicPartsTransformer.ts @@ -1,5 +1,5 @@ import { type ArtistCredit, isPlayObject, type ObjectPlayData, type PlayObject, type TrackMeta } from "../../../core/Atomic.ts"; -import { type AtomicStageConfig, type StageConfig } from "../../../core/Transform.ts"; +import type {AtomicStageConfig, StageConfig} from "../../../core/Transform.ts"; import AbstractTransformer from "./AbstractTransformer.ts"; //export type GenericAtomicStageConfig = diff --git a/src/backend/common/transforms/MusicbrainzTransformer.ts b/src/backend/common/transforms/MusicbrainzTransformer.ts index 236cc8a8..f1434010 100644 --- a/src/backend/common/transforms/MusicbrainzTransformer.ts +++ b/src/backend/common/transforms/MusicbrainzTransformer.ts @@ -1,21 +1,21 @@ import { type ArtistCredit, asMBReleasePrimaryGroupType, asMBReleaseSecondaryGroupType, asMBReleaseStatus, DEFAULT_MISSING_TYPES, type LifecycleInput, type MBReleaseGroupPrimaryType, type MBReleaseGroupSecondaryType, type MBReleaseStatus, type MissingMbidType, type PlayObject, type TrackMeta, type TransformerCommon, type TransformOptions } from "../../../core/Atomic.ts"; import { isWhenCondition, testWhenConditions } from "../../utils/PlayTransformUtils.ts"; -import { type WebhookPayload } from "../infrastructure/config/health/webhooks.ts"; -import { type ExternalMetadataTerm, type PlayTransformMetadataStage } from "../../../core/Transform.ts"; +import type {WebhookPayload} from "../infrastructure/config/health/webhooks.ts"; +import type {ExternalMetadataTerm, PlayTransformMetadataStage} from "../../../core/Transform.ts"; import AtomicPartsTransformer from "./AtomicPartsTransformer.ts"; -import { type TransformerOptions } from "./AbstractTransformer.ts"; +import type {TransformerOptions} from "./AbstractTransformer.ts"; import { ARTIST_WEIGHT, type MusicbrainzApiConfigData, TITLE_WEIGHT } from "../infrastructure/Atomic.ts"; import { DELIMITERS } from '../../../core/Atomic.ts'; import { MaybeLogger } from '../MaybeLogger.ts'; import { childLogger } from "@foxxmd/logging"; import { MusicbrainzApiClient, recordingToPlay, type UsingTypes } from "../vendor/musicbrainz/MusicbrainzApiClient.ts"; -import { type IRecordingList, type IRecordingMatch } from "musicbrainz-api"; +import type {IRecordingList, IRecordingMatch} from "musicbrainz-api"; import { intersect, missingMbidTypes } from "../../utils.ts"; import { removeUndefinedKeys } from '../../../core/DataUtils.ts'; import { SimpleError, SkipTransformStageError, StagePrerequisiteError, StageTransformError } from "../errors/MSErrors.ts"; import { parseArrayFromMaybeString, scoreNormalizedStringsWeighted } from "../../utils/StringUtils.ts"; import clone from "clone"; -import { Cacheable } from "cacheable"; +import type { Cacheable } from "cacheable"; import { splitByFirstRegexFound } from "../../../core/StringUtils.ts"; import { nativeParse } from "./NativeTransformer.ts"; import { comparePlayArtistsNormalized, scoreTrackWeightedAndNormalized } from "../../utils/PlayComparisonUtils.ts"; diff --git a/src/backend/common/transforms/NativeTransformer.ts b/src/backend/common/transforms/NativeTransformer.ts index f5e1dd11..0be0558d 100644 --- a/src/backend/common/transforms/NativeTransformer.ts +++ b/src/backend/common/transforms/NativeTransformer.ts @@ -1,11 +1,11 @@ -import { type ArtistCredit, type PlayObject, type TransformerCommon } from "../../../core/Atomic.ts"; +import type {ArtistCredit, PlayObject, TransformerCommon} from "../../../core/Atomic.ts"; import { isWhenCondition, testWhenConditions } from "../../utils/PlayTransformUtils.ts"; -import { type WebhookPayload } from "../infrastructure/config/health/webhooks.ts"; -import { type ExternalMetadataTerm, type PlayTransformNativeStage } from "../../../core/Transform.ts"; +import type {WebhookPayload} from "../infrastructure/config/health/webhooks.ts"; +import type {ExternalMetadataTerm, PlayTransformNativeStage} from "../../../core/Transform.ts"; import AtomicPartsTransformer from "./AtomicPartsTransformer.ts"; import { parseArtistCredits, parseTrackCredits, uniqueNormalizedStrArr } from "../../utils/StringUtils.ts"; import { parseRegexSingle, parseToRegexOrLiteralSearch } from "@foxxmd/regex-buddy-core"; -import { type TransformerOptions } from "./AbstractTransformer.ts"; +import type {TransformerOptions} from "./AbstractTransformer.ts"; import { DELIMITERS_NO_AMP } from '../../../core/Atomic.ts'; import { asArray } from "../../utils/DataUtils.ts"; import { MaybeLogger } from '../MaybeLogger.ts'; diff --git a/src/backend/common/transforms/TransformerManager.ts b/src/backend/common/transforms/TransformerManager.ts index 5a1ea178..0d269d2f 100644 --- a/src/backend/common/transforms/TransformerManager.ts +++ b/src/backend/common/transforms/TransformerManager.ts @@ -1,11 +1,11 @@ import { childLogger, type Logger } from "@foxxmd/logging"; -import AbstractTransformer from "./AbstractTransformer.ts"; -import { type TransformerCommonConfig } from "../../../core/Atomic.ts"; +import type AbstractTransformer from "./AbstractTransformer.ts"; +import type {TransformerCommonConfig} from "../../../core/Atomic.ts"; import UserTransformer from "./UserTransformer.ts"; -import { type StageConfig } from "../../../core/Transform.ts"; -import { type PlayObject } from "../../../core/Atomic.ts"; +import type {StageConfig} from "../../../core/Transform.ts"; +import type {PlayObject} from "../../../core/Atomic.ts"; import { isStageTyped } from "../../utils/PlayTransformUtils.ts"; -import { MSCache } from "../Cache.ts"; +import type { MSCache } from "../Cache.ts"; import NativeTransformer from "./NativeTransformer.ts"; import MusicbrainzTransformer, { configFromEnv, type MusicbrainzTransformerConfig } from "./MusicbrainzTransformer.ts"; import { AsyncLocalStorage } from 'node:async_hooks'; diff --git a/src/backend/common/transforms/UserTransformer.ts b/src/backend/common/transforms/UserTransformer.ts index 09d96a2c..424f7b31 100644 --- a/src/backend/common/transforms/UserTransformer.ts +++ b/src/backend/common/transforms/UserTransformer.ts @@ -1,8 +1,8 @@ import { searchAndReplace } from "@foxxmd/regex-buddy-core"; -import { type ArtistCredit, type PlayObject } from "../../../core/Atomic.ts"; +import type {ArtistCredit, PlayObject} from "../../../core/Atomic.ts"; import { configValToSearchReplace, isSearchAndReplaceTerm, isUserStage, testWhenConditions } from "../../utils/PlayTransformUtils.ts"; -import { type WebhookPayload } from "../infrastructure/config/health/webhooks.ts"; -import { type ConditionalSearchAndReplaceRegExp, type PlayTransformUserStage } from "../../../core/Transform.ts"; +import type {WebhookPayload} from "../infrastructure/config/health/webhooks.ts"; +import type {ConditionalSearchAndReplaceRegExp, PlayTransformUserStage} from "../../../core/Transform.ts"; import AtomicPartsTransformer from "./AtomicPartsTransformer.ts"; export default class UserTransformer extends AtomicPartsTransformer { diff --git a/src/backend/common/vendor/AbstractApiClient.ts b/src/backend/common/vendor/AbstractApiClient.ts index 6d84c387..80ef8957 100644 --- a/src/backend/common/vendor/AbstractApiClient.ts +++ b/src/backend/common/vendor/AbstractApiClient.ts @@ -1,7 +1,7 @@ import { childLogger, type Logger } from "@foxxmd/logging"; -import { type PlayObject } from "../../../core/Atomic.ts"; +import type { PlayObject } from "../../../core/Atomic.ts"; import { capitalize } from "../../../core/StringUtils.ts"; -import { type AbstractApiOptions, type FormatPlayObjectOptions } from "../infrastructure/Atomic.ts"; +import type { AbstractApiOptions, FormatPlayObjectOptions } from "../infrastructure/Atomic.ts"; export default abstract class AbstractApiClient { name: string; diff --git a/src/backend/common/vendor/JRiverApiClient.ts b/src/backend/common/vendor/JRiverApiClient.ts index 588f7d41..1a7cab90 100644 --- a/src/backend/common/vendor/JRiverApiClient.ts +++ b/src/backend/common/vendor/JRiverApiClient.ts @@ -1,7 +1,8 @@ -import request, { Request, Response } from 'superagent'; +import type { Request, Response } from 'superagent'; +import request from 'superagent'; import xml2js from 'xml2js'; import { type AbstractApiOptions, DEFAULT_RETRY_MULTIPLIER } from "../infrastructure/Atomic.ts"; -import { type JRiverData } from "../infrastructure/config/source/jriver.ts"; +import type {JRiverData} from "../infrastructure/config/source/jriver.ts"; import AbstractApiClient from "./AbstractApiClient.ts"; const parser = new xml2js.Parser({'async': true}); diff --git a/src/backend/common/vendor/KodiApiClient.ts b/src/backend/common/vendor/KodiApiClient.ts index d6c4b8fe..de3b12d6 100644 --- a/src/backend/common/vendor/KodiApiClient.ts +++ b/src/backend/common/vendor/KodiApiClient.ts @@ -2,10 +2,10 @@ import dayjs from "dayjs"; import { KodiClient } from 'kodi-api' import normalizeUrl from "normalize-url"; import { URL } from "url"; -import { type PlayObject, type PlayObjectMinimal } from "../../../core/Atomic.ts"; -import { type RecentlyPlayedOptions } from "../../sources/AbstractSource.ts"; -import { type AbstractApiOptions, type FormatPlayObjectOptions } from "../infrastructure/Atomic.ts"; -import { type KodiData } from "../infrastructure/config/source/kodi.ts"; +import type {PlayObject, PlayObjectMinimal} from "../../../core/Atomic.ts"; +import type {RecentlyPlayedOptions} from "../../sources/AbstractSource.ts"; +import type {AbstractApiOptions, FormatPlayObjectOptions} from "../infrastructure/Atomic.ts"; +import type {KodiData} from "../infrastructure/config/source/kodi.ts"; import AbstractApiClient from "./AbstractApiClient.ts"; import { baseFormatPlayObj } from "../../utils/PlayTransformUtils.ts"; import { artistNamesToCredits } from "../../../core/StringUtils.ts"; diff --git a/src/backend/common/vendor/LastfmApiClient.ts b/src/backend/common/vendor/LastfmApiClient.ts index a5546a36..40032383 100644 --- a/src/backend/common/vendor/LastfmApiClient.ts +++ b/src/backend/common/vendor/LastfmApiClient.ts @@ -1,5 +1,5 @@ import dayjs, { type Dayjs, type ManipulateType } from "dayjs"; -import { type BrainzMeta, type PlayObject, type PlayObjectMinimal, type ScrobbleActionResult, type UnixTimestamp, type URLData, type Writeable } from "../../../core/Atomic.ts"; +import type {BrainzMeta, PlayObject, PlayObjectMinimal, ScrobbleActionResult, UnixTimestamp, URLData, Writeable} from "../../../core/Atomic.ts"; import { artistNamesToCredits, artistNameToCredit, nonEmptyStringOrDefault, splitByFirstFound } from "../../../core/StringUtils.ts"; import { sleep } from "../../utils.ts"; import { removeUndefinedKeys } from '../../../core/DataUtils.ts'; @@ -10,12 +10,12 @@ import { getScrobbleTsSOCDate } from "../../utils/TimeUtils.ts"; import { getNodeNetworkException, isNodeNetworkException } from "../errors/NodeErrors.ts"; import { UpstreamError } from "../errors/UpstreamError.ts"; import { type AbstractApiOptions, DEFAULT_RETRY_MULTIPLIER, type FormatPlayObjectOptions, type InternalConfigOptional, type PaginatedListensTimeRangeOptions, type PaginatedTimeRangeListens, type PaginatedTimeRangeListensResult } from "../infrastructure/Atomic.ts"; -import { type LastfmData } from "../infrastructure/config/client/lastfm.ts"; +import type {LastfmData} from "../infrastructure/config/client/lastfm.ts"; import AbstractApiClient from "./AbstractApiClient.ts"; import { normalizeStr, parseArtistCredits } from "../../utils/StringUtils.ts"; import { LastFMUser, LastFMAuth, LastFMTrack, type LastFMUserGetRecentTracksResponse, type LastFMBooleanNumber, type LastFMUpdateNowPlayingResponse, type LastFMUserGetInfoResponse, type LastFMUserGetRecentTracksParams } from 'lastfm-ts-api'; import clone from 'clone'; -import { IncomingMessage } from "http"; +import type { IncomingMessage } from "http"; import { baseFormatPlayObj } from "../../utils/PlayTransformUtils.ts"; import { ScrobbleSubmitError, SimpleError } from "../errors/MSErrors.ts"; import { redactString } from "@foxxmd/redact-string"; @@ -237,7 +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 }); } } diff --git a/src/backend/common/vendor/ListenbrainzApiClient.ts b/src/backend/common/vendor/ListenbrainzApiClient.ts index 18805ee0..202d786f 100644 --- a/src/backend/common/vendor/ListenbrainzApiClient.ts +++ b/src/backend/common/vendor/ListenbrainzApiClient.ts @@ -1,7 +1,8 @@ import { stringSameness } from '@foxxmd/string-sameness'; import dayjs from "dayjs"; -import request, { Request, Response } from 'superagent'; -import { type BrainzMeta, type PlayObject, type PlayObjectMinimal, type ScrobbleActionResult, type UnixTimestamp, type URLData } from "../../../core/Atomic.ts"; +import type { Request, Response } from 'superagent'; +import request from 'superagent'; +import type {BrainzMeta, PlayObject, PlayObjectMinimal, ScrobbleActionResult, UnixTimestamp, URLData} from "../../../core/Atomic.ts"; import { artistNamesToCredits, combinePartsToString, slice } from "../../../core/StringUtils.ts"; import { normalizeListenbrainzUrl, @@ -20,7 +21,7 @@ import AbstractApiClient from "./AbstractApiClient.ts"; import { getBaseFromUrl, isPortReachableConnect, joinedUrl, normalizeWebAddress } from '../../utils/NetworkUtils.ts'; import { unique } from '../../utils.ts'; import { removeUndefinedKeys } from '../../../core/DataUtils.ts'; -import { type ListenPayload, type ListenResponse, type ListenType, type SubmitPayload } from '../../../core/vendor/listenbrainz/interfaces.ts'; +import type {ListenPayload, ListenResponse, ListenType, SubmitPayload} from '../../../core/vendor/listenbrainz/interfaces.ts'; import { baseFormatPlayObj } from '../../utils/PlayTransformUtils.ts'; import { ScrobbleSubmitError, SimpleError } from '../errors/MSErrors.ts'; import pRetry from 'p-retry'; diff --git a/src/backend/common/vendor/RockSkyApiClient.ts b/src/backend/common/vendor/RockSkyApiClient.ts index 0210c1f1..9f0b9495 100644 --- a/src/backend/common/vendor/RockSkyApiClient.ts +++ b/src/backend/common/vendor/RockSkyApiClient.ts @@ -1,24 +1,25 @@ import dayjs from "dayjs"; -import request, { Request, Response } from 'superagent'; -import { type PlayObject, type PlayObjectMinimal, type ScrobbleActionResult, type URLData } from "../../../core/Atomic.ts"; +import type { Request, Response } from 'superagent'; +import request from 'superagent'; +import type {PlayObject, PlayObjectMinimal, ScrobbleActionResult, URLData} from "../../../core/Atomic.ts"; import { artistCreditsToNames, artistNamesToCredits, nonEmptyStringOrDefault } from "../../../core/StringUtils.ts"; import { UpstreamError } from "../errors/UpstreamError.ts"; -import { type AbstractApiOptions, type FormatPlayObjectOptions } from "../infrastructure/Atomic.ts"; -import { type RockSkyClientData, type RockSkyData, type RockSkyOptions } from "../infrastructure/config/client/rocksky.ts"; +import type {AbstractApiOptions, FormatPlayObjectOptions} from "../infrastructure/Atomic.ts"; +import type {RockSkyClientData, RockSkyData, RockSkyOptions} from "../infrastructure/config/client/rocksky.ts"; import AbstractApiClient from "./AbstractApiClient.ts"; import { isPortReachableConnect, joinedUrl, normalizeWebAddress } from '../../utils/NetworkUtils.ts'; -import { type ListenResponse, type ListenType, type SubmitPayload } from '../../../core/vendor/listenbrainz/interfaces.ts'; +import type {ListenResponse, ListenType, SubmitPayload} from '../../../core/vendor/listenbrainz/interfaces.ts'; import { playToListenPayload } from './listenbrainz/lzUtils.ts'; -import { type RockskyScrobble } from './rocksky/interfaces.ts'; -import { type Handle } from "@atcute/lexicons"; +import type {RockskyScrobble} from './rocksky/interfaces.ts'; +import type {Handle} from "@atcute/lexicons"; import { getATProtoIdentifier, identifierToAtProtoHandle } from './atproto/atUtils.ts'; import { baseFormatPlayObj } from "../../utils/PlayTransformUtils.ts"; import { ScrobbleSubmitError } from "../errors/MSErrors.ts"; import { tryApiCall } from "../../utils/RequestUtils.ts"; import { type CreateScrobbleInput, RockskyClient } from "@rocksky/sdk"; import { getRoot } from "../../ioc.ts"; -import { MSCache } from "../Cache.ts"; -import { type HandleData } from "../infrastructure/config/client/atproto.ts"; +import type { MSCache } from "../Cache.ts"; +import type {HandleData} from "../infrastructure/config/client/atproto.ts"; import { parseRegexSingle } from "@foxxmd/regex-buddy-core"; interface SubmitOptions { diff --git a/src/backend/common/vendor/atproto/ATProtoAppApiClient.ts b/src/backend/common/vendor/atproto/ATProtoAppApiClient.ts index dacb946f..e554c655 100644 --- a/src/backend/common/vendor/atproto/ATProtoAppApiClient.ts +++ b/src/backend/common/vendor/atproto/ATProtoAppApiClient.ts @@ -1,7 +1,7 @@ -import { type AbstractApiOptions } from "../../infrastructure/Atomic.ts"; -import { type TealClientData } from "../../infrastructure/config/client/tealfm.ts"; +import type {AbstractApiOptions} from "../../infrastructure/Atomic.ts"; +import type {TealClientData} from "../../infrastructure/config/client/tealfm.ts"; import { getATProtoIdentifier } from "./atUtils.ts"; -import { type ATProtoAppData, type ATProtoUserIdentifierData } from "../../infrastructure/config/client/atproto.ts"; +import type {ATProtoAppData, ATProtoUserIdentifierData} from "../../infrastructure/config/client/atproto.ts"; import { ATProtoAuthenticatedApiClient } from "./ATProtoAuthenticatedApiClient.ts"; import { PasswordSession, type PasswordSessionData } from '@atcute/password-session'; import { Client } from "@atcute/client"; diff --git a/src/backend/common/vendor/atproto/ATProtoUnauthenticatedApiClient.ts b/src/backend/common/vendor/atproto/ATProtoUnauthenticatedApiClient.ts index 4120917b..13a3daaa 100644 --- a/src/backend/common/vendor/atproto/ATProtoUnauthenticatedApiClient.ts +++ b/src/backend/common/vendor/atproto/ATProtoUnauthenticatedApiClient.ts @@ -2,7 +2,7 @@ import { UpstreamError } from "../../errors/UpstreamError.ts"; import { AbstractATProtoApiClient } from "./AbstractATProtoApiClient.ts"; import { Client, simpleFetchHandler } from '@atcute/client'; import type {} from '@atcute/atproto'; -import { type Nsid } from "@atcute/lexicons"; +import type {Nsid} from "@atcute/lexicons"; export class ATProtoUnauthenticatedApiClient extends AbstractATProtoApiClient { diff --git a/src/backend/common/vendor/atproto/AbstractATProtoApiClient.ts b/src/backend/common/vendor/atproto/AbstractATProtoApiClient.ts index f93666a7..58eab3e3 100644 --- a/src/backend/common/vendor/atproto/AbstractATProtoApiClient.ts +++ b/src/backend/common/vendor/atproto/AbstractATProtoApiClient.ts @@ -1,17 +1,18 @@ import { getRoot } from "../../../ioc.ts"; -import { type AbstractApiOptions } from "../../infrastructure/Atomic.ts"; +import type {AbstractApiOptions} from "../../infrastructure/Atomic.ts"; import AbstractApiClient from "../AbstractApiClient.ts"; -import { MSCache } from "../../Cache.ts"; +import type { MSCache } from "../../Cache.ts"; import { UpstreamError } from "../../errors/UpstreamError.ts"; import { streamBodyProgress } from "../../../utils/NetworkUtils.ts"; -import { type ATProtoUserIdentifierData, type HandleData } from "../../infrastructure/config/client/atproto.ts"; +import type {ATProtoUserIdentifierData, HandleData} from "../../infrastructure/config/client/atproto.ts"; import { checkPds, isDID, identifierToAtProtoHandle, getATProtoIdentifier } from "./atUtils.ts"; -import { Client, ClientResponseError, isXRPCErrorPayload, parseRateLimitHeaders } from '@atcute/client'; +import type { Client} from '@atcute/client'; +import { ClientResponseError, isXRPCErrorPayload, parseRateLimitHeaders } from '@atcute/client'; import { ComAtprotoSyncGetRepo } from '@atcute/atproto'; -import { type AtprotoDid } from "@atcute/lexicons/syntax"; +import type {AtprotoDid} from "@atcute/lexicons/syntax"; import { todayAwareFormat } from "../../../../core/TimeUtils.ts"; import dayjs from "dayjs"; -import { type Millisecond } from "../../../../core/Atomic.ts"; +import type {Millisecond} from "../../../../core/Atomic.ts"; export interface RateLimitInfo { limit: number diff --git a/src/backend/common/vendor/atproto/atUtils.ts b/src/backend/common/vendor/atproto/atUtils.ts index 2c30b620..fcadf477 100644 --- a/src/backend/common/vendor/atproto/atUtils.ts +++ b/src/backend/common/vendor/atproto/atUtils.ts @@ -1,10 +1,10 @@ -import { type Handle } from "@atcute/lexicons"; +import type { Handle } from "@atcute/lexicons"; import { isHandle, type AtprotoDid } from "@atcute/lexicons/syntax"; -import { type Logger } from "@foxxmd/logging"; +import type { Logger } from "@foxxmd/logging"; import { parseRegexSingle } from "@foxxmd/regex-buddy-core"; import { loggerNoop, MaybeLogger } from '../../MaybeLogger.ts'; -import { type ATProtoUserIdentifierData, type HandleData } from "../../infrastructure/config/client/atproto.ts"; -import { Cacheable } from "cacheable"; +import type { ATProtoUserIdentifierData, HandleData } from "../../infrastructure/config/client/atproto.ts"; +import type { Cacheable } from "cacheable"; import { CompositeDidDocumentResolver, CompositeHandleResolver, diff --git a/src/backend/common/vendor/azuracast/AzuracastApiClient.ts b/src/backend/common/vendor/azuracast/AzuracastApiClient.ts index 60fc4e53..34a1e6bb 100644 --- a/src/backend/common/vendor/azuracast/AzuracastApiClient.ts +++ b/src/backend/common/vendor/azuracast/AzuracastApiClient.ts @@ -1,9 +1,9 @@ -import { type URLData } from "../../../../core/Atomic.ts"; +import type {URLData} from "../../../../core/Atomic.ts"; import { joinedUrl, normalizeWSAddress } from "../../../utils/NetworkUtils.ts"; -import { type AbstractApiOptions } from "../../infrastructure/Atomic.ts"; -import { type AzuracastData, type AzuraStationResponse } from "../../infrastructure/config/source/azuracast.ts"; +import type {AbstractApiOptions} from "../../infrastructure/Atomic.ts"; +import type {AzuracastData, AzuraStationResponse} from "../../infrastructure/config/source/azuracast.ts"; import AbstractApiClient from "../AbstractApiClient.ts"; -import { WS } from 'iso-websocket' +import type { WS } from 'iso-websocket' export class AzuracastApiClient extends AbstractApiClient { diff --git a/src/backend/common/vendor/chromecast/ChromecastClientUtils.ts b/src/backend/common/vendor/chromecast/ChromecastClientUtils.ts index 8e35a43d..bf365393 100644 --- a/src/backend/common/vendor/chromecast/ChromecastClientUtils.ts +++ b/src/backend/common/vendor/chromecast/ChromecastClientUtils.ts @@ -1,7 +1,8 @@ -import { Media, MediaController, Result } from "@foxxmd/chromecast-client"; -import { type PlayObject } from "../../../../core/Atomic.ts"; -import { REPORTED_PLAYER_STATUSES, type ReportedPlayerStatus } from "../../infrastructure/Atomic.ts"; -import { type PlatformApplication, type PlatformType } from "./interfaces.ts"; +import type { Media, MediaController, Result } from "@foxxmd/chromecast-client"; +import type {PlayObject} from "../../../../core/Atomic.ts"; +import { REPORTED_PLAYER_STATUSES } from '../../../../core/Atomic.ts'; +import type {ReportedPlayerStatus} from '../../../../core/Atomic.ts'; +import type {PlatformApplication, PlatformType} from "./interfaces.ts"; import { hashObject } from "../../../utils/StringUtils.ts"; export const chromePlayerStateToReported = (state: string): ReportedPlayerStatus => { diff --git a/src/backend/common/vendor/chromecast/interfaces.ts b/src/backend/common/vendor/chromecast/interfaces.ts index 980faaaf..1f88c76d 100644 --- a/src/backend/common/vendor/chromecast/interfaces.ts +++ b/src/backend/common/vendor/chromecast/interfaces.ts @@ -1,7 +1,7 @@ -import { createPlatform, MediaController } from "@foxxmd/chromecast-client"; -import { type Logger } from "@foxxmd/logging"; -import { type Dayjs } from "dayjs"; -import { type FormatPlayObjectOptions } from "../../infrastructure/Atomic.ts"; +import type { createPlatform, MediaController } from "@foxxmd/chromecast-client"; +import type {Logger} from "@foxxmd/logging"; +import type {Dayjs} from "dayjs"; +import type {FormatPlayObjectOptions} from "../../infrastructure/Atomic.ts"; export type PlatformType = ReturnType; export interface PlatformApplication { diff --git a/src/backend/common/vendor/discord/DiscordAbstractClient.ts b/src/backend/common/vendor/discord/DiscordAbstractClient.ts index e7306efd..18a23c15 100644 --- a/src/backend/common/vendor/discord/DiscordAbstractClient.ts +++ b/src/backend/common/vendor/discord/DiscordAbstractClient.ts @@ -2,12 +2,12 @@ import { isPlayObject } from "../../../../core/Atomic.ts"; import { getRoot } from "../../../ioc.ts"; import { isDebugMode } from "../../../utils.ts"; import { urlContainsKnownMediaDomain } from "../../../utils/RequestUtils.ts"; -import { MSCache } from "../../Cache.ts"; +import type { MSCache } from "../../Cache.ts"; import { isSuperAgentResponseError } from "../../errors/ErrorUtils.ts"; -import { type AbstractApiOptions, type SourceData } from "../../infrastructure/Atomic.ts"; +import type {AbstractApiOptions, SourceData} from "../../infrastructure/Atomic.ts"; import { type ActivityAssets, ARTWORK_PLACEHOLDER, type DiscordStrongData, MS_ART } from "../../infrastructure/config/client/discord.ts"; import AbstractApiClient from "../AbstractApiClient.ts"; -import { CoverArtApiClient } from "../musicbrainz/CoverArtApiClient.ts"; +import type { CoverArtApiClient } from "../musicbrainz/CoverArtApiClient.ts"; import EventEmitter from "events"; import request from 'superagent'; diff --git a/src/backend/common/vendor/discord/DiscordIPCClient.ts b/src/backend/common/vendor/discord/DiscordIPCClient.ts index 0e910c03..21106a7b 100644 --- a/src/backend/common/vendor/discord/DiscordIPCClient.ts +++ b/src/backend/common/vendor/discord/DiscordIPCClient.ts @@ -1,12 +1,12 @@ import { childLogger } from "@foxxmd/logging"; -import { type AbstractApiOptions } from "../../infrastructure/Atomic.ts"; -import { type ActivityData, type DiscordIPCData, type DiscordStrongData } from "../../infrastructure/config/client/discord.ts"; +import type {AbstractApiOptions} from "../../infrastructure/Atomic.ts"; +import type {ActivityData, DiscordIPCData, DiscordStrongData} from "../../infrastructure/config/client/discord.ts"; import EventEmitter from "events"; import { getRoot } from "../../../ioc.ts"; import { Client, type SetActivity } from "@xhayper/discord-rpc"; import {realpathSync} from 'fs'; import {sep, join} from 'path'; -import { type PathData } from "@xhayper/discord-rpc/dist/transport/IPC.js"; +import type {PathData} from "@xhayper/discord-rpc/dist/transport/IPC.js"; import { removeUndefinedKeys } from '../../../../core/DataUtils.ts'; import { playStateToActivityData } from "./DiscordUtils.ts"; import { DiscordAbstractClient } from "./DiscordAbstractClient.ts"; diff --git a/src/backend/common/vendor/discord/DiscordUtils.ts b/src/backend/common/vendor/discord/DiscordUtils.ts index 98798a84..d9416c95 100644 --- a/src/backend/common/vendor/discord/DiscordUtils.ts +++ b/src/backend/common/vendor/discord/DiscordUtils.ts @@ -1,5 +1,5 @@ import dayjs from "dayjs"; -import { type PlayObject, type SourcePlayerObj } from "../../../../core/Atomic.ts"; +import type {PlayObject, SourcePlayerObj} from "../../../../core/Atomic.ts"; import { GatewayOpcodes, PresenceUpdateStatus } from "discord.js"; import { capitalize } from "../../../../core/StringUtils.ts"; import { urlToMusicService } from '../listenbrainz/lzUtils.ts'; diff --git a/src/backend/common/vendor/discord/DiscordWSClient.ts b/src/backend/common/vendor/discord/DiscordWSClient.ts index 849f9fc1..55be54a0 100644 --- a/src/backend/common/vendor/discord/DiscordWSClient.ts +++ b/src/backend/common/vendor/discord/DiscordWSClient.ts @@ -9,7 +9,7 @@ import pEvent from 'p-event'; import EventEmitter from "events"; import { randomInt } from "crypto"; import request from 'superagent'; -import { type AbstractApiOptions } from "../../infrastructure/Atomic.ts"; +import type {AbstractApiOptions} from "../../infrastructure/Atomic.ts"; import { isPlayObject, type SourcePlayerObj } from "../../../../core/Atomic.ts"; import dayjs, { type Dayjs } from "dayjs"; import { getRoot } from "../../../ioc.ts"; diff --git a/src/backend/common/vendor/koito/KoitoApiClient.ts b/src/backend/common/vendor/koito/KoitoApiClient.ts index 2102aea5..6285fd00 100644 --- a/src/backend/common/vendor/koito/KoitoApiClient.ts +++ b/src/backend/common/vendor/koito/KoitoApiClient.ts @@ -1,14 +1,15 @@ import dayjs from "dayjs"; -import { type PlayObject, type PlayObjectMinimal, type ScrobbleActionResult, type URLData } from "../../../../core/Atomic.ts"; -import { type AbstractApiOptions, type PaginatedListensTimeRangeOptions, type PaginatedTimeRangeListens, type PaginatedTimeRangeListensResult } from "../../infrastructure/Atomic.ts"; -import { type GetListensOptions, type KoitoData, type ListenObjectResponse, type ListensResponse } from "../../infrastructure/config/client/koito.ts"; +import type {PlayObject, PlayObjectMinimal, ScrobbleActionResult, URLData} from "../../../../core/Atomic.ts"; +import type {AbstractApiOptions, PaginatedListensTimeRangeOptions, PaginatedTimeRangeListens, PaginatedTimeRangeListensResult} from "../../infrastructure/Atomic.ts"; +import type {GetListensOptions, KoitoData, ListenObjectResponse, ListensResponse} from "../../infrastructure/config/client/koito.ts"; import AbstractApiClient from "../AbstractApiClient.ts"; import { getBaseFromUrl, isPortReachableConnect, joinedUrl, normalizeWebAddress } from "../../../utils/NetworkUtils.ts"; -import request, { Request, Response } from 'superagent'; +import type { Request, Response } from 'superagent'; +import request from 'superagent'; import { UpstreamError } from "../../errors/UpstreamError.ts"; import { playToListenPayload } from '../listenbrainz/lzUtils.ts'; -import { type SubmitPayload } from '../../../../core/vendor/listenbrainz/interfaces.ts'; -import { type ListenType } from '../../../../core/vendor/listenbrainz/interfaces.ts'; +import type {SubmitPayload} from '../../../../core/vendor/listenbrainz/interfaces.ts'; +import type {ListenType} from '../../../../core/vendor/listenbrainz/interfaces.ts'; import { baseFormatPlayObj } from "../../../utils/PlayTransformUtils.ts"; import { ScrobbleSubmitError } from "../../errors/MSErrors.ts"; import { tryApiCall } from "../../../utils/RequestUtils.ts"; diff --git a/src/backend/common/vendor/listenbrainz/lzUtils.ts b/src/backend/common/vendor/listenbrainz/lzUtils.ts index e93338ab..e48faff8 100644 --- a/src/backend/common/vendor/listenbrainz/lzUtils.ts +++ b/src/backend/common/vendor/listenbrainz/lzUtils.ts @@ -1,9 +1,9 @@ -import { type PlayObject } from "../../../../core/Atomic.ts"; +import type {PlayObject} from "../../../../core/Atomic.ts"; import { isEmptyArrayOrUndefined } from "../../../utils.ts"; import { removeUndefinedKeys } from '../../../../core/DataUtils.ts'; import { getScrobbleTsSOCDate } from "../../../utils/TimeUtils.ts"; -import { type SubmitOptions } from "../ListenbrainzApiClient.ts"; -import { type ListenPayload, type MinimumTrack, type SubmitListenAdditionalTrackInfo, type SubmitPayload } from "../../../../core/vendor/listenbrainz/interfaces.ts"; +import type {SubmitOptions} from "../ListenbrainzApiClient.ts"; +import type {ListenPayload, MinimumTrack, SubmitListenAdditionalTrackInfo, SubmitPayload} from "../../../../core/vendor/listenbrainz/interfaces.ts"; import {version as appVersion } from '../../../version.ts'; import { artistCreditsToNames, artistCreditToName } from "../../../../core/StringUtils.ts"; diff --git a/src/backend/common/vendor/maloja/MalojaApiClient.ts b/src/backend/common/vendor/maloja/MalojaApiClient.ts index fcdad3bf..e1eb7bce 100644 --- a/src/backend/common/vendor/maloja/MalojaApiClient.ts +++ b/src/backend/common/vendor/maloja/MalojaApiClient.ts @@ -1,11 +1,12 @@ import dayjs, { type ManipulateType } from 'dayjs'; -import request, { Response, Request } from 'superagent'; +import type { Response, Request } from 'superagent'; +import request from 'superagent'; import compareVersions from "compare-versions"; import AbstractApiClient from "../AbstractApiClient.ts"; import { isPortReachableConnect, normalizeWebAddress } from "../../../utils/NetworkUtils.ts"; -import { type MalojaData } from "../../infrastructure/config/client/maloja.ts"; -import { type PlayObject, type PlayObjectMinimal, type ScrobbleActionResult, type URLData } from "../../../../core/Atomic.ts"; -import { type AbstractApiOptions, type FormatPlayObjectOptions, type PaginatedListensTimeRangeOptions, type PaginatedTimeRangeListens, type PaginatedTimeRangeListensResult } from "../../infrastructure/Atomic.ts"; +import type {MalojaData} from "../../infrastructure/config/client/maloja.ts"; +import type {PlayObject, PlayObjectMinimal, ScrobbleActionResult, URLData} from "../../../../core/Atomic.ts"; +import type {AbstractApiOptions, FormatPlayObjectOptions, PaginatedListensTimeRangeOptions, PaginatedTimeRangeListens, PaginatedTimeRangeListensResult} from "../../infrastructure/Atomic.ts"; import { isNodeNetworkException } from "../../errors/NodeErrors.ts"; import { isSuperAgentResponseError } from "../../errors/ErrorUtils.ts"; import { getNonEmptyVal } from "../../../utils.ts"; diff --git a/src/backend/common/vendor/maloja/interfaces.ts b/src/backend/common/vendor/maloja/interfaces.ts index 8e4b6660..0fd1d58b 100644 --- a/src/backend/common/vendor/maloja/interfaces.ts +++ b/src/backend/common/vendor/maloja/interfaces.ts @@ -1,4 +1,4 @@ -import { type ResponseError } from "superagent"; +import type {ResponseError} from "superagent"; import { findCauseByFunc } from "../../../utils/ErrorUtils.ts"; import { isSuperAgentResponseError } from "../../errors/ErrorUtils.ts"; diff --git a/src/backend/common/vendor/musicbrainz/CoverArtApiClient.ts b/src/backend/common/vendor/musicbrainz/CoverArtApiClient.ts index 750b3da1..ba6f8301 100644 --- a/src/backend/common/vendor/musicbrainz/CoverArtApiClient.ts +++ b/src/backend/common/vendor/musicbrainz/CoverArtApiClient.ts @@ -1,13 +1,13 @@ import { Cacheable } from "cacheable"; -import { type AbstractApiOptions } from "../../infrastructure/Atomic.ts"; +import type {AbstractApiOptions} from "../../infrastructure/Atomic.ts"; import AbstractApiClient from "../AbstractApiClient.ts"; import request from 'superagent'; import { isSuperAgentResponseError } from "../../errors/ErrorUtils.ts"; import { UpstreamError } from "../../errors/UpstreamError.ts"; import { initMemoryCache } from "../../Cache.ts"; import { joinedUrl } from "../../../utils/NetworkUtils.ts"; -import { type RequestRetryOptions } from "../../infrastructure/config/common.ts"; -import { type RetryContext } from "p-retry"; +import type {RequestRetryOptions} from "../../infrastructure/config/common.ts"; +import type {RetryContext} from "p-retry"; import { NO_RETRY_HTTP_STATUS, tryApiCall } from "../../../utils/RequestUtils.ts"; export type ThumbSize = 250 | 500 | 1200; diff --git a/src/backend/common/vendor/musicbrainz/MusicbrainzApiClient.ts b/src/backend/common/vendor/musicbrainz/MusicbrainzApiClient.ts index 34317ea3..b04c7145 100644 --- a/src/backend/common/vendor/musicbrainz/MusicbrainzApiClient.ts +++ b/src/backend/common/vendor/musicbrainz/MusicbrainzApiClient.ts @@ -1,13 +1,13 @@ -import { Response } from 'superagent'; -import { type ArtistCredit, type PlayObject, type PlayObjectMinimal, type URLData } from "../../../../core/Atomic.ts"; +import type { Response } from 'superagent'; +import type {ArtistCredit, PlayObject, PlayObjectMinimal, URLData} from "../../../../core/Atomic.ts"; import { UpstreamError } from "../../errors/UpstreamError.ts"; import { type AbstractApiOptions, type FormatPlayObjectOptions, MUSICBRAINZ_URL, type MusicbrainzApiConfigData } from "../../infrastructure/Atomic.ts"; import AbstractApiClient from "../AbstractApiClient.ts"; import { isPortReachableConnect, normalizeWebAddress } from '../../../utils/NetworkUtils.ts'; import { MusicBrainzApi, type IRecording, type IRecordingList, type IRelease } from 'musicbrainz-api'; -import { difference, isDebugMode, sleep } from "../../../utils.ts"; +import { difference, sleep } from "../../../utils.ts"; import {SequentialRoundRobin} from 'round-robin-js'; -import { Cacheable } from "cacheable"; +import type { Cacheable } from "cacheable"; import { getRoot } from "../../../ioc.ts"; import { version } from "../../../version.ts"; import { hashObject } from "../../../utils/StringUtils.ts"; @@ -19,7 +19,7 @@ import { stripIndents } from "common-tags"; import { hasNodeNetworkException } from '../../errors/NodeErrors.ts'; import { SimpleError } from '../../errors/MSErrors.ts'; import { baseFormatPlayObj } from '../../../utils/PlayTransformUtils.ts'; -import { type IRecordingMSList } from '../../transforms/MusicbrainzTransformer.ts'; +import type {IRecordingMSList} from '../../transforms/MusicbrainzTransformer.ts'; import dayjs, { type Dayjs } from 'dayjs'; import { artistCreditsToNames } from '../../../../core/StringUtils.ts'; diff --git a/src/backend/common/vendor/rocksky/interfaces.ts b/src/backend/common/vendor/rocksky/interfaces.ts index 057bec17..842aa7d5 100644 --- a/src/backend/common/vendor/rocksky/interfaces.ts +++ b/src/backend/common/vendor/rocksky/interfaces.ts @@ -1,3 +1,3 @@ -import { type ScrobbleViewBasic } from "@rocksky/sdk"; +import type {ScrobbleViewBasic} from "@rocksky/sdk"; export type RockskyScrobble = ScrobbleViewBasic; \ No newline at end of file diff --git a/src/backend/common/vendor/subsonic/interfaces.ts b/src/backend/common/vendor/subsonic/interfaces.ts index a3e384a3..361d5f88 100644 --- a/src/backend/common/vendor/subsonic/interfaces.ts +++ b/src/backend/common/vendor/subsonic/interfaces.ts @@ -1,4 +1,4 @@ -import { Response } from 'superagent'; +import type { Response } from 'superagent'; export interface SubsonicResponseCommon { status: 'failed' | 'ok' diff --git a/src/backend/common/vendor/teal/TealApiClient.ts b/src/backend/common/vendor/teal/TealApiClient.ts index 30a2e676..ea538e73 100644 --- a/src/backend/common/vendor/teal/TealApiClient.ts +++ b/src/backend/common/vendor/teal/TealApiClient.ts @@ -1,22 +1,22 @@ import dayjs, { type Dayjs, type ManipulateType } from "dayjs"; -import { type PlayObject, type PlayObjectMinimal, type BrainzMeta, type MBID, type ScrobbleActionResult, type UnixTimestamp } from "../../../../core/Atomic.ts"; +import type {PlayObject, PlayObjectMinimal, BrainzMeta, MBID, ScrobbleActionResult, UnixTimestamp} from "../../../../core/Atomic.ts"; import { getRoot } from "../../../ioc.ts"; import { removeUndefinedKeys } from '../../../../core/DataUtils.ts'; import { baseFormatPlayObj } from "../../../utils/PlayTransformUtils.ts"; -import { MSCache } from "../../Cache.ts"; -import { type AbstractApiOptions, type PagelessListensTimeRangeOptions, type PagelessTimeRangeListens, type PagelessTimeRangeListensResult } from "../../infrastructure/Atomic.ts"; -import { type ListRecord, type RecordOptions, type TealClientData } from "../../infrastructure/config/client/tealfm.ts"; +import type { MSCache } from "../../Cache.ts"; +import type {AbstractApiOptions, PagelessListensTimeRangeOptions, PagelessTimeRangeListens, PagelessTimeRangeListensResult} from "../../infrastructure/Atomic.ts"; +import type {ListRecord, RecordOptions, TealClientData} from "../../infrastructure/config/client/tealfm.ts"; import AbstractApiClient from "../AbstractApiClient.ts"; import { ATProtoAppApiClient } from "../atproto/ATProtoAppApiClient.ts"; -import { FmTealAlphaActorStatus, FmTealAlphaFeedPlay } from "./lexicons/index.ts"; +import type { FmTealAlphaActorStatus, FmTealAlphaFeedPlay } from "./lexicons/index.ts"; import { ScrobbleSubmitError } from "../../errors/MSErrors.ts"; import { getScrobbleTsSOCDateWithContext, usecToUnix } from "../../../utils/TimeUtils.ts"; import { musicServiceToCononical } from "../listenbrainz/lzUtils.ts"; import { parseRegexSingle } from "@foxxmd/regex-buddy-core"; import { decodeTid, generateTID } from "@ewanc26/tid"; -import { ATProtoAuthenticatedApiClient } from "../atproto/ATProtoAuthenticatedApiClient.ts"; +import type { ATProtoAuthenticatedApiClient } from "../atproto/ATProtoAuthenticatedApiClient.ts"; import { UpstreamError } from "../../errors/UpstreamError.ts"; -import { ComAtprotoRepoCreateRecord, ComAtprotoRepoPutRecord } from '@atcute/atproto'; +import type { ComAtprotoRepoCreateRecord, ComAtprotoRepoPutRecord } from '@atcute/atproto'; import { nowPlayingExpirationDuration } from "../../../scrobblers/AbstractScrobbleClient.ts"; export class TealApiClient extends AbstractApiClient implements PagelessTimeRangeListens { diff --git a/src/backend/index.ts b/src/backend/index.ts index 15ed3a81..e8167a91 100644 --- a/src/backend/index.ts +++ b/src/backend/index.ts @@ -11,7 +11,7 @@ import utc from 'dayjs/plugin/utc.js'; import * as path from "path"; import { SimpleIntervalJob, ToadScheduler } from "toad-scheduler"; import { projectDir } from "./common/index.ts"; -import { type AIOConfig } from "./common/infrastructure/config/aioConfig.ts"; +import type {AIOConfig} from "./common/infrastructure/config/aioConfig.ts"; import { appLogger, initLogger as getInitLogger } from "./common/logging.ts"; import { getRoot } from "./ioc.ts"; import { parseVersion } from "./version.ts"; diff --git a/src/backend/ioc.ts b/src/backend/ioc.ts index 99984a39..28a5ce2b 100644 --- a/src/backend/ioc.ts +++ b/src/backend/ioc.ts @@ -6,15 +6,15 @@ import { projectDir } from "./common/index.ts"; import { WildcardEmitter } from "./common/WildcardEmitter.ts"; import { generateBaseURL } from "./utils/NetworkUtils.ts"; -import { PassThrough } from "stream"; -import { type CacheConfigOptions, type MusicBrainzSingletonMap } from "./common/infrastructure/Atomic.ts"; +import type { PassThrough } from "stream"; +import type {CacheConfigOptions, MusicBrainzSingletonMap} from "./common/infrastructure/Atomic.ts"; import { MSCache } from "./common/Cache.ts"; import TransformerManager from "./common/transforms/TransformerManager.ts"; -import { type TransformerCommonConfig } from "../core/Atomic.ts"; +import type {TransformerCommonConfig} from "../core/Atomic.ts"; import prom from 'prom-client'; import { CoverArtApiClient } from "./common/vendor/musicbrainz/CoverArtApiClient.ts"; import { version } from "./version.ts"; -import { type DbConcrete } from "./common/database/drizzle/drizzleUtils.ts"; +import type {DbConcrete} from "./common/database/drizzle/drizzleUtils.ts"; let root: ReturnType; export interface RootOptions { diff --git a/src/backend/notifier/AbstractWebhookNotifier.ts b/src/backend/notifier/AbstractWebhookNotifier.ts index 99bb6fea..249617db 100644 --- a/src/backend/notifier/AbstractWebhookNotifier.ts +++ b/src/backend/notifier/AbstractWebhookNotifier.ts @@ -1,10 +1,5 @@ import { childLogger, type Logger } from "@foxxmd/logging"; -import { - type AppriseConfig, - type GotifyConfig, - type NtfyConfig, - type WebhookPayload -} from "../common/infrastructure/config/health/webhooks.ts"; +import type {AppriseConfig, GotifyConfig, NtfyConfig, WebhookPayload} from "../common/infrastructure/config/health/webhooks.ts"; export abstract class AbstractWebhookNotifier { diff --git a/src/backend/notifier/AppriseWebhookNotifier.ts b/src/backend/notifier/AppriseWebhookNotifier.ts index 43cf1942..c01c78f7 100644 --- a/src/backend/notifier/AppriseWebhookNotifier.ts +++ b/src/backend/notifier/AppriseWebhookNotifier.ts @@ -1,17 +1,13 @@ -import { type Logger } from "@foxxmd/logging"; -import request, { Request } from "superagent"; +import type {Logger} from "@foxxmd/logging"; +import type { Request } from "superagent"; +import request from "superagent"; import { truncateStringToLength } from "../../core/StringUtils.ts"; import { isSuperAgentResponseError } from "../common/errors/ErrorUtils.ts"; import { isNodeNetworkException } from "../common/errors/NodeErrors.ts"; import { UpstreamError } from "../common/errors/UpstreamError.ts"; -import { - type AppriseConfig, - type PrioritiesConfig, - type Priority, - type WebhookPayload -} from "../common/infrastructure/config/health/webhooks.ts"; +import type {AppriseConfig, PrioritiesConfig, Priority, WebhookPayload} from "../common/infrastructure/config/health/webhooks.ts"; import { AbstractWebhookNotifier } from "./AbstractWebhookNotifier.ts"; -import { type URLData } from "../../core/Atomic.ts"; +import type {URLData} from "../../core/Atomic.ts"; import { isPortReachable, joinedUrl, normalizeWebAddress } from "../utils/NetworkUtils.ts"; import { isDebugMode } from "../utils.ts"; diff --git a/src/backend/notifier/GotifyWebhookNotifier.ts b/src/backend/notifier/GotifyWebhookNotifier.ts index 610d0a78..99e3fd96 100644 --- a/src/backend/notifier/GotifyWebhookNotifier.ts +++ b/src/backend/notifier/GotifyWebhookNotifier.ts @@ -1,11 +1,11 @@ -import { type Logger } from "@foxxmd/logging"; +import type {Logger} from "@foxxmd/logging"; import { HTTPError } from "got"; import { gotify } from 'gotify'; import request from 'superagent'; -import { type GotifyConfig, type PrioritiesConfig, type WebhookPayload } from "../common/infrastructure/config/health/webhooks.ts"; +import type {GotifyConfig, PrioritiesConfig, WebhookPayload} from "../common/infrastructure/config/health/webhooks.ts"; import { AbstractWebhookNotifier } from "./AbstractWebhookNotifier.ts"; import { isPortReachable, normalizeWebAddress } from "../utils/NetworkUtils.ts"; -import { type URLData } from "../../core/Atomic.ts"; +import type {URLData} from "../../core/Atomic.ts"; export class GotifyWebhookNotifier extends AbstractWebhookNotifier { diff --git a/src/backend/notifier/Notifiers.ts b/src/backend/notifier/Notifiers.ts index 0b763702..0e607e06 100644 --- a/src/backend/notifier/Notifiers.ts +++ b/src/backend/notifier/Notifiers.ts @@ -1,13 +1,7 @@ import { childLogger, type Logger } from '@foxxmd/logging'; -import { EventEmitter } from "events"; -import { - type AppriseConfig, - type GotifyConfig, - type NtfyConfig, - type WebhookConfig, - type WebhookPayload -} from "../common/infrastructure/config/health/webhooks.ts"; -import { AbstractWebhookNotifier } from "./AbstractWebhookNotifier.ts"; +import type { EventEmitter } from "events"; +import type {AppriseConfig, GotifyConfig, NtfyConfig, WebhookConfig, WebhookPayload} from "../common/infrastructure/config/health/webhooks.ts"; +import type { AbstractWebhookNotifier } from "./AbstractWebhookNotifier.ts"; import { AppriseWebhookNotifier } from "./AppriseWebhookNotifier.ts"; import { GotifyWebhookNotifier } from "./GotifyWebhookNotifier.ts"; import { NtfyWebhookNotifier } from "./NtfyWebhookNotifier.ts"; diff --git a/src/backend/notifier/NtfyWebhookNotifier.ts b/src/backend/notifier/NtfyWebhookNotifier.ts index e1d5dd90..90973ef8 100644 --- a/src/backend/notifier/NtfyWebhookNotifier.ts +++ b/src/backend/notifier/NtfyWebhookNotifier.ts @@ -1,10 +1,10 @@ -import { type Logger } from "@foxxmd/logging"; +import type {Logger} from "@foxxmd/logging"; import { type Config, publish } from 'ntfy'; import request from "superagent"; import {redactString} from '@foxxmd/redact-string'; -import { type NtfyConfig, type PrioritiesConfig, type WebhookPayload } from "../common/infrastructure/config/health/webhooks.ts"; +import type {NtfyConfig, PrioritiesConfig, WebhookPayload} from "../common/infrastructure/config/health/webhooks.ts"; import { AbstractWebhookNotifier } from "./AbstractWebhookNotifier.ts"; -import { type URLData } from "../../core/Atomic.ts"; +import type {URLData} from "../../core/Atomic.ts"; import { isPortReachable, normalizeWebAddress } from "../utils/NetworkUtils.ts"; export class NtfyWebhookNotifier extends AbstractWebhookNotifier { diff --git a/src/backend/scrobblers/AbstractHistoricalScrobbleClient.ts b/src/backend/scrobblers/AbstractHistoricalScrobbleClient.ts index 223b3e25..176a385e 100644 --- a/src/backend/scrobblers/AbstractHistoricalScrobbleClient.ts +++ b/src/backend/scrobblers/AbstractHistoricalScrobbleClient.ts @@ -1,14 +1,14 @@ import dayjs, { type Dayjs } from "dayjs"; import { sortByNewestDate } from "../../core/PlayUtils.ts"; import AbstractScrobbleClient from "./AbstractScrobbleClient.ts"; -import { type ComponentMigrationSelect } from "../common/database/drizzle/drizzleTypes.ts"; -import { type ErrorIsh } from "../../core/ErrorUtils.ts"; +import type {ComponentMigrationSelect} from "../common/database/drizzle/drizzleTypes.ts"; +import type {ErrorIsh} from "../../core/ErrorUtils.ts"; import { DrizzlePlayHistoricalRepository, playToRepositoryCreatePlayHistoricalOpts, type RepositoryCreatePlayHistoricalOpts } from "../common/database/drizzle/repositories/PlayHistoricalRepository.ts"; import { spawn, isAbortError } from 'abort-controller-x'; import { generateLoggableAbortReason } from "../common/errors/MSErrors.ts"; -import { type Logger } from "@foxxmd/logging"; +import type {Logger} from "@foxxmd/logging"; import { buildTrackString } from "../../core/StringUtils.ts"; -import { type PlayObject } from "../../core/Atomic.ts"; +import type {PlayObject} from "../../core/Atomic.ts"; export default abstract class AbstractHistoricalScrobbleClient extends AbstractScrobbleClient { diff --git a/src/backend/scrobblers/AbstractScrobbleClient.ts b/src/backend/scrobblers/AbstractScrobbleClient.ts index f30ce159..55a749a5 100644 --- a/src/backend/scrobblers/AbstractScrobbleClient.ts +++ b/src/backend/scrobblers/AbstractScrobbleClient.ts @@ -1,7 +1,7 @@ import { childLogger, type Logger, type LogLevel } from "@foxxmd/logging"; import dayjs, { type Dayjs } from "dayjs"; -import { type Duration } from "dayjs/plugin/duration.js"; -import EventEmitter from "events"; +import type {Duration} from "dayjs/plugin/duration.js"; +import type EventEmitter from "events"; import { nanoid } from "nanoid"; import type { MarkOptional } from "ts-essentials"; import { @@ -22,20 +22,20 @@ import AbstractComponent from "../common/AbstractComponent.ts"; import { hasUpstreamError } from "../common/errors/UpstreamError.ts"; import { type Authenticatable, - CALCULATED_PLAYER_STATUSES, DEFAULT_RETRY_MULTIPLIER, type FormatPlayObjectOptions, type PaginatedTimeRangeOptions, REFRESH_STALE_DEFAULT, - type ReportedPlayerStatus, type ScrobbledPlayObject, type SourceIdentifier, type TimeRangeListensFetcher, } from "../common/infrastructure/Atomic.ts"; -import { type ClientType } from '../common/infrastructure/config/client/clients.ts'; -import { type CommonClientConfig, type NowPlayingOptions, type UpstreamRefreshOptions } from "../common/infrastructure/config/client/index.ts"; +import { CALCULATED_PLAYER_STATUSES } from '../../core/Atomic.ts'; +import type {ReportedPlayerStatus} from '../../core/Atomic.ts'; +import type {ClientType} from "../../core/Atomic.ts"; +import type {CommonClientConfig, NowPlayingOptions, UpstreamRefreshOptions} from "../common/infrastructure/config/client/index.ts"; import { TRANSFORM_HOOK } from "../../core/Transform.ts"; -import { Notifiers } from "../notifier/Notifiers.ts"; +import type { Notifiers } from "../notifier/Notifiers.ts"; import { isDebugMode, parseBool, @@ -59,19 +59,19 @@ import pMap, { pMapIterable } from "p-map"; import { existingScrobble, type ExistingScrobbleOpts } from "../utils/PlayComparisonUtils.ts"; import { statefulInvariantTransform } from "../../core/PlayUtils.ts"; import { normalizeStr } from "../utils/StringUtils.ts"; -import { Counter, Gauge } from 'prom-client'; +import type { Counter, Gauge } from 'prom-client'; import { generateLoggableAbortReason, ScrobbleSubmitError, SimpleError } from "../common/errors/MSErrors.ts"; import {isErrorLike, serializeError} from 'serialize-error'; import { DEFAULT_NEW_PADDING, groupPlaysToTimeRanges } from "../utils/ListenFetchUtils.ts"; import { spawn, isAbortError, delay } from 'abort-controller-x'; import { DrizzlePlayRepository, playToRepositoryCreatePlayOpts, type QueryPlaysOpts, type WithPlayRelation } from "../common/database/drizzle/repositories/PlayRepository.ts"; -import { type ComponentMigrationNew, type PlaySelect, type PlaySelectWithQueueStates, type QueueStateNew, type QueueStateSelect } from "../common/database/drizzle/drizzleTypes.ts"; +import type {ComponentMigrationNew, PlaySelect, PlaySelectWithQueueStates, QueueStateNew, QueueStateSelect} from "../common/database/drizzle/drizzleTypes.ts"; import { asPlay } from "../../core/PlayMarshalUtils.ts"; import { DrizzleQueueRepository } from "../common/database/drizzle/repositories/QueueRepository.ts"; import { GenericRepository } from "../common/database/drizzle/repositories/BaseRepository.ts"; import assert from "node:assert"; import { COMPONENT_STATE, type ComponentClientApiJson, type PlayApiCommonDetailed } from "../../core/Api.ts"; -import { type ComponentState } from "react"; +import type {ComponentState} from "react"; type PlatformMappedPlays = Map; type NowPlayingQueue = Map; diff --git a/src/backend/scrobblers/DiscordScrobbler.ts b/src/backend/scrobblers/DiscordScrobbler.ts index 31afdc6a..28ed2706 100644 --- a/src/backend/scrobblers/DiscordScrobbler.ts +++ b/src/backend/scrobblers/DiscordScrobbler.ts @@ -1,10 +1,12 @@ -import { type Logger, type LogLevel } from "@foxxmd/logging"; -import EventEmitter from "events"; -import { type PlayMatchResult, type PlayObject, type SourcePlayerObj } from "../../core/Atomic.ts"; -import { CALCULATED_PLAYER_STATUSES, type FormatPlayObjectOptions, REPORTED_PLAYER_STATUSES, SINGLE_USER_PLATFORM_ID_STR } from "../common/infrastructure/Atomic.ts"; +import type {Logger, LogLevel} from "@foxxmd/logging"; +import type EventEmitter from "events"; +import type {PlayMatchResult, PlayObject, SourcePlayerObj} from "../../core/Atomic.ts"; +import { type FormatPlayObjectOptions, SINGLE_USER_PLATFORM_ID_STR } from "../common/infrastructure/Atomic.ts"; +import { CALCULATED_PLAYER_STATUSES } from '../../core/Atomic.ts'; +import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; import AbstractScrobbleClient, { nowPlayingUpdateByPlayDuration, shouldClearNPStatus } from "./AbstractScrobbleClient.ts"; -import { type DiscordClientConfig, type DiscordStrongData } from "../common/infrastructure/config/client/discord.ts"; +import type {DiscordClientConfig, DiscordStrongData} from "../common/infrastructure/config/client/discord.ts"; import { DiscordWSClient } from "../common/vendor/discord/DiscordWSClient.ts"; import { configToStrong } from "../common/vendor/discord/DiscordUtils.ts"; import { DiscordIPCClient } from "../common/vendor/discord/DiscordIPCClient.ts"; diff --git a/src/backend/scrobblers/KoitoScrobbler.ts b/src/backend/scrobblers/KoitoScrobbler.ts index 0a36df67..0e268250 100644 --- a/src/backend/scrobblers/KoitoScrobbler.ts +++ b/src/backend/scrobblers/KoitoScrobbler.ts @@ -1,14 +1,14 @@ -import { type Logger } from "@foxxmd/logging"; -import EventEmitter from "events"; -import { type PlayObject, type SourcePlayerObj } from "../../core/Atomic.ts"; +import type {Logger} from "@foxxmd/logging"; +import type EventEmitter from "events"; +import type {PlayObject, SourcePlayerObj} from "../../core/Atomic.ts"; import { buildTrackString, capitalize } from "../../core/StringUtils.ts"; import { isNodeNetworkException } from "../common/errors/NodeErrors.ts"; -import { type FormatPlayObjectOptions, type TimeRangeListensFetcher } from "../common/infrastructure/Atomic.ts"; +import type {FormatPlayObjectOptions, TimeRangeListensFetcher} from "../common/infrastructure/Atomic.ts"; import { playToListenPayload } from '../common/vendor/listenbrainz/lzUtils.ts'; import AbstractScrobbleClient, { nowPlayingUpdateByPlayDuration } from "./AbstractScrobbleClient.ts"; import { isDebugMode } from "../utils.ts"; -import { type KoitoClientConfig } from "../common/infrastructure/config/client/koito.ts"; +import type {KoitoClientConfig} from "../common/infrastructure/config/client/koito.ts"; import { KoitoApiClient, listenObjectResponseToPlay } from "../common/vendor/koito/KoitoApiClient.ts"; import { createGetScrobblesForTimeRangeFunc } from "../utils/ListenFetchUtils.ts"; diff --git a/src/backend/scrobblers/LastfmScrobbler.ts b/src/backend/scrobblers/LastfmScrobbler.ts index 977a2e96..b1d8af31 100644 --- a/src/backend/scrobblers/LastfmScrobbler.ts +++ b/src/backend/scrobblers/LastfmScrobbler.ts @@ -1,10 +1,10 @@ -import { type Logger } from "@foxxmd/logging"; -import EventEmitter from "events"; -import { type PlayObject, type SourcePlayerObj } from "../../core/Atomic.ts"; +import type {Logger} from "@foxxmd/logging"; +import type EventEmitter from "events"; +import type {PlayObject, SourcePlayerObj} from "../../core/Atomic.ts"; import { buildTrackString, capitalize } from "../../core/StringUtils.ts"; import { isNodeNetworkException } from "../common/errors/NodeErrors.ts"; -import { type FormatPlayObjectOptions, type InternalConfigOptional, type TimeRangeListensFetcher } from "../common/infrastructure/Atomic.ts"; -import { type LastfmClientConfig } from "../common/infrastructure/config/client/lastfm.ts"; +import type {FormatPlayObjectOptions, InternalConfigOptional, TimeRangeListensFetcher} from "../common/infrastructure/Atomic.ts"; +import type {LastfmClientConfig} from "../common/infrastructure/config/client/lastfm.ts"; import LastfmApiClient, { LastFMIgnoredScrobble, playToClientPayload, formatPlayObj } from "../common/vendor/LastfmApiClient.ts"; import AbstractScrobbleClient, { nowPlayingUpdateByPlayDuration } from "./AbstractScrobbleClient.ts"; import { findCauseByReference } from "../utils/ErrorUtils.ts"; diff --git a/src/backend/scrobblers/LibrefmScrobbler.ts b/src/backend/scrobblers/LibrefmScrobbler.ts index 8c910363..c80f7884 100644 --- a/src/backend/scrobblers/LibrefmScrobbler.ts +++ b/src/backend/scrobblers/LibrefmScrobbler.ts @@ -1,10 +1,10 @@ -import { type EventEmitter } from "events"; -import { type Logger } from "@foxxmd/logging"; +import type {EventEmitter} from "events"; +import type {Logger} from "@foxxmd/logging"; import LastfmScrobbler from "./LastfmScrobbler.ts"; -import { type LibrefmClientConfig } from "../common/infrastructure/config/client/librefm.ts"; +import type {LibrefmClientConfig} from "../common/infrastructure/config/client/librefm.ts"; import { formatPlayObj, LIBREFM_HOST, LIBREFM_PATH } from "../common/vendor/LastfmApiClient.ts"; -import { type LastfmClientConfig, type LastfmData } from "../common/infrastructure/config/client/lastfm.ts"; -import { type FormatPlayObjectOptions, type InternalConfigOptional } from "../common/infrastructure/Atomic.ts"; +import type {LastfmClientConfig, LastfmData} from "../common/infrastructure/config/client/lastfm.ts"; +import type {FormatPlayObjectOptions, InternalConfigOptional} from "../common/infrastructure/Atomic.ts"; export default class LibrefmScrobbler extends LastfmScrobbler { diff --git a/src/backend/scrobblers/ListenbrainzScrobbler.ts b/src/backend/scrobblers/ListenbrainzScrobbler.ts index 80999e06..991bd282 100644 --- a/src/backend/scrobblers/ListenbrainzScrobbler.ts +++ b/src/backend/scrobblers/ListenbrainzScrobbler.ts @@ -1,13 +1,13 @@ -import { type Logger } from "@foxxmd/logging"; -import EventEmitter from "events"; -import { type PlayObject, type SourcePlayerObj } from "../../core/Atomic.ts"; +import type {Logger} from "@foxxmd/logging"; +import type EventEmitter from "events"; +import type {PlayObject, SourcePlayerObj} from "../../core/Atomic.ts"; import { buildTrackString, capitalize } from "../../core/StringUtils.ts"; import { isNodeNetworkException } from "../common/errors/NodeErrors.ts"; -import { type FormatPlayObjectOptions, type TimeRangeListensFetcher } from "../common/infrastructure/Atomic.ts"; +import type {FormatPlayObjectOptions, TimeRangeListensFetcher} from "../common/infrastructure/Atomic.ts"; import { DEFAULT_MS_ITEMS_PER_GET_LZ, type ListenBrainzClientConfig } from "../common/infrastructure/config/client/listenbrainz.ts"; import { ListenbrainzApiClient } from "../common/vendor/ListenbrainzApiClient.ts"; import { playToListenPayload } from '../common/vendor/listenbrainz/lzUtils.ts'; -import { type ListenPayload } from '../../core/vendor/listenbrainz/interfaces.ts'; +import type {ListenPayload} from '../../core/vendor/listenbrainz/interfaces.ts'; import AbstractScrobbleClient, { nowPlayingUpdateByPlayDuration } from "./AbstractScrobbleClient.ts"; import { isDebugMode } from "../utils.ts"; diff --git a/src/backend/scrobblers/MalojaScrobbler.ts b/src/backend/scrobblers/MalojaScrobbler.ts index e64def83..c8f5a3bb 100644 --- a/src/backend/scrobblers/MalojaScrobbler.ts +++ b/src/backend/scrobblers/MalojaScrobbler.ts @@ -1,14 +1,12 @@ import { childLogger, type Logger } from "@foxxmd/logging"; -import EventEmitter from "events"; +import type EventEmitter from "events"; import normalizeUrl from "normalize-url"; -import { type PlayObject } from "../../core/Atomic.ts"; +import type {PlayObject} from "../../core/Atomic.ts"; import { buildTrackString, capitalize } from "../../core/StringUtils.ts"; import { isNodeNetworkException } from "../common/errors/NodeErrors.ts"; -import { type FormatPlayObjectOptions, type TimeRangeListensFetcher } from "../common/infrastructure/Atomic.ts"; -import { type MalojaClientConfig } from "../common/infrastructure/config/client/maloja.ts"; -import { - type MalojaScrobbleRequestData, -} from "../common/vendor/maloja/interfaces.ts"; +import type {FormatPlayObjectOptions, TimeRangeListensFetcher} from "../common/infrastructure/Atomic.ts"; +import type {MalojaClientConfig} from "../common/infrastructure/config/client/maloja.ts"; +import type {MalojaScrobbleRequestData} from "../common/vendor/maloja/interfaces.ts"; import AbstractScrobbleClient from "./AbstractScrobbleClient.ts"; import { MalojaApiClient, formatPlayObj as formatMalojaScrobbleToPlay, playToScrobblePayload } from "../common/vendor/maloja/MalojaApiClient.ts"; import { createGetScrobblesForTimeRangeFunc } from "../utils/ListenFetchUtils.ts"; diff --git a/src/backend/scrobblers/RockskyScrobbler.ts b/src/backend/scrobblers/RockskyScrobbler.ts index ecc69806..b8c1129a 100644 --- a/src/backend/scrobblers/RockskyScrobbler.ts +++ b/src/backend/scrobblers/RockskyScrobbler.ts @@ -1,17 +1,17 @@ import { childLogger, type Logger } from "@foxxmd/logging"; -import EventEmitter from "events"; -import { type PlayObject, type SourcePlayerObj } from "../../core/Atomic.ts"; +import type EventEmitter from "events"; +import type {PlayObject, SourcePlayerObj} from "../../core/Atomic.ts"; import { buildTrackString, capitalize } from "../../core/StringUtils.ts"; import { isNodeNetworkException } from "../common/errors/NodeErrors.ts"; -import { type FormatPlayObjectOptions, type InternalConfigOptional } from "../common/infrastructure/Atomic.ts"; +import type {FormatPlayObjectOptions, InternalConfigOptional} from "../common/infrastructure/Atomic.ts"; import { ListenbrainzApiClient } from "../common/vendor/ListenbrainzApiClient.ts"; import { playToListenPayload } from '../common/vendor/listenbrainz/lzUtils.ts'; -import { type ListenPayload } from '../../core/vendor/listenbrainz/interfaces.ts'; +import type {ListenPayload} from '../../core/vendor/listenbrainz/interfaces.ts'; import { isDebugMode } from "../utils.ts"; import { durationToHuman } from '../../core/TimeUtils.ts'; import { RockSkyApiClient, rockskyScrobbleToPlay, type SubmitResponse } from "../common/vendor/RockSkyApiClient.ts"; -import { type RockSkyClientConfig } from "../common/infrastructure/config/client/rocksky.ts"; +import type {RockSkyClientConfig} from "../common/infrastructure/config/client/rocksky.ts"; import { ScrobbleSubmitError } from "../common/errors/MSErrors.ts"; import AbstractHistoricalScrobbleClient from "./AbstractHistoricalScrobbleClient.ts"; import { fromStream } from '@atcute/repo'; diff --git a/src/backend/scrobblers/ScrobbleClients.ts b/src/backend/scrobblers/ScrobbleClients.ts index cf0bd864..cf8eb779 100644 --- a/src/backend/scrobblers/ScrobbleClients.ts +++ b/src/backend/scrobblers/ScrobbleClients.ts @@ -1,29 +1,31 @@ import { childLogger, type Logger } from '@foxxmd/logging'; import dayjs, { type Dayjs } from "dayjs"; -import { type PlayObject, type SourcePlayerObj } from "../../core/Atomic.ts"; -import { type ConfigMeta, type InternalConfig, type InternalConfigOptional, isClientType, type SourceIdentifier } from "../common/infrastructure/Atomic.ts"; -import { clientTypes, type ClientType } from '../common/infrastructure/config/client/clients.ts'; -import { type AIOConfig } from "../common/infrastructure/config/aioConfig.ts"; -import { type ClientAIOConfig, type ClientConfig } from "../common/infrastructure/config/client/clients.ts"; -import { type LastfmClientConfig, type LastfmData } from "../common/infrastructure/config/client/lastfm.ts"; -import { type ListenBrainzClientConfig, type ListenBrainzData } from "../common/infrastructure/config/client/listenbrainz.ts"; -import { type MalojaClientConfig, type MalojaData } from "../common/infrastructure/config/client/maloja.ts"; -import { WildcardEmitter } from "../common/WildcardEmitter.ts"; -import { Notifiers } from "../notifier/Notifiers.ts"; +import type {PlayObject, SourcePlayerObj} from "../../core/Atomic.ts"; +import type {ConfigMeta, InternalConfig, InternalConfigOptional, SourceIdentifier} from "../common/infrastructure/Atomic.ts"; +import { isClientType } from '../../core/Atomic.ts'; +import { clientTypes } from "../../core/Atomic.ts"; +import type {ClientType} from "../../core/Atomic.ts"; +import type {AIOConfig} from "../common/infrastructure/config/aioConfig.ts"; +import type {ClientAIOConfig, ClientConfig} from "../common/infrastructure/config/client/clients.ts"; +import type {LastfmClientConfig, LastfmData} from "../common/infrastructure/config/client/lastfm.ts"; +import type {ListenBrainzClientConfig, ListenBrainzData} from "../common/infrastructure/config/client/listenbrainz.ts"; +import type {MalojaClientConfig, MalojaData} from "../common/infrastructure/config/client/maloja.ts"; +import type { WildcardEmitter } from "../common/WildcardEmitter.ts"; +import type { Notifiers } from "../notifier/Notifiers.ts"; import { isDebugMode, nonEmptyObj } from "../utils.ts"; import { removeUndefinedKeys } from '../../core/DataUtils.ts'; import { getCommonComponentEnvConfig, readJson } from '../utils/DataUtils.ts'; import { validateJson } from "../utils/ValidationUtils.ts"; -import AbstractScrobbleClient from "./AbstractScrobbleClient.ts"; -import { type KoitoClientConfig, type KoitoData } from '../common/infrastructure/config/client/koito.ts'; -import { type TealClientConfig, type TealData } from '../common/infrastructure/config/client/tealfm.ts'; -import { type RockSkyClientConfig, type RockSkyData } from '../common/infrastructure/config/client/rocksky.ts'; -import { type CommonClientOptions } from '../common/infrastructure/config/client/index.ts'; -import { type ExternalMetadataTerm, type PlayTransformHooks } from '../../core/Transform.ts'; -import { type LibrefmClientConfig, type LibrefmData } from '../common/infrastructure/config/client/librefm.ts'; +import type AbstractScrobbleClient from "./AbstractScrobbleClient.ts"; +import type {KoitoClientConfig, KoitoData} from '../common/infrastructure/config/client/koito.ts'; +import type {TealClientConfig, TealData} from '../common/infrastructure/config/client/tealfm.ts'; +import type {RockSkyClientConfig, RockSkyData} from '../common/infrastructure/config/client/rocksky.ts'; +import type {CommonClientOptions} from '../common/infrastructure/config/client/index.ts'; +import type {ExternalMetadataTerm, PlayTransformHooks} from '../../core/Transform.ts'; +import type {LibrefmClientConfig, LibrefmData} from '../common/infrastructure/config/client/librefm.ts'; import clone from 'clone'; -import { type DiscordClientConfig, type DiscordData } from '../common/infrastructure/config/client/discord.ts'; +import type {DiscordClientConfig, DiscordData} from '../common/infrastructure/config/client/discord.ts'; type groupedNamedConfigs = {[key: string]: ParsedConfig[]}; diff --git a/src/backend/scrobblers/TealfmScrobbler.ts b/src/backend/scrobblers/TealfmScrobbler.ts index a218c420..ffd608cf 100644 --- a/src/backend/scrobblers/TealfmScrobbler.ts +++ b/src/backend/scrobblers/TealfmScrobbler.ts @@ -1,18 +1,18 @@ import { childLogger, type Logger } from "@foxxmd/logging"; -import EventEmitter from "events"; +import type EventEmitter from "events"; import fsPromise from 'node:fs/promises'; import fs from 'node:fs'; import path from 'path'; import { Readable } from 'stream'; -import { type PlayObject, type SourcePlayerObj } from "../../core/Atomic.ts"; +import type {PlayObject, SourcePlayerObj} from "../../core/Atomic.ts"; import { buildTrackString, capitalize } from "../../core/StringUtils.ts"; import { isNodeNetworkException } from "../common/errors/NodeErrors.ts"; -import { type FormatPlayObjectOptions, type InternalConfigOptional } from "../common/infrastructure/Atomic.ts"; +import type {FormatPlayObjectOptions, InternalConfigOptional} from "../common/infrastructure/Atomic.ts"; import { playToListenPayload } from '../common/vendor/listenbrainz/lzUtils.ts'; import { nowPlayingUpdateByPlayDuration, shouldClearNPStatus } from "./AbstractScrobbleClient.ts"; -import { type TealClientConfig } from "../common/infrastructure/config/client/tealfm.ts"; +import type {TealClientConfig} from "../common/infrastructure/config/client/tealfm.ts"; import { ATProtoAppApiClient } from "../common/vendor/atproto/ATProtoAppApiClient.ts"; import { playToRecord, TealApiClient } from "../common/vendor/teal/TealApiClient.ts"; import { playToStatusRecord } from "../common/vendor/teal/TealApiClient.ts"; @@ -24,7 +24,7 @@ import AbstractHistoricalScrobbleClient from "./AbstractHistoricalScrobbleClient import { fromStream } from '@atcute/repo'; import { playToRepositoryCreatePlayHistoricalOpts, type RepositoryCreatePlayHistoricalOpts } from "../common/database/drizzle/repositories/PlayHistoricalRepository.ts"; import { isAbortError } from "abort-controller-x"; -import { FmTealAlphaFeedPlay } from "../common/vendor/teal/lexicons/index.ts"; +import type { FmTealAlphaFeedPlay } from "../common/vendor/teal/lexicons/index.ts"; export default class TealScrobbler extends AbstractHistoricalScrobbleClient { diff --git a/src/backend/server/api.ts b/src/backend/server/api.ts index 41df31be..12f97e16 100644 --- a/src/backend/server/api.ts +++ b/src/backend/server/api.ts @@ -1,9 +1,9 @@ -import { type LogDataPretty, type Logger, type LogLevel } from "@foxxmd/logging"; -import { type Express } from 'express'; +import type {LogDataPretty, Logger, LogLevel} from "@foxxmd/logging"; +import type {Express} from 'express'; import bsseDef from 'better-sse'; import bodyParser from "body-parser"; import { FixedSizeList } from 'fixed-size-list'; -import { PassThrough } from "node:stream"; +import type { PassThrough } from "node:stream"; import { Transform } from "stream"; import { CLIENT_DEAD_QUEUE, @@ -19,10 +19,10 @@ import { type SourceStatusData, } from "../../core/Atomic.ts"; import { capitalize } from "../../core/StringUtils.ts"; -import { type ExpressHandler, type LeveledLogData } from "../common/infrastructure/Atomic.ts"; +import type {ExpressHandler, LeveledLogData} from "../common/infrastructure/Atomic.ts"; import { getRoot } from "../ioc.ts"; import AbstractScrobbleClient from "../scrobblers/AbstractScrobbleClient.ts"; -import AbstractSource from "../sources/AbstractSource.ts"; +import type AbstractSource from "../sources/AbstractSource.ts"; import MemorySource from "../sources/MemorySource.ts"; import { parseBool } from "../utils.ts"; import { sortByNewestPlayDate } from '../../core/PlayUtils.ts'; @@ -32,17 +32,17 @@ import {setupLZEndpointRoutes} from "./endpointListenbrainzRoutes.ts"; import {setupLastfmEndpointRoutes} from "./endpointLastfmRoutes.ts"; import { type ComponentAwareRequest, makeClientCheckMiddle, makeClientNextMiddle, makeComponentMiddle, makeSourceCheckMiddle, makeSourceNextMiddle, type SourceAwareRequest } from "./middleware.ts"; import { setupWebscrobblerRoutes } from "./webscrobblerRoutes.ts"; -import ScrobbleSources from "../sources/ScrobbleSources.ts"; -import ScrobbleClients from "../scrobblers/ScrobbleClients.ts"; +import type ScrobbleSources from "../sources/ScrobbleSources.ts"; +import type ScrobbleClients from "../scrobblers/ScrobbleClients.ts"; import prom from 'prom-client'; import { SimpleError } from "../common/errors/MSErrors.ts"; import { DrizzlePlayRepository, type QueryPlaysOpts, type QueryPlaysOptsJson } from "../common/database/drizzle/repositories/PlayRepository.ts"; import { playSelectToDeadScrobble } from "../common/database/drizzle/entityUtils.ts"; import AbstractHistoricalScrobbleClient from "../scrobblers/AbstractHistoricalScrobbleClient.ts"; import { DrizzlePlayHistoricalRepository } from "../common/database/drizzle/repositories/PlayHistoricalRepository.ts"; -import { type ComponentClientApiJson, type ComponentSourceApiJson } from "../../core/Api.ts"; +import type {ComponentClientApiJson, ComponentSourceApiJson} from "../../core/Api.ts"; import { asDayjsHydratedObject } from "../../core/DataUtils.ts"; -import { type Dayjs } from "dayjs"; +import type {Dayjs} from "dayjs"; import { asSerializablePlaySelect } from "../../core/PlayMarshalUtils.ts"; const maxBufferSize = 300; diff --git a/src/backend/server/auth.ts b/src/backend/server/auth.ts index 398bddb9..27c28853 100644 --- a/src/backend/server/auth.ts +++ b/src/backend/server/auth.ts @@ -1,15 +1,15 @@ -import { type Express } from 'express'; -import { type Logger } from "@foxxmd/logging"; +import type {Express} from 'express'; +import type {Logger} from "@foxxmd/logging"; import passport from "passport"; -import { type ExpressHandler } from "../common/infrastructure/Atomic.ts"; -import LastfmScrobbler from "../scrobblers/LastfmScrobbler.ts"; -import ScrobbleClients from "../scrobblers/ScrobbleClients.ts"; -import LastfmSource from "../sources/LastfmSource.ts"; -import ScrobbleSources from "../sources/ScrobbleSources.ts"; -import SpotifySource from "../sources/SpotifySource.ts"; -import YTMusicSource from "../sources/YTMusicSource.ts"; -import LibrefmScrobbler from "../scrobblers/LibrefmScrobbler.ts"; -import LibrefmSource from "../sources/LibrefmSource.ts"; +import type {ExpressHandler} from "../common/infrastructure/Atomic.ts"; +import type LastfmScrobbler from "../scrobblers/LastfmScrobbler.ts"; +import type ScrobbleClients from "../scrobblers/ScrobbleClients.ts"; +import type LastfmSource from "../sources/LastfmSource.ts"; +import type ScrobbleSources from "../sources/ScrobbleSources.ts"; +import type SpotifySource from "../sources/SpotifySource.ts"; +import type YTMusicSource from "../sources/YTMusicSource.ts"; +import type LibrefmScrobbler from "../scrobblers/LibrefmScrobbler.ts"; +import type LibrefmSource from "../sources/LibrefmSource.ts"; import AbstractSource from "../sources/AbstractSource.ts"; export const setupAuthRoutes = (app: Express, logger: Logger, sourceMiddle: ExpressHandler, clientMiddle: ExpressHandler, scrobbleSources: ScrobbleSources, scrobbleClients: ScrobbleClients) => { diff --git a/src/backend/server/deezerRoutes.ts b/src/backend/server/deezerRoutes.ts index bbe3bd85..ca8e1530 100644 --- a/src/backend/server/deezerRoutes.ts +++ b/src/backend/server/deezerRoutes.ts @@ -1,8 +1,8 @@ -import { type Express } from 'express'; -import { type Logger } from "@foxxmd/logging"; +import type { Express } from 'express'; +import type { Logger } from "@foxxmd/logging"; import passport from "passport"; -import DeezerSource from "../sources/DeezerSource.ts"; -import ScrobbleSources from "../sources/ScrobbleSources.ts"; +import type DeezerSource from "../sources/DeezerSource.ts"; +import type ScrobbleSources from "../sources/ScrobbleSources.ts"; import { sleep } from "../utils.ts"; export const setupDeezerRoutes = (app: Express, logger: Logger, scrobbleSources: ScrobbleSources) => { diff --git a/src/backend/server/endpointLastfmRoutes.ts b/src/backend/server/endpointLastfmRoutes.ts index 01bdd823..462376c5 100644 --- a/src/backend/server/endpointLastfmRoutes.ts +++ b/src/backend/server/endpointLastfmRoutes.ts @@ -1,12 +1,13 @@ /* eslint-disable prefer-arrow-functions/prefer-arrow-functions */ -import { type Express } from 'express'; +import type {Express} from 'express'; import { childLogger, type Logger } from "@foxxmd/logging"; import bodyParser from "body-parser"; -import ScrobbleSources from "../sources/ScrobbleSources.ts"; +import type ScrobbleSources from "../sources/ScrobbleSources.ts"; import { nonEmptyBody } from "./middleware.ts"; import { LFMEndpointNotifier } from "../sources/ingressNotifiers/LFMEndpointNotifier.ts"; -import { EndpointLastfmSource, playStateFromRequest, parseDisplayIdentifiersFromRequest } from "../sources/EndpointLastfmSource.ts"; -import { type LastFMScrobbleRequestPayload } from "../common/vendor/LastfmApiClient.ts"; +import type { EndpointLastfmSource} from "../sources/EndpointLastfmSource.ts"; +import { playStateFromRequest, parseDisplayIdentifiersFromRequest } from "../sources/EndpointLastfmSource.ts"; +import type {LastFMScrobbleRequestPayload} from "../common/vendor/LastfmApiClient.ts"; export const setupLastfmEndpointRoutes = (app: Express, parentLogger: Logger, scrobbleSources: ScrobbleSources) => { diff --git a/src/backend/server/endpointListenbrainzRoutes.ts b/src/backend/server/endpointListenbrainzRoutes.ts index 944e4dcf..36411484 100644 --- a/src/backend/server/endpointListenbrainzRoutes.ts +++ b/src/backend/server/endpointListenbrainzRoutes.ts @@ -1,13 +1,14 @@ /* eslint-disable prefer-arrow-functions/prefer-arrow-functions */ -import { type Express } from 'express'; +import type {Express} from 'express'; import { childLogger, type Logger } from "@foxxmd/logging"; import bodyParser from "body-parser"; -import { EndpointListenbrainzSource, playStateFromRequest, parseDisplayIdentifiersFromRequest } from "../sources/EndpointListenbrainzSource.ts"; +import type { EndpointListenbrainzSource} from "../sources/EndpointListenbrainzSource.ts"; +import { playStateFromRequest, parseDisplayIdentifiersFromRequest } from "../sources/EndpointListenbrainzSource.ts"; import { LZEndpointNotifier } from "../sources/ingressNotifiers/LZEndpointNotifier.ts"; -import ScrobbleSources from "../sources/ScrobbleSources.ts"; +import type ScrobbleSources from "../sources/ScrobbleSources.ts"; import { nonEmptyBody } from "./middleware.ts"; -import { type PlayingNowPayload } from '../../core/vendor/listenbrainz/interfaces.ts'; -import ScrobbleClients from '../scrobblers/ScrobbleClients.ts'; +import type {PlayingNowPayload} from '../../core/vendor/listenbrainz/interfaces.ts'; +import type ScrobbleClients from '../scrobblers/ScrobbleClients.ts'; import { playToListenPayload } from '../common/vendor/listenbrainz/lzUtils.ts'; import { stringToDeterministicNumber } from '../utils/StringUtils.ts'; import { messageWithCauses } from '../../core/ErrorUtils.ts'; diff --git a/src/backend/server/index.ts b/src/backend/server/index.ts index 34bb86fa..74e8b106 100644 --- a/src/backend/server/index.ts +++ b/src/backend/server/index.ts @@ -3,7 +3,7 @@ import { childLogger, type LogDataPretty, type Logger } from "@foxxmd/logging"; import bodyParser from 'body-parser'; import { stripIndents } from "common-tags"; import session from 'express-session'; -import { PassThrough } from "node:stream"; +import type { PassThrough } from "node:stream"; import passport from 'passport'; import path from "path"; import qs from 'qs'; @@ -13,8 +13,8 @@ import { getRoot } from "../ioc.ts"; import { parseBool } from "../utils.ts"; import { getAddress } from "../utils/NetworkUtils.ts"; import { setupApi } from "./api.ts"; -import ScrobbleSources from '../sources/ScrobbleSources.ts'; -import ScrobbleClients from '../scrobblers/ScrobbleClients.ts'; +import type ScrobbleSources from '../sources/ScrobbleSources.ts'; +import type ScrobbleClients from '../scrobblers/ScrobbleClients.ts'; import { qsOptions } from '../../core/Atomic.ts'; const app = express(); diff --git a/src/backend/server/middleware.ts b/src/backend/server/middleware.ts index a84f5f6c..b19f7bea 100644 --- a/src/backend/server/middleware.ts +++ b/src/backend/server/middleware.ts @@ -1,10 +1,10 @@ -import { type Logger } from "@foxxmd/logging"; -import { type ExpressHandler } from "../common/infrastructure/Atomic.ts"; -import ScrobbleClients from "../scrobblers/ScrobbleClients.ts"; -import ScrobbleSources from "../sources/ScrobbleSources.ts"; -import { type Request, type Response, type NextFunction } from "express"; -import AbstractSource from "../sources/AbstractSource.ts"; -import AbstractScrobbleClient from "../scrobblers/AbstractScrobbleClient.ts"; +import type {Logger} from "@foxxmd/logging"; +import type {ExpressHandler} from "../common/infrastructure/Atomic.ts"; +import type ScrobbleClients from "../scrobblers/ScrobbleClients.ts"; +import type ScrobbleSources from "../sources/ScrobbleSources.ts"; +import type {Request, Response, NextFunction} from "express"; +import type AbstractSource from "../sources/AbstractSource.ts"; +import type AbstractScrobbleClient from "../scrobblers/AbstractScrobbleClient.ts"; export const makeSourceCheckMiddle = (sources: any) => (required: boolean): ExpressHandler => (req: any, res: any, next: any) => { const { diff --git a/src/backend/server/webscrobblerRoutes.ts b/src/backend/server/webscrobblerRoutes.ts index 3ce74dd8..beb62557 100644 --- a/src/backend/server/webscrobblerRoutes.ts +++ b/src/backend/server/webscrobblerRoutes.ts @@ -1,10 +1,10 @@ -import { type Express } from 'express'; +import type {Express} from 'express'; import { childLogger, type Logger } from "@foxxmd/logging"; import bodyParser from "body-parser"; import cors from 'cors'; import path from "path"; import { WebhookNotifier } from "../sources/ingressNotifiers/WebhookNotifier.ts"; -import ScrobbleSources from "../sources/ScrobbleSources.ts"; +import type ScrobbleSources from "../sources/ScrobbleSources.ts"; import { WebScrobblerSource } from "../sources/WebScrobblerSource.ts"; import { nonEmptyBody } from "./middleware.ts"; diff --git a/src/backend/sources/AbstractSource.ts b/src/backend/sources/AbstractSource.ts index 82ab9582..485622a5 100644 --- a/src/backend/sources/AbstractSource.ts +++ b/src/backend/sources/AbstractSource.ts @@ -1,7 +1,7 @@ import { childLogger, type LogDataPretty, type LogLevel } from '@foxxmd/logging'; import dayjs, { type Dayjs } from "dayjs"; -import { EventEmitter } from "events"; -import { FixedSizeList } from "fixed-size-list"; +import type { EventEmitter } from "events"; +import type { FixedSizeList } from "fixed-size-list"; import { type PlayMatchResult, type PlayObject, SOURCE_SOT } from "../../core/Atomic.ts"; import { buildTrackString, capitalize, truncateStringToLength } from "../../core/StringUtils.ts"; import AbstractComponent from "../common/AbstractComponent.ts"; @@ -14,9 +14,10 @@ import { type InternalConfig, type ProgressAwarePlayObject, } from "../common/infrastructure/Atomic.ts"; -import { type PlayUserId } from '../../core/Atomic.ts'; -import { type DeviceId } from '../../core/Atomic.ts'; -import { type SourceType, type SourceConfig } from '../common/infrastructure/config/source/sources.ts'; +import type {PlayUserId} from '../../core/Atomic.ts'; +import type {DeviceId} from '../../core/Atomic.ts'; +import type {SourceConfig} from '../common/infrastructure/config/source/sources.ts'; +import type {SourceType} from "../../core/Atomic.ts"; import { TRANSFORM_HOOK } from "../../core/Transform.ts"; import TupleMap from "../common/TupleMap.ts"; import { @@ -36,7 +37,7 @@ import { messageWithCausesTruncatedDefault } from "../../core/ErrorUtils.ts"; import { existingScrobble, type ExistingScrobbleOpts } from '../utils/PlayComparisonUtils.ts'; import { staggerMapper } from '../utils/AsyncUtils.ts'; import pMap, {pMapIterable} from 'p-map'; -import { Counter } from 'prom-client'; +import type { Counter } from 'prom-client'; import { normalizeStr } from '../utils/StringUtils.ts'; import { spawn, isAbortError, delay, throwIfAborted } from 'abort-controller-x'; import { generateLoggableAbortReason } from '../common/errors/MSErrors.ts'; @@ -44,7 +45,7 @@ import { DrizzlePlayRepository, playToRepositoryCreatePlayOpts, type QueryPlaysO import { asPlay } from '../../core/PlayMarshalUtils.ts'; import { AsyncTask, SimpleIntervalJob, ToadScheduler } from 'toad-scheduler'; import { COMPONENT_STATE, type ComponentSourceApiJson, type ComponentState, type PlayApiCommonDetailed } from '../../core/Api.ts'; -import { type PaginatedResponse } from "../../core/Api.ts"; +import type {PaginatedResponse} from "../../core/Api.ts"; export interface RecentlyPlayedOptions { limit?: number diff --git a/src/backend/sources/AzuracastSource.ts b/src/backend/sources/AzuracastSource.ts index ceae561c..b569f288 100644 --- a/src/backend/sources/AzuracastSource.ts +++ b/src/backend/sources/AzuracastSource.ts @@ -1,18 +1,19 @@ import MemorySource from "./MemorySource.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import { childLogger } from "@foxxmd/logging"; -import { EventEmitter } from "events"; -import { WS, CloseEvent, ErrorEvent, RetryEvent } from 'iso-websocket' +import type { EventEmitter } from "events"; +import type { CloseEvent, ErrorEvent, RetryEvent } from 'iso-websocket'; +import { WS } from 'iso-websocket' import pEvent from 'p-event'; -import { type PlayObject, type PlayObjectMinimal, type URLData } from "../../core/Atomic.ts"; +import type {PlayObject, PlayObjectMinimal, URLData} from "../../core/Atomic.ts"; import { type FormatPlayObjectOptions, type InternalConfig, type PlayerStateData, - REPORTED_PLAYER_STATUSES, SINGLE_USER_PLATFORM_ID, } from "../common/infrastructure/Atomic.ts"; -import { type AzuracastSourceConfig, type AzuraNowPlayingResponse, type AzuraStationResponse } from "../common/infrastructure/config/source/azuracast.ts"; +import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; +import type {AzuracastSourceConfig, AzuraNowPlayingResponse, AzuraStationResponse} from "../common/infrastructure/config/source/azuracast.ts"; import { isPortReachable, normalizeWSAddress } from "../utils/NetworkUtils.ts"; import { baseFormatPlayObj } from "../utils/PlayTransformUtils.ts"; import { artistNamesToCredits } from "../../core/StringUtils.ts"; diff --git a/src/backend/sources/ChromecastSource.ts b/src/backend/sources/ChromecastSource.ts index c019da58..341a5ee9 100644 --- a/src/backend/sources/ChromecastSource.ts +++ b/src/backend/sources/ChromecastSource.ts @@ -1,11 +1,12 @@ -import { createPlatform, Media, MediaController, PersistentClient } from "@foxxmd/chromecast-client"; +import type { Media} from "@foxxmd/chromecast-client"; +import { createPlatform, MediaController, PersistentClient } from "@foxxmd/chromecast-client"; import { ContextualValidationError } from "@foxxmd/chromecast-client/dist/cjs/src/utils.js"; import { childLogger, type Logger } from "@foxxmd/logging"; import { Client as CastClient } from 'castv2'; import dayjs from "dayjs"; -import { EventEmitter } from "events"; +import type { EventEmitter } from "events"; import e from "express"; -import { type PlayObject, type PlayObjectMinimal } from "../../core/Atomic.ts"; +import type {PlayObject, PlayObjectMinimal} from "../../core/Atomic.ts"; import { artistNamesToCredits, buildTrackString } from "../../core/StringUtils.ts"; import { NETWORK_ERROR_FAILURE_CODES } from "../common/errors/NodeErrors.ts"; import { @@ -16,7 +17,7 @@ import { type PlayerStateData, type SourceData, } from "../common/infrastructure/Atomic.ts"; -import { type ChromecastSourceConfig } from "../common/infrastructure/config/source/chromecast.ts"; +import type {ChromecastSourceConfig} from "../common/infrastructure/config/source/chromecast.ts"; import { MaybeLogger } from '../common/MaybeLogger.ts'; import { chromePlayerStateToReported, @@ -25,16 +26,12 @@ import { getCurrentPlatformApplications, getMediaStatus, } from "../common/vendor/chromecast/ChromecastClientUtils.ts"; -import { - type PlatformApplication, - type PlatformApplicationWithContext, - type PlatformType -} from "../common/vendor/chromecast/interfaces.ts"; +import type {PlatformApplication, PlatformApplicationWithContext, PlatformType} from "../common/vendor/chromecast/interfaces.ts"; import { difference, isDebugMode, parseBool } from "../utils.ts"; import { genGroupIdStr } from '../../core/PlayUtils.ts'; import { findCauseByReference } from "../utils/ErrorUtils.ts"; import { discoveryAvahi, discoveryNative } from "../utils/MDNSUtils.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import { MemoryPositionalSource } from "./MemoryPositionalSource.ts"; import { baseFormatPlayObj } from "../utils/PlayTransformUtils.ts"; diff --git a/src/backend/sources/DeezerInternalSource.ts b/src/backend/sources/DeezerInternalSource.ts index 61a54767..d7976a9f 100644 --- a/src/backend/sources/DeezerInternalSource.ts +++ b/src/backend/sources/DeezerInternalSource.ts @@ -1,17 +1,18 @@ import dayjs from "dayjs"; -import EventEmitter from "events"; -import request, { Request } from 'superagent'; +import type EventEmitter from "events"; +import type { Request } from 'superagent'; +import request from 'superagent'; import { type PlayObject, type PlayObjectMinimal, SOURCE_SOT, TA_CLOSE, TA_DURING, TA_EXACT, TA_FUZZY, type TemporalAccuracy } from "../../core/Atomic.ts"; import { DEFAULT_RETRY_MULTIPLIER, type FormatPlayObjectOptions, type InternalConfig } from "../common/infrastructure/Atomic.ts"; -import { type DeezerInternalSourceConfig, type DeezerInternalTrackData } from "../common/infrastructure/config/source/deezer.ts"; +import type {DeezerInternalSourceConfig, DeezerInternalTrackData} from "../common/infrastructure/config/source/deezer.ts"; import { TRANSFORM_HOOK } from "../../core/Transform.ts"; import { parseRetryAfterSecsFromObj, playObjDataMatch, sleep, sortByOldestPlayDate} from "../utils.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import { CookieJar } from 'tough-cookie'; import { MixedCookieAgent } from 'http-cookie-agent/http'; import MemorySource from "./MemorySource.ts"; import { genericSourcePlayMatch } from "../utils/PlayComparisonUtils.ts"; -import { type TemporalPlayComparisonOptions } from "../utils/TimeUtils.ts"; +import type {TemporalPlayComparisonOptions} from "../utils/TimeUtils.ts"; import { findAsync, findIndexAsync } from "../utils/AsyncUtils.ts"; import { baseFormatPlayObj } from "../utils/PlayTransformUtils.ts"; import { UpstreamError } from "../common/errors/UpstreamError.ts"; diff --git a/src/backend/sources/DeezerSource.ts b/src/backend/sources/DeezerSource.ts index da9a2f9b..517c6b3a 100644 --- a/src/backend/sources/DeezerSource.ts +++ b/src/backend/sources/DeezerSource.ts @@ -1,11 +1,11 @@ import dayjs from "dayjs"; -import EventEmitter from "events"; +import type EventEmitter from "events"; import passport from "passport"; import { Strategy as DeezerStrategy } from 'passport-deezer'; import request from 'superagent'; -import { type PlayObject, type PlayObjectMinimal } from "../../core/Atomic.ts"; +import type {PlayObject, PlayObjectMinimal} from "../../core/Atomic.ts"; import { DEFAULT_RETRY_MULTIPLIER, type FormatPlayObjectOptions, type InternalConfig } from "../common/infrastructure/Atomic.ts"; -import { type DeezerSourceConfig } from "../common/infrastructure/config/source/deezer.ts"; +import type {DeezerSourceConfig} from "../common/infrastructure/config/source/deezer.ts"; import { parseRetryAfterSecsFromObj, sleep, sortByOldestPlayDate, } from "../utils.ts"; import { writeFile } from '../utils/FSUtils.ts'; import { readJson } from '../utils/DataUtils.ts'; diff --git a/src/backend/sources/EndpointLastfmSource.ts b/src/backend/sources/EndpointLastfmSource.ts index a9def087..da0dfecd 100644 --- a/src/backend/sources/EndpointLastfmSource.ts +++ b/src/backend/sources/EndpointLastfmSource.ts @@ -1,20 +1,19 @@ import dayjs from "dayjs"; -import EventEmitter from "events"; +import type EventEmitter from "events"; import { type PlayObject, SOURCE_SOT } from "../../core/Atomic.ts"; import { type ExpressRequest, type FormatPlayObjectOptions, type InternalConfig, NO_USER, - type PlayerStateData, - REPORTED_PLAYER_STATUSES -} from "../common/infrastructure/Atomic.ts"; -import { type PlayPlatformId } from '../../core/Atomic.ts'; + type PlayerStateData} from "../common/infrastructure/Atomic.ts"; +import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; +import type {PlayPlatformId} from '../../core/Atomic.ts'; import MemorySource from "./MemorySource.ts"; -import { type LastFMEndpointSourceConfig } from "../common/infrastructure/config/source/endpointlfm.ts"; +import type {LastFMEndpointSourceConfig} from "../common/infrastructure/config/source/endpointlfm.ts"; import { type LastFMScrobbleRequestPayload, scrobblePayloadToPlay } from "../common/vendor/LastfmApiClient.ts"; -import { type Logger } from "@foxxmd/logging"; -import { type PlayerStateOptions } from "./PlayerState/AbstractPlayerState.ts"; +import type {Logger} from "@foxxmd/logging"; +import type {PlayerStateOptions} from "./PlayerState/AbstractPlayerState.ts"; import { NowPlayingPlayerState } from "./PlayerState/NowPlayingPlayerState.ts"; import { parseRegexSingle } from "@foxxmd/regex-buddy-core"; diff --git a/src/backend/sources/EndpointListenbrainzSource.ts b/src/backend/sources/EndpointListenbrainzSource.ts index ed1688e9..a6d01f22 100644 --- a/src/backend/sources/EndpointListenbrainzSource.ts +++ b/src/backend/sources/EndpointListenbrainzSource.ts @@ -1,24 +1,23 @@ import dayjs from "dayjs"; -import EventEmitter from "events"; +import type EventEmitter from "events"; import { type PlayObject, SOURCE_SOT } from "../../core/Atomic.ts"; import { type ExpressRequest, type FormatPlayObjectOptions, type InternalConfig, NO_USER, - type PlayerStateData, - REPORTED_PLAYER_STATUSES, - type ReportedPlayerStatus -} from "../common/infrastructure/Atomic.ts"; -import { type PlayPlatformId } from '../../core/Atomic.ts'; -import { type ListenbrainzEndpointSourceConfig } from "../common/infrastructure/config/source/endpointlz.ts"; + type PlayerStateData} from "../common/infrastructure/Atomic.ts"; +import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; +import type {ReportedPlayerStatus} from '../../core/Atomic.ts'; +import type {PlayPlatformId} from '../../core/Atomic.ts'; +import type {ListenbrainzEndpointSourceConfig} from "../common/infrastructure/config/source/endpointlz.ts"; import { listenPayloadToPlay } from "../common/vendor/ListenbrainzApiClient.ts"; -import { type SubmitPayload } from '../../core/vendor/listenbrainz/interfaces.ts'; -import { type ListenPayload } from '../../core/vendor/listenbrainz/interfaces.ts'; +import type {SubmitPayload} from '../../core/vendor/listenbrainz/interfaces.ts'; +import type {ListenPayload} from '../../core/vendor/listenbrainz/interfaces.ts'; import MemorySource from "./MemorySource.ts"; import { NowPlayingPlayerState } from "./PlayerState/NowPlayingPlayerState.ts"; -import { type Logger } from "@foxxmd/logging"; -import { type PlayerStateOptions } from "./PlayerState/AbstractPlayerState.ts"; +import type {Logger} from "@foxxmd/logging"; +import type {PlayerStateOptions} from "./PlayerState/AbstractPlayerState.ts"; import { parseRegexSingle } from "@foxxmd/regex-buddy-core"; const noSlugMatch = new RegExp(/(?:\/api\/listenbrainz\/?)$|(?:\/1\/?|\/1\/submit-listens\/?\/1\/validate-token\/|)$/i); diff --git a/src/backend/sources/IcecastSource.ts b/src/backend/sources/IcecastSource.ts index 35b3bab2..5027f440 100644 --- a/src/backend/sources/IcecastSource.ts +++ b/src/backend/sources/IcecastSource.ts @@ -1,16 +1,16 @@ -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; -import { EventEmitter } from "events"; -import { type PlayObject, type PlayObjectMinimal, type URLData } from "../../core/Atomic.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; +import type { EventEmitter } from "events"; +import type {PlayObject, PlayObjectMinimal, URLData} from "../../core/Atomic.ts"; import { type FormatPlayObjectOptions, type InternalConfig, type PlayerStateData, - REPORTED_PLAYER_STATUSES, SINGLE_USER_PLATFORM_ID, } from "../common/infrastructure/Atomic.ts"; +import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; import { isPortReachableConnect, normalizeWebAddress } from "../utils/NetworkUtils.ts"; import MemorySource from "./MemorySource.ts"; -import { type IcecastMetadata, type IcecastSourceConfig } from "../common/infrastructure/config/source/icecast.ts"; +import type {IcecastMetadata, IcecastSourceConfig} from "../common/infrastructure/config/source/icecast.ts"; import IcecastMetadataStats from "icecast-metadata-stats"; import { parseArtistCredits, parseTrackCredits } from "../utils/StringUtils.ts"; import { isDebugMode, sleep } from "../utils.ts"; diff --git a/src/backend/sources/JRiverSource.ts b/src/backend/sources/JRiverSource.ts index 9dbbc029..e9df9dbd 100644 --- a/src/backend/sources/JRiverSource.ts +++ b/src/backend/sources/JRiverSource.ts @@ -1,12 +1,12 @@ import dayjs from "dayjs"; -import { EventEmitter } from "events"; +import type { EventEmitter } from "events"; import normalizeUrl from 'normalize-url'; import { URL } from "url"; -import { type PlayObject, type PlayObjectMinimal } from "../../core/Atomic.ts"; -import { type FormatPlayObjectOptions, type InternalConfig } from "../common/infrastructure/Atomic.ts"; -import { type JRiverSourceConfig } from "../common/infrastructure/config/source/jriver.ts"; +import type {PlayObject, PlayObjectMinimal} from "../../core/Atomic.ts"; +import type {FormatPlayObjectOptions, InternalConfig} from "../common/infrastructure/Atomic.ts"; +import type {JRiverSourceConfig} from "../common/infrastructure/config/source/jriver.ts"; import { type Info, JRiverApiClient, PLAYER_STATE } from "../common/vendor/JRiverApiClient.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import { MemoryPositionalSource } from "./MemoryPositionalSource.ts"; import { baseFormatPlayObj } from "../utils/PlayTransformUtils.ts"; import { artistNamesToCredits } from "../../core/StringUtils.ts"; diff --git a/src/backend/sources/JellyfinApiSource.ts b/src/backend/sources/JellyfinApiSource.ts index d9e8d1c9..359dbe35 100644 --- a/src/backend/sources/JellyfinApiSource.ts +++ b/src/backend/sources/JellyfinApiSource.ts @@ -1,6 +1,7 @@ import { WS } from "iso-websocket"; // @ts-expect-error weird typings? -import { Api, Jellyfin } from "@jellyfin/sdk"; +import type { Api} from "@jellyfin/sdk"; +import { Jellyfin } from "@jellyfin/sdk"; import { // @ts-expect-error weird typings? type BaseItemDto, @@ -34,18 +35,14 @@ import { getUserApi } from "@jellyfin/sdk/lib/utils/api/index.js"; import dayjs from "dayjs"; -import EventEmitter from "events"; +import type EventEmitter from "events"; import { FixedSizeList } from "fixed-size-list"; -import { type ArtistCredit, type BrainzMeta, type PlayObject, type PlayObjectMinimal } from "../../core/Atomic.ts"; +import type {ArtistCredit, BrainzMeta, PlayObject, PlayObjectMinimal} from "../../core/Atomic.ts"; import { genGroupIdStr } from '../../core/PlayUtils.ts'; import { artistNameToCredit, buildTrackString, combinePartsToString, truncateStringToLength } from "../../core/StringUtils.ts"; -import { - type FormatPlayObjectOptions, - type InternalConfig, - type PlayerStateDataMaybePlay, - REPORTED_PLAYER_STATUSES -} from "../common/infrastructure/Atomic.ts"; -import { type JellyApiSourceConfig } from "../common/infrastructure/config/source/jellyfin.ts"; +import type {FormatPlayObjectOptions, InternalConfig, PlayerStateDataMaybePlay} from "../common/infrastructure/Atomic.ts"; +import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; +import type {JellyApiSourceConfig} from "../common/infrastructure/config/source/jellyfin.ts"; import { getPlatformIdFromData, isDebugMode } from "../utils.ts"; import { noCasePropObj } from "../utils/DataUtils.ts"; import { joinedUrl } from "../utils/NetworkUtils.ts"; diff --git a/src/backend/sources/KodiSource.ts b/src/backend/sources/KodiSource.ts index 931b44fe..213d4b97 100644 --- a/src/backend/sources/KodiSource.ts +++ b/src/backend/sources/KodiSource.ts @@ -1,9 +1,9 @@ -import { EventEmitter } from "events"; -import { type PlayObject } from "../../core/Atomic.ts"; -import { type FormatPlayObjectOptions, type InternalConfig } from "../common/infrastructure/Atomic.ts"; -import { type KodiSourceConfig } from "../common/infrastructure/config/source/kodi.ts"; +import type { EventEmitter } from "events"; +import type {PlayObject} from "../../core/Atomic.ts"; +import type {FormatPlayObjectOptions, InternalConfig} from "../common/infrastructure/Atomic.ts"; +import type {KodiSourceConfig} from "../common/infrastructure/config/source/kodi.ts"; import { KodiApiClient } from "../common/vendor/KodiApiClient.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import { MemoryPositionalSource } from "./MemoryPositionalSource.ts"; export class KodiSource extends MemoryPositionalSource { diff --git a/src/backend/sources/KoitoSource.ts b/src/backend/sources/KoitoSource.ts index 4237f3cc..6df01ab1 100644 --- a/src/backend/sources/KoitoSource.ts +++ b/src/backend/sources/KoitoSource.ts @@ -1,11 +1,11 @@ -import EventEmitter from "events"; +import type EventEmitter from "events"; import { type PlayObject, SOURCE_SOT } from "../../core/Atomic.ts"; import { isNodeNetworkException } from "../common/errors/NodeErrors.ts"; -import { type FormatPlayObjectOptions, type InternalConfig, type TimeRangeListensFetcher } from "../common/infrastructure/Atomic.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import type {FormatPlayObjectOptions, InternalConfig, TimeRangeListensFetcher} from "../common/infrastructure/Atomic.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import MemorySource from "./MemorySource.ts"; import { KoitoApiClient, listenObjectResponseToPlay } from "../common/vendor/koito/KoitoApiClient.ts"; -import { type KoitoSourceConfig } from "../common/infrastructure/config/source/koito.ts"; +import type {KoitoSourceConfig} from "../common/infrastructure/config/source/koito.ts"; import { createGetScrobblesForTimeRangeFunc } from "../utils/ListenFetchUtils.ts"; export default class KoitoSource extends MemorySource { diff --git a/src/backend/sources/LastfmSource.ts b/src/backend/sources/LastfmSource.ts index 75297471..ae75ca32 100644 --- a/src/backend/sources/LastfmSource.ts +++ b/src/backend/sources/LastfmSource.ts @@ -1,15 +1,15 @@ -import EventEmitter from "events"; +import type EventEmitter from "events"; import { type PlayObject, SOURCE_SOT } from "../../core/Atomic.ts"; -import { type FormatPlayObjectOptions, type InternalConfig, type TimeRangeListensFetcher } from "../common/infrastructure/Atomic.ts"; -import { type PlayPlatformId } from '../../core/Atomic.ts'; -import { type SourceType } from '../common/infrastructure/config/source/sources.ts'; -import { type LastfmSourceConfig } from "../common/infrastructure/config/source/lastfm.ts"; +import type {FormatPlayObjectOptions, InternalConfig, TimeRangeListensFetcher} from "../common/infrastructure/Atomic.ts"; +import type {PlayPlatformId} from '../../core/Atomic.ts'; +import type {SourceType} from "../../core/Atomic.ts"; +import type {LastfmSourceConfig} from "../common/infrastructure/config/source/lastfm.ts"; import LastfmApiClient, { formatPlayObj } from "../common/vendor/LastfmApiClient.ts"; import { sortByOldestPlayDate } from "../utils.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import MemorySource from "./MemorySource.ts"; -import { type Logger } from "@foxxmd/logging"; -import { type PlayerStateOptions } from "./PlayerState/AbstractPlayerState.ts"; +import type {Logger} from "@foxxmd/logging"; +import type {PlayerStateOptions} from "./PlayerState/AbstractPlayerState.ts"; import { NowPlayingPlayerState } from "./PlayerState/NowPlayingPlayerState.ts"; import { createGetScrobblesForTimeRangeFunc } from "../utils/ListenFetchUtils.ts"; diff --git a/src/backend/sources/LibrefmSource.ts b/src/backend/sources/LibrefmSource.ts index 2a65dbfa..e1a862f0 100644 --- a/src/backend/sources/LibrefmSource.ts +++ b/src/backend/sources/LibrefmSource.ts @@ -1,10 +1,10 @@ -import { type EventEmitter } from "events"; -import { type InternalConfig } from "../common/infrastructure/Atomic.ts"; -import { type LibrefmSourceConfig } from "../common/infrastructure/config/source/librefm.ts"; +import type {EventEmitter} from "events"; +import type {InternalConfig} from "../common/infrastructure/Atomic.ts"; +import type {LibrefmSourceConfig} from "../common/infrastructure/config/source/librefm.ts"; import LastfmSource from "./LastfmSource.ts"; import { LIBREFM_HOST, LIBREFM_PATH } from "../common/vendor/LastfmApiClient.ts"; -import { type LastfmData } from "../common/infrastructure/config/client/lastfm.ts"; -import { type LastfmSourceConfig } from "../common/infrastructure/config/source/lastfm.ts"; +import type {LastfmData} from "../common/infrastructure/config/client/lastfm.ts"; +import type {LastfmSourceConfig} from "../common/infrastructure/config/source/lastfm.ts"; export default class LibrefmSource extends LastfmSource { diff --git a/src/backend/sources/ListenbrainzSource.ts b/src/backend/sources/ListenbrainzSource.ts index 440bb82f..e71bcfd6 100644 --- a/src/backend/sources/ListenbrainzSource.ts +++ b/src/backend/sources/ListenbrainzSource.ts @@ -1,17 +1,17 @@ -import EventEmitter from "events"; +import type EventEmitter from "events"; import { type PlayObject, SOURCE_SOT } from "../../core/Atomic.ts"; import { isNodeNetworkException } from "../common/errors/NodeErrors.ts"; -import { type FormatPlayObjectOptions, type InternalConfig, type TimeRangeListensFetcher } from "../common/infrastructure/Atomic.ts"; -import { type PlayPlatformId } from '../../core/Atomic.ts'; -import { type ListenBrainzSourceConfig } from "../common/infrastructure/config/source/listenbrainz.ts"; +import type {FormatPlayObjectOptions, InternalConfig, TimeRangeListensFetcher} from "../common/infrastructure/Atomic.ts"; +import type {PlayPlatformId} from '../../core/Atomic.ts'; +import type {ListenBrainzSourceConfig} from "../common/infrastructure/config/source/listenbrainz.ts"; import { ListenbrainzApiClient } from "../common/vendor/ListenbrainzApiClient.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import MemorySource from "./MemorySource.ts"; import { isPortReachableConnect } from "../utils/NetworkUtils.ts"; -import { type Logger } from "@foxxmd/logging"; -import { type PlayerStateOptions } from "./PlayerState/AbstractPlayerState.ts"; +import type {Logger} from "@foxxmd/logging"; +import type {PlayerStateOptions} from "./PlayerState/AbstractPlayerState.ts"; import { NowPlayingPlayerState } from "./PlayerState/NowPlayingPlayerState.ts"; -import { type ManipulateType } from "dayjs"; +import type {ManipulateType} from "dayjs"; import { createGetScrobblesForTimeRangeFunc } from "../utils/ListenFetchUtils.ts"; export default class ListenbrainzSource extends MemorySource { diff --git a/src/backend/sources/MPDSource.ts b/src/backend/sources/MPDSource.ts index ea072345..2a4c6da9 100644 --- a/src/backend/sources/MPDSource.ts +++ b/src/backend/sources/MPDSource.ts @@ -1,22 +1,19 @@ import dayjs from "dayjs"; -import { EventEmitter } from "events"; +import type { EventEmitter } from "events"; import path from 'path'; import {MPC, type Status, type Song, type PlaylistItem} from 'mpc-js'; -import { type BrainzMeta, type PlayObject, type PlayObjectMinimal } from "../../core/Atomic.ts"; +import type {BrainzMeta, PlayObject, PlayObjectMinimal} from "../../core/Atomic.ts"; import { type FormatPlayObjectOptions, type InternalConfig, type PlayerStateData, - REPORTED_PLAYER_STATUSES, - type ReportedPlayerStatus, SINGLE_USER_PLATFORM_ID, } from "../common/infrastructure/Atomic.ts"; -import { - type MPDSourceConfig, - type PlayerState, -} from "../common/infrastructure/config/source/mpd.ts"; +import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; +import type {ReportedPlayerStatus} from '../../core/Atomic.ts'; +import type {MPDSourceConfig, PlayerState} from "../common/infrastructure/config/source/mpd.ts"; import { isPortReachable } from "../utils/NetworkUtils.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import { MemoryPositionalSource } from "./MemoryPositionalSource.ts"; import { baseFormatPlayObj } from "../utils/PlayTransformUtils.ts"; import { isDebugMode, sleep } from "../utils.ts"; diff --git a/src/backend/sources/MPRISSource.ts b/src/backend/sources/MPRISSource.ts index 777649ae..1570b219 100644 --- a/src/backend/sources/MPRISSource.ts +++ b/src/backend/sources/MPRISSource.ts @@ -1,9 +1,10 @@ import type { Interfaces as Notifications } from '@dbus-types/notifications' import dayjs from "dayjs"; -import { DBusInterface, sessionBus, Connection, type ConnectOpts } from 'dbus-ts'; -import EventEmitter from "events"; -import { type PlayObject, type PlayObjectMinimal } from "../../core/Atomic.ts"; -import { type FormatPlayObjectOptions, type InternalConfig } from "../common/infrastructure/Atomic.ts"; +import type { DBusInterface} from 'dbus-ts'; +import { sessionBus, Connection, type ConnectOpts } from 'dbus-ts'; +import type EventEmitter from "events"; +import type {PlayObject, PlayObjectMinimal} from "../../core/Atomic.ts"; +import type {FormatPlayObjectOptions, InternalConfig} from "../common/infrastructure/Atomic.ts"; import { MPRIS_IFACE, MPRIS_PATH, @@ -15,9 +16,9 @@ import { } from "../common/infrastructure/config/source/mpris.ts"; import { removeDuplicates } from "../utils.ts"; import { findCauseByMessage } from "../utils/ErrorUtils.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import MemorySource from "./MemorySource.ts"; -import { Readable, Writable } from 'stream'; +import type { Readable, Writable } from 'stream'; import net from 'net'; import pEvent from 'p-event'; import { baseFormatPlayObj } from '../utils/PlayTransformUtils.ts'; @@ -183,7 +184,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)}); } } @@ -193,7 +194,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)}) } } @@ -203,7 +204,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/MalojaSource.ts b/src/backend/sources/MalojaSource.ts index 993f2110..8281aa83 100644 --- a/src/backend/sources/MalojaSource.ts +++ b/src/backend/sources/MalojaSource.ts @@ -1,11 +1,11 @@ -import EventEmitter from "events"; +import type EventEmitter from "events"; import { type PlayObject, SOURCE_SOT } from "../../core/Atomic.ts"; import { isNodeNetworkException } from "../common/errors/NodeErrors.ts"; -import { type InternalConfig } from "../common/infrastructure/Atomic.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import type {InternalConfig} from "../common/infrastructure/Atomic.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import MemorySource from "./MemorySource.ts"; import { MalojaApiClient } from "../common/vendor/maloja/MalojaApiClient.ts"; -import { type MalojaSourceConfig } from "../common/infrastructure/config/source/maloja.ts"; +import type {MalojaSourceConfig} from "../common/infrastructure/config/source/maloja.ts"; export default class MalojaSource extends MemorySource { diff --git a/src/backend/sources/MemoryPositionalSource.ts b/src/backend/sources/MemoryPositionalSource.ts index 337228ea..99f31140 100644 --- a/src/backend/sources/MemoryPositionalSource.ts +++ b/src/backend/sources/MemoryPositionalSource.ts @@ -1,11 +1,12 @@ -import { type Logger } from "@foxxmd/logging"; -import { type InternalConfig } from "../common/infrastructure/Atomic.ts"; -import { type PlayPlatformId } from '../../core/Atomic.ts'; +import type {Logger} from "@foxxmd/logging"; +import type {InternalConfig} from "../common/infrastructure/Atomic.ts"; +import type {PlayPlatformId} from '../../core/Atomic.ts'; import MemorySource from "./MemorySource.ts"; -import { type PlayerStateOptions } from "./PlayerState/AbstractPlayerState.ts"; +import type {PlayerStateOptions} from "./PlayerState/AbstractPlayerState.ts"; import { PositionalPlayerState } from "./PlayerState/PositionalPlayerState.ts"; -import { type SourceConfig, type SourceType } from "../common/infrastructure/config/source/sources.ts"; -import EventEmitter from "events"; +import type {SourceConfig} from "../common/infrastructure/config/source/sources.ts"; +import type {SourceType} from "../../core/Atomic.ts"; +import type EventEmitter from "events"; export class MemoryPositionalSource extends MemorySource { constructor(type: SourceType, name: string, config: SourceConfig, internal: InternalConfig, emitter: EventEmitter) { diff --git a/src/backend/sources/MemorySource.ts b/src/backend/sources/MemorySource.ts index 1e0f1162..d0f28f75 100644 --- a/src/backend/sources/MemorySource.ts +++ b/src/backend/sources/MemorySource.ts @@ -1,17 +1,18 @@ -import { type Logger } from "@foxxmd/logging"; +import type {Logger} from "@foxxmd/logging"; import dayjs, { type Dayjs } from "dayjs"; -import { EventEmitter } from "events"; +import type { EventEmitter } from "events"; import { AsyncTask, SimpleIntervalJob, ToadScheduler } from "toad-scheduler"; import { type PlayObject, SOURCE_SOT, type SOURCE_SOT_TYPES, type SourcePlayerJson, type SourcePlayerObj } from "../../core/Atomic.ts"; import { buildTrackString } from "../../core/StringUtils.ts"; import { asPlayerStateDataMaybePlay, - CALCULATED_PLAYER_STATUSES, type InternalConfig, type PlayerStateDataMaybePlay, type ProgressAwarePlayObject} from "../common/infrastructure/Atomic.ts"; -import { type PlayPlatformId } from '../../core/Atomic.ts'; -import { type SourceType, type SourceConfig } from '../common/infrastructure/config/source/sources.ts'; -import { type PollingOptions } from "../common/infrastructure/config/common.ts"; +import { CALCULATED_PLAYER_STATUSES } from '../../core/Atomic.ts'; +import type {PlayPlatformId} from '../../core/Atomic.ts'; +import type {SourceConfig} from '../common/infrastructure/config/source/sources.ts'; +import type {SourceType} from "../../core/Atomic.ts"; +import type {PollingOptions} from "../common/infrastructure/config/common.ts"; import { getPlatformIdFromData, isDebugMode, @@ -24,10 +25,11 @@ import { timePassesScrobbleThreshold } from "../utils/TimeUtils.ts"; import { timeToHumanTimestamp } from "../../core/TimeUtils.ts"; import { PromisePool } from "@supercharge/promise-pool"; import AbstractSource from "./AbstractSource.ts"; -import { AbstractPlayerState, createPlayerOptions, type PlayerStateOptions } from "./PlayerState/AbstractPlayerState.ts"; +import type { AbstractPlayerState} from "./PlayerState/AbstractPlayerState.ts"; +import { createPlayerOptions, type PlayerStateOptions } from "./PlayerState/AbstractPlayerState.ts"; import { GenericPlayerState } from "./PlayerState/GenericPlayerState.ts"; import { hashObject } from "../utils/StringUtils.ts"; -import { type ComponentSourceApiJson } from "../../core/Api.ts"; +import type {ComponentSourceApiJson} from "../../core/Api.ts"; const EXPECTED_NON_DISCOVERED_REASON = 'not added because an identical play with the same timestamp was already discovered.'; diff --git a/src/backend/sources/MopidySource.ts b/src/backend/sources/MopidySource.ts index e12652c8..d78c5507 100644 --- a/src/backend/sources/MopidySource.ts +++ b/src/backend/sources/MopidySource.ts @@ -1,11 +1,11 @@ import { loggerTest } from "@foxxmd/logging"; import dayjs from "dayjs"; -import { EventEmitter } from "events"; +import type { EventEmitter } from "events"; import Mopidy, { type models } from "mopidy"; import normalizeUrl from 'normalize-url'; import pEvent from 'p-event'; import { URL } from "url"; -import { type PlayObject, type PlayObjectMinimal } from "../../core/Atomic.ts"; +import type {PlayObject, PlayObjectMinimal} from "../../core/Atomic.ts"; import { artistNamesToCredits, buildTrackString } from "../../core/StringUtils.ts"; import { type FormatPlayObjectOptions, @@ -13,8 +13,8 @@ import { type PlayerStateData, SINGLE_USER_PLATFORM_ID, } from "../common/infrastructure/Atomic.ts"; -import { type MopidySourceConfig } from "../common/infrastructure/config/source/mopidy.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import type {MopidySourceConfig} from "../common/infrastructure/config/source/mopidy.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import { MemoryPositionalSource } from "./MemoryPositionalSource.ts"; import { baseFormatPlayObj } from "../utils/PlayTransformUtils.ts"; diff --git a/src/backend/sources/MusicCastSource.ts b/src/backend/sources/MusicCastSource.ts index 54824cfb..c631a811 100644 --- a/src/backend/sources/MusicCastSource.ts +++ b/src/backend/sources/MusicCastSource.ts @@ -1,7 +1,7 @@ import { MemoryPositionalSource } from "./MemoryPositionalSource.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; -import { EventEmitter } from "events"; -import { type PlayObject, type PlayObjectMinimal, type URLData } from "../../core/Atomic.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; +import type { EventEmitter } from "events"; +import type {PlayObject, PlayObjectMinimal, URLData} from "../../core/Atomic.ts"; import { type FormatPlayObjectOptions, type InternalConfig, diff --git a/src/backend/sources/MusikcubeSource.ts b/src/backend/sources/MusikcubeSource.ts index 1bee4b0f..320756c1 100644 --- a/src/backend/sources/MusikcubeSource.ts +++ b/src/backend/sources/MusikcubeSource.ts @@ -1,9 +1,10 @@ import { childLogger } from "@foxxmd/logging"; -import { EventEmitter } from "events"; -import { WS, CloseEvent, ErrorEvent, RetryEvent } from 'iso-websocket' +import type { EventEmitter } from "events"; +import type { CloseEvent, ErrorEvent, RetryEvent } from 'iso-websocket'; +import { WS } from 'iso-websocket' import { randomUUID } from "node:crypto"; import pEvent from 'p-event'; -import { type PlayObject, type PlayObjectMinimal, type URLData } from "../../core/Atomic.ts"; +import type {PlayObject, PlayObjectMinimal, URLData} from "../../core/Atomic.ts"; import { UpstreamError } from "../common/errors/UpstreamError.ts"; import { type FormatPlayObjectOptions, @@ -11,15 +12,9 @@ import { type PlayerStateData, SINGLE_USER_PLATFORM_ID, } from "../common/infrastructure/Atomic.ts"; -import { - type MCAuthenticateRequest, - type MCAuthenticateResponse, - type MCPlaybackOverviewRequest, - type MCPlaybackOverviewResponse, - type MusikcubeSourceConfig -} from "../common/infrastructure/config/source/musikcube.ts"; +import type {MCAuthenticateRequest, MCAuthenticateResponse, MCPlaybackOverviewRequest, MCPlaybackOverviewResponse, MusikcubeSourceConfig} from "../common/infrastructure/config/source/musikcube.ts"; import { sleep } from "../utils.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import { MemoryPositionalSource } from "./MemoryPositionalSource.ts"; import { normalizeWSAddress } from "../utils/NetworkUtils.ts"; import { baseFormatPlayObj } from "../utils/PlayTransformUtils.ts"; diff --git a/src/backend/sources/PlayerState/AbstractPlayerState.ts b/src/backend/sources/PlayerState/AbstractPlayerState.ts index 69a20eb1..9c1ce4b3 100644 --- a/src/backend/sources/PlayerState/AbstractPlayerState.ts +++ b/src/backend/sources/PlayerState/AbstractPlayerState.ts @@ -4,20 +4,21 @@ import { type PlayObject, type PlayProgress, type Second, SOURCE_SOT, type SOURC import { buildTrackString } from "../../../core/StringUtils.ts"; import { asPlayerStateData, - CALCULATED_PLAYER_STATUSES, - type CalculatedPlayerStatus, type PlayerStateData, type PlayerStateDataMaybePlay, - REPORTED_PLAYER_STATUSES, - type ReportedPlayerStatus, } from "../../common/infrastructure/Atomic.ts"; -import { type PlayPlatformId } from '../../../core/Atomic.ts'; -import { type PollingOptions } from "../../common/infrastructure/config/common.ts"; +import { CALCULATED_PLAYER_STATUSES } from '../../../core/Atomic.ts'; +import type {CalculatedPlayerStatus} from '../../../core/Atomic.ts'; +import { REPORTED_PLAYER_STATUSES } from '../../../core/Atomic.ts'; +import type {ReportedPlayerStatus} from '../../../core/Atomic.ts'; +import type {PlayPlatformId} from '../../../core/Atomic.ts'; +import type {PollingOptions} from "../../common/infrastructure/config/common.ts"; import { playObjDataMatch, progressBar } from "../../utils.ts"; import { genGroupIdStr } from '../../../core/PlayUtils.ts'; import { formatNumber } from '../../../core/DataUtils.ts'; -import { type ListenProgress } from "./ListenProgress.ts"; -import { ListenRange, ListenRangePositional } from "./ListenRange.ts"; +import type {ListenProgress} from "./ListenProgress.ts"; +import type { ListenRange} from "./ListenRange.ts"; +import { ListenRangePositional } from "./ListenRange.ts"; import { closeToPlayEnd, closeToPlayStart, repeatDurationPlayed } from "../../utils/TimeUtils.ts"; import { timeToHumanTimestamp } from "../../../core/TimeUtils.ts"; import { todayAwareFormat } from "../../../core/TimeUtils.ts"; diff --git a/src/backend/sources/PlayerState/GenericPlayerState.ts b/src/backend/sources/PlayerState/GenericPlayerState.ts index 8710e83a..7a5c310f 100644 --- a/src/backend/sources/PlayerState/GenericPlayerState.ts +++ b/src/backend/sources/PlayerState/GenericPlayerState.ts @@ -1,11 +1,12 @@ -import { type Logger } from "@foxxmd/logging"; -import { CALCULATED_PLAYER_STATUSES } from "../../common/infrastructure/Atomic.ts"; -import { type PlayPlatformId } from '../../../core/Atomic.ts'; +import type {Logger} from "@foxxmd/logging"; +import { CALCULATED_PLAYER_STATUSES } from '../../../core/Atomic.ts'; +import type {PlayPlatformId} from '../../../core/Atomic.ts'; import { AbstractPlayerState, type PlayerStateOptions } from "./AbstractPlayerState.ts"; -import { type PlayProgress } from "../../../core/Atomic.ts"; +import type {PlayProgress} from "../../../core/Atomic.ts"; import { type ListenProgress, ListenProgressTS } from "./ListenProgress.ts"; -import { ListenRange, ListenRangeTS } from "./ListenRange.ts"; -import { type Dayjs } from "dayjs"; +import type { ListenRange} from "./ListenRange.ts"; +import { ListenRangeTS } from "./ListenRange.ts"; +import type {Dayjs} from "dayjs"; export class GenericPlayerState extends AbstractPlayerState { protected newListenProgress(data?: Partial): ListenProgress { diff --git a/src/backend/sources/PlayerState/JellyfinPlayerState.ts b/src/backend/sources/PlayerState/JellyfinPlayerState.ts index 687e0757..87067a46 100644 --- a/src/backend/sources/PlayerState/JellyfinPlayerState.ts +++ b/src/backend/sources/PlayerState/JellyfinPlayerState.ts @@ -1,7 +1,8 @@ -import { type Logger } from "@foxxmd/logging"; -import { type PlayerStateDataMaybePlay, type ReportedPlayerStatus } from "../../common/infrastructure/Atomic.ts"; -import { type PlayPlatformId } from '../../../core/Atomic.ts'; -import { type PlayerStateOptions } from "./AbstractPlayerState.ts"; +import type {Logger} from "@foxxmd/logging"; +import type {PlayerStateDataMaybePlay} from "../../common/infrastructure/Atomic.ts"; +import type {ReportedPlayerStatus} from '../../../core/Atomic.ts'; +import type {PlayPlatformId} from '../../../core/Atomic.ts'; +import type {PlayerStateOptions} from "./AbstractPlayerState.ts"; import { PositionalPlayerState } from "./PositionalPlayerState.ts"; export class JellyfinPlayerState extends PositionalPlayerState { diff --git a/src/backend/sources/PlayerState/ListenProgress.ts b/src/backend/sources/PlayerState/ListenProgress.ts index d31a168c..b1085d13 100644 --- a/src/backend/sources/PlayerState/ListenProgress.ts +++ b/src/backend/sources/PlayerState/ListenProgress.ts @@ -1,6 +1,6 @@ import dayjs, { type Dayjs } from "dayjs"; -import { type PlayProgress, type PlayProgressPositional, type Second } from "../../../core/Atomic.ts"; +import type {PlayProgress, PlayProgressPositional, Second} from "../../../core/Atomic.ts"; export class ListenProgressTS implements PlayProgress { diff --git a/src/backend/sources/PlayerState/ListenRange.ts b/src/backend/sources/PlayerState/ListenRange.ts index 3da8fff5..c0b65d68 100644 --- a/src/backend/sources/PlayerState/ListenRange.ts +++ b/src/backend/sources/PlayerState/ListenRange.ts @@ -1,7 +1,8 @@ import dayjs, { type Dayjs } from "dayjs"; -import { type ListenRangeData, type Millisecond, type PlayProgress, type PlayProgressPositional, type Second } from "../../../core/Atomic.ts"; +import type {ListenRangeData, Millisecond, PlayProgress, PlayProgressPositional, Second} from "../../../core/Atomic.ts"; import { type ListenProgress, ListenProgressPositional, ListenProgressTS } from "./ListenProgress.ts"; -import { GenericRealtimePlayer, RealtimePlayer } from "./RealtimePlayer.ts"; +import type { RealtimePlayer } from "./RealtimePlayer.ts"; +import { GenericRealtimePlayer } from "./RealtimePlayer.ts"; export abstract class ListenRange { public start: ListenProgress; diff --git a/src/backend/sources/PlayerState/NowPlayingPlayerState.ts b/src/backend/sources/PlayerState/NowPlayingPlayerState.ts index a24c43a3..86cc18f5 100644 --- a/src/backend/sources/PlayerState/NowPlayingPlayerState.ts +++ b/src/backend/sources/PlayerState/NowPlayingPlayerState.ts @@ -1,4 +1,4 @@ -import { type SourcePlayerObj } from "../../../core/Atomic.ts"; +import type {SourcePlayerObj} from "../../../core/Atomic.ts"; import { GenericPlayerState } from "./GenericPlayerState.ts"; /** diff --git a/src/backend/sources/PlayerState/PlexPlayerState.ts b/src/backend/sources/PlayerState/PlexPlayerState.ts index d90b9e1b..b6013242 100644 --- a/src/backend/sources/PlayerState/PlexPlayerState.ts +++ b/src/backend/sources/PlayerState/PlexPlayerState.ts @@ -1,7 +1,7 @@ -import { type Logger } from "@foxxmd/logging"; -import { REPORTED_PLAYER_STATUSES } from "../../common/infrastructure/Atomic.ts"; -import { type PlayPlatformId } from '../../../core/Atomic.ts'; -import { type PlayerStateOptions } from "./AbstractPlayerState.ts"; +import type {Logger} from "@foxxmd/logging"; +import { REPORTED_PLAYER_STATUSES } from '../../../core/Atomic.ts'; +import type {PlayPlatformId} from '../../../core/Atomic.ts'; +import type {PlayerStateOptions} from "./AbstractPlayerState.ts"; import { PositionalPlayerState } from "./PositionalPlayerState.ts"; export class PlexPlayerState extends PositionalPlayerState { diff --git a/src/backend/sources/PlayerState/PositionalPlayerState.ts b/src/backend/sources/PlayerState/PositionalPlayerState.ts index 2978b734..876e30e5 100644 --- a/src/backend/sources/PlayerState/PositionalPlayerState.ts +++ b/src/backend/sources/PlayerState/PositionalPlayerState.ts @@ -1,9 +1,9 @@ -import { type Logger } from "@foxxmd/logging"; -import { CALCULATED_PLAYER_STATUSES } from "../../common/infrastructure/Atomic.ts"; -import { type PlayPlatformId } from '../../../core/Atomic.ts'; +import type {Logger} from "@foxxmd/logging"; +import { CALCULATED_PLAYER_STATUSES } from '../../../core/Atomic.ts'; +import type {PlayPlatformId} from '../../../core/Atomic.ts'; import { AbstractPlayerState, type PlayerStateOptions } from "./AbstractPlayerState.ts"; -import { type PlayProgressPositional, type Second } from "../../../core/Atomic.ts"; -import { type Dayjs } from "dayjs"; +import type {PlayProgressPositional, Second} from "../../../core/Atomic.ts"; +import type {Dayjs} from "dayjs"; import { ListenProgressPositional } from "./ListenProgress.ts"; import { ListenRangePositional } from "./ListenRange.ts"; diff --git a/src/backend/sources/PlayerState/SubsonicPlayerState.ts b/src/backend/sources/PlayerState/SubsonicPlayerState.ts index e615d9eb..ee21a37a 100644 --- a/src/backend/sources/PlayerState/SubsonicPlayerState.ts +++ b/src/backend/sources/PlayerState/SubsonicPlayerState.ts @@ -1,5 +1,5 @@ import { GenericPlayerState } from "./GenericPlayerState.ts"; -import { type Dayjs } from "dayjs"; +import type {Dayjs} from "dayjs"; export class SubsonicPlayerState extends GenericPlayerState { diff --git a/src/backend/sources/PlexApiSource.ts b/src/backend/sources/PlexApiSource.ts index 6f4addcc..5bcadf76 100644 --- a/src/backend/sources/PlexApiSource.ts +++ b/src/backend/sources/PlexApiSource.ts @@ -1,32 +1,32 @@ -import EventEmitter from "events"; -import { type BrainzMeta, type PlayObject, type PlayObjectMinimal, type URLData } from "../../core/Atomic.ts"; +import type EventEmitter from "events"; +import type {BrainzMeta, PlayObject, PlayObjectMinimal, URLData} from "../../core/Atomic.ts"; import { artistNamesToCredits, combinePartsToString, truncateStringToLength } from "../../core/StringUtils.ts"; import { asPlayerStateDataMaybePlay, type FormatPlayObjectOptions, type InternalConfig, MBID_VARIOUS_ARTISTS, - type PlayerStateDataMaybePlay, - REPORTED_PLAYER_STATUSES -} from "../common/infrastructure/Atomic.ts"; -import { type PlayPlatformId } from '../../core/Atomic.ts'; + type PlayerStateDataMaybePlay} from "../common/infrastructure/Atomic.ts"; +import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; +import type {PlayPlatformId} from '../../core/Atomic.ts'; import { getFirstNonEmptyString, isDebugMode, } from "../utils.ts"; import { buildStatePlayerPlayIdententifyingInfo, hashObject, parseArrayFromMaybeString } from "../utils/StringUtils.ts"; -import { type GetSessionsMetadata } from "@lukehagar/plexjs/sdk/models/operations/getsessions.js"; +import type {GetSessionsMetadata} from "@lukehagar/plexjs/sdk/models/operations/getsessions.js"; import { PlexAPI, HTTPClient, type Fetcher } from "@lukehagar/plexjs"; import { Agent } from 'undici'; -import { type PlexApiSourceConfig } from "../common/infrastructure/config/source/plex.ts"; +import type {PlexApiSourceConfig} from "../common/infrastructure/config/source/plex.ts"; import { isPortReachable, normalizeWebAddress } from '../utils/NetworkUtils.ts'; -import { type GetTokenDetailsUserPlexAccount } from '@lukehagar/plexjs/sdk/models/operations/gettokendetails.js'; +import type {GetTokenDetailsUserPlexAccount} from '@lukehagar/plexjs/sdk/models/operations/gettokendetails.js'; import { parseRegexSingle } from '@foxxmd/regex-buddy-core'; import { Readable } from 'node:stream'; import { PlexPlayerState } from './PlayerState/PlexPlayerState.ts'; -import { AbstractPlayerState, type PlayerStateOptions } from './PlayerState/AbstractPlayerState.ts'; -import { type Logger } from '@foxxmd/logging'; +import type { AbstractPlayerState} from './PlayerState/AbstractPlayerState.ts'; +import type {PlayerStateOptions} from './PlayerState/AbstractPlayerState.ts'; +import type {Logger} from '@foxxmd/logging'; import { MemoryPositionalSource } from './MemoryPositionalSource.ts'; import { FixedSizeList } from 'fixed-size-list'; import { SDKValidationError } from '@lukehagar/plexjs/sdk/models/errors/sdkvalidationerror.js'; -import { Keyv } from 'cacheable'; +import type { Keyv } from 'cacheable'; import { initMemoryCache } from "../common/Cache.ts"; import { baseFormatPlayObj } from "../utils/PlayTransformUtils.ts"; diff --git a/src/backend/sources/RockskySource.ts b/src/backend/sources/RockskySource.ts index 0d8894a8..7ef34baf 100644 --- a/src/backend/sources/RockskySource.ts +++ b/src/backend/sources/RockskySource.ts @@ -1,11 +1,11 @@ -import EventEmitter from "events"; +import type EventEmitter from "events"; import { type PlayObject, SOURCE_SOT } from "../../core/Atomic.ts"; import { isNodeNetworkException } from "../common/errors/NodeErrors.ts"; -import { type FormatPlayObjectOptions, type InternalConfig } from "../common/infrastructure/Atomic.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import type {FormatPlayObjectOptions, InternalConfig} from "../common/infrastructure/Atomic.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import MemorySource from "./MemorySource.ts"; import { RockSkyApiClient } from "../common/vendor/RockSkyApiClient.ts"; -import { type RockskySourceConfig } from "../common/infrastructure/config/source/rocksky.ts"; +import type {RockskySourceConfig} from "../common/infrastructure/config/source/rocksky.ts"; export default class RockskySource extends MemorySource { diff --git a/src/backend/sources/ScrobbleSources.ts b/src/backend/sources/ScrobbleSources.ts index cfd52da7..17f7ad4a 100644 --- a/src/backend/sources/ScrobbleSources.ts +++ b/src/backend/sources/ScrobbleSources.ts @@ -1,60 +1,57 @@ import { childLogger, type Logger } from '@foxxmd/logging'; -import EventEmitter from "events"; -import { type ConfigMeta, type ConfigureAsSource, type InternalConfig, type InternalConfigOptional } from "../common/infrastructure/Atomic.ts"; -import { isSourceType } from '../common/infrastructure/config/source/sources.ts'; -import { sourceTypes } from '../common/infrastructure/config/source/sources.ts'; -import { type SourceType } from '../common/infrastructure/config/source/sources.ts'; -import { type AIOConfig, type SourceDefaults } from "../common/infrastructure/config/aioConfig.ts"; -import { type AzuracastData, type AzuracastSourceConfig } from "../common/infrastructure/config/source/azuracast.ts"; -import { type ChromecastData, type ChromecastSourceConfig } from "../common/infrastructure/config/source/chromecast.ts"; -import { type DeezerSourceConfig, type DeezerInternalSourceConfig, type DeezerCompatConfig } from "../common/infrastructure/config/source/deezer.ts"; -import { type ListenbrainzEndpointSourceConfig, type ListenbrainzEndpointData } from "../common/infrastructure/config/source/endpointlz.ts"; -import { type LastFMEndpointSourceConfig, type LastFMEndpointData } from "../common/infrastructure/config/source/endpointlfm.ts"; -import { - type JellyApiData, - type JellyApiSourceConfig, -} from "../common/infrastructure/config/source/jellyfin.ts"; -import { type JRiverData, type JRiverSourceConfig } from "../common/infrastructure/config/source/jriver.ts"; -import { type KodiData, type KodiSourceConfig } from "../common/infrastructure/config/source/kodi.ts"; -import { type LastfmSourceConfig } from "../common/infrastructure/config/source/lastfm.ts"; -import { type ListenBrainzSourceConfig } from "../common/infrastructure/config/source/listenbrainz.ts"; -import { type MopidySourceConfig } from "../common/infrastructure/config/source/mopidy.ts"; -import { type MusicCastData, type MusicCastSourceConfig } from "../common/infrastructure/config/source/musiccast.ts"; -import { type IcecastData, type IcecastSourceConfig, type IcecastSourceOptions } from "../common/infrastructure/config/source/icecast.ts"; -import { type MPDData, type MPDSourceConfig } from "../common/infrastructure/config/source/mpd.ts"; -import { type MPRISData, type MPRISSourceConfig } from "../common/infrastructure/config/source/mpris.ts"; -import { type MusikcubeData, type MusikcubeSourceConfig } from "../common/infrastructure/config/source/musikcube.ts"; -import { type PlexApiData, type PlexApiSourceConfig } from "../common/infrastructure/config/source/plex.ts"; -import { type MalojaSourceConfig } from "../common/infrastructure/config/source/maloja.ts"; -import { type SourceAIOConfig, type SourceConfig } from "../common/infrastructure/config/source/sources.ts"; -import { type SpotifySourceConfig, type SpotifySourceData } from "../common/infrastructure/config/source/spotify.ts"; -import { type SubsonicData, type SubSonicSourceConfig } from "../common/infrastructure/config/source/subsonic.ts"; -import { type VLCData, type VLCSourceConfig } from "../common/infrastructure/config/source/vlc.ts"; -import { type WebScrobblerData, type WebScrobblerSourceConfig } from "../common/infrastructure/config/source/webscrobbler.ts"; -import { type YTMusicData, type YTMusicSourceConfig } from "../common/infrastructure/config/source/ytmusic.ts"; -import { type YandexMusicBridgeData, type YandexMusicBridgeSourceConfig } from "../common/infrastructure/config/source/ymbridge.ts"; -import { type SonosData, type SonosSourceConfig } from "../common/infrastructure/config/source/sonos.ts"; -import { WildcardEmitter } from "../common/WildcardEmitter.ts"; +import type EventEmitter from "events"; +import type {ConfigMeta, ConfigureAsSource, InternalConfig, InternalConfigOptional} from "../common/infrastructure/Atomic.ts"; +import { isSourceType } from "../../core/Atomic.ts"; +import { sourceTypes } from "../../core/Atomic.ts"; +import type {SourceType} from "../../core/Atomic.ts"; +import type {AIOConfig, SourceDefaults} from "../common/infrastructure/config/aioConfig.ts"; +import type {AzuracastData, AzuracastSourceConfig} from "../common/infrastructure/config/source/azuracast.ts"; +import type {ChromecastData, ChromecastSourceConfig} from "../common/infrastructure/config/source/chromecast.ts"; +import type {DeezerSourceConfig, DeezerInternalSourceConfig, DeezerCompatConfig} from "../common/infrastructure/config/source/deezer.ts"; +import type {ListenbrainzEndpointSourceConfig, ListenbrainzEndpointData} from "../common/infrastructure/config/source/endpointlz.ts"; +import type {LastFMEndpointSourceConfig, LastFMEndpointData} from "../common/infrastructure/config/source/endpointlfm.ts"; +import type {JellyApiData, JellyApiSourceConfig} from "../common/infrastructure/config/source/jellyfin.ts"; +import type {JRiverData, JRiverSourceConfig} from "../common/infrastructure/config/source/jriver.ts"; +import type {KodiData, KodiSourceConfig} from "../common/infrastructure/config/source/kodi.ts"; +import type {LastfmSourceConfig} from "../common/infrastructure/config/source/lastfm.ts"; +import type {ListenBrainzSourceConfig} from "../common/infrastructure/config/source/listenbrainz.ts"; +import type {MopidySourceConfig} from "../common/infrastructure/config/source/mopidy.ts"; +import type {MusicCastData, MusicCastSourceConfig} from "../common/infrastructure/config/source/musiccast.ts"; +import type {IcecastData, IcecastSourceConfig, IcecastSourceOptions} from "../common/infrastructure/config/source/icecast.ts"; +import type {MPDData, MPDSourceConfig} from "../common/infrastructure/config/source/mpd.ts"; +import type {MPRISData, MPRISSourceConfig} from "../common/infrastructure/config/source/mpris.ts"; +import type {MusikcubeData, MusikcubeSourceConfig} from "../common/infrastructure/config/source/musikcube.ts"; +import type {PlexApiData, PlexApiSourceConfig} from "../common/infrastructure/config/source/plex.ts"; +import type {MalojaSourceConfig} from "../common/infrastructure/config/source/maloja.ts"; +import type {SourceAIOConfig, SourceConfig} from "../common/infrastructure/config/source/sources.ts"; +import type {SpotifySourceConfig, SpotifySourceData} from "../common/infrastructure/config/source/spotify.ts"; +import type {SubsonicData, SubSonicSourceConfig} from "../common/infrastructure/config/source/subsonic.ts"; +import type {VLCData, VLCSourceConfig} from "../common/infrastructure/config/source/vlc.ts"; +import type {WebScrobblerData, WebScrobblerSourceConfig} from "../common/infrastructure/config/source/webscrobbler.ts"; +import type {YTMusicData, YTMusicSourceConfig} from "../common/infrastructure/config/source/ytmusic.ts"; +import type {YandexMusicBridgeData, YandexMusicBridgeSourceConfig} from "../common/infrastructure/config/source/ymbridge.ts"; +import type {SonosData, SonosSourceConfig} from "../common/infrastructure/config/source/sonos.ts"; +import type { WildcardEmitter } from "../common/WildcardEmitter.ts"; import { nonEmptyObj, parseBool } from "../utils.ts"; import { removeUndefinedKeys } from '../../core/DataUtils.ts'; import { getCommonComponentEnvConfig, readJson } from '../utils/DataUtils.ts'; import { validateJson } from "../utils/ValidationUtils.ts"; -import AbstractSource from "./AbstractSource.ts"; +import type AbstractSource from "./AbstractSource.ts"; import { nonEmptyStringOrDefault } from '../../core/StringUtils.ts'; -import { type KoitoSourceConfig } from '../common/infrastructure/config/source/koito.ts'; -import { type TealSourceConfig } from '../common/infrastructure/config/source/tealfm.ts'; -import { type RockskySourceConfig } from '../common/infrastructure/config/source/rocksky.ts'; -import { type CommonSourceOptions } from '../common/infrastructure/config/source/index.ts'; -import { type ExternalMetadataTerm, type PlayTransformHooks } from '../../core/Transform.ts'; -import { type LibrefmSourceConfig } from '../common/infrastructure/config/source/librefm.ts'; -import { type LastfmData } from '../common/infrastructure/config/client/lastfm.ts'; -import { type MalojaData } from '../common/infrastructure/config/client/maloja.ts'; -import { type LibrefmData } from '../common/infrastructure/config/client/librefm.ts'; -import { type ListenBrainzData } from '../common/infrastructure/config/client/listenbrainz.ts'; -import { type KoitoData } from '../common/infrastructure/config/client/koito.ts'; -import { type TealData } from '../common/infrastructure/config/client/tealfm.ts'; -import { type RockSkyData } from '../common/infrastructure/config/client/rocksky.ts'; +import type {KoitoSourceConfig} from '../common/infrastructure/config/source/koito.ts'; +import type {TealSourceConfig} from '../common/infrastructure/config/source/tealfm.ts'; +import type {RockskySourceConfig} from '../common/infrastructure/config/source/rocksky.ts'; +import type {CommonSourceOptions} from '../common/infrastructure/config/source/index.ts'; +import type {ExternalMetadataTerm, PlayTransformHooks} from '../../core/Transform.ts'; +import type {LibrefmSourceConfig} from '../common/infrastructure/config/source/librefm.ts'; +import type {LastfmData} from '../common/infrastructure/config/client/lastfm.ts'; +import type {MalojaData} from '../common/infrastructure/config/client/maloja.ts'; +import type {LibrefmData} from '../common/infrastructure/config/client/librefm.ts'; +import type {ListenBrainzData} from '../common/infrastructure/config/client/listenbrainz.ts'; +import type {KoitoData} from '../common/infrastructure/config/client/koito.ts'; +import type {TealData} from '../common/infrastructure/config/client/tealfm.ts'; +import type {RockSkyData} from '../common/infrastructure/config/client/rocksky.ts'; type groupedNamedConfigs = {[key: string]: ParsedConfig[]}; diff --git a/src/backend/sources/SonosSource.ts b/src/backend/sources/SonosSource.ts index 6e9d7273..5dab7d81 100644 --- a/src/backend/sources/SonosSource.ts +++ b/src/backend/sources/SonosSource.ts @@ -1,21 +1,22 @@ -import { EventEmitter } from "events"; -import { type PlayObject, type PlayObjectMinimal } from "../../core/Atomic.ts"; +import type { EventEmitter } from "events"; +import type {PlayObject, PlayObjectMinimal} from "../../core/Atomic.ts"; import { type FormatPlayObjectOptions, type InternalConfig, NO_DEVICE, NO_USER, type PlayerStateData, - REPORTED_PLAYER_STATUSES, - type ReportedPlayerStatus, } from "../common/infrastructure/Atomic.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; +import type {ReportedPlayerStatus} from '../../core/Atomic.ts'; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import { MemoryPositionalSource } from "./MemoryPositionalSource.ts"; -import { type SonosSourceConfig } from "../common/infrastructure/config/source/sonos.ts"; -import { SonosDevice, SonosManager } from '@svrooij/sonos'; -import { type SonosState } from "@svrooij/sonos/lib/models/sonos-state.js"; +import type {SonosSourceConfig} from "../common/infrastructure/config/source/sonos.ts"; +import type { SonosDevice} from '@svrooij/sonos'; +import { SonosManager } from '@svrooij/sonos'; +import type {SonosState} from "@svrooij/sonos/lib/models/sonos-state.js"; import { GroupTransportState } from "@svrooij/sonos/lib/models/transport-state.js"; -import { type Track } from "@svrooij/sonos/lib/models/track.js"; +import type {Track} from "@svrooij/sonos/lib/models/track.js"; import { parseDurationFromTimestamp } from "../utils/TimeUtils.ts"; import { FixedSizeList } from "fixed-size-list"; import { buildStatePlayerPlayIdententifyingInfo, hashObject, parseArrayFromMaybeString } from "../utils/StringUtils.ts"; diff --git a/src/backend/sources/SpotifySource.ts b/src/backend/sources/SpotifySource.ts index 3292542b..018d38a9 100644 --- a/src/backend/sources/SpotifySource.ts +++ b/src/backend/sources/SpotifySource.ts @@ -1,5 +1,5 @@ import dayjs, { type Dayjs } from "dayjs"; -import EventEmitter from "events"; +import type EventEmitter from "events"; import SpotifyWebApi from "spotify-web-api-node"; import request from 'superagent'; import { type BrainzMeta, type PlayObject, type PlayObjectMinimal, SCROBBLE_TS_SOC_END, SCROBBLE_TS_SOC_START, type ScrobbleTsSOC } from "../../core/Atomic.ts"; @@ -16,11 +16,11 @@ import { type PaginatedTimeRangeListens, type PaginatedTimeRangeListensResult, type PlayerStateData, - type ReportedPlayerStatus, type SourceData, type TimeRangeListensFetcher, } from "../common/infrastructure/Atomic.ts"; -import { type SpotifySourceConfig } from "../common/infrastructure/config/source/spotify.ts"; +import type {ReportedPlayerStatus} from '../../core/Atomic.ts'; +import type {SpotifySourceConfig} from "../common/infrastructure/config/source/spotify.ts"; import { parseRetryAfterSecsFromObj, sleep, @@ -30,7 +30,7 @@ import { writeFile } from '../utils/FSUtils.ts'; import { readJson } from '../utils/DataUtils.ts'; import { findCauseByFunc } from "../utils/ErrorUtils.ts"; import { joinedUrl } from "../utils/NetworkUtils.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; // import SpotifyApi.AlbumObjectSimplified = SpotifyApi.SpotifyApi.AlbumObjectSimplified; // import SpotifyApi.ArtistObjectSimplified = SpotifyApi.SpotifyApi.ArtistObjectSimplified; // import SpotifyApi.CurrentlyPlayingObject = SpotifyApi.SpotifyApi.CurrentlyPlayingObject; diff --git a/src/backend/sources/SubsonicSource.ts b/src/backend/sources/SubsonicSource.ts index 7d387e38..66b0bb5f 100644 --- a/src/backend/sources/SubsonicSource.ts +++ b/src/backend/sources/SubsonicSource.ts @@ -1,22 +1,23 @@ import * as crypto from 'crypto'; import dayjs from "dayjs"; import isSameOrAfter from "dayjs/plugin/isSameOrAfter.js"; -import EventEmitter from "events"; -import request, { Request } from 'superagent'; -import { type PlayObject, type PlayObjectMinimal } from "../../core/Atomic.ts"; +import type EventEmitter from "events"; +import type { Request } from 'superagent'; +import request from 'superagent'; +import type {PlayObject, PlayObjectMinimal} from "../../core/Atomic.ts"; import { isNodeNetworkException } from "../common/errors/NodeErrors.ts"; import { UpstreamError } from "../common/errors/UpstreamError.ts"; import { DEFAULT_RETRY_MULTIPLIER, type FormatPlayObjectOptions, type InternalConfig } from "../common/infrastructure/Atomic.ts"; -import { type PlayPlatformId } from '../../core/Atomic.ts'; -import { type SubSonicSourceConfig } from "../common/infrastructure/config/source/subsonic.ts"; +import type {PlayPlatformId} from '../../core/Atomic.ts'; +import type {SubSonicSourceConfig} from "../common/infrastructure/config/source/subsonic.ts"; import { getSubsonicResponse, type SubsonicResponse, type SubsonicResponseCommon } from "../common/vendor/subsonic/interfaces.ts"; import { removeDuplicates } from "../utils.ts"; import { findCauseByFunc } from "../utils/ErrorUtils.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import MemorySource from "./MemorySource.ts"; import { SubsonicPlayerState } from './PlayerState/SubsonicPlayerState.ts'; -import { type PlayerStateOptions } from './PlayerState/AbstractPlayerState.ts'; -import { type Logger } from '@foxxmd/logging'; +import type {PlayerStateOptions} from './PlayerState/AbstractPlayerState.ts'; +import type {Logger} from '@foxxmd/logging'; import { baseFormatPlayObj } from '../utils/PlayTransformUtils.ts'; import { noRetryOnUpstreamError, tryApiCall } from '../utils/RequestUtils.ts'; import { artistNameToCredit } from '../../core/StringUtils.ts'; diff --git a/src/backend/sources/TealfmSource.ts b/src/backend/sources/TealfmSource.ts index aa6ba917..8f19f607 100644 --- a/src/backend/sources/TealfmSource.ts +++ b/src/backend/sources/TealfmSource.ts @@ -1,12 +1,12 @@ -import EventEmitter from "events"; +import type EventEmitter from "events"; import { type PlayObject, SOURCE_SOT } from "../../core/Atomic.ts"; import { isNodeNetworkException } from "../common/errors/NodeErrors.ts"; -import { type FormatPlayObjectOptions, type InternalConfig } from "../common/infrastructure/Atomic.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import type {FormatPlayObjectOptions, InternalConfig} from "../common/infrastructure/Atomic.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import MemorySource from "./MemorySource.ts"; import { TealApiClient } from "../common/vendor/teal/TealApiClient.ts"; import { recordToPlay } from "../common/vendor/teal/TealApiClient.ts"; -import { type TealSourceConfig } from "../common/infrastructure/config/source/tealfm.ts"; +import type {TealSourceConfig} from "../common/infrastructure/config/source/tealfm.ts"; import { ATProtoAppApiClient } from "../common/vendor/atproto/ATProtoAppApiClient.ts"; import { parseArrayFromMaybeString } from "../utils/StringUtils.ts"; diff --git a/src/backend/sources/VLCSource.ts b/src/backend/sources/VLCSource.ts index ca649b32..cebc811a 100644 --- a/src/backend/sources/VLCSource.ts +++ b/src/backend/sources/VLCSource.ts @@ -1,20 +1,20 @@ import { parseRegexSingle, parseToRegex } from "@foxxmd/regex-buddy-core"; -import { EventEmitter } from "events"; +import type { EventEmitter } from "events"; import * as VLC from "vlc-client" -import { type VlcMeta, type VlcStatus } from "vlc-client/dist/Types.js"; -import { type PlayObject, type PlayObjectMinimal } from "../../core/Atomic.ts"; +import type {VlcMeta, VlcStatus} from "vlc-client/dist/Types.js"; +import type {PlayObject, PlayObjectMinimal} from "../../core/Atomic.ts"; import { type FormatPlayObjectOptions, type InternalConfig, type PlayerStateData, - REPORTED_PLAYER_STATUSES, - type ReportedPlayerStatus, SINGLE_USER_PLATFORM_ID, } from "../common/infrastructure/Atomic.ts"; -import { type VlcAudioMeta, type VLCSourceConfig, type PlayerState } from "../common/infrastructure/config/source/vlc.ts"; +import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; +import type {ReportedPlayerStatus} from '../../core/Atomic.ts'; +import type {VlcAudioMeta, VLCSourceConfig, PlayerState} from "../common/infrastructure/config/source/vlc.ts"; import { isPortReachable } from "../utils/NetworkUtils.ts"; import { firstNonEmptyStr } from "../utils/StringUtils.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; import { MemoryPositionalSource } from "./MemoryPositionalSource.ts"; import { isDebugMode } from "../utils.ts"; import { baseFormatPlayObj } from "../utils/PlayTransformUtils.ts"; diff --git a/src/backend/sources/WebScrobblerSource.ts b/src/backend/sources/WebScrobblerSource.ts index 24ed4b31..c4754837 100644 --- a/src/backend/sources/WebScrobblerSource.ts +++ b/src/backend/sources/WebScrobblerSource.ts @@ -1,26 +1,22 @@ import dayjs, { type Dayjs } from "dayjs"; -import EventEmitter from "events"; +import type EventEmitter from "events"; import { type PlayObjectMinimal, SOURCE_SOT } from "../../core/Atomic.ts"; import { type FormatPlayObjectOptions, type InternalConfig, NO_USER, type PlayerStateData, - REPORTED_PLAYER_STATUSES, - type ReportedPlayerStatus, } from "../common/infrastructure/Atomic.ts"; -import { type PlayPlatformId } from '../../core/Atomic.ts'; -import { type WebScrobblerSourceConfig } from "../common/infrastructure/config/source/webscrobbler.ts"; -import { - type WebScrobblerHookEvent, - type WebScrobblerPayload, - type WebScrobblerSong -} from "../common/vendor/webscrobbler/interfaces.ts"; +import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; +import type {ReportedPlayerStatus} from '../../core/Atomic.ts'; +import type {PlayPlatformId} from '../../core/Atomic.ts'; +import type {WebScrobblerSourceConfig} from "../common/infrastructure/config/source/webscrobbler.ts"; +import type {WebScrobblerHookEvent, WebScrobblerPayload, WebScrobblerSong} from "../common/vendor/webscrobbler/interfaces.ts"; import { joinedUrl } from "../utils/NetworkUtils.ts"; import MemorySource from "./MemorySource.ts"; -import { type Logger } from "@foxxmd/logging"; -import { type PlayerStateOptions } from "./PlayerState/AbstractPlayerState.ts"; +import type {Logger} from "@foxxmd/logging"; +import type {PlayerStateOptions} from "./PlayerState/AbstractPlayerState.ts"; import { NowPlayingPlayerState } from "./PlayerState/NowPlayingPlayerState.ts"; import { baseFormatPlayObj } from "../utils/PlayTransformUtils.ts"; import { artistNameToCredit } from "../../core/StringUtils.ts"; diff --git a/src/backend/sources/YTMusicSource.ts b/src/backend/sources/YTMusicSource.ts index ad5f94c0..6468c980 100644 --- a/src/backend/sources/YTMusicSource.ts +++ b/src/backend/sources/YTMusicSource.ts @@ -1,8 +1,8 @@ import dayjs, { type Dayjs } from "dayjs"; -import EventEmitter from "events"; -import { type PlayObject, type PlayObjectMinimal } from "../../core/Atomic.ts"; -import { type FormatPlayObjectOptions, type InternalConfig } from "../common/infrastructure/Atomic.ts"; -import { type YTMusicSourceConfig } from "../common/infrastructure/config/source/ytmusic.ts"; +import type EventEmitter from "events"; +import type {PlayObject, PlayObjectMinimal} from "../../core/Atomic.ts"; +import type {FormatPlayObjectOptions, InternalConfig} from "../common/infrastructure/Atomic.ts"; +import type {YTMusicSourceConfig} from "../common/infrastructure/config/source/ytmusic.ts"; import { Innertube, UniversalCache, Parser, YTNodes, type ApiResponse, type IBrowseResponse, Log, type SessionOptions } from 'youtubei.js'; import { type GenerateAuthUrlOpts, OAuth2Client } from 'google-auth-library'; import {resolve} from 'path'; diff --git a/src/backend/sources/YandexMusicBridgeSource.ts b/src/backend/sources/YandexMusicBridgeSource.ts index 5e769c80..c269c608 100644 --- a/src/backend/sources/YandexMusicBridgeSource.ts +++ b/src/backend/sources/YandexMusicBridgeSource.ts @@ -1,16 +1,16 @@ -import { EventEmitter } from "events"; +import type { EventEmitter } from "events"; import request from 'superagent'; import { MemoryPositionalSource } from "./MemoryPositionalSource.ts"; -import { type RecentlyPlayedOptions } from "./AbstractSource.ts"; -import { type PlayObject, type PlayObjectMinimal, type URLData } from "../../core/Atomic.ts"; +import type {RecentlyPlayedOptions} from "./AbstractSource.ts"; +import type {PlayObject, PlayObjectMinimal, URLData} from "../../core/Atomic.ts"; import { type InternalConfig, NO_DEVICE, NO_USER, type PlayerStateDataMaybePlay, - REPORTED_PLAYER_STATUSES, } from "../common/infrastructure/Atomic.ts"; -import { type YandexMusicBridgeSourceConfig } from "../common/infrastructure/config/source/ymbridge.ts"; +import { REPORTED_PLAYER_STATUSES } from '../../core/Atomic.ts'; +import type {YandexMusicBridgeSourceConfig} from "../common/infrastructure/config/source/ymbridge.ts"; import { isPortReachableConnect, joinedUrl, normalizeWebAddress } from "../utils/NetworkUtils.ts"; import { baseFormatPlayObj } from "../utils/PlayTransformUtils.ts"; import { UpstreamError } from "../common/errors/UpstreamError.ts"; diff --git a/src/backend/sources/ingressNotifiers/IngressNotifier.ts b/src/backend/sources/ingressNotifiers/IngressNotifier.ts index 6761d79b..a22a9cf5 100644 --- a/src/backend/sources/ingressNotifiers/IngressNotifier.ts +++ b/src/backend/sources/ingressNotifiers/IngressNotifier.ts @@ -1,6 +1,6 @@ import { childLogger, type Logger } from '@foxxmd/logging'; -import { type Request } from "express"; -import { type RemoteIdentityParts } from "../../common/infrastructure/Atomic.ts"; +import type {Request} from "express"; +import type {RemoteIdentityParts} from "../../common/infrastructure/Atomic.ts"; import { remoteHostIdentifiers, remoteHostStr } from "../../utils.ts"; diff --git a/src/backend/sources/ingressNotifiers/LFMEndpointNotifier.ts b/src/backend/sources/ingressNotifiers/LFMEndpointNotifier.ts index 133fee8f..439bd3d4 100644 --- a/src/backend/sources/ingressNotifiers/LFMEndpointNotifier.ts +++ b/src/backend/sources/ingressNotifiers/LFMEndpointNotifier.ts @@ -1,8 +1,8 @@ -import { type Logger } from "@foxxmd/logging"; -import { type Request } from "express"; +import type {Logger} from "@foxxmd/logging"; +import type {Request} from "express"; import { parseIdentifiersFromRequest } from "../EndpointLastfmSource.ts"; import { IngressNotifier } from "./IngressNotifier.ts"; -import { type LastFMScrobbleRequestPayload } from "../../common/vendor/LastfmApiClient.ts"; +import type {LastFMScrobbleRequestPayload} from "../../common/vendor/LastfmApiClient.ts"; export class LFMEndpointNotifier extends IngressNotifier { diff --git a/src/backend/sources/ingressNotifiers/LZEndpointNotifier.ts b/src/backend/sources/ingressNotifiers/LZEndpointNotifier.ts index bcc946ed..86a2c2d5 100644 --- a/src/backend/sources/ingressNotifiers/LZEndpointNotifier.ts +++ b/src/backend/sources/ingressNotifiers/LZEndpointNotifier.ts @@ -1,5 +1,5 @@ -import { type Logger } from "@foxxmd/logging"; -import { type Request } from "express"; +import type {Logger} from "@foxxmd/logging"; +import type {Request} from "express"; import { parseIdentifiersFromRequest } from "../EndpointListenbrainzSource.ts"; import { IngressNotifier } from "./IngressNotifier.ts"; diff --git a/src/backend/sources/ingressNotifiers/WebhookNotifier.ts b/src/backend/sources/ingressNotifiers/WebhookNotifier.ts index f50b5203..cf460a3f 100644 --- a/src/backend/sources/ingressNotifiers/WebhookNotifier.ts +++ b/src/backend/sources/ingressNotifiers/WebhookNotifier.ts @@ -1,5 +1,5 @@ -import { type Logger } from "@foxxmd/logging"; -import { type Request } from "express"; +import type {Logger} from "@foxxmd/logging"; +import type {Request} from "express"; import path from "path"; import { IngressNotifier } from "./IngressNotifier.ts"; diff --git a/src/backend/tasks/retentionCleanup.ts b/src/backend/tasks/retentionCleanup.ts index a698c58d..723b43c6 100644 --- a/src/backend/tasks/retentionCleanup.ts +++ b/src/backend/tasks/retentionCleanup.ts @@ -1,7 +1,7 @@ import { childLogger, type Logger } from '@foxxmd/logging'; import { AsyncTask } from "toad-scheduler"; -import ScrobbleSources from "../sources/ScrobbleSources.ts"; -import ScrobbleClients from '../scrobblers/ScrobbleClients.ts'; +import type ScrobbleSources from "../sources/ScrobbleSources.ts"; +import type ScrobbleClients from '../scrobblers/ScrobbleClients.ts'; export const createRetentionCleanupTask = (sources: ScrobbleSources, clients: ScrobbleClients, parentLogger: Logger) => { const logger = childLogger(parentLogger, ['Schedule', 'Retention Cleanup']); diff --git a/src/backend/tests/component/transformers.test.ts b/src/backend/tests/component/transformers.test.ts index d12f6ee1..64ebe4a2 100644 --- a/src/backend/tests/component/transformers.test.ts +++ b/src/backend/tests/component/transformers.test.ts @@ -8,12 +8,12 @@ import { type ConditionalSearchAndReplaceRegExp, TRANSFORM_HOOK } from "../../.. import { isConditionalSearchAndReplace } from "../../utils/PlayTransformUtils.ts"; import { generateArtistsStr, generatePlay } from "../../../core/tests/utils/PlayTestUtils.ts"; -import { type WebhookPayload } from "../../common/infrastructure/config/health/webhooks.ts"; +import type {WebhookPayload} from "../../common/infrastructure/config/health/webhooks.ts"; import { findCauseByMessage } from "../../utils/ErrorUtils.ts"; import NativeTransformer from "../../common/transforms/NativeTransformer.ts"; import { initMemoryCache } from "../../common/Cache.ts"; import { Cacheable } from "cacheable"; -import { type TransformerCommonConfig } from "../../../core/Atomic.ts"; +import type {TransformerCommonConfig} from "../../../core/Atomic.ts"; import TransformerManager from "../../common/transforms/TransformerManager.ts"; import { transientCache } from "../utils/TransientTestUtils.ts"; import dayjs from "dayjs"; diff --git a/src/backend/tests/config/config.test.ts b/src/backend/tests/config/config.test.ts index 9ac7f2cd..16a9f720 100644 --- a/src/backend/tests/config/config.test.ts +++ b/src/backend/tests/config/config.test.ts @@ -9,8 +9,8 @@ import ScrobbleClients from '../../scrobblers/ScrobbleClients.ts'; import ScrobbleSources from '../../sources/ScrobbleSources.ts'; import EventEmitter from "events"; import {loggerTest} from '@foxxmd/logging'; -import { clientTypes } from '../../common/infrastructure/config/client/clients.ts'; -import { sourceTypes } from '../../common/infrastructure/config/source/sources.ts'; +import { clientTypes } from "../../../core/Atomic.ts"; +import { sourceTypes } from "../../../core/Atomic.ts"; import { Notifiers } from '../../notifier/Notifiers.ts'; import { difference } from '../../utils.ts'; diff --git a/src/backend/tests/database/testAppMigrations/001_testFoo.ts b/src/backend/tests/database/testAppMigrations/001_testFoo.ts index cc3fd293..41e6aedd 100644 --- a/src/backend/tests/database/testAppMigrations/001_testFoo.ts +++ b/src/backend/tests/database/testAppMigrations/001_testFoo.ts @@ -1,6 +1,6 @@ import type { SqliteDatabase, Migration } from 'sqlite-up'; import { DrizzlePlayRepository } from '../../../common/database/drizzle/repositories/PlayRepository.ts'; -import { type MigrateBaseContext } from '../../../common/database/appMigrator.ts'; +import type {MigrateBaseContext} from '../../../common/database/appMigrator.ts'; export const up: Migration['up'] = async (db: SqliteDatabase, ctx): Promise => { diff --git a/src/backend/tests/jellyfin/jellyfin.test.ts b/src/backend/tests/jellyfin/jellyfin.test.ts index 63ac32de..31010cdb 100644 --- a/src/backend/tests/jellyfin/jellyfin.test.ts +++ b/src/backend/tests/jellyfin/jellyfin.test.ts @@ -2,11 +2,11 @@ import { loggerTest } from "@foxxmd/logging"; import { expect } from 'chai'; import EventEmitter from "events"; import { describe, it } from 'mocha'; -import { type JsonPlayObject, type PlayMeta } from "../../../core/Atomic.ts"; +import type {JsonPlayObject, PlayMeta} from "../../../core/Atomic.ts"; import JellyfinApiSource from "../../sources/JellyfinApiSource.ts"; import validSession from './validSession.json' with { type: "json" }; -import { type JellyApiData } from "../../common/infrastructure/config/source/jellyfin.ts"; +import type {JellyApiData} from "../../common/infrastructure/config/source/jellyfin.ts"; import { generatePlay } from "../../../core/tests/utils/PlayTestUtils.ts"; import { faker } from "@faker-js/faker"; import type { @@ -17,7 +17,7 @@ import type { } from "@jellyfin/sdk/lib/generated-client/index.js"; // @ts-expect-error weird typings? import { getImageApi } from "@jellyfin/sdk/lib/utils/api/index.js"; -import { type PlayerStateDataMaybePlay } from "../../common/infrastructure/Atomic.ts"; +import type {PlayerStateDataMaybePlay} from "../../common/infrastructure/Atomic.ts"; const dataAsFixture = (data: any): TestFixture => { return data as TestFixture; diff --git a/src/backend/tests/listenbrainz/listenbrainz.test.ts b/src/backend/tests/listenbrainz/listenbrainz.test.ts index e74bab34..f692b3ac 100644 --- a/src/backend/tests/listenbrainz/listenbrainz.test.ts +++ b/src/backend/tests/listenbrainz/listenbrainz.test.ts @@ -3,13 +3,13 @@ import { assert, expect } from 'chai'; import dayjs from "dayjs"; import { describe, it } from 'mocha'; import { http, HttpResponse } from "msw"; -import { type PlayObject } from "../../../core/Atomic.ts"; +import type {PlayObject} from "../../../core/Atomic.ts"; import { UpstreamError } from "../../common/errors/UpstreamError.ts"; import { ListenbrainzApiClient, listenResponseToPlay, listenPayloadToPlay } from "../../common/vendor/ListenbrainzApiClient.ts"; import { playToListenPayload } from '../../common/vendor/listenbrainz/lzUtils.ts'; -import { type ListenPayload, type ListenResponse } from '../../../core/vendor/listenbrainz/interfaces.ts'; -import { type ExpectedResults } from "../utils/interfaces.ts"; +import type {ListenPayload, ListenResponse} from '../../../core/vendor/listenbrainz/interfaces.ts'; +import type {ExpectedResults} from "../utils/interfaces.ts"; import { withRequestInterception } from "../utils/networking.ts"; import artistWithProperJoiner from './correctlyMapped/artistProperHasJoinerInName.json' with { type: "json" }; // correct mappings diff --git a/src/backend/tests/musicbrainz/musicbrainz.test.ts b/src/backend/tests/musicbrainz/musicbrainz.test.ts index 6bc91e07..519d9f2c 100644 --- a/src/backend/tests/musicbrainz/musicbrainz.test.ts +++ b/src/backend/tests/musicbrainz/musicbrainz.test.ts @@ -8,7 +8,7 @@ import MusicbrainzTransformer, { DEFAULT_SEARCHTYPE_ORDER, type MusicbrainzTrans import { DEFAULT_MISSING_TYPES, type PlayObject } from "../../../core/Atomic.ts"; import { projectDir } from '../../common/index.ts'; import path from 'path'; -import { type MusicbrainzApiConfigData } from '../../common/infrastructure/Atomic.ts'; +import type {MusicbrainzApiConfigData} from '../../common/infrastructure/Atomic.ts'; import { MockNetworkError, withRequestInterception } from '../utils/networking.ts'; import { http, HttpResponse, delay } from "msw"; import { generatePlay, withBrainz } from '../../../core/tests/utils/PlayTestUtils.ts'; diff --git a/src/backend/tests/musiccast/musiccast.test.ts b/src/backend/tests/musiccast/musiccast.test.ts index 800290b4..7b28a18b 100644 --- a/src/backend/tests/musiccast/musiccast.test.ts +++ b/src/backend/tests/musiccast/musiccast.test.ts @@ -4,10 +4,10 @@ import EventEmitter from "events"; import { describe, it, after } from 'mocha'; import { http, HttpResponse } from "msw"; import { withRequestInterception } from "../utils/networking.ts"; -import { type MusicCastData } from "../../common/infrastructure/config/source/musiccast.ts"; +import type {MusicCastData} from "../../common/infrastructure/config/source/musiccast.ts"; import { MusicCastSource } from "../../sources/MusicCastSource.ts"; import netInterceptor from "@gr2m/net-interceptor"; -import { REPORTED_PLAYER_STATUSES } from "../../common/infrastructure/Atomic.ts"; +import { REPORTED_PLAYER_STATUSES } from '../../../core/Atomic.ts'; const TEST_IP = '192.168.10.101'; diff --git a/src/backend/tests/player/player.test.ts b/src/backend/tests/player/player.test.ts index 1aeb2fec..d0ea10dd 100644 --- a/src/backend/tests/player/player.test.ts +++ b/src/backend/tests/player/player.test.ts @@ -4,19 +4,19 @@ import clone from "clone"; import dayjs, { type Dayjs } from "dayjs"; import { describe, it } from 'mocha'; import { - CALCULATED_PLAYER_STATUSES, NO_DEVICE, NO_USER, type PlayerStateDataMaybePlay, - REPORTED_PLAYER_STATUSES, SINGLE_USER_PLATFORM_ID } from "../../common/infrastructure/Atomic.ts"; +import { CALCULATED_PLAYER_STATUSES } from '../../../core/Atomic.ts'; +import { REPORTED_PLAYER_STATUSES } from '../../../core/Atomic.ts'; import { GenericPlayerState } from "../../sources/PlayerState/GenericPlayerState.ts"; import { playObjDataMatch } from "../../utils.ts"; import { generatePlay } from "../../../core/tests/utils/PlayTestUtils.ts"; import { PositionalPlayerState } from "../../sources/PlayerState/PositionalPlayerState.ts"; -import { ListenProgressPositional } from "../../sources/PlayerState/ListenProgress.ts"; -import { ListenRangePositional } from "../../sources/PlayerState/ListenRange.ts"; +import type { ListenProgressPositional } from "../../sources/PlayerState/ListenProgress.ts"; +import type { ListenRangePositional } from "../../sources/PlayerState/ListenRange.ts"; const logger = loggerTest; diff --git a/src/backend/tests/plays/playParsing.test.ts b/src/backend/tests/plays/playParsing.test.ts index 71c83966..65fe86cb 100644 --- a/src/backend/tests/plays/playParsing.test.ts +++ b/src/backend/tests/plays/playParsing.test.ts @@ -5,7 +5,7 @@ import { generateArtistsStr, } from "../../../core/tests/utils/PlayTestUtils.ts" import { parseArtistCredits, parseCredits, parseTrackCredits, uniqueNormalizedStrArr } from "../../utils/StringUtils.ts"; import testData from '../utils/playTestData.json' with { type: "json" }; import { intersect } from "../../utils.ts"; -import { type ExpectedResults } from "../utils/interfaces.ts"; +import type {ExpectedResults} from "../utils/interfaces.ts"; interface PlayTestFixture { caseHints: string[] diff --git a/src/backend/tests/plex/plex.test.ts b/src/backend/tests/plex/plex.test.ts index 09ac1a1b..9b722fd4 100644 --- a/src/backend/tests/plex/plex.test.ts +++ b/src/backend/tests/plex/plex.test.ts @@ -2,14 +2,14 @@ import { loggerTest } from "@foxxmd/logging"; import { expect } from 'chai'; import EventEmitter from "events"; import { describe, it } from 'mocha'; -import { type PlayMeta } from "../../../core/Atomic.ts"; +import type {PlayMeta} from "../../../core/Atomic.ts"; import validSessionResponse from './validSession.json' with { type: "json" }; import { generatePlay } from "../../../core/tests/utils/PlayTestUtils.ts"; -import { type PlayerStateDataMaybePlay } from "../../common/infrastructure/Atomic.ts"; -import { type PlexApiData } from "../../common/infrastructure/config/source/plex.ts"; +import type {PlayerStateDataMaybePlay} from "../../common/infrastructure/Atomic.ts"; +import type {PlexApiData} from "../../common/infrastructure/config/source/plex.ts"; import PlexApiSource from "../../sources/PlexApiSource.ts"; -import { type GetSessionsMetadata } from "@lukehagar/plexjs/sdk/models/operations/getsessions.js"; +import type {GetSessionsMetadata} from "@lukehagar/plexjs/sdk/models/operations/getsessions.js"; const validSession = validSessionResponse.object.mediaContainer.metadata[0]; diff --git a/src/backend/tests/scrobbler/TestScrobbler.ts b/src/backend/tests/scrobbler/TestScrobbler.ts index bd839998..5c1d30b7 100644 --- a/src/backend/tests/scrobbler/TestScrobbler.ts +++ b/src/backend/tests/scrobbler/TestScrobbler.ts @@ -1,14 +1,15 @@ import EventEmitter from "events"; import request from "superagent"; -import { type PlayObject } from "../../../core/Atomic.ts"; +import type {PlayObject} from "../../../core/Atomic.ts"; import AbstractScrobbleClient from "../../scrobblers/AbstractScrobbleClient.ts"; -import { type CommonClientConfig, type CommonClientOptions, type NowPlayingOptions } from "../../common/infrastructure/config/client/index.ts"; +import type {CommonClientConfig, CommonClientOptions, NowPlayingOptions} from "../../common/infrastructure/config/client/index.ts"; import clone from "clone"; -import { type TimeRangeListensFetcher } from "../../common/infrastructure/Atomic.ts"; +import type {TimeRangeListensFetcher} from "../../common/infrastructure/Atomic.ts"; import { loggerNoop } from "../../common/MaybeLogger.ts"; -import { DrizzlePlayRepository, type RepositoryCreatePlayOpts } from "../../common/database/drizzle/repositories/PlayRepository.ts"; -import { DrizzleQueueRepository } from "../../common/database/drizzle/repositories/QueueRepository.ts"; -import { type PlaySelect } from "../../common/database/drizzle/drizzleTypes.ts"; +import type { DrizzlePlayRepository} from "../../common/database/drizzle/repositories/PlayRepository.ts"; +import type {RepositoryCreatePlayOpts} from "../../common/database/drizzle/repositories/PlayRepository.ts"; +import type { DrizzleQueueRepository } from "../../common/database/drizzle/repositories/QueueRepository.ts"; +import type {PlaySelect} from "../../common/database/drizzle/drizzleTypes.ts"; import dayjs from "dayjs"; export class TestScrobbler extends AbstractScrobbleClient { diff --git a/src/backend/tests/scrobbler/scrobblers.test.ts b/src/backend/tests/scrobbler/scrobblers.test.ts index edab6767..8d952ad5 100644 --- a/src/backend/tests/scrobbler/scrobblers.test.ts +++ b/src/backend/tests/scrobbler/scrobblers.test.ts @@ -17,14 +17,14 @@ import MockDate from 'mockdate'; import { NowPlayingScrobbler, TestAuthScrobbler, TestScrobbler } from "./TestScrobbler.ts"; import { type PaginatedTimeRangeOptions, REFRESH_STALE_DEFAULT } from '../../common/infrastructure/Atomic.ts'; -import { type PlayPlatformId } from '../../../core/Atomic.ts'; +import type {PlayPlatformId} from '../../../core/Atomic.ts'; import { shuffleArray } from '../../utils/DataUtils.ts'; import { DEFAULT_CONSOLIDATE_DURATION, groupPlaysToTimeRanges } from '../../utils/ListenFetchUtils.ts'; import { asPlay } from '../../../core/PlayMarshalUtils.ts'; import { getRoot } from '../../ioc.ts'; import { transientCache } from '../utils/TransientTestUtils.ts'; import { generateArray } from '../../../core/DataUtils.ts'; -import { type RepositoryCreatePlayOpts } from '../../common/database/drizzle/repositories/PlayRepository.ts'; +import type {RepositoryCreatePlayOpts} from '../../common/database/drizzle/repositories/PlayRepository.ts'; import { fixtureCreatePlay } from '../utils/databaseFixtures.ts'; import { isAbortError } from 'abort-controller-x'; import { artistNamesToCredits } from '../../../core/StringUtils.ts'; diff --git a/src/backend/tests/sonos/sonos.test.ts b/src/backend/tests/sonos/sonos.test.ts index 53da8560..879f99dc 100644 --- a/src/backend/tests/sonos/sonos.test.ts +++ b/src/backend/tests/sonos/sonos.test.ts @@ -1,7 +1,7 @@ import { loggerDebug } from "@foxxmd/logging"; import EventEmitter from "events"; import { describe, it } from 'mocha'; -import { type SonosData } from "../../common/infrastructure/config/source/sonos.ts"; +import type {SonosData} from "../../common/infrastructure/config/source/sonos.ts"; import { SonosSource } from "../../sources/SonosSource.ts"; import * as dotenv from 'dotenv'; import path from 'path'; diff --git a/src/backend/tests/source/TestSource.ts b/src/backend/tests/source/TestSource.ts index d197bad5..a7ed1082 100644 --- a/src/backend/tests/source/TestSource.ts +++ b/src/backend/tests/source/TestSource.ts @@ -1,4 +1,4 @@ -import { type PlayObject } from "../../../core/Atomic.ts"; +import type {PlayObject} from "../../../core/Atomic.ts"; import AbstractSource from "../../sources/AbstractSource.ts"; import { MemoryPositionalSource } from "../../sources/MemoryPositionalSource.ts"; import MemorySource from "../../sources/MemorySource.ts"; diff --git a/src/backend/tests/source/source.test.ts b/src/backend/tests/source/source.test.ts index 2858c210..0f7fc818 100644 --- a/src/backend/tests/source/source.test.ts +++ b/src/backend/tests/source/source.test.ts @@ -5,20 +5,20 @@ import EventEmitter from "events"; import { describe, it } from 'mocha'; import pEvent from "p-event"; import clone from 'clone'; -import { type PlayObject } from "../../../core/Atomic.ts"; +import type {PlayObject} from "../../../core/Atomic.ts"; import { generatePlay, generatePlayerStateData, generatePlays, normalizePlays } from "../../../core/tests/utils/PlayTestUtils.ts"; import { TestMemoryPositionalSource, TestMemorySource, TestSource } from "./TestSource.ts"; import spotifyPayload from '../plays/spotifyCurrentPlaybackState.json' with { type: "json" }; import SpotifySource from "../../sources/SpotifySource.ts"; import MockDate from 'mockdate'; import dayjs from "dayjs"; -import { REPORTED_PLAYER_STATUSES } from "../../common/infrastructure/Atomic.ts"; -import { type SourceConfig } from "../../common/infrastructure/config/source/sources.ts"; -import MemorySource from "../../sources/MemorySource.ts"; +import { REPORTED_PLAYER_STATUSES } from '../../../core/Atomic.ts'; +import type {SourceConfig} from "../../common/infrastructure/config/source/sources.ts"; +import type MemorySource from "../../sources/MemorySource.ts"; import { RT_TICK_DEFAULT, setRtTick } from "../../sources/PlayerState/RealtimePlayer.ts"; import { sleep } from "../../utils.ts"; import DeezerInternalSource from "../../sources/DeezerInternalSource.ts"; -import { type DeezerInternalSourceOptions } from "../../common/infrastructure/config/source/deezer.ts"; +import type {DeezerInternalSourceOptions} from "../../common/infrastructure/config/source/deezer.ts"; import { artistCreditsToNames } from "../../../core/StringUtils.ts"; chai.use(asPromised); diff --git a/src/backend/tests/utils/databaseFixtures.ts b/src/backend/tests/utils/databaseFixtures.ts index cbf59442..02a3ef8e 100644 --- a/src/backend/tests/utils/databaseFixtures.ts +++ b/src/backend/tests/utils/databaseFixtures.ts @@ -1,9 +1,9 @@ import { generatePlay } from "../../../core/tests/utils/PlayTestUtils.ts"; import { generateRandomObj } from "../../../core/tests/utils/fixtures.ts"; import { generateComponentEntity, generateInputEntity, generatePlayEntity } from "../../common/database/drizzle/entityUtils.ts"; -import { type PlayNew } from "../../common/database/drizzle/drizzleTypes.ts"; -import { type PlayInputNew } from "../../common/database/drizzle/drizzleTypes.ts"; -import { type ComponentNew } from "../../common/database/drizzle/drizzleTypes.ts"; +import type {PlayNew} from "../../common/database/drizzle/drizzleTypes.ts"; +import type {PlayInputNew} from "../../common/database/drizzle/drizzleTypes.ts"; +import type {ComponentNew} from "../../common/database/drizzle/drizzleTypes.ts"; export const fixtureCreateComponent = (data: Partial = {}): ComponentNew => { return generateComponentEntity( diff --git a/src/backend/tests/utils/networking.ts b/src/backend/tests/utils/networking.ts index be7bd713..bc2036ac 100644 --- a/src/backend/tests/utils/networking.ts +++ b/src/backend/tests/utils/networking.ts @@ -1,5 +1,5 @@ import { setupServer, type SetupServer } from 'msw/node'; -import { type NodeNetworkErrorCode, type NodeNetworkException } from "../../common/errors/NodeErrors.ts"; +import type {NodeNetworkErrorCode, NodeNetworkException} from "../../common/errors/NodeErrors.ts"; export class MockNetworkError extends Error implements NodeNetworkException { diff --git a/src/backend/tests/utils/playComparisons.test.ts b/src/backend/tests/utils/playComparisons.test.ts index 07d6c2ad..a8d5f245 100644 --- a/src/backend/tests/utils/playComparisons.test.ts +++ b/src/backend/tests/utils/playComparisons.test.ts @@ -3,7 +3,7 @@ import clone from "clone"; import { describe, it } from 'mocha'; import { genericSourcePlayMatch, playsAreAddedOnly, playsAreBumpedOnly, playsAreSortConsistent } from "../../utils/PlayComparisonUtils.ts"; import { generatePlay, generatePlays } from "../../../core/tests/utils/PlayTestUtils.ts"; -import { type PlayObject } from "../../../core/Atomic.ts"; +import type {PlayObject} from "../../../core/Atomic.ts"; const newPlay = generatePlay(); diff --git a/src/backend/tests/ytm/ytm.test.ts b/src/backend/tests/ytm/ytm.test.ts index 7367ab85..65bbd226 100644 --- a/src/backend/tests/ytm/ytm.test.ts +++ b/src/backend/tests/ytm/ytm.test.ts @@ -7,10 +7,10 @@ import YTMusicSource, { ytiHistoryResponseFromShelfToPlays, ytiHistoryResponseTo import ytHistoryRes from './ytres.json' with {type: 'json'}; import EventEmitter from "events"; import { generatePlay, generatePlays } from '../../../core/tests/utils/PlayTestUtils.ts'; -import { type YTMusicSourceConfig } from '../../common/infrastructure/config/source/ytmusic.ts'; +import type {YTMusicSourceConfig} from '../../common/infrastructure/config/source/ytmusic.ts'; import { sleep } from '../../utils.ts'; import dayjs from 'dayjs'; -import { type ApiResponse } from 'youtubei.js'; +import type {ApiResponse} from 'youtubei.js'; chai.use(asPromised); diff --git a/src/backend/utils.ts b/src/backend/utils.ts index 6dc955f7..84aa1d5d 100644 --- a/src/backend/utils.ts +++ b/src/backend/utils.ts @@ -1,9 +1,9 @@ import backoffStrategies from '@kenyip/backoff-strategies'; import { replaceResultTransformer, stripIndentTransformer, TemplateTag, trimResultTransformer } from 'common-tags'; import dayjs, { type Dayjs } from "dayjs"; -import { type Duration } from "dayjs/plugin/duration.js"; +import type {Duration} from "dayjs/plugin/duration.js"; import utc from 'dayjs/plugin/utc.js'; -import { type Request } from "express"; +import type {Request} from "express"; // https://github.com/jfromaniello/url-join#in-nodejs import { TimeoutError, WebapiError } from "spotify-web-api-node/src/response-error.js"; import { DEFAULT_MISSING_MBIDS_TYPES, type MissingMbidType, type PlayObject } from "../core/Atomic.ts"; @@ -16,7 +16,7 @@ import { type RemoteIdentityParts, type ScrobbleThresholdResult, } from "./common/infrastructure/Atomic.ts"; -import { type PlayPlatformId } from '../core/Atomic.ts'; +import type {PlayPlatformId} from '../core/Atomic.ts'; import { genGroupIdStr } from '../core/PlayUtils.ts'; import { durationToNormalizedTime } from '../core/TimeUtils.ts'; diff --git a/src/backend/utils/AsyncUtils.ts b/src/backend/utils/AsyncUtils.ts index 1819f3ea..ac22c511 100644 --- a/src/backend/utils/AsyncUtils.ts +++ b/src/backend/utils/AsyncUtils.ts @@ -1,4 +1,4 @@ -import { type Mapper } from "p-map"; +import type {Mapper} from "p-map"; import { sleep } from "../utils.ts"; /** https://stackoverflow.com/a/63795192/1469797 */ diff --git a/src/backend/utils/DataUtils.ts b/src/backend/utils/DataUtils.ts index c67d0f1e..57f0e611 100644 --- a/src/backend/utils/DataUtils.ts +++ b/src/backend/utils/DataUtils.ts @@ -2,7 +2,7 @@ import JSON5 from "json5"; import { constants, promises } from "fs"; import { MaybeLogger } from '../common/MaybeLogger.ts'; import { deepEqual } from 'fast-equals'; -import { type CommonConfigPrimitives } from "../common/infrastructure/config/common.ts"; +import type {CommonConfigPrimitives} from "../common/infrastructure/config/common.ts"; import { parseBoolStrict } from "../utils.ts"; import { removeUndefinedKeys } from '../../core/DataUtils.ts'; import { nonEmptyStringOrDefault } from "../../core/StringUtils.ts"; diff --git a/src/backend/utils/ListenFetchUtils.ts b/src/backend/utils/ListenFetchUtils.ts index 422d26ea..00a89266 100644 --- a/src/backend/utils/ListenFetchUtils.ts +++ b/src/backend/utils/ListenFetchUtils.ts @@ -1,10 +1,10 @@ import { childLogger, type Logger } from "@foxxmd/logging"; import dayjs, { type Dayjs } from "dayjs"; -import { type Duration } from "dayjs/plugin/duration.js"; -import { type PlayObject } from "../../core/Atomic.ts"; +import type {Duration} from "dayjs/plugin/duration.js"; +import type {PlayObject} from "../../core/Atomic.ts"; import { type CursorType, hasPagelessTimeRangeListens, hasPaginatedTimeRangeListens, type PagelessTimeRangeListensResult, type PaginatedListensTimeRangeOptions, type PaginatedTimeRangeCommonOptions, type PaginatedTimeRangeListensResult, type PaginatedTimeRangeOptions, type PaginatedTimeRangeSource, REFRESH_STALE_DEFAULT, type TimeRangeListensFetcher } from "../common/infrastructure/Atomic.ts"; import { loggerNoop } from '../common/MaybeLogger.ts'; -import { MaybeLogger } from '../common/MaybeLogger.ts'; +import type { MaybeLogger } from '../common/MaybeLogger.ts'; import { sortByOldestPlayDate } from "../utils.ts"; import { sortByNewestPlayDate } from '../../core/PlayUtils.ts'; import { todayAwareFormat } from "../../core/TimeUtils.ts"; diff --git a/src/backend/utils/MDNSUtils.ts b/src/backend/utils/MDNSUtils.ts index 444cf3ce..3612cf5a 100644 --- a/src/backend/utils/MDNSUtils.ts +++ b/src/backend/utils/MDNSUtils.ts @@ -1,7 +1,7 @@ import { Browser, type Service, ServiceType } from "@astronautlabs/mdns"; -import { type Logger } from "@foxxmd/logging"; +import type {Logger} from "@foxxmd/logging"; import AvahiBrowser from 'avahi-browse'; -import { type MdnsDeviceInfo } from "../common/infrastructure/Atomic.ts"; +import type {MdnsDeviceInfo} from "../common/infrastructure/Atomic.ts"; import { MaybeLogger } from '../common/MaybeLogger.ts'; import { sleep } from "../utils.ts"; import { debounce, type DebouncedFunction } from "./debounce.ts"; diff --git a/src/backend/utils/NetworkUtils.ts b/src/backend/utils/NetworkUtils.ts index a752f0b9..d02854c0 100644 --- a/src/backend/utils/NetworkUtils.ts +++ b/src/backend/utils/NetworkUtils.ts @@ -1,12 +1,12 @@ -import { type Logger } from "@foxxmd/logging"; +import type {Logger} from "@foxxmd/logging"; import { parseRegexSingle } from "@foxxmd/regex-buddy-core"; import address from "address"; import net from 'node:net'; import normalizeUrl from "normalize-url"; import { join as joinPath } from "path"; import { isDebugMode} from "../utils.ts"; -import { type URLData } from "../../core/Atomic.ts"; -import { CloseEvent, ErrorEvent, RetryEvent } from 'iso-websocket' +import type {URLData} from "../../core/Atomic.ts"; +import type { CloseEvent, ErrorEvent, RetryEvent } from 'iso-websocket' import { WEBSOCKET_CLOSE_CODE_REASONS } from "../common/infrastructure/Atomic.ts"; import { loggerNoop } from "../common/MaybeLogger.ts"; import { formatBytes } from "./DataUtils.ts"; diff --git a/src/backend/utils/PlayComparisonUtils.ts b/src/backend/utils/PlayComparisonUtils.ts index 966e9c3d..8473e647 100644 --- a/src/backend/utils/PlayComparisonUtils.ts +++ b/src/backend/utils/PlayComparisonUtils.ts @@ -5,10 +5,10 @@ import { comparingMultipleArtists, playObjDataMatch, setIntersection } from "../ import { comparePlayTemporally, hasAcceptableTemporalAccuracy, temporalAccuracyToString, type TemporalPlayComparisonOptions, temporalPlayComparisonSummary } from "./TimeUtils.ts"; import { compareNormalizedStrings, compareScrobbleArtists, compareScrobbleTracks, compareTracks, normalizeStr, type TrackSamenessResults } from "./StringUtils.ts"; import { ARTIST_WEIGHT, DUP_SCORE_THRESHOLD, type ScrobbledPlayObject, TIME_WEIGHT, TITLE_WEIGHT } from "../common/infrastructure/Atomic.ts"; -import { type StringSamenessResult } from "@foxxmd/string-sameness"; -import { type Duration } from "dayjs/plugin/duration.js"; +import type {StringSamenessResult} from "@foxxmd/string-sameness"; +import type {Duration} from "dayjs/plugin/duration.js"; import { type PlayTransformRules, TRANSFORM_HOOK, type TransformHook } from "../../core/Transform.ts"; -import { type Logger } from "@foxxmd/logging"; +import type { Logger } from "@foxxmd/logging"; import { loggerNoop } from '../common/MaybeLogger.ts'; import { statefulInvariantTransform } from "../../core/PlayUtils.ts"; import { findAsyncSequential } from "./AsyncUtils.ts"; diff --git a/src/backend/utils/PlayTransformUtils.ts b/src/backend/utils/PlayTransformUtils.ts index 7cc69eab..2b332675 100644 --- a/src/backend/utils/PlayTransformUtils.ts +++ b/src/backend/utils/PlayTransformUtils.ts @@ -1,6 +1,7 @@ -import { type Logger } from "@foxxmd/logging"; -import { searchAndReplace as searchAndReplaceFunc, testMaybeRegex as testMaybeRegexFunc } from "@foxxmd/regex-buddy-core"; -import { type PlayObject, type PlayObjectMinimal } from "../../core/Atomic.ts"; +import type {Logger} from "@foxxmd/logging"; +import type { searchAndReplace as searchAndReplaceFunc} from "@foxxmd/regex-buddy-core"; +import { testMaybeRegex as testMaybeRegexFunc } from "@foxxmd/regex-buddy-core"; +import type {PlayObject, PlayObjectMinimal} from "../../core/Atomic.ts"; import { type ConditionalSearchAndReplaceRegExp, diff --git a/src/backend/utils/RequestUtils.ts b/src/backend/utils/RequestUtils.ts index ecd41f58..319a1c97 100644 --- a/src/backend/utils/RequestUtils.ts +++ b/src/backend/utils/RequestUtils.ts @@ -1,9 +1,10 @@ -import { type Files, File } from "formidable"; -import type { VolatileFile } from "formidable"; +import type {Files} from "formidable"; +import type { VolatileFile , File } from "formidable"; import { KNOWN_MEDIA_PROVIDER_URLS } from "../../core/Atomic.ts"; -import { type RequestRetryOptions } from "../common/infrastructure/config/common.ts"; -import { type Logger } from "@foxxmd/logging"; -import request, { Response } from 'superagent'; +import type {RequestRetryOptions} from "../common/infrastructure/config/common.ts"; +import type {Logger} from "@foxxmd/logging"; +import type { Response } from 'superagent'; +import type request from 'superagent'; import pRetry, { type RetryContext, type Options } from 'p-retry'; import { DEFAULT_RETRY_MULTIPLIER } from "../common/infrastructure/Atomic.ts"; import { SimpleError } from "../common/errors/MSErrors.ts"; diff --git a/src/backend/utils/SchemaUtils.ts b/src/backend/utils/SchemaUtils.ts index 3d7a515a..54f03582 100644 --- a/src/backend/utils/SchemaUtils.ts +++ b/src/backend/utils/SchemaUtils.ts @@ -1,5 +1,6 @@ import { resolve } from "path"; import { projectDir } from "../common/index.ts"; +import type { LiteralType} from "ts-json-schema-generator"; import { type Definition as TSJDefinition, createFormatter, @@ -7,7 +8,7 @@ import { DEFAULT_CONFIG, createProgram, createParser, - SchemaGenerator, LiteralType, LiteralTypeFormatter + SchemaGenerator, LiteralTypeFormatter } from "ts-json-schema-generator"; import { MaybeLogger } from '../common/MaybeLogger.ts'; diff --git a/src/backend/utils/StringUtils.ts b/src/backend/utils/StringUtils.ts index 690ea699..c04acdac 100644 --- a/src/backend/utils/StringUtils.ts +++ b/src/backend/utils/StringUtils.ts @@ -1,6 +1,6 @@ import { strategies, stringSameness, type StringSamenessResult } from "@foxxmd/string-sameness"; import { hasher } from 'node-object-hash'; -import { type PlayObject } from "../../core/Atomic.ts"; +import type {PlayObject} from "../../core/Atomic.ts"; import { asPlayerStateData, type PlayerStateDataMaybePlay } from "../common/infrastructure/Atomic.ts"; import { DELIMITERS_NO_AMP } from '../../core/Atomic.ts'; import { DELIMITERS } from '../../core/Atomic.ts'; diff --git a/src/backend/utils/TimeUtils.ts b/src/backend/utils/TimeUtils.ts index 36bcce0b..135df4c3 100644 --- a/src/backend/utils/TimeUtils.ts +++ b/src/backend/utils/TimeUtils.ts @@ -29,13 +29,13 @@ import { lowGranularitySources, type ScrobbleThresholdResult, } from "../common/infrastructure/Atomic.ts"; -import { type ScrobbleThresholds } from "../common/infrastructure/config/source/index.ts"; +import type {ScrobbleThresholds} from "../common/infrastructure/config/source/index.ts"; import { formatNumber } from '../../core/DataUtils.ts'; import { InvalidRegexError, SimpleError } from "../common/errors/MSErrors.ts"; import { type NamedGroup, parseRegex } from "@foxxmd/regex-buddy-core"; -import { type Duration } from "dayjs/plugin/duration.js"; -import { type SourceType } from "../common/infrastructure/config/source/sources.ts"; -import { type Logger } from "@foxxmd/logging"; +import type {Duration} from "dayjs/plugin/duration.js"; +import type {SourceType} from "../../core/Atomic.ts"; +import type {Logger} from "@foxxmd/logging"; import { loggerNoop } from "../common/MaybeLogger.ts"; //dayjs.extend(isToday); diff --git a/src/backend/utils/ValidationUtils.ts b/src/backend/utils/ValidationUtils.ts index 8fa64b49..5697ed53 100644 --- a/src/backend/utils/ValidationUtils.ts +++ b/src/backend/utils/ValidationUtils.ts @@ -1,5 +1,5 @@ -import { type Logger } from "@foxxmd/logging"; -import * as AjvNS from "ajv"; +import type {Logger} from "@foxxmd/logging"; +import type * as AjvNS from "ajv"; import Ajv from "ajv"; import f from "ajv-formats" import { resolve } from "path"; diff --git a/src/client/AppNext.tsx b/src/client/AppNext.tsx index c7e2f1fe..30b0fabc 100644 --- a/src/client/AppNext.tsx +++ b/src/client/AppNext.tsx @@ -7,7 +7,7 @@ import { type RouteObject, RouterProvider, useLocation } from "react-router-dom"; -import { type MsSseEvent } from '../core/Api'; +import type {MsSseEvent} from '../core/Api'; import './App.css'; import { AppHeader } from './components/AppHeader'; import CopyToClipboard from "./components/CopyToClipboard"; diff --git a/src/client/components/ActivityTimeline.tsx b/src/client/components/ActivityTimeline.tsx index 0536871b..6b32a109 100644 --- a/src/client/components/ActivityTimeline.tsx +++ b/src/client/components/ActivityTimeline.tsx @@ -1,11 +1,13 @@ -import { Card, Collapsible, Icon, SkeletonCircle, SkeletonText, Span, Tabs, Timeline, type HTMLChakraProps } from '@chakra-ui/react'; -import dayjs, { Dayjs } from "dayjs"; +import type { Collapsible} from '@chakra-ui/react'; +import { Card, Icon, SkeletonCircle, SkeletonText, Span, Tabs, Timeline, type HTMLChakraProps } from '@chakra-ui/react'; +import type { Dayjs } from "dayjs"; +import dayjs from "dayjs"; import React from "react"; import { BiWrench } from "react-icons/bi"; import { HiMiniMagnifyingGlass } from "react-icons/hi2"; import { IoMdCodeDownload } from "react-icons/io"; import { TbDatabaseEdit } from "react-icons/tb"; -import { type PlayApiCommonDetailed, type QueueStateApi } from "../../core/Api"; +import type {PlayApiCommonDetailed, QueueStateApi} from "../../core/Api"; import { CLIENT_DEAD_QUEUE, CLIENT_INGRESS_QUEUE, QUEUE_STATUS_COMPLETED, QUEUE_STATUS_FAILED, QUEUE_STATUS_QUEUED, type ComponentType, type JsonPlayObject, type LifecycleStep, type PlayMatchResult, type ScrobbleResult } from "../../core/Atomic"; import { sortByNewestDate } from "../../core/PlayUtils"; import { capitalizeWords } from "../../core/StringUtils"; diff --git a/src/client/components/AppHeader.tsx b/src/client/components/AppHeader.tsx index 1f9c0ede..294f20d9 100644 --- a/src/client/components/AppHeader.tsx +++ b/src/client/components/AppHeader.tsx @@ -11,7 +11,7 @@ import { TextMuted } from "./TextMuted"; import { TerminalButton, TerminalIcon, XButton } from "./icons/ChakraIcons"; import { useSSEContext, useSSEStatus } from "@flamefrontend/sse-runtime-react"; -import { type ErrorLike } from "../../core/Atomic"; +import type {ErrorLike} from "../../core/Atomic"; import { ErrorAlert } from "./ErrorAlert"; import { MSErrorBoundary } from "./ErrorBoundary"; import { ExternaLinksMenu } from "./ExternaLinksMenu"; diff --git a/src/client/components/ArtistCreditDisplay.tsx b/src/client/components/ArtistCreditDisplay.tsx index 403fdf73..77fe1800 100644 --- a/src/client/components/ArtistCreditDisplay.tsx +++ b/src/client/components/ArtistCreditDisplay.tsx @@ -1,5 +1,5 @@ import { Fragment } from 'react'; -import { type ArtistCredit as AC } from '../../core/Atomic'; +import type {ArtistCredit as AC} from '../../core/Atomic'; import { HStack, Tag } from "@chakra-ui/react"; import { SiMusicbrainz } from "react-icons/si"; diff --git a/src/client/components/Badges.tsx b/src/client/components/Badges.tsx index 161dc7e9..9ee661ba 100644 --- a/src/client/components/Badges.tsx +++ b/src/client/components/Badges.tsx @@ -3,7 +3,7 @@ import { useSSEContext, useSSEEvent } from "@flamefrontend/sse-runtime-react"; import React, { type ComponentProps, type PropsWithChildren, useCallback, useEffect, useState } from "react"; import { useTimeout } from 'react-use-timeout'; import { COMPONENT_STATE, type ComponentCommonApiJson, componentStateToFriendly, type MsSseEvent, type PlayApiCommon } from "../../core/Api"; -import { type Second } from "../../core/Atomic"; +import type {Second} from "../../core/Atomic"; import { capitalizeWords } from "../../core/StringUtils"; export const PlayStateBadge = (props: PropsWithChildren> & { state: PlayApiCommon['state'], suffix?: React.JSX.Element, hasDeadQueue?: boolean }) => { diff --git a/src/client/components/DateDisplay.tsx b/src/client/components/DateDisplay.tsx index 4b28f601..19714fe8 100644 --- a/src/client/components/DateDisplay.tsx +++ b/src/client/components/DateDisplay.tsx @@ -1,7 +1,8 @@ import { Text } from "@chakra-ui/react" -import dayjs, {Dayjs} from 'dayjs'; +import type {Dayjs} from 'dayjs'; +import dayjs from 'dayjs'; import { shortTodayAwareFormat } from "../../core/TimeUtils"; -import { type ComponentProps } from "react" +import type {ComponentProps} from "react"; export type DateDisplayProps = { date?: string | Dayjs diff --git a/src/client/components/ExpandCollapse.tsx b/src/client/components/ExpandCollapse.tsx index a5787f8f..c51e9866 100644 --- a/src/client/components/ExpandCollapse.tsx +++ b/src/client/components/ExpandCollapse.tsx @@ -1,5 +1,5 @@ import { HStack, IconButton } from "@chakra-ui/react"; -import { type ComponentProps } from "react"; +import type {ComponentProps} from "react"; import { FaRegSquareMinus, FaRegSquarePlus } from "react-icons/fa6"; export interface ExpandCollapseProps { diff --git a/src/client/components/ExternaLinksMenu.tsx b/src/client/components/ExternaLinksMenu.tsx index 74d0af53..da1335e8 100644 --- a/src/client/components/ExternaLinksMenu.tsx +++ b/src/client/components/ExternaLinksMenu.tsx @@ -1,5 +1,5 @@ import { Box, Button, Menu, Portal } from "@chakra-ui/react" -import { type ComponentProps } from "react" +import type {ComponentProps} from "react"; import { ExternalLinkIcon } from "./icons/ChakraIcons" import { EXTERNAL_LINKS } from "./SideNav" diff --git a/src/client/components/ExternalLink.tsx b/src/client/components/ExternalLink.tsx index 4d04b1f6..c09fe4b3 100644 --- a/src/client/components/ExternalLink.tsx +++ b/src/client/components/ExternalLink.tsx @@ -1,4 +1,4 @@ -import {type PropsWithChildren} from "react"; +import type {PropsWithChildren} from "react"; import clsx from "clsx"; export interface TooltipProps { diff --git a/src/client/components/LogsNext.tsx b/src/client/components/LogsNext.tsx index 0a04c8a0..1d03f33b 100644 --- a/src/client/components/LogsNext.tsx +++ b/src/client/components/LogsNext.tsx @@ -5,7 +5,7 @@ import * as AnsiImport from "ansi-to-react"; import { FixedSizeList } from "fixed-size-list"; import ky from 'ky'; import React, { useCallback, useEffect, useRef, useState } from 'react'; -import { type LogLevelStandalone, type LogOutputConfig } from '../../core/Atomic'; +import type {LogLevelStandalone, LogOutputConfig} from '../../core/Atomic'; import { tanQueries } from '../queries'; import { ChakraClipDynamic } from './ChakraClipboard'; diff --git a/src/client/components/PlayData.tsx b/src/client/components/PlayData.tsx index b1d8debf..77999cdf 100644 --- a/src/client/components/PlayData.tsx +++ b/src/client/components/PlayData.tsx @@ -1,7 +1,7 @@ import React, { useState } from 'react'; import { EmptyState, DataList, HStack, Tabs, Box, Flex, Stack, Text, Separator, IconButton, Container, Float, Icon, Link, Span, Show } from "@chakra-ui/react" import { LuCode, LuText, LuCheck, LuX } from "react-icons/lu" -import { type JsonPlayObject, type PlayObjectMinimal } from '../../core/Atomic.js'; +import type {JsonPlayObject, PlayObjectMinimal} from '../../core/Atomic.js'; import { shortTodayAwareFormat, timeToHumanTimestamp } from '../../core/TimeUtils.js'; import dayjs from 'dayjs'; import { ChakraCodeBlock } from './CodeBlock.js'; diff --git a/src/client/components/PlayDisplay.tsx b/src/client/components/PlayDisplay.tsx index 2a1dac64..b1ed40da 100644 --- a/src/client/components/PlayDisplay.tsx +++ b/src/client/components/PlayDisplay.tsx @@ -1,6 +1,6 @@ import { Fragment, type ReactElement } from 'react'; -import { type JsonPlayObject, type TrackStringOptions } from "../../core/Atomic"; +import type {JsonPlayObject, TrackStringOptions} from "../../core/Atomic"; import { buildTrackString } from "../../core/StringUtils"; import { buildTrackStringReactOptions } from "../utils/index"; diff --git a/src/client/components/ScrobbleActionResult.tsx b/src/client/components/ScrobbleActionResult.tsx index 2db9f830..09f1be41 100644 --- a/src/client/components/ScrobbleActionResult.tsx +++ b/src/client/components/ScrobbleActionResult.tsx @@ -6,7 +6,7 @@ import { ChakraCodeBlockShort } from "./CodeBlock"; import { capitalize } from "../../core/StringUtils"; import { MSCollapsible, type MSCollapsibleExternalProps } from "./MSCollapsible"; import { TimelineErrorIcon } from "./timeline/TimelineIcon"; -import { type ScrobbleResult } from "../../core/Atomic"; +import type {ScrobbleResult} from "../../core/Atomic"; export interface ScrobbleActionResultProps extends MSCollapsibleExternalProps { result: ScrobbleResult, diff --git a/src/client/components/ScrobbleMatchResult.tsx b/src/client/components/ScrobbleMatchResult.tsx index 0b54315d..f53e0566 100644 --- a/src/client/components/ScrobbleMatchResult.tsx +++ b/src/client/components/ScrobbleMatchResult.tsx @@ -1,5 +1,5 @@ import { Icon, Tabs, DataList, List } from '@chakra-ui/react'; -import { type PlayMatchResult } from "../../core/Atomic"; +import type {PlayMatchResult} from "../../core/Atomic"; import { PlayData } from "./PlayData"; import { LuCheck, LuX } from "react-icons/lu"; import { formatNumber } from "../../core/DataUtils"; diff --git a/src/client/components/TextMuted.tsx b/src/client/components/TextMuted.tsx index bf917cb4..b78736b6 100644 --- a/src/client/components/TextMuted.tsx +++ b/src/client/components/TextMuted.tsx @@ -1,5 +1,6 @@ -import { Text as ChakraText, Span } from "@chakra-ui/react" -import { type ComponentProps } from "react" +import type { Text as ChakraText} from "@chakra-ui/react"; +import { Span } from "@chakra-ui/react" +import type {ComponentProps} from "react"; export const TextMuted = (props: ComponentProps) => { const { diff --git a/src/client/components/Tooltip.tsx b/src/client/components/Tooltip.tsx index 75f9a495..5cc5c49f 100644 --- a/src/client/components/Tooltip.tsx +++ b/src/client/components/Tooltip.tsx @@ -1,4 +1,4 @@ -import {type PropsWithChildren, type ReactElement} from "react"; +import type {PropsWithChildren, ReactElement} from "react"; import clsx from "clsx"; export interface TooltipProps { diff --git a/src/client/components/TransformSteps.tsx b/src/client/components/TransformSteps.tsx index 6c3ccf75..3c6c010f 100644 --- a/src/client/components/TransformSteps.tsx +++ b/src/client/components/TransformSteps.tsx @@ -2,7 +2,7 @@ import { Heading, Icon, Span, Stack, Text, Timeline } from '@chakra-ui/react'; import React, { Fragment, useMemo } from "react"; import { BsExclamationTriangle, BsSkipForward, BsStoplights } from "react-icons/bs"; import { MdMusicNote } from "react-icons/md"; -import { type JsonPlayObject, type LifecycleStep } from "../../core/Atomic"; +import type {JsonPlayObject, LifecycleStep} from "../../core/Atomic"; import { patchObject } from "../../core/DataUtils"; import { timelineTextFormatting } from "../utils/ComponentUtils"; import { ChakraCodeBlockShort } from "./CodeBlock"; diff --git a/src/client/components/Typography.tsx b/src/client/components/Typography.tsx index 2bd8b934..3e2df459 100644 --- a/src/client/components/Typography.tsx +++ b/src/client/components/Typography.tsx @@ -1,4 +1,4 @@ import { Span } from '@chakra-ui/react'; -import { type ComponentProps } from 'react'; +import type {ComponentProps} from 'react'; export const Muted = (props: ComponentProps = {}) => \ No newline at end of file diff --git a/src/client/components/chakraPlayer/Player.tsx b/src/client/components/chakraPlayer/Player.tsx index ffffc3e1..8f56956c 100644 --- a/src/client/components/chakraPlayer/Player.tsx +++ b/src/client/components/chakraPlayer/Player.tsx @@ -11,7 +11,7 @@ import { useSSEContext, useSSEEvent, } from "@flamefrontend/sse-runtime-react"; -import { type ComponentCommonApiJson, type MsSseEvent, type MsSseEventPayload } from "../../../core/Api"; +import type {ComponentCommonApiJson, MsSseEvent, MsSseEventPayload} from "../../../core/Api"; import LinearProgress from '@mui/material/LinearProgress'; import { InfoTip } from "../ToggleTip"; import { tanQueries } from "../../queries"; diff --git a/src/client/components/icons/AnimatedIcons.tsx b/src/client/components/icons/AnimatedIcons.tsx index 179ba0b7..e6e72385 100644 --- a/src/client/components/icons/AnimatedIcons.tsx +++ b/src/client/components/icons/AnimatedIcons.tsx @@ -1,4 +1,4 @@ -import { type ComponentProps } from 'react'; +import type {ComponentProps} from 'react'; import { Icon } from '@chakra-ui/react'; /** Ripple animated "loading" icon diff --git a/src/client/components/icons/ChakraIcons.tsx b/src/client/components/icons/ChakraIcons.tsx index 2bba3497..c7716b45 100644 --- a/src/client/components/icons/ChakraIcons.tsx +++ b/src/client/components/icons/ChakraIcons.tsx @@ -30,9 +30,10 @@ import { VscDebugRestart } from 'react-icons/vsc'; import { MdOutlineFiberNew } from "react-icons/md"; import { RiZzzFill } from "react-icons/ri"; import { SiGoogledocs } from "react-icons/si"; -import { IconButton, Clipboard, useClipboard, Spinner, Icon } from "@chakra-ui/react" -import { type ComponentProps, type PropsWithChildren } from 'react'; -import { type IconBaseProps, type IconType } from "react-icons/lib"; +import type { Clipboard} from "@chakra-ui/react"; +import { IconButton, useClipboard, Spinner, Icon } from "@chakra-ui/react" +import type {ComponentProps, PropsWithChildren} from 'react'; +import type {IconBaseProps, IconType} from "react-icons/lib"; export const makeIconButton = (Icon: IconType) => (props: PropsWithChildren> & { iconProps?: IconBaseProps, loading?: boolean }) => { const { diff --git a/src/client/components/msComponent/MSComponentDetailed.tsx b/src/client/components/msComponent/MSComponentDetailed.tsx index 44907100..addfef72 100644 --- a/src/client/components/msComponent/MSComponentDetailed.tsx +++ b/src/client/components/msComponent/MSComponentDetailed.tsx @@ -22,7 +22,7 @@ import dayjs from "dayjs"; import { durationToHuman, shortTodayAwareFormat } from "../../../core/TimeUtils.js"; import { tanQueries } from "../../queries/index.js"; import { MSErrorBoundary } from "../ErrorBoundary.js"; -import { type IconType } from "react-icons/lib"; +import type {IconType} from "react-icons/lib"; import { useIsWrapped } from "../../utils/hooks/useIsWrapped.js"; export const ComponentBackButton = (props: ComponentProps = {}) => { diff --git a/src/client/components/msComponent/MSComponentList.tsx b/src/client/components/msComponent/MSComponentList.tsx index 08f1077e..0436159b 100644 --- a/src/client/components/msComponent/MSComponentList.tsx +++ b/src/client/components/msComponent/MSComponentList.tsx @@ -1,6 +1,6 @@ import { useState } from "react" import { Stack, SegmentGroup, Center, Card, SkeletonText } from '@chakra-ui/react'; -import { type ComponentsApiJson } from "../../../core/Api"; +import type {ComponentsApiJson} from "../../../core/Api"; import { MSComponentSummary, MSComponentSummaryFetchable } from "./MSComponentSummary"; import { useQuery } from '@tanstack/react-query'; import { ErrorAlert } from "../ErrorAlert"; diff --git a/src/client/components/msComponent/Stats.tsx b/src/client/components/msComponent/Stats.tsx index bb78cb57..85b35585 100644 --- a/src/client/components/msComponent/Stats.tsx +++ b/src/client/components/msComponent/Stats.tsx @@ -1,6 +1,6 @@ import { type ComponentProps, useState, useCallback } from "react" import { Badge, Stat, HStack } from '@chakra-ui/react'; -import { type ComponentClientApiJson, type ComponentCommonApiJson, type MsSseEvent } from "../../../core/Api.js"; +import type {ComponentClientApiJson, ComponentCommonApiJson, MsSseEvent} from "../../../core/Api.js"; import { TextMuted } from "../TextMuted.js"; import { DownArrowIcon, UpArrowIcon } from "../icons/ChakraIcons.js"; import { useTimeout } from 'react-use-timeout'; diff --git a/src/client/components/playActivity/ActivityList.tsx b/src/client/components/playActivity/ActivityList.tsx index 060b9995..9f653a42 100644 --- a/src/client/components/playActivity/ActivityList.tsx +++ b/src/client/components/playActivity/ActivityList.tsx @@ -4,8 +4,8 @@ import { type InfiniteData, useInfiniteQuery, type UseInfiniteQueryResult, useQu import dayjs from 'dayjs'; import doy from 'dayjs/plugin/dayOfYear.js'; import { type ComponentProps, Fragment, useMemo, useState } from "react"; -import { type MsSseEvent, type MsSseEventPayload, type PaginatedResponse, type PlayApiCommonDetailed, type QueryPlaysOptsJson } from '../../../core/Api.js'; -import { type ComponentType } from '../../../core/Atomic.js'; +import type {MsSseEvent, MsSseEventPayload, PaginatedResponse, PlayApiCommonDetailed, QueryPlaysOptsJson} from '../../../core/Api.js'; +import type {ComponentType} from '../../../core/Atomic.js'; import { type QueryPlaysOptsJsonRefreshable, tanQueries } from '../../queries/index.js'; import { ActivityDetailFetchable, ActivityDetails, ActivitySummary, ActivitySummaryFetchable, ActivitySummarySkeleton } from '../ActivityDetail.js'; import { ErrorAlert } from '../ErrorAlert.js'; diff --git a/src/client/components/playActivity/ListFilters.tsx b/src/client/components/playActivity/ListFilters.tsx index ad8ed084..f312c788 100644 --- a/src/client/components/playActivity/ListFilters.tsx +++ b/src/client/components/playActivity/ListFilters.tsx @@ -1,4 +1,7 @@ import { Button, Card, createListCollection, DatePicker, Flex, HStack, Portal, Select, Span, TagsInput, useSelectContext, VStack, Wrap } from '@chakra-ui/react'; +import type { + ZonedDateTime +} from "@internationalized/date"; import { type DateValue, getLocalTimeZone, @@ -6,12 +9,11 @@ import { Time, toCalendarDateTime, today, - toZoned, - ZonedDateTime + toZoned } from "@internationalized/date"; import { useQueryClient } from '@tanstack/react-query'; import { type ComponentProps, useCallback, useMemo, useState } from "react"; -import { type CompareDateBetween, type PlayStateUI } from '../../../core/Api.js'; +import type {CompareDateBetween, PlayStateUI} from '../../../core/Api.js'; import { type ComponentType, isComponentTypeSource, PLAY_CLIENT_STATE, PLAY_SOURCE_STATE, type PlayState } from '../../../core/Atomic.js'; import { capitalizeWords } from '../../../core/StringUtils.js'; import { type QueryPlaysOptsJsonRefreshable, tanQueries, useQueryWatcher } from '../../queries/index.js'; diff --git a/src/client/components/playActivity/ListParts.tsx b/src/client/components/playActivity/ListParts.tsx index adff22d5..e900991b 100644 --- a/src/client/components/playActivity/ListParts.tsx +++ b/src/client/components/playActivity/ListParts.tsx @@ -1,10 +1,11 @@ import { Box, Flex, IconButton, Separator, Text } from '@chakra-ui/react'; -import dayjs, { Dayjs } from 'dayjs'; +import type { Dayjs } from 'dayjs'; +import dayjs from 'dayjs'; import doy from 'dayjs/plugin/dayOfYear.js'; -import { type ComponentProps } from "react"; +import type {ComponentProps} from "react"; import { VscDebugRestart } from 'react-icons/vsc'; -import { type PlayApiCommon, type PlayApiCommonDetailed, type QueryPlaysOptsJson, type SortPlaysByProps } from '../../../core/Api.js'; -import { type ComponentType } from '../../../core/Atomic.js'; +import type {PlayApiCommon, PlayApiCommonDetailed, QueryPlaysOptsJson, SortPlaysByProps} from '../../../core/Api.js'; +import type {ComponentType} from '../../../core/Atomic.js'; import { getAllIndexes } from '../../../core/DataUtils.js'; import { sortByNewestDate } from '../../../core/PlayUtils.js'; diff --git a/src/client/components/playActivity/VirtualListDynamic.tsx b/src/client/components/playActivity/VirtualListDynamic.tsx index 11f50680..a505c33e 100644 --- a/src/client/components/playActivity/VirtualListDynamic.tsx +++ b/src/client/components/playActivity/VirtualListDynamic.tsx @@ -1,5 +1,5 @@ import { type SystemStyleObject, Box, EmptyState, HStack, ScrollArea, Separator, Spinner, Text, VStack } from '@chakra-ui/react'; -import { type UseInfiniteQueryResult } from '@tanstack/react-query'; +import type {UseInfiniteQueryResult} from '@tanstack/react-query'; import { useVirtualizer } from "@tanstack/react-virtual"; import React, { type ComponentProps, useCallback, useMemo } from "react"; import { LuCaptionsOff } from "react-icons/lu"; diff --git a/src/client/components/player/PlayerInfo.tsx b/src/client/components/player/PlayerInfo.tsx index 74a44732..5e9edb32 100644 --- a/src/client/components/player/PlayerInfo.tsx +++ b/src/client/components/player/PlayerInfo.tsx @@ -1,6 +1,6 @@ import React from 'react'; import './trackInfo.scss'; -import {type SourcePlayerJson} from "../../../core/Atomic"; +import type {SourcePlayerJson} from "../../../core/Atomic"; import {isoToHuman} from "../../utils/index"; export interface PlayerInfoProps { diff --git a/src/client/components/statusCard/ClientStatusCard.tsx b/src/client/components/statusCard/ClientStatusCard.tsx index 575b8803..79605d93 100644 --- a/src/client/components/statusCard/ClientStatusCard.tsx +++ b/src/client/components/statusCard/ClientStatusCard.tsx @@ -2,7 +2,7 @@ import React, {Fragment, useCallback} from 'react'; import StatusCardSkeleton, {type StatusCardSkeletonData} from "./StatusCardSkeleton"; import SkeletonParagraph from "../skeleton/SkeletonParagraph"; import {clientAdapter} from "../../status/ducks"; -import {type RootState} from "../../store"; +import type {RootState} from "../../store"; import {connect, type ConnectedProps} from "react-redux"; import {Link} from "react-router-dom"; import {useStartClientMutation} from "./clientDucks"; diff --git a/src/client/components/statusCard/SourceStatusCard.tsx b/src/client/components/statusCard/SourceStatusCard.tsx index 45034375..4b4937be 100644 --- a/src/client/components/statusCard/SourceStatusCard.tsx +++ b/src/client/components/statusCard/SourceStatusCard.tsx @@ -3,7 +3,7 @@ import StatusCardSkeleton, {type StatusCardSkeletonData} from "./StatusCardSkele import SkeletonParagraph from "../skeleton/SkeletonParagraph"; import {Link} from "react-router-dom"; import {sourceAdapter} from "../../status/ducks"; -import {type RootState} from "../../store"; +import type {RootState} from "../../store"; import {connect, type ConnectedProps} from "react-redux"; import Player from "../player/Player"; import {useStartSourceMutation, useListenSourceMutation} from "./sourceDucks"; diff --git a/src/client/deadLetter/DeadPage.tsx b/src/client/deadLetter/DeadPage.tsx index ee01c594..66e426f2 100644 --- a/src/client/deadLetter/DeadPage.tsx +++ b/src/client/deadLetter/DeadPage.tsx @@ -12,7 +12,7 @@ import { clearDead, } from "./deadLetterDucks"; import dayjs from "dayjs"; -import {type RootState} from "../store"; +import type {RootState} from "../store"; import {connect, type ConnectedProps} from "react-redux"; import { faBug } from "@fortawesome/free-solid-svg-icons"; import { FontAwesomeIcon } from "@fortawesome/react-fontawesome"; diff --git a/src/client/deadLetter/deadLetterDucks.ts b/src/client/deadLetter/deadLetterDucks.ts index dbeda06b..afae165e 100644 --- a/src/client/deadLetter/deadLetterDucks.ts +++ b/src/client/deadLetter/deadLetterDucks.ts @@ -1,5 +1,5 @@ import {createApi, fetchBaseQuery} from "@reduxjs/toolkit/query/react"; -import {type DeadLetterScrobble, type JsonPlayObject} from "../../core/Atomic"; +import type {DeadLetterScrobble, JsonPlayObject} from "../../core/Atomic"; import {createAction, createEntityAdapter, createSlice} from "@reduxjs/toolkit"; import {type ApiEventPayload, clientUpdate} from "../status/ducks"; diff --git a/src/client/logs/LogsSection.tsx b/src/client/logs/LogsSection.tsx index fe8d2fe5..a3ec4701 100644 --- a/src/client/logs/LogsSection.tsx +++ b/src/client/logs/LogsSection.tsx @@ -3,7 +3,7 @@ import { FixedSizeList } from "fixed-size-list"; import { useCallback, useEffect, useState } from 'react'; import { connect, type ConnectedProps } from "react-redux"; import Loading from "../components/loading/Loading"; -import { type RootState } from "../store"; +import type {RootState} from "../store"; import LogLine from "./LogLine"; import { useGetLogsQuery, useLazySetLogSettingsQuery } from "./logsApi"; import './LogsSection.css'; diff --git a/src/client/logs/logDucks.ts b/src/client/logs/logDucks.ts index 133e2d2f..e6ebb47e 100644 --- a/src/client/logs/logDucks.ts +++ b/src/client/logs/logDucks.ts @@ -1,7 +1,7 @@ import { createReducer } from '@reduxjs/toolkit'; -import { type LogOutputConfig } from "../../core/Atomic"; +import type {LogOutputConfig} from "../../core/Atomic"; import { logsApi } from "./logsApi"; export interface LogsState { // TODO remove after new ui switchover diff --git a/src/client/queries/index.ts b/src/client/queries/index.ts index 3559c74f..06aba0a1 100644 --- a/src/client/queries/index.ts +++ b/src/client/queries/index.ts @@ -4,7 +4,7 @@ import { useEffect, useState, useMemo } from 'react'; import ky from 'ky'; import qs from 'qs'; import { baseUrl } from "../utils"; -import { type ComponentsApiJson, type PaginatedResponse, type PlayApiCommonDetailed, type PlayStateUI, type QueryPlaysOptsJson } from "../../core/Api"; +import type {ComponentsApiJson, PaginatedResponse, PlayApiCommonDetailed, PlayStateUI, QueryPlaysOptsJson} from "../../core/Api"; import { CLIENT_DEAD_QUEUE, CLIENT_INGRESS_QUEUE, isPlayState, type SourcePlayerJson } from "../../core/Atomic"; export type QueryPlaysOptsJsonRefreshable = Omit & {nonce?: string, state?: PlayStateUI[]}; diff --git a/src/client/recent/recentDucks.ts b/src/client/recent/recentDucks.ts index 4324fbc7..2b586ee0 100644 --- a/src/client/recent/recentDucks.ts +++ b/src/client/recent/recentDucks.ts @@ -1,5 +1,5 @@ import {createApi, fetchBaseQuery} from "@reduxjs/toolkit/query/react"; -import {type JsonPlayObject} from "../../core/Atomic"; +import type {JsonPlayObject} from "../../core/Atomic"; type RecentResponse = (JsonPlayObject & { index: number })[]; export const recentApi = createApi({ diff --git a/src/client/scrobbled/scrobbledDucks.ts b/src/client/scrobbled/scrobbledDucks.ts index 2db7a29f..32ef2b14 100644 --- a/src/client/scrobbled/scrobbledDucks.ts +++ b/src/client/scrobbled/scrobbledDucks.ts @@ -1,5 +1,5 @@ import {createApi, fetchBaseQuery} from "@reduxjs/toolkit/query/react"; -import {type JsonPlayObject} from "../../core/Atomic"; +import type {JsonPlayObject} from "../../core/Atomic"; type ScrobbledResponse = (JsonPlayObject & { index: number })[]; export const scrobbledApi = createApi({ diff --git a/src/client/status/StatusSection.tsx b/src/client/status/StatusSection.tsx index 155ff956..79c6d1fd 100644 --- a/src/client/status/StatusSection.tsx +++ b/src/client/status/StatusSection.tsx @@ -5,7 +5,7 @@ import SourceStatusCard from "../components/statusCard/SourceStatusCard"; import ClientStatusCard from "../components/statusCard/ClientStatusCard"; import {useGetStatusQuery} from "./statusApi"; import {clientAdapter, sourceAdapter} from "./ducks"; -import {type RootState} from "../store"; +import type {RootState} from "../store"; const StatusSection = (props: PropsFromRedux) => { const { } = props; diff --git a/src/client/status/ducks.ts b/src/client/status/ducks.ts index f82eeca8..fb595b18 100644 --- a/src/client/status/ducks.ts +++ b/src/client/status/ducks.ts @@ -3,7 +3,7 @@ import { createSlice } from '@reduxjs/toolkit' import {statusApi} from "./statusApi"; -import {type ClientStatusData, type SourcePlayerJson, type SourceStatusData} from "../../core/Atomic"; +import type {ClientStatusData, SourcePlayerJson, SourceStatusData} from "../../core/Atomic"; export interface ApiEventPayload { type: string, diff --git a/src/client/status/statusApi.ts b/src/client/status/statusApi.ts index 15cf6534..a209efaa 100644 --- a/src/client/status/statusApi.ts +++ b/src/client/status/statusApi.ts @@ -1,5 +1,5 @@ import { createApi, fetchBaseQuery } from '@reduxjs/toolkit/query/react'; -import {type ClientStatusData, type SourceStatusData} from "../../core/Atomic"; +import type {ClientStatusData, SourceStatusData} from "../../core/Atomic"; export const statusApi = createApi({ reducerPath: 'statusApi', diff --git a/src/client/utils/ComponentUtils.tsx b/src/client/utils/ComponentUtils.tsx index 4e981d89..1aa726e0 100644 --- a/src/client/utils/ComponentUtils.tsx +++ b/src/client/utils/ComponentUtils.tsx @@ -1,5 +1,6 @@ -import { Card, type HTMLChakraProps } from '@chakra-ui/react'; -import { type PlayApiCommonDetailed } from '../../core/Api'; +import type { Card} from '@chakra-ui/react'; +import type {HTMLChakraProps} from '@chakra-ui/react'; +import type {PlayApiCommonDetailed} from '../../core/Api'; import { type LifecycleStep, QUEUE_STATUS_COMPLETED, QUEUE_STATUS_FAILED } from '../../core/Atomic'; export const cardHeaderSeparator: Card.HeaderProps = { diff --git a/src/client/utils/index.tsx b/src/client/utils/index.tsx index 9863431b..9819b627 100644 --- a/src/client/utils/index.tsx +++ b/src/client/utils/index.tsx @@ -1,7 +1,8 @@ -import {type TrackStringOptions} from "../../core/Atomic"; +import type {TrackStringOptions} from "../../core/Atomic"; import React, {type ReactElement, Fragment} from "react"; import {defaultBuildTrackStringTransformers} from "../../core/StringUtils"; -import dayjs, {Dayjs} from 'dayjs'; +import type {Dayjs} from 'dayjs'; +import dayjs from 'dayjs'; export const buildTrackStringReactOptions: TrackStringOptions = { transformers: { diff --git a/src/core/Api.ts b/src/core/Api.ts index a78efad9..e36666dc 100644 --- a/src/core/Api.ts +++ b/src/core/Api.ts @@ -1,7 +1,7 @@ import type { PickKeys } from "ts-essentials" import type { CompareOpKey, ComponentMinimalSelect } from "../backend/common/database/drizzle/drizzleTypes.ts" -import type { ClientType } from "../backend/common/infrastructure/config/client/clients.ts" -import type { SourceType } from "../backend/common/infrastructure/config/source/sources.ts" +import type { ClientType } from "./Atomic.ts" +import type { SourceType } from "./Atomic.ts" import type { ComponentType, DateLike, ErrorLike, JsonPlayObject, PlayState, QueueName, Replace, SOURCE_SOT_TYPES, SourcePlayerJson } from "./Atomic.ts" import type { Dayjs } from "dayjs" import type { ErrorIsh } from "./ErrorUtils.ts" diff --git a/src/core/Atomic.ts b/src/core/Atomic.ts index 6ec3e686..9eba6790 100644 --- a/src/core/Atomic.ts +++ b/src/core/Atomic.ts @@ -1,10 +1,10 @@ import type { Dayjs } from "dayjs"; import type { AdditionalTrackInfoResponse } from "./vendor/listenbrainz/interfaces.ts"; import type { Merge, RequiredKeys, StrictOmit } from "ts-essentials"; -import { type ErrorObject } from "serialize-error"; +import type {ErrorObject} from "serialize-error"; import type { FlowControlTerm, TransformHook } from "./Transform.ts"; -import { type Changeset } from "json-diff-ts"; -import { type IParseBaseOptions } from 'qs'; +import type {Changeset} from "json-diff-ts"; +import type {IParseBaseOptions} from 'qs'; export type ComponentTypeClient = 'client'; export const COMPONENT_TYPE_CLIENT: ComponentTypeClient = 'client'; @@ -717,4 +717,103 @@ export const DELIMITERS_NO_AMP = [',', '/', '\\']; export type DeviceId = string; export type PlayUserId = string; export type PlayPlatformId = [DeviceId, PlayUserId]; +export type SourceType = + 'spotify' | + 'plex' | + 'subsonic' | + 'jellyfin' | + 'lastfm' | + 'librefm' | + 'deezer' | + 'endpointlz' | + 'endpointlfm' | + 'ytmusic' | + 'ymbridge' | + 'mpris' | + 'mopidy' | + 'musiccast' | + 'listenbrainz' | + 'jriver' | + 'kodi' | + 'webscrobbler' | + 'chromecast' | + 'maloja' | + 'musikcube' | + 'mpd' | + 'vlc' | + 'icecast' | + 'azuracast' | + 'koito' | + 'tealfm' | + 'rocksky' | + 'sonos'; +export const sourceTypes: SourceType[] = [ + 'spotify', + 'plex', + 'subsonic', + 'jellyfin', + 'lastfm', + 'librefm', + 'deezer', + 'endpointlz', + 'endpointlfm', + 'ytmusic', + 'ymbridge', + 'mpris', + 'mopidy', + 'musiccast', + 'listenbrainz', + 'jriver', + 'kodi', + 'webscrobbler', + 'chromecast', + 'maloja', + 'musikcube', + 'mpd', + 'vlc', + 'icecast', + 'azuracast', + 'koito', + 'tealfm', + 'rocksky', + 'sonos' +]; +export const isSourceType = (data: string): data is SourceType => { + return sourceTypes.includes(data as SourceType); +}; +export type ClientType = + 'maloja' | + 'lastfm' | + 'librefm' | + 'listenbrainz' | + 'koito' | + 'tealfm' | + 'rocksky' | + 'discord'; +export const clientTypes: ClientType[] = [ + 'maloja', + 'lastfm', + 'librefm', + 'listenbrainz', + 'koito', + 'tealfm', + 'rocksky', + 'discord' +]; +export type ReportedPlayerStatus = 'playing' | 'stopped' | 'paused' | 'unknown'; +export const REPORTED_PLAYER_STATUSES = { + playing: 'playing' as ReportedPlayerStatus, + stopped: 'stopped' as ReportedPlayerStatus, + paused: 'paused' as ReportedPlayerStatus, + unknown: 'unknown' as ReportedPlayerStatus +}; +export type CalculatedPlayerStatus = ReportedPlayerStatus | 'stale' | 'orphaned'; +export const CALCULATED_PLAYER_STATUSES = { + ...REPORTED_PLAYER_STATUSES, + stale: 'stale' as CalculatedPlayerStatus, + orphaned: 'orphaned' as CalculatedPlayerStatus, +}; +export const isClientType = (data: string): data is ClientType => { + return clientTypes.includes(data as ClientType); +}; diff --git a/src/core/PlayUtils.ts b/src/core/PlayUtils.ts index 10594846..4804c858 100644 --- a/src/core/PlayUtils.ts +++ b/src/core/PlayUtils.ts @@ -1,4 +1,4 @@ -import { type AmbPlayObject, type DateLike, type PlayObject, type PlayObjectMinimal, type PlayPlatformId } from "./Atomic.ts"; +import type {AmbPlayObject, DateLike, PlayObject, PlayObjectMinimal, PlayPlatformId} from "./Atomic.ts"; import dayjs from "dayjs"; export const sortByNewestDate = (aPlayDate: DateLike, bPlayDate: DateLike) => { diff --git a/src/core/Transform.ts b/src/core/Transform.ts index 85dba0e5..cf7c9c12 100644 --- a/src/core/Transform.ts +++ b/src/core/Transform.ts @@ -1,4 +1,4 @@ -import { type SearchAndReplaceRegExp } from "@foxxmd/regex-buddy-core"; +import type {SearchAndReplaceRegExp} from "@foxxmd/regex-buddy-core"; export interface ConditionalSearchAndReplaceRegExp extends SearchAndReplaceRegExp, Whennable { } diff --git a/src/core/tests/utils/PlayTestUtils.ts b/src/core/tests/utils/PlayTestUtils.ts index d5769120..c04a2cb5 100644 --- a/src/core/tests/utils/PlayTestUtils.ts +++ b/src/core/tests/utils/PlayTestUtils.ts @@ -8,16 +8,18 @@ import utc from "dayjs/plugin/utc.js"; import { type ArtistCredit, type BrainzMeta, FEAT, JOINERS, JOINERS_FINAL, type JsonPlayObject, type MBID, type ObjectPlayData, type PlayMeta, type PlayObject, type SourcePlayerObj } from "../../Atomic.ts"; import { genGroupIdStr } from '../../PlayUtils.ts'; import { sortByNewestPlayDate } from '../../PlayUtils.ts'; -import { CALCULATED_PLAYER_STATUSES, NO_DEVICE, NO_USER, type PlayerStateDataMaybePlay, REPORTED_PLAYER_STATUSES, SINGLE_USER_PLATFORM_ID } from '../../../backend/common/infrastructure/Atomic.ts'; -import { type PlayPlatformId } from '../../Atomic.ts'; +import { NO_DEVICE, NO_USER, type PlayerStateDataMaybePlay, SINGLE_USER_PLATFORM_ID } from '../../../backend/common/infrastructure/Atomic.ts'; +import { CALCULATED_PLAYER_STATUSES } from '../../Atomic.ts'; +import { REPORTED_PLAYER_STATUSES } from '../../Atomic.ts'; +import type {PlayPlatformId} from '../../Atomic.ts'; import { arrayListAnd, artistNamesToCredits } from '../../StringUtils.ts'; import { findDelimiters } from "../../StringUtils.ts"; -import { type ListRecord } from '../../../backend/common/infrastructure/config/client/tealfm.ts'; +import type {ListRecord} from '../../../backend/common/infrastructure/config/client/tealfm.ts'; import { nanoid } from 'nanoid'; -import { type LastFMTrackObject } from '../../../backend/common/vendor/LastfmApiClient.ts'; +import type {LastFMTrackObject} from '../../../backend/common/vendor/LastfmApiClient.ts'; import clone from 'clone'; import { removeUndefinedKeys } from '../../DataUtils.ts'; -import { FmTealAlphaFeedPlay } from '../../../backend/common/vendor/teal/lexicons/index.ts'; +import type { FmTealAlphaFeedPlay } from '../../../backend/common/vendor/teal/lexicons/index.ts'; dayjs.extend(utc) dayjs.extend(isBetween); diff --git a/src/core/tests/utils/apiFixtures.ts b/src/core/tests/utils/apiFixtures.ts index e4d94f43..22963e99 100644 --- a/src/core/tests/utils/apiFixtures.ts +++ b/src/core/tests/utils/apiFixtures.ts @@ -1,17 +1,19 @@ import { faker } from "@faker-js/faker"; -import { type ComponentClientApi, type ComponentClientApiJson, type ComponentCommonApi, type ComponentCommonApiJson, type ComponentSourceApi, type ComponentSourceApiJson, type ComponentState, type PlayApiCommon, type PlayApiCommonDetailed, type PlayInputApi, type QueueStateApi } from "../../Api.ts"; -import { CLIENT_INGRESS_QUEUE, type JsonPlayObject, type PlayObject, QUEUE_STATUSES, type SourcePlayerJson, sourceSotTypes } from "../../Atomic.ts"; +import type {ComponentClientApi, ComponentClientApiJson, ComponentCommonApi, ComponentCommonApiJson, ComponentSourceApi, ComponentSourceApiJson, ComponentState, PlayApiCommon, PlayApiCommonDetailed, PlayInputApi, QueueStateApi} from "../../Api.ts"; +import { CLIENT_INGRESS_QUEUE, type ComponentType, type JsonPlayObject, type PlayObject, QUEUE_STATUSES, type SourcePlayerJson, sourceSotTypes } from "../../Atomic.ts"; import { generatePlay, normalizePlays } from "./PlayTestUtils.ts"; import { generatePlayInput, generatePlayWithLifecycle, playWithLifecycleScrobble, randomPlayState } from "./fixtures.ts"; import { asJsonPlayObject } from "../../PlayMarshalUtils.ts"; import { generatePlayUid } from "../../StringUtils.ts"; import dayjs, { type Dayjs } from "dayjs"; -import { isSourceType, sourceTypes } from "../../../backend/common/infrastructure/config/source/sources.ts"; -import { clientTypes } from "../../../backend/common/infrastructure/config/client/clients.ts"; -import { type ComponentSelect } from "../../../backend/common/database/drizzle/drizzleTypes.ts"; -import { CALCULATED_PLAYER_STATUSES, isClientType, REPORTED_PLAYER_STATUSES } from "../../../backend/common/infrastructure/Atomic.ts"; +import { isSourceType } from "../../Atomic.ts"; +import { sourceTypes } from "../../Atomic.ts"; +import { clientTypes } from "../../Atomic.ts"; +import { isClientType } from '../../Atomic.ts'; +import { CALCULATED_PLAYER_STATUSES } from '../../Atomic.ts'; +import { REPORTED_PLAYER_STATUSES } from '../../Atomic.ts'; import { generateArray } from "../../DataUtils.ts"; -import { type ErrorIsh } from "../../ErrorUtils.ts"; +import type {ErrorIsh} from "../../ErrorUtils.ts"; export const generatePlayApiCommon = (commonData: Partial & {play?: JsonPlayObject | PlayObject } = {}, ...playOpts: Parameters): PlayApiCommon => { let play: JsonPlayObject | PlayObject; @@ -117,7 +119,7 @@ export const generateComponentCommonApiJson = (data: Partial } = data; - let mode: ComponentSelect['mode'] = data.mode; + let mode: ComponentType = data.mode; if(mode === undefined) { if(isSourceType(type)) { mode = 'source'; diff --git a/src/core/tests/utils/fixtures.ts b/src/core/tests/utils/fixtures.ts index cbe168f3..4db80572 100644 --- a/src/core/tests/utils/fixtures.ts +++ b/src/core/tests/utils/fixtures.ts @@ -1,16 +1,14 @@ import { Traverse } from 'neotraverse/modern'; import { faker } from '@faker-js/faker'; -import { type AmbPlayObject, type DateLike, type LifecycleInput, type LifecycleStep, type ObjectPlayData, PLAY_STATES, type PlayMeta, type PlayObject, type PlayOriginal, type PlayState, type ScrobbleResult } from '../../Atomic.ts'; +import { type AmbPlayObject, type DateLike, type LifecycleInput, type LifecycleStep, type ObjectPlayData, PLAY_STATES, type PlayMatchResult, type PlayMeta, type PlayObject, type PlayOriginal, type PlayState, type ScrobbleResult } from '../../Atomic.ts'; import { generateBrainz, generateMbid, generatePlay, type GeneratePlayOpts, generatePlays } from './PlayTestUtils.ts'; import { statefulInvariantTransform } from '../../PlayUtils.ts'; import clone from 'clone'; import { diffObjects } from '../../DataUtils.ts'; -import { existingScrobble } from '../../../backend/utils/PlayComparisonUtils.ts'; -import { UpstreamError } from '../../../backend/common/errors/UpstreamError.ts'; -import { playToListenPayload } from '../../../backend/common/vendor/listenbrainz/lzUtils.ts'; +//import { existingScrobble } from '../../../backend/utils/PlayComparisonUtils.ts'; import { mergeSimpleError, SimpleError, SkipTransformStageError, StagePrerequisiteError, StageTransformError } from '../../../backend/common/errors/MSErrors.ts'; import dayjs, { type Dayjs } from 'dayjs'; -import { type TransformHook } from '../../Transform.ts'; +import type {TransformHook} from '../../Transform.ts'; import { serializeError } from 'serialize-error'; export interface ScrobbleMatchOptions { @@ -124,16 +122,22 @@ export const playWithLifecycleScrobble = async (play: PlayObject, opts: Scrobble existingPlays.push(play); } - const res = await existingScrobble(play, existingPlays); + const res: PlayMatchResult = { + match, + score: 0.9, + breakdowns: ['fsdf','fsdf','fsdf'], + reason: 'fsdfd', + createdAt: dayjs().toISOString() + } scrobbleRes.match = res; if(res.match) { play.scrobble = scrobbleRes; return play; } - scrobbleRes.payload = playToListenPayload(play); + scrobbleRes.payload = play; if(error) { - scrobbleRes.error = serializeError(new Error('Failed to scrobble to client', {cause: new UpstreamError('Client returned a 400 or something')})); + scrobbleRes.error = serializeError(new Error('Failed to scrobble to client', {cause: new Error('Client returned a 400 or something')})); play.scrobble = scrobbleRes; return play; } diff --git a/src/stories/component/ComponentStatDead.stories.tsx b/src/stories/component/ComponentStatDead.stories.tsx index caf59ff3..22db8c30 100644 --- a/src/stories/component/ComponentStatDead.stories.tsx +++ b/src/stories/component/ComponentStatDead.stories.tsx @@ -7,7 +7,7 @@ import { DeadLetterIndicator } from "../../client/components/msComponent/Stats.j import { sseProviderOptions } from "../../client/AppNext.js"; import {Provider} from "../../client/components/Provider.js"; import { SSEProvider } from "@flamefrontend/sse-runtime-react"; -import { type MsSseEvent } from "../../core/Api.js"; +import type {MsSseEvent} from "../../core/Api.js"; import { faker } from "@faker-js/faker"; // More on how to set up stories at: https://storybook.js.org/docs/writing-stories#default-export diff --git a/src/stories/component/ComponentStatLive.stories.tsx b/src/stories/component/ComponentStatLive.stories.tsx index 18c29c33..38d94d29 100644 --- a/src/stories/component/ComponentStatLive.stories.tsx +++ b/src/stories/component/ComponentStatLive.stories.tsx @@ -7,7 +7,7 @@ import { CountLiveIndicator } from "../../client/components/msComponent/Stats.js import { sseProviderOptions } from "../../client/AppNext.js"; import {Provider} from "../../client/components/Provider.js"; import { SSEProvider } from "@flamefrontend/sse-runtime-react"; -import { type MsSseEvent } from "../../core/Api.js"; +import type {MsSseEvent} from "../../core/Api.js"; // More on how to set up stories at: https://storybook.js.org/docs/writing-stories#default-export const meta = preview.meta({ diff --git a/src/stories/component/ComponentStatQueued.stories.tsx b/src/stories/component/ComponentStatQueued.stories.tsx index eaaa9637..e7d2570b 100644 --- a/src/stories/component/ComponentStatQueued.stories.tsx +++ b/src/stories/component/ComponentStatQueued.stories.tsx @@ -7,7 +7,7 @@ import { QueuedIndicator } from "../../client/components/msComponent/Stats.js"; import { sseProviderOptions } from "../../client/AppNext.js"; import {Provider} from "../../client/components/Provider.js"; import { SSEProvider } from "@flamefrontend/sse-runtime-react"; -import { type MsSseEvent } from "../../core/Api.js"; +import type {MsSseEvent} from "../../core/Api.js"; import { faker } from "@faker-js/faker"; // More on how to set up stories at: https://storybook.js.org/docs/writing-stories#default-export diff --git a/src/stories/component/ComponentSummary.stories.tsx b/src/stories/component/ComponentSummary.stories.tsx index a56a561e..ddc74629 100644 --- a/src/stories/component/ComponentSummary.stories.tsx +++ b/src/stories/component/ComponentSummary.stories.tsx @@ -6,7 +6,7 @@ import { Container } from '@chakra-ui/react'; import { MSComponentSummary } from "../../client/components/msComponent/MSComponentSummary.js"; import {Provider} from "../../client/components/Provider.js"; import { generateClientApiJson, generateSourceApiJson, generateSourcePlayerJson } from "../../core/tests/utils/apiFixtures.js"; -import { type MsSseEvent } from "../../core/Api.js"; +import type {MsSseEvent} from "../../core/Api.js"; import { SSEProvider } from "@flamefrontend/sse-runtime-react"; import { sseProviderOptions } from "../../client/AppNext.js"; import { faker } from "@faker-js/faker"; diff --git a/src/stories/component/Player.stories.tsx b/src/stories/component/Player.stories.tsx index 3607a564..d1343789 100644 --- a/src/stories/component/Player.stories.tsx +++ b/src/stories/component/Player.stories.tsx @@ -6,7 +6,7 @@ import { Container } from '@chakra-ui/react'; import { ChakraPlayer, ChakraPlayerFetchable } from "../../client/components/chakraPlayer/Player.js"; import {Provider} from "../../client/components/Provider.js"; import { generateSourcePlayerJson } from "../../core/tests/utils/apiFixtures.js"; -import { type MsSseEvent } from "../../core/Api.js"; +import type {MsSseEvent} from "../../core/Api.js"; import { SSEProvider } from "@flamefrontend/sse-runtime-react"; import { sseProviderOptions } from "../../client/AppNext.js"; import dayjs from "dayjs"; diff --git a/src/stories/miscComponents/ErrorAlert.stories.tsx b/src/stories/miscComponents/ErrorAlert.stories.tsx index edd66619..716ae6db 100644 --- a/src/stories/miscComponents/ErrorAlert.stories.tsx +++ b/src/stories/miscComponents/ErrorAlert.stories.tsx @@ -4,7 +4,7 @@ import { Container } from '@chakra-ui/react'; import { ErrorAlert } from "../../client/components/ErrorAlert.js"; import {Provider} from "../../client/components/Provider.js"; -import { type ErrorLike } from "../../core/Atomic.js"; +import type {ErrorLike} from "../../core/Atomic.js"; import { serializeError } from "serialize-error"; const stack = "Scrobble Submit Error: Failed to submit to Listenbrainz (listen_type single)\n at ListenbrainzApiClient.submitListen (/app/src/backend/common/vendor/ListenbrainzApiClient.ts:246:19)\n at process.processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async ListenbrainzScrobbler.doScrobble (/app/src/backend/scrobblers/ListenbrainzScrobbler.ts:87:28)\n at async ListenbrainzScrobbler.scrobble (/app/src/backend/scrobblers/AbstractScrobbleClient.ts:679:28)\n at async ListenbrainzScrobbler.processDeadLetterScrobble (/app/src/backend/scrobblers/AbstractScrobbleClient.ts:920:39)\n at async ListenbrainzScrobbler.processDeadLetterQueue (/app/src/backend/scrobblers/AbstractScrobbleClient.ts:894:43)\n at async PromisePoolExecutor.handler (/app/src/backend/tasks/heartbeatClients.ts:35:21)\n at async PromisePoolExecutor.waitForActiveTaskToFinish (/app/node_modules/@supercharge/promise-pool/dist/promise-pool-executor.js:375:9)\n at async PromisePoolExecutor.waitForProcessingSlot (/app/node_modules/@supercharge/promise-pool/dist/promise-pool-executor.js:368:13)\n at async PromisePoolExecutor.process (/app/node_modules/@supercharge/promise-pool/dist/promise-pool-executor.js:354:13)"; diff --git a/src/stories/pages/ComponentDetailed.stories.tsx b/src/stories/pages/ComponentDetailed.stories.tsx index e05e404f..79857797 100644 --- a/src/stories/pages/ComponentDetailed.stories.tsx +++ b/src/stories/pages/ComponentDetailed.stories.tsx @@ -6,11 +6,10 @@ import { Container } from '@chakra-ui/react'; import { ComponentDetailedDesktop } from "../../client/components/msComponent/MSComponentDetailed.js"; import {Provider} from "../../client/components/Provider.js"; import { generateClientApiJson, generateFakeError, generatePlayApiCommonDetailed, generatePlayApiCommonDetailedList, generateSourceApiJson, generateSourcePlayerJson } from "../../core/tests/utils/apiFixtures.js"; -import { type MsSseEvent, type PlayApiCommonDetailed } from "../../core/Api.js"; +import type {PaginatedResponse, MsSseEvent, PlayApiCommonDetailed} from "../../core/Api.js"; import { SSEProvider } from "@flamefrontend/sse-runtime-react"; import { sseProviderOptions } from "../../client/AppNext.js"; import { faker } from "@faker-js/faker"; -import { type PaginatedResponse } from "../../backend/common/database/drizzle/repositories/BaseRepository.js"; import dayjs from "dayjs"; import { serializeError } from "serialize-error"; import { withRouter, reactRouterParameters } from 'storybook-addon-remix-react-router'; diff --git a/src/stories/pages/ComponentList.stories.tsx b/src/stories/pages/ComponentList.stories.tsx index 7501d202..c117b005 100644 --- a/src/stories/pages/ComponentList.stories.tsx +++ b/src/stories/pages/ComponentList.stories.tsx @@ -7,7 +7,7 @@ import {Provider} from "../../client/components/Provider.js"; import { generateClientApiJson, generateSourceApiJson, generateSourcePlayerJson } from "../../core/tests/utils/apiFixtures.js"; import { generateArray } from "../../core/DataUtils.js"; import { faker } from "@faker-js/faker"; -import { type MsSseEvent } from "../../core/Api.js"; +import type {MsSseEvent} from "../../core/Api.js"; import { SSEProvider } from "@flamefrontend/sse-runtime-react"; import { sseProviderOptions } from "../../client/AppNext.js"; import { withRouter, reactRouterParameters } from 'storybook-addon-remix-react-router'; diff --git a/src/stories/plays/ActivityList.stories.tsx b/src/stories/plays/ActivityList.stories.tsx index 990c5c19..6dff4e10 100644 --- a/src/stories/plays/ActivityList.stories.tsx +++ b/src/stories/plays/ActivityList.stories.tsx @@ -13,9 +13,8 @@ import dayjs from "dayjs"; import qs from 'qs'; import { asJsonPlayObject } from "../../core/PlayMarshalUtils.js"; import { generatePlayApiCommonDetailed, generatePlayApiCommonDetailedList } from "../../core/tests/utils/apiFixtures.js"; -import { type MsSseEvent, type PlayApiCommonDetailed } from "../../core/Api.js"; -import { type PaginatedResponse } from "../../backend/common/database/drizzle/repositories/BaseRepository.js"; -import { type QueryPlaysOptsJson } from '../../backend/common/database/drizzle/repositories/PlayRepository.js'; +import type { PaginatedResponse, QueryPlaysOptsJson} from "../../core/Api.js"; +import type {MsSseEvent, PlayApiCommonDetailed} from "../../core/Api.js"; import { SSEProvider } from "@flamefrontend/sse-runtime-react"; import { sseProviderOptions } from '../../client/AppNext.js'; import { faker } from '@faker-js/faker'; diff --git a/src/stories/plays/PlayInfo.stories.tsx b/src/stories/plays/PlayInfo.stories.tsx index 5ea34b27..a2d40195 100644 --- a/src/stories/plays/PlayInfo.stories.tsx +++ b/src/stories/plays/PlayInfo.stories.tsx @@ -7,7 +7,7 @@ import { Container } from '@chakra-ui/react'; import { generateArtistCredits, generateJsonPlay, withBrainz } from "../../core/tests/utils/PlayTestUtils.js" import clone from "clone"; import { asJsonPlayObject } from '../../core/PlayMarshalUtils.js'; -import { type JsonPlayObject } from "../../core/Atomic.js"; +import type {JsonPlayObject} from "../../core/Atomic.js"; type PropsAndCustomArgs = React.ComponentProps & { includeAlbumArtists?: boolean; diff --git a/src/stories/plays/listFilters/PlayFilters.stories.tsx b/src/stories/plays/listFilters/PlayFilters.stories.tsx index 6872b0e6..4451365e 100644 --- a/src/stories/plays/listFilters/PlayFilters.stories.tsx +++ b/src/stories/plays/listFilters/PlayFilters.stories.tsx @@ -4,7 +4,7 @@ import { Container, Stack } from '@chakra-ui/react'; import {Provider} from "../../../client/components/Provider.js"; import { ListFilters, todayRange } from "../../../client/components/playActivity/ListFilters.js"; -import { type QueryPlaysOptsJson } from "../../../backend/common/database/drizzle/repositories/PlayRepository.js"; +import type {QueryPlaysOptsJson} from "../../../core/Api.js"; const ContainedFilter = (props: any) => { const [filters, setFilter] = useState({ -- 2.51.2