import type { Router } from 'express' import type { ServiceContainer } from './container.js' import type { ApiModule, ModuleMetadata, ModuleLifecycle } from './types.js' import type { ApiModuleConfig, ModuleEndpoints } from '../../shared/modules/types.js' export interface CreateModuleOptions { routes: (container: ServiceContainer) => Router | Promise lifecycle?: ModuleLifecycle services?: (container: ServiceContainer) => void | Promise } export function createApiModule< TId extends string, TEndpoints extends ModuleEndpoints >( config: ApiModuleConfig, options: CreateModuleOptions ): ApiModule { const metadata: ModuleMetadata = { id: config.id, name: config.name, version: config.version, basePath: config.basePath, order: config.order, dependencies: config.dependencies, } const lifecycle: ModuleLifecycle | undefined = options.lifecycle ? options.lifecycle : options.services ? { onLoad: options.services, } : undefined return { metadata, lifecycle, createRouter: options.routes, } }