Files
BetterSEQTA-Plus/src/plugins/core/dynamicLoader.ts
T
2026-01-22 18:41:42 +10:30

77 lines
2.4 KiB
TypeScript

import type { Plugin, PluginSettings } from "./types";
/**
* Interface for lazy-loaded plugin definitions
*/
export interface LazyPlugin<T extends PluginSettings = PluginSettings, S = any> {
id: string;
name: string;
description: string;
version: string;
settings: T;
styles?: string;
disableToggle?: boolean;
defaultEnabled?: boolean;
beta?: boolean;
// Instead of a run function, we have a loader that imports the actual plugin
loader: () => Promise<{ default: Plugin<T, S> }>;
}
/**
* Converts a lazy plugin into a regular plugin by wrapping the run function
* with dynamic import logic
*/
export function createLazyPlugin<T extends PluginSettings = PluginSettings, S = any>(
lazyPlugin: LazyPlugin<T, S>
): Plugin<T, S> {
return {
id: lazyPlugin.id,
name: lazyPlugin.name,
description: lazyPlugin.description,
version: lazyPlugin.version,
settings: lazyPlugin.settings,
styles: lazyPlugin.styles,
disableToggle: lazyPlugin.disableToggle,
defaultEnabled: lazyPlugin.defaultEnabled,
beta: lazyPlugin.beta,
run: async (api) => {
console.info(`[BetterSEQTA+] Dynamically loading plugin "${lazyPlugin.id}"...`);
try {
// Dynamically import the actual plugin implementation
const { default: actualPlugin } = await lazyPlugin.loader();
console.info(`[BetterSEQTA+] Successfully loaded plugin "${lazyPlugin.id}"`);
// Execute the actual plugin's run function
return await actualPlugin.run(api);
} catch (error: any) {
// Handle Firefox MIME type errors gracefully
if (error?.message?.includes("MIME type") || error?.message?.includes("NS_ERROR_CORRUPTED_CONTENT")) {
console.error(
`[BetterSEQTA+] Failed to load plugin "${lazyPlugin.id}" due to Firefox module loading restrictions. ` +
`This may be a build configuration issue. Error:`,
error
);
// Don't throw - allow the extension to continue functioning without this plugin
return;
}
console.error(`[BetterSEQTA+] Failed to dynamically load plugin "${lazyPlugin.id}":`, error);
throw error;
}
}
};
}
/**
* Helper function to create a lazy plugin definition
*/
export function defineLazyPlugin<T extends PluginSettings = PluginSettings, S = any>(
config: LazyPlugin<T, S>
): Plugin<T, S> {
return createLazyPlugin(config);
}