adorn-api 1.0.13 → 1.0.14

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.
Files changed (167) hide show
  1. package/dist/adapter/express/auth.d.ts +8 -0
  2. package/dist/adapter/express/auth.d.ts.map +1 -1
  3. package/dist/adapter/express/bootstrap.d.ts +12 -0
  4. package/dist/adapter/express/bootstrap.d.ts.map +1 -1
  5. package/dist/adapter/express/coercion.d.ts +81 -1
  6. package/dist/adapter/express/coercion.d.ts.map +1 -1
  7. package/dist/adapter/express/index.d.ts +1 -0
  8. package/dist/adapter/express/index.d.ts.map +1 -1
  9. package/dist/adapter/express/merge.d.ts +17 -0
  10. package/dist/adapter/express/merge.d.ts.map +1 -1
  11. package/dist/adapter/express/openapi.d.ts +55 -0
  12. package/dist/adapter/express/openapi.d.ts.map +1 -1
  13. package/dist/adapter/express/router.d.ts +6 -0
  14. package/dist/adapter/express/router.d.ts.map +1 -1
  15. package/dist/adapter/express/swagger.d.ts +6 -0
  16. package/dist/adapter/express/swagger.d.ts.map +1 -1
  17. package/dist/adapter/express/types.d.ts +26 -0
  18. package/dist/adapter/express/types.d.ts.map +1 -1
  19. package/dist/adapter/express/validation.d.ts +19 -2
  20. package/dist/adapter/express/validation.d.ts.map +1 -1
  21. package/dist/cli.cjs +192 -11
  22. package/dist/cli.cjs.map +1 -1
  23. package/dist/cli.js +192 -11
  24. package/dist/cli.js.map +1 -1
  25. package/dist/compiler/analyze/index.d.ts +5 -0
  26. package/dist/compiler/analyze/index.d.ts.map +1 -0
  27. package/dist/compiler/analyze/scanControllers.d.ts +52 -0
  28. package/dist/compiler/analyze/scanControllers.d.ts.map +1 -1
  29. package/dist/compiler/cache/isStale.d.ts +26 -0
  30. package/dist/compiler/cache/isStale.d.ts.map +1 -1
  31. package/dist/compiler/cache/loadArtifacts.d.ts +36 -0
  32. package/dist/compiler/cache/loadArtifacts.d.ts.map +1 -1
  33. package/dist/compiler/cache/schema.d.ts +14 -0
  34. package/dist/compiler/cache/schema.d.ts.map +1 -1
  35. package/dist/compiler/cache/writeCache.d.ts +6 -0
  36. package/dist/compiler/cache/writeCache.d.ts.map +1 -1
  37. package/dist/compiler/gems.d.ts +75 -0
  38. package/dist/compiler/gems.d.ts.map +1 -0
  39. package/dist/compiler/generator/index.d.ts +7 -0
  40. package/dist/compiler/generator/index.d.ts.map +1 -0
  41. package/dist/compiler/generator/manifest.d.ts +23 -0
  42. package/dist/compiler/generator/manifest.d.ts.map +1 -0
  43. package/dist/compiler/generator/openapi.d.ts +118 -0
  44. package/dist/compiler/generator/openapi.d.ts.map +1 -0
  45. package/dist/compiler/graph/builder.d.ts +24 -0
  46. package/dist/compiler/graph/builder.d.ts.map +1 -0
  47. package/dist/compiler/graph/index.d.ts +7 -0
  48. package/dist/compiler/graph/index.d.ts.map +1 -0
  49. package/dist/compiler/graph/schemaGraph.d.ts +67 -0
  50. package/dist/compiler/graph/schemaGraph.d.ts.map +1 -0
  51. package/dist/compiler/graph/types.d.ts +203 -0
  52. package/dist/compiler/graph/types.d.ts.map +1 -0
  53. package/dist/compiler/index.d.ts +12 -0
  54. package/dist/compiler/index.d.ts.map +1 -0
  55. package/dist/compiler/ir/index.d.ts +7 -0
  56. package/dist/compiler/ir/index.d.ts.map +1 -0
  57. package/dist/compiler/ir/pipeline.d.ts +82 -0
  58. package/dist/compiler/ir/pipeline.d.ts.map +1 -0
  59. package/dist/compiler/ir/stages.d.ts +40 -0
  60. package/dist/compiler/ir/stages.d.ts.map +1 -0
  61. package/dist/compiler/ir/visitor.d.ts +98 -0
  62. package/dist/compiler/ir/visitor.d.ts.map +1 -0
  63. package/dist/compiler/manifest/emit.d.ts +14 -0
  64. package/dist/compiler/manifest/emit.d.ts.map +1 -1
  65. package/dist/compiler/manifest/format.d.ts +42 -0
  66. package/dist/compiler/manifest/format.d.ts.map +1 -1
  67. package/dist/compiler/manifest/index.d.ts +6 -0
  68. package/dist/compiler/manifest/index.d.ts.map +1 -0
  69. package/dist/compiler/runner/createProgram.d.ts +16 -0
  70. package/dist/compiler/runner/createProgram.d.ts.map +1 -1
  71. package/dist/compiler/runner/index.d.ts +5 -0
  72. package/dist/compiler/runner/index.d.ts.map +1 -0
  73. package/dist/compiler/schema/extractAnnotations.d.ts +47 -0
  74. package/dist/compiler/schema/extractAnnotations.d.ts.map +1 -1
  75. package/dist/compiler/schema/index.d.ts +6 -0
  76. package/dist/compiler/schema/index.d.ts.map +1 -0
  77. package/dist/compiler/schema/intersectionHandler.d.ts +37 -0
  78. package/dist/compiler/schema/intersectionHandler.d.ts.map +1 -1
  79. package/dist/compiler/schema/objectHandler.d.ts +86 -0
  80. package/dist/compiler/schema/objectHandler.d.ts.map +1 -1
  81. package/dist/compiler/schema/openapi.d.ts +15 -0
  82. package/dist/compiler/schema/openapi.d.ts.map +1 -1
  83. package/dist/compiler/schema/parameters.d.ts +72 -0
  84. package/dist/compiler/schema/parameters.d.ts.map +1 -1
  85. package/dist/compiler/schema/primitives.d.ts +58 -0
  86. package/dist/compiler/schema/primitives.d.ts.map +1 -1
  87. package/dist/compiler/schema/typeToJsonSchema.d.ts +20 -0
  88. package/dist/compiler/schema/typeToJsonSchema.d.ts.map +1 -1
  89. package/dist/compiler/schema/types.d.ts +15 -0
  90. package/dist/compiler/schema/types.d.ts.map +1 -1
  91. package/dist/compiler/schema/unionHandler.d.ts +60 -0
  92. package/dist/compiler/schema/unionHandler.d.ts.map +1 -1
  93. package/dist/compiler/transform/dedup.d.ts +35 -0
  94. package/dist/compiler/transform/dedup.d.ts.map +1 -0
  95. package/dist/compiler/transform/flatten.d.ts +50 -0
  96. package/dist/compiler/transform/flatten.d.ts.map +1 -0
  97. package/dist/compiler/transform/index.d.ts +7 -0
  98. package/dist/compiler/transform/index.d.ts.map +1 -0
  99. package/dist/compiler/transform/inline.d.ts +46 -0
  100. package/dist/compiler/transform/inline.d.ts.map +1 -0
  101. package/dist/compiler/validation/emitPrecompiledValidators.d.ts +16 -0
  102. package/dist/compiler/validation/emitPrecompiledValidators.d.ts.map +1 -1
  103. package/dist/compiler/validation/index.d.ts +5 -0
  104. package/dist/compiler/validation/index.d.ts.map +1 -0
  105. package/dist/decorators/Auth.d.ts +17 -0
  106. package/dist/decorators/Auth.d.ts.map +1 -1
  107. package/dist/decorators/Controller.d.ts +15 -0
  108. package/dist/decorators/Controller.d.ts.map +1 -1
  109. package/dist/decorators/Public.d.ts +13 -0
  110. package/dist/decorators/Public.d.ts.map +1 -1
  111. package/dist/decorators/Use.d.ts +18 -0
  112. package/dist/decorators/Use.d.ts.map +1 -1
  113. package/dist/decorators/methods.d.ts +20 -0
  114. package/dist/decorators/methods.d.ts.map +1 -1
  115. package/dist/express.cjs +32 -10
  116. package/dist/express.cjs.map +1 -1
  117. package/dist/express.js +32 -10
  118. package/dist/express.js.map +1 -1
  119. package/dist/index.cjs +160 -3
  120. package/dist/index.cjs.map +1 -1
  121. package/dist/index.d.ts +2 -0
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/index.js +155 -2
  124. package/dist/index.js.map +1 -1
  125. package/dist/metal/applyListQuery.d.ts +73 -0
  126. package/dist/metal/applyListQuery.d.ts.map +1 -1
  127. package/dist/metal/index.cjs.map +1 -1
  128. package/dist/metal/index.d.ts +4 -0
  129. package/dist/metal/index.d.ts.map +1 -1
  130. package/dist/metal/index.js.map +1 -1
  131. package/dist/metal/listQuery.d.ts +19 -0
  132. package/dist/metal/listQuery.d.ts.map +1 -1
  133. package/dist/metal/queryOptions.d.ts +8 -0
  134. package/dist/metal/queryOptions.d.ts.map +1 -1
  135. package/dist/metal/readMetalBag.d.ts +36 -0
  136. package/dist/metal/readMetalBag.d.ts.map +1 -1
  137. package/dist/metal/registerMetalEntities.d.ts +20 -0
  138. package/dist/metal/registerMetalEntities.d.ts.map +1 -1
  139. package/dist/metal/schemaFromEntity.d.ts +30 -0
  140. package/dist/metal/schemaFromEntity.d.ts.map +1 -1
  141. package/dist/metal/searchWhere.d.ts +39 -0
  142. package/dist/metal/searchWhere.d.ts.map +1 -1
  143. package/dist/metal/symbolMetadata.d.ts +6 -0
  144. package/dist/metal/symbolMetadata.d.ts.map +1 -1
  145. package/dist/runtime/auth/runtime.d.ts +155 -6
  146. package/dist/runtime/auth/runtime.d.ts.map +1 -1
  147. package/dist/runtime/metadata/bucket.d.ts +1 -2
  148. package/dist/runtime/metadata/bucket.d.ts.map +1 -1
  149. package/dist/runtime/metadata/key.d.ts +1 -1
  150. package/dist/runtime/metadata/key.d.ts.map +1 -1
  151. package/dist/runtime/metadata/read.d.ts +1 -2
  152. package/dist/runtime/metadata/read.d.ts.map +1 -1
  153. package/dist/runtime/metadata/types.d.ts +74 -0
  154. package/dist/runtime/metadata/types.d.ts.map +1 -1
  155. package/dist/runtime/polyfill.d.ts +1 -1
  156. package/dist/runtime/polyfill.d.ts.map +1 -1
  157. package/dist/runtime/upload.d.ts +37 -0
  158. package/dist/runtime/upload.d.ts.map +1 -1
  159. package/dist/runtime/validation/ajv.d.ts +100 -0
  160. package/dist/runtime/validation/ajv.d.ts.map +1 -1
  161. package/dist/runtime/validation/index.d.ts +9 -0
  162. package/dist/runtime/validation/index.d.ts.map +1 -1
  163. package/dist/scripts/adorn-example.cjs +238 -6
  164. package/dist/scripts/adorn-example.cjs.map +1 -1
  165. package/dist/utils/port.d.ts +9 -0
  166. package/dist/utils/port.d.ts.map +1 -0
  167. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/runtime/polyfill.ts","../src/adapter/express/router.ts","../src/runtime/metadata/key.ts","../src/runtime/metadata/read.ts","../src/utils/operationId.ts","../src/utils/path.ts","../src/adapter/express/merge.ts","../src/runtime/validation/ajv.ts","../src/compiler/cache/loadArtifacts.ts","../src/adapter/express/openapi.ts","../src/adapter/express/coercion.ts","../src/adapter/express/auth.ts","../src/adapter/express/validation.ts","../src/adapter/express/swagger.ts","../src/adapter/express/bootstrap.ts"],"sourcesContent":["// Polyfill Symbol.metadata for environments that don't support it\n// Must run before any decorated classes are imported\n(Symbol as any).metadata ??= Symbol(\"Symbol.metadata\");\n\n// Export a symbol to prevent tree-shaking\nexport const ADORN_POLYFILL = Symbol(\"adorn-polyfill\");\n","import { Router } from \"express\";\nimport type { Request, Response, NextFunction } from \"express\";\nimport { join } from \"node:path\";\nimport { bindRoutes } from \"./merge.js\";\nimport { createValidator, formatValidationErrors } from \"../../runtime/validation/ajv.js\";\nimport { loadArtifacts } from \"../../compiler/cache/loadArtifacts.js\";\nimport type { ManifestV1 } from \"../../compiler/manifest/format.js\";\nimport type { OpenAPI31, CreateRouterOptions } from \"./types.js\";\nimport {\n getOpenApiOperation,\n getParamSchemaIndex,\n getRequestBodySchema,\n getSchemaByRef,\n getParamSchemaFromIndex,\n schemaFromType\n} from \"./openapi.js\";\nimport {\n normalizeCoerceOptions,\n getDateCoercionOptions,\n coerceDatesWithSchema,\n coerceParamValue,\n parseQueryValue,\n parseCookies,\n normalizeSort\n} from \"./coercion.js\";\nimport { createAuthMiddleware } from \"./auth.js\";\nimport { validateRequest, validateRequestWithPrecompiled } from \"./validation.js\";\n\nexport async function createExpressRouter(options: CreateRouterOptions): Promise<Router> {\n const { controllers, artifactsDir = \".adorn\", middleware = {}, defaultPageSize = 10 } = options;\n\n let manifest: ManifestV1;\n let openapi: OpenAPI31;\n let precompiledValidators: Record<string, { body?: (data: unknown) => boolean; response: Record<string, (data: unknown) => boolean> }> | null = null;\n\n if (options.manifest && options.openapi) {\n manifest = options.manifest;\n openapi = options.openapi;\n if (manifest.validation.mode === \"precompiled\" && manifest.validation.precompiledModule) {\n try {\n const validatorPath = join(artifactsDir, manifest.validation.precompiledModule);\n precompiledValidators = require(validatorPath).validators;\n } catch (err) {\n console.warn(`Failed to load precompiled validators: ${err}`);\n }\n }\n } else {\n const artifacts = await loadArtifacts({ outDir: artifactsDir });\n manifest = artifacts.manifest as unknown as ManifestV1;\n openapi = artifacts.openapi as unknown as OpenAPI31;\n precompiledValidators = artifacts.validators?.validators as Record<string, { body?: (data: unknown) => boolean; response: Record<string, (data: unknown) => boolean> }> ?? null;\n }\n\n const routes = bindRoutes({ controllers, manifest });\n const validator = precompiledValidators ? null : createValidator();\n const router = Router();\n const instanceCache = new Map<Function, any>();\n const coerce = normalizeCoerceOptions(options.coerce);\n\n function getInstance(Ctor: new (...args: any[]) => any): any {\n if (!instanceCache.has(Ctor)) {\n instanceCache.set(Ctor, new Ctor());\n }\n return instanceCache.get(Ctor);\n }\n\n function resolveMiddleware(\n items: Array<string | ((req: any, res: any, next: (err?: any) => void) => any)>,\n named: Record<string, (req: any, res: any, next: (err?: any) => void) => any> = {}\n ): Array<(req: any, res: any, next: (err?: any) => void) => any> {\n return items.map(item => {\n if (typeof item === \"string\") {\n const fn = named[item];\n if (!fn) {\n throw new Error(`Named middleware \"${item}\" not found in middleware registry`);\n }\n return fn;\n }\n return item;\n });\n }\n\n for (const route of routes) {\n const method = route.httpMethod.toLowerCase() as \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\";\n const openapiOperation = getOpenApiOperation(openapi, route);\n const paramSchemaIndex = getParamSchemaIndex(openapiOperation);\n const bodySchema = getRequestBodySchema(openapiOperation, route.args.body?.contentType)\n ?? (route.args.body ? getSchemaByRef(openapi, route.args.body.schemaRef) : null);\n const coerceBodyDates = getDateCoercionOptions(coerce, \"body\");\n const coerceQueryDates = getDateCoercionOptions(coerce, \"query\");\n const coercePathDates = getDateCoercionOptions(coerce, \"path\");\n const coerceHeaderDates = getDateCoercionOptions(coerce, \"header\");\n const coerceCookieDates = getDateCoercionOptions(coerce, \"cookie\");\n\n const middlewareChain: Array<(req: any, res: any, next: (err?: any) => void) => any> = [];\n\n if (middleware.global) {\n middlewareChain.push(...resolveMiddleware(middleware.global, middleware.named || {}));\n }\n\n if (route.controllerUse) {\n middlewareChain.push(...resolveMiddleware(route.controllerUse, middleware.named || {}));\n }\n\n if (route.use) {\n middlewareChain.push(...resolveMiddleware(route.use, middleware.named || {}));\n }\n\n if (options.auth) {\n const authMw = createAuthMiddleware(options.auth, route.auth, openapi.security || []);\n middlewareChain.push(authMw);\n }\n\n (router as any)[method](route.fullPath, ...middlewareChain, async (req: Request, res: Response, next: NextFunction) => {\n try {\n const validationErrors = precompiledValidators\n ? validateRequestWithPrecompiled(route, req, precompiledValidators)\n : validateRequest(route, req, openapi, validator!);\n\n if (validationErrors) {\n return res.status(400).json(formatValidationErrors(validationErrors));\n }\n\n const instance = getInstance(route.controllerCtor);\n const handler = instance[route.methodName];\n\n if (typeof handler !== \"function\") {\n throw new Error(`Method ${route.methodName} not found on controller`);\n }\n\n const args: any[] = [];\n\n if (route.args.body) {\n const coercedBody = (coerceBodyDates.date || coerceBodyDates.dateTime) && bodySchema\n ? coerceDatesWithSchema(req.body, bodySchema, coerceBodyDates, openapi.components.schemas)\n : req.body;\n args[route.args.body.index] = coercedBody;\n }\n\n for (const pathArg of route.args.path) {\n const rawValue = req.params[pathArg.name];\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"path\", pathArg.name)\n ?? (pathArg.schemaRef ? getSchemaByRef(openapi, pathArg.schemaRef) : null)\n ?? schemaFromType(pathArg.schemaType);\n const coerced = coerceParamValue(rawValue, paramSchema, coercePathDates, openapi.components.schemas);\n args[pathArg.index] = coerced;\n }\n\n if (route.args.query.length > 0) {\n const jsonArgs = route.args.query.filter(q => q.content === \"application/json\");\n const standardArgs = route.args.query.filter(q => q.content !== \"application/json\");\n\n const queryArgIndex = standardArgs[0]?.index;\n if (queryArgIndex !== undefined) {\n args[queryArgIndex] = {};\n }\n\n if (jsonArgs.length > 0) {\n for (const q of jsonArgs) {\n const rawValue = req.query[q.name];\n if (rawValue === undefined || rawValue === null) continue;\n\n let parsed: any = rawValue;\n if (typeof rawValue === \"string\" && rawValue.length > 0) {\n try {\n parsed = JSON.parse(rawValue);\n } catch {\n parsed = rawValue;\n }\n }\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"query\", q.name)\n ?? (q.schemaRef ? getSchemaByRef(openapi, q.schemaRef) : null)\n ?? schemaFromType(q.schemaType);\n const coerced = coerceParamValue(parsed, paramSchema, coerceQueryDates, openapi.components.schemas);\n\n // Merge into existing query object instead of overwriting\n if (!args[q.index] || typeof args[q.index] !== \"object\") {\n args[q.index] = {};\n }\n Object.assign(args[q.index], coerced);\n }\n }\n\n if (standardArgs.length > 0) {\n for (const q of standardArgs) {\n const rawValue = req.query[q.name];\n if (rawValue === undefined) continue;\n\n const parsed = parseQueryValue(rawValue, q);\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"query\", q.name)\n ?? (q.schemaRef ? getSchemaByRef(openapi, q.schemaRef) : null)\n ?? schemaFromType(q.schemaType);\n const coerced = coerceParamValue(parsed, paramSchema, coerceQueryDates, openapi.components.schemas);\n\n if (!args[q.index] || typeof args[q.index] !== \"object\") {\n args[q.index] = {};\n }\n (args[q.index] as Record<string, unknown>)[q.name] = coerced;\n }\n }\n\n if (queryArgIndex !== undefined && args[queryArgIndex]) {\n const queryObj = args[queryArgIndex] as Record<string, unknown>;\n \n if (queryObj.page === undefined) {\n queryObj.page = 1;\n }\n if (queryObj.pageSize === undefined) {\n queryObj.pageSize = defaultPageSize;\n }\n\n if (queryObj.sort) {\n queryObj.sort = normalizeSort(queryObj.sort);\n }\n }\n }\n \n if (route.args.headers.length > 0) {\n const firstHeaderIndex = route.args.headers[0].index;\n const allSameIndex = route.args.headers.every(h => h.index === firstHeaderIndex);\n\n if (allSameIndex) {\n args[firstHeaderIndex] = {};\n for (const h of route.args.headers) {\n const headerValue = req.headers[h.name.toLowerCase()];\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"header\", h.name)\n ?? (h.schemaRef ? getSchemaByRef(openapi, h.schemaRef) : null)\n ?? schemaFromType(h.schemaType);\n const coerced = coerceParamValue(headerValue, paramSchema, coerceHeaderDates, openapi.components.schemas);\n args[firstHeaderIndex][h.name] = coerced ?? undefined;\n }\n } else {\n for (const h of route.args.headers) {\n const headerValue = req.headers[h.name.toLowerCase()];\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"header\", h.name)\n ?? (h.schemaRef ? getSchemaByRef(openapi, h.schemaRef) : null)\n ?? schemaFromType(h.schemaType);\n const coerced = coerceParamValue(headerValue, paramSchema, coerceHeaderDates, openapi.components.schemas);\n args[h.index] = coerced ?? undefined;\n }\n }\n }\n\n if (route.args.cookies.length > 0) {\n const firstCookieIndex = route.args.cookies[0].index;\n const allSameIndex = route.args.cookies.every(c => c.index === firstCookieIndex);\n const cookies = parseCookies(req.headers.cookie as string | undefined);\n\n if (allSameIndex) {\n args[firstCookieIndex] = {};\n for (const c of route.args.cookies) {\n const cookieValue = cookies[c.name];\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"cookie\", c.name)\n ?? (c.schemaRef ? getSchemaByRef(openapi, c.name) : null)\n ?? schemaFromType(c.schemaType);\n const coerced = coerceParamValue(cookieValue, paramSchema, coerceCookieDates, openapi.components.schemas);\n args[firstCookieIndex][c.name] = coerced;\n }\n } else {\n for (const c of route.args.cookies) {\n const cookieValue = cookies[c.name];\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"cookie\", c.name)\n ?? (c.schemaRef ? getSchemaByRef(openapi, c.name) : null)\n ?? schemaFromType(c.schemaType);\n const coerced = coerceParamValue(cookieValue, paramSchema, coerceCookieDates, openapi.components.schemas);\n args[c.index] = coerced;\n }\n }\n }\n\n if (args.length === 0) {\n args.push(req);\n }\n\n const result = await handler.apply(instance, args);\n\n const primaryResponse = route.responses[0];\n const status = primaryResponse?.status ?? 200;\n\n res.status(status).json(result);\n } catch (error) {\n next(error);\n }\n });\n }\n\n return router;\n}\n","export const ADORN_META = Symbol.for(\"adorn-api/meta\");\n","import { ADORN_META } from \"./key.js\";\nimport type { AdornBucket } from \"./types.js\";\n\nexport function readAdornBucket(ctor: Function): AdornBucket | null {\n const metaSym = (Symbol as any).metadata as symbol | undefined;\n if (!metaSym) {\n return null;\n }\n\n const classMetadata = (ctor as any)[metaSym] as DecoratorMetadata | undefined;\n if (!classMetadata) {\n return null;\n }\n\n const bucket = classMetadata[ADORN_META] as AdornBucket | undefined;\n return bucket ?? null;\n}\n","export function defaultOperationId(controllerName: string, methodName: string): string {\n return `${controllerName}_${methodName}`;\n}\n","export function joinPaths(base: string, sub: string): string {\n const b = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n const s = sub.startsWith(\"/\") ? sub : `/${sub}`;\n return (b + s) || \"/\";\n}\n","import type { ManifestV1, OperationEntry } from \"../../compiler/manifest/format.js\";\nimport { readAdornBucket } from \"../../runtime/metadata/read.js\";\nimport { defaultOperationId } from \"../../utils/operationId.js\";\nimport { joinPaths } from \"../../utils/path.js\";\nimport crypto from \"node:crypto\";\n\nexport interface BoundRoute {\n operationId: string;\n fullPath: string;\n httpMethod: OperationEntry[\"http\"][\"method\"];\n controllerCtor: new (...args: any[]) => any;\n methodName: string;\n args: OperationEntry[\"args\"];\n responses: OperationEntry[\"responses\"];\n use?: Array<string | ((req: any, res: any, next: (err?: any) => void) => any)>;\n auth?: { scheme: string; scopes?: string[]; optional?: boolean } | \"public\";\n controllerUse?: Array<string | ((req: any, res: any, next: (err?: any) => void) => any)>;\n}\n\ninterface RouteCacheEntry {\n boundRoutes: BoundRoute[];\n manifestHash: string;\n controllerIds: string[];\n}\n\nconst routeCache = new Map<string, RouteCacheEntry>();\n\nfunction convertToExpressPath(path: string): string {\n return path.replace(/:([^/]+)/g, \":$1\");\n}\n\nfunction computeManifestHash(manifest: ManifestV1): string {\n const ops = manifest.controllers.flatMap(c => c.operations.map(o => o.operationId)).sort();\n const data = JSON.stringify({\n ops,\n validation: manifest.validation,\n });\n return crypto.createHash(\"sha256\").update(data).digest(\"hex\").slice(0, 16);\n}\n\nfunction getControllerUniqueIds(controllers: Array<new (...args: any[]) => any>): string[] {\n return controllers.map(c => `${c.name}:${c.toString()}`);\n}\n\nexport function bindRoutes(params: {\n controllers: Array<new (...args: any[]) => any>;\n manifest: ManifestV1;\n useCache?: boolean;\n}): BoundRoute[] {\n const { controllers, manifest, useCache = true } = params;\n\n if (useCache) {\n const manifestHash = computeManifestHash(manifest);\n const controllerIds = getControllerUniqueIds(controllers);\n const cacheKey = `${manifestHash}:${controllerIds.join(\",\")}`;\n\n const cached = routeCache.get(cacheKey);\n if (cached) {\n return cached.boundRoutes;\n }\n\n const bound = computeBoundRoutes(controllers, manifest);\n\n routeCache.set(cacheKey, {\n boundRoutes: bound,\n manifestHash,\n controllerIds,\n });\n\n return bound;\n }\n\n return computeBoundRoutes(controllers, manifest);\n}\n\nfunction computeBoundRoutes(\n controllers: Array<new (...args: any[]) => any>,\n manifest: ManifestV1\n): BoundRoute[] {\n const manifestByOpId = new Map<string, OperationEntry>();\n for (const ctrl of manifest.controllers) {\n for (const op of ctrl.operations) {\n if (manifestByOpId.has(op.operationId)) {\n throw new Error(`Duplicate operationId in manifest: ${op.operationId}`);\n }\n manifestByOpId.set(op.operationId, op);\n }\n }\n\n const bound: BoundRoute[] = [];\n\n for (const ctor of controllers) {\n const bucket = readAdornBucket(ctor);\n if (!bucket) {\n console.warn(`No decorator metadata found for ${ctor.name}, skipping`);\n continue;\n }\n\n const basePath = bucket.basePath ?? \"/\";\n\n for (const routeOp of bucket.ops) {\n const opId = routeOp.operationId ?? defaultOperationId(ctor.name, routeOp.methodName);\n\n const manifestOp = manifestByOpId.get(opId);\n if (!manifestOp) {\n throw new Error(\n `No manifest entry for operationId=\"${opId}. ` +\n \"Did you run \\\"adorn-api build\\\"? Are your operationId rules aligned?\"\n );\n }\n\n if (manifestOp.http.method !== routeOp.httpMethod || manifestOp.http.path !== routeOp.path) {\n throw new Error(\n `Route mismatch for ${opId}. ` +\n `Runtime: ${routeOp.httpMethod} ${routeOp.path}, ` +\n `Manifest: ${manifestOp.http.method} ${manifestOp.http.path}. ` +\n \"Rebuild with \\\"adorn-api build\\\".\"\n );\n }\n\n const expressPath = convertToExpressPath(routeOp.path);\n const fullPath = joinPaths(basePath, expressPath);\n\n bound.push({\n operationId: opId,\n fullPath,\n httpMethod: manifestOp.http.method,\n controllerCtor: ctor,\n methodName: routeOp.methodName,\n args: manifestOp.args,\n responses: manifestOp.responses,\n use: routeOp.use,\n auth: routeOp.auth,\n controllerUse: bucket.controllerUse,\n });\n }\n }\n\n return bound;\n}\n\nexport function clearRouteCache(): void {\n routeCache.clear();\n}\n\nexport function getRouteCacheStats(): { size: number; keys: string[] } {\n return {\n size: routeCache.size,\n keys: Array.from(routeCache.keys()),\n };\n}\n\n","import Ajv from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport type { ErrorObject } from \"ajv\";\n\nexport interface ValidationError {\n path: string;\n message: string;\n keyword: string;\n params: Record<string, unknown>;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[] | null;\n}\n\nexport class ValidationErrorResponse extends Error {\n constructor(\n public statusCode: number,\n public errors: ValidationError[]\n ) {\n super(\"Validation failed\");\n this.name = \"ValidationErrorResponse\";\n }\n}\n\nexport function createValidator() {\n const ajv = new Ajv.default({\n allErrors: true,\n coerceTypes: false,\n strict: false,\n validateFormats: true,\n });\n\n addFormats.default(ajv);\n\n ajv.addFormat(\"br-phone\", /^\\(\\d{2}\\)\\s\\d{5}-\\d{4}$/);\n\n return ajv;\n}\n\nexport function validateData(\n ajv: ReturnType<typeof createValidator>,\n data: unknown,\n schema: Record<string, unknown>,\n dataPath: string = \"#\"\n): ValidationResult {\n const validate = ajv.compile(schema);\n const valid = validate(data);\n\n if (valid) {\n return { valid: true, errors: null };\n }\n\n const errors: ValidationError[] = (validate.errors || []).map((err: ErrorObject) => ({\n path: formatErrorPath(dataPath, err),\n message: err.message || \"Invalid value\",\n keyword: err.keyword,\n params: err.params as Record<string, unknown>,\n }));\n\n return { valid: false, errors };\n}\n\nfunction formatErrorPath(basePath: string, err: ErrorObject): string {\n const instancePath = err.instancePath;\n\n if (!instancePath || instancePath === \"\") {\n return basePath;\n }\n\n if (basePath === \"#\" || basePath.endsWith(\"/\")) {\n return `${basePath}${instancePath.slice(1)}`;\n }\n\n return `${basePath}${instancePath}`;\n}\n\nexport function formatValidationErrors(errors: ValidationError[]): Record<string, unknown> {\n const formatted: Record<string, string[]> = {};\n\n for (const error of errors) {\n const path = error.path || \"body\";\n if (!formatted[path]) {\n formatted[path] = [];\n }\n formatted[path].push(error.message);\n }\n\n return {\n error: \"Validation failed\",\n details: formatted,\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { stat } from \"node:fs/promises\";\n\ninterface OpenApi {\n openapi: string;\n components?: {\n schemas?: Record<string, unknown>;\n };\n paths?: Record<string, unknown>;\n info?: Record<string, unknown>;\n security?: Array<Record<string, string[]>>;\n}\n\ninterface Manifest {\n manifestVersion: number;\n generatedAt: string;\n generator: {\n name: string;\n version: string;\n typescript: string;\n };\n schemas: {\n kind: string;\n file: string;\n componentsSchemasPointer: string;\n };\n validation: {\n mode: \"none\" | \"ajv-runtime\" | \"precompiled\";\n precompiledModule: string | null;\n };\n controllers: Array<{\n controllerId: string;\n basePath: string;\n operations: Array<{\n operationId: string;\n http: {\n method: string;\n path: string;\n };\n handler: {\n methodName: string;\n };\n args: {\n body: {\n index: number;\n required: boolean;\n contentType: string;\n schemaRef: string;\n } | null;\n path: Array<{\n name: string;\n index: number;\n required: boolean;\n schemaRef: string;\n schemaType?: string | string[];\n }>;\n query: Array<{\n name: string;\n index: number;\n required: boolean;\n schemaRef: string;\n schemaType?: string | string[];\n }>;\n headers: Array<{\n name: string;\n index: number;\n required: boolean;\n schemaRef: string;\n schemaType?: string | string[];\n }>;\n cookies: Array<{\n name: string;\n index: number;\n required: boolean;\n schemaRef: string;\n schemaType?: string | string[];\n }>;\n };\n responses: Array<{\n status: number;\n contentType: string;\n schemaRef: string;\n isArray?: boolean;\n }>;\n }>;\n }>;\n}\n\ninterface ValidatorModule {\n validators: Record<string, {\n body?: (data: unknown) => boolean;\n response: Record<string, (data: unknown) => boolean>;\n }>;\n validateBody: (operationId: string, data: unknown) => { ok: boolean; errors: unknown[] | null };\n validateResponse: (operationId: string, status: number, contentType: string, data: unknown) => { ok: boolean; errors: unknown[] | null };\n}\n\ninterface ArtifactCacheEntry {\n openapi: OpenApi | null;\n manifest: Manifest | null;\n validators: ValidatorModule | null;\n mtimes: {\n openapi: number | null;\n manifest: number | null;\n validators: number | null;\n };\n}\n\nconst artifactCache = new Map<string, ArtifactCacheEntry>();\n\nasync function getMtime(filePath: string): Promise<number | null> {\n try {\n const stats = await stat(filePath);\n return stats.mtimeMs;\n } catch {\n return null;\n }\n}\n\nexport interface LoadArtifactsOptions {\n outDir: string;\n}\n\nexport interface LoadedArtifacts {\n openapi: OpenApi;\n manifest: Manifest;\n validators: ValidatorModule | null;\n}\n\nexport async function loadArtifacts(options: LoadArtifactsOptions): Promise<LoadedArtifacts> {\n const { outDir } = options;\n const cacheKey = path.resolve(outDir);\n\n const entry = artifactCache.get(cacheKey);\n\n const openapiPath = path.join(outDir, \"openapi.json\");\n const manifestPath = path.join(outDir, \"manifest.json\");\n const validatorsPath = path.join(outDir, \"validators.mjs\");\n\n const openapiMtime = await getMtime(openapiPath);\n const manifestMtime = await getMtime(manifestPath);\n const validatorsMtime = await getMtime(validatorsPath);\n\n if (entry) {\n const mtimesMatch = \n entry.mtimes.openapi === openapiMtime &&\n entry.mtimes.manifest === manifestMtime &&\n entry.mtimes.validators === validatorsMtime;\n\n if (mtimesMatch) {\n if (entry.openapi && entry.manifest) {\n return {\n openapi: entry.openapi,\n manifest: entry.manifest,\n validators: entry.validators,\n };\n }\n }\n }\n\n const openapiContent = fs.readFileSync(openapiPath, \"utf-8\");\n const manifestContent = fs.readFileSync(manifestPath, \"utf-8\");\n\n const openapi = JSON.parse(openapiContent) as OpenApi;\n const manifest = JSON.parse(manifestContent) as Manifest;\n\n let validators: ValidatorModule | null = null;\n\n if (manifest.validation.mode === \"precompiled\" && manifest.validation.precompiledModule) {\n try {\n const validatorsModule = await import(path.join(outDir, manifest.validation.precompiledModule));\n validators = validatorsModule as ValidatorModule;\n } catch (err) {\n console.warn(`Failed to load precompiled validators: ${err}`);\n }\n }\n\n artifactCache.set(cacheKey, {\n openapi,\n manifest,\n validators,\n mtimes: {\n openapi: openapiMtime,\n manifest: manifestMtime,\n validators: validatorsMtime,\n },\n });\n\n return {\n openapi,\n manifest,\n validators,\n };\n}\n\nexport function clearArtifactCache(outDir?: string): void {\n if (outDir) {\n const cacheKey = path.resolve(outDir);\n artifactCache.delete(cacheKey);\n } else {\n artifactCache.clear();\n }\n}\n\nexport function getArtifactCacheStats(): { size: number; keys: string[] } {\n return {\n size: artifactCache.size,\n keys: Array.from(artifactCache.keys()),\n };\n}\n","import type { BoundRoute } from \"./merge.js\";\r\nimport type { OpenAPI31 } from \"./types.js\";\r\n\r\nexport function toOpenApiPath(path: string): string {\r\n return path.replace(/:([^/]+)/g, \"{$1}\");\r\n}\r\n\r\nexport function getOpenApiOperation(openapi: OpenAPI31, route: BoundRoute): any | null {\r\n const pathKey = toOpenApiPath(route.fullPath);\r\n const pathItem = openapi.paths?.[pathKey];\r\n if (!pathItem) return null;\r\n return pathItem[route.httpMethod.toLowerCase()] ?? null;\r\n}\r\n\r\nexport function getParamSchemaIndex(operation: any | null): Map<string, Record<string, unknown>> {\r\n const index = new Map<string, Record<string, unknown>>();\r\n const params = operation?.parameters ?? [];\r\n for (const param of params) {\r\n if (!param?.name || !param?.in) continue;\r\n if (param.schema) {\r\n index.set(`${param.in}:${param.name}`, param.schema);\r\n }\r\n }\r\n return index;\r\n}\r\n\r\nexport function getParamSchemaFromIndex(\r\n index: Map<string, Record<string, unknown>>,\r\n location: \"path\" | \"query\" | \"header\" | \"cookie\",\r\n name: string\r\n): Record<string, unknown> | null {\r\n return index.get(`${location}:${name}`) ?? null;\r\n}\r\n\r\nexport function getRequestBodySchema(operation: any | null, contentType?: string): Record<string, unknown> | null {\r\n const content = operation?.requestBody?.content;\r\n if (!content) return null;\r\n\r\n if (contentType && content[contentType]?.schema) {\r\n return content[contentType].schema;\r\n }\r\n\r\n const first = Object.values(content)[0] as Record<string, unknown> | undefined;\r\n return (first as any)?.schema ?? null;\r\n}\r\n\r\nexport function schemaFromType(schemaType?: string | string[]): Record<string, unknown> | null {\r\n if (!schemaType) return null;\r\n return { type: schemaType };\r\n}\r\n\r\nexport function resolveSchema(\r\n schema: Record<string, unknown>,\r\n components: Record<string, Record<string, unknown>>,\r\n seen: Set<string> = new Set()\r\n): Record<string, unknown> {\r\n const ref = schema.$ref;\r\n if (typeof ref !== \"string\" || !ref.startsWith(\"#/components/schemas/\")) {\r\n return schema;\r\n }\r\n\r\n const name = ref.replace(\"#/components/schemas/\", \"\");\r\n if (seen.has(name)) return schema;\r\n\r\n const next = components[name];\r\n if (!next) return schema;\r\n\r\n seen.add(name);\r\n return resolveSchema(next, components, seen);\r\n}\r\n\r\nexport function getSchemaByRef(openapi: OpenAPI31, ref: string): Record<string, unknown> | null {\r\n if (!ref.startsWith(\"#/components/schemas/\")) return null;\r\n const schemaName = ref.replace(\"#/components/schemas/\", \"\");\r\n return openapi.components.schemas[schemaName] || null;\r\n}\r\n","import type { Request } from \"express\";\r\nimport type { CoerceLocation, DateCoercionOptions, CoerceOptions } from \"./types.js\";\r\nimport { resolveSchema } from \"./openapi.js\";\r\n\r\nexport function normalizeCoerceOptions(coerce?: CoerceOptions): Required<CoerceOptions> {\r\n return {\r\n body: coerce?.body ?? false,\r\n query: coerce?.query ?? false,\r\n path: coerce?.path ?? false,\r\n header: coerce?.header ?? false,\r\n cookie: coerce?.cookie ?? false,\r\n dateTime: coerce?.dateTime ?? false,\r\n date: coerce?.date ?? false,\r\n };\r\n}\r\n\r\nexport function getDateCoercionOptions(\r\n coerce: Required<CoerceOptions>,\r\n location: CoerceLocation\r\n): DateCoercionOptions {\r\n const enabled = coerce[location];\r\n return {\r\n dateTime: enabled && coerce.dateTime,\r\n date: enabled && coerce.date,\r\n };\r\n}\r\n\r\nexport function coerceDatesWithSchema(\r\n value: any,\r\n schema: Record<string, unknown> | null,\r\n dateCoercion: DateCoercionOptions,\r\n components: Record<string, Record<string, unknown>>\r\n): any {\r\n if (!schema || (!dateCoercion.date && !dateCoercion.dateTime)) return value;\r\n return coerceWithSchema(value, schema, dateCoercion, components, { coercePrimitives: false });\r\n}\r\n\r\nexport function coerceParamValue(\r\n value: any,\r\n schema: Record<string, unknown> | null,\r\n dateCoercion: DateCoercionOptions,\r\n components: Record<string, Record<string, unknown>>\r\n): any {\r\n if (!schema) return value;\r\n return coerceWithSchema(value, schema, dateCoercion, components, { coercePrimitives: true });\r\n}\r\n\r\nexport function coerceWithSchema(\r\n value: any,\r\n schema: Record<string, unknown>,\r\n dateCoercion: DateCoercionOptions,\r\n components: Record<string, Record<string, unknown>>,\r\n options: { coercePrimitives: boolean }\r\n): any {\r\n if (value === undefined || value === null) return value;\r\n if (value instanceof Date) return value;\r\n\r\n const resolved = resolveSchema(schema, components);\r\n const override = resolved[\"x-adorn-coerce\"];\r\n const allowDateTime = override === true ? true : override === false ? false : dateCoercion.dateTime;\r\n const allowDate = override === true ? true : override === false ? false : dateCoercion.date;\r\n\r\n const byFormat = coerceDateString(value, resolved, allowDateTime, allowDate);\r\n if (byFormat !== value) return byFormat;\r\n\r\n const allOf = resolved.allOf;\r\n if (Array.isArray(allOf)) {\r\n let out = value;\r\n for (const entry of allOf) {\r\n out = coerceWithSchema(out, entry as Record<string, unknown>, { dateTime: allowDateTime, date: allowDate }, components, options);\r\n }\r\n return out;\r\n }\r\n\r\n const variants = (resolved.oneOf ?? resolved.anyOf) as Array<Record<string, unknown>> | undefined;\r\n if (Array.isArray(variants)) {\r\n for (const entry of variants) {\r\n const out = coerceWithSchema(value, entry, { dateTime: allowDateTime, date: allowDate }, components, options);\r\n if (out !== value) return out;\r\n }\r\n }\r\n\r\n const schemaType = resolved.type;\r\n const types = Array.isArray(schemaType) ? schemaType : schemaType ? [schemaType] : [];\r\n\r\n if ((types.includes(\"array\") || resolved.items) && Array.isArray(value)) {\r\n const itemSchema = (resolved.items as Record<string, unknown> | undefined) ?? {};\r\n return value.map(item => coerceWithSchema(item, itemSchema, { dateTime: allowDateTime, date: allowDate }, components, options));\r\n }\r\n\r\n if ((types.includes(\"object\") || resolved.properties || resolved.additionalProperties) && isPlainObject(value)) {\r\n const props = resolved.properties as Record<string, Record<string, unknown>> | undefined;\r\n const out: Record<string, unknown> = { ...value };\r\n\r\n if (props) {\r\n for (const [key, propSchema] of Object.entries(props)) {\r\n if (Object.prototype.hasOwnProperty.call(value, key)) {\r\n out[key] = coerceWithSchema((value as any)[key], propSchema, { dateTime: allowDateTime, date: allowDate }, components, options);\r\n }\r\n }\r\n }\r\n\r\n const additional = resolved.additionalProperties;\r\n if (additional && typeof additional === \"object\") {\r\n for (const [key, entry] of Object.entries(value)) {\r\n if (props && Object.prototype.hasOwnProperty.call(props, key)) continue;\r\n out[key] = coerceWithSchema(entry, additional as Record<string, unknown>, { dateTime: allowDateTime, date: allowDate }, components, options);\r\n }\r\n }\r\n\r\n return out;\r\n }\r\n\r\n if (options.coercePrimitives) {\r\n return coercePrimitiveValue(value, types);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction coerceDateString(\r\n value: any,\r\n schema: Record<string, unknown>,\r\n allowDateTime: boolean,\r\n allowDate: boolean\r\n): any {\r\n if (typeof value !== \"string\") return value;\r\n\r\n const format = schema.format;\r\n const schemaType = schema.type;\r\n const types = Array.isArray(schemaType) ? schemaType : schemaType ? [schemaType] : [];\r\n const allowsString = types.length === 0 || types.includes(\"string\");\r\n\r\n if (format === \"date-time\" && allowDateTime && allowsString) {\r\n const parsed = new Date(value);\r\n if (Number.isNaN(parsed.getTime())) {\r\n throw new Error(`Invalid date-time: ${value}`);\r\n }\r\n return parsed;\r\n }\r\n\r\n if (format === \"date\" && allowDate && allowsString) {\r\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\r\n throw new Error(`Invalid date: ${value}`);\r\n }\r\n const parsed = new Date(`${value}T00:00:00.000Z`);\r\n if (Number.isNaN(parsed.getTime())) {\r\n throw new Error(`Invalid date: ${value}`);\r\n }\r\n return parsed;\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction coercePrimitiveValue(value: any, types: string[]): any {\r\n if (value === undefined || value === null) return value;\r\n\r\n if (types.includes(\"number\") || types.includes(\"integer\")) {\r\n const num = Number(value);\r\n if (Number.isNaN(num)) {\r\n throw new Error(`Invalid number: ${value}`);\r\n }\r\n return num;\r\n }\r\n\r\n if (types.includes(\"boolean\")) {\r\n if (value === \"true\") return true;\r\n if (value === \"false\") return false;\r\n if (typeof value === \"boolean\") return value;\r\n throw new Error(`Invalid boolean: ${value}`);\r\n }\r\n\r\n return value;\r\n}\r\n\r\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\r\n const proto = Object.getPrototypeOf(value);\r\n return proto === Object.prototype || proto === null;\r\n}\r\n\r\nexport function parseQueryValue(value: any, param: { schemaType?: string | string[]; serialization?: { style?: string; explode?: boolean } }): any {\r\n if (value === undefined || value === null) return value;\r\n\r\n const isArray = Array.isArray(param.schemaType)\r\n ? param.schemaType.includes(\"array\")\r\n : param.schemaType === \"array\";\r\n\r\n if (!isArray) return value;\r\n\r\n const style = param.serialization?.style ?? \"form\";\r\n const explode = param.serialization?.explode ?? true;\r\n\r\n if (Array.isArray(value)) {\r\n return value;\r\n }\r\n\r\n if (style === \"form\") {\r\n if (explode) {\r\n return value;\r\n }\r\n return value.split(\",\");\r\n }\r\n\r\n if (style === \"spaceDelimited\") {\r\n return value.split(\" \");\r\n }\r\n\r\n if (style === \"pipeDelimited\") {\r\n return value.split(\"|\");\r\n }\r\n\r\n return value;\r\n}\r\n\r\nexport function getRawQueryString(req: Request): string {\r\n const url = req.originalUrl ?? req.url ?? \"\";\r\n const index = url.indexOf(\"?\");\r\n if (index === -1) return \"\";\r\n return url.slice(index + 1);\r\n}\r\n\r\nexport function parseDeepObjectParams(\r\n rawQuery: string,\r\n names: Set<string>\r\n): Record<string, unknown> {\r\n const out: Record<string, unknown> = {};\r\n if (!rawQuery || names.size === 0) return out;\r\n\r\n const params = new URLSearchParams(rawQuery);\r\n for (const [key, value] of params.entries()) {\r\n const path = parseBracketPath(key);\r\n if (path.length === 0) continue;\r\n const root = path[0];\r\n if (!names.has(root)) continue;\r\n assignDeepValue(out, path, value);\r\n }\r\n\r\n return out;\r\n}\r\n\r\nfunction parseBracketPath(key: string): string[] {\r\n const parts: string[] = [];\r\n let current = \"\";\r\n\r\n for (let i = 0; i < key.length; i++) {\r\n const ch = key[i];\r\n if (ch === \"[\") {\r\n if (current) parts.push(current);\r\n current = \"\";\r\n continue;\r\n }\r\n if (ch === \"]\") {\r\n if (current) parts.push(current);\r\n current = \"\";\r\n continue;\r\n }\r\n current += ch;\r\n }\r\n\r\n if (current) parts.push(current);\r\n return parts;\r\n}\r\n\r\nfunction assignDeepValue(\r\n target: Record<string, unknown>,\r\n path: string[],\r\n value: string\r\n): void {\r\n let cursor: Record<string, unknown> = target;\r\n\r\n for (let i = 0; i < path.length; i++) {\r\n const key = path[i];\r\n if (!key) continue;\r\n const isLast = i === path.length - 1;\r\n\r\n if (isLast) {\r\n const existing = cursor[key];\r\n if (existing === undefined) {\r\n cursor[key] = value;\r\n } else if (Array.isArray(existing)) {\r\n existing.push(value);\r\n } else {\r\n cursor[key] = [existing as unknown, value];\r\n }\r\n return;\r\n }\r\n\r\n const next = cursor[key];\r\n if (!isPlainObject(next)) {\r\n cursor[key] = {};\r\n }\r\n cursor = cursor[key] as Record<string, unknown>;\r\n }\r\n}\r\n\r\nexport function parseCookies(cookieHeader: string | undefined): Record<string, string> {\n if (!cookieHeader) return {};\n\n const cookies: Record<string, string> = {};\n const pairs = cookieHeader.split(\";\");\n\n for (const pair of pairs) {\n const [name, ...valueParts] = pair.trim().split(\"=\");\n if (name) {\n cookies[name] = valueParts.join(\"=\");\n }\n }\n\n return cookies;\n}\n\nexport function normalizeSort(sort: unknown): string[] {\n if (Array.isArray(sort)) {\n return sort.map(s => String(s));\n }\n if (typeof sort === \"string\") {\n return sort.split(\",\").map(s => s.trim()).filter(Boolean);\n }\n return [];\n}\n\n","import type { Response, NextFunction } from \"express\";\r\nimport type { AuthenticatedRequest, CreateRouterOptions, OpenAPI31 } from \"./types.js\";\r\nimport type { BoundRoute } from \"./merge.js\";\r\n\r\nexport function createAuthMiddleware(\r\n authConfig: NonNullable<CreateRouterOptions[\"auth\"]>,\r\n routeAuth: BoundRoute[\"auth\"],\r\n globalSecurity: NonNullable<OpenAPI31[\"security\"]>\r\n) {\r\n return async (req: AuthenticatedRequest, res: Response, next: NextFunction) => {\r\n const isPublic = routeAuth === \"public\";\r\n const hasAuthDecorator = routeAuth && routeAuth !== \"public\";\r\n const hasGlobalSecurity = globalSecurity && globalSecurity.length > 0;\r\n\r\n if (!hasAuthDecorator && !hasGlobalSecurity) {\r\n return next();\r\n }\r\n\r\n if (isPublic) {\r\n return next();\r\n }\r\n\r\n const authMeta = routeAuth as { scheme: string; scopes?: string[]; optional?: boolean };\r\n const scheme = authMeta.scheme;\r\n const requiredScopes = authMeta.scopes || [];\r\n const isOptional = authMeta.optional ?? false;\r\n\r\n const authRuntime = authConfig.schemes[scheme];\r\n if (!authRuntime) {\r\n throw new Error(`Auth scheme \"${scheme}\" not found in auth configuration`);\r\n }\r\n\r\n const result = await authRuntime.authenticate(req);\r\n\r\n if (!result) {\r\n if (isOptional) {\r\n req.auth = null;\r\n return next();\r\n }\r\n return authRuntime.challenge(res);\r\n }\r\n\r\n req.auth = result.principal;\r\n\r\n if (authRuntime.authorize && requiredScopes.length > 0) {\r\n if (!authRuntime.authorize(result, requiredScopes)) {\r\n res.status(403).json({ error: \"Forbidden\", message: \"Insufficient scopes\" });\r\n return;\r\n }\r\n }\r\n\r\n next();\r\n };\r\n}\r\n","import type { Request } from \"express\";\r\nimport type { BoundRoute } from \"./merge.js\";\r\nimport type { OpenAPI31, ValidationError } from \"./types.js\";\r\nimport { createValidator } from \"../../runtime/validation/ajv.js\";\r\nimport {\r\n getOpenApiOperation,\r\n getParamSchemaIndex,\r\n getParamSchemaFromIndex,\r\n resolveSchema,\r\n getSchemaByRef\r\n} from \"./openapi.js\";\r\nimport {\r\n getRawQueryString,\r\n parseDeepObjectParams,\r\n coerceParamValue\r\n} from \"./coercion.js\";\r\n\r\nexport function validateRequestWithPrecompiled(\r\n route: BoundRoute,\r\n req: Request,\r\n validators: Record<string, { body?: (data: unknown) => boolean; response: Record<string, (data: unknown) => boolean> }>\r\n): ValidationError[] | null {\r\n const errors: ValidationError[] = [];\r\n const deepNames = new Set(route.args.query.filter(q => q.serialization?.style === \"deepObject\").map(q => q.name));\r\n const deepValues = deepNames.size > 0\r\n ? parseDeepObjectParams(getRawQueryString(req), deepNames)\r\n : {};\r\n\r\n if (route.args.body) {\r\n const validator = validators[route.operationId]?.body;\r\n if (validator) {\r\n const valid = validator(req.body);\r\n if (!valid) {\r\n const v = validators[route.operationId].body as any;\r\n for (const err of v.errors || []) {\r\n errors.push({\r\n path: `#/body${err.instancePath}`,\r\n message: err.message || \"Invalid value\",\r\n keyword: err.keyword,\r\n params: err.params as Record<string, unknown>,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n // Note: Precompiled validation for query/path params is limited in currently implementation\n // This logic is preserved from index.ts\n for (const q of route.args.query) {\n let value = q.serialization?.style === \"deepObject\" ? deepValues[q.name] : req.query[q.name];\n if (q.content === \"application/json\" && typeof value === \"string\") {\n try {\n value = JSON.parse(value);\n } catch {\n errors.push({\n path: `#/query/${q.name}`,\n message: \"Invalid JSON string\",\n keyword: \"json\",\n params: {},\n });\n continue;\n }\n }\n }\r\n\r\n return errors.length > 0 ? errors : null;\r\n}\r\n\r\nexport function validateRequest(\r\n route: BoundRoute,\r\n req: Request,\r\n openapi: OpenAPI31,\r\n validator: ReturnType<typeof createValidator>\r\n): ValidationError[] | null {\r\n const openapiOperation = getOpenApiOperation(openapi, route);\r\n const paramSchemaIndex = getParamSchemaIndex(openapiOperation);\r\n const deepNames = new Set(route.args.query.filter(q => q.serialization?.style === \"deepObject\").map(q => q.name));\r\n const deepValues = deepNames.size > 0\r\n ? parseDeepObjectParams(getRawQueryString(req), deepNames)\r\n : {};\r\n\r\n const errors: ValidationError[] = [];\r\n\r\n if (route.args.body) {\r\n const bodySchema = getSchemaByRef(openapi, route.args.body.schemaRef);\r\n if (bodySchema) {\r\n const validate = validator.compile(bodySchema);\r\n const valid = validate(req.body);\r\n if (!valid) {\r\n for (const err of validate.errors || []) {\r\n errors.push({\r\n path: `#/body${err.instancePath}`,\r\n message: err.message || \"Invalid value\",\r\n keyword: err.keyword,\r\n params: err.params as Record<string, unknown>,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n for (const q of route.args.query) {\n let value = q.serialization?.style === \"deepObject\" ? deepValues[q.name] : req.query[q.name];\n if (q.content === \"application/json\" && typeof value === \"string\") {\n try {\n value = JSON.parse(value);\n } catch {\n errors.push({\n path: `#/query/${q.name}`,\n message: \"Invalid JSON string\",\n keyword: \"json\",\n params: {},\n });\n continue;\n }\n }\n const openapiSchema = getParamSchemaFromIndex(paramSchemaIndex, \"query\", q.name);\n let schema: Record<string, unknown> = {};\r\n\r\n if (openapiSchema) {\r\n schema = resolveSchema(openapiSchema, openapi.components.schemas);\r\n } else {\r\n if (q.schemaType) {\r\n const type = Array.isArray(q.schemaType) ? q.schemaType[0] : q.schemaType;\r\n schema.type = type;\r\n }\r\n\r\n if (q.schemaRef && q.schemaRef.includes(\"Inline\")) {\r\n const inlineSchema = getSchemaByRef(openapi, q.schemaRef);\r\n if (inlineSchema) {\r\n Object.assign(schema, inlineSchema);\r\n }\r\n }\r\n }\r\n\r\n const coerced = coerceParamValue(value, schema, { dateTime: false, date: false }, openapi.components.schemas);\r\n\r\n if (Object.keys(schema).length > 0 && coerced !== undefined) {\r\n const validate = validator.compile(schema);\r\n const valid = validate(coerced);\r\n if (!valid) {\r\n for (const err of validate.errors || []) {\r\n errors.push({\r\n path: `#/query/${q.name}`,\r\n message: err.message || \"Invalid value\",\r\n keyword: err.keyword,\r\n params: err.params as Record<string, unknown>,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n for (const p of route.args.path) {\r\n const value = req.params[p.name];\r\n const openapiSchema = getParamSchemaFromIndex(paramSchemaIndex, \"path\", p.name);\r\n let schema: Record<string, unknown> = {};\r\n\r\n if (openapiSchema) {\r\n schema = resolveSchema(openapiSchema, openapi.components.schemas);\r\n } else {\r\n if (p.schemaType) {\r\n const type = Array.isArray(p.schemaType) ? p.schemaType[0] : p.schemaType;\r\n schema.type = type;\r\n }\r\n\r\n if (p.schemaRef && p.schemaRef.includes(\"Inline\")) {\r\n const inlineSchema = getSchemaByRef(openapi, p.schemaRef);\r\n if (inlineSchema) {\r\n Object.assign(schema, inlineSchema);\r\n }\r\n }\r\n }\r\n\r\n const coerced = coerceParamValue(value, schema, { dateTime: false, date: false }, openapi.components.schemas);\r\n\r\n if (Object.keys(schema).length > 0 && coerced !== undefined) {\r\n const validate = validator.compile(schema);\r\n const valid = validate(coerced);\r\n if (!valid) {\r\n for (const err of validate.errors || []) {\r\n errors.push({\r\n path: `#/path/${p.name}`,\r\n message: err.message || \"Invalid value\",\r\n keyword: err.keyword,\r\n params: err.params as Record<string, unknown>,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return errors.length > 0 ? errors : null;\r\n}\r\n","import { Router } from \"express\";\r\nimport { readFileSync } from \"node:fs\";\r\nimport { resolve, isAbsolute } from \"node:path\";\r\nimport swaggerUi from \"swagger-ui-express\";\r\nimport type { SetupSwaggerOptions } from \"./types.js\";\r\n\r\nexport function setupSwagger(options: SetupSwaggerOptions = {}): Router {\r\n const {\r\n artifactsDir = \".adorn\",\r\n jsonPath = \"/docs/openapi.json\",\r\n uiPath = \"/docs\",\r\n swaggerOptions = {},\r\n } = options;\r\n\r\n const router = Router();\r\n\r\n router.get(jsonPath, (req, res) => {\r\n const openApiPath = isAbsolute(artifactsDir)\r\n ? resolve(artifactsDir, \"openapi.json\")\r\n : resolve(process.cwd(), artifactsDir, \"openapi.json\");\r\n\r\n const content = readFileSync(openApiPath, \"utf-8\");\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.send(content);\r\n });\r\n\r\n router.use(uiPath, swaggerUi.serve, swaggerUi.setup(null, {\r\n swaggerOptions: {\r\n url: jsonPath,\r\n ...swaggerOptions,\r\n },\r\n }));\r\n\r\n return router;\r\n}\r\n","import express from \"express\";\nimport { type Server } from \"http\";\nimport { createExpressRouter, type CreateRouterOptions, setupSwagger } from \"./index.js\";\nimport path from \"node:path\";\n\nexport interface BootstrapOptions {\n controllers: Array<new (...args: any[]) => any>;\n port?: number;\n host?: string;\n artifactsDir?: string;\n enableSwagger?: boolean;\n swaggerPath?: string;\n swaggerJsonPath?: string;\n middleware?: CreateRouterOptions[\"middleware\"];\n auth?: CreateRouterOptions[\"auth\"];\n coerce?: CreateRouterOptions[\"coerce\"];\n}\n\nexport interface BootstrapResult {\n server: Server;\n app: express.Express;\n url: string;\n port: number;\n host: string;\n close: () => Promise<void>;\n}\n\nexport function bootstrap(options: BootstrapOptions): Promise<BootstrapResult> {\n return new Promise((resolve, reject) => {\n const {\n controllers,\n port: userPort,\n host: userHost,\n artifactsDir: userArtifactsDir = \".adorn\",\n enableSwagger = true,\n swaggerPath = \"/docs\",\n swaggerJsonPath = \"/docs/openapi.json\",\n middleware,\n auth,\n coerce,\n } = options;\n\n if (controllers.length === 0) {\n reject(new Error(\"At least one controller must be provided to bootstrap().\"));\n return;\n }\n\n const envPort = process.env.PORT;\n const port = userPort ?? (envPort !== undefined ? Number(envPort) : 3000);\n const host = userHost ?? process.env.HOST ?? \"0.0.0.0\";\n\n if (isNaN(port) || port < 0 || port > 65535) {\n reject(new Error(`Invalid port: ${port}. Port must be between 0 and 65535.`));\n return;\n }\n\n const absoluteArtifactsDir = path.isAbsolute(userArtifactsDir)\n ? userArtifactsDir\n : path.resolve(process.cwd(), userArtifactsDir);\n\n const app = express();\n app.use(express.json());\n\n createExpressRouter({\n controllers,\n artifactsDir: absoluteArtifactsDir,\n middleware,\n auth,\n coerce,\n }).then((router) => {\n app.use(router);\n\n if (enableSwagger) {\n const displayHost = host === \"0.0.0.0\" ? \"localhost\" : host;\n const serverUrl = `http://${displayHost}:${port}`;\n\n app.use(\n setupSwagger({\n artifactsDir: absoluteArtifactsDir,\n jsonPath: swaggerJsonPath,\n uiPath: swaggerPath,\n swaggerOptions: {\n servers: [{ url: serverUrl }],\n },\n })\n );\n }\n\n const server = app.listen(port, host, () => {\n const displayHost = host === \"0.0.0.0\" ? \"localhost\" : host;\n const serverUrl = `http://${displayHost}:${port}`;\n\n console.log(`🚀 Server running on ${serverUrl}`);\n if (enableSwagger) {\n console.log(`📚 Swagger UI: ${serverUrl}${swaggerPath}`);\n }\n\n const result: BootstrapResult = {\n server,\n app,\n url: serverUrl,\n port,\n host,\n close: () => new Promise<void>((closeResolve) => {\n server.close(() => {\n console.log(\"Server closed gracefully\");\n closeResolve();\n });\n })\n };\n\n resolve(result);\n });\n\n server.on(\"error\", (error: any) => {\n if (error.code === \"EADDRINUSE\") {\n reject(new Error(`Port ${port} already in use. Please choose a different port.`));\n } else if (error.code === \"EACCES\") {\n reject(new Error(`Permission denied for port ${port}. Ports below 1024 require root privileges.`));\n } else {\n reject(new Error(`Failed to start server: ${error.message}`));\n }\n });\n }).catch(reject);\n });\n}\n"],"mappings":"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","names":["path","path","path","path","Router","path","resolve"]}
1
+ {"version":3,"sources":["../src/runtime/polyfill.ts","../src/adapter/express/router.ts","../src/runtime/metadata/key.ts","../src/runtime/metadata/read.ts","../src/utils/operationId.ts","../src/utils/path.ts","../src/adapter/express/merge.ts","../src/runtime/validation/ajv.ts","../src/compiler/cache/loadArtifacts.ts","../src/adapter/express/openapi.ts","../src/adapter/express/coercion.ts","../src/adapter/express/auth.ts","../src/adapter/express/validation.ts","../src/adapter/express/swagger.ts","../src/adapter/express/bootstrap.ts"],"sourcesContent":["/**\n * Polyfill for Symbol.metadata in environments that don't natively support it.\n * This polyfill must run before any decorated classes are imported to ensure\n * the metadata API is available for decorator metadata storage.\n * \n * @remarks\n * This module provides a global polyfill for the `Symbol.metadata` well-known symbol.\n * Some JavaScript environments (like older browsers or non-standard runtimes) may not\n * natively support this symbol, which is required by the adorn-api decorator system.\n * \n * @example\n * ```typescript\n * // Import this first before any decorated classes\n * import \"adorn-api/runtime/polyfill\";\n * \n * // Now decorators can safely use Symbol.metadata\n * @Controller()\n * class MyController { }\n * ```\n * \n * @package\n */\n(Symbol as any).metadata ??= Symbol(\"Symbol.metadata\");\n\n/**\n * Export symbol to prevent tree-shaking of the polyfill module.\n * This ensures the polyfill code is retained in production builds.\n * \n * @internal\n */\nexport const ADORN_POLYFILL = Symbol(\"adorn-polyfill\");\n","import { Router } from \"express\";\nimport type { Request, Response, NextFunction } from \"express\";\nimport { join } from \"node:path\";\nimport { bindRoutes } from \"./merge.js\";\nimport { createValidator, formatValidationErrors } from \"../../runtime/validation/ajv.js\";\nimport { loadArtifacts } from \"../../compiler/cache/loadArtifacts.js\";\nimport type { ManifestV1 } from \"../../compiler/manifest/format.js\";\nimport type { OpenAPI31, CreateRouterOptions } from \"./types.js\";\nimport {\n getOpenApiOperation,\n getParamSchemaIndex,\n getRequestBodySchema,\n getSchemaByRef,\n getParamSchemaFromIndex,\n schemaFromType\n} from \"./openapi.js\";\nimport {\n normalizeCoerceOptions,\n getDateCoercionOptions,\n coerceDatesWithSchema,\n coerceParamValue,\n parseQueryValue,\n parseCookies,\n normalizeSort,\n getRawQueryString,\n parseDeepObjectParams\n} from \"./coercion.js\";\nimport { createAuthMiddleware } from \"./auth.js\";\nimport { validateRequest, validateRequestWithPrecompiled } from \"./validation.js\";\n\n/**\n * Creates an Express router with Adorn API controllers\n * \n * @param options - Router configuration options\n * @returns Promise that resolves with the configured Express router\n */\nexport async function createExpressRouter(options: CreateRouterOptions): Promise<Router> {\n const { controllers, artifactsDir = \".adorn\", middleware = {}, defaultPageSize = 10, queryOptions } = options;\n\n let manifest: ManifestV1;\n let openapi: OpenAPI31;\n let precompiledValidators: Record<string, { body?: (data: unknown) => boolean; response: Record<string, (data: unknown) => boolean> }> | null = null;\n\n if (options.manifest && options.openapi) {\n manifest = options.manifest;\n openapi = options.openapi;\n if (manifest.validation.mode === \"precompiled\" && manifest.validation.precompiledModule) {\n try {\n const validatorPath = join(artifactsDir, manifest.validation.precompiledModule);\n precompiledValidators = require(validatorPath).validators;\n } catch (err) {\n console.warn(`Failed to load precompiled validators: ${err}`);\n }\n }\n } else {\n const artifacts = await loadArtifacts({ outDir: artifactsDir });\n manifest = artifacts.manifest as unknown as ManifestV1;\n openapi = artifacts.openapi as unknown as OpenAPI31;\n precompiledValidators = artifacts.validators?.validators as Record<string, { body?: (data: unknown) => boolean; response: Record<string, (data: unknown) => boolean> }> ?? null;\n }\n\n const routes = bindRoutes({ controllers, manifest });\n const validator = precompiledValidators ? null : createValidator();\n const router = Router();\n const instanceCache = new Map<Function, any>();\n const coerce = normalizeCoerceOptions(options.coerce);\n\n function getInstance(Ctor: new (...args: any[]) => any): any {\n if (!instanceCache.has(Ctor)) {\n instanceCache.set(Ctor, new Ctor());\n }\n return instanceCache.get(Ctor);\n }\n\n function resolveMiddleware(\n items: Array<string | ((req: any, res: any, next: (err?: any) => void) => any)>,\n named: Record<string, (req: any, res: any, next: (err?: any) => void) => any> = {}\n ): Array<(req: any, res: any, next: (err?: any) => void) => any> {\n return items.map(item => {\n if (typeof item === \"string\") {\n const fn = named[item];\n if (!fn) {\n throw new Error(`Named middleware \"${item}\" not found in middleware registry`);\n }\n return fn;\n }\n return item;\n });\n }\n\n for (const route of routes) {\n const method = route.httpMethod.toLowerCase() as \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\";\n const openapiOperation = getOpenApiOperation(openapi, route);\n const paramSchemaIndex = getParamSchemaIndex(openapiOperation);\n const bodySchema = getRequestBodySchema(openapiOperation, route.args.body?.contentType)\n ?? (route.args.body ? getSchemaByRef(openapi, route.args.body.schemaRef) : null);\n const coerceBodyDates = getDateCoercionOptions(coerce, \"body\");\n const coerceQueryDates = getDateCoercionOptions(coerce, \"query\");\n const coercePathDates = getDateCoercionOptions(coerce, \"path\");\n const coerceHeaderDates = getDateCoercionOptions(coerce, \"header\");\n const coerceCookieDates = getDateCoercionOptions(coerce, \"cookie\");\n\n const middlewareChain: Array<(req: any, res: any, next: (err?: any) => void) => any> = [];\n\n if (middleware.global) {\n middlewareChain.push(...resolveMiddleware(middleware.global, middleware.named || {}));\n }\n\n if (route.controllerUse) {\n middlewareChain.push(...resolveMiddleware(route.controllerUse, middleware.named || {}));\n }\n\n if (route.use) {\n middlewareChain.push(...resolveMiddleware(route.use, middleware.named || {}));\n }\n\n if (options.auth) {\n const authMw = createAuthMiddleware(options.auth, route.auth, openapi.security || []);\n middlewareChain.push(authMw);\n }\n\n (router as any)[method](route.fullPath, ...middlewareChain, async (req: Request, res: Response, next: NextFunction) => {\n try {\n const maxDepth = queryOptions?.maxNestingDepth ?? 5;\n\n const validationErrors = precompiledValidators\n ? validateRequestWithPrecompiled(route, req, precompiledValidators, maxDepth)\n : validateRequest(route, req, openapi, validator!, maxDepth);\n\n if (validationErrors) {\n return res.status(400).json(formatValidationErrors(validationErrors));\n }\n\n const deepNames = new Set(\n route.args.query\n .filter(q => q.serialization?.style === \"deepObject\")\n .map(q => q.name)\n );\n const deepValues = deepNames.size > 0\n ? parseDeepObjectParams(getRawQueryString(req), deepNames, maxDepth)\n : {};\n\n const instance = getInstance(route.controllerCtor);\n const handler = instance[route.methodName];\n\n if (typeof handler !== \"function\") {\n throw new Error(`Method ${route.methodName} not found on controller`);\n }\n\n const args: any[] = [];\n\n if (route.args.body) {\n const coercedBody = (coerceBodyDates.date || coerceBodyDates.dateTime) && bodySchema\n ? coerceDatesWithSchema(req.body, bodySchema, coerceBodyDates, openapi.components.schemas)\n : req.body;\n args[route.args.body.index] = coercedBody;\n }\n\n for (const pathArg of route.args.path) {\n const rawValue = req.params[pathArg.name];\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"path\", pathArg.name)\n ?? (pathArg.schemaRef ? getSchemaByRef(openapi, pathArg.schemaRef) : null)\n ?? schemaFromType(pathArg.schemaType);\n const coerced = coerceParamValue(rawValue, paramSchema, coercePathDates, openapi.components.schemas);\n args[pathArg.index] = coerced;\n }\n\n if (route.args.query.length > 0) {\n const jsonArgs = route.args.query.filter(q => q.content === \"application/json\");\n const standardArgs = route.args.query.filter(q => q.content !== \"application/json\");\n\n const queryArgIndex = standardArgs[0]?.index;\n if (queryArgIndex !== undefined) {\n args[queryArgIndex] = {};\n }\n\n if (jsonArgs.length > 0) {\n for (const q of jsonArgs) {\n const rawValue = q.serialization?.style === \"deepObject\" ? deepValues[q.name] : req.query[q.name];\n if (rawValue === undefined || rawValue === null) continue;\n\n let parsed: any = rawValue;\n if (typeof rawValue === \"string\" && rawValue.length > 0) {\n try {\n parsed = JSON.parse(rawValue);\n } catch {\n parsed = rawValue;\n }\n }\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"query\", q.name)\n ?? (q.schemaRef ? getSchemaByRef(openapi, q.schemaRef) : null)\n ?? schemaFromType(q.schemaType);\n const coerced = coerceParamValue(parsed, paramSchema, coerceQueryDates, openapi.components.schemas);\n\n if (!args[q.index] || typeof args[q.index] !== \"object\") {\n args[q.index] = {};\n }\n Object.assign(args[q.index], coerced);\n }\n }\n\n if (standardArgs.length > 0) {\n for (const q of standardArgs) {\n const rawValue = q.serialization?.style === \"deepObject\" ? deepValues[q.name] : req.query[q.name];\n if (rawValue === undefined) continue;\n\n const parsed = parseQueryValue(rawValue, q);\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"query\", q.name)\n ?? (q.schemaRef ? getSchemaByRef(openapi, q.schemaRef) : null)\n ?? schemaFromType(q.schemaType);\n const coerced = coerceParamValue(parsed, paramSchema, coerceQueryDates, openapi.components.schemas);\n\n if (!args[q.index] || typeof args[q.index] !== \"object\") {\n args[q.index] = {};\n }\n (args[q.index] as Record<string, unknown>)[q.name] = coerced;\n }\n }\n\n if (queryArgIndex !== undefined && args[queryArgIndex]) {\n const queryObj = args[queryArgIndex] as Record<string, unknown>;\n \n if (queryObj.page === undefined) {\n queryObj.page = 1;\n }\n if (queryObj.pageSize === undefined) {\n queryObj.pageSize = defaultPageSize;\n }\n\n if (queryObj.sort) {\n queryObj.sort = normalizeSort(queryObj.sort);\n }\n }\n }\n \n if (route.args.headers.length > 0) {\n const firstHeaderIndex = route.args.headers[0].index;\n const allSameIndex = route.args.headers.every(h => h.index === firstHeaderIndex);\n\n if (allSameIndex) {\n args[firstHeaderIndex] = {};\n for (const h of route.args.headers) {\n const headerValue = req.headers[h.name.toLowerCase()];\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"header\", h.name)\n ?? (h.schemaRef ? getSchemaByRef(openapi, h.schemaRef) : null)\n ?? schemaFromType(h.schemaType);\n const coerced = coerceParamValue(headerValue, paramSchema, coerceHeaderDates, openapi.components.schemas);\n args[firstHeaderIndex][h.name] = coerced ?? undefined;\n }\n } else {\n for (const h of route.args.headers) {\n const headerValue = req.headers[h.name.toLowerCase()];\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"header\", h.name)\n ?? (h.schemaRef ? getSchemaByRef(openapi, h.schemaRef) : null)\n ?? schemaFromType(h.schemaType);\n const coerced = coerceParamValue(headerValue, paramSchema, coerceHeaderDates, openapi.components.schemas);\n args[h.index] = coerced ?? undefined;\n }\n }\n }\n\n if (route.args.cookies.length > 0) {\n const firstCookieIndex = route.args.cookies[0].index;\n const allSameIndex = route.args.cookies.every(c => c.index === firstCookieIndex);\n const cookies = parseCookies(req.headers.cookie as string | undefined);\n\n if (allSameIndex) {\n args[firstCookieIndex] = {};\n for (const c of route.args.cookies) {\n const cookieValue = cookies[c.name];\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"cookie\", c.name)\n ?? (c.schemaRef ? getSchemaByRef(openapi, c.name) : null)\n ?? schemaFromType(c.schemaType);\n const coerced = coerceParamValue(cookieValue, paramSchema, coerceCookieDates, openapi.components.schemas);\n args[firstCookieIndex][c.name] = coerced;\n }\n } else {\n for (const c of route.args.cookies) {\n const cookieValue = cookies[c.name];\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"cookie\", c.name)\n ?? (c.schemaRef ? getSchemaByRef(openapi, c.name) : null)\n ?? schemaFromType(c.schemaType);\n const coerced = coerceParamValue(cookieValue, paramSchema, coerceCookieDates, openapi.components.schemas);\n args[c.index] = coerced;\n }\n }\n }\n\n if (args.length === 0) {\n args.push(req);\n }\n\n const result = await handler.apply(instance, args);\n\n const primaryResponse = route.responses[0];\n const status = primaryResponse?.status ?? 200;\n\n res.status(status).json(result);\n } catch (error) {\n next(error);\n }\n });\n }\n\n return router;\n}\n","/**\n * Symbol key used to store Adorn metadata in class decorator metadata.\n * \n * @remarks\n * This Symbol.for() call creates a global symbol that is used as the key\n * for storing Adorn-specific metadata in the decorator metadata store.\n * Using Symbol.for() ensures the same symbol is used across different\n * module loads.\n * \n * @internal\n */\nexport const ADORN_META = Symbol.for(\"adorn-api/meta\");\n","import { ADORN_META } from \"./key.js\";\nimport type { AdornBucket } from \"./types.js\";\n\n/**\n * Reads the AdornBucket metadata from a class constructor.\n * \n * @remarks\n * This function retrieves the AdornBucket stored on a class via the\n * Symbol.metadata mechanism. It safely handles cases where metadata\n * is not available (e.g., polyfill not loaded or class not decorated).\n * \n * @param ctor - The class constructor to read metadata from\n * @returns The AdornBucket if found, or null if not available\n * \n * @example\n * ```typescript\n * @Controller()\n * class MyController { }\n * \n * const bucket = readAdornBucket(MyController);\n * if (bucket) {\n * console.log(bucket.ops);\n * }\n * ```\n * \n * @internal\n */\nexport function readAdornBucket(ctor: Function): AdornBucket | null {\n const metaSym = (Symbol as any).metadata as symbol | undefined;\n if (!metaSym) {\n return null;\n }\n\n const classMetadata = (ctor as any)[metaSym] as DecoratorMetadata | undefined;\n if (!classMetadata) {\n return null;\n }\n\n const bucket = classMetadata[ADORN_META] as AdornBucket | undefined;\n return bucket ?? null;\n}\n","export function defaultOperationId(controllerName: string, methodName: string): string {\n return `${controllerName}_${methodName}`;\n}\n","export function joinPaths(base: string, sub: string): string {\n const b = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n const s = sub.startsWith(\"/\") ? sub : `/${sub}`;\n return (b + s) || \"/\";\n}\n","import type { ManifestV1, OperationEntry } from \"../../compiler/manifest/format.js\";\nimport { readAdornBucket } from \"../../runtime/metadata/read.js\";\nimport { defaultOperationId } from \"../../utils/operationId.js\";\nimport { joinPaths } from \"../../utils/path.js\";\nimport crypto from \"node:crypto\";\n\n/**\n * Represents a route bound to a controller\n */\nexport interface BoundRoute {\n operationId: string;\n fullPath: string;\n httpMethod: OperationEntry[\"http\"][\"method\"];\n controllerCtor: new (...args: any[]) => any;\n methodName: string;\n args: OperationEntry[\"args\"];\n responses: OperationEntry[\"responses\"];\n use?: Array<string | ((req: any, res: any, next: (err?: any) => void) => any)>;\n auth?: { scheme: string; scopes?: string[]; optional?: boolean } | \"public\";\n controllerUse?: Array<string | ((req: any, res: any, next: (err?: any) => void) => any)>;\n}\n\ninterface RouteCacheEntry {\n boundRoutes: BoundRoute[];\n manifestHash: string;\n controllerIds: string[];\n}\n\nconst routeCache = new Map<string, RouteCacheEntry>();\n\nfunction convertToExpressPath(path: string): string {\n return path.replace(/:([^/]+)/g, \":$1\");\n}\n\nfunction computeManifestHash(manifest: ManifestV1): string {\n const ops = manifest.controllers.flatMap(c => c.operations.map(o => o.operationId)).sort();\n const data = JSON.stringify({\n ops,\n validation: manifest.validation,\n });\n return crypto.createHash(\"sha256\").update(data).digest(\"hex\").slice(0, 16);\n}\n\nfunction getControllerUniqueIds(controllers: Array<new (...args: any[]) => any>): string[] {\n return controllers.map(c => `${c.name}:${c.toString()}`);\n}\n\n/**\n * Binds controllers to routes from the manifest\n * \n * @param params - Binding parameters including controllers and manifest\n * @returns Array of bound routes\n */\nexport function bindRoutes(params: {\n controllers: Array<new (...args: any[]) => any>;\n manifest: ManifestV1;\n useCache?: boolean;\n}): BoundRoute[] {\n const { controllers, manifest, useCache = true } = params;\n\n if (useCache) {\n const manifestHash = computeManifestHash(manifest);\n const controllerIds = getControllerUniqueIds(controllers);\n const cacheKey = `${manifestHash}:${controllerIds.join(\",\")}`;\n\n const cached = routeCache.get(cacheKey);\n if (cached) {\n return cached.boundRoutes;\n }\n\n const bound = computeBoundRoutes(controllers, manifest);\n\n routeCache.set(cacheKey, {\n boundRoutes: bound,\n manifestHash,\n controllerIds,\n });\n\n return bound;\n }\n\n return computeBoundRoutes(controllers, manifest);\n}\n\nfunction computeBoundRoutes(\n controllers: Array<new (...args: any[]) => any>,\n manifest: ManifestV1\n): BoundRoute[] {\n const manifestByOpId = new Map<string, OperationEntry>();\n for (const ctrl of manifest.controllers) {\n for (const op of ctrl.operations) {\n if (manifestByOpId.has(op.operationId)) {\n throw new Error(`Duplicate operationId in manifest: ${op.operationId}`);\n }\n manifestByOpId.set(op.operationId, op);\n }\n }\n\n const bound: BoundRoute[] = [];\n\n for (const ctor of controllers) {\n const bucket = readAdornBucket(ctor);\n if (!bucket) {\n console.warn(`No decorator metadata found for ${ctor.name}, skipping`);\n continue;\n }\n\n const basePath = bucket.basePath ?? \"/\";\n\n for (const routeOp of bucket.ops) {\n const opId = routeOp.operationId ?? defaultOperationId(ctor.name, routeOp.methodName);\n\n const manifestOp = manifestByOpId.get(opId);\n if (!manifestOp) {\n throw new Error(\n `No manifest entry for operationId=\"${opId}. ` +\n \"Did you run \\\"adorn-api build\\\"? Are your operationId rules aligned?\"\n );\n }\n\n if (manifestOp.http.method !== routeOp.httpMethod || manifestOp.http.path !== routeOp.path) {\n throw new Error(\n `Route mismatch for ${opId}. ` +\n `Runtime: ${routeOp.httpMethod} ${routeOp.path}, ` +\n `Manifest: ${manifestOp.http.method} ${manifestOp.http.path}. ` +\n \"Rebuild with \\\"adorn-api build\\\".\"\n );\n }\n\n const expressPath = convertToExpressPath(routeOp.path);\n const fullPath = joinPaths(basePath, expressPath);\n\n bound.push({\n operationId: opId,\n fullPath,\n httpMethod: manifestOp.http.method,\n controllerCtor: ctor,\n methodName: routeOp.methodName,\n args: manifestOp.args,\n responses: manifestOp.responses,\n use: routeOp.use,\n auth: routeOp.auth,\n controllerUse: bucket.controllerUse,\n });\n }\n }\n\n return bound;\n}\n\n/**\n * Clears the route cache\n */\nexport function clearRouteCache(): void {\n routeCache.clear();\n}\n\n/**\n * Gets statistics about the route cache\n * \n * @returns Object containing cache size and keys\n */\nexport function getRouteCacheStats(): { size: number; keys: string[] } {\n return {\n size: routeCache.size,\n keys: Array.from(routeCache.keys()),\n };\n}\n","import Ajv from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport type { ErrorObject } from \"ajv\";\n\n/**\n * Runtime validation module using AJV.\n * \n * @remarks\n * This module provides validation utilities using the AJV JSON schema validator.\n * It includes interfaces for validation results, errors, and helper functions\n * for creating validators and formatting error messages.\n * \n * @package\n */\n\n/**\n * Represents a single validation error with details.\n * \n * @public\n */\nexport interface ValidationError {\n /**\n * The JSON path to the invalid property.\n */\n path: string;\n \n /**\n * Human-readable error message.\n */\n message: string;\n \n /**\n * The AJV keyword that failed validation.\n */\n keyword: string;\n \n /**\n * Additional parameters from the validation error.\n */\n params: Record<string, unknown>;\n}\n\n/**\n * Result of a validation operation.\n * \n * @public\n */\nexport interface ValidationResult {\n /**\n * Whether the data passed validation.\n */\n valid: boolean;\n \n /**\n * Array of validation errors if validation failed, null otherwise.\n */\n errors: ValidationError[] | null;\n}\n\n/**\n * Error thrown when request validation fails.\n * \n * @public\n */\nexport class ValidationErrorResponse extends Error {\n /**\n * HTTP status code for validation errors.\n */\n statusCode: number;\n \n /**\n * Detailed validation errors.\n */\n errors: ValidationError[];\n\n /**\n * Creates a new ValidationErrorResponse.\n * \n * @param statusCode - HTTP status code (typically 400)\n * @param errors - Array of validation errors\n */\n constructor(statusCode: number, errors: ValidationError[]) {\n super(\"Validation failed\");\n this.name = \"ValidationErrorResponse\";\n this.statusCode = statusCode;\n this.errors = errors;\n }\n}\n\n/**\n * Creates a configured AJV validator instance.\n * \n * @remarks\n * This function creates an AJV validator with adorn-api's default configuration,\n * including support for custom formats like \"br-phone\" for Brazilian phone numbers.\n * \n * @returns A configured AJV validator instance\n * \n * @example\n * ```typescript\n * const validator = createValidator();\n * const validate = validator.compile(mySchema);\n * const result = validate(myData);\n * ```\n * \n * @public\n */\nexport function createValidator() {\n const ajv = new Ajv.default({\n allErrors: true,\n coerceTypes: false,\n strict: false,\n validateFormats: true,\n });\n\n addFormats.default(ajv);\n\n ajv.addFormat(\"br-phone\", /^\\(\\d{2}\\)\\s\\d{5}-\\d{4}$/);\n\n return ajv;\n}\n\n/**\n * Validates data against a JSON schema.\n * \n * @remarks\n * This function compiles the schema and validates the data, returning a\n * structured result with formatted error messages.\n * \n * @param ajv - The AJV validator instance\n * @param data - The data to validate\n * @param schema - The JSON schema to validate against\n * @param dataPath - Base path for error messages (default: \"#\")\n * @returns ValidationResult with validity and any errors\n * \n * @public\n */\nexport function validateData(\n ajv: ReturnType<typeof createValidator>,\n data: unknown,\n schema: Record<string, unknown>,\n dataPath: string = \"#\"\n): ValidationResult {\n const validate = ajv.compile(schema);\n const valid = validate(data);\n\n if (valid) {\n return { valid: true, errors: null };\n }\n\n const errors: ValidationError[] = (validate.errors || []).map((err: ErrorObject) => ({\n path: formatErrorPath(dataPath, err),\n message: err.message || \"Invalid value\",\n keyword: err.keyword,\n params: err.params as Record<string, unknown>,\n }));\n\n return { valid: false, errors };\n}\n\n/**\n * Formats an error path for display.\n * \n * @internal\n */\nfunction formatErrorPath(basePath: string, err: ErrorObject): string {\n const instancePath = err.instancePath;\n\n if (!instancePath || instancePath === \"\") {\n return basePath;\n }\n\n if (basePath === \"#\" || basePath.endsWith(\"/\")) {\n return `${basePath}${instancePath.slice(1)}`;\n }\n\n return `${basePath}${instancePath}`;\n}\n\n/**\n * Formats validation errors into a structured API response.\n * \n * @remarks\n * This function converts validation errors into a format suitable for API\n * responses, grouping errors by their path.\n * \n * @param errors - Array of validation errors\n * @returns Formatted error response object\n * \n * @public\n */\nexport function formatValidationErrors(errors: ValidationError[]): Record<string, unknown> {\n const formatted: Record<string, string[]> = {};\n\n for (const error of errors) {\n const path = error.path || \"body\";\n if (!formatted[path]) {\n formatted[path] = [];\n }\n formatted[path].push(error.message);\n }\n\n return {\n error: \"Validation failed\",\n details: formatted,\n };\n}\n","/**\n * Cache management module for compiled artifacts.\n * Loads OpenAPI specs, manifests, and validators from the output directory.\n */\nimport fs from \"node:fs\";\nimport path from \"node:path\";\nimport { stat } from \"node:fs/promises\";\n\n/**\n * OpenAPI specification interface as loaded from openapi.json\n */\ninterface OpenApi {\n openapi: string;\n components?: {\n schemas?: Record<string, unknown>;\n };\n paths?: Record<string, unknown>;\n info?: Record<string, unknown>;\n security?: Array<Record<string, string[]>>;\n}\n\n/**\n * Manifest interface describing the compiled API structure.\n * Contains metadata about the generation process and all controllers/operations.\n */\ninterface Manifest {\n manifestVersion: number;\n generatedAt: string;\n generator: {\n name: string;\n version: string;\n typescript: string;\n };\n schemas: {\n kind: string;\n file: string;\n componentsSchemasPointer: string;\n };\n validation: {\n mode: \"none\" | \"ajv-runtime\" | \"precompiled\";\n precompiledModule: string | null;\n };\n controllers: Array<{\n controllerId: string;\n basePath: string;\n operations: Array<{\n operationId: string;\n http: {\n method: string;\n path: string;\n };\n handler: {\n methodName: string;\n };\n args: {\n body: {\n index: number;\n required: boolean;\n contentType: string;\n schemaRef: string;\n } | null;\n path: Array<{\n name: string;\n index: number;\n required: boolean;\n schemaRef: string;\n schemaType?: string | string[];\n }>;\n query: Array<{\n name: string;\n index: number;\n required: boolean;\n schemaRef: string;\n schemaType?: string | string[];\n }>;\n headers: Array<{\n name: string;\n index: number;\n required: boolean;\n schemaRef: string;\n schemaType?: string | string[];\n }>;\n cookies: Array<{\n name: string;\n index: number;\n required: boolean;\n schemaRef: string;\n schemaType?: string | string[];\n }>;\n };\n responses: Array<{\n status: number;\n contentType: string;\n schemaRef: string;\n isArray?: boolean;\n }>;\n }>;\n }>;\n}\n\n/**\n * Validator module interface for precompiled validation logic.\n */\ninterface ValidatorModule {\n validators: Record<string, {\n body?: (data: unknown) => boolean;\n response: Record<string, (data: unknown) => boolean>;\n }>;\n validateBody: (operationId: string, data: unknown) => { ok: boolean; errors: unknown[] | null };\n validateResponse: (operationId: string, status: number, contentType: string, data: unknown) => { ok: boolean; errors: unknown[] | null };\n}\n\n/**\n * Internal cache entry for tracking loaded artifacts and their modification times.\n */\ninterface ArtifactCacheEntry {\n openapi: OpenApi | null;\n manifest: Manifest | null;\n validators: ValidatorModule | null;\n mtimes: {\n openapi: number | null;\n manifest: number | null;\n validators: number | null;\n };\n}\n\nconst artifactCache = new Map<string, ArtifactCacheEntry>();\n\nasync function getMtime(filePath: string): Promise<number | null> {\n try {\n const stats = await stat(filePath);\n return stats.mtimeMs;\n } catch {\n return null;\n }\n}\n\n/**\n * Options for loading artifacts from the output directory.\n */\nexport interface LoadArtifactsOptions {\n outDir: string;\n}\n\n/**\n * Result of loading artifacts from the output directory.\n */\nexport interface LoadedArtifacts {\n openapi: OpenApi;\n manifest: Manifest;\n validators: ValidatorModule | null;\n}\n\n/**\n * Loads OpenAPI spec, manifest, and validators from the output directory.\n * Results are cached in memory to avoid repeated file I/O.\n * \n * @param options - Object containing the output directory path\n * @returns Promise resolving to loaded artifacts including OpenAPI spec, manifest, and validators\n */\nexport async function loadArtifacts(options: LoadArtifactsOptions): Promise<LoadedArtifacts> {\n const { outDir } = options;\n const cacheKey = path.resolve(outDir);\n\n const entry = artifactCache.get(cacheKey);\n\n const openapiPath = path.join(outDir, \"openapi.json\");\n const manifestPath = path.join(outDir, \"manifest.json\");\n const validatorsPath = path.join(outDir, \"validators.mjs\");\n\n const openapiMtime = await getMtime(openapiPath);\n const manifestMtime = await getMtime(manifestPath);\n const validatorsMtime = await getMtime(validatorsPath);\n\n if (entry) {\n const mtimesMatch = \n entry.mtimes.openapi === openapiMtime &&\n entry.mtimes.manifest === manifestMtime &&\n entry.mtimes.validators === validatorsMtime;\n\n if (mtimesMatch) {\n if (entry.openapi && entry.manifest) {\n return {\n openapi: entry.openapi,\n manifest: entry.manifest,\n validators: entry.validators,\n };\n }\n }\n }\n\n const openapiContent = fs.readFileSync(openapiPath, \"utf-8\");\n const manifestContent = fs.readFileSync(manifestPath, \"utf-8\");\n\n const openapi = JSON.parse(openapiContent) as OpenApi;\n const manifest = JSON.parse(manifestContent) as Manifest;\n\n let validators: ValidatorModule | null = null;\n\n if (manifest.validation.mode === \"precompiled\" && manifest.validation.precompiledModule) {\n try {\n const validatorsModule = await import(path.join(outDir, manifest.validation.precompiledModule));\n validators = validatorsModule as ValidatorModule;\n } catch (err) {\n console.warn(`Failed to load precompiled validators: ${err}`);\n }\n }\n\n artifactCache.set(cacheKey, {\n openapi,\n manifest,\n validators,\n mtimes: {\n openapi: openapiMtime,\n manifest: manifestMtime,\n validators: validatorsMtime,\n },\n });\n\n return {\n openapi,\n manifest,\n validators,\n };\n}\n\n/**\n * Clears the in-memory artifact cache.\n * If an output directory is specified, only that entry is removed.\n * Otherwise, the entire cache is cleared.\n * \n * @param outDir - Optional specific output directory to clear from cache\n */\nexport function clearArtifactCache(outDir?: string): void {\n if (outDir) {\n const cacheKey = path.resolve(outDir);\n artifactCache.delete(cacheKey);\n } else {\n artifactCache.clear();\n }\n}\n\n/**\n * Returns statistics about the current artifact cache state.\n * Useful for debugging and monitoring cache behavior.\n * \n * @returns Object containing cache size and array of cached keys\n */\nexport function getArtifactCacheStats(): { size: number; keys: string[] } {\n return {\n size: artifactCache.size,\n keys: Array.from(artifactCache.keys()),\n };\n}\n","import type { BoundRoute } from \"./merge.js\";\nimport type { OpenAPI31 } from \"./types.js\";\n\n/**\n * Converts an Express path to OpenAPI path format\n * \n * @param path - Express path with colon parameters\n * @returns OpenAPI path with curly brace parameters\n */\nexport function toOpenApiPath(path: string): string {\n return path.replace(/:([^/]+)/g, \"{$1}\");\n}\n\n/**\n * Gets the OpenAPI operation for a given route\n * \n * @param openapi - The OpenAPI specification\n * @param route - The bound route\n * @returns OpenAPI operation object or null\n */\nexport function getOpenApiOperation(openapi: OpenAPI31, route: BoundRoute): any | null {\n const pathKey = toOpenApiPath(route.fullPath);\n const pathItem = openapi.paths?.[pathKey];\n if (!pathItem) return null;\n return pathItem[route.httpMethod.toLowerCase()] ?? null;\n}\n\n/**\n * Creates an index of parameter schemas by location and name\n * \n * @param operation - OpenAPI operation object\n * @returns Map of parameter schemas keyed by location:name\n */\nexport function getParamSchemaIndex(operation: any | null): Map<string, Record<string, unknown>> {\n const index = new Map<string, Record<string, unknown>>();\n const params = operation?.parameters ?? [];\n for (const param of params) {\n if (!param?.name || !param?.in) continue;\n if (param.schema) {\n index.set(`${param.in}:${param.name}`, param.schema);\n }\n }\n return index;\n}\n\n/**\n * Gets a parameter schema from the index\n * \n * @param index - The parameter schema index\n * @param location - The parameter location\n * @param name - The parameter name\n * @returns Parameter schema or null\n */\nexport function getParamSchemaFromIndex(\n index: Map<string, Record<string, unknown>>,\n location: \"path\" | \"query\" | \"header\" | \"cookie\",\n name: string\n): Record<string, unknown> | null {\n return index.get(`${location}:${name}`) ?? null;\n}\n\n/**\n * Gets the request body schema for an operation\n * \n * @param operation - OpenAPI operation object\n * @param contentType - Optional content type to retrieve\n * @returns Request body schema or null\n */\nexport function getRequestBodySchema(operation: any | null, contentType?: string): Record<string, unknown> | null {\n const content = operation?.requestBody?.content;\n if (!content) return null;\n\n if (contentType && content[contentType]?.schema) {\n return content[contentType].schema;\n }\n\n const first = Object.values(content)[0] as Record<string, unknown> | undefined;\n return (first as any)?.schema ?? null;\n}\n\n/**\n * Creates a schema from a type\n * \n * @param schemaType - Schema type (string or array of strings)\n * @returns Schema object or null\n */\nexport function schemaFromType(schemaType?: string | string[]): Record<string, unknown> | null {\n if (!schemaType) return null;\n return { type: schemaType };\n}\n\n/**\n * Resolves a schema, following $ref references\n * \n * @param schema - The schema to resolve\n * @param components - OpenAPI components for reference resolution\n * @param seen - Set of already seen references to prevent cycles\n * @returns Resolved schema\n */\nexport function resolveSchema(\n schema: Record<string, unknown>,\n components: Record<string, Record<string, unknown>>,\n seen: Set<string> = new Set()\n): Record<string, unknown> {\n const ref = schema.$ref;\n if (typeof ref !== \"string\" || !ref.startsWith(\"#/components/schemas/\")) {\n return schema;\n }\n\n const name = ref.replace(\"#/components/schemas/\", \"\");\n if (seen.has(name)) return schema;\n\n const next = components[name];\n if (!next) return schema;\n\n seen.add(name);\n return resolveSchema(next, components, seen);\n}\n\n/**\n * Gets a schema from OpenAPI by reference\n * \n * @param openapi - The OpenAPI specification\n * @param ref - The schema reference\n * @returns Schema object or null\n */\nexport function getSchemaByRef(openapi: OpenAPI31, ref: string): Record<string, unknown> | null {\n if (!ref.startsWith(\"#/components/schemas/\")) return null;\n const schemaName = ref.replace(\"#/components/schemas/\", \"\");\n return openapi.components.schemas[schemaName] || null;\n}\n","import type { Request } from \"express\";\nimport type { CoerceLocation, DateCoercionOptions, CoerceOptions } from \"./types.js\";\nimport { resolveSchema } from \"./openapi.js\";\n\n/**\n * Normalizes coercion options to ensure all properties are set\n * \n * @param coerce - Optional coercion options\n * @returns Required coercion options with defaults applied\n */\nexport function normalizeCoerceOptions(coerce?: CoerceOptions): Required<CoerceOptions> {\n return {\n body: coerce?.body ?? false,\n query: coerce?.query ?? false,\n path: coerce?.path ?? false,\n header: coerce?.header ?? false,\n cookie: coerce?.cookie ?? false,\n dateTime: coerce?.dateTime ?? false,\n date: coerce?.date ?? false,\n };\n}\n\n/**\n * Gets date coercion options for a specific location\n * \n * @param coerce - Required coercion options\n * @param location - The location to get options for\n * @returns Date coercion options for the specified location\n */\nexport function getDateCoercionOptions(\n coerce: Required<CoerceOptions>,\n location: CoerceLocation\n): DateCoercionOptions {\n const enabled = coerce[location];\n return {\n dateTime: enabled && coerce.dateTime,\n date: enabled && coerce.date,\n };\n}\n\n/**\n * Coerces dates in a value based on the schema\n * \n * @param value - The value to coerce\n * @param schema - The schema to use for coercion\n * @param dateCoercion - Date coercion options\n * @param components - OpenAPI components for schema resolution\n * @returns The coerced value\n */\nexport function coerceDatesWithSchema(\n value: any,\n schema: Record<string, unknown> | null,\n dateCoercion: DateCoercionOptions,\n components: Record<string, Record<string, unknown>>\n): any {\n if (!schema || (!dateCoercion.date && !dateCoercion.dateTime)) return value;\n return coerceWithSchema(value, schema, dateCoercion, components, { coercePrimitives: false });\n}\n\n/**\n * Coerces a parameter value based on the schema\n * \n * @param value - The value to coerce\n * @param schema - The schema to use for coercion\n * @param dateCoercion - Date coercion options\n * @param components - OpenAPI components for schema resolution\n * @returns The coerced value\n */\nexport function coerceParamValue(\n value: any,\n schema: Record<string, unknown> | null,\n dateCoercion: DateCoercionOptions,\n components: Record<string, Record<string, unknown>>\n): any {\n if (!schema) return value;\n return coerceWithSchema(value, schema, dateCoercion, components, { coercePrimitives: true });\n}\n\n/**\n * Coerces a value based on the schema\n * \n * @param value - The value to coerce\n * @param schema - The schema to use for coercion\n * @param dateCoercion - Date coercion options\n * @param components - OpenAPI components for schema resolution\n * @param options - Additional coercion options\n * @returns The coerced value\n */\nexport function coerceWithSchema(\n value: any,\n schema: Record<string, unknown>,\n dateCoercion: DateCoercionOptions,\n components: Record<string, Record<string, unknown>>,\n options: { coercePrimitives: boolean }\n): any {\n if (value === undefined || value === null) return value;\n if (value instanceof Date) return value;\n\n const resolved = resolveSchema(schema, components);\n const override = resolved[\"x-adorn-coerce\"];\n const allowDateTime = override === true ? true : override === false ? false : dateCoercion.dateTime;\n const allowDate = override === true ? true : override === false ? false : dateCoercion.date;\n\n const byFormat = coerceDateString(value, resolved, allowDateTime, allowDate);\n if (byFormat !== value) return byFormat;\n\n const allOf = resolved.allOf;\n if (Array.isArray(allOf)) {\n let out = value;\n for (const entry of allOf) {\n out = coerceWithSchema(out, entry as Record<string, unknown>, { dateTime: allowDateTime, date: allowDate }, components, options);\n }\n return out;\n }\n\n const variants = (resolved.oneOf ?? resolved.anyOf) as Array<Record<string, unknown>> | undefined;\n if (Array.isArray(variants)) {\n for (const entry of variants) {\n const out = coerceWithSchema(value, entry, { dateTime: allowDateTime, date: allowDate }, components, options);\n if (out !== value) return out;\n }\n }\n\n const schemaType = resolved.type;\n const types = Array.isArray(schemaType) ? schemaType : schemaType ? [schemaType] : [];\n\n if ((types.includes(\"array\") || resolved.items) && Array.isArray(value)) {\n const itemSchema = (resolved.items as Record<string, unknown> | undefined) ?? {};\n return value.map(item => coerceWithSchema(item, itemSchema, { dateTime: allowDateTime, date: allowDate }, components, options));\n }\n\n if ((types.includes(\"object\") || resolved.properties || resolved.additionalProperties) && isPlainObject(value)) {\n const props = resolved.properties as Record<string, Record<string, unknown>> | undefined;\n const out: Record<string, unknown> = { ...value };\n\n if (props) {\n for (const [key, propSchema] of Object.entries(props)) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n out[key] = coerceWithSchema((value as any)[key], propSchema, { dateTime: allowDateTime, date: allowDate }, components, options);\n }\n }\n }\n\n const additional = resolved.additionalProperties;\n if (additional && typeof additional === \"object\") {\n for (const [key, entry] of Object.entries(value)) {\n if (props && Object.prototype.hasOwnProperty.call(props, key)) continue;\n out[key] = coerceWithSchema(entry, additional as Record<string, unknown>, { dateTime: allowDateTime, date: allowDate }, components, options);\n }\n }\n\n return out;\n }\n\n if (options.coercePrimitives) {\n return coercePrimitiveValue(value, types);\n }\n\n return value;\n}\n\nfunction coerceDateString(\n value: any,\n schema: Record<string, unknown>,\n allowDateTime: boolean,\n allowDate: boolean\n): any {\n if (typeof value !== \"string\") return value;\n\n const format = schema.format;\n const schemaType = schema.type;\n const types = Array.isArray(schemaType) ? schemaType : schemaType ? [schemaType] : [];\n const allowsString = types.length === 0 || types.includes(\"string\");\n\n if (format === \"date-time\" && allowDateTime && allowsString) {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n throw new Error(`Invalid date-time: ${value}`);\n }\n return parsed;\n }\n\n if (format === \"date\" && allowDate && allowsString) {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n throw new Error(`Invalid date: ${value}`);\n }\n const parsed = new Date(`${value}T00:00:00.000Z`);\n if (Number.isNaN(parsed.getTime())) {\n throw new Error(`Invalid date: ${value}`);\n }\n return parsed;\n }\n\n return value;\n}\n\nfunction coercePrimitiveValue(value: any, types: string[]): any {\n if (value === undefined || value === null) return value;\n\n if (types.includes(\"number\") || types.includes(\"integer\")) {\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new Error(`Invalid number: ${value}`);\n }\n return num;\n }\n\n if (types.includes(\"boolean\")) {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n if (typeof value === \"boolean\") return value;\n throw new Error(`Invalid boolean: ${value}`);\n }\n\n return value;\n}\n\n/**\n * Checks if a value is a plain object\n * \n * @param value - The value to check\n * @returns True if the value is a plain object\n */\nexport function isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\n/**\n * Parses a query value based on its schema type and serialization options\n * \n * @param value - The raw query value\n * @param param - The parameter configuration\n * @returns The parsed value\n */\nexport function parseQueryValue(value: any, param: { schemaType?: string | string[]; serialization?: { style?: string; explode?: boolean } }): any {\n if (value === undefined || value === null) return value;\n\n const isArray = Array.isArray(param.schemaType)\n ? param.schemaType.includes(\"array\")\n : param.schemaType === \"array\";\n\n if (!isArray) return value;\n\n const style = param.serialization?.style ?? \"form\";\n const explode = param.serialization?.explode ?? true;\n\n if (Array.isArray(value)) {\n return value;\n }\n\n if (style === \"form\") {\n if (explode) {\n return value;\n }\n return value.split(\",\");\n }\n\n if (style === \"spaceDelimited\") {\n return value.split(\" \");\n }\n\n if (style === \"pipeDelimited\") {\n return value.split(\"|\");\n }\n\n return value;\n}\n\n/**\n * Gets the raw query string from a request\n * \n * @param req - The Express request object\n * @returns The raw query string without the leading \"?\"\n */\nexport function getRawQueryString(req: Request): string {\n const url = req.originalUrl ?? req.url ?? \"\";\n const index = url.indexOf(\"?\");\n if (index === -1) return \"\";\n return url.slice(index + 1);\n}\n\n/**\n * Parses query string parameters with deep object style\n * \n * @param rawQuery - The raw query string\n * @param names - Set of parameter names that use deepObject style\n * @param maxDepth - Maximum nesting depth (default: 5)\n * @returns Object containing the parsed deep object parameters\n */\nexport function parseDeepObjectParams(\n rawQuery: string,\n names: Set<string>,\n maxDepth: number = 5\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (!rawQuery || names.size === 0) return out;\n\n const params = new URLSearchParams(rawQuery);\n for (const [key, value] of params.entries()) {\n const path = parseBracketPath(key);\n if (path.length === 0) continue;\n if (path.length > maxDepth) {\n throw new Error(`Query parameter nesting depth (${path.length}) exceeds maximum of ${maxDepth}`);\n }\n const root = path[0];\n if (!names.has(root)) continue;\n assignDeepValue(out, path, value);\n }\n\n return out;\n}\n\nfunction parseBracketPath(key: string): string[] {\n const parts: string[] = [];\n let current = \"\";\n\n for (let i = 0; i < key.length; i++) {\n const ch = key[i];\n if (ch === \"[\") {\n if (current) parts.push(current);\n current = \"\";\n continue;\n }\n if (ch === \"]\") {\n if (current) parts.push(current);\n current = \"\";\n continue;\n }\n current += ch;\n }\n\n if (current) parts.push(current);\n return parts;\n}\n\nfunction assignDeepValue(\n target: Record<string, unknown>,\n path: string[],\n value: string\n): void {\n let cursor: Record<string, unknown> = target;\n\n for (let i = 0; i < path.length; i++) {\n const key = path[i];\n if (!key) continue;\n const isLast = i === path.length - 1;\n\n if (isLast) {\n const existing = cursor[key];\n if (existing === undefined) {\n cursor[key] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n cursor[key] = [existing as unknown, value];\n }\n return;\n }\n\n const next = cursor[key];\n if (!isPlainObject(next)) {\n cursor[key] = {};\n }\n cursor = cursor[key] as Record<string, unknown>;\n }\n}\n\n/**\n * Parses cookies from a cookie header\n * \n * @param cookieHeader - The cookie header string\n * @returns Object containing the parsed cookies\n */\nexport function parseCookies(cookieHeader: string | undefined): Record<string, string> {\n if (!cookieHeader) return {};\n\n const cookies: Record<string, string> = {};\n const pairs = cookieHeader.split(\";\");\n\n for (const pair of pairs) {\n const [name, ...valueParts] = pair.trim().split(\"=\");\n if (name) {\n cookies[name] = valueParts.join(\"=\");\n }\n }\n\n return cookies;\n}\n\n/**\n * Normalizes a sort parameter to an array of strings\n * \n * @param sort - The sort parameter (array or string)\n * @returns Array of sort field names\n */\nexport function normalizeSort(sort: unknown): string[] {\n if (Array.isArray(sort)) {\n return sort.map(s => String(s));\n }\n if (typeof sort === \"string\") {\n return sort.split(\",\").map(s => s.trim()).filter(Boolean);\n }\n return [];\n}\n\n","import type { Response, NextFunction } from \"express\";\nimport type { AuthenticatedRequest, CreateRouterOptions, OpenAPI31 } from \"./types.js\";\nimport type { BoundRoute } from \"./merge.js\";\n\n/**\n * Creates an authentication middleware for Express routes\n * \n * @param authConfig - Authentication configuration\n * @param routeAuth - Route-specific authentication settings\n * @param globalSecurity - Global security requirements from OpenAPI\n * @returns Express middleware function\n */\nexport function createAuthMiddleware(\n authConfig: NonNullable<CreateRouterOptions[\"auth\"]>,\n routeAuth: BoundRoute[\"auth\"],\n globalSecurity: NonNullable<OpenAPI31[\"security\"]>\n) {\n return async (req: AuthenticatedRequest, res: Response, next: NextFunction) => {\n const isPublic = routeAuth === \"public\";\n const hasAuthDecorator = routeAuth && routeAuth !== \"public\";\n const hasGlobalSecurity = globalSecurity && globalSecurity.length > 0;\n\n if (!hasAuthDecorator && !hasGlobalSecurity) {\n return next();\n }\n\n if (isPublic) {\n return next();\n }\n\n const authMeta = routeAuth as { scheme: string; scopes?: string[]; optional?: boolean };\n const scheme = authMeta.scheme;\n const requiredScopes = authMeta.scopes || [];\n const isOptional = authMeta.optional ?? false;\n\n const authRuntime = authConfig.schemes[scheme];\n if (!authRuntime) {\n throw new Error(`Auth scheme \"${scheme}\" not found in auth configuration`);\n }\n\n const result = await authRuntime.authenticate(req);\n\n if (!result) {\n if (isOptional) {\n req.auth = null;\n return next();\n }\n return authRuntime.challenge(res);\n }\n\n req.auth = result.principal;\n\n if (authRuntime.authorize && requiredScopes.length > 0) {\n if (!authRuntime.authorize(result, requiredScopes)) {\n res.status(403).json({ error: \"Forbidden\", message: \"Insufficient scopes\" });\n return;\n }\n }\n\n next();\n };\n}\n","import type { Request } from \"express\";\nimport type { BoundRoute } from \"./merge.js\";\nimport type { OpenAPI31, ValidationError } from \"./types.js\";\nimport { createValidator } from \"../../runtime/validation/ajv.js\";\nimport {\n getOpenApiOperation,\n getParamSchemaIndex,\n getParamSchemaFromIndex,\n resolveSchema,\n getSchemaByRef\n} from \"./openapi.js\";\nimport {\n getRawQueryString,\n parseDeepObjectParams,\n coerceParamValue\n} from \"./coercion.js\";\n\n/**\n * Validates a request using precompiled validators\n * \n * @param route - The bound route configuration\n * @param req - The Express request object\n * @param validators - Precompiled validators for the route\n * @returns Array of validation errors, or null if validation passes\n */\nexport function validateRequestWithPrecompiled(\n route: BoundRoute,\n req: Request,\n validators: Record<string, { body?: (data: unknown) => boolean; response: Record<string, (data: unknown) => boolean> }>,\n maxDepth: number = 5\n): ValidationError[] | null {\n const errors: ValidationError[] = [];\n const deepNames = new Set(route.args.query.filter(q => q.serialization?.style === \"deepObject\").map(q => q.name));\n const deepValues = deepNames.size > 0\n ? parseDeepObjectParams(getRawQueryString(req), deepNames, maxDepth)\n : {};\n\n if (route.args.body) {\n const validator = validators[route.operationId]?.body;\n if (validator) {\n const valid = validator(req.body);\n if (!valid) {\n const v = validators[route.operationId].body as any;\n for (const err of v.errors || []) {\n errors.push({\n path: `#/body${err.instancePath}`,\n message: err.message || \"Invalid value\",\n keyword: err.keyword,\n params: err.params as Record<string, unknown>,\n });\n }\n }\n }\n }\n\n for (const q of route.args.query) {\n let value = q.serialization?.style === \"deepObject\" ? deepValues[q.name] : req.query[q.name];\n if (q.content === \"application/json\" && typeof value === \"string\") {\n try {\n value = JSON.parse(value);\n } catch {\n errors.push({\n path: `#/query/${q.name}`,\n message: \"Invalid JSON string\",\n keyword: \"json\",\n params: {},\n });\n continue;\n }\n }\n }\n\n return errors.length > 0 ? errors : null;\n}\n\n/**\n * Validates a request against the OpenAPI schema\n * \n * @param route - The bound route configuration\n * @param req - The Express request object\n * @param openapi - The OpenAPI specification\n * @param validator - The AJV validator instance\n * @returns Array of validation errors, or null if validation passes\n */\nexport function validateRequest(\n route: BoundRoute,\n req: Request,\n openapi: OpenAPI31,\n validator: ReturnType<typeof createValidator>,\n maxDepth: number = 5\n): ValidationError[] | null {\n const openapiOperation = getOpenApiOperation(openapi, route);\n const paramSchemaIndex = getParamSchemaIndex(openapiOperation);\n const deepNames = new Set(route.args.query.filter(q => q.serialization?.style === \"deepObject\").map(q => q.name));\n const deepValues = deepNames.size > 0\n ? parseDeepObjectParams(getRawQueryString(req), deepNames, maxDepth)\n : {};\n\n const errors: ValidationError[] = [];\n\n if (route.args.body) {\n const bodySchema = getSchemaByRef(openapi, route.args.body.schemaRef);\n if (bodySchema) {\n const validate = validator.compile(bodySchema);\n const valid = validate(req.body);\n if (!valid) {\n for (const err of validate.errors || []) {\n errors.push({\n path: `#/body${err.instancePath}`,\n message: err.message || \"Invalid value\",\n keyword: err.keyword,\n params: err.params as Record<string, unknown>,\n });\n }\n }\n }\n }\n\n for (const q of route.args.query) {\n let value = q.serialization?.style === \"deepObject\" ? deepValues[q.name] : req.query[q.name];\n if (q.content === \"application/json\" && typeof value === \"string\") {\n try {\n value = JSON.parse(value);\n } catch {\n errors.push({\n path: `#/query/${q.name}`,\n message: \"Invalid JSON string\",\n keyword: \"json\",\n params: {},\n });\n continue;\n }\n }\n const openapiSchema = getParamSchemaFromIndex(paramSchemaIndex, \"query\", q.name);\n let schema: Record<string, unknown> = {};\n\n if (openapiSchema) {\n schema = resolveSchema(openapiSchema, openapi.components.schemas);\n } else {\n if (q.schemaType) {\n const type = Array.isArray(q.schemaType) ? q.schemaType[0] : q.schemaType;\n schema.type = type;\n }\n\n if (q.schemaRef && q.schemaRef.includes(\"Inline\")) {\n const inlineSchema = getSchemaByRef(openapi, q.schemaRef);\n if (inlineSchema) {\n Object.assign(schema, inlineSchema);\n }\n }\n }\n\n const coerced = coerceParamValue(value, schema, { dateTime: false, date: false }, openapi.components.schemas);\n\n if (Object.keys(schema).length > 0 && coerced !== undefined) {\n const validate = validator.compile(schema);\n const valid = validate(coerced);\n if (!valid) {\n for (const err of validate.errors || []) {\n errors.push({\n path: `#/query/${q.name}`,\n message: err.message || \"Invalid value\",\n keyword: err.keyword,\n params: err.params as Record<string, unknown>,\n });\n }\n }\n }\n }\n\n for (const p of route.args.path) {\n const value = req.params[p.name];\n const openapiSchema = getParamSchemaFromIndex(paramSchemaIndex, \"path\", p.name);\n let schema: Record<string, unknown> = {};\n\n if (openapiSchema) {\n schema = resolveSchema(openapiSchema, openapi.components.schemas);\n } else {\n if (p.schemaType) {\n const type = Array.isArray(p.schemaType) ? p.schemaType[0] : p.schemaType;\n schema.type = type;\n }\n\n if (p.schemaRef && p.schemaRef.includes(\"Inline\")) {\n const inlineSchema = getSchemaByRef(openapi, p.schemaRef);\n if (inlineSchema) {\n Object.assign(schema, inlineSchema);\n }\n }\n }\n\n const coerced = coerceParamValue(value, schema, { dateTime: false, date: false }, openapi.components.schemas);\n\n if (Object.keys(schema).length > 0 && coerced !== undefined) {\n const validate = validator.compile(schema);\n const valid = validate(coerced);\n if (!valid) {\n for (const err of validate.errors || []) {\n errors.push({\n path: `#/path/${p.name}`,\n message: err.message || \"Invalid value\",\n keyword: err.keyword,\n params: err.params as Record<string, unknown>,\n });\n }\n }\n }\n }\n\n return errors.length > 0 ? errors : null;\n}\n","import { Router } from \"express\";\nimport { readFileSync } from \"node:fs\";\nimport { resolve, isAbsolute } from \"node:path\";\nimport swaggerUi from \"swagger-ui-express\";\nimport type { SetupSwaggerOptions } from \"./types.js\";\n\n/**\n * Sets up Swagger UI for API documentation\n * \n * @param options - Swagger configuration options\n * @returns Express router with Swagger endpoints\n */\nexport function setupSwagger(options: SetupSwaggerOptions = {}): Router {\n const {\n artifactsDir = \".adorn\",\n jsonPath = \"/docs/openapi.json\",\n uiPath = \"/docs\",\n swaggerOptions = {},\n } = options;\n\n const router = Router();\n\n router.get(jsonPath, (req, res) => {\n const openApiPath = isAbsolute(artifactsDir)\n ? resolve(artifactsDir, \"openapi.json\")\n : resolve(process.cwd(), artifactsDir, \"openapi.json\");\n\n const content = readFileSync(openApiPath, \"utf-8\");\n res.setHeader(\"Content-Type\", \"application/json\");\n res.send(content);\n });\n\n router.use(uiPath, swaggerUi.serve, swaggerUi.setup(null, {\n swaggerOptions: {\n url: jsonPath,\n ...swaggerOptions,\n },\n }));\n\n return router;\n}\n","import express from \"express\";\nimport { type Server } from \"http\";\nimport { createExpressRouter, type CreateRouterOptions, setupSwagger } from \"./index.js\";\nimport path from \"node:path\";\n\n/**\n * Options for bootstrapping an Express server with Adorn API\n */\nexport interface BootstrapOptions {\n controllers: Array<new (...args: any[]) => any>;\n port?: number;\n host?: string;\n artifactsDir?: string;\n enableSwagger?: boolean;\n swaggerPath?: string;\n swaggerJsonPath?: string;\n middleware?: CreateRouterOptions[\"middleware\"];\n auth?: CreateRouterOptions[\"auth\"];\n coerce?: CreateRouterOptions[\"coerce\"];\n}\n\n/**\n * Result of bootstrapping an Express server\n */\nexport interface BootstrapResult {\n server: Server;\n app: express.Express;\n url: string;\n port: number;\n host: string;\n close: () => Promise<void>;\n}\n\n/**\n * Bootstraps an Express server with the provided controllers and options\n * \n * @param options - Configuration options for the server\n * @returns Promise that resolves with the server instance and metadata\n */\nexport function bootstrap(options: BootstrapOptions): Promise<BootstrapResult> {\n return new Promise((resolve, reject) => {\n const {\n controllers,\n port: userPort,\n host: userHost,\n artifactsDir: userArtifactsDir = \".adorn\",\n enableSwagger = true,\n swaggerPath = \"/docs\",\n swaggerJsonPath = \"/docs/openapi.json\",\n middleware,\n auth,\n coerce,\n } = options;\n\n if (controllers.length === 0) {\n reject(new Error(\"At least one controller must be provided to bootstrap().\"));\n return;\n }\n\n const envPort = process.env.PORT;\n const port = userPort ?? (envPort !== undefined ? Number(envPort) : 3000);\n const host = userHost ?? process.env.HOST ?? \"0.0.0.0\";\n\n if (isNaN(port) || port < 0 || port > 65535) {\n reject(new Error(`Invalid port: ${port}. Port must be between 0 and 65535.`));\n return;\n }\n\n const absoluteArtifactsDir = path.isAbsolute(userArtifactsDir)\n ? userArtifactsDir\n : path.resolve(process.cwd(), userArtifactsDir);\n\n const app = express();\n app.use(express.json());\n\n createExpressRouter({\n controllers,\n artifactsDir: absoluteArtifactsDir,\n middleware,\n auth,\n coerce,\n }).then((router) => {\n app.use(router);\n\n if (enableSwagger) {\n const displayHost = host === \"0.0.0.0\" ? \"localhost\" : host;\n const serverUrl = `http://${displayHost}:${port}`;\n\n app.use(\n setupSwagger({\n artifactsDir: absoluteArtifactsDir,\n jsonPath: swaggerJsonPath,\n uiPath: swaggerPath,\n swaggerOptions: {\n servers: [{ url: serverUrl }],\n },\n })\n );\n }\n\n const server = app.listen(port, host, () => {\n const displayHost = host === \"0.0.0.0\" ? \"localhost\" : host;\n const serverUrl = `http://${displayHost}:${port}`;\n\n console.log(`🚀 Server running on ${serverUrl}`);\n if (enableSwagger) {\n console.log(`📚 Swagger UI: ${serverUrl}${swaggerPath}`);\n }\n\n const result: BootstrapResult = {\n server,\n app,\n url: serverUrl,\n port,\n host,\n close: () => new Promise<void>((closeResolve) => {\n server.close(() => {\n console.log(\"Server closed gracefully\");\n closeResolve();\n });\n })\n };\n\n resolve(result);\n });\n\n server.on(\"error\", (error: any) => {\n if (error.code === \"EADDRINUSE\") {\n reject(new Error(`Port ${port} already in use. Please choose a different port.`));\n } else if (error.code === \"EACCES\") {\n reject(new Error(`Permission denied for port ${port}. Ports below 1024 require root privileges.`));\n } else {\n reject(new Error(`Failed to start server: ${error.message}`));\n }\n });\n }).catch(reject);\n });\n}\n"],"mappings":"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","names":["path","path","path","path","Router","path","resolve"]}