adorn-api 1.0.9 → 1.0.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/express/index.d.ts.map +1 -1
- package/dist/adapter/express/merge.d.ts +3 -0
- package/dist/adapter/express/merge.d.ts.map +1 -1
- package/dist/cli.cjs +117 -52
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +117 -52
- package/dist/cli.js.map +1 -1
- package/dist/compiler/analyze/scanControllers.d.ts +2 -0
- package/dist/compiler/analyze/scanControllers.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/typeToJsonSchema.d.ts.map +1 -1
- package/dist/decorators/Paginated.d.ts +5 -0
- package/dist/decorators/Paginated.d.ts.map +1 -0
- package/dist/decorators/index.d.ts +1 -0
- package/dist/decorators/index.d.ts.map +1 -1
- package/dist/express.cjs +10 -1
- package/dist/express.cjs.map +1 -1
- package/dist/express.js +10 -1
- package/dist/express.js.map +1 -1
- package/dist/http.d.ts +10 -0
- package/dist/http.d.ts.map +1 -1
- package/dist/index.cjs +25 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +2 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -0
- package/dist/index.js.map +1 -1
- package/dist/metal/searchWhere.d.ts +20 -9
- package/dist/metal/searchWhere.d.ts.map +1 -1
- package/dist/runtime/metadata/types.d.ts +3 -0
- package/dist/runtime/metadata/types.d.ts.map +1 -1
- package/package.json +2 -2
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/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\n if (route.args.paginationParamIndex !== null) {\n const pageStr = req.query.page as string | undefined;\n const pageSizeStr = req.query.pageSize as string | undefined;\n const defaultPageSize = route.paginationConfig?.defaultPageSize ?? 10;\n const page = pageStr ? parseInt(pageStr, 10) : 1;\n const pageSize = pageSizeStr ? parseInt(pageSizeStr, 10) : defaultPageSize;\n args[route.args.paginationParamIndex] = { page, pageSize };\n }\n\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 paginationConfig?: { defaultPageSize: number };\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 paginationConfig: routeOp.pagination,\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":";;;;;;;;AAEC,OAAe,aAAa,uBAAO,iBAAiB;;;ACFrD,SAAS,cAAc;AAEvB,SAAS,oBAAgC;AACzC,SAAS,SAAS,MAAM,kBAAkB;;;ACHnC,IAAM,aAAa,uBAAO,IAAI,gBAAgB;;;ACG9C,SAAS,gBAAgB,MAAoC;AAClE,QAAM,UAAW,OAAe;AAChC,MAAI,CAAC,SAAS;AACZ,WAAO;AAAA,EACT;AAEA,QAAM,gBAAiB,KAAa,OAAO;AAC3C,MAAI,CAAC,eAAe;AAClB,WAAO;AAAA,EACT;AAEA,QAAM,SAAS,cAAc,UAAU;AACvC,SAAO,UAAU;AACnB;;;AChBO,SAAS,mBAAmB,gBAAwB,YAA4B;AACrF,SAAO,GAAG,cAAc,IAAI,UAAU;AACxC;;;ACFO,SAAS,UAAU,MAAc,KAAqB;AAC3D,QAAM,IAAI,KAAK,SAAS,GAAG,IAAI,KAAK,MAAM,GAAG,EAAE,IAAI;AACnD,QAAM,IAAI,IAAI,WAAW,GAAG,IAAI,MAAM,IAAI,GAAG;AAC7C,SAAQ,IAAI,KAAM;AACpB;;;ACAA,OAAO,YAAY;AAsBnB,IAAM,aAAa,oBAAI,IAA6B;AAEpD,SAAS,qBAAqBA,OAAsB;AAClD,SAAOA,MAAK,QAAQ,aAAa,KAAK;AACxC;AAEA,SAAS,oBAAoB,UAA8B;AACzD,QAAM,MAAM,SAAS,YAAY,QAAQ,OAAK,EAAE,WAAW,IAAI,OAAK,EAAE,WAAW,CAAC,EAAE,KAAK;AACzF,QAAM,OAAO,KAAK,UAAU;AAAA,IAC1B;AAAA,IACA,YAAY,SAAS;AAAA,EACvB,CAAC;AACD,SAAO,OAAO,WAAW,QAAQ,EAAE,OAAO,IAAI,EAAE,OAAO,KAAK,EAAE,MAAM,GAAG,EAAE;AAC3E;AAMA,SAAS,uBAAuB,aAA2D;AACzF,SAAO,YAAY,IAAI,OAAK,GAAG,EAAE,IAAI,IAAI,EAAE,SAAS,CAAC,EAAE;AACzD;AAEO,SAAS,WAAW,QAIV;AACf,QAAM,EAAE,aAAa,UAAU,WAAW,KAAK,IAAI;AAEnD,MAAI,UAAU;AACZ,UAAM,eAAe,oBAAoB,QAAQ;AACjD,UAAM,gBAAgB,uBAAuB,WAAW;AACxD,UAAM,WAAW,GAAG,YAAY,IAAI,cAAc,KAAK,GAAG,CAAC;AAE3D,UAAM,SAAS,WAAW,IAAI,QAAQ;AACtC,QAAI,QAAQ;AACV,aAAO,OAAO;AAAA,IAChB;AAEA,UAAM,QAAQ,mBAAmB,aAAa,QAAQ;AAEtD,eAAW,IAAI,UAAU;AAAA,MACvB,aAAa;AAAA,MACb;AAAA,MACA;AAAA,IACF,CAAC;AAED,WAAO;AAAA,EACT;AAEA,SAAO,mBAAmB,aAAa,QAAQ;AACjD;AAEA,SAAS,mBACP,aACA,UACc;AACd,QAAM,iBAAiB,oBAAI,IAA4B;AACvD,aAAW,QAAQ,SAAS,aAAa;AACvC,eAAW,MAAM,KAAK,YAAY;AAChC,UAAI,eAAe,IAAI,GAAG,WAAW,GAAG;AACtC,cAAM,IAAI,MAAM,sCAAsC,GAAG,WAAW,EAAE;AAAA,MACxE;AACA,qBAAe,IAAI,GAAG,aAAa,EAAE;AAAA,IACvC;AAAA,EACF;AAEA,QAAM,QAAsB,CAAC;AAE7B,aAAW,QAAQ,aAAa;AAC9B,UAAM,SAAS,gBAAgB,IAAI;AACnC,QAAI,CAAC,QAAQ;AACX,cAAQ,KAAK,mCAAmC,KAAK,IAAI,YAAY;AACrE;AAAA,IACF;AAEA,UAAM,WAAW,OAAO,YAAY;AAEpC,eAAW,WAAW,OAAO,KAAK;AAChC,YAAM,OAAO,QAAQ,eAAe,mBAAmB,KAAK,MAAM,QAAQ,UAAU;AAEpF,YAAM,aAAa,eAAe,IAAI,IAAI;AAC1C,UAAI,CAAC,YAAY;AACf,cAAM,IAAI;AAAA,UACR,sCAAsC,IAAI;AAAA,QAE5C;AAAA,MACF;AAEA,UAAI,WAAW,KAAK,WAAW,QAAQ,cAAc,WAAW,KAAK,SAAS,QAAQ,MAAM;AAC1F,cAAM,IAAI;AAAA,UACR,sBAAsB,IAAI,cACd,QAAQ,UAAU,IAAI,QAAQ,IAAI,eACjC,WAAW,KAAK,MAAM,IAAI,WAAW,KAAK,IAAI;AAAA,QAE7D;AAAA,MACF;AAEA,YAAM,cAAc,qBAAqB,QAAQ,IAAI;AACrD,YAAM,WAAW,UAAU,UAAU,WAAW;AAEhD,YAAM,KAAK;AAAA,QACT,aAAa;AAAA,QACb;AAAA,QACA,YAAY,WAAW,KAAK;AAAA,QAC5B,gBAAgB;AAAA,QAChB,YAAY,QAAQ;AAAA,QACpB,MAAM,WAAW;AAAA,QACjB,WAAW,WAAW;AAAA,QACtB,KAAK,QAAQ;AAAA,QACb,MAAM,QAAQ;AAAA,QACd,eAAe,OAAO;AAAA,QACtB,kBAAkB,QAAQ;AAAA,MAC5B,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;ACjJA,OAAO,SAAS;AAChB,OAAO,gBAAgB;AAehB,IAAM,0BAAN,cAAsC,MAAM;AAAA,EACjD,YACS,YACA,QACP;AACA,UAAM,mBAAmB;AAHlB;AACA;AAGP,SAAK,OAAO;AAAA,EACd;AACF;AAEO,SAAS,kBAAkB;AAChC,QAAM,MAAM,IAAI,IAAI,QAAQ;AAAA,IAC1B,WAAW;AAAA,IACX,aAAa;AAAA,IACb,QAAQ;AAAA,IACR,iBAAiB;AAAA,EACnB,CAAC;AAED,aAAW,QAAQ,GAAG;AAEtB,MAAI,UAAU,YAAY,0BAA0B;AAEpD,SAAO;AACT;AAuCO,SAAS,uBAAuB,QAAoD;AACzF,QAAM,YAAsC,CAAC;AAE7C,aAAW,SAAS,QAAQ;AAC1B,UAAMC,QAAO,MAAM,QAAQ;AAC3B,QAAI,CAAC,UAAUA,KAAI,GAAG;AACpB,gBAAUA,KAAI,IAAI,CAAC;AAAA,IACrB;AACA,cAAUA,KAAI,EAAE,KAAK,MAAM,OAAO;AAAA,EACpC;AAEA,SAAO;AAAA,IACL,OAAO;AAAA,IACP,SAAS;AAAA,EACX;AACF;;;AC7FA,OAAO,QAAQ;AACf,OAAO,UAAU;AACjB,SAAS,YAAY;AA2GrB,IAAM,gBAAgB,oBAAI,IAAgC;AAE1D,eAAe,SAAS,UAA0C;AAChE,MAAI;AACF,UAAM,QAAQ,MAAM,KAAK,QAAQ;AACjC,WAAO,MAAM;AAAA,EACf,QAAQ;AACN,WAAO;AAAA,EACT;AACF;AAYA,eAAsB,cAAc,SAAyD;AAC3F,QAAM,EAAE,OAAO,IAAI;AACnB,QAAM,WAAW,KAAK,QAAQ,MAAM;AAEpC,MAAI,QAAQ,cAAc,IAAI,QAAQ;AAEtC,QAAM,cAAc,KAAK,KAAK,QAAQ,cAAc;AACpD,QAAM,eAAe,KAAK,KAAK,QAAQ,eAAe;AACtD,QAAM,iBAAiB,KAAK,KAAK,QAAQ,gBAAgB;AAEzD,QAAM,eAAe,MAAM,SAAS,WAAW;AAC/C,QAAM,gBAAgB,MAAM,SAAS,YAAY;AACjD,QAAM,kBAAkB,MAAM,SAAS,cAAc;AAErD,MAAI,OAAO;AACT,UAAM,cACJ,MAAM,OAAO,YAAY,gBACzB,MAAM,OAAO,aAAa,iBAC1B,MAAM,OAAO,eAAe;AAE9B,QAAI,aAAa;AACf,UAAI,MAAM,WAAW,MAAM,UAAU;AACnC,eAAO;AAAA,UACL,SAAS,MAAM;AAAA,UACf,UAAU,MAAM;AAAA,UAChB,YAAY,MAAM;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,QAAM,iBAAiB,GAAG,aAAa,aAAa,OAAO;AAC3D,QAAM,kBAAkB,GAAG,aAAa,cAAc,OAAO;AAE7D,QAAM,UAAU,KAAK,MAAM,cAAc;AACzC,QAAM,WAAW,KAAK,MAAM,eAAe;AAE3C,MAAI,aAAqC;AAEzC,MAAI,SAAS,WAAW,SAAS,iBAAiB,SAAS,WAAW,mBAAmB;AACvF,QAAI;AACF,YAAM,mBAAmB,MAAM,OAAO,KAAK,KAAK,QAAQ,SAAS,WAAW,iBAAiB;AAC7F,mBAAa;AAAA,IACf,SAAS,KAAK;AACZ,cAAQ,KAAK,0CAA0C,GAAG,EAAE;AAAA,IAC9D;AAAA,EACF;AAEA,gBAAc,IAAI,UAAU;AAAA,IAC1B;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,MACN,SAAS;AAAA,MACT,UAAU;AAAA,MACV,YAAY;AAAA,IACd;AAAA,EACF,CAAC;AAED,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA;AAAA,EACF;AACF;;;APzLA,OAAO,eAAe;;;AQTtB,OAAO,aAAa;AAGpB,OAAOC,WAAU;AAwBV,SAAS,UAAU,SAAqD;AAC7E,SAAO,IAAI,QAAQ,OAAOC,UAAS,WAAW;AAC5C,QAAI;AACF,YAAM;AAAA,QACJ;AAAA,QACA,MAAM;AAAA,QACN,MAAM;AAAA,QACN,cAAc,mBAAmB;AAAA,QACjC,gBAAgB;AAAA,QAChB,cAAc;AAAA,QACd,kBAAkB;AAAA,QAClB;AAAA,QACA;AAAA,QACA;AAAA,MACF,IAAI;AAEJ,UAAI,YAAY,WAAW,GAAG;AAC5B,eAAO,IAAI,MAAM,0DAA0D,CAAC;AAC5E;AAAA,MACF;AAEA,YAAM,UAAU,QAAQ,IAAI;AAC5B,YAAM,OAAO,aAAa,YAAY,SAAY,OAAO,OAAO,IAAI;AACpE,YAAM,OAAO,YAAY,QAAQ,IAAI,QAAQ;AAE7C,UAAI,MAAM,IAAI,KAAK,OAAO,KAAK,OAAO,OAAO;AAC3C,eAAO,IAAI,MAAM,iBAAiB,IAAI,qCAAqC,CAAC;AAC5E;AAAA,MACF;AAEA,YAAM,uBAAuBD,MAAK,WAAW,gBAAgB,IACzD,mBACAA,MAAK,QAAQ,QAAQ,IAAI,GAAG,gBAAgB;AAEhD,YAAM,MAAM,QAAQ;AACpB,UAAI,IAAI,QAAQ,KAAK,CAAC;AAEtB,YAAM,SAAS,MAAM,oBAAoB;AAAA,QACvC;AAAA,QACA,cAAc;AAAA,QACd;AAAA,QACA;AAAA,QACA;AAAA,MACF,CAAC;AAED,UAAI,IAAI,MAAM;AAEd,UAAI,eAAe;AACjB,cAAM,cAAc,SAAS,YAAY,cAAc;AACvD,cAAM,YAAY,UAAU,WAAW,IAAI,IAAI;AAE/C,YAAI;AAAA,UACF,aAAa;AAAA,YACX,cAAc;AAAA,YACd,UAAU;AAAA,YACV,QAAQ;AAAA,YACR,gBAAgB;AAAA,cACd,SAAS,CAAC,EAAE,KAAK,UAAU,CAAC;AAAA,YAC9B;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAEA,YAAM,SAAS,IAAI,OAAO,MAAM,MAAM,MAAM;AAC1C,cAAM,cAAc,SAAS,YAAY,cAAc;AACvD,cAAM,YAAY,UAAU,WAAW,IAAI,IAAI;AAE/C,gBAAQ,IAAI,+BAAwB,SAAS,EAAE;AAC/C,YAAI,eAAe;AACjB,kBAAQ,IAAI,yBAAkB,SAAS,GAAG,WAAW,EAAE;AAAA,QACzD;AAEA,cAAM,SAA0B;AAAA,UAC9B;AAAA,UACA;AAAA,UACA,KAAK;AAAA,UACL;AAAA,UACA;AAAA,UACA,OAAO,MAAM,IAAI,QAAc,CAAC,iBAAiB;AAC/C,mBAAO,MAAM,MAAM;AACjB,sBAAQ,IAAI,0BAA0B;AACtC,2BAAa;AAAA,YACf,CAAC;AAAA,UACH,CAAC;AAAA,QACH;AAEA,QAAAC,SAAQ,MAAM;AAAA,MAChB,CAAC;AAED,aAAO,GAAG,SAAS,CAAC,UAAe;AACjC,YAAI,MAAM,SAAS,cAAc;AAC/B,iBAAO,IAAI,MAAM,QAAQ,IAAI,kDAAkD,CAAC;AAAA,QAClF,WAAW,MAAM,SAAS,UAAU;AAClC,iBAAO,IAAI,MAAM,8BAA8B,IAAI,6CAA6C,CAAC;AAAA,QACnG,OAAO;AACL,iBAAO,IAAI,MAAM,2BAA2B,MAAM,OAAO,EAAE,CAAC;AAAA,QAC9D;AAAA,MACF,CAAC;AAAA,IAEH,SAAS,OAAO;AACd,aAAO,KAAK;AAAA,IACd;AAAA,EACF,CAAC;AACH;;;ARrEA,SAAS,uBAAuB,QAAiD;AAC/E,SAAO;AAAA,IACL,MAAM,QAAQ,QAAQ;AAAA,IACtB,OAAO,QAAQ,SAAS;AAAA,IACxB,MAAM,QAAQ,QAAQ;AAAA,IACtB,QAAQ,QAAQ,UAAU;AAAA,IAC1B,QAAQ,QAAQ,UAAU;AAAA,IAC1B,UAAU,QAAQ,YAAY;AAAA,IAC9B,MAAM,QAAQ,QAAQ;AAAA,EACxB;AACF;AAEA,eAAsB,oBAAoB,SAA+C;AACvF,QAAM,EAAE,aAAa,eAAe,UAAU,aAAa,CAAC,EAAE,IAAI;AAElE,MAAI;AACJ,MAAI;AACJ,MAAI,wBAA4I;AAEhJ,MAAI,QAAQ,YAAY,QAAQ,SAAS;AACvC,eAAW,QAAQ;AACnB,cAAU,QAAQ;AAClB,QAAI,SAAS,WAAW,SAAS,iBAAiB,SAAS,WAAW,mBAAmB;AACvF,UAAI;AACF,cAAM,gBAAgB,KAAK,cAAc,SAAS,WAAW,iBAAiB;AAC9E,gCAAwB,UAAQ,aAAa,EAAE;AAAA,MACjD,SAAS,KAAK;AACZ,gBAAQ,KAAK,0CAA0C,GAAG,EAAE;AAAA,MAC9D;AAAA,IACF;AAAA,EACF,OAAO;AACL,UAAM,YAAY,MAAM,cAAc,EAAE,QAAQ,aAAa,CAAC;AAC9D,eAAW,UAAU;AACrB,cAAU,UAAU;AACpB,4BAAwB,UAAU,YAAY,cAA6H;AAAA,EAC7K;AAEA,QAAM,SAAS,WAAW,EAAE,aAAa,SAAS,CAAC;AAEnD,QAAM,YAAY,wBAAwB,OAAO,gBAAgB;AAEjE,QAAM,SAAS,OAAO;AAEtB,QAAM,gBAAgB,oBAAI,IAAmB;AAC7C,QAAM,SAAS,uBAAuB,QAAQ,MAAM;AAEpD,WAAS,YAAY,MAAwC;AAC3D,QAAI,CAAC,cAAc,IAAI,IAAI,GAAG;AAC5B,oBAAc,IAAI,MAAM,IAAI,KAAK,CAAC;AAAA,IACpC;AACA,WAAO,cAAc,IAAI,IAAI;AAAA,EAC/B;AAEA,WAAS,kBACP,OACA,QAAgF,CAAC,GAClB;AAC/D,WAAO,MAAM,IAAI,UAAQ;AACvB,UAAI,OAAO,SAAS,UAAU;AAC5B,cAAM,KAAK,MAAM,IAAI;AACrB,YAAI,CAAC,IAAI;AACP,gBAAM,IAAI,MAAM,qBAAqB,IAAI,oCAAoC;AAAA,QAC/E;AACA,eAAO;AAAA,MACT;AACA,aAAO;AAAA,IACT,CAAC;AAAA,EACH;AAEA,WAAS,qBACP,YACA,WACA,gBACA;AACA,WAAO,OAAO,KAA2B,KAAe,SAAuB;AAC7E,YAAM,WAAW,cAAc;AAC/B,YAAM,mBAAmB,aAAa,cAAc;AACpD,YAAM,oBAAoB,kBAAkB,eAAe,SAAS;AAEpE,UAAI,CAAC,oBAAoB,CAAC,mBAAmB;AAC3C,eAAO,KAAK;AAAA,MACd;AAEA,UAAI,UAAU;AACZ,eAAO,KAAK;AAAA,MACd;AAEA,YAAM,WAAW;AACjB,YAAM,SAAS,SAAS;AACxB,YAAM,iBAAiB,SAAS,UAAU,CAAC;AAC3C,YAAM,aAAa,SAAS,YAAY;AAExC,YAAM,cAAc,WAAW,QAAQ,MAAM;AAC7C,UAAI,CAAC,aAAa;AAChB,cAAM,IAAI,MAAM,gBAAgB,MAAM,mCAAmC;AAAA,MAC3E;AAEA,YAAM,SAAS,MAAM,YAAY,aAAa,GAAG;AAEjD,UAAI,CAAC,QAAQ;AACX,YAAI,YAAY;AACd,cAAI,OAAO;AACX,iBAAO,KAAK;AAAA,QACd;AACA,eAAO,YAAY,UAAU,GAAG;AAAA,MAClC;AAEA,UAAI,OAAO,OAAO;AAElB,UAAI,YAAY,aAAa,eAAe,SAAS,GAAG;AACtD,YAAI,CAAC,YAAY,UAAU,QAAQ,cAAc,GAAG;AAClD,cAAI,OAAO,GAAG,EAAE,KAAK,EAAE,OAAO,aAAa,SAAS,sBAAsB,CAAC;AAC3E;AAAA,QACF;AAAA,MACF;AAEA,WAAK;AAAA,IACP;AAAA,EACF;AAEA,WAAS,eAAe,KAA6C;AACnE,QAAI,CAAC,IAAI,WAAW,uBAAuB,EAAG,QAAO;AACrD,UAAM,aAAa,IAAI,QAAQ,yBAAyB,EAAE;AAC1D,WAAO,QAAQ,WAAW,QAAQ,UAAU,KAAK;AAAA,EACnD;AAEA,aAAW,SAAS,QAAQ;AAC1B,UAAM,SAAS,MAAM,WAAW,YAAY;AAC5C,UAAM,mBAAmB,oBAAoB,SAAS,KAAK;AAC3D,UAAM,mBAAmB,sBAAsB,gBAAgB;AAC/D,UAAM,aAAa,qBAAqB,kBAAkB,MAAM,KAAK,MAAM,WAAW,MAChF,MAAM,KAAK,OAAO,eAAe,MAAM,KAAK,KAAK,SAAS,IAAI;AACpE,UAAM,kBAAkB,uBAAuB,QAAQ,MAAM;AAC7D,UAAM,mBAAmB,uBAAuB,QAAQ,OAAO;AAC/D,UAAM,kBAAkB,uBAAuB,QAAQ,MAAM;AAC7D,UAAM,oBAAoB,uBAAuB,QAAQ,QAAQ;AACjE,UAAM,oBAAoB,uBAAuB,QAAQ,QAAQ;AAEjE,UAAM,kBAAiF,CAAC;AAExF,QAAI,WAAW,QAAQ;AACrB,sBAAgB,KAAK,GAAG,kBAAkB,WAAW,QAAQ,WAAW,SAAS,CAAC,CAAC,CAAC;AAAA,IACtF;AAEA,QAAI,MAAM,eAAe;AACvB,sBAAgB,KAAK,GAAG,kBAAkB,MAAM,eAAe,WAAW,SAAS,CAAC,CAAC,CAAC;AAAA,IACxF;AAEA,QAAI,MAAM,KAAK;AACb,sBAAgB,KAAK,GAAG,kBAAkB,MAAM,KAAK,WAAW,SAAS,CAAC,CAAC,CAAC;AAAA,IAC9E;AAEA,QAAI,QAAQ,MAAM;AAChB,YAAM,SAAS,qBAAqB,QAAQ,MAAM,MAAM,MAAM,QAAQ,YAAY,CAAC,CAAC;AACpF,sBAAgB,KAAK,MAAM;AAAA,IAC7B;AAEA,WAAO,MAAM,EAAE,MAAM,UAAU,GAAG,iBAAiB,OAAO,KAAc,KAAe,SAAuB;AAC5G,UAAI;AACF,cAAM,mBAAmB,wBACrB,+BAA+B,OAAO,KAAK,qBAAqB,IAChE,gBAAgB,OAAO,KAAK,SAAS,SAAU;AACnD,YAAI,kBAAkB;AACpB,iBAAO,IAAI,OAAO,GAAG,EAAE,KAAK,uBAAuB,gBAAgB,CAAC;AAAA,QACtE;AAEA,cAAM,WAAW,YAAY,MAAM,cAAc;AACjD,cAAM,UAAU,SAAS,MAAM,UAAU;AAEzC,YAAI,OAAO,YAAY,YAAY;AACjC,gBAAM,IAAI,MAAM,UAAU,MAAM,UAAU,0BAA0B;AAAA,QACtE;AAEA,cAAM,OAAc,CAAC;AAErB,YAAI,MAAM,KAAK,MAAM;AACnB,gBAAM,eAAe,gBAAgB,QAAQ,gBAAgB,aAAa,aACtE,sBAAsB,IAAI,MAAM,YAAY,iBAAiB,QAAQ,WAAW,OAAO,IACvF,IAAI;AACR,eAAK,MAAM,KAAK,KAAK,KAAK,IAAI;AAAA,QAChC;AAEA,mBAAW,WAAW,MAAM,KAAK,MAAM;AACrC,gBAAM,WAAW,IAAI,OAAO,QAAQ,IAAI;AACxC,gBAAM,cAAc,wBAAwB,kBAAkB,QAAQ,QAAQ,IAAI,MAC5E,QAAQ,YAAY,eAAe,QAAQ,SAAS,IAAI,SACzD,eAAe,QAAQ,UAAU;AACtC,gBAAM,UAAU,iBAAiB,UAAU,aAAa,iBAAiB,QAAQ,WAAW,OAAO;AACnG,eAAK,QAAQ,KAAK,IAAI;AAAA,QACxB;AAEA,YAAI,MAAM,KAAK,MAAM,SAAS,GAAG;AAC/B,gBAAM,iBAAiB,MAAM,KAAK,MAAM,OAAO,OAAK,EAAE,eAAe,UAAU,YAAY;AAC3F,gBAAM,eAAe,MAAM,KAAK,MAAM,OAAO,OAAK,EAAE,eAAe,UAAU,YAAY;AAEzF,cAAI,eAAe,SAAS,GAAG;AAC7B,kBAAM,WAAW,kBAAkB,GAAG;AACtC,kBAAM,QAAQ,IAAI,IAAI,eAAe,IAAI,OAAK,EAAE,IAAI,CAAC;AACrD,kBAAM,aAAa,sBAAsB,UAAU,KAAK;AAExD,uBAAW,KAAK,gBAAgB;AAC9B,oBAAM,WAAW,WAAW,EAAE,IAAI;AAClC,oBAAM,cAAc,wBAAwB,kBAAkB,SAAS,EAAE,IAAI,MACvE,EAAE,YAAY,eAAe,EAAE,SAAS,IAAI,SAC7C,eAAe,EAAE,UAAU;AAChC,oBAAM,YAAY,aAAa,SAAY,CAAC,IAAI;AAChD,oBAAM,UAAU,iBAAiB,WAAW,aAAa,kBAAkB,QAAQ,WAAW,OAAO;AACrG,mBAAK,EAAE,KAAK,IAAI;AAAA,YAClB;AAAA,UACF;AAEA,cAAI,aAAa,SAAS,GAAG;AAC3B,kBAAM,kBAAkB,aAAa,CAAC,EAAE;AACxC,kBAAM,eAAe,aAAa,MAAM,OAAK,EAAE,UAAU,eAAe;AAExE,gBAAI,cAAc;AAChB,mBAAK,eAAe,IAAI,CAAC;AACzB,yBAAW,KAAK,cAAc;AAC5B,sBAAM,SAAS,gBAAgB,IAAI,MAAM,EAAE,IAAI,GAAG,CAAC;AACnD,sBAAM,cAAc,wBAAwB,kBAAkB,SAAS,EAAE,IAAI,MACvE,EAAE,YAAY,eAAe,EAAE,SAAS,IAAI,SAC7C,eAAe,EAAE,UAAU;AAChC,sBAAM,UAAU,iBAAiB,QAAQ,aAAa,kBAAkB,QAAQ,WAAW,OAAO;AAClG,qBAAK,eAAe,EAAE,EAAE,IAAI,IAAI;AAAA,cAClC;AAAA,YACF,OAAO;AACL,yBAAW,KAAK,cAAc;AAC5B,sBAAM,SAAS,gBAAgB,IAAI,MAAM,EAAE,IAAI,GAAG,CAAC;AACnD,sBAAM,cAAc,wBAAwB,kBAAkB,SAAS,EAAE,IAAI,MACvE,EAAE,YAAY,eAAe,EAAE,SAAS,IAAI,SAC7C,eAAe,EAAE,UAAU;AAChC,sBAAM,UAAU,iBAAiB,QAAQ,aAAa,kBAAkB,QAAQ,WAAW,OAAO;AAClG,qBAAK,EAAE,KAAK,IAAI;AAAA,cAClB;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAEA,YAAI,MAAM,KAAK,yBAAyB,MAAM;AAC5C,gBAAM,UAAU,IAAI,MAAM;AAC1B,gBAAM,cAAc,IAAI,MAAM;AAC9B,gBAAM,kBAAkB,MAAM,kBAAkB,mBAAmB;AACnE,gBAAM,OAAO,UAAU,SAAS,SAAS,EAAE,IAAI;AAC/C,gBAAM,WAAW,cAAc,SAAS,aAAa,EAAE,IAAI;AAC3D,eAAK,MAAM,KAAK,oBAAoB,IAAI,EAAE,MAAM,SAAS;AAAA,QAC3D;AAEA,YAAI,MAAM,KAAK,QAAQ,SAAS,GAAG;AACjC,gBAAM,mBAAmB,MAAM,KAAK,QAAQ,CAAC,EAAE;AAC/C,gBAAM,eAAe,MAAM,KAAK,QAAQ,MAAM,OAAK,EAAE,UAAU,gBAAgB;AAE/E,cAAI,cAAc;AAChB,iBAAK,gBAAgB,IAAI,CAAC;AAC1B,uBAAW,KAAK,MAAM,KAAK,SAAS;AAClC,oBAAM,cAAc,IAAI,QAAQ,EAAE,KAAK,YAAY,CAAC;AACpD,oBAAM,cAAc,wBAAwB,kBAAkB,UAAU,EAAE,IAAI,MACxE,EAAE,YAAY,eAAe,EAAE,SAAS,IAAI,SAC7C,eAAe,EAAE,UAAU;AAChC,oBAAM,UAAU,iBAAiB,aAAa,aAAa,mBAAmB,QAAQ,WAAW,OAAO;AACxG,mBAAK,gBAAgB,EAAE,EAAE,IAAI,IAAI,WAAW;AAAA,YAC9C;AAAA,UACF,OAAO;AACL,uBAAW,KAAK,MAAM,KAAK,SAAS;AAClC,oBAAM,cAAc,IAAI,QAAQ,EAAE,KAAK,YAAY,CAAC;AACpD,oBAAM,cAAc,wBAAwB,kBAAkB,UAAU,EAAE,IAAI,MACxE,EAAE,YAAY,eAAe,EAAE,SAAS,IAAI,SAC7C,eAAe,EAAE,UAAU;AAChC,oBAAM,UAAU,iBAAiB,aAAa,aAAa,mBAAmB,QAAQ,WAAW,OAAO;AACxG,mBAAK,EAAE,KAAK,IAAI,WAAW;AAAA,YAC7B;AAAA,UACF;AAAA,QACF;AAEA,YAAI,MAAM,KAAK,QAAQ,SAAS,GAAG;AACjC,gBAAM,mBAAmB,MAAM,KAAK,QAAQ,CAAC,EAAE;AAC/C,gBAAM,eAAe,MAAM,KAAK,QAAQ,MAAM,OAAK,EAAE,UAAU,gBAAgB;AAC/E,gBAAM,UAAU,aAAa,IAAI,QAAQ,MAAM;AAE/C,cAAI,cAAc;AAChB,iBAAK,gBAAgB,IAAI,CAAC;AAC1B,uBAAW,KAAK,MAAM,KAAK,SAAS;AAClC,oBAAM,cAAc,QAAQ,EAAE,IAAI;AAClC,oBAAM,cAAc,wBAAwB,kBAAkB,UAAU,EAAE,IAAI,MACxE,EAAE,YAAY,eAAe,EAAE,SAAS,IAAI,SAC7C,eAAe,EAAE,UAAU;AAChC,oBAAM,UAAU,iBAAiB,aAAa,aAAa,mBAAmB,QAAQ,WAAW,OAAO;AACxG,mBAAK,gBAAgB,EAAE,EAAE,IAAI,IAAI;AAAA,YACnC;AAAA,UACF,OAAO;AACL,uBAAW,KAAK,MAAM,KAAK,SAAS;AAClC,oBAAM,cAAc,QAAQ,EAAE,IAAI;AAClC,oBAAM,cAAc,wBAAwB,kBAAkB,UAAU,EAAE,IAAI,MACxE,EAAE,YAAY,eAAe,EAAE,SAAS,IAAI,SAC7C,eAAe,EAAE,UAAU;AAChC,oBAAM,UAAU,iBAAiB,aAAa,aAAa,mBAAmB,QAAQ,WAAW,OAAO;AACxG,mBAAK,EAAE,KAAK,IAAI;AAAA,YAClB;AAAA,UACF;AAAA,QACF;AAEA,YAAI,KAAK,WAAW,GAAG;AACrB,eAAK,KAAK,GAAG;AAAA,QACf;AAEA,cAAM,SAAS,MAAM,QAAQ,MAAM,UAAU,IAAI;AAEjD,cAAM,kBAAkB,MAAM,UAAU,CAAC;AACzC,cAAM,SAAS,iBAAiB,UAAU;AAE1C,YAAI,OAAO,MAAM,EAAE,KAAK,MAAM;AAAA,MAChC,SAAS,OAAO;AACd,aAAK,KAAK;AAAA,MACZ;AAAA,IACF,CAAC;AAAA,EACH;AAEA,SAAO;AACT;AAKA,SAAS,uBACP,QACA,UACqB;AACrB,QAAM,UAAU,OAAO,QAAQ;AAC/B,SAAO;AAAA,IACL,UAAU,WAAW,OAAO;AAAA,IAC5B,MAAM,WAAW,OAAO;AAAA,EAC1B;AACF;AAEA,SAAS,cAAcC,OAAsB;AAC3C,SAAOA,MAAK,QAAQ,aAAa,MAAM;AACzC;AAEA,SAAS,oBAAoB,SAAoB,OAA+B;AAC9E,QAAM,UAAU,cAAc,MAAM,QAAQ;AAC5C,QAAM,WAAW,QAAQ,QAAQ,OAAO;AACxC,MAAI,CAAC,SAAU,QAAO;AACtB,SAAO,SAAS,MAAM,WAAW,YAAY,CAAC,KAAK;AACrD;AAEA,SAAS,sBAAsB,WAA6D;AAC1F,QAAM,QAAQ,oBAAI,IAAqC;AACvD,QAAM,SAAS,WAAW,cAAc,CAAC;AACzC,aAAW,SAAS,QAAQ;AAC1B,QAAI,CAAC,OAAO,QAAQ,CAAC,OAAO,GAAI;AAChC,QAAI,MAAM,QAAQ;AAChB,YAAM,IAAI,GAAG,MAAM,EAAE,IAAI,MAAM,IAAI,IAAI,MAAM,MAAM;AAAA,IACrD;AAAA,EACF;AACA,SAAO;AACT;AAEA,SAAS,wBACP,OACA,UACA,MACgC;AAChC,SAAO,MAAM,IAAI,GAAG,QAAQ,IAAI,IAAI,EAAE,KAAK;AAC7C;AAEA,SAAS,qBAAqB,WAAuB,aAAsD;AACzG,QAAM,UAAU,WAAW,aAAa;AACxC,MAAI,CAAC,QAAS,QAAO;AAErB,MAAI,eAAe,QAAQ,WAAW,GAAG,QAAQ;AAC/C,WAAO,QAAQ,WAAW,EAAE;AAAA,EAC9B;AAEA,QAAM,QAAQ,OAAO,OAAO,OAAO,EAAE,CAAC;AACtC,SAAQ,OAAe,UAAU;AACnC;AAEA,SAAS,eAAe,YAAgE;AACtF,MAAI,CAAC,WAAY,QAAO;AACxB,SAAO,EAAE,MAAM,WAAW;AAC5B;AASA,SAAS,+BACP,OACA,KACA,YAC0B;AAC1B,QAAM,SAA4B,CAAC;AACnC,QAAM,YAAY,IAAI,IAAI,MAAM,KAAK,MAAM,OAAO,OAAK,EAAE,eAAe,UAAU,YAAY,EAAE,IAAI,OAAK,EAAE,IAAI,CAAC;AAChH,QAAM,aAAa,UAAU,OAAO,IAChC,sBAAsB,kBAAkB,GAAG,GAAG,SAAS,IACvD,CAAC;AAEL,MAAI,MAAM,KAAK,MAAM;AACnB,UAAM,YAAY,WAAW,MAAM,WAAW,GAAG;AACjD,QAAI,WAAW;AACb,YAAM,QAAQ,UAAU,IAAI,IAAI;AAChC,UAAI,CAAC,OAAO;AACV,cAAM,IAAI,WAAW,MAAM,WAAW,EAAE;AACxC,mBAAW,OAAO,EAAE,UAAU,CAAC,GAAG;AAChC,iBAAO,KAAK;AAAA,YACV,MAAM,SAAS,IAAI,YAAY;AAAA,YAC/B,SAAS,IAAI,WAAW;AAAA,YACxB,SAAS,IAAI;AAAA,YACb,QAAQ,IAAI;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,KAAK,MAAM,KAAK,OAAO;AAChC,UAAM,QAAQ,EAAE,eAAe,UAAU,eAAe,WAAW,EAAE,IAAI,IAAI,IAAI,MAAM,EAAE,IAAI;AAC7F,QAAI,UAAU,OAAW;AAEzB,UAAM,SAAS,eAAe,EAAE,UAAU,KAAK,CAAC;AAChD,UAAM,UAAU,iBAAiB,OAAO,QAAQ,EAAE,UAAU,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC;AACpF,QAAI,OAAO,KAAK,MAAM,EAAE,SAAS,KAAK,YAAY,QAAW;AAC3D,aAAO,KAAK;AAAA,QACV,MAAM,WAAW,EAAE,IAAI;AAAA,QACvB,SAAS;AAAA,QACT,SAAS;AAAA,QACT,QAAQ,CAAC;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAEA,aAAW,KAAK,MAAM,KAAK,MAAM;AAC/B,UAAM,QAAQ,IAAI,OAAO,EAAE,IAAI;AAC/B,QAAI,UAAU,OAAW;AAEzB,UAAM,SAAS,eAAe,EAAE,UAAU,KAAK,CAAC;AAChD,UAAM,UAAU,iBAAiB,OAAO,QAAQ,EAAE,UAAU,OAAO,MAAM,MAAM,GAAG,CAAC,CAAC;AACpF,QAAI,OAAO,KAAK,MAAM,EAAE,SAAS,KAAK,YAAY,QAAW;AAC3D,aAAO,KAAK;AAAA,QACV,MAAM,UAAU,EAAE,IAAI;AAAA,QACtB,SAAS;AAAA,QACT,SAAS;AAAA,QACT,QAAQ,CAAC;AAAA,MACX,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO,OAAO,SAAS,IAAI,SAAS;AACtC;AAEA,SAAS,gBACP,OACA,KACA,SACA,WAC0B;AAC1B,WAAS,eAAe,KAA6C;AACnE,QAAI,CAAC,IAAI,WAAW,uBAAuB,EAAG,QAAO;AACrD,UAAM,aAAa,IAAI,QAAQ,yBAAyB,EAAE;AAC1D,WAAO,QAAQ,WAAW,QAAQ,UAAU,KAAK;AAAA,EACnD;AAEA,QAAM,mBAAmB,oBAAoB,SAAS,KAAK;AAC3D,QAAM,mBAAmB,sBAAsB,gBAAgB;AAC/D,QAAM,YAAY,IAAI,IAAI,MAAM,KAAK,MAAM,OAAO,OAAK,EAAE,eAAe,UAAU,YAAY,EAAE,IAAI,OAAK,EAAE,IAAI,CAAC;AAChH,QAAM,aAAa,UAAU,OAAO,IAChC,sBAAsB,kBAAkB,GAAG,GAAG,SAAS,IACvD,CAAC;AAEL,QAAM,SAA4B,CAAC;AAEnC,MAAI,MAAM,KAAK,MAAM;AACnB,UAAM,aAAa,eAAe,MAAM,KAAK,KAAK,SAAS;AAC3D,QAAI,YAAY;AACd,YAAM,WAAW,UAAU,QAAQ,UAAU;AAC7C,YAAM,QAAQ,SAAS,IAAI,IAAI;AAC/B,UAAI,CAAC,OAAO;AACV,mBAAW,OAAO,SAAS,UAAU,CAAC,GAAG;AACvC,iBAAO,KAAK;AAAA,YACV,MAAM,SAAS,IAAI,YAAY;AAAA,YAC/B,SAAS,IAAI,WAAW;AAAA,YACxB,SAAS,IAAI;AAAA,YACb,QAAQ,IAAI;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,KAAK,MAAM,KAAK,OAAO;AAChC,UAAM,QAAQ,EAAE,eAAe,UAAU,eAAe,WAAW,EAAE,IAAI,IAAI,IAAI,MAAM,EAAE,IAAI;AAC7F,UAAM,gBAAgB,wBAAwB,kBAAkB,SAAS,EAAE,IAAI;AAC/E,QAAI,SAAkC,CAAC;AAEvC,QAAI,eAAe;AACjB,eAAS,cAAc,eAAe,QAAQ,WAAW,OAAO;AAAA,IAClE,OAAO;AACL,UAAI,EAAE,YAAY;AAChB,cAAM,OAAO,MAAM,QAAQ,EAAE,UAAU,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE;AAC/D,eAAO,OAAO;AAAA,MAChB;AAEA,UAAI,EAAE,aAAa,EAAE,UAAU,SAAS,QAAQ,GAAG;AACjD,cAAM,eAAe,eAAe,EAAE,SAAS;AAC/C,YAAI,cAAc;AAChB,iBAAO,OAAO,QAAQ,YAAY;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,iBAAiB,OAAO,QAAQ,EAAE,UAAU,OAAO,MAAM,MAAM,GAAG,QAAQ,WAAW,OAAO;AAE5G,QAAI,OAAO,KAAK,MAAM,EAAE,SAAS,KAAK,YAAY,QAAW;AAC3D,YAAM,WAAW,UAAU,QAAQ,MAAM;AACzC,YAAM,QAAQ,SAAS,OAAO;AAC9B,UAAI,CAAC,OAAO;AACV,mBAAW,OAAO,SAAS,UAAU,CAAC,GAAG;AACvC,iBAAO,KAAK;AAAA,YACV,MAAM,WAAW,EAAE,IAAI;AAAA,YACvB,SAAS,IAAI,WAAW;AAAA,YACxB,SAAS,IAAI;AAAA,YACb,QAAQ,IAAI;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,aAAW,KAAK,MAAM,KAAK,MAAM;AAC/B,UAAM,QAAQ,IAAI,OAAO,EAAE,IAAI;AAC/B,UAAM,gBAAgB,wBAAwB,kBAAkB,QAAQ,EAAE,IAAI;AAC9E,QAAI,SAAkC,CAAC;AAEvC,QAAI,eAAe;AACjB,eAAS,cAAc,eAAe,QAAQ,WAAW,OAAO;AAAA,IAClE,OAAO;AACL,UAAI,EAAE,YAAY;AAChB,cAAM,OAAO,MAAM,QAAQ,EAAE,UAAU,IAAI,EAAE,WAAW,CAAC,IAAI,EAAE;AAC/D,eAAO,OAAO;AAAA,MAChB;AAEA,UAAI,EAAE,aAAa,EAAE,UAAU,SAAS,QAAQ,GAAG;AACjD,cAAM,eAAe,eAAe,EAAE,SAAS;AAC/C,YAAI,cAAc;AAChB,iBAAO,OAAO,QAAQ,YAAY;AAAA,QACpC;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAU,iBAAiB,OAAO,QAAQ,EAAE,UAAU,OAAO,MAAM,MAAM,GAAG,QAAQ,WAAW,OAAO;AAE5G,QAAI,OAAO,KAAK,MAAM,EAAE,SAAS,KAAK,YAAY,QAAW;AAC3D,YAAM,WAAW,UAAU,QAAQ,MAAM;AACzC,YAAM,QAAQ,SAAS,OAAO;AAC9B,UAAI,CAAC,OAAO;AACV,mBAAW,OAAO,SAAS,UAAU,CAAC,GAAG;AACvC,iBAAO,KAAK;AAAA,YACV,MAAM,UAAU,EAAE,IAAI;AAAA,YACtB,SAAS,IAAI,WAAW;AAAA,YACxB,SAAS,IAAI;AAAA,YACb,QAAQ,IAAI;AAAA,UACd,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,OAAO,SAAS,IAAI,SAAS;AACtC;AAEA,SAAS,cACP,QACA,YACA,OAAoB,oBAAI,IAAI,GACH;AACzB,QAAM,MAAM,OAAO;AACnB,MAAI,OAAO,QAAQ,YAAY,CAAC,IAAI,WAAW,uBAAuB,GAAG;AACvE,WAAO;AAAA,EACT;AAEA,QAAM,OAAO,IAAI,QAAQ,yBAAyB,EAAE;AACpD,MAAI,KAAK,IAAI,IAAI,EAAG,QAAO;AAE3B,QAAM,OAAO,WAAW,IAAI;AAC5B,MAAI,CAAC,KAAM,QAAO;AAElB,OAAK,IAAI,IAAI;AACb,SAAO,cAAc,MAAM,YAAY,IAAI;AAC7C;AAEA,SAAS,sBACP,OACA,QACA,cACA,YACK;AACL,MAAI,CAAC,UAAW,CAAC,aAAa,QAAQ,CAAC,aAAa,SAAW,QAAO;AACtE,SAAO,iBAAiB,OAAO,QAAQ,cAAc,YAAY,EAAE,kBAAkB,MAAM,CAAC;AAC9F;AAEA,SAAS,iBACP,OACA,QACA,cACA,YACK;AACL,MAAI,CAAC,OAAQ,QAAO;AACpB,SAAO,iBAAiB,OAAO,QAAQ,cAAc,YAAY,EAAE,kBAAkB,KAAK,CAAC;AAC7F;AAEA,SAAS,iBACP,OACA,QACA,cACA,YACA,SACK;AACL,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAClD,MAAI,iBAAiB,KAAM,QAAO;AAElC,QAAM,WAAW,cAAc,QAAQ,UAAU;AACjD,QAAM,WAAW,SAAS,gBAAgB;AAC1C,QAAM,gBAAgB,aAAa,OAAO,OAAO,aAAa,QAAQ,QAAQ,aAAa;AAC3F,QAAM,YAAY,aAAa,OAAO,OAAO,aAAa,QAAQ,QAAQ,aAAa;AAEvF,QAAM,WAAW,iBAAiB,OAAO,UAAU,eAAe,SAAS;AAC3E,MAAI,aAAa,MAAO,QAAO;AAE/B,QAAM,QAAQ,SAAS;AACvB,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,QAAI,MAAM;AACV,eAAW,SAAS,OAAO;AACzB,YAAM,iBAAiB,KAAK,OAAkC,EAAE,UAAU,eAAe,MAAM,UAAU,GAAG,YAAY,OAAO;AAAA,IACjI;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAY,SAAS,SAAS,SAAS;AAC7C,MAAI,MAAM,QAAQ,QAAQ,GAAG;AAC3B,eAAW,SAAS,UAAU;AAC5B,YAAM,MAAM,iBAAiB,OAAO,OAAO,EAAE,UAAU,eAAe,MAAM,UAAU,GAAG,YAAY,OAAO;AAC5G,UAAI,QAAQ,MAAO,QAAO;AAAA,IAC5B;AAAA,EACF;AAEA,QAAM,aAAa,SAAS;AAC5B,QAAM,QAAQ,MAAM,QAAQ,UAAU,IAAI,aAAa,aAAa,CAAC,UAAU,IAAI,CAAC;AAEpF,OAAK,MAAM,SAAS,OAAO,KAAK,SAAS,UAAU,MAAM,QAAQ,KAAK,GAAG;AACvE,UAAM,aAAc,SAAS,SAAiD,CAAC;AAC/E,WAAO,MAAM,IAAI,UAAQ,iBAAiB,MAAM,YAAY,EAAE,UAAU,eAAe,MAAM,UAAU,GAAG,YAAY,OAAO,CAAC;AAAA,EAChI;AAEA,OAAK,MAAM,SAAS,QAAQ,KAAK,SAAS,cAAc,SAAS,yBAAyB,cAAc,KAAK,GAAG;AAC9G,UAAM,QAAQ,SAAS;AACvB,UAAM,MAA+B,EAAE,GAAG,MAAM;AAEhD,QAAI,OAAO;AACT,iBAAW,CAAC,KAAK,UAAU,KAAK,OAAO,QAAQ,KAAK,GAAG;AACrD,YAAI,OAAO,UAAU,eAAe,KAAK,OAAO,GAAG,GAAG;AACpD,cAAI,GAAG,IAAI,iBAAkB,MAAc,GAAG,GAAG,YAAY,EAAE,UAAU,eAAe,MAAM,UAAU,GAAG,YAAY,OAAO;AAAA,QAChI;AAAA,MACF;AAAA,IACF;AAEA,UAAM,aAAa,SAAS;AAC5B,QAAI,cAAc,OAAO,eAAe,UAAU;AAChD,iBAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAChD,YAAI,SAAS,OAAO,UAAU,eAAe,KAAK,OAAO,GAAG,EAAG;AAC/D,YAAI,GAAG,IAAI,iBAAiB,OAAO,YAAuC,EAAE,UAAU,eAAe,MAAM,UAAU,GAAG,YAAY,OAAO;AAAA,MAC7I;AAAA,IACF;AAEA,WAAO;AAAA,EACT;AAEA,MAAI,QAAQ,kBAAkB;AAC5B,WAAO,qBAAqB,OAAO,KAAK;AAAA,EAC1C;AAEA,SAAO;AACT;AAEA,SAAS,iBACP,OACA,QACA,eACA,WACK;AACL,MAAI,OAAO,UAAU,SAAU,QAAO;AAEtC,QAAM,SAAS,OAAO;AACtB,QAAM,aAAa,OAAO;AAC1B,QAAM,QAAQ,MAAM,QAAQ,UAAU,IAAI,aAAa,aAAa,CAAC,UAAU,IAAI,CAAC;AACpF,QAAM,eAAe,MAAM,WAAW,KAAK,MAAM,SAAS,QAAQ;AAElE,MAAI,WAAW,eAAe,iBAAiB,cAAc;AAC3D,UAAM,SAAS,IAAI,KAAK,KAAK;AAC7B,QAAI,OAAO,MAAM,OAAO,QAAQ,CAAC,GAAG;AAClC,YAAM,IAAI,MAAM,sBAAsB,KAAK,EAAE;AAAA,IAC/C;AACA,WAAO;AAAA,EACT;AAEA,MAAI,WAAW,UAAU,aAAa,cAAc;AAClD,QAAI,CAAC,sBAAsB,KAAK,KAAK,GAAG;AACtC,YAAM,IAAI,MAAM,iBAAiB,KAAK,EAAE;AAAA,IAC1C;AACA,UAAM,SAAS,oBAAI,KAAK,GAAG,KAAK,gBAAgB;AAChD,QAAI,OAAO,MAAM,OAAO,QAAQ,CAAC,GAAG;AAClC,YAAM,IAAI,MAAM,iBAAiB,KAAK,EAAE;AAAA,IAC1C;AACA,WAAO;AAAA,EACT;AAEA,SAAO;AACT;AAEA,SAAS,qBAAqB,OAAY,OAAsB;AAC9D,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAElD,MAAI,MAAM,SAAS,QAAQ,KAAK,MAAM,SAAS,SAAS,GAAG;AACzD,UAAM,MAAM,OAAO,KAAK;AACxB,QAAI,OAAO,MAAM,GAAG,GAAG;AACrB,YAAM,IAAI,MAAM,mBAAmB,KAAK,EAAE;AAAA,IAC5C;AACA,WAAO;AAAA,EACT;AAEA,MAAI,MAAM,SAAS,SAAS,GAAG;AAC7B,QAAI,UAAU,OAAQ,QAAO;AAC7B,QAAI,UAAU,QAAS,QAAO;AAC9B,QAAI,OAAO,UAAU,UAAW,QAAO;AACvC,UAAM,IAAI,MAAM,oBAAoB,KAAK,EAAE;AAAA,EAC7C;AAEA,SAAO;AACT;AAEA,SAAS,cAAc,OAAkD;AACvE,MAAI,CAAC,SAAS,OAAO,UAAU,YAAY,MAAM,QAAQ,KAAK,EAAG,QAAO;AACxE,QAAM,QAAQ,OAAO,eAAe,KAAK;AACzC,SAAO,UAAU,OAAO,aAAa,UAAU;AACjD;AAEA,SAAS,gBAAgB,OAAY,OAAuG;AAC1I,MAAI,UAAU,UAAa,UAAU,KAAM,QAAO;AAElD,QAAM,UAAU,MAAM,QAAQ,MAAM,UAAU,IAC1C,MAAM,WAAW,SAAS,OAAO,IACjC,MAAM,eAAe;AAEzB,MAAI,CAAC,QAAS,QAAO;AAErB,QAAM,QAAQ,MAAM,eAAe,SAAS;AAC5C,QAAM,UAAU,MAAM,eAAe,WAAW;AAEhD,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO;AAAA,EACT;AAEA,MAAI,UAAU,QAAQ;AACpB,QAAI,SAAS;AACX,aAAO;AAAA,IACT;AACA,WAAO,MAAM,MAAM,GAAG;AAAA,EACxB;AAEA,MAAI,UAAU,kBAAkB;AAC9B,WAAO,MAAM,MAAM,GAAG;AAAA,EACxB;AAEA,MAAI,UAAU,iBAAiB;AAC7B,WAAO,MAAM,MAAM,GAAG;AAAA,EACxB;AAEA,SAAO;AACT;AAEA,SAAS,kBAAkB,KAAsB;AAC/C,QAAM,MAAM,IAAI,eAAe,IAAI,OAAO;AAC1C,QAAM,QAAQ,IAAI,QAAQ,GAAG;AAC7B,MAAI,UAAU,GAAI,QAAO;AACzB,SAAO,IAAI,MAAM,QAAQ,CAAC;AAC5B;AAEA,SAAS,sBACP,UACA,OACyB;AACzB,QAAM,MAA+B,CAAC;AACtC,MAAI,CAAC,YAAY,MAAM,SAAS,EAAG,QAAO;AAE1C,QAAM,SAAS,IAAI,gBAAgB,QAAQ;AAC3C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG;AAC3C,UAAMA,QAAO,iBAAiB,GAAG;AACjC,QAAIA,MAAK,WAAW,EAAG;AACvB,UAAM,OAAOA,MAAK,CAAC;AACnB,QAAI,CAAC,MAAM,IAAI,IAAI,EAAG;AACtB,oBAAgB,KAAKA,OAAM,KAAK;AAAA,EAClC;AAEA,SAAO;AACT;AAEA,SAAS,iBAAiB,KAAuB;AAC/C,QAAM,QAAkB,CAAC;AACzB,MAAI,UAAU;AAEd,WAAS,IAAI,GAAG,IAAI,IAAI,QAAQ,KAAK;AACnC,UAAM,KAAK,IAAI,CAAC;AAChB,QAAI,OAAO,KAAK;AACd,UAAI,QAAS,OAAM,KAAK,OAAO;AAC/B,gBAAU;AACV;AAAA,IACF;AACA,QAAI,OAAO,KAAK;AACd,UAAI,QAAS,OAAM,KAAK,OAAO;AAC/B,gBAAU;AACV;AAAA,IACF;AACA,eAAW;AAAA,EACb;AAEA,MAAI,QAAS,OAAM,KAAK,OAAO;AAC/B,SAAO;AACT;AAEA,SAAS,gBACP,QACAA,OACA,OACM;AACN,MAAI,SAAkC;AAEtC,WAAS,IAAI,GAAG,IAAIA,MAAK,QAAQ,KAAK;AACpC,UAAM,MAAMA,MAAK,CAAC;AAClB,QAAI,CAAC,IAAK;AACV,UAAM,SAAS,MAAMA,MAAK,SAAS;AAEnC,QAAI,QAAQ;AACV,YAAM,WAAW,OAAO,GAAG;AAC3B,UAAI,aAAa,QAAW;AAC1B,eAAO,GAAG,IAAI;AAAA,MAChB,WAAW,MAAM,QAAQ,QAAQ,GAAG;AAClC,iBAAS,KAAK,KAAK;AAAA,MACrB,OAAO;AACL,eAAO,GAAG,IAAI,CAAC,UAAqB,KAAK;AAAA,MAC3C;AACA;AAAA,IACF;AAEA,UAAM,OAAO,OAAO,GAAG;AACvB,QAAI,CAAC,cAAc,IAAI,GAAG;AACxB,aAAO,GAAG,IAAI,CAAC;AAAA,IACjB;AACA,aAAS,OAAO,GAAG;AAAA,EACrB;AACF;AAEA,SAAS,aAAa,cAA0D;AAC9E,MAAI,CAAC,aAAc,QAAO,CAAC;AAE3B,QAAM,UAAkC,CAAC;AACzC,QAAM,QAAQ,aAAa,MAAM,GAAG;AAEpC,aAAW,QAAQ,OAAO;AACxB,UAAM,CAAC,MAAM,GAAG,UAAU,IAAI,KAAK,KAAK,EAAE,MAAM,GAAG;AACnD,QAAI,MAAM;AACR,cAAQ,IAAI,IAAI,WAAW,KAAK,GAAG;AAAA,IACrC;AAAA,EACF;AAEA,SAAO;AACT;AAIO,SAAS,aAAa,UAA+B,CAAC,GAAW;AACtE,QAAM;AAAA,IACJ,eAAe;AAAA,IACf,WAAW;AAAA,IACX,SAAS;AAAA,IACT,iBAAiB,CAAC;AAAA,EACpB,IAAI;AAEJ,QAAM,SAAS,OAAO;AAEtB,SAAO,IAAI,UAAU,CAAC,KAAK,QAAQ;AACjC,UAAM,cAAc,WAAW,YAAY,IACvC,QAAQ,cAAc,cAAc,IACpC,QAAQ,QAAQ,IAAI,GAAG,cAAc,cAAc;AAEvD,UAAM,UAAU,aAAa,aAAa,OAAO;AACjD,QAAI,UAAU,gBAAgB,kBAAkB;AAChD,QAAI,KAAK,OAAO;AAAA,EAClB,CAAC;AAED,SAAO,IAAI,QAAQ,UAAU,OAAO,UAAU,MAAM,MAAM;AAAA,IACxD,gBAAgB;AAAA,MACd,KAAK;AAAA,MACL,GAAG;AAAA,IACL;AAAA,EACF,CAAC,CAAC;AAEF,SAAO;AACT;","names":["path","path","path","resolve","path"]}
|
package/dist/http.d.ts
CHANGED
|
@@ -27,6 +27,16 @@ export type Query<T = any> = T;
|
|
|
27
27
|
export type Body<T = any> = T;
|
|
28
28
|
export type Headers<T = any> = T;
|
|
29
29
|
export type Cookies<T = any> = T;
|
|
30
|
+
export interface PaginationParams {
|
|
31
|
+
page: number;
|
|
32
|
+
pageSize: number;
|
|
33
|
+
}
|
|
34
|
+
export type PaginatedResponse<T> = {
|
|
35
|
+
items: T[];
|
|
36
|
+
totalItems: number;
|
|
37
|
+
page: number;
|
|
38
|
+
pageSize: number;
|
|
39
|
+
};
|
|
30
40
|
export { ADORN_META };
|
|
31
41
|
export type { HttpMetadata, QueryStyleOptions, FilePartOptions };
|
|
32
42
|
//# 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,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,UAAU,iBAAiB;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,eAAe,GAAG,YAAY,CAAC;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,UAAU,eAAe;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAWD,MAAM,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAE3C,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,IAClC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAChD,SAAS,CAAC,EACV,SAAS,2BAA2B,CAAC,GAAG,EAAE,CAAC,CAAC,KAC3C,IAAI,CAMR;AAED,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,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC"}
|
|
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,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IAChD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IAC5C,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED,UAAU,iBAAiB;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,gBAAgB,GAAG,eAAe,GAAG,YAAY,CAAC;IACnE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,UAAU,eAAe;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC;AAWD,MAAM,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAE3C,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,IAClC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EAChD,SAAS,CAAC,EACV,SAAS,2BAA2B,CAAC,GAAG,EAAE,CAAC,CAAC,KAC3C,IAAI,CAMR;AAED,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,iBAAiB,EAAE,eAAe,EAAE,CAAC"}
|
package/dist/index.cjs
CHANGED
|
@@ -58,6 +58,7 @@ __export(index_exports, {
|
|
|
58
58
|
MinLength: () => MinLength,
|
|
59
59
|
MinProperties: () => MinProperties,
|
|
60
60
|
MultipleOf: () => MultipleOf,
|
|
61
|
+
Paginated: () => Paginated,
|
|
61
62
|
PartType: () => PartType,
|
|
62
63
|
Patch: () => Patch,
|
|
63
64
|
Pattern: () => Pattern,
|
|
@@ -214,6 +215,29 @@ function Public() {
|
|
|
214
215
|
};
|
|
215
216
|
}
|
|
216
217
|
|
|
218
|
+
// src/decorators/Paginated.ts
|
|
219
|
+
function Paginated(options = {}) {
|
|
220
|
+
return function(_target, context) {
|
|
221
|
+
if (context.kind !== "method") {
|
|
222
|
+
throw new Error("@Paginated decorator can only be applied to methods");
|
|
223
|
+
}
|
|
224
|
+
const methodName = String(context.name);
|
|
225
|
+
const bucket = getBucket(context.metadata);
|
|
226
|
+
let op = bucket.ops.find((op2) => op2.methodName === methodName);
|
|
227
|
+
if (!op) {
|
|
228
|
+
op = {
|
|
229
|
+
httpMethod: "GET",
|
|
230
|
+
path: "/",
|
|
231
|
+
methodName
|
|
232
|
+
};
|
|
233
|
+
bucket.ops.push(op);
|
|
234
|
+
}
|
|
235
|
+
op.pagination = {
|
|
236
|
+
defaultPageSize: options.defaultPageSize ?? 10
|
|
237
|
+
};
|
|
238
|
+
};
|
|
239
|
+
}
|
|
240
|
+
|
|
217
241
|
// src/runtime/metadata/read.ts
|
|
218
242
|
function readAdornBucket(ctor) {
|
|
219
243
|
const metaSym = Symbol.metadata;
|
|
@@ -553,6 +577,7 @@ function getArtifactCacheStats() {
|
|
|
553
577
|
MinLength,
|
|
554
578
|
MinProperties,
|
|
555
579
|
MultipleOf,
|
|
580
|
+
Paginated,
|
|
556
581
|
PartType,
|
|
557
582
|
Patch,
|
|
558
583
|
Pattern,
|