stratal 0.0.16 → 0.0.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -0
- package/dist/{application-zG8b-pol.d.mts → application-DfPtIzxF.d.mts} +65 -4
- package/dist/application-DfPtIzxF.d.mts.map +1 -0
- package/dist/{base-email.provider-Cuw4OAB0.mjs → base-email.provider-DypUAfWm.mjs} +1 -1
- package/dist/{base-email.provider-Cuw4OAB0.mjs.map → base-email.provider-DypUAfWm.mjs.map} +1 -1
- package/dist/bin/cloudflare-workers-loader.mjs +0 -0
- package/dist/bin/quarry.mjs +1 -50
- package/dist/bin/quarry.mjs.map +1 -1
- package/dist/cache/index.d.mts +1 -1
- package/dist/cache/index.mjs +10 -11
- package/dist/cache/index.mjs.map +1 -1
- package/dist/{colors-DJaRDXoS.mjs → colors-Y7WIFXs7.mjs} +1 -1
- package/dist/{colors-DJaRDXoS.mjs.map → colors-Y7WIFXs7.mjs.map} +1 -1
- package/dist/{command-BvCOD6df.mjs → command-B1CPgsrU.mjs} +6 -3
- package/dist/{command-BvCOD6df.mjs.map → command-B1CPgsrU.mjs.map} +1 -1
- package/dist/{command-B-QH-Vu3.d.mts → command-TnkPYWta.d.mts} +2 -2
- package/dist/{command-B-QH-Vu3.d.mts.map → command-TnkPYWta.d.mts.map} +1 -1
- package/dist/config/index.d.mts +2 -2
- package/dist/config/index.mjs +10 -11
- package/dist/config/index.mjs.map +1 -1
- package/dist/consumer-registry-Bymm6ff4.d.mts +142 -0
- package/dist/consumer-registry-Bymm6ff4.d.mts.map +1 -0
- package/dist/cron/index.d.mts +3 -116
- package/dist/cron/index.d.mts.map +1 -1
- package/dist/cron/index.mjs +3 -4
- package/dist/{cron-manager-DR7fiG6o.mjs → cron-manager-CFBamKKk.mjs} +3 -3
- package/dist/{cron-manager-DR7fiG6o.mjs.map → cron-manager-CFBamKKk.mjs.map} +1 -1
- package/dist/cron-manager-D7imGwUT.d.mts +117 -0
- package/dist/cron-manager-D7imGwUT.d.mts.map +1 -0
- package/dist/di/index.d.mts +1 -1
- package/dist/di/index.mjs +2 -3
- package/dist/email/index.d.mts +3 -3
- package/dist/email/index.mjs +16 -17
- package/dist/email/index.mjs.map +1 -1
- package/dist/errors/index.d.mts +1 -1
- package/dist/errors/index.mjs +2 -3
- package/dist/{errors-CtCi1wn6.mjs → errors-DSKapqD8.mjs} +4 -4
- package/dist/{errors-CtCi1wn6.mjs.map → errors-DSKapqD8.mjs.map} +1 -1
- package/dist/{errors-H3TZnVeX.mjs → errors-DuAR5Wke.mjs} +2 -2
- package/dist/{errors-H3TZnVeX.mjs.map → errors-DuAR5Wke.mjs.map} +1 -1
- package/dist/events/index.mjs +2 -3
- package/dist/{events-CXl-o1Ad.mjs → events-CvUSgEuN.mjs} +2 -3
- package/dist/{events-CXl-o1Ad.mjs.map → events-CvUSgEuN.mjs.map} +1 -1
- package/dist/{gateway-context-BkZ4UKaX.mjs → gateway-context-CNOLkLUC.mjs} +4 -4
- package/dist/{gateway-context-BkZ4UKaX.mjs.map → gateway-context-CNOLkLUC.mjs.map} +1 -1
- package/dist/guards/index.d.mts +1 -1
- package/dist/i18n/index.d.mts +3 -3
- package/dist/i18n/index.mjs +15 -15
- package/dist/i18n/validation/index.d.mts +1 -1
- package/dist/i18n/validation/index.mjs +1 -1
- package/dist/{i18n.module-W8OJxg3d.mjs → i18n.module-Dn9SrFdS.mjs} +210 -160
- package/dist/i18n.module-Dn9SrFdS.mjs.map +1 -0
- package/dist/{index-BJWm863C.d.mts → index-BFCxSp_f.d.mts} +82 -73
- package/dist/index-BFCxSp_f.d.mts.map +1 -0
- package/dist/{index-D9iYu2Yc.d.mts → index-DGRe6Yoa.d.mts} +5 -144
- package/dist/index-DGRe6Yoa.d.mts.map +1 -0
- package/dist/{index-DVhdhLvE.d.mts → index-NGxg-KP_.d.mts} +4 -4
- package/dist/{index-DVhdhLvE.d.mts.map → index-NGxg-KP_.d.mts.map} +1 -1
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +19 -19
- package/dist/{is-command-BfCgWAcQ.mjs → is-command-DJVI6wEJ.mjs} +2 -2
- package/dist/{is-command-BfCgWAcQ.mjs.map → is-command-DJVI6wEJ.mjs.map} +1 -1
- package/dist/{is-seeder-CebjZCDn.mjs → is-seeder-D5MIEcdz.mjs} +1 -1
- package/dist/{is-seeder-CebjZCDn.mjs.map → is-seeder-D5MIEcdz.mjs.map} +1 -1
- package/dist/logger/index.mjs +1 -2
- package/dist/{logger-BR1-s1Um.mjs → logger-CGT91VY6.mjs} +170 -4
- package/dist/logger-CGT91VY6.mjs.map +1 -0
- package/dist/middleware/index.d.mts +1 -1
- package/dist/middleware/index.mjs +4 -5
- package/dist/{middleware-C0Ebzswy.mjs → middleware-Bl-b5pkt.mjs} +3 -3
- package/dist/{middleware-C0Ebzswy.mjs.map → middleware-Bl-b5pkt.mjs.map} +1 -1
- package/dist/module/index.d.mts +2 -117
- package/dist/module/index.d.mts.map +1 -1
- package/dist/module/index.mjs +10 -11
- package/dist/module-registry-CmjBX6ol.d.mts +121 -0
- package/dist/module-registry-CmjBX6ol.d.mts.map +1 -0
- package/dist/{module-BgdxxzBe.mjs → module-tUtyVJ5E.mjs} +9 -8
- package/dist/module-tUtyVJ5E.mjs.map +1 -0
- package/dist/openapi/index.d.mts +54 -54
- package/dist/openapi/index.d.mts.map +1 -1
- package/dist/openapi/index.mjs +15 -15
- package/dist/openapi-tools.service-B3TxYKoQ.mjs +197 -0
- package/dist/openapi-tools.service-B3TxYKoQ.mjs.map +1 -0
- package/dist/openapi.service-DGnX3Fc4.d.mts +58 -0
- package/dist/openapi.service-DGnX3Fc4.d.mts.map +1 -0
- package/dist/quarry/index.d.mts +109 -28
- package/dist/quarry/index.d.mts.map +1 -1
- package/dist/quarry/index.mjs +9 -7
- package/dist/quarry-registry-B2rkO-JS.mjs +683 -0
- package/dist/quarry-registry-B2rkO-JS.mjs.map +1 -0
- package/dist/queue/index.d.mts +2 -1
- package/dist/queue/index.mjs +11 -12
- package/dist/queue/index.mjs.map +1 -1
- package/dist/{queue.module-BZvmeAMj.mjs → queue.module-BtI8f4Jo.mjs} +4 -4
- package/dist/{queue.module-BZvmeAMj.mjs.map → queue.module-BtI8f4Jo.mjs.map} +1 -1
- package/dist/{resend.provider-BCCACQAU.mjs → resend.provider-bXMEkdRJ.mjs} +4 -5
- package/dist/{resend.provider-BCCACQAU.mjs.map → resend.provider-bXMEkdRJ.mjs.map} +1 -1
- package/dist/router/index.d.mts +1 -1
- package/dist/router/index.mjs +14 -14
- package/dist/{router-context-BEJe9HEB.mjs → router-context-D9R1v2Ac.mjs} +7 -4
- package/dist/router-context-D9R1v2Ac.mjs.map +1 -0
- package/dist/{s3-storage.provider-BLlzQYiJ.mjs → s3-storage.provider-CttzNnDR.mjs} +5 -6
- package/dist/{s3-storage.provider-BLlzQYiJ.mjs.map → s3-storage.provider-CttzNnDR.mjs.map} +1 -1
- package/dist/seeder/index.d.mts +3 -3
- package/dist/seeder/index.mjs +6 -7
- package/dist/{seeder-Cupi5jl-.mjs → seeder-R7RXJC35.mjs} +20 -17
- package/dist/seeder-R7RXJC35.mjs.map +1 -0
- package/dist/{smtp.provider-B8XtOcHU.mjs → smtp.provider-DrbHQztF.mjs} +4 -5
- package/dist/{smtp.provider-B8XtOcHU.mjs.map → smtp.provider-DrbHQztF.mjs.map} +1 -1
- package/dist/storage/index.d.mts +2 -195
- package/dist/storage/index.d.mts.map +1 -1
- package/dist/storage/index.mjs +13 -14
- package/dist/storage/providers/index.d.mts +272 -0
- package/dist/storage/providers/index.d.mts.map +1 -0
- package/dist/storage/providers/index.mjs +5 -0
- package/dist/{storage-By_ow2o_.mjs → storage-CZKHOhci.mjs} +7 -7
- package/dist/{storage-By_ow2o_.mjs.map → storage-CZKHOhci.mjs.map} +1 -1
- package/dist/storage-provider.interface-0IqcdhBf.d.mts +197 -0
- package/dist/storage-provider.interface-0IqcdhBf.d.mts.map +1 -0
- package/dist/{stratal-CE0iTz4f.mjs → stratal-D5smIU1y.mjs} +22 -12
- package/dist/stratal-D5smIU1y.mjs.map +1 -0
- package/dist/{usage-generator-C9hWziY4.mjs → usage-generator-CVIsENuE.mjs} +2 -2
- package/dist/{usage-generator-C9hWziY4.mjs.map → usage-generator-CVIsENuE.mjs.map} +1 -1
- package/dist/{validation-Bh875Lyg.mjs → validation-DQTC259A.mjs} +4 -4
- package/dist/{validation-Bh875Lyg.mjs.map → validation-DQTC259A.mjs.map} +1 -1
- package/dist/websocket/index.d.mts +1 -1
- package/dist/websocket/index.mjs +4 -5
- package/dist/workers/index.d.mts +1 -1
- package/dist/workers/index.mjs +19 -19
- package/package.json +13 -8
- package/dist/application-zG8b-pol.d.mts.map +0 -1
- package/dist/decorate-D5j-d9_z.mjs +0 -171
- package/dist/decorate-D5j-d9_z.mjs.map +0 -1
- package/dist/i18n.module-W8OJxg3d.mjs.map +0 -1
- package/dist/index-BJWm863C.d.mts.map +0 -1
- package/dist/index-D9iYu2Yc.d.mts.map +0 -1
- package/dist/logger-BR1-s1Um.mjs.map +0 -1
- package/dist/module-BgdxxzBe.mjs.map +0 -1
- package/dist/quarry-registry-DCwqVcRp.mjs +0 -310
- package/dist/quarry-registry-DCwqVcRp.mjs.map +0 -1
- package/dist/router-context-BEJe9HEB.mjs.map +0 -1
- package/dist/seeder-Cupi5jl-.mjs.map +0 -1
- package/dist/stratal-CE0iTz4f.mjs.map +0 -1
- package/dist/types-CLhOhYsQ.d.mts +0 -64
- package/dist/types-CLhOhYsQ.d.mts.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"middleware-C0Ebzswy.mjs","names":[],"sources":["../src/middleware/middleware-consumer.ts","../src/router/decorators/controller.decorator.ts","../src/middleware/middleware-configuration.service.ts"],"sourcesContent":["import type { Middleware } from '../router/middleware.interface'\nimport type { Constructor } from '../types'\nimport type {\n MiddlewareConfigEntry,\n MiddlewareConsumer as IMiddlewareConsumer,\n MiddlewareBuilder as IMiddlewareBuilder,\n MiddlewareRouteTarget,\n RouteInfo,\n} from './types'\n\n/**\n * Builder for configuring middleware routes and exclusions\n *\n * Provides fluent API for specifying where middleware should apply.\n */\nclass MiddlewareBuilderImpl implements IMiddlewareBuilder {\n private middlewares: Constructor<Middleware>[]\n private excludedRoutes: RouteInfo[] = []\n private consumer: MiddlewareConsumerImpl\n\n constructor(\n middlewares: Constructor<Middleware>[],\n consumer: MiddlewareConsumerImpl\n ) {\n this.middlewares = middlewares\n this.consumer = consumer\n }\n\n /**\n * Exclude specific routes from middleware\n *\n * @param routes - Routes to exclude (path strings or RouteInfo objects)\n * @returns this for method chaining\n *\n * @example\n * ```typescript\n * consumer\n * .apply(AuthMiddleware)\n * .exclude('/health', { path: '/api/public', method: 'get' })\n * .forRoutes('*')\n * ```\n */\n exclude(...routes: (string | RouteInfo)[]): this {\n for (const route of routes) {\n if (typeof route === 'string') {\n this.excludedRoutes.push({ path: route })\n } else {\n this.excludedRoutes.push(route)\n }\n }\n return this\n }\n\n /**\n * Apply middleware to specified routes\n *\n * This method finalizes the configuration and registers it with the consumer.\n *\n * @param targets - Controller classes, RouteInfo objects, or '*' for global\n *\n * @example\n * ```typescript\n * // Apply to all routes\n * consumer.apply(LoggingMiddleware).forRoutes('*')\n *\n * // Apply to specific controllers\n * consumer.apply(CorsMiddleware).forRoutes(ApiController, WebhooksController)\n *\n * // Apply to specific paths\n * consumer.apply(RateLimitMiddleware).forRoutes(\n * { path: '/api/v1/auth', method: 'post' }\n * )\n * ```\n */\n forRoutes(...targets: MiddlewareRouteTarget[]): void {\n const entry: MiddlewareConfigEntry = {\n middlewares: this.middlewares,\n excludes: this.excludedRoutes,\n routes: targets,\n }\n this.consumer.addEntry(entry)\n }\n}\n\n/**\n * Consumer for configuring middleware in modules\n *\n * Provides fluent API for registering middleware with route targeting.\n * Used by modules implementing MiddlewareConfigurable interface.\n *\n * @example\n * ```typescript\n * @Module({ providers: [...] })\n * export class AppModule implements MiddlewareConfigurable {\n * configure(consumer: MiddlewareConsumer): void {\n * // Global logging middleware (excludes health check)\n * consumer\n * .apply(LoggingMiddleware)\n * .exclude('/health')\n * .forRoutes('*')\n *\n * // CORS middleware for specific controllers\n * consumer\n * .apply(CorsMiddleware)\n * .forRoutes(ApiController, WebhooksController)\n *\n * // Rate limiting for auth endpoints\n * consumer\n * .apply(RateLimitMiddleware)\n * .forRoutes({ path: '/api/v1/auth/*', method: 'post' })\n * }\n * }\n * ```\n */\nexport class MiddlewareConsumerImpl implements IMiddlewareConsumer {\n private entries: MiddlewareConfigEntry[] = []\n\n /**\n * Start configuring middleware\n *\n * @param middlewares - Middleware classes to apply\n * @returns Builder for configuring routes and exclusions\n */\n apply(...middlewares: Constructor<Middleware>[]): IMiddlewareBuilder {\n return new MiddlewareBuilderImpl(middlewares, this)\n }\n\n /**\n * Add a configuration entry (called by builder)\n * @internal\n */\n addEntry(entry: MiddlewareConfigEntry): void {\n this.entries.push(entry)\n }\n\n /**\n * Get all configured middleware entries\n */\n getEntries(): MiddlewareConfigEntry[] {\n return this.entries\n }\n}\n\n/**\n * Create a new middleware consumer instance\n */\nexport function createMiddlewareConsumer(): IMiddlewareConsumer {\n return new MiddlewareConsumerImpl()\n}\n","import { Transient } from '../../di/decorators'\nimport { type Constructor } from '../../types'\nimport { ROUTE_METADATA_KEYS } from '../constants'\nimport { type ControllerOptions } from '../types'\n\nconst CONTROLLER_ROUTE_KEY = ROUTE_METADATA_KEYS.CONTROLLER_ROUTE\n\n/**\n * Base controller decorator for route registration\n *\n * This is the core controller decorator that handles:\n * - Transient scope registration (request-scoped)\n * - Route metadata storage\n * - Controller options (tags, security schemes, hideFromDocs)\n *\n * @param route - Base route for this controller (e.g., '/api/v1/users')\n * @param options - Optional configuration (tags, security schemes, hideFromDocs)\n *\n * @example\n * ```typescript\n * import { Controller } from 'stratal/router'\n *\n * @Controller('/api/v1/users', { tags: ['Users'] })\n * export class UsersController implements IController {\n * // All routes accessible\n * }\n * ```\n */\nexport function Controller(route: string, options?: ControllerOptions) {\n return function <T extends Constructor>(target: T) {\n // Wrap @Transient (handles @injectable and scope metadata)\n Transient()(target)\n\n // Store route metadata on the class\n Reflect.defineMetadata(CONTROLLER_ROUTE_KEY, route, target)\n\n // Store options metadata if provided\n if (options) {\n Reflect.defineMetadata(ROUTE_METADATA_KEYS.CONTROLLER_OPTIONS, options, target)\n }\n\n return target\n }\n}\n\n/**\n * Get the route from controller class metadata\n *\n * @param target - Controller class or instance\n * @returns Route string or undefined if not set\n */\nexport function getControllerRoute(target: object): string | undefined {\n // Check if target is a class constructor (function) or an instance\n // If class, get metadata from it directly; if instance, get from constructor\n const metadataTarget = typeof target === 'function' ? target : (target as { constructor: object }).constructor\n return Reflect.getMetadata(CONTROLLER_ROUTE_KEY, metadataTarget) as string | undefined\n}\n\n/**\n * Get the options from controller class metadata\n *\n * @param target - Controller class or instance\n * @returns Controller options or undefined if not set\n */\nexport function getControllerOptions(target: object): ControllerOptions | undefined {\n const metadataTarget = typeof target === 'function' ? target : (target as { constructor: object }).constructor\n return Reflect.getMetadata(ROUTE_METADATA_KEYS.CONTROLLER_OPTIONS, metadataTarget) as ControllerOptions | undefined\n}\n\n/**\n * Get the version from controller class metadata\n *\n * @param target - Controller class or instance\n * @returns Version string, array, VERSION_NEUTRAL symbol, or undefined if not set\n */\nexport function getControllerVersion(target: object): ControllerOptions['version'] {\n const options = getControllerOptions(target)\n return options?.version\n}\n","import type { Context } from 'hono'\nimport type { OpenAPIHono } from '../i18n/validation'\nimport type { Container } from '../di'\nimport type { LoggerService } from '../logger'\nimport type { IController } from '../router/controller'\nimport { getControllerRoute } from '../router/decorators/controller.decorator'\nimport type { Middleware } from '../router/middleware.interface'\nimport { RouterContext } from '../router/router-context'\nimport type { HttpMethod, RouterEnv, VersioningOptions } from '../router/types'\nimport type { Constructor } from '../types'\nimport type { MiddlewareConfigEntry, RouteInfo } from './types'\n\n/**\n * Service for applying middleware configurations to Hono app\n *\n * Processes MiddlewareConfigEntry[] from modules and registers\n * appropriate middleware handlers with route matching.\n */\nexport class MiddlewareConfigurationService {\n constructor(\n private readonly logger: LoggerService,\n private readonly versioningOptions: VersioningOptions | null = null,\n ) { }\n\n /**\n * Apply middleware configurations to the Hono app\n *\n * @param app - Hono application instance\n * @param configs - Middleware configuration entries from modules\n * @param controllers - All registered controller classes (for route resolution)\n * @param container - DI container for resolving middleware instances\n */\n applyMiddlewares(\n app: OpenAPIHono<RouterEnv>,\n configs: MiddlewareConfigEntry[],\n controllers: Constructor<IController>[],\n container: Container\n ): void {\n for (const config of configs) {\n this.applyMiddlewareConfig(app, config, controllers, container)\n }\n }\n\n /**\n * Apply a single middleware configuration entry\n */\n private applyMiddlewareConfig(\n app: OpenAPIHono<RouterEnv>,\n config: MiddlewareConfigEntry,\n controllers: Constructor<IController>[],\n container: Container\n ): void {\n const { middlewares, excludes, routes } = config\n\n // Resolve route patterns from targets\n const routePatterns = this.resolveRoutePatterns(routes, controllers)\n\n // Log the configuration for debugging\n this.logger.debug('Applying middleware configuration', {\n middlewares: middlewares.map(m => m.name),\n routes: routePatterns,\n excludes: excludes,\n })\n\n // Apply middleware to each route pattern\n for (const pattern of routePatterns) {\n this.registerMiddlewareForPattern(app, middlewares, pattern, excludes, container)\n }\n }\n\n /**\n * Resolve route targets into concrete route patterns\n */\n private resolveRoutePatterns(\n targets: (Constructor<IController> | RouteInfo | '*')[],\n _controllers: Constructor<IController>[]\n ): RouteInfo[] {\n const patterns: RouteInfo[] = []\n\n for (const target of targets) {\n if (target === '*') {\n // Global middleware - apply to all routes\n patterns.push({ path: '*' })\n } else if (typeof target === 'function') {\n // Controller class - get its route from metadata\n const route = getControllerRoute(target)\n if (route) {\n // Add wildcard for all paths under this controller\n patterns.push({ path: `${route}/*` })\n // Also match the exact path\n patterns.push({ path: route })\n } else {\n this.logger.warn('Controller has no route metadata', { controller: target.name })\n }\n } else {\n // RouteInfo object - resolve version if present\n if (!this.versioningOptions || !target.version) {\n // Fast path: no versioning or no version on target — push directly\n patterns.push(target)\n } else {\n const resolved = this.resolveVersionedRouteInfo(target)\n patterns.push(...resolved)\n }\n }\n }\n\n return patterns\n }\n\n /**\n * Resolve a RouteInfo with version into versioned path(s).\n * If versioning is disabled or no version is specified, returns the RouteInfo as-is.\n */\n private resolveVersionedRouteInfo(routeInfo: RouteInfo): RouteInfo[] {\n if (!this.versioningOptions || !routeInfo.version) {\n return [routeInfo]\n }\n\n const prefix = this.versioningOptions.prefix ?? 'v'\n const versions = Array.isArray(routeInfo.version) ? routeInfo.version : [routeInfo.version]\n const results: RouteInfo[] = []\n\n for (const v of versions) {\n const versionedPath = `/${prefix}${v}${routeInfo.path}`\n // Add exact path match\n results.push({ path: versionedPath, method: routeInfo.method })\n // Add wildcard match for sub-paths\n results.push({ path: `${versionedPath}/*`, method: routeInfo.method })\n }\n\n return results\n }\n\n /**\n * Register middleware handlers for a specific route pattern\n */\n private registerMiddlewareForPattern(\n app: OpenAPIHono<RouterEnv>,\n middlewares: Constructor<Middleware>[],\n pattern: RouteInfo,\n excludes: RouteInfo[],\n container: Container\n ): void {\n const path = pattern.path\n const methods = pattern.method\n ? (Array.isArray(pattern.method) ? pattern.method : [pattern.method])\n : undefined\n\n // Create the middleware handler\n const handler = this.createMiddlewareHandler(middlewares, excludes, container)\n\n // Register with Hono\n if (methods && methods.length > 0) {\n // Method-specific registration\n for (const method of methods) {\n this.registerForMethod(app, method, path, handler)\n }\n } else {\n // All methods\n app.use(path, handler)\n }\n }\n\n /**\n * Register handler for a specific HTTP method\n */\n private registerForMethod(\n app: OpenAPIHono<RouterEnv>,\n method: HttpMethod,\n path: string,\n handler: (c: Context<RouterEnv>, next: () => Promise<void>) => Promise<void>\n ): void {\n switch (method) {\n case 'get':\n app.get(path, handler)\n break\n case 'post':\n app.post(path, handler)\n break\n case 'put':\n app.put(path, handler)\n break\n case 'delete':\n app.delete(path, handler)\n break\n case 'patch':\n app.patch(path, handler)\n break\n default:\n app.use(path, handler)\n }\n }\n\n /**\n * Create a middleware handler function that executes the middleware chain\n */\n private createMiddlewareHandler(\n middlewares: Constructor<Middleware>[],\n excludes: RouteInfo[],\n container: Container\n ): (c: Context<RouterEnv>, next: () => Promise<void>) => Promise<void> {\n return async (c, next) => {\n const requestPath = c.req.path\n const requestMethod = c.req.method.toLowerCase() as HttpMethod\n\n // Check if this request should be excluded\n if (this.isExcluded(requestPath, requestMethod, excludes)) {\n await next()\n return\n }\n\n // Create RouterContext for middleware\n const ctx = new RouterContext(c)\n\n // Execute middleware chain\n await this.executeMiddlewareChain(middlewares, ctx, container, next)\n }\n }\n\n /**\n * Check if a request matches any exclusion pattern\n */\n private isExcluded(\n requestPath: string,\n requestMethod: HttpMethod,\n excludes: RouteInfo[]\n ): boolean {\n for (const exclude of excludes) {\n if (this.matchesRoute(requestPath, requestMethod, exclude)) {\n return true\n }\n }\n return false\n }\n\n /**\n * Check if request matches a route pattern\n */\n private matchesRoute(\n requestPath: string,\n requestMethod: HttpMethod,\n route: RouteInfo\n ): boolean {\n // Check method match (if specified)\n if (route.method) {\n const methods = Array.isArray(route.method) ? route.method : [route.method]\n if (!methods.includes(requestMethod)) {\n return false\n }\n }\n\n // Check path match\n return this.matchesPath(requestPath, route.path)\n }\n\n /**\n * Match request path against pattern\n * Supports wildcards: /api/* matches /api/users, /api/v1/users\n */\n private matchesPath(requestPath: string, pattern: string): boolean {\n // Exact match\n if (pattern === requestPath) {\n return true\n }\n\n // Global wildcard\n if (pattern === '*') {\n return true\n }\n\n // Wildcard pattern (e.g., /api/*)\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n return requestPath === prefix || requestPath.startsWith(prefix + '/')\n }\n\n // Path parameter pattern (e.g., /api/users/:id)\n // Convert to regex for matching\n const regexPattern = pattern\n .replace(/:[^/]+/g, '[^/]+') // Replace :param with regex\n .replace(/\\*/g, '.*') // Replace * with regex\n const regex = new RegExp(`^${regexPattern}$`)\n return regex.test(requestPath)\n }\n\n /**\n * Execute middleware chain in order\n */\n private async executeMiddlewareChain(\n middlewares: Constructor<Middleware>[],\n ctx: RouterContext,\n container: Container,\n finalNext: () => Promise<void>\n ): Promise<void> {\n // Build middleware chain from end to start\n let chain = finalNext\n\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const MiddlewareClass = middlewares[i]\n const currentNext = chain\n\n chain = async () => {\n // Resolve middleware from request-scoped container\n const requestContainer = ctx.getContainer()\n const middleware = requestContainer.resolve<Middleware>(MiddlewareClass)\n await middleware.handle(ctx, currentNext)\n }\n }\n\n // Execute the chain\n await chain()\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"middleware-Bl-b5pkt.mjs","names":[],"sources":["../src/middleware/middleware-consumer.ts","../src/router/decorators/controller.decorator.ts","../src/middleware/middleware-configuration.service.ts"],"sourcesContent":["import type { Middleware } from '../router/middleware.interface'\nimport type { Constructor } from '../types'\nimport type {\n MiddlewareConfigEntry,\n MiddlewareConsumer as IMiddlewareConsumer,\n MiddlewareBuilder as IMiddlewareBuilder,\n MiddlewareRouteTarget,\n RouteInfo,\n} from './types'\n\n/**\n * Builder for configuring middleware routes and exclusions\n *\n * Provides fluent API for specifying where middleware should apply.\n */\nclass MiddlewareBuilderImpl implements IMiddlewareBuilder {\n private middlewares: Constructor<Middleware>[]\n private excludedRoutes: RouteInfo[] = []\n private consumer: MiddlewareConsumerImpl\n\n constructor(\n middlewares: Constructor<Middleware>[],\n consumer: MiddlewareConsumerImpl\n ) {\n this.middlewares = middlewares\n this.consumer = consumer\n }\n\n /**\n * Exclude specific routes from middleware\n *\n * @param routes - Routes to exclude (path strings or RouteInfo objects)\n * @returns this for method chaining\n *\n * @example\n * ```typescript\n * consumer\n * .apply(AuthMiddleware)\n * .exclude('/health', { path: '/api/public', method: 'get' })\n * .forRoutes('*')\n * ```\n */\n exclude(...routes: (string | RouteInfo)[]): this {\n for (const route of routes) {\n if (typeof route === 'string') {\n this.excludedRoutes.push({ path: route })\n } else {\n this.excludedRoutes.push(route)\n }\n }\n return this\n }\n\n /**\n * Apply middleware to specified routes\n *\n * This method finalizes the configuration and registers it with the consumer.\n *\n * @param targets - Controller classes, RouteInfo objects, or '*' for global\n *\n * @example\n * ```typescript\n * // Apply to all routes\n * consumer.apply(LoggingMiddleware).forRoutes('*')\n *\n * // Apply to specific controllers\n * consumer.apply(CorsMiddleware).forRoutes(ApiController, WebhooksController)\n *\n * // Apply to specific paths\n * consumer.apply(RateLimitMiddleware).forRoutes(\n * { path: '/api/v1/auth', method: 'post' }\n * )\n * ```\n */\n forRoutes(...targets: MiddlewareRouteTarget[]): void {\n const entry: MiddlewareConfigEntry = {\n middlewares: this.middlewares,\n excludes: this.excludedRoutes,\n routes: targets,\n }\n this.consumer.addEntry(entry)\n }\n}\n\n/**\n * Consumer for configuring middleware in modules\n *\n * Provides fluent API for registering middleware with route targeting.\n * Used by modules implementing MiddlewareConfigurable interface.\n *\n * @example\n * ```typescript\n * @Module({ providers: [...] })\n * export class AppModule implements MiddlewareConfigurable {\n * configure(consumer: MiddlewareConsumer): void {\n * // Global logging middleware (excludes health check)\n * consumer\n * .apply(LoggingMiddleware)\n * .exclude('/health')\n * .forRoutes('*')\n *\n * // CORS middleware for specific controllers\n * consumer\n * .apply(CorsMiddleware)\n * .forRoutes(ApiController, WebhooksController)\n *\n * // Rate limiting for auth endpoints\n * consumer\n * .apply(RateLimitMiddleware)\n * .forRoutes({ path: '/api/v1/auth/*', method: 'post' })\n * }\n * }\n * ```\n */\nexport class MiddlewareConsumerImpl implements IMiddlewareConsumer {\n private entries: MiddlewareConfigEntry[] = []\n\n /**\n * Start configuring middleware\n *\n * @param middlewares - Middleware classes to apply\n * @returns Builder for configuring routes and exclusions\n */\n apply(...middlewares: Constructor<Middleware>[]): IMiddlewareBuilder {\n return new MiddlewareBuilderImpl(middlewares, this)\n }\n\n /**\n * Add a configuration entry (called by builder)\n * @internal\n */\n addEntry(entry: MiddlewareConfigEntry): void {\n this.entries.push(entry)\n }\n\n /**\n * Get all configured middleware entries\n */\n getEntries(): MiddlewareConfigEntry[] {\n return this.entries\n }\n}\n\n/**\n * Create a new middleware consumer instance\n */\nexport function createMiddlewareConsumer(): IMiddlewareConsumer {\n return new MiddlewareConsumerImpl()\n}\n","import { Transient } from '../../di/decorators'\nimport { type Constructor } from '../../types'\nimport { ROUTE_METADATA_KEYS } from '../constants'\nimport { type ControllerOptions } from '../types'\n\nconst CONTROLLER_ROUTE_KEY = ROUTE_METADATA_KEYS.CONTROLLER_ROUTE\n\n/**\n * Base controller decorator for route registration\n *\n * This is the core controller decorator that handles:\n * - Transient scope registration (request-scoped)\n * - Route metadata storage\n * - Controller options (tags, security schemes, hideFromDocs)\n *\n * @param route - Base route for this controller (e.g., '/api/v1/users')\n * @param options - Optional configuration (tags, security schemes, hideFromDocs)\n *\n * @example\n * ```typescript\n * import { Controller } from 'stratal/router'\n *\n * @Controller('/api/v1/users', { tags: ['Users'] })\n * export class UsersController implements IController {\n * // All routes accessible\n * }\n * ```\n */\nexport function Controller(route: string, options?: ControllerOptions) {\n return function <T extends Constructor>(target: T) {\n // Wrap @Transient (handles @injectable and scope metadata)\n Transient()(target)\n\n // Store route metadata on the class\n Reflect.defineMetadata(CONTROLLER_ROUTE_KEY, route, target)\n\n // Store options metadata if provided\n if (options) {\n Reflect.defineMetadata(ROUTE_METADATA_KEYS.CONTROLLER_OPTIONS, options, target)\n }\n\n return target\n }\n}\n\n/**\n * Get the route from controller class metadata\n *\n * @param target - Controller class or instance\n * @returns Route string or undefined if not set\n */\nexport function getControllerRoute(target: object): string | undefined {\n // Check if target is a class constructor (function) or an instance\n // If class, get metadata from it directly; if instance, get from constructor\n const metadataTarget = typeof target === 'function' ? target : (target as { constructor: object }).constructor\n return Reflect.getMetadata(CONTROLLER_ROUTE_KEY, metadataTarget) as string | undefined\n}\n\n/**\n * Get the options from controller class metadata\n *\n * @param target - Controller class or instance\n * @returns Controller options or undefined if not set\n */\nexport function getControllerOptions(target: object): ControllerOptions | undefined {\n const metadataTarget = typeof target === 'function' ? target : (target as { constructor: object }).constructor\n return Reflect.getMetadata(ROUTE_METADATA_KEYS.CONTROLLER_OPTIONS, metadataTarget) as ControllerOptions | undefined\n}\n\n/**\n * Get the version from controller class metadata\n *\n * @param target - Controller class or instance\n * @returns Version string, array, VERSION_NEUTRAL symbol, or undefined if not set\n */\nexport function getControllerVersion(target: object): ControllerOptions['version'] {\n const options = getControllerOptions(target)\n return options?.version\n}\n","import type { Context } from 'hono'\nimport type { OpenAPIHono } from '../i18n/validation'\nimport type { Container } from '../di'\nimport type { LoggerService } from '../logger'\nimport type { IController } from '../router/controller'\nimport { getControllerRoute } from '../router/decorators/controller.decorator'\nimport type { Middleware } from '../router/middleware.interface'\nimport { RouterContext } from '../router/router-context'\nimport type { HttpMethod, RouterEnv, VersioningOptions } from '../router/types'\nimport type { Constructor } from '../types'\nimport type { MiddlewareConfigEntry, RouteInfo } from './types'\n\n/**\n * Service for applying middleware configurations to Hono app\n *\n * Processes MiddlewareConfigEntry[] from modules and registers\n * appropriate middleware handlers with route matching.\n */\nexport class MiddlewareConfigurationService {\n constructor(\n private readonly logger: LoggerService,\n private readonly versioningOptions: VersioningOptions | null = null,\n ) { }\n\n /**\n * Apply middleware configurations to the Hono app\n *\n * @param app - Hono application instance\n * @param configs - Middleware configuration entries from modules\n * @param controllers - All registered controller classes (for route resolution)\n * @param container - DI container for resolving middleware instances\n */\n applyMiddlewares(\n app: OpenAPIHono<RouterEnv>,\n configs: MiddlewareConfigEntry[],\n controllers: Constructor<IController>[],\n container: Container\n ): void {\n for (const config of configs) {\n this.applyMiddlewareConfig(app, config, controllers, container)\n }\n }\n\n /**\n * Apply a single middleware configuration entry\n */\n private applyMiddlewareConfig(\n app: OpenAPIHono<RouterEnv>,\n config: MiddlewareConfigEntry,\n controllers: Constructor<IController>[],\n container: Container\n ): void {\n const { middlewares, excludes, routes } = config\n\n // Resolve route patterns from targets\n const routePatterns = this.resolveRoutePatterns(routes, controllers)\n\n // Log the configuration for debugging\n this.logger.debug('Applying middleware configuration', {\n middlewares: middlewares.map(m => m.name),\n routes: routePatterns,\n excludes: excludes,\n })\n\n // Apply middleware to each route pattern\n for (const pattern of routePatterns) {\n this.registerMiddlewareForPattern(app, middlewares, pattern, excludes, container)\n }\n }\n\n /**\n * Resolve route targets into concrete route patterns\n */\n private resolveRoutePatterns(\n targets: (Constructor<IController> | RouteInfo | '*')[],\n _controllers: Constructor<IController>[]\n ): RouteInfo[] {\n const patterns: RouteInfo[] = []\n\n for (const target of targets) {\n if (target === '*') {\n // Global middleware - apply to all routes\n patterns.push({ path: '*' })\n } else if (typeof target === 'function') {\n // Controller class - get its route from metadata\n const route = getControllerRoute(target)\n if (route) {\n // Add wildcard for all paths under this controller\n patterns.push({ path: `${route}/*` })\n // Also match the exact path\n patterns.push({ path: route })\n } else {\n this.logger.warn('Controller has no route metadata', { controller: target.name })\n }\n } else {\n // RouteInfo object - resolve version if present\n if (!this.versioningOptions || !target.version) {\n // Fast path: no versioning or no version on target — push directly\n patterns.push(target)\n } else {\n const resolved = this.resolveVersionedRouteInfo(target)\n patterns.push(...resolved)\n }\n }\n }\n\n return patterns\n }\n\n /**\n * Resolve a RouteInfo with version into versioned path(s).\n * If versioning is disabled or no version is specified, returns the RouteInfo as-is.\n */\n private resolveVersionedRouteInfo(routeInfo: RouteInfo): RouteInfo[] {\n if (!this.versioningOptions || !routeInfo.version) {\n return [routeInfo]\n }\n\n const prefix = this.versioningOptions.prefix ?? 'v'\n const versions = Array.isArray(routeInfo.version) ? routeInfo.version : [routeInfo.version]\n const results: RouteInfo[] = []\n\n for (const v of versions) {\n const versionedPath = `/${prefix}${v}${routeInfo.path}`\n // Add exact path match\n results.push({ path: versionedPath, method: routeInfo.method })\n // Add wildcard match for sub-paths\n results.push({ path: `${versionedPath}/*`, method: routeInfo.method })\n }\n\n return results\n }\n\n /**\n * Register middleware handlers for a specific route pattern\n */\n private registerMiddlewareForPattern(\n app: OpenAPIHono<RouterEnv>,\n middlewares: Constructor<Middleware>[],\n pattern: RouteInfo,\n excludes: RouteInfo[],\n container: Container\n ): void {\n const path = pattern.path\n const methods = pattern.method\n ? (Array.isArray(pattern.method) ? pattern.method : [pattern.method])\n : undefined\n\n // Create the middleware handler\n const handler = this.createMiddlewareHandler(middlewares, excludes, container)\n\n // Register with Hono\n if (methods && methods.length > 0) {\n // Method-specific registration\n for (const method of methods) {\n this.registerForMethod(app, method, path, handler)\n }\n } else {\n // All methods\n app.use(path, handler)\n }\n }\n\n /**\n * Register handler for a specific HTTP method\n */\n private registerForMethod(\n app: OpenAPIHono<RouterEnv>,\n method: HttpMethod,\n path: string,\n handler: (c: Context<RouterEnv>, next: () => Promise<void>) => Promise<void>\n ): void {\n switch (method) {\n case 'get':\n app.get(path, handler)\n break\n case 'post':\n app.post(path, handler)\n break\n case 'put':\n app.put(path, handler)\n break\n case 'delete':\n app.delete(path, handler)\n break\n case 'patch':\n app.patch(path, handler)\n break\n default:\n app.use(path, handler)\n }\n }\n\n /**\n * Create a middleware handler function that executes the middleware chain\n */\n private createMiddlewareHandler(\n middlewares: Constructor<Middleware>[],\n excludes: RouteInfo[],\n container: Container\n ): (c: Context<RouterEnv>, next: () => Promise<void>) => Promise<void> {\n return async (c, next) => {\n const requestPath = c.req.path\n const requestMethod = c.req.method.toLowerCase() as HttpMethod\n\n // Check if this request should be excluded\n if (this.isExcluded(requestPath, requestMethod, excludes)) {\n await next()\n return\n }\n\n // Create RouterContext for middleware\n const ctx = new RouterContext(c)\n\n // Execute middleware chain\n await this.executeMiddlewareChain(middlewares, ctx, container, next)\n }\n }\n\n /**\n * Check if a request matches any exclusion pattern\n */\n private isExcluded(\n requestPath: string,\n requestMethod: HttpMethod,\n excludes: RouteInfo[]\n ): boolean {\n for (const exclude of excludes) {\n if (this.matchesRoute(requestPath, requestMethod, exclude)) {\n return true\n }\n }\n return false\n }\n\n /**\n * Check if request matches a route pattern\n */\n private matchesRoute(\n requestPath: string,\n requestMethod: HttpMethod,\n route: RouteInfo\n ): boolean {\n // Check method match (if specified)\n if (route.method) {\n const methods = Array.isArray(route.method) ? route.method : [route.method]\n if (!methods.includes(requestMethod)) {\n return false\n }\n }\n\n // Check path match\n return this.matchesPath(requestPath, route.path)\n }\n\n /**\n * Match request path against pattern\n * Supports wildcards: /api/* matches /api/users, /api/v1/users\n */\n private matchesPath(requestPath: string, pattern: string): boolean {\n // Exact match\n if (pattern === requestPath) {\n return true\n }\n\n // Global wildcard\n if (pattern === '*') {\n return true\n }\n\n // Wildcard pattern (e.g., /api/*)\n if (pattern.endsWith('/*')) {\n const prefix = pattern.slice(0, -2)\n return requestPath === prefix || requestPath.startsWith(prefix + '/')\n }\n\n // Path parameter pattern (e.g., /api/users/:id)\n // Convert to regex for matching\n const regexPattern = pattern\n .replace(/:[^/]+/g, '[^/]+') // Replace :param with regex\n .replace(/\\*/g, '.*') // Replace * with regex\n const regex = new RegExp(`^${regexPattern}$`)\n return regex.test(requestPath)\n }\n\n /**\n * Execute middleware chain in order\n */\n private async executeMiddlewareChain(\n middlewares: Constructor<Middleware>[],\n ctx: RouterContext,\n container: Container,\n finalNext: () => Promise<void>\n ): Promise<void> {\n // Build middleware chain from end to start\n let chain = finalNext\n\n for (let i = middlewares.length - 1; i >= 0; i--) {\n const MiddlewareClass = middlewares[i]\n const currentNext = chain\n\n chain = async () => {\n // Resolve middleware from request-scoped container\n const requestContainer = ctx.getContainer()\n const middleware = requestContainer.resolve<Middleware>(MiddlewareClass)\n await middleware.handle(ctx, currentNext)\n }\n }\n\n // Execute the chain\n await chain()\n }\n}\n"],"mappings":"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"}
|
package/dist/module/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { at as DynamicModule, ct as InjectionToken, dt as ModuleOptions, ft as OnInitialize, gt as ValueProvider, ht as RegistryEntry, it as ClassProvider, lt as ModuleClass, mt as Provider, ot as ExistingProvider, pt as OnShutdown, rt as AsyncModuleOptions, st as FactoryProvider, ut as ModuleContext } from "../index-BFCxSp_f.mjs";
|
|
2
2
|
import { t as Constructor } from "../types-DahElfUw.mjs";
|
|
3
|
-
import {
|
|
3
|
+
import { t as ModuleRegistry } from "../module-registry-CmjBX6ol.mjs";
|
|
4
4
|
|
|
5
5
|
//#region src/module/module.decorator.d.ts
|
|
6
6
|
declare const MODULE_OPTIONS_KEY: unique symbol;
|
|
@@ -29,120 +29,5 @@ declare function getModuleOptions(target: Constructor): ModuleOptions | undefine
|
|
|
29
29
|
*/
|
|
30
30
|
declare function isModuleClass(target: unknown): target is Constructor;
|
|
31
31
|
//#endregion
|
|
32
|
-
//#region src/module/module-registry.d.ts
|
|
33
|
-
/**
|
|
34
|
-
* ModuleRegistry - manages module lifecycle
|
|
35
|
-
*
|
|
36
|
-
* @example
|
|
37
|
-
* ```typescript
|
|
38
|
-
* const registry = new ModuleRegistry(container, logger)
|
|
39
|
-
* registry.register(AppModule) // Traverses imports recursively
|
|
40
|
-
* await registry.initialize()
|
|
41
|
-
* // ... application running ...
|
|
42
|
-
* await registry.shutdown()
|
|
43
|
-
* ```
|
|
44
|
-
*/
|
|
45
|
-
declare class ModuleRegistry {
|
|
46
|
-
private readonly container;
|
|
47
|
-
private readonly logger;
|
|
48
|
-
private modules;
|
|
49
|
-
private registeredClasses;
|
|
50
|
-
private initialized;
|
|
51
|
-
private allControllers;
|
|
52
|
-
private allConsumers;
|
|
53
|
-
private allJobs;
|
|
54
|
-
private allListeners;
|
|
55
|
-
private allCommands;
|
|
56
|
-
private allSeeders;
|
|
57
|
-
private allMiddlewareConfigs;
|
|
58
|
-
constructor(container: Container, logger: LoggerService);
|
|
59
|
-
/**
|
|
60
|
-
* Register a module (static or dynamic)
|
|
61
|
-
*
|
|
62
|
-
* @param moduleOrDynamic - Module class decorated with `@Module` or DynamicModule from configure()
|
|
63
|
-
*/
|
|
64
|
-
register(moduleOrDynamic: ModuleClass | DynamicModule): void;
|
|
65
|
-
/**
|
|
66
|
-
* Register multiple modules in order
|
|
67
|
-
*/
|
|
68
|
-
registerAll(modules: (ModuleClass | DynamicModule)[]): void;
|
|
69
|
-
/**
|
|
70
|
-
* Initialize all modules (call configure and onInitialize hooks)
|
|
71
|
-
*/
|
|
72
|
-
initialize(): Promise<void>;
|
|
73
|
-
/**
|
|
74
|
-
* Get all controllers registered from all modules
|
|
75
|
-
*/
|
|
76
|
-
getAllControllers(): Constructor[];
|
|
77
|
-
/**
|
|
78
|
-
* Get all consumers registered from all modules
|
|
79
|
-
*/
|
|
80
|
-
getAllConsumers(): Constructor[];
|
|
81
|
-
/**
|
|
82
|
-
* Get all jobs registered from all modules
|
|
83
|
-
*/
|
|
84
|
-
getAllJobs(): Constructor[];
|
|
85
|
-
/**
|
|
86
|
-
* Get all listeners registered from all modules
|
|
87
|
-
*/
|
|
88
|
-
getAllListeners(): Constructor[];
|
|
89
|
-
/**
|
|
90
|
-
* Get all commands registered from all modules
|
|
91
|
-
*/
|
|
92
|
-
getAllCommands(): Constructor[];
|
|
93
|
-
/**
|
|
94
|
-
* Get all seeders registered from all modules
|
|
95
|
-
*/
|
|
96
|
-
getAllSeeders(): Constructor[];
|
|
97
|
-
/**
|
|
98
|
-
* Get all middleware configurations from all modules
|
|
99
|
-
*/
|
|
100
|
-
getAllMiddlewareConfigs(): MiddlewareConfigEntry[];
|
|
101
|
-
/**
|
|
102
|
-
* Shutdown all modules (call onShutdown hooks in reverse order)
|
|
103
|
-
*/
|
|
104
|
-
shutdown(): Promise<void>;
|
|
105
|
-
/**
|
|
106
|
-
* Type guard for MiddlewareConfigurable
|
|
107
|
-
*/
|
|
108
|
-
private hasMiddlewareConfigurable;
|
|
109
|
-
/**
|
|
110
|
-
* Type guard for OnInitialize
|
|
111
|
-
*/
|
|
112
|
-
private hasOnInitialize;
|
|
113
|
-
/**
|
|
114
|
-
* Type guard for OnShutdown
|
|
115
|
-
*/
|
|
116
|
-
private hasOnShutdown;
|
|
117
|
-
/**
|
|
118
|
-
* Resolve module class and options from static or dynamic module
|
|
119
|
-
*
|
|
120
|
-
* For DynamicModules, merges the decorator metadata (consumers, controllers, jobs)
|
|
121
|
-
* with the DynamicModule options (providers, imports). This ensures modules using
|
|
122
|
-
* forRoot/forRootAsync patterns still have their decorator-defined consumers registered.
|
|
123
|
-
*/
|
|
124
|
-
private resolveModule;
|
|
125
|
-
/**
|
|
126
|
-
* Type guard for DynamicModule
|
|
127
|
-
*/
|
|
128
|
-
private isDynamicModule;
|
|
129
|
-
/**
|
|
130
|
-
* Register a single provider in the container
|
|
131
|
-
*/
|
|
132
|
-
private registerProvider;
|
|
133
|
-
/**
|
|
134
|
-
* Check if a class is a `Command` and collect it for auto-wiring
|
|
135
|
-
*/
|
|
136
|
-
private collectIfCommand;
|
|
137
|
-
/**
|
|
138
|
-
* Check if a class is a `Seeder` and collect it for auto-wiring
|
|
139
|
-
*/
|
|
140
|
-
private collectIfSeeder;
|
|
141
|
-
/**
|
|
142
|
-
* Check if a class is a `@Listener()` and collect it for auto-wiring
|
|
143
|
-
*/
|
|
144
|
-
private collectIfListener;
|
|
145
|
-
}
|
|
146
|
-
//#endregion
|
|
147
32
|
export { AsyncModuleOptions, ClassProvider, DynamicModule, ExistingProvider, FactoryProvider, InjectionToken, MODULE_OPTIONS_KEY, Module, ModuleClass, ModuleContext, ModuleOptions, ModuleRegistry, OnInitialize, OnShutdown, Provider, RegistryEntry, ValueProvider, getModuleOptions, isModuleClass };
|
|
148
33
|
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/module/module.decorator.ts"
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/module/module.decorator.ts"],"mappings":";;;;;cAea,kBAAA;;;AAyBb;;;;;;;;;;;;;iBAAgB,MAAA,CAAO,OAAA,EAAS,aAAA,uCACa,IAAA,uBAA2B,MAAA,EAAQ,SAAA,KAAY,SAAA;;;;iBAmB5E,gBAAA,CAAiB,MAAA,EAAQ,WAAA,GAAc,aAAA;;;;iBAOvC,aAAA,CAAc,MAAA,YAAkB,MAAA,IAAU,WAAA"}
|
package/dist/module/index.mjs
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
import "../errors-
|
|
2
|
-
import "../
|
|
3
|
-
import "../
|
|
4
|
-
import
|
|
5
|
-
import "../
|
|
6
|
-
import "../
|
|
7
|
-
import "../
|
|
8
|
-
import "../
|
|
9
|
-
import "../is-
|
|
10
|
-
import "../
|
|
11
|
-
import "../router-context-BEJe9HEB.mjs";
|
|
1
|
+
import "../errors-DSKapqD8.mjs";
|
|
2
|
+
import "../logger-CGT91VY6.mjs";
|
|
3
|
+
import { a as isModuleClass, i as getModuleOptions, n as MODULE_OPTIONS_KEY, r as Module, t as ModuleRegistry } from "../module-tUtyVJ5E.mjs";
|
|
4
|
+
import "../events-CvUSgEuN.mjs";
|
|
5
|
+
import "../middleware-Bl-b5pkt.mjs";
|
|
6
|
+
import "../router-context-D9R1v2Ac.mjs";
|
|
7
|
+
import "../colors-Y7WIFXs7.mjs";
|
|
8
|
+
import "../command-B1CPgsrU.mjs";
|
|
9
|
+
import "../is-command-DJVI6wEJ.mjs";
|
|
10
|
+
import "../is-seeder-D5MIEcdz.mjs";
|
|
12
11
|
export { MODULE_OPTIONS_KEY, Module, ModuleRegistry, getModuleOptions, isModuleClass };
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
import { at as DynamicModule, en as Container, lt as ModuleClass, vt as MiddlewareConfigEntry } from "./index-BFCxSp_f.mjs";
|
|
2
|
+
import { t as Constructor } from "./types-DahElfUw.mjs";
|
|
3
|
+
import { i as LoggerService } from "./index-Dp6A5ywM.mjs";
|
|
4
|
+
|
|
5
|
+
//#region src/module/module-registry.d.ts
|
|
6
|
+
/**
|
|
7
|
+
* ModuleRegistry - manages module lifecycle
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const registry = new ModuleRegistry(container, logger)
|
|
12
|
+
* registry.register(AppModule) // Traverses imports recursively
|
|
13
|
+
* await registry.initialize()
|
|
14
|
+
* // ... application running ...
|
|
15
|
+
* await registry.shutdown()
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
declare class ModuleRegistry {
|
|
19
|
+
private readonly container;
|
|
20
|
+
private readonly logger;
|
|
21
|
+
private modules;
|
|
22
|
+
private registeredClasses;
|
|
23
|
+
private initialized;
|
|
24
|
+
private allControllers;
|
|
25
|
+
private allConsumers;
|
|
26
|
+
private allJobs;
|
|
27
|
+
private allListeners;
|
|
28
|
+
private allCommands;
|
|
29
|
+
private allSeeders;
|
|
30
|
+
private allMiddlewareConfigs;
|
|
31
|
+
constructor(container: Container, logger: LoggerService);
|
|
32
|
+
/**
|
|
33
|
+
* Register a module (static or dynamic)
|
|
34
|
+
*
|
|
35
|
+
* @param moduleOrDynamic - Module class decorated with `@Module` or DynamicModule from configure()
|
|
36
|
+
*/
|
|
37
|
+
register(moduleOrDynamic: ModuleClass | DynamicModule): void;
|
|
38
|
+
/**
|
|
39
|
+
* Register multiple modules in order
|
|
40
|
+
*/
|
|
41
|
+
registerAll(modules: (ModuleClass | DynamicModule)[]): void;
|
|
42
|
+
/**
|
|
43
|
+
* Initialize all modules (call configure and onInitialize hooks)
|
|
44
|
+
*/
|
|
45
|
+
initialize(): Promise<void>;
|
|
46
|
+
/**
|
|
47
|
+
* Get all controllers registered from all modules
|
|
48
|
+
*/
|
|
49
|
+
getAllControllers(): Constructor[];
|
|
50
|
+
/**
|
|
51
|
+
* Get all consumers registered from all modules
|
|
52
|
+
*/
|
|
53
|
+
getAllConsumers(): Constructor[];
|
|
54
|
+
/**
|
|
55
|
+
* Get all jobs registered from all modules
|
|
56
|
+
*/
|
|
57
|
+
getAllJobs(): Constructor[];
|
|
58
|
+
/**
|
|
59
|
+
* Get all listeners registered from all modules
|
|
60
|
+
*/
|
|
61
|
+
getAllListeners(): Constructor[];
|
|
62
|
+
/**
|
|
63
|
+
* Get all commands registered from all modules
|
|
64
|
+
*/
|
|
65
|
+
getAllCommands(): Constructor[];
|
|
66
|
+
/**
|
|
67
|
+
* Get all seeders registered from all modules
|
|
68
|
+
*/
|
|
69
|
+
getAllSeeders(): Constructor[];
|
|
70
|
+
/**
|
|
71
|
+
* Get all middleware configurations from all modules
|
|
72
|
+
*/
|
|
73
|
+
getAllMiddlewareConfigs(): MiddlewareConfigEntry[];
|
|
74
|
+
/**
|
|
75
|
+
* Shutdown all modules (call onShutdown hooks in reverse order)
|
|
76
|
+
*/
|
|
77
|
+
shutdown(): Promise<void>;
|
|
78
|
+
/**
|
|
79
|
+
* Type guard for MiddlewareConfigurable
|
|
80
|
+
*/
|
|
81
|
+
private hasMiddlewareConfigurable;
|
|
82
|
+
/**
|
|
83
|
+
* Type guard for OnInitialize
|
|
84
|
+
*/
|
|
85
|
+
private hasOnInitialize;
|
|
86
|
+
/**
|
|
87
|
+
* Type guard for OnShutdown
|
|
88
|
+
*/
|
|
89
|
+
private hasOnShutdown;
|
|
90
|
+
/**
|
|
91
|
+
* Resolve module class and options from static or dynamic module
|
|
92
|
+
*
|
|
93
|
+
* For DynamicModules, merges the decorator metadata (consumers, controllers, jobs)
|
|
94
|
+
* with the DynamicModule options (providers, imports). This ensures modules using
|
|
95
|
+
* forRoot/forRootAsync patterns still have their decorator-defined consumers registered.
|
|
96
|
+
*/
|
|
97
|
+
private resolveModule;
|
|
98
|
+
/**
|
|
99
|
+
* Type guard for DynamicModule
|
|
100
|
+
*/
|
|
101
|
+
private isDynamicModule;
|
|
102
|
+
/**
|
|
103
|
+
* Register a single provider in the container
|
|
104
|
+
*/
|
|
105
|
+
private registerProvider;
|
|
106
|
+
/**
|
|
107
|
+
* Check if a class is a `Command` and collect it for auto-wiring
|
|
108
|
+
*/
|
|
109
|
+
private collectIfCommand;
|
|
110
|
+
/**
|
|
111
|
+
* Check if a class is a `Seeder` and collect it for auto-wiring
|
|
112
|
+
*/
|
|
113
|
+
private collectIfSeeder;
|
|
114
|
+
/**
|
|
115
|
+
* Check if a class is a `@Listener()` and collect it for auto-wiring
|
|
116
|
+
*/
|
|
117
|
+
private collectIfListener;
|
|
118
|
+
}
|
|
119
|
+
//#endregion
|
|
120
|
+
export { ModuleRegistry as t };
|
|
121
|
+
//# sourceMappingURL=module-registry-CmjBX6ol.d.mts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-registry-CmjBX6ol.d.mts","names":[],"sources":["../src/module/module-registry.ts"],"mappings":";;;;;;;;;;;;;;;;;cAqDa,cAAA;EAAA,iBAeQ,SAAA;EAAA,iBACA,MAAA;EAAA,QAfX,OAAA;EAAA,QACA,iBAAA;EAAA,QACA,WAAA;EAAA,QAGA,cAAA;EAAA,QACA,YAAA;EAAA,QACA,OAAA;EAAA,QACA,YAAA;EAAA,QACA,WAAA;EAAA,QACA,UAAA;EAAA,QACA,oBAAA;cAGW,SAAA,EAAW,SAAA,EACX,MAAA,EAAQ,aAAA;EAAA;;;;;EAQ3B,QAAA,CAAS,eAAA,EAAiB,WAAA,GAAc,aAAA;EA0DxC;;;EAAA,WAAA,CAAY,OAAA,GAAU,WAAA,GAAc,aAAA;EAS9B;;;EAAA,UAAA,CAAA,GAAc,OAAA;EA8CpB;;;EAPA,iBAAA,CAAA,GAAqB,WAAA;EAqBrB;;;EAdA,eAAA,CAAA,GAAmB,WAAA;EA4BnB;;;EArBA,UAAA,CAAA,GAAc,WAAA;EAmCR;;;EA5BN,eAAA,CAAA,GAAmB,WAAA;EA+EX;;;EAxER,cAAA,CAAA,GAAkB,WAAA;EAuKV;;;EAhKR,aAAA,CAAA,GAAiB,WAAA;EAqLQ;;;EA9KzB,uBAAA,CAAA,GAA2B,qBAAA;;;;EAOrB,QAAA,CAAA,GAAY,OAAA;;;;UA2BV,yBAAA;;;;UAYA,eAAA;;;;UAYA,aAAA;;;;;;;;UAgBA,aAAA;;;;UA+BA,eAAA;;;;UAYA,gBAAA;;;;UAoCA,gBAAA;;;;UAWA,eAAA;;;;UAUA,iBAAA;AAAA"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { S as ApplicationError, b as ERROR_CODES, s as Scope } from "./errors-
|
|
2
|
-
import { a as isListener } from "./events-
|
|
3
|
-
import {
|
|
4
|
-
import { t as
|
|
5
|
-
import {
|
|
1
|
+
import { S as ApplicationError, b as ERROR_CODES, s as Scope } from "./errors-DSKapqD8.mjs";
|
|
2
|
+
import { a as isListener } from "./events-CvUSgEuN.mjs";
|
|
3
|
+
import { s as createMiddlewareConsumer } from "./middleware-Bl-b5pkt.mjs";
|
|
4
|
+
import { t as isCommand } from "./is-command-DJVI6wEJ.mjs";
|
|
5
|
+
import { t as isSeeder } from "./is-seeder-D5MIEcdz.mjs";
|
|
6
6
|
import { injectable, instancePerContainerCachingFactory, registry } from "tsyringe";
|
|
7
7
|
//#region src/module/errors/invalid-module-provider.error.ts
|
|
8
8
|
/**
|
|
@@ -140,7 +140,8 @@ var ModuleRegistry = class {
|
|
|
140
140
|
if (this.registeredClasses.has(moduleClass)) {
|
|
141
141
|
if (isDynamic) {
|
|
142
142
|
this.logger.debug(`Module ${moduleClass.name} already registered, registering DynamicModule providers`);
|
|
143
|
-
|
|
143
|
+
const { module: _, ...dynamicRest } = moduleOrDynamic;
|
|
144
|
+
for (const provider of dynamicRest.providers ?? []) this.registerProvider(provider);
|
|
144
145
|
} else this.logger.debug(`Module ${moduleClass.name} already registered, skipping`);
|
|
145
146
|
return;
|
|
146
147
|
}
|
|
@@ -338,7 +339,7 @@ var ModuleRegistry = class {
|
|
|
338
339
|
* Check if a class is a `Command` and collect it for auto-wiring
|
|
339
340
|
*/
|
|
340
341
|
collectIfCommand(providerClass) {
|
|
341
|
-
if (isCommand(providerClass)) {
|
|
342
|
+
if (isCommand(providerClass) && !this.allCommands.includes(providerClass)) {
|
|
342
343
|
injectable()(providerClass);
|
|
343
344
|
this.allCommands.push(providerClass);
|
|
344
345
|
this.logger.debug(`Collected command: ${providerClass.name}`);
|
|
@@ -367,4 +368,4 @@ var ModuleRegistry = class {
|
|
|
367
368
|
//#endregion
|
|
368
369
|
export { isModuleClass as a, getModuleOptions as i, MODULE_OPTIONS_KEY as n, Module as r, ModuleRegistry as t };
|
|
369
370
|
|
|
370
|
-
//# sourceMappingURL=module-
|
|
371
|
+
//# sourceMappingURL=module-tUtyVJ5E.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-tUtyVJ5E.mjs","names":[],"sources":["../src/module/errors/invalid-module-provider.error.ts","../src/module/module.decorator.ts","../src/module/module-registry.ts"],"sourcesContent":["import { ApplicationError, ERROR_CODES } from '../../errors'\n\n/**\n * InvalidModuleProviderError\n *\n * Thrown when a module provider configuration is invalid.\n * This indicates a misconfiguration in the @Module decorator providers array.\n */\nexport class InvalidModuleProviderError extends ApplicationError {\n constructor(provider: unknown) {\n super(\n 'errors.invalidModuleProvider',\n ERROR_CODES.SYSTEM.INVALID_MODULE_PROVIDER,\n { provider: JSON.stringify(provider) }\n )\n }\n}\n","/**\n * Module Decorator\n *\n * NestJS-style @Module decorator for defining modules with providers, controllers, etc.\n * Encapsulates tsyringe's @registry decorator for auto-registration.\n */\n\nimport type { DependencyContainer, Provider as TsyringeProvider } from 'tsyringe'\nimport { instancePerContainerCachingFactory, type Lifecycle, registry } from 'tsyringe'\nimport type InjectionToken from 'tsyringe/dist/typings/providers/injection-token'\nimport type RegistrationOptions from 'tsyringe/dist/typings/types/registration-options'\nimport type { Constructor } from '../types'\nimport { InvalidModuleProviderError } from './errors'\nimport type { ModuleOptions, Provider } from './types'\n\nexport const MODULE_OPTIONS_KEY = Symbol.for('stratal:module:options')\n\n/**\n * Tsyringe registry entry format\n */\ntype RegistryEntry = {\n token: InjectionToken\n options?: RegistrationOptions\n} & TsyringeProvider\n\n/**\n * `@Module` decorator - defines a module with imports, providers, controllers, consumers, jobs\n *\n * Uses tsyringe's `@registry` internally to auto-register providers when module is imported.\n *\n * @example\n * ```typescript\n * @Module({\n * imports: [OtherModule],\n * providers: [MyService, MyRepository],\n * controllers: [MyController],\n * })\n * export class MyModule {}\n * ```\n */\nexport function Module(options: ModuleOptions) {\n return <TFunction extends abstract new (...args: never[]) => unknown>(target: TFunction): TFunction => {\n // Store module options for runtime access\n Reflect.defineMetadata(MODULE_OPTIONS_KEY, options, target)\n\n // Build tsyringe registry entries from providers\n const registryEntries = buildRegistryEntries(options.providers ?? [])\n\n // Apply tsyringe @registry decorator (encapsulated)\n if (registryEntries.length > 0) {\n registry(registryEntries)(target)\n }\n\n return target\n }\n}\n\n/**\n * Get module options from decorated class\n */\nexport function getModuleOptions(target: Constructor): ModuleOptions | undefined {\n return Reflect.getMetadata(MODULE_OPTIONS_KEY, target) as ModuleOptions | undefined\n}\n\n/**\n * Check if a class is decorated with `@Module`\n */\nexport function isModuleClass(target: unknown): target is Constructor {\n return (\n typeof target === 'function' &&\n Reflect.hasMetadata(MODULE_OPTIONS_KEY, target)\n )\n}\n\n/**\n * Convert our Provider types to tsyringe registry format\n *\n * Maps provider scope to tsyringe's lifecycle option.\n * Scope enum values map directly to Lifecycle enum values.\n */\nfunction buildRegistryEntries(providers: Provider[]): RegistryEntry[] {\n return providers.map((provider): RegistryEntry => {\n // Class-only provider - transient by default\n if (typeof provider === 'function') {\n return {\n token: provider as InjectionToken,\n useClass: provider,\n }\n }\n\n // ClassProvider with optional scope\n if ('useClass' in provider) {\n return {\n token: provider.provide as InjectionToken,\n useClass: provider.useClass,\n options: provider.scope !== undefined\n ? { lifecycle: provider.scope as unknown as Lifecycle }\n : undefined,\n }\n }\n\n // ValueProvider - no scope needed (values are inherently singleton)\n if ('useValue' in provider) {\n return {\n token: provider.provide as InjectionToken,\n useValue: provider.useValue,\n }\n }\n\n // FactoryProvider - use instancePerContainerCachingFactory to:\n // 1. Get the actual container at resolution time (global vs request)\n // 2. Cache result per container\n if ('useFactory' in provider) {\n const { provide, useFactory, inject = [] } = provider\n return {\n token: provide as InjectionToken,\n useFactory: instancePerContainerCachingFactory((dependencyContainer: DependencyContainer): object => {\n const deps = inject.map((token) => dependencyContainer.resolve(token))\n return useFactory(...deps) as object\n }),\n }\n }\n\n // ExistingProvider - alias to another token (uses tsyringe's useToken)\n if ('useExisting' in provider) {\n return {\n token: provider.provide as InjectionToken,\n useToken: provider.useExisting as InjectionToken,\n }\n }\n\n // Fallback (should not reach here with proper types)\n throw new InvalidModuleProviderError(provider)\n })\n}\n","/**\n * Module Registry\n *\n * Manages module lifecycle for the @Module decorator pattern.\n * Simplified for tsyringe's flat container model:\n * - Imports are traversed for registration (organization only)\n * - Modules registered in declaration order\n * - Lifecycle hooks: onInitialize, onShutdown\n */\n\nimport { injectable, instancePerContainerCachingFactory } from 'tsyringe'\nimport type { Container } from '../di/container'\nimport { Scope } from '../di/types'\nimport { isListener } from '../events'\nimport type { LoggerService } from '../logger'\nimport {\n createMiddlewareConsumer,\n type MiddlewareConfigEntry,\n type MiddlewareConfigurable,\n} from '../middleware'\nimport { isCommand } from '../quarry/is-command'\nimport { isSeeder } from '../seeder/is-seeder'\nimport type { Constructor } from '../types'\nimport { getModuleOptions } from './module.decorator'\nimport type {\n DynamicModule,\n ModuleClass,\n ModuleContext,\n ModuleOptions,\n OnInitialize,\n OnShutdown,\n Provider,\n} from './types'\n\n\ninterface RegisteredModule {\n moduleClass: Constructor\n options: ModuleOptions\n instance: object | null\n}\n\n/**\n * ModuleRegistry - manages module lifecycle\n *\n * @example\n * ```typescript\n * const registry = new ModuleRegistry(container, logger)\n * registry.register(AppModule) // Traverses imports recursively\n * await registry.initialize()\n * // ... application running ...\n * await registry.shutdown()\n * ```\n */\nexport class ModuleRegistry {\n private modules: RegisteredModule[] = []\n private registeredClasses = new Set<Constructor>()\n private initialized = false\n\n // Collected items from all modules for Application to use\n private allControllers: Constructor[] = []\n private allConsumers: Constructor[] = []\n private allJobs: Constructor[] = []\n private allListeners: Constructor[] = []\n private allCommands: Constructor[] = []\n private allSeeders: Constructor[] = []\n private allMiddlewareConfigs: MiddlewareConfigEntry[] = []\n\n constructor(\n private readonly container: Container,\n private readonly logger: LoggerService\n ) { }\n\n /**\n * Register a module (static or dynamic)\n *\n * @param moduleOrDynamic - Module class decorated with `@Module` or DynamicModule from configure()\n */\n register(moduleOrDynamic: ModuleClass | DynamicModule): void {\n const { moduleClass, options } = this.resolveModule(moduleOrDynamic)\n const isDynamic = this.isDynamicModule(moduleOrDynamic)\n\n // Check for duplicate registration\n if (this.registeredClasses.has(moduleClass)) {\n // For DynamicModules: Still register the additional providers\n // This allows forRoot() to add configuration even if base module is registered\n if (isDynamic) {\n this.logger.debug(`Module ${moduleClass.name} already registered, registering DynamicModule providers`)\n const { module: _, ...dynamicRest } = moduleOrDynamic\n for (const provider of dynamicRest.providers ?? []) {\n this.registerProvider(provider)\n }\n } else {\n this.logger.debug(`Module ${moduleClass.name} already registered, skipping`)\n }\n return\n }\n\n this.registeredClasses.add(moduleClass)\n this.logger.info(`Registering module: ${moduleClass.name}`)\n\n // First, register imported modules recursively\n for (const ImportedModule of options.imports ?? []) {\n this.register(ImportedModule)\n }\n\n // Register providers in container\n for (const provider of options.providers ?? []) {\n this.registerProvider(provider)\n }\n\n // Register controllers and collect them\n for (const controller of options.controllers ?? []) {\n this.container.register(controller)\n this.allControllers.push(controller)\n }\n\n // Register consumers as singletons by default and collect them\n for (const consumer of options.consumers ?? []) {\n this.container.register(consumer, Scope.Singleton)\n this.allConsumers.push(consumer)\n this.logger.info(`Collected consumer: ${consumer.name}`, { queueCount: this.allConsumers.length })\n }\n\n // Register jobs as singletons by default and collect them\n for (const job of options.jobs ?? []) {\n this.container.register(job, Scope.Singleton)\n this.allJobs.push(job)\n }\n\n this.modules.push({ moduleClass, options, instance: null })\n }\n\n /**\n * Register multiple modules in order\n */\n registerAll(modules: (ModuleClass | DynamicModule)[]): void {\n for (const module of modules) {\n this.register(module)\n }\n }\n\n /**\n * Initialize all modules (call configure and onInitialize hooks)\n */\n async initialize(): Promise<void> {\n if (this.initialized) return\n\n this.logger.info('Initializing modules...')\n\n const context: ModuleContext = {\n container: this.container,\n logger: this.logger,\n }\n\n for (const registered of this.modules) {\n // Instantiate module class\n const instance = new registered.moduleClass()\n registered.instance = instance\n\n // Call configure() for middleware configuration if implemented\n if (this.hasMiddlewareConfigurable(instance)) {\n this.logger.debug(`Configuring middleware for: ${registered.moduleClass.name}`)\n const consumer = createMiddlewareConsumer()\n instance.configure(consumer)\n const entries = consumer.getEntries()\n this.allMiddlewareConfigs.push(...entries)\n this.logger.debug(`Collected ${entries.length} middleware config(s) from ${registered.moduleClass.name}`)\n }\n\n // Call onInitialize if implemented\n if (this.hasOnInitialize(instance)) {\n this.logger.info(`Initializing: ${registered.moduleClass.name}`)\n await instance.onInitialize(context)\n }\n }\n\n this.initialized = true\n this.logger.info('All modules initialized')\n }\n\n /**\n * Get all controllers registered from all modules\n */\n getAllControllers(): Constructor[] {\n return this.allControllers\n }\n\n /**\n * Get all consumers registered from all modules\n */\n getAllConsumers(): Constructor[] {\n return this.allConsumers\n }\n\n /**\n * Get all jobs registered from all modules\n */\n getAllJobs(): Constructor[] {\n return this.allJobs\n }\n\n /**\n * Get all listeners registered from all modules\n */\n getAllListeners(): Constructor[] {\n return this.allListeners\n }\n\n /**\n * Get all commands registered from all modules\n */\n getAllCommands(): Constructor[] {\n return this.allCommands\n }\n\n /**\n * Get all seeders registered from all modules\n */\n getAllSeeders(): Constructor[] {\n return this.allSeeders\n }\n\n /**\n * Get all middleware configurations from all modules\n */\n getAllMiddlewareConfigs(): MiddlewareConfigEntry[] {\n return this.allMiddlewareConfigs\n }\n\n /**\n * Shutdown all modules (call onShutdown hooks in reverse order)\n */\n async shutdown(): Promise<void> {\n this.logger.info('Shutting down modules...')\n\n const context: ModuleContext = {\n container: this.container,\n logger: this.logger,\n }\n\n // Reverse order for shutdown\n const reversed = [...this.modules].reverse()\n\n for (const { moduleClass, instance } of reversed) {\n if (instance && this.hasOnShutdown(instance)) {\n try {\n await instance.onShutdown(context)\n } catch (error) {\n this.logger.error(`Error shutting down ${moduleClass.name}:`, error as Error)\n }\n }\n }\n\n this.logger.info('All modules shut down')\n }\n\n /**\n * Type guard for MiddlewareConfigurable\n */\n private hasMiddlewareConfigurable(instance: unknown): instance is MiddlewareConfigurable {\n return (\n typeof instance === 'object' &&\n instance !== null &&\n 'configure' in instance &&\n typeof (instance as MiddlewareConfigurable).configure === 'function'\n )\n }\n\n /**\n * Type guard for OnInitialize\n */\n private hasOnInitialize(instance: unknown): instance is OnInitialize {\n return (\n typeof instance === 'object' &&\n instance !== null &&\n 'onInitialize' in instance &&\n typeof (instance as OnInitialize).onInitialize === 'function'\n )\n }\n\n /**\n * Type guard for OnShutdown\n */\n private hasOnShutdown(instance: unknown): instance is OnShutdown {\n return (\n typeof instance === 'object' &&\n instance !== null &&\n 'onShutdown' in instance &&\n typeof (instance as OnShutdown).onShutdown === 'function'\n )\n }\n\n /**\n * Resolve module class and options from static or dynamic module\n *\n * For DynamicModules, merges the decorator metadata (consumers, controllers, jobs)\n * with the DynamicModule options (providers, imports). This ensures modules using\n * forRoot/forRootAsync patterns still have their decorator-defined consumers registered.\n */\n private resolveModule(moduleOrDynamic: ModuleClass | DynamicModule): {\n moduleClass: Constructor\n options: ModuleOptions\n } {\n // DynamicModule (from forRoot/forRootAsync) - has module property\n if (this.isDynamicModule(moduleOrDynamic)) {\n const { module: moduleClass, ...dynamicRest } = moduleOrDynamic\n\n // Get decorator options and merge with dynamic options\n // This ensures consumers/controllers/jobs from @Module decorator are included\n const decoratorOptions = getModuleOptions(moduleClass) ?? {}\n const mergedOptions: ModuleOptions = {\n ...decoratorOptions,\n ...dynamicRest,\n // Merge arrays: decorator providers first, then dynamic providers\n providers: [...(decoratorOptions.providers ?? []), ...(dynamicRest.providers ?? [])],\n imports: [...(decoratorOptions.imports ?? [])],\n }\n\n return { moduleClass: moduleClass, options: mergedOptions }\n }\n\n // Static module (decorated with @Module)\n const moduleClass = moduleOrDynamic as Constructor\n const options = getModuleOptions(moduleClass) ?? {}\n return { moduleClass, options }\n }\n\n /**\n * Type guard for DynamicModule\n */\n private isDynamicModule(value: unknown): value is DynamicModule {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'module' in value && // Required property for dynamic modules\n typeof (value as DynamicModule).module === 'function'\n )\n }\n\n /**\n * Register a single provider in the container\n */\n private registerProvider(provider: Provider): void {\n if (typeof provider === 'function') {\n // Class-only provider - transient by default\n this.container.register(provider as Constructor)\n this.collectIfListener(provider as Constructor)\n this.collectIfCommand(provider as Constructor)\n this.collectIfSeeder(provider as Constructor)\n } else if ('useClass' in provider) {\n // ClassProvider with optional scope\n this.container.register(provider.provide, provider.useClass as Constructor, provider.scope)\n this.collectIfListener(provider.useClass as Constructor)\n this.collectIfCommand(provider.useClass as Constructor)\n this.collectIfSeeder(provider.useClass as Constructor)\n } else if ('useValue' in provider) {\n // ValueProvider - no scope needed (values are inherently singleton)\n this.container.registerValue(provider.provide, provider.useValue)\n } else if ('useFactory' in provider) {\n // FactoryProvider - use instancePerContainerCachingFactory to:\n // 1. Get the actual container at resolution time (global vs request)\n // 2. Cache result per container\n const { provide, useFactory, inject = [] } = provider\n this.container.getTsyringeContainer().register(provide, {\n useFactory: instancePerContainerCachingFactory((dependencyContainer) => {\n const deps = inject.map((token) => dependencyContainer.resolve(token))\n return useFactory(...deps)\n })\n })\n } else if ('useExisting' in provider) {\n // ExistingProvider - alias to another token\n this.container.registerExisting(provider.provide, provider.useExisting)\n }\n }\n\n /**\n * Check if a class is a `Command` and collect it for auto-wiring\n */\n private collectIfCommand(providerClass: Constructor): void {\n if (isCommand(providerClass) && !this.allCommands.includes(providerClass)) {\n injectable()(providerClass)\n this.allCommands.push(providerClass)\n this.logger.debug(`Collected command: ${providerClass.name}`)\n }\n }\n\n /**\n * Check if a class is a `Seeder` and collect it for auto-wiring\n */\n private collectIfSeeder(providerClass: Constructor): void {\n if (isSeeder(providerClass) && !this.allSeeders.includes(providerClass)) {\n this.allSeeders.push(providerClass)\n this.logger.debug(`Collected seeder: ${providerClass.name}`)\n }\n }\n\n /**\n * Check if a class is a `@Listener()` and collect it for auto-wiring\n */\n private collectIfListener(providerClass: Constructor): void {\n if (isListener(providerClass)) {\n // Re-register as singleton so the same instance is used across all event registrations\n this.container.register(providerClass, providerClass, Scope.Singleton)\n this.allListeners.push(providerClass)\n this.logger.debug(`Collected listener: ${providerClass.name}`)\n }\n }\n}\n"],"mappings":"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"}
|
package/dist/openapi/index.d.mts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
1
|
+
import { Pt as RouterEnv, at as DynamicModule, rt as AsyncModuleOptions } from "../index-BFCxSp_f.mjs";
|
|
2
|
+
import { n as OpenAPIObject, r as PathItemObject } from "../index-NGxg-KP_.mjs";
|
|
3
|
+
import { t as OpenAPIService } from "../openapi.service-DGnX3Fc4.mjs";
|
|
4
4
|
import { MiddlewareHandler } from "hono/types";
|
|
5
5
|
|
|
6
6
|
//#region src/openapi/types.d.ts
|
|
@@ -135,68 +135,68 @@ declare class OpenAPIConfigService implements IOpenAPIConfigService {
|
|
|
135
135
|
private overrides;
|
|
136
136
|
constructor(baseOptions?: OpenAPIModuleOptions | undefined);
|
|
137
137
|
/**
|
|
138
|
-
* Add configuration override for this request
|
|
139
|
-
* Overrides are merged in the order they are added
|
|
138
|
+
* Add configuration override for this request.
|
|
139
|
+
* Overrides are merged in the order they are added.
|
|
140
140
|
*/
|
|
141
141
|
override(config: OpenAPIConfigOverride): void;
|
|
142
|
-
/**
|
|
143
|
-
* Get effective configuration (base merged with all overrides)
|
|
144
|
-
*/
|
|
142
|
+
/** Get effective configuration (base merged with all overrides) */
|
|
145
143
|
getEffectiveConfig(): OpenAPIEffectiveConfig;
|
|
146
144
|
/**
|
|
147
|
-
* Merge override into effective config
|
|
148
|
-
* Info is shallow-merged, routeFilter is replaced
|
|
145
|
+
* Merge override into effective config.
|
|
146
|
+
* Info is shallow-merged, routeFilter is replaced.
|
|
149
147
|
*/
|
|
150
148
|
private mergeConfig;
|
|
151
149
|
}
|
|
152
150
|
//#endregion
|
|
153
|
-
//#region src/openapi/services/openapi.service.d.ts
|
|
151
|
+
//#region src/openapi/services/openapi-tools.service.d.ts
|
|
152
|
+
type JsonSchema = Record<string, unknown>;
|
|
153
|
+
interface ToolDefinition {
|
|
154
|
+
name: string;
|
|
155
|
+
description: string;
|
|
156
|
+
inputSchema: JsonSchema;
|
|
157
|
+
method: string;
|
|
158
|
+
path: string;
|
|
159
|
+
pathParams: string[];
|
|
160
|
+
}
|
|
161
|
+
interface ToolExecutionResult {
|
|
162
|
+
status: number;
|
|
163
|
+
body: string;
|
|
164
|
+
headers: Record<string, string>;
|
|
165
|
+
}
|
|
166
|
+
interface ToolFilter {
|
|
167
|
+
tags?: string[];
|
|
168
|
+
pathPrefix?: string;
|
|
169
|
+
}
|
|
170
|
+
type Dispatcher = (method: string, url: string, options?: {
|
|
171
|
+
body?: unknown;
|
|
172
|
+
headers?: Record<string, string>;
|
|
173
|
+
}) => Promise<Response>;
|
|
154
174
|
/**
|
|
155
|
-
* OpenAPI
|
|
175
|
+
* Converts an OpenAPI 3.0 spec into callable tool definitions.
|
|
156
176
|
*
|
|
157
|
-
*
|
|
158
|
-
* - Runtime configuration via OpenAPIConfigService
|
|
159
|
-
* - Route filtering via hideFromDocs and custom routeFilter
|
|
160
|
-
* - i18n support for titles and descriptions
|
|
161
|
-
* - Security scheme definitions
|
|
162
|
-
*
|
|
163
|
-
* Configuration is resolved per-request from OpenAPIConfigService,
|
|
164
|
-
* allowing middleware to override config based on domain context.
|
|
177
|
+
* Plain class (no DI) — reusable across MCP, CLI, and custom tooling.
|
|
165
178
|
*/
|
|
166
|
-
declare class
|
|
167
|
-
private
|
|
168
|
-
private
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
private
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
private filterRoutes;
|
|
187
|
-
/**
|
|
188
|
-
* Get route info by matching path against controller routes
|
|
189
|
-
*/
|
|
190
|
-
private getRouteInfo;
|
|
191
|
-
/**
|
|
192
|
-
* Filter unreferenced schemas from OpenAPI spec
|
|
193
|
-
*/
|
|
194
|
-
private filterSchemas;
|
|
195
|
-
/**
|
|
196
|
-
* Recursively collect all schema references from an object
|
|
197
|
-
*/
|
|
198
|
-
private collectSchemaRefs;
|
|
179
|
+
declare class OpenApiToolsService {
|
|
180
|
+
private static readonly HTTP_METHODS;
|
|
181
|
+
private tools;
|
|
182
|
+
private toolMap;
|
|
183
|
+
private dispatcher?;
|
|
184
|
+
private spec;
|
|
185
|
+
constructor(spec: OpenAPIObject, options?: {
|
|
186
|
+
dispatcher?: Dispatcher;
|
|
187
|
+
});
|
|
188
|
+
getTools(filter?: ToolFilter): ToolDefinition[];
|
|
189
|
+
getTool(name: string): ToolDefinition | undefined;
|
|
190
|
+
executeTool(name: string, args: Record<string, unknown>): Promise<ToolExecutionResult>;
|
|
191
|
+
private buildTools;
|
|
192
|
+
private generateName;
|
|
193
|
+
private buildDescription;
|
|
194
|
+
private buildInputSchema;
|
|
195
|
+
private mergeParameters;
|
|
196
|
+
private resolveRef;
|
|
197
|
+
private lookupRef;
|
|
198
|
+
private getOperation;
|
|
199
199
|
}
|
|
200
200
|
//#endregion
|
|
201
|
-
export { type IOpenAPIConfigService, OPENAPI_TOKENS, type OpenAPIConfigOverride, OpenAPIConfigService, type OpenAPIEffectiveConfig, type OpenAPIInfo, OpenAPIModule, type OpenAPIModuleOptions, OpenAPIService, type OpenAPIUIContext, type OpenAPIUIOptions, type OpenAPIUIRenderer, type RouteFilterFn };
|
|
201
|
+
export { type Dispatcher, type IOpenAPIConfigService, OPENAPI_TOKENS, type OpenAPIConfigOverride, OpenAPIConfigService, type OpenAPIEffectiveConfig, type OpenAPIInfo, OpenAPIModule, type OpenAPIModuleOptions, OpenAPIService, type OpenAPIUIContext, type OpenAPIUIOptions, type OpenAPIUIRenderer, OpenApiToolsService, type RouteFilterFn, type ToolDefinition, type ToolExecutionResult, type ToolFilter };
|
|
202
202
|
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/openapi/types.ts","../../src/openapi/openapi.module.ts","../../src/openapi/openapi.tokens.ts","../../src/openapi/services/openapi-config.service.ts","../../src/openapi/services/openapi.service.ts"],"mappings":";;;;;;;;;UAOiB,WAAA;EACf,KAAA;EACA,OAAA;EACA,WAAA;AAAA;;;;UAMe,gBAAA;EACf,OAAA;EACA,KAAA;AAAA;;;AAOF;;KAAY,iBAAA,IAAqB,OAAA,EAAS,gBAAA,KAAqB,iBAAA,CAAkB,SAAA;;;;UAKhE,gBAAA;EAL+D;EAO9E,IAAA;EAP+B;EAS/B,QAAA,GAAW,iBAAA;AAAA;;;AAJb;UAUiB,oBAAA;;EAEf,QAAA;EAVA;EAaA,IAAA,GAAO,WAAA;EAXI;EAcX,eAAA,GAAkB,MAAA;EAdU;EAiB5B,EAAA,GAAK,gBAAA;AAAA;;;;;KAOK,aAAA,IAAiB,IAAA,UAAc,QAAA,EAAU,cAAA;;;;UAKpC,qBAAA;EAff;EAiBA,IAAA,GAAO,OAAA,CAAQ,WAAA;EAdf;EAiBA,WAAA,GAAc,aAAA;AAAA;;AAVhB;;UAgBiB,sBAAA;EACf,QAAA;EACA,IAAA,EAAM,WAAA;EACN,eAAA,GAAkB,MAAA;EAClB,WAAA,GAAc,aAAA;EACd,EAAA,GAAK,gBAAA;AAAA;AAhBP;;;AAAA,UAsBiB,qBAAA;EApBR;;;;EAyBP,QAAA,CAAS,MAAA,EAAQ,qBAAA;EAzBV;;;EA8BP,kBAAA,IAAsB,sBAAA;AAAA;;;cC/BX,aAAA;ED9BiB;AAM9B;;;;;EAN8B,OCqCrB,OAAA,CAAQ,OAAA,GAAS,oBAAA,GAA4B,aAAA;EAAA,OAqB7C,YAAA,CAAa,OAAA,EAAS,kBAAA,CAAmB,oBAAA,IAAwB,aAAA;AAAA;;;;;;cCzF7D,cAAA;wEFII;EAAA;;;;;;;;;;AAAjB;;;;;;;;;AASA;;;;;AASA;;;cGQa,oBAAA,YAAgC,qBAAA;EAAA,QAIqB,WAAA;EAAA,QAHxD,SAAA;cAGwD,WAAA,GAAc,oBAAA;EHZA;;;;EGmB9E,QAAA,CAAS,MAAA,EAAQ,qBAAA;EHnBuE
|
|
1
|
+
{"version":3,"file":"index.d.mts","names":[],"sources":["../../src/openapi/types.ts","../../src/openapi/openapi.module.ts","../../src/openapi/openapi.tokens.ts","../../src/openapi/services/openapi-config.service.ts","../../src/openapi/services/openapi-tools.service.ts"],"mappings":";;;;;;;;;UAOiB,WAAA;EACf,KAAA;EACA,OAAA;EACA,WAAA;AAAA;;;;UAMe,gBAAA;EACf,OAAA;EACA,KAAA;AAAA;;;AAOF;;KAAY,iBAAA,IAAqB,OAAA,EAAS,gBAAA,KAAqB,iBAAA,CAAkB,SAAA;;;;UAKhE,gBAAA;EAL+D;EAO9E,IAAA;EAP+B;EAS/B,QAAA,GAAW,iBAAA;AAAA;;;AAJb;UAUiB,oBAAA;;EAEf,QAAA;EAVA;EAaA,IAAA,GAAO,WAAA;EAXI;EAcX,eAAA,GAAkB,MAAA;EAdU;EAiB5B,EAAA,GAAK,gBAAA;AAAA;;;;;KAOK,aAAA,IAAiB,IAAA,UAAc,QAAA,EAAU,cAAA;;;;UAKpC,qBAAA;EAff;EAiBA,IAAA,GAAO,OAAA,CAAQ,WAAA;EAdf;EAiBA,WAAA,GAAc,aAAA;AAAA;;AAVhB;;UAgBiB,sBAAA;EACf,QAAA;EACA,IAAA,EAAM,WAAA;EACN,eAAA,GAAkB,MAAA;EAClB,WAAA,GAAc,aAAA;EACd,EAAA,GAAK,gBAAA;AAAA;AAhBP;;;AAAA,UAsBiB,qBAAA;EApBR;;;;EAyBP,QAAA,CAAS,MAAA,EAAQ,qBAAA;EAzBV;;;EA8BP,kBAAA,IAAsB,sBAAA;AAAA;;;cC/BX,aAAA;ED9BiB;AAM9B;;;;;EAN8B,OCqCrB,OAAA,CAAQ,OAAA,GAAS,oBAAA,GAA4B,aAAA;EAAA,OAqB7C,YAAA,CAAa,OAAA,EAAS,kBAAA,CAAmB,oBAAA,IAAwB,aAAA;AAAA;;;;;;cCzF7D,cAAA;wEFII;EAAA;;;;;;;;;;AAAjB;;;;;;;;;AASA;;;;;AASA;;;cGQa,oBAAA,YAAgC,qBAAA;EAAA,QAIqB,WAAA;EAAA,QAHxD,SAAA;cAGwD,WAAA,GAAc,oBAAA;EHZA;;;;EGmB9E,QAAA,CAAS,MAAA,EAAQ,qBAAA;EHnBuE;EGwBxF,kBAAA,CAAA,GAAsB,sBAAA;EHnBP;;;;EAAA,QG0CP,WAAA;AAAA;;;KCrEL,UAAA,GAAa,MAAA;AAAA,UAED,cAAA;EACf,IAAA;EACA,WAAA;EACA,WAAA,EAAa,UAAA;EACb,MAAA;EACA,IAAA;EACA,UAAA;AAAA;AAAA,UAGe,mBAAA;EACf,MAAA;EACA,IAAA;EACA,OAAA,EAAS,MAAA;AAAA;AAAA,UAGM,UAAA;EACf,IAAA;EACA,UAAA;AAAA;AAAA,KAGU,UAAA,IAAc,MAAA,UAAgB,GAAA,UAAa,OAAA;EACrD,IAAA;EACA,OAAA,GAAU,MAAA;AAAA,MACN,OAAA,CAAQ,QAAA;;;;;;cA6BD,mBAAA;EAAA,wBACa,YAAA;EAAA,QAEhB,KAAA;EAAA,QACA,OAAA;EAAA,QACA,UAAA;EAAA,QAEA,IAAA;cAEI,IAAA,EAAM,aAAA,EAAe,OAAA;IAAY,UAAA,GAAa,UAAA;EAAA;EAS1D,QAAA,CAAS,MAAA,GAAS,UAAA,GAAa,cAAA;EAmB/B,OAAA,CAAQ,IAAA,WAAe,cAAA;EAIjB,WAAA,CAAY,IAAA,UAAc,IAAA,EAAM,MAAA,oBAA0B,OAAA,CAAQ,mBAAA;EAAA,QAmDhE,UAAA;EAAA,QAuBA,YAAA;EAAA,QASA,gBAAA;EAAA,QAOA,gBAAA;EAAA,QA+CA,eAAA;EAAA,QAYA,UAAA;EAAA,QA4BA,SAAA;EAAA,QAaA,YAAA;AAAA"}
|