diff --git a/eslint.config.mjs b/eslint.config.mjs index cde2c54f..0e7a9d29 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -36,6 +36,11 @@ export default tsEslint.config( '@typescript-eslint/no-misused-promises': ['off', { checksVoidReturn: false }], '@typescript-eslint/no-unused-vars': ['warn', { argsIgnorePattern: '^_' }], '@typescript-eslint/no-non-null-assertion': 'off', + '@typescript-eslint/consistent-type-imports': ['error', { + fixStyle: 'inline-type-imports', + prefer: 'type-imports', + disallowTypeAnnotations: false, + }], 'importPlugin/first': 'error', 'importPlugin/newline-after-import': 'off', 'importPlugin/no-default-export': 'off', diff --git a/package.json b/package.json index 9bbd3a79..81fcc428 100644 --- a/package.json +++ b/package.json @@ -14,16 +14,16 @@ "url": "https://github.com/th-ch/youtube-music" }, "scripts": { - "test": "playwright test", - "test:debug": "cross-env DEBUG=pw:*,-pw:test:protocol playwright test", - "build": "electron-vite build", + "test": "pnpm playwright test", + "test:debug": "pnpm cross-env DEBUG=pw:*,-pw:test:protocol playwright test", + "build": "pnpm electron-vite build", "vite:inspect": "pnpm clean && electron-vite build --mode development && pnpm exec serve .vite-inspect", - "start": "electron-vite preview", - "start:debug": "cross-env ELECTRON_ENABLE_LOGGING=1 pnpm start", - "dev": "cross-env NODE_OPTIONS=--enable-source-maps electron-vite dev --watch", - "dev:renderer": "cross-env NODE_OPTIONS=--enable-source-maps electron-vite dev", - "dev:debug": "cross-env ELECTRON_ENABLE_LOGGING=1 pnpm dev", - "clean": "del-cli dist && del-cli pack && del-cli .vite-inspect", + "start": "pnpm electron-vite preview", + "start:debug": "pnpm cross-env ELECTRON_ENABLE_LOGGING=1 pnpm start", + "dev": "pnpm cross-env NODE_OPTIONS=--enable-source-maps electron-vite dev --watch", + "dev:renderer": "pnpm cross-env NODE_OPTIONS=--enable-source-maps electron-vite dev", + "dev:debug": "pnpm cross-env ELECTRON_ENABLE_LOGGING=1 pnpm dev", + "clean": "pnpm del-cli dist && pnpm del-cli pack && pnpm del-cli .vite-inspect", "dist": "pnpm clean && pnpm build && pnpm electron-builder --win --mac --linux -p never", "dist:linux": "pnpm clean && pnpm build && pnpm electron-builder --linux -p never", "dist:linux:deb-arm64": "pnpm clean && pnpm build && pnpm electron-builder --linux deb:arm64 -p never", @@ -32,12 +32,12 @@ "dist:mac:arm64": "pnpm clean && pnpm build && pnpm electron-builder --mac dmg:arm64 -p never", "dist:win": "pnpm clean && pnpm build && pnpm electron-builder --win -p never", "dist:win:x64": "pnpm clean && pnpm build && pnpm electron-builder --win nsis-web:x64 -p never", - "lint": "eslint .", - "changelog": "npx --yes auto-changelog", + "lint": "pnpm eslint ./src", + "changelog": "pnpm dlx --yes auto-changelog", "release:linux": "pnpm clean && pnpm build && pnpm electron-builder --linux -p always -c.snap.publish=github", "release:mac": "pnpm clean && pnpm build && pnpm electron-builder --mac -p always", "release:win": "pnpm clean && pnpm build && pnpm electron-builder --win -p always", - "typecheck": "tsc -p tsconfig.json --noEmit" + "typecheck": "pnpm tsc -p tsconfig.json --noEmit" }, "engines": { "node": ">=22", @@ -57,7 +57,7 @@ "@malept/flatpak-bundler@0.4.0": "patches/@malept__flatpak-bundler@0.4.0.patch", "kuromoji@0.1.2": "patches/kuromoji@0.1.2.patch", "file-type@16.5.4": "patches/file-type@16.5.4.patch", - "electron-is": "patches/electron-is.patch" + "electron-is@3.0.0": "patches/electron-is@3.0.0.patch" }, "neverBuiltDependencies": [] }, diff --git a/patches/electron-is.patch b/patches/electron-is@3.0.0.patch similarity index 100% rename from patches/electron-is.patch rename to patches/electron-is@3.0.0.patch diff --git a/src/config/index.ts b/src/config/index.ts index a127eab2..0496c890 100644 --- a/src/config/index.ts +++ b/src/config/index.ts @@ -2,7 +2,7 @@ import { deepmergeCustom } from 'deepmerge-ts'; import defaultConfig from './defaults'; -import store, { IStore } from './store'; +import store, { type IStore } from './store'; import plugins from './plugins'; import { restart } from '@/providers/app-controls'; diff --git a/src/custom-electron-prompt.d.ts b/src/custom-electron-prompt.d.ts index a48ba5e5..57a27dc1 100644 --- a/src/custom-electron-prompt.d.ts +++ b/src/custom-electron-prompt.d.ts @@ -1,5 +1,5 @@ declare module 'custom-electron-prompt' { - import { BrowserWindow } from 'electron'; + import { type BrowserWindow } from 'electron'; export type SelectOptions = Record; diff --git a/src/index.ts b/src/index.ts index a42bb6b0..afd8f992 100644 --- a/src/index.ts +++ b/src/index.ts @@ -15,7 +15,7 @@ import { type BrowserWindowConstructorOptions, } from 'electron'; import enhanceWebRequest, { - BetterSession, + type BetterSession, } from '@jellybrick/electron-better-web-request'; import is from 'electron-is'; import unhandled from 'electron-unhandled'; diff --git a/src/loader/main.ts b/src/loader/main.ts index b6b5f5ea..e02629f1 100644 --- a/src/loader/main.ts +++ b/src/loader/main.ts @@ -1,4 +1,4 @@ -import { BrowserWindow, ipcMain } from 'electron'; +import { type BrowserWindow, ipcMain } from 'electron'; import { deepmerge } from 'deepmerge-ts'; import { allPlugins, mainPlugins } from 'virtual:plugins'; diff --git a/src/menu.ts b/src/menu.ts index 9c81bee7..1d7818c7 100644 --- a/src/menu.ts +++ b/src/menu.ts @@ -1,11 +1,11 @@ import is from 'electron-is'; import { app, - BrowserWindow, + type BrowserWindow, clipboard, dialog, Menu, - MenuItem, + type MenuItem, shell, } from 'electron'; import prompt from 'custom-electron-prompt'; diff --git a/src/plugins/album-color-theme/index.ts b/src/plugins/album-color-theme/index.ts index 339305cf..2e50466b 100644 --- a/src/plugins/album-color-theme/index.ts +++ b/src/plugins/album-color-theme/index.ts @@ -1,5 +1,5 @@ import { FastAverageColor } from 'fast-average-color'; -import Color, { ColorInstance } from 'color'; +import Color, { type ColorInstance } from 'color'; import style from './style.css?inline'; diff --git a/src/plugins/ambient-mode/index.ts b/src/plugins/ambient-mode/index.ts index a36feb5f..10fc895d 100644 --- a/src/plugins/ambient-mode/index.ts +++ b/src/plugins/ambient-mode/index.ts @@ -3,7 +3,7 @@ import style from './style.css?inline'; import { t } from '@/i18n'; import { createPlugin } from '@/utils'; import { menu } from './menu'; -import { AmbientModePluginConfig } from './types'; +import { type AmbientModePluginConfig } from './types'; import { waitForElement } from '@/utils/wait-for-element'; const defaultConfig: AmbientModePluginConfig = { diff --git a/src/plugins/ambient-mode/menu.ts b/src/plugins/ambient-mode/menu.ts index 3c2ae97e..5acb6c9e 100644 --- a/src/plugins/ambient-mode/menu.ts +++ b/src/plugins/ambient-mode/menu.ts @@ -1,8 +1,8 @@ -import { MenuItemConstructorOptions } from 'electron'; +import { type MenuItemConstructorOptions } from 'electron'; import { t } from '@/i18n'; -import { MenuContext } from '@/types/contexts'; -import { AmbientModePluginConfig } from './types'; +import { type MenuContext } from '@/types/contexts'; +import { type AmbientModePluginConfig } from './types'; export interface menuParameters { getConfig: () => AmbientModePluginConfig | Promise; diff --git a/src/plugins/api-server/backend/types.ts b/src/plugins/api-server/backend/types.ts index ec7b91f9..691216db 100644 --- a/src/plugins/api-server/backend/types.ts +++ b/src/plugins/api-server/backend/types.ts @@ -1,5 +1,5 @@ -import { OpenAPIHono as Hono } from '@hono/zod-openapi'; -import { serve } from '@hono/node-server'; +import { type OpenAPIHono as Hono } from '@hono/zod-openapi'; +import { type serve } from '@hono/node-server'; import type { BackendContext } from '@/types/contexts'; import type { SongInfo } from '@/providers/song-info'; diff --git a/src/plugins/auth-proxy-adapter/backend/index.ts b/src/plugins/auth-proxy-adapter/backend/index.ts index 34ba2dce..16d6876e 100644 --- a/src/plugins/auth-proxy-adapter/backend/index.ts +++ b/src/plugins/auth-proxy-adapter/backend/index.ts @@ -1,16 +1,16 @@ import net from 'net'; -import { SocksClient, SocksClientOptions } from 'socks'; +import { SocksClient, type SocksClientOptions } from 'socks'; import is from 'electron-is'; import { createBackend, LoggerPrefix } from '@/utils'; -import { BackendType } from './types'; +import { type BackendType } from './types'; import config from '@/config'; -import { AuthProxyConfig, defaultAuthProxyConfig } from '../config'; +import { type AuthProxyConfig, defaultAuthProxyConfig } from '../config'; import type { BackendContext } from '@/types/contexts'; diff --git a/src/plugins/auth-proxy-adapter/backend/types.ts b/src/plugins/auth-proxy-adapter/backend/types.ts index 99599ef3..901fc6cd 100644 --- a/src/plugins/auth-proxy-adapter/backend/types.ts +++ b/src/plugins/auth-proxy-adapter/backend/types.ts @@ -1,5 +1,4 @@ -import net from 'net'; - +import type net from 'net'; import type { AuthProxyConfig } from '../config'; import type { Server } from 'http'; diff --git a/src/plugins/captions-selector/index.ts b/src/plugins/captions-selector/index.ts index 50252fcb..85c49a5d 100644 --- a/src/plugins/captions-selector/index.ts +++ b/src/plugins/captions-selector/index.ts @@ -2,7 +2,10 @@ import { createPlugin } from '@/utils'; import { t } from '@/i18n'; import backend from './back'; -import renderer, { CaptionsSelectorConfig, LanguageOptions } from './renderer'; +import renderer, { + type CaptionsSelectorConfig, + type LanguageOptions, +} from './renderer'; import type { YoutubePlayer } from '@/types/youtube-player'; diff --git a/src/plugins/crossfade/index.ts b/src/plugins/crossfade/index.ts index b663c9e9..47586c99 100644 --- a/src/plugins/crossfade/index.ts +++ b/src/plugins/crossfade/index.ts @@ -1,6 +1,5 @@ import { Innertube } from 'youtubei.js'; -import { BrowserWindow } from 'electron'; import prompt from 'custom-electron-prompt'; import { Howl } from 'howler'; @@ -12,6 +11,7 @@ import { VolumeFader } from './fader'; import { t } from '@/i18n'; +import type { BrowserWindow } from 'electron'; import type { RendererContext } from '@/types/contexts'; export type CrossfadePluginConfig = { diff --git a/src/plugins/discord/menu.ts b/src/plugins/discord/menu.ts index bcdf68d9..640db72f 100644 --- a/src/plugins/discord/menu.ts +++ b/src/plugins/discord/menu.ts @@ -8,21 +8,25 @@ import { setMenuOptions } from '@/config/plugins'; import { t } from '@/i18n'; +import { DiscordStatusDisplayType } from './constants'; + import type { MenuContext } from '@/types/contexts'; import type { DiscordPluginConfig } from './index'; import type { MenuTemplate } from '@/menu'; -import { DiscordStatusDisplayType } from './constants'; const registerRefreshOnce = singleton((refreshMenu: () => void) => { discordService?.registerRefreshCallback(refreshMenu); }); const DiscordStatusDisplayTypeLabels = { - [DiscordStatusDisplayType.YOUTUBE_MUSIC]: "plugins.discord.menu.set-status-display-type.submenu.youtube-music", - [DiscordStatusDisplayType.ARTIST]: "plugins.discord.menu.set-status-display-type.submenu.artist", - [DiscordStatusDisplayType.TITLE]: "plugins.discord.menu.set-status-display-type.submenu.title", -} + [DiscordStatusDisplayType.YOUTUBE_MUSIC]: + 'plugins.discord.menu.set-status-display-type.submenu.youtube-music', + [DiscordStatusDisplayType.ARTIST]: + 'plugins.discord.menu.set-status-display-type.submenu.artist', + [DiscordStatusDisplayType.TITLE]: + 'plugins.discord.menu.set-status-display-type.submenu.title', +}; export const onMenu = async ({ window, @@ -101,16 +105,18 @@ export const onMenu = async ({ }, { label: t('plugins.discord.menu.set-status-display-type.label'), - submenu: Object.values(DiscordStatusDisplayType).map((statusDisplayType) => ({ - label: t(DiscordStatusDisplayTypeLabels[statusDisplayType]), - type: 'radio', - checked: config.statusDisplayType == statusDisplayType, - click() { - setConfig({ - statusDisplayType - }); - }, - })), + submenu: Object.values(DiscordStatusDisplayType).map( + (statusDisplayType) => ({ + label: t(DiscordStatusDisplayTypeLabels[statusDisplayType]), + type: 'radio', + checked: config.statusDisplayType == statusDisplayType, + click() { + setConfig({ + statusDisplayType, + }); + }, + }), + ), }, ]; }; diff --git a/src/plugins/discord/timer-manager.ts b/src/plugins/discord/timer-manager.ts index 12581799..5adbd668 100644 --- a/src/plugins/discord/timer-manager.ts +++ b/src/plugins/discord/timer-manager.ts @@ -1,4 +1,4 @@ -import { TimerKey } from './constants'; +import type { TimerKey } from './constants'; /** * Manages NodeJS Timers, ensuring only one timer exists per key. diff --git a/src/plugins/downloader/index.ts b/src/plugins/downloader/index.ts index 4898f590..914f7db7 100644 --- a/src/plugins/downloader/index.ts +++ b/src/plugins/downloader/index.ts @@ -1,4 +1,4 @@ -import { DefaultPresetList, Preset } from './types'; +import { DefaultPresetList, type Preset } from './types'; import style from './style.css?inline'; diff --git a/src/plugins/downloader/main/index.ts b/src/plugins/downloader/main/index.ts index bd93f909..fe3e3629 100644 --- a/src/plugins/downloader/main/index.ts +++ b/src/plugins/downloader/main/index.ts @@ -2,12 +2,12 @@ import { existsSync, mkdirSync, writeFileSync } from 'node:fs'; import { join } from 'node:path'; import { randomBytes } from 'node:crypto'; -import { app, BrowserWindow, dialog, ipcMain } from 'electron'; +import { app, type BrowserWindow, dialog, ipcMain } from 'electron'; import { Innertube, UniversalCache, Utils, YTNodes } from 'youtubei.js'; import is from 'electron-is'; import filenamify from 'filenamify'; import { Mutex } from 'async-mutex'; -import NodeID3, { TagConstants } from 'node-id3'; +import * as NodeID3 from 'node-id3'; import { BG, type BgConfig } from 'bgutils-js'; import { lazy } from 'lazy-var'; @@ -590,7 +590,7 @@ async function writeID3( tags.image = { mime: 'image/png', type: { - id: TagConstants.AttachedPicture.PictureType.FRONT_COVER, + id: NodeID3.TagConstants.AttachedPicture.PictureType.FRONT_COVER, }, description: 'thumbnail', imageBuffer: coverBuffer, diff --git a/src/plugins/downloader/main/utils.ts b/src/plugins/downloader/main/utils.ts index cd44e7b0..59c168c8 100644 --- a/src/plugins/downloader/main/utils.ts +++ b/src/plugins/downloader/main/utils.ts @@ -1,4 +1,4 @@ -import { app, BrowserWindow } from 'electron'; +import { app, type BrowserWindow } from 'electron'; import is from 'electron-is'; export const getFolder = (customFolder?: string) => diff --git a/src/plugins/equalizer/index.ts b/src/plugins/equalizer/index.ts index 7e137d9c..c50cb273 100644 --- a/src/plugins/equalizer/index.ts +++ b/src/plugins/equalizer/index.ts @@ -1,8 +1,15 @@ import { createPlugin } from '@/utils'; import { t } from '@/i18n'; -import { MenuContext } from '@/types/contexts'; -import { MenuTemplate } from '@/menu'; -import { defaultPresets, presetConfigs, Preset, FilterConfig } from './presets'; + +import { + defaultPresets, + presetConfigs, + type Preset, + type FilterConfig, +} from './presets'; + +import type { MenuContext } from '@/types/contexts'; +import type { MenuTemplate } from '@/menu'; export type EqualizerPluginConfig = { enabled: boolean; diff --git a/src/plugins/in-app-menu/main.ts b/src/plugins/in-app-menu/main.ts index 71479fab..3a633b4b 100644 --- a/src/plugins/in-app-menu/main.ts +++ b/src/plugins/in-app-menu/main.ts @@ -3,10 +3,10 @@ import { register } from 'electron-localshortcut'; import { BrowserWindow, Menu, - MenuItem, + type MenuItem, ipcMain, nativeImage, - WebContents, + type WebContents, } from 'electron'; import type { BackendContext } from '@/types/contexts'; diff --git a/src/plugins/in-app-menu/renderer.tsx b/src/plugins/in-app-menu/renderer.tsx index 522d0efe..76af13e9 100644 --- a/src/plugins/in-app-menu/renderer.tsx +++ b/src/plugins/in-app-menu/renderer.tsx @@ -2,7 +2,7 @@ import { createSignal } from 'solid-js'; import { render } from 'solid-js/web'; import { TitleBar } from './renderer/TitleBar'; -import { defaultInAppMenuConfig, InAppMenuConfig } from './constants'; +import { defaultInAppMenuConfig, type InAppMenuConfig } from './constants'; import type { RendererContext } from '@/types/contexts'; diff --git a/src/plugins/in-app-menu/renderer/IconButton.tsx b/src/plugins/in-app-menu/renderer/IconButton.tsx index 4b705fad..88520cd2 100644 --- a/src/plugins/in-app-menu/renderer/IconButton.tsx +++ b/src/plugins/in-app-menu/renderer/IconButton.tsx @@ -1,4 +1,4 @@ -import { JSX } from 'solid-js'; +import { type JSX } from 'solid-js'; import { css } from 'solid-styled-components'; import { cacheNoArgs } from '@/providers/decorators'; diff --git a/src/plugins/in-app-menu/renderer/MenuButton.tsx b/src/plugins/in-app-menu/renderer/MenuButton.tsx index 7d9f6a1d..a38e5a7d 100644 --- a/src/plugins/in-app-menu/renderer/MenuButton.tsx +++ b/src/plugins/in-app-menu/renderer/MenuButton.tsx @@ -1,4 +1,4 @@ -import { JSX, splitProps } from 'solid-js'; +import { type JSX, splitProps } from 'solid-js'; import { css } from 'solid-styled-components'; import { cacheNoArgs } from '@/providers/decorators'; diff --git a/src/plugins/in-app-menu/renderer/Panel.tsx b/src/plugins/in-app-menu/renderer/Panel.tsx index b7813a16..d039ac20 100644 --- a/src/plugins/in-app-menu/renderer/Panel.tsx +++ b/src/plugins/in-app-menu/renderer/Panel.tsx @@ -1,4 +1,4 @@ -import { createSignal, JSX, Show, splitProps, mergeProps } from 'solid-js'; +import { createSignal, type JSX, Show, splitProps, mergeProps } from 'solid-js'; import { Portal } from 'solid-js/web'; import { css } from 'solid-styled-components'; import { Transition } from 'solid-transition-group'; @@ -6,7 +6,7 @@ import { autoUpdate, flip, offset, - OffsetOptions, + type OffsetOptions, size, } from '@floating-ui/dom'; import { useFloating } from 'solid-floating-ui'; diff --git a/src/plugins/in-app-menu/renderer/PanelItem.tsx b/src/plugins/in-app-menu/renderer/PanelItem.tsx index 583b5f95..48ce271b 100644 --- a/src/plugins/in-app-menu/renderer/PanelItem.tsx +++ b/src/plugins/in-app-menu/renderer/PanelItem.tsx @@ -1,5 +1,5 @@ import { createSignal, Match, Show, Switch } from 'solid-js'; -import { JSX } from 'solid-js/jsx-runtime'; +import { type JSX } from 'solid-js/jsx-runtime'; import { css } from 'solid-styled-components'; import { Portal } from 'solid-js/web'; diff --git a/src/plugins/in-app-menu/renderer/TitleBar.tsx b/src/plugins/in-app-menu/renderer/TitleBar.tsx index 61f9f17f..4934483e 100644 --- a/src/plugins/in-app-menu/renderer/TitleBar.tsx +++ b/src/plugins/in-app-menu/renderer/TitleBar.tsx @@ -1,4 +1,4 @@ -import { Menu, MenuItem } from 'electron'; +import { type Menu, type MenuItem } from 'electron'; import { createEffect, createResource, diff --git a/src/plugins/music-together/connection.ts b/src/plugins/music-together/connection.ts index 4ce96a32..a85ab061 100644 --- a/src/plugins/music-together/connection.ts +++ b/src/plugins/music-together/connection.ts @@ -1,4 +1,9 @@ -import { DataConnection, Peer, PeerError, PeerErrorType } from 'peerjs'; +import { + type DataConnection, + Peer, + type PeerError, + PeerErrorType, +} from 'peerjs'; import delay from 'delay'; import type { Permission, Profile, VideoData } from './types'; diff --git a/src/plugins/music-together/index.ts b/src/plugins/music-together/index.ts index 36cc46ca..59a784aa 100644 --- a/src/plugins/music-together/index.ts +++ b/src/plugins/music-together/index.ts @@ -1,10 +1,9 @@ import prompt from 'custom-electron-prompt'; -import { DataConnection } from 'peerjs'; - import { t } from '@/i18n'; import { createPlugin } from '@/utils'; import promptOptions from '@/providers/prompt-options'; +import { waitForElement } from '@/utils/wait-for-element'; import { getDefaultProfile, @@ -21,8 +20,7 @@ import { createSettingPopup } from './ui/setting'; import settingHTML from './templates/setting.html?raw'; import style from './style.css?inline'; -import { waitForElement } from '@/utils/wait-for-element'; - +import type { DataConnection } from 'peerjs'; import type { YoutubePlayer } from '@/types/youtube-player'; import type { RendererContext } from '@/types/contexts'; import type { VideoDataChanged } from '@/types/video-data-changed'; diff --git a/src/plugins/music-together/queue/utils.ts b/src/plugins/music-together/queue/utils.ts index f68f7cae..f11fcfea 100644 --- a/src/plugins/music-together/queue/utils.ts +++ b/src/plugins/music-together/queue/utils.ts @@ -1,4 +1,4 @@ -import { +import type { ItemPlaylistPanelVideoRenderer, PlaylistPanelVideoWrapperRenderer, QueueItem, diff --git a/src/plugins/notifications/interactive.ts b/src/plugins/notifications/interactive.ts index 59f8c628..33d7e900 100644 --- a/src/plugins/notifications/interactive.ts +++ b/src/plugins/notifications/interactive.ts @@ -1,4 +1,4 @@ -import { app, BrowserWindow, Notification } from 'electron'; +import { app, type BrowserWindow, Notification } from 'electron'; import playIcon from '@assets/media-icons-black/play.png?asset&asarUnpack'; import pauseIcon from '@assets/media-icons-black/pause.png?asset&asarUnpack'; diff --git a/src/plugins/notifications/menu.ts b/src/plugins/notifications/menu.ts index 5a9c8f93..a9cdfe5e 100644 --- a/src/plugins/notifications/menu.ts +++ b/src/plugins/notifications/menu.ts @@ -1,5 +1,5 @@ import is from 'electron-is'; -import { MenuItem } from 'electron'; +import { type MenuItem } from 'electron'; import { snakeToCamel, ToastStyles, urgencyLevels } from './utils'; diff --git a/src/plugins/notifications/utils.ts b/src/plugins/notifications/utils.ts index 2db71197..39a367ff 100644 --- a/src/plugins/notifications/utils.ts +++ b/src/plugins/notifications/utils.ts @@ -1,11 +1,11 @@ import path from 'node:path'; import fs from 'node:fs'; -import { app, NativeImage } from 'electron'; +import { app, type NativeImage } from 'electron'; import youtubeMusicIcon from '@assets/youtube-music.png?asset&asarUnpack'; -import { SongInfo } from '@/providers/song-info'; +import { type SongInfo } from '@/providers/song-info'; import type { NotificationsPluginConfig } from './index'; diff --git a/src/plugins/precise-volume/index.ts b/src/plugins/precise-volume/index.ts index 69e8c51b..5c90a122 100644 --- a/src/plugins/precise-volume/index.ts +++ b/src/plugins/precise-volume/index.ts @@ -1,5 +1,5 @@ -import { globalShortcut, MenuItem } from 'electron'; -import prompt, { KeybindOptions } from 'custom-electron-prompt'; +import { globalShortcut, type MenuItem } from 'electron'; +import prompt, { type KeybindOptions } from 'custom-electron-prompt'; import hudStyle from './volume-hud.css?inline'; import { createPlugin } from '@/utils'; diff --git a/src/plugins/precise-volume/renderer.ts b/src/plugins/precise-volume/renderer.ts index 084b2bfa..13e0530e 100644 --- a/src/plugins/precise-volume/renderer.ts +++ b/src/plugins/precise-volume/renderer.ts @@ -66,7 +66,7 @@ export const onPlayerApiReady = async ( injectVolumeHud(noVid); if (!noVid) { setupVideoPlayerOnwheel(); - if (!await window.mainConfig.plugins.isEnabled('video-toggle')) { + if (!(await window.mainConfig.plugins.isEnabled('video-toggle'))) { // Video-toggle handles hud positioning on its own const videoMode = () => api.getPlayerResponse().videoDetails?.musicVideoType !== diff --git a/src/plugins/scrobbler/main.ts b/src/plugins/scrobbler/main.ts index 91a02a75..5b842f32 100644 --- a/src/plugins/scrobbler/main.ts +++ b/src/plugins/scrobbler/main.ts @@ -1,4 +1,4 @@ -import { BrowserWindow } from 'electron'; +import { type BrowserWindow } from 'electron'; import registerCallback, { MediaType, diff --git a/src/plugins/scrobbler/menu.ts b/src/plugins/scrobbler/menu.ts index 08a5702d..279741b7 100644 --- a/src/plugins/scrobbler/menu.ts +++ b/src/plugins/scrobbler/menu.ts @@ -1,12 +1,12 @@ import prompt from 'custom-electron-prompt'; -import { BrowserWindow } from 'electron'; +import { type BrowserWindow } from 'electron'; import { t } from '@/i18n'; import promptOptions from '@/providers/prompt-options'; -import { ScrobblerPluginConfig } from './index'; -import { SetConfType, backend } from './main'; +import { type ScrobblerPluginConfig } from './index'; +import { type SetConfType, backend } from './main'; import type { MenuContext } from '@/types/contexts'; import type { MenuTemplate } from '@/menu'; diff --git a/src/plugins/shortcuts/main.ts b/src/plugins/shortcuts/main.ts index 9c074c57..b63be7a0 100644 --- a/src/plugins/shortcuts/main.ts +++ b/src/plugins/shortcuts/main.ts @@ -1,4 +1,4 @@ -import { BrowserWindow, globalShortcut } from 'electron'; +import { type BrowserWindow, globalShortcut } from 'electron'; import is from 'electron-is'; import { register as registerElectronLocalShortcut } from 'electron-localshortcut'; diff --git a/src/plugins/shortcuts/menu.ts b/src/plugins/shortcuts/menu.ts index fbfc151f..e4b5474a 100644 --- a/src/plugins/shortcuts/menu.ts +++ b/src/plugins/shortcuts/menu.ts @@ -1,4 +1,4 @@ -import prompt, { KeybindOptions } from 'custom-electron-prompt'; +import prompt, { type KeybindOptions } from 'custom-electron-prompt'; import promptOptions from '@/providers/prompt-options'; diff --git a/src/plugins/shortcuts/mpris-service.d.ts b/src/plugins/shortcuts/mpris-service.d.ts index d598026a..44281819 100644 --- a/src/plugins/shortcuts/mpris-service.d.ts +++ b/src/plugins/shortcuts/mpris-service.d.ts @@ -1,7 +1,7 @@ declare module '@jellybrick/mpris-service' { import { EventEmitter } from 'events'; - import { interface as dbusInterface } from '@jellybrick/dbus-next'; + import { type interface as dbusInterface } from '@jellybrick/dbus-next'; interface RootInterfaceOptions { identity?: string; diff --git a/src/plugins/shortcuts/mpris.ts b/src/plugins/shortcuts/mpris.ts index 3cd4a8ed..5d0fc929 100644 --- a/src/plugins/shortcuts/mpris.ts +++ b/src/plugins/shortcuts/mpris.ts @@ -1,17 +1,17 @@ -import { BrowserWindow, ipcMain } from 'electron'; +import { type BrowserWindow, ipcMain } from 'electron'; import MprisPlayer, { LOOP_STATUS_NONE, LOOP_STATUS_PLAYLIST, LOOP_STATUS_TRACK, - LoopStatus, + type LoopStatus, PLAYBACK_STATUS_PAUSED, PLAYBACK_STATUS_PLAYING, PLAYBACK_STATUS_STOPPED, type PlayBackStatus, type PlayerOptions, type Position, - Track, + type Track, } from '@jellybrick/mpris-service'; import registerCallback, { diff --git a/src/plugins/sponsorblock/segments.ts b/src/plugins/sponsorblock/segments.ts index e6d38666..0023e9dc 100644 --- a/src/plugins/sponsorblock/segments.ts +++ b/src/plugins/sponsorblock/segments.ts @@ -1,5 +1,5 @@ // Segments are an array [ [start, end], … ] -import { Segment } from './types'; +import type { Segment } from './types'; export const sortSegments = (segments: Segment[]) => { segments.sort((segment1, segment2) => diff --git a/src/plugins/synced-lyrics/providers/index.ts b/src/plugins/synced-lyrics/providers/index.ts index b0fb1e5b..1de4768c 100644 --- a/src/plugins/synced-lyrics/providers/index.ts +++ b/src/plugins/synced-lyrics/providers/index.ts @@ -2,8 +2,6 @@ import { createStore } from 'solid-js/store'; import { createMemo } from 'solid-js'; -import { SongInfo } from '@/providers/song-info'; - import { LRCLib } from './LRCLib'; import { LyricsGenius } from './LyricsGenius'; import { MusixMatch } from './MusixMatch'; @@ -12,6 +10,7 @@ import { YTMusic } from './YTMusic'; import { getSongInfo } from '@/providers/song-info-front'; import type { LyricProvider, LyricResult } from '../types'; +import type { SongInfo } from '@/providers/song-info'; export const providers = { YTMusic: new YTMusic(), diff --git a/src/plugins/synced-lyrics/renderer/components/LyricsPicker.tsx b/src/plugins/synced-lyrics/renderer/components/LyricsPicker.tsx index 87a49178..9e18317a 100644 --- a/src/plugins/synced-lyrics/renderer/components/LyricsPicker.tsx +++ b/src/plugins/synced-lyrics/renderer/components/LyricsPicker.tsx @@ -7,16 +7,16 @@ import { Match, onCleanup, onMount, - Setter, + type Setter, Switch, } from 'solid-js'; import { currentLyrics, lyricsStore, - ProviderName, + type ProviderName, providerNames, - ProviderState, + type ProviderState, setLyricsStore, } from '../../providers'; diff --git a/src/plugins/synced-lyrics/renderer/components/SyncedLine.tsx b/src/plugins/synced-lyrics/renderer/components/SyncedLine.tsx index 21aa30be..1f087714 100644 --- a/src/plugins/synced-lyrics/renderer/components/SyncedLine.tsx +++ b/src/plugins/synced-lyrics/renderer/components/SyncedLine.tsx @@ -1,8 +1,8 @@ import { createEffect, createMemo, For, Show, createSignal } from 'solid-js'; -import { VirtualizerHandle } from 'virtua/solid'; +import { type VirtualizerHandle } from 'virtua/solid'; -import { LineLyrics } from '@/plugins/synced-lyrics/types'; +import { type LineLyrics } from '@/plugins/synced-lyrics/types'; import { config } from '../renderer'; import { _ytAPI } from '..'; diff --git a/src/plugins/taskbar-mediacontrol/index.ts b/src/plugins/taskbar-mediacontrol/index.ts index da33c1b4..f34991e0 100644 --- a/src/plugins/taskbar-mediacontrol/index.ts +++ b/src/plugins/taskbar-mediacontrol/index.ts @@ -12,7 +12,7 @@ import registerCallback, { type SongInfo, SongInfoEvent, } from '@/providers/song-info'; -import { mediaIcons } from '@/types/media-icons'; +import { type mediaIcons } from '@/types/media-icons'; import { t } from '@/i18n'; import { Platform } from '@/types/plugins'; diff --git a/src/plugins/video-toggle/index.tsx b/src/plugins/video-toggle/index.tsx index 3421443f..07ea508a 100644 --- a/src/plugins/video-toggle/index.tsx +++ b/src/plugins/video-toggle/index.tsx @@ -7,9 +7,9 @@ import buttonSwitcherStyle from './button-switcher.css?inline'; import { createPlugin } from '@/utils'; import { moveVolumeHud as preciseVolumeMoveVolumeHud } from '@/plugins/precise-volume/renderer'; -import { ThumbnailElement } from '@/types/get-player-response'; +import { type ThumbnailElement } from '@/types/get-player-response'; import { t } from '@/i18n'; -import { MenuTemplate } from '@/menu'; +import { type MenuTemplate } from '@/menu'; import { VideoSwitchButton } from './templates/video-switch-button'; diff --git a/src/plugins/visualizer/index.ts b/src/plugins/visualizer/index.ts index 722b8123..0d1dbbaa 100644 --- a/src/plugins/visualizer/index.ts +++ b/src/plugins/visualizer/index.ts @@ -1,6 +1,6 @@ import emptyStyle from './empty-player.css?inline'; import { createPlugin } from '@/utils'; -import { Visualizer } from './visualizers/visualizer'; +import { type Visualizer } from './visualizers/visualizer'; import { ButterchurnVisualizer as butterchurn, VudioVisualizer as vudio, diff --git a/src/preload.ts b/src/preload.ts index 81c5a669..e977bbeb 100644 --- a/src/preload.ts +++ b/src/preload.ts @@ -1,7 +1,7 @@ import { contextBridge, ipcRenderer, - IpcRendererEvent, + type IpcRendererEvent, webFrame, } from 'electron'; import is from 'electron-is'; diff --git a/src/providers/protocol-handler.ts b/src/providers/protocol-handler.ts index 7ecee01f..cc30e91a 100644 --- a/src/providers/protocol-handler.ts +++ b/src/providers/protocol-handler.ts @@ -1,6 +1,6 @@ import path from 'node:path'; -import { app, BrowserWindow } from 'electron'; +import { app, type BrowserWindow } from 'electron'; import getSongControls from './song-controls'; diff --git a/src/providers/song-controls.ts b/src/providers/song-controls.ts index 45f71569..59f915ba 100644 --- a/src/providers/song-controls.ts +++ b/src/providers/song-controls.ts @@ -1,5 +1,5 @@ // This is used for to control the songs -import { BrowserWindow, ipcMain } from 'electron'; +import { type BrowserWindow, ipcMain } from 'electron'; // see protocol-handler.ts type ArgsType = T | string[] | undefined; diff --git a/src/providers/song-info.ts b/src/providers/song-info.ts index 1c77ed30..4efbc414 100644 --- a/src/providers/song-info.ts +++ b/src/providers/song-info.ts @@ -1,4 +1,4 @@ -import { BrowserWindow, ipcMain, nativeImage, net } from 'electron'; +import { type BrowserWindow, ipcMain, nativeImage, net } from 'electron'; import { Mutex } from 'async-mutex'; diff --git a/src/reset.d.ts b/src/reset.d.ts index e2818940..262e470b 100644 --- a/src/reset.d.ts +++ b/src/reset.d.ts @@ -19,7 +19,7 @@ declare global { 'videodatachange': CustomEvent; } - declare var electronIs: typeof import('electron-is') + declare var electronIs: typeof import('electron-is'); interface Window { trustedTypes?: typeof trustedTypes; diff --git a/src/types/plugins.ts b/src/types/plugins.ts index d8d07dfe..1acb3c60 100644 --- a/src/types/plugins.ts +++ b/src/types/plugins.ts @@ -39,10 +39,10 @@ export type RendererPluginLifecycle = | RendererPluginLifecycleExtra; export enum Platform { - Windows = 1 << 0, - macOS = 1 << 1, - Linux = 1 << 2, - Freebsd = 1 << 3 + Windows = 1 << 0, + macOS = 1 << 1, + Linux = 1 << 2, + Freebsd = 1 << 3, } export interface PluginDef< diff --git a/src/types/youtube-player.ts b/src/types/youtube-player.ts index 5a9771f3..3034bf1a 100644 --- a/src/types/youtube-player.ts +++ b/src/types/youtube-player.ts @@ -1,9 +1,9 @@ // TODO: fully type definitions for youtube-player -import { VideoDetails } from './video-details'; -import { GetPlayerResponse } from './get-player-response'; -import { PlayerAPIEvents } from './player-api-events'; -import { WatchNextResponse } from '@/types/youtube-music-desktop-internal'; +import type { VideoDetails } from './video-details'; +import type { GetPlayerResponse } from './get-player-response'; +import type { PlayerAPIEvents } from './player-api-events'; +import type { WatchNextResponse } from '@/types/youtube-music-desktop-internal'; export interface YoutubePlayer { getInternalApiInterface: ( diff --git a/src/yt-web-components.d.ts b/src/yt-web-components.d.ts index 3c190f7f..64489065 100644 --- a/src/yt-web-components.d.ts +++ b/src/yt-web-components.d.ts @@ -1,5 +1,4 @@ -import { Icons } from '@/types/icons'; - +import type { Icons } from '@/types/icons'; import type { ComponentProps } from 'solid-js'; declare module 'solid-js' {