feat: code splitting (#3593)

Co-authored-by: Angelos Bouklis <me@arjix.dev>
This commit is contained in:
JellyBrick
2025-07-12 00:00:03 +09:00
committed by GitHub
parent c04dc92d39
commit b53ece5836
15 changed files with 189 additions and 120 deletions

View File

@ -20,13 +20,17 @@ const createContext = (
id: string,
win: BrowserWindow,
): BackendContext<PluginConfig> => ({
getConfig: () =>
getConfig: async () =>
deepmerge(
allPlugins[id].config ?? { enabled: false },
(await allPlugins())[id].config ?? { enabled: false },
config.get(`plugins.${id}`) ?? {},
) as PluginConfig,
setConfig: (newConfig) => {
config.setPartial(`plugins.${id}`, newConfig, allPlugins[id].config);
setConfig: async (newConfig) => {
config.setPartial(
`plugins.${id}`,
newConfig,
(await allPlugins())[id].config,
);
},
ipc: {
@ -96,7 +100,7 @@ export const forceLoadMainPlugin = async (
id: string,
win: BrowserWindow,
): Promise<void> => {
const plugin = mainPlugins[id];
const plugin = (await mainPlugins())[id];
if (!plugin) return;
try {
@ -133,7 +137,7 @@ export const loadAllMainPlugins = async (win: BrowserWindow) => {
const pluginConfigs = config.plugins.getPlugins();
const queue: Promise<void>[] = [];
for (const [plugin, pluginDef] of Object.entries(mainPlugins)) {
for (const [plugin, pluginDef] of Object.entries(await mainPlugins())) {
const config = deepmerge(pluginDef.config, pluginConfigs[plugin] ?? {});
if (config.enabled) {
queue.push(forceLoadMainPlugin(plugin, win));

View File

@ -17,19 +17,23 @@ const createContext = (
id: string,
win: BrowserWindow,
): MenuContext<PluginConfig> => ({
getConfig: () =>
getConfig: async () =>
deepmerge(
allPlugins[id].config ?? { enabled: false },
(await allPlugins())[id].config ?? { enabled: false },
config.get(`plugins.${id}`) ?? {},
) as PluginConfig,
setConfig: (newConfig) => {
config.setPartial(`plugins.${id}`, newConfig, allPlugins[id].config);
setConfig: async (newConfig) => {
config.setPartial(
`plugins.${id}`,
newConfig,
(await allPlugins())[id].config,
);
},
window: win,
refresh: async () => {
await setApplicationMenu(win);
if (config.plugins.isEnabled('in-app-menu')) {
if (await config.plugins.isEnabled('in-app-menu')) {
win.webContents.send('refresh-in-app-menu');
}
},
@ -37,7 +41,7 @@ const createContext = (
export const forceLoadMenuPlugin = async (id: string, win: BrowserWindow) => {
try {
const plugin = allPlugins[id];
const plugin = (await allPlugins())[id];
if (!plugin) return;
const menu = plugin.menu?.(createContext(id, win));
@ -68,7 +72,7 @@ export const forceLoadMenuPlugin = async (id: string, win: BrowserWindow) => {
export const loadAllMenuPlugins = async (win: BrowserWindow) => {
const pluginConfigs = config.plugins.getPlugins();
for (const [pluginId, pluginDef] of Object.entries(allPlugins)) {
for (const [pluginId, pluginDef] of Object.entries(await allPlugins())) {
const config = deepmerge(
pluginDef.config ?? { enabled: false },
pluginConfigs[pluginId] ?? {},

View File

@ -15,13 +15,17 @@ const loadedPluginMap: Record<
PluginDef<unknown, unknown, unknown>
> = {};
const createContext = (id: string): PreloadContext<PluginConfig> => ({
getConfig: () =>
getConfig: async () =>
deepmerge(
allPlugins[id].config ?? { enabled: false },
(await allPlugins())[id].config ?? { enabled: false },
config.get(`plugins.${id}`) ?? {},
) as PluginConfig,
setConfig: (newConfig) => {
config.setPartial(`plugins.${id}`, newConfig, allPlugins[id].config);
setConfig: async (newConfig) => {
config.setPartial(
`plugins.${id}`,
newConfig,
(await allPlugins())[id].config,
);
},
});
@ -48,7 +52,7 @@ export const forceUnloadPreloadPlugin = async (id: string) => {
export const forceLoadPreloadPlugin = async (id: string) => {
try {
const plugin = preloadPlugins[id];
const plugin = (await preloadPlugins())[id];
if (!plugin) return;
const hasStarted = await startPlugin(id, plugin, {
@ -78,10 +82,10 @@ export const forceLoadPreloadPlugin = async (id: string) => {
}
};
export const loadAllPreloadPlugins = () => {
export const loadAllPreloadPlugins = async () => {
const pluginConfigs = config.plugins.getPlugins();
for (const [pluginId, pluginDef] of Object.entries(preloadPlugins)) {
for (const [pluginId, pluginDef] of Object.entries(await preloadPlugins())) {
const config = deepmerge(
pluginDef.config ?? { enable: false },
pluginConfigs[pluginId] ?? {},

View File

@ -18,7 +18,7 @@ const loadedPluginMap: Record<
export const createContext = <Config extends PluginConfig>(
id: string,
): RendererContext<Config> => ({
getConfig: async () =>
getConfig: () =>
window.ipcRenderer.invoke('ytmd:get-config', id) as Promise<Config>,
setConfig: async (newConfig) => {
await window.ipcRenderer.invoke('ytmd:set-config', id, newConfig);
@ -47,7 +47,7 @@ export const forceUnloadRendererPlugin = async (id: string) => {
delete unregisterStyleMap[id];
delete loadedPluginMap[id];
const plugin = rendererPlugins[id];
const plugin = (await rendererPlugins())[id];
if (!plugin) return;
const hasStopped = await stopPlugin(id, plugin, {
@ -71,7 +71,7 @@ export const forceUnloadRendererPlugin = async (id: string) => {
};
export const forceLoadRendererPlugin = async (id: string) => {
const plugin = rendererPlugins[id];
const plugin = (await rendererPlugins())[id];
if (!plugin) return;
const hasEvaled = await startPlugin(id, plugin, {
@ -117,7 +117,7 @@ export const forceLoadRendererPlugin = async (id: string) => {
export const loadAllRendererPlugins = async () => {
const pluginConfigs = window.mainConfig.plugins.getPlugins();
for (const [pluginId, pluginDef] of Object.entries(rendererPlugins)) {
for (const [pluginId, pluginDef] of Object.entries(await rendererPlugins())) {
const config = deepmerge(pluginDef.config, pluginConfigs[pluginId] ?? {});
if (config.enabled) {