diff options
Diffstat (limited to 'packages/frontend/src/plugin.ts')
| -rw-r--r-- | packages/frontend/src/plugin.ts | 71 |
1 files changed, 48 insertions, 23 deletions
diff --git a/packages/frontend/src/plugin.ts b/packages/frontend/src/plugin.ts index 15644870e5..613e3a9df6 100644 --- a/packages/frontend/src/plugin.ts +++ b/packages/frontend/src/plugin.ts @@ -144,9 +144,12 @@ export async function installPlugin(code: string, meta?: AiScriptPluginMeta) { prefer.set('plugins', prefer.s.plugins.concat(plugin)); await authorizePlugin(plugin); + + await launchPlugin(installId); } export async function uninstallPlugin(plugin: Plugin) { + abortPlugin(plugin); prefer.set('plugins', prefer.s.plugins.filter(x => x.installId !== plugin.installId)); if (Object.hasOwn(store.state.pluginTokens, plugin.installId)) { await os.apiWithDialog('i/revoke-token', { @@ -158,26 +161,6 @@ export async function uninstallPlugin(plugin: Plugin) { } } -export async function configPlugin(plugin: Plugin) { - if (plugin.config == null) { - throw new Error('This plugin does not have a config'); - } - - const config = plugin.config; - for (const key in plugin.configData) { - config[key].default = plugin.configData[key]; - } - - const { canceled, result } = await os.form(plugin.name, config); - if (canceled) return; - - prefer.set('plugins', prefer.s.plugins.map(x => x.installId === plugin.installId ? { ...x, configData: result } : x)); -} - -export function changePluginActive(plugin: Plugin, active: boolean) { - prefer.set('plugins', prefer.s.plugins.map(x => x.installId === plugin.installId ? { ...x, active } : x)); -} - const pluginContexts = new Map<string, Interpreter>(); export const pluginLogs = ref(new Map<string, string[]>()); @@ -217,7 +200,18 @@ function addPluginHandler<K extends keyof HandlerDef>(installId: Plugin['install pluginHandlers.push({ pluginInstallId: installId, type, ctx }); } -export async function launchPlugin(plugin: Plugin): Promise<void> { +export function launchPlugins() { + for (const plugin of prefer.s.plugins) { + if (plugin.active) { + launchPlugin(plugin.installId); + } + } +} + +async function launchPlugin(id: Plugin['installId']): Promise<void> { + const plugin = prefer.s.plugins.find(x => x.installId === id); + if (!plugin) return; + // 後方互換性のため if (plugin.src == null) return; @@ -254,7 +248,7 @@ export async function launchPlugin(plugin: Plugin): Promise<void> { ); } -export function reloadPlugin(plugin: Plugin): void { +export function abortPlugin(plugin: Plugin): void { const pluginContext = pluginContexts.get(plugin.installId); if (!pluginContext) return; @@ -262,8 +256,39 @@ export function reloadPlugin(plugin: Plugin): void { pluginContexts.delete(plugin.installId); pluginLogs.value.delete(plugin.installId); pluginHandlers = pluginHandlers.filter(x => x.pluginInstallId !== plugin.installId); +} + +export function reloadPlugin(plugin: Plugin): void { + abortPlugin(plugin); + launchPlugin(plugin.installId); +} + +export async function configPlugin(plugin: Plugin) { + if (plugin.config == null) { + throw new Error('This plugin does not have a config'); + } + + const config = plugin.config; + for (const key in plugin.configData) { + config[key].default = plugin.configData[key]; + } + + const { canceled, result } = await os.form(plugin.name, config); + if (canceled) return; - launchPlugin(plugin); + prefer.set('plugins', prefer.s.plugins.map(x => x.installId === plugin.installId ? { ...x, configData: result } : x)); + + reloadPlugin(plugin); +} + +export function changePluginActive(plugin: Plugin, active: boolean) { + prefer.set('plugins', prefer.s.plugins.map(x => x.installId === plugin.installId ? { ...x, active } : x)); + + if (active) { + launchPlugin(plugin.installId); + } else { + abortPlugin(plugin); + } } function createPluginEnv(opts: { plugin: Plugin; storageKey: string }): Record<string, values.Value> { |