From 05564d4a58838538a63041f92aecbbbbf36d4606 Mon Sep 17 00:00:00 2001 From: JellyBrick Date: Thu, 9 Nov 2023 09:57:32 +0900 Subject: [PATCH] feat: add auto-importer for menu --- electron.vite.config.ts | 1 + src/menu.ts | 42 +++---------------- src/virtual-module.d.ts | 8 ++++ .../plugin-virtual-module-generator.ts | 2 +- 4 files changed, 16 insertions(+), 37 deletions(-) diff --git a/electron.vite.config.ts b/electron.vite.config.ts index 4d2090f9..40b14c58 100644 --- a/electron.vite.config.ts +++ b/electron.vite.config.ts @@ -12,6 +12,7 @@ export default defineConfig({ plugins: [ viteResolve({ 'virtual:MainPlugins': pluginVirtualModuleGenerator('back'), + 'virtual:MenuPlugins': pluginVirtualModuleGenerator('menu'), }), ], publicDir: 'assets', diff --git a/src/menu.ts b/src/menu.ts index 5ec5fe20..4108c0ec 100644 --- a/src/menu.ts +++ b/src/menu.ts @@ -7,21 +7,9 @@ import config from './config'; import { startingPages } from './providers/extracted-data'; import promptOptions from './providers/prompt-options'; -import adblockerMenu from './plugins/adblocker/menu'; -import ambientModeMenu from './plugins/ambient-mode/menu'; -import captionsSelectorMenu from './plugins/captions-selector/menu'; -import crossfadeMenu from './plugins/crossfade/menu'; -import disableAutoplayMenu from './plugins/disable-autoplay/menu'; -import discordMenu from './plugins/discord/menu'; -import downloaderMenu from './plugins/downloader/menu'; -import inAppMenuTitlebarMenu from './plugins/in-app-menu/menu'; -import lyricsGeniusMenu from './plugins/lyrics-genius/menu'; -import notificationsMenu from './plugins/notifications/menu'; -import pictureInPictureMenu from './plugins/picture-in-picture/menu'; -import preciseVolumeMenu from './plugins/precise-volume/menu'; -import shortcutsMenu from './plugins/shortcuts/menu'; -import videoToggleMenu from './plugins/video-toggle/menu'; -import visualizerMenu from './plugins/visualizer/menu'; +// eslint-disable-next-line import/order +import { pluginList as menuList } from 'virtual:MenuPlugins'; + import { getAvailablePluginNames } from './plugins/utils'; export type MenuTemplate = Electron.MenuItemConstructorOptions[]; @@ -31,24 +19,6 @@ const inAppMenuActive = config.plugins.isEnabled('in-app-menu'); const betaPlugins = ['crossfade', 'lumiastream']; -const pluginMenus = { - 'adblocker': adblockerMenu, - 'ambient-mode': ambientModeMenu, - 'disable-autoplay': disableAutoplayMenu, - 'captions-selector': captionsSelectorMenu, - 'crossfade': crossfadeMenu, - 'discord': discordMenu, - 'downloader': downloaderMenu, - 'in-app-menu': inAppMenuTitlebarMenu, - 'lyrics-genius': lyricsGeniusMenu, - 'notifications': notificationsMenu, - 'picture-in-picture': pictureInPictureMenu, - 'precise-volume': preciseVolumeMenu, - 'shortcuts': shortcutsMenu, - 'video-toggle': videoToggleMenu, - 'visualizer': visualizerMenu, -}; - const pluginEnabledMenu = (plugin: string, label = '', hasSubmenu = false, refreshMenu: (() => void ) | undefined = undefined): Electron.MenuItemConstructorOptions => ({ label: label || plugin, type: 'checkbox', @@ -86,8 +56,8 @@ export const mainMenuTemplate = (win: BrowserWindow): MenuTemplate => { pluginLabel += ' [beta]'; } - if (Object.hasOwn(pluginMenus, pluginName)) { - const getPluginMenu = pluginMenus[pluginName as keyof typeof pluginMenus]; + if (Object.hasOwn(menuList, pluginName)) { + const getPluginMenu = menuList[pluginName]; if (!config.plugins.isEnabled(pluginName)) { return pluginEnabledMenu(pluginName, pluginLabel, true, innerRefreshMenu); @@ -98,7 +68,7 @@ export const mainMenuTemplate = (win: BrowserWindow): MenuTemplate => { submenu: [ pluginEnabledMenu(pluginName, 'Enabled', true, innerRefreshMenu), { type: 'separator' }, - ...getPluginMenu(win, config.plugins.getOptions(pluginName), innerRefreshMenu), + ...(getPluginMenu(win, config.plugins.getOptions(pluginName), innerRefreshMenu) as MenuTemplate), ], } satisfies Electron.MenuItemConstructorOptions; } diff --git a/src/virtual-module.d.ts b/src/virtual-module.d.ts index 41e7eb48..b96254f3 100644 --- a/src/virtual-module.d.ts +++ b/src/virtual-module.d.ts @@ -5,6 +5,14 @@ declare module 'virtual:MainPlugins' { export const pluginList: Record Promise>; } +declare module 'virtual:MenuPlugins' { + import type { BrowserWindow } from 'electron'; + import type { MenuTemplate } from './menu'; + import type { ConfigType } from './config/dynamic'; + + export const pluginList: Record void) => MenuTemplate>; +} + declare module 'virtual:PreloadPlugins' { export const pluginList: Record Promise>; } diff --git a/vite-plugins/plugin-virtual-module-generator.ts b/vite-plugins/plugin-virtual-module-generator.ts index 3e6b62b4..4ebdb6b7 100644 --- a/vite-plugins/plugin-virtual-module-generator.ts +++ b/vite-plugins/plugin-virtual-module-generator.ts @@ -5,7 +5,7 @@ import { globSync } from 'glob'; const snakeToCamel = (text: string) => text.replace(/-(\w)/g, (_, letter: string) => letter.toUpperCase()); -export const pluginVirtualModuleGenerator = (mode: 'back' | 'preload' | 'front') => { +export const pluginVirtualModuleGenerator = (mode: 'back' | 'preload' | 'front' | 'menu') => { const srcPath = resolve(__dirname, '..', 'src'); const plugins = globSync(`${srcPath}/plugins/*`)