adorn-api 1.0.10 → 1.0.12
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +318 -620
- package/dist/adapter/express/auth.d.ts +5 -0
- package/dist/adapter/express/auth.d.ts.map +1 -0
- package/dist/adapter/express/coercion.d.ts +22 -0
- package/dist/adapter/express/coercion.d.ts.map +1 -0
- package/dist/adapter/express/index.d.ts +3 -50
- package/dist/adapter/express/index.d.ts.map +1 -1
- package/dist/adapter/express/openapi.d.ts +11 -0
- package/dist/adapter/express/openapi.d.ts.map +1 -0
- package/dist/adapter/express/router.d.ts +4 -0
- package/dist/adapter/express/router.d.ts.map +1 -0
- package/dist/adapter/express/swagger.d.ts +4 -0
- package/dist/adapter/express/swagger.d.ts.map +1 -0
- package/dist/adapter/express/types.d.ts +64 -0
- package/dist/adapter/express/types.d.ts.map +1 -0
- package/dist/adapter/express/validation.d.ts +10 -0
- package/dist/adapter/express/validation.d.ts.map +1 -0
- package/dist/cli.cjs +330 -142
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +329 -141
- package/dist/cli.js.map +1 -1
- package/dist/compiler/manifest/emit.d.ts.map +1 -1
- package/dist/compiler/manifest/format.d.ts +1 -0
- package/dist/compiler/manifest/format.d.ts.map +1 -1
- package/dist/compiler/schema/openapi.d.ts.map +1 -1
- package/dist/compiler/schema/typeToJsonSchema.d.ts +7 -1
- package/dist/compiler/schema/typeToJsonSchema.d.ts.map +1 -1
- package/dist/express.cjs +618 -586
- package/dist/express.cjs.map +1 -1
- package/dist/express.js +615 -583
- package/dist/express.js.map +1 -1
- package/dist/http.d.ts +11 -9
- package/dist/http.d.ts.map +1 -1
- package/dist/index.cjs +2 -10
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -9
- package/dist/index.js.map +1 -1
- package/dist/metal/applyListQuery.d.ts +27 -0
- package/dist/metal/applyListQuery.d.ts.map +1 -0
- package/dist/metal/index.cjs +59 -0
- package/dist/metal/index.cjs.map +1 -1
- package/dist/metal/index.d.ts +4 -0
- package/dist/metal/index.d.ts.map +1 -1
- package/dist/metal/index.js +55 -0
- package/dist/metal/index.js.map +1 -1
- package/dist/metal/listQuery.d.ts +7 -0
- package/dist/metal/listQuery.d.ts.map +1 -0
- package/dist/metal/queryOptions.d.ts +8 -0
- package/dist/metal/queryOptions.d.ts.map +1 -0
- package/package.json +2 -2
- package/dist/compiler/analyze/extractQueryStyle.d.ts +0 -8
- package/dist/compiler/analyze/extractQueryStyle.d.ts.map +0 -1
package/dist/express.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/runtime/polyfill.ts","../src/adapter/express/index.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/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 { readFileSync, existsSync } from \"node:fs\";\nimport { resolve, join, isAbsolute } from \"node:path\";\nimport type { ManifestV1 } from \"../../compiler/manifest/format.js\";\nimport { bindRoutes, type BoundRoute } from \"./merge.js\";\nimport { createValidator, formatValidationErrors } from \"../../runtime/validation/ajv.js\";\nimport type { AuthSchemeRuntime } from \"../../runtime/auth/runtime.js\";\nimport { loadArtifacts } from \"../../compiler/cache/loadArtifacts.js\";\nimport swaggerUi from \"swagger-ui-express\";\n\r\ninterface OpenAPI31 {\n openapi: string;\n components: {\n schemas: Record<string, Record<string, unknown>>;\n securitySchemes?: Record<string, Record<string, unknown>>;\n };\n paths?: Record<string, Record<string, any>>;\n security?: Array<Record<string, string[]>>;\n}\n\r\ninterface AuthenticatedRequest extends Request {\n auth?: any;\n}\n\nexport interface CoerceOptions {\n body?: boolean;\n query?: boolean;\n path?: boolean;\n header?: boolean;\n cookie?: boolean;\n dateTime?: boolean;\n date?: boolean;\n}\n\nexport interface CreateRouterOptions {\n controllers: Array<new (...args: any[]) => any>;\n artifactsDir?: string;\n manifest?: ManifestV1;\n openapi?: OpenAPI31;\n auth?: {\n schemes: Record<string, AuthSchemeRuntime>;\n };\n coerce?: CoerceOptions;\n middleware?: {\n global?: 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 };\n}\n\nexport interface SetupSwaggerOptions {\n artifactsDir?: string;\n jsonPath?: string;\n uiPath?: string;\n swaggerOptions?: {\n url?: string;\n servers?: Array<{ url: string; description?: string }>;\n [key: string]: any;\n };\n}\n\nfunction 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\nexport async function createExpressRouter(options: CreateRouterOptions): Promise<Router> {\n const { controllers, artifactsDir = \".adorn\", middleware = {} } = options;\n\r\n let manifest: ManifestV1;\r\n let openapi: OpenAPI31;\r\n let precompiledValidators: Record<string, { body?: (data: unknown) => boolean; response: Record<string, (data: unknown) => boolean> }> | null = null;\r\n\r\n if (options.manifest && options.openapi) {\r\n manifest = options.manifest;\r\n openapi = options.openapi;\r\n if (manifest.validation.mode === \"precompiled\" && manifest.validation.precompiledModule) {\r\n try {\r\n const validatorPath = join(artifactsDir, manifest.validation.precompiledModule);\r\n precompiledValidators = require(validatorPath).validators;\r\n } catch (err) {\r\n console.warn(`Failed to load precompiled validators: ${err}`);\r\n }\r\n }\r\n } else {\r\n const artifacts = await loadArtifacts({ outDir: artifactsDir });\r\n manifest = artifacts.manifest as unknown as ManifestV1;\r\n openapi = artifacts.openapi as unknown as OpenAPI31;\r\n precompiledValidators = artifacts.validators?.validators as Record<string, { body?: (data: unknown) => boolean; response: Record<string, (data: unknown) => boolean> }> ?? null;\r\n }\r\n\r\n const routes = bindRoutes({ controllers, manifest });\n\n const validator = precompiledValidators ? null : createValidator();\n\n const router = Router();\n\n const instanceCache = new Map<Function, any>();\n const coerce = normalizeCoerceOptions(options.coerce);\n\r\n function getInstance(Ctor: new (...args: any[]) => any): any {\r\n if (!instanceCache.has(Ctor)) {\r\n instanceCache.set(Ctor, new Ctor());\r\n }\r\n return instanceCache.get(Ctor);\r\n }\r\n\r\n function resolveMiddleware(\r\n items: Array<string | ((req: any, res: any, next: (err?: any) => void) => any)>,\r\n named: Record<string, (req: any, res: any, next: (err?: any) => void) => any> = {}\r\n ): Array<(req: any, res: any, next: (err?: any) => void) => any> {\r\n return items.map(item => {\r\n if (typeof item === \"string\") {\r\n const fn = named[item];\r\n if (!fn) {\r\n throw new Error(`Named middleware \"${item}\" not found in middleware registry`);\r\n }\r\n return fn;\r\n }\r\n return item;\r\n });\r\n }\r\n\r\n 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\r\n function getSchemaByRef(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\r\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 = buildParamSchemaIndex(openapiOperation);\n const bodySchema = getRequestBodySchema(openapiOperation, route.args.body?.contentType)\n ?? (route.args.body ? getSchemaByRef(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\r\n if (middleware.global) {\r\n middlewareChain.push(...resolveMiddleware(middleware.global, middleware.named || {}));\r\n }\r\n\r\n if (route.controllerUse) {\r\n middlewareChain.push(...resolveMiddleware(route.controllerUse, middleware.named || {}));\r\n }\r\n\r\n if (route.use) {\r\n middlewareChain.push(...resolveMiddleware(route.use, middleware.named || {}));\r\n }\r\n\r\n if (options.auth) {\r\n const authMw = createAuthMiddleware(options.auth, route.auth, openapi.security || []);\r\n middlewareChain.push(authMw);\r\n }\r\n\r\n router[method](route.fullPath, ...middlewareChain, async (req: Request, res: Response, next: NextFunction) => {\r\n try {\r\n const validationErrors = precompiledValidators\r\n ? validateRequestWithPrecompiled(route, req, precompiledValidators)\r\n : validateRequest(route, req, openapi, validator!);\r\n if (validationErrors) {\r\n return res.status(400).json(formatValidationErrors(validationErrors));\r\n }\r\n\r\n const instance = getInstance(route.controllerCtor);\r\n const handler = instance[route.methodName];\r\n\r\n if (typeof handler !== \"function\") {\r\n throw new Error(`Method ${route.methodName} not found on controller`);\r\n }\r\n\r\n const args: any[] = [];\r\n\r\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\r\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(pathArg.schemaRef) : null)\n ?? schemaFromType(pathArg.schemaType);\n const coerced = coerceParamValue(rawValue, paramSchema, coercePathDates, openapi.components.schemas);\n args[pathArg.index] = coerced;\n }\n\r\n if (route.args.query.length > 0) {\n const deepObjectArgs = route.args.query.filter(q => q.serialization?.style === \"deepObject\");\n const standardArgs = route.args.query.filter(q => q.serialization?.style !== \"deepObject\");\n\n if (deepObjectArgs.length > 0) {\n const rawQuery = getRawQueryString(req);\n const names = new Set(deepObjectArgs.map(q => q.name));\n const parsedDeep = parseDeepObjectParams(rawQuery, names);\n\n for (const q of deepObjectArgs) {\n const rawValue = parsedDeep[q.name];\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"query\", q.name)\n ?? (q.schemaRef ? getSchemaByRef(q.schemaRef) : null)\n ?? schemaFromType(q.schemaType);\n const baseValue = rawValue === undefined ? {} : rawValue;\n const coerced = coerceParamValue(baseValue, paramSchema, coerceQueryDates, openapi.components.schemas);\n args[q.index] = coerced;\n }\n }\n\n if (standardArgs.length > 0) {\n const firstQueryIndex = standardArgs[0].index;\n const allSameIndex = standardArgs.every(q => q.index === firstQueryIndex);\n\n if (allSameIndex) {\n args[firstQueryIndex] = {};\n for (const q of standardArgs) {\n const parsed = parseQueryValue(req.query[q.name], q);\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"query\", q.name)\n ?? (q.schemaRef ? getSchemaByRef(q.schemaRef) : null)\n ?? schemaFromType(q.schemaType);\n const coerced = coerceParamValue(parsed, paramSchema, coerceQueryDates, openapi.components.schemas);\n args[firstQueryIndex][q.name] = coerced;\n }\n } else {\n for (const q of standardArgs) {\n const parsed = parseQueryValue(req.query[q.name], q);\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"query\", q.name)\n ?? (q.schemaRef ? getSchemaByRef(q.schemaRef) : null)\n ?? schemaFromType(q.schemaType);\n const coerced = coerceParamValue(parsed, paramSchema, coerceQueryDates, openapi.components.schemas);\n args[q.index] = coerced;\n }\n }\n }\n }\n\r\n if (route.args.headers.length > 0) {\r\n const firstHeaderIndex = route.args.headers[0].index;\r\n const allSameIndex = route.args.headers.every(h => h.index === firstHeaderIndex);\r\n\r\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(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(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\r\n if (route.args.cookies.length > 0) {\r\n const firstCookieIndex = route.args.cookies[0].index;\r\n const allSameIndex = route.args.cookies.every(c => c.index === firstCookieIndex);\r\n const cookies = parseCookies(req.headers.cookie);\r\n\r\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(c.schemaRef) : 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(c.schemaRef) : null)\n ?? schemaFromType(c.schemaType);\n const coerced = coerceParamValue(cookieValue, paramSchema, coerceCookieDates, openapi.components.schemas);\n args[c.index] = coerced;\n }\n }\n }\r\n\r\n if (args.length === 0) {\r\n args.push(req);\r\n }\r\n\r\n const result = await handler.apply(instance, args);\r\n\r\n const primaryResponse = route.responses[0];\r\n const status = primaryResponse?.status ?? 200;\r\n\r\n res.status(status).json(result);\r\n } catch (error) {\r\n next(error);\r\n }\r\n });\r\n }\r\n\r\n return router;\n}\n\ntype CoerceLocation = \"body\" | \"query\" | \"path\" | \"header\" | \"cookie\";\ntype DateCoercionOptions = { dateTime: boolean; date: boolean };\n\nfunction 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\nfunction toOpenApiPath(path: string): string {\n return path.replace(/:([^/]+)/g, \"{$1}\");\n}\n\nfunction 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\nfunction buildParamSchemaIndex(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\nfunction 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\nfunction 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\nfunction schemaFromType(schemaType?: string | string[]): Record<string, unknown> | null {\n if (!schemaType) return null;\n return { type: schemaType };\n}\n\ninterface ValidationError {\n path: string;\n message: string;\n keyword: string;\n params: Record<string, unknown>;\n}\n\r\nfunction validateRequestWithPrecompiled(\n route: BoundRoute,\n req: Request,\n validators: Record<string, { body?: (data: unknown) => boolean; response: Record<string, (data: unknown) => boolean> }>\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)\n : {};\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 for (const q of route.args.query) {\n const value = q.serialization?.style === \"deepObject\" ? deepValues[q.name] : req.query[q.name];\n if (value === undefined) continue;\n\n const schema = schemaFromType(q.schemaType) ?? {};\n const coerced = coerceParamValue(value, schema, { dateTime: false, date: false }, {});\n if (Object.keys(schema).length > 0 && coerced !== undefined) {\n errors.push({\n path: `#/query/${q.name}`,\n message: `Schema validation not supported for query params in precompiled mode`,\n keyword: \"notSupported\",\n params: {},\r\n });\r\n }\r\n }\r\n\r\n for (const p of route.args.path) {\n const value = req.params[p.name];\n if (value === undefined) continue;\n\n const schema = schemaFromType(p.schemaType) ?? {};\n const coerced = coerceParamValue(value, schema, { dateTime: false, date: false }, {});\n if (Object.keys(schema).length > 0 && coerced !== undefined) {\n errors.push({\n path: `#/path/${p.name}`,\n message: `Schema validation not supported for path params in precompiled mode`,\n keyword: \"notSupported\",\r\n params: {},\r\n });\r\n }\r\n }\r\n\r\n return errors.length > 0 ? errors : null;\r\n}\r\n\r\nfunction validateRequest(\n route: BoundRoute,\n req: Request,\n openapi: OpenAPI31,\n validator: ReturnType<typeof createValidator>\n): ValidationError[] | null {\n function getSchemaByRef(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\n const openapiOperation = getOpenApiOperation(openapi, route);\n const paramSchemaIndex = buildParamSchemaIndex(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)\n : {};\n\n const errors: ValidationError[] = [];\n\r\n if (route.args.body) {\r\n const bodySchema = getSchemaByRef(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 const value = q.serialization?.style === \"deepObject\" ? deepValues[q.name] : req.query[q.name];\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(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);\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) {\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(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);\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\r\nfunction 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\nfunction 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\nfunction 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\nfunction 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\nfunction 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\r\nfunction parseQueryValue(value: any, param: { schemaType?: string | string[]; serialization?: { style?: string; explode?: boolean } }): any {\n if (value === undefined || value === null) return value;\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;\n}\n\nfunction 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\nfunction parseDeepObjectParams(\n rawQuery: string,\n names: Set<string>\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 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\nfunction parseCookies(cookieHeader: string | undefined): Record<string, string> {\n if (!cookieHeader) return {};\n\r\n const cookies: Record<string, string> = {};\r\n const pairs = cookieHeader.split(\";\");\r\n\r\n for (const pair of pairs) {\r\n const [name, ...valueParts] = pair.trim().split(\"=\");\r\n if (name) {\r\n cookies[name] = valueParts.join(\"=\");\r\n }\r\n }\r\n\r\n return cookies;\n}\n\nexport { bootstrap, type BootstrapOptions } from \"./bootstrap.js\";\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","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 getControllerIds(controllers: Array<new (...args: any[]) => any>): string[] {\n return controllers.map(c => c.name);\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 let 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 express from \"express\";\nimport { type Server } from \"http\";\nimport { createExpressRouter, type CreateRouterOptions, setupSwagger, type SetupSwaggerOptions } 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(async (resolve, reject) => {\n try {\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 const router = await createExpressRouter({\n controllers,\n artifactsDir: absoluteArtifactsDir,\n middleware,\n auth,\n coerce,\n });\n\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\n } catch (error) {\n reject(error);\n }\n });\n}\n"],"mappings":"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","names":["path","path","path","resolve","path"]}
|
|
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 getRawQueryString,\n parseDeepObjectParams,\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 (e) {\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 getControllerIds(controllers: Array<new (...args: any[]) => any>): string[] {\n return controllers.map(c => c.name);\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 let 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\r\n // This logic is preserved from index.ts\r\n for (const q of route.args.query) {\r\n let value = q.serialization?.style === \"deepObject\" ? deepValues[q.name] : req.query[q.name];\r\n if (q.content === \"application/json\" && typeof value === \"string\") {\r\n try {\r\n value = JSON.parse(value);\r\n } catch (e) {\r\n errors.push({\r\n path: `#/query/${q.name}`,\r\n message: `Invalid JSON string`,\r\n keyword: \"json\",\r\n params: {},\r\n });\r\n continue;\r\n }\r\n }\r\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) {\r\n let value = q.serialization?.style === \"deepObject\" ? deepValues[q.name] : req.query[q.name];\r\n if (q.content === \"application/json\" && typeof value === \"string\") {\r\n try {\r\n value = JSON.parse(value);\r\n } catch (e) {\r\n errors.push({\r\n path: `#/query/${q.name}`,\r\n message: `Invalid JSON string`,\r\n keyword: \"json\",\r\n params: {},\r\n });\r\n continue;\r\n }\r\n }\r\n const openapiSchema = getParamSchemaFromIndex(paramSchemaIndex, \"query\", q.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 (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, type SetupSwaggerOptions } 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(async (resolve, reject) => {\n try {\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 const router = await createExpressRouter({\n controllers,\n artifactsDir: absoluteArtifactsDir,\n middleware,\n auth,\n coerce,\n });\n\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\n } catch (error) {\n reject(error);\n }\n });\n}\n"],"mappings":"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","names":["path","path","path","path","Router","path","resolve"]}
|
package/dist/http.d.ts
CHANGED
|
@@ -3,21 +3,13 @@ declare const ADORN_META: unique symbol;
|
|
|
3
3
|
interface HttpMetadata {
|
|
4
4
|
consumes?: string[];
|
|
5
5
|
produces?: string[];
|
|
6
|
-
queryStyles?: Record<string, QueryStyleOptions>;
|
|
7
6
|
fileParts?: Record<string, FilePartOptions>;
|
|
8
7
|
cookies?: Record<string, boolean>;
|
|
9
8
|
}
|
|
10
|
-
interface QueryStyleOptions {
|
|
11
|
-
style?: "form" | "spaceDelimited" | "pipeDelimited" | "deepObject";
|
|
12
|
-
explode?: boolean;
|
|
13
|
-
allowReserved?: boolean;
|
|
14
|
-
}
|
|
15
9
|
interface FilePartOptions {
|
|
16
10
|
contentType?: string;
|
|
17
11
|
headers?: Record<string, string>;
|
|
18
12
|
}
|
|
19
|
-
export type QueryStyle = QueryStyleOptions;
|
|
20
|
-
export declare function QueryStyle(options: QueryStyleOptions): <T extends (...args: any[]) => any>(_target: T, context: ClassMethodDecoratorContext<any, T>) => void;
|
|
21
13
|
export type PartType = FilePartOptions;
|
|
22
14
|
export declare function PartType(contentTypeOrOptions: string | FilePartOptions): PropertyDecorator;
|
|
23
15
|
export declare function File(): PropertyDecorator;
|
|
@@ -27,6 +19,16 @@ export type Query<T = any> = T;
|
|
|
27
19
|
export type Body<T = any> = T;
|
|
28
20
|
export type Headers<T = any> = T;
|
|
29
21
|
export type Cookies<T = any> = T;
|
|
22
|
+
export interface PaginationParams {
|
|
23
|
+
page: number;
|
|
24
|
+
pageSize: number;
|
|
25
|
+
}
|
|
26
|
+
export type PaginatedResponse<T> = {
|
|
27
|
+
items: T[];
|
|
28
|
+
totalItems: number;
|
|
29
|
+
page: number;
|
|
30
|
+
pageSize: number;
|
|
31
|
+
};
|
|
30
32
|
export { ADORN_META };
|
|
31
|
-
export type { HttpMetadata,
|
|
33
|
+
export type { HttpMetadata, FilePartOptions };
|
|
32
34
|
//# sourceMappingURL=http.d.ts.map
|
package/dist/http.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,uBAAuB,CAAC;AAE/B,QAAA,MAAM,UAAU,eAAmC,CAAC;AAEpD,UAAU,YAAY;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,
|
|
1
|
+
{"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,uBAAuB,CAAC;AAE/B,QAAA,MAAM,UAAU,eAAmC,CAAC;AAEpD,UAAU,YAAY;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,UAAU,eAAe;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAWD,MAAM,MAAM,QAAQ,GAAG,eAAe,CAAC;AAEvC,wBAAgB,QAAQ,CAAC,oBAAoB,EAAE,MAAM,GAAG,eAAe,GAAG,iBAAiB,CAS1F;AAED,wBAAgB,IAAI,IAAI,iBAAiB,CAMxC;AAED,wBAAgB,QAAQ,CAAC,GAAG,YAAY,EAAE,MAAM,EAAE,GAAG,cAAc,CAKlE;AAED,wBAAgB,QAAQ,CAAC,GAAG,YAAY,EAAE,MAAM,EAAE,GAAG,cAAc,CAKlE;AAED,MAAM,MAAM,KAAK,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;AAC/B,MAAM,MAAM,IAAI,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;AAC9B,MAAM,MAAM,OAAO,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;AACjC,MAAM,MAAM,OAAO,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC;AAEjC,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI;IACjC,KAAK,EAAE,CAAC,EAAE,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,CAAC"}
|
package/dist/index.cjs
CHANGED
|
@@ -59,13 +59,13 @@ __export(index_exports, {
|
|
|
59
59
|
MinProperties: () => MinProperties,
|
|
60
60
|
MultipleOf: () => MultipleOf,
|
|
61
61
|
PartType: () => PartType,
|
|
62
|
+
PartType2: () => PartType,
|
|
62
63
|
Patch: () => Patch,
|
|
63
64
|
Pattern: () => Pattern,
|
|
64
65
|
Post: () => Post,
|
|
65
66
|
Produces: () => Produces,
|
|
66
67
|
Public: () => Public,
|
|
67
68
|
Put: () => Put,
|
|
68
|
-
QueryStyle: () => QueryStyle,
|
|
69
69
|
Schema: () => Schema,
|
|
70
70
|
Union: () => Union,
|
|
71
71
|
Use: () => Use,
|
|
@@ -409,14 +409,6 @@ function getMetadata(target) {
|
|
|
409
409
|
host[ADORN_META3] = metadata;
|
|
410
410
|
return metadata;
|
|
411
411
|
}
|
|
412
|
-
function QueryStyle(options) {
|
|
413
|
-
return function(_target, context) {
|
|
414
|
-
if (context.private || context.static) return;
|
|
415
|
-
const metadata = getMetadata(context.metadata);
|
|
416
|
-
metadata.queryStyles ??= {};
|
|
417
|
-
metadata.queryStyles[String(context.name)] = options;
|
|
418
|
-
};
|
|
419
|
-
}
|
|
420
412
|
function PartType(contentTypeOrOptions) {
|
|
421
413
|
return function(target, propertyKey) {
|
|
422
414
|
const metadata = getMetadata(target);
|
|
@@ -554,13 +546,13 @@ function getArtifactCacheStats() {
|
|
|
554
546
|
MinProperties,
|
|
555
547
|
MultipleOf,
|
|
556
548
|
PartType,
|
|
549
|
+
PartType2,
|
|
557
550
|
Patch,
|
|
558
551
|
Pattern,
|
|
559
552
|
Post,
|
|
560
553
|
Produces,
|
|
561
554
|
Public,
|
|
562
555
|
Put,
|
|
563
|
-
QueryStyle,
|
|
564
556
|
Schema,
|
|
565
557
|
Union,
|
|
566
558
|
Use,
|