From c8906b442a304016356354987476bab3c4ecd82a Mon Sep 17 00:00:00 2001 From: PalmDevs Date: Sun, 26 Oct 2025 23:08:36 +0700 Subject: [PATCH] feat(lib/plugins)!: bind lifecycle `this` to plugin --- lib/plugins/src/_internal/index.ts | 14 ++++++++++---- lib/plugins/src/types.ts | 16 +++++++++------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/lib/plugins/src/_internal/index.ts b/lib/plugins/src/_internal/index.ts index b796843..952fff2 100644 --- a/lib/plugins/src/_internal/index.ts +++ b/lib/plugins/src/_internal/index.ts @@ -404,7 +404,9 @@ export async function preInitPlugin(plugin: AnyPlugin) { plugin.status |= Status.PreIniting try { - const prom = lifecycles.preInit(plugin.api as PreInitPluginApi) + const prom = lifecycles.preInit.apply(plugin, [ + plugin.api as PreInitPluginApi, + ]) promises.push(prom) await prom } catch (e) { @@ -447,7 +449,9 @@ export async function initPlugin(plugin: AnyPlugin) { plugin.status |= Status.Initing try { - const prom = lifecycles.init(plugin.api as InitPluginApi) + const prom = lifecycles.init.apply(plugin, [ + plugin.api as InitPluginApi, + ]) promises.push(prom) await prom } catch (e) { @@ -489,7 +493,9 @@ export async function startPlugin(plugin: AnyPlugin) { plugin.status |= Status.Starting try { - const prom = lifecycles.start(plugin.api as PluginApi) + const prom = lifecycles.start.apply(plugin, [ + plugin.api as PluginApi, + ]) promises.push(prom) await prom } catch (e) { @@ -548,7 +554,7 @@ export async function stopPlugin(plugin: AnyPlugin) { try { if (lifecycles.stop) await Promise.race([ - lifecycles.stop(plugin.api as PluginApi), + lifecycles.stop.apply(plugin, [plugin.api as PluginApi]), sleepReject( MaxWaitTime, 'Plugin stop lifecycle timed out, force stopping', diff --git a/lib/plugins/src/types.ts b/lib/plugins/src/types.ts index 6d74aa7..7948bd9 100644 --- a/lib/plugins/src/types.ts +++ b/lib/plugins/src/types.ts @@ -105,7 +105,7 @@ export interface PreInitPluginApi< decorate: PluginDecorateApi unscoped: UnscopedPreInitPluginApi cleanup: PluginCleanupApi - plugin: Plugin + plugin: Plugin } /** @@ -118,6 +118,7 @@ export interface InitPluginApi< > extends PreInitPluginApi { decorate: PluginDecorateApi unscoped: UnscopedInitPluginApi + plugin: Plugin } /** @@ -130,6 +131,7 @@ export interface PluginApi< > extends InitPluginApi { decorate: PluginDecorateApi unscoped: UnscopedPluginApi + plugin: Plugin } // TODO(plugins): support plugin bundles @@ -208,26 +210,26 @@ export interface PluginLifecycles< * * @param api Plugin API (very limited). */ - preInit?: (api: PreInitPluginApi) => any + preInit?: (this: Plugin, api: PreInitPluginApi) => any /** * Runs as soon as all important modules are initialized. * After the index module (module 0)'s factory is run. * * @param api Plugin API (limited). */ - init?: (api: InitPluginApi) => any + init?: (this: Plugin, api: InitPluginApi) => any /** * Runs when the plugin can be started with all APIs available. * * @param api Plugin API. */ - start?: (api: PluginApi) => any + start?: (this: Plugin, api: PluginApi) => any /** * Runs when the plugin is stopped. * * @param api Plugin API. */ - stop?: (api: PluginApi) => any + stop?: (this: Plugin, api: PluginApi) => any } export interface Plugin< @@ -262,11 +264,11 @@ export interface Plugin< * Disable the plugin. * This will also stop the plugin if it is running. */ - disable(): Promise + disable(this: Plugin): Promise /** * Stop the plugin. */ - stop(): Promise + stop(this: Plugin): Promise /** * The plugin API.