refactor(runtime): remove dead symbols from composition roots

This commit is contained in:
2026-03-06 10:56:20 -08:00
parent 85bd6c6ec2
commit e659b5d8f4
6 changed files with 17 additions and 151 deletions

View File

@@ -1,5 +1,4 @@
import fs from 'node:fs'; import fs from 'node:fs';
import path from 'node:path';
import { fail, log } from '../log.js'; import { fail, log } from '../log.js';
import { commandExists, isYoutubeTarget, realpathMaybe, resolvePathMaybe } from '../util.js'; import { commandExists, isYoutubeTarget, realpathMaybe, resolvePathMaybe } from '../util.js';
import { collectVideos, showFzfMenu, showRofiMenu } from '../picker.js'; import { collectVideos, showFzfMenu, showRofiMenu } from '../picker.js';

View File

@@ -458,14 +458,6 @@ export class AnkiIntegration {
return this.config.nPlusOne?.highlightEnabled === true; return this.config.nPlusOne?.highlightEnabled === true;
} }
private startKnownWordCacheLifecycle(): void {
this.knownWordCache.startLifecycle();
}
private stopKnownWordCacheLifecycle(): void {
this.knownWordCache.stopLifecycle();
}
private getConfiguredAnkiTags(): string[] { private getConfiguredAnkiTags(): string[] {
if (!Array.isArray(this.config.tags)) { if (!Array.isArray(this.config.tags)) {
return []; return [];

View File

@@ -80,7 +80,7 @@ export class FieldGroupingWorkflow {
async handleManual( async handleManual(
originalNoteId: number, originalNoteId: number,
newNoteId: number, _newNoteId: number,
newNoteInfo: FieldGroupingWorkflowNoteInfo, newNoteInfo: FieldGroupingWorkflowNoteInfo,
): Promise<boolean> { ): Promise<boolean> {
const callback = await this.resolveFieldGroupingCallback(); const callback = await this.resolveFieldGroupingCallback();

View File

@@ -8,7 +8,6 @@ import {
importYomitanDictionaryFromZip, importYomitanDictionaryFromZip,
deleteYomitanDictionaryByTitle, deleteYomitanDictionaryByTitle,
removeYomitanDictionarySettings, removeYomitanDictionarySettings,
requestYomitanParseResults,
requestYomitanScanTokens, requestYomitanScanTokens,
requestYomitanTermFrequencies, requestYomitanTermFrequencies,
syncYomitanDefaultAnkiServer, syncYomitanDefaultAnkiServer,

View File

@@ -92,8 +92,6 @@ import type {
SecondarySubMode, SecondarySubMode,
SubtitleData, SubtitleData,
SubtitlePosition, SubtitlePosition,
SubsyncManualRunRequest,
SubsyncResult,
WindowGeometry, WindowGeometry,
} from './types'; } from './types';
import { AnkiIntegration } from './anki-integration'; import { AnkiIntegration } from './anki-integration';
@@ -116,36 +114,15 @@ import {
failStartupFromConfig, failStartupFromConfig,
} from './main/config-validation'; } from './main/config-validation';
import { import {
buildAnilistAttemptKey,
buildAnilistSetupUrl, buildAnilistSetupUrl,
consumeAnilistSetupCallbackUrl, consumeAnilistSetupCallbackUrl,
createAnilistStateRuntime, createAnilistStateRuntime,
createBuildGetAnilistMediaGuessRuntimeStateMainDepsHandler,
createBuildGetCurrentAnilistMediaKeyMainDepsHandler,
createBuildMaybeProbeAnilistDurationMainDepsHandler,
createBuildMaybeRunAnilistPostWatchUpdateMainDepsHandler,
createBuildOpenAnilistSetupWindowMainDepsHandler, createBuildOpenAnilistSetupWindowMainDepsHandler,
createBuildProcessNextAnilistRetryUpdateMainDepsHandler,
createBuildRefreshAnilistClientSecretStateMainDepsHandler,
createBuildResetAnilistMediaGuessStateMainDepsHandler,
createBuildResetAnilistMediaTrackingMainDepsHandler,
createBuildSetAnilistMediaGuessRuntimeStateMainDepsHandler,
createEnsureAnilistMediaGuessHandler,
createGetAnilistMediaGuessRuntimeStateHandler,
createGetCurrentAnilistMediaKeyHandler,
createMaybeFocusExistingAnilistSetupWindowHandler, createMaybeFocusExistingAnilistSetupWindowHandler,
createMaybeProbeAnilistDurationHandler,
createMaybeRunAnilistPostWatchUpdateHandler,
createOpenAnilistSetupWindowHandler, createOpenAnilistSetupWindowHandler,
createProcessNextAnilistRetryUpdateHandler,
createRefreshAnilistClientSecretStateHandler,
createResetAnilistMediaGuessStateHandler,
createResetAnilistMediaTrackingHandler,
createSetAnilistMediaGuessRuntimeStateHandler,
findAnilistSetupDeepLinkArgvUrl, findAnilistSetupDeepLinkArgvUrl,
isAnilistTrackingEnabled, isAnilistTrackingEnabled,
loadAnilistManualTokenEntry, loadAnilistManualTokenEntry,
loadAnilistSetupFallback,
openAnilistSetupInBrowser, openAnilistSetupInBrowser,
rememberAnilistAttemptedUpdateKey, rememberAnilistAttemptedUpdateKey,
} from './main/runtime/domains/anilist'; } from './main/runtime/domains/anilist';
@@ -153,50 +130,9 @@ import {
createApplyJellyfinMpvDefaultsHandler, createApplyJellyfinMpvDefaultsHandler,
createBuildApplyJellyfinMpvDefaultsMainDepsHandler, createBuildApplyJellyfinMpvDefaultsMainDepsHandler,
createBuildGetDefaultSocketPathMainDepsHandler, createBuildGetDefaultSocketPathMainDepsHandler,
createEnsureMpvConnectedForJellyfinPlaybackHandler,
createBuildEnsureMpvConnectedForJellyfinPlaybackMainDepsHandler,
createGetDefaultSocketPathHandler, createGetDefaultSocketPathHandler,
createGetJellyfinClientInfoHandler,
createBuildGetJellyfinClientInfoMainDepsHandler,
createHandleJellyfinAuthCommands,
createBuildHandleJellyfinAuthCommandsMainDepsHandler,
createHandleJellyfinListCommands,
createBuildHandleJellyfinListCommandsMainDepsHandler,
createHandleJellyfinPlayCommand,
createBuildHandleJellyfinPlayCommandMainDepsHandler,
createHandleJellyfinRemoteAnnounceCommand,
createBuildHandleJellyfinRemoteAnnounceCommandMainDepsHandler,
createHandleJellyfinRemotePlay,
createBuildHandleJellyfinRemotePlayMainDepsHandler,
createHandleJellyfinRemotePlaystate,
createBuildHandleJellyfinRemotePlaystateMainDepsHandler,
createHandleJellyfinRemoteGeneralCommand,
createBuildHandleJellyfinRemoteGeneralCommandMainDepsHandler,
createLaunchMpvIdleForJellyfinPlaybackHandler,
createBuildLaunchMpvIdleForJellyfinPlaybackMainDepsHandler,
createPlayJellyfinItemInMpvHandler,
createBuildPlayJellyfinItemInMpvMainDepsHandler,
createPreloadJellyfinExternalSubtitlesHandler,
createBuildPreloadJellyfinExternalSubtitlesMainDepsHandler,
createReportJellyfinRemoteProgressHandler,
createBuildReportJellyfinRemoteProgressMainDepsHandler,
createReportJellyfinRemoteStoppedHandler,
createBuildReportJellyfinRemoteStoppedMainDepsHandler,
createStartJellyfinRemoteSessionHandler,
createBuildStartJellyfinRemoteSessionMainDepsHandler,
createStopJellyfinRemoteSessionHandler,
createBuildStopJellyfinRemoteSessionMainDepsHandler,
createRunJellyfinCommandHandler,
createBuildRunJellyfinCommandMainDepsHandler,
createWaitForMpvConnectedHandler,
createBuildWaitForMpvConnectedMainDepsHandler,
createOpenJellyfinSetupWindowHandler,
createBuildOpenJellyfinSetupWindowMainDepsHandler,
createGetResolvedJellyfinConfigHandler,
createBuildGetResolvedJellyfinConfigMainDepsHandler,
parseJellyfinSetupSubmissionUrl,
buildJellyfinSetupFormHtml, buildJellyfinSetupFormHtml,
createMaybeFocusExistingJellyfinSetupWindowHandler, parseJellyfinSetupSubmissionUrl,
} from './main/runtime/domains/jellyfin'; } from './main/runtime/domains/jellyfin';
import type { ActiveJellyfinRemotePlaybackState } from './main/runtime/domains/jellyfin'; import type { ActiveJellyfinRemotePlaybackState } from './main/runtime/domains/jellyfin';
import { getConfiguredJellyfinSession } from './main/runtime/domains/jellyfin'; import { getConfiguredJellyfinSession } from './main/runtime/domains/jellyfin';
@@ -226,7 +162,6 @@ import {
createBuildEnsureOverlayWindowLevelMainDepsHandler, createBuildEnsureOverlayWindowLevelMainDepsHandler,
createBuildUpdateVisibleOverlayBoundsMainDepsHandler, createBuildUpdateVisibleOverlayBoundsMainDepsHandler,
createOverlayWindowRuntimeHandlers, createOverlayWindowRuntimeHandlers,
createOverlayRuntimeBootstrapHandlers,
createTrayRuntimeHandlers, createTrayRuntimeHandlers,
createOverlayVisibilityRuntime, createOverlayVisibilityRuntime,
createBroadcastRuntimeOptionsChangedHandler, createBroadcastRuntimeOptionsChangedHandler,
@@ -268,25 +203,11 @@ import {
createConfigDerivedRuntime, createConfigDerivedRuntime,
appendClipboardVideoToQueueRuntime, appendClipboardVideoToQueueRuntime,
createMainSubsyncRuntime, createMainSubsyncRuntime,
createLaunchBackgroundWarmupTaskHandler,
createStartBackgroundWarmupsHandler,
createBuildLaunchBackgroundWarmupTaskMainDepsHandler,
createBuildStartBackgroundWarmupsMainDepsHandler,
} from './main/runtime/domains/startup'; } from './main/runtime/domains/startup';
import { import {
createBuildBindMpvMainEventHandlersMainDepsHandler,
createBuildMpvClientRuntimeServiceFactoryDepsHandler,
createMpvClientRuntimeServiceFactory,
createBindMpvMainEventHandlersHandler,
createBuildTokenizerDepsMainHandler,
createCreateMecabTokenizerAndCheckMainHandler,
createPrewarmSubtitleDictionariesMainHandler,
createUpdateMpvSubtitleRenderMetricsHandler,
createBuildUpdateMpvSubtitleRenderMetricsMainDepsHandler,
createMpvOsdRuntimeHandlers, createMpvOsdRuntimeHandlers,
createCycleSecondarySubModeRuntimeHandler, createCycleSecondarySubModeRuntimeHandler,
} from './main/runtime/domains/mpv'; } from './main/runtime/domains/mpv';
import type { MpvClientRuntimeServiceOptions } from './main/runtime/domains/mpv';
import { import {
createBuildCopyCurrentSubtitleMainDepsHandler, createBuildCopyCurrentSubtitleMainDepsHandler,
createBuildHandleMineSentenceDigitMainDepsHandler, createBuildHandleMineSentenceDigitMainDepsHandler,
@@ -324,7 +245,6 @@ import {
MpvIpcClient, MpvIpcClient,
SubtitleWebSocket, SubtitleWebSocket,
Texthooker, Texthooker,
DEFAULT_MPV_SUBTITLE_RENDER_METRICS,
applyMpvSubtitleRenderMetricsPatch, applyMpvSubtitleRenderMetricsPatch,
authenticateWithPasswordRuntime, authenticateWithPasswordRuntime,
broadcastRuntimeOptionsChangedRuntime, broadcastRuntimeOptionsChangedRuntime,
@@ -424,7 +344,6 @@ import { createCharacterDictionaryRuntimeService } from './main/character-dictio
import { createCharacterDictionaryAutoSyncRuntimeService } from './main/runtime/character-dictionary-auto-sync'; import { createCharacterDictionaryAutoSyncRuntimeService } from './main/runtime/character-dictionary-auto-sync';
import { import {
type AnilistMediaGuessRuntimeState, type AnilistMediaGuessRuntimeState,
type AppState,
type StartupState, type StartupState,
applyStartupState, applyStartupState,
createAppState, createAppState,
@@ -1455,13 +1374,8 @@ function shouldInitializeMecabForAnnotations(): boolean {
const { const {
getResolvedJellyfinConfig, getResolvedJellyfinConfig,
getJellyfinClientInfo,
reportJellyfinRemoteProgress, reportJellyfinRemoteProgress,
reportJellyfinRemoteStopped, reportJellyfinRemoteStopped,
handleJellyfinRemotePlay,
handleJellyfinRemotePlaystate,
handleJellyfinRemoteGeneralCommand,
playJellyfinItemInMpv,
startJellyfinRemoteSession, startJellyfinRemoteSession,
stopJellyfinRemoteSession, stopJellyfinRemoteSession,
runJellyfinCommand, runJellyfinCommand,
@@ -2184,7 +2098,7 @@ const ensureImmersionTrackerStarted = (): void => {
createImmersionTrackerStartup(); createImmersionTrackerStartup();
}; };
const { reloadConfig: reloadConfigHandler, appReadyRuntimeRunner } = composeAppReadyRuntime({ const { appReadyRuntimeRunner } = composeAppReadyRuntime({
reloadConfigMainDeps: { reloadConfigMainDeps: {
reloadConfigStrict: () => configService.reloadConfigStrict(), reloadConfigStrict: () => configService.reloadConfigStrict(),
logInfo: (message) => appLogger.logInfo(message), logInfo: (message) => appLogger.logInfo(message),
@@ -2288,7 +2202,7 @@ const { reloadConfig: reloadConfigHandler, appReadyRuntimeRunner } = composeAppR
immersionTrackerStartupMainDeps, immersionTrackerStartupMainDeps,
}); });
const { appLifecycleRuntimeRunner, runAndApplyStartupState } = const { runAndApplyStartupState } =
runtimeRegistry.startup.createStartupRuntimeHandlers< runtimeRegistry.startup.createStartupRuntimeHandlers<
CliArgs, CliArgs,
StartupState, StartupState,
@@ -2386,7 +2300,6 @@ function handleInitialArgs(): void {
} }
const { const {
bindMpvClientEventHandlers,
createMpvClientRuntimeService: createMpvClientRuntimeServiceHandler, createMpvClientRuntimeService: createMpvClientRuntimeServiceHandler,
updateMpvSubtitleRenderMetrics: updateMpvSubtitleRenderMetricsHandler, updateMpvSubtitleRenderMetrics: updateMpvSubtitleRenderMetricsHandler,
tokenizeSubtitle, tokenizeSubtitle,
@@ -2758,10 +2671,6 @@ async function syncYomitanDefaultProfileAnkiServer(): Promise<void> {
} }
} }
function createOverlayWindow(kind: 'visible' | 'modal'): BrowserWindow {
return createOverlayWindowHandler(kind);
}
function createModalWindow(): BrowserWindow { function createModalWindow(): BrowserWindow {
const existingWindow = overlayManager.getModalWindow(); const existingWindow = overlayManager.getModalWindow();
if (existingWindow && !existingWindow.isDestroyed()) { if (existingWindow && !existingWindow.isDestroyed()) {
@@ -2775,13 +2684,6 @@ function createModalWindow(): BrowserWindow {
function createMainWindow(): BrowserWindow { function createMainWindow(): BrowserWindow {
return createMainWindowHandler(); return createMainWindowHandler();
} }
function resolveTrayIconPath(): string | null {
return resolveTrayIconPathHandler();
}
function buildTrayMenu(): Menu {
return buildTrayMenuHandler();
}
function ensureTray(): void { function ensureTray(): void {
ensureTrayHandler(); ensureTrayHandler();
@@ -2808,8 +2710,6 @@ const {
startPendingMultiCopy, startPendingMultiCopy,
cancelPendingMineSentenceMultiple, cancelPendingMineSentenceMultiple,
startPendingMineSentenceMultiple, startPendingMineSentenceMultiple,
registerOverlayShortcuts,
unregisterOverlayShortcuts,
syncOverlayShortcuts, syncOverlayShortcuts,
refreshOverlayShortcuts, refreshOverlayShortcuts,
} = composeShortcutRuntimes({ } = composeShortcutRuntimes({
@@ -2848,7 +2748,7 @@ const {
}, },
}); });
const { appendToMpvLog, flushMpvLog, showMpvOsd } = createMpvOsdRuntimeHandlers({ const { flushMpvLog, showMpvOsd } = createMpvOsdRuntimeHandlers({
appendToMpvLogMainDeps: { appendToMpvLogMainDeps: {
logPath: DEFAULT_MPV_LOG_PATH, logPath: DEFAULT_MPV_LOG_PATH,
dirname: (targetPath) => path.dirname(targetPath), dirname: (targetPath) => path.dirname(targetPath),
@@ -3005,7 +2905,6 @@ const {
setVisibleOverlayVisible: setVisibleOverlayVisibleHandler, setVisibleOverlayVisible: setVisibleOverlayVisibleHandler,
toggleVisibleOverlay: toggleVisibleOverlayHandler, toggleVisibleOverlay: toggleVisibleOverlayHandler,
setOverlayVisible: setOverlayVisibleHandler, setOverlayVisible: setOverlayVisibleHandler,
toggleOverlay: toggleOverlayHandler,
} = createOverlayVisibilityRuntime({ } = createOverlayVisibilityRuntime({
setVisibleOverlayVisibleDeps: { setVisibleOverlayVisibleDeps: {
setVisibleOverlayVisibleCore, setVisibleOverlayVisibleCore,
@@ -3065,11 +2964,7 @@ const shiftSubtitleDelayToAdjacentCueHandler = createShiftSubtitleDelayToAdjacen
showMpvOsd: (text) => showMpvOsd(text), showMpvOsd: (text) => showMpvOsd(text),
}); });
const { const { registerIpcRuntimeHandlers } = composeIpcRuntimeHandlers({
handleMpvCommandFromIpc: handleMpvCommandFromIpcHandler,
runSubsyncManualFromIpc: runSubsyncManualFromIpcHandler,
registerIpcRuntimeHandlers,
} = composeIpcRuntimeHandlers({
mpvCommandMainDeps: { mpvCommandMainDeps: {
triggerSubsyncFromConfig: () => triggerSubsyncFromConfig(), triggerSubsyncFromConfig: () => triggerSubsyncFromConfig(),
openRuntimeOptionsPalette: () => openRuntimeOptionsPalette(), openRuntimeOptionsPalette: () => openRuntimeOptionsPalette(),
@@ -3224,11 +3119,8 @@ const createCliCommandContextHandler = createCliCommandContextFactory({
logWarn: (message: string) => logger.warn(message), logWarn: (message: string) => logger.warn(message),
logError: (message: string, err: unknown) => logger.error(message, err), logError: (message: string, err: unknown) => logger.error(message, err),
}); });
const { const { createMainWindow: createMainWindowHandler, createModalWindow: createModalWindowHandler } =
createOverlayWindow: createOverlayWindowHandler, createOverlayWindowRuntimeHandlers<BrowserWindow>({
createMainWindow: createMainWindowHandler,
createModalWindow: createModalWindowHandler,
} = createOverlayWindowRuntimeHandlers<BrowserWindow>({
createOverlayWindowDeps: { createOverlayWindowDeps: {
createOverlayWindowCore: (kind, options) => createOverlayWindowCore(kind, options), createOverlayWindowCore: (kind, options) => createOverlayWindowCore(kind, options),
isDev, isDev,
@@ -3250,12 +3142,8 @@ const {
setMainWindow: (window) => overlayManager.setMainWindow(window), setMainWindow: (window) => overlayManager.setMainWindow(window),
setModalWindow: (window) => overlayManager.setModalWindow(window), setModalWindow: (window) => overlayManager.setModalWindow(window),
}); });
const { const { ensureTray: ensureTrayHandler, destroyTray: destroyTrayHandler } =
resolveTrayIconPath: resolveTrayIconPathHandler, createTrayRuntimeHandlers({
buildTrayMenu: buildTrayMenuHandler,
ensureTray: ensureTrayHandler,
destroyTray: destroyTrayHandler,
} = createTrayRuntimeHandlers({
resolveTrayIconPathDeps: { resolveTrayIconPathDeps: {
resolveTrayIconPathRuntime, resolveTrayIconPathRuntime,
platform: process.platform, platform: process.platform,
@@ -3436,25 +3324,10 @@ function setOverlayVisible(visible: boolean): void {
setOverlayVisibleHandler(visible); setOverlayVisibleHandler(visible);
syncOverlayMpvSubtitleSuppression(); syncOverlayMpvSubtitleSuppression();
} }
function toggleOverlay(): void {
if (!overlayManager.getVisibleOverlayVisible()) {
void ensureOverlayMpvSubtitlesHidden();
}
toggleOverlayHandler();
syncOverlayMpvSubtitleSuppression();
}
function handleOverlayModalClosed(modal: OverlayHostedModal): void { function handleOverlayModalClosed(modal: OverlayHostedModal): void {
handleOverlayModalClosedHandler(modal); handleOverlayModalClosedHandler(modal);
} }
function handleMpvCommandFromIpc(command: (string | number)[]): void {
handleMpvCommandFromIpcHandler(command);
}
async function runSubsyncManualFromIpc(request: SubsyncManualRunRequest): Promise<SubsyncResult> {
return runSubsyncManualFromIpcHandler(request) as Promise<SubsyncResult>;
}
function appendClipboardVideoToQueue(): { ok: boolean; message: string } { function appendClipboardVideoToQueue(): { ok: boolean; message: string } {
return appendClipboardVideoToQueueHandler(); return appendClipboardVideoToQueueHandler();
} }

View File

@@ -22,10 +22,13 @@ type RequiredMpvInputKeys = keyof ComposerInputs<
MpvRuntimeComposerOptions<FakeMpvClient, FakeTokenizerDeps, FakeTokenizedSubtitle> MpvRuntimeComposerOptions<FakeMpvClient, FakeTokenizerDeps, FakeTokenizedSubtitle>
>; >;
type _anilistHasNotifyDeps = Assert<IsAssignable<'notifyDeps', RequiredAnilistSetupInputKeys>>; const contractAssertions = [
type _jellyfinHasGetMpvClient = Assert<IsAssignable<'getMpvClient', RequiredJellyfinInputKeys>>; true as Assert<IsAssignable<'notifyDeps', RequiredAnilistSetupInputKeys>>,
type _ipcHasRegistration = Assert<IsAssignable<'registration', RequiredIpcInputKeys>>; true as Assert<IsAssignable<'getMpvClient', RequiredJellyfinInputKeys>>,
type _mpvHasTokenizer = Assert<IsAssignable<'tokenizer', RequiredMpvInputKeys>>; true as Assert<IsAssignable<'registration', RequiredIpcInputKeys>>,
true as Assert<IsAssignable<'tokenizer', RequiredMpvInputKeys>>,
];
void contractAssertions;
// @ts-expect-error missing required notifyDeps should fail compile-time contract // @ts-expect-error missing required notifyDeps should fail compile-time contract
const anilistMissingRequired: AnilistSetupComposerOptions = { const anilistMissingRequired: AnilistSetupComposerOptions = {