42 lines
1.1 KiB
TypeScript
42 lines
1.1 KiB
TypeScript
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<TEndpoints extends ModuleEndpoints> {
|
|
routes: (container: ServiceContainer) => Router | Promise<Router>
|
|
lifecycle?: ModuleLifecycle
|
|
services?: (container: ServiceContainer) => void | Promise<void>
|
|
}
|
|
|
|
export function createApiModule<
|
|
TId extends string,
|
|
TEndpoints extends ModuleEndpoints
|
|
>(
|
|
config: ApiModuleConfig<TId, TEndpoints>,
|
|
options: CreateModuleOptions<TEndpoints>
|
|
): 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,
|
|
}
|
|
}
|