diff --git a/src/index.ts b/src/index.ts index 977beb95..3b3ef2a5 100644 --- a/src/index.ts +++ b/src/index.ts @@ -47,7 +47,7 @@ import { getAllLoadedMainPlugins, loadAllMainPlugins, } from '@/loader/main'; -import { PluginBaseConfig } from '@/plugins/utils/builder'; +import {PluginConfig, PluginDef} from "@/types/plugins"; // Catch errors and log them unhandled({ @@ -113,11 +113,11 @@ ipcMain.handle('get-main-plugin-names', () => Object.keys(mainPlugins)); const initHook = (win: BrowserWindow) => { ipcMain.handle( 'get-config', - (_, id: keyof PluginBuilderList) => + (_, id: string) => deepmerge( mainPlugins[id].config, config.get(`plugins.${id}`) ?? {}, - ) as PluginBuilderList[typeof id]['config'], + ) as PluginConfig, ); ipcMain.handle('set-config', (_, name: string, obj: object) => config.setPartial(`plugins.${name}`, obj), @@ -137,11 +137,11 @@ const initHook = (win: BrowserWindow) => { const isEqual = deepEqual(oldPluginConfigList[id], newPluginConfig); if (!isEqual) { - const oldConfig = oldPluginConfigList[id] as PluginBaseConfig; + const oldConfig = oldPluginConfigList[id] as PluginConfig; const config = deepmerge( mainPlugins[id].config, newPluginConfig, - ) as PluginBaseConfig; + ) as PluginConfig; if (config.enabled !== oldConfig?.enabled) { if (config.enabled) { @@ -159,9 +159,10 @@ const initHook = (win: BrowserWindow) => { } } - const mainPlugin = getAllLoadedMainPlugins()[id]; + const mainPlugin = getAllLoadedMainPlugins()[id] as PluginDef; if (mainPlugin) { - if (config.enabled) { + if (config.enabled && typeof mainPlugin.backend !== 'function') { + mainPlugin.backend?.onConfigChange?.(config); } } diff --git a/src/loader/menu.ts b/src/loader/menu.ts index c5717787..d74cc15d 100644 --- a/src/loader/menu.ts +++ b/src/loader/menu.ts @@ -7,8 +7,10 @@ import { MenuContext } from '@/types/contexts'; import config from '@/config'; import { setApplicationMenu } from '@/menu'; +import type { PluginConfig } from '@/types/plugins'; + const menuTemplateMap: Record = {}; -const createContext = (id: string, win: BrowserWindow): MenuContext => ({ +const createContext = (id: string, win: BrowserWindow): MenuContext => ({ getConfig: () => config.plugins.getOptions(id), setConfig: (newConfig) => { config.setPartial(`plugins.${id}`, newConfig); @@ -23,13 +25,13 @@ const createContext = (id: string, win: BrowserWindow): MenuContext => ({ }, }); -export const forceLoadMenuPlugin = (id: string, win: BrowserWindow) => { +export const forceLoadMenuPlugin = async (id: string, win: BrowserWindow) => { try { const plugin = allPlugins[id]; if (!plugin) return; const menu = plugin.menu?.(createContext(id, win)); - if (menu) menuTemplateMap[id] = menu; + if (menu) menuTemplateMap[id] = await menu; else return; console.log('[YTMusic]', `Successfully loaded '${id}::menu'`); @@ -42,7 +44,7 @@ export const loadAllMenuPlugins = (win: BrowserWindow) => { const pluginConfigs = config.plugins.getPlugins(); for (const [pluginId, pluginDef] of Object.entries(allPlugins)) { - const config = deepmerge(pluginDef.config, pluginConfigs[pluginId] ?? {}); + const config = deepmerge(pluginDef.config, pluginConfigs[pluginId] ?? {}) as PluginConfig; if (config.enabled) { forceLoadMenuPlugin(pluginId, win); diff --git a/src/loader/preload.ts b/src/loader/preload.ts index 3fb2287a..13da90b3 100644 --- a/src/loader/preload.ts +++ b/src/loader/preload.ts @@ -1,14 +1,14 @@ import { deepmerge } from 'deepmerge-ts'; import { preloadPlugins } from 'virtual:plugins'; -import { type PluginDef } from '@/types/plugins'; +import type { PluginConfig, PluginDef } from '@/types/plugins'; import { type PreloadContext } from '@/types/contexts'; import { startPlugin, stopPlugin } from '@/utils'; import config from '@/config'; -const loadedPluginMap: Record = {}; -const createContext = (id: string): PreloadContext => ({ +const loadedPluginMap: Record> = {}; +const createContext = (id: string): PreloadContext => ({ getConfig: () => config.plugins.getOptions(id), setConfig: (newConfig) => { config.setPartial(`plugins.${id}`, newConfig); @@ -52,7 +52,7 @@ export const loadAllPreloadPlugins = () => { const pluginConfigs = config.plugins.getPlugins(); for (const [pluginId, pluginDef] of Object.entries(preloadPlugins)) { - const config = deepmerge(pluginDef.config, pluginConfigs[pluginId] ?? {}); + const config = deepmerge(pluginDef.config, pluginConfigs[pluginId] ?? {}) as PluginConfig; if (config.enabled) { forceLoadPreloadPlugin(pluginId); @@ -70,7 +70,7 @@ export const unloadAllPreloadPlugins = () => { } }; -export const getLoadedPreloadPlugin = (id: string): PluginDef | undefined => { +export const getLoadedPreloadPlugin = (id: string): PluginDef | undefined => { return loadedPluginMap[id]; }; diff --git a/src/loader/renderer.ts b/src/loader/renderer.ts index 8b7c4806..8c26ba82 100644 --- a/src/loader/renderer.ts +++ b/src/loader/renderer.ts @@ -8,7 +8,7 @@ import { PluginConfig, PluginDef } from '@/types/plugins'; import { startPlugin, stopPlugin } from '@/utils'; const unregisterStyleMap: Record void)[]> = {}; -const loadedPluginMap: Record> = {}; +const loadedPluginMap: Record> = {}; const createContext = (id: string): RendererContext => ({ getConfig: () => window.mainConfig.plugins.getOptions(id), @@ -77,7 +77,7 @@ export const loadAllRendererPlugins = () => { const pluginConfigs = window.mainConfig.plugins.getPlugins(); for (const [pluginId, pluginDef] of Object.entries(rendererPlugins)) { - const config = deepmerge(pluginDef.config, pluginConfigs[pluginId] ?? {}); + const config = deepmerge(pluginDef.config, pluginConfigs[pluginId] ?? {}) as PluginConfig; if (config.enabled) { forceLoadRendererPlugin(pluginId); @@ -95,7 +95,7 @@ export const unloadAllRendererPlugins = () => { } }; -export const getLoadedRendererPlugin = (id: string): PluginDef | undefined => { +export const getLoadedRendererPlugin = (id: string): PluginDef | undefined => { return loadedPluginMap[id]; }; diff --git a/src/renderer.ts b/src/renderer.ts index 2a3c265d..e1ea94c2 100644 --- a/src/renderer.ts +++ b/src/renderer.ts @@ -1,7 +1,3 @@ -import { - PluginBaseConfig, -} from '@/plugins/utils/builder'; - import { startingPages } from './providers/extracted-data'; import setupSongInfo from './providers/song-info-front'; import { @@ -12,6 +8,7 @@ import { loadAllRendererPlugins, } from './loader/renderer'; +import type { PluginConfig } from '@/types/plugins'; import type { YoutubePlayer } from '@/types/youtube-player'; let api: (Element & YoutubePlayer) | null = null; @@ -126,13 +123,13 @@ function onApiLoaded() { window.ipcRenderer.on( 'plugin:unload', - (_event, id: keyof PluginBuilderList) => { + (_event, id: string) => { forceUnloadRendererPlugin(id); }, ); window.ipcRenderer.on( 'plugin:enable', - (_event, id: keyof PluginBuilderList) => { + (_event, id: string) => { forceLoadRendererPlugin(id); if (api) { const plugin = getLoadedRendererPlugin(id); @@ -145,7 +142,7 @@ function onApiLoaded() { window.ipcRenderer.on( 'config-changed', - (_event, id: string, newConfig: PluginBaseConfig) => { + (_event, id: string, newConfig: PluginConfig) => { const plugin = getAllLoadedRendererPlugins()[id]; if (plugin && typeof plugin.renderer !== 'function') { plugin.renderer?.onConfigChange?.(newConfig);