adorn-api 1.0.7 → 1.0.8

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/express.js CHANGED
@@ -471,24 +471,40 @@ async function createExpressRouter(options) {
471
471
  args[pathArg.index] = coerced;
472
472
  }
473
473
  if (route.args.query.length > 0) {
474
- const firstQueryIndex = route.args.query[0].index;
475
- const allSameIndex = route.args.query.every((q) => q.index === firstQueryIndex);
476
- if (allSameIndex) {
477
- args[firstQueryIndex] = {};
478
- for (const q of route.args.query) {
479
- const parsed = parseQueryValue(req.query[q.name], q);
480
- const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, "query", q.name) ?? (q.schemaRef ? getSchemaByRef(q.schemaRef) : null) ?? schemaFromType(q.schemaType);
481
- const coerced = coerceParamValue(parsed, paramSchema, coerceQueryDates, openapi.components.schemas);
482
- args[firstQueryIndex][q.name] = coerced;
483
- }
484
- } else {
485
- for (const q of route.args.query) {
486
- const parsed = parseQueryValue(req.query[q.name], q);
474
+ const deepObjectArgs = route.args.query.filter((q) => q.serialization?.style === "deepObject");
475
+ const standardArgs = route.args.query.filter((q) => q.serialization?.style !== "deepObject");
476
+ if (deepObjectArgs.length > 0) {
477
+ const rawQuery = getRawQueryString(req);
478
+ const names = new Set(deepObjectArgs.map((q) => q.name));
479
+ const parsedDeep = parseDeepObjectParams(rawQuery, names);
480
+ for (const q of deepObjectArgs) {
481
+ const rawValue = parsedDeep[q.name];
487
482
  const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, "query", q.name) ?? (q.schemaRef ? getSchemaByRef(q.schemaRef) : null) ?? schemaFromType(q.schemaType);
488
- const coerced = coerceParamValue(parsed, paramSchema, coerceQueryDates, openapi.components.schemas);
483
+ const baseValue = rawValue === void 0 ? {} : rawValue;
484
+ const coerced = coerceParamValue(baseValue, paramSchema, coerceQueryDates, openapi.components.schemas);
489
485
  args[q.index] = coerced;
490
486
  }
491
487
  }
488
+ if (standardArgs.length > 0) {
489
+ const firstQueryIndex = standardArgs[0].index;
490
+ const allSameIndex = standardArgs.every((q) => q.index === firstQueryIndex);
491
+ if (allSameIndex) {
492
+ args[firstQueryIndex] = {};
493
+ for (const q of standardArgs) {
494
+ const parsed = parseQueryValue(req.query[q.name], q);
495
+ const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, "query", q.name) ?? (q.schemaRef ? getSchemaByRef(q.schemaRef) : null) ?? schemaFromType(q.schemaType);
496
+ const coerced = coerceParamValue(parsed, paramSchema, coerceQueryDates, openapi.components.schemas);
497
+ args[firstQueryIndex][q.name] = coerced;
498
+ }
499
+ } else {
500
+ for (const q of standardArgs) {
501
+ const parsed = parseQueryValue(req.query[q.name], q);
502
+ const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, "query", q.name) ?? (q.schemaRef ? getSchemaByRef(q.schemaRef) : null) ?? schemaFromType(q.schemaType);
503
+ const coerced = coerceParamValue(parsed, paramSchema, coerceQueryDates, openapi.components.schemas);
504
+ args[q.index] = coerced;
505
+ }
506
+ }
507
+ }
492
508
  }
493
509
  if (route.args.headers.length > 0) {
494
510
  const firstHeaderIndex = route.args.headers[0].index;
@@ -590,6 +606,8 @@ function schemaFromType(schemaType) {
590
606
  }
591
607
  function validateRequestWithPrecompiled(route, req, validators) {
592
608
  const errors = [];
609
+ const deepNames = new Set(route.args.query.filter((q) => q.serialization?.style === "deepObject").map((q) => q.name));
610
+ const deepValues = deepNames.size > 0 ? parseDeepObjectParams(getRawQueryString(req), deepNames) : {};
593
611
  if (route.args.body) {
594
612
  const validator = validators[route.operationId]?.body;
595
613
  if (validator) {
@@ -608,7 +626,7 @@ function validateRequestWithPrecompiled(route, req, validators) {
608
626
  }
609
627
  }
610
628
  for (const q of route.args.query) {
611
- const value = req.query[q.name];
629
+ const value = q.serialization?.style === "deepObject" ? deepValues[q.name] : req.query[q.name];
612
630
  if (value === void 0) continue;
613
631
  const schema = schemaFromType(q.schemaType) ?? {};
614
632
  const coerced = coerceParamValue(value, schema, { dateTime: false, date: false }, {});
@@ -645,6 +663,8 @@ function validateRequest(route, req, openapi, validator) {
645
663
  }
646
664
  const openapiOperation = getOpenApiOperation(openapi, route);
647
665
  const paramSchemaIndex = buildParamSchemaIndex(openapiOperation);
666
+ const deepNames = new Set(route.args.query.filter((q) => q.serialization?.style === "deepObject").map((q) => q.name));
667
+ const deepValues = deepNames.size > 0 ? parseDeepObjectParams(getRawQueryString(req), deepNames) : {};
648
668
  const errors = [];
649
669
  if (route.args.body) {
650
670
  const bodySchema = getSchemaByRef(route.args.body.schemaRef);
@@ -664,7 +684,7 @@ function validateRequest(route, req, openapi, validator) {
664
684
  }
665
685
  }
666
686
  for (const q of route.args.query) {
667
- const value = req.query[q.name];
687
+ const value = q.serialization?.style === "deepObject" ? deepValues[q.name] : req.query[q.name];
668
688
  const openapiSchema = getParamSchemaFromIndex(paramSchemaIndex, "query", q.name);
669
689
  let schema = {};
670
690
  if (openapiSchema) {
@@ -877,6 +897,69 @@ function parseQueryValue(value, param) {
877
897
  }
878
898
  return value;
879
899
  }
900
+ function getRawQueryString(req) {
901
+ const url = req.originalUrl ?? req.url ?? "";
902
+ const index = url.indexOf("?");
903
+ if (index === -1) return "";
904
+ return url.slice(index + 1);
905
+ }
906
+ function parseDeepObjectParams(rawQuery, names) {
907
+ const out = {};
908
+ if (!rawQuery || names.size === 0) return out;
909
+ const params = new URLSearchParams(rawQuery);
910
+ for (const [key, value] of params.entries()) {
911
+ const path3 = parseBracketPath(key);
912
+ if (path3.length === 0) continue;
913
+ const root = path3[0];
914
+ if (!names.has(root)) continue;
915
+ assignDeepValue(out, path3, value);
916
+ }
917
+ return out;
918
+ }
919
+ function parseBracketPath(key) {
920
+ const parts = [];
921
+ let current = "";
922
+ for (let i = 0; i < key.length; i++) {
923
+ const ch = key[i];
924
+ if (ch === "[") {
925
+ if (current) parts.push(current);
926
+ current = "";
927
+ continue;
928
+ }
929
+ if (ch === "]") {
930
+ if (current) parts.push(current);
931
+ current = "";
932
+ continue;
933
+ }
934
+ current += ch;
935
+ }
936
+ if (current) parts.push(current);
937
+ return parts;
938
+ }
939
+ function assignDeepValue(target, path3, value) {
940
+ let cursor = target;
941
+ for (let i = 0; i < path3.length; i++) {
942
+ const key = path3[i];
943
+ if (!key) continue;
944
+ const isLast = i === path3.length - 1;
945
+ if (isLast) {
946
+ const existing = cursor[key];
947
+ if (existing === void 0) {
948
+ cursor[key] = value;
949
+ } else if (Array.isArray(existing)) {
950
+ existing.push(value);
951
+ } else {
952
+ cursor[key] = [existing, value];
953
+ }
954
+ return;
955
+ }
956
+ const next = cursor[key];
957
+ if (!isPlainObject(next)) {
958
+ cursor[key] = {};
959
+ }
960
+ cursor = cursor[key];
961
+ }
962
+ }
880
963
  function parseCookies(cookieHeader) {
881
964
  if (!cookieHeader) return {};
882
965
  const cookies = {};
@@ -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) {\r\n const firstQueryIndex = route.args.query[0].index;\r\n const allSameIndex = route.args.query.every(q => q.index === firstQueryIndex);\r\n\r\n if (allSameIndex) {\r\n args[firstQueryIndex] = {};\n for (const q of route.args.query) {\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 route.args.query) {\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\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(\r\n route: BoundRoute,\r\n req: Request,\r\n validators: Record<string, { body?: (data: unknown) => boolean; response: Record<string, (data: unknown) => boolean> }>\r\n): ValidationError[] | null {\r\n const errors: ValidationError[] = [];\r\n\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 = 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\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 = 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 {\r\n if (value === undefined || value === null) return value;\r\n\r\n const isArray = Array.isArray(param.schemaType)\r\n ? param.schemaType.includes(\"array\")\r\n : param.schemaType === \"array\";\r\n\r\n if (!isArray) return value;\r\n\r\n const style = param.serialization?.style ?? \"form\";\r\n const explode = param.serialization?.explode ?? true;\r\n\r\n if (Array.isArray(value)) {\r\n return value;\r\n }\r\n\r\n if (style === \"form\") {\r\n if (explode) {\r\n return value;\r\n }\r\n return value.split(\",\");\r\n }\r\n\r\n if (style === \"spaceDelimited\") {\r\n return value.split(\" \");\r\n }\r\n\r\n if (style === \"pipeDelimited\") {\r\n return value.split(\"|\");\r\n }\r\n\r\n return value;\r\n}\r\n\r\nfunction parseCookies(cookieHeader: string | undefined): Record<string, string> {\r\n if (!cookieHeader) return {};\r\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\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":";;;;;;;;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;AAqBnB,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,MACxB,CAAC;AAAA,IACH;AAAA,EACF;AAEA,SAAO;AACT;;;AC/IA,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,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
@@ -17,12 +17,15 @@ interface FilePartOptions {
17
17
  headers?: Record<string, string>;
18
18
  }
19
19
  export type QueryStyle = QueryStyleOptions;
20
- export declare function QueryStyle(options: QueryStyleOptions): ParameterDecorator;
20
+ export declare function QueryStyle(options: QueryStyleOptions): <T extends (...args: any[]) => any>(_target: T, context: ClassMethodDecoratorContext<any, T>) => void;
21
21
  export type PartType = FilePartOptions;
22
22
  export declare function PartType(contentTypeOrOptions: string | FilePartOptions): PropertyDecorator;
23
23
  export declare function File(): PropertyDecorator;
24
24
  export declare function Consumes(...contentTypes: string[]): ClassDecorator;
25
25
  export declare function Produces(...contentTypes: string[]): ClassDecorator;
26
+ export type Query<T = any> = T;
27
+ export type Body<T = any> = T;
28
+ export type Headers<T = any> = T;
26
29
  export type Cookies<T = any> = T;
27
30
  export { ADORN_META };
28
31
  export type { HttpMetadata, QueryStyleOptions, FilePartOptions };
@@ -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;AAYD,MAAM,MAAM,UAAU,GAAG,iBAAiB,CAAC;AAE3C,wBAAgB,UAAU,CAAC,OAAO,EAAE,iBAAiB,GAAG,kBAAkB,CAMzE;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,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,OAAO,EAAE,UAAU,EAAE,CAAC;AACtB,YAAY,EAAE,YAAY,EAAE,iBAAiB,EAAE,eAAe,EAAE,CAAC"}
package/dist/index.cjs CHANGED
@@ -404,15 +404,17 @@ function formatValidationErrors(errors) {
404
404
  // src/http.ts
405
405
  var ADORN_META3 = /* @__PURE__ */ Symbol.for("adorn-api.metadata");
406
406
  function getMetadata(target) {
407
- const metadata = target[ADORN_META3] ?? {};
408
- target[ADORN_META3] = metadata;
407
+ const host = target;
408
+ const metadata = host[ADORN_META3] ?? {};
409
+ host[ADORN_META3] = metadata;
409
410
  return metadata;
410
411
  }
411
412
  function QueryStyle(options) {
412
- return function(_target, _propertyKey, _parameterIndex) {
413
- const metadata = getMetadata(_target);
413
+ return function(_target, context) {
414
+ if (context.private || context.static) return;
415
+ const metadata = getMetadata(context.metadata);
414
416
  metadata.queryStyles ??= {};
415
- metadata.queryStyles[_propertyKey.toString()] = options;
417
+ metadata.queryStyles[String(context.name)] = options;
416
418
  };
417
419
  }
418
420
  function PartType(contentTypeOrOptions) {