@chamn/engine
Version:
69 lines (68 loc) • 2.6 kB
TypeScript
import { Engine } from '../index';
import { CPage } from '@chamn/model';
import { Emitter } from '../../node_modules/mitt';
import { Workbench } from '../component/Workbench';
import { CustomI18n } from '../i18n';
import { AssetsPackageListManager } from './assetPackagesListManage';
export type PluginObj<C, E = any> = {
name: string;
PLUGIN_NAME?: string;
init: (ctx: CPluginCtx<C>) => Promise<void>;
destroy: (ctx: CPluginCtx<C>) => Promise<void>;
/** 用于暴露给外部重载插件 */
reload?: (ctx: CPluginCtx<C>) => Promise<void>;
/** 插件暴露给外部可以调用的方法 */
export: (ctx: CPluginCtx<C>) => E;
meta: {
engine: {
version: string;
};
};
};
interface PluginFunction<C, E> {
(ctx: CPluginCtx<C>): PluginObj<C, E>;
['PLUGIN_NAME']?: string;
}
export type CPlugin<C = Record<string, any>, E = any> = PluginObj<C, E> | PluginFunction<C, E>;
type PluginManagerOptions = {
getWorkbench: () => Workbench;
emitter: Emitter<any>;
pageModel: CPage;
i18n: CustomI18n;
assetsPackageListManager: AssetsPackageListManager;
engine: Engine;
};
export type CPluginCtx<C = any> = {
name?: string;
globalEmitter: Emitter<any>;
/** 当前插件外部传入的配置 **/
config: C;
pluginManager: PluginManager;
pluginReadyOk: () => void;
} & PluginManagerOptions;
export type PluginInstance<C = any, E = any> = {
ctx: CPluginCtx<C>;
export: E;
source: PluginObj<C, E>;
ready: boolean;
};
export type CustomPluginHook<P extends PluginInstance<any, any> = any> = (pluginInstance: P) => P;
export declare class PluginManager {
plugins: Map<string, PluginInstance>;
emitter: Emitter<any>;
getWorkbench: () => Workbench;
pageModel: CPage;
i18n: CustomI18n;
assetsPackageListManager: AssetsPackageListManager;
engine: Engine;
customPluginHooks: Record<string, CustomPluginHook[]>;
constructor({ getWorkbench, emitter, pageModel, i18n, assetsPackageListManager, engine }: PluginManagerOptions);
/** 自定义插件, 可以修改插件的配置 */
customPlugin: <P extends PluginInstance<any, any>>(pluginName: string, customPluginHook: CustomPluginHook<P>) => void;
createPluginCtx: () => CPluginCtx<any>;
add(plugin: CPlugin): Promise<void>;
get<P extends PluginInstance<any, any>>(pluginName: string): Promise<P | undefined>;
remove(name: string): Promise<void>;
onPluginReadyOk(pluginName: string, cb?: (pluginHandle: PluginInstance) => void): Promise<PluginInstance<any, any>>;
}
export {};