@pulzar/core
Version:
Next-generation Node.js framework for ultra-fast web applications with zero-reflection DI, GraphQL, WebSockets, events, and edge runtime support
160 lines • 4.57 kB
TypeScript
import type { FastifyInstance } from "fastify";
import type { Command } from "commander";
import { EventEmitter } from "events";
export interface PluginContext {
app: FastifyInstance;
config: any;
env: Record<string, string>;
isDevelopment: boolean;
isProduction: boolean;
}
export interface PluginHooks {
/**
* Called when configuring the Fastify server
*/
configureServer?(app: FastifyInstance, context: PluginContext): Promise<void> | void;
/**
* Called when configuring CLI commands
*/
configureCLI?(program: Command, context: PluginContext): Promise<void> | void;
/**
* Called after build is complete
*/
buildEnd?(context: PluginContext): Promise<void> | void;
/**
* Called when setting up GraphQL
*/
configureGraphQL?(schema: any, context: PluginContext): Promise<void> | void;
/**
* Called when setting up task scheduler
*/
configureTaskScheduler?(scheduler: any, context: PluginContext): Promise<void> | void;
/**
* Called when setting up WebSocket gateway
*/
configureWebSocket?(gateway: any, context: PluginContext): Promise<void> | void;
/**
* Called during dependency injection setup
*/
configureDI?(container: any, context: PluginContext): Promise<void> | void;
/**
* Called when setting up OpenAPI
*/
configureOpenAPI?(generator: any, context: PluginContext): Promise<void> | void;
/**
* Called before server starts
*/
beforeStart?(context: PluginContext): Promise<void> | void;
/**
* Called after server starts
*/
afterStart?(context: PluginContext): Promise<void> | void;
/**
* Called when server is shutting down
*/
beforeStop?(context: PluginContext): Promise<void> | void;
}
export interface IgnitePlugin extends PluginHooks {
name: string;
version?: string;
description?: string;
dependencies?: string[];
optionalDependencies?: string[];
/**
* Plugin setup function
*/
setup?(context: PluginContext): Promise<void> | void;
/**
* Plugin teardown function
*/
teardown?(context: PluginContext): Promise<void> | void;
}
export type PluginFactory = (options?: any) => IgnitePlugin;
export interface PluginManagerOptions {
plugins: (IgnitePlugin | PluginFactory)[];
enableHotReload?: boolean;
validateDependencies?: boolean;
}
export declare class PluginManager extends EventEmitter {
private plugins;
private context;
private initialized;
private options;
constructor(context: PluginContext, options: PluginManagerOptions);
/**
* Initialize all plugins
*/
initialize(): Promise<void>;
/**
* Load a single plugin
*/
loadPlugin(pluginOrFactory: IgnitePlugin | PluginFactory): Promise<void>;
/**
* Setup a plugin
*/
private setupPlugin;
/**
* Call a specific hook on all plugins
*/
callHook<K extends keyof PluginHooks>(hookName: K, ...args: Parameters<NonNullable<PluginHooks[K]>>): Promise<void>;
/**
* Get a plugin by name
*/
getPlugin(name: string): IgnitePlugin | undefined;
/**
* Get all loaded plugins
*/
getPlugins(): IgnitePlugin[];
/**
* Check if a plugin is loaded
*/
hasPlugin(name: string): boolean;
/**
* Validate plugin dependencies
*/
private validatePluginDependencies;
/**
* Sort plugins by dependencies using topological sort
*/
private sortPluginsByDependencies;
/**
* Shutdown all plugins
*/
shutdown(): Promise<void>;
/**
* Reload a plugin (for hot reload)
*/
reloadPlugin(name: string): Promise<void>;
}
/**
* Create a plugin context
*/
export declare function createPluginContext(app: FastifyInstance, config: any): PluginContext;
/**
* Plugin factory helper
*/
export declare function definePlugin(plugin: IgnitePlugin): IgnitePlugin;
export declare function definePlugin(factory: PluginFactory): PluginFactory;
/**
* Create a plugin with options
*/
export declare function createPlugin<T = any>(name: string, factory: (options?: T) => IgnitePlugin): PluginFactory;
/**
* Built-in plugins
*/
export declare const builtinPlugins: {
/**
* Development tools plugin
*/
devtools: PluginFactory;
/**
* Metrics plugin
*/
metrics: PluginFactory;
/**
* Health check plugin
*/
health: PluginFactory;
};
export default PluginManager;
//# sourceMappingURL=plugin-manager.d.ts.map