UNPKG

@dbs-portal/core-module-registry

Version:

Core module registry system for automatic module discovery and registration

324 lines (254 loc) 7.6 kB
# @dbs-portal/core-module-registry Core module registry system for automatic module discovery and registration in the DBS Portal framework. ## Features - 🔍 **Automatic Module Discovery** - Discovers modules from packages, configs, and runtime registration - 📝 **Module Metadata Management** - Complete module metadata schema with validation - **High-Performance Caching** - Built-in caching system with TTL and memory management - 🎯 **Event-Driven Architecture** - Real-time notifications for module changes - 🔒 **Permission Integration** - Built-in permission and role-based filtering - 📊 **Statistics & Monitoring** - Comprehensive stats and performance monitoring - 🛡️ **TypeScript-First** - Full TypeScript support with strict typing - 🌐 **Universal Compatibility** - Works in both browser and Node.js environments ## Installation ```bash yarn add @dbs-portal/core-module-registry ``` ## Quick Start ```typescript import { ModuleRegistry } from '@dbs-portal/core-module-registry' // Initialize registry const registry = ModuleRegistry.getInstance() await registry.initialize() // Get all active modules const modules = registry.getActiveModules() console.log(`Found ${modules.length} active modules`) // Register a new module await registry.registerModule({ id: 'my-module', name: 'My Module', version: '1.0.0', description: 'A sample module', category: 'business', icon: 'AppstoreOutlined', permissions: ['MyModule.View'], routes: [{ path: '/my-module', component: 'MyModulePage' }], navigation: [{ key: '/my-module', label: 'My Module', icon: 'AppstoreOutlined', path: '/my-module', category: 'business', order: 1 }], dependencies: [], status: 'active', priority: 100, author: 'Your Name', license: 'MIT' }) ``` ## Module Configuration Create a `module.config.ts` file in your module directory: ```typescript import { ModuleMetadata, ModuleCategory } from '@dbs-portal/core-module-registry' export const moduleConfig: ModuleMetadata = { id: 'file-management', name: 'File Management', version: '1.0.0', description: 'Comprehensive file management system', category: ModuleCategory.CONTENT, icon: 'FileOutlined', permissions: ['FileManagement.View', 'FileManagement.Upload'], routes: [ { path: '/files', component: 'FileManagementPage', permissions: ['FileManagement.View'] } ], navigation: [ { key: '/files', label: 'File Management', icon: 'FileOutlined', path: '/files', category: 'content', order: 1 } ], dependencies: ['@dbs-portal/core-ui'], status: 'active', priority: 100, author: 'DBS Portal Team', license: 'MIT' } ``` ## API Reference ### ModuleRegistry The main registry class for managing modules. #### Methods - `getInstance(options?)` - Get singleton instance - `initialize()` - Initialize with automatic discovery - `registerModule(metadata, source?)` - Register a module - `unregisterModule(moduleId)` - Unregister a module - `getModule(moduleId)` - Get specific module - `getAllModules()` - Get all modules - `getActiveModules()` - Get active modules only - `getModulesByCategory(category)` - Get modules by category - `searchModules(query)` - Search modules - `addListener(listener)` - Add event listener #### Events ```typescript interface RegistryListener { onModuleRegistered?(module: ModuleMetadata): void onModuleUnregistered?(module: ModuleMetadata): void onModuleUpdated?(module: ModuleMetadata): void onRegistryInitialized?(modules: ModuleMetadata[]): void onRegistryError?(error: Error, moduleId?: string): void } ``` ### ModuleDiscoveryService Service for discovering modules from various sources. #### Discovery Strategies 1. **Package Scanning** - Scans for `@dbs-portal/module-*` packages 2. **Config Detection** - Finds `module.config.ts` files 3. **Runtime Registration** - Allows manual registration #### Options ```typescript interface DiscoveryOptions { packageScanPaths?: string[] configScanPaths?: string[] packageNamePattern?: string configFilePattern?: string enablePackageScanning?: boolean enableConfigDetection?: boolean enableRuntimeRegistration?: boolean validateModules?: boolean ignorePatterns?: string[] } ``` ### Module Metadata Schema Complete module configuration schema: ```typescript interface ModuleMetadata { // Core identification id: string name: string version: string description: string // Categorization category: ModuleCategory tags: string[] // Visual configuration icon: string color?: string // Security permissions: string[] roles?: string[] // Routing routes: ModuleRoute[] // Navigation navigation: NavigationItem[] // Dependencies dependencies: string[] // Status and metadata status: ModuleStatus priority: number author: string license: string // Optional features features?: Record<string, boolean> config?: Record<string, any> } ``` ## Advanced Usage ### Custom Discovery ```typescript import { ModuleDiscoveryService } from '@dbs-portal/core-module-registry' const discovery = new ModuleDiscoveryService({ packageScanPaths: ['custom/modules/*'], configFilePattern: 'my-module.config.ts', validateModules: true }) const modules = await discovery.discoverModules() ``` ### Permission Filtering ```typescript import { filterModulesByPermissions } from '@dbs-portal/core-module-registry' const userPermissions = ['FileManagement.View', 'Chat.View'] const accessibleModules = filterModulesByPermissions(modules, userPermissions) ``` ### Caching ```typescript import { ModuleCache } from '@dbs-portal/core-module-registry' const cache = new ModuleCache(10 * 60 * 1000) // 10 minutes TTL cache.set('my-key', { data: 'value' }) const value = cache.get('my-key') ``` ### Performance Monitoring ```typescript import { measurePerformance } from '@dbs-portal/core-module-registry' const { result, duration } = await measurePerformance( () => registry.discoverModules(), 'Module Discovery' ) ``` ## Integration with DBS Portal ### Router Integration ```typescript // src/routes/dynamic.routes.ts import { ModuleRegistry } from '@dbs-portal/core-module-registry' export const createDynamicRoutes = async () => { const registry = ModuleRegistry.getInstance() const modules = registry.getActiveModules() return modules.flatMap(module => module.routes.map(route => ({ path: route.path, component: lazy(() => import(route.component)) })) ) } ``` ### Navigation Integration ```typescript // src/components/navigation/DynamicNavigation.tsx import { ModuleRegistry, groupModulesByCategory } from '@dbs-portal/core-module-registry' export const DynamicNavigation = () => { const registry = ModuleRegistry.getInstance() const modules = registry.getActiveModules() const groupedModules = groupModulesByCategory(modules) return ( <Menu> {Object.entries(groupedModules).map(([category, categoryModules]) => ( <SubMenu key={category} title={category}> {categoryModules.flatMap(module => module.navigation.map(nav => ( <Menu.Item key={nav.key} icon={nav.icon}> {nav.label} </Menu.Item> )) )} </SubMenu> ))} </Menu> ) } ``` ## Development ```bash # Install dependencies yarn install # Build the package yarn build # Run tests yarn test # Type checking yarn type-check # Linting yarn lint ``` ## License MIT © DBS Portal Team