@nextrush/class 1.0.0-beta.0 → 1.0.0-beta.1
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/dist/index.d.ts +33 -33
- package/dist/index.js.map +1 -1
- package/package.json +6 -6
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/metadata/metadata-keys.ts","../src/lifecycle/lifecycle-types.ts","../src/types.ts","../src/reflection/reflection.ts","../src/metadata/metadata.ts","../src/errors.ts","../src/discovery/discovery.ts","../src/index.ts","../src/decorators/class.ts","../src/path-utils.ts","../src/modules/module.ts","../src/decorators/http-code.ts","../src/decorators/response-decorators.ts","../src/decorators/routes.ts","../src/binding/param-factory.ts","../src/binding/param-decorators.ts","../src/binding/custom-param.ts","../src/guards/guards.ts","../src/filters/filters.ts","../src/interceptors/interceptors.ts","../src/registrar/registrar.ts","../src/bootstrap/stages/discover.ts","../src/bootstrap/stages/metadata.ts","../src/request/isolation.ts","../src/request/scope.ts","../src/bootstrap/stages/provider-graph.ts","../src/bootstrap/stages/validation.ts","../src/registrar/registry.ts","../src/runtime/handler.ts","../src/filters/filter-runner.ts","../src/guards/guard-runner.ts","../src/interceptors/interceptor-runner.ts","../src/binding/param-resolver.ts","../src/registrar/builder.ts","../src/bootstrap/stages/registrar.ts","../src/bootstrap/stages/router.ts","../src/lifecycle/lifecycle.ts","../src/bootstrap/graph.ts","../src/diagnostics/collector.ts","../src/bootstrap/pipeline.ts","../src/discovery/source.ts","../src/modules/module-graph.ts","../src/modules/module-registrar.ts","../src/diagnostics/get-diagnostics.ts"],"names":["isValidHttpMethod","method","includes","isValidParamSource","source","isGuardClass","guard","proto","prototype","canActivate","DECORATOR_METADATA_KEYS","CONTROLLER","Symbol","for","MODULE","ROUTES","PARAMS","MIDDLEWARE","GUARDS","INTERCEPTORS","FILTERS","CATCH","RESPONSE_HEADERS","REDIRECT","HTTP_CODE","isOnInit","value","onInit","isOnShutdown","onShutdown","getConstructorParamTypes","target","DESIGN_PARAMTYPES","Reflect","getMetadata","key","propertyKey","undefined","getOwnMetadata","defineMetadata","hasOwnMetadata","isController","getOwnMetadataFromReflection","getControllerMetadata","meta","getRouteMetadata","routes","getParamMetadata","methodName","allParams","params","get","String","getAllParamMetadata","Map","copy","set","getControllerDefinition","controller","getResponseHeaders","map","getRedirectMetadata","getHttpCode","ControllerError","NotAControllerError","NoRoutesError","DiscoveryError","ControllerResolutionError","ParameterInjectionError","MissingParameterError","RouteRegistrationError","GuardRejectionError","NotAModuleError","InternalServerError","message","code","options","name","className","filePath","reason","cause","controllerName","BadRequestError","paramIndex","details","parameterIndex","paramName","messageOverride","parameter","path","ForbiddenError","guardName","matchesPattern","filename","patterns","some","pattern","regexStr","replace","regex","RegExp","test","shouldInclude","relativePath","includePatterns","excludePatterns","scanDirectory","dir","rootDir","files","entries","readdir","withFileTypes","entry","fullPath","join","slice","length","split","sep","isDirectory","startsWith","subFiles","push","isFile","ext","extname","endsWith","error","importControllers","debug","controllers","errors","fileUrl","pathToFileURL","href","module","exportName","Object","keys","exported","process","stderr","write","Error","discoverControllers","resolve","root","include","DEFAULT_INCLUDE","exclude","DEFAULT_EXCLUDE","results","Array","cursor","worker","index","workerCount","Math","min","IMPORT_CONCURRENCY","Promise","all","from","getControllersFromResults","result","getErrorsFromResults","normalizePath","normalized","trim","stripTrailingSlash","Controller","pathOrOptions","controllerDecorator","normalizeControllerOptions","metadata","version","middleware","tags","markInjectable","input","derivePathFromClassName","baseName","kebabCase","toLowerCase","Module","moduleDecorator","imports","providers","exports","isModule","getModuleMetadata","HttpCode","statusCode","httpCodeDecorator","descriptor","methodKey","existing","SetHeader","setHeaderDecorator","headers","Redirect","url","redirectDecorator","createRouteDecorator","routeDecoratorFactory","routeDecorator","routeOptions","normalizeRouteInput","description","deprecated","existingRoutes","Get","Post","Put","Delete","Patch","Head","Options","All","createParamDecorator","defaultRequired","paramDecoratorFactory","nameOrOptions","paramDecorator","charAt","toUpperCase","paramOptions","normalizeParamInput","required","defaultValue","transform","pushParamMetadata","existingParams","methodParams","Body","Param","Query","Header","Ctx","ctxDecorator","Req","reqDecorator","Res","resDecorator","createCustomParamDecorator","extractor","customParamDecorator","customExtractor","UseGuard","guards","guardDecorator","existingGuards","getClassGuards","flatMap","m","getMethodGuards","getAllGuards","classGuards","methodGuards","Catch","errorTypes","catchDecorator","UseFilter","filters","filterDecorator","getCatchTypes","getClassFilters","getMethodFilters","getAllFilters","methodFilters","classFilters","UseInterceptor","interceptors","interceptorDecorator","getClassInterceptors","getMethodInterceptors","getAllInterceptors","classInterceptors","methodInterceptors","discoverStage","ctx","discoveredClasses","discover","metadataStage","controllerDefinitions","cls","def","TSYRINGE_INJECTION_TOKENS","tokenOf","token","collectDependencyClasses","paramTypes","injectionTokens","optional","getOptionalParams","indices","Set","i","add","Number","deps","has","explicit","collectServiceGraph","visited","queue","dep","head","hasServiceMetadata","sub","registerServiceGraph","container","effectiveScopes","scope","getServiceScope","isRegistered","register","useClass","isEffectivelyRequest","cache","visiting","cached","request","delete","computeEffectiveScopes","requestCache","scopes","reachable","service","requestScopedClasses","registerRequestScopedServices","bindRequestScopes","isolate","requestScoped","size","providerGraphStage","resolvedOptions","graph","providerGraph","validationStage","bootstrap","filterMatches","catchTypes","type","applyFilters","filter","instance","catch","wrapWithFilters","execute","next","handled","executeGuards","_controllerName","_methodName","guardContext","query","body","state","guardInstance","runInterceptors","invokeMethod","interceptorClass","downstream","intercept","resolveParametersFromPlan","sortedMetadata","maxIndex","args","fill","param","extractParameterValue","createMissingParameterError","raw","req","res","resolveMemoizedSingleton","controllerClass","instanceCache","resolveFromRequestChild","createChild","createRouteHandler","route","isRequestScoped","paramMetadata","sortedParams","sort","a","b","httpCode","effectiveStatusCode","responseHeaders","redirectMeta","resolveControllerInstance","controllerInstance","apply","header","status","responded","redirectUrl","redirectStatus","override","send","json","resolveMiddlewareRefs","refs","ref","resolved","buildRoutes","definition","globalPrefix","globalMiddleware","routeMetadata","handler","buildFullRoutePath","combinedMiddleware","toRouteMetaContribution","contribution","controllerPath","routePath","parts","ControllerRegistry","registerInContainer","registered","logRegistration","instances","registerAll","c","getAll","values","getAllRoutes","routeCount","count","clear","padEnd","registrarStage","registry","prefix","builtRoutes","regCtrl","registryInstances","lifecycleData","controllerClasses","validate","validateControllers","validateGuards","routerStage","router","buildRouteEntries","ROUTE_METADATA","CONTROLLERS_LIFECYCLE_EXTENSION","lifecycleRegistrationCount","collectLifecycleInstances","seen","collected","consider","reverse","registerLifecycleExtension","app","isReady","isRunning","extend","setup","destroy","err","AggregateError","buildApplicationGraph","requestScopedTokens","deepFreeze","obj","isArray","item","freeze","forEach","hasOwnProperty","call","collectDiagnostics","timings","dependencies","routeMap","duplicateRoutes","_key","pathParts","circularDependencies","detectCircularDependencies","cycles","recursionStack","visit","cycleStart","indexOf","cycle","bootstrapPipeline","enableTiming","diagnostics","now","performance","stageStart","stage","ms","report","storeClassDiagnostics","diagnosticsStore","WeakMap","getClassDiagnosticsInternal","FilesystemSource","_discoveryErrors","getDiscoveryErrors","MemorySource","debugLog","warnLog","resolveOptions","strict","DIError","registerControllers","createContainer","globalContainer","resolvedOpts","collectModuleGraph","ordered","completed","mod","imported","collectModuleControllers","modules","registerModule","rootModule","provider","registerProvider","registerClassProvider","registerConfigProvider","provide","useValue","useFactory","inject","getClassDiagnostics"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * @nextrush/decorators - Metadata Keys & Runtime Helpers\n *\n * The reflect-metadata storage keys plus the runtime type-guard helpers that\n * back the decorator implementations. These are the only runtime values in the\n * type layer — everything else in the sibling *-types modules is type-only.\n */\n\nimport type { Guard, Constructor, CanActivate } from '../guards/guard-types.js';\nimport type { ParamSource } from '../binding/param-types.js';\nimport type { RouteMethods } from '../decorators/route-types.js';\n\n/**\n * Metadata keys used for decorator storage\n */\nexport const DECORATOR_METADATA_KEYS = {\n CONTROLLER: Symbol.for('nextrush:controller'),\n MODULE: Symbol.for('nextrush:module'),\n ROUTES: Symbol.for('nextrush:routes'),\n PARAMS: Symbol.for('nextrush:params'),\n MIDDLEWARE: Symbol.for('nextrush:middleware'),\n GUARDS: Symbol.for('nextrush:guards'),\n INTERCEPTORS: Symbol.for('nextrush:interceptors'),\n FILTERS: Symbol.for('nextrush:filters'),\n CATCH: Symbol.for('nextrush:catch'),\n RESPONSE_HEADERS: Symbol.for('nextrush:response-headers'),\n REDIRECT: Symbol.for('nextrush:redirect'),\n HTTP_CODE: Symbol.for('nextrush:http-code'),\n} as const;\n\n/**\n * Type guard to check if a value is a valid HTTP method (decorator-metadata\n * sense — includes `'ALL'`, the `@All()` any-method sentinel; T016).\n */\nexport function isValidHttpMethod(method: string): method is RouteMethods {\n return ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS', 'ALL'].includes(method);\n}\n\n/**\n * Type guard to check if a value is a valid param source\n */\nexport function isValidParamSource(source: string): source is ParamSource {\n return ['body', 'query', 'param', 'header', 'ctx', 'req', 'res', 'custom'].includes(source);\n}\n\n/**\n * Type guard to check if a guard is a class (constructor) rather than a function.\n *\n * This checks if the guard has a prototype with the canActivate method defined,\n * which indicates it's a class implementing CanActivate rather than a function.\n */\nexport function isGuardClass(guard: Guard): guard is Constructor<CanActivate> {\n // Check if it's a function (both classes and functions are typeof 'function')\n if (typeof guard !== 'function') {\n return false;\n }\n\n // Check if it has a prototype with canActivate method\n // Arrow functions and regular functions won't have canActivate on their prototype\n const proto = guard.prototype;\n if (!proto || typeof proto !== 'object') {\n return false;\n }\n\n // Check if canActivate is defined on the prototype (class method)\n return typeof proto.canActivate === 'function';\n}\n","/**\n * @nextrush/decorators - Service Lifecycle Hook Type Definitions\n *\n * Two duck-typed behavioral interfaces — `OnInit` and `OnShutdown` — that a\n * `@Service`/`@Repository`/`@Config` (or any DI-managed instance) may implement\n * to participate in the application lifecycle. There is intentionally **no\n * decorator**: a service opts in purely by declaring the method, and the\n * controllers registrar detects it by presence via the guards below.\n *\n * Unlike {@link isGuardClass} (which inspects a class *constructor*'s prototype),\n * these guards operate on resolved *instances*, because the registrar has\n * already resolved each service from the container before deciding whether it\n * takes part in the lifecycle.\n *\n * @see `@nextrush/controllers` `registerControllers` — bridges these hooks into\n * `app.ready()` (calls `onInit`) and `app.close()` (calls `onShutdown`).\n */\n\n/**\n * Implemented by a service that needs to run initialization logic once, when the\n * application boots (`app.ready()`), after all controllers and their service\n * graph have been registered and resolved.\n *\n * `onInit` runs in dependency order — a service's dependencies initialize before\n * the service that depends on them (a reverse-BFS approximation of the graph).\n * An async `onInit` is awaited, so boot does not complete until every hook has\n * settled. Registration must happen before `serve()`/`ready()`.\n *\n * @example\n * ```typescript\n * import { Service } from '@nextrush/di';\n * import type { OnInit } from 'nextrush/class';\n *\n * @Service()\n * class Database implements OnInit {\n * async onInit(): Promise<void> {\n * await this.pool.connect();\n * }\n * }\n * ```\n */\nexport interface OnInit {\n onInit(): void | Promise<void>;\n}\n\n/**\n * Implemented by a service that needs to release resources when the application\n * shuts down (`app.close()`).\n *\n * `onShutdown` runs in the **reverse** of the `onInit` order (dependents tear\n * down before their dependencies), and an async `onShutdown` is awaited.\n *\n * @example\n * ```typescript\n * import { Service } from '@nextrush/di';\n * import type { OnShutdown } from 'nextrush/class';\n *\n * @Service()\n * class Database implements OnShutdown {\n * async onShutdown(): Promise<void> {\n * await this.pool.end();\n * }\n * }\n * ```\n */\nexport interface OnShutdown {\n onShutdown(): void | Promise<void>;\n}\n\n/**\n * Narrow an arbitrary value to {@link OnInit} by detecting a callable `onInit`\n * member. Traverses the prototype chain, so both object literals and class\n * instances are detected. Returns `false` for `null`, non-objects, and values\n * whose `onInit` is not a function.\n */\nexport function isOnInit(value: unknown): value is OnInit {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { onInit?: unknown }).onInit === 'function'\n );\n}\n\n/**\n * Narrow an arbitrary value to {@link OnShutdown} by detecting a callable\n * `onShutdown` member. Same semantics as {@link isOnInit}.\n */\nexport function isOnShutdown(value: unknown): value is OnShutdown {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { onShutdown?: unknown }).onShutdown === 'function'\n );\n}\n","/**\n * @nextrush/decorators - Type Definitions (barrel)\n *\n * Aggregates the per-concern type modules so existing `from './types.js'`\n * imports (within this package and downstream) keep resolving unchanged.\n * Definitions live in the cohesive sibling modules re-exported below.\n */\n\n// Controller concern\nexport type {\n ControllerMetadata,\n ControllerOptions,\n MiddlewareRef,\n} from './decorators/controller-types.js';\n\n// Route concern\nexport type {\n ControllerRouteMetadata,\n RedirectMetadata,\n ResponseHeaderMetadata,\n RouteMethods,\n RouteOptions,\n} from './decorators/route-types.js';\n// Re-exporting the deprecated alias itself (for the one-minor backward-compat window) is not a\n// violation of the deprecation — the rule should only fire on NEW consumers of the old name.\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nexport type { RouteMetadata } from './decorators/route-types.js';\n\n// Parameter concern\nexport type {\n BodyOptions,\n CustomParamExtractor,\n HeaderOptions,\n ParamMetadata,\n ParamOptions,\n ParamSource,\n QueryOptions,\n TransformFn,\n} from './binding/param-types.js';\n\n// Guard concern\nexport type {\n CanActivate,\n Constructor,\n Guard,\n GuardContext,\n GuardFn,\n GuardMetadata,\n} from './guards/guard-types.js';\n\n// Exception filter concern\nexport type {\n ExceptionFilter,\n ExceptionFilterClass,\n FilterMetadata,\n} from './filters/filter-types.js';\n\n// Interceptor concern\nexport type {\n Interceptor,\n InterceptorClass,\n InterceptorMetadata,\n} from './interceptors/interceptor-types.js';\n\n// Service lifecycle concern\nexport type { OnInit, OnShutdown } from './lifecycle/lifecycle-types.js';\n\n// Runtime values (metadata keys + type-guard helpers)\nexport {\n DECORATOR_METADATA_KEYS,\n isGuardClass,\n isValidHttpMethod,\n isValidParamSource,\n} from './metadata/metadata-keys.js';\n\nexport { isOnInit, isOnShutdown } from './lifecycle/lifecycle-types.js';\n","/**\n * @nextrush/decorators - Reflection API Isolation\n *\n * Single point of contact for all Reflect.getMetadata, Reflect.defineMetadata,\n * and design:paramtypes reads. Isolates reflection plumbing from business logic.\n */\n\n/**\n * Read the constructor parameter types emitted by TypeScript's `emitDecoratorMetadata`.\n * Returns an empty array if metadata is not present (e.g., under esbuild/tsx without\n * the metadata plugin).\n *\n * This is the ONLY place in the package that reads `design:paramtypes` directly.\n * All other code requests parameter types through this helper.\n *\n * @internal For cross-package DI use, re-export from index.ts as getConstructorParamTypes.\n */\nexport function getConstructorParamTypes(target: Function): unknown[] {\n const DESIGN_PARAMTYPES = 'design:paramtypes';\n return (Reflect.getMetadata(DESIGN_PARAMTYPES, target) as unknown[] | undefined) ?? [];\n}\n\n/**\n * Read metadata by key, supporting both own and inherited metadata.\n * Supports both 2-arg form (target only) and 3-arg form (target + propertyKey).\n * @internal Used by metadata readers.\n */\nexport function getMetadata<T>(\n key: string | symbol,\n target: object,\n propertyKey?: string | symbol\n): T | undefined {\n if (propertyKey !== undefined) {\n return Reflect.getMetadata(key, target, propertyKey) as T | undefined;\n }\n return Reflect.getMetadata(key, target) as T | undefined;\n}\n\n/**\n * Read metadata only from the target's own properties, not inherited.\n * @internal Used by metadata writers to avoid parent-child collisions.\n */\nexport function getOwnMetadata<T>(key: string | symbol, target: object): T | undefined {\n return Reflect.getOwnMetadata(key, target) as T | undefined;\n}\n\n/**\n * Define metadata on a target, replacing any prior value at this key.\n * Supports both 3-arg form (target only) and 4-arg form (target + propertyKey).\n * @internal Used by all decorator metadata writes.\n */\nexport function defineMetadata(\n key: string | symbol,\n value: unknown,\n target: object,\n propertyKey?: string | symbol\n): void {\n if (propertyKey !== undefined) {\n Reflect.defineMetadata(key, value, target, propertyKey);\n } else {\n Reflect.defineMetadata(key, value, target);\n }\n}\n\n/**\n * Read all metadata keys defined on a target.\n * @internal Used for exhaustive metadata enumeration.\n */\nexport function getMetadataKeys(target: object): (string | symbol)[] {\n return Reflect.getMetadataKeys(target);\n}\n\n/**\n * Check if metadata with a specific key exists on a target's own properties\n * (not inherited).\n * @internal Used by module and metadata checks.\n */\nexport function hasOwnMetadata(key: string | symbol, target: object): boolean {\n return Reflect.hasOwnMetadata(key, target);\n}\n","/**\n * @nextrush/decorators - Metadata Readers\n *\n * Utility functions to read decorator metadata from controller classes.\n * Used by @nextrush/controllers' registrar to build routes.\n */\n\nimport type {\n ControllerMetadata,\n ControllerRouteMetadata,\n ParamMetadata,\n RedirectMetadata,\n ResponseHeaderMetadata,\n} from '../types.js';\nimport { DECORATOR_METADATA_KEYS } from '../types.js';\nimport { getOwnMetadata as getOwnMetadataFromReflection } from '../reflection/reflection.js';\n\n/**\n * Check if a class has @Controller decorator.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController { }\n *\n * isController(UserController); // true\n * isController(SomeService); // false\n * ```\n */\nexport function isController(target: Function): boolean {\n return (\n getOwnMetadataFromReflection<ControllerMetadata>(DECORATOR_METADATA_KEYS.CONTROLLER, target) !== undefined\n );\n}\n\n/**\n * Get controller metadata from a class.\n * Returns undefined if class doesn't have @Controller decorator.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController { }\n *\n * const meta = getControllerMetadata(UserController);\n * // { path: '/users', version: undefined, middleware: undefined, tags: undefined }\n * ```\n */\nexport function getControllerMetadata(target: Function): ControllerMetadata | undefined {\n const meta = getOwnMetadataFromReflection<ControllerMetadata>(DECORATOR_METADATA_KEYS.CONTROLLER, target);\n return meta ? { ...meta } : undefined;\n}\n\n/**\n * Get all route metadata from a controller class.\n * Returns empty array if no routes are defined.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Get()\n * findAll() { }\n *\n * @Get('/:id')\n * findOne() { }\n * }\n *\n * const routes = getRouteMetadata(UserController);\n * // [{ method: 'GET', path: '/', ... }, { method: 'GET', path: '/:id', ... }]\n * ```\n */\nexport function getRouteMetadata(target: Function): ControllerRouteMetadata[] {\n const routes = getOwnMetadataFromReflection<ControllerRouteMetadata[]>(DECORATOR_METADATA_KEYS.ROUTES, target);\n return routes ? [...routes] : [];\n}\n\n/**\n * Get parameter metadata for a specific method.\n * Returns empty array if no parameters have decorators.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Get('/:id')\n * findOne(@Param('id') id: string, @Query('include') include: string) { }\n * }\n *\n * const params = getParamMetadata(UserController, 'findOne');\n * // [{ source: 'param', index: 0, name: 'id' }, { source: 'query', index: 1, name: 'include' }]\n * ```\n */\nexport function getParamMetadata(target: Function, methodName: string | symbol): ParamMetadata[] {\n const allParams: Map<string, ParamMetadata[]> | undefined =\n getOwnMetadataFromReflection<Map<string, ParamMetadata[]>>(DECORATOR_METADATA_KEYS.PARAMS, target);\n\n const params = allParams?.get(String(methodName));\n return params ? [...params] : [];\n}\n\n/**\n * Get all parameter metadata for all methods in a controller.\n * Returns a Map where keys are method names.\n *\n * @example\n * ```typescript\n * const allParams = getAllParamMetadata(UserController);\n * // Map { 'findOne' => [...], 'create' => [...] }\n * ```\n */\nexport function getAllParamMetadata(target: Function): Map<string, ParamMetadata[]> {\n const params = getOwnMetadataFromReflection<Map<string, ParamMetadata[]>>(\n DECORATOR_METADATA_KEYS.PARAMS,\n target\n );\n if (!params) return new Map();\n // Return a shallow copy to prevent external mutation\n const copy = new Map<string, ParamMetadata[]>();\n for (const [key, value] of params) {\n copy.set(key, [...value]);\n }\n return copy;\n}\n\n/**\n * Get full controller definition including metadata, routes, and params.\n * Returns undefined if class is not a controller.\n *\n * @example\n * ```typescript\n * const def = getControllerDefinition(UserController);\n * // {\n * // controller: { path: '/users', ... },\n * // routes: [{ method: 'GET', path: '/', ... }],\n * // params: Map { 'findOne' => [...] }\n * // }\n * ```\n */\nexport function getControllerDefinition(target: Function): ControllerDefinition | undefined {\n const controller = getControllerMetadata(target);\n\n if (!controller) {\n return undefined;\n }\n\n return {\n target,\n controller,\n routes: getRouteMetadata(target),\n params: getAllParamMetadata(target),\n };\n}\n\n/**\n * Full controller definition with all metadata\n */\nexport interface ControllerDefinition {\n /** Controller class constructor */\n readonly target: Function;\n\n /** Controller-level metadata */\n readonly controller: ControllerMetadata;\n\n /** All route metadata */\n readonly routes: ControllerRouteMetadata[];\n\n /** Parameter metadata keyed by method name */\n readonly params: Map<string, ParamMetadata[]>;\n}\n\n/**\n * Get response headers metadata for a controller method.\n *\n * Returns the list of `@SetHeader()` entries for the given method,\n * or an empty array if none are defined.\n */\nexport function getResponseHeaders(target: Function, methodName: string): ResponseHeaderMetadata[] {\n const map: Map<string, ResponseHeaderMetadata[]> | undefined = getOwnMetadataFromReflection<\n Map<string, ResponseHeaderMetadata[]>\n >(DECORATOR_METADATA_KEYS.RESPONSE_HEADERS, target);\n return [...(map?.get(methodName) ?? [])];\n}\n\n/**\n * Get redirect metadata for a controller method.\n *\n * Returns the `@Redirect()` configuration for the given method,\n * or `undefined` if not decorated.\n */\nexport function getRedirectMetadata(\n target: Function,\n methodName: string\n): RedirectMetadata | undefined {\n const map: Map<string, RedirectMetadata> | undefined = getOwnMetadataFromReflection<\n Map<string, RedirectMetadata>\n >(DECORATOR_METADATA_KEYS.REDIRECT, target);\n return map?.get(methodName);\n}\n\n/**\n * Get the `@HttpCode()` status code for a controller method.\n *\n * Returns the status code stored by `@HttpCode(code)`, or `undefined` if the\n * method is not decorated.\n */\nexport function getHttpCode(target: Function, methodName: string): number | undefined {\n const map: Map<string, number> | undefined = getOwnMetadataFromReflection<Map<string, number>>(\n DECORATOR_METADATA_KEYS.HTTP_CODE,\n target\n );\n return map?.get(methodName);\n}\n","/**\n * @nextrush/controllers - Error Classes\n *\n * Production-grade error classes with actionable messages.\n * Client errors (4xx) extend HttpError for proper status codes.\n */\n\nimport {\n BadRequestError,\n ForbiddenError,\n HttpError,\n InternalServerError,\n type HttpErrorOptions,\n} from '@nextrush/errors';\n\n/**\n * Base error class for controller-related server errors.\n * These are 500-level errors that indicate server-side issues.\n *\n * Note: We use `declare` for name/message to help TypeScript's declaration\n * emitter recognize that these are inherited from Error via @nextrush/errors.\n */\nexport class ControllerError extends InternalServerError {\n declare name: string;\n declare message: string;\n\n constructor(message: string, code: string, options?: HttpErrorOptions) {\n super(message, { code, ...options });\n this.name = 'ControllerError';\n }\n}\n\n/**\n * Error thrown when a class is not a valid controller.\n * This is a server configuration error (500).\n */\nexport class NotAControllerError extends ControllerError {\n constructor(className: string) {\n super(\n `Class \"${className}\" is not a controller.\\n\\n` +\n `To make it a controller, add the @Controller decorator:\\n\\n` +\n ` import { Controller } from '@nextrush/class';\\n\\n` +\n ` @Controller('/path')\\n` +\n ` class ${className} {\\n` +\n ` // ...\\n` +\n ` }\\n`,\n 'NOT_A_CONTROLLER'\n );\n this.name = 'NotAControllerError';\n }\n}\n\n/**\n * Error thrown when controller has no routes defined.\n * This is a server configuration error (500).\n */\nexport class NoRoutesError extends ControllerError {\n constructor(className: string) {\n super(\n `Controller \"${className}\" has no routes defined.\\n\\n` +\n `Add route decorators to your controller methods:\\n\\n` +\n ` import { Controller, Get, Post } from '@nextrush/class';\\n\\n` +\n ` @Controller('/users')\\n` +\n ` class ${className} {\\n` +\n ` @Get()\\n` +\n ` findAll() { }\\n\\n` +\n ` @Post()\\n` +\n ` create(@Body() data: CreateDto) { }\\n` +\n ` }\\n`,\n 'NO_ROUTES'\n );\n this.name = 'NoRoutesError';\n }\n}\n\n/**\n * Error thrown when file discovery fails.\n * This is a server configuration error (500).\n */\nexport class DiscoveryError extends ControllerError {\n readonly filePath: string;\n\n constructor(filePath: string, reason: string, cause?: Error) {\n super(\n `Failed to discover controllers in \"${filePath}\".\\n\\n` +\n `Reason: ${reason}\\n\\n` +\n `Possible fixes:\\n` +\n ` 1. Ensure the file exists and is accessible\\n` +\n ` 2. Check for syntax errors in the file\\n` +\n ` 3. Verify the file exports controller classes\\n`,\n 'DISCOVERY_ERROR',\n { cause }\n );\n this.name = 'DiscoveryError';\n this.filePath = filePath;\n }\n}\n\n/**\n * Error thrown when DI resolution fails for a controller.\n * This is a server configuration error (500).\n */\nexport class ControllerResolutionError extends ControllerError {\n readonly controllerName: string;\n\n constructor(controllerName: string, cause?: Error) {\n super(\n `Failed to resolve controller \"${controllerName}\" from DI container.\\n\\n` +\n `Possible causes:\\n` +\n ` 1. Controller is not registered in the DI container\\n` +\n ` 2. Controller has unresolvable dependencies\\n` +\n ` 3. Circular dependency detected\\n\\n` +\n `Note: @Controller automatically registers with DI - no @Service() needed!\\n\\n` +\n ` import { Controller } from '@nextrush/class';\\n\\n` +\n ` @Controller('/path')\\n` +\n ` class ${controllerName} {\\n` +\n ` constructor(private readonly service: SomeService) { }\\n` +\n ` }\\n`,\n 'CONTROLLER_RESOLUTION_ERROR',\n { cause }\n );\n this.name = 'ControllerResolutionError';\n this.controllerName = controllerName;\n }\n}\n\n/**\n * Error thrown when parameter injection fails.\n * This is a CLIENT error (400) - the request is malformed.\n */\nexport class ParameterInjectionError extends BadRequestError {\n declare name: string;\n declare message: string;\n readonly controllerName: string;\n readonly methodName: string;\n readonly paramIndex: number;\n\n constructor(\n controllerName: string,\n methodName: string,\n paramIndex: number,\n reason: string\n ) {\n super(\n `Invalid parameter at index ${paramIndex} for \"${controllerName}.${methodName}\": ${reason}`,\n {\n code: 'PARAMETER_INJECTION_ERROR',\n details: {\n controller: controllerName,\n method: methodName,\n parameterIndex: paramIndex,\n reason,\n },\n }\n );\n this.name = 'ParameterInjectionError';\n this.controllerName = controllerName;\n this.methodName = methodName;\n this.paramIndex = paramIndex;\n }\n}\n\n/**\n * Error thrown when a required parameter is missing.\n * This is a CLIENT error (400) - the request is incomplete.\n *\n * `messageOverride` lets callers replace the generic\n * `Required <source> parameter \"<name>\" is missing` text with a more\n * specific message (e.g. `@Body()` appends a body-parser remediation hint\n * in `resolveParametersFromPlan` — see `binding/param-resolver.ts`) while\n * keeping `code`/`details`/`instanceof MissingParameterError` unchanged, so\n * existing error-handling code that switches on the error type is\n * unaffected.\n */\nexport class MissingParameterError extends BadRequestError {\n declare name: string;\n declare message: string;\n readonly controllerName: string;\n readonly methodName: string;\n readonly paramName: string;\n readonly source: string;\n\n constructor(\n controllerName: string,\n methodName: string,\n paramName: string,\n source: string,\n messageOverride?: string\n ) {\n super(messageOverride ?? `Required ${source} parameter \"${paramName}\" is missing`, {\n code: 'MISSING_PARAMETER',\n details: {\n parameter: paramName,\n source,\n controller: controllerName,\n method: methodName,\n },\n });\n this.name = 'MissingParameterError';\n this.controllerName = controllerName;\n this.methodName = methodName;\n this.paramName = paramName;\n this.source = source;\n }\n}\n\n/**\n * Error thrown when route registration fails.\n * This is a server configuration error (500).\n */\nexport class RouteRegistrationError extends ControllerError {\n readonly controllerName: string;\n readonly method: string;\n readonly path: string;\n\n constructor(\n controllerName: string,\n method: string,\n path: string,\n reason: string,\n cause?: Error\n ) {\n super(\n `Failed to register route ${method} ${path} from controller \"${controllerName}\".\\n\\n` +\n `Reason: ${reason}\\n`,\n 'ROUTE_REGISTRATION_ERROR',\n { cause }\n );\n this.name = 'RouteRegistrationError';\n this.controllerName = controllerName;\n this.method = method;\n this.path = path;\n }\n}\n\n/**\n * Error thrown when a guard rejects the request.\n * This is a CLIENT error (403) - access denied.\n */\nexport class GuardRejectionError extends ForbiddenError {\n declare name: string;\n declare message: string;\n readonly guardName: string;\n\n constructor(guardName: string, message?: string) {\n super(message ?? 'Access denied', {\n code: 'GUARD_REJECTED',\n });\n this.name = 'GuardRejectionError';\n this.guardName = guardName;\n }\n}\n\n/**\n * Error thrown when a class passed where a module is expected is not a valid\n * module. This is a server configuration error (500).\n */\nexport class NotAModuleError extends ControllerError {\n constructor(className: string) {\n super(\n `Class \"${className}\" is not a module.\\n\\n` +\n `To make it a module, add the @Module decorator:\\n\\n` +\n ` import { Module } from '@nextrush/class';\\n\\n` +\n ` @Module({\\n` +\n ` controllers: [SomeController],\\n` +\n ` providers: [SomeService],\\n` +\n ` })\\n` +\n ` class ${className} {}\\n`,\n 'NOT_A_MODULE'\n );\n this.name = 'NotAModuleError';\n }\n}\n\n/**\n * Re-export HttpError for type checking in consumers\n */\nexport { HttpError };\n","/**\n * @nextrush/controllers - Controller Discovery\n *\n * Automatic controller discovery by scanning directories.\n * Uses glob patterns to find files and imports them to discover controllers.\n *\n * ## Import side-effect (important)\n *\n * Discovery works by **dynamically `import()`ing every matched module**, then\n * inspecting its exports for `@Controller` classes. Importing a module runs its\n * top-level code — so any side-effects at module scope (DI registration via\n * `@Service`/`@Repository`, singleton construction, connection setup) execute\n * during discovery. This is load-bearing: services and guards register with the\n * DI container as a side-effect of being imported (transitively via the\n * controllers that import them, or directly when matched).\n */\n\nimport { isController } from '../metadata/metadata.js';\nimport { readdir } from 'node:fs/promises';\nimport { extname, join, resolve, sep } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { DiscoveryError } from '../errors.js';\nimport type { DiscoveryOptions, DiscoveryResult } from '../registrar/registrar-types.js';\n\n/**\n * Default include patterns — the `*.controller.*` naming convention.\n *\n * Only files named like `user.controller.ts` are imported by default, rather\n * than every source file under `root`. This keeps startup fast and avoids\n * running unrelated module side-effects. Non-controller modules (services,\n * guards, repositories) still load transitively via the controllers that import\n * them, so their `@Service`/`@Repository` registration side-effects still fire.\n *\n * To restore scan-all behavior, pass `include: ['**/*.ts', '**/*.js']`.\n *\n * Single source of truth: re-used by the registrar so both entry points agree.\n */\nexport const DEFAULT_INCLUDE = ['**/*.controller.ts', '**/*.controller.js'];\n\n/** Default exclude patterns — tests and build/vendor artifacts. */\nexport const DEFAULT_EXCLUDE = [\n '**/*.test.ts',\n '**/*.spec.ts',\n '**/*.test.js',\n '**/*.spec.js',\n '**/node_modules/**',\n '**/dist/**',\n '**/__tests__/**',\n];\n\n/**\n * Maximum number of module imports performed concurrently during discovery.\n * Bounds the import fan-out so a large source tree can't open an unbounded\n * number of module evaluations at once, while still parallelizing I/O.\n */\nconst IMPORT_CONCURRENCY = 16;\n\n/**\n * Check if a filename matches any of the patterns\n *\n * Simple glob matching supporting:\n * - `**` matches any number of directories (including none)\n * - `*` matches any characters except /\n */\nfunction matchesPattern(filename: string, patterns: string[]): boolean {\n return patterns.some((pattern) => {\n // Convert glob pattern to regex\n // Order matters: escape special chars first, then replace glob patterns\n let regexStr = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape regex special chars (except * and ?)\n .replace(/\\*\\*\\//g, '(.*\\\\/)?') // **/ matches any directories (including none)\n .replace(/\\*\\*/g, '.*') // ** at end matches anything\n .replace(/\\*/g, '[^/]*'); // * matches anything except /\n\n const regex = new RegExp(`^${regexStr}$`);\n return regex.test(filename);\n });\n}\n\n/**\n * Check if a path should be included based on patterns\n */\nfunction shouldInclude(\n relativePath: string,\n includePatterns: string[],\n excludePatterns: string[]\n): boolean {\n // Check exclusions first\n if (matchesPattern(relativePath, excludePatterns)) {\n return false;\n }\n\n // Check inclusions\n return matchesPattern(relativePath, includePatterns);\n}\n\n/**\n * Recursively scan directory for files\n */\nasync function scanDirectory(\n dir: string,\n rootDir: string,\n includePatterns: string[],\n excludePatterns: string[]\n): Promise<string[]> {\n const files: string[] = [];\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n // Normalize to POSIX separators for consistent glob matching\n const relativePath = fullPath\n .slice(rootDir.length + 1)\n .split(sep)\n .join('/');\n\n if (entry.isDirectory()) {\n // Skip excluded directories entirely\n if (\n entry.name === 'node_modules' ||\n entry.name === 'dist' ||\n entry.name === '__tests__' ||\n entry.name.startsWith('.')\n ) {\n continue;\n }\n\n // Recursively scan subdirectories\n const subFiles = await scanDirectory(fullPath, rootDir, includePatterns, excludePatterns);\n files.push(...subFiles);\n } else if (entry.isFile()) {\n const ext = extname(entry.name);\n if ((ext === '.ts' || ext === '.js') && !entry.name.endsWith('.d.ts')) {\n if (shouldInclude(relativePath, includePatterns, excludePatterns)) {\n files.push(fullPath);\n }\n }\n }\n }\n } catch (error) {\n // Directory doesn't exist or can't be read\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n\n return files;\n}\n\n/**\n * Import a module and extract controller classes\n */\nasync function importControllers(\n filePath: string,\n debug: boolean\n): Promise<{ controllers: Function[]; errors: DiscoveryError[] }> {\n const controllers: Function[] = [];\n const errors: DiscoveryError[] = [];\n\n try {\n // Convert to file URL for ESM import\n const fileUrl = pathToFileURL(filePath).href;\n const module = await import(fileUrl);\n\n // Check all exports for controllers\n for (const exportName of Object.keys(module)) {\n const exported = module[exportName];\n\n if (typeof exported === 'function' && isController(exported)) {\n controllers.push(exported);\n if (debug) {\n process.stderr.write(`[Controllers] Discovered: ${exported.name} from ${filePath}\\n`);\n }\n }\n }\n } catch (error) {\n errors.push(\n new DiscoveryError(\n filePath,\n error instanceof Error ? error.message : String(error),\n error instanceof Error ? error : undefined\n )\n );\n }\n\n return { controllers, errors };\n}\n\n/**\n * Discover all controllers in a directory.\n *\n * Scans `root` for files matching `include` (default: the `*.controller.*`\n * convention) and dynamically imports each match to find `@Controller` classes.\n *\n * @remarks\n * **Side-effect:** every matched module is `import()`ed, which runs its\n * top-level code (including DI registration). See the module-level docs. Only\n * files matching the convention are imported by default; pass\n * `include: ['**/*.ts', '**/*.js']` to scan every source file instead.\n *\n * Imports run in parallel with a bounded concurrency cap\n * ({@link IMPORT_CONCURRENCY}); results are aggregated deterministically in\n * scan order regardless of import completion order.\n *\n * @param options - Discovery options\n * @returns Array of discovery results (one per scanned file), in scan order\n *\n * @example\n * ```typescript\n * // Imports only *.controller.ts / *.controller.js files\n * const controllers = await discoverControllers({\n * root: './src',\n * });\n * ```\n */\nexport async function discoverControllers(options: DiscoveryOptions): Promise<DiscoveryResult[]> {\n const rootDir = resolve(options.root);\n const includePatterns = options.include ?? DEFAULT_INCLUDE;\n const excludePatterns = options.exclude ?? DEFAULT_EXCLUDE;\n const debug = options.debug ?? false;\n\n if (debug) {\n process.stderr.write(`[Controllers] Scanning: ${rootDir}\\n`);\n process.stderr.write(`[Controllers] Include: ${includePatterns.join(', ')}\\n`);\n process.stderr.write(`[Controllers] Exclude: ${excludePatterns.join(', ')}\\n`);\n }\n\n // Scan for files\n const files = await scanDirectory(rootDir, rootDir, includePatterns, excludePatterns);\n\n if (debug) {\n process.stderr.write(`[Controllers] Found ${files.length} files to scan\\n`);\n }\n\n // Import and discover controllers in parallel with a bounded concurrency cap.\n // Results are written by index so aggregation stays deterministic (scan\n // order), independent of which import settles first.\n const results: DiscoveryResult[] = new Array(files.length);\n let cursor = 0;\n\n const worker = async (): Promise<void> => {\n for (let index = cursor++; index < files.length; index = cursor++) {\n const filePath = files[index]!;\n const { controllers, errors } = await importControllers(filePath, debug);\n results[index] = { filePath, controllers, errors };\n }\n };\n\n const workerCount = Math.min(IMPORT_CONCURRENCY, files.length);\n await Promise.all(Array.from({ length: workerCount }, () => worker()));\n\n return results;\n}\n\n/**\n * Get all controllers from discovery results\n */\nexport function getControllersFromResults(results: DiscoveryResult[]): Function[] {\n const controllers: Function[] = [];\n\n for (const result of results) {\n controllers.push(...result.controllers);\n }\n\n return controllers;\n}\n\n/**\n * Get all errors from discovery results\n */\nexport function getErrorsFromResults(results: DiscoveryResult[]): DiscoveryError[] {\n const errors: DiscoveryError[] = [];\n\n for (const result of results) {\n errors.push(...result.errors);\n }\n\n return errors;\n}\n","/**\n * @nextrush/class\n *\n * Unified class-based API for NextRush — decorators, DI, and controller registration.\n * Merges the former @nextrush/decorators and @nextrush/controllers into one cohesive package.\n *\n * @packageDocumentation\n */\n\n// Canonical reflect-metadata load for the package. Decorator metadata (route,\n// param, and DI reflection) depends on this side-effect import being evaluated\n// before any decorated class is defined; keeping it at the entry point avoids\n// scattering the same import across internal modules.\nimport 'reflect-metadata';\n\n// ============================================\n// DECORATORS: Controller, Routes, Parameters\n// ============================================\n\n// Types\nexport type {\n BodyOptions,\n CanActivate,\n Constructor,\n ControllerMetadata,\n ControllerOptions,\n ControllerRouteMetadata,\n CustomParamExtractor,\n ExceptionFilter,\n ExceptionFilterClass,\n FilterMetadata,\n Guard,\n GuardContext,\n GuardFn,\n GuardMetadata,\n HeaderOptions,\n Interceptor,\n InterceptorClass,\n InterceptorMetadata,\n MiddlewareRef,\n ParamMetadata,\n ParamOptions,\n ParamSource,\n QueryOptions,\n RedirectMetadata,\n ResponseHeaderMetadata,\n RouteMethods,\n RouteOptions,\n TransformFn,\n} from './types.js';\n// Re-exporting the deprecated alias itself (for the one-minor backward-compat window) is not a\n// violation of the deprecation — the rule should only fire on NEW consumers of the old name.\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nexport type { RouteMetadata } from './types.js';\n\nexport {\n DECORATOR_METADATA_KEYS,\n isGuardClass,\n isValidHttpMethod,\n isValidParamSource,\n} from './types.js';\n\n// Service Lifecycle Hooks (duck-typed — no decorator)\nexport type { OnInit, OnShutdown } from './lifecycle/lifecycle-types.js';\nexport { isOnInit, isOnShutdown } from './lifecycle/lifecycle-types.js';\n\n// Class Decorators\nexport { Controller } from './decorators/class.js';\n\n// Module Decorator\nexport { Module, getModuleMetadata, isModule } from './modules/module.js';\nexport type {\n ModuleMetadata,\n ModuleOptions,\n ModuleProvider,\n ModuleProviderConfig,\n} from './modules/module-types.js';\n\n// Response Decorators\nexport { HttpCode } from './decorators/http-code.js';\nexport { Redirect, SetHeader } from './decorators/response-decorators.js';\n\n// Route Decorators\nexport {\n All,\n Delete,\n Get,\n Head,\n Options,\n Patch,\n Post,\n Put,\n} from './decorators/routes.js';\n\n// Parameter Decorators\nexport { Body, Ctx, Header, Param, Query, Req, Res, createCustomParamDecorator } from './binding/params.js';\n\n// Guard Decorators\nexport { UseGuard, getAllGuards, getClassGuards, getMethodGuards } from './guards/guards.js';\n\n// Exception Filter Decorators\nexport {\n Catch,\n UseFilter,\n getAllFilters,\n getCatchTypes,\n getClassFilters,\n getMethodFilters,\n} from './filters/filters.js';\n\n// Interceptor Decorators\nexport {\n UseInterceptor,\n getAllInterceptors,\n getClassInterceptors,\n getMethodInterceptors,\n} from './interceptors/interceptors.js';\n\n// Metadata Readers\nexport type { ControllerDefinition } from './metadata/metadata.js';\n\nexport {\n getAllParamMetadata,\n getControllerDefinition,\n getControllerMetadata,\n getHttpCode,\n getParamMetadata,\n getRedirectMetadata,\n getResponseHeaders,\n getRouteMetadata,\n isController,\n} from './metadata/metadata.js';\n\n// Internal reflection helpers (for DI use)\nexport { getConstructorParamTypes } from './reflection/reflection.js';\n\n// ============================================\n// CONTROLLERS: Auto-discovery & Registration\n// ============================================\n\n// Registration\nexport { registerControllers } from './registrar/registrar.js';\n\n// Module registration\nexport { registerModule, type ModuleRegistrationOptions } from './modules/module-registrar.js';\nexport { collectModuleControllers, collectModuleGraph } from './modules/module-graph.js';\n\n// Discovery\nexport {\n discoverControllers,\n getControllersFromResults,\n getErrorsFromResults\n} from './discovery/discovery.js';\n\n// Discovery Source (new)\nexport type { DiscoverySource } from './discovery/source.js';\nexport { FilesystemSource, MemorySource } from './discovery/source.js';\n\n// Bootstrap Graph IR (RFC-NEXTRUSH-CLASS-CONSOLIDATION P3.4)\nexport type { ApplicationGraph } from './bootstrap/graph.js';\n\n// Diagnostics (RFC-NEXTRUSH-CLASS-CONSOLIDATION P3.6)\nexport type {\n CircularDependency,\n DiagnosticsReport,\n DuplicateRoute,\n ProviderEntry,\n RouteEntry,\n TimingEntry,\n} from './diagnostics/index.js';\nexport { getClassDiagnostics } from './diagnostics/get-diagnostics.js';\n\n// Registry\nexport { ControllerRegistry } from './registrar/registry.js';\n\n// Builder\nexport { buildRoutes } from './registrar/builder.js';\n\n// Types\nexport type {\n BuiltRoute,\n ControllersOptions,\n DiscoveryOptions,\n DiscoveryResult,\n RegisteredController,\n ResolvedOptions\n} from './registrar/registrar-types.js';\n\n// Errors\nexport {\n ControllerError,\n ControllerResolutionError,\n DiscoveryError,\n GuardRejectionError,\n HttpError,\n MissingParameterError,\n NoRoutesError,\n NotAControllerError,\n NotAModuleError,\n ParameterInjectionError,\n RouteRegistrationError\n} from './errors.js';\n\n// ============================================\n// DI: Re-exports from @nextrush/di\n// ============================================\n\nexport {\n Repository,\n Service,\n container,\n createContainer,\n inject,\n type Container\n} from '@nextrush/di';\n","/**\n * @nextrush/decorators - Class Decorators\n *\n * Controller decorator that marks a class as an HTTP controller.\n * Makes the class injectable for DI via @nextrush/di abstraction.\n * Lifecycle management (singleton/transient) is deferred to the\n * controllers plugin registry, enabling proper test isolation.\n * Uses legacy decorators for compatibility with parameter decorators.\n */\n\nimport { markInjectable } from '@nextrush/di';\nimport { defineMetadata } from '../reflection/reflection.js';\nimport { normalizePath } from '../path-utils.js';\nimport type { ControllerMetadata, ControllerOptions } from '../types.js';\nimport { DECORATOR_METADATA_KEYS } from '../types.js';\n\n/**\n * Marks a class as an HTTP controller with DI support.\n *\n * This decorator:\n * 1. Registers the class as an HTTP controller with route metadata\n * 2. Makes the class injectable (resolvable by the DI container)\n *\n * Lifecycle is managed by the controllers plugin, not the decorator.\n * You do NOT need to add @Service() when using @Controller() - it's included!\n *\n * @param pathOrOptions - Base path string or controller options\n * @returns Class decorator\n *\n * @example\n * ```typescript\n * // Simple path - DI is automatic!\n * @Controller('/users')\n * class UserController {\n * constructor(private userService: UserService) {} // Auto-injected\n * }\n *\n * // With options\n * @Controller({ path: '/users', version: 'v1' })\n * class UserController { }\n *\n * // Default path (uses class name)\n * @Controller()\n * class UserController { } // → '/user'\n * ```\n */\nexport function Controller(pathOrOptions?: string | ControllerOptions): ClassDecorator {\n return function controllerDecorator<TFunction extends Function>(target: TFunction): TFunction {\n const options = normalizeControllerOptions(pathOrOptions, target.name);\n\n const metadata: ControllerMetadata = {\n path: options.path ?? '/',\n version: options.version,\n middleware: options.middleware,\n tags: options.tags,\n };\n\n // Store controller metadata\n defineMetadata(DECORATOR_METADATA_KEYS.CONTROLLER, metadata, target);\n\n // Make the class injectable (resolvable by DI container)\n // Lifecycle (singleton vs transient) is controlled by the container/registry,\n // NOT by the decorator — this enables test isolation with fresh instances\n markInjectable(target as unknown as new (...args: unknown[]) => unknown);\n\n return target;\n };\n}\n\n/**\n * Normalize controller options from string or object input.\n */\nfunction normalizeControllerOptions(\n input: string | ControllerOptions | undefined,\n className: string\n): ControllerOptions {\n if (typeof input === 'string') {\n return { path: normalizePath(input, { stripTrailingSlash: true }) };\n }\n\n if (input && typeof input === 'object') {\n return {\n ...input,\n path: input.path\n ? normalizePath(input.path, { stripTrailingSlash: true })\n : derivePathFromClassName(className),\n };\n }\n\n return { path: derivePathFromClassName(className) };\n}\n\n/**\n * Derive a path from class name by removing 'Controller' suffix and converting to kebab-case.\n *\n * @example\n * UserController → /user\n * UserProfileController → /user-profile\n * APIController → /api\n */\nfunction derivePathFromClassName(className: string): string {\n const baseName = className.replace(/Controller$/i, '');\n\n if (!baseName) {\n return '/';\n }\n\n const kebabCase = baseName\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')\n .toLowerCase();\n\n return `/${kebabCase}`;\n}\n","/**\n * @nextrush/decorators - Path normalization utilities\n *\n * Single source of truth for path normalization shared by the controller\n * decorator and the route decorators. These two historically diverged:\n * `@Controller` strips a trailing slash while route decorators (`@Get`, etc.)\n * do not. That divergence is intentional (a controller base path is a prefix,\n * a route path may legitimately end in `/`), so it is preserved behind an\n * explicit option rather than silently unified.\n */\n\n/**\n * Options controlling {@link normalizePath} behavior.\n */\nexport interface NormalizePathOptions {\n /**\n * Strip a single trailing slash for paths longer than `/`.\n * `@Controller` sets this; route decorators leave it off.\n */\n readonly stripTrailingSlash?: boolean;\n}\n\n/**\n * Normalize a path so it starts with exactly one leading slash.\n *\n * By default a trailing slash is preserved (route-decorator semantics). Pass\n * `{ stripTrailingSlash: true }` to also remove a trailing slash for paths\n * longer than `/` (controller semantics).\n */\nexport function normalizePath(path: string, options: NormalizePathOptions = {}): string {\n let normalized = path.trim();\n\n if (!normalized.startsWith('/')) {\n normalized = '/' + normalized;\n }\n\n if (options.stripTrailingSlash && normalized.length > 1 && normalized.endsWith('/')) {\n normalized = normalized.slice(0, -1);\n }\n\n return normalized;\n}\n","/**\n * @nextrush/decorators - Module Decorator\n *\n * `@Module` records a feature's composition — its imported modules, controllers,\n * providers, and exports — as reflect-metadata. It is a grouping/composition\n * unit; the `@nextrush/controllers` `registerModule` registrar reads this\n * metadata to wire the whole module graph in one call.\n *\n * This layer stores metadata only. Provider registration, route building, and\n * (future) encapsulation live in the controllers layer — see\n * RFC-NEXTRUSH-MODULES.\n */\n\nimport { markInjectable } from '@nextrush/di';\nimport { defineMetadata, getOwnMetadata, hasOwnMetadata } from '../reflection/reflection.js';\nimport { DECORATOR_METADATA_KEYS } from '../metadata/metadata-keys.js';\nimport type { ModuleMetadata, ModuleOptions } from './module-types.js';\n\n/**\n * Marks a class as a NextRush module.\n *\n * @param options - The module's imports, controllers, providers, and exports.\n * @returns Class decorator\n *\n * @example\n * ```typescript\n * @Module({\n * imports: [BillingModule],\n * controllers: [UserController],\n * providers: [UserService, { provide: 'CONFIG', useValue: cfg }],\n * exports: [UserService],\n * })\n * class UserModule {}\n * ```\n */\nexport function Module(options: ModuleOptions = {}): ClassDecorator {\n return function moduleDecorator<TFunction extends Function>(target: TFunction): TFunction {\n const metadata: ModuleMetadata = {\n imports: [...(options.imports ?? [])],\n controllers: [...(options.controllers ?? [])],\n providers: [...(options.providers ?? [])],\n exports: [...(options.exports ?? [])],\n };\n\n defineMetadata(DECORATOR_METADATA_KEYS.MODULE, metadata, target);\n\n // Mark injectable for symmetry with @Controller so a module class can itself\n // participate in DI graph walks without special-casing.\n markInjectable(target as unknown as new (...args: unknown[]) => unknown);\n\n return target;\n };\n}\n\n/**\n * Check if a class carries `@Module` metadata.\n */\nexport function isModule(target: Function): boolean {\n return hasOwnMetadata(DECORATOR_METADATA_KEYS.MODULE, target);\n}\n\n/**\n * Read a module's metadata. Returns a defensive copy (fresh arrays) so callers\n * cannot mutate the stored record. Returns `undefined` when `target` is not a\n * module.\n */\nexport function getModuleMetadata(target: Function): ModuleMetadata | undefined {\n const meta: ModuleMetadata | undefined = getOwnMetadata(\n DECORATOR_METADATA_KEYS.MODULE,\n target\n );\n\n if (!meta) {\n return undefined;\n }\n\n return {\n imports: [...meta.imports],\n controllers: [...meta.controllers],\n providers: [...meta.providers],\n exports: [...meta.exports],\n };\n}\n","/**\n * @nextrush/decorators - @HttpCode Decorator\n *\n * Sets the HTTP status code returned when a controller method resolves with a\n * value. Lives in its own module because `routes.ts` is already at the\n * file-size ceiling.\n */\n\nimport { getOwnMetadata, defineMetadata } from '../reflection/reflection.js';\nimport { DECORATOR_METADATA_KEYS } from '../types.js';\n\n/**\n * Set the HTTP status code for the response when the decorated method returns.\n *\n * Takes precedence over the route decorator's `statusCode` option (e.g.\n * `@Post('/x', { statusCode: 200 })`) when both are present. Does not affect\n * responses produced by a thrown `HttpError` (those keep the error's status)\n * or by `@Redirect` (the redirect status wins).\n *\n * @param statusCode - HTTP status code to apply (e.g. 201, 202, 204)\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Post()\n * @HttpCode(201)\n * create(@Body() data: CreateUserDto) {\n * return this.users.create(data); // → 201 Created\n * }\n * }\n * ```\n */\nexport function HttpCode(statusCode: number): MethodDecorator {\n return function httpCodeDecorator(\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const methodKey = String(propertyKey);\n\n const existing: Map<string, number> =\n getOwnMetadata(DECORATOR_METADATA_KEYS.HTTP_CODE, target.constructor) ?? new Map();\n\n existing.set(methodKey, statusCode);\n\n defineMetadata(DECORATOR_METADATA_KEYS.HTTP_CODE, existing, target.constructor);\n\n return descriptor;\n };\n}\n","/**\n * @nextrush/decorators - Response Decorators\n *\n * Method decorators that shape the HTTP response: @SetHeader attaches response\n * headers and @Redirect declares a redirect. Stored as reflect-metadata read by\n * the controllers handler builder.\n */\n\nimport { getOwnMetadata, defineMetadata } from '../reflection/reflection.js';\nimport type { RedirectMetadata, ResponseHeaderMetadata } from '../types.js';\nimport { DECORATOR_METADATA_KEYS } from '../types.js';\n\n/**\n * Set a response header on the decorated method.\n *\n * Multiple `@SetHeader()` decorators can be stacked on the same method.\n *\n * @param name - Header name (e.g., 'Cache-Control')\n * @param value - Header value (e.g., 'no-cache')\n *\n * @example\n * ```typescript\n * @Controller('/files')\n * class FileController {\n * @Get('/:id')\n * @SetHeader('Cache-Control', 'max-age=3600')\n * @SetHeader('X-Custom', 'value')\n * getFile(@Param('id') id: string) {\n * return { id };\n * }\n * }\n * ```\n */\nexport function SetHeader(name: string, value: string): MethodDecorator {\n return function setHeaderDecorator(\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const methodKey = String(propertyKey);\n\n const existing: Map<string, ResponseHeaderMetadata[]> =\n getOwnMetadata(DECORATOR_METADATA_KEYS.RESPONSE_HEADERS, target.constructor) ??\n new Map();\n\n const headers = existing.get(methodKey) ?? [];\n headers.push({ name, value });\n existing.set(methodKey, headers);\n\n defineMetadata(DECORATOR_METADATA_KEYS.RESPONSE_HEADERS, existing, target.constructor);\n\n return descriptor;\n };\n}\n\n/**\n * Redirect the response when the decorated method is called.\n *\n * If the method returns a string, it overrides the decorator's URL.\n * If the method returns an object with `url` and/or `statusCode`, those override as well.\n *\n * @param url - Default redirect URL\n * @param statusCode - HTTP status code (default: 302)\n *\n * @example\n * ```typescript\n * @Controller('/legacy')\n * class LegacyController {\n * @Get('/old-page')\n * @Redirect('/new-page', 301)\n * redirectOld() {\n * // Optional: return a string to override the URL\n * }\n *\n * @Get('/dynamic')\n * @Redirect('/fallback')\n * dynamicRedirect() {\n * // Return a string to redirect elsewhere\n * return '/actual-destination';\n * }\n * }\n * ```\n */\nexport function Redirect(url: string, statusCode = 302): MethodDecorator {\n return function redirectDecorator(\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const methodKey = String(propertyKey);\n\n const existing: Map<string, RedirectMetadata> =\n getOwnMetadata(DECORATOR_METADATA_KEYS.REDIRECT, target.constructor) ?? new Map();\n\n existing.set(methodKey, { url, statusCode });\n\n defineMetadata(DECORATOR_METADATA_KEYS.REDIRECT, existing, target.constructor);\n\n return descriptor;\n };\n}\n","/**\n * @nextrush/decorators - Route Decorators\n *\n * HTTP method decorators for controller methods.\n * Uses legacy decorators for compatibility with parameter decorators.\n */\n\nimport { getOwnMetadata, defineMetadata } from '../reflection/reflection.js';\nimport { normalizePath } from '../path-utils.js';\nimport type { ControllerRouteMetadata, RouteMethods, RouteOptions } from '../types.js';\nimport { DECORATOR_METADATA_KEYS } from '../types.js';\n\n/**\n * Create a route decorator for a specific HTTP method.\n */\nfunction createRouteDecorator(method: RouteMethods) {\n return function routeDecoratorFactory(\n pathOrOptions?: string | RouteOptions,\n options?: RouteOptions\n ): MethodDecorator {\n return function routeDecorator(\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const { path, routeOptions } = normalizeRouteInput(pathOrOptions, options);\n\n const metadata: ControllerRouteMetadata = {\n method,\n path,\n methodName: propertyKey,\n propertyKey,\n middleware: routeOptions?.middleware,\n statusCode: routeOptions?.statusCode,\n description: routeOptions?.description,\n deprecated: routeOptions?.deprecated,\n };\n\n const existingRoutes: ControllerRouteMetadata[] =\n getOwnMetadata(DECORATOR_METADATA_KEYS.ROUTES, target.constructor) ?? [];\n\n defineMetadata(\n DECORATOR_METADATA_KEYS.ROUTES,\n [...existingRoutes, metadata],\n target.constructor\n );\n\n return descriptor;\n };\n };\n}\n\n/**\n * Normalize route decorator input to path and options.\n */\nfunction normalizeRouteInput(\n pathOrOptions?: string | RouteOptions,\n options?: RouteOptions\n): { path: string; routeOptions?: RouteOptions } {\n if (typeof pathOrOptions === 'string') {\n return { path: normalizePath(pathOrOptions), routeOptions: options };\n }\n\n if (pathOrOptions && typeof pathOrOptions === 'object') {\n const path = pathOrOptions.path ? normalizePath(pathOrOptions.path) : '/';\n return { path, routeOptions: pathOrOptions };\n }\n\n return { path: '/', routeOptions: options };\n}\n\n/**\n * @Get decorator - Marks a method as handling HTTP GET requests.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Get()\n * findAll() { }\n *\n * @Get('/:id')\n * findOne(@Param('id') id: string) { }\n *\n * @Get('/search', { description: 'Search users' })\n * search(@Query('q') query: string) { }\n * }\n * ```\n */\nexport const Get = createRouteDecorator('GET');\n\n/**\n * @Post decorator - Marks a method as handling HTTP POST requests.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Post()\n * create(@Body() data: CreateUserDto) { }\n *\n * @Post('/bulk', { statusCode: 201 })\n * createMany(@Body() users: CreateUserDto[]) { }\n * }\n * ```\n */\nexport const Post = createRouteDecorator('POST');\n\n/**\n * @Put decorator - Marks a method as handling HTTP PUT requests.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Put('/:id')\n * update(@Param('id') id: string, @Body() data: UpdateUserDto) { }\n * }\n * ```\n */\nexport const Put = createRouteDecorator('PUT');\n\n/**\n * @Delete decorator - Marks a method as handling HTTP DELETE requests.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Delete('/:id')\n * remove(@Param('id') id: string) { }\n * }\n * ```\n */\nexport const Delete = createRouteDecorator('DELETE');\n\n/**\n * @Patch decorator - Marks a method as handling HTTP PATCH requests.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Patch('/:id')\n * partialUpdate(@Param('id') id: string, @Body() data: Partial<User>) { }\n * }\n * ```\n */\nexport const Patch = createRouteDecorator('PATCH');\n\n/**\n * @Head decorator - Marks a method as handling HTTP HEAD requests.\n *\n * @example\n * ```typescript\n * @Controller('/files')\n * class FileController {\n * @Head('/:id')\n * checkExists(@Param('id') id: string) { }\n * }\n * ```\n */\nexport const Head = createRouteDecorator('HEAD');\n\n/**\n * @Options decorator - Marks a method as handling HTTP OPTIONS requests.\n *\n * @example\n * ```typescript\n * @Controller('/api')\n * class ApiController {\n * @Options()\n * cors() { }\n * }\n * ```\n */\nexport const Options = createRouteDecorator('OPTIONS');\n\n/**\n * @All decorator - Marks a method as handling all HTTP methods.\n * Registers a single any-method route entry (T016) — matched by every\n * standard HTTP method via the router's own `Router.all()`/`GroupRouter.all()`\n * ANY-method registration, rather than one explicit RouteMetadata entry per\n * enumerated method. `getRoutes()`/route introspection sees one row for an\n * `@All()` route, consistent with how it was actually authored.\n *\n * @example\n * ```typescript\n * @Controller('/proxy')\n * class ProxyController {\n * @All('/*')\n * handle(@Ctx() ctx: Context) { }\n * }\n * ```\n */\nexport const All = createRouteDecorator('ALL');\n","/**\n * @nextrush/decorators - Parameter decorator factory helpers\n *\n * Shared machinery behind the standard parameter decorators: the source-specific\n * decorator factory, input normalization, and the read-append-write of parameter\n * metadata (all reflect-metadata access routed through reflection.ts). Extracted\n * from param-decorators.ts so that file stays focused on the decorator surface.\n */\n\nimport type { ParamMetadata, ParamSource, TransformFn } from '../types.js';\nimport { DECORATOR_METADATA_KEYS } from '../types.js';\nimport { defineMetadata, getOwnMetadata } from '../reflection/reflection.js';\n\n/**\n * Create a parameter decorator for a specific source.\n */\nexport function createParamDecorator<\n TOptions extends { transform?: TransformFn; required?: boolean; defaultValue?: unknown },\n>(source: ParamSource, defaultRequired: boolean) {\n return function paramDecoratorFactory(\n nameOrOptions?: string | TOptions,\n options?: TOptions\n ): ParameterDecorator {\n return function paramDecorator(\n target: object,\n propertyKey: string | symbol | undefined,\n parameterIndex: number\n ): void {\n if (propertyKey === undefined) {\n throw new Error(\n `Parameter decorator @${source.charAt(0).toUpperCase() + source.slice(1)} can only be used on method parameters, not constructor parameters.`\n );\n }\n\n const { name, paramOptions } = normalizeParamInput(nameOrOptions, options, source);\n\n const metadata: ParamMetadata = {\n source,\n index: parameterIndex,\n name,\n required: paramOptions?.required ?? defaultRequired,\n defaultValue: paramOptions?.defaultValue,\n transform: paramOptions?.transform,\n };\n\n pushParamMetadata(target, propertyKey, metadata);\n };\n };\n}\n\n/**\n * Normalize parameter decorator input.\n */\nfunction normalizeParamInput<TOptions>(\n nameOrOptions: string | TOptions | undefined,\n options: TOptions | undefined,\n source: ParamSource\n): { name?: string; paramOptions?: TOptions } {\n if (typeof nameOrOptions === 'string') {\n return { name: nameOrOptions, paramOptions: options };\n }\n\n if (nameOrOptions && typeof nameOrOptions === 'object') {\n return { paramOptions: nameOrOptions };\n }\n\n if (source === 'body' || source === 'ctx' || source === 'req' || source === 'res') {\n return { paramOptions: options };\n }\n\n return { paramOptions: options };\n}\n\n/**\n * Append parameter metadata for a method onto its controller class.\n *\n * Uses `getOwnMetadata` so a subclass never inherits a parent's parameter map.\n * Shared by every parameter decorator to avoid duplicating the read-append-write\n * dance against reflect-metadata.\n */\nexport function pushParamMetadata(\n target: object,\n propertyKey: string | symbol,\n metadata: ParamMetadata\n): void {\n const methodKey = `${String(propertyKey)}`;\n\n const existingParams: Map<string, ParamMetadata[]> =\n getOwnMetadata<Map<string, ParamMetadata[]>>(DECORATOR_METADATA_KEYS.PARAMS, target.constructor) ?? new Map();\n\n const methodParams = existingParams.get(methodKey) ?? [];\n methodParams.push(metadata);\n existingParams.set(methodKey, methodParams);\n\n defineMetadata(DECORATOR_METADATA_KEYS.PARAMS, existingParams, target.constructor);\n}\n","/**\n * @nextrush/decorators - Standard Parameter Decorators\n *\n * Parameter decorators for injecting request data into controller method parameters.\n * Uses legacy decorators (parameter decorators not supported in Stage 3).\n */\n\nimport type {\n BodyOptions,\n HeaderOptions,\n ParamMetadata,\n ParamOptions,\n QueryOptions,\n} from '../types.js';\nimport { createParamDecorator, pushParamMetadata } from './param-factory.js';\n\n/**\n * @Body decorator - Injects the request body into the parameter.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * // Inject entire body\n * @Post()\n * create(@Body() data: CreateUserDto) { }\n *\n * // Inject specific property from body\n * @Post('/email')\n * updateEmail(@Body('email') email: string) { }\n *\n * // With transform\n * @Post()\n * create(@Body({ transform: validateCreateUser }) data: CreateUserDto) { }\n * }\n * ```\n */\nexport const Body: {\n (): ParameterDecorator;\n (property: string): ParameterDecorator;\n (options: BodyOptions): ParameterDecorator;\n (property: string, options: BodyOptions): ParameterDecorator;\n} = createParamDecorator<BodyOptions>('body', true) as typeof Body;\n\n/**\n * @Param decorator - Injects route parameters into the parameter.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * // Inject all params\n * @Get('/:id')\n * findOne(@Param() params: { id: string }) { }\n *\n * // Inject specific param\n * @Get('/:id')\n * findOne(@Param('id') id: string) { }\n *\n * // With transform (e.g., parse to number)\n * @Get('/:id')\n * findOne(@Param('id', { transform: Number }) id: number) { }\n * }\n * ```\n */\nexport const Param: {\n (): ParameterDecorator;\n (name: string): ParameterDecorator;\n (options: ParamOptions): ParameterDecorator;\n (name: string, options: ParamOptions): ParameterDecorator;\n} = createParamDecorator<ParamOptions>('param', true) as typeof Param;\n\n/**\n * @Query decorator - Injects query parameters into the parameter.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * // Inject all query params\n * @Get()\n * findAll(@Query() query: { page?: number; limit?: number }) { }\n *\n * // Inject specific query param\n * @Get()\n * findAll(@Query('page') page: string) { }\n *\n * // With default value\n * @Get()\n * findAll(@Query('limit', { defaultValue: 10, transform: Number }) limit: number) { }\n * }\n * ```\n */\nexport const Query: {\n (): ParameterDecorator;\n (name: string): ParameterDecorator;\n (options: QueryOptions): ParameterDecorator;\n (name: string, options: QueryOptions): ParameterDecorator;\n} = createParamDecorator<QueryOptions>('query', false) as typeof Query;\n\n/**\n * @Header decorator - Injects request headers into the parameter.\n *\n * @example\n * ```typescript\n * @Controller('/api')\n * class ApiController {\n * // Inject all headers\n * @Get()\n * handle(@Header() headers: Record<string, string>) { }\n *\n * // Inject specific header\n * @Get()\n * handle(@Header('authorization') auth: string) { }\n *\n * // With default value\n * @Get()\n * handle(@Header('x-api-version', { defaultValue: 'v1' }) version: string) { }\n * }\n * ```\n */\nexport const Header: {\n (): ParameterDecorator;\n (name: string): ParameterDecorator;\n (options: HeaderOptions): ParameterDecorator;\n (name: string, options: HeaderOptions): ParameterDecorator;\n} = createParamDecorator<HeaderOptions>('header', false) as typeof Header;\n\n/**\n * @Ctx decorator - Injects the full NextRush Context object.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Get('/:id')\n * findOne(@Ctx() ctx: Context) {\n * const id = ctx.params.id;\n * ctx.json({ id });\n * }\n * }\n * ```\n */\nexport function Ctx(): ParameterDecorator {\n return function ctxDecorator(\n target: object,\n propertyKey: string | symbol | undefined,\n parameterIndex: number\n ): void {\n if (propertyKey === undefined) {\n throw new Error('@Ctx can only be used on method parameters, not constructor parameters.');\n }\n\n const metadata: ParamMetadata = {\n source: 'ctx',\n index: parameterIndex,\n required: false,\n };\n\n pushParamMetadata(target, propertyKey, metadata);\n };\n}\n\n/**\n * @Req decorator - Injects the raw request object (adapter-specific).\n *\n * @example\n * ```typescript\n * @Controller('/files')\n * class FileController {\n * @Post('/upload')\n * upload(@Req() req: IncomingMessage) {\n * // Access raw Node.js request for streaming\n * }\n * }\n * ```\n */\nexport function Req(): ParameterDecorator {\n return function reqDecorator(\n target: object,\n propertyKey: string | symbol | undefined,\n parameterIndex: number\n ): void {\n if (propertyKey === undefined) {\n throw new Error('@Req can only be used on method parameters, not constructor parameters.');\n }\n\n const metadata: ParamMetadata = {\n source: 'req',\n index: parameterIndex,\n required: false,\n };\n\n pushParamMetadata(target, propertyKey, metadata);\n };\n}\n\n/**\n * @Res decorator - Injects the raw response object (adapter-specific).\n *\n * @example\n * ```typescript\n * @Controller('/files')\n * class FileController {\n * @Get('/download/:id')\n * download(@Res() res: ServerResponse) {\n * // Access raw Node.js response for streaming\n * }\n * }\n * ```\n */\nexport function Res(): ParameterDecorator {\n return function resDecorator(\n target: object,\n propertyKey: string | symbol | undefined,\n parameterIndex: number\n ): void {\n if (propertyKey === undefined) {\n throw new Error('@Res can only be used on method parameters, not constructor parameters.');\n }\n\n const metadata: ParamMetadata = {\n source: 'res',\n index: parameterIndex,\n required: false,\n };\n\n pushParamMetadata(target, propertyKey, metadata);\n };\n}\n","/**\n * @nextrush/decorators - Custom Parameter Decorator Factory\n *\n * User-defined parameter extractors for custom injection patterns.\n */\n\nimport type {\n CustomParamExtractor,\n ParamMetadata,\n TransformFn,\n} from '../types.js';\nimport { DECORATOR_METADATA_KEYS } from '../types.js';\nimport { getOwnMetadata, defineMetadata } from '../reflection/reflection.js';\n\n/**\n * Append parameter metadata for a method onto its controller class.\n *\n * Uses `getOwnMetadata` so a subclass never inherits a parent's parameter map.\n * Shared by every parameter decorator to avoid duplicating the read-append-write\n * dance against reflect-metadata.\n */\nfunction pushParamMetadata(\n target: object,\n propertyKey: string | symbol,\n metadata: ParamMetadata\n): void {\n const methodKey = `${String(propertyKey)}`;\n\n const existingParams: Map<string, ParamMetadata[]> =\n getOwnMetadata<Map<string, ParamMetadata[]>>(DECORATOR_METADATA_KEYS.PARAMS, target.constructor) ?? new Map();\n\n const methodParams = existingParams.get(methodKey) ?? [];\n methodParams.push(metadata);\n existingParams.set(methodKey, methodParams);\n\n defineMetadata(DECORATOR_METADATA_KEYS.PARAMS, existingParams, target.constructor);\n}\n\n/**\n * Create a custom parameter decorator with a user-defined extraction function.\n *\n * The extractor receives the request context and returns the value to inject\n * into the handler parameter. Supports both sync and async extractors.\n *\n * @param extractor - Function that extracts the parameter value from context\n * @param options - Optional transform and required settings\n *\n * @example\n * ```typescript\n * // Extract the authenticated user from state\n * const CurrentUser = createCustomParamDecorator(\n * (ctx) => ctx.state.user\n * );\n *\n * // Extract a specific cookie\n * const Cookie = (name: string) => createCustomParamDecorator(\n * (ctx) => ctx.get('cookie')?.split(';')\n * .find(c => c.trim().startsWith(name + '='))\n * ?.split('=')[1]\n * );\n *\n * @Controller('/users')\n * class UserController {\n * @Get('/me')\n * getProfile(@CurrentUser user: User) {\n * return user;\n * }\n * }\n * ```\n */\nexport function createCustomParamDecorator(\n extractor: CustomParamExtractor,\n options?: { transform?: TransformFn; required?: boolean }\n): ParameterDecorator {\n return function customParamDecorator(\n target: object,\n propertyKey: string | symbol | undefined,\n parameterIndex: number\n ): void {\n if (propertyKey === undefined) {\n throw new Error(\n 'Custom parameter decorator can only be used on method parameters, not constructor parameters.'\n );\n }\n\n const metadata: ParamMetadata = {\n source: 'custom',\n index: parameterIndex,\n required: options?.required ?? false,\n transform: options?.transform,\n customExtractor: extractor,\n };\n\n pushParamMetadata(target, propertyKey, metadata);\n };\n}\n","/**\n * @nextrush/decorators - Guard Decorators\n *\n * Guards are functions or classes that determine if a request should be handled.\n * They run BEFORE the route handler and can prevent execution.\n *\n * Use guards for:\n * - Authentication checks\n * - Authorization/permission checks\n * - Rate limiting\n * - Feature flags\n */\n\nimport { getMetadata, defineMetadata } from '../reflection/reflection.js';\nimport type { Guard, GuardMetadata } from '../types.js';\nimport { DECORATOR_METADATA_KEYS, isGuardClass } from '../types.js';\n\n/**\n * Apply guards to a controller or route.\n *\n * Guards run in order and must all pass for the request to proceed.\n * If any guard returns false or throws, the request is rejected.\n *\n * Supports both function-based and class-based guards:\n * - Function guards: Simple functions that receive GuardContext\n * - Class guards: Classes implementing CanActivate interface (resolved from DI)\n *\n * @param guards - Guard functions or classes to apply\n *\n * @example Controller-level guard (applies to all routes)\n * ```typescript\n * @UseGuard(AuthGuard)\n * @Controller('/users')\n * class UserController {\n * @Get()\n * findAll() { } // Protected by AuthGuard\n * }\n * ```\n *\n * @example Route-level guard (applies to specific route)\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Get()\n * findAll() { } // Public\n *\n * @UseGuard(AdminGuard)\n * @Delete('/:id')\n * remove(@Param('id') id: string) { } // Admin only\n * }\n * ```\n *\n * @example Multiple guards (all must pass)\n * ```typescript\n * @UseGuard(AuthGuard, RoleGuard('admin'), RateLimitGuard)\n * @Controller('/admin')\n * class AdminController { }\n * ```\n *\n * @example Function-based guard\n * ```typescript\n * const AuthGuard: GuardFn = async (ctx) => {\n * const token = ctx.get('authorization');\n * if (!token) return false; // Reject\n *\n * const user = await verifyToken(token);\n * ctx.state.user = user; // Attach user to context\n * return true; // Allow\n * };\n * ```\n *\n * @example Guard factory for dynamic configuration\n * ```typescript\n * const RoleGuard = (role: string): GuardFn => async (ctx) => {\n * return ctx.state.user?.role === role;\n * };\n * ```\n *\n * @example Class-based guard with DI\n * ```typescript\n * import { Service } from '@nextrush/di';\n * import type { CanActivate, GuardContext } from 'nextrush/class';\n *\n * @Service()\n * class AuthGuard implements CanActivate {\n * constructor(private authService: AuthService) {}\n *\n * async canActivate(ctx: GuardContext): Promise<boolean> {\n * const token = ctx.get('authorization');\n * if (!token) return false;\n *\n * const user = await this.authService.verify(token);\n * ctx.state.user = user;\n * return Boolean(user);\n * }\n * }\n *\n * // Usage - class guard is resolved from DI container\n * @UseGuard(AuthGuard)\n * @Controller('/protected')\n * class ProtectedController { }\n * ```\n */\nexport function UseGuard(...guards: Guard[]): ClassDecorator & MethodDecorator {\n return function guardDecorator(\n target: object | Function,\n propertyKey?: string | symbol,\n descriptor?: PropertyDescriptor\n ): void {\n if (propertyKey !== undefined && descriptor !== undefined) {\n // Method decorator - store on method\n const existingGuards: GuardMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.GUARDS, target.constructor, propertyKey) ?? [];\n\n const metadata: GuardMetadata = {\n guards,\n target: 'method',\n methodName: propertyKey,\n };\n\n defineMetadata(\n DECORATOR_METADATA_KEYS.GUARDS,\n [...existingGuards, metadata],\n target.constructor,\n propertyKey\n );\n } else {\n // Class decorator - store on class\n const existingGuards: GuardMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.GUARDS, target) ?? [];\n\n const metadata: GuardMetadata = {\n guards,\n target: 'class',\n };\n\n defineMetadata(DECORATOR_METADATA_KEYS.GUARDS, [...existingGuards, metadata], target);\n }\n };\n}\n\n/**\n * Get all guards for a controller class.\n *\n * Guards are returned in bottom-to-top decorator application order,\n * matching TypeScript's native decorator execution semantics.\n *\n * @param target - Controller class\n * @returns Array of guards (functions or class constructors)\n */\nexport function getClassGuards(target: Function): Guard[] {\n const metadata: GuardMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.GUARDS, target) ?? [];\n return metadata.flatMap((m) => m.guards);\n}\n\n/**\n * Get guards for a specific method.\n *\n * Guards are returned in bottom-to-top decorator application order.\n *\n * @param target - Controller class\n * @param methodName - Method name\n * @returns Array of guards (functions or class constructors)\n */\nexport function getMethodGuards(target: Function, methodName: string | symbol): Guard[] {\n const metadata: GuardMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.GUARDS, target, methodName) ?? [];\n return metadata.flatMap((m) => m.guards);\n}\n\n/**\n * Get all guards for a route (class + method guards combined).\n *\n * Class guards run first, then method guards.\n *\n * @param target - Controller class\n * @param methodName - Method name\n * @returns Array of guards in execution order\n */\nexport function getAllGuards(target: Function, methodName: string | symbol): Guard[] {\n const classGuards = getClassGuards(target);\n const methodGuards = getMethodGuards(target, methodName);\n return [...classGuards, ...methodGuards];\n}\n\n// Re-export type guard for use by @nextrush/controllers' registrar\nexport { isGuardClass };\n","/**\n * @nextrush/decorators - Exception Filter Decorators\n *\n * Exception filters localize error handling to a controller or route. A filter\n * is a class implementing {@link ExceptionFilter}; it declares which errors it\n * handles with `@Catch(...)` and turns a thrown error into a response.\n *\n * Filters are opt-in and non-breaking: a controller/route with no `@UseFilter`\n * behaves exactly as before — errors propagate to the global error middleware.\n */\n\nimport { getMetadata, defineMetadata } from '../reflection/reflection.js';\nimport type { ExceptionFilterClass, FilterMetadata } from '../types.js';\nimport { DECORATOR_METADATA_KEYS } from '../types.js';\n\n/**\n * Declare which error constructors an exception filter handles.\n *\n * `@Catch(NotFoundError)` matches `NotFoundError` and its subclasses (via\n * `instanceof`). `@Catch()` with no arguments is a **catch-all** — it matches\n * any thrown value. A filter with no `@Catch` at all is also treated as\n * catch-all.\n *\n * @param errorTypes - Error constructors this filter handles (empty = catch-all)\n *\n * @example\n * ```typescript\n * @Catch(EntityNotFoundError)\n * class NotFoundFilter implements ExceptionFilter {\n * catch(error: unknown, ctx: Context) {\n * ctx.status = 404;\n * ctx.json({ error: 'Not found' });\n * }\n * }\n * ```\n */\nexport function Catch(...errorTypes: Function[]): ClassDecorator {\n return function catchDecorator(target: object): void {\n defineMetadata(DECORATOR_METADATA_KEYS.CATCH, errorTypes, target);\n };\n}\n\n/**\n * Apply exception filters to a controller or route.\n *\n * Works as both a class decorator (covers every route on the controller) and a\n * method decorator (covers that route only), mirroring {@link UseGuard}.\n * Method-level filters take precedence over class-level filters; within a\n * level, the first matching filter wins.\n *\n * @param filters - Exception filter classes to apply\n *\n * @example Controller-level (applies to all routes)\n * ```typescript\n * @UseFilter(DomainErrorFilter)\n * @Controller('/users')\n * class UserController {}\n * ```\n *\n * @example Method-level (higher precedence)\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @UseFilter(ConflictFilter)\n * @Post()\n * create() {}\n * }\n * ```\n */\nexport function UseFilter(...filters: ExceptionFilterClass[]): ClassDecorator & MethodDecorator {\n return function filterDecorator(\n target: object | Function,\n propertyKey?: string | symbol,\n descriptor?: PropertyDescriptor\n ): void {\n if (propertyKey !== undefined && descriptor !== undefined) {\n // Method decorator - store on method\n const existing: FilterMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.FILTERS, target.constructor, propertyKey) ?? [];\n\n const metadata: FilterMetadata = {\n filters,\n target: 'method',\n methodName: propertyKey,\n };\n\n defineMetadata(\n DECORATOR_METADATA_KEYS.FILTERS,\n [...existing, metadata],\n target.constructor,\n propertyKey\n );\n } else {\n // Class decorator - store on class\n const existing: FilterMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.FILTERS, target) ?? [];\n\n const metadata: FilterMetadata = {\n filters,\n target: 'class',\n };\n\n defineMetadata(DECORATOR_METADATA_KEYS.FILTERS, [...existing, metadata], target);\n }\n };\n}\n\n/**\n * Get the error constructors an exception filter handles.\n *\n * @param target - Filter class\n * @returns Error constructors from `@Catch` (empty array = catch-all)\n */\nexport function getCatchTypes(target: Function): Function[] {\n return getMetadata(DECORATOR_METADATA_KEYS.CATCH, target) ?? [];\n}\n\n/**\n * Get all class-level filters for a controller.\n *\n * @param target - Controller class\n * @returns Filter classes in decorator application order\n */\nexport function getClassFilters(target: Function): ExceptionFilterClass[] {\n const metadata: FilterMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.FILTERS, target) ?? [];\n return metadata.flatMap((m) => m.filters);\n}\n\n/**\n * Get method-level filters for a specific route.\n *\n * @param target - Controller class\n * @param methodName - Method name\n * @returns Filter classes in decorator application order\n */\nexport function getMethodFilters(\n target: Function,\n methodName: string | symbol\n): ExceptionFilterClass[] {\n const metadata: FilterMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.FILTERS, target, methodName) ?? [];\n return metadata.flatMap((m) => m.filters);\n}\n\n/**\n * Get all filters applicable to a route, in resolution/precedence order.\n *\n * Method-level filters come first (higher precedence), then class-level\n * filters. The controllers runtime walks this list and invokes the first\n * filter whose `@Catch` types match the thrown error.\n *\n * @param target - Controller class\n * @param methodName - Method name\n * @returns Filter classes: method filters first, then class filters\n */\nexport function getAllFilters(\n target: Function,\n methodName: string | symbol\n): ExceptionFilterClass[] {\n const methodFilters = getMethodFilters(target, methodName);\n const classFilters = getClassFilters(target);\n return [...methodFilters, ...classFilters];\n}\n","/**\n * @nextrush/decorators - Interceptor Decorators\n *\n * Interceptors wrap the controller-method call (onion / around advice). An\n * interceptor runs code before calling `next()`, awaits the downstream result,\n * and may transform or replace it before it flows into response handling.\n *\n * Interceptors are opt-in and non-breaking: a controller/route with no\n * `@UseInterceptor` behaves exactly as before — the method result flows\n * straight into response handling.\n *\n * Use interceptors for:\n * - Response shaping / envelope wrapping\n * - Timing, logging, and metrics around the handler\n * - Caching (short-circuit `next()` and return a cached value)\n * - Cross-cutting error mapping (try/catch around `next()`)\n */\n\nimport { getMetadata, defineMetadata } from '../reflection/reflection.js';\nimport type { InterceptorClass, InterceptorMetadata } from '../types.js';\nimport { DECORATOR_METADATA_KEYS } from '../types.js';\n\n/**\n * Apply interceptors to a controller or route.\n *\n * Works as both a class decorator (wraps every route on the controller) and a\n * method decorator (wraps that route only), mirroring {@link UseGuard}. Class\n * interceptors are the outermost layers of the onion; method interceptors are\n * inner, closest to the handler. Interceptor classes are resolved from the DI\n * container at request time.\n *\n * @param interceptors - Interceptor classes to apply\n *\n * @example Controller-level (wraps all routes)\n * ```typescript\n * @UseInterceptor(TimingInterceptor)\n * @Controller('/users')\n * class UserController {}\n * ```\n *\n * @example Method-level (inner layer, closest to the handler)\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @UseInterceptor(CacheInterceptor)\n * @Get()\n * findAll() {}\n * }\n * ```\n */\nexport function UseInterceptor(\n ...interceptors: InterceptorClass[]\n): ClassDecorator & MethodDecorator {\n return function interceptorDecorator(\n target: object | Function,\n propertyKey?: string | symbol,\n descriptor?: PropertyDescriptor\n ): void {\n if (propertyKey !== undefined && descriptor !== undefined) {\n // Method decorator - store on method\n const existing: InterceptorMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.INTERCEPTORS, target.constructor, propertyKey) ??\n [];\n\n const metadata: InterceptorMetadata = {\n interceptors,\n target: 'method',\n methodName: propertyKey,\n };\n\n defineMetadata(\n DECORATOR_METADATA_KEYS.INTERCEPTORS,\n [...existing, metadata],\n target.constructor,\n propertyKey\n );\n } else {\n // Class decorator - store on class\n const existing: InterceptorMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.INTERCEPTORS, target) ?? [];\n\n const metadata: InterceptorMetadata = {\n interceptors,\n target: 'class',\n };\n\n defineMetadata(\n DECORATOR_METADATA_KEYS.INTERCEPTORS,\n [...existing, metadata],\n target\n );\n }\n };\n}\n\n/**\n * Get all class-level interceptors for a controller.\n *\n * Interceptors are returned in bottom-to-top decorator application order,\n * matching TypeScript's native decorator execution semantics.\n *\n * @param target - Controller class\n * @returns Interceptor classes in decorator application order\n */\nexport function getClassInterceptors(target: Function): InterceptorClass[] {\n const metadata: InterceptorMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.INTERCEPTORS, target) ?? [];\n return metadata.flatMap((m) => m.interceptors);\n}\n\n/**\n * Get method-level interceptors for a specific route.\n *\n * @param target - Controller class\n * @param methodName - Method name\n * @returns Interceptor classes in decorator application order\n */\nexport function getMethodInterceptors(\n target: Function,\n methodName: string | symbol\n): InterceptorClass[] {\n const metadata: InterceptorMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.INTERCEPTORS, target, methodName) ?? [];\n return metadata.flatMap((m) => m.interceptors);\n}\n\n/**\n * Get all interceptors applicable to a route, in onion (outer-to-inner) order.\n *\n * Class interceptors come first (outermost layers), then method interceptors\n * (inner, closest to the handler). The controllers runtime builds the chain so\n * the first entry runs first and returns last.\n *\n * @param target - Controller class\n * @param methodName - Method name\n * @returns Interceptor classes: class interceptors first, then method\n */\nexport function getAllInterceptors(\n target: Function,\n methodName: string | symbol\n): InterceptorClass[] {\n const classInterceptors = getClassInterceptors(target);\n const methodInterceptors = getMethodInterceptors(target, methodName);\n return [...classInterceptors, ...methodInterceptors];\n}\n","/**\n * @nextrush/controllers - Controller registration\n *\n * `registerControllers(app, options)` is a **registrar**: it scans for\n * `@Controller` classes (or takes them explicitly), builds their routes, and\n * registers them on the app's router. It reads `app.router` and `app.container`\n * — no plugin lifecycle, no ignored app. Call it (awaited) before `serve()`.\n *\n * @example\n * ```typescript\n * const app = createApp();\n * await registerControllers(app, { root: './src', prefix: '/api' });\n * await serve(app, { port: 8080 });\n * ```\n */\n\nimport type { Application } from '@nextrush/core';\nimport { getAllGuards, isGuardClass } from '../guards/guards.js';\nimport { container as globalContainer, createContainer, DIError, type Container } from '@nextrush/di';\nimport {\n DEFAULT_EXCLUDE,\n DEFAULT_INCLUDE,\n} from '../discovery/discovery.js';\nimport { ControllerResolutionError } from '../errors.js';\nimport { bootstrapPipeline } from '../internal.js';\nimport type { BootstrapContext } from '../internal.js';\nimport type { DiscoverySource } from '../discovery/source.js';\nimport { FilesystemSource, MemorySource } from '../discovery/source.js';\nimport type {\n ControllersOptions,\n RegisteredController,\n ResolvedOptions,\n} from './registrar-types.js';\n\n/** Debug logger that writes to stderr (never to stdout). */\nfunction debugLog(debug: boolean, message: string): void {\n if (debug) {\n process.stderr.write(`[Controllers] ${message}\\n`);\n }\n}\n\nfunction warnLog(message: string): void {\n process.stderr.write(`[Controllers] WARNING: ${message}\\n`);\n}\n\n/**\n * Assemble the entries passed to a router method: middleware first, then the\n * metadata marker (only when the route carries decorator docs), then the\n * handler — using the ROUTE_METADATA contribution protocol from `@nextrush/types`.\n */\nfunction resolveOptions(\n options: ControllersOptions,\n container: Container\n): ResolvedOptions {\n return {\n root: options.root ?? null,\n include: options.include ?? DEFAULT_INCLUDE,\n exclude: options.exclude ?? DEFAULT_EXCLUDE,\n controllers: options.controllers ?? [],\n container,\n middleware: options.middleware ?? [],\n debug: options.debug ?? false,\n prefix: options.prefix ?? '',\n strict: options.strict ?? false,\n validate: options.validate ?? true,\n isolate: options.isolate ?? false,\n diagnostics: options.diagnostics ?? false,\n };\n}\n\n/**\n * Eagerly resolve every registered controller once so unsatisfiable or circular\n * constructor dependencies fail at boot rather than as a 500 on the first\n * request. Mirrors the per-request resolution in `builder.ts`, surfacing the\n * same {@link ControllerResolutionError} for non-DI failures.\n *\n * Each successfully resolved singleton is stored in the shared `instanceCache`,\n * so the per-request handler reuses this instance instead of resolving the same\n * controller a second time on its first hit.\n *\n * When the underlying failure is a `@nextrush/di` error (a {@link DIError}\n * subclass such as `CircularDependencyError` or `DependencyResolutionError`), it\n * is rethrown as-is so its specific, actionable message surfaces at boot rather\n * than being buried in the `.cause` of a generic wrapper.\n */\nexport function validateControllers(\n registered: RegisteredController[],\n container: Container,\n instanceCache: Map<Function, unknown>\n): void {\n for (const controller of registered) {\n const token = controller.target as new (...args: unknown[]) => unknown;\n try {\n instanceCache.set(token, container.resolve(token));\n } catch (error) {\n if (error instanceof DIError) {\n throw error;\n }\n throw new ControllerResolutionError(\n controller.target.name,\n error instanceof Error ? error : undefined\n );\n }\n }\n}\n\n/**\n * Eagerly resolve every distinct class-based guard used by any registered route\n * once, so a guard with an unsatisfiable or circular dependency fails at boot\n * instead of surfacing as a 500 on the first request to a guarded route.\n *\n * Guards are resolved per-request in `builder.ts` via `container.resolve(guard)`,\n * so a class guard skipped by {@link validateControllers} (which only resolves\n * controller tokens) would otherwise fail late — the exact gap eager validation\n * exists to close. Function guards need no DI resolution and are skipped; each\n * class guard is resolved once (deduped) even when shared across routes.\n *\n * A `@nextrush/di` error (a {@link DIError} subclass such as\n * `CircularDependencyError` or `DependencyResolutionError`) is rethrown as-is so\n * its specific guidance surfaces at boot; any other failure is wrapped with a\n * guard-specific message.\n */\nexport function validateGuards(\n registered: RegisteredController[],\n container: Container\n): void {\n const resolved = new Set<Function>();\n\n for (const controller of registered) {\n for (const route of controller.definition.routes) {\n const guards = getAllGuards(controller.target, route.methodName);\n for (const guard of guards) {\n if (!isGuardClass(guard) || resolved.has(guard)) {\n continue;\n }\n resolved.add(guard);\n try {\n container.resolve(guard);\n } catch (error) {\n if (error instanceof DIError) {\n throw error;\n }\n const guardName = guard.name || 'AnonymousGuard';\n throw new Error(\n `Failed to resolve guard \"${guardName}\" from the DI container ` +\n `(used by controller \"${controller.target.name}\").\\n\\n` +\n `A class-based guard is resolved from DI on every request to a guarded ` +\n `route. Surfacing the failure here means an unresolvable or circular guard ` +\n `dependency fails at boot instead of as a 500 on the first request.\\n\\n` +\n `Ensure \"${guardName}\" and all of its constructor dependencies are registered ` +\n `in the DI container.`,\n { cause: error instanceof Error ? error : undefined }\n );\n }\n }\n }\n }\n}\n\n/**\n * Discover and register decorator-based controllers on an application.\n *\n * Reads `app.router` (required) and `app.container` (falls back to a custom\n * container in options, then the global container). Supports auto-discovery\n * (`root`) and/or explicit `controllers`.\n *\n * @param app - The application (must have a router — use `createApp()` from `nextrush`)\n * @param options - Discovery/registration options\n */\nexport async function registerControllers(\n app: Application,\n options: ControllersOptions = {}\n): Promise<void> {\n const router = app.router;\n if (!router) {\n throw new Error(\n 'registerControllers() requires an app with a router. Create the app with ' +\n '`createApp()` from `nextrush`, or pass `{ router }` to `createApp()`.'\n );\n }\n\n // Container ownership: an explicit `options.container` always wins (the caller\n // has taken ownership). Otherwise `isolate: true` gives this registration its\n // own fresh container so its service graph is isolated from other apps; the\n // default (non-isolate) path is unchanged — app.container, then the global one.\n const container: Container =\n options.container ??\n (options.isolate ? createContainer() : (app.container ?? globalContainer));\n const resolvedOpts = resolveOptions(options, container);\n\n // Determine the discovery source\n let source: DiscoverySource;\n if (options.source) {\n // Explicit source provided (programmatic/test use)\n source = options.source;\n } else if (resolvedOpts.root) {\n // Auto-discovery mode: use FilesystemSource\n source = new FilesystemSource(\n resolvedOpts.root,\n resolvedOpts.include,\n resolvedOpts.exclude,\n resolvedOpts.debug\n );\n } else {\n // Manual mode: wrap explicit controllers in MemorySource\n source = new MemorySource([...resolvedOpts.controllers]);\n }\n\n // Create bootstrap context\n const ctx: BootstrapContext = {\n app,\n router,\n container,\n resolvedOptions: resolvedOpts,\n source,\n discoveredClasses: [],\n controllerDefinitions: [],\n providerGraph: new Map(),\n requestScoped: new Set(),\n registryInstances: new Map(),\n builtRoutes: [],\n graph: null,\n lifecycleData: {\n controllerClasses: [],\n },\n timings: [],\n };\n\n // Run the bootstrap pipeline\n await bootstrapPipeline(ctx);\n\n if (ctx.discoveredClasses.length === 0) {\n warnLog('No controllers found. Check your root path or patterns.');\n return;\n }\n\n debugLog(resolvedOpts.debug, `Registered ${ctx.builtRoutes.length} routes`);\n}\n","/**\n * Discover stage: Runs the DiscoverySource to populate discoveredClasses.\n */\n\nimport type { BootstrapContext } from '../context.js';\n\nexport async function discoverStage(ctx: BootstrapContext): Promise<void> {\n ctx.discoveredClasses = await ctx.source.discover();\n}\n","/**\n * Metadata stage: Extract and validate controller metadata from discovered classes.\n */\n\nimport type { BootstrapContext } from '../context.js';\nimport { getControllerDefinition } from '../../metadata/metadata.js';\n\nexport function metadataStage(ctx: BootstrapContext): void {\n ctx.controllerDefinitions = ctx.discoveredClasses.map((cls) => {\n const def = getControllerDefinition(cls);\n if (!def) {\n throw new Error(\n `Controller class ${cls.name} has no metadata. Did you apply @Controller?`\n );\n }\n return def;\n });\n}\n","/**\n * @nextrush/controllers - Per-app DI isolation\n *\n * Re-registers the reachable `@Service`/`@Repository`/`@Config` graph of a set\n * of controllers into a specific container, so an app that opts into isolation\n * (`registerControllers(app, { isolate: true })`) owns its own service\n * singletons instead of sharing the process-global ones registered at import\n * time.\n *\n * Why re-register at all: a `createContainer()` child delegates any unregistered\n * token to the global container, so a service `@Service` put on the global root\n * would still resolve to the shared global singleton. Registering the class on\n * the child shadows that delegation, giving the child its own instance.\n */\n\nimport {\n getOptionalParams,\n getServiceScope,\n hasServiceMetadata,\n type Constructor,\n type Container,\n type Scope,\n type Token,\n} from '@nextrush/di';\nimport { getConstructorParamTypes, getOwnMetadata } from '../reflection/reflection.js';\n\n/**\n * tsyringe stores `@inject(token)` descriptors under this reflect-metadata key,\n * one entry per decorated constructor parameter index. This is the only source\n * of a controller's dependency classes when the toolchain does not emit\n * `design:paramtypes` (esbuild, tsx, swc without the metadata plugin) — implicit\n * constructor injection is invisible there, but explicit `@inject(Class)` is not.\n * `@nextrush/di`'s own `@Optional()` decorator reads and writes the same key.\n */\nconst TSYRINGE_INJECTION_TOKENS = 'injectionTokens';\n\n/**\n * A single `@inject` descriptor may be either the raw token or a\n * `{ token, multiple }` wrapper depending on the tsyringe version. Normalize.\n */\nfunction tokenOf(descriptor: unknown): unknown {\n if (descriptor !== null && typeof descriptor === 'object' && 'token' in descriptor) {\n return (descriptor as { token: unknown }).token;\n }\n return descriptor;\n}\n\n/**\n * Collect the constructor dependency **classes** of a target, unioning implicit\n * `design:paramtypes` (present in a full TypeScript build) with explicit\n * `@inject(...)` descriptors (present everywhere, including under esbuild).\n *\n * Only class (function) tokens are returned. String/symbol `@inject` tokens and\n * `@Optional()` parameters are intentionally excluded: the former carry no class\n * metadata to walk (the caller registers them), and the latter must be allowed\n * to resolve to `undefined` rather than forcing a registration.\n */\nexport function collectDependencyClasses(target: Function): Function[] {\n const paramTypes = getConstructorParamTypes(target);\n const injectionTokens =\n (getOwnMetadata<Record<number, unknown>>(TSYRINGE_INJECTION_TOKENS, target) as\n | Record<number, unknown>\n | undefined) ?? {};\n const optional = getOptionalParams(target);\n\n const indices = new Set<number>();\n for (let i = 0; i < paramTypes.length; i++) {\n indices.add(i);\n }\n for (const key of Object.keys(injectionTokens)) {\n indices.add(Number(key));\n }\n\n const deps: Function[] = [];\n for (const index of indices) {\n if (optional.has(index)) {\n continue;\n }\n const explicit = injectionTokens[index];\n const token = explicit !== undefined ? tokenOf(explicit) : paramTypes[index];\n if (typeof token === 'function') {\n deps.push(token);\n }\n }\n return deps;\n}\n\n/**\n * Walk the constructor dependency graph of `controllers` and return the distinct\n * `@Service`/`@Repository`/`@Config` classes reachable from it, in breadth-first\n * order (a controller's direct service deps first, then their transitive deps).\n *\n * The walk only traverses *through* service classes: a non-service dependency is\n * a leaf (its own deps are not followed), matching {@link registerServiceGraph}'s\n * original inline behavior. Callers that need dependency-first ordering (service\n * lifecycle hooks) reverse the returned list.\n */\nexport function collectServiceGraph(controllers: Function[]): Function[] {\n const visited = new Set<Function>();\n const result: Function[] = [];\n // FIFO queue with a moving head pointer — avoids repeated O(n) Array.shift().\n const queue: Function[] = [];\n for (const controller of controllers) {\n for (const dep of collectDependencyClasses(controller)) {\n queue.push(dep);\n }\n }\n\n for (let head = 0; head < queue.length; head++) {\n const dep = queue[head]!;\n if (visited.has(dep)) {\n continue;\n }\n visited.add(dep);\n\n if (!hasServiceMetadata(dep)) {\n continue;\n }\n\n result.push(dep);\n\n for (const sub of collectDependencyClasses(dep)) {\n queue.push(sub);\n }\n }\n return result;\n}\n\n/**\n * Transitively register every `@Service`/`@Repository`/`@Config` class reachable\n * from `controllers`' constructor dependency graph into `container`, each with\n * its **effective** scope (request bubbling applied) when `effectiveScopes` is\n * provided, otherwise its declared scope (`getServiceScope(dep) ?? 'singleton'`).\n *\n * Each class is registered at most once (the graph walk dedupes). A class already\n * registered on the container is left untouched, so a provider the caller\n * registered explicitly (e.g. a mock or a pre-bound instance) always wins.\n * Non-service classes and non-class tokens are skipped — they fall back to the\n * container's parent/global chain or must be registered by the caller.\n */\nexport function registerServiceGraph(\n controllers: Function[],\n container: Container,\n effectiveScopes?: Map<Function, Scope>\n): void {\n for (const dep of collectServiceGraph(controllers)) {\n const scope: Scope = effectiveScopes?.get(dep) ?? getServiceScope(dep) ?? 'singleton';\n const token = dep as Token;\n if (!container.isRegistered(token)) {\n container.register(token, { useClass: dep as Constructor }, { scope });\n }\n }\n}\n","/**\n * @nextrush/controllers - Request-scope bubbling\n *\n * Computes each reachable class's **effective** DI scope and binds\n * request-effective classes to the container's request (ContainerScoped)\n * lifecycle. See RFC-NEXTRUSH-REQUEST-SCOPE.\n *\n * Scope bubbling: a node is effectively `'request'` if its declared `di:scope`\n * is `'request'` OR any of its transitive dependency classes is effectively\n * `'request'`; otherwise it keeps its declared scope. Bubbling is mandatory —\n * a singleton controller depending on a request-scoped service would otherwise\n * cache one request's instances forever.\n */\n\nimport {\n getServiceScope,\n hasServiceMetadata,\n type Constructor,\n type Container,\n type Scope,\n type Token,\n} from '@nextrush/di';\nimport { collectDependencyClasses, collectServiceGraph, registerServiceGraph } from './isolation.js';\n\n/**\n * True when `cls` is effectively request-scoped: declared `'request'`, or it\n * transitively depends on a `@Service`/`@Repository`/`@Config` class that is.\n *\n * `visiting` guards against dependency cycles: a back-edge to an in-progress\n * node contributes `false` (that node resolves its own scope from its declared\n * value plus its other dependencies), so a cycle cannot spuriously flip a node\n * to request. Results are memoized in `cache`.\n */\nfunction isEffectivelyRequest(\n cls: Function,\n cache: Map<Function, boolean>,\n visiting: Set<Function>\n): boolean {\n const cached = cache.get(cls);\n if (cached !== undefined) {\n return cached;\n }\n if (visiting.has(cls)) {\n return false;\n }\n visiting.add(cls);\n\n let request = getServiceScope(cls) === 'request';\n if (!request) {\n for (const dep of collectDependencyClasses(cls)) {\n if (hasServiceMetadata(dep) && isEffectivelyRequest(dep, cache, visiting)) {\n request = true;\n break;\n }\n }\n }\n\n visiting.delete(cls);\n cache.set(cls, request);\n return request;\n}\n\n/**\n * Compute the effective scope of every class reachable from `controllers` —\n * the controllers themselves plus their transitive `@Service` graph. A\n * request-effective class maps to `'request'`; every other class keeps its\n * declared scope (`'singleton'` for undecorated controllers).\n */\nexport function computeEffectiveScopes(controllers: Function[]): Map<Function, Scope> {\n const requestCache = new Map<Function, boolean>();\n const scopes = new Map<Function, Scope>();\n\n const reachable = new Set<Function>(controllers);\n for (const service of collectServiceGraph(controllers)) {\n reachable.add(service);\n }\n\n for (const cls of reachable) {\n const request = isEffectivelyRequest(cls, requestCache, new Set());\n scopes.set(cls, request ? 'request' : getServiceScope(cls));\n }\n return scopes;\n}\n\n/** The set of classes whose effective scope is `'request'`. */\nexport function requestScopedClasses(scopes: Map<Function, Scope>): Set<Function> {\n const set = new Set<Function>();\n for (const [cls, scope] of scopes) {\n if (scope === 'request') {\n set.add(cls);\n }\n }\n return set;\n}\n\n/**\n * Register the request-effective **service** nodes with the container's request\n * (ContainerScoped) lifecycle.\n *\n * A request-effective service declared `singleton` is already registered as a\n * tsyringe singleton by its decorator at import time; we re-register it so the\n * request lifecycle wins (tsyringe returns the last registration on resolve).\n * Controllers are registered separately by the registry with their effective\n * scope, so they are skipped here.\n */\nexport function registerRequestScopedServices(\n container: Container,\n scopes: Map<Function, Scope>\n): void {\n for (const [cls, scope] of scopes) {\n if (scope !== 'request' || !hasServiceMetadata(cls)) {\n continue;\n }\n container.register(cls as Token, { useClass: cls as Constructor }, { scope: 'request' });\n }\n}\n\n/**\n * Compute effective scopes for `controllers`, bind request-effective classes to\n * the container's request lifecycle, and return the request-scoped class set.\n *\n * - **Isolated container**: register the whole reachable service graph with its\n * effective scope, so a per-app container owns its instances.\n * - **Shared container**: singleton/transient services keep their decorator-time\n * registration (zero behavior change); only request-effective services are\n * (re-)bound to the request (ContainerScoped) lifecycle.\n *\n * The returned set drives per-controller registration and the per-request-child\n * resolution decision in the route handler.\n */\nexport function bindRequestScopes(\n controllers: Function[],\n container: Container,\n isolate: boolean\n): Set<Function> {\n const scopes = computeEffectiveScopes(controllers);\n const requestScoped = requestScopedClasses(scopes);\n\n if (isolate) {\n registerServiceGraph(controllers, container, scopes);\n } else if (requestScoped.size > 0) {\n registerRequestScopedServices(container, scopes);\n }\n\n return requestScoped;\n}\n","/**\n * Provider Graph stage: Compute service dependencies and request-scope bubbling.\n */\n\nimport type { BootstrapContext } from '../context.js';\nimport { bindRequestScopes } from '../../request/scope.js';\nimport { collectDependencyClasses } from '../../request/isolation.js';\n\nexport async function providerGraphStage(ctx: BootstrapContext): Promise<void> {\n // Compute effective DI scopes (request-scope bubbling) and bind request-effective\n // classes to the container's request lifecycle.\n ctx.requestScoped = bindRequestScopes(\n ctx.discoveredClasses,\n ctx.resolvedOptions.container,\n ctx.resolvedOptions.isolate\n );\n\n // Populate the provider dependency graph (controller/service -> its constructor\n // dependency classes) so the frozen Application Graph carries real provider\n // data for diagnostics and introspection. Read once here, never at request time.\n const graph = new Map<Function, Function[]>();\n for (const cls of ctx.discoveredClasses) {\n graph.set(cls, collectDependencyClasses(cls));\n }\n ctx.providerGraph = graph;\n}\n","/**\n * Validation stage: Bootstrap async factories before DI resolution.\n * (Eager controller/guard validation happens in registrarStage after routes are built.)\n */\n\nimport type { BootstrapContext } from '../context.js';\n\nexport async function validationStage(ctx: BootstrapContext): Promise<void> {\n // Bootstrap async factory providers before controller resolution.\n await ctx.resolvedOptions.container.bootstrap();\n}\n","/**\n * @nextrush/controllers - Controller Registry\n *\n * Manages registration and tracking of controllers.\n */\n\nimport { getControllerDefinition, isController } from '../metadata/metadata.js';\nimport type { Container } from '@nextrush/di';\nimport type { Middleware } from '@nextrush/types';\nimport { buildRoutes } from './builder.js';\nimport { NoRoutesError, NotAControllerError } from '../errors.js';\nimport type { BuiltRoute, RegisteredController } from './registrar-types.js';\n\n/**\n * Registry for tracking and building controller routes\n */\nexport class ControllerRegistry {\n private readonly controllers: Map<Function, RegisteredController> = new Map();\n private readonly container: Container;\n private readonly globalPrefix: string;\n private readonly globalMiddleware: Middleware[];\n private readonly debug: boolean;\n\n /**\n * Classes whose effective DI scope is `'request'` (self or dependency graph\n * declares `scope: 'request'`). A request-scoped controller is registered with\n * the request lifecycle and resolved from a per-request child on every request\n * instead of being memoized. Empty by default (pure singleton/transient graph).\n */\n private readonly requestScopedClasses: ReadonlySet<Function>;\n\n /**\n * Shared controller-instance cache, keyed by controller class.\n *\n * Owned by the registry so a single resolved singleton is reused across the\n * boot-time eager validation (`validateControllers`) and the per-request\n * handlers built by {@link buildRoutes}. Without a shared cache, `validate: true`\n * resolves each controller twice: once at boot and again on the first request.\n *\n * A failed resolve is never stored, so resolution retries on each request until\n * it succeeds (see `createRouteHandler` in `builder.ts`).\n */\n private readonly instanceCache: Map<Function, unknown> = new Map();\n\n constructor(\n container: Container,\n globalPrefix: string,\n globalMiddleware: Middleware[],\n debug: boolean,\n requestScopedClasses: ReadonlySet<Function> = new Set()\n ) {\n this.container = container;\n this.globalPrefix = globalPrefix;\n this.globalMiddleware = globalMiddleware;\n this.debug = debug;\n this.requestScopedClasses = requestScopedClasses;\n }\n\n /**\n * Register a controller class\n */\n register(controllerClass: Function): RegisteredController {\n if (this.controllers.has(controllerClass)) {\n return this.controllers.get(controllerClass)!;\n }\n\n if (!isController(controllerClass)) {\n throw new NotAControllerError(controllerClass.name);\n }\n\n const definition = getControllerDefinition(controllerClass);\n\n if (!definition) {\n throw new NotAControllerError(controllerClass.name);\n }\n\n if (definition.routes.length === 0) {\n throw new NoRoutesError(controllerClass.name);\n }\n\n this.registerInContainer(controllerClass);\n\n const routes = buildRoutes(\n definition,\n this.container,\n this.globalPrefix,\n this.globalMiddleware,\n this.instanceCache,\n this.requestScopedClasses.has(controllerClass)\n );\n\n const registered: RegisteredController = {\n target: controllerClass,\n definition,\n routes,\n };\n\n this.controllers.set(controllerClass, registered);\n\n if (this.debug) {\n this.logRegistration(registered);\n }\n\n return registered;\n }\n\n /**\n * The shared controller-instance cache.\n *\n * Exposed so `registerControllers` can pre-seed it during eager validation\n * (`validate: true`), making the boot-time resolve and the per-request handler\n * share one singleton instead of resolving the same controller twice.\n */\n get instances(): Map<Function, unknown> {\n return this.instanceCache;\n }\n\n /**\n * Register multiple controllers\n */\n registerAll(controllers: Function[]): RegisteredController[] {\n return controllers.map((c) => this.register(c));\n }\n\n /**\n * Get all registered controllers\n */\n getAll(): RegisteredController[] {\n return Array.from(this.controllers.values());\n }\n\n /**\n * Get all built routes from all controllers\n */\n getAllRoutes(): BuiltRoute[] {\n const routes: BuiltRoute[] = [];\n\n for (const controller of this.controllers.values()) {\n routes.push(...controller.routes);\n }\n\n return routes;\n }\n\n /**\n * Get total route count\n */\n get routeCount(): number {\n let count = 0;\n\n for (const controller of this.controllers.values()) {\n count += controller.routes.length;\n }\n\n return count;\n }\n\n /**\n * Check if a controller is registered\n */\n has(controllerClass: Function): boolean {\n return this.controllers.has(controllerClass);\n }\n\n /**\n * Clear all registrations\n */\n clear(): void {\n this.controllers.clear();\n }\n\n /**\n * Register the controller in the DI container with its effective scope: a\n * request-effective controller (self or dependency graph declares\n * `scope: 'request'`) uses the request (ContainerScoped) lifecycle so a fresh\n * instance is built per request; every other controller stays a singleton.\n */\n private registerInContainer(controllerClass: Function): void {\n const token = controllerClass as new (...args: unknown[]) => unknown;\n\n if (!this.container.isRegistered(token)) {\n const scope = this.requestScopedClasses.has(controllerClass) ? 'request' : 'singleton';\n this.container.register(token, { useClass: token }, { scope });\n }\n }\n\n /**\n * Log controller registration details\n */\n private logRegistration(registered: RegisteredController): void {\n const { target, routes } = registered;\n\n process.stderr.write(`[Controllers] Registered: ${target.name}\\n`);\n\n for (const route of routes) {\n process.stderr.write(` ${route.method.padEnd(7)} ${route.path}\\n`);\n }\n }\n}\n","/**\n * @nextrush/controllers - Route Handler Factory\n *\n * Builds the per-route handler: runs guards, lazily resolves the controller\n * singleton, injects parameters, invokes the method, and applies response\n * metadata (@SetHeader headers, route status code, @Redirect).\n */\n\nimport type { ControllerRouteMetadata } from '../types.js';\nimport {\n getHttpCode,\n getParamMetadata,\n getRedirectMetadata,\n getResponseHeaders,\n} from '../metadata/metadata.js';\nimport { getAllFilters } from '../filters/filters.js';\nimport { getAllGuards } from '../guards/guards.js';\nimport { getAllInterceptors } from '../interceptors/interceptors.js';\nimport type { Container } from '@nextrush/di';\nimport type { Context, RouteHandler } from '@nextrush/types';\nimport { ControllerResolutionError } from '../errors.js';\nimport { wrapWithFilters } from '../filters/filter-runner.js';\nimport { executeGuards } from '../guards/guard-runner.js';\nimport { runInterceptors } from '../interceptors/interceptor-runner.js';\nimport { resolveParametersFromPlan } from '../binding/param-resolver.js';\n\n/** A controller-class token tsyringe can resolve. */\ntype ControllerToken = new (...args: unknown[]) => unknown;\n\n/**\n * Lazy-memoized singleton resolution (the default, zero new per-request cost).\n *\n * Resolves the controller on first use and caches it in the shared\n * `instanceCache`, so `validate: true`'s boot resolve and the first request\n * share one instance. A failed resolve is never cached — resolution retries on\n * each request until it succeeds.\n */\nfunction resolveMemoizedSingleton(\n controllerClass: Function,\n container: Container,\n instanceCache: Map<Function, unknown>\n): () => unknown {\n return () => {\n if (!instanceCache.has(controllerClass)) {\n try {\n instanceCache.set(controllerClass, container.resolve(controllerClass as ControllerToken));\n } catch (error) {\n throw new ControllerResolutionError(\n controllerClass.name,\n error instanceof Error ? error : undefined\n );\n }\n }\n return instanceCache.get(controllerClass);\n };\n}\n\n/**\n * Per-request-child resolution for effectively request-scoped controllers.\n *\n * A fresh child container is created on each request and the controller resolved\n * from it — request-scoped (ContainerScoped) dependencies are fresh per request\n * and shared within one, while singletons resolve from the parent and stay\n * shared. The instance is never memoized.\n */\nfunction resolveFromRequestChild(\n controllerClass: Function,\n container: Container\n): () => unknown {\n return () => {\n try {\n return container.createChild().resolve(controllerClass as ControllerToken);\n } catch (error) {\n throw new ControllerResolutionError(\n controllerClass.name,\n error instanceof Error ? error : undefined\n );\n }\n };\n}\n\n/**\n * Create a route handler that resolves the controller and injects parameters.\n *\n * @param instanceCache - Shared controller-instance cache. The controller\n * singleton is resolved once and stored here, so `validate: true`'s boot-time\n * resolve and the first request share one instance rather than resolving twice.\n * @param isRequestScoped - Whether this controller is effectively request-scoped\n * (itself or anything in its dependency graph declares `scope: 'request'`).\n * When true, a fresh per-request child container is created on each request and\n * the controller resolved from it (never memoized), so request-scoped instances\n * are fresh per request and shared within one. When false, the lazy-memoized\n * singleton path is kept — zero new per-request overhead.\n */\nexport function createRouteHandler(\n controllerClass: Function,\n route: ControllerRouteMetadata,\n container: Container,\n instanceCache: Map<Function, unknown>,\n isRequestScoped = false\n): RouteHandler {\n const methodName = String(route.methodName);\n const paramMetadata = getParamMetadata(controllerClass, methodName);\n const guards = getAllGuards(controllerClass, methodName);\n const filters = getAllFilters(controllerClass, methodName);\n const interceptors = getAllInterceptors(controllerClass, methodName);\n\n // Precompute sorted param injection plan at build time (not per-request)\n const sortedParams =\n paramMetadata.length > 0 ? [...paramMetadata].sort((a, b) => a.index - b.index) : [];\n\n const statusCode = route.statusCode;\n // @HttpCode overrides the route decorator's statusCode option when both are set.\n const httpCode = getHttpCode(controllerClass, methodName);\n const effectiveStatusCode = httpCode ?? statusCode;\n const responseHeaders = getResponseHeaders(controllerClass, methodName);\n const redirectMeta = getRedirectMetadata(controllerClass, methodName);\n\n // Choose the controller-resolution strategy once, at build time.\n const resolveControllerInstance = isRequestScoped\n ? resolveFromRequestChild(controllerClass, container)\n : resolveMemoizedSingleton(controllerClass, container, instanceCache);\n\n const execute: RouteHandler = async (ctx: Context): Promise<void> => {\n // Execute guards first (if any) — always per-request, never hoisted.\n if (guards.length > 0) {\n await executeGuards(guards, ctx, container, controllerClass.name, methodName);\n }\n\n const controllerInstance = resolveControllerInstance();\n const args = await resolveParametersFromPlan(\n ctx,\n sortedParams,\n controllerClass.name,\n methodName\n );\n\n const method = (controllerInstance as Record<string, unknown>)[methodName];\n\n if (typeof method !== 'function') {\n throw new Error(`Method \"${methodName}\" not found on controller \"${controllerClass.name}\"`);\n }\n\n // Invoke the method through the interceptor onion when interceptors are\n // declared; otherwise call it directly (no overhead for interceptor-free\n // routes). The (possibly transformed) result flows into response handling.\n const invokeMethod = (): Promise<unknown> =>\n Promise.resolve(method.apply(controllerInstance, args));\n const result =\n interceptors.length > 0\n ? await runInterceptors(interceptors, ctx, container, invokeMethod)\n : await invokeMethod();\n\n // Apply response headers from @SetHeader() metadata\n for (const header of responseHeaders) {\n ctx.set(header.name, header.value);\n }\n\n // Apply status code: @HttpCode takes precedence over the route statusCode.\n if (effectiveStatusCode !== undefined) {\n ctx.status = effectiveStatusCode;\n }\n\n // Handle @Redirect() metadata\n if (redirectMeta && !ctx.responded) {\n let redirectUrl = redirectMeta.url;\n let redirectStatus = redirectMeta.statusCode;\n\n // Method return value can override the redirect URL/status\n if (typeof result === 'string') {\n redirectUrl = result;\n } else if (result && typeof result === 'object' && 'url' in result) {\n const override = result as { url?: string; statusCode?: number };\n if (override.url) redirectUrl = override.url;\n if (override.statusCode) redirectStatus = override.statusCode;\n }\n\n ctx.status = redirectStatus;\n ctx.set('Location', redirectUrl);\n ctx.send('');\n return;\n }\n\n // Check if response has already been sent (adapter-agnostic)\n if (result !== undefined && !ctx.responded) {\n if (typeof result === 'object') {\n ctx.json(result);\n } else {\n ctx.send(String(result));\n }\n }\n };\n\n // Wrap with the exception-filter pipeline only when the route declares\n // filters — filter-free routes keep their original, unwrapped behavior so\n // errors propagate to the global error middleware exactly as before.\n return filters.length > 0 ? wrapWithFilters(execute, filters, container) : execute;\n}\n","/**\n * @nextrush/controllers - Exception Filter Runner\n *\n * Runs exception filters when a route handler body throws. Filters are matched\n * by their `@Catch` types (or catch-all), resolved from the DI container, and\n * the first matching filter handles the error by setting the response. If no\n * filter matches, the error is rethrown so the global error middleware handles\n * it — preserving current, filter-free behavior.\n */\n\nimport type { ExceptionFilter, ExceptionFilterClass } from './filter-types.js';\nimport { getCatchTypes } from './filters.js';\nimport type { Container } from '@nextrush/di';\nimport type { Context, Next, RouteHandler } from '@nextrush/types';\n\n/**\n * Whether a filter's `@Catch` types match a thrown error.\n *\n * Empty `catchTypes` (no-arg `@Catch()` or no `@Catch` metadata) is a\n * catch-all and matches any error.\n */\nfunction filterMatches(catchTypes: readonly Function[], error: unknown): boolean {\n if (catchTypes.length === 0) {\n return true;\n }\n return catchTypes.some(\n (type) => error instanceof (type as new (...args: unknown[]) => unknown)\n );\n}\n\n/**\n * Invoke the first applicable filter for a thrown error.\n *\n * Filters are walked in the precedence order supplied by the caller\n * (method-level first, then class-level). The first filter whose `@Catch`\n * types match is resolved from the DI container and its `catch(error, ctx)`\n * sets the response.\n *\n * @returns `true` if a filter handled the error; `false` if none matched (the\n * caller must rethrow so the global error middleware still runs).\n */\nexport async function applyFilters(\n filters: readonly ExceptionFilterClass[],\n error: unknown,\n ctx: Context,\n container: Container\n): Promise<boolean> {\n for (const filter of filters) {\n if (!filterMatches(getCatchTypes(filter), error)) {\n continue;\n }\n\n const instance = container.resolve(filter) as ExceptionFilter;\n await instance.catch(error, ctx);\n return true;\n }\n\n return false;\n}\n\n/**\n * Wrap a route handler so thrown errors flow through the exception filters.\n *\n * A matched filter handles the error (sets the response); an unmatched error is\n * rethrown unchanged. Only installed when a route has at least one filter, so\n * filter-free routes keep their original (unwrapped) behavior.\n */\nexport function wrapWithFilters(\n execute: RouteHandler,\n filters: readonly ExceptionFilterClass[],\n container: Container\n): RouteHandler {\n return async (ctx: Context, next: Next): Promise<void> => {\n try {\n await execute(ctx, next);\n } catch (error) {\n const handled = await applyFilters(filters, error, ctx, container);\n if (!handled) {\n throw error;\n }\n }\n };\n}\n","/**\n * @nextrush/controllers - Guard Runner\n *\n * Executes route guards (function-based and class-based) before the handler\n * runs. Class guards are resolved from the DI container.\n */\n\nimport type { CanActivate, Guard, GuardContext } from './guard-types.js';\nimport { isGuardClass } from './guards.js';\nimport type { Container } from '@nextrush/di';\nimport type { Context } from '@nextrush/types';\nimport { GuardRejectionError } from '../errors.js';\n\n/**\n * Execute guards and throw if any guard rejects.\n * Supports both function-based and class-based guards.\n * Class guards are resolved from the DI container.\n *\n * GuardContext snapshot contract:\n * - The {@link GuardContext} handed to each guard is a per-guard snapshot built\n * once here, before any guard runs.\n * - `state` is the **live** `ctx.state` reference (not a copy): guards read and\n * attach data through it (e.g. `ctx.state.user = ...`), and those mutations are\n * visible to later guards and to the handler. This is the supported channel for\n * a guard to pass data forward.\n * - `method`, `path`, `params`, `query`, `headers`, and `body` are captured **by\n * value** at guard time. Guards see the request as it was when guards began; a\n * guard cannot mutate the real request through these fields, and if middleware\n * mutated `ctx` after this snapshot the guard would not observe it. Guards run\n * before the handler, so this is not currently exploitable — but attach forward\n * state via `state`, never by mutating the snapshotted fields.\n *\n * Rejection semantics:\n * - A guard that returns `false` throws {@link GuardRejectionError} (403).\n * - A guard that *throws* propagates its error unchanged, so a guard can throw\n * `UnauthorizedError` (401) — or any other `HttpError` — and get the correct\n * status and message. Errors are never swallowed or downgraded to a generic\n * 403; a bug in a guard surfaces as its real error rather than a masked 403.\n */\nexport async function executeGuards(\n guards: Guard[],\n ctx: Context,\n container: Container,\n _controllerName: string,\n _methodName: string\n): Promise<void> {\n const guardContext: GuardContext = {\n method: ctx.method,\n path: ctx.path,\n params: ctx.params,\n query: ctx.query,\n headers: ctx.headers,\n body: ctx.body,\n state: ctx.state,\n get: (name: string) => ctx.get(name),\n };\n\n for (let i = 0; i < guards.length; i++) {\n const guard = guards[i]!;\n let guardName: string;\n let result: boolean;\n\n // A thrown guard error propagates unchanged (no try/catch conversion), so\n // typed HTTP errors keep their status/message/stack.\n if (isGuardClass(guard)) {\n // Class-based guard - resolve from DI container\n guardName = guard.name || `ClassGuard[${i}]`;\n const guardInstance = container.resolve(guard) as CanActivate;\n result = await guardInstance.canActivate(guardContext);\n } else {\n // Function-based guard\n guardName = guard.name || `Guard[${i}]`;\n result = await guard(guardContext);\n }\n\n if (!result) {\n throw new GuardRejectionError(guardName);\n }\n }\n}\n","/**\n * @nextrush/controllers - Interceptor Runner\n *\n * Builds and runs the interceptor onion around a controller-method call. Class\n * interceptors are the outermost layers, method interceptors are inner (closest\n * to the handler), and the innermost `next()` invokes the actual method and\n * returns its raw result. Each interceptor is resolved from the DI container.\n *\n * Interceptors may transform the result (their return value replaces it) and\n * may wrap `next()` in try/catch to observe or recover from handler errors. An\n * error an interceptor does not handle propagates out — so exception filters,\n * which wrap the whole handler, can still catch it.\n */\n\nimport type { Interceptor, InterceptorClass } from './interceptor-types.js';\nimport type { Container } from '@nextrush/di';\nimport type { Context } from '@nextrush/types';\n\n/**\n * Run the controller method wrapped in the interceptor onion.\n *\n * @param interceptors - Interceptor classes in outer-to-inner order (class\n * interceptors first, then method interceptors), as returned by\n * `getAllInterceptors`.\n * @param ctx - Request context passed to each interceptor.\n * @param container - DI container each interceptor is resolved from.\n * @param invokeMethod - Innermost call: invokes the controller method with its\n * resolved arguments and resolves to its raw return value.\n * @returns The (possibly transformed) result flowing into response handling.\n */\nexport async function runInterceptors(\n interceptors: readonly InterceptorClass[],\n ctx: Context,\n container: Container,\n invokeMethod: () => Promise<unknown>\n): Promise<unknown> {\n // Fold from the innermost layer outward: the last interceptor wraps the\n // method call, and each earlier interceptor wraps the layer built so far, so\n // interceptors[0] (a class interceptor) ends up outermost.\n let next = invokeMethod;\n\n for (let i = interceptors.length - 1; i >= 0; i--) {\n const interceptorClass = interceptors[i]!;\n const downstream = next;\n next = () => {\n const instance = container.resolve(interceptorClass) as Interceptor;\n return instance.intercept(ctx, downstream);\n };\n }\n\n return next();\n}\n","/**\n * @nextrush/controllers - Parameter Resolver\n *\n * Resolves controller-method arguments from the request context using a\n * precomputed, pre-sorted parameter injection plan. Supports async transforms\n * (zod, valibot, etc.) and async custom extractors.\n */\n\nimport type { ParamMetadata } from './param-types.js';\nimport type { Context } from '@nextrush/types';\nimport { MissingParameterError, ParameterInjectionError } from '../errors.js';\n\n/**\n * Resolve parameter values from a precomputed, pre-sorted injection plan.\n * Supports async transform functions for validation libraries (zod, valibot, etc.)\n */\nexport async function resolveParametersFromPlan(\n ctx: Context,\n sortedMetadata: ParamMetadata[],\n controllerName: string,\n methodName: string\n): Promise<unknown[]> {\n if (sortedMetadata.length === 0) {\n return [];\n }\n\n const maxIndex =\n sortedMetadata.length > 0 ? sortedMetadata[sortedMetadata.length - 1]!.index : -1;\n const args: unknown[] = new Array(maxIndex + 1).fill(undefined);\n\n for (const param of sortedMetadata) {\n try {\n // Await supports async custom extractors (createCustomParamDecorator)\n const value = await extractParameterValue(ctx, param);\n\n if (value === undefined) {\n if (param.required && param.defaultValue === undefined) {\n throw createMissingParameterError(\n controllerName,\n methodName,\n param.name ?? `index ${param.index}`,\n param.source\n );\n }\n args[param.index] = param.defaultValue;\n } else {\n // Support both sync and async transform functions\n args[param.index] = param.transform ? await param.transform(value) : value;\n }\n } catch (error) {\n if (error instanceof MissingParameterError) {\n throw error;\n }\n throw new ParameterInjectionError(\n controllerName,\n methodName,\n param.index,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n return args;\n}\n\n/**\n * Build the `MissingParameterError` thrown when a required parameter\n * resolves to nothing.\n *\n * `@Body()` is special-cased: resolving to `undefined` almost always means\n * no body-parser middleware (e.g. `json()` from `@nextrush/body-parser`) ran\n * before the route handler, not that the caller genuinely omitted a body.\n * The generic \"required parameter is missing\" message gives no signal\n * toward that root cause, so the body case gets an appended remediation\n * hint naming the likely fix. Other sources (`param`, `query`, `header`,\n * `custom`) keep the original message unchanged, and the error remains a\n * plain `MissingParameterError` — no subtype — since nothing in the\n * codebase discriminates on a more specific type and the existing\n * `code: 'MISSING_PARAMETER'` / `instanceof MissingParameterError` contract\n * stays stable for consumers.\n */\nfunction createMissingParameterError(\n controllerName: string,\n methodName: string,\n paramName: string,\n source: string\n): MissingParameterError {\n const messageOverride =\n source === 'body'\n ? `Required body parameter \"${paramName}\" is missing. No body was parsed for ` +\n 'this request — register a body-parser middleware before this route ' +\n \"(e.g. app.use(json()) from '@nextrush/body-parser').\"\n : undefined;\n\n return new MissingParameterError(controllerName, methodName, paramName, source, messageOverride);\n}\n\n/**\n * Extract parameter value from context based on source\n */\nexport function extractParameterValue(ctx: Context, param: ParamMetadata): unknown {\n switch (param.source) {\n case 'body':\n if (param.name) {\n return (ctx.body as Record<string, unknown>)?.[param.name];\n }\n return ctx.body;\n\n case 'param':\n if (param.name) {\n return ctx.params[param.name];\n }\n return ctx.params;\n\n case 'query':\n if (param.name) {\n return ctx.query[param.name];\n }\n return ctx.query;\n\n case 'header':\n if (param.name) {\n return ctx.get(param.name);\n }\n return ctx.headers;\n\n case 'ctx':\n return ctx;\n\n case 'req':\n return ctx.raw.req;\n\n case 'res':\n return ctx.raw.res;\n\n case 'custom':\n if (param.customExtractor) {\n return param.customExtractor(ctx);\n }\n return undefined;\n\n default:\n return undefined;\n }\n}\n","/**\n * @nextrush/controllers - Handler Builder\n *\n * Builds route handlers from controller methods with parameter injection.\n * Orchestrates path construction, middleware resolution, and route metadata,\n * delegating per-route handler creation to {@link createRouteHandler}.\n */\n\nimport type {\n ControllerMetadata,\n ControllerRouteMetadata,\n MiddlewareRef,\n} from '../types.js';\nimport type { ControllerDefinition } from '../metadata/metadata.js';\nimport type { Container } from '@nextrush/di';\nimport type { MetadataContribution, Middleware } from '@nextrush/types';\nimport { createRouteHandler } from '../runtime/handler.js';\nimport type { BuiltRoute } from './registrar-types.js';\n\n/**\n * Resolve middleware references to actual middleware functions.\n *\n * - Function refs are used directly\n * - String/symbol refs are resolved from the DI container\n */\nfunction resolveMiddlewareRefs(refs: MiddlewareRef[], container: Container): Middleware[] {\n return refs.map((ref) => {\n if (typeof ref === 'function') {\n return ref as Middleware;\n }\n\n // String or symbol — resolve from DI container\n const resolved = container.resolve<Middleware>(ref as string);\n\n if (typeof resolved !== 'function') {\n throw new Error(\n `Middleware token \"${String(ref)}\" resolved to a non-function value. ` +\n 'Ensure the registered provider returns a middleware function.'\n );\n }\n\n return resolved;\n });\n}\n\n/**\n * Build route handlers for a controller.\n *\n * @param instanceCache - Shared controller-instance cache (keyed by controller\n * class). Handlers read-or-populate it so a controller singleton is resolved\n * exactly once across boot-time validation and all requests. Defaults to a\n * fresh per-call map when omitted (standalone use), preserving lazy resolution.\n */\nexport function buildRoutes(\n definition: ControllerDefinition,\n container: Container,\n globalPrefix: string,\n globalMiddleware: Middleware[],\n instanceCache: Map<Function, unknown> = new Map(),\n isRequestScoped = false\n): BuiltRoute[] {\n const routes: BuiltRoute[] = [];\n const { target, controller, routes: routeMetadata } = definition;\n\n for (const route of routeMetadata) {\n const handler = createRouteHandler(target, route, container, instanceCache, isRequestScoped);\n const fullPath = buildFullRoutePath(\n globalPrefix,\n controller.path,\n route.path,\n controller.version\n );\n\n const combinedMiddleware: Middleware[] = [\n ...globalMiddleware,\n ...resolveMiddlewareRefs(controller.middleware ?? [], container),\n ...resolveMiddlewareRefs(route.middleware ?? [], container),\n ];\n\n routes.push({\n method: route.method,\n path: fullPath,\n handler,\n middleware: combinedMiddleware,\n controller: target,\n methodName: String(route.methodName),\n metadata: toRouteMetaContribution(controller, route),\n });\n }\n\n return routes;\n}\n\n/**\n * Map decorator documentation to a route metadata contribution.\n *\n * Pulls `description`/`deprecated` from the route decorator and `tags` from the\n * controller decorator. Returns `undefined` when the route carries no docs, so\n * undocumented routes stay metadata-free rather than gaining empty entries.\n */\nfunction toRouteMetaContribution(\n controller: ControllerMetadata,\n route: ControllerRouteMetadata\n): MetadataContribution | undefined {\n const contribution: {\n description?: string;\n deprecated?: boolean;\n tags?: string[];\n } = {};\n\n if (route.description) {\n contribution.description = route.description;\n }\n if (route.deprecated) {\n contribution.deprecated = true;\n }\n if (controller.tags && controller.tags.length > 0) {\n contribution.tags = [...controller.tags];\n }\n\n return Object.keys(contribution).length > 0 ? contribution : undefined;\n}\n\n/**\n * Build full route path with all prefixes\n */\nfunction buildFullRoutePath(\n globalPrefix: string,\n controllerPath: string,\n routePath: string,\n version?: string\n): string {\n const parts: string[] = [];\n\n if (globalPrefix && globalPrefix !== '/') {\n parts.push(globalPrefix.startsWith('/') ? globalPrefix : '/' + globalPrefix);\n }\n\n if (version) {\n parts.push('/' + version);\n }\n\n if (controllerPath && controllerPath !== '/') {\n parts.push(controllerPath.startsWith('/') ? controllerPath : '/' + controllerPath);\n }\n\n if (routePath && routePath !== '/') {\n parts.push(routePath.startsWith('/') ? routePath : '/' + routePath);\n }\n\n const fullPath = parts.join('') || '/';\n\n return fullPath.replace(/\\/+/g, '/');\n}\n","/**\n * Registrar stage: Build routes and register controllers in the DI container.\n * Also performs eager validation if enabled.\n */\n\nimport type { BootstrapContext } from '../context.js';\nimport { ControllerRegistry } from '../../registrar/registry.js';\nimport { validateControllers, validateGuards } from '../../registrar/registrar.js';\n\nexport function registrarStage(ctx: BootstrapContext): void {\n // Create the registry with resolved options and request-scoped set\n const registry = new ControllerRegistry(\n ctx.resolvedOptions.container,\n ctx.resolvedOptions.prefix,\n ctx.resolvedOptions.middleware,\n ctx.resolvedOptions.debug,\n ctx.requestScoped\n );\n\n // Register all controllers and build routes\n const registered = registry.registerAll(ctx.discoveredClasses);\n\n // Collect all built routes for the router stage\n ctx.builtRoutes = [];\n for (const regCtrl of registered) {\n ctx.builtRoutes.push(...regCtrl.routes);\n }\n\n // Store registry instances for lifecycle integration\n ctx.registryInstances = registry.instances;\n\n // Store controller classes for lifecycle bridge\n ctx.lifecycleData.controllerClasses = ctx.discoveredClasses;\n\n // Validate controllers and guards if enabled\n if (ctx.resolvedOptions.validate) {\n validateControllers(registered, ctx.resolvedOptions.container, registry.instances);\n validateGuards(registered, ctx.resolvedOptions.container);\n }\n}\n\n","/**\n * Router stage: Mount all built routes on the router.\n */\n\nimport type { BootstrapContext } from '../context.js';\nimport type { Router } from '@nextrush/core';\nimport { ROUTE_METADATA } from '@nextrush/types';\nimport { RouteRegistrationError } from '../../errors.js';\nimport type { BuiltRoute } from '../../registrar/registrar-types.js';\n\nexport function routerStage(ctx: BootstrapContext): void {\n const router = ctx.router;\n\n // Register from the frozen Application Graph (the source of truth once built);\n // fall back to the raw built routes defensively if the graph is not assembled.\n const routes = ctx.graph ? ctx.graph.routes : ctx.builtRoutes;\n\n for (const route of routes) {\n try {\n const method = route.method.toLowerCase() as keyof Router;\n\n if (typeof router[method] !== 'function') {\n throw new RouteRegistrationError(\n 'Unknown',\n route.method,\n route.path,\n `Router does not support HTTP method: ${route.method}`\n );\n }\n\n // Build middleware+handler array from route definition\n const entries = buildRouteEntries(route);\n\n (router[method] as (path: string, ...entries: unknown[]) => unknown)(\n route.path,\n ...entries\n );\n } catch (error) {\n throw new RouteRegistrationError(\n 'Unknown',\n route.method,\n route.path,\n error instanceof Error ? error.message : String(error),\n error instanceof Error ? error : undefined\n );\n }\n }\n}\n\n/**\n * Build middleware + handler array from a route definition.\n * Mirrors buildRouteEntries from registrar.ts.\n */\nfunction buildRouteEntries(route: BuiltRoute): unknown[] {\n const entries: unknown[] = [...route.middleware];\n if (route.metadata) {\n entries.push({ [ROUTE_METADATA]: route.metadata });\n }\n entries.push(route.handler);\n return entries;\n}\n","/**\n * @nextrush/controllers - Service lifecycle bridge\n *\n * Bridges duck-typed service lifecycle hooks (`OnInit`/`OnShutdown` from\n * `@nextrush/decorators`) into the application's Extension lifecycle without\n * touching `@nextrush/core`:\n *\n * - `onInit()` runs at `app.ready()` (when adapters boot the app, before serving)\n * - `onShutdown()` runs at `app.close()`, in the reverse of the `onInit` order\n *\n * Instances are collected by walking the controller + transitive\n * `@Service`/`@Repository`/`@Config` graph, resolving each from the active\n * container, and keeping the DISTINCT instances (deduped by identity) that\n * implement at least one hook. Ordering is a reverse-BFS approximation:\n * dependencies initialize before the controllers/services that depend on them,\n * and tear down in the opposite order. Services without hooks are untouched, and\n * no Extension is registered at all when no instance implements a hook.\n */\n\nimport type { Application } from '@nextrush/core';\nimport { isOnInit, isOnShutdown } from './lifecycle-types.js';\nimport type { Container, Token } from '@nextrush/di';\nimport { collectServiceGraph } from '../request/isolation.js';\n\n/**\n * Base name of the internal Extension registered to run lifecycle hooks. Each\n * `registerControllers` call that finds hooks registers a uniquely-suffixed\n * variant (see {@link registerLifecycleExtension}), because `app.extend()`\n * rejects duplicate names and the same app may register controllers more than\n * once.\n */\nexport const CONTROLLERS_LIFECYCLE_EXTENSION = 'nextrush:controllers-lifecycle';\n\n/** Monotonic per-call counter guaranteeing unique Extension names within a process. */\nlet lifecycleRegistrationCount = 0;\n\n/**\n * Return the distinct instances implementing `onInit` and/or `onShutdown`, in\n * dependency-first `onInit` order (dependencies before the classes that depend\n * on them — a reverse-BFS approximation).\n *\n * Services are resolved from `container` (singletons return the shared instance\n * requests use). Controllers are taken ONLY from `instanceCache` (populated by\n * the registrar's eager validation) — never force-resolved here, so disabling\n * validation keeps controller construction lazy. A controller that implements a\n * hook therefore participates only when validation is enabled (the default).\n *\n * Unresolvable service classes are skipped silently; genuine resolution failures\n * are surfaced separately by the registrar's eager controller/guard validation.\n */\nexport function collectLifecycleInstances(\n controllers: Function[],\n container: Container,\n instanceCache: Map<Function, unknown>\n): object[] {\n const seen = new Set<object>();\n const collected: object[] = [];\n\n const consider = (instance: unknown): void => {\n if (typeof instance !== 'object' || instance === null || seen.has(instance)) {\n return;\n }\n seen.add(instance);\n if (isOnInit(instance) || isOnShutdown(instance)) {\n collected.push(instance);\n }\n };\n\n // Dependencies first: reverse the BFS service graph (deepest deps lead).\n for (const service of [...collectServiceGraph(controllers)].reverse()) {\n try {\n consider(container.resolve(service as Token));\n } catch {\n continue;\n }\n }\n\n // Controllers last (they depend on the services above), using only the\n // already-resolved instance — never resolving a controller just for hooks.\n for (const controller of controllers) {\n consider(instanceCache.get(controller));\n }\n\n return collected;\n}\n\n/**\n * Register the internal lifecycle Extension on `app` when at least one collected\n * instance implements a hook. No-op when there are none (never adds a dead\n * Extension).\n *\n * @throws if the app is already booted (`ready()`) or running — configuration is\n * frozen and `app.extend()` would reject, so this fails fast with actionable\n * guidance to call `registerControllers` before `serve()`/`ready()`.\n */\nexport function registerLifecycleExtension(\n app: Application,\n controllers: Function[],\n container: Container,\n instanceCache: Map<Function, unknown>\n): void {\n const instances = collectLifecycleInstances(controllers, container, instanceCache);\n if (instances.length === 0) {\n return;\n }\n\n if (app.isReady || app.isRunning) {\n throw new Error(\n 'registerControllers() found services with lifecycle hooks (onInit/onShutdown), ' +\n 'but the app is already booted (ready()) or running, so its configuration is ' +\n 'frozen and the lifecycle Extension cannot be registered. Call ' +\n 'registerControllers() BEFORE serve()/listen()/ready().'\n );\n }\n\n app.extend({\n name: `${CONTROLLERS_LIFECYCLE_EXTENSION}#${++lifecycleRegistrationCount}`,\n async setup(): Promise<void> {\n for (const instance of instances) {\n if (isOnInit(instance)) {\n await instance.onInit();\n }\n }\n },\n async destroy(): Promise<void> {\n // Isolated, per-hook teardown (F-03 / RFC-022 D2): a throwing onShutdown()\n // must not strand every later service's teardown. Mirrors the app-level\n // Promise.allSettled isolation across extensions — this loop previously\n // had none, so one throw aborted every subsequent hook in reverse order.\n const errors: unknown[] = [];\n for (const instance of [...instances].reverse()) {\n if (isOnShutdown(instance)) {\n try {\n await instance.onShutdown();\n } catch (err) {\n errors.push(err);\n }\n }\n }\n if (errors.length > 0) {\n throw new AggregateError(\n errors,\n `${String(errors.length)} onShutdown() hook(s) failed`\n );\n }\n },\n });\n}\n","/**\n * @nextrush/controllers - ApplicationGraph IR (Immutable Intermediate Representation)\n *\n * RFC-NEXTRUSH-CLASS-CONSOLIDATION P3.4: Immutable IR that documents the\n * bootstrap read-once, freeze-then-execute pattern.\n *\n * CRITICAL PROPERTY: All metadata is read ONCE at bootstrap time via Reflect\n * and baked into the ApplicationGraph. The request-time handler execution path\n * performs ZERO Reflect metadata reads — metadata is captured in the handler\n * closure and precomputed data structures at build time.\n *\n * The graph captures per-controller:\n * - Route metadata (method/path/params/guards/filters/interceptors/httpCode/headers)\n * - Effective scope (singleton vs request-scoped) after dependency bubbling\n * - Middleware and provider graph nodes\n */\n\nimport type { BuiltRoute } from '../registrar/registrar-types.js';\n\n/**\n * Assemble the immutable {@link ApplicationGraph} from the boot artifacts and\n * deep-freeze it. Called once by the bootstrap pipeline after routes are built\n * and the request-scope set is known; the router stage then registers from the\n * frozen graph. Freezes the SHAPE (routes/providers/scopes), never live\n * controller instances — request-scoped controllers still instantiate per\n * request from the child-container path.\n */\nexport function buildApplicationGraph(\n routes: ReadonlyArray<BuiltRoute>,\n providers: ReadonlyMap<Function, ReadonlyArray<Function>>,\n requestScopedTokens: ReadonlySet<Function>\n): ApplicationGraph {\n return deepFreeze<ApplicationGraph>({\n routes: [...routes],\n providers,\n requestScopedTokens,\n });\n}\n\n/**\n * ApplicationGraph IR: The immutable plan built once at bootstrap by reading\n * Reflect metadata. Request-time execution reads ONLY from this graph.\n *\n * The graph is deep-frozen to enforce immutability and prevent accidental\n * mutations that would break the boot-once guarantee.\n *\n * Structure:\n * - routes: All BuiltRoute objects with precomputed handler closures\n * - providers: DI provider metadata for request-scope bubble detection\n * - requestScopedTokens: Set of provider tokens with request scope\n */\nexport interface ApplicationGraph {\n /** All built routes (precomputed at bootstrap, frozen) */\n readonly routes: ReadonlyArray<BuiltRoute>;\n\n /** Provider dependency map (Function → Function[]) */\n readonly providers: ReadonlyMap<Function, ReadonlyArray<Function>>;\n\n /** Tokens marked as request-scoped (require child container per request) */\n readonly requestScopedTokens: ReadonlySet<Function>;\n}\n\n/**\n * Deep freeze a value (recursively freeze objects, arrays, Maps, Sets).\n * Used to enforce immutability of the ApplicationGraph and prevent accidental\n * mutations after bootstrap completes.\n *\n * @internal\n */\nexport function deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n for (const item of obj) {\n deepFreeze(item);\n }\n return Object.freeze(obj) as T;\n }\n\n if (obj instanceof Map) {\n obj.forEach((value) => {\n deepFreeze(value);\n });\n return Object.freeze(obj) as T;\n }\n\n if (obj instanceof Set) {\n // Sets are frozen but values inside may not be — freeze them\n obj.forEach((value) => {\n deepFreeze(value);\n });\n return Object.freeze(obj) as T;\n }\n\n // Plain object\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n deepFreeze((obj as Record<string, unknown>)[key]);\n }\n }\n\n return Object.freeze(obj) as T;\n}\n","/**\n * collectDiagnostics: Pure function deriving DiagnosticsReport from ApplicationGraph IR\n *\n * Extracts route list, provider list, detects duplicate routes (same method+path),\n * detects circular dependencies via DFS, and includes bootstrap timings.\n *\n * Called by bootstrap/pipeline.ts when diagnostics: true.\n */\n\nimport type { ApplicationGraph } from '../bootstrap/graph.js';\nimport type {\n CircularDependency,\n DiagnosticsReport,\n DuplicateRoute,\n ProviderEntry,\n RouteEntry,\n TimingEntry,\n} from './types.js';\n\n/**\n * Collect diagnostics from the frozen ApplicationGraph IR.\n *\n * Pure function: takes graph and timings, derives report without side effects.\n * Reports extracted route list, provider graph, duplicate routes, circular\n * dependencies, and stage timings.\n *\n * @param graph Frozen ApplicationGraph from bootstrap\n * @param timings Array of timing entries (stage name + duration)\n * @returns DiagnosticsReport with all extracted metadata\n */\nexport function collectDiagnostics(\n graph: ApplicationGraph,\n timings: TimingEntry[]\n): DiagnosticsReport {\n // Extract routes: map BuiltRoute to RouteEntry\n const routes = graph.routes.map((route) => ({\n method: route.method,\n path: route.path,\n controller: route.controller,\n })) as RouteEntry[];\n\n // Extract providers: convert Map<Function, Function[]> to ProviderEntry[]\n const providers = Array.from(graph.providers.entries()).map(([token, deps]) => ({\n token,\n dependencies: [...deps],\n })) as ProviderEntry[];\n\n // Detect duplicate routes: same method+path more than once\n const routeMap = new Map<string, number>();\n for (const route of routes) {\n const key = `${route.method}:${route.path}`;\n routeMap.set(key, (routeMap.get(key) ?? 0) + 1);\n }\n\n const duplicateRoutes = Array.from(routeMap.entries())\n .filter(([_key, count]) => count > 1)\n .map(([key, count]) => {\n const [method, ...pathParts] = key.split(':');\n return {\n method,\n path: pathParts.join(':'),\n count,\n };\n }) as DuplicateRoute[];\n\n // Detect circular dependencies via DFS\n const circularDependencies = detectCircularDependencies(graph.providers);\n\n return {\n routes: Object.freeze(routes),\n providers: Object.freeze(providers),\n duplicateRoutes: Object.freeze(duplicateRoutes),\n circularDependencies: Object.freeze(circularDependencies),\n timings: Object.freeze(timings),\n };\n}\n\n/**\n * Detect circular dependencies in the provider graph using DFS.\n * Returns array of cycles found (each cycle is an array of tokens).\n *\n * @param providers Map from token to its dependencies\n * @returns Array of detected cycles\n */\nfunction detectCircularDependencies(\n providers: ReadonlyMap<Function | Symbol, ReadonlyArray<Function | Symbol>>\n): CircularDependency[] {\n const cycles: CircularDependency[] = [];\n const visited = new Set<Function | Symbol>();\n const recursionStack = new Set<Function | Symbol>();\n\n const visit = (token: Function | Symbol, path: (Function | Symbol)[]): void => {\n if (recursionStack.has(token)) {\n // Found a cycle: extract it from the path\n const cycleStart = path.indexOf(token);\n if (cycleStart !== -1) {\n const cycle = Object.freeze([...path.slice(cycleStart), token]) as ReadonlyArray<Function | Symbol>;\n cycles.push({ cycle });\n }\n return;\n }\n\n if (visited.has(token)) {\n return;\n }\n\n visited.add(token);\n recursionStack.add(token);\n\n const deps = providers.get(token) || [];\n for (const dep of deps) {\n visit(dep, [...path, token]);\n }\n\n recursionStack.delete(token);\n };\n\n // Start DFS from each unvisited provider\n for (const token of providers.keys()) {\n if (!visited.has(token)) {\n visit(token, []);\n }\n }\n\n return cycles;\n}\n","/**\n * Bootstrap pipeline: Orchestrate all stages in sequence.\n */\n\nimport type { BootstrapContext } from './context.js';\nimport { discoverStage } from './stages/discover.js';\nimport { metadataStage } from './stages/metadata.js';\nimport { providerGraphStage } from './stages/provider-graph.js';\nimport { validationStage } from './stages/validation.js';\nimport { registrarStage } from './stages/registrar.js';\nimport { routerStage } from './stages/router.js';\nimport { registerLifecycleExtension } from '../lifecycle/lifecycle.js';\nimport { buildApplicationGraph } from './graph.js';\nimport { collectDiagnostics } from '../diagnostics/collector.js';\nimport type { Application } from '@nextrush/core';\nimport type { DiagnosticsReport } from '../diagnostics/types.js';\n\n/**\n * Execute the bootstrap pipeline in sequence:\n *\n * 1. discover — Run DiscoverySource to populate discoveredClasses\n * 2. metadata — Extract controller metadata from each class\n * 3. providerGraph — Compute request-scope bubbling\n * 4. validation — Bootstrap DI factories and validate constraints\n * 5. registrar — Build routes and register in DI container\n * 6. router — Mount routes on the app's router\n * 7. lifecycle — Bridge service lifecycle hooks into app lifecycle\n */\nexport async function bootstrapPipeline(ctx: BootstrapContext): Promise<void> {\n const enableTiming = ctx.resolvedOptions.diagnostics ?? false;\n const now = enableTiming ? () => performance.now() : () => 0;\n let stageStart = now();\n\n // Discovery\n await discoverStage(ctx);\n if (enableTiming) {\n ctx.timings.push({ stage: 'discover', ms: performance.now() - stageStart });\n }\n\n if (ctx.discoveredClasses.length === 0) {\n return;\n }\n\n // Metadata extraction\n stageStart = now();\n metadataStage(ctx);\n if (enableTiming) {\n ctx.timings.push({ stage: 'metadata', ms: performance.now() - stageStart });\n }\n\n // Provider graph and request-scope bubbling\n stageStart = now();\n await providerGraphStage(ctx);\n if (enableTiming) {\n ctx.timings.push({ stage: 'providerGraph', ms: performance.now() - stageStart });\n }\n\n // DI validation\n stageStart = now();\n await validationStage(ctx);\n if (enableTiming) {\n ctx.timings.push({ stage: 'validation', ms: performance.now() - stageStart });\n }\n\n // Registry and route building\n stageStart = now();\n registrarStage(ctx);\n if (enableTiming) {\n ctx.timings.push({ stage: 'registrar', ms: performance.now() - stageStart });\n }\n\n // Assemble + deep-freeze the immutable Application Graph (IR) once. The router\n // stage below registers from this frozen graph; request-time execution reads\n // only baked route data (zero Reflect on the request path).\n stageStart = now();\n ctx.graph = buildApplicationGraph(ctx.builtRoutes, ctx.providerGraph, ctx.requestScoped);\n if (enableTiming) {\n ctx.timings.push({ stage: 'graph', ms: performance.now() - stageStart });\n }\n\n // Router registration (from the frozen graph)\n stageStart = now();\n routerStage(ctx);\n if (enableTiming) {\n ctx.timings.push({ stage: 'router', ms: performance.now() - stageStart });\n }\n\n // Lifecycle hook integration\n stageStart = now();\n registerLifecycleExtension(\n ctx.app,\n ctx.lifecycleData.controllerClasses,\n ctx.resolvedOptions.container,\n ctx.registryInstances\n );\n if (enableTiming) {\n ctx.timings.push({ stage: 'lifecycle', ms: performance.now() - stageStart });\n }\n\n // Collect diagnostics if enabled\n if (enableTiming && ctx.graph) {\n const report = collectDiagnostics(ctx.graph, ctx.timings);\n storeClassDiagnostics(ctx.app, report);\n }\n}\n\n// Module-level WeakMap to store diagnostics reports per app\nconst diagnosticsStore = new WeakMap<Application, DiagnosticsReport>();\n\n/** Store diagnostics report for later retrieval via getClassDiagnostics */\nfunction storeClassDiagnostics(app: Application, report: DiagnosticsReport): void {\n diagnosticsStore.set(app, report);\n}\n\n/** Retrieve stored diagnostics report, or undefined if diagnostics not enabled */\nexport function getClassDiagnosticsInternal(app: Application): DiagnosticsReport | undefined {\n return diagnosticsStore.get(app);\n}\n","/**\n * DiscoverySource: Abstraction for controller class discovery.\n *\n * Two implementations:\n * - FilesystemSource: Scans the filesystem for controller files (default)\n * - MemorySource: Uses an explicit list of controller classes (programmatic/test)\n */\n\n/**\n * Discovers controller classes. Called by the discover stage.\n */\nexport interface DiscoverySource {\n discover(): ClassRef[] | Promise<ClassRef[]>;\n}\n\n/**\n * A controller class reference. Always a constructor function.\n */\nexport type ClassRef = Function;\n\n/**\n * FilesystemSource: Wraps the existing filesystem discovery logic.\n *\n * Scans a directory tree for controller files matching include/exclude patterns,\n * imports them, and returns the discovered controller classes.\n */\nexport class FilesystemSource implements DiscoverySource {\n private _discoveryErrors: unknown[] = [];\n\n constructor(\n private root: string,\n private include: string[],\n private exclude: string[],\n private debug: boolean\n ) {}\n\n async discover(): Promise<ClassRef[]> {\n // Deferred import to avoid circular dependency — discovery.ts exports\n // the actual filesystem scanning logic.\n const { discoverControllers, getControllersFromResults, getErrorsFromResults } = await import(\n './discovery.js'\n );\n\n const results = await discoverControllers({\n root: this.root,\n include: this.include,\n exclude: this.exclude,\n debug: this.debug,\n });\n\n const controllers = getControllersFromResults(results);\n // Collected for the validation stage to surface; scan errors are not fatal here.\n this._discoveryErrors = getErrorsFromResults(results);\n\n return controllers;\n }\n\n /**\n * Access discovery errors, if any, after discover() completes.\n * @internal\n */\n getDiscoveryErrors(): unknown[] {\n return this._discoveryErrors;\n }\n}\n\n/**\n * MemorySource: Uses an explicit list of controller classes.\n *\n * For programmatic/test use cases where controller classes are already known\n * and no filesystem scan is needed.\n */\nexport class MemorySource implements DiscoverySource {\n constructor(private controllers: ClassRef[]) {}\n\n discover(): ClassRef[] {\n return this.controllers;\n }\n}\n","/**\n * @nextrush/controllers - Module graph traversal\n *\n * Walks a module's `imports` into a flat, ordered, deduplicated list. The walk\n * is post-order (imported feature modules before their importer), dedupes\n * diamond/duplicate imports, and guards import cycles. See RFC-NEXTRUSH-MODULES.\n */\n\nimport { getModuleMetadata, isModule } from './module.js';\nimport { NotAModuleError } from '../errors.js';\n\n/**\n * Collect the full module graph reachable from `root` via `imports`.\n *\n * - **Post-order**: an imported module appears before the module that imports\n * it, so a feature module's providers/controllers register before the root's.\n * - **Dedupe**: a module reached through multiple paths (diamond) or listed\n * twice is included exactly once (first-completed wins).\n * - **Cycle guard**: a back-edge to an in-progress module is skipped, so a\n * mutual import (`A imports B imports A`) terminates instead of recursing\n * forever.\n *\n * @throws {NotAModuleError} if `root` or any imported class lacks `@Module`.\n */\nexport function collectModuleGraph(root: Function): Function[] {\n const ordered: Function[] = [];\n const completed = new Set<Function>();\n const visiting = new Set<Function>();\n\n const visit = (mod: Function): void => {\n if (completed.has(mod)) {\n return;\n }\n if (visiting.has(mod)) {\n // Back-edge into an in-progress module — an import cycle. Skip to\n // terminate; the module is still added when its original visit completes.\n return;\n }\n if (!isModule(mod)) {\n throw new NotAModuleError(mod.name || 'AnonymousModule');\n }\n\n visiting.add(mod);\n\n const metadata = getModuleMetadata(mod);\n for (const imported of metadata?.imports ?? []) {\n visit(imported);\n }\n\n visiting.delete(mod);\n completed.add(mod);\n ordered.push(mod);\n };\n\n visit(root);\n return ordered;\n}\n\n/**\n * Collect every controller declared across an ordered module list, preserving\n * order and deduplicating a controller declared in more than one module.\n */\nexport function collectModuleControllers(modules: Function[]): Function[] {\n const controllers: Function[] = [];\n const seen = new Set<Function>();\n\n for (const mod of modules) {\n const metadata = getModuleMetadata(mod);\n for (const controller of metadata?.controllers ?? []) {\n if (!seen.has(controller)) {\n seen.add(controller);\n controllers.push(controller);\n }\n }\n }\n\n return controllers;\n}\n","/**\n * @nextrush/controllers - Module registrar\n *\n * `registerModule(app, RootModule, options?)` wires a whole `@Module` graph in\n * one call: it walks `imports`, registers every module's providers into the DI\n * container, then hands the flattened controller list to the existing\n * `registerControllers` pipeline (route building, eager validation, guard\n * validation, lifecycle-hook bridging, isolate/request-scope). It duplicates\n * none of that machinery. See RFC-NEXTRUSH-MODULES.\n *\n * @example\n * ```typescript\n * const app = createApp();\n * await registerModule(app, AppModule, { prefix: '/api' });\n * await serve(app, { port: 8080 });\n * ```\n */\n\nimport type { Application } from '@nextrush/core';\nimport {\n getModuleMetadata,\n} from './module.js';\nimport type {\n ModuleProvider,\n ModuleProviderConfig,\n} from './module-types.js';\nimport {\n container as globalContainer,\n createContainer,\n getServiceScope,\n hasServiceMetadata,\n type Constructor,\n type Container,\n} from '@nextrush/di';\nimport { collectModuleControllers, collectModuleGraph } from './module-graph.js';\nimport { registerControllers } from '../registrar/registrar.js';\nimport type { ControllersOptions } from '../registrar/registrar-types.js';\n\n/**\n * Options for {@link registerModule}. Mirrors the subset of\n * {@link ControllersOptions} that applies to module registration — module\n * composition replaces `root`/`controllers` discovery.\n */\nexport type ModuleRegistrationOptions = Pick<\n ControllersOptions,\n 'prefix' | 'middleware' | 'container' | 'isolate' | 'validate' | 'debug'\n>;\n\n/**\n * Register a module graph on an application.\n *\n * Selects the DI container once (an explicit `options.container` wins, else\n * `isolate` gets a fresh container, else `app.container` → the global\n * container), registers every module's providers into it, then registers all\n * controllers across the graph through {@link registerControllers}. The chosen\n * container is passed explicitly so it wins inside `registerControllers` even\n * under `isolate: true`, keeping providers and controllers on one container.\n *\n * @param app - The application (must have a router — use `createApp()`).\n * @param rootModule - The root `@Module` class.\n * @param options - Registration options (prefix, middleware, container, etc.).\n * @throws {NotAModuleError} if `rootModule` or any imported class is not a module.\n */\nexport async function registerModule(\n app: Application,\n rootModule: Function,\n options: ModuleRegistrationOptions = {}\n): Promise<void> {\n const container: Container =\n options.container ??\n (options.isolate ? createContainer() : (app.container ?? globalContainer));\n\n const modules = collectModuleGraph(rootModule);\n\n for (const mod of modules) {\n const metadata = getModuleMetadata(mod);\n for (const provider of metadata?.providers ?? []) {\n registerProvider(provider, container);\n }\n }\n\n const controllers = collectModuleControllers(modules);\n\n await registerControllers(app, { ...options, container, controllers });\n}\n\n/**\n * Register a single module provider into the container.\n *\n * A bare class is registered as `{ useClass }` with its declared `@Service`\n * scope (or `singleton` if undecorated), and only when not already registered.\n * A provider config is registered with the matching provider kind; value\n * providers ignore scope, class/factory providers default to `singleton`.\n */\nfunction registerProvider(provider: ModuleProvider, container: Container): void {\n if (typeof provider === 'function') {\n registerClassProvider(provider, container);\n return;\n }\n registerConfigProvider(provider, container);\n}\n\n/** Register a bare class provider with its declared `@Service` scope. */\nfunction registerClassProvider(target: Function, container: Container): void {\n const token = target as Constructor;\n if (container.isRegistered(token)) {\n return;\n }\n const scope = hasServiceMetadata(target) ? getServiceScope(target) : 'singleton';\n container.register(token, { useClass: token }, { scope: scope ?? 'singleton' });\n}\n\n/** Register a provider config (`useValue` / `useFactory` / `useClass`). */\nfunction registerConfigProvider(provider: ModuleProviderConfig, container: Container): void {\n const { provide, scope } = provider;\n\n if ('useValue' in provider) {\n container.register(provide, { useValue: provider.useValue });\n return;\n }\n\n if (provider.useFactory) {\n container.register(\n provide,\n { useFactory: provider.useFactory, inject: provider.inject },\n { scope: scope ?? 'singleton' }\n );\n return;\n }\n\n if (provider.useClass) {\n container.register(provide, { useClass: provider.useClass }, { scope: scope ?? 'singleton' });\n return;\n }\n\n throw new Error(\n `Invalid module provider for token \"${String(provide)}\": a provider config ` +\n `must set exactly one of \"useValue\", \"useFactory\", or \"useClass\".`\n );\n}\n","/**\n * Public API for retrieving diagnostics reports\n *\n * Wrapper over the internal WeakMap storage to provide a clean public interface.\n */\n\nimport type { Application } from '@nextrush/core';\nimport type { DiagnosticsReport } from './types.js';\nimport { getClassDiagnosticsInternal } from '../bootstrap/pipeline.js';\n\n/**\n * Retrieve the diagnostics report for an application.\n *\n * Returns undefined if diagnostics were not enabled during registration\n * (diagnostics: false or not specified in options).\n *\n * @param app The application instance\n * @returns Diagnostics report if enabled, undefined otherwise\n */\nexport function getClassDiagnostics(app: Application): DiagnosticsReport | undefined {\n return getClassDiagnosticsInternal(app) as DiagnosticsReport | undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/metadata/metadata-keys.ts","../src/lifecycle/lifecycle-types.ts","../src/types.ts","../src/reflection/reflection.ts","../src/metadata/metadata.ts","../src/errors.ts","../src/discovery/discovery.ts","../src/index.ts","../src/decorators/class.ts","../src/path-utils.ts","../src/modules/module.ts","../src/decorators/http-code.ts","../src/decorators/response-decorators.ts","../src/decorators/routes.ts","../src/binding/param-factory.ts","../src/binding/param-decorators.ts","../src/binding/custom-param.ts","../src/guards/guards.ts","../src/filters/filters.ts","../src/interceptors/interceptors.ts","../src/registrar/registrar.ts","../src/bootstrap/stages/discover.ts","../src/bootstrap/stages/metadata.ts","../src/request/isolation.ts","../src/request/scope.ts","../src/bootstrap/stages/provider-graph.ts","../src/bootstrap/stages/validation.ts","../src/registrar/registry.ts","../src/runtime/handler.ts","../src/filters/filter-runner.ts","../src/guards/guard-runner.ts","../src/interceptors/interceptor-runner.ts","../src/binding/param-resolver.ts","../src/registrar/builder.ts","../src/bootstrap/stages/registrar.ts","../src/bootstrap/stages/router.ts","../src/lifecycle/lifecycle.ts","../src/bootstrap/graph.ts","../src/diagnostics/collector.ts","../src/bootstrap/pipeline.ts","../src/discovery/source.ts","../src/modules/module-graph.ts","../src/modules/module-registrar.ts","../src/diagnostics/get-diagnostics.ts"],"names":["isValidHttpMethod","method","includes","isValidParamSource","source","isGuardClass","guard","proto","prototype","canActivate","DECORATOR_METADATA_KEYS","CONTROLLER","Symbol","for","MODULE","ROUTES","PARAMS","MIDDLEWARE","GUARDS","INTERCEPTORS","FILTERS","CATCH","RESPONSE_HEADERS","REDIRECT","HTTP_CODE","isOnInit","value","onInit","isOnShutdown","onShutdown","getConstructorParamTypes","target","DESIGN_PARAMTYPES","Reflect","getMetadata","key","propertyKey","undefined","getOwnMetadata","defineMetadata","hasOwnMetadata","isController","getOwnMetadataFromReflection","getControllerMetadata","meta","getRouteMetadata","routes","getParamMetadata","methodName","allParams","params","get","String","getAllParamMetadata","Map","copy","set","getControllerDefinition","controller","getResponseHeaders","map","getRedirectMetadata","getHttpCode","ControllerError","NotAControllerError","NoRoutesError","DiscoveryError","ControllerResolutionError","ParameterInjectionError","MissingParameterError","RouteRegistrationError","GuardRejectionError","NotAModuleError","InternalServerError","message","code","options","name","className","filePath","reason","cause","controllerName","BadRequestError","paramIndex","details","parameterIndex","paramName","messageOverride","parameter","path","ForbiddenError","guardName","matchesPattern","filename","patterns","some","pattern","regexStr","replace","regex","RegExp","test","shouldInclude","relativePath","includePatterns","excludePatterns","scanDirectory","dir","rootDir","files","entries","readdir","withFileTypes","entry","fullPath","join","slice","length","split","sep","isDirectory","startsWith","subFiles","push","isFile","ext","extname","endsWith","error","importControllers","debug","controllers","errors","fileUrl","pathToFileURL","href","module","exportName","Object","keys","exported","process","stderr","write","Error","discoverControllers","resolve","root","include","DEFAULT_INCLUDE","exclude","DEFAULT_EXCLUDE","results","Array","cursor","worker","index","workerCount","Math","min","IMPORT_CONCURRENCY","Promise","all","from","getControllersFromResults","result","getErrorsFromResults","normalizePath","normalized","trim","stripTrailingSlash","Controller","pathOrOptions","controllerDecorator","normalizeControllerOptions","metadata","version","middleware","tags","markInjectable","input","derivePathFromClassName","baseName","kebabCase","toLowerCase","Module","moduleDecorator","imports","providers","exports","isModule","getModuleMetadata","HttpCode","statusCode","httpCodeDecorator","descriptor","methodKey","existing","SetHeader","setHeaderDecorator","headers","Redirect","url","redirectDecorator","createRouteDecorator","routeDecoratorFactory","routeDecorator","routeOptions","normalizeRouteInput","description","deprecated","existingRoutes","Get","Post","Put","Delete","Patch","Head","Options","All","createParamDecorator","defaultRequired","paramDecoratorFactory","nameOrOptions","paramDecorator","charAt","toUpperCase","paramOptions","normalizeParamInput","required","defaultValue","transform","pushParamMetadata","existingParams","methodParams","Body","Param","Query","Header","Ctx","ctxDecorator","Req","reqDecorator","Res","resDecorator","createCustomParamDecorator","extractor","customParamDecorator","customExtractor","UseGuard","guards","guardDecorator","existingGuards","getClassGuards","flatMap","m","getMethodGuards","getAllGuards","classGuards","methodGuards","Catch","errorTypes","catchDecorator","UseFilter","filters","filterDecorator","getCatchTypes","getClassFilters","getMethodFilters","getAllFilters","methodFilters","classFilters","UseInterceptor","interceptors","interceptorDecorator","getClassInterceptors","getMethodInterceptors","getAllInterceptors","classInterceptors","methodInterceptors","discoverStage","ctx","discoveredClasses","discover","metadataStage","controllerDefinitions","cls","def","TSYRINGE_INJECTION_TOKENS","tokenOf","token","collectDependencyClasses","paramTypes","injectionTokens","optional","getOptionalParams","indices","Set","i","add","Number","deps","has","explicit","collectServiceGraph","visited","queue","dep","head","hasServiceMetadata","sub","registerServiceGraph","container","effectiveScopes","scope","getServiceScope","isRegistered","register","useClass","isEffectivelyRequest","cache","visiting","cached","request","delete","computeEffectiveScopes","requestCache","scopes","reachable","service","requestScopedClasses","registerRequestScopedServices","bindRequestScopes","isolate","requestScoped","size","providerGraphStage","resolvedOptions","graph","providerGraph","validationStage","bootstrap","filterMatches","catchTypes","type","applyFilters","filter","instance","catch","wrapWithFilters","execute","next","handled","executeGuards","_controllerName","_methodName","guardContext","query","body","state","guardInstance","runInterceptors","invokeMethod","interceptorClass","downstream","intercept","resolveParametersFromPlan","sortedMetadata","maxIndex","args","fill","param","extractParameterValue","createMissingParameterError","raw","req","res","resolveMemoizedSingleton","controllerClass","instanceCache","resolveFromRequestChild","createChild","createRouteHandler","route","isRequestScoped","paramMetadata","sortedParams","sort","a","b","httpCode","effectiveStatusCode","responseHeaders","redirectMeta","resolveControllerInstance","controllerInstance","apply","header","status","responded","redirectUrl","redirectStatus","override","send","json","resolveMiddlewareRefs","refs","ref","resolved","buildRoutes","definition","globalPrefix","globalMiddleware","routeMetadata","handler","buildFullRoutePath","combinedMiddleware","toRouteMetaContribution","contribution","controllerPath","routePath","parts","ControllerRegistry","registerInContainer","registered","logRegistration","instances","registerAll","c","getAll","values","getAllRoutes","routeCount","count","clear","padEnd","registrarStage","registry","prefix","builtRoutes","regCtrl","registryInstances","lifecycleData","controllerClasses","validate","validateControllers","validateGuards","routerStage","router","buildRouteEntries","ROUTE_METADATA","CONTROLLERS_LIFECYCLE_EXTENSION","lifecycleRegistrationCount","collectLifecycleInstances","seen","collected","consider","reverse","registerLifecycleExtension","app","isReady","isRunning","extend","setup","destroy","err","AggregateError","buildApplicationGraph","requestScopedTokens","deepFreeze","obj","isArray","item","freeze","forEach","hasOwnProperty","call","collectDiagnostics","timings","dependencies","routeMap","duplicateRoutes","_key","pathParts","circularDependencies","detectCircularDependencies","cycles","recursionStack","visit","cycleStart","indexOf","cycle","bootstrapPipeline","enableTiming","diagnostics","now","performance","stageStart","stage","ms","report","storeClassDiagnostics","diagnosticsStore","WeakMap","getClassDiagnosticsInternal","FilesystemSource","_discoveryErrors","getDiscoveryErrors","MemorySource","debugLog","warnLog","resolveOptions","strict","DIError","registerControllers","createContainer","globalContainer","resolvedOpts","collectModuleGraph","ordered","completed","mod","imported","collectModuleControllers","modules","registerModule","rootModule","provider","registerProvider","registerClassProvider","registerConfigProvider","provide","useValue","useFactory","inject","getClassDiagnostics"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AAkCO,SAASA,kBAAkBC,MAAAA,EAAc;AAC9C,EAAA,OAAO;AAAC,IAAA,KAAA;AAAO,IAAA,MAAA;AAAQ,IAAA,KAAA;AAAO,IAAA,QAAA;AAAU,IAAA,OAAA;AAAS,IAAA,MAAA;AAAQ,IAAA,SAAA;AAAW,IAAA;AAAOC,GAAAA,CAAAA,QAAAA,CAASD,MAAAA,CAAAA;AACtF;AAKO,SAASE,mBAAmBC,MAAAA,EAAc;AAC/C,EAAA,OAAO;AAAC,IAAA,MAAA;AAAQ,IAAA,OAAA;AAAS,IAAA,OAAA;AAAS,IAAA,QAAA;AAAU,IAAA,KAAA;AAAO,IAAA,KAAA;AAAO,IAAA,KAAA;AAAO,IAAA;AAAUF,GAAAA,CAAAA,QAAAA,CAASE,MAAAA,CAAAA;AACtF;AAQO,SAASC,aAAaC,KAAAA,EAAY;AAEvC,EAAA,IAAI,OAAOA,UAAU,UAAA,EAAY;AAC/B,IAAA,OAAO,KAAA;AACT,EAAA;AAIA,EAAA,MAAMC,QAAQD,KAAAA,CAAME,SAAAA;AACpB,EAAA,IAAI,CAACD,KAAAA,IAAS,OAAOA,KAAAA,KAAU,QAAA,EAAU;AACvC,IAAA,OAAO,KAAA;AACT,EAAA;AAGA,EAAA,OAAO,OAAOA,MAAME,WAAAA,KAAgB,UAAA;AACtC;AAlEA,IAeaC;AAfb,IAAA,kBAAA,GAAA,KAAA,CAAA;;AAeO,IAAMA,uBAAAA,GAA0B;MACrCC,UAAAA,kBAAYC,MAAAA,CAAOC,IAAI,qBAAA,CAAA;MACvBC,MAAAA,kBAAQF,MAAAA,CAAOC,IAAI,iBAAA,CAAA;MACnBE,MAAAA,kBAAQH,MAAAA,CAAOC,IAAI,iBAAA,CAAA;MACnBG,MAAAA,kBAAQJ,MAAAA,CAAOC,IAAI,iBAAA,CAAA;MACnBI,UAAAA,kBAAYL,MAAAA,CAAOC,IAAI,qBAAA,CAAA;MACvBK,MAAAA,kBAAQN,MAAAA,CAAOC,IAAI,iBAAA,CAAA;MACnBM,YAAAA,kBAAcP,MAAAA,CAAOC,IAAI,uBAAA,CAAA;MACzBO,OAAAA,kBAASR,MAAAA,CAAOC,IAAI,kBAAA,CAAA;MACpBQ,KAAAA,kBAAOT,MAAAA,CAAOC,IAAI,gBAAA,CAAA;MAClBS,gBAAAA,kBAAkBV,MAAAA,CAAOC,IAAI,2BAAA,CAAA;MAC7BU,QAAAA,kBAAUX,MAAAA,CAAOC,IAAI,mBAAA,CAAA;MACrBW,SAAAA,kBAAWZ,MAAAA,CAAOC,IAAI,oBAAA;AACxB,KAAA;AAMgBb,IAAAA,MAAAA,CAAAA,iBAAAA,EAAAA,mBAAAA,CAAAA;AAOAG,IAAAA,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA;AAUAE,IAAAA,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;;;;;ACwBT,SAASoB,SAASC,KAAAA,EAAc;AACrC,EAAA,OACE,OAAOA,KAAAA,KAAU,QAAA,IACjBA,UAAU,IAAA,IACV,OAAQA,MAA+BC,MAAAA,KAAW,UAAA;AAEtD;AAMO,SAASC,aAAaF,KAAAA,EAAc;AACzC,EAAA,OACE,OAAOA,KAAAA,KAAU,QAAA,IACjBA,UAAU,IAAA,IACV,OAAQA,MAAmCG,UAAAA,KAAe,UAAA;AAE9D;AA7FA,IAAA,oBAAA,GAAA,KAAA,CAAA;;AA2EgBJ,IAAAA,MAAAA,CAAAA,QAAAA,EAAAA,UAAAA,CAAAA;AAYAG,IAAAA,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;;;;;ACvFhB,IAAA,UAAA,GAAA,KAAA,CAAA;;AAoEA,IAAA,kBAAA,EAAA;;;;;ACnDO,SAASE,yBAAyBC,MAAAA,EAAgB;AACvD,EAAA,MAAMC,iBAAAA,GAAoB,mBAAA;AAC1B,EAAA,OAAQC,OAAAA,CAAQC,WAAAA,CAAYF,iBAAAA,EAAmBD,MAAAA,KAAqC,EAAA;AACtF;AAOO,SAASG,WAAAA,CACdC,GAAAA,EACAJ,MAAAA,EACAK,WAAAA,EAA6B;AAE7B,EAAA,IAAIA,gBAAgBC,MAAAA,EAAW;AAC7B,IAAA,OAAOJ,OAAAA,CAAQC,WAAAA,CAAYC,GAAAA,EAAKJ,MAAAA,EAAQK,WAAAA,CAAAA;AAC1C,EAAA;AACA,EAAA,OAAOH,OAAAA,CAAQC,WAAAA,CAAYC,GAAAA,EAAKJ,MAAAA,CAAAA;AAClC;AAMO,SAASO,cAAAA,CAAkBH,KAAsBJ,MAAAA,EAAc;AACpE,EAAA,OAAOE,OAAAA,CAAQK,cAAAA,CAAeH,GAAAA,EAAKJ,MAAAA,CAAAA;AACrC;AAOO,SAASQ,cAAAA,CACdJ,GAAAA,EACAT,KAAAA,EACAK,MAAAA,EACAK,WAAAA,EAA6B;AAE7B,EAAA,IAAIA,gBAAgBC,MAAAA,EAAW;AAC7BJ,IAAAA,OAAAA,CAAQM,cAAAA,CAAeJ,GAAAA,EAAKT,KAAAA,EAAOK,MAAAA,EAAQK,WAAAA,CAAAA;EAC7C,CAAA,MAAO;AACLH,IAAAA,OAAAA,CAAQM,cAAAA,CAAeJ,GAAAA,EAAKT,KAAAA,EAAOK,MAAAA,CAAAA;AACrC,EAAA;AACF;AAeO,SAASS,cAAAA,CAAeL,KAAsBJ,MAAAA,EAAc;AACjE,EAAA,OAAOE,OAAAA,CAAQO,cAAAA,CAAeL,GAAAA,EAAKJ,MAAAA,CAAAA;AACrC;AA/EA,IAAA,eAAA,GAAA,KAAA,CAAA;;AAiBgBD,IAAAA,MAAAA,CAAAA,wBAAAA,EAAAA,0BAAAA,CAAAA;AAUAI,IAAAA,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;AAeAI,IAAAA,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AASAC,IAAAA,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AA0BAC,IAAAA,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;;;;;AChDT,SAASC,aAAaV,MAAAA,EAAgB;AAC3C,EAAA,OACEW,cAAAA,CAAiDhC,uBAAAA,CAAwBC,UAAAA,EAAYoB,MAAAA,CAAAA,KAAYM,MAAAA;AAErG;AAeO,SAASM,sBAAsBZ,MAAAA,EAAgB;AACpD,EAAA,MAAMa,IAAAA,GAAOF,cAAAA,CAAiDhC,uBAAAA,CAAwBC,UAAAA,EAAYoB,MAAAA,CAAAA;AAClG,EAAA,OAAOa,IAAAA,GAAO;IAAE,GAAGA;GAAK,GAAIP,MAAAA;AAC9B;AAqBO,SAASQ,iBAAiBd,MAAAA,EAAgB;AAC/C,EAAA,MAAMe,MAAAA,GAASJ,cAAAA,CAAwDhC,uBAAAA,CAAwBK,MAAAA,EAAQgB,MAAAA,CAAAA;AACvG,EAAA,OAAOe,MAAAA,GAAS;AAAIA,IAAAA,GAAAA;MAAU,EAAA;AAChC;AAkBO,SAASC,gBAAAA,CAAiBhB,QAAkBiB,UAAAA,EAA2B;AAC5E,EAAA,MAAMC,SAAAA,GACJP,cAAAA,CAA2DhC,uBAAAA,CAAwBM,MAAAA,EAAQe,MAAAA,CAAAA;AAE7F,EAAA,MAAMmB,MAAAA,GAASD,SAAAA,EAAWE,GAAAA,CAAIC,MAAAA,CAAOJ,UAAAA,CAAAA,CAAAA;AACrC,EAAA,OAAOE,MAAAA,GAAS;AAAIA,IAAAA,GAAAA;MAAU,EAAA;AAChC;AAYO,SAASG,oBAAoBtB,MAAAA,EAAgB;AAClD,EAAA,MAAMmB,MAAAA,GAASR,cAAAA,CACbhC,uBAAAA,CAAwBM,MAAAA,EACxBe,MAAAA,CAAAA;AAEF,EAAA,IAAI,CAACmB,MAAAA,EAAQ,uBAAO,IAAII,GAAAA,EAAAA;AAExB,EAAA,MAAMC,IAAAA,uBAAWD,GAAAA,EAAAA;AACjB,EAAA,KAAA,MAAW,CAACnB,GAAAA,EAAKT,KAAAA,CAAAA,IAAUwB,MAAAA,EAAQ;AACjCK,IAAAA,IAAAA,CAAKC,IAAIrB,GAAAA,EAAK;AAAIT,MAAAA,GAAAA;AAAM,KAAA,CAAA;AAC1B,EAAA;AACA,EAAA,OAAO6B,IAAAA;AACT;AAgBO,SAASE,wBAAwB1B,MAAAA,EAAgB;AACtD,EAAA,MAAM2B,UAAAA,GAAaf,sBAAsBZ,MAAAA,CAAAA;AAEzC,EAAA,IAAI,CAAC2B,UAAAA,EAAY;AACf,IAAA,OAAOrB,MAAAA;AACT,EAAA;AAEA,EAAA,OAAO;AACLN,IAAAA,MAAAA;AACA2B,IAAAA,UAAAA;AACAZ,IAAAA,MAAAA,EAAQD,iBAAiBd,MAAAA,CAAAA;AACzBmB,IAAAA,MAAAA,EAAQG,oBAAoBtB,MAAAA;AAC9B,GAAA;AACF;AAyBO,SAAS4B,kBAAAA,CAAmB5B,QAAkBiB,UAAAA,EAAkB;AACrE,EAAA,MAAMY,GAAAA,GAAyDlB,cAAAA,CAE7DhC,uBAAAA,CAAwBY,gBAAAA,EAAkBS,MAAAA,CAAAA;AAC5C,EAAA,OAAO;OAAK6B,GAAAA,EAAKT,GAAAA,CAAIH,UAAAA,CAAAA,IAAe;;AACtC;AAQO,SAASa,mBAAAA,CACd9B,QACAiB,UAAAA,EAAkB;AAElB,EAAA,MAAMY,GAAAA,GAAiDlB,cAAAA,CAErDhC,uBAAAA,CAAwBa,QAAAA,EAAUQ,MAAAA,CAAAA;AACpC,EAAA,OAAO6B,GAAAA,EAAKT,IAAIH,UAAAA,CAAAA;AAClB;AAQO,SAASc,WAAAA,CAAY/B,QAAkBiB,UAAAA,EAAkB;AAC9D,EAAA,MAAMY,GAAAA,GAAuClB,cAAAA,CAC3ChC,uBAAAA,CAAwBc,SAAAA,EACxBO,MAAAA,CAAAA;AAEF,EAAA,OAAO6B,GAAAA,EAAKT,IAAIH,UAAAA,CAAAA;AAClB;AApNA,IAAA,aAAA,GAAA,KAAA,CAAA;;AAcA,IAAA,UAAA,EAAA;AACA,IAAA,eAAA,EAAA;AAcgBP,IAAAA,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;AAmBAE,IAAAA,MAAAA,CAAAA,qBAAAA,EAAAA,uBAAAA,CAAAA;AAwBAE,IAAAA,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;AAqBAE,IAAAA,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;AAkBAM,IAAAA,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AA4BAI,IAAAA,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;AAsCAE,IAAAA,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA;AAaAE,IAAAA,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AAgBAC,IAAAA,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;;;AC9MhB,IAsBaC,eAAAA,CAAAA,CAcAC,qBAoBAC,aAAAA,CAAAA,CAuBAC,cAAAA,CAAAA,CAuBAC,2BA4BAC,uBAAAA,CAAAA,CA4CAC,qBAAAA,CAAAA,CAoCAC,wBA6BAC,mBAAAA,CAAAA,CAkBAC;AAjQb,IAAA,WAAA,GAAA,KAAA,CAAA;;AAsBO,IAAMT,eAAAA,GAAN,cAA8BU,mBAAAA,CAAAA;MAtBrC;;;MA0BE,WAAA,CAAYC,OAAAA,EAAiBC,MAAcC,OAAAA,EAA4B;AACrE,QAAA,KAAA,CAAMF,OAAAA,EAAS;AAAEC,UAAAA,IAAAA;UAAM,GAAGC;SAAQ,CAAA;AAClC,QAAA,IAAA,CAAKC,IAAAA,GAAO,iBAAA;AACd,MAAA;AACF,KAAA;AAMO,IAAMb,mBAAAA,GAAN,cAAkCD,eAAAA,CAAAA;MApCzC;;;AAqCE,MAAA,WAAA,CAAYe,SAAAA,EAAmB;AAC7B,QAAA,KAAA,CACE,UAAUA,SAAAA,CAAAA;;;;;;;UAIGA,SAAAA,CAAAA;;;GAGb,kBAAA,CAAA;AAEF,QAAA,IAAA,CAAKD,IAAAA,GAAO,qBAAA;AACd,MAAA;AACF,KAAA;AAMO,IAAMZ,aAAAA,GAAN,cAA4BF,eAAAA,CAAAA;MAxDnC;;;AAyDE,MAAA,WAAA,CAAYe,SAAAA,EAAmB;AAC7B,QAAA,KAAA,CACE,eAAeA,SAAAA,CAAAA;;;;;;;UAIFA,SAAAA,CAAAA;;;;;;;GAMb,WAAA,CAAA;AAEF,QAAA,IAAA,CAAKD,IAAAA,GAAO,eAAA;AACd,MAAA;AACF,KAAA;AAMO,IAAMX,cAAAA,GAAN,cAA6BH,eAAAA,CAAAA;MA/EpC;;;AAgFWgB,MAAAA,QAAAA;MAET,WAAA,CAAYA,QAAAA,EAAkBC,QAAgBC,KAAAA,EAAe;AAC3D,QAAA,KAAA,CACE,sCAAsCF,QAAAA,CAAAA;;UACzBC,MAAAA;;;;;;GAKb,iBAAA,EACA;AAAEC,UAAAA;SAAM,CAAA;AAEV,QAAA,IAAA,CAAKJ,IAAAA,GAAO,gBAAA;AACZ,QAAA,IAAA,CAAKE,QAAAA,GAAWA,QAAAA;AAClB,MAAA;AACF,KAAA;AAMO,IAAMZ,yBAAAA,GAAN,cAAwCJ,eAAAA,CAAAA;MAtG/C;;;AAuGWmB,MAAAA,cAAAA;AAET,MAAA,WAAA,CAAYA,gBAAwBD,KAAAA,EAAe;AACjD,QAAA,KAAA,CACE,iCAAiCC,cAAAA,CAAAA;;;;;;;;;;;;UAQpBA,cAAAA,CAAAA;;;GAGb,6BAAA,EACA;AAAED,UAAAA;SAAM,CAAA;AAEV,QAAA,IAAA,CAAKJ,IAAAA,GAAO,2BAAA;AACZ,QAAA,IAAA,CAAKK,cAAAA,GAAiBA,cAAAA;AACxB,MAAA;AACF,KAAA;AAMO,IAAMd,uBAAAA,GAAN,cAAsCe,eAAAA,CAAAA;MAlI7C;;;AAqIWD,MAAAA,cAAAA;AACAlC,MAAAA,UAAAA;AACAoC,MAAAA,UAAAA;MAET,WAAA,CACEF,cAAAA,EACAlC,UAAAA,EACAoC,UAAAA,EACAJ,MAAAA,EACA;AACA,QAAA,KAAA,CACE,CAAA,2BAAA,EAA8BI,UAAAA,CAAAA,MAAAA,EAAmBF,cAAAA,IAAkBlC,UAAAA,CAAAA,GAAAA,EAAgBgC,MAAAA,CAAAA,CAAAA,EACnF;UACEL,IAAAA,EAAM,2BAAA;UACNU,OAAAA,EAAS;YACP3B,UAAAA,EAAYwB,cAAAA;YACZjF,MAAAA,EAAQ+C,UAAAA;YACRsC,cAAAA,EAAgBF,UAAAA;AAChBJ,YAAAA;AACF;SACF,CAAA;AAEF,QAAA,IAAA,CAAKH,IAAAA,GAAO,yBAAA;AACZ,QAAA,IAAA,CAAKK,cAAAA,GAAiBA,cAAAA;AACtB,QAAA,IAAA,CAAKlC,UAAAA,GAAaA,UAAAA;AAClB,QAAA,IAAA,CAAKoC,UAAAA,GAAaA,UAAAA;AACpB,MAAA;AACF,KAAA;AAcO,IAAMf,qBAAAA,GAAN,cAAoCc,eAAAA,CAAAA;MA9K3C;;;AAiLWD,MAAAA,cAAAA;AACAlC,MAAAA,UAAAA;AACAuC,MAAAA,SAAAA;AACAnF,MAAAA,MAAAA;AAET,MAAA,WAAA,CACE8E,cAAAA,EACAlC,UAAAA,EACAuC,SAAAA,EACAnF,MAAAA,EACAoF,eAAAA,EACA;AACA,QAAA,KAAA,CAAMA,eAAAA,IAAmB,CAAA,SAAA,EAAYpF,MAAAA,CAAAA,YAAAA,EAAqBmF,SAAAA,CAAAA,YAAAA,CAAAA,EAAyB;UACjFZ,IAAAA,EAAM,mBAAA;UACNU,OAAAA,EAAS;YACPI,SAAAA,EAAWF,SAAAA;AACXnF,YAAAA,MAAAA;YACAsD,UAAAA,EAAYwB,cAAAA;YACZjF,MAAAA,EAAQ+C;AACV;SACF,CAAA;AACA,QAAA,IAAA,CAAK6B,IAAAA,GAAO,uBAAA;AACZ,QAAA,IAAA,CAAKK,cAAAA,GAAiBA,cAAAA;AACtB,QAAA,IAAA,CAAKlC,UAAAA,GAAaA,UAAAA;AAClB,QAAA,IAAA,CAAKuC,SAAAA,GAAYA,SAAAA;AACjB,QAAA,IAAA,CAAKnF,MAAAA,GAASA,MAAAA;AAChB,MAAA;AACF,KAAA;AAMO,IAAMkE,sBAAAA,GAAN,cAAqCP,eAAAA,CAAAA;MAlN5C;;;AAmNWmB,MAAAA,cAAAA;AACAjF,MAAAA,MAAAA;AACAyF,MAAAA,IAAAA;AAET,MAAA,WAAA,CACER,cAAAA,EACAjF,MAAAA,EACAyF,IAAAA,EACAV,MAAAA,EACAC,KAAAA,EACA;AACA,QAAA,KAAA,CACE,CAAA,yBAAA,EAA4BhF,MAAAA,CAAAA,CAAAA,EAAUyF,IAAAA,qBAAyBR,cAAAA,CAAAA;;UAClDF,MAAAA;GACb,0BAAA,EACA;AAAEC,UAAAA;SAAM,CAAA;AAEV,QAAA,IAAA,CAAKJ,IAAAA,GAAO,wBAAA;AACZ,QAAA,IAAA,CAAKK,cAAAA,GAAiBA,cAAAA;AACtB,QAAA,IAAA,CAAKjF,MAAAA,GAASA,MAAAA;AACd,QAAA,IAAA,CAAKyF,IAAAA,GAAOA,IAAAA;AACd,MAAA;AACF,KAAA;AAMO,IAAMnB,mBAAAA,GAAN,cAAkCoB,cAAAA,CAAAA;MA/OzC;;;AAkPWC,MAAAA,SAAAA;AAET,MAAA,WAAA,CAAYA,WAAmBlB,OAAAA,EAAkB;AAC/C,QAAA,KAAA,CAAMA,WAAW,eAAA,EAAiB;UAChCC,IAAAA,EAAM;SACR,CAAA;AACA,QAAA,IAAA,CAAKE,IAAAA,GAAO,qBAAA;AACZ,QAAA,IAAA,CAAKe,SAAAA,GAAYA,SAAAA;AACnB,MAAA;AACF,KAAA;AAMO,IAAMpB,eAAAA,GAAN,cAA8BT,eAAAA,CAAAA;MAjQrC;;;AAkQE,MAAA,WAAA,CAAYe,SAAAA,EAAmB;AAC7B,QAAA,KAAA,CACE,UAAUA,SAAAA,CAAAA;;;;;;;;;;UAOGA,SAAAA,CAAAA;GACb,cAAA,CAAA;AAEF,QAAA,IAAA,CAAKD,IAAAA,GAAO,iBAAA;AACd,MAAA;AACF,KAAA;;;;;AChRA,IAAA,iBAAA,GAAA,EAAA;;;;;;;;AAgEA,SAASgB,cAAAA,CAAeC,UAAkBC,QAAAA,EAAkB;AAC1D,EAAA,OAAOA,QAAAA,CAASC,IAAAA,CAAK,CAACC,OAAAA,KAAAA;AAGpB,IAAA,IAAIC,WAAWD,OAAAA,CACZE,OAAAA,CAAQ,mBAAA,EAAqB,MAAA,EAC7BA,OAAAA,CAAQ,SAAA,EAAW,UAAA,CAAA,CACnBA,QAAQ,OAAA,EAAS,IAAA,CAAA,CACjBA,OAAAA,CAAQ,OAAO,OAAA,CAAA;AAElB,IAAA,MAAMC,KAAAA,GAAQ,IAAIC,MAAAA,CAAO,CAAA,CAAA,EAAIH,QAAAA,CAAAA,CAAAA,CAAW,CAAA;AACxC,IAAA,OAAOE,KAAAA,CAAME,KAAKR,QAAAA,CAAAA;EACpB,CAAA,CAAA;AACF;AAKA,SAASS,aAAAA,CACPC,YAAAA,EACAC,eAAAA,EACAC,eAAAA,EAAyB;AAGzB,EAAA,IAAIb,cAAAA,CAAeW,YAAAA,EAAcE,eAAAA,CAAAA,EAAkB;AACjD,IAAA,OAAO,KAAA;AACT,EAAA;AAGA,EAAA,OAAOb,cAAAA,CAAeW,cAAcC,eAAAA,CAAAA;AACtC;AAKA,eAAeE,aAAAA,CACbC,GAAAA,EACAC,OAAAA,EACAJ,eAAAA,EACAC,eAAAA,EAAyB;AAEzB,EAAA,MAAMI,QAAkB,EAAA;AAExB,EAAA,IAAI;AACF,IAAA,MAAMC,OAAAA,GAAU,MAAMC,OAAAA,CAAQJ,GAAAA,EAAK;MAAEK,aAAAA,EAAe;KAAK,CAAA;AAEzD,IAAA,KAAA,MAAWC,SAASH,OAAAA,EAAS;AAC3B,MAAA,MAAMI,QAAAA,GAAWC,IAAAA,CAAKR,GAAAA,EAAKM,KAAAA,CAAMrC,IAAI,CAAA;AAErC,MAAA,MAAM2B,YAAAA,GAAeW,QAAAA,CAClBE,KAAAA,CAAMR,OAAAA,CAAQS,MAAAA,GAAS,CAAA,CAAA,CACvBC,KAAAA,CAAMC,GAAAA,CAAAA,CACNJ,IAAAA,CAAK,GAAA,CAAA;AAER,MAAA,IAAIF,KAAAA,CAAMO,aAAW,EAAI;AAEvB,QAAA,IACEP,KAAAA,CAAMrC,IAAAA,KAAS,cAAA,IACfqC,KAAAA,CAAMrC,IAAAA,KAAS,MAAA,IACfqC,KAAAA,CAAMrC,IAAAA,KAAS,WAAA,IACfqC,KAAAA,CAAMrC,IAAAA,CAAK6C,UAAAA,CAAW,GAAA,CAAA,EACtB;AACA,UAAA;AACF,QAAA;AAGA,QAAA,MAAMC,WAAW,MAAMhB,aAAAA,CAAcQ,QAAAA,EAAUN,OAAAA,EAASJ,iBAAiBC,eAAAA,CAAAA;AACzEI,QAAAA,KAAAA,CAAMc,IAAAA,CAAI,GAAID,QAAAA,CAAAA;MAChB,CAAA,MAAA,IAAWT,KAAAA,CAAMW,QAAM,EAAI;AACzB,QAAA,MAAMC,GAAAA,GAAMC,OAAAA,CAAQb,KAAAA,CAAMrC,IAAI,CAAA;AAC9B,QAAA,IAAA,CAAKiD,GAAAA,KAAQ,SAASA,GAAAA,KAAQ,KAAA,KAAU,CAACZ,KAAAA,CAAMrC,IAAAA,CAAKmD,QAAAA,CAAS,OAAA,CAAA,EAAU;AACrE,UAAA,IAAIzB,aAAAA,CAAcC,YAAAA,EAAcC,eAAAA,EAAiBC,eAAAA,CAAAA,EAAkB;AACjEI,YAAAA,KAAAA,CAAMc,KAAKT,QAAAA,CAAAA;AACb,UAAA;AACF,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA,CAAA,CAAA,OAASc,KAAAA,EAAO;AAEd,IAAA,IAAKA,KAAAA,CAAgCtD,SAAS,QAAA,EAAU;AACtD,MAAA,MAAMsD,KAAAA;AACR,IAAA;AACF,EAAA;AAEA,EAAA,OAAOnB,KAAAA;AACT;AAKA,eAAeoB,iBAAAA,CACbnD,UACAoD,KAAAA,EAAc;AAEd,EAAA,MAAMC,cAA0B,EAAA;AAChC,EAAA,MAAMC,SAA2B,EAAA;AAEjC,EAAA,IAAI;AAEF,IAAA,MAAMC,OAAAA,GAAUC,aAAAA,CAAcxD,QAAAA,CAAAA,CAAUyD,IAAAA;AACxC,IAAA,MAAMC,MAAAA,GAAS,MAAM,OAAOH,OAAAA,CAAAA;AAG5B,IAAA,KAAA,MAAWI,UAAAA,IAAcC,MAAAA,CAAOC,IAAAA,CAAKH,MAAAA,CAAAA,EAAS;AAC5C,MAAA,MAAMI,QAAAA,GAAWJ,OAAOC,UAAAA,CAAAA;AAExB,MAAA,IAAI,OAAOG,QAAAA,KAAa,UAAA,IAAcpG,YAAAA,CAAaoG,QAAAA,CAAAA,EAAW;AAC5DT,QAAAA,WAAAA,CAAYR,KAAKiB,QAAAA,CAAAA;AACjB,QAAA,IAAIV,KAAAA,EAAO;AACTW,UAAAA,OAAAA,CAAQC,OAAOC,KAAAA,CAAM,CAAA,0BAAA,EAA6BH,QAAAA,CAAShE,IAAI,SAASE,QAAAA;AAAY,CAAA,CAAA;AACtF,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA,CAAA,CAAA,OAASkD,KAAAA,EAAO;AACdI,IAAAA,MAAAA,CAAOT,IAAAA,CACL,IAAI1D,cAAAA,CACFa,QAAAA,EACAkD,iBAAiBgB,KAAAA,GAAQhB,KAAAA,CAAMvD,OAAAA,GAAUtB,MAAAA,CAAO6E,KAAAA,CAAAA,EAChDA,KAAAA,YAAiBgB,KAAAA,GAAQhB,KAAAA,GAAQ5F,MAAAA,CAAAA,CAAAA;AAGvC,EAAA;AAEA,EAAA,OAAO;AAAE+F,IAAAA,WAAAA;AAAaC,IAAAA;AAAO,GAAA;AAC/B;AA6BA,eAAsBa,oBAAoBtE,OAAAA,EAAyB;AACjE,EAAA,MAAMiC,OAAAA,GAAUsC,OAAAA,CAAQvE,OAAAA,CAAQwE,IAAI,CAAA;AACpC,EAAA,MAAM3C,eAAAA,GAAkB7B,QAAQyE,OAAAA,IAAWC,eAAAA;AAC3C,EAAA,MAAM5C,eAAAA,GAAkB9B,QAAQ2E,OAAAA,IAAWC,eAAAA;AAC3C,EAAA,MAAMrB,KAAAA,GAAQvD,QAAQuD,KAAAA,IAAS,KAAA;AAE/B,EAAA,IAAIA,KAAAA,EAAO;AACTW,IAAAA,OAAAA,CAAQC,MAAAA,CAAOC,KAAAA,CAAM,CAAA,wBAAA,EAA2BnC,OAAAA;AAAW,CAAA,CAAA;AAC3DiC,IAAAA,OAAAA,CAAQC,OAAOC,KAAAA,CAAM,CAAA,uBAAA,EAA0BvC,eAAAA,CAAgBW,IAAAA,CAAK,IAAA,CAAA;AAAS,CAAA,CAAA;AAC7E0B,IAAAA,OAAAA,CAAQC,OAAOC,KAAAA,CAAM,CAAA,uBAAA,EAA0BtC,eAAAA,CAAgBU,IAAAA,CAAK,IAAA,CAAA;AAAS,CAAA,CAAA;AAC/E,EAAA;AAGA,EAAA,MAAMN,QAAQ,MAAMH,aAAAA,CAAcE,OAAAA,EAASA,OAAAA,EAASJ,iBAAiBC,eAAAA,CAAAA;AAErE,EAAA,IAAIyB,KAAAA,EAAO;AACTW,IAAAA,OAAAA,CAAQC,MAAAA,CAAOC,KAAAA,CAAM,CAAA,oBAAA,EAAuBlC,KAAAA,CAAMQ,MAAM,CAAA;AAAkB,CAAA,CAAA;AAC5E,EAAA;AAKA,EAAA,MAAMmC,OAAAA,GAA6B,IAAIC,KAAAA,CAAM5C,KAAAA,CAAMQ,MAAM,CAAA;AACzD,EAAA,IAAIqC,MAAAA,GAAS,CAAA;AAEb,EAAA,MAAMC,yBAAS,MAAA,CAAA,YAAA;AACb,IAAA,KAAA,IAASC,QAAQF,MAAAA,EAAAA,EAAUE,KAAAA,GAAQ/C,KAAAA,CAAMQ,MAAAA,EAAQuC,QAAQF,MAAAA,EAAAA,EAAU;AACjE,MAAA,MAAM5E,QAAAA,GAAW+B,MAAM+C,KAAAA,CAAAA;AACvB,MAAA,MAAM,EAAEzB,WAAAA,EAAaC,MAAAA,KAAW,MAAMH,iBAAAA,CAAkBnD,UAAUoD,KAAAA,CAAAA;AAClEsB,MAAAA,OAAAA,CAAQI,KAAAA,CAAAA,GAAS;AAAE9E,QAAAA,QAAAA;AAAUqD,QAAAA,WAAAA;AAAaC,QAAAA;AAAO,OAAA;AACnD,IAAA;EACF,CAAA,EANe,QAAA,CAAA;AAQf,EAAA,MAAMyB,WAAAA,GAAcC,IAAAA,CAAKC,GAAAA,CAAIC,kBAAAA,EAAoBnD,MAAMQ,MAAM,CAAA;AAC7D,EAAA,MAAM4C,OAAAA,CAAQC,GAAAA,CAAIT,KAAAA,CAAMU,IAAAA,CAAK;IAAE9C,MAAAA,EAAQwC;GAAY,EAAG,MAAMF,MAAAA,EAAAA,CAAAA,CAAAA;AAE5D,EAAA,OAAOH,OAAAA;AACT;AAKO,SAASY,0BAA0BZ,OAAAA,EAA0B;AAClE,EAAA,MAAMrB,cAA0B,EAAA;AAEhC,EAAA,KAAA,MAAWkC,UAAUb,OAAAA,EAAS;AAC5BrB,IAAAA,WAAAA,CAAYR,IAAAA,CAAI,GAAI0C,MAAAA,CAAOlC,WAAW,CAAA;AACxC,EAAA;AAEA,EAAA,OAAOA,WAAAA;AACT;AAKO,SAASmC,qBAAqBd,OAAAA,EAA0B;AAC7D,EAAA,MAAMpB,SAA2B,EAAA;AAEjC,EAAA,KAAA,MAAWiC,UAAUb,OAAAA,EAAS;AAC5BpB,IAAAA,MAAAA,CAAOT,IAAAA,CAAI,GAAI0C,MAAAA,CAAOjC,MAAM,CAAA;AAC9B,EAAA;AAEA,EAAA,OAAOA,MAAAA;AACT;AAxRA,IAqCaiB,iBAGAE,eAAAA,EAePS,kBAAAA;AAvDN,IAAA,cAAA,GAAA,KAAA,CAAA;;AAiBA,IAAA,aAAA,EAAA;AAIA,IAAA,WAAA,EAAA;AAgBO,IAAMX,eAAAA,GAAkB;AAAC,MAAA,oBAAA;AAAsB,MAAA;;AAG/C,IAAME,eAAAA,GAAkB;AAC7B,MAAA,cAAA;AACA,MAAA,cAAA;AACA,MAAA,cAAA;AACA,MAAA,cAAA;AACA,MAAA,oBAAA;AACA,MAAA,YAAA;AACA,MAAA;;AAQF,IAAMS,kBAAAA,GAAqB,EAAA;AASlBpE,IAAAA,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AAkBAU,IAAAA,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;AAiBMI,IAAAA,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;AAuDAuB,IAAAA,MAAAA,CAAAA,iBAAAA,EAAAA,mBAAAA,CAAAA;AA+DOgB,IAAAA,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AA0CNmB,IAAAA,MAAAA,CAAAA,yBAAAA,EAAAA,2BAAAA,CAAAA;AAaAE,IAAAA,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA;;;;;ACzNhB,UAAA,EAAA;AASA,oBAAA,EAAA;;;ACrDA,eAAA,EAAA;;;ACkBO,SAASC,aAAAA,CAAc9E,IAAAA,EAAcd,OAAAA,GAAgC,EAAC,EAAC;AAC5E,EAAA,IAAI6F,UAAAA,GAAa/E,KAAKgF,IAAAA,EAAI;AAE1B,EAAA,IAAI,CAACD,UAAAA,CAAW/C,UAAAA,CAAW,GAAA,CAAA,EAAM;AAC/B+C,IAAAA,UAAAA,GAAa,GAAA,GAAMA,UAAAA;AACrB,EAAA;AAEA,EAAA,IAAI7F,OAAAA,CAAQ+F,sBAAsBF,UAAAA,CAAWnD,MAAAA,GAAS,KAAKmD,UAAAA,CAAWzC,QAAAA,CAAS,GAAA,CAAA,EAAM;AACnFyC,IAAAA,UAAAA,GAAaA,UAAAA,CAAWpD,KAAAA,CAAM,CAAA,EAAG,EAAC,CAAA;AACpC,EAAA;AAEA,EAAA,OAAOoD,UAAAA;AACT;AAZgBD,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;;;ADfhB,UAAA,EAAA;AAgCO,SAASI,WAAWC,aAAAA,EAA0C;AACnE,EAAA,uBAAO,MAAA,CAAA,SAASC,oBAAgD/I,MAAAA,EAAiB;AAC/E,IAAA,MAAM6C,OAAAA,GAAUmG,0BAAAA,CAA2BF,aAAAA,EAAe9I,MAAAA,CAAO8C,IAAI,CAAA;AAErE,IAAA,MAAMmG,QAAAA,GAA+B;AACnCtF,MAAAA,IAAAA,EAAMd,QAAQc,IAAAA,IAAQ,GAAA;AACtBuF,MAAAA,OAAAA,EAASrG,OAAAA,CAAQqG,OAAAA;AACjBC,MAAAA,UAAAA,EAAYtG,OAAAA,CAAQsG,UAAAA;AACpBC,MAAAA,IAAAA,EAAMvG,OAAAA,CAAQuG;AAChB,KAAA;AAGA5I,IAAAA,cAAAA,CAAe7B,uBAAAA,CAAwBC,UAAAA,EAAYqK,QAAAA,EAAUjJ,MAAAA,CAAAA;AAK7DqJ,IAAAA,cAAAA,CAAerJ,MAAAA,CAAAA;AAEf,IAAA,OAAOA,MAAAA;EACT,CAAA,EAnBO,qBAAA,CAAA;AAoBT;AArBgB6I,MAAAA,CAAAA,UAAAA,EAAAA,YAAAA,CAAAA;AA0BhB,SAASG,0BAAAA,CACPM,OACAvG,SAAAA,EAAiB;AAEjB,EAAA,IAAI,OAAOuG,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO;AAAE3F,MAAAA,IAAAA,EAAM8E,cAAca,KAAAA,EAAO;QAAEV,kBAAAA,EAAoB;OAAK;AAAG,KAAA;AACpE,EAAA;AAEA,EAAA,IAAIU,KAAAA,IAAS,OAAOA,KAAAA,KAAU,QAAA,EAAU;AACtC,IAAA,OAAO;MACL,GAAGA,KAAAA;AACH3F,MAAAA,IAAAA,EAAM2F,KAAAA,CAAM3F,IAAAA,GACR8E,aAAAA,CAAca,KAAAA,CAAM3F,IAAAA,EAAM;QAAEiF,kBAAAA,EAAoB;OAAK,CAAA,GACrDW,wBAAwBxG,SAAAA;AAC9B,KAAA;AACF,EAAA;AAEA,EAAA,OAAO;AAAEY,IAAAA,IAAAA,EAAM4F,wBAAwBxG,SAAAA;AAAW,GAAA;AACpD;AAlBSiG,MAAAA,CAAAA,0BAAAA,EAAAA,4BAAAA,CAAAA;AA4BT,SAASO,wBAAwBxG,SAAAA,EAAiB;AAChD,EAAA,MAAMyG,QAAAA,GAAWzG,SAAAA,CAAUqB,OAAAA,CAAQ,cAAA,EAAgB,EAAA,CAAA;AAEnD,EAAA,IAAI,CAACoF,QAAAA,EAAU;AACb,IAAA,OAAO,GAAA;AACT,EAAA;AAEA,EAAA,MAAMC,SAAAA,GAAYD,QAAAA,CACfpF,OAAAA,CAAQ,oBAAA,EAAsB,OAAA,EAC9BA,OAAAA,CAAQ,sBAAA,EAAwB,OAAA,CAAA,CAChCsF,WAAAA,EAAW;AAEd,EAAA,OAAO,IAAID,SAAAA,CAAAA,CAAAA;AACb;AAbSF,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;;;AEtFT,eAAA,EAAA;AACA,kBAAA,EAAA;AAoBO,SAASI,MAAAA,CAAO9G,OAAAA,GAAyB,EAAC,EAAC;AAChD,EAAA,uBAAO,MAAA,CAAA,SAAS+G,gBAA4C5J,MAAAA,EAAiB;AAC3E,IAAA,MAAMiJ,QAAAA,GAA2B;MAC/BY,OAAAA,EAAS;AAAKhH,QAAAA,GAAAA,OAAAA,CAAQgH,WAAW;;MACjCxD,WAAAA,EAAa;AAAKxD,QAAAA,GAAAA,OAAAA,CAAQwD,eAAe;;MACzCyD,SAAAA,EAAW;AAAKjH,QAAAA,GAAAA,OAAAA,CAAQiH,aAAa;;MACrCC,OAAAA,EAAS;AAAKlH,QAAAA,GAAAA,OAAAA,CAAQkH,WAAW;;AACnC,KAAA;AAEAvJ,IAAAA,cAAAA,CAAe7B,uBAAAA,CAAwBI,MAAAA,EAAQkK,QAAAA,EAAUjJ,MAAAA,CAAAA;AAIzDqJ,IAAAA,eAAerJ,MAAAA,CAAAA;AAEf,IAAA,OAAOA,MAAAA;EACT,CAAA,EAfO,iBAAA,CAAA;AAgBT;AAjBgB2J,MAAAA,CAAAA,MAAAA,EAAAA,QAAAA,CAAAA;AAsBT,SAASK,SAAShK,MAAAA,EAAgB;AACvC,EAAA,OAAOS,cAAAA,CAAe9B,uBAAAA,CAAwBI,MAAAA,EAAQiB,MAAAA,CAAAA;AACxD;AAFgBgK,MAAAA,CAAAA,QAAAA,EAAAA,UAAAA,CAAAA;AAST,SAASC,kBAAkBjK,MAAAA,EAAgB;AAChD,EAAA,MAAMa,IAAAA,GAAmCN,cAAAA,CACvC5B,uBAAAA,CAAwBI,MAAAA,EACxBiB,MAAAA,CAAAA;AAGF,EAAA,IAAI,CAACa,IAAAA,EAAM;AACT,IAAA,OAAOP,MAAAA;AACT,EAAA;AAEA,EAAA,OAAO;IACLuJ,OAAAA,EAAS;SAAIhJ,IAAAA,CAAKgJ;;IAClBxD,WAAAA,EAAa;SAAIxF,IAAAA,CAAKwF;;IACtByD,SAAAA,EAAW;SAAIjJ,IAAAA,CAAKiJ;;IACpBC,OAAAA,EAAS;SAAIlJ,IAAAA,CAAKkJ;;AACpB,GAAA;AACF;AAhBgBE,MAAAA,CAAAA,iBAAAA,EAAAA,mBAAAA,CAAAA;;;AC1DhB,eAAA,EAAA;AACA,UAAA,EAAA;AAwBO,SAASC,SAASC,UAAAA,EAAkB;AACzC,EAAA,uBAAO,MAAA,CAAA,SAASC,iBAAAA,CACdpK,MAAAA,EACAK,WAAAA,EACAgK,UAAAA,EAA8B;AAE9B,IAAA,MAAMC,SAAAA,GAAYjJ,OAAOhB,WAAAA,CAAAA;AAEzB,IAAA,MAAMkK,QAAAA,GACJhK,eAAe5B,uBAAAA,CAAwBc,SAAAA,EAAWO,OAAO,WAAW,CAAA,wBAASuB,GAAAA,EAAAA;AAE/EgJ,IAAAA,QAAAA,CAAS9I,GAAAA,CAAI6I,WAAWH,UAAAA,CAAAA;AAExB3J,IAAAA,cAAAA,CAAe7B,uBAAAA,CAAwBc,SAAAA,EAAW8K,QAAAA,EAAUvK,MAAAA,CAAO,WAAW,CAAA;AAE9E,IAAA,OAAOqK,UAAAA;EACT,CAAA,EAfO,mBAAA,CAAA;AAgBT;AAjBgBH,MAAAA,CAAAA,QAAAA,EAAAA,UAAAA,CAAAA;;;ACzBhB,eAAA,EAAA;AAEA,UAAA,EAAA;AAuBO,SAASM,SAAAA,CAAU1H,MAAcnD,KAAAA,EAAa;AACnD,EAAA,uBAAO,MAAA,CAAA,SAAS8K,kBAAAA,CACdzK,MAAAA,EACAK,WAAAA,EACAgK,UAAAA,EAA8B;AAE9B,IAAA,MAAMC,SAAAA,GAAYjJ,OAAOhB,WAAAA,CAAAA;AAEzB,IAAA,MAAMkK,QAAAA,GACJhK,eAAe5B,uBAAAA,CAAwBY,gBAAAA,EAAkBS,OAAO,WAAW,CAAA,wBACvEuB,GAAAA,EAAAA;AAEN,IAAA,MAAMmJ,OAAAA,GAAUH,QAAAA,CAASnJ,GAAAA,CAAIkJ,SAAAA,KAAc,EAAA;AAC3CI,IAAAA,OAAAA,CAAQ7E,IAAAA,CAAK;AAAE/C,MAAAA,IAAAA;AAAMnD,MAAAA;KAAM,CAAA;AAC3B4K,IAAAA,QAAAA,CAAS9I,GAAAA,CAAI6I,WAAWI,OAAAA,CAAAA;AAExBlK,IAAAA,cAAAA,CAAe7B,uBAAAA,CAAwBY,gBAAAA,EAAkBgL,QAAAA,EAAUvK,MAAAA,CAAO,WAAW,CAAA;AAErF,IAAA,OAAOqK,UAAAA;EACT,CAAA,EAlBO,oBAAA,CAAA;AAmBT;AApBgBG,MAAAA,CAAAA,SAAAA,EAAAA,WAAAA,CAAAA;AAkDT,SAASG,QAAAA,CAASC,GAAAA,EAAaT,UAAAA,GAAa,GAAA,EAAG;AACpD,EAAA,uBAAO,MAAA,CAAA,SAASU,iBAAAA,CACd7K,MAAAA,EACAK,WAAAA,EACAgK,UAAAA,EAA8B;AAE9B,IAAA,MAAMC,SAAAA,GAAYjJ,OAAOhB,WAAAA,CAAAA;AAEzB,IAAA,MAAMkK,QAAAA,GACJhK,eAAe5B,uBAAAA,CAAwBa,QAAAA,EAAUQ,OAAO,WAAW,CAAA,wBAASuB,GAAAA,EAAAA;AAE9EgJ,IAAAA,QAAAA,CAAS9I,IAAI6I,SAAAA,EAAW;AAAEM,MAAAA,GAAAA;AAAKT,MAAAA;KAAW,CAAA;AAE1C3J,IAAAA,cAAAA,CAAe7B,uBAAAA,CAAwBa,QAAAA,EAAU+K,QAAAA,EAAUvK,MAAAA,CAAO,WAAW,CAAA;AAE7E,IAAA,OAAOqK,UAAAA;EACT,CAAA,EAfO,mBAAA,CAAA;AAgBT;AAjBgBM,MAAAA,CAAAA,QAAAA,EAAAA,UAAAA,CAAAA;;;AC5EhB,eAAA,EAAA;AAGA,UAAA,EAAA;AAKA,SAASG,qBAAqB5M,MAAAA,EAAoB;AAChD,EAAA,uBAAO,MAAA,CAAA,SAAS6M,qBAAAA,CACdjC,aAAAA,EACAjG,OAAAA,EAAsB;AAEtB,IAAA,uBAAO,MAAA,CAAA,SAASmI,cAAAA,CACdhL,MAAAA,EACAK,WAAAA,EACAgK,UAAAA,EAA8B;AAE9B,MAAA,MAAM,EAAE1G,IAAAA,EAAMsH,YAAAA,EAAY,GAAKC,mBAAAA,CAAoBpC,eAAejG,OAAAA,CAAAA;AAElE,MAAA,MAAMoG,QAAAA,GAAoC;AACxC/K,QAAAA,MAAAA;AACAyF,QAAAA,IAAAA;QACA1C,UAAAA,EAAYZ,WAAAA;AACZA,QAAAA,WAAAA;AACA8I,QAAAA,UAAAA,EAAY8B,YAAAA,EAAc9B,UAAAA;AAC1BgB,QAAAA,UAAAA,EAAYc,YAAAA,EAAcd,UAAAA;AAC1BgB,QAAAA,WAAAA,EAAaF,YAAAA,EAAcE,WAAAA;AAC3BC,QAAAA,UAAAA,EAAYH,YAAAA,EAAcG;AAC5B,OAAA;AAEA,MAAA,MAAMC,iBACJ9K,cAAAA,CAAe5B,uBAAAA,CAAwBK,QAAQgB,MAAAA,CAAO,WAAW,KAAK,EAAA;AAExEQ,MAAAA,cAAAA,CACE7B,wBAAwBK,MAAAA,EACxB;AAAIqM,QAAAA,GAAAA,cAAAA;AAAgBpC,QAAAA;AACpBjJ,OAAAA,EAAAA,MAAAA,CAAO,WAAW,CAAA;AAGpB,MAAA,OAAOqK,UAAAA;IACT,CAAA,EA5BO,gBAAA,CAAA;EA6BT,CAAA,EAjCO,uBAAA,CAAA;AAkCT;AAnCSS,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA;AAwCT,SAASI,mBAAAA,CACPpC,eACAjG,OAAAA,EAAsB;AAEtB,EAAA,IAAI,OAAOiG,kBAAkB,QAAA,EAAU;AACrC,IAAA,OAAO;AAAEnF,MAAAA,IAAAA,EAAM8E,cAAcK,aAAAA,CAAAA;MAAgBmC,YAAAA,EAAcpI;AAAQ,KAAA;AACrE,EAAA;AAEA,EAAA,IAAIiG,aAAAA,IAAiB,OAAOA,aAAAA,KAAkB,QAAA,EAAU;AACtD,IAAA,MAAMnF,OAAOmF,aAAAA,CAAcnF,IAAAA,GAAO8E,aAAAA,CAAcK,aAAAA,CAAcnF,IAAI,CAAA,GAAI,GAAA;AACtE,IAAA,OAAO;AAAEA,MAAAA,IAAAA;MAAMsH,YAAAA,EAAcnC;AAAc,KAAA;AAC7C,EAAA;AAEA,EAAA,OAAO;IAAEnF,IAAAA,EAAM,GAAA;IAAKsH,YAAAA,EAAcpI;AAAQ,GAAA;AAC5C;AAdSqI,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AAkCF,IAAMI,GAAAA,GAAMR,qBAAqB,KAAA;AAiBjC,IAAMS,IAAAA,GAAOT,qBAAqB,MAAA;AAclC,IAAMU,GAAAA,GAAMV,qBAAqB,KAAA;AAcjC,IAAMW,MAAAA,GAASX,qBAAqB,QAAA;AAcpC,IAAMY,KAAAA,GAAQZ,qBAAqB,OAAA;AAcnC,IAAMa,IAAAA,GAAOb,qBAAqB,MAAA;AAclC,IAAMc,OAAAA,GAAUd,qBAAqB,SAAA;AAmBrC,IAAMe,GAAAA,GAAMf,qBAAqB,KAAA;;;ACzLxC,UAAA,EAAA;AACA,eAAA,EAAA;AAKO,SAASgB,oBAAAA,CAEdzN,QAAqB0N,eAAAA,EAAwB;AAC7C,EAAA,uBAAO,MAAA,CAAA,SAASC,qBAAAA,CACdC,aAAAA,EACApJ,OAAAA,EAAkB;AAElB,IAAA,uBAAO,MAAA,CAAA,SAASqJ,cAAAA,CACdlM,MAAAA,EACAK,WAAAA,EACAkD,cAAAA,EAAsB;AAEtB,MAAA,IAAIlD,gBAAgBC,MAAAA,EAAW;AAC7B,QAAA,MAAM,IAAI4G,KAAAA,CACR,CAAA,qBAAA,EAAwB7I,MAAAA,CAAO8N,MAAAA,CAAO,CAAA,CAAA,CAAGC,WAAAA,EAAW,GAAK/N,MAAAA,CAAOiH,KAAAA,CAAM,CAAA,CAAA,CAAA,mEAAA,CAAuE,CAAA;AAEjJ,MAAA;AAEA,MAAA,MAAM,EAAExC,IAAAA,EAAMuJ,YAAAA,KAAiBC,mBAAAA,CAAoBL,aAAAA,EAAepJ,SAASxE,MAAAA,CAAAA;AAE3E,MAAA,MAAM4K,QAAAA,GAA0B;AAC9B5K,QAAAA,MAAAA;QACAyJ,KAAAA,EAAOvE,cAAAA;AACPT,QAAAA,IAAAA;AACAyJ,QAAAA,QAAAA,EAAUF,cAAcE,QAAAA,IAAYR,eAAAA;AACpCS,QAAAA,YAAAA,EAAcH,YAAAA,EAAcG,YAAAA;AAC5BC,QAAAA,SAAAA,EAAWJ,YAAAA,EAAcI;AAC3B,OAAA;AAEAC,MAAAA,iBAAAA,CAAkB1M,MAAAA,EAAQK,aAAa4I,QAAAA,CAAAA;IACzC,CAAA,EAvBO,gBAAA,CAAA;EAwBT,CAAA,EA5BO,uBAAA,CAAA;AA6BT;AAhCgB6C,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA;AAqChB,SAASQ,mBAAAA,CACPL,aAAAA,EACApJ,OAAAA,EACAxE,MAAAA,EAAmB;AAEnB,EAAA,IAAI,OAAO4N,kBAAkB,QAAA,EAAU;AACrC,IAAA,OAAO;MAAEnJ,IAAAA,EAAMmJ,aAAAA;MAAeI,YAAAA,EAAcxJ;AAAQ,KAAA;AACtD,EAAA;AAEA,EAAA,IAAIoJ,aAAAA,IAAiB,OAAOA,aAAAA,KAAkB,QAAA,EAAU;AACtD,IAAA,OAAO;MAAEI,YAAAA,EAAcJ;AAAc,KAAA;AACvC,EAAA;AAEA,EAAA,IAAI5N,WAAW,MAAA,IAAUA,MAAAA,KAAW,SAASA,MAAAA,KAAW,KAAA,IAASA,WAAW,KAAA,EAAO;AACjF,IAAA,OAAO;MAAEgO,YAAAA,EAAcxJ;AAAQ,KAAA;AACjC,EAAA;AAEA,EAAA,OAAO;IAAEwJ,YAAAA,EAAcxJ;AAAQ,GAAA;AACjC;AAlBSyJ,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AA2BF,SAASI,iBAAAA,CACd1M,MAAAA,EACAK,WAAAA,EACA4I,QAAAA,EAAuB;AAEvB,EAAA,MAAMqB,SAAAA,GAAY,CAAA,EAAGjJ,MAAAA,CAAOhB,WAAAA,CAAAA,CAAAA,CAAAA;AAE5B,EAAA,MAAMsM,cAAAA,GACJpM,eAA6C5B,uBAAAA,CAAwBM,MAAAA,EAAQe,OAAO,WAAW,CAAA,wBAASuB,GAAAA,EAAAA;AAE1G,EAAA,MAAMqL,YAAAA,GAAeD,cAAAA,CAAevL,GAAAA,CAAIkJ,SAAAA,KAAc,EAAA;AACtDsC,EAAAA,YAAAA,CAAa/G,KAAKoD,QAAAA,CAAAA;AAClB0D,EAAAA,cAAAA,CAAelL,GAAAA,CAAI6I,WAAWsC,YAAAA,CAAAA;AAE9BpM,EAAAA,cAAAA,CAAe7B,uBAAAA,CAAwBM,MAAAA,EAAQ0N,cAAAA,EAAgB3M,MAAAA,CAAO,WAAW,CAAA;AACnF;AAfgB0M,MAAAA,CAAAA,iBAAAA,EAAAA,mBAAAA,CAAAA;;;AC3CT,IAAMG,IAAAA,GAKTf,oBAAAA,CAAkC,MAAA,EAAQ,IAAA;AAuBvC,IAAMgB,KAAAA,GAKThB,oBAAAA,CAAmC,OAAA,EAAS,IAAA;AAuBzC,IAAMiB,KAAAA,GAKTjB,oBAAAA,CAAmC,OAAA,EAAS,KAAA;AAuBzC,IAAMkB,MAAAA,GAKTlB,oBAAAA,CAAoC,QAAA,EAAU,KAAA;AAiB3C,SAASmB,GAAAA,GAAAA;AACd,EAAA,uBAAO,MAAA,CAAA,SAASC,YAAAA,CACdlN,MAAAA,EACAK,WAAAA,EACAkD,cAAAA,EAAsB;AAEtB,IAAA,IAAIlD,gBAAgBC,MAAAA,EAAW;AAC7B,MAAA,MAAM,IAAI4G,MAAM,yEAAA,CAAA;AAClB,IAAA;AAEA,IAAA,MAAM+B,QAAAA,GAA0B;MAC9B5K,MAAAA,EAAQ,KAAA;MACRyJ,KAAAA,EAAOvE,cAAAA;MACPgJ,QAAAA,EAAU;AACZ,KAAA;AAEAG,IAAAA,iBAAAA,CAAkB1M,MAAAA,EAAQK,aAAa4I,QAAAA,CAAAA;EACzC,CAAA,EAhBO,cAAA,CAAA;AAiBT;AAlBgBgE,MAAAA,CAAAA,GAAAA,EAAAA,KAAAA,CAAAA;AAkCT,SAASE,GAAAA,GAAAA;AACd,EAAA,uBAAO,MAAA,CAAA,SAASC,YAAAA,CACdpN,MAAAA,EACAK,WAAAA,EACAkD,cAAAA,EAAsB;AAEtB,IAAA,IAAIlD,gBAAgBC,MAAAA,EAAW;AAC7B,MAAA,MAAM,IAAI4G,MAAM,yEAAA,CAAA;AAClB,IAAA;AAEA,IAAA,MAAM+B,QAAAA,GAA0B;MAC9B5K,MAAAA,EAAQ,KAAA;MACRyJ,KAAAA,EAAOvE,cAAAA;MACPgJ,QAAAA,EAAU;AACZ,KAAA;AAEAG,IAAAA,iBAAAA,CAAkB1M,MAAAA,EAAQK,aAAa4I,QAAAA,CAAAA;EACzC,CAAA,EAhBO,cAAA,CAAA;AAiBT;AAlBgBkE,MAAAA,CAAAA,GAAAA,EAAAA,KAAAA,CAAAA;AAkCT,SAASE,GAAAA,GAAAA;AACd,EAAA,uBAAO,MAAA,CAAA,SAASC,YAAAA,CACdtN,MAAAA,EACAK,WAAAA,EACAkD,cAAAA,EAAsB;AAEtB,IAAA,IAAIlD,gBAAgBC,MAAAA,EAAW;AAC7B,MAAA,MAAM,IAAI4G,MAAM,yEAAA,CAAA;AAClB,IAAA;AAEA,IAAA,MAAM+B,QAAAA,GAA0B;MAC9B5K,MAAAA,EAAQ,KAAA;MACRyJ,KAAAA,EAAOvE,cAAAA;MACPgJ,QAAAA,EAAU;AACZ,KAAA;AAEAG,IAAAA,iBAAAA,CAAkB1M,MAAAA,EAAQK,aAAa4I,QAAAA,CAAAA;EACzC,CAAA,EAhBO,cAAA,CAAA;AAiBT;AAlBgBoE,MAAAA,CAAAA,GAAAA,EAAAA,KAAAA,CAAAA;;;ACxMhB,UAAA,EAAA;AACA,eAAA,EAAA;AASA,SAASX,kBAAAA,CACP1M,MAAAA,EACAK,WAAAA,EACA4I,QAAAA,EAAuB;AAEvB,EAAA,MAAMqB,SAAAA,GAAY,CAAA,EAAGjJ,MAAAA,CAAOhB,WAAAA,CAAAA,CAAAA,CAAAA;AAE5B,EAAA,MAAMsM,cAAAA,GACJpM,eAA6C5B,uBAAAA,CAAwBM,MAAAA,EAAQe,OAAO,WAAW,CAAA,wBAASuB,GAAAA,EAAAA;AAE1G,EAAA,MAAMqL,YAAAA,GAAeD,cAAAA,CAAevL,GAAAA,CAAIkJ,SAAAA,KAAc,EAAA;AACtDsC,EAAAA,YAAAA,CAAa/G,KAAKoD,QAAAA,CAAAA;AAClB0D,EAAAA,cAAAA,CAAelL,GAAAA,CAAI6I,WAAWsC,YAAAA,CAAAA;AAE9BpM,EAAAA,cAAAA,CAAe7B,uBAAAA,CAAwBM,MAAAA,EAAQ0N,cAAAA,EAAgB3M,MAAAA,CAAO,WAAW,CAAA;AACnF;AAfS0M,MAAAA,CAAAA,kBAAAA,EAAAA,mBAAAA,CAAAA;AAiDF,SAASa,0BAAAA,CACdC,WACA3K,OAAAA,EAAyD;AAEzD,EAAA,uBAAO,MAAA,CAAA,SAAS4K,oBAAAA,CACdzN,MAAAA,EACAK,WAAAA,EACAkD,cAAAA,EAAsB;AAEtB,IAAA,IAAIlD,gBAAgBC,MAAAA,EAAW;AAC7B,MAAA,MAAM,IAAI4G,MACR,+FAAA,CAAA;AAEJ,IAAA;AAEA,IAAA,MAAM+B,QAAAA,GAA0B;MAC9B5K,MAAAA,EAAQ,QAAA;MACRyJ,KAAAA,EAAOvE,cAAAA;AACPgJ,MAAAA,QAAAA,EAAU1J,SAAS0J,QAAAA,IAAY,KAAA;AAC/BE,MAAAA,SAAAA,EAAW5J,OAAAA,EAAS4J,SAAAA;MACpBiB,eAAAA,EAAiBF;AACnB,KAAA;AAEAd,IAAAA,kBAAAA,CAAkB1M,MAAAA,EAAQK,WAAAA,EAAa4I,QAAAA,CAAAA;EACzC,CAAA,EApBO,sBAAA,CAAA;AAqBT;AAzBgBsE,MAAAA,CAAAA,0BAAAA,EAAAA,4BAAAA,CAAAA;;;ACzDhB,eAAA,EAAA;AAEA,UAAA,EAAA;AAwFO,SAASI,YAAYC,MAAAA,EAAe;AACzC,EAAA,uBAAO,MAAA,CAAA,SAASC,cAAAA,CACd7N,MAAAA,EACAK,WAAAA,EACAgK,UAAAA,EAA+B;AAE/B,IAAA,IAAIhK,WAAAA,KAAgBC,MAAAA,IAAa+J,UAAAA,KAAe/J,MAAAA,EAAW;AAEzD,MAAA,MAAMwN,cAAAA,GACJ3N,YAAYxB,uBAAAA,CAAwBQ,MAAAA,EAAQa,OAAO,WAAA,EAAaK,WAAAA,KAAgB,EAAA;AAElF,MAAA,MAAM4I,QAAAA,GAA0B;AAC9B2E,QAAAA,MAAAA;QACA5N,MAAAA,EAAQ,QAAA;QACRiB,UAAAA,EAAYZ;AACd,OAAA;AAEAG,MAAAA,cAAAA,CACE7B,wBAAwBQ,MAAAA,EACxB;AAAI2O,QAAAA,GAAAA,cAAAA;AAAgB7E,QAAAA;AACpBjJ,OAAAA,EAAAA,MAAAA,CAAO,aACPK,WAAAA,CAAAA;IAEJ,CAAA,MAAO;AAEL,MAAA,MAAMyN,iBACJ3N,WAAAA,CAAYxB,uBAAAA,CAAwBQ,MAAAA,EAAQa,MAAAA,KAAW,EAAA;AAEzD,MAAA,MAAMiJ,QAAAA,GAA0B;AAC9B2E,QAAAA,MAAAA;QACA5N,MAAAA,EAAQ;AACV,OAAA;AAEAQ,MAAAA,cAAAA,CAAe7B,wBAAwBQ,MAAAA,EAAQ;AAAI2O,QAAAA,GAAAA,cAAAA;AAAgB7E,QAAAA;SAAWjJ,MAAAA,CAAAA;AAChF,IAAA;EACF,CAAA,EAlCO,gBAAA,CAAA;AAmCT;AApCgB2N,MAAAA,CAAAA,QAAAA,EAAAA,UAAAA,CAAAA;AA+CT,SAASI,eAAe/N,MAAAA,EAAgB;AAC7C,EAAA,MAAMiJ,WACJ9I,WAAAA,CAAYxB,uBAAAA,CAAwBQ,MAAAA,EAAQa,MAAAA,KAAW,EAAA;AACzD,EAAA,OAAOiJ,QAAAA,CAAS+E,OAAAA,CAAQ,CAACC,CAAAA,KAAMA,EAAEL,MAAM,CAAA;AACzC;AAJgBG,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AAeT,SAASG,eAAAA,CAAgBlO,QAAkBiB,UAAAA,EAA2B;AAC3E,EAAA,MAAMgI,WACJ9I,WAAAA,CAAYxB,uBAAAA,CAAwBQ,QAAQa,MAAAA,EAAQiB,UAAAA,KAAe,EAAA;AACrE,EAAA,OAAOgI,QAAAA,CAAS+E,OAAAA,CAAQ,CAACC,CAAAA,KAAMA,EAAEL,MAAM,CAAA;AACzC;AAJgBM,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;AAeT,SAASC,YAAAA,CAAanO,QAAkBiB,UAAAA,EAA2B;AACxE,EAAA,MAAMmN,WAAAA,GAAcL,eAAe/N,MAAAA,CAAAA;AACnC,EAAA,MAAMqO,YAAAA,GAAeH,eAAAA,CAAgBlO,MAAAA,EAAQiB,UAAAA,CAAAA;AAC7C,EAAA,OAAO;AAAImN,IAAAA,GAAAA,WAAAA;AAAgBC,IAAAA,GAAAA;;AAC7B;AAJgBF,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;;;ACzKhB,eAAA,EAAA;AAEA,UAAA,EAAA;AAuBO,SAASG,SAASC,UAAAA,EAAsB;AAC7C,EAAA,uBAAO,MAAA,CAAA,SAASC,eAAexO,MAAAA,EAAc;AAC3CQ,IAAAA,cAAAA,CAAe7B,uBAAAA,CAAwBW,KAAAA,EAAOiP,UAAAA,EAAYvO,MAAAA,CAAAA;EAC5D,CAAA,EAFO,gBAAA,CAAA;AAGT;AAJgBsO,MAAAA,CAAAA,KAAAA,EAAAA,OAAAA,CAAAA;AAiCT,SAASG,aAAaC,OAAAA,EAA+B;AAC1D,EAAA,uBAAO,MAAA,CAAA,SAASC,eAAAA,CACd3O,MAAAA,EACAK,WAAAA,EACAgK,UAAAA,EAA+B;AAE/B,IAAA,IAAIhK,WAAAA,KAAgBC,MAAAA,IAAa+J,UAAAA,KAAe/J,MAAAA,EAAW;AAEzD,MAAA,MAAMiK,QAAAA,GACJpK,YAAYxB,uBAAAA,CAAwBU,OAAAA,EAASW,OAAO,WAAA,EAAaK,WAAAA,KAAgB,EAAA;AAEnF,MAAA,MAAM4I,QAAAA,GAA2B;AAC/ByF,QAAAA,OAAAA;QACA1O,MAAAA,EAAQ,QAAA;QACRiB,UAAAA,EAAYZ;AACd,OAAA;AAEAG,MAAAA,cAAAA,CACE7B,wBAAwBU,OAAAA,EACxB;AAAIkL,QAAAA,GAAAA,QAAAA;AAAUtB,QAAAA;AACdjJ,OAAAA,EAAAA,MAAAA,CAAO,aACPK,WAAAA,CAAAA;IAEJ,CAAA,MAAO;AAEL,MAAA,MAAMkK,WACJpK,WAAAA,CAAYxB,uBAAAA,CAAwBU,OAAAA,EAASW,MAAAA,KAAW,EAAA;AAE1D,MAAA,MAAMiJ,QAAAA,GAA2B;AAC/ByF,QAAAA,OAAAA;QACA1O,MAAAA,EAAQ;AACV,OAAA;AAEAQ,MAAAA,cAAAA,CAAe7B,wBAAwBU,OAAAA,EAAS;AAAIkL,QAAAA,GAAAA,QAAAA;AAAUtB,QAAAA;SAAWjJ,MAAAA,CAAAA;AAC3E,IAAA;EACF,CAAA,EAlCO,iBAAA,CAAA;AAmCT;AApCgByO,MAAAA,CAAAA,SAAAA,EAAAA,WAAAA,CAAAA;AA4CT,SAASG,cAAc5O,MAAAA,EAAgB;AAC5C,EAAA,OAAOG,WAAAA,CAAYxB,uBAAAA,CAAwBW,KAAAA,EAAOU,MAAAA,KAAW,EAAA;AAC/D;AAFgB4O,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;AAUT,SAASC,gBAAgB7O,MAAAA,EAAgB;AAC9C,EAAA,MAAMiJ,WACJ9I,WAAAA,CAAYxB,uBAAAA,CAAwBU,OAAAA,EAASW,MAAAA,KAAW,EAAA;AAC1D,EAAA,OAAOiJ,QAAAA,CAAS+E,OAAAA,CAAQ,CAACC,CAAAA,KAAMA,EAAES,OAAO,CAAA;AAC1C;AAJgBG,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;AAaT,SAASC,gBAAAA,CACd9O,QACAiB,UAAAA,EAA2B;AAE3B,EAAA,MAAMgI,WACJ9I,WAAAA,CAAYxB,uBAAAA,CAAwBU,SAASW,MAAAA,EAAQiB,UAAAA,KAAe,EAAA;AACtE,EAAA,OAAOgI,QAAAA,CAAS+E,OAAAA,CAAQ,CAACC,CAAAA,KAAMA,EAAES,OAAO,CAAA;AAC1C;AAPgBI,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;AAoBT,SAASC,aAAAA,CACd/O,QACAiB,UAAAA,EAA2B;AAE3B,EAAA,MAAM+N,aAAAA,GAAgBF,gBAAAA,CAAiB9O,MAAAA,EAAQiB,UAAAA,CAAAA;AAC/C,EAAA,MAAMgO,YAAAA,GAAeJ,gBAAgB7O,MAAAA,CAAAA;AACrC,EAAA,OAAO;AAAIgP,IAAAA,GAAAA,aAAAA;AAAkBC,IAAAA,GAAAA;;AAC/B;AAPgBF,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;;;AC1IhB,eAAA,EAAA;AAEA,UAAA,EAAA;AA8BO,SAASG,kBACXC,YAAAA,EAAgC;AAEnC,EAAA,uBAAO,MAAA,CAAA,SAASC,oBAAAA,CACdpP,MAAAA,EACAK,WAAAA,EACAgK,UAAAA,EAA+B;AAE/B,IAAA,IAAIhK,WAAAA,KAAgBC,MAAAA,IAAa+J,UAAAA,KAAe/J,MAAAA,EAAW;AAEzD,MAAA,MAAMiK,QAAAA,GACJpK,YAAYxB,uBAAAA,CAAwBS,YAAAA,EAAcY,OAAO,WAAA,EAAaK,WAAAA,KACtE,EAAA;AAEF,MAAA,MAAM4I,QAAAA,GAAgC;AACpCkG,QAAAA,YAAAA;QACAnP,MAAAA,EAAQ,QAAA;QACRiB,UAAAA,EAAYZ;AACd,OAAA;AAEAG,MAAAA,cAAAA,CACE7B,wBAAwBS,YAAAA,EACxB;AAAImL,QAAAA,GAAAA,QAAAA;AAAUtB,QAAAA;AACdjJ,OAAAA,EAAAA,MAAAA,CAAO,aACPK,WAAAA,CAAAA;IAEJ,CAAA,MAAO;AAEL,MAAA,MAAMkK,WACJpK,WAAAA,CAAYxB,uBAAAA,CAAwBS,YAAAA,EAAcY,MAAAA,KAAW,EAAA;AAE/D,MAAA,MAAMiJ,QAAAA,GAAgC;AACpCkG,QAAAA,YAAAA;QACAnP,MAAAA,EAAQ;AACV,OAAA;AAEAQ,MAAAA,cAAAA,CACE7B,wBAAwBS,YAAAA,EACxB;AAAImL,QAAAA,GAAAA,QAAAA;AAAUtB,QAAAA;SACdjJ,MAAAA,CAAAA;AAEJ,IAAA;EACF,CAAA,EAvCO,sBAAA,CAAA;AAwCT;AA3CgBkP,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AAsDT,SAASG,qBAAqBrP,MAAAA,EAAgB;AACnD,EAAA,MAAMiJ,WACJ9I,WAAAA,CAAYxB,uBAAAA,CAAwBS,YAAAA,EAAcY,MAAAA,KAAW,EAAA;AAC/D,EAAA,OAAOiJ,QAAAA,CAAS+E,OAAAA,CAAQ,CAACC,CAAAA,KAAMA,EAAEkB,YAAY,CAAA;AAC/C;AAJgBE,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA;AAaT,SAASC,qBAAAA,CACdtP,QACAiB,UAAAA,EAA2B;AAE3B,EAAA,MAAMgI,WACJ9I,WAAAA,CAAYxB,uBAAAA,CAAwBS,cAAcY,MAAAA,EAAQiB,UAAAA,KAAe,EAAA;AAC3E,EAAA,OAAOgI,QAAAA,CAAS+E,OAAAA,CAAQ,CAACC,CAAAA,KAAMA,EAAEkB,YAAY,CAAA;AAC/C;AAPgBG,MAAAA,CAAAA,qBAAAA,EAAAA,uBAAAA,CAAAA;AAoBT,SAASC,kBAAAA,CACdvP,QACAiB,UAAAA,EAA2B;AAE3B,EAAA,MAAMuO,iBAAAA,GAAoBH,qBAAqBrP,MAAAA,CAAAA;AAC/C,EAAA,MAAMyP,kBAAAA,GAAqBH,qBAAAA,CAAsBtP,MAAAA,EAAQiB,UAAAA,CAAAA;AACzD,EAAA,OAAO;AAAIuO,IAAAA,GAAAA,iBAAAA;AAAsBC,IAAAA,GAAAA;;AACnC;AAPgBF,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA;;;AZhBhB,aAAA,EAAA;AAaA,eAAA,EAAA;;;AanHA,cAAA,EAAA;AAIA,WAAA,EAAA;;;ACjBA,eAAsBG,cAAcC,GAAAA,EAAqB;AACvDA,EAAAA,GAAAA,CAAIC,iBAAAA,GAAoB,MAAMD,GAAAA,CAAItR,MAAAA,CAAOwR,QAAAA,EAAQ;AACnD;AAFsBH,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;;;ACDtB,aAAA,EAAA;AAEO,SAASI,cAAcH,GAAAA,EAAqB;AACjDA,EAAAA,GAAAA,CAAII,qBAAAA,GAAwBJ,GAAAA,CAAIC,iBAAAA,CAAkB/N,GAAAA,CAAI,CAACmO,GAAAA,KAAAA;AACrD,IAAA,MAAMC,GAAAA,GAAMvO,wBAAwBsO,GAAAA,CAAAA;AACpC,IAAA,IAAI,CAACC,GAAAA,EAAK;AACR,MAAA,MAAM,IAAI/I,KAAAA,CACR,CAAA,iBAAA,EAAoB8I,GAAAA,CAAIlN,IAAI,CAAA,4CAAA,CAA8C,CAAA;AAE9E,IAAA;AACA,IAAA,OAAOmN,GAAAA;EACT,CAAA,CAAA;AACF;AAVgBH,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;;;ACiBhB,eAAA,EAAA;AAUA,IAAMI,yBAAAA,GAA4B,iBAAA;AAMlC,SAASC,QAAQ9F,UAAAA,EAAmB;AAClC,EAAA,IAAIA,eAAe,IAAA,IAAQ,OAAOA,UAAAA,KAAe,QAAA,IAAY,WAAWA,UAAAA,EAAY;AAClF,IAAA,OAAQA,UAAAA,CAAkC+F,KAAAA;AAC5C,EAAA;AACA,EAAA,OAAO/F,UAAAA;AACT;AALS8F,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA;AAiBF,SAASE,yBAAyBrQ,MAAAA,EAAgB;AACvD,EAAA,MAAMsQ,UAAAA,GAAavQ,yBAAyBC,MAAAA,CAAAA;AAC5C,EAAA,MAAMuQ,eAAAA,GACHhQ,cAAAA,CAAwC2P,yBAAAA,EAA2BlQ,MAAAA,KAElD,EAAC;AACrB,EAAA,MAAMwQ,QAAAA,GAAWC,kBAAkBzQ,MAAAA,CAAAA;AAEnC,EAAA,MAAM0Q,OAAAA,uBAAcC,GAAAA,EAAAA;AACpB,EAAA,KAAA,IAASC,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIN,UAAAA,CAAW/K,QAAQqL,CAAAA,EAAAA,EAAK;AAC1CF,IAAAA,OAAAA,CAAQG,IAAID,CAAAA,CAAAA;AACd,EAAA;AACA,EAAA,KAAA,MAAWxQ,GAAAA,IAAOwG,MAAAA,CAAOC,IAAAA,CAAK0J,eAAAA,CAAAA,EAAkB;AAC9CG,IAAAA,OAAAA,CAAQG,GAAAA,CAAIC,MAAAA,CAAO1Q,GAAAA,CAAAA,CAAAA;AACrB,EAAA;AAEA,EAAA,MAAM2Q,OAAmB,EAAA;AACzB,EAAA,KAAA,MAAWjJ,SAAS4I,OAAAA,EAAS;AAC3B,IAAA,IAAIF,QAAAA,CAASQ,GAAAA,CAAIlJ,KAAAA,CAAAA,EAAQ;AACvB,MAAA;AACF,IAAA;AACA,IAAA,MAAMmJ,QAAAA,GAAWV,gBAAgBzI,KAAAA,CAAAA;AACjC,IAAA,MAAMsI,QAAQa,QAAAA,KAAa3Q,MAAAA,GAAY6P,QAAQc,QAAAA,CAAAA,GAAYX,WAAWxI,KAAAA,CAAAA;AACtE,IAAA,IAAI,OAAOsI,UAAU,UAAA,EAAY;AAC/BW,MAAAA,IAAAA,CAAKlL,KAAKuK,KAAAA,CAAAA;AACZ,IAAA;AACF,EAAA;AACA,EAAA,OAAOW,IAAAA;AACT;AA5BgBV,MAAAA,CAAAA,wBAAAA,EAAAA,0BAAAA,CAAAA;AAwCT,SAASa,oBAAoB7K,WAAAA,EAAuB;AACzD,EAAA,MAAM8K,OAAAA,uBAAcR,GAAAA,EAAAA;AACpB,EAAA,MAAMpI,SAAqB,EAAA;AAE3B,EAAA,MAAM6I,QAAoB,EAAA;AAC1B,EAAA,KAAA,MAAWzP,cAAc0E,WAAAA,EAAa;AACpC,IAAA,KAAA,MAAWgL,GAAAA,IAAOhB,wBAAAA,CAAyB1O,UAAAA,CAAAA,EAAa;AACtDyP,MAAAA,KAAAA,CAAMvL,KAAKwL,GAAAA,CAAAA;AACb,IAAA;AACF,EAAA;AAEA,EAAA,KAAA,IAASC,IAAAA,GAAO,CAAA,EAAGA,IAAAA,GAAOF,KAAAA,CAAM7L,QAAQ+L,IAAAA,EAAAA,EAAQ;AAC9C,IAAA,MAAMD,GAAAA,GAAMD,MAAME,IAAAA,CAAAA;AAClB,IAAA,IAAIH,OAAAA,CAAQH,GAAAA,CAAIK,GAAAA,CAAAA,EAAM;AACpB,MAAA;AACF,IAAA;AACAF,IAAAA,OAAAA,CAAQN,IAAIQ,GAAAA,CAAAA;AAEZ,IAAA,IAAI,CAACE,kBAAAA,CAAmBF,GAAAA,CAAAA,EAAM;AAC5B,MAAA;AACF,IAAA;AAEA9I,IAAAA,MAAAA,CAAO1C,KAAKwL,GAAAA,CAAAA;AAEZ,IAAA,KAAA,MAAWG,GAAAA,IAAOnB,wBAAAA,CAAyBgB,GAAAA,CAAAA,EAAM;AAC/CD,MAAAA,KAAAA,CAAMvL,KAAK2L,GAAAA,CAAAA;AACb,IAAA;AACF,EAAA;AACA,EAAA,OAAOjJ,MAAAA;AACT;AA7BgB2I,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AA2CT,SAASO,oBAAAA,CACdpL,WAAAA,EACAqL,UAAAA,EACAC,eAAAA,EAAsC;AAEtC,EAAA,KAAA,MAAWN,GAAAA,IAAOH,mBAAAA,CAAoB7K,WAAAA,CAAAA,EAAc;AAClD,IAAA,MAAMuL,QAAeD,eAAAA,EAAiBvQ,GAAAA,CAAIiQ,GAAAA,CAAAA,IAAQQ,eAAAA,CAAgBR,GAAAA,CAAAA,IAAQ,WAAA;AAC1E,IAAA,MAAMjB,KAAAA,GAAQiB,GAAAA;AACd,IAAA,IAAI,CAACK,UAAAA,CAAUI,YAAAA,CAAa1B,KAAAA,CAAAA,EAAQ;AAClCsB,MAAAA,UAAAA,CAAUK,SAAS3B,KAAAA,EAAO;QAAE4B,QAAAA,EAAUX;OAAmB,EAAG;AAAEO,QAAAA;OAAM,CAAA;AACtE,IAAA;AACF,EAAA;AACF;AAZgBH,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA;;;AC3GhB,SAASQ,oBAAAA,CACPjC,GAAAA,EACAkC,KAAAA,EACAC,QAAAA,EAAuB;AAEvB,EAAA,MAAMC,MAAAA,GAASF,KAAAA,CAAM9Q,GAAAA,CAAI4O,GAAAA,CAAAA;AACzB,EAAA,IAAIoC,WAAW9R,MAAAA,EAAW;AACxB,IAAA,OAAO8R,MAAAA;AACT,EAAA;AACA,EAAA,IAAID,QAAAA,CAASnB,GAAAA,CAAIhB,GAAAA,CAAAA,EAAM;AACrB,IAAA,OAAO,KAAA;AACT,EAAA;AACAmC,EAAAA,QAAAA,CAAStB,IAAIb,GAAAA,CAAAA;AAEb,EAAA,IAAIqC,OAAAA,GAAUR,eAAAA,CAAgB7B,GAAAA,CAAAA,KAAS,SAAA;AACvC,EAAA,IAAI,CAACqC,OAAAA,EAAS;AACZ,IAAA,KAAA,MAAWhB,GAAAA,IAAOhB,wBAAAA,CAAyBL,GAAAA,CAAAA,EAAM;AAC/C,MAAA,IAAIuB,mBAAmBF,GAAAA,CAAAA,IAAQY,qBAAqBZ,GAAAA,EAAKa,KAAAA,EAAOC,QAAAA,CAAAA,EAAW;AACzEE,QAAAA,OAAAA,GAAU,IAAA;AACV,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AAEAF,EAAAA,QAAAA,CAASG,OAAOtC,GAAAA,CAAAA;AAChBkC,EAAAA,KAAAA,CAAMzQ,GAAAA,CAAIuO,KAAKqC,OAAAA,CAAAA;AACf,EAAA,OAAOA,OAAAA;AACT;AA3BSJ,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA;AAmCF,SAASM,uBAAuBlM,WAAAA,EAAuB;AAC5D,EAAA,MAAMmM,YAAAA,uBAAmBjR,GAAAA,EAAAA;AACzB,EAAA,MAAMkR,MAAAA,uBAAalR,GAAAA,EAAAA;AAEnB,EAAA,MAAMmR,SAAAA,GAAY,IAAI/B,GAAAA,CAActK,WAAAA,CAAAA;AACpC,EAAA,KAAA,MAAWsM,OAAAA,IAAWzB,mBAAAA,CAAoB7K,WAAAA,CAAAA,EAAc;AACtDqM,IAAAA,SAAAA,CAAU7B,IAAI8B,OAAAA,CAAAA;AAChB,EAAA;AAEA,EAAA,KAAA,MAAW3C,OAAO0C,SAAAA,EAAW;AAC3B,IAAA,MAAML,UAAUJ,oBAAAA,CAAqBjC,GAAAA,EAAKwC,YAAAA,kBAAc,IAAI7B,KAAAA,CAAAA;AAC5D8B,IAAAA,MAAAA,CAAOhR,IAAIuO,GAAAA,EAAKqC,OAAAA,GAAU,SAAA,GAAYR,eAAAA,CAAgB7B,GAAAA,CAAAA,CAAAA;AACxD,EAAA;AACA,EAAA,OAAOyC,MAAAA;AACT;AAdgBF,MAAAA,CAAAA,sBAAAA,EAAAA,wBAAAA,CAAAA;AAiBT,SAASK,qBAAqBH,MAAAA,EAA4B;AAC/D,EAAA,MAAMhR,GAAAA,uBAAUkP,GAAAA,EAAAA;AAChB,EAAA,KAAA,MAAW,CAACX,GAAAA,EAAK4B,KAAAA,CAAAA,IAAUa,MAAAA,EAAQ;AACjC,IAAA,IAAIb,UAAU,SAAA,EAAW;AACvBnQ,MAAAA,GAAAA,CAAIoP,IAAIb,GAAAA,CAAAA;AACV,IAAA;AACF,EAAA;AACA,EAAA,OAAOvO,GAAAA;AACT;AARgBmR,MAAAA,CAAAA,oBAAAA,EAAAA,sBAAAA,CAAAA;AAoBT,SAASC,6BAAAA,CACdnB,YACAe,MAAAA,EAA4B;AAE5B,EAAA,KAAA,MAAW,CAACzC,GAAAA,EAAK4B,KAAAA,CAAAA,IAAUa,MAAAA,EAAQ;AACjC,IAAA,IAAIb,KAAAA,KAAU,SAAA,IAAa,CAACL,kBAAAA,CAAmBvB,GAAAA,CAAAA,EAAM;AACnD,MAAA;AACF,IAAA;AACA0B,IAAAA,UAAAA,CAAUK,SAAS/B,GAAAA,EAAc;MAAEgC,QAAAA,EAAUhC;KAAmB,EAAG;MAAE4B,KAAAA,EAAO;KAAU,CAAA;AACxF,EAAA;AACF;AAVgBiB,MAAAA,CAAAA,6BAAAA,EAAAA,+BAAAA,CAAAA;AAyBT,SAASC,iBAAAA,CACdzM,WAAAA,EACAqL,UAAAA,EACAqB,OAAAA,EAAgB;AAEhB,EAAA,MAAMN,MAAAA,GAASF,uBAAuBlM,WAAAA,CAAAA;AACtC,EAAA,MAAM2M,aAAAA,GAAgBJ,qBAAqBH,MAAAA,CAAAA;AAE3C,EAAA,IAAIM,OAAAA,EAAS;AACXtB,IAAAA,oBAAAA,CAAqBpL,WAAAA,EAAaqL,YAAWe,MAAAA,CAAAA;EAC/C,CAAA,MAAA,IAAWO,aAAAA,CAAcC,OAAO,CAAA,EAAG;AACjCJ,IAAAA,6BAAAA,CAA8BnB,YAAWe,MAAAA,CAAAA;AAC3C,EAAA;AAEA,EAAA,OAAOO,aAAAA;AACT;AAfgBF,MAAAA,CAAAA,iBAAAA,EAAAA,mBAAAA,CAAAA;;;AC1HhB,eAAsBI,mBAAmBvD,GAAAA,EAAqB;AAG5DA,EAAAA,GAAAA,CAAIqD,aAAAA,GAAgBF,kBAClBnD,GAAAA,CAAIC,iBAAAA,EACJD,IAAIwD,eAAAA,CAAgBzB,SAAAA,EACpB/B,GAAAA,CAAIwD,eAAAA,CAAgBJ,OAAO,CAAA;AAM7B,EAAA,MAAMK,KAAAA,uBAAY7R,GAAAA,EAAAA;AAClB,EAAA,KAAA,MAAWyO,GAAAA,IAAOL,IAAIC,iBAAAA,EAAmB;AACvCwD,IAAAA,KAAAA,CAAM3R,GAAAA,CAAIuO,GAAAA,EAAKK,wBAAAA,CAAyBL,GAAAA,CAAAA,CAAAA;AAC1C,EAAA;AACAL,EAAAA,GAAAA,CAAI0D,aAAAA,GAAgBD,KAAAA;AACtB;AAjBsBF,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA;;;ACDtB,eAAsBI,gBAAgB3D,GAAAA,EAAqB;AAEzD,EAAA,MAAMA,GAAAA,CAAIwD,eAAAA,CAAgBzB,SAAAA,CAAU6B,SAAAA,EAAS;AAC/C;AAHsBD,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;;;ACDtB,aAAA,EAAA;;;ACGA,aAAA,EAAA;AAWA,WAAA,EAAA;;;ACCA,SAASE,aAAAA,CAAcC,YAAiCvN,KAAAA,EAAc;AACpE,EAAA,IAAIuN,UAAAA,CAAWlO,WAAW,CAAA,EAAG;AAC3B,IAAA,OAAO,IAAA;AACT,EAAA;AACA,EAAA,OAAOkO,UAAAA,CAAWxP,IAAAA,CAChB,CAACyP,IAAAA,KAASxN,iBAAkBwN,IAAAA,CAAAA;AAEhC;AAPSF,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;AAoBT,eAAsBG,YAAAA,CACpBjF,OAAAA,EACAxI,KAAAA,EACAyJ,GAAAA,EACA+B,UAAAA,EAAoB;AAEpB,EAAA,KAAA,MAAWkC,UAAUlF,OAAAA,EAAS;AAC5B,IAAA,IAAI,CAAC8E,aAAAA,CAAc5E,aAAAA,CAAcgF,MAAAA,CAAAA,EAAS1N,KAAAA,CAAAA,EAAQ;AAChD,MAAA;AACF,IAAA;AAEA,IAAA,MAAM2N,QAAAA,GAAWnC,UAAAA,CAAUtK,OAAAA,CAAQwM,MAAAA,CAAAA;AACnC,IAAA,MAAMC,QAAAA,CAASC,KAAAA,CAAM5N,KAAAA,EAAOyJ,GAAAA,CAAAA;AAC5B,IAAA,OAAO,IAAA;AACT,EAAA;AAEA,EAAA,OAAO,KAAA;AACT;AAjBsBgE,MAAAA,CAAAA,YAAAA,EAAAA,cAAAA,CAAAA;AA0Bf,SAASI,eAAAA,CACdC,OAAAA,EACAtF,OAAAA,EACAgD,UAAAA,EAAoB;AAEpB,EAAA,OAAO,OAAO/B,KAAcsE,IAAAA,KAAAA;AAC1B,IAAA,IAAI;AACF,MAAA,MAAMD,OAAAA,CAAQrE,KAAKsE,IAAAA,CAAAA;AACrB,IAAA,CAAA,CAAA,OAAS/N,KAAAA,EAAO;AACd,MAAA,MAAMgO,UAAU,MAAMP,YAAAA,CAAajF,OAAAA,EAASxI,KAAAA,EAAOyJ,KAAK+B,UAAAA,CAAAA;AACxD,MAAA,IAAI,CAACwC,OAAAA,EAAS;AACZ,QAAA,MAAMhO,KAAAA;AACR,MAAA;AACF,IAAA;AACF,EAAA,CAAA;AACF;AAfgB6N,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;;;ACxDhB,WAAA,EAAA;AA4BA,eAAsBI,aAAAA,CACpBvG,MAAAA,EACA+B,GAAAA,EACA+B,UAAAA,EACA0C,iBACAC,WAAAA,EAAmB;AAEnB,EAAA,MAAMC,YAAAA,GAA6B;AACjCpW,IAAAA,MAAAA,EAAQyR,GAAAA,CAAIzR,MAAAA;AACZyF,IAAAA,IAAAA,EAAMgM,GAAAA,CAAIhM,IAAAA;AACVxC,IAAAA,MAAAA,EAAQwO,GAAAA,CAAIxO,MAAAA;AACZoT,IAAAA,KAAAA,EAAO5E,GAAAA,CAAI4E,KAAAA;AACX7J,IAAAA,OAAAA,EAASiF,GAAAA,CAAIjF,OAAAA;AACb8J,IAAAA,IAAAA,EAAM7E,GAAAA,CAAI6E,IAAAA;AACVC,IAAAA,KAAAA,EAAO9E,GAAAA,CAAI8E,KAAAA;AACXrT,IAAAA,GAAAA,kBAAK,MAAA,CAAA,CAAC0B,IAAAA,KAAiB6M,GAAAA,CAAIvO,GAAAA,CAAI0B,IAAAA,CAAAA,EAA1B,KAAA;AACP,GAAA;AAEA,EAAA,KAAA,IAAS8N,CAAAA,GAAI,CAAA,EAAGA,CAAAA,GAAIhD,MAAAA,CAAOrI,QAAQqL,CAAAA,EAAAA,EAAK;AACtC,IAAA,MAAMrS,KAAAA,GAAQqP,OAAOgD,CAAAA,CAAAA;AACrB,IAAA,IAAI/M,SAAAA;AACJ,IAAA,IAAI0E,MAAAA;AAIJ,IAAA,IAAIjK,YAAAA,CAAaC,KAAAA,CAAAA,EAAQ;AAEvBsF,MAAAA,SAAAA,GAAYtF,KAAAA,CAAMuE,IAAAA,IAAQ,CAAA,WAAA,EAAc8N,CAAAA,CAAAA,CAAAA,CAAAA;AACxC,MAAA,MAAM8D,aAAAA,GAAgBhD,UAAAA,CAAUtK,OAAAA,CAAQ7I,KAAAA,CAAAA;AACxCgK,MAAAA,MAAAA,GAAS,MAAMmM,aAAAA,CAAchW,WAAAA,CAAY4V,YAAAA,CAAAA;IAC3C,CAAA,MAAO;AAELzQ,MAAAA,SAAAA,GAAYtF,KAAAA,CAAMuE,IAAAA,IAAQ,CAAA,MAAA,EAAS8N,CAAAA,CAAAA,CAAAA,CAAAA;AACnCrI,MAAAA,MAAAA,GAAS,MAAMhK,MAAM+V,YAAAA,CAAAA;AACvB,IAAA;AAEA,IAAA,IAAI,CAAC/L,MAAAA,EAAQ;AACX,MAAA,MAAM,IAAI/F,oBAAoBqB,SAAAA,CAAAA;AAChC,IAAA;AACF,EAAA;AACF;AAxCsBsQ,MAAAA,CAAAA,aAAAA,EAAAA,eAAAA,CAAAA;;;ACTtB,eAAsBQ,eAAAA,CACpBxF,YAAAA,EACAQ,GAAAA,EACA+B,UAAAA,EACAkD,YAAAA,EAAoC;AAKpC,EAAA,IAAIX,IAAAA,GAAOW,YAAAA;AAEX,EAAA,KAAA,IAAShE,IAAIzB,YAAAA,CAAa5J,MAAAA,GAAS,CAAA,EAAGqL,CAAAA,IAAK,GAAGA,CAAAA,EAAAA,EAAK;AACjD,IAAA,MAAMiE,gBAAAA,GAAmB1F,aAAayB,CAAAA,CAAAA;AACtC,IAAA,MAAMkE,UAAAA,GAAab,IAAAA;AACnBA,IAAAA,IAAAA,mBAAO,MAAA,CAAA,MAAA;AACL,MAAA,MAAMJ,QAAAA,GAAWnC,UAAAA,CAAUtK,OAAAA,CAAQyN,gBAAAA,CAAAA;AACnC,MAAA,OAAOhB,QAAAA,CAASkB,SAAAA,CAAUpF,GAAAA,EAAKmF,UAAAA,CAAAA;IACjC,CAAA,EAHO,MAAA,CAAA;AAIT,EAAA;AAEA,EAAA,OAAOb,IAAAA,EAAAA;AACT;AArBsBU,MAAAA,CAAAA,eAAAA,EAAAA,iBAAAA,CAAAA;;;ACpBtB,WAAA,EAAA;AAMA,eAAsBK,yBAAAA,CACpBrF,GAAAA,EACAsF,cAAAA,EACA9R,cAAAA,EACAlC,UAAAA,EAAkB;AAElB,EAAA,IAAIgU,cAAAA,CAAe1P,WAAW,CAAA,EAAG;AAC/B,IAAA,OAAO,EAAA;AACT,EAAA;AAEA,EAAA,MAAM2P,QAAAA,GACJD,eAAe1P,MAAAA,GAAS,CAAA,GAAI0P,eAAeA,cAAAA,CAAe1P,MAAAA,GAAS,CAAA,CAAA,CAAIuC,KAAAA,GAAQ,EAAA;AACjF,EAAA,MAAMqN,OAAkB,IAAIxN,KAAAA,CAAMuN,WAAW,CAAA,CAAA,CAAGE,KAAK9U,MAAAA,CAAAA;AAErD,EAAA,KAAA,MAAW+U,SAASJ,cAAAA,EAAgB;AAClC,IAAA,IAAI;AAEF,MAAA,MAAMtV,KAAAA,GAAQ,MAAM2V,qBAAAA,CAAsB3F,GAAAA,EAAK0F,KAAAA,CAAAA;AAE/C,MAAA,IAAI1V,UAAUW,KAAAA,CAAAA,EAAW;AACvB,QAAA,IAAI+U,KAAAA,CAAM9I,QAAAA,IAAY8I,KAAAA,CAAM7I,YAAAA,KAAiBlM,KAAAA,CAAAA,EAAW;AACtD,UAAA,MAAMiV,2BAAAA,CACJpS,cAAAA,EACAlC,UAAAA,EACAoU,KAAAA,CAAMvS,IAAAA,IAAQ,SAASuS,KAAAA,CAAMvN,KAAK,CAAA,CAAA,EAClCuN,KAAAA,CAAMhX,MAAM,CAAA;AAEhB,QAAA;AACA8W,QAAAA,IAAAA,CAAKE,KAAAA,CAAMvN,KAAK,CAAA,GAAIuN,KAAAA,CAAM7I,YAAAA;MAC5B,CAAA,MAAO;AAEL2I,QAAAA,IAAAA,CAAKE,KAAAA,CAAMvN,KAAK,CAAA,GAAIuN,KAAAA,CAAM5I,YAAY,MAAM4I,KAAAA,CAAM5I,SAAAA,CAAU9M,KAAAA,CAAAA,GAASA,KAAAA;AACvE,MAAA;AACF,IAAA,CAAA,CAAA,OAASuG,KAAAA,EAAO;AACd,MAAA,IAAIA,iBAAiB5D,qBAAAA,EAAuB;AAC1C,QAAA,MAAM4D,KAAAA;AACR,MAAA;AACA,MAAA,MAAM,IAAI7D,uBAAAA,CACRc,cAAAA,EACAlC,UAAAA,EACAoU,KAAAA,CAAMvN,KAAAA,EACN5B,KAAAA,YAAiBgB,KAAAA,GAAQhB,KAAAA,CAAMvD,OAAAA,GAAUtB,MAAAA,CAAO6E,KAAAA,CAAAA,CAAAA;AAEpD,IAAA;AACF,EAAA;AAEA,EAAA,OAAOiP,IAAAA;AACT;AA/CsBH,MAAAA,CAAAA,yBAAAA,EAAAA,2BAAAA,CAAAA;AAiEtB,SAASO,2BAAAA,CACPpS,cAAAA,EACAlC,UAAAA,EACAuC,SAAAA,EACAnF,MAAAA,EAAc;AAEd,EAAA,MAAMoF,eAAAA,GACJpF,MAAAA,KAAW,MAAA,GACP,CAAA,yBAAA,EAA4BmF,SAAAA,CAAAA,iKAAAA,CAAAA,GAG5BlD,MAAAA;AAEN,EAAA,OAAO,IAAIgC,qBAAAA,CAAsBa,cAAAA,EAAgBlC,UAAAA,EAAYuC,SAAAA,EAAWnF,QAAQoF,eAAAA,CAAAA;AAClF;AAdS8R,MAAAA,CAAAA,2BAAAA,EAAAA,6BAAAA,CAAAA;AAmBF,SAASD,qBAAAA,CAAsB3F,KAAc0F,KAAAA,EAAoB;AACtE,EAAA,QAAQA,MAAMhX,MAAAA;IACZ,KAAK,MAAA;AACH,MAAA,IAAIgX,MAAMvS,IAAAA,EAAM;AACd,QAAA,OAAQ6M,GAAAA,CAAI6E,IAAAA,GAAmCa,KAAAA,CAAMvS,IAAI,CAAA;AAC3D,MAAA;AACA,MAAA,OAAO6M,GAAAA,CAAI6E,IAAAA;IAEb,KAAK,OAAA;AACH,MAAA,IAAIa,MAAMvS,IAAAA,EAAM;AACd,QAAA,OAAO6M,GAAAA,CAAIxO,MAAAA,CAAOkU,KAAAA,CAAMvS,IAAI,CAAA;AAC9B,MAAA;AACA,MAAA,OAAO6M,GAAAA,CAAIxO,MAAAA;IAEb,KAAK,OAAA;AACH,MAAA,IAAIkU,MAAMvS,IAAAA,EAAM;AACd,QAAA,OAAO6M,GAAAA,CAAI4E,KAAAA,CAAMc,KAAAA,CAAMvS,IAAI,CAAA;AAC7B,MAAA;AACA,MAAA,OAAO6M,GAAAA,CAAI4E,KAAAA;IAEb,KAAK,QAAA;AACH,MAAA,IAAIc,MAAMvS,IAAAA,EAAM;AACd,QAAA,OAAO6M,GAAAA,CAAIvO,GAAAA,CAAIiU,KAAAA,CAAMvS,IAAI,CAAA;AAC3B,MAAA;AACA,MAAA,OAAO6M,GAAAA,CAAIjF,OAAAA;IAEb,KAAK,KAAA;AACH,MAAA,OAAOiF,GAAAA;IAET,KAAK,KAAA;AACH,MAAA,OAAOA,IAAI6F,GAAAA,CAAIC,GAAAA;IAEjB,KAAK,KAAA;AACH,MAAA,OAAO9F,IAAI6F,GAAAA,CAAIE,GAAAA;IAEjB,KAAK,QAAA;AACH,MAAA,IAAIL,MAAM3H,eAAAA,EAAiB;AACzB,QAAA,OAAO2H,KAAAA,CAAM3H,gBAAgBiC,GAAAA,CAAAA;AAC/B,MAAA;AACA,MAAA,OAAOrP,MAAAA;AAET,IAAA;AACE,MAAA,OAAOA,MAAAA;AACX;AACF;AA5CgBgV,MAAAA,CAAAA,qBAAAA,EAAAA,uBAAAA,CAAAA;;;AJ/DhB,SAASK,wBAAAA,CACPC,eAAAA,EACAlE,UAAAA,EACAmE,aAAAA,EAAqC;AAErC,EAAA,OAAO,MAAA;AACL,IAAA,IAAI,CAACA,aAAAA,CAAc7E,GAAAA,CAAI4E,eAAAA,CAAAA,EAAkB;AACvC,MAAA,IAAI;AACFC,QAAAA,aAAAA,CAAcpU,GAAAA,CAAImU,eAAAA,EAAiBlE,UAAAA,CAAUtK,OAAAA,CAAQwO,eAAAA,CAAAA,CAAAA;AACvD,MAAA,CAAA,CAAA,OAAS1P,KAAAA,EAAO;AACd,QAAA,MAAM,IAAI9D,yBAAAA,CACRwT,eAAAA,CAAgB9S,MAChBoD,KAAAA,YAAiBgB,KAAAA,GAAQhB,QAAQ5F,MAAAA,CAAAA;AAErC,MAAA;AACF,IAAA;AACA,IAAA,OAAOuV,aAAAA,CAAczU,IAAIwU,eAAAA,CAAAA;AAC3B,EAAA,CAAA;AACF;AAlBSD,MAAAA,CAAAA,wBAAAA,EAAAA,0BAAAA,CAAAA;AA4BT,SAASG,uBAAAA,CACPF,iBACAlE,UAAAA,EAAoB;AAEpB,EAAA,OAAO,MAAA;AACL,IAAA,IAAI;AACF,MAAA,OAAOA,UAAAA,CAAUqE,WAAAA,EAAW,CAAG3O,OAAAA,CAAQwO,eAAAA,CAAAA;AACzC,IAAA,CAAA,CAAA,OAAS1P,KAAAA,EAAO;AACd,MAAA,MAAM,IAAI9D,yBAAAA,CACRwT,eAAAA,CAAgB9S,MAChBoD,KAAAA,YAAiBgB,KAAAA,GAAQhB,QAAQ5F,MAAAA,CAAAA;AAErC,IAAA;AACF,EAAA,CAAA;AACF;AAdSwV,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;AA6BF,SAASE,mBACdJ,eAAAA,EACAK,KAAAA,EACAvE,UAAAA,EACAmE,aAAAA,EACAK,kBAAkB,KAAA,EAAK;AAEvB,EAAA,MAAMjV,UAAAA,GAAaI,MAAAA,CAAO4U,KAAAA,CAAMhV,UAAU,CAAA;AAC1C,EAAA,MAAMkV,aAAAA,GAAgBnV,gBAAAA,CAAiB4U,eAAAA,EAAiB3U,UAAAA,CAAAA;AACxD,EAAA,MAAM2M,MAAAA,GAASO,YAAAA,CAAayH,eAAAA,EAAiB3U,UAAAA,CAAAA;AAC7C,EAAA,MAAMyN,OAAAA,GAAUK,aAAAA,CAAc6G,eAAAA,EAAiB3U,UAAAA,CAAAA;AAC/C,EAAA,MAAMkO,YAAAA,GAAeI,kBAAAA,CAAmBqG,eAAAA,EAAiB3U,UAAAA,CAAAA;AAGzD,EAAA,MAAMmV,YAAAA,GACJD,aAAAA,CAAc5Q,MAAAA,GAAS,CAAA,GAAI;AAAI4Q,IAAAA,GAAAA;IAAeE,IAAAA,CAAK,CAACC,GAAGC,CAAAA,KAAMD,CAAAA,CAAExO,QAAQyO,CAAAA,CAAEzO,KAAK,IAAI,EAAA;AAEpF,EAAA,MAAMqC,aAAa8L,KAAAA,CAAM9L,UAAAA;AAEzB,EAAA,MAAMqM,QAAAA,GAAWzU,WAAAA,CAAY6T,eAAAA,EAAiB3U,UAAAA,CAAAA;AAC9C,EAAA,MAAMwV,sBAAsBD,QAAAA,IAAYrM,UAAAA;AACxC,EAAA,MAAMuM,eAAAA,GAAkB9U,kBAAAA,CAAmBgU,eAAAA,EAAiB3U,UAAAA,CAAAA;AAC5D,EAAA,MAAM0V,YAAAA,GAAe7U,mBAAAA,CAAoB8T,eAAAA,EAAiB3U,UAAAA,CAAAA;AAG1D,EAAA,MAAM2V,yBAAAA,GAA4BV,kBAC9BJ,uBAAAA,CAAwBF,eAAAA,EAAiBlE,UAAAA,CAAAA,GACzCiE,wBAAAA,CAAyBC,eAAAA,EAAiBlE,UAAAA,EAAWmE,aAAAA,CAAAA;AAEzD,EAAA,MAAM7B,OAAAA,iCAA+BrE,GAAAA,KAAAA;AAEnC,IAAA,IAAI/B,MAAAA,CAAOrI,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM4O,cAAcvG,MAAAA,EAAQ+B,GAAAA,EAAK+B,UAAAA,EAAWkE,eAAAA,CAAgB9S,IAAM7B,CAAAA;AACpE,IAAA;AAEA,IAAA,MAAM4V,qBAAqBD,yBAAAA,EAAAA;AAC3B,IAAA,MAAMzB,OAAO,MAAMH,yBAAAA,CACjBrF,KACAyG,YAAAA,EACAR,eAAAA,CAAgB9S,MAChB7B,UAAAA,CAAAA;AAGF,IAAA,MAAM/C,MAAAA,GAAU2Y,mBAA+C5V,UAAAA,CAAAA;AAE/D,IAAA,IAAI,OAAO/C,WAAW,UAAA,EAAY;AAChC,MAAA,MAAM,IAAIgJ,KAAAA,CAAM,CAAA,QAAA,EAAWjG,UAAAA,CAAAA,2BAAAA,EAAwC2U,eAAAA,CAAgB9S,IAAI,CAAA,CAAA,CAAG,CAAA;AAC5F,IAAA;AAKA,IAAA,MAAM8R,YAAAA,gCACJzM,OAAAA,CAAQf,OAAAA,CAAQlJ,OAAO4Y,KAAAA,CAAMD,kBAAAA,EAAoB1B,IAAAA,CAAAA,CAAAA,EAD9B,cAAA,CAAA;AAErB,IAAA,MAAM5M,MAAAA,GACJ4G,YAAAA,CAAa5J,MAAAA,GAAS,CAAA,GAClB,MAAMoP,eAAAA,CAAgBxF,YAAAA,EAAcQ,GAAAA,EAAK+B,UAAAA,EAAWkD,YAAAA,CAAAA,GACpD,MAAMA,YAAAA,EAAAA;AAGZ,IAAA,KAAA,MAAWmC,UAAUL,eAAAA,EAAiB;AACpC/G,MAAAA,GAAAA,CAAIlO,GAAAA,CAAIsV,MAAAA,CAAOjU,IAAAA,EAAMiU,MAAAA,CAAOpX,KAAK,CAAA;AACnC,IAAA;AAGA,IAAA,IAAI8W,wBAAwBnW,MAAAA,EAAW;AACrCqP,MAAAA,GAAAA,CAAIqH,MAAAA,GAASP,mBAAAA;AACf,IAAA;AAGA,IAAA,IAAIE,YAAAA,IAAgB,CAAChH,GAAAA,CAAIsH,SAAAA,EAAW;AAClC,MAAA,IAAIC,cAAcP,YAAAA,CAAa/L,GAAAA;AAC/B,MAAA,IAAIuM,iBAAiBR,YAAAA,CAAaxM,UAAAA;AAGlC,MAAA,IAAI,OAAO5B,WAAW,QAAA,EAAU;AAC9B2O,QAAAA,WAAAA,GAAc3O,MAAAA;AAChB,MAAA,CAAA,MAAA,IAAWA,MAAAA,IAAU,OAAOA,MAAAA,KAAW,QAAA,IAAY,SAASA,MAAAA,EAAQ;AAClE,QAAA,MAAM6O,QAAAA,GAAW7O,MAAAA;AACjB,QAAA,IAAI6O,QAAAA,CAASxM,GAAAA,EAAKsM,WAAAA,GAAcE,QAAAA,CAASxM,GAAAA;AACzC,QAAA,IAAIwM,QAAAA,CAASjN,UAAAA,EAAYgN,cAAAA,GAAiBC,QAAAA,CAASjN,UAAAA;AACrD,MAAA;AAEAwF,MAAAA,GAAAA,CAAIqH,MAAAA,GAASG,cAAAA;AACbxH,MAAAA,GAAAA,CAAIlO,GAAAA,CAAI,YAAYyV,WAAAA,CAAAA;AACpBvH,MAAAA,GAAAA,CAAI0H,KAAK,EAAA,CAAA;AACT,MAAA;AACF,IAAA;AAGA,IAAA,IAAI9O,MAAAA,KAAWjI,MAAAA,IAAa,CAACqP,GAAAA,CAAIsH,SAAAA,EAAW;AAC1C,MAAA,IAAI,OAAO1O,WAAW,QAAA,EAAU;AAC9BoH,QAAAA,GAAAA,CAAI2H,KAAK/O,MAAAA,CAAAA;MACX,CAAA,MAAO;AACLoH,QAAAA,GAAAA,CAAI0H,IAAAA,CAAKhW,MAAAA,CAAOkH,MAAAA,CAAAA,CAAAA;AAClB,MAAA;AACF,IAAA;EACF,CAAA,EApE8B,SAAA,CAAA;AAyE9B,EAAA,OAAOmG,QAAQnJ,MAAAA,GAAS,CAAA,GAAIwO,gBAAgBC,OAAAA,EAAStF,OAAAA,EAASgD,UAAAA,CAAAA,GAAasC,OAAAA;AAC7E;AAvGgBgC,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA;;;AKrEhB,SAASuB,qBAAAA,CAAsBC,MAAuB9F,UAAAA,EAAoB;AACxE,EAAA,OAAO8F,IAAAA,CAAK3V,GAAAA,CAAI,CAAC4V,GAAAA,KAAAA;AACf,IAAA,IAAI,OAAOA,QAAQ,UAAA,EAAY;AAC7B,MAAA,OAAOA,GAAAA;AACT,IAAA;AAGA,IAAA,MAAMC,QAAAA,GAAWhG,UAAAA,CAAUtK,OAAAA,CAAoBqQ,GAAAA,CAAAA;AAE/C,IAAA,IAAI,OAAOC,aAAa,UAAA,EAAY;AAClC,MAAA,MAAM,IAAIxQ,KAAAA,CACR,CAAA,kBAAA,EAAqB7F,MAAAA,CAAOoW,GAAAA,CAAAA,CAAAA,iGAAAA,CAC1B,CAAA;AAEN,IAAA;AAEA,IAAA,OAAOC,QAAAA;EACT,CAAA,CAAA;AACF;AAlBSH,MAAAA,CAAAA,qBAAAA,EAAAA,uBAAAA,CAAAA;AA4BF,SAASI,WAAAA,CACdC,UAAAA,EACAlG,UAAAA,EACAmG,YAAAA,EACAC,gBAAAA,EACAjC,gCAAwC,IAAItU,GAAAA,EAAAA,EAC5C2U,eAAAA,GAAkB,KAAA,EAAK;AAEvB,EAAA,MAAMnV,SAAuB,EAAA;AAC7B,EAAA,MAAM,EAAEf,MAAAA,EAAQ2B,UAAAA,EAAYZ,MAAAA,EAAQgX,eAAa,GAAKH,UAAAA;AAEtD,EAAA,KAAA,MAAW3B,SAAS8B,aAAAA,EAAe;AACjC,IAAA,MAAMC,UAAUhC,kBAAAA,CAAmBhW,MAAAA,EAAQiW,KAAAA,EAAOvE,UAAAA,EAAWmE,eAAeK,eAAAA,CAAAA;AAC5E,IAAA,MAAM9Q,QAAAA,GAAW6S,mBACfJ,YAAAA,EACAlW,UAAAA,CAAWgC,MACXsS,KAAAA,CAAMtS,IAAAA,EACNhC,WAAWuH,OAAO,CAAA;AAGpB,IAAA,MAAMgP,kBAAAA,GAAmC;AACpCJ,MAAAA,GAAAA,gBAAAA;AACAP,MAAAA,GAAAA,qBAAAA,CAAsB5V,UAAAA,CAAWwH,UAAAA,IAAc,EAAA,EAAIuI,UAAAA,CAAAA;AACnD6F,MAAAA,GAAAA,qBAAAA,CAAsBtB,KAAAA,CAAM9M,UAAAA,IAAc,EAAA,EAAIuI,UAAAA;;AAGnD3Q,IAAAA,MAAAA,CAAO8E,IAAAA,CAAK;AACV3H,MAAAA,MAAAA,EAAQ+X,KAAAA,CAAM/X,MAAAA;MACdyF,IAAAA,EAAMyB,QAAAA;AACN4S,MAAAA,OAAAA;MACA7O,UAAAA,EAAY+O,kBAAAA;MACZvW,UAAAA,EAAY3B,MAAAA;MACZiB,UAAAA,EAAYI,MAAAA,CAAO4U,MAAMhV,UAAU,CAAA;MACnCgI,QAAAA,EAAUkP,uBAAAA,CAAwBxW,YAAYsU,KAAAA;KAChD,CAAA;AACF,EAAA;AAEA,EAAA,OAAOlV,MAAAA;AACT;AAtCgB4W,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;AA+ChB,SAASQ,uBAAAA,CACPxW,YACAsU,KAAAA,EAA8B;AAE9B,EAAA,MAAMmC,eAIF,EAAC;AAEL,EAAA,IAAInC,MAAM9K,WAAAA,EAAa;AACrBiN,IAAAA,YAAAA,CAAajN,cAAc8K,KAAAA,CAAM9K,WAAAA;AACnC,EAAA;AACA,EAAA,IAAI8K,MAAM7K,UAAAA,EAAY;AACpBgN,IAAAA,YAAAA,CAAahN,UAAAA,GAAa,IAAA;AAC5B,EAAA;AACA,EAAA,IAAIzJ,UAAAA,CAAWyH,IAAAA,IAAQzH,UAAAA,CAAWyH,IAAAA,CAAK7D,SAAS,CAAA,EAAG;AACjD6S,IAAAA,YAAAA,CAAahP,IAAAA,GAAO;SAAIzH,UAAAA,CAAWyH;;AACrC,EAAA;AAEA,EAAA,OAAOxC,OAAOC,IAAAA,CAAKuR,YAAAA,CAAAA,CAAc7S,MAAAA,GAAS,IAAI6S,YAAAA,GAAe9X,MAAAA;AAC/D;AArBS6X,MAAAA,CAAAA,uBAAAA,EAAAA,yBAAAA,CAAAA;AA0BT,SAASF,kBAAAA,CACPJ,YAAAA,EACAQ,cAAAA,EACAC,SAAAA,EACApP,OAAAA,EAAgB;AAEhB,EAAA,MAAMqP,QAAkB,EAAA;AAExB,EAAA,IAAIV,YAAAA,IAAgBA,iBAAiB,GAAA,EAAK;AACxCU,IAAAA,KAAAA,CAAM1S,KAAKgS,YAAAA,CAAalS,UAAAA,CAAW,GAAA,CAAA,GAAOkS,YAAAA,GAAe,MAAMA,YAAAA,CAAAA;AACjE,EAAA;AAEA,EAAA,IAAI3O,OAAAA,EAAS;AACXqP,IAAAA,KAAAA,CAAM1S,IAAAA,CAAK,MAAMqD,OAAAA,CAAAA;AACnB,EAAA;AAEA,EAAA,IAAImP,cAAAA,IAAkBA,mBAAmB,GAAA,EAAK;AAC5CE,IAAAA,KAAAA,CAAM1S,KAAKwS,cAAAA,CAAe1S,UAAAA,CAAW,GAAA,CAAA,GAAO0S,cAAAA,GAAiB,MAAMA,cAAAA,CAAAA;AACrE,EAAA;AAEA,EAAA,IAAIC,SAAAA,IAAaA,cAAc,GAAA,EAAK;AAClCC,IAAAA,KAAAA,CAAM1S,KAAKyS,SAAAA,CAAU3S,UAAAA,CAAW,GAAA,CAAA,GAAO2S,SAAAA,GAAY,MAAMA,SAAAA,CAAAA;AAC3D,EAAA;AAEA,EAAA,MAAMlT,QAAAA,GAAWmT,KAAAA,CAAMlT,IAAAA,CAAK,EAAA,CAAA,IAAO,GAAA;AAEnC,EAAA,OAAOD,QAAAA,CAAShB,OAAAA,CAAQ,MAAA,EAAQ,GAAA,CAAA;AAClC;AA3BS6T,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA;;;ANpHT,WAAA,EAAA;AAMO,IAAMO,qBAAN,MAAMA;EAhBb;;;AAiBmBnS,EAAAA,WAAAA,uBAAuD9E,GAAAA,EAAAA;AACvDmQ,EAAAA,SAAAA;AACAmG,EAAAA,YAAAA;AACAC,EAAAA,gBAAAA;AACA1R,EAAAA,KAAAA;;;;;;;AAQAwM,EAAAA,oBAAAA;;;;;;;;;;;;AAaAiD,EAAAA,aAAAA,uBAA4CtU,GAAAA,EAAAA;AAE7D,EAAA,WAAA,CACEmQ,YACAmG,YAAAA,EACAC,gBAAAA,EACA1R,OACAwM,qBAAAA,mBAA8C,IAAIjC,KAAAA,EAClD;AACA,IAAA,IAAA,CAAKe,SAAAA,GAAYA,UAAAA;AACjB,IAAA,IAAA,CAAKmG,YAAAA,GAAeA,YAAAA;AACpB,IAAA,IAAA,CAAKC,gBAAAA,GAAmBA,gBAAAA;AACxB,IAAA,IAAA,CAAK1R,KAAAA,GAAQA,KAAAA;AACb,IAAA,IAAA,CAAKwM,oBAAAA,GAAuBA,qBAAAA;AAC9B,EAAA;;;;AAKAb,EAAAA,QAAAA,CAAS6D,eAAAA,EAAiD;AACxD,IAAA,IAAI,IAAA,CAAKvP,WAAAA,CAAY2K,GAAAA,CAAI4E,eAAAA,CAAAA,EAAkB;AACzC,MAAA,OAAO,IAAA,CAAKvP,WAAAA,CAAYjF,GAAAA,CAAIwU,eAAAA,CAAAA;AAC9B,IAAA;AAEA,IAAA,IAAI,CAAClV,YAAAA,CAAakV,eAAAA,CAAAA,EAAkB;AAClC,MAAA,MAAM,IAAI3T,mBAAAA,CAAoB2T,eAAAA,CAAgB9S,IAAI,CAAA;AACpD,IAAA;AAEA,IAAA,MAAM8U,UAAAA,GAAalW,wBAAwBkU,eAAAA,CAAAA;AAE3C,IAAA,IAAI,CAACgC,UAAAA,EAAY;AACf,MAAA,MAAM,IAAI3V,mBAAAA,CAAoB2T,eAAAA,CAAgB9S,IAAI,CAAA;AACpD,IAAA;AAEA,IAAA,IAAI8U,UAAAA,CAAW7W,MAAAA,CAAOwE,MAAAA,KAAW,CAAA,EAAG;AAClC,MAAA,MAAM,IAAIrD,aAAAA,CAAc0T,eAAAA,CAAgB9S,IAAI,CAAA;AAC9C,IAAA;AAEA,IAAA,IAAA,CAAK2V,oBAAoB7C,eAAAA,CAAAA;AAEzB,IAAA,MAAM7U,MAAAA,GAAS4W,WAAAA,CACbC,UAAAA,EACA,IAAA,CAAKlG,WACL,IAAA,CAAKmG,YAAAA,EACL,IAAA,CAAKC,gBAAAA,EACL,KAAKjC,aAAAA,EACL,IAAA,CAAKjD,oBAAAA,CAAqB5B,GAAAA,CAAI4E,eAAAA,CAAAA,CAAAA;AAGhC,IAAA,MAAM8C,UAAAA,GAAmC;MACvC1Y,MAAAA,EAAQ4V,eAAAA;AACRgC,MAAAA,UAAAA;AACA7W,MAAAA;AACF,KAAA;AAEA,IAAA,IAAA,CAAKsF,WAAAA,CAAY5E,GAAAA,CAAImU,eAAAA,EAAiB8C,UAAAA,CAAAA;AAEtC,IAAA,IAAI,KAAKtS,KAAAA,EAAO;AACd,MAAA,IAAA,CAAKuS,gBAAgBD,UAAAA,CAAAA;AACvB,IAAA;AAEA,IAAA,OAAOA,UAAAA;AACT,EAAA;;;;;;;;AASA,EAAA,IAAIE,SAAAA,GAAoC;AACtC,IAAA,OAAO,IAAA,CAAK/C,aAAAA;AACd,EAAA;;;;AAKAgD,EAAAA,WAAAA,CAAYxS,WAAAA,EAAiD;AAC3D,IAAA,OAAOA,YAAYxE,GAAAA,CAAI,CAACiX,MAAM,IAAA,CAAK/G,QAAAA,CAAS+G,CAAAA,CAAAA,CAAAA;AAC9C,EAAA;;;;EAKAC,MAAAA,GAAiC;AAC/B,IAAA,OAAOpR,KAAAA,CAAMU,IAAAA,CAAK,IAAA,CAAKhC,WAAAA,CAAY2S,QAAM,CAAA;AAC3C,EAAA;;;;EAKAC,YAAAA,GAA6B;AAC3B,IAAA,MAAMlY,SAAuB,EAAA;AAE7B,IAAA,KAAA,MAAWY,UAAAA,IAAc,IAAA,CAAK0E,WAAAA,CAAY2S,MAAAA,EAAM,EAAI;AAClDjY,MAAAA,MAAAA,CAAO8E,IAAAA,CAAI,GAAIlE,UAAAA,CAAWZ,MAAM,CAAA;AAClC,IAAA;AAEA,IAAA,OAAOA,MAAAA;AACT,EAAA;;;;AAKA,EAAA,IAAImY,UAAAA,GAAqB;AACvB,IAAA,IAAIC,KAAAA,GAAQ,CAAA;AAEZ,IAAA,KAAA,MAAWxX,UAAAA,IAAc,IAAA,CAAK0E,WAAAA,CAAY2S,MAAAA,EAAM,EAAI;AAClDG,MAAAA,KAAAA,IAASxX,WAAWZ,MAAAA,CAAOwE,MAAAA;AAC7B,IAAA;AAEA,IAAA,OAAO4T,KAAAA;AACT,EAAA;;;;AAKAnI,EAAAA,GAAAA,CAAI4E,eAAAA,EAAoC;AACtC,IAAA,OAAO,IAAA,CAAKvP,WAAAA,CAAY2K,GAAAA,CAAI4E,eAAAA,CAAAA;AAC9B,EAAA;;;;EAKAwD,KAAAA,GAAc;AACZ,IAAA,IAAA,CAAK/S,YAAY+S,KAAAA,EAAK;AACxB,EAAA;;;;;;;AAQQX,EAAAA,mBAAAA,CAAoB7C,eAAAA,EAAiC;AAC3D,IAAA,MAAMxF,KAAAA,GAAQwF,eAAAA;AAEd,IAAA,IAAI,CAAC,IAAA,CAAKlE,SAAAA,CAAUI,YAAAA,CAAa1B,KAAAA,CAAAA,EAAQ;AACvC,MAAA,MAAMwB,QAAQ,IAAA,CAAKgB,oBAAAA,CAAqB5B,GAAAA,CAAI4E,eAAAA,IAAmB,SAAA,GAAY,WAAA;AAC3E,MAAA,IAAA,CAAKlE,SAAAA,CAAUK,SAAS3B,KAAAA,EAAO;QAAE4B,QAAAA,EAAU5B;OAAM,EAAG;AAAEwB,QAAAA;OAAM,CAAA;AAC9D,IAAA;AACF,EAAA;;;;AAKQ+G,EAAAA,eAAAA,CAAgBD,UAAAA,EAAwC;AAC9D,IAAA,MAAM,EAAE1Y,MAAAA,EAAQe,MAAAA,EAAM,GAAK2X,UAAAA;AAE3B3R,IAAAA,OAAAA,CAAQC,MAAAA,CAAOC,KAAAA,CAAM,CAAA,0BAAA,EAA6BjH,MAAAA,CAAO8C,IAAI;AAAI,CAAA,CAAA;AAEjE,IAAA,KAAA,MAAWmT,SAASlV,MAAAA,EAAQ;AAC1BgG,MAAAA,OAAAA,CAAQC,MAAAA,CAAOC,KAAAA,CAAM,CAAA,EAAA,EAAKgP,KAAAA,CAAM/X,MAAAA,CAAOmb,OAAO,CAAA,CAAA,CAAA,CAAA,EAAMpD,KAAAA,CAAMtS,IAAI;AAAI,CAAA,CAAA;AACpE,IAAA;AACF,EAAA;AACF;;;AO7LO,SAAS2V,eAAe3J,GAAAA,EAAqB;AAElD,EAAA,MAAM4J,WAAW,IAAIf,kBAAAA,CACnB7I,GAAAA,CAAIwD,eAAAA,CAAgBzB,WACpB/B,GAAAA,CAAIwD,eAAAA,CAAgBqG,MAAAA,EACpB7J,GAAAA,CAAIwD,gBAAgBhK,UAAAA,EACpBwG,GAAAA,CAAIwD,eAAAA,CAAgB/M,KAAAA,EACpBuJ,IAAIqD,aAAa,CAAA;AAInB,EAAA,MAAM0F,UAAAA,GAAaa,QAAAA,CAASV,WAAAA,CAAYlJ,GAAAA,CAAIC,iBAAiB,CAAA;AAG7DD,EAAAA,GAAAA,CAAI8J,cAAc,EAAA;AAClB,EAAA,KAAA,MAAWC,WAAWhB,UAAAA,EAAY;AAChC/I,IAAAA,GAAAA,CAAI8J,WAAAA,CAAY5T,IAAAA,CAAI,GAAI6T,OAAAA,CAAQ3Y,MAAM,CAAA;AACxC,EAAA;AAGA4O,EAAAA,GAAAA,CAAIgK,oBAAoBJ,QAAAA,CAASX,SAAAA;AAGjCjJ,EAAAA,GAAAA,CAAIiK,aAAAA,CAAcC,oBAAoBlK,GAAAA,CAAIC,iBAAAA;AAG1C,EAAA,IAAID,GAAAA,CAAIwD,gBAAgB2G,QAAAA,EAAU;AAChCC,IAAAA,mBAAAA,CAAoBrB,UAAAA,EAAY/I,GAAAA,CAAIwD,eAAAA,CAAgBzB,SAAAA,EAAW6H,SAASX,SAAS,CAAA;AACjFoB,IAAAA,cAAAA,CAAetB,UAAAA,EAAY/I,GAAAA,CAAIwD,eAAAA,CAAgBzB,SAAS,CAAA;AAC1D,EAAA;AACF;AA9BgB4H,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;;;ACFhB,WAAA,EAAA;AAGO,SAASW,YAAYtK,GAAAA,EAAqB;AAC/C,EAAA,MAAMuK,SAASvK,GAAAA,CAAIuK,MAAAA;AAInB,EAAA,MAAMnZ,SAAS4O,GAAAA,CAAIyD,KAAAA,GAAQzD,GAAAA,CAAIyD,KAAAA,CAAMrS,SAAS4O,GAAAA,CAAI8J,WAAAA;AAElD,EAAA,KAAA,MAAWxD,SAASlV,MAAAA,EAAQ;AAC1B,IAAA,IAAI;AACF,MAAA,MAAM7C,MAAAA,GAAS+X,KAAAA,CAAM/X,MAAAA,CAAOwL,WAAAA,EAAW;AAEvC,MAAA,IAAI,OAAOwQ,MAAAA,CAAOhc,MAAAA,CAAAA,KAAY,UAAA,EAAY;AACxC,QAAA,MAAM,IAAIqE,sBAAAA,CACR,SAAA,EACA0T,KAAAA,CAAM/X,MAAAA,EACN+X,MAAMtS,IAAAA,EACN,CAAA,qCAAA,EAAwCsS,KAAAA,CAAM/X,MAAM,CAAA,CAAE,CAAA;AAE1D,MAAA;AAGA,MAAA,MAAM8G,OAAAA,GAAUmV,kBAAkBlE,KAAAA,CAAAA;AAEjCiE,MAAAA,MAAAA,CAAOhc,MAAAA,CAAAA,CACN+X,KAAAA,CAAMtS,IAAAA,EAAI,GACPqB,OAAAA,CAAAA;AAEP,IAAA,CAAA,CAAA,OAASkB,KAAAA,EAAO;AACd,MAAA,MAAM,IAAI3D,sBAAAA,CACR,SAAA,EACA0T,KAAAA,CAAM/X,MAAAA,EACN+X,MAAMtS,IAAAA,EACNuC,KAAAA,YAAiBgB,KAAAA,GAAQhB,KAAAA,CAAMvD,UAAUtB,MAAAA,CAAO6E,KAAAA,GAChDA,KAAAA,YAAiBgB,KAAAA,GAAQhB,QAAQ5F,MAAAA,CAAAA;AAErC,IAAA;AACF,EAAA;AACF;AArCgB2Z,MAAAA,CAAAA,WAAAA,EAAAA,aAAAA,CAAAA;AA2ChB,SAASE,kBAAkBlE,KAAAA,EAAiB;AAC1C,EAAA,MAAMjR,OAAAA,GAAqB;OAAIiR,KAAAA,CAAM9M;;AACrC,EAAA,IAAI8M,MAAMhN,QAAAA,EAAU;AAClBjE,IAAAA,OAAAA,CAAQa,IAAAA,CAAK;MAAE,CAACuU,cAAAA,GAAiBnE,KAAAA,CAAMhN;KAAS,CAAA;AAClD,EAAA;AACAjE,EAAAA,OAAAA,CAAQa,IAAAA,CAAKoQ,MAAM+B,OAAO,CAAA;AAC1B,EAAA,OAAOhT,OAAAA;AACT;AAPSmV,MAAAA,CAAAA,iBAAAA,EAAAA,mBAAAA,CAAAA;;;ACjCT,oBAAA,EAAA;AAWO,IAAME,+BAAAA,GAAkC,gCAAA;AAG/C,IAAIC,0BAAAA,GAA6B,CAAA;AAgB1B,SAASC,yBAAAA,CACdlU,WAAAA,EACAqL,UAAAA,EACAmE,aAAAA,EAAqC;AAErC,EAAA,MAAM2E,IAAAA,uBAAW7J,GAAAA,EAAAA;AACjB,EAAA,MAAM8J,YAAsB,EAAA;AAE5B,EAAA,MAAMC,QAAAA,2BAAY7G,QAAAA,KAAAA;AAChB,IAAA,IAAI,OAAOA,aAAa,QAAA,IAAYA,QAAAA,KAAa,QAAQ2G,IAAAA,CAAKxJ,GAAAA,CAAI6C,QAAAA,CAAAA,EAAW;AAC3E,MAAA;AACF,IAAA;AACA2G,IAAAA,IAAAA,CAAK3J,IAAIgD,QAAAA,CAAAA;AACT,IAAA,IAAInU,QAAAA,CAASmU,QAAAA,CAAAA,IAAahU,YAAAA,CAAagU,QAAAA,CAAAA,EAAW;AAChD4G,MAAAA,SAAAA,CAAU5U,KAAKgO,QAAAA,CAAAA;AACjB,IAAA;EACF,CAAA,EARiB,UAAA,CAAA;AAWjB,EAAA,KAAA,MAAWlB,OAAAA,IAAW;AAAIzB,IAAAA,GAAAA,mBAAAA,CAAoB7K,WAAAA;AAAcsU,GAAAA,CAAAA,OAAAA,EAAO,EAAI;AACrE,IAAA,IAAI;AACFD,MAAAA,QAAAA,CAAShJ,UAAAA,CAAUtK,OAAAA,CAAQuL,OAAAA,CAAAA,CAAAA;IAC7B,CAAA,CAAA,MAAQ;AACN,MAAA;AACF,IAAA;AACF,EAAA;AAIA,EAAA,KAAA,MAAWhR,cAAc0E,WAAAA,EAAa;AACpCqU,IAAAA,QAAAA,CAAS7E,aAAAA,CAAczU,GAAAA,CAAIO,UAAAA,CAAAA,CAAAA;AAC7B,EAAA;AAEA,EAAA,OAAO8Y,SAAAA;AACT;AAlCgBF,MAAAA,CAAAA,yBAAAA,EAAAA,2BAAAA,CAAAA;AA6CT,SAASK,0BAAAA,CACdC,GAAAA,EACAxU,WAAAA,EACAqL,UAAAA,EACAmE,aAAAA,EAAqC;AAErC,EAAA,MAAM+C,SAAAA,GAAY2B,yBAAAA,CAA0BlU,WAAAA,EAAaqL,UAAAA,EAAWmE,aAAAA,CAAAA;AACpE,EAAA,IAAI+C,SAAAA,CAAUrT,WAAW,CAAA,EAAG;AAC1B,IAAA;AACF,EAAA;AAEA,EAAA,IAAIsV,GAAAA,CAAIC,OAAAA,IAAWD,GAAAA,CAAIE,SAAAA,EAAW;AAChC,IAAA,MAAM,IAAI7T,MACR,iRAGE,CAAA;AAEN,EAAA;AAEA2T,EAAAA,GAAAA,CAAIG,MAAAA,CAAO;AACTlY,IAAAA,IAAAA,EAAM,CAAA,EAAGuX,+BAAAA,CAAAA,CAAAA,EAAmC,EAAEC,0BAAAA,CAAAA,CAAAA;AAC9C,IAAA,MAAMW,KAAAA,GAAAA;AACJ,MAAA,KAAA,MAAWpH,YAAY+E,SAAAA,EAAW;AAChC,QAAA,IAAIlZ,QAAAA,CAASmU,QAAAA,CAAAA,EAAW;AACtB,UAAA,MAAMA,SAASjU,MAAAA,EAAM;AACvB,QAAA;AACF,MAAA;AACF,IAAA,CAAA;AACA,IAAA,MAAMsb,OAAAA,GAAAA;AAKJ,MAAA,MAAM5U,SAAoB,EAAA;AAC1B,MAAA,KAAA,MAAWuN,QAAAA,IAAY;AAAI+E,QAAAA,GAAAA;AAAW+B,OAAAA,CAAAA,OAAAA,EAAO,EAAI;AAC/C,QAAA,IAAI9a,YAAAA,CAAagU,QAAAA,CAAAA,EAAW;AAC1B,UAAA,IAAI;AACF,YAAA,MAAMA,SAAS/T,UAAAA,EAAU;AAC3B,UAAA,CAAA,CAAA,OAASqb,GAAAA,EAAK;AACZ7U,YAAAA,MAAAA,CAAOT,KAAKsV,GAAAA,CAAAA;AACd,UAAA;AACF,QAAA;AACF,MAAA;AACA,MAAA,IAAI7U,MAAAA,CAAOf,SAAS,CAAA,EAAG;AACrB,QAAA,MAAM,IAAI6V,eACR9U,MAAAA,EACA,CAAA,EAAGjF,OAAOiF,MAAAA,CAAOf,MAAM,CAAA,CAAA,4BAAA,CAA+B,CAAA;AAE1D,MAAA;AACF,IAAA;GACF,CAAA;AACF;AApDgBqV,MAAAA,CAAAA,0BAAAA,EAAAA,4BAAAA,CAAAA;;;ACpET,SAASS,qBAAAA,CACdta,MAAAA,EACA+I,SAAAA,EACAwR,mBAAAA,EAA0C;AAE1C,EAAA,OAAOC,UAAAA,CAA6B;IAClCxa,MAAAA,EAAQ;AAAIA,MAAAA,GAAAA;;AACZ+I,IAAAA,SAAAA;AACAwR,IAAAA;GACF,CAAA;AACF;AAVgBD,MAAAA,CAAAA,qBAAAA,EAAAA,uBAAAA,CAAAA;AA0CT,SAASE,WAAcC,GAAAA,EAAM;AAClC,EAAA,IAAIA,GAAAA,KAAQ,IAAA,IAAQ,OAAOA,GAAAA,KAAQ,QAAA,EAAU;AAC3C,IAAA,OAAOA,GAAAA;AACT,EAAA;AAEA,EAAA,IAAI7T,KAAAA,CAAM8T,OAAAA,CAAQD,GAAAA,CAAAA,EAAM;AACtB,IAAA,KAAA,MAAWE,QAAQF,GAAAA,EAAK;AACtBD,MAAAA,UAAAA,CAAWG,IAAAA,CAAAA;AACb,IAAA;AACA,IAAA,OAAO9U,MAAAA,CAAO+U,OAAOH,GAAAA,CAAAA;AACvB,EAAA;AAEA,EAAA,IAAIA,eAAeja,GAAAA,EAAK;AACtBia,IAAAA,GAAAA,CAAII,OAAAA,CAAQ,CAACjc,KAAAA,KAAAA;AACX4b,MAAAA,UAAAA,CAAW5b,KAAAA,CAAAA;IACb,CAAA,CAAA;AACA,IAAA,OAAOiH,MAAAA,CAAO+U,OAAOH,GAAAA,CAAAA;AACvB,EAAA;AAEA,EAAA,IAAIA,eAAe7K,GAAAA,EAAK;AAEtB6K,IAAAA,GAAAA,CAAII,OAAAA,CAAQ,CAACjc,KAAAA,KAAAA;AACX4b,MAAAA,UAAAA,CAAW5b,KAAAA,CAAAA;IACb,CAAA,CAAA;AACA,IAAA,OAAOiH,MAAAA,CAAO+U,OAAOH,GAAAA,CAAAA;AACvB,EAAA;AAGA,EAAA,KAAA,MAAWpb,OAAOob,GAAAA,EAAK;AACrB,IAAA,IAAI5U,OAAOnI,SAAAA,CAAUod,cAAAA,CAAeC,IAAAA,CAAKN,GAAAA,EAAKpb,GAAAA,CAAAA,EAAM;AAClDmb,MAAAA,UAAAA,CAAYC,GAAAA,CAAgCpb,GAAAA,CAAI,CAAA;AAClD,IAAA;AACF,EAAA;AAEA,EAAA,OAAOwG,MAAAA,CAAO+U,OAAOH,GAAAA,CAAAA;AACvB;AAnCgBD,MAAAA,CAAAA,UAAAA,EAAAA,YAAAA,CAAAA;;;ACvCT,SAASQ,kBAAAA,CACd3I,OACA4I,OAAAA,EAAsB;AAGtB,EAAA,MAAMjb,MAAAA,GAASqS,KAAAA,CAAMrS,MAAAA,CAAOc,GAAAA,CAAI,CAACoU,KAAAA,MAAW;AAC1C/X,IAAAA,MAAAA,EAAQ+X,KAAAA,CAAM/X,MAAAA;AACdyF,IAAAA,IAAAA,EAAMsS,KAAAA,CAAMtS,IAAAA;AACZhC,IAAAA,UAAAA,EAAYsU,KAAAA,CAAMtU;GACpB,CAAA,CAAA;AAGA,EAAA,MAAMmI,SAAAA,GAAYnC,KAAAA,CAAMU,IAAAA,CAAK+K,KAAAA,CAAMtJ,SAAAA,CAAU9E,OAAAA,EAAO,CAAA,CAAInD,GAAAA,CAAI,CAAC,CAACuO,KAAAA,EAAOW,IAAAA,CAAAA,MAAW;AAC9EX,IAAAA,KAAAA;IACA6L,YAAAA,EAAc;AAAIlL,MAAAA,GAAAA;;GACpB,CAAA,CAAA;AAGA,EAAA,MAAMmL,QAAAA,uBAAe3a,GAAAA,EAAAA;AACrB,EAAA,KAAA,MAAW0U,SAASlV,MAAAA,EAAQ;AAC1B,IAAA,MAAMX,MAAM,CAAA,EAAG6V,KAAAA,CAAM/X,MAAM,CAAA,CAAA,EAAI+X,MAAMtS,IAAI,CAAA,CAAA;AACzCuY,IAAAA,QAAAA,CAASza,IAAIrB,GAAAA,EAAAA,CAAM8b,QAAAA,CAAS9a,IAAIhB,GAAAA,CAAAA,IAAQ,KAAK,CAAA,CAAA;AAC/C,EAAA;AAEA,EAAA,MAAM+b,eAAAA,GAAkBxU,MAAMU,IAAAA,CAAK6T,QAAAA,CAASlX,SAAO,CAAA,CAChD4O,OAAO,CAAC,CAACwI,MAAMjD,KAAAA,CAAAA,KAAWA,QAAQ,CAAA,CAAA,CAClCtX,IAAI,CAAC,CAACzB,GAAAA,EAAK+Y,KAAAA,CAAAA,KAAM;AAChB,IAAA,MAAM,CAACjb,MAAAA,EAAQ,GAAGme,SAAAA,CAAAA,GAAajc,GAAAA,CAAIoF,MAAM,GAAA,CAAA;AACzC,IAAA,OAAO;AACLtH,MAAAA,MAAAA;MACAyF,IAAAA,EAAM0Y,SAAAA,CAAUhX,KAAK,GAAA,CAAA;AACrB8T,MAAAA;AACF,KAAA;EACF,CAAA,CAAA;AAGF,EAAA,MAAMmD,oBAAAA,GAAuBC,0BAAAA,CAA2BnJ,KAAAA,CAAMtJ,SAAS,CAAA;AAEvE,EAAA,OAAO;IACL/I,MAAAA,EAAQ6F,MAAAA,CAAO+U,OAAO5a,MAAAA,CAAAA;IACtB+I,SAAAA,EAAWlD,MAAAA,CAAO+U,OAAO7R,SAAAA,CAAAA;IACzBqS,eAAAA,EAAiBvV,MAAAA,CAAO+U,OAAOQ,eAAAA,CAAAA;IAC/BG,oBAAAA,EAAsB1V,MAAAA,CAAO+U,OAAOW,oBAAAA,CAAAA;IACpCN,OAAAA,EAASpV,MAAAA,CAAO+U,OAAOK,OAAAA;AACzB,GAAA;AACF;AA7CgBD,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA;AAsDhB,SAASQ,2BACPzS,SAAAA,EAA2E;AAE3E,EAAA,MAAM0S,SAA+B,EAAA;AACrC,EAAA,MAAMrL,OAAAA,uBAAcR,GAAAA,EAAAA;AACpB,EAAA,MAAM8L,cAAAA,uBAAqB9L,GAAAA,EAAAA;AAE3B,EAAA,MAAM+L,KAAAA,mBAAQ,MAAA,CAAA,CAACtM,KAAAA,EAA0BzM,IAAAA,KAAAA;AACvC,IAAA,IAAI8Y,cAAAA,CAAezL,GAAAA,CAAIZ,KAAAA,CAAAA,EAAQ;AAE7B,MAAA,MAAMuM,UAAAA,GAAahZ,IAAAA,CAAKiZ,OAAAA,CAAQxM,KAAAA,CAAAA;AAChC,MAAA,IAAIuM,eAAe,EAAA,EAAI;AACrB,QAAA,MAAME,KAAAA,GAAQjW,OAAO+U,MAAAA,CAAO;AAAIhY,UAAAA,GAAAA,IAAAA,CAAK2B,MAAMqX,UAAAA,CAAAA;AAAavM,UAAAA;AAAM,SAAA,CAAA;AAC9DoM,QAAAA,MAAAA,CAAO3W,IAAAA,CAAK;AAAEgX,UAAAA;SAAM,CAAA;AACtB,MAAA;AACA,MAAA;AACF,IAAA;AAEA,IAAA,IAAI1L,OAAAA,CAAQH,GAAAA,CAAIZ,KAAAA,CAAAA,EAAQ;AACtB,MAAA;AACF,IAAA;AAEAe,IAAAA,OAAAA,CAAQN,IAAIT,KAAAA,CAAAA;AACZqM,IAAAA,cAAAA,CAAe5L,IAAIT,KAAAA,CAAAA;AAEnB,IAAA,MAAMW,IAAAA,GAAOjH,SAAAA,CAAU1I,GAAAA,CAAIgP,KAAAA,KAAU,EAAA;AACrC,IAAA,KAAA,MAAWiB,OAAON,IAAAA,EAAM;AACtB2L,MAAAA,KAAAA,CAAMrL,GAAAA,EAAK;AAAI1N,QAAAA,GAAAA,IAAAA;AAAMyM,QAAAA;AAAM,OAAA,CAAA;AAC7B,IAAA;AAEAqM,IAAAA,cAAAA,CAAenK,OAAOlC,KAAAA,CAAAA;EACxB,CAAA,EAxBc,OAAA,CAAA;AA2Bd,EAAA,KAAA,MAAWA,KAAAA,IAAStG,SAAAA,CAAUjD,IAAAA,EAAI,EAAI;AACpC,IAAA,IAAI,CAACsK,OAAAA,CAAQH,GAAAA,CAAIZ,KAAAA,CAAAA,EAAQ;AACvBsM,MAAAA,KAAAA,CAAMtM,KAAAA,EAAO,EAAE,CAAA;AACjB,IAAA;AACF,EAAA;AAEA,EAAA,OAAOoM,MAAAA;AACT;AAzCSD,MAAAA,CAAAA,0BAAAA,EAAAA,4BAAAA,CAAAA;;;ACxDT,eAAsBO,kBAAkBnN,GAAAA,EAAqB;AAC3D,EAAA,MAAMoN,YAAAA,GAAepN,GAAAA,CAAIwD,eAAAA,CAAgB6J,WAAAA,IAAe,KAAA;AACxD,EAAA,MAAMC,MAAMF,YAAAA,GAAe,MAAMG,WAAAA,CAAYD,GAAAA,KAAQ,MAAM,CAAA;AAC3D,EAAA,IAAIE,aAAaF,GAAAA,EAAAA;AAGjB,EAAA,MAAMvN,cAAcC,GAAAA,CAAAA;AACpB,EAAA,IAAIoN,YAAAA,EAAc;AAChBpN,IAAAA,GAAAA,CAAIqM,QAAQnW,IAAAA,CAAK;MAAEuX,KAAAA,EAAO,UAAA;MAAYC,EAAAA,EAAIH,WAAAA,CAAYD,KAAG,GAAKE;KAAW,CAAA;AAC3E,EAAA;AAEA,EAAA,IAAIxN,GAAAA,CAAIC,iBAAAA,CAAkBrK,MAAAA,KAAW,CAAA,EAAG;AACtC,IAAA;AACF,EAAA;AAGA4X,EAAAA,UAAAA,GAAaF,GAAAA,EAAAA;AACbnN,EAAAA,aAAAA,CAAcH,GAAAA,CAAAA;AACd,EAAA,IAAIoN,YAAAA,EAAc;AAChBpN,IAAAA,GAAAA,CAAIqM,QAAQnW,IAAAA,CAAK;MAAEuX,KAAAA,EAAO,UAAA;MAAYC,EAAAA,EAAIH,WAAAA,CAAYD,KAAG,GAAKE;KAAW,CAAA;AAC3E,EAAA;AAGAA,EAAAA,UAAAA,GAAaF,GAAAA,EAAAA;AACb,EAAA,MAAM/J,mBAAmBvD,GAAAA,CAAAA;AACzB,EAAA,IAAIoN,YAAAA,EAAc;AAChBpN,IAAAA,GAAAA,CAAIqM,QAAQnW,IAAAA,CAAK;MAAEuX,KAAAA,EAAO,eAAA;MAAiBC,EAAAA,EAAIH,WAAAA,CAAYD,KAAG,GAAKE;KAAW,CAAA;AAChF,EAAA;AAGAA,EAAAA,UAAAA,GAAaF,GAAAA,EAAAA;AACb,EAAA,MAAM3J,gBAAgB3D,GAAAA,CAAAA;AACtB,EAAA,IAAIoN,YAAAA,EAAc;AAChBpN,IAAAA,GAAAA,CAAIqM,QAAQnW,IAAAA,CAAK;MAAEuX,KAAAA,EAAO,YAAA;MAAcC,EAAAA,EAAIH,WAAAA,CAAYD,KAAG,GAAKE;KAAW,CAAA;AAC7E,EAAA;AAGAA,EAAAA,UAAAA,GAAaF,GAAAA,EAAAA;AACb3D,EAAAA,cAAAA,CAAe3J,GAAAA,CAAAA;AACf,EAAA,IAAIoN,YAAAA,EAAc;AAChBpN,IAAAA,GAAAA,CAAIqM,QAAQnW,IAAAA,CAAK;MAAEuX,KAAAA,EAAO,WAAA;MAAaC,EAAAA,EAAIH,WAAAA,CAAYD,KAAG,GAAKE;KAAW,CAAA;AAC5E,EAAA;AAKAA,EAAAA,UAAAA,GAAaF,GAAAA,EAAAA;AACbtN,EAAAA,GAAAA,CAAIyD,QAAQiI,qBAAAA,CAAsB1L,GAAAA,CAAI8J,aAAa9J,GAAAA,CAAI0D,aAAAA,EAAe1D,IAAIqD,aAAa,CAAA;AACvF,EAAA,IAAI+J,YAAAA,EAAc;AAChBpN,IAAAA,GAAAA,CAAIqM,QAAQnW,IAAAA,CAAK;MAAEuX,KAAAA,EAAO,OAAA;MAASC,EAAAA,EAAIH,WAAAA,CAAYD,KAAG,GAAKE;KAAW,CAAA;AACxE,EAAA;AAGAA,EAAAA,UAAAA,GAAaF,GAAAA,EAAAA;AACbhD,EAAAA,WAAAA,CAAYtK,GAAAA,CAAAA;AACZ,EAAA,IAAIoN,YAAAA,EAAc;AAChBpN,IAAAA,GAAAA,CAAIqM,QAAQnW,IAAAA,CAAK;MAAEuX,KAAAA,EAAO,QAAA;MAAUC,EAAAA,EAAIH,WAAAA,CAAYD,KAAG,GAAKE;KAAW,CAAA;AACzE,EAAA;AAGAA,EAAAA,UAAAA,GAAaF,GAAAA,EAAAA;AACbrC,EAAAA,0BAAAA,CACEjL,GAAAA,CAAIkL,KACJlL,GAAAA,CAAIiK,aAAAA,CAAcC,mBAClBlK,GAAAA,CAAIwD,eAAAA,CAAgBzB,SAAAA,EACpB/B,GAAAA,CAAIgK,iBAAiB,CAAA;AAEvB,EAAA,IAAIoD,YAAAA,EAAc;AAChBpN,IAAAA,GAAAA,CAAIqM,QAAQnW,IAAAA,CAAK;MAAEuX,KAAAA,EAAO,WAAA;MAAaC,EAAAA,EAAIH,WAAAA,CAAYD,KAAG,GAAKE;KAAW,CAAA;AAC5E,EAAA;AAGA,EAAA,IAAIJ,YAAAA,IAAgBpN,IAAIyD,KAAAA,EAAO;AAC7B,IAAA,MAAMkK,MAAAA,GAASvB,kBAAAA,CAAmBpM,GAAAA,CAAIyD,KAAAA,EAAOzD,IAAIqM,OAAO,CAAA;AACxDuB,IAAAA,qBAAAA,CAAsB5N,GAAAA,CAAIkL,KAAKyC,MAAAA,CAAAA;AACjC,EAAA;AACF;AA5EsBR,MAAAA,CAAAA,iBAAAA,EAAAA,mBAAAA,CAAAA;AA+EtB,IAAMU,gBAAAA,uBAAuBC,OAAAA,EAAAA;AAG7B,SAASF,qBAAAA,CAAsB1C,KAAkByC,MAAAA,EAAyB;AACxEE,EAAAA,gBAAAA,CAAiB/b,GAAAA,CAAIoZ,KAAKyC,MAAAA,CAAAA;AAC5B;AAFSC,MAAAA,CAAAA,qBAAAA,EAAAA,uBAAAA,CAAAA;AAKF,SAASG,4BAA4B7C,GAAAA,EAAgB;AAC1D,EAAA,OAAO2C,gBAAAA,CAAiBpc,IAAIyZ,GAAAA,CAAAA;AAC9B;AAFgB6C,MAAAA,CAAAA,2BAAAA,EAAAA,6BAAAA,CAAAA;;;ACzFT,IAAMC,mBAAN,MAAMA;EA1Bb;;;;;;;AA2BUC,EAAAA,gBAAAA,GAA8B,EAAA;EAEtC,WAAA,CACUvW,IAAAA,EACAC,OAAAA,EACAE,OAAAA,EACApB,KAAAA,EACR;SAJQiB,IAAAA,GAAAA,IAAAA;SACAC,OAAAA,GAAAA,OAAAA;SACAE,OAAAA,GAAAA,OAAAA;SACApB,KAAAA,GAAAA,KAAAA;AACP,EAAA;AAEH,EAAA,MAAMyJ,QAAAA,GAAgC;AAGpC,IAAA,MAAM,EAAE1I,qBAAAA,oBAAAA,EAAqBmB,yBAAAA,EAAAA,4BAA2BE,oBAAAA,EAAAA,qBAAAA,KAAyB,MAAM,OAAA,CAAA,OAAA,EAAA,CAAA,IAAA,CAAA,OAAA,cAAA,EAAA,EAAA,iBAAA,CAAA,CAAA;AAIvF,IAAA,MAAMd,OAAAA,GAAU,MAAMP,oBAAAA,CAAoB;AACxCE,MAAAA,IAAAA,EAAM,IAAA,CAAKA,IAAAA;AACXC,MAAAA,OAAAA,EAAS,IAAA,CAAKA,OAAAA;AACdE,MAAAA,OAAAA,EAAS,IAAA,CAAKA,OAAAA;AACdpB,MAAAA,KAAAA,EAAO,IAAA,CAAKA;KACd,CAAA;AAEA,IAAA,MAAMC,WAAAA,GAAciC,2BAA0BZ,OAAAA,CAAAA;AAE9C,IAAA,IAAA,CAAKkW,gBAAAA,GAAmBpV,sBAAqBd,OAAAA,CAAAA;AAE7C,IAAA,OAAOrB,WAAAA;AACT,EAAA;;;;;EAMAwX,kBAAAA,GAAgC;AAC9B,IAAA,OAAO,IAAA,CAAKD,gBAAAA;AACd,EAAA;AACF;AAQO,IAAME,eAAN,MAAMA;EAxEb;;;;AAyEE,EAAA,WAAA,CAAoBzX,WAAAA,EAAyB;SAAzBA,WAAAA,GAAAA,WAAAA;AAA0B,EAAA;EAE9CwJ,QAAAA,GAAuB;AACrB,IAAA,OAAO,IAAA,CAAKxJ,WAAAA;AACd,EAAA;AACF;;;ApB3CA,SAAS0X,QAAAA,CAAS3X,OAAgBzD,OAAAA,EAAe;AAC/C,EAAA,IAAIyD,KAAAA,EAAO;AACTW,IAAAA,OAAAA,CAAQC,MAAAA,CAAOC,KAAAA,CAAM,CAAA,cAAA,EAAiBtE,OAAAA;AAAW,CAAA,CAAA;AACnD,EAAA;AACF;AAJSob,MAAAA,CAAAA,QAAAA,EAAAA,UAAAA,CAAAA;AAMT,SAASC,QAAQrb,OAAAA,EAAe;AAC9BoE,EAAAA,OAAAA,CAAQC,MAAAA,CAAOC,KAAAA,CAAM,CAAA,uBAAA,EAA0BtE,OAAAA;AAAW,CAAA,CAAA;AAC5D;AAFSqb,MAAAA,CAAAA,OAAAA,EAAAA,SAAAA,CAAAA;AAST,SAASC,cAAAA,CACPpb,SACA6O,UAAAA,EAAoB;AAEpB,EAAA,OAAO;AACLrK,IAAAA,IAAAA,EAAMxE,QAAQwE,IAAAA,IAAQ,IAAA;AACtBC,IAAAA,OAAAA,EAASzE,QAAQyE,OAAAA,IAAWC,eAAAA;AAC5BC,IAAAA,OAAAA,EAAS3E,QAAQ2E,OAAAA,IAAWC,eAAAA;IAC5BpB,WAAAA,EAAaxD,OAAAA,CAAQwD,eAAe,EAAA;IACpCqL,SAAAA,EAAAA,UAAAA;IACAvI,UAAAA,EAAYtG,OAAAA,CAAQsG,cAAc,EAAA;AAClC/C,IAAAA,KAAAA,EAAOvD,QAAQuD,KAAAA,IAAS,KAAA;AACxBoT,IAAAA,MAAAA,EAAQ3W,QAAQ2W,MAAAA,IAAU,EAAA;AAC1B0E,IAAAA,MAAAA,EAAQrb,QAAQqb,MAAAA,IAAU,KAAA;AAC1BpE,IAAAA,QAAAA,EAAUjX,QAAQiX,QAAAA,IAAY,IAAA;AAC9B/G,IAAAA,OAAAA,EAASlQ,QAAQkQ,OAAAA,IAAW,KAAA;AAC5BiK,IAAAA,WAAAA,EAAana,QAAQma,WAAAA,IAAe;AACtC,GAAA;AACF;AAlBSiB,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AAmCF,SAASlE,mBAAAA,CACdrB,UAAAA,EACAhH,UAAAA,EACAmE,aAAAA,EAAqC;AAErC,EAAA,KAAA,MAAWlU,cAAc+W,UAAAA,EAAY;AACnC,IAAA,MAAMtI,QAAQzO,UAAAA,CAAW3B,MAAAA;AACzB,IAAA,IAAI;AACF6V,MAAAA,aAAAA,CAAcpU,GAAAA,CAAI2O,KAAAA,EAAOsB,UAAAA,CAAUtK,OAAAA,CAAQgJ,KAAAA,CAAAA,CAAAA;AAC7C,IAAA,CAAA,CAAA,OAASlK,KAAAA,EAAO;AACd,MAAA,IAAIA,iBAAiBiY,OAAAA,EAAS;AAC5B,QAAA,MAAMjY,KAAAA;AACR,MAAA;AACA,MAAA,MAAM,IAAI9D,0BACRT,UAAAA,CAAW3B,MAAAA,CAAO8C,MAClBoD,KAAAA,YAAiBgB,KAAAA,GAAQhB,QAAQ5F,MAAAA,CAAAA;AAErC,IAAA;AACF,EAAA;AACF;AAnBgByZ,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;AAqCT,SAASC,cAAAA,CACdtB,YACAhH,UAAAA,EAAoB;AAEpB,EAAA,MAAMgG,QAAAA,uBAAe/G,GAAAA,EAAAA;AAErB,EAAA,KAAA,MAAWhP,cAAc+W,UAAAA,EAAY;AACnC,IAAA,KAAA,MAAWzC,KAAAA,IAAStU,UAAAA,CAAWiW,UAAAA,CAAW7W,MAAAA,EAAQ;AAChD,MAAA,MAAM6M,MAAAA,GAASO,YAAAA,CAAaxM,UAAAA,CAAW3B,MAAAA,EAAQiW,MAAMhV,UAAU,CAAA;AAC/D,MAAA,KAAA,MAAW1C,SAASqP,MAAAA,EAAQ;AAC1B,QAAA,IAAI,CAACtP,YAAAA,CAAaC,KAAAA,KAAUmZ,QAAAA,CAAS1G,GAAAA,CAAIzS,KAAAA,CAAAA,EAAQ;AAC/C,UAAA;AACF,QAAA;AACAmZ,QAAAA,QAAAA,CAAS7G,IAAItS,KAAAA,CAAAA;AACb,QAAA,IAAI;AACFmT,UAAAA,UAAAA,CAAUtK,QAAQ7I,KAAAA,CAAAA;AACpB,QAAA,CAAA,CAAA,OAAS2H,KAAAA,EAAO;AACd,UAAA,IAAIA,iBAAiBiY,OAAAA,EAAS;AAC5B,YAAA,MAAMjY,KAAAA;AACR,UAAA;AACA,UAAA,MAAMrC,SAAAA,GAAYtF,MAAMuE,IAAAA,IAAQ,gBAAA;AAChC,UAAA,MAAM,IAAIoE,KAAAA,CACR,CAAA,yBAAA,EAA4BrD,SAAAA,CAAAA,6CAAAA,EACFlC,UAAAA,CAAW3B,OAAO8C,IAAI,CAAA;;;;AAInCe,QAAAA,EAAAA,SAAAA,CAAAA,6EAAAA,CAAAA,EAEb;YAAEX,KAAAA,EAAOgD,KAAAA,YAAiBgB,QAAQhB,KAAAA,GAAQ5F;WAAU,CAAA;AAExD,QAAA;AACF,MAAA;AACF,IAAA;AACF,EAAA;AACF;AAnCgB0Z,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AA+ChB,eAAsBoE,mBAAAA,CACpBvD,GAAAA,EACAhY,OAAAA,GAA8B,EAAC,EAAC;AAEhC,EAAA,MAAMqX,SAASW,GAAAA,CAAIX,MAAAA;AACnB,EAAA,IAAI,CAACA,MAAAA,EAAQ;AACX,IAAA,MAAM,IAAIhT,MACR,gJACE,CAAA;AAEN,EAAA;AAMA,EAAA,MAAMwK,UAAAA,GACJ7O,QAAQ6O,SAAAA,KACP7O,OAAAA,CAAQkQ,UAAUsL,eAAAA,EAAAA,GAAqBxD,IAAInJ,SAAAA,IAAa4M,SAAAA,CAAAA;AAC3D,EAAA,MAAMC,YAAAA,GAAeN,cAAAA,CAAepb,OAAAA,EAAS6O,UAAAA,CAAAA;AAG7C,EAAA,IAAIrT,MAAAA;AACJ,EAAA,IAAIwE,QAAQxE,MAAAA,EAAQ;AAElBA,IAAAA,MAAAA,GAASwE,OAAAA,CAAQxE,MAAAA;AACnB,EAAA,CAAA,MAAA,IAAWkgB,aAAalX,IAAAA,EAAM;AAE5BhJ,IAAAA,MAAAA,GAAS,IAAIsf,iBACXY,YAAAA,CAAalX,IAAAA,EACbkX,aAAajX,OAAAA,EACbiX,YAAAA,CAAa/W,OAAAA,EACb+W,YAAAA,CAAanY,KAAK,CAAA;EAEtB,CAAA,MAAO;AAEL/H,IAAAA,MAAAA,GAAS,IAAIyf,YAAAA,CAAa;SAAIS,YAAAA,CAAalY;AAAY,KAAA,CAAA;AACzD,EAAA;AAGA,EAAA,MAAMsJ,GAAAA,GAAwB;AAC5BkL,IAAAA,GAAAA;AACAX,IAAAA,MAAAA;IAEA/G,eAAAA,EAAiBoL,YAAAA;AACjBlgB,IAAAA,MAAAA;AACAuR,IAAAA,iBAAAA,EAAmB,EAAA;AACnBG,IAAAA,qBAAAA,EAAuB,EAAA;AACvBsD,IAAAA,aAAAA,sBAAmB9R,GAAAA,EAAAA;AACnByR,IAAAA,aAAAA,sBAAmBrC,GAAAA,EAAAA;AACnBgJ,IAAAA,iBAAAA,sBAAuBpY,GAAAA,EAAAA;AACvBkY,IAAAA,WAAAA,EAAa,EAAA;IACbrG,KAAAA,EAAO,IAAA;IACPwG,aAAAA,EAAe;AACbC,MAAAA,iBAAAA,EAAmB;AACrB,KAAA;AACAmC,IAAAA,OAAAA,EAAS;AACX,GAAA;AAGA,EAAA,MAAMc,kBAAkBnN,GAAAA,CAAAA;AAExB,EAAA,IAAIA,GAAAA,CAAIC,iBAAAA,CAAkBrK,MAAAA,KAAW,CAAA,EAAG;AACtCyY,IAAAA,OAAAA,CAAQ,yDAAA,CAAA;AACR,IAAA;AACF,EAAA;AAEAD,EAAAA,QAAAA,CAASQ,aAAanY,KAAAA,EAAO,CAAA,WAAA,EAAcuJ,GAAAA,CAAI8J,WAAAA,CAAYlU,MAAM,CAAA,OAAA,CAAS,CAAA;AAC5E;AApEsB6Y,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;;;AqBhKtB,WAAA,EAAA;AAeO,SAASI,mBAAmBnX,IAAAA,EAAc;AAC/C,EAAA,MAAMoX,UAAsB,EAAA;AAC5B,EAAA,MAAMC,SAAAA,uBAAgB/N,GAAAA,EAAAA;AACtB,EAAA,MAAMwB,QAAAA,uBAAexB,GAAAA,EAAAA;AAErB,EAAA,MAAM+L,KAAAA,2BAASiC,GAAAA,KAAAA;AACb,IAAA,IAAID,SAAAA,CAAU1N,GAAAA,CAAI2N,GAAAA,CAAAA,EAAM;AACtB,MAAA;AACF,IAAA;AACA,IAAA,IAAIxM,QAAAA,CAASnB,GAAAA,CAAI2N,GAAAA,CAAAA,EAAM;AAGrB,MAAA;AACF,IAAA;AACA,IAAA,IAAI,CAAC3U,QAAAA,CAAS2U,GAAAA,CAAAA,EAAM;AAClB,MAAA,MAAM,IAAIlc,eAAAA,CAAgBkc,GAAAA,CAAI7b,IAAAA,IAAQ,iBAAA,CAAA;AACxC,IAAA;AAEAqP,IAAAA,QAAAA,CAAStB,IAAI8N,GAAAA,CAAAA;AAEb,IAAA,MAAM1V,QAAAA,GAAWgB,kBAAkB0U,GAAAA,CAAAA;AACnC,IAAA,KAAA,MAAWC,QAAAA,IAAY3V,QAAAA,EAAUY,OAAAA,IAAW,EAAA,EAAI;AAC9C6S,MAAAA,KAAAA,CAAMkC,QAAAA,CAAAA;AACR,IAAA;AAEAzM,IAAAA,QAAAA,CAASG,OAAOqM,GAAAA,CAAAA;AAChBD,IAAAA,SAAAA,CAAU7N,IAAI8N,GAAAA,CAAAA;AACdF,IAAAA,OAAAA,CAAQ5Y,KAAK8Y,GAAAA,CAAAA;EACf,CAAA,EAvBc,OAAA,CAAA;AAyBdjC,EAAAA,KAAAA,CAAMrV,IAAAA,CAAAA;AACN,EAAA,OAAOoX,OAAAA;AACT;AAhCgBD,MAAAA,CAAAA,kBAAAA,EAAAA,oBAAAA,CAAAA;AAsCT,SAASK,yBAAyBC,OAAAA,EAAmB;AAC1D,EAAA,MAAMzY,cAA0B,EAAA;AAChC,EAAA,MAAMmU,IAAAA,uBAAW7J,GAAAA,EAAAA;AAEjB,EAAA,KAAA,MAAWgO,OAAOG,OAAAA,EAAS;AACzB,IAAA,MAAM7V,QAAAA,GAAWgB,kBAAkB0U,GAAAA,CAAAA;AACnC,IAAA,KAAA,MAAWhd,UAAAA,IAAcsH,QAAAA,EAAU5C,WAAAA,IAAe,EAAA,EAAI;AACpD,MAAA,IAAI,CAACmU,IAAAA,CAAKxJ,GAAAA,CAAIrP,UAAAA,CAAAA,EAAa;AACzB6Y,QAAAA,IAAAA,CAAK3J,IAAIlP,UAAAA,CAAAA;AACT0E,QAAAA,WAAAA,CAAYR,KAAKlE,UAAAA,CAAAA;AACnB,MAAA;AACF,IAAA;AACF,EAAA;AAEA,EAAA,OAAO0E,WAAAA;AACT;AAfgBwY,MAAAA,CAAAA,wBAAAA,EAAAA,0BAAAA,CAAAA;;;ACChB,eAAsBE,cAAAA,CACpBlE,GAAAA,EACAmE,UAAAA,EACAnc,OAAAA,GAAqC,EAAC,EAAC;AAEvC,EAAA,MAAM6O,UAAAA,GACJ7O,QAAQ6O,SAAAA,KACP7O,OAAAA,CAAQkQ,UAAUsL,eAAAA,EAAAA,GAAqBxD,IAAInJ,SAAAA,IAAa4M,SAAAA,CAAAA;AAE3D,EAAA,MAAMQ,OAAAA,GAAUN,mBAAmBQ,UAAAA,CAAAA;AAEnC,EAAA,KAAA,MAAWL,OAAOG,OAAAA,EAAS;AACzB,IAAA,MAAM7V,QAAAA,GAAWgB,kBAAkB0U,GAAAA,CAAAA;AACnC,IAAA,KAAA,MAAWM,QAAAA,IAAYhW,QAAAA,EAAUa,SAAAA,IAAa,EAAA,EAAI;AAChDoV,MAAAA,gBAAAA,CAAiBD,UAAUvN,UAAAA,CAAAA;AAC7B,IAAA;AACF,EAAA;AAEA,EAAA,MAAMrL,WAAAA,GAAcwY,yBAAyBC,OAAAA,CAAAA;AAE7C,EAAA,MAAMV,oBAAoBvD,GAAAA,EAAK;IAAE,GAAGhY,OAAAA;IAAS6O,SAAAA,EAAAA,UAAAA;AAAWrL,IAAAA;GAAY,CAAA;AACtE;AArBsB0Y,MAAAA,CAAAA,cAAAA,EAAAA,gBAAAA,CAAAA;AA+BtB,SAASG,gBAAAA,CAAiBD,UAA0BvN,UAAAA,EAAoB;AACtE,EAAA,IAAI,OAAOuN,aAAa,UAAA,EAAY;AAClCE,IAAAA,qBAAAA,CAAsBF,UAAUvN,UAAAA,CAAAA;AAChC,IAAA;AACF,EAAA;AACA0N,EAAAA,sBAAAA,CAAuBH,UAAUvN,UAAAA,CAAAA;AACnC;AANSwN,MAAAA,CAAAA,gBAAAA,EAAAA,kBAAAA,CAAAA;AAST,SAASC,qBAAAA,CAAsBnf,QAAkB0R,UAAAA,EAAoB;AACnE,EAAA,MAAMtB,KAAAA,GAAQpQ,MAAAA;AACd,EAAA,IAAI0R,UAAAA,CAAUI,YAAAA,CAAa1B,KAAAA,CAAAA,EAAQ;AACjC,IAAA;AACF,EAAA;AACA,EAAA,MAAMwB,QAAQL,kBAAAA,CAAmBvR,MAAAA,CAAAA,GAAU6R,eAAAA,CAAgB7R,MAAAA,CAAAA,GAAU,WAAA;AACrE0R,EAAAA,UAAAA,CAAUK,SAAS3B,KAAAA,EAAO;IAAE4B,QAAAA,EAAU5B;GAAM,EAAG;AAAEwB,IAAAA,KAAAA,EAAOA,KAAAA,IAAS;GAAY,CAAA;AAC/E;AAPSuN,MAAAA,CAAAA,qBAAAA,EAAAA,uBAAAA,CAAAA;AAUT,SAASC,sBAAAA,CAAuBH,UAAgCvN,UAAAA,EAAoB;AAClF,EAAA,MAAM,EAAE2N,OAAAA,EAASzN,KAAAA,EAAK,GAAKqN,QAAAA;AAE3B,EAAA,IAAI,cAAcA,QAAAA,EAAU;AAC1BvN,IAAAA,UAAAA,CAAUK,SAASsN,OAAAA,EAAS;AAAEC,MAAAA,QAAAA,EAAUL,QAAAA,CAASK;KAAS,CAAA;AAC1D,IAAA;AACF,EAAA;AAEA,EAAA,IAAIL,SAASM,UAAAA,EAAY;AACvB7N,IAAAA,UAAAA,CAAUK,SACRsN,OAAAA,EACA;AAAEE,MAAAA,UAAAA,EAAYN,QAAAA,CAASM,UAAAA;AAAYC,MAAAA,MAAAA,EAAQP,QAAAA,CAASO;KAAO,EAC3D;AAAE5N,MAAAA,KAAAA,EAAOA,KAAAA,IAAS;KAAY,CAAA;AAEhC,IAAA;AACF,EAAA;AAEA,EAAA,IAAIqN,SAASjN,QAAAA,EAAU;AACrBN,IAAAA,UAAAA,CAAUK,SAASsN,OAAAA,EAAS;AAAErN,MAAAA,QAAAA,EAAUiN,QAAAA,CAASjN;KAAS,EAAG;AAAEJ,MAAAA,KAAAA,EAAOA,KAAAA,IAAS;KAAY,CAAA;AAC3F,IAAA;AACF,EAAA;AAEA,EAAA,MAAM,IAAI1K,KAAAA,CACR,CAAA,mCAAA,EAAsC7F,MAAAA,CAAOge,OAAAA,CAAAA,CAAAA,qFAAAA,CACuB,CAAA;AAExE;AA1BSD,MAAAA,CAAAA,sBAAAA,EAAAA,wBAAAA,CAAAA;;;AnCmCT,cAAA,EAAA;;;AoCjIO,SAASK,oBAAoB5E,GAAAA,EAAgB;AAClD,EAAA,OAAO6C,4BAA4B7C,GAAAA,CAAAA;AACrC;AAFgB4E,MAAAA,CAAAA,mBAAAA,EAAAA,qBAAAA,CAAAA;;;ApC0KhB,WAAA,EAAA","file":"index.js","sourcesContent":["/**\n * @nextrush/class - Metadata Keys & Runtime Helpers\n *\n * The reflect-metadata storage keys plus the runtime type-guard helpers that\n * back the decorator implementations. These are the only runtime values in the\n * type layer — everything else in the sibling *-types modules is type-only.\n */\n\nimport type { Guard, Constructor, CanActivate } from '../guards/guard-types.js';\nimport type { ParamSource } from '../binding/param-types.js';\nimport type { RouteMethods } from '../decorators/route-types.js';\n\n/**\n * Metadata keys used for decorator storage\n */\nexport const DECORATOR_METADATA_KEYS = {\n CONTROLLER: Symbol.for('nextrush:controller'),\n MODULE: Symbol.for('nextrush:module'),\n ROUTES: Symbol.for('nextrush:routes'),\n PARAMS: Symbol.for('nextrush:params'),\n MIDDLEWARE: Symbol.for('nextrush:middleware'),\n GUARDS: Symbol.for('nextrush:guards'),\n INTERCEPTORS: Symbol.for('nextrush:interceptors'),\n FILTERS: Symbol.for('nextrush:filters'),\n CATCH: Symbol.for('nextrush:catch'),\n RESPONSE_HEADERS: Symbol.for('nextrush:response-headers'),\n REDIRECT: Symbol.for('nextrush:redirect'),\n HTTP_CODE: Symbol.for('nextrush:http-code'),\n} as const;\n\n/**\n * Type guard to check if a value is a valid HTTP method (decorator-metadata\n * sense — includes `'ALL'`, the `@All()` any-method sentinel; T016).\n */\nexport function isValidHttpMethod(method: string): method is RouteMethods {\n return ['GET', 'POST', 'PUT', 'DELETE', 'PATCH', 'HEAD', 'OPTIONS', 'ALL'].includes(method);\n}\n\n/**\n * Type guard to check if a value is a valid param source\n */\nexport function isValidParamSource(source: string): source is ParamSource {\n return ['body', 'query', 'param', 'header', 'ctx', 'req', 'res', 'custom'].includes(source);\n}\n\n/**\n * Type guard to check if a guard is a class (constructor) rather than a function.\n *\n * This checks if the guard has a prototype with the canActivate method defined,\n * which indicates it's a class implementing CanActivate rather than a function.\n */\nexport function isGuardClass(guard: Guard): guard is Constructor<CanActivate> {\n // Check if it's a function (both classes and functions are typeof 'function')\n if (typeof guard !== 'function') {\n return false;\n }\n\n // Check if it has a prototype with canActivate method\n // Arrow functions and regular functions won't have canActivate on their prototype\n const proto = guard.prototype;\n if (!proto || typeof proto !== 'object') {\n return false;\n }\n\n // Check if canActivate is defined on the prototype (class method)\n return typeof proto.canActivate === 'function';\n}\n","/**\n * @nextrush/class - Service Lifecycle Hook Type Definitions\n *\n * Two duck-typed behavioral interfaces — `OnInit` and `OnShutdown` — that a\n * `@Service`/`@Repository`/`@Config` (or any DI-managed instance) may implement\n * to participate in the application lifecycle. There is intentionally **no\n * decorator**: a service opts in purely by declaring the method, and the\n * controllers registrar detects it by presence via the guards below.\n *\n * Unlike {@link isGuardClass} (which inspects a class *constructor*'s prototype),\n * these guards operate on resolved *instances*, because the registrar has\n * already resolved each service from the container before deciding whether it\n * takes part in the lifecycle.\n *\n * @see `@nextrush/class` `registerControllers` — bridges these hooks into\n * `app.ready()` (calls `onInit`) and `app.close()` (calls `onShutdown`).\n */\n\n/**\n * Implemented by a service that needs to run initialization logic once, when the\n * application boots (`app.ready()`), after all controllers and their service\n * graph have been registered and resolved.\n *\n * `onInit` runs in dependency order — a service's dependencies initialize before\n * the service that depends on them (a reverse-BFS approximation of the graph).\n * An async `onInit` is awaited, so boot does not complete until every hook has\n * settled. Registration must happen before `serve()`/`ready()`.\n *\n * @example\n * ```typescript\n * import { Service } from '@nextrush/di';\n * import type { OnInit } from 'nextrush/class';\n *\n * @Service()\n * class Database implements OnInit {\n * async onInit(): Promise<void> {\n * await this.pool.connect();\n * }\n * }\n * ```\n */\nexport interface OnInit {\n onInit(): void | Promise<void>;\n}\n\n/**\n * Implemented by a service that needs to release resources when the application\n * shuts down (`app.close()`).\n *\n * `onShutdown` runs in the **reverse** of the `onInit` order (dependents tear\n * down before their dependencies), and an async `onShutdown` is awaited.\n *\n * @example\n * ```typescript\n * import { Service } from '@nextrush/di';\n * import type { OnShutdown } from 'nextrush/class';\n *\n * @Service()\n * class Database implements OnShutdown {\n * async onShutdown(): Promise<void> {\n * await this.pool.end();\n * }\n * }\n * ```\n */\nexport interface OnShutdown {\n onShutdown(): void | Promise<void>;\n}\n\n/**\n * Narrow an arbitrary value to {@link OnInit} by detecting a callable `onInit`\n * member. Traverses the prototype chain, so both object literals and class\n * instances are detected. Returns `false` for `null`, non-objects, and values\n * whose `onInit` is not a function.\n */\nexport function isOnInit(value: unknown): value is OnInit {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { onInit?: unknown }).onInit === 'function'\n );\n}\n\n/**\n * Narrow an arbitrary value to {@link OnShutdown} by detecting a callable\n * `onShutdown` member. Same semantics as {@link isOnInit}.\n */\nexport function isOnShutdown(value: unknown): value is OnShutdown {\n return (\n typeof value === 'object' &&\n value !== null &&\n typeof (value as { onShutdown?: unknown }).onShutdown === 'function'\n );\n}\n","/**\n * @nextrush/class - Type Definitions (barrel)\n *\n * Aggregates the per-concern type modules so existing `from './types.js'`\n * imports (within this package and downstream) keep resolving unchanged.\n * Definitions live in the cohesive sibling modules re-exported below.\n */\n\n// Controller concern\nexport type {\n ControllerMetadata,\n ControllerOptions,\n MiddlewareRef,\n} from './decorators/controller-types.js';\n\n// Route concern\nexport type {\n ControllerRouteMetadata,\n RedirectMetadata,\n ResponseHeaderMetadata,\n RouteMethods,\n RouteOptions,\n} from './decorators/route-types.js';\n// Re-exporting the deprecated alias itself (for the one-minor backward-compat window) is not a\n// violation of the deprecation — the rule should only fire on NEW consumers of the old name.\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nexport type { RouteMetadata } from './decorators/route-types.js';\n\n// Parameter concern\nexport type {\n BodyOptions,\n CustomParamExtractor,\n HeaderOptions,\n ParamMetadata,\n ParamOptions,\n ParamSource,\n QueryOptions,\n TransformFn,\n} from './binding/param-types.js';\n\n// Guard concern\nexport type {\n CanActivate,\n Constructor,\n Guard,\n GuardContext,\n GuardFn,\n GuardMetadata,\n} from './guards/guard-types.js';\n\n// Exception filter concern\nexport type {\n ExceptionFilter,\n ExceptionFilterClass,\n FilterMetadata,\n} from './filters/filter-types.js';\n\n// Interceptor concern\nexport type {\n Interceptor,\n InterceptorClass,\n InterceptorMetadata,\n} from './interceptors/interceptor-types.js';\n\n// Service lifecycle concern\nexport type { OnInit, OnShutdown } from './lifecycle/lifecycle-types.js';\n\n// Runtime values (metadata keys + type-guard helpers)\nexport {\n DECORATOR_METADATA_KEYS,\n isGuardClass,\n isValidHttpMethod,\n isValidParamSource,\n} from './metadata/metadata-keys.js';\n\nexport { isOnInit, isOnShutdown } from './lifecycle/lifecycle-types.js';\n","/**\n * @nextrush/class - Reflection API Isolation\n *\n * Single point of contact for all Reflect.getMetadata, Reflect.defineMetadata,\n * and design:paramtypes reads. Isolates reflection plumbing from business logic.\n */\n\n/**\n * Read the constructor parameter types emitted by TypeScript's `emitDecoratorMetadata`.\n * Returns an empty array if metadata is not present (e.g., under esbuild/tsx without\n * the metadata plugin).\n *\n * This is the ONLY place in the package that reads `design:paramtypes` directly.\n * All other code requests parameter types through this helper.\n *\n * @internal For cross-package DI use, re-export from index.ts as getConstructorParamTypes.\n */\nexport function getConstructorParamTypes(target: Function): unknown[] {\n const DESIGN_PARAMTYPES = 'design:paramtypes';\n return (Reflect.getMetadata(DESIGN_PARAMTYPES, target) as unknown[] | undefined) ?? [];\n}\n\n/**\n * Read metadata by key, supporting both own and inherited metadata.\n * Supports both 2-arg form (target only) and 3-arg form (target + propertyKey).\n * @internal Used by metadata readers.\n */\nexport function getMetadata<T>(\n key: string | symbol,\n target: object,\n propertyKey?: string | symbol\n): T | undefined {\n if (propertyKey !== undefined) {\n return Reflect.getMetadata(key, target, propertyKey) as T | undefined;\n }\n return Reflect.getMetadata(key, target) as T | undefined;\n}\n\n/**\n * Read metadata only from the target's own properties, not inherited.\n * @internal Used by metadata writers to avoid parent-child collisions.\n */\nexport function getOwnMetadata<T>(key: string | symbol, target: object): T | undefined {\n return Reflect.getOwnMetadata(key, target) as T | undefined;\n}\n\n/**\n * Define metadata on a target, replacing any prior value at this key.\n * Supports both 3-arg form (target only) and 4-arg form (target + propertyKey).\n * @internal Used by all decorator metadata writes.\n */\nexport function defineMetadata(\n key: string | symbol,\n value: unknown,\n target: object,\n propertyKey?: string | symbol\n): void {\n if (propertyKey !== undefined) {\n Reflect.defineMetadata(key, value, target, propertyKey);\n } else {\n Reflect.defineMetadata(key, value, target);\n }\n}\n\n/**\n * Read all metadata keys defined on a target.\n * @internal Used for exhaustive metadata enumeration.\n */\nexport function getMetadataKeys(target: object): (string | symbol)[] {\n return Reflect.getMetadataKeys(target);\n}\n\n/**\n * Check if metadata with a specific key exists on a target's own properties\n * (not inherited).\n * @internal Used by module and metadata checks.\n */\nexport function hasOwnMetadata(key: string | symbol, target: object): boolean {\n return Reflect.hasOwnMetadata(key, target);\n}\n","/**\n * @nextrush/class - Metadata Readers\n *\n * Utility functions to read decorator metadata from controller classes.\n * Used by @nextrush/class' registrar to build routes.\n */\n\nimport type {\n ControllerMetadata,\n ControllerRouteMetadata,\n ParamMetadata,\n RedirectMetadata,\n ResponseHeaderMetadata,\n} from '../types.js';\nimport { DECORATOR_METADATA_KEYS } from '../types.js';\nimport { getOwnMetadata as getOwnMetadataFromReflection } from '../reflection/reflection.js';\n\n/**\n * Check if a class has @Controller decorator.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController { }\n *\n * isController(UserController); // true\n * isController(SomeService); // false\n * ```\n */\nexport function isController(target: Function): boolean {\n return (\n getOwnMetadataFromReflection<ControllerMetadata>(DECORATOR_METADATA_KEYS.CONTROLLER, target) !== undefined\n );\n}\n\n/**\n * Get controller metadata from a class.\n * Returns undefined if class doesn't have @Controller decorator.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController { }\n *\n * const meta = getControllerMetadata(UserController);\n * // { path: '/users', version: undefined, middleware: undefined, tags: undefined }\n * ```\n */\nexport function getControllerMetadata(target: Function): ControllerMetadata | undefined {\n const meta = getOwnMetadataFromReflection<ControllerMetadata>(DECORATOR_METADATA_KEYS.CONTROLLER, target);\n return meta ? { ...meta } : undefined;\n}\n\n/**\n * Get all route metadata from a controller class.\n * Returns empty array if no routes are defined.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Get()\n * findAll() { }\n *\n * @Get('/:id')\n * findOne() { }\n * }\n *\n * const routes = getRouteMetadata(UserController);\n * // [{ method: 'GET', path: '/', ... }, { method: 'GET', path: '/:id', ... }]\n * ```\n */\nexport function getRouteMetadata(target: Function): ControllerRouteMetadata[] {\n const routes = getOwnMetadataFromReflection<ControllerRouteMetadata[]>(DECORATOR_METADATA_KEYS.ROUTES, target);\n return routes ? [...routes] : [];\n}\n\n/**\n * Get parameter metadata for a specific method.\n * Returns empty array if no parameters have decorators.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Get('/:id')\n * findOne(@Param('id') id: string, @Query('include') include: string) { }\n * }\n *\n * const params = getParamMetadata(UserController, 'findOne');\n * // [{ source: 'param', index: 0, name: 'id' }, { source: 'query', index: 1, name: 'include' }]\n * ```\n */\nexport function getParamMetadata(target: Function, methodName: string | symbol): ParamMetadata[] {\n const allParams: Map<string, ParamMetadata[]> | undefined =\n getOwnMetadataFromReflection<Map<string, ParamMetadata[]>>(DECORATOR_METADATA_KEYS.PARAMS, target);\n\n const params = allParams?.get(String(methodName));\n return params ? [...params] : [];\n}\n\n/**\n * Get all parameter metadata for all methods in a controller.\n * Returns a Map where keys are method names.\n *\n * @example\n * ```typescript\n * const allParams = getAllParamMetadata(UserController);\n * // Map { 'findOne' => [...], 'create' => [...] }\n * ```\n */\nexport function getAllParamMetadata(target: Function): Map<string, ParamMetadata[]> {\n const params = getOwnMetadataFromReflection<Map<string, ParamMetadata[]>>(\n DECORATOR_METADATA_KEYS.PARAMS,\n target\n );\n if (!params) return new Map();\n // Return a shallow copy to prevent external mutation\n const copy = new Map<string, ParamMetadata[]>();\n for (const [key, value] of params) {\n copy.set(key, [...value]);\n }\n return copy;\n}\n\n/**\n * Get full controller definition including metadata, routes, and params.\n * Returns undefined if class is not a controller.\n *\n * @example\n * ```typescript\n * const def = getControllerDefinition(UserController);\n * // {\n * // controller: { path: '/users', ... },\n * // routes: [{ method: 'GET', path: '/', ... }],\n * // params: Map { 'findOne' => [...] }\n * // }\n * ```\n */\nexport function getControllerDefinition(target: Function): ControllerDefinition | undefined {\n const controller = getControllerMetadata(target);\n\n if (!controller) {\n return undefined;\n }\n\n return {\n target,\n controller,\n routes: getRouteMetadata(target),\n params: getAllParamMetadata(target),\n };\n}\n\n/**\n * Full controller definition with all metadata\n */\nexport interface ControllerDefinition {\n /** Controller class constructor */\n readonly target: Function;\n\n /** Controller-level metadata */\n readonly controller: ControllerMetadata;\n\n /** All route metadata */\n readonly routes: ControllerRouteMetadata[];\n\n /** Parameter metadata keyed by method name */\n readonly params: Map<string, ParamMetadata[]>;\n}\n\n/**\n * Get response headers metadata for a controller method.\n *\n * Returns the list of `@SetHeader()` entries for the given method,\n * or an empty array if none are defined.\n */\nexport function getResponseHeaders(target: Function, methodName: string): ResponseHeaderMetadata[] {\n const map: Map<string, ResponseHeaderMetadata[]> | undefined = getOwnMetadataFromReflection<\n Map<string, ResponseHeaderMetadata[]>\n >(DECORATOR_METADATA_KEYS.RESPONSE_HEADERS, target);\n return [...(map?.get(methodName) ?? [])];\n}\n\n/**\n * Get redirect metadata for a controller method.\n *\n * Returns the `@Redirect()` configuration for the given method,\n * or `undefined` if not decorated.\n */\nexport function getRedirectMetadata(\n target: Function,\n methodName: string\n): RedirectMetadata | undefined {\n const map: Map<string, RedirectMetadata> | undefined = getOwnMetadataFromReflection<\n Map<string, RedirectMetadata>\n >(DECORATOR_METADATA_KEYS.REDIRECT, target);\n return map?.get(methodName);\n}\n\n/**\n * Get the `@HttpCode()` status code for a controller method.\n *\n * Returns the status code stored by `@HttpCode(code)`, or `undefined` if the\n * method is not decorated.\n */\nexport function getHttpCode(target: Function, methodName: string): number | undefined {\n const map: Map<string, number> | undefined = getOwnMetadataFromReflection<Map<string, number>>(\n DECORATOR_METADATA_KEYS.HTTP_CODE,\n target\n );\n return map?.get(methodName);\n}\n","/**\n * @nextrush/class - Error Classes\n *\n * Production-grade error classes with actionable messages.\n * Client errors (4xx) extend HttpError for proper status codes.\n */\n\nimport {\n BadRequestError,\n ForbiddenError,\n HttpError,\n InternalServerError,\n type HttpErrorOptions,\n} from '@nextrush/errors';\n\n/**\n * Base error class for controller-related server errors.\n * These are 500-level errors that indicate server-side issues.\n *\n * Note: We use `declare` for name/message to help TypeScript's declaration\n * emitter recognize that these are inherited from Error via @nextrush/errors.\n */\nexport class ControllerError extends InternalServerError {\n declare name: string;\n declare message: string;\n\n constructor(message: string, code: string, options?: HttpErrorOptions) {\n super(message, { code, ...options });\n this.name = 'ControllerError';\n }\n}\n\n/**\n * Error thrown when a class is not a valid controller.\n * This is a server configuration error (500).\n */\nexport class NotAControllerError extends ControllerError {\n constructor(className: string) {\n super(\n `Class \"${className}\" is not a controller.\\n\\n` +\n `To make it a controller, add the @Controller decorator:\\n\\n` +\n ` import { Controller } from '@nextrush/class';\\n\\n` +\n ` @Controller('/path')\\n` +\n ` class ${className} {\\n` +\n ` // ...\\n` +\n ` }\\n`,\n 'NOT_A_CONTROLLER'\n );\n this.name = 'NotAControllerError';\n }\n}\n\n/**\n * Error thrown when controller has no routes defined.\n * This is a server configuration error (500).\n */\nexport class NoRoutesError extends ControllerError {\n constructor(className: string) {\n super(\n `Controller \"${className}\" has no routes defined.\\n\\n` +\n `Add route decorators to your controller methods:\\n\\n` +\n ` import { Controller, Get, Post } from '@nextrush/class';\\n\\n` +\n ` @Controller('/users')\\n` +\n ` class ${className} {\\n` +\n ` @Get()\\n` +\n ` findAll() { }\\n\\n` +\n ` @Post()\\n` +\n ` create(@Body() data: CreateDto) { }\\n` +\n ` }\\n`,\n 'NO_ROUTES'\n );\n this.name = 'NoRoutesError';\n }\n}\n\n/**\n * Error thrown when file discovery fails.\n * This is a server configuration error (500).\n */\nexport class DiscoveryError extends ControllerError {\n readonly filePath: string;\n\n constructor(filePath: string, reason: string, cause?: Error) {\n super(\n `Failed to discover controllers in \"${filePath}\".\\n\\n` +\n `Reason: ${reason}\\n\\n` +\n `Possible fixes:\\n` +\n ` 1. Ensure the file exists and is accessible\\n` +\n ` 2. Check for syntax errors in the file\\n` +\n ` 3. Verify the file exports controller classes\\n`,\n 'DISCOVERY_ERROR',\n { cause }\n );\n this.name = 'DiscoveryError';\n this.filePath = filePath;\n }\n}\n\n/**\n * Error thrown when DI resolution fails for a controller.\n * This is a server configuration error (500).\n */\nexport class ControllerResolutionError extends ControllerError {\n readonly controllerName: string;\n\n constructor(controllerName: string, cause?: Error) {\n super(\n `Failed to resolve controller \"${controllerName}\" from DI container.\\n\\n` +\n `Possible causes:\\n` +\n ` 1. Controller is not registered in the DI container\\n` +\n ` 2. Controller has unresolvable dependencies\\n` +\n ` 3. Circular dependency detected\\n\\n` +\n `Note: @Controller automatically registers with DI - no @Service() needed!\\n\\n` +\n ` import { Controller } from '@nextrush/class';\\n\\n` +\n ` @Controller('/path')\\n` +\n ` class ${controllerName} {\\n` +\n ` constructor(private readonly service: SomeService) { }\\n` +\n ` }\\n`,\n 'CONTROLLER_RESOLUTION_ERROR',\n { cause }\n );\n this.name = 'ControllerResolutionError';\n this.controllerName = controllerName;\n }\n}\n\n/**\n * Error thrown when parameter injection fails.\n * This is a CLIENT error (400) - the request is malformed.\n */\nexport class ParameterInjectionError extends BadRequestError {\n declare name: string;\n declare message: string;\n readonly controllerName: string;\n readonly methodName: string;\n readonly paramIndex: number;\n\n constructor(\n controllerName: string,\n methodName: string,\n paramIndex: number,\n reason: string\n ) {\n super(\n `Invalid parameter at index ${paramIndex} for \"${controllerName}.${methodName}\": ${reason}`,\n {\n code: 'PARAMETER_INJECTION_ERROR',\n details: {\n controller: controllerName,\n method: methodName,\n parameterIndex: paramIndex,\n reason,\n },\n }\n );\n this.name = 'ParameterInjectionError';\n this.controllerName = controllerName;\n this.methodName = methodName;\n this.paramIndex = paramIndex;\n }\n}\n\n/**\n * Error thrown when a required parameter is missing.\n * This is a CLIENT error (400) - the request is incomplete.\n *\n * `messageOverride` lets callers replace the generic\n * `Required <source> parameter \"<name>\" is missing` text with a more\n * specific message (e.g. `@Body()` appends a body-parser remediation hint\n * in `resolveParametersFromPlan` — see `binding/param-resolver.ts`) while\n * keeping `code`/`details`/`instanceof MissingParameterError` unchanged, so\n * existing error-handling code that switches on the error type is\n * unaffected.\n */\nexport class MissingParameterError extends BadRequestError {\n declare name: string;\n declare message: string;\n readonly controllerName: string;\n readonly methodName: string;\n readonly paramName: string;\n readonly source: string;\n\n constructor(\n controllerName: string,\n methodName: string,\n paramName: string,\n source: string,\n messageOverride?: string\n ) {\n super(messageOverride ?? `Required ${source} parameter \"${paramName}\" is missing`, {\n code: 'MISSING_PARAMETER',\n details: {\n parameter: paramName,\n source,\n controller: controllerName,\n method: methodName,\n },\n });\n this.name = 'MissingParameterError';\n this.controllerName = controllerName;\n this.methodName = methodName;\n this.paramName = paramName;\n this.source = source;\n }\n}\n\n/**\n * Error thrown when route registration fails.\n * This is a server configuration error (500).\n */\nexport class RouteRegistrationError extends ControllerError {\n readonly controllerName: string;\n readonly method: string;\n readonly path: string;\n\n constructor(\n controllerName: string,\n method: string,\n path: string,\n reason: string,\n cause?: Error\n ) {\n super(\n `Failed to register route ${method} ${path} from controller \"${controllerName}\".\\n\\n` +\n `Reason: ${reason}\\n`,\n 'ROUTE_REGISTRATION_ERROR',\n { cause }\n );\n this.name = 'RouteRegistrationError';\n this.controllerName = controllerName;\n this.method = method;\n this.path = path;\n }\n}\n\n/**\n * Error thrown when a guard rejects the request.\n * This is a CLIENT error (403) - access denied.\n */\nexport class GuardRejectionError extends ForbiddenError {\n declare name: string;\n declare message: string;\n readonly guardName: string;\n\n constructor(guardName: string, message?: string) {\n super(message ?? 'Access denied', {\n code: 'GUARD_REJECTED',\n });\n this.name = 'GuardRejectionError';\n this.guardName = guardName;\n }\n}\n\n/**\n * Error thrown when a class passed where a module is expected is not a valid\n * module. This is a server configuration error (500).\n */\nexport class NotAModuleError extends ControllerError {\n constructor(className: string) {\n super(\n `Class \"${className}\" is not a module.\\n\\n` +\n `To make it a module, add the @Module decorator:\\n\\n` +\n ` import { Module } from '@nextrush/class';\\n\\n` +\n ` @Module({\\n` +\n ` controllers: [SomeController],\\n` +\n ` providers: [SomeService],\\n` +\n ` })\\n` +\n ` class ${className} {}\\n`,\n 'NOT_A_MODULE'\n );\n this.name = 'NotAModuleError';\n }\n}\n\n/**\n * Re-export HttpError for type checking in consumers\n */\nexport { HttpError };\n","/**\n * @nextrush/class - Controller Discovery\n *\n * Automatic controller discovery by scanning directories.\n * Uses glob patterns to find files and imports them to discover controllers.\n *\n * ## Import side-effect (important)\n *\n * Discovery works by **dynamically `import()`ing every matched module**, then\n * inspecting its exports for `@Controller` classes. Importing a module runs its\n * top-level code — so any side-effects at module scope (DI registration via\n * `@Service`/`@Repository`, singleton construction, connection setup) execute\n * during discovery. This is load-bearing: services and guards register with the\n * DI container as a side-effect of being imported (transitively via the\n * controllers that import them, or directly when matched).\n */\n\nimport { isController } from '../metadata/metadata.js';\nimport { readdir } from 'node:fs/promises';\nimport { extname, join, resolve, sep } from 'node:path';\nimport { pathToFileURL } from 'node:url';\nimport { DiscoveryError } from '../errors.js';\nimport type { DiscoveryOptions, DiscoveryResult } from '../registrar/registrar-types.js';\n\n/**\n * Default include patterns — the `*.controller.*` naming convention.\n *\n * Only files named like `user.controller.ts` are imported by default, rather\n * than every source file under `root`. This keeps startup fast and avoids\n * running unrelated module side-effects. Non-controller modules (services,\n * guards, repositories) still load transitively via the controllers that import\n * them, so their `@Service`/`@Repository` registration side-effects still fire.\n *\n * To restore scan-all behavior, pass `include: ['**/*.ts', '**/*.js']`.\n *\n * Single source of truth: re-used by the registrar so both entry points agree.\n */\nexport const DEFAULT_INCLUDE = ['**/*.controller.ts', '**/*.controller.js'];\n\n/** Default exclude patterns — tests and build/vendor artifacts. */\nexport const DEFAULT_EXCLUDE = [\n '**/*.test.ts',\n '**/*.spec.ts',\n '**/*.test.js',\n '**/*.spec.js',\n '**/node_modules/**',\n '**/dist/**',\n '**/__tests__/**',\n];\n\n/**\n * Maximum number of module imports performed concurrently during discovery.\n * Bounds the import fan-out so a large source tree can't open an unbounded\n * number of module evaluations at once, while still parallelizing I/O.\n */\nconst IMPORT_CONCURRENCY = 16;\n\n/**\n * Check if a filename matches any of the patterns\n *\n * Simple glob matching supporting:\n * - `**` matches any number of directories (including none)\n * - `*` matches any characters except /\n */\nfunction matchesPattern(filename: string, patterns: string[]): boolean {\n return patterns.some((pattern) => {\n // Convert glob pattern to regex\n // Order matters: escape special chars first, then replace glob patterns\n let regexStr = pattern\n .replace(/[.+^${}()|[\\]\\\\]/g, '\\\\$&') // Escape regex special chars (except * and ?)\n .replace(/\\*\\*\\//g, '(.*\\\\/)?') // **/ matches any directories (including none)\n .replace(/\\*\\*/g, '.*') // ** at end matches anything\n .replace(/\\*/g, '[^/]*'); // * matches anything except /\n\n const regex = new RegExp(`^${regexStr}$`);\n return regex.test(filename);\n });\n}\n\n/**\n * Check if a path should be included based on patterns\n */\nfunction shouldInclude(\n relativePath: string,\n includePatterns: string[],\n excludePatterns: string[]\n): boolean {\n // Check exclusions first\n if (matchesPattern(relativePath, excludePatterns)) {\n return false;\n }\n\n // Check inclusions\n return matchesPattern(relativePath, includePatterns);\n}\n\n/**\n * Recursively scan directory for files\n */\nasync function scanDirectory(\n dir: string,\n rootDir: string,\n includePatterns: string[],\n excludePatterns: string[]\n): Promise<string[]> {\n const files: string[] = [];\n\n try {\n const entries = await readdir(dir, { withFileTypes: true });\n\n for (const entry of entries) {\n const fullPath = join(dir, entry.name);\n // Normalize to POSIX separators for consistent glob matching\n const relativePath = fullPath\n .slice(rootDir.length + 1)\n .split(sep)\n .join('/');\n\n if (entry.isDirectory()) {\n // Skip excluded directories entirely\n if (\n entry.name === 'node_modules' ||\n entry.name === 'dist' ||\n entry.name === '__tests__' ||\n entry.name.startsWith('.')\n ) {\n continue;\n }\n\n // Recursively scan subdirectories\n const subFiles = await scanDirectory(fullPath, rootDir, includePatterns, excludePatterns);\n files.push(...subFiles);\n } else if (entry.isFile()) {\n const ext = extname(entry.name);\n if ((ext === '.ts' || ext === '.js') && !entry.name.endsWith('.d.ts')) {\n if (shouldInclude(relativePath, includePatterns, excludePatterns)) {\n files.push(fullPath);\n }\n }\n }\n }\n } catch (error) {\n // Directory doesn't exist or can't be read\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') {\n throw error;\n }\n }\n\n return files;\n}\n\n/**\n * Import a module and extract controller classes\n */\nasync function importControllers(\n filePath: string,\n debug: boolean\n): Promise<{ controllers: Function[]; errors: DiscoveryError[] }> {\n const controllers: Function[] = [];\n const errors: DiscoveryError[] = [];\n\n try {\n // Convert to file URL for ESM import\n const fileUrl = pathToFileURL(filePath).href;\n const module = await import(fileUrl);\n\n // Check all exports for controllers\n for (const exportName of Object.keys(module)) {\n const exported = module[exportName];\n\n if (typeof exported === 'function' && isController(exported)) {\n controllers.push(exported);\n if (debug) {\n process.stderr.write(`[Controllers] Discovered: ${exported.name} from ${filePath}\\n`);\n }\n }\n }\n } catch (error) {\n errors.push(\n new DiscoveryError(\n filePath,\n error instanceof Error ? error.message : String(error),\n error instanceof Error ? error : undefined\n )\n );\n }\n\n return { controllers, errors };\n}\n\n/**\n * Discover all controllers in a directory.\n *\n * Scans `root` for files matching `include` (default: the `*.controller.*`\n * convention) and dynamically imports each match to find `@Controller` classes.\n *\n * @remarks\n * **Side-effect:** every matched module is `import()`ed, which runs its\n * top-level code (including DI registration). See the module-level docs. Only\n * files matching the convention are imported by default; pass\n * `include: ['**/*.ts', '**/*.js']` to scan every source file instead.\n *\n * Imports run in parallel with a bounded concurrency cap\n * ({@link IMPORT_CONCURRENCY}); results are aggregated deterministically in\n * scan order regardless of import completion order.\n *\n * @param options - Discovery options\n * @returns Array of discovery results (one per scanned file), in scan order\n *\n * @example\n * ```typescript\n * // Imports only *.controller.ts / *.controller.js files\n * const controllers = await discoverControllers({\n * root: './src',\n * });\n * ```\n */\nexport async function discoverControllers(options: DiscoveryOptions): Promise<DiscoveryResult[]> {\n const rootDir = resolve(options.root);\n const includePatterns = options.include ?? DEFAULT_INCLUDE;\n const excludePatterns = options.exclude ?? DEFAULT_EXCLUDE;\n const debug = options.debug ?? false;\n\n if (debug) {\n process.stderr.write(`[Controllers] Scanning: ${rootDir}\\n`);\n process.stderr.write(`[Controllers] Include: ${includePatterns.join(', ')}\\n`);\n process.stderr.write(`[Controllers] Exclude: ${excludePatterns.join(', ')}\\n`);\n }\n\n // Scan for files\n const files = await scanDirectory(rootDir, rootDir, includePatterns, excludePatterns);\n\n if (debug) {\n process.stderr.write(`[Controllers] Found ${files.length} files to scan\\n`);\n }\n\n // Import and discover controllers in parallel with a bounded concurrency cap.\n // Results are written by index so aggregation stays deterministic (scan\n // order), independent of which import settles first.\n const results: DiscoveryResult[] = new Array(files.length);\n let cursor = 0;\n\n const worker = async (): Promise<void> => {\n for (let index = cursor++; index < files.length; index = cursor++) {\n const filePath = files[index]!;\n const { controllers, errors } = await importControllers(filePath, debug);\n results[index] = { filePath, controllers, errors };\n }\n };\n\n const workerCount = Math.min(IMPORT_CONCURRENCY, files.length);\n await Promise.all(Array.from({ length: workerCount }, () => worker()));\n\n return results;\n}\n\n/**\n * Get all controllers from discovery results\n */\nexport function getControllersFromResults(results: DiscoveryResult[]): Function[] {\n const controllers: Function[] = [];\n\n for (const result of results) {\n controllers.push(...result.controllers);\n }\n\n return controllers;\n}\n\n/**\n * Get all errors from discovery results\n */\nexport function getErrorsFromResults(results: DiscoveryResult[]): DiscoveryError[] {\n const errors: DiscoveryError[] = [];\n\n for (const result of results) {\n errors.push(...result.errors);\n }\n\n return errors;\n}\n","/**\n * @nextrush/class\n *\n * Unified class-based API for NextRush — decorators, DI, and controller registration.\n * Merges the former @nextrush/decorators and @nextrush/controllers into one cohesive package.\n *\n * @packageDocumentation\n */\n\n// Canonical reflect-metadata load for the package. Decorator metadata (route,\n// param, and DI reflection) depends on this side-effect import being evaluated\n// before any decorated class is defined; keeping it at the entry point avoids\n// scattering the same import across internal modules.\nimport 'reflect-metadata';\n\n// ============================================\n// DECORATORS: Controller, Routes, Parameters\n// ============================================\n\n// Types\nexport type {\n BodyOptions,\n CanActivate,\n Constructor,\n ControllerMetadata,\n ControllerOptions,\n ControllerRouteMetadata,\n CustomParamExtractor,\n ExceptionFilter,\n ExceptionFilterClass,\n FilterMetadata,\n Guard,\n GuardContext,\n GuardFn,\n GuardMetadata,\n HeaderOptions,\n Interceptor,\n InterceptorClass,\n InterceptorMetadata,\n MiddlewareRef,\n ParamMetadata,\n ParamOptions,\n ParamSource,\n QueryOptions,\n RedirectMetadata,\n ResponseHeaderMetadata,\n RouteMethods,\n RouteOptions,\n TransformFn,\n} from './types.js';\n// Re-exporting the deprecated alias itself (for the one-minor backward-compat window) is not a\n// violation of the deprecation — the rule should only fire on NEW consumers of the old name.\n// eslint-disable-next-line @typescript-eslint/no-deprecated\nexport type { RouteMetadata } from './types.js';\n\nexport {\n DECORATOR_METADATA_KEYS,\n isGuardClass,\n isValidHttpMethod,\n isValidParamSource,\n} from './types.js';\n\n// Service Lifecycle Hooks (duck-typed — no decorator)\nexport type { OnInit, OnShutdown } from './lifecycle/lifecycle-types.js';\nexport { isOnInit, isOnShutdown } from './lifecycle/lifecycle-types.js';\n\n// Class Decorators\nexport { Controller } from './decorators/class.js';\n\n// Module Decorator\nexport { Module, getModuleMetadata, isModule } from './modules/module.js';\nexport type {\n ModuleMetadata,\n ModuleOptions,\n ModuleProvider,\n ModuleProviderConfig,\n} from './modules/module-types.js';\n\n// Response Decorators\nexport { HttpCode } from './decorators/http-code.js';\nexport { Redirect, SetHeader } from './decorators/response-decorators.js';\n\n// Route Decorators\nexport {\n All,\n Delete,\n Get,\n Head,\n Options,\n Patch,\n Post,\n Put,\n} from './decorators/routes.js';\n\n// Parameter Decorators\nexport { Body, Ctx, Header, Param, Query, Req, Res, createCustomParamDecorator } from './binding/params.js';\n\n// Guard Decorators\nexport { UseGuard, getAllGuards, getClassGuards, getMethodGuards } from './guards/guards.js';\n\n// Exception Filter Decorators\nexport {\n Catch,\n UseFilter,\n getAllFilters,\n getCatchTypes,\n getClassFilters,\n getMethodFilters,\n} from './filters/filters.js';\n\n// Interceptor Decorators\nexport {\n UseInterceptor,\n getAllInterceptors,\n getClassInterceptors,\n getMethodInterceptors,\n} from './interceptors/interceptors.js';\n\n// Metadata Readers\nexport type { ControllerDefinition } from './metadata/metadata.js';\n\nexport {\n getAllParamMetadata,\n getControllerDefinition,\n getControllerMetadata,\n getHttpCode,\n getParamMetadata,\n getRedirectMetadata,\n getResponseHeaders,\n getRouteMetadata,\n isController,\n} from './metadata/metadata.js';\n\n// Internal reflection helpers (for DI use)\nexport { getConstructorParamTypes } from './reflection/reflection.js';\n\n// ============================================\n// CONTROLLERS: Auto-discovery & Registration\n// ============================================\n\n// Registration\nexport { registerControllers } from './registrar/registrar.js';\n\n// Module registration\nexport { registerModule, type ModuleRegistrationOptions } from './modules/module-registrar.js';\nexport { collectModuleControllers, collectModuleGraph } from './modules/module-graph.js';\n\n// Discovery\nexport {\n discoverControllers,\n getControllersFromResults,\n getErrorsFromResults\n} from './discovery/discovery.js';\n\n// Discovery Source (new)\nexport type { DiscoverySource } from './discovery/source.js';\nexport { FilesystemSource, MemorySource } from './discovery/source.js';\n\n// Bootstrap Graph IR (RFC-NEXTRUSH-CLASS-CONSOLIDATION P3.4)\nexport type { ApplicationGraph } from './bootstrap/graph.js';\n\n// Diagnostics (RFC-NEXTRUSH-CLASS-CONSOLIDATION P3.6)\nexport type {\n CircularDependency,\n DiagnosticsReport,\n DuplicateRoute,\n ProviderEntry,\n RouteEntry,\n TimingEntry,\n} from './diagnostics/index.js';\nexport { getClassDiagnostics } from './diagnostics/get-diagnostics.js';\n\n// Registry\nexport { ControllerRegistry } from './registrar/registry.js';\n\n// Builder\nexport { buildRoutes } from './registrar/builder.js';\n\n// Types\nexport type {\n BuiltRoute,\n ControllersOptions,\n DiscoveryOptions,\n DiscoveryResult,\n RegisteredController,\n ResolvedOptions\n} from './registrar/registrar-types.js';\n\n// Errors\nexport {\n ControllerError,\n ControllerResolutionError,\n DiscoveryError,\n GuardRejectionError,\n HttpError,\n MissingParameterError,\n NoRoutesError,\n NotAControllerError,\n NotAModuleError,\n ParameterInjectionError,\n RouteRegistrationError\n} from './errors.js';\n\n// ============================================\n// DI: Re-exports from @nextrush/di\n// ============================================\n\nexport {\n Repository,\n Service,\n container,\n createContainer,\n inject,\n type Container\n} from '@nextrush/di';\n","/**\n * @nextrush/class - Class Decorators\n *\n * Controller decorator that marks a class as an HTTP controller.\n * Makes the class injectable for DI via @nextrush/di abstraction.\n * Lifecycle management (singleton/transient) is deferred to the\n * controllers plugin registry, enabling proper test isolation.\n * Uses legacy decorators for compatibility with parameter decorators.\n */\n\nimport { markInjectable } from '@nextrush/di';\nimport { defineMetadata } from '../reflection/reflection.js';\nimport { normalizePath } from '../path-utils.js';\nimport type { ControllerMetadata, ControllerOptions } from '../types.js';\nimport { DECORATOR_METADATA_KEYS } from '../types.js';\n\n/**\n * Marks a class as an HTTP controller with DI support.\n *\n * This decorator:\n * 1. Registers the class as an HTTP controller with route metadata\n * 2. Makes the class injectable (resolvable by the DI container)\n *\n * Lifecycle is managed by the controllers plugin, not the decorator.\n * You do NOT need to add @Service() when using @Controller() - it's included!\n *\n * @param pathOrOptions - Base path string or controller options\n * @returns Class decorator\n *\n * @example\n * ```typescript\n * // Simple path - DI is automatic!\n * @Controller('/users')\n * class UserController {\n * constructor(private userService: UserService) {} // Auto-injected\n * }\n *\n * // With options\n * @Controller({ path: '/users', version: 'v1' })\n * class UserController { }\n *\n * // Default path (uses class name)\n * @Controller()\n * class UserController { } // → '/user'\n * ```\n */\nexport function Controller(pathOrOptions?: string | ControllerOptions): ClassDecorator {\n return function controllerDecorator<TFunction extends Function>(target: TFunction): TFunction {\n const options = normalizeControllerOptions(pathOrOptions, target.name);\n\n const metadata: ControllerMetadata = {\n path: options.path ?? '/',\n version: options.version,\n middleware: options.middleware,\n tags: options.tags,\n };\n\n // Store controller metadata\n defineMetadata(DECORATOR_METADATA_KEYS.CONTROLLER, metadata, target);\n\n // Make the class injectable (resolvable by DI container)\n // Lifecycle (singleton vs transient) is controlled by the container/registry,\n // NOT by the decorator — this enables test isolation with fresh instances\n markInjectable(target as unknown as new (...args: unknown[]) => unknown);\n\n return target;\n };\n}\n\n/**\n * Normalize controller options from string or object input.\n */\nfunction normalizeControllerOptions(\n input: string | ControllerOptions | undefined,\n className: string\n): ControllerOptions {\n if (typeof input === 'string') {\n return { path: normalizePath(input, { stripTrailingSlash: true }) };\n }\n\n if (input && typeof input === 'object') {\n return {\n ...input,\n path: input.path\n ? normalizePath(input.path, { stripTrailingSlash: true })\n : derivePathFromClassName(className),\n };\n }\n\n return { path: derivePathFromClassName(className) };\n}\n\n/**\n * Derive a path from class name by removing 'Controller' suffix and converting to kebab-case.\n *\n * @example\n * UserController → /user\n * UserProfileController → /user-profile\n * APIController → /api\n */\nfunction derivePathFromClassName(className: string): string {\n const baseName = className.replace(/Controller$/i, '');\n\n if (!baseName) {\n return '/';\n }\n\n const kebabCase = baseName\n .replace(/([a-z0-9])([A-Z])/g, '$1-$2')\n .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2')\n .toLowerCase();\n\n return `/${kebabCase}`;\n}\n","/**\n * @nextrush/class - Path normalization utilities\n *\n * Single source of truth for path normalization shared by the controller\n * decorator and the route decorators. These two historically diverged:\n * `@Controller` strips a trailing slash while route decorators (`@Get`, etc.)\n * do not. That divergence is intentional (a controller base path is a prefix,\n * a route path may legitimately end in `/`), so it is preserved behind an\n * explicit option rather than silently unified.\n */\n\n/**\n * Options controlling {@link normalizePath} behavior.\n */\nexport interface NormalizePathOptions {\n /**\n * Strip a single trailing slash for paths longer than `/`.\n * `@Controller` sets this; route decorators leave it off.\n */\n readonly stripTrailingSlash?: boolean;\n}\n\n/**\n * Normalize a path so it starts with exactly one leading slash.\n *\n * By default a trailing slash is preserved (route-decorator semantics). Pass\n * `{ stripTrailingSlash: true }` to also remove a trailing slash for paths\n * longer than `/` (controller semantics).\n */\nexport function normalizePath(path: string, options: NormalizePathOptions = {}): string {\n let normalized = path.trim();\n\n if (!normalized.startsWith('/')) {\n normalized = '/' + normalized;\n }\n\n if (options.stripTrailingSlash && normalized.length > 1 && normalized.endsWith('/')) {\n normalized = normalized.slice(0, -1);\n }\n\n return normalized;\n}\n","/**\n * @nextrush/class - Module Decorator\n *\n * `@Module` records a feature's composition — its imported modules, controllers,\n * providers, and exports — as reflect-metadata. It is a grouping/composition\n * unit; the `@nextrush/class` `registerModule` registrar reads this\n * metadata to wire the whole module graph in one call.\n *\n * This layer stores metadata only. Provider registration, route building, and\n * (future) encapsulation live in the controllers layer — see\n * RFC-NEXTRUSH-MODULES.\n */\n\nimport { markInjectable } from '@nextrush/di';\nimport { defineMetadata, getOwnMetadata, hasOwnMetadata } from '../reflection/reflection.js';\nimport { DECORATOR_METADATA_KEYS } from '../metadata/metadata-keys.js';\nimport type { ModuleMetadata, ModuleOptions } from './module-types.js';\n\n/**\n * Marks a class as a NextRush module.\n *\n * @param options - The module's imports, controllers, providers, and exports.\n * @returns Class decorator\n *\n * @example\n * ```typescript\n * @Module({\n * imports: [BillingModule],\n * controllers: [UserController],\n * providers: [UserService, { provide: 'CONFIG', useValue: cfg }],\n * exports: [UserService],\n * })\n * class UserModule {}\n * ```\n */\nexport function Module(options: ModuleOptions = {}): ClassDecorator {\n return function moduleDecorator<TFunction extends Function>(target: TFunction): TFunction {\n const metadata: ModuleMetadata = {\n imports: [...(options.imports ?? [])],\n controllers: [...(options.controllers ?? [])],\n providers: [...(options.providers ?? [])],\n exports: [...(options.exports ?? [])],\n };\n\n defineMetadata(DECORATOR_METADATA_KEYS.MODULE, metadata, target);\n\n // Mark injectable for symmetry with @Controller so a module class can itself\n // participate in DI graph walks without special-casing.\n markInjectable(target as unknown as new (...args: unknown[]) => unknown);\n\n return target;\n };\n}\n\n/**\n * Check if a class carries `@Module` metadata.\n */\nexport function isModule(target: Function): boolean {\n return hasOwnMetadata(DECORATOR_METADATA_KEYS.MODULE, target);\n}\n\n/**\n * Read a module's metadata. Returns a defensive copy (fresh arrays) so callers\n * cannot mutate the stored record. Returns `undefined` when `target` is not a\n * module.\n */\nexport function getModuleMetadata(target: Function): ModuleMetadata | undefined {\n const meta: ModuleMetadata | undefined = getOwnMetadata(\n DECORATOR_METADATA_KEYS.MODULE,\n target\n );\n\n if (!meta) {\n return undefined;\n }\n\n return {\n imports: [...meta.imports],\n controllers: [...meta.controllers],\n providers: [...meta.providers],\n exports: [...meta.exports],\n };\n}\n","/**\n * @nextrush/class - @HttpCode Decorator\n *\n * Sets the HTTP status code returned when a controller method resolves with a\n * value. Lives in its own module because `routes.ts` is already at the\n * file-size ceiling.\n */\n\nimport { getOwnMetadata, defineMetadata } from '../reflection/reflection.js';\nimport { DECORATOR_METADATA_KEYS } from '../types.js';\n\n/**\n * Set the HTTP status code for the response when the decorated method returns.\n *\n * Takes precedence over the route decorator's `statusCode` option (e.g.\n * `@Post('/x', { statusCode: 200 })`) when both are present. Does not affect\n * responses produced by a thrown `HttpError` (those keep the error's status)\n * or by `@Redirect` (the redirect status wins).\n *\n * @param statusCode - HTTP status code to apply (e.g. 201, 202, 204)\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Post()\n * @HttpCode(201)\n * create(@Body() data: CreateUserDto) {\n * return this.users.create(data); // → 201 Created\n * }\n * }\n * ```\n */\nexport function HttpCode(statusCode: number): MethodDecorator {\n return function httpCodeDecorator(\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const methodKey = String(propertyKey);\n\n const existing: Map<string, number> =\n getOwnMetadata(DECORATOR_METADATA_KEYS.HTTP_CODE, target.constructor) ?? new Map();\n\n existing.set(methodKey, statusCode);\n\n defineMetadata(DECORATOR_METADATA_KEYS.HTTP_CODE, existing, target.constructor);\n\n return descriptor;\n };\n}\n","/**\n * @nextrush/class - Response Decorators\n *\n * Method decorators that shape the HTTP response: @SetHeader attaches response\n * headers and @Redirect declares a redirect. Stored as reflect-metadata read by\n * the controllers handler builder.\n */\n\nimport { getOwnMetadata, defineMetadata } from '../reflection/reflection.js';\nimport type { RedirectMetadata, ResponseHeaderMetadata } from '../types.js';\nimport { DECORATOR_METADATA_KEYS } from '../types.js';\n\n/**\n * Set a response header on the decorated method.\n *\n * Multiple `@SetHeader()` decorators can be stacked on the same method.\n *\n * @param name - Header name (e.g., 'Cache-Control')\n * @param value - Header value (e.g., 'no-cache')\n *\n * @example\n * ```typescript\n * @Controller('/files')\n * class FileController {\n * @Get('/:id')\n * @SetHeader('Cache-Control', 'max-age=3600')\n * @SetHeader('X-Custom', 'value')\n * getFile(@Param('id') id: string) {\n * return { id };\n * }\n * }\n * ```\n */\nexport function SetHeader(name: string, value: string): MethodDecorator {\n return function setHeaderDecorator(\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const methodKey = String(propertyKey);\n\n const existing: Map<string, ResponseHeaderMetadata[]> =\n getOwnMetadata(DECORATOR_METADATA_KEYS.RESPONSE_HEADERS, target.constructor) ??\n new Map();\n\n const headers = existing.get(methodKey) ?? [];\n headers.push({ name, value });\n existing.set(methodKey, headers);\n\n defineMetadata(DECORATOR_METADATA_KEYS.RESPONSE_HEADERS, existing, target.constructor);\n\n return descriptor;\n };\n}\n\n/**\n * Redirect the response when the decorated method is called.\n *\n * If the method returns a string, it overrides the decorator's URL.\n * If the method returns an object with `url` and/or `statusCode`, those override as well.\n *\n * @param url - Default redirect URL\n * @param statusCode - HTTP status code (default: 302)\n *\n * @example\n * ```typescript\n * @Controller('/legacy')\n * class LegacyController {\n * @Get('/old-page')\n * @Redirect('/new-page', 301)\n * redirectOld() {\n * // Optional: return a string to override the URL\n * }\n *\n * @Get('/dynamic')\n * @Redirect('/fallback')\n * dynamicRedirect() {\n * // Return a string to redirect elsewhere\n * return '/actual-destination';\n * }\n * }\n * ```\n */\nexport function Redirect(url: string, statusCode = 302): MethodDecorator {\n return function redirectDecorator(\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const methodKey = String(propertyKey);\n\n const existing: Map<string, RedirectMetadata> =\n getOwnMetadata(DECORATOR_METADATA_KEYS.REDIRECT, target.constructor) ?? new Map();\n\n existing.set(methodKey, { url, statusCode });\n\n defineMetadata(DECORATOR_METADATA_KEYS.REDIRECT, existing, target.constructor);\n\n return descriptor;\n };\n}\n","/**\n * @nextrush/class - Route Decorators\n *\n * HTTP method decorators for controller methods.\n * Uses legacy decorators for compatibility with parameter decorators.\n */\n\nimport { getOwnMetadata, defineMetadata } from '../reflection/reflection.js';\nimport { normalizePath } from '../path-utils.js';\nimport type { ControllerRouteMetadata, RouteMethods, RouteOptions } from '../types.js';\nimport { DECORATOR_METADATA_KEYS } from '../types.js';\n\n/**\n * Create a route decorator for a specific HTTP method.\n */\nfunction createRouteDecorator(method: RouteMethods) {\n return function routeDecoratorFactory(\n pathOrOptions?: string | RouteOptions,\n options?: RouteOptions\n ): MethodDecorator {\n return function routeDecorator(\n target: object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor {\n const { path, routeOptions } = normalizeRouteInput(pathOrOptions, options);\n\n const metadata: ControllerRouteMetadata = {\n method,\n path,\n methodName: propertyKey,\n propertyKey,\n middleware: routeOptions?.middleware,\n statusCode: routeOptions?.statusCode,\n description: routeOptions?.description,\n deprecated: routeOptions?.deprecated,\n };\n\n const existingRoutes: ControllerRouteMetadata[] =\n getOwnMetadata(DECORATOR_METADATA_KEYS.ROUTES, target.constructor) ?? [];\n\n defineMetadata(\n DECORATOR_METADATA_KEYS.ROUTES,\n [...existingRoutes, metadata],\n target.constructor\n );\n\n return descriptor;\n };\n };\n}\n\n/**\n * Normalize route decorator input to path and options.\n */\nfunction normalizeRouteInput(\n pathOrOptions?: string | RouteOptions,\n options?: RouteOptions\n): { path: string; routeOptions?: RouteOptions } {\n if (typeof pathOrOptions === 'string') {\n return { path: normalizePath(pathOrOptions), routeOptions: options };\n }\n\n if (pathOrOptions && typeof pathOrOptions === 'object') {\n const path = pathOrOptions.path ? normalizePath(pathOrOptions.path) : '/';\n return { path, routeOptions: pathOrOptions };\n }\n\n return { path: '/', routeOptions: options };\n}\n\n/**\n * @Get decorator - Marks a method as handling HTTP GET requests.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Get()\n * findAll() { }\n *\n * @Get('/:id')\n * findOne(@Param('id') id: string) { }\n *\n * @Get('/search', { description: 'Search users' })\n * search(@Query('q') query: string) { }\n * }\n * ```\n */\nexport const Get = createRouteDecorator('GET');\n\n/**\n * @Post decorator - Marks a method as handling HTTP POST requests.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Post()\n * create(@Body() data: CreateUserDto) { }\n *\n * @Post('/bulk', { statusCode: 201 })\n * createMany(@Body() users: CreateUserDto[]) { }\n * }\n * ```\n */\nexport const Post = createRouteDecorator('POST');\n\n/**\n * @Put decorator - Marks a method as handling HTTP PUT requests.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Put('/:id')\n * update(@Param('id') id: string, @Body() data: UpdateUserDto) { }\n * }\n * ```\n */\nexport const Put = createRouteDecorator('PUT');\n\n/**\n * @Delete decorator - Marks a method as handling HTTP DELETE requests.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Delete('/:id')\n * remove(@Param('id') id: string) { }\n * }\n * ```\n */\nexport const Delete = createRouteDecorator('DELETE');\n\n/**\n * @Patch decorator - Marks a method as handling HTTP PATCH requests.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Patch('/:id')\n * partialUpdate(@Param('id') id: string, @Body() data: Partial<User>) { }\n * }\n * ```\n */\nexport const Patch = createRouteDecorator('PATCH');\n\n/**\n * @Head decorator - Marks a method as handling HTTP HEAD requests.\n *\n * @example\n * ```typescript\n * @Controller('/files')\n * class FileController {\n * @Head('/:id')\n * checkExists(@Param('id') id: string) { }\n * }\n * ```\n */\nexport const Head = createRouteDecorator('HEAD');\n\n/**\n * @Options decorator - Marks a method as handling HTTP OPTIONS requests.\n *\n * @example\n * ```typescript\n * @Controller('/api')\n * class ApiController {\n * @Options()\n * cors() { }\n * }\n * ```\n */\nexport const Options = createRouteDecorator('OPTIONS');\n\n/**\n * @All decorator - Marks a method as handling all HTTP methods.\n * Registers a single any-method route entry (T016) — matched by every\n * standard HTTP method via the router's own `Router.all()`/`GroupRouter.all()`\n * ANY-method registration, rather than one explicit RouteMetadata entry per\n * enumerated method. `getRoutes()`/route introspection sees one row for an\n * `@All()` route, consistent with how it was actually authored.\n *\n * @example\n * ```typescript\n * @Controller('/proxy')\n * class ProxyController {\n * @All('/*')\n * handle(@Ctx() ctx: Context) { }\n * }\n * ```\n */\nexport const All = createRouteDecorator('ALL');\n","/**\n * @nextrush/class - Parameter decorator factory helpers\n *\n * Shared machinery behind the standard parameter decorators: the source-specific\n * decorator factory, input normalization, and the read-append-write of parameter\n * metadata (all reflect-metadata access routed through reflection.ts). Extracted\n * from param-decorators.ts so that file stays focused on the decorator surface.\n */\n\nimport type { ParamMetadata, ParamSource, TransformFn } from '../types.js';\nimport { DECORATOR_METADATA_KEYS } from '../types.js';\nimport { defineMetadata, getOwnMetadata } from '../reflection/reflection.js';\n\n/**\n * Create a parameter decorator for a specific source.\n */\nexport function createParamDecorator<\n TOptions extends { transform?: TransformFn; required?: boolean; defaultValue?: unknown },\n>(source: ParamSource, defaultRequired: boolean) {\n return function paramDecoratorFactory(\n nameOrOptions?: string | TOptions,\n options?: TOptions\n ): ParameterDecorator {\n return function paramDecorator(\n target: object,\n propertyKey: string | symbol | undefined,\n parameterIndex: number\n ): void {\n if (propertyKey === undefined) {\n throw new Error(\n `Parameter decorator @${source.charAt(0).toUpperCase() + source.slice(1)} can only be used on method parameters, not constructor parameters.`\n );\n }\n\n const { name, paramOptions } = normalizeParamInput(nameOrOptions, options, source);\n\n const metadata: ParamMetadata = {\n source,\n index: parameterIndex,\n name,\n required: paramOptions?.required ?? defaultRequired,\n defaultValue: paramOptions?.defaultValue,\n transform: paramOptions?.transform,\n };\n\n pushParamMetadata(target, propertyKey, metadata);\n };\n };\n}\n\n/**\n * Normalize parameter decorator input.\n */\nfunction normalizeParamInput<TOptions>(\n nameOrOptions: string | TOptions | undefined,\n options: TOptions | undefined,\n source: ParamSource\n): { name?: string; paramOptions?: TOptions } {\n if (typeof nameOrOptions === 'string') {\n return { name: nameOrOptions, paramOptions: options };\n }\n\n if (nameOrOptions && typeof nameOrOptions === 'object') {\n return { paramOptions: nameOrOptions };\n }\n\n if (source === 'body' || source === 'ctx' || source === 'req' || source === 'res') {\n return { paramOptions: options };\n }\n\n return { paramOptions: options };\n}\n\n/**\n * Append parameter metadata for a method onto its controller class.\n *\n * Uses `getOwnMetadata` so a subclass never inherits a parent's parameter map.\n * Shared by every parameter decorator to avoid duplicating the read-append-write\n * dance against reflect-metadata.\n */\nexport function pushParamMetadata(\n target: object,\n propertyKey: string | symbol,\n metadata: ParamMetadata\n): void {\n const methodKey = `${String(propertyKey)}`;\n\n const existingParams: Map<string, ParamMetadata[]> =\n getOwnMetadata<Map<string, ParamMetadata[]>>(DECORATOR_METADATA_KEYS.PARAMS, target.constructor) ?? new Map();\n\n const methodParams = existingParams.get(methodKey) ?? [];\n methodParams.push(metadata);\n existingParams.set(methodKey, methodParams);\n\n defineMetadata(DECORATOR_METADATA_KEYS.PARAMS, existingParams, target.constructor);\n}\n","/**\n * @nextrush/class - Standard Parameter Decorators\n *\n * Parameter decorators for injecting request data into controller method parameters.\n * Uses legacy decorators (parameter decorators not supported in Stage 3).\n */\n\nimport type {\n BodyOptions,\n HeaderOptions,\n ParamMetadata,\n ParamOptions,\n QueryOptions,\n} from '../types.js';\nimport { createParamDecorator, pushParamMetadata } from './param-factory.js';\n\n/**\n * @Body decorator - Injects the request body into the parameter.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * // Inject entire body\n * @Post()\n * create(@Body() data: CreateUserDto) { }\n *\n * // Inject specific property from body\n * @Post('/email')\n * updateEmail(@Body('email') email: string) { }\n *\n * // With transform\n * @Post()\n * create(@Body({ transform: validateCreateUser }) data: CreateUserDto) { }\n * }\n * ```\n */\nexport const Body: {\n (): ParameterDecorator;\n (property: string): ParameterDecorator;\n (options: BodyOptions): ParameterDecorator;\n (property: string, options: BodyOptions): ParameterDecorator;\n} = createParamDecorator<BodyOptions>('body', true) as typeof Body;\n\n/**\n * @Param decorator - Injects route parameters into the parameter.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * // Inject all params\n * @Get('/:id')\n * findOne(@Param() params: { id: string }) { }\n *\n * // Inject specific param\n * @Get('/:id')\n * findOne(@Param('id') id: string) { }\n *\n * // With transform (e.g., parse to number)\n * @Get('/:id')\n * findOne(@Param('id', { transform: Number }) id: number) { }\n * }\n * ```\n */\nexport const Param: {\n (): ParameterDecorator;\n (name: string): ParameterDecorator;\n (options: ParamOptions): ParameterDecorator;\n (name: string, options: ParamOptions): ParameterDecorator;\n} = createParamDecorator<ParamOptions>('param', true) as typeof Param;\n\n/**\n * @Query decorator - Injects query parameters into the parameter.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * // Inject all query params\n * @Get()\n * findAll(@Query() query: { page?: number; limit?: number }) { }\n *\n * // Inject specific query param\n * @Get()\n * findAll(@Query('page') page: string) { }\n *\n * // With default value\n * @Get()\n * findAll(@Query('limit', { defaultValue: 10, transform: Number }) limit: number) { }\n * }\n * ```\n */\nexport const Query: {\n (): ParameterDecorator;\n (name: string): ParameterDecorator;\n (options: QueryOptions): ParameterDecorator;\n (name: string, options: QueryOptions): ParameterDecorator;\n} = createParamDecorator<QueryOptions>('query', false) as typeof Query;\n\n/**\n * @Header decorator - Injects request headers into the parameter.\n *\n * @example\n * ```typescript\n * @Controller('/api')\n * class ApiController {\n * // Inject all headers\n * @Get()\n * handle(@Header() headers: Record<string, string>) { }\n *\n * // Inject specific header\n * @Get()\n * handle(@Header('authorization') auth: string) { }\n *\n * // With default value\n * @Get()\n * handle(@Header('x-api-version', { defaultValue: 'v1' }) version: string) { }\n * }\n * ```\n */\nexport const Header: {\n (): ParameterDecorator;\n (name: string): ParameterDecorator;\n (options: HeaderOptions): ParameterDecorator;\n (name: string, options: HeaderOptions): ParameterDecorator;\n} = createParamDecorator<HeaderOptions>('header', false) as typeof Header;\n\n/**\n * @Ctx decorator - Injects the full NextRush Context object.\n *\n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Get('/:id')\n * findOne(@Ctx() ctx: Context) {\n * const id = ctx.params.id;\n * ctx.json({ id });\n * }\n * }\n * ```\n */\nexport function Ctx(): ParameterDecorator {\n return function ctxDecorator(\n target: object,\n propertyKey: string | symbol | undefined,\n parameterIndex: number\n ): void {\n if (propertyKey === undefined) {\n throw new Error('@Ctx can only be used on method parameters, not constructor parameters.');\n }\n\n const metadata: ParamMetadata = {\n source: 'ctx',\n index: parameterIndex,\n required: false,\n };\n\n pushParamMetadata(target, propertyKey, metadata);\n };\n}\n\n/**\n * @Req decorator - Injects the raw request object (adapter-specific).\n *\n * @example\n * ```typescript\n * @Controller('/files')\n * class FileController {\n * @Post('/upload')\n * upload(@Req() req: IncomingMessage) {\n * // Access raw Node.js request for streaming\n * }\n * }\n * ```\n */\nexport function Req(): ParameterDecorator {\n return function reqDecorator(\n target: object,\n propertyKey: string | symbol | undefined,\n parameterIndex: number\n ): void {\n if (propertyKey === undefined) {\n throw new Error('@Req can only be used on method parameters, not constructor parameters.');\n }\n\n const metadata: ParamMetadata = {\n source: 'req',\n index: parameterIndex,\n required: false,\n };\n\n pushParamMetadata(target, propertyKey, metadata);\n };\n}\n\n/**\n * @Res decorator - Injects the raw response object (adapter-specific).\n *\n * @example\n * ```typescript\n * @Controller('/files')\n * class FileController {\n * @Get('/download/:id')\n * download(@Res() res: ServerResponse) {\n * // Access raw Node.js response for streaming\n * }\n * }\n * ```\n */\nexport function Res(): ParameterDecorator {\n return function resDecorator(\n target: object,\n propertyKey: string | symbol | undefined,\n parameterIndex: number\n ): void {\n if (propertyKey === undefined) {\n throw new Error('@Res can only be used on method parameters, not constructor parameters.');\n }\n\n const metadata: ParamMetadata = {\n source: 'res',\n index: parameterIndex,\n required: false,\n };\n\n pushParamMetadata(target, propertyKey, metadata);\n };\n}\n","/**\n * @nextrush/class - Custom Parameter Decorator Factory\n *\n * User-defined parameter extractors for custom injection patterns.\n */\n\nimport type {\n CustomParamExtractor,\n ParamMetadata,\n TransformFn,\n} from '../types.js';\nimport { DECORATOR_METADATA_KEYS } from '../types.js';\nimport { getOwnMetadata, defineMetadata } from '../reflection/reflection.js';\n\n/**\n * Append parameter metadata for a method onto its controller class.\n *\n * Uses `getOwnMetadata` so a subclass never inherits a parent's parameter map.\n * Shared by every parameter decorator to avoid duplicating the read-append-write\n * dance against reflect-metadata.\n */\nfunction pushParamMetadata(\n target: object,\n propertyKey: string | symbol,\n metadata: ParamMetadata\n): void {\n const methodKey = `${String(propertyKey)}`;\n\n const existingParams: Map<string, ParamMetadata[]> =\n getOwnMetadata<Map<string, ParamMetadata[]>>(DECORATOR_METADATA_KEYS.PARAMS, target.constructor) ?? new Map();\n\n const methodParams = existingParams.get(methodKey) ?? [];\n methodParams.push(metadata);\n existingParams.set(methodKey, methodParams);\n\n defineMetadata(DECORATOR_METADATA_KEYS.PARAMS, existingParams, target.constructor);\n}\n\n/**\n * Create a custom parameter decorator with a user-defined extraction function.\n *\n * The extractor receives the request context and returns the value to inject\n * into the handler parameter. Supports both sync and async extractors.\n *\n * @param extractor - Function that extracts the parameter value from context\n * @param options - Optional transform and required settings\n *\n * @example\n * ```typescript\n * // Extract the authenticated user from state\n * const CurrentUser = createCustomParamDecorator(\n * (ctx) => ctx.state.user\n * );\n *\n * // Extract a specific cookie\n * const Cookie = (name: string) => createCustomParamDecorator(\n * (ctx) => ctx.get('cookie')?.split(';')\n * .find(c => c.trim().startsWith(name + '='))\n * ?.split('=')[1]\n * );\n *\n * @Controller('/users')\n * class UserController {\n * @Get('/me')\n * getProfile(@CurrentUser user: User) {\n * return user;\n * }\n * }\n * ```\n */\nexport function createCustomParamDecorator(\n extractor: CustomParamExtractor,\n options?: { transform?: TransformFn; required?: boolean }\n): ParameterDecorator {\n return function customParamDecorator(\n target: object,\n propertyKey: string | symbol | undefined,\n parameterIndex: number\n ): void {\n if (propertyKey === undefined) {\n throw new Error(\n 'Custom parameter decorator can only be used on method parameters, not constructor parameters.'\n );\n }\n\n const metadata: ParamMetadata = {\n source: 'custom',\n index: parameterIndex,\n required: options?.required ?? false,\n transform: options?.transform,\n customExtractor: extractor,\n };\n\n pushParamMetadata(target, propertyKey, metadata);\n };\n}\n","/**\n * @nextrush/class - Guard Decorators\n *\n * Guards are functions or classes that determine if a request should be handled.\n * They run BEFORE the route handler and can prevent execution.\n *\n * Use guards for:\n * - Authentication checks\n * - Authorization/permission checks\n * - Rate limiting\n * - Feature flags\n */\n\nimport { getMetadata, defineMetadata } from '../reflection/reflection.js';\nimport type { Guard, GuardMetadata } from '../types.js';\nimport { DECORATOR_METADATA_KEYS, isGuardClass } from '../types.js';\n\n/**\n * Apply guards to a controller or route.\n *\n * Guards run in order and must all pass for the request to proceed.\n * If any guard returns false or throws, the request is rejected.\n *\n * Supports both function-based and class-based guards:\n * - Function guards: Simple functions that receive GuardContext\n * - Class guards: Classes implementing CanActivate interface (resolved from DI)\n *\n * @param guards - Guard functions or classes to apply\n *\n * @example Controller-level guard (applies to all routes)\n * ```typescript\n * @UseGuard(AuthGuard)\n * @Controller('/users')\n * class UserController {\n * @Get()\n * findAll() { } // Protected by AuthGuard\n * }\n * ```\n *\n * @example Route-level guard (applies to specific route)\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Get()\n * findAll() { } // Public\n *\n * @UseGuard(AdminGuard)\n * @Delete('/:id')\n * remove(@Param('id') id: string) { } // Admin only\n * }\n * ```\n *\n * @example Multiple guards (all must pass)\n * ```typescript\n * @UseGuard(AuthGuard, RoleGuard('admin'), RateLimitGuard)\n * @Controller('/admin')\n * class AdminController { }\n * ```\n *\n * @example Function-based guard\n * ```typescript\n * const AuthGuard: GuardFn = async (ctx) => {\n * const token = ctx.get('authorization');\n * if (!token) return false; // Reject\n *\n * const user = await verifyToken(token);\n * ctx.state.user = user; // Attach user to context\n * return true; // Allow\n * };\n * ```\n *\n * @example Guard factory for dynamic configuration\n * ```typescript\n * const RoleGuard = (role: string): GuardFn => async (ctx) => {\n * return ctx.state.user?.role === role;\n * };\n * ```\n *\n * @example Class-based guard with DI\n * ```typescript\n * import { Service } from '@nextrush/di';\n * import type { CanActivate, GuardContext } from 'nextrush/class';\n *\n * @Service()\n * class AuthGuard implements CanActivate {\n * constructor(private authService: AuthService) {}\n *\n * async canActivate(ctx: GuardContext): Promise<boolean> {\n * const token = ctx.get('authorization');\n * if (!token) return false;\n *\n * const user = await this.authService.verify(token);\n * ctx.state.user = user;\n * return Boolean(user);\n * }\n * }\n *\n * // Usage - class guard is resolved from DI container\n * @UseGuard(AuthGuard)\n * @Controller('/protected')\n * class ProtectedController { }\n * ```\n */\nexport function UseGuard(...guards: Guard[]): ClassDecorator & MethodDecorator {\n return function guardDecorator(\n target: object | Function,\n propertyKey?: string | symbol,\n descriptor?: PropertyDescriptor\n ): void {\n if (propertyKey !== undefined && descriptor !== undefined) {\n // Method decorator - store on method\n const existingGuards: GuardMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.GUARDS, target.constructor, propertyKey) ?? [];\n\n const metadata: GuardMetadata = {\n guards,\n target: 'method',\n methodName: propertyKey,\n };\n\n defineMetadata(\n DECORATOR_METADATA_KEYS.GUARDS,\n [...existingGuards, metadata],\n target.constructor,\n propertyKey\n );\n } else {\n // Class decorator - store on class\n const existingGuards: GuardMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.GUARDS, target) ?? [];\n\n const metadata: GuardMetadata = {\n guards,\n target: 'class',\n };\n\n defineMetadata(DECORATOR_METADATA_KEYS.GUARDS, [...existingGuards, metadata], target);\n }\n };\n}\n\n/**\n * Get all guards for a controller class.\n *\n * Guards are returned in bottom-to-top decorator application order,\n * matching TypeScript's native decorator execution semantics.\n *\n * @param target - Controller class\n * @returns Array of guards (functions or class constructors)\n */\nexport function getClassGuards(target: Function): Guard[] {\n const metadata: GuardMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.GUARDS, target) ?? [];\n return metadata.flatMap((m) => m.guards);\n}\n\n/**\n * Get guards for a specific method.\n *\n * Guards are returned in bottom-to-top decorator application order.\n *\n * @param target - Controller class\n * @param methodName - Method name\n * @returns Array of guards (functions or class constructors)\n */\nexport function getMethodGuards(target: Function, methodName: string | symbol): Guard[] {\n const metadata: GuardMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.GUARDS, target, methodName) ?? [];\n return metadata.flatMap((m) => m.guards);\n}\n\n/**\n * Get all guards for a route (class + method guards combined).\n *\n * Class guards run first, then method guards.\n *\n * @param target - Controller class\n * @param methodName - Method name\n * @returns Array of guards in execution order\n */\nexport function getAllGuards(target: Function, methodName: string | symbol): Guard[] {\n const classGuards = getClassGuards(target);\n const methodGuards = getMethodGuards(target, methodName);\n return [...classGuards, ...methodGuards];\n}\n\n// Re-export type guard for use by @nextrush/class' registrar\nexport { isGuardClass };\n","/**\n * @nextrush/class - Exception Filter Decorators\n *\n * Exception filters localize error handling to a controller or route. A filter\n * is a class implementing {@link ExceptionFilter}; it declares which errors it\n * handles with `@Catch(...)` and turns a thrown error into a response.\n *\n * Filters are opt-in and non-breaking: a controller/route with no `@UseFilter`\n * behaves exactly as before — errors propagate to the global error middleware.\n */\n\nimport { getMetadata, defineMetadata } from '../reflection/reflection.js';\nimport type { ExceptionFilterClass, FilterMetadata } from '../types.js';\nimport { DECORATOR_METADATA_KEYS } from '../types.js';\n\n/**\n * Declare which error constructors an exception filter handles.\n *\n * `@Catch(NotFoundError)` matches `NotFoundError` and its subclasses (via\n * `instanceof`). `@Catch()` with no arguments is a **catch-all** — it matches\n * any thrown value. A filter with no `@Catch` at all is also treated as\n * catch-all.\n *\n * @param errorTypes - Error constructors this filter handles (empty = catch-all)\n *\n * @example\n * ```typescript\n * @Catch(EntityNotFoundError)\n * class NotFoundFilter implements ExceptionFilter {\n * catch(error: unknown, ctx: Context) {\n * ctx.status = 404;\n * ctx.json({ error: 'Not found' });\n * }\n * }\n * ```\n */\nexport function Catch(...errorTypes: Function[]): ClassDecorator {\n return function catchDecorator(target: object): void {\n defineMetadata(DECORATOR_METADATA_KEYS.CATCH, errorTypes, target);\n };\n}\n\n/**\n * Apply exception filters to a controller or route.\n *\n * Works as both a class decorator (covers every route on the controller) and a\n * method decorator (covers that route only), mirroring {@link UseGuard}.\n * Method-level filters take precedence over class-level filters; within a\n * level, the first matching filter wins.\n *\n * @param filters - Exception filter classes to apply\n *\n * @example Controller-level (applies to all routes)\n * ```typescript\n * @UseFilter(DomainErrorFilter)\n * @Controller('/users')\n * class UserController {}\n * ```\n *\n * @example Method-level (higher precedence)\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @UseFilter(ConflictFilter)\n * @Post()\n * create() {}\n * }\n * ```\n */\nexport function UseFilter(...filters: ExceptionFilterClass[]): ClassDecorator & MethodDecorator {\n return function filterDecorator(\n target: object | Function,\n propertyKey?: string | symbol,\n descriptor?: PropertyDescriptor\n ): void {\n if (propertyKey !== undefined && descriptor !== undefined) {\n // Method decorator - store on method\n const existing: FilterMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.FILTERS, target.constructor, propertyKey) ?? [];\n\n const metadata: FilterMetadata = {\n filters,\n target: 'method',\n methodName: propertyKey,\n };\n\n defineMetadata(\n DECORATOR_METADATA_KEYS.FILTERS,\n [...existing, metadata],\n target.constructor,\n propertyKey\n );\n } else {\n // Class decorator - store on class\n const existing: FilterMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.FILTERS, target) ?? [];\n\n const metadata: FilterMetadata = {\n filters,\n target: 'class',\n };\n\n defineMetadata(DECORATOR_METADATA_KEYS.FILTERS, [...existing, metadata], target);\n }\n };\n}\n\n/**\n * Get the error constructors an exception filter handles.\n *\n * @param target - Filter class\n * @returns Error constructors from `@Catch` (empty array = catch-all)\n */\nexport function getCatchTypes(target: Function): Function[] {\n return getMetadata(DECORATOR_METADATA_KEYS.CATCH, target) ?? [];\n}\n\n/**\n * Get all class-level filters for a controller.\n *\n * @param target - Controller class\n * @returns Filter classes in decorator application order\n */\nexport function getClassFilters(target: Function): ExceptionFilterClass[] {\n const metadata: FilterMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.FILTERS, target) ?? [];\n return metadata.flatMap((m) => m.filters);\n}\n\n/**\n * Get method-level filters for a specific route.\n *\n * @param target - Controller class\n * @param methodName - Method name\n * @returns Filter classes in decorator application order\n */\nexport function getMethodFilters(\n target: Function,\n methodName: string | symbol\n): ExceptionFilterClass[] {\n const metadata: FilterMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.FILTERS, target, methodName) ?? [];\n return metadata.flatMap((m) => m.filters);\n}\n\n/**\n * Get all filters applicable to a route, in resolution/precedence order.\n *\n * Method-level filters come first (higher precedence), then class-level\n * filters. The controllers runtime walks this list and invokes the first\n * filter whose `@Catch` types match the thrown error.\n *\n * @param target - Controller class\n * @param methodName - Method name\n * @returns Filter classes: method filters first, then class filters\n */\nexport function getAllFilters(\n target: Function,\n methodName: string | symbol\n): ExceptionFilterClass[] {\n const methodFilters = getMethodFilters(target, methodName);\n const classFilters = getClassFilters(target);\n return [...methodFilters, ...classFilters];\n}\n","/**\n * @nextrush/class - Interceptor Decorators\n *\n * Interceptors wrap the controller-method call (onion / around advice). An\n * interceptor runs code before calling `next()`, awaits the downstream result,\n * and may transform or replace it before it flows into response handling.\n *\n * Interceptors are opt-in and non-breaking: a controller/route with no\n * `@UseInterceptor` behaves exactly as before — the method result flows\n * straight into response handling.\n *\n * Use interceptors for:\n * - Response shaping / envelope wrapping\n * - Timing, logging, and metrics around the handler\n * - Caching (short-circuit `next()` and return a cached value)\n * - Cross-cutting error mapping (try/catch around `next()`)\n */\n\nimport { getMetadata, defineMetadata } from '../reflection/reflection.js';\nimport type { InterceptorClass, InterceptorMetadata } from '../types.js';\nimport { DECORATOR_METADATA_KEYS } from '../types.js';\n\n/**\n * Apply interceptors to a controller or route.\n *\n * Works as both a class decorator (wraps every route on the controller) and a\n * method decorator (wraps that route only), mirroring {@link UseGuard}. Class\n * interceptors are the outermost layers of the onion; method interceptors are\n * inner, closest to the handler. Interceptor classes are resolved from the DI\n * container at request time.\n *\n * @param interceptors - Interceptor classes to apply\n *\n * @example Controller-level (wraps all routes)\n * ```typescript\n * @UseInterceptor(TimingInterceptor)\n * @Controller('/users')\n * class UserController {}\n * ```\n *\n * @example Method-level (inner layer, closest to the handler)\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @UseInterceptor(CacheInterceptor)\n * @Get()\n * findAll() {}\n * }\n * ```\n */\nexport function UseInterceptor(\n ...interceptors: InterceptorClass[]\n): ClassDecorator & MethodDecorator {\n return function interceptorDecorator(\n target: object | Function,\n propertyKey?: string | symbol,\n descriptor?: PropertyDescriptor\n ): void {\n if (propertyKey !== undefined && descriptor !== undefined) {\n // Method decorator - store on method\n const existing: InterceptorMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.INTERCEPTORS, target.constructor, propertyKey) ??\n [];\n\n const metadata: InterceptorMetadata = {\n interceptors,\n target: 'method',\n methodName: propertyKey,\n };\n\n defineMetadata(\n DECORATOR_METADATA_KEYS.INTERCEPTORS,\n [...existing, metadata],\n target.constructor,\n propertyKey\n );\n } else {\n // Class decorator - store on class\n const existing: InterceptorMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.INTERCEPTORS, target) ?? [];\n\n const metadata: InterceptorMetadata = {\n interceptors,\n target: 'class',\n };\n\n defineMetadata(\n DECORATOR_METADATA_KEYS.INTERCEPTORS,\n [...existing, metadata],\n target\n );\n }\n };\n}\n\n/**\n * Get all class-level interceptors for a controller.\n *\n * Interceptors are returned in bottom-to-top decorator application order,\n * matching TypeScript's native decorator execution semantics.\n *\n * @param target - Controller class\n * @returns Interceptor classes in decorator application order\n */\nexport function getClassInterceptors(target: Function): InterceptorClass[] {\n const metadata: InterceptorMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.INTERCEPTORS, target) ?? [];\n return metadata.flatMap((m) => m.interceptors);\n}\n\n/**\n * Get method-level interceptors for a specific route.\n *\n * @param target - Controller class\n * @param methodName - Method name\n * @returns Interceptor classes in decorator application order\n */\nexport function getMethodInterceptors(\n target: Function,\n methodName: string | symbol\n): InterceptorClass[] {\n const metadata: InterceptorMetadata[] =\n getMetadata(DECORATOR_METADATA_KEYS.INTERCEPTORS, target, methodName) ?? [];\n return metadata.flatMap((m) => m.interceptors);\n}\n\n/**\n * Get all interceptors applicable to a route, in onion (outer-to-inner) order.\n *\n * Class interceptors come first (outermost layers), then method interceptors\n * (inner, closest to the handler). The controllers runtime builds the chain so\n * the first entry runs first and returns last.\n *\n * @param target - Controller class\n * @param methodName - Method name\n * @returns Interceptor classes: class interceptors first, then method\n */\nexport function getAllInterceptors(\n target: Function,\n methodName: string | symbol\n): InterceptorClass[] {\n const classInterceptors = getClassInterceptors(target);\n const methodInterceptors = getMethodInterceptors(target, methodName);\n return [...classInterceptors, ...methodInterceptors];\n}\n","/**\n * @nextrush/class - Controller registration\n *\n * `registerControllers(app, options)` is a **registrar**: it scans for\n * `@Controller` classes (or takes them explicitly), builds their routes, and\n * registers them on the app's router. It reads `app.router` and `app.container`\n * — no plugin lifecycle, no ignored app. Call it (awaited) before `serve()`.\n *\n * @example\n * ```typescript\n * const app = createApp();\n * await registerControllers(app, { root: './src', prefix: '/api' });\n * await serve(app, { port: 8080 });\n * ```\n */\n\nimport type { Application } from '@nextrush/core';\nimport { getAllGuards, isGuardClass } from '../guards/guards.js';\nimport { container as globalContainer, createContainer, DIError, type Container } from '@nextrush/di';\nimport {\n DEFAULT_EXCLUDE,\n DEFAULT_INCLUDE,\n} from '../discovery/discovery.js';\nimport { ControllerResolutionError } from '../errors.js';\nimport { bootstrapPipeline } from '../internal.js';\nimport type { BootstrapContext } from '../internal.js';\nimport type { DiscoverySource } from '../discovery/source.js';\nimport { FilesystemSource, MemorySource } from '../discovery/source.js';\nimport type {\n ControllersOptions,\n RegisteredController,\n ResolvedOptions,\n} from './registrar-types.js';\n\n/** Debug logger that writes to stderr (never to stdout). */\nfunction debugLog(debug: boolean, message: string): void {\n if (debug) {\n process.stderr.write(`[Controllers] ${message}\\n`);\n }\n}\n\nfunction warnLog(message: string): void {\n process.stderr.write(`[Controllers] WARNING: ${message}\\n`);\n}\n\n/**\n * Assemble the entries passed to a router method: middleware first, then the\n * metadata marker (only when the route carries decorator docs), then the\n * handler — using the ROUTE_METADATA contribution protocol from `@nextrush/types`.\n */\nfunction resolveOptions(\n options: ControllersOptions,\n container: Container\n): ResolvedOptions {\n return {\n root: options.root ?? null,\n include: options.include ?? DEFAULT_INCLUDE,\n exclude: options.exclude ?? DEFAULT_EXCLUDE,\n controllers: options.controllers ?? [],\n container,\n middleware: options.middleware ?? [],\n debug: options.debug ?? false,\n prefix: options.prefix ?? '',\n strict: options.strict ?? false,\n validate: options.validate ?? true,\n isolate: options.isolate ?? false,\n diagnostics: options.diagnostics ?? false,\n };\n}\n\n/**\n * Eagerly resolve every registered controller once so unsatisfiable or circular\n * constructor dependencies fail at boot rather than as a 500 on the first\n * request. Mirrors the per-request resolution in `builder.ts`, surfacing the\n * same {@link ControllerResolutionError} for non-DI failures.\n *\n * Each successfully resolved singleton is stored in the shared `instanceCache`,\n * so the per-request handler reuses this instance instead of resolving the same\n * controller a second time on its first hit.\n *\n * When the underlying failure is a `@nextrush/di` error (a {@link DIError}\n * subclass such as `CircularDependencyError` or `DependencyResolutionError`), it\n * is rethrown as-is so its specific, actionable message surfaces at boot rather\n * than being buried in the `.cause` of a generic wrapper.\n */\nexport function validateControllers(\n registered: RegisteredController[],\n container: Container,\n instanceCache: Map<Function, unknown>\n): void {\n for (const controller of registered) {\n const token = controller.target as new (...args: unknown[]) => unknown;\n try {\n instanceCache.set(token, container.resolve(token));\n } catch (error) {\n if (error instanceof DIError) {\n throw error;\n }\n throw new ControllerResolutionError(\n controller.target.name,\n error instanceof Error ? error : undefined\n );\n }\n }\n}\n\n/**\n * Eagerly resolve every distinct class-based guard used by any registered route\n * once, so a guard with an unsatisfiable or circular dependency fails at boot\n * instead of surfacing as a 500 on the first request to a guarded route.\n *\n * Guards are resolved per-request in `builder.ts` via `container.resolve(guard)`,\n * so a class guard skipped by {@link validateControllers} (which only resolves\n * controller tokens) would otherwise fail late — the exact gap eager validation\n * exists to close. Function guards need no DI resolution and are skipped; each\n * class guard is resolved once (deduped) even when shared across routes.\n *\n * A `@nextrush/di` error (a {@link DIError} subclass such as\n * `CircularDependencyError` or `DependencyResolutionError`) is rethrown as-is so\n * its specific guidance surfaces at boot; any other failure is wrapped with a\n * guard-specific message.\n */\nexport function validateGuards(\n registered: RegisteredController[],\n container: Container\n): void {\n const resolved = new Set<Function>();\n\n for (const controller of registered) {\n for (const route of controller.definition.routes) {\n const guards = getAllGuards(controller.target, route.methodName);\n for (const guard of guards) {\n if (!isGuardClass(guard) || resolved.has(guard)) {\n continue;\n }\n resolved.add(guard);\n try {\n container.resolve(guard);\n } catch (error) {\n if (error instanceof DIError) {\n throw error;\n }\n const guardName = guard.name || 'AnonymousGuard';\n throw new Error(\n `Failed to resolve guard \"${guardName}\" from the DI container ` +\n `(used by controller \"${controller.target.name}\").\\n\\n` +\n `A class-based guard is resolved from DI on every request to a guarded ` +\n `route. Surfacing the failure here means an unresolvable or circular guard ` +\n `dependency fails at boot instead of as a 500 on the first request.\\n\\n` +\n `Ensure \"${guardName}\" and all of its constructor dependencies are registered ` +\n `in the DI container.`,\n { cause: error instanceof Error ? error : undefined }\n );\n }\n }\n }\n }\n}\n\n/**\n * Discover and register decorator-based controllers on an application.\n *\n * Reads `app.router` (required) and `app.container` (falls back to a custom\n * container in options, then the global container). Supports auto-discovery\n * (`root`) and/or explicit `controllers`.\n *\n * @param app - The application (must have a router — use `createApp()` from `nextrush`)\n * @param options - Discovery/registration options\n */\nexport async function registerControllers(\n app: Application,\n options: ControllersOptions = {}\n): Promise<void> {\n const router = app.router;\n if (!router) {\n throw new Error(\n 'registerControllers() requires an app with a router. Create the app with ' +\n '`createApp()` from `nextrush`, or pass `{ router }` to `createApp()`.'\n );\n }\n\n // Container ownership: an explicit `options.container` always wins (the caller\n // has taken ownership). Otherwise `isolate: true` gives this registration its\n // own fresh container so its service graph is isolated from other apps; the\n // default (non-isolate) path is unchanged — app.container, then the global one.\n const container: Container =\n options.container ??\n (options.isolate ? createContainer() : (app.container ?? globalContainer));\n const resolvedOpts = resolveOptions(options, container);\n\n // Determine the discovery source\n let source: DiscoverySource;\n if (options.source) {\n // Explicit source provided (programmatic/test use)\n source = options.source;\n } else if (resolvedOpts.root) {\n // Auto-discovery mode: use FilesystemSource\n source = new FilesystemSource(\n resolvedOpts.root,\n resolvedOpts.include,\n resolvedOpts.exclude,\n resolvedOpts.debug\n );\n } else {\n // Manual mode: wrap explicit controllers in MemorySource\n source = new MemorySource([...resolvedOpts.controllers]);\n }\n\n // Create bootstrap context\n const ctx: BootstrapContext = {\n app,\n router,\n container,\n resolvedOptions: resolvedOpts,\n source,\n discoveredClasses: [],\n controllerDefinitions: [],\n providerGraph: new Map(),\n requestScoped: new Set(),\n registryInstances: new Map(),\n builtRoutes: [],\n graph: null,\n lifecycleData: {\n controllerClasses: [],\n },\n timings: [],\n };\n\n // Run the bootstrap pipeline\n await bootstrapPipeline(ctx);\n\n if (ctx.discoveredClasses.length === 0) {\n warnLog('No controllers found. Check your root path or patterns.');\n return;\n }\n\n debugLog(resolvedOpts.debug, `Registered ${ctx.builtRoutes.length} routes`);\n}\n","/**\n * Discover stage: Runs the DiscoverySource to populate discoveredClasses.\n */\n\nimport type { BootstrapContext } from '../context.js';\n\nexport async function discoverStage(ctx: BootstrapContext): Promise<void> {\n ctx.discoveredClasses = await ctx.source.discover();\n}\n","/**\n * Metadata stage: Extract and validate controller metadata from discovered classes.\n */\n\nimport type { BootstrapContext } from '../context.js';\nimport { getControllerDefinition } from '../../metadata/metadata.js';\n\nexport function metadataStage(ctx: BootstrapContext): void {\n ctx.controllerDefinitions = ctx.discoveredClasses.map((cls) => {\n const def = getControllerDefinition(cls);\n if (!def) {\n throw new Error(\n `Controller class ${cls.name} has no metadata. Did you apply @Controller?`\n );\n }\n return def;\n });\n}\n","/**\n * @nextrush/class - Per-app DI isolation\n *\n * Re-registers the reachable `@Service`/`@Repository`/`@Config` graph of a set\n * of controllers into a specific container, so an app that opts into isolation\n * (`registerControllers(app, { isolate: true })`) owns its own service\n * singletons instead of sharing the process-global ones registered at import\n * time.\n *\n * Why re-register at all: a `createContainer()` child delegates any unregistered\n * token to the global container, so a service `@Service` put on the global root\n * would still resolve to the shared global singleton. Registering the class on\n * the child shadows that delegation, giving the child its own instance.\n */\n\nimport {\n getOptionalParams,\n getServiceScope,\n hasServiceMetadata,\n type Constructor,\n type Container,\n type Scope,\n type Token,\n} from '@nextrush/di';\nimport { getConstructorParamTypes, getOwnMetadata } from '../reflection/reflection.js';\n\n/**\n * tsyringe stores `@inject(token)` descriptors under this reflect-metadata key,\n * one entry per decorated constructor parameter index. This is the only source\n * of a controller's dependency classes when the toolchain does not emit\n * `design:paramtypes` (esbuild, tsx, swc without the metadata plugin) — implicit\n * constructor injection is invisible there, but explicit `@inject(Class)` is not.\n * `@nextrush/di`'s own `@Optional()` decorator reads and writes the same key.\n */\nconst TSYRINGE_INJECTION_TOKENS = 'injectionTokens';\n\n/**\n * A single `@inject` descriptor may be either the raw token or a\n * `{ token, multiple }` wrapper depending on the tsyringe version. Normalize.\n */\nfunction tokenOf(descriptor: unknown): unknown {\n if (descriptor !== null && typeof descriptor === 'object' && 'token' in descriptor) {\n return (descriptor as { token: unknown }).token;\n }\n return descriptor;\n}\n\n/**\n * Collect the constructor dependency **classes** of a target, unioning implicit\n * `design:paramtypes` (present in a full TypeScript build) with explicit\n * `@inject(...)` descriptors (present everywhere, including under esbuild).\n *\n * Only class (function) tokens are returned. String/symbol `@inject` tokens and\n * `@Optional()` parameters are intentionally excluded: the former carry no class\n * metadata to walk (the caller registers them), and the latter must be allowed\n * to resolve to `undefined` rather than forcing a registration.\n */\nexport function collectDependencyClasses(target: Function): Function[] {\n const paramTypes = getConstructorParamTypes(target);\n const injectionTokens =\n (getOwnMetadata<Record<number, unknown>>(TSYRINGE_INJECTION_TOKENS, target) as\n | Record<number, unknown>\n | undefined) ?? {};\n const optional = getOptionalParams(target);\n\n const indices = new Set<number>();\n for (let i = 0; i < paramTypes.length; i++) {\n indices.add(i);\n }\n for (const key of Object.keys(injectionTokens)) {\n indices.add(Number(key));\n }\n\n const deps: Function[] = [];\n for (const index of indices) {\n if (optional.has(index)) {\n continue;\n }\n const explicit = injectionTokens[index];\n const token = explicit !== undefined ? tokenOf(explicit) : paramTypes[index];\n if (typeof token === 'function') {\n deps.push(token);\n }\n }\n return deps;\n}\n\n/**\n * Walk the constructor dependency graph of `controllers` and return the distinct\n * `@Service`/`@Repository`/`@Config` classes reachable from it, in breadth-first\n * order (a controller's direct service deps first, then their transitive deps).\n *\n * The walk only traverses *through* service classes: a non-service dependency is\n * a leaf (its own deps are not followed), matching {@link registerServiceGraph}'s\n * original inline behavior. Callers that need dependency-first ordering (service\n * lifecycle hooks) reverse the returned list.\n */\nexport function collectServiceGraph(controllers: Function[]): Function[] {\n const visited = new Set<Function>();\n const result: Function[] = [];\n // FIFO queue with a moving head pointer — avoids repeated O(n) Array.shift().\n const queue: Function[] = [];\n for (const controller of controllers) {\n for (const dep of collectDependencyClasses(controller)) {\n queue.push(dep);\n }\n }\n\n for (let head = 0; head < queue.length; head++) {\n const dep = queue[head]!;\n if (visited.has(dep)) {\n continue;\n }\n visited.add(dep);\n\n if (!hasServiceMetadata(dep)) {\n continue;\n }\n\n result.push(dep);\n\n for (const sub of collectDependencyClasses(dep)) {\n queue.push(sub);\n }\n }\n return result;\n}\n\n/**\n * Transitively register every `@Service`/`@Repository`/`@Config` class reachable\n * from `controllers`' constructor dependency graph into `container`, each with\n * its **effective** scope (request bubbling applied) when `effectiveScopes` is\n * provided, otherwise its declared scope (`getServiceScope(dep) ?? 'singleton'`).\n *\n * Each class is registered at most once (the graph walk dedupes). A class already\n * registered on the container is left untouched, so a provider the caller\n * registered explicitly (e.g. a mock or a pre-bound instance) always wins.\n * Non-service classes and non-class tokens are skipped — they fall back to the\n * container's parent/global chain or must be registered by the caller.\n */\nexport function registerServiceGraph(\n controllers: Function[],\n container: Container,\n effectiveScopes?: Map<Function, Scope>\n): void {\n for (const dep of collectServiceGraph(controllers)) {\n const scope: Scope = effectiveScopes?.get(dep) ?? getServiceScope(dep) ?? 'singleton';\n const token = dep as Token;\n if (!container.isRegistered(token)) {\n container.register(token, { useClass: dep as Constructor }, { scope });\n }\n }\n}\n","/**\n * @nextrush/class - Request-scope bubbling\n *\n * Computes each reachable class's **effective** DI scope and binds\n * request-effective classes to the container's request (ContainerScoped)\n * lifecycle. See RFC-NEXTRUSH-REQUEST-SCOPE.\n *\n * Scope bubbling: a node is effectively `'request'` if its declared `di:scope`\n * is `'request'` OR any of its transitive dependency classes is effectively\n * `'request'`; otherwise it keeps its declared scope. Bubbling is mandatory —\n * a singleton controller depending on a request-scoped service would otherwise\n * cache one request's instances forever.\n */\n\nimport {\n getServiceScope,\n hasServiceMetadata,\n type Constructor,\n type Container,\n type Scope,\n type Token,\n} from '@nextrush/di';\nimport { collectDependencyClasses, collectServiceGraph, registerServiceGraph } from './isolation.js';\n\n/**\n * True when `cls` is effectively request-scoped: declared `'request'`, or it\n * transitively depends on a `@Service`/`@Repository`/`@Config` class that is.\n *\n * `visiting` guards against dependency cycles: a back-edge to an in-progress\n * node contributes `false` (that node resolves its own scope from its declared\n * value plus its other dependencies), so a cycle cannot spuriously flip a node\n * to request. Results are memoized in `cache`.\n */\nfunction isEffectivelyRequest(\n cls: Function,\n cache: Map<Function, boolean>,\n visiting: Set<Function>\n): boolean {\n const cached = cache.get(cls);\n if (cached !== undefined) {\n return cached;\n }\n if (visiting.has(cls)) {\n return false;\n }\n visiting.add(cls);\n\n let request = getServiceScope(cls) === 'request';\n if (!request) {\n for (const dep of collectDependencyClasses(cls)) {\n if (hasServiceMetadata(dep) && isEffectivelyRequest(dep, cache, visiting)) {\n request = true;\n break;\n }\n }\n }\n\n visiting.delete(cls);\n cache.set(cls, request);\n return request;\n}\n\n/**\n * Compute the effective scope of every class reachable from `controllers` —\n * the controllers themselves plus their transitive `@Service` graph. A\n * request-effective class maps to `'request'`; every other class keeps its\n * declared scope (`'singleton'` for undecorated controllers).\n */\nexport function computeEffectiveScopes(controllers: Function[]): Map<Function, Scope> {\n const requestCache = new Map<Function, boolean>();\n const scopes = new Map<Function, Scope>();\n\n const reachable = new Set<Function>(controllers);\n for (const service of collectServiceGraph(controllers)) {\n reachable.add(service);\n }\n\n for (const cls of reachable) {\n const request = isEffectivelyRequest(cls, requestCache, new Set());\n scopes.set(cls, request ? 'request' : getServiceScope(cls));\n }\n return scopes;\n}\n\n/** The set of classes whose effective scope is `'request'`. */\nexport function requestScopedClasses(scopes: Map<Function, Scope>): Set<Function> {\n const set = new Set<Function>();\n for (const [cls, scope] of scopes) {\n if (scope === 'request') {\n set.add(cls);\n }\n }\n return set;\n}\n\n/**\n * Register the request-effective **service** nodes with the container's request\n * (ContainerScoped) lifecycle.\n *\n * A request-effective service declared `singleton` is already registered as a\n * tsyringe singleton by its decorator at import time; we re-register it so the\n * request lifecycle wins (tsyringe returns the last registration on resolve).\n * Controllers are registered separately by the registry with their effective\n * scope, so they are skipped here.\n */\nexport function registerRequestScopedServices(\n container: Container,\n scopes: Map<Function, Scope>\n): void {\n for (const [cls, scope] of scopes) {\n if (scope !== 'request' || !hasServiceMetadata(cls)) {\n continue;\n }\n container.register(cls as Token, { useClass: cls as Constructor }, { scope: 'request' });\n }\n}\n\n/**\n * Compute effective scopes for `controllers`, bind request-effective classes to\n * the container's request lifecycle, and return the request-scoped class set.\n *\n * - **Isolated container**: register the whole reachable service graph with its\n * effective scope, so a per-app container owns its instances.\n * - **Shared container**: singleton/transient services keep their decorator-time\n * registration (zero behavior change); only request-effective services are\n * (re-)bound to the request (ContainerScoped) lifecycle.\n *\n * The returned set drives per-controller registration and the per-request-child\n * resolution decision in the route handler.\n */\nexport function bindRequestScopes(\n controllers: Function[],\n container: Container,\n isolate: boolean\n): Set<Function> {\n const scopes = computeEffectiveScopes(controllers);\n const requestScoped = requestScopedClasses(scopes);\n\n if (isolate) {\n registerServiceGraph(controllers, container, scopes);\n } else if (requestScoped.size > 0) {\n registerRequestScopedServices(container, scopes);\n }\n\n return requestScoped;\n}\n","/**\n * Provider Graph stage: Compute service dependencies and request-scope bubbling.\n */\n\nimport type { BootstrapContext } from '../context.js';\nimport { bindRequestScopes } from '../../request/scope.js';\nimport { collectDependencyClasses } from '../../request/isolation.js';\n\nexport async function providerGraphStage(ctx: BootstrapContext): Promise<void> {\n // Compute effective DI scopes (request-scope bubbling) and bind request-effective\n // classes to the container's request lifecycle.\n ctx.requestScoped = bindRequestScopes(\n ctx.discoveredClasses,\n ctx.resolvedOptions.container,\n ctx.resolvedOptions.isolate\n );\n\n // Populate the provider dependency graph (controller/service -> its constructor\n // dependency classes) so the frozen Application Graph carries real provider\n // data for diagnostics and introspection. Read once here, never at request time.\n const graph = new Map<Function, Function[]>();\n for (const cls of ctx.discoveredClasses) {\n graph.set(cls, collectDependencyClasses(cls));\n }\n ctx.providerGraph = graph;\n}\n","/**\n * Validation stage: Bootstrap async factories before DI resolution.\n * (Eager controller/guard validation happens in registrarStage after routes are built.)\n */\n\nimport type { BootstrapContext } from '../context.js';\n\nexport async function validationStage(ctx: BootstrapContext): Promise<void> {\n // Bootstrap async factory providers before controller resolution.\n await ctx.resolvedOptions.container.bootstrap();\n}\n","/**\n * @nextrush/class - Controller Registry\n *\n * Manages registration and tracking of controllers.\n */\n\nimport { getControllerDefinition, isController } from '../metadata/metadata.js';\nimport type { Container } from '@nextrush/di';\nimport type { Middleware } from '@nextrush/types';\nimport { buildRoutes } from './builder.js';\nimport { NoRoutesError, NotAControllerError } from '../errors.js';\nimport type { BuiltRoute, RegisteredController } from './registrar-types.js';\n\n/**\n * Registry for tracking and building controller routes\n */\nexport class ControllerRegistry {\n private readonly controllers: Map<Function, RegisteredController> = new Map();\n private readonly container: Container;\n private readonly globalPrefix: string;\n private readonly globalMiddleware: Middleware[];\n private readonly debug: boolean;\n\n /**\n * Classes whose effective DI scope is `'request'` (self or dependency graph\n * declares `scope: 'request'`). A request-scoped controller is registered with\n * the request lifecycle and resolved from a per-request child on every request\n * instead of being memoized. Empty by default (pure singleton/transient graph).\n */\n private readonly requestScopedClasses: ReadonlySet<Function>;\n\n /**\n * Shared controller-instance cache, keyed by controller class.\n *\n * Owned by the registry so a single resolved singleton is reused across the\n * boot-time eager validation (`validateControllers`) and the per-request\n * handlers built by {@link buildRoutes}. Without a shared cache, `validate: true`\n * resolves each controller twice: once at boot and again on the first request.\n *\n * A failed resolve is never stored, so resolution retries on each request until\n * it succeeds (see `createRouteHandler` in `builder.ts`).\n */\n private readonly instanceCache: Map<Function, unknown> = new Map();\n\n constructor(\n container: Container,\n globalPrefix: string,\n globalMiddleware: Middleware[],\n debug: boolean,\n requestScopedClasses: ReadonlySet<Function> = new Set()\n ) {\n this.container = container;\n this.globalPrefix = globalPrefix;\n this.globalMiddleware = globalMiddleware;\n this.debug = debug;\n this.requestScopedClasses = requestScopedClasses;\n }\n\n /**\n * Register a controller class\n */\n register(controllerClass: Function): RegisteredController {\n if (this.controllers.has(controllerClass)) {\n return this.controllers.get(controllerClass)!;\n }\n\n if (!isController(controllerClass)) {\n throw new NotAControllerError(controllerClass.name);\n }\n\n const definition = getControllerDefinition(controllerClass);\n\n if (!definition) {\n throw new NotAControllerError(controllerClass.name);\n }\n\n if (definition.routes.length === 0) {\n throw new NoRoutesError(controllerClass.name);\n }\n\n this.registerInContainer(controllerClass);\n\n const routes = buildRoutes(\n definition,\n this.container,\n this.globalPrefix,\n this.globalMiddleware,\n this.instanceCache,\n this.requestScopedClasses.has(controllerClass)\n );\n\n const registered: RegisteredController = {\n target: controllerClass,\n definition,\n routes,\n };\n\n this.controllers.set(controllerClass, registered);\n\n if (this.debug) {\n this.logRegistration(registered);\n }\n\n return registered;\n }\n\n /**\n * The shared controller-instance cache.\n *\n * Exposed so `registerControllers` can pre-seed it during eager validation\n * (`validate: true`), making the boot-time resolve and the per-request handler\n * share one singleton instead of resolving the same controller twice.\n */\n get instances(): Map<Function, unknown> {\n return this.instanceCache;\n }\n\n /**\n * Register multiple controllers\n */\n registerAll(controllers: Function[]): RegisteredController[] {\n return controllers.map((c) => this.register(c));\n }\n\n /**\n * Get all registered controllers\n */\n getAll(): RegisteredController[] {\n return Array.from(this.controllers.values());\n }\n\n /**\n * Get all built routes from all controllers\n */\n getAllRoutes(): BuiltRoute[] {\n const routes: BuiltRoute[] = [];\n\n for (const controller of this.controllers.values()) {\n routes.push(...controller.routes);\n }\n\n return routes;\n }\n\n /**\n * Get total route count\n */\n get routeCount(): number {\n let count = 0;\n\n for (const controller of this.controllers.values()) {\n count += controller.routes.length;\n }\n\n return count;\n }\n\n /**\n * Check if a controller is registered\n */\n has(controllerClass: Function): boolean {\n return this.controllers.has(controllerClass);\n }\n\n /**\n * Clear all registrations\n */\n clear(): void {\n this.controllers.clear();\n }\n\n /**\n * Register the controller in the DI container with its effective scope: a\n * request-effective controller (self or dependency graph declares\n * `scope: 'request'`) uses the request (ContainerScoped) lifecycle so a fresh\n * instance is built per request; every other controller stays a singleton.\n */\n private registerInContainer(controllerClass: Function): void {\n const token = controllerClass as new (...args: unknown[]) => unknown;\n\n if (!this.container.isRegistered(token)) {\n const scope = this.requestScopedClasses.has(controllerClass) ? 'request' : 'singleton';\n this.container.register(token, { useClass: token }, { scope });\n }\n }\n\n /**\n * Log controller registration details\n */\n private logRegistration(registered: RegisteredController): void {\n const { target, routes } = registered;\n\n process.stderr.write(`[Controllers] Registered: ${target.name}\\n`);\n\n for (const route of routes) {\n process.stderr.write(` ${route.method.padEnd(7)} ${route.path}\\n`);\n }\n }\n}\n","/**\n * @nextrush/class - Route Handler Factory\n *\n * Builds the per-route handler: runs guards, lazily resolves the controller\n * singleton, injects parameters, invokes the method, and applies response\n * metadata (@SetHeader headers, route status code, @Redirect).\n */\n\nimport type { ControllerRouteMetadata } from '../types.js';\nimport {\n getHttpCode,\n getParamMetadata,\n getRedirectMetadata,\n getResponseHeaders,\n} from '../metadata/metadata.js';\nimport { getAllFilters } from '../filters/filters.js';\nimport { getAllGuards } from '../guards/guards.js';\nimport { getAllInterceptors } from '../interceptors/interceptors.js';\nimport type { Container } from '@nextrush/di';\nimport type { Context, RouteHandler } from '@nextrush/types';\nimport { ControllerResolutionError } from '../errors.js';\nimport { wrapWithFilters } from '../filters/filter-runner.js';\nimport { executeGuards } from '../guards/guard-runner.js';\nimport { runInterceptors } from '../interceptors/interceptor-runner.js';\nimport { resolveParametersFromPlan } from '../binding/param-resolver.js';\n\n/** A controller-class token tsyringe can resolve. */\ntype ControllerToken = new (...args: unknown[]) => unknown;\n\n/**\n * Lazy-memoized singleton resolution (the default, zero new per-request cost).\n *\n * Resolves the controller on first use and caches it in the shared\n * `instanceCache`, so `validate: true`'s boot resolve and the first request\n * share one instance. A failed resolve is never cached — resolution retries on\n * each request until it succeeds.\n */\nfunction resolveMemoizedSingleton(\n controllerClass: Function,\n container: Container,\n instanceCache: Map<Function, unknown>\n): () => unknown {\n return () => {\n if (!instanceCache.has(controllerClass)) {\n try {\n instanceCache.set(controllerClass, container.resolve(controllerClass as ControllerToken));\n } catch (error) {\n throw new ControllerResolutionError(\n controllerClass.name,\n error instanceof Error ? error : undefined\n );\n }\n }\n return instanceCache.get(controllerClass);\n };\n}\n\n/**\n * Per-request-child resolution for effectively request-scoped controllers.\n *\n * A fresh child container is created on each request and the controller resolved\n * from it — request-scoped (ContainerScoped) dependencies are fresh per request\n * and shared within one, while singletons resolve from the parent and stay\n * shared. The instance is never memoized.\n */\nfunction resolveFromRequestChild(\n controllerClass: Function,\n container: Container\n): () => unknown {\n return () => {\n try {\n return container.createChild().resolve(controllerClass as ControllerToken);\n } catch (error) {\n throw new ControllerResolutionError(\n controllerClass.name,\n error instanceof Error ? error : undefined\n );\n }\n };\n}\n\n/**\n * Create a route handler that resolves the controller and injects parameters.\n *\n * @param instanceCache - Shared controller-instance cache. The controller\n * singleton is resolved once and stored here, so `validate: true`'s boot-time\n * resolve and the first request share one instance rather than resolving twice.\n * @param isRequestScoped - Whether this controller is effectively request-scoped\n * (itself or anything in its dependency graph declares `scope: 'request'`).\n * When true, a fresh per-request child container is created on each request and\n * the controller resolved from it (never memoized), so request-scoped instances\n * are fresh per request and shared within one. When false, the lazy-memoized\n * singleton path is kept — zero new per-request overhead.\n */\nexport function createRouteHandler(\n controllerClass: Function,\n route: ControllerRouteMetadata,\n container: Container,\n instanceCache: Map<Function, unknown>,\n isRequestScoped = false\n): RouteHandler {\n const methodName = String(route.methodName);\n const paramMetadata = getParamMetadata(controllerClass, methodName);\n const guards = getAllGuards(controllerClass, methodName);\n const filters = getAllFilters(controllerClass, methodName);\n const interceptors = getAllInterceptors(controllerClass, methodName);\n\n // Precompute sorted param injection plan at build time (not per-request)\n const sortedParams =\n paramMetadata.length > 0 ? [...paramMetadata].sort((a, b) => a.index - b.index) : [];\n\n const statusCode = route.statusCode;\n // @HttpCode overrides the route decorator's statusCode option when both are set.\n const httpCode = getHttpCode(controllerClass, methodName);\n const effectiveStatusCode = httpCode ?? statusCode;\n const responseHeaders = getResponseHeaders(controllerClass, methodName);\n const redirectMeta = getRedirectMetadata(controllerClass, methodName);\n\n // Choose the controller-resolution strategy once, at build time.\n const resolveControllerInstance = isRequestScoped\n ? resolveFromRequestChild(controllerClass, container)\n : resolveMemoizedSingleton(controllerClass, container, instanceCache);\n\n const execute: RouteHandler = async (ctx: Context): Promise<void> => {\n // Execute guards first (if any) — always per-request, never hoisted.\n if (guards.length > 0) {\n await executeGuards(guards, ctx, container, controllerClass.name, methodName);\n }\n\n const controllerInstance = resolveControllerInstance();\n const args = await resolveParametersFromPlan(\n ctx,\n sortedParams,\n controllerClass.name,\n methodName\n );\n\n const method = (controllerInstance as Record<string, unknown>)[methodName];\n\n if (typeof method !== 'function') {\n throw new Error(`Method \"${methodName}\" not found on controller \"${controllerClass.name}\"`);\n }\n\n // Invoke the method through the interceptor onion when interceptors are\n // declared; otherwise call it directly (no overhead for interceptor-free\n // routes). The (possibly transformed) result flows into response handling.\n const invokeMethod = (): Promise<unknown> =>\n Promise.resolve(method.apply(controllerInstance, args));\n const result =\n interceptors.length > 0\n ? await runInterceptors(interceptors, ctx, container, invokeMethod)\n : await invokeMethod();\n\n // Apply response headers from @SetHeader() metadata\n for (const header of responseHeaders) {\n ctx.set(header.name, header.value);\n }\n\n // Apply status code: @HttpCode takes precedence over the route statusCode.\n if (effectiveStatusCode !== undefined) {\n ctx.status = effectiveStatusCode;\n }\n\n // Handle @Redirect() metadata\n if (redirectMeta && !ctx.responded) {\n let redirectUrl = redirectMeta.url;\n let redirectStatus = redirectMeta.statusCode;\n\n // Method return value can override the redirect URL/status\n if (typeof result === 'string') {\n redirectUrl = result;\n } else if (result && typeof result === 'object' && 'url' in result) {\n const override = result as { url?: string; statusCode?: number };\n if (override.url) redirectUrl = override.url;\n if (override.statusCode) redirectStatus = override.statusCode;\n }\n\n ctx.status = redirectStatus;\n ctx.set('Location', redirectUrl);\n ctx.send('');\n return;\n }\n\n // Check if response has already been sent (adapter-agnostic)\n if (result !== undefined && !ctx.responded) {\n if (typeof result === 'object') {\n ctx.json(result);\n } else {\n ctx.send(String(result));\n }\n }\n };\n\n // Wrap with the exception-filter pipeline only when the route declares\n // filters — filter-free routes keep their original, unwrapped behavior so\n // errors propagate to the global error middleware exactly as before.\n return filters.length > 0 ? wrapWithFilters(execute, filters, container) : execute;\n}\n","/**\n * @nextrush/class - Exception Filter Runner\n *\n * Runs exception filters when a route handler body throws. Filters are matched\n * by their `@Catch` types (or catch-all), resolved from the DI container, and\n * the first matching filter handles the error by setting the response. If no\n * filter matches, the error is rethrown so the global error middleware handles\n * it — preserving current, filter-free behavior.\n */\n\nimport type { ExceptionFilter, ExceptionFilterClass } from './filter-types.js';\nimport { getCatchTypes } from './filters.js';\nimport type { Container } from '@nextrush/di';\nimport type { Context, Next, RouteHandler } from '@nextrush/types';\n\n/**\n * Whether a filter's `@Catch` types match a thrown error.\n *\n * Empty `catchTypes` (no-arg `@Catch()` or no `@Catch` metadata) is a\n * catch-all and matches any error.\n */\nfunction filterMatches(catchTypes: readonly Function[], error: unknown): boolean {\n if (catchTypes.length === 0) {\n return true;\n }\n return catchTypes.some(\n (type) => error instanceof (type as new (...args: unknown[]) => unknown)\n );\n}\n\n/**\n * Invoke the first applicable filter for a thrown error.\n *\n * Filters are walked in the precedence order supplied by the caller\n * (method-level first, then class-level). The first filter whose `@Catch`\n * types match is resolved from the DI container and its `catch(error, ctx)`\n * sets the response.\n *\n * @returns `true` if a filter handled the error; `false` if none matched (the\n * caller must rethrow so the global error middleware still runs).\n */\nexport async function applyFilters(\n filters: readonly ExceptionFilterClass[],\n error: unknown,\n ctx: Context,\n container: Container\n): Promise<boolean> {\n for (const filter of filters) {\n if (!filterMatches(getCatchTypes(filter), error)) {\n continue;\n }\n\n const instance = container.resolve(filter) as ExceptionFilter;\n await instance.catch(error, ctx);\n return true;\n }\n\n return false;\n}\n\n/**\n * Wrap a route handler so thrown errors flow through the exception filters.\n *\n * A matched filter handles the error (sets the response); an unmatched error is\n * rethrown unchanged. Only installed when a route has at least one filter, so\n * filter-free routes keep their original (unwrapped) behavior.\n */\nexport function wrapWithFilters(\n execute: RouteHandler,\n filters: readonly ExceptionFilterClass[],\n container: Container\n): RouteHandler {\n return async (ctx: Context, next: Next): Promise<void> => {\n try {\n await execute(ctx, next);\n } catch (error) {\n const handled = await applyFilters(filters, error, ctx, container);\n if (!handled) {\n throw error;\n }\n }\n };\n}\n","/**\n * @nextrush/class - Guard Runner\n *\n * Executes route guards (function-based and class-based) before the handler\n * runs. Class guards are resolved from the DI container.\n */\n\nimport type { CanActivate, Guard, GuardContext } from './guard-types.js';\nimport { isGuardClass } from './guards.js';\nimport type { Container } from '@nextrush/di';\nimport type { Context } from '@nextrush/types';\nimport { GuardRejectionError } from '../errors.js';\n\n/**\n * Execute guards and throw if any guard rejects.\n * Supports both function-based and class-based guards.\n * Class guards are resolved from the DI container.\n *\n * GuardContext snapshot contract:\n * - The {@link GuardContext} handed to each guard is a per-guard snapshot built\n * once here, before any guard runs.\n * - `state` is the **live** `ctx.state` reference (not a copy): guards read and\n * attach data through it (e.g. `ctx.state.user = ...`), and those mutations are\n * visible to later guards and to the handler. This is the supported channel for\n * a guard to pass data forward.\n * - `method`, `path`, `params`, `query`, `headers`, and `body` are captured **by\n * value** at guard time. Guards see the request as it was when guards began; a\n * guard cannot mutate the real request through these fields, and if middleware\n * mutated `ctx` after this snapshot the guard would not observe it. Guards run\n * before the handler, so this is not currently exploitable — but attach forward\n * state via `state`, never by mutating the snapshotted fields.\n *\n * Rejection semantics:\n * - A guard that returns `false` throws {@link GuardRejectionError} (403).\n * - A guard that *throws* propagates its error unchanged, so a guard can throw\n * `UnauthorizedError` (401) — or any other `HttpError` — and get the correct\n * status and message. Errors are never swallowed or downgraded to a generic\n * 403; a bug in a guard surfaces as its real error rather than a masked 403.\n */\nexport async function executeGuards(\n guards: Guard[],\n ctx: Context,\n container: Container,\n _controllerName: string,\n _methodName: string\n): Promise<void> {\n const guardContext: GuardContext = {\n method: ctx.method,\n path: ctx.path,\n params: ctx.params,\n query: ctx.query,\n headers: ctx.headers,\n body: ctx.body,\n state: ctx.state,\n get: (name: string) => ctx.get(name),\n };\n\n for (let i = 0; i < guards.length; i++) {\n const guard = guards[i]!;\n let guardName: string;\n let result: boolean;\n\n // A thrown guard error propagates unchanged (no try/catch conversion), so\n // typed HTTP errors keep their status/message/stack.\n if (isGuardClass(guard)) {\n // Class-based guard - resolve from DI container\n guardName = guard.name || `ClassGuard[${i}]`;\n const guardInstance = container.resolve(guard) as CanActivate;\n result = await guardInstance.canActivate(guardContext);\n } else {\n // Function-based guard\n guardName = guard.name || `Guard[${i}]`;\n result = await guard(guardContext);\n }\n\n if (!result) {\n throw new GuardRejectionError(guardName);\n }\n }\n}\n","/**\n * @nextrush/class - Interceptor Runner\n *\n * Builds and runs the interceptor onion around a controller-method call. Class\n * interceptors are the outermost layers, method interceptors are inner (closest\n * to the handler), and the innermost `next()` invokes the actual method and\n * returns its raw result. Each interceptor is resolved from the DI container.\n *\n * Interceptors may transform the result (their return value replaces it) and\n * may wrap `next()` in try/catch to observe or recover from handler errors. An\n * error an interceptor does not handle propagates out — so exception filters,\n * which wrap the whole handler, can still catch it.\n */\n\nimport type { Interceptor, InterceptorClass } from './interceptor-types.js';\nimport type { Container } from '@nextrush/di';\nimport type { Context } from '@nextrush/types';\n\n/**\n * Run the controller method wrapped in the interceptor onion.\n *\n * @param interceptors - Interceptor classes in outer-to-inner order (class\n * interceptors first, then method interceptors), as returned by\n * `getAllInterceptors`.\n * @param ctx - Request context passed to each interceptor.\n * @param container - DI container each interceptor is resolved from.\n * @param invokeMethod - Innermost call: invokes the controller method with its\n * resolved arguments and resolves to its raw return value.\n * @returns The (possibly transformed) result flowing into response handling.\n */\nexport async function runInterceptors(\n interceptors: readonly InterceptorClass[],\n ctx: Context,\n container: Container,\n invokeMethod: () => Promise<unknown>\n): Promise<unknown> {\n // Fold from the innermost layer outward: the last interceptor wraps the\n // method call, and each earlier interceptor wraps the layer built so far, so\n // interceptors[0] (a class interceptor) ends up outermost.\n let next = invokeMethod;\n\n for (let i = interceptors.length - 1; i >= 0; i--) {\n const interceptorClass = interceptors[i]!;\n const downstream = next;\n next = () => {\n const instance = container.resolve(interceptorClass) as Interceptor;\n return instance.intercept(ctx, downstream);\n };\n }\n\n return next();\n}\n","/**\n * @nextrush/class - Parameter Resolver\n *\n * Resolves controller-method arguments from the request context using a\n * precomputed, pre-sorted parameter injection plan. Supports async transforms\n * (zod, valibot, etc.) and async custom extractors.\n */\n\nimport type { ParamMetadata } from './param-types.js';\nimport type { Context } from '@nextrush/types';\nimport { MissingParameterError, ParameterInjectionError } from '../errors.js';\n\n/**\n * Resolve parameter values from a precomputed, pre-sorted injection plan.\n * Supports async transform functions for validation libraries (zod, valibot, etc.)\n */\nexport async function resolveParametersFromPlan(\n ctx: Context,\n sortedMetadata: ParamMetadata[],\n controllerName: string,\n methodName: string\n): Promise<unknown[]> {\n if (sortedMetadata.length === 0) {\n return [];\n }\n\n const maxIndex =\n sortedMetadata.length > 0 ? sortedMetadata[sortedMetadata.length - 1]!.index : -1;\n const args: unknown[] = new Array(maxIndex + 1).fill(undefined);\n\n for (const param of sortedMetadata) {\n try {\n // Await supports async custom extractors (createCustomParamDecorator)\n const value = await extractParameterValue(ctx, param);\n\n if (value === undefined) {\n if (param.required && param.defaultValue === undefined) {\n throw createMissingParameterError(\n controllerName,\n methodName,\n param.name ?? `index ${param.index}`,\n param.source\n );\n }\n args[param.index] = param.defaultValue;\n } else {\n // Support both sync and async transform functions\n args[param.index] = param.transform ? await param.transform(value) : value;\n }\n } catch (error) {\n if (error instanceof MissingParameterError) {\n throw error;\n }\n throw new ParameterInjectionError(\n controllerName,\n methodName,\n param.index,\n error instanceof Error ? error.message : String(error)\n );\n }\n }\n\n return args;\n}\n\n/**\n * Build the `MissingParameterError` thrown when a required parameter\n * resolves to nothing.\n *\n * `@Body()` is special-cased: resolving to `undefined` almost always means\n * no body-parser middleware (e.g. `json()` from `@nextrush/body-parser`) ran\n * before the route handler, not that the caller genuinely omitted a body.\n * The generic \"required parameter is missing\" message gives no signal\n * toward that root cause, so the body case gets an appended remediation\n * hint naming the likely fix. Other sources (`param`, `query`, `header`,\n * `custom`) keep the original message unchanged, and the error remains a\n * plain `MissingParameterError` — no subtype — since nothing in the\n * codebase discriminates on a more specific type and the existing\n * `code: 'MISSING_PARAMETER'` / `instanceof MissingParameterError` contract\n * stays stable for consumers.\n */\nfunction createMissingParameterError(\n controllerName: string,\n methodName: string,\n paramName: string,\n source: string\n): MissingParameterError {\n const messageOverride =\n source === 'body'\n ? `Required body parameter \"${paramName}\" is missing. No body was parsed for ` +\n 'this request — register a body-parser middleware before this route ' +\n \"(e.g. app.use(json()) from '@nextrush/body-parser').\"\n : undefined;\n\n return new MissingParameterError(controllerName, methodName, paramName, source, messageOverride);\n}\n\n/**\n * Extract parameter value from context based on source\n */\nexport function extractParameterValue(ctx: Context, param: ParamMetadata): unknown {\n switch (param.source) {\n case 'body':\n if (param.name) {\n return (ctx.body as Record<string, unknown>)?.[param.name];\n }\n return ctx.body;\n\n case 'param':\n if (param.name) {\n return ctx.params[param.name];\n }\n return ctx.params;\n\n case 'query':\n if (param.name) {\n return ctx.query[param.name];\n }\n return ctx.query;\n\n case 'header':\n if (param.name) {\n return ctx.get(param.name);\n }\n return ctx.headers;\n\n case 'ctx':\n return ctx;\n\n case 'req':\n return ctx.raw.req;\n\n case 'res':\n return ctx.raw.res;\n\n case 'custom':\n if (param.customExtractor) {\n return param.customExtractor(ctx);\n }\n return undefined;\n\n default:\n return undefined;\n }\n}\n","/**\n * @nextrush/class - Handler Builder\n *\n * Builds route handlers from controller methods with parameter injection.\n * Orchestrates path construction, middleware resolution, and route metadata,\n * delegating per-route handler creation to {@link createRouteHandler}.\n */\n\nimport type {\n ControllerMetadata,\n ControllerRouteMetadata,\n MiddlewareRef,\n} from '../types.js';\nimport type { ControllerDefinition } from '../metadata/metadata.js';\nimport type { Container } from '@nextrush/di';\nimport type { MetadataContribution, Middleware } from '@nextrush/types';\nimport { createRouteHandler } from '../runtime/handler.js';\nimport type { BuiltRoute } from './registrar-types.js';\n\n/**\n * Resolve middleware references to actual middleware functions.\n *\n * - Function refs are used directly\n * - String/symbol refs are resolved from the DI container\n */\nfunction resolveMiddlewareRefs(refs: MiddlewareRef[], container: Container): Middleware[] {\n return refs.map((ref) => {\n if (typeof ref === 'function') {\n return ref as Middleware;\n }\n\n // String or symbol — resolve from DI container\n const resolved = container.resolve<Middleware>(ref as string);\n\n if (typeof resolved !== 'function') {\n throw new Error(\n `Middleware token \"${String(ref)}\" resolved to a non-function value. ` +\n 'Ensure the registered provider returns a middleware function.'\n );\n }\n\n return resolved;\n });\n}\n\n/**\n * Build route handlers for a controller.\n *\n * @param instanceCache - Shared controller-instance cache (keyed by controller\n * class). Handlers read-or-populate it so a controller singleton is resolved\n * exactly once across boot-time validation and all requests. Defaults to a\n * fresh per-call map when omitted (standalone use), preserving lazy resolution.\n */\nexport function buildRoutes(\n definition: ControllerDefinition,\n container: Container,\n globalPrefix: string,\n globalMiddleware: Middleware[],\n instanceCache: Map<Function, unknown> = new Map(),\n isRequestScoped = false\n): BuiltRoute[] {\n const routes: BuiltRoute[] = [];\n const { target, controller, routes: routeMetadata } = definition;\n\n for (const route of routeMetadata) {\n const handler = createRouteHandler(target, route, container, instanceCache, isRequestScoped);\n const fullPath = buildFullRoutePath(\n globalPrefix,\n controller.path,\n route.path,\n controller.version\n );\n\n const combinedMiddleware: Middleware[] = [\n ...globalMiddleware,\n ...resolveMiddlewareRefs(controller.middleware ?? [], container),\n ...resolveMiddlewareRefs(route.middleware ?? [], container),\n ];\n\n routes.push({\n method: route.method,\n path: fullPath,\n handler,\n middleware: combinedMiddleware,\n controller: target,\n methodName: String(route.methodName),\n metadata: toRouteMetaContribution(controller, route),\n });\n }\n\n return routes;\n}\n\n/**\n * Map decorator documentation to a route metadata contribution.\n *\n * Pulls `description`/`deprecated` from the route decorator and `tags` from the\n * controller decorator. Returns `undefined` when the route carries no docs, so\n * undocumented routes stay metadata-free rather than gaining empty entries.\n */\nfunction toRouteMetaContribution(\n controller: ControllerMetadata,\n route: ControllerRouteMetadata\n): MetadataContribution | undefined {\n const contribution: {\n description?: string;\n deprecated?: boolean;\n tags?: string[];\n } = {};\n\n if (route.description) {\n contribution.description = route.description;\n }\n if (route.deprecated) {\n contribution.deprecated = true;\n }\n if (controller.tags && controller.tags.length > 0) {\n contribution.tags = [...controller.tags];\n }\n\n return Object.keys(contribution).length > 0 ? contribution : undefined;\n}\n\n/**\n * Build full route path with all prefixes\n */\nfunction buildFullRoutePath(\n globalPrefix: string,\n controllerPath: string,\n routePath: string,\n version?: string\n): string {\n const parts: string[] = [];\n\n if (globalPrefix && globalPrefix !== '/') {\n parts.push(globalPrefix.startsWith('/') ? globalPrefix : '/' + globalPrefix);\n }\n\n if (version) {\n parts.push('/' + version);\n }\n\n if (controllerPath && controllerPath !== '/') {\n parts.push(controllerPath.startsWith('/') ? controllerPath : '/' + controllerPath);\n }\n\n if (routePath && routePath !== '/') {\n parts.push(routePath.startsWith('/') ? routePath : '/' + routePath);\n }\n\n const fullPath = parts.join('') || '/';\n\n return fullPath.replace(/\\/+/g, '/');\n}\n","/**\n * Registrar stage: Build routes and register controllers in the DI container.\n * Also performs eager validation if enabled.\n */\n\nimport type { BootstrapContext } from '../context.js';\nimport { ControllerRegistry } from '../../registrar/registry.js';\nimport { validateControllers, validateGuards } from '../../registrar/registrar.js';\n\nexport function registrarStage(ctx: BootstrapContext): void {\n // Create the registry with resolved options and request-scoped set\n const registry = new ControllerRegistry(\n ctx.resolvedOptions.container,\n ctx.resolvedOptions.prefix,\n ctx.resolvedOptions.middleware,\n ctx.resolvedOptions.debug,\n ctx.requestScoped\n );\n\n // Register all controllers and build routes\n const registered = registry.registerAll(ctx.discoveredClasses);\n\n // Collect all built routes for the router stage\n ctx.builtRoutes = [];\n for (const regCtrl of registered) {\n ctx.builtRoutes.push(...regCtrl.routes);\n }\n\n // Store registry instances for lifecycle integration\n ctx.registryInstances = registry.instances;\n\n // Store controller classes for lifecycle bridge\n ctx.lifecycleData.controllerClasses = ctx.discoveredClasses;\n\n // Validate controllers and guards if enabled\n if (ctx.resolvedOptions.validate) {\n validateControllers(registered, ctx.resolvedOptions.container, registry.instances);\n validateGuards(registered, ctx.resolvedOptions.container);\n }\n}\n\n","/**\n * Router stage: Mount all built routes on the router.\n */\n\nimport type { BootstrapContext } from '../context.js';\nimport type { Router } from '@nextrush/core';\nimport { ROUTE_METADATA } from '@nextrush/types';\nimport { RouteRegistrationError } from '../../errors.js';\nimport type { BuiltRoute } from '../../registrar/registrar-types.js';\n\nexport function routerStage(ctx: BootstrapContext): void {\n const router = ctx.router;\n\n // Register from the frozen Application Graph (the source of truth once built);\n // fall back to the raw built routes defensively if the graph is not assembled.\n const routes = ctx.graph ? ctx.graph.routes : ctx.builtRoutes;\n\n for (const route of routes) {\n try {\n const method = route.method.toLowerCase() as keyof Router;\n\n if (typeof router[method] !== 'function') {\n throw new RouteRegistrationError(\n 'Unknown',\n route.method,\n route.path,\n `Router does not support HTTP method: ${route.method}`\n );\n }\n\n // Build middleware+handler array from route definition\n const entries = buildRouteEntries(route);\n\n (router[method] as (path: string, ...entries: unknown[]) => unknown)(\n route.path,\n ...entries\n );\n } catch (error) {\n throw new RouteRegistrationError(\n 'Unknown',\n route.method,\n route.path,\n error instanceof Error ? error.message : String(error),\n error instanceof Error ? error : undefined\n );\n }\n }\n}\n\n/**\n * Build middleware + handler array from a route definition.\n * Mirrors buildRouteEntries from registrar.ts.\n */\nfunction buildRouteEntries(route: BuiltRoute): unknown[] {\n const entries: unknown[] = [...route.middleware];\n if (route.metadata) {\n entries.push({ [ROUTE_METADATA]: route.metadata });\n }\n entries.push(route.handler);\n return entries;\n}\n","/**\n * @nextrush/class - Service lifecycle bridge\n *\n * Bridges duck-typed service lifecycle hooks (`OnInit`/`OnShutdown` from\n * `@nextrush/class`) into the application's Extension lifecycle without\n * touching `@nextrush/core`:\n *\n * - `onInit()` runs at `app.ready()` (when adapters boot the app, before serving)\n * - `onShutdown()` runs at `app.close()`, in the reverse of the `onInit` order\n *\n * Instances are collected by walking the controller + transitive\n * `@Service`/`@Repository`/`@Config` graph, resolving each from the active\n * container, and keeping the DISTINCT instances (deduped by identity) that\n * implement at least one hook. Ordering is a reverse-BFS approximation:\n * dependencies initialize before the controllers/services that depend on them,\n * and tear down in the opposite order. Services without hooks are untouched, and\n * no Extension is registered at all when no instance implements a hook.\n */\n\nimport type { Application } from '@nextrush/core';\nimport { isOnInit, isOnShutdown } from './lifecycle-types.js';\nimport type { Container, Token } from '@nextrush/di';\nimport { collectServiceGraph } from '../request/isolation.js';\n\n/**\n * Base name of the internal Extension registered to run lifecycle hooks. Each\n * `registerControllers` call that finds hooks registers a uniquely-suffixed\n * variant (see {@link registerLifecycleExtension}), because `app.extend()`\n * rejects duplicate names and the same app may register controllers more than\n * once.\n */\nexport const CONTROLLERS_LIFECYCLE_EXTENSION = 'nextrush:controllers-lifecycle';\n\n/** Monotonic per-call counter guaranteeing unique Extension names within a process. */\nlet lifecycleRegistrationCount = 0;\n\n/**\n * Return the distinct instances implementing `onInit` and/or `onShutdown`, in\n * dependency-first `onInit` order (dependencies before the classes that depend\n * on them — a reverse-BFS approximation).\n *\n * Services are resolved from `container` (singletons return the shared instance\n * requests use). Controllers are taken ONLY from `instanceCache` (populated by\n * the registrar's eager validation) — never force-resolved here, so disabling\n * validation keeps controller construction lazy. A controller that implements a\n * hook therefore participates only when validation is enabled (the default).\n *\n * Unresolvable service classes are skipped silently; genuine resolution failures\n * are surfaced separately by the registrar's eager controller/guard validation.\n */\nexport function collectLifecycleInstances(\n controllers: Function[],\n container: Container,\n instanceCache: Map<Function, unknown>\n): object[] {\n const seen = new Set<object>();\n const collected: object[] = [];\n\n const consider = (instance: unknown): void => {\n if (typeof instance !== 'object' || instance === null || seen.has(instance)) {\n return;\n }\n seen.add(instance);\n if (isOnInit(instance) || isOnShutdown(instance)) {\n collected.push(instance);\n }\n };\n\n // Dependencies first: reverse the BFS service graph (deepest deps lead).\n for (const service of [...collectServiceGraph(controllers)].reverse()) {\n try {\n consider(container.resolve(service as Token));\n } catch {\n continue;\n }\n }\n\n // Controllers last (they depend on the services above), using only the\n // already-resolved instance — never resolving a controller just for hooks.\n for (const controller of controllers) {\n consider(instanceCache.get(controller));\n }\n\n return collected;\n}\n\n/**\n * Register the internal lifecycle Extension on `app` when at least one collected\n * instance implements a hook. No-op when there are none (never adds a dead\n * Extension).\n *\n * @throws if the app is already booted (`ready()`) or running — configuration is\n * frozen and `app.extend()` would reject, so this fails fast with actionable\n * guidance to call `registerControllers` before `serve()`/`ready()`.\n */\nexport function registerLifecycleExtension(\n app: Application,\n controllers: Function[],\n container: Container,\n instanceCache: Map<Function, unknown>\n): void {\n const instances = collectLifecycleInstances(controllers, container, instanceCache);\n if (instances.length === 0) {\n return;\n }\n\n if (app.isReady || app.isRunning) {\n throw new Error(\n 'registerControllers() found services with lifecycle hooks (onInit/onShutdown), ' +\n 'but the app is already booted (ready()) or running, so its configuration is ' +\n 'frozen and the lifecycle Extension cannot be registered. Call ' +\n 'registerControllers() BEFORE serve()/listen()/ready().'\n );\n }\n\n app.extend({\n name: `${CONTROLLERS_LIFECYCLE_EXTENSION}#${++lifecycleRegistrationCount}`,\n async setup(): Promise<void> {\n for (const instance of instances) {\n if (isOnInit(instance)) {\n await instance.onInit();\n }\n }\n },\n async destroy(): Promise<void> {\n // Isolated, per-hook teardown (F-03 / RFC-022 D2): a throwing onShutdown()\n // must not strand every later service's teardown. Mirrors the app-level\n // Promise.allSettled isolation across extensions — this loop previously\n // had none, so one throw aborted every subsequent hook in reverse order.\n const errors: unknown[] = [];\n for (const instance of [...instances].reverse()) {\n if (isOnShutdown(instance)) {\n try {\n await instance.onShutdown();\n } catch (err) {\n errors.push(err);\n }\n }\n }\n if (errors.length > 0) {\n throw new AggregateError(\n errors,\n `${String(errors.length)} onShutdown() hook(s) failed`\n );\n }\n },\n });\n}\n","/**\n * @nextrush/class - ApplicationGraph IR (Immutable Intermediate Representation)\n *\n * RFC-NEXTRUSH-CLASS-CONSOLIDATION P3.4: Immutable IR that documents the\n * bootstrap read-once, freeze-then-execute pattern.\n *\n * CRITICAL PROPERTY: All metadata is read ONCE at bootstrap time via Reflect\n * and baked into the ApplicationGraph. The request-time handler execution path\n * performs ZERO Reflect metadata reads — metadata is captured in the handler\n * closure and precomputed data structures at build time.\n *\n * The graph captures per-controller:\n * - Route metadata (method/path/params/guards/filters/interceptors/httpCode/headers)\n * - Effective scope (singleton vs request-scoped) after dependency bubbling\n * - Middleware and provider graph nodes\n */\n\nimport type { BuiltRoute } from '../registrar/registrar-types.js';\n\n/**\n * Assemble the immutable {@link ApplicationGraph} from the boot artifacts and\n * deep-freeze it. Called once by the bootstrap pipeline after routes are built\n * and the request-scope set is known; the router stage then registers from the\n * frozen graph. Freezes the SHAPE (routes/providers/scopes), never live\n * controller instances — request-scoped controllers still instantiate per\n * request from the child-container path.\n */\nexport function buildApplicationGraph(\n routes: ReadonlyArray<BuiltRoute>,\n providers: ReadonlyMap<Function, ReadonlyArray<Function>>,\n requestScopedTokens: ReadonlySet<Function>\n): ApplicationGraph {\n return deepFreeze<ApplicationGraph>({\n routes: [...routes],\n providers,\n requestScopedTokens,\n });\n}\n\n/**\n * ApplicationGraph IR: The immutable plan built once at bootstrap by reading\n * Reflect metadata. Request-time execution reads ONLY from this graph.\n *\n * The graph is deep-frozen to enforce immutability and prevent accidental\n * mutations that would break the boot-once guarantee.\n *\n * Structure:\n * - routes: All BuiltRoute objects with precomputed handler closures\n * - providers: DI provider metadata for request-scope bubble detection\n * - requestScopedTokens: Set of provider tokens with request scope\n */\nexport interface ApplicationGraph {\n /** All built routes (precomputed at bootstrap, frozen) */\n readonly routes: ReadonlyArray<BuiltRoute>;\n\n /** Provider dependency map (Function → Function[]) */\n readonly providers: ReadonlyMap<Function, ReadonlyArray<Function>>;\n\n /** Tokens marked as request-scoped (require child container per request) */\n readonly requestScopedTokens: ReadonlySet<Function>;\n}\n\n/**\n * Deep freeze a value (recursively freeze objects, arrays, Maps, Sets).\n * Used to enforce immutability of the ApplicationGraph and prevent accidental\n * mutations after bootstrap completes.\n *\n * @internal\n */\nexport function deepFreeze<T>(obj: T): T {\n if (obj === null || typeof obj !== 'object') {\n return obj;\n }\n\n if (Array.isArray(obj)) {\n for (const item of obj) {\n deepFreeze(item);\n }\n return Object.freeze(obj) as T;\n }\n\n if (obj instanceof Map) {\n obj.forEach((value) => {\n deepFreeze(value);\n });\n return Object.freeze(obj) as T;\n }\n\n if (obj instanceof Set) {\n // Sets are frozen but values inside may not be — freeze them\n obj.forEach((value) => {\n deepFreeze(value);\n });\n return Object.freeze(obj) as T;\n }\n\n // Plain object\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n deepFreeze((obj as Record<string, unknown>)[key]);\n }\n }\n\n return Object.freeze(obj) as T;\n}\n","/**\n * collectDiagnostics: Pure function deriving DiagnosticsReport from ApplicationGraph IR\n *\n * Extracts route list, provider list, detects duplicate routes (same method+path),\n * detects circular dependencies via DFS, and includes bootstrap timings.\n *\n * Called by bootstrap/pipeline.ts when diagnostics: true.\n */\n\nimport type { ApplicationGraph } from '../bootstrap/graph.js';\nimport type {\n CircularDependency,\n DiagnosticsReport,\n DuplicateRoute,\n ProviderEntry,\n RouteEntry,\n TimingEntry,\n} from './types.js';\n\n/**\n * Collect diagnostics from the frozen ApplicationGraph IR.\n *\n * Pure function: takes graph and timings, derives report without side effects.\n * Reports extracted route list, provider graph, duplicate routes, circular\n * dependencies, and stage timings.\n *\n * @param graph Frozen ApplicationGraph from bootstrap\n * @param timings Array of timing entries (stage name + duration)\n * @returns DiagnosticsReport with all extracted metadata\n */\nexport function collectDiagnostics(\n graph: ApplicationGraph,\n timings: TimingEntry[]\n): DiagnosticsReport {\n // Extract routes: map BuiltRoute to RouteEntry\n const routes = graph.routes.map((route) => ({\n method: route.method,\n path: route.path,\n controller: route.controller,\n })) as RouteEntry[];\n\n // Extract providers: convert Map<Function, Function[]> to ProviderEntry[]\n const providers = Array.from(graph.providers.entries()).map(([token, deps]) => ({\n token,\n dependencies: [...deps],\n })) as ProviderEntry[];\n\n // Detect duplicate routes: same method+path more than once\n const routeMap = new Map<string, number>();\n for (const route of routes) {\n const key = `${route.method}:${route.path}`;\n routeMap.set(key, (routeMap.get(key) ?? 0) + 1);\n }\n\n const duplicateRoutes = Array.from(routeMap.entries())\n .filter(([_key, count]) => count > 1)\n .map(([key, count]) => {\n const [method, ...pathParts] = key.split(':');\n return {\n method,\n path: pathParts.join(':'),\n count,\n };\n }) as DuplicateRoute[];\n\n // Detect circular dependencies via DFS\n const circularDependencies = detectCircularDependencies(graph.providers);\n\n return {\n routes: Object.freeze(routes),\n providers: Object.freeze(providers),\n duplicateRoutes: Object.freeze(duplicateRoutes),\n circularDependencies: Object.freeze(circularDependencies),\n timings: Object.freeze(timings),\n };\n}\n\n/**\n * Detect circular dependencies in the provider graph using DFS.\n * Returns array of cycles found (each cycle is an array of tokens).\n *\n * @param providers Map from token to its dependencies\n * @returns Array of detected cycles\n */\nfunction detectCircularDependencies(\n providers: ReadonlyMap<Function | Symbol, ReadonlyArray<Function | Symbol>>\n): CircularDependency[] {\n const cycles: CircularDependency[] = [];\n const visited = new Set<Function | Symbol>();\n const recursionStack = new Set<Function | Symbol>();\n\n const visit = (token: Function | Symbol, path: (Function | Symbol)[]): void => {\n if (recursionStack.has(token)) {\n // Found a cycle: extract it from the path\n const cycleStart = path.indexOf(token);\n if (cycleStart !== -1) {\n const cycle = Object.freeze([...path.slice(cycleStart), token]) as ReadonlyArray<Function | Symbol>;\n cycles.push({ cycle });\n }\n return;\n }\n\n if (visited.has(token)) {\n return;\n }\n\n visited.add(token);\n recursionStack.add(token);\n\n const deps = providers.get(token) || [];\n for (const dep of deps) {\n visit(dep, [...path, token]);\n }\n\n recursionStack.delete(token);\n };\n\n // Start DFS from each unvisited provider\n for (const token of providers.keys()) {\n if (!visited.has(token)) {\n visit(token, []);\n }\n }\n\n return cycles;\n}\n","/**\n * Bootstrap pipeline: Orchestrate all stages in sequence.\n */\n\nimport type { BootstrapContext } from './context.js';\nimport { discoverStage } from './stages/discover.js';\nimport { metadataStage } from './stages/metadata.js';\nimport { providerGraphStage } from './stages/provider-graph.js';\nimport { validationStage } from './stages/validation.js';\nimport { registrarStage } from './stages/registrar.js';\nimport { routerStage } from './stages/router.js';\nimport { registerLifecycleExtension } from '../lifecycle/lifecycle.js';\nimport { buildApplicationGraph } from './graph.js';\nimport { collectDiagnostics } from '../diagnostics/collector.js';\nimport type { Application } from '@nextrush/core';\nimport type { DiagnosticsReport } from '../diagnostics/types.js';\n\n/**\n * Execute the bootstrap pipeline in sequence:\n *\n * 1. discover — Run DiscoverySource to populate discoveredClasses\n * 2. metadata — Extract controller metadata from each class\n * 3. providerGraph — Compute request-scope bubbling\n * 4. validation — Bootstrap DI factories and validate constraints\n * 5. registrar — Build routes and register in DI container\n * 6. router — Mount routes on the app's router\n * 7. lifecycle — Bridge service lifecycle hooks into app lifecycle\n */\nexport async function bootstrapPipeline(ctx: BootstrapContext): Promise<void> {\n const enableTiming = ctx.resolvedOptions.diagnostics ?? false;\n const now = enableTiming ? () => performance.now() : () => 0;\n let stageStart = now();\n\n // Discovery\n await discoverStage(ctx);\n if (enableTiming) {\n ctx.timings.push({ stage: 'discover', ms: performance.now() - stageStart });\n }\n\n if (ctx.discoveredClasses.length === 0) {\n return;\n }\n\n // Metadata extraction\n stageStart = now();\n metadataStage(ctx);\n if (enableTiming) {\n ctx.timings.push({ stage: 'metadata', ms: performance.now() - stageStart });\n }\n\n // Provider graph and request-scope bubbling\n stageStart = now();\n await providerGraphStage(ctx);\n if (enableTiming) {\n ctx.timings.push({ stage: 'providerGraph', ms: performance.now() - stageStart });\n }\n\n // DI validation\n stageStart = now();\n await validationStage(ctx);\n if (enableTiming) {\n ctx.timings.push({ stage: 'validation', ms: performance.now() - stageStart });\n }\n\n // Registry and route building\n stageStart = now();\n registrarStage(ctx);\n if (enableTiming) {\n ctx.timings.push({ stage: 'registrar', ms: performance.now() - stageStart });\n }\n\n // Assemble + deep-freeze the immutable Application Graph (IR) once. The router\n // stage below registers from this frozen graph; request-time execution reads\n // only baked route data (zero Reflect on the request path).\n stageStart = now();\n ctx.graph = buildApplicationGraph(ctx.builtRoutes, ctx.providerGraph, ctx.requestScoped);\n if (enableTiming) {\n ctx.timings.push({ stage: 'graph', ms: performance.now() - stageStart });\n }\n\n // Router registration (from the frozen graph)\n stageStart = now();\n routerStage(ctx);\n if (enableTiming) {\n ctx.timings.push({ stage: 'router', ms: performance.now() - stageStart });\n }\n\n // Lifecycle hook integration\n stageStart = now();\n registerLifecycleExtension(\n ctx.app,\n ctx.lifecycleData.controllerClasses,\n ctx.resolvedOptions.container,\n ctx.registryInstances\n );\n if (enableTiming) {\n ctx.timings.push({ stage: 'lifecycle', ms: performance.now() - stageStart });\n }\n\n // Collect diagnostics if enabled\n if (enableTiming && ctx.graph) {\n const report = collectDiagnostics(ctx.graph, ctx.timings);\n storeClassDiagnostics(ctx.app, report);\n }\n}\n\n// Module-level WeakMap to store diagnostics reports per app\nconst diagnosticsStore = new WeakMap<Application, DiagnosticsReport>();\n\n/** Store diagnostics report for later retrieval via getClassDiagnostics */\nfunction storeClassDiagnostics(app: Application, report: DiagnosticsReport): void {\n diagnosticsStore.set(app, report);\n}\n\n/** Retrieve stored diagnostics report, or undefined if diagnostics not enabled */\nexport function getClassDiagnosticsInternal(app: Application): DiagnosticsReport | undefined {\n return diagnosticsStore.get(app);\n}\n","/**\n * DiscoverySource: Abstraction for controller class discovery.\n *\n * Two implementations:\n * - FilesystemSource: Scans the filesystem for controller files (default)\n * - MemorySource: Uses an explicit list of controller classes (programmatic/test)\n */\n\n/**\n * Discovers controller classes. Called by the discover stage.\n */\nexport interface DiscoverySource {\n discover(): ClassRef[] | Promise<ClassRef[]>;\n}\n\n/**\n * A controller class reference. Always a constructor function.\n */\nexport type ClassRef = Function;\n\n/**\n * FilesystemSource: Wraps the existing filesystem discovery logic.\n *\n * Scans a directory tree for controller files matching include/exclude patterns,\n * imports them, and returns the discovered controller classes.\n */\nexport class FilesystemSource implements DiscoverySource {\n private _discoveryErrors: unknown[] = [];\n\n constructor(\n private root: string,\n private include: string[],\n private exclude: string[],\n private debug: boolean\n ) {}\n\n async discover(): Promise<ClassRef[]> {\n // Deferred import to avoid circular dependency — discovery.ts exports\n // the actual filesystem scanning logic.\n const { discoverControllers, getControllersFromResults, getErrorsFromResults } = await import(\n './discovery.js'\n );\n\n const results = await discoverControllers({\n root: this.root,\n include: this.include,\n exclude: this.exclude,\n debug: this.debug,\n });\n\n const controllers = getControllersFromResults(results);\n // Collected for the validation stage to surface; scan errors are not fatal here.\n this._discoveryErrors = getErrorsFromResults(results);\n\n return controllers;\n }\n\n /**\n * Access discovery errors, if any, after discover() completes.\n * @internal\n */\n getDiscoveryErrors(): unknown[] {\n return this._discoveryErrors;\n }\n}\n\n/**\n * MemorySource: Uses an explicit list of controller classes.\n *\n * For programmatic/test use cases where controller classes are already known\n * and no filesystem scan is needed.\n */\nexport class MemorySource implements DiscoverySource {\n constructor(private controllers: ClassRef[]) {}\n\n discover(): ClassRef[] {\n return this.controllers;\n }\n}\n","/**\n * @nextrush/class - Module graph traversal\n *\n * Walks a module's `imports` into a flat, ordered, deduplicated list. The walk\n * is post-order (imported feature modules before their importer), dedupes\n * diamond/duplicate imports, and guards import cycles. See RFC-NEXTRUSH-MODULES.\n */\n\nimport { getModuleMetadata, isModule } from './module.js';\nimport { NotAModuleError } from '../errors.js';\n\n/**\n * Collect the full module graph reachable from `root` via `imports`.\n *\n * - **Post-order**: an imported module appears before the module that imports\n * it, so a feature module's providers/controllers register before the root's.\n * - **Dedupe**: a module reached through multiple paths (diamond) or listed\n * twice is included exactly once (first-completed wins).\n * - **Cycle guard**: a back-edge to an in-progress module is skipped, so a\n * mutual import (`A imports B imports A`) terminates instead of recursing\n * forever.\n *\n * @throws {NotAModuleError} if `root` or any imported class lacks `@Module`.\n */\nexport function collectModuleGraph(root: Function): Function[] {\n const ordered: Function[] = [];\n const completed = new Set<Function>();\n const visiting = new Set<Function>();\n\n const visit = (mod: Function): void => {\n if (completed.has(mod)) {\n return;\n }\n if (visiting.has(mod)) {\n // Back-edge into an in-progress module — an import cycle. Skip to\n // terminate; the module is still added when its original visit completes.\n return;\n }\n if (!isModule(mod)) {\n throw new NotAModuleError(mod.name || 'AnonymousModule');\n }\n\n visiting.add(mod);\n\n const metadata = getModuleMetadata(mod);\n for (const imported of metadata?.imports ?? []) {\n visit(imported);\n }\n\n visiting.delete(mod);\n completed.add(mod);\n ordered.push(mod);\n };\n\n visit(root);\n return ordered;\n}\n\n/**\n * Collect every controller declared across an ordered module list, preserving\n * order and deduplicating a controller declared in more than one module.\n */\nexport function collectModuleControllers(modules: Function[]): Function[] {\n const controllers: Function[] = [];\n const seen = new Set<Function>();\n\n for (const mod of modules) {\n const metadata = getModuleMetadata(mod);\n for (const controller of metadata?.controllers ?? []) {\n if (!seen.has(controller)) {\n seen.add(controller);\n controllers.push(controller);\n }\n }\n }\n\n return controllers;\n}\n","/**\n * @nextrush/class - Module registrar\n *\n * `registerModule(app, RootModule, options?)` wires a whole `@Module` graph in\n * one call: it walks `imports`, registers every module's providers into the DI\n * container, then hands the flattened controller list to the existing\n * `registerControllers` pipeline (route building, eager validation, guard\n * validation, lifecycle-hook bridging, isolate/request-scope). It duplicates\n * none of that machinery. See RFC-NEXTRUSH-MODULES.\n *\n * @example\n * ```typescript\n * const app = createApp();\n * await registerModule(app, AppModule, { prefix: '/api' });\n * await serve(app, { port: 8080 });\n * ```\n */\n\nimport type { Application } from '@nextrush/core';\nimport {\n getModuleMetadata,\n} from './module.js';\nimport type {\n ModuleProvider,\n ModuleProviderConfig,\n} from './module-types.js';\nimport {\n container as globalContainer,\n createContainer,\n getServiceScope,\n hasServiceMetadata,\n type Constructor,\n type Container,\n} from '@nextrush/di';\nimport { collectModuleControllers, collectModuleGraph } from './module-graph.js';\nimport { registerControllers } from '../registrar/registrar.js';\nimport type { ControllersOptions } from '../registrar/registrar-types.js';\n\n/**\n * Options for {@link registerModule}. Mirrors the subset of\n * {@link ControllersOptions} that applies to module registration — module\n * composition replaces `root`/`controllers` discovery.\n */\nexport type ModuleRegistrationOptions = Pick<\n ControllersOptions,\n 'prefix' | 'middleware' | 'container' | 'isolate' | 'validate' | 'debug'\n>;\n\n/**\n * Register a module graph on an application.\n *\n * Selects the DI container once (an explicit `options.container` wins, else\n * `isolate` gets a fresh container, else `app.container` → the global\n * container), registers every module's providers into it, then registers all\n * controllers across the graph through {@link registerControllers}. The chosen\n * container is passed explicitly so it wins inside `registerControllers` even\n * under `isolate: true`, keeping providers and controllers on one container.\n *\n * @param app - The application (must have a router — use `createApp()`).\n * @param rootModule - The root `@Module` class.\n * @param options - Registration options (prefix, middleware, container, etc.).\n * @throws {NotAModuleError} if `rootModule` or any imported class is not a module.\n */\nexport async function registerModule(\n app: Application,\n rootModule: Function,\n options: ModuleRegistrationOptions = {}\n): Promise<void> {\n const container: Container =\n options.container ??\n (options.isolate ? createContainer() : (app.container ?? globalContainer));\n\n const modules = collectModuleGraph(rootModule);\n\n for (const mod of modules) {\n const metadata = getModuleMetadata(mod);\n for (const provider of metadata?.providers ?? []) {\n registerProvider(provider, container);\n }\n }\n\n const controllers = collectModuleControllers(modules);\n\n await registerControllers(app, { ...options, container, controllers });\n}\n\n/**\n * Register a single module provider into the container.\n *\n * A bare class is registered as `{ useClass }` with its declared `@Service`\n * scope (or `singleton` if undecorated), and only when not already registered.\n * A provider config is registered with the matching provider kind; value\n * providers ignore scope, class/factory providers default to `singleton`.\n */\nfunction registerProvider(provider: ModuleProvider, container: Container): void {\n if (typeof provider === 'function') {\n registerClassProvider(provider, container);\n return;\n }\n registerConfigProvider(provider, container);\n}\n\n/** Register a bare class provider with its declared `@Service` scope. */\nfunction registerClassProvider(target: Function, container: Container): void {\n const token = target as Constructor;\n if (container.isRegistered(token)) {\n return;\n }\n const scope = hasServiceMetadata(target) ? getServiceScope(target) : 'singleton';\n container.register(token, { useClass: token }, { scope: scope ?? 'singleton' });\n}\n\n/** Register a provider config (`useValue` / `useFactory` / `useClass`). */\nfunction registerConfigProvider(provider: ModuleProviderConfig, container: Container): void {\n const { provide, scope } = provider;\n\n if ('useValue' in provider) {\n container.register(provide, { useValue: provider.useValue });\n return;\n }\n\n if (provider.useFactory) {\n container.register(\n provide,\n { useFactory: provider.useFactory, inject: provider.inject },\n { scope: scope ?? 'singleton' }\n );\n return;\n }\n\n if (provider.useClass) {\n container.register(provide, { useClass: provider.useClass }, { scope: scope ?? 'singleton' });\n return;\n }\n\n throw new Error(\n `Invalid module provider for token \"${String(provide)}\": a provider config ` +\n `must set exactly one of \"useValue\", \"useFactory\", or \"useClass\".`\n );\n}\n","/**\n * Public API for retrieving diagnostics reports\n *\n * Wrapper over the internal WeakMap storage to provide a clean public interface.\n */\n\nimport type { Application } from '@nextrush/core';\nimport type { DiagnosticsReport } from './types.js';\nimport { getClassDiagnosticsInternal } from '../bootstrap/pipeline.js';\n\n/**\n * Retrieve the diagnostics report for an application.\n *\n * Returns undefined if diagnostics were not enabled during registration\n * (diagnostics: false or not specified in options).\n *\n * @param app The application instance\n * @returns Diagnostics report if enabled, undefined otherwise\n */\nexport function getClassDiagnostics(app: Application): DiagnosticsReport | undefined {\n return getClassDiagnosticsInternal(app) as DiagnosticsReport | undefined;\n}\n"]}
|