Comprehensive plugin architecture with metadata, registration, and lifecycle management for extending editor functionality.
Core plugin interface and metadata.
/**
* Plugin function interface
*/
interface IPublicTypePlugin {
/** Plugin initialization function */
(ctx: IPublicModelPluginContext, options?: any): void;
/** Plugin name */
pluginName?: string;
/** Plugin metadata */
meta?: IPublicTypePluginMeta;
}
/**
* Plugin metadata definition
*/
interface IPublicTypePluginMeta {
/** Plugin dependencies */
dependencies?: string[];
/** Compatible engine versions */
engines?: Record<string, string>;
/** Preference declarations */
preferenceDeclaration?: IPublicTypePluginDeclaration;
/** Event prefix for plugin events */
eventPrefix?: string;
/** Command scope for plugin commands */
commandScope?: string;
}Plugin registration and lifecycle management.
/**
* Plugin registration options
*/
interface IPublicTypePluginRegisterOptions {
/** Plugin registration level */
level?: IPublicEnumPluginRegisterLevel;
/** Plugin configuration */
config?: Record<string, any>;
/** Plugin dependencies override */
dependencies?: string[];
/** Auto-start plugin */
autoStart?: boolean;
}
/**
* Plugin registration levels
*/
enum IPublicEnumPluginRegisterLevel {
/** System level plugins */
System = 1,
/** Editor level plugins */
Editor = 2,
/** Project level plugins */
Project = 3,
/** User level plugins */
User = 4
}Usage Examples:
import { IPublicTypePlugin, IPublicModelPluginContext } from "@alilc/lowcode-types";
// Simple plugin example
const loggerPlugin: IPublicTypePlugin = (ctx: IPublicModelPluginContext) => {
ctx.logger.info('Logger plugin initialized');
// Register a command
ctx.registerCommand({
name: 'logger.clear',
handler: () => {
ctx.logger.info('Log cleared');
}
});
// Listen to events
ctx.event.on('node.add', (node) => {
ctx.logger.info('Node added:', node.componentName);
});
};
loggerPlugin.pluginName = 'Logger';
loggerPlugin.meta = {
dependencies: [],
engines: {
lowcode: '^1.0.0'
}
};
// Complex plugin with skeleton integration
const toolbarPlugin: IPublicTypePlugin = (ctx: IPublicModelPluginContext, options) => {
const { skeleton } = ctx;
// Add toolbar button
skeleton.add({
area: 'toolbar',
name: 'save-button',
content: {
icon: 'save',
title: 'Save',
onClick: () => {
ctx.event.emit('project.save');
}
}
});
// Register hotkey
ctx.hotkey.bind('cmd+s', () => {
ctx.event.emit('project.save');
});
};
toolbarPlugin.pluginName = 'Toolbar';Context interface provided to plugins for accessing editor functionality.
/**
* Plugin context interface
*/
interface IPublicModelPluginContext {
/** Plugin name */
name: string;
/** Editor instance */
editor: IPublicModelEditor;
/** Plugin logger */
logger: IPublicApiLogger;
/** Plugin preferences */
preference: IPublicModelPreference;
/** Event system */
event: IPublicApiEvent;
/** Skeleton API */
skeleton: IPublicApiSkeleton;
/** Hotkey API */
hotkey: IPublicApiHotkey;
/** Material API */
material: IPublicApiMaterial;
/** Project API */
project: IPublicApiProject;
/** Register command */
registerCommand(command: IPublicTypeCommand): void;
/** Unregister command */
unregisterCommand(name: string): void;
}Runtime plugin instance management.
/**
* Plugin instance interface
*/
interface IPublicModelPluginInstance {
/** Plugin name */
name: string;
/** Plugin function */
plugin: IPublicTypePlugin;
/** Plugin options */
options?: any;
/** Plugin context */
context: IPublicModelPluginContext;
/** Plugin status */
status: 'registered' | 'initialized' | 'destroyed';
/** Initialize plugin */
init(): void;
/** Destroy plugin */
destroy(): void;
/** Check if plugin is enabled */
isEnabled(): boolean;
/** Enable plugin */
enable(): void;
/** Disable plugin */
disable(): void;
}