adorn-api 1.0.7 → 1.0.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -2
- package/dist/adapter/express/index.d.ts.map +1 -1
- package/dist/cli.cjs +125 -34
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.js +124 -33
- package/dist/cli.js.map +1 -1
- package/dist/compiler/analyze/extractQueryStyle.d.ts +8 -0
- package/dist/compiler/analyze/extractQueryStyle.d.ts.map +1 -0
- package/dist/compiler/manifest/emit.d.ts.map +1 -1
- package/dist/compiler/schema/openapi.d.ts.map +1 -1
- package/dist/express.cjs +99 -16
- package/dist/express.cjs.map +1 -1
- package/dist/express.js +99 -16
- package/dist/express.js.map +1 -1
- package/dist/http.d.ts +4 -1
- package/dist/http.d.ts.map +1 -1
- package/dist/index.cjs +7 -5
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7 -5
- package/dist/index.js.map +1 -1
- package/dist/metal/index.cjs.map +1 -1
- package/dist/metal/index.d.ts +1 -0
- package/dist/metal/index.d.ts.map +1 -1
- package/dist/metal/searchWhere.d.ts +47 -0
- package/dist/metal/searchWhere.d.ts.map +1 -0
- package/dist/scripts/adorn-example.cjs +28 -4
- package/dist/scripts/adorn-example.cjs.map +1 -1
- package/package.json +4 -4
package/dist/express.cjs
CHANGED
|
@@ -506,24 +506,40 @@ async function createExpressRouter(options) {
|
|
|
506
506
|
args[pathArg.index] = coerced;
|
|
507
507
|
}
|
|
508
508
|
if (route.args.query.length > 0) {
|
|
509
|
-
const
|
|
510
|
-
const
|
|
511
|
-
if (
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
509
|
+
const deepObjectArgs = route.args.query.filter((q) => q.serialization?.style === "deepObject");
|
|
510
|
+
const standardArgs = route.args.query.filter((q) => q.serialization?.style !== "deepObject");
|
|
511
|
+
if (deepObjectArgs.length > 0) {
|
|
512
|
+
const rawQuery = getRawQueryString(req);
|
|
513
|
+
const names = new Set(deepObjectArgs.map((q) => q.name));
|
|
514
|
+
const parsedDeep = parseDeepObjectParams(rawQuery, names);
|
|
515
|
+
for (const q of deepObjectArgs) {
|
|
516
|
+
const rawValue = parsedDeep[q.name];
|
|
515
517
|
const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, "query", q.name) ?? (q.schemaRef ? getSchemaByRef(q.schemaRef) : null) ?? schemaFromType(q.schemaType);
|
|
516
|
-
const
|
|
517
|
-
|
|
518
|
-
}
|
|
519
|
-
} else {
|
|
520
|
-
for (const q of route.args.query) {
|
|
521
|
-
const parsed = parseQueryValue(req.query[q.name], q);
|
|
522
|
-
const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, "query", q.name) ?? (q.schemaRef ? getSchemaByRef(q.schemaRef) : null) ?? schemaFromType(q.schemaType);
|
|
523
|
-
const coerced = coerceParamValue(parsed, paramSchema, coerceQueryDates, openapi.components.schemas);
|
|
518
|
+
const baseValue = rawValue === void 0 ? {} : rawValue;
|
|
519
|
+
const coerced = coerceParamValue(baseValue, paramSchema, coerceQueryDates, openapi.components.schemas);
|
|
524
520
|
args[q.index] = coerced;
|
|
525
521
|
}
|
|
526
522
|
}
|
|
523
|
+
if (standardArgs.length > 0) {
|
|
524
|
+
const firstQueryIndex = standardArgs[0].index;
|
|
525
|
+
const allSameIndex = standardArgs.every((q) => q.index === firstQueryIndex);
|
|
526
|
+
if (allSameIndex) {
|
|
527
|
+
args[firstQueryIndex] = {};
|
|
528
|
+
for (const q of standardArgs) {
|
|
529
|
+
const parsed = parseQueryValue(req.query[q.name], q);
|
|
530
|
+
const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, "query", q.name) ?? (q.schemaRef ? getSchemaByRef(q.schemaRef) : null) ?? schemaFromType(q.schemaType);
|
|
531
|
+
const coerced = coerceParamValue(parsed, paramSchema, coerceQueryDates, openapi.components.schemas);
|
|
532
|
+
args[firstQueryIndex][q.name] = coerced;
|
|
533
|
+
}
|
|
534
|
+
} else {
|
|
535
|
+
for (const q of standardArgs) {
|
|
536
|
+
const parsed = parseQueryValue(req.query[q.name], q);
|
|
537
|
+
const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, "query", q.name) ?? (q.schemaRef ? getSchemaByRef(q.schemaRef) : null) ?? schemaFromType(q.schemaType);
|
|
538
|
+
const coerced = coerceParamValue(parsed, paramSchema, coerceQueryDates, openapi.components.schemas);
|
|
539
|
+
args[q.index] = coerced;
|
|
540
|
+
}
|
|
541
|
+
}
|
|
542
|
+
}
|
|
527
543
|
}
|
|
528
544
|
if (route.args.headers.length > 0) {
|
|
529
545
|
const firstHeaderIndex = route.args.headers[0].index;
|
|
@@ -625,6 +641,8 @@ function schemaFromType(schemaType) {
|
|
|
625
641
|
}
|
|
626
642
|
function validateRequestWithPrecompiled(route, req, validators) {
|
|
627
643
|
const errors = [];
|
|
644
|
+
const deepNames = new Set(route.args.query.filter((q) => q.serialization?.style === "deepObject").map((q) => q.name));
|
|
645
|
+
const deepValues = deepNames.size > 0 ? parseDeepObjectParams(getRawQueryString(req), deepNames) : {};
|
|
628
646
|
if (route.args.body) {
|
|
629
647
|
const validator = validators[route.operationId]?.body;
|
|
630
648
|
if (validator) {
|
|
@@ -643,7 +661,7 @@ function validateRequestWithPrecompiled(route, req, validators) {
|
|
|
643
661
|
}
|
|
644
662
|
}
|
|
645
663
|
for (const q of route.args.query) {
|
|
646
|
-
const value = req.query[q.name];
|
|
664
|
+
const value = q.serialization?.style === "deepObject" ? deepValues[q.name] : req.query[q.name];
|
|
647
665
|
if (value === void 0) continue;
|
|
648
666
|
const schema = schemaFromType(q.schemaType) ?? {};
|
|
649
667
|
const coerced = coerceParamValue(value, schema, { dateTime: false, date: false }, {});
|
|
@@ -680,6 +698,8 @@ function validateRequest(route, req, openapi, validator) {
|
|
|
680
698
|
}
|
|
681
699
|
const openapiOperation = getOpenApiOperation(openapi, route);
|
|
682
700
|
const paramSchemaIndex = buildParamSchemaIndex(openapiOperation);
|
|
701
|
+
const deepNames = new Set(route.args.query.filter((q) => q.serialization?.style === "deepObject").map((q) => q.name));
|
|
702
|
+
const deepValues = deepNames.size > 0 ? parseDeepObjectParams(getRawQueryString(req), deepNames) : {};
|
|
683
703
|
const errors = [];
|
|
684
704
|
if (route.args.body) {
|
|
685
705
|
const bodySchema = getSchemaByRef(route.args.body.schemaRef);
|
|
@@ -699,7 +719,7 @@ function validateRequest(route, req, openapi, validator) {
|
|
|
699
719
|
}
|
|
700
720
|
}
|
|
701
721
|
for (const q of route.args.query) {
|
|
702
|
-
const value = req.query[q.name];
|
|
722
|
+
const value = q.serialization?.style === "deepObject" ? deepValues[q.name] : req.query[q.name];
|
|
703
723
|
const openapiSchema = getParamSchemaFromIndex(paramSchemaIndex, "query", q.name);
|
|
704
724
|
let schema = {};
|
|
705
725
|
if (openapiSchema) {
|
|
@@ -912,6 +932,69 @@ function parseQueryValue(value, param) {
|
|
|
912
932
|
}
|
|
913
933
|
return value;
|
|
914
934
|
}
|
|
935
|
+
function getRawQueryString(req) {
|
|
936
|
+
const url = req.originalUrl ?? req.url ?? "";
|
|
937
|
+
const index = url.indexOf("?");
|
|
938
|
+
if (index === -1) return "";
|
|
939
|
+
return url.slice(index + 1);
|
|
940
|
+
}
|
|
941
|
+
function parseDeepObjectParams(rawQuery, names) {
|
|
942
|
+
const out = {};
|
|
943
|
+
if (!rawQuery || names.size === 0) return out;
|
|
944
|
+
const params = new URLSearchParams(rawQuery);
|
|
945
|
+
for (const [key, value] of params.entries()) {
|
|
946
|
+
const path3 = parseBracketPath(key);
|
|
947
|
+
if (path3.length === 0) continue;
|
|
948
|
+
const root = path3[0];
|
|
949
|
+
if (!names.has(root)) continue;
|
|
950
|
+
assignDeepValue(out, path3, value);
|
|
951
|
+
}
|
|
952
|
+
return out;
|
|
953
|
+
}
|
|
954
|
+
function parseBracketPath(key) {
|
|
955
|
+
const parts = [];
|
|
956
|
+
let current = "";
|
|
957
|
+
for (let i = 0; i < key.length; i++) {
|
|
958
|
+
const ch = key[i];
|
|
959
|
+
if (ch === "[") {
|
|
960
|
+
if (current) parts.push(current);
|
|
961
|
+
current = "";
|
|
962
|
+
continue;
|
|
963
|
+
}
|
|
964
|
+
if (ch === "]") {
|
|
965
|
+
if (current) parts.push(current);
|
|
966
|
+
current = "";
|
|
967
|
+
continue;
|
|
968
|
+
}
|
|
969
|
+
current += ch;
|
|
970
|
+
}
|
|
971
|
+
if (current) parts.push(current);
|
|
972
|
+
return parts;
|
|
973
|
+
}
|
|
974
|
+
function assignDeepValue(target, path3, value) {
|
|
975
|
+
let cursor = target;
|
|
976
|
+
for (let i = 0; i < path3.length; i++) {
|
|
977
|
+
const key = path3[i];
|
|
978
|
+
if (!key) continue;
|
|
979
|
+
const isLast = i === path3.length - 1;
|
|
980
|
+
if (isLast) {
|
|
981
|
+
const existing = cursor[key];
|
|
982
|
+
if (existing === void 0) {
|
|
983
|
+
cursor[key] = value;
|
|
984
|
+
} else if (Array.isArray(existing)) {
|
|
985
|
+
existing.push(value);
|
|
986
|
+
} else {
|
|
987
|
+
cursor[key] = [existing, value];
|
|
988
|
+
}
|
|
989
|
+
return;
|
|
990
|
+
}
|
|
991
|
+
const next = cursor[key];
|
|
992
|
+
if (!isPlainObject(next)) {
|
|
993
|
+
cursor[key] = {};
|
|
994
|
+
}
|
|
995
|
+
cursor = cursor[key];
|
|
996
|
+
}
|
|
997
|
+
}
|
|
915
998
|
function parseCookies(cookieHeader) {
|
|
916
999
|
if (!cookieHeader) return {};
|
|
917
1000
|
const cookies = {};
|
package/dist/express.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/express.ts","../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":["import \"./runtime/polyfill.js\";\n\nexport { createExpressRouter, type CreateRouterOptions } from \"./adapter/express/index.js\";\nexport { bindRoutes, type BoundRoute } from \"./adapter/express/merge.js\";\nexport { createValidator, formatValidationErrors, ValidationErrorResponse } from \"./runtime/validation/index.js\";\nexport { setupSwagger, type SetupSwaggerOptions } from \"./adapter/express/index.js\";\nexport { bootstrap, type BootstrapOptions } from \"./adapter/express/bootstrap.js\";\n\n","// 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":["import_express","import_node_fs","import_node_path","path","crypto","Ajv","addFormats","path","path","fs","import_node_path","resolve","path","express","path","swaggerUi"]}
|
|
1
|
+
{"version":3,"sources":["../src/express.ts","../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":["import \"./runtime/polyfill.js\";\n\nexport { createExpressRouter, type CreateRouterOptions } from \"./adapter/express/index.js\";\nexport { bindRoutes, type BoundRoute } from \"./adapter/express/merge.js\";\nexport { createValidator, formatValidationErrors, ValidationErrorResponse } from \"./runtime/validation/index.js\";\nexport { setupSwagger, type SetupSwaggerOptions } from \"./adapter/express/index.js\";\nexport { bootstrap, type BootstrapOptions } from \"./adapter/express/bootstrap.js\";\n\n","// Polyfill Symbol.metadata for environments that don't support it\n// Must run before any decorated classes are imported\n(Symbol as any).metadata ??= Symbol(\"Symbol.metadata\");\n\n// Export a symbol to prevent tree-shaking\nexport const ADORN_POLYFILL = Symbol(\"adorn-polyfill\");\n","import { Router } from \"express\";\nimport type { Request, Response, NextFunction } from \"express\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { resolve, join, isAbsolute } from \"node:path\";\nimport type { ManifestV1 } from \"../../compiler/manifest/format.js\";\nimport { bindRoutes, type BoundRoute } from \"./merge.js\";\nimport { createValidator, formatValidationErrors } from \"../../runtime/validation/ajv.js\";\nimport type { AuthSchemeRuntime } from \"../../runtime/auth/runtime.js\";\nimport { loadArtifacts } from \"../../compiler/cache/loadArtifacts.js\";\nimport swaggerUi from \"swagger-ui-express\";\n\r\ninterface OpenAPI31 {\n openapi: string;\n components: {\n schemas: Record<string, Record<string, unknown>>;\n securitySchemes?: Record<string, Record<string, unknown>>;\n };\n paths?: Record<string, Record<string, any>>;\n security?: Array<Record<string, string[]>>;\n}\n\r\ninterface AuthenticatedRequest extends Request {\n auth?: any;\n}\n\nexport interface CoerceOptions {\n body?: boolean;\n query?: boolean;\n path?: boolean;\n header?: boolean;\n cookie?: boolean;\n dateTime?: boolean;\n date?: boolean;\n}\n\nexport interface CreateRouterOptions {\n controllers: Array<new (...args: any[]) => any>;\n artifactsDir?: string;\n manifest?: ManifestV1;\n openapi?: OpenAPI31;\n auth?: {\n schemes: Record<string, AuthSchemeRuntime>;\n };\n coerce?: CoerceOptions;\n middleware?: {\n global?: Array<string | ((req: any, res: any, next: (err?: any) => void) => any)>;\n named?: Record<string, (req: any, res: any, next: (err?: any) => void) => any>;\n };\n}\n\nexport interface SetupSwaggerOptions {\n artifactsDir?: string;\n jsonPath?: string;\n uiPath?: string;\n swaggerOptions?: {\n url?: string;\n servers?: Array<{ url: string; description?: string }>;\n [key: string]: any;\n };\n}\n\nfunction normalizeCoerceOptions(coerce?: CoerceOptions): Required<CoerceOptions> {\n return {\n body: coerce?.body ?? false,\n query: coerce?.query ?? false,\n path: coerce?.path ?? false,\n header: coerce?.header ?? false,\n cookie: coerce?.cookie ?? false,\n dateTime: coerce?.dateTime ?? false,\n date: coerce?.date ?? false,\n };\n}\n\nexport async function createExpressRouter(options: CreateRouterOptions): Promise<Router> {\n const { controllers, artifactsDir = \".adorn\", middleware = {} } = options;\n\r\n let manifest: ManifestV1;\r\n let openapi: OpenAPI31;\r\n let precompiledValidators: Record<string, { body?: (data: unknown) => boolean; response: Record<string, (data: unknown) => boolean> }> | null = null;\r\n\r\n if (options.manifest && options.openapi) {\r\n manifest = options.manifest;\r\n openapi = options.openapi;\r\n if (manifest.validation.mode === \"precompiled\" && manifest.validation.precompiledModule) {\r\n try {\r\n const validatorPath = join(artifactsDir, manifest.validation.precompiledModule);\r\n precompiledValidators = require(validatorPath).validators;\r\n } catch (err) {\r\n console.warn(`Failed to load precompiled validators: ${err}`);\r\n }\r\n }\r\n } else {\r\n const artifacts = await loadArtifacts({ outDir: artifactsDir });\r\n manifest = artifacts.manifest as unknown as ManifestV1;\r\n openapi = artifacts.openapi as unknown as OpenAPI31;\r\n precompiledValidators = artifacts.validators?.validators as Record<string, { body?: (data: unknown) => boolean; response: Record<string, (data: unknown) => boolean> }> ?? null;\r\n }\r\n\r\n const routes = bindRoutes({ controllers, manifest });\n\n const validator = precompiledValidators ? null : createValidator();\n\n const router = Router();\n\n const instanceCache = new Map<Function, any>();\n const coerce = normalizeCoerceOptions(options.coerce);\n\r\n function getInstance(Ctor: new (...args: any[]) => any): any {\r\n if (!instanceCache.has(Ctor)) {\r\n instanceCache.set(Ctor, new Ctor());\r\n }\r\n return instanceCache.get(Ctor);\r\n }\r\n\r\n function resolveMiddleware(\r\n items: Array<string | ((req: any, res: any, next: (err?: any) => void) => any)>,\r\n named: Record<string, (req: any, res: any, next: (err?: any) => void) => any> = {}\r\n ): Array<(req: any, res: any, next: (err?: any) => void) => any> {\r\n return items.map(item => {\r\n if (typeof item === \"string\") {\r\n const fn = named[item];\r\n if (!fn) {\r\n throw new Error(`Named middleware \"${item}\" not found in middleware registry`);\r\n }\r\n return fn;\r\n }\r\n return item;\r\n });\r\n }\r\n\r\n function createAuthMiddleware(\r\n authConfig: NonNullable<CreateRouterOptions[\"auth\"]>,\r\n routeAuth: BoundRoute[\"auth\"],\r\n globalSecurity: NonNullable<OpenAPI31[\"security\"]>\r\n ) {\r\n return async (req: AuthenticatedRequest, res: Response, next: NextFunction) => {\r\n const isPublic = routeAuth === \"public\";\r\n const hasAuthDecorator = routeAuth && routeAuth !== \"public\";\r\n const hasGlobalSecurity = globalSecurity && globalSecurity.length > 0;\r\n\r\n if (!hasAuthDecorator && !hasGlobalSecurity) {\r\n return next();\r\n }\r\n\r\n if (isPublic) {\r\n return next();\r\n }\r\n\r\n const authMeta = routeAuth as { scheme: string; scopes?: string[]; optional?: boolean };\r\n const scheme = authMeta.scheme;\r\n const requiredScopes = authMeta.scopes || [];\r\n const isOptional = authMeta.optional ?? false;\r\n\r\n const authRuntime = authConfig.schemes[scheme];\r\n if (!authRuntime) {\r\n throw new Error(`Auth scheme \"${scheme}\" not found in auth configuration`);\r\n }\r\n\r\n const result = await authRuntime.authenticate(req);\r\n\r\n if (!result) {\r\n if (isOptional) {\r\n req.auth = null;\r\n return next();\r\n }\r\n return authRuntime.challenge(res);\r\n }\r\n\r\n req.auth = result.principal;\r\n\r\n if (authRuntime.authorize && requiredScopes.length > 0) {\r\n if (!authRuntime.authorize(result, requiredScopes)) {\r\n res.status(403).json({ error: \"Forbidden\", message: \"Insufficient scopes\" });\r\n return;\r\n }\r\n }\r\n\r\n next();\r\n };\r\n }\r\n\r\n function getSchemaByRef(ref: string): Record<string, unknown> | null {\r\n if (!ref.startsWith(\"#/components/schemas/\")) return null;\r\n const schemaName = ref.replace(\"#/components/schemas/\", \"\");\r\n return openapi.components.schemas[schemaName] || null;\r\n }\r\n\r\n for (const route of routes) {\n const method = route.httpMethod.toLowerCase() as \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\";\n const openapiOperation = getOpenApiOperation(openapi, route);\n const paramSchemaIndex = buildParamSchemaIndex(openapiOperation);\n const bodySchema = getRequestBodySchema(openapiOperation, route.args.body?.contentType)\n ?? (route.args.body ? getSchemaByRef(route.args.body.schemaRef) : null);\n const coerceBodyDates = getDateCoercionOptions(coerce, \"body\");\n const coerceQueryDates = getDateCoercionOptions(coerce, \"query\");\n const coercePathDates = getDateCoercionOptions(coerce, \"path\");\n const coerceHeaderDates = getDateCoercionOptions(coerce, \"header\");\n const coerceCookieDates = getDateCoercionOptions(coerce, \"cookie\");\n\n const middlewareChain: Array<(req: any, res: any, next: (err?: any) => void) => any> = [];\n\r\n if (middleware.global) {\r\n middlewareChain.push(...resolveMiddleware(middleware.global, middleware.named || {}));\r\n }\r\n\r\n if (route.controllerUse) {\r\n middlewareChain.push(...resolveMiddleware(route.controllerUse, middleware.named || {}));\r\n }\r\n\r\n if (route.use) {\r\n middlewareChain.push(...resolveMiddleware(route.use, middleware.named || {}));\r\n }\r\n\r\n if (options.auth) {\r\n const authMw = createAuthMiddleware(options.auth, route.auth, openapi.security || []);\r\n middlewareChain.push(authMw);\r\n }\r\n\r\n router[method](route.fullPath, ...middlewareChain, async (req: Request, res: Response, next: NextFunction) => {\r\n try {\r\n const validationErrors = precompiledValidators\r\n ? validateRequestWithPrecompiled(route, req, precompiledValidators)\r\n : validateRequest(route, req, openapi, validator!);\r\n if (validationErrors) {\r\n return res.status(400).json(formatValidationErrors(validationErrors));\r\n }\r\n\r\n const instance = getInstance(route.controllerCtor);\r\n const handler = instance[route.methodName];\r\n\r\n if (typeof handler !== \"function\") {\r\n throw new Error(`Method ${route.methodName} not found on controller`);\r\n }\r\n\r\n const args: any[] = [];\r\n\r\n if (route.args.body) {\n const coercedBody = (coerceBodyDates.date || coerceBodyDates.dateTime) && bodySchema\n ? coerceDatesWithSchema(req.body, bodySchema, coerceBodyDates, openapi.components.schemas)\n : req.body;\n args[route.args.body.index] = coercedBody;\n }\n\r\n for (const pathArg of route.args.path) {\n const rawValue = req.params[pathArg.name];\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"path\", pathArg.name)\n ?? (pathArg.schemaRef ? getSchemaByRef(pathArg.schemaRef) : null)\n ?? schemaFromType(pathArg.schemaType);\n const coerced = coerceParamValue(rawValue, paramSchema, coercePathDates, openapi.components.schemas);\n args[pathArg.index] = coerced;\n }\n\r\n if (route.args.query.length > 0) {\n const deepObjectArgs = route.args.query.filter(q => q.serialization?.style === \"deepObject\");\n const standardArgs = route.args.query.filter(q => q.serialization?.style !== \"deepObject\");\n\n if (deepObjectArgs.length > 0) {\n const rawQuery = getRawQueryString(req);\n const names = new Set(deepObjectArgs.map(q => q.name));\n const parsedDeep = parseDeepObjectParams(rawQuery, names);\n\n for (const q of deepObjectArgs) {\n const rawValue = parsedDeep[q.name];\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"query\", q.name)\n ?? (q.schemaRef ? getSchemaByRef(q.schemaRef) : null)\n ?? schemaFromType(q.schemaType);\n const baseValue = rawValue === undefined ? {} : rawValue;\n const coerced = coerceParamValue(baseValue, paramSchema, coerceQueryDates, openapi.components.schemas);\n args[q.index] = coerced;\n }\n }\n\n if (standardArgs.length > 0) {\n const firstQueryIndex = standardArgs[0].index;\n const allSameIndex = standardArgs.every(q => q.index === firstQueryIndex);\n\n if (allSameIndex) {\n args[firstQueryIndex] = {};\n for (const q of standardArgs) {\n const parsed = parseQueryValue(req.query[q.name], q);\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"query\", q.name)\n ?? (q.schemaRef ? getSchemaByRef(q.schemaRef) : null)\n ?? schemaFromType(q.schemaType);\n const coerced = coerceParamValue(parsed, paramSchema, coerceQueryDates, openapi.components.schemas);\n args[firstQueryIndex][q.name] = coerced;\n }\n } else {\n for (const q of standardArgs) {\n const parsed = parseQueryValue(req.query[q.name], q);\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"query\", q.name)\n ?? (q.schemaRef ? getSchemaByRef(q.schemaRef) : null)\n ?? schemaFromType(q.schemaType);\n const coerced = coerceParamValue(parsed, paramSchema, coerceQueryDates, openapi.components.schemas);\n args[q.index] = coerced;\n }\n }\n }\n }\n\r\n if (route.args.headers.length > 0) {\r\n const firstHeaderIndex = route.args.headers[0].index;\r\n const allSameIndex = route.args.headers.every(h => h.index === firstHeaderIndex);\r\n\r\n if (allSameIndex) {\n args[firstHeaderIndex] = {};\n for (const h of route.args.headers) {\n const headerValue = req.headers[h.name.toLowerCase()];\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"header\", h.name)\n ?? (h.schemaRef ? getSchemaByRef(h.schemaRef) : null)\n ?? schemaFromType(h.schemaType);\n const coerced = coerceParamValue(headerValue, paramSchema, coerceHeaderDates, openapi.components.schemas);\n args[firstHeaderIndex][h.name] = coerced ?? undefined;\n }\n } else {\n for (const h of route.args.headers) {\n const headerValue = req.headers[h.name.toLowerCase()];\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"header\", h.name)\n ?? (h.schemaRef ? getSchemaByRef(h.schemaRef) : null)\n ?? schemaFromType(h.schemaType);\n const coerced = coerceParamValue(headerValue, paramSchema, coerceHeaderDates, openapi.components.schemas);\n args[h.index] = coerced ?? undefined;\n }\n }\n }\n\r\n if (route.args.cookies.length > 0) {\r\n const firstCookieIndex = route.args.cookies[0].index;\r\n const allSameIndex = route.args.cookies.every(c => c.index === firstCookieIndex);\r\n const cookies = parseCookies(req.headers.cookie);\r\n\r\n if (allSameIndex) {\n args[firstCookieIndex] = {};\n for (const c of route.args.cookies) {\n const cookieValue = cookies[c.name];\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"cookie\", c.name)\n ?? (c.schemaRef ? getSchemaByRef(c.schemaRef) : null)\n ?? schemaFromType(c.schemaType);\n const coerced = coerceParamValue(cookieValue, paramSchema, coerceCookieDates, openapi.components.schemas);\n args[firstCookieIndex][c.name] = coerced;\n }\n } else {\n for (const c of route.args.cookies) {\n const cookieValue = cookies[c.name];\n const paramSchema = getParamSchemaFromIndex(paramSchemaIndex, \"cookie\", c.name)\n ?? (c.schemaRef ? getSchemaByRef(c.schemaRef) : null)\n ?? schemaFromType(c.schemaType);\n const coerced = coerceParamValue(cookieValue, paramSchema, coerceCookieDates, openapi.components.schemas);\n args[c.index] = coerced;\n }\n }\n }\r\n\r\n if (args.length === 0) {\r\n args.push(req);\r\n }\r\n\r\n const result = await handler.apply(instance, args);\r\n\r\n const primaryResponse = route.responses[0];\r\n const status = primaryResponse?.status ?? 200;\r\n\r\n res.status(status).json(result);\r\n } catch (error) {\r\n next(error);\r\n }\r\n });\r\n }\r\n\r\n return router;\n}\n\ntype CoerceLocation = \"body\" | \"query\" | \"path\" | \"header\" | \"cookie\";\ntype DateCoercionOptions = { dateTime: boolean; date: boolean };\n\nfunction getDateCoercionOptions(\n coerce: Required<CoerceOptions>,\n location: CoerceLocation\n): DateCoercionOptions {\n const enabled = coerce[location];\n return {\n dateTime: enabled && coerce.dateTime,\n date: enabled && coerce.date,\n };\n}\n\nfunction toOpenApiPath(path: string): string {\n return path.replace(/:([^/]+)/g, \"{$1}\");\n}\n\nfunction getOpenApiOperation(openapi: OpenAPI31, route: BoundRoute): any | null {\n const pathKey = toOpenApiPath(route.fullPath);\n const pathItem = openapi.paths?.[pathKey];\n if (!pathItem) return null;\n return pathItem[route.httpMethod.toLowerCase()] ?? null;\n}\n\nfunction buildParamSchemaIndex(operation: any | null): Map<string, Record<string, unknown>> {\n const index = new Map<string, Record<string, unknown>>();\n const params = operation?.parameters ?? [];\n for (const param of params) {\n if (!param?.name || !param?.in) continue;\n if (param.schema) {\n index.set(`${param.in}:${param.name}`, param.schema);\n }\n }\n return index;\n}\n\nfunction getParamSchemaFromIndex(\n index: Map<string, Record<string, unknown>>,\n location: \"path\" | \"query\" | \"header\" | \"cookie\",\n name: string\n): Record<string, unknown> | null {\n return index.get(`${location}:${name}`) ?? null;\n}\n\nfunction getRequestBodySchema(operation: any | null, contentType?: string): Record<string, unknown> | null {\n const content = operation?.requestBody?.content;\n if (!content) return null;\n\n if (contentType && content[contentType]?.schema) {\n return content[contentType].schema;\n }\n\n const first = Object.values(content)[0] as Record<string, unknown> | undefined;\n return (first as any)?.schema ?? null;\n}\n\nfunction schemaFromType(schemaType?: string | string[]): Record<string, unknown> | null {\n if (!schemaType) return null;\n return { type: schemaType };\n}\n\ninterface ValidationError {\n path: string;\n message: string;\n keyword: string;\n params: Record<string, unknown>;\n}\n\r\nfunction validateRequestWithPrecompiled(\n route: BoundRoute,\n req: Request,\n validators: Record<string, { body?: (data: unknown) => boolean; response: Record<string, (data: unknown) => boolean> }>\n): ValidationError[] | null {\n const errors: ValidationError[] = [];\n const deepNames = new Set(route.args.query.filter(q => q.serialization?.style === \"deepObject\").map(q => q.name));\n const deepValues = deepNames.size > 0\n ? parseDeepObjectParams(getRawQueryString(req), deepNames)\n : {};\n\r\n if (route.args.body) {\r\n const validator = validators[route.operationId]?.body;\r\n if (validator) {\r\n const valid = validator(req.body);\r\n if (!valid) {\r\n const v = validators[route.operationId].body as any;\r\n for (const err of v.errors || []) {\r\n errors.push({\r\n path: `#/body${err.instancePath}`,\r\n message: err.message || \"Invalid value\",\r\n keyword: err.keyword,\r\n params: err.params as Record<string, unknown>,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n for (const q of route.args.query) {\n const value = q.serialization?.style === \"deepObject\" ? deepValues[q.name] : req.query[q.name];\n if (value === undefined) continue;\n\n const schema = schemaFromType(q.schemaType) ?? {};\n const coerced = coerceParamValue(value, schema, { dateTime: false, date: false }, {});\n if (Object.keys(schema).length > 0 && coerced !== undefined) {\n errors.push({\n path: `#/query/${q.name}`,\n message: `Schema validation not supported for query params in precompiled mode`,\n keyword: \"notSupported\",\n params: {},\r\n });\r\n }\r\n }\r\n\r\n for (const p of route.args.path) {\n const value = req.params[p.name];\n if (value === undefined) continue;\n\n const schema = schemaFromType(p.schemaType) ?? {};\n const coerced = coerceParamValue(value, schema, { dateTime: false, date: false }, {});\n if (Object.keys(schema).length > 0 && coerced !== undefined) {\n errors.push({\n path: `#/path/${p.name}`,\n message: `Schema validation not supported for path params in precompiled mode`,\n keyword: \"notSupported\",\r\n params: {},\r\n });\r\n }\r\n }\r\n\r\n return errors.length > 0 ? errors : null;\r\n}\r\n\r\nfunction validateRequest(\n route: BoundRoute,\n req: Request,\n openapi: OpenAPI31,\n validator: ReturnType<typeof createValidator>\n): ValidationError[] | null {\n function getSchemaByRef(ref: string): Record<string, unknown> | null {\n if (!ref.startsWith(\"#/components/schemas/\")) return null;\n const schemaName = ref.replace(\"#/components/schemas/\", \"\");\n return openapi.components.schemas[schemaName] || null;\n }\n\n const openapiOperation = getOpenApiOperation(openapi, route);\n const paramSchemaIndex = buildParamSchemaIndex(openapiOperation);\n const deepNames = new Set(route.args.query.filter(q => q.serialization?.style === \"deepObject\").map(q => q.name));\n const deepValues = deepNames.size > 0\n ? parseDeepObjectParams(getRawQueryString(req), deepNames)\n : {};\n\n const errors: ValidationError[] = [];\n\r\n if (route.args.body) {\r\n const bodySchema = getSchemaByRef(route.args.body.schemaRef);\r\n if (bodySchema) {\r\n const validate = validator.compile(bodySchema);\r\n const valid = validate(req.body);\r\n if (!valid) {\r\n for (const err of validate.errors || []) {\r\n errors.push({\r\n path: `#/body${err.instancePath}`,\r\n message: err.message || \"Invalid value\",\r\n keyword: err.keyword,\r\n params: err.params as Record<string, unknown>,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n for (const q of route.args.query) {\n const value = q.serialization?.style === \"deepObject\" ? deepValues[q.name] : req.query[q.name];\n const openapiSchema = getParamSchemaFromIndex(paramSchemaIndex, \"query\", q.name);\n let schema: Record<string, unknown> = {};\n\n if (openapiSchema) {\n schema = resolveSchema(openapiSchema, openapi.components.schemas);\n } else {\n if (q.schemaType) {\n const type = Array.isArray(q.schemaType) ? q.schemaType[0] : q.schemaType;\n schema.type = type;\n }\n\n if (q.schemaRef && q.schemaRef.includes(\"Inline\")) {\n const inlineSchema = getSchemaByRef(q.schemaRef);\n if (inlineSchema) {\n Object.assign(schema, inlineSchema);\n }\n }\n }\n\n const coerced = coerceParamValue(value, schema, { dateTime: false, date: false }, openapi.components.schemas);\n\n if (Object.keys(schema).length > 0 && coerced !== undefined) {\n const validate = validator.compile(schema);\n const valid = validate(coerced);\r\n if (!valid) {\r\n for (const err of validate.errors || []) {\r\n errors.push({\r\n path: `#/query/${q.name}`,\r\n message: err.message || \"Invalid value\",\r\n keyword: err.keyword,\r\n params: err.params as Record<string, unknown>,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n for (const p of route.args.path) {\n const value = req.params[p.name];\n const openapiSchema = getParamSchemaFromIndex(paramSchemaIndex, \"path\", p.name);\n let schema: Record<string, unknown> = {};\n\n if (openapiSchema) {\n schema = resolveSchema(openapiSchema, openapi.components.schemas);\n } else {\n if (p.schemaType) {\n const type = Array.isArray(p.schemaType) ? p.schemaType[0] : p.schemaType;\n schema.type = type;\n }\n\n if (p.schemaRef && p.schemaRef.includes(\"Inline\")) {\n const inlineSchema = getSchemaByRef(p.schemaRef);\n if (inlineSchema) {\n Object.assign(schema, inlineSchema);\n }\n }\n }\n\n const coerced = coerceParamValue(value, schema, { dateTime: false, date: false }, openapi.components.schemas);\n\n if (Object.keys(schema).length > 0 && coerced !== undefined) {\n const validate = validator.compile(schema);\n const valid = validate(coerced);\r\n if (!valid) {\r\n for (const err of validate.errors || []) {\r\n errors.push({\r\n path: `#/path/${p.name}`,\r\n message: err.message || \"Invalid value\",\r\n keyword: err.keyword,\r\n params: err.params as Record<string, unknown>,\r\n });\r\n }\r\n }\r\n }\r\n }\r\n\r\n return errors.length > 0 ? errors : null;\r\n}\r\n\r\nfunction resolveSchema(\n schema: Record<string, unknown>,\n components: Record<string, Record<string, unknown>>,\n seen: Set<string> = new Set()\n): Record<string, unknown> {\n const ref = schema.$ref;\n if (typeof ref !== \"string\" || !ref.startsWith(\"#/components/schemas/\")) {\n return schema;\n }\n\n const name = ref.replace(\"#/components/schemas/\", \"\");\n if (seen.has(name)) return schema;\n\n const next = components[name];\n if (!next) return schema;\n\n seen.add(name);\n return resolveSchema(next, components, seen);\n}\n\nfunction coerceDatesWithSchema(\n value: any,\n schema: Record<string, unknown> | null,\n dateCoercion: DateCoercionOptions,\n components: Record<string, Record<string, unknown>>\n): any {\n if (!schema || (!dateCoercion.date && !dateCoercion.dateTime)) return value;\n return coerceWithSchema(value, schema, dateCoercion, components, { coercePrimitives: false });\n}\n\nfunction coerceParamValue(\n value: any,\n schema: Record<string, unknown> | null,\n dateCoercion: DateCoercionOptions,\n components: Record<string, Record<string, unknown>>\n): any {\n if (!schema) return value;\n return coerceWithSchema(value, schema, dateCoercion, components, { coercePrimitives: true });\n}\n\nfunction coerceWithSchema(\n value: any,\n schema: Record<string, unknown>,\n dateCoercion: DateCoercionOptions,\n components: Record<string, Record<string, unknown>>,\n options: { coercePrimitives: boolean }\n): any {\n if (value === undefined || value === null) return value;\n if (value instanceof Date) return value;\n\n const resolved = resolveSchema(schema, components);\n const override = resolved[\"x-adorn-coerce\"];\n const allowDateTime = override === true ? true : override === false ? false : dateCoercion.dateTime;\n const allowDate = override === true ? true : override === false ? false : dateCoercion.date;\n\n const byFormat = coerceDateString(value, resolved, allowDateTime, allowDate);\n if (byFormat !== value) return byFormat;\n\n const allOf = resolved.allOf;\n if (Array.isArray(allOf)) {\n let out = value;\n for (const entry of allOf) {\n out = coerceWithSchema(out, entry as Record<string, unknown>, { dateTime: allowDateTime, date: allowDate }, components, options);\n }\n return out;\n }\n\n const variants = (resolved.oneOf ?? resolved.anyOf) as Array<Record<string, unknown>> | undefined;\n if (Array.isArray(variants)) {\n for (const entry of variants) {\n const out = coerceWithSchema(value, entry, { dateTime: allowDateTime, date: allowDate }, components, options);\n if (out !== value) return out;\n }\n }\n\n const schemaType = resolved.type;\n const types = Array.isArray(schemaType) ? schemaType : schemaType ? [schemaType] : [];\n\n if ((types.includes(\"array\") || resolved.items) && Array.isArray(value)) {\n const itemSchema = (resolved.items as Record<string, unknown> | undefined) ?? {};\n return value.map(item => coerceWithSchema(item, itemSchema, { dateTime: allowDateTime, date: allowDate }, components, options));\n }\n\n if ((types.includes(\"object\") || resolved.properties || resolved.additionalProperties) && isPlainObject(value)) {\n const props = resolved.properties as Record<string, Record<string, unknown>> | undefined;\n const out: Record<string, unknown> = { ...value };\n\n if (props) {\n for (const [key, propSchema] of Object.entries(props)) {\n if (Object.prototype.hasOwnProperty.call(value, key)) {\n out[key] = coerceWithSchema((value as any)[key], propSchema, { dateTime: allowDateTime, date: allowDate }, components, options);\n }\n }\n }\n\n const additional = resolved.additionalProperties;\n if (additional && typeof additional === \"object\") {\n for (const [key, entry] of Object.entries(value)) {\n if (props && Object.prototype.hasOwnProperty.call(props, key)) continue;\n out[key] = coerceWithSchema(entry, additional as Record<string, unknown>, { dateTime: allowDateTime, date: allowDate }, components, options);\n }\n }\n\n return out;\n }\n\n if (options.coercePrimitives) {\n return coercePrimitiveValue(value, types);\n }\n\n return value;\n}\n\nfunction coerceDateString(\n value: any,\n schema: Record<string, unknown>,\n allowDateTime: boolean,\n allowDate: boolean\n): any {\n if (typeof value !== \"string\") return value;\n\n const format = schema.format;\n const schemaType = schema.type;\n const types = Array.isArray(schemaType) ? schemaType : schemaType ? [schemaType] : [];\n const allowsString = types.length === 0 || types.includes(\"string\");\n\n if (format === \"date-time\" && allowDateTime && allowsString) {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n throw new Error(`Invalid date-time: ${value}`);\n }\n return parsed;\n }\n\n if (format === \"date\" && allowDate && allowsString) {\n if (!/^\\d{4}-\\d{2}-\\d{2}$/.test(value)) {\n throw new Error(`Invalid date: ${value}`);\n }\n const parsed = new Date(`${value}T00:00:00.000Z`);\n if (Number.isNaN(parsed.getTime())) {\n throw new Error(`Invalid date: ${value}`);\n }\n return parsed;\n }\n\n return value;\n}\n\nfunction coercePrimitiveValue(value: any, types: string[]): any {\n if (value === undefined || value === null) return value;\n\n if (types.includes(\"number\") || types.includes(\"integer\")) {\n const num = Number(value);\n if (Number.isNaN(num)) {\n throw new Error(`Invalid number: ${value}`);\n }\n return num;\n }\n\n if (types.includes(\"boolean\")) {\n if (value === \"true\") return true;\n if (value === \"false\") return false;\n if (typeof value === \"boolean\") return value;\n throw new Error(`Invalid boolean: ${value}`);\n }\n\n return value;\n}\n\nfunction isPlainObject(value: unknown): value is Record<string, unknown> {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return false;\n const proto = Object.getPrototypeOf(value);\n return proto === Object.prototype || proto === null;\n}\n\r\nfunction parseQueryValue(value: any, param: { schemaType?: string | string[]; serialization?: { style?: string; explode?: boolean } }): any {\n if (value === undefined || value === null) return value;\n\r\n const isArray = Array.isArray(param.schemaType)\r\n ? param.schemaType.includes(\"array\")\r\n : param.schemaType === \"array\";\r\n\r\n if (!isArray) return value;\r\n\r\n const style = param.serialization?.style ?? \"form\";\r\n const explode = param.serialization?.explode ?? true;\r\n\r\n if (Array.isArray(value)) {\r\n return value;\r\n }\r\n\r\n if (style === \"form\") {\r\n if (explode) {\r\n return value;\r\n }\r\n return value.split(\",\");\r\n }\r\n\r\n if (style === \"spaceDelimited\") {\r\n return value.split(\" \");\r\n }\r\n\r\n if (style === \"pipeDelimited\") {\r\n return value.split(\"|\");\r\n }\r\n\r\n return value;\n}\n\nfunction getRawQueryString(req: Request): string {\n const url = req.originalUrl ?? req.url ?? \"\";\n const index = url.indexOf(\"?\");\n if (index === -1) return \"\";\n return url.slice(index + 1);\n}\n\nfunction parseDeepObjectParams(\n rawQuery: string,\n names: Set<string>\n): Record<string, unknown> {\n const out: Record<string, unknown> = {};\n if (!rawQuery || names.size === 0) return out;\n\n const params = new URLSearchParams(rawQuery);\n for (const [key, value] of params.entries()) {\n const path = parseBracketPath(key);\n if (path.length === 0) continue;\n const root = path[0];\n if (!names.has(root)) continue;\n assignDeepValue(out, path, value);\n }\n\n return out;\n}\n\nfunction parseBracketPath(key: string): string[] {\n const parts: string[] = [];\n let current = \"\";\n\n for (let i = 0; i < key.length; i++) {\n const ch = key[i];\n if (ch === \"[\") {\n if (current) parts.push(current);\n current = \"\";\n continue;\n }\n if (ch === \"]\") {\n if (current) parts.push(current);\n current = \"\";\n continue;\n }\n current += ch;\n }\n\n if (current) parts.push(current);\n return parts;\n}\n\nfunction assignDeepValue(\n target: Record<string, unknown>,\n path: string[],\n value: string\n): void {\n let cursor: Record<string, unknown> = target;\n\n for (let i = 0; i < path.length; i++) {\n const key = path[i];\n if (!key) continue;\n const isLast = i === path.length - 1;\n\n if (isLast) {\n const existing = cursor[key];\n if (existing === undefined) {\n cursor[key] = value;\n } else if (Array.isArray(existing)) {\n existing.push(value);\n } else {\n cursor[key] = [existing as unknown, value];\n }\n return;\n }\n\n const next = cursor[key];\n if (!isPlainObject(next)) {\n cursor[key] = {};\n }\n cursor = cursor[key] as Record<string, unknown>;\n }\n}\n\nfunction parseCookies(cookieHeader: string | undefined): Record<string, string> {\n if (!cookieHeader) return {};\n\r\n const cookies: Record<string, string> = {};\r\n const pairs = cookieHeader.split(\";\");\r\n\r\n for (const pair of pairs) {\r\n const [name, ...valueParts] = pair.trim().split(\"=\");\r\n if (name) {\r\n cookies[name] = valueParts.join(\"=\");\r\n }\r\n }\r\n\r\n return cookies;\n}\n\nexport { bootstrap, type BootstrapOptions } from \"./bootstrap.js\";\n\nexport function setupSwagger(options: SetupSwaggerOptions = {}): Router {\n const {\n artifactsDir = \".adorn\",\n jsonPath = \"/docs/openapi.json\",\n uiPath = \"/docs\",\n swaggerOptions = {},\n } = options;\n\n const router = Router();\n\n router.get(jsonPath, (req, res) => {\n const openApiPath = isAbsolute(artifactsDir)\n ? resolve(artifactsDir, \"openapi.json\")\n : resolve(process.cwd(), artifactsDir, \"openapi.json\");\n \n const content = readFileSync(openApiPath, \"utf-8\");\n res.setHeader(\"Content-Type\", \"application/json\");\n res.send(content);\n });\n\n router.use(uiPath, swaggerUi.serve, swaggerUi.setup(null, {\n swaggerOptions: {\n url: jsonPath,\n ...swaggerOptions,\n },\n }));\n\n return router;\n}\n","export const ADORN_META = Symbol.for(\"adorn-api/meta\");\n","import { ADORN_META } from \"./key.js\";\nimport type { AdornBucket } from \"./types.js\";\n\nexport function readAdornBucket(ctor: Function): AdornBucket | null {\n const metaSym = (Symbol as any).metadata as symbol | undefined;\n if (!metaSym) {\n return null;\n }\n\n const classMetadata = (ctor as any)[metaSym] as DecoratorMetadata | undefined;\n if (!classMetadata) {\n return null;\n }\n\n const bucket = classMetadata[ADORN_META] as AdornBucket | undefined;\n return bucket ?? null;\n}\n","export function defaultOperationId(controllerName: string, methodName: string): string {\n return `${controllerName}_${methodName}`;\n}\n","export function joinPaths(base: string, sub: string): string {\n const b = base.endsWith(\"/\") ? base.slice(0, -1) : base;\n const s = sub.startsWith(\"/\") ? sub : `/${sub}`;\n return (b + s) || \"/\";\n}\n","import type { ManifestV1, OperationEntry } from \"../../compiler/manifest/format.js\";\nimport { readAdornBucket } from \"../../runtime/metadata/read.js\";\nimport { defaultOperationId } from \"../../utils/operationId.js\";\nimport { joinPaths } from \"../../utils/path.js\";\nimport crypto from \"node:crypto\";\n\nexport interface BoundRoute {\n operationId: string;\n fullPath: string;\n httpMethod: OperationEntry[\"http\"][\"method\"];\n controllerCtor: new (...args: any[]) => any;\n methodName: string;\n args: OperationEntry[\"args\"];\n responses: OperationEntry[\"responses\"];\n use?: Array<string | ((req: any, res: any, next: (err?: any) => void) => any)>;\n auth?: { scheme: string; scopes?: string[]; optional?: boolean } | \"public\";\n controllerUse?: Array<string | ((req: any, res: any, next: (err?: any) => void) => any)>;\n}\n\ninterface RouteCacheEntry {\n boundRoutes: BoundRoute[];\n manifestHash: string;\n controllerIds: string[];\n}\n\nconst routeCache = new Map<string, RouteCacheEntry>();\n\nfunction convertToExpressPath(path: string): string {\n return path.replace(/:([^/]+)/g, \":$1\");\n}\n\nfunction computeManifestHash(manifest: ManifestV1): string {\n const ops = manifest.controllers.flatMap(c => c.operations.map(o => o.operationId)).sort();\n const data = JSON.stringify({\n ops,\n validation: manifest.validation,\n });\n return crypto.createHash(\"sha256\").update(data).digest(\"hex\").slice(0, 16);\n}\n\nfunction getControllerIds(controllers: Array<new (...args: any[]) => any>): string[] {\n return controllers.map(c => c.name);\n}\n\nfunction getControllerUniqueIds(controllers: Array<new (...args: any[]) => any>): string[] {\n return controllers.map(c => `${c.name}:${c.toString()}`);\n}\n\nexport function bindRoutes(params: {\n controllers: Array<new (...args: any[]) => any>;\n manifest: ManifestV1;\n useCache?: boolean;\n}): BoundRoute[] {\n const { controllers, manifest, useCache = true } = params;\n\n if (useCache) {\n const manifestHash = computeManifestHash(manifest);\n const controllerIds = getControllerUniqueIds(controllers);\n const cacheKey = `${manifestHash}:${controllerIds.join(\",\")}`;\n\n const cached = routeCache.get(cacheKey);\n if (cached) {\n return cached.boundRoutes;\n }\n\n const bound = computeBoundRoutes(controllers, manifest);\n\n routeCache.set(cacheKey, {\n boundRoutes: bound,\n manifestHash,\n controllerIds,\n });\n\n return bound;\n }\n\n return computeBoundRoutes(controllers, manifest);\n}\n\nfunction computeBoundRoutes(\n controllers: Array<new (...args: any[]) => any>,\n manifest: ManifestV1\n): BoundRoute[] {\n const manifestByOpId = new Map<string, OperationEntry>();\n for (const ctrl of manifest.controllers) {\n for (const op of ctrl.operations) {\n if (manifestByOpId.has(op.operationId)) {\n throw new Error(`Duplicate operationId in manifest: ${op.operationId}`);\n }\n manifestByOpId.set(op.operationId, op);\n }\n }\n\n const bound: BoundRoute[] = [];\n\n for (const ctor of controllers) {\n const bucket = readAdornBucket(ctor);\n if (!bucket) {\n console.warn(`No decorator metadata found for ${ctor.name}, skipping`);\n continue;\n }\n\n const basePath = bucket.basePath ?? \"/\";\n\n for (const routeOp of bucket.ops) {\n const opId = routeOp.operationId ?? defaultOperationId(ctor.name, routeOp.methodName);\n\n const manifestOp = manifestByOpId.get(opId);\n if (!manifestOp) {\n throw new Error(\n `No manifest entry for operationId=\"${opId}. ` +\n `Did you run \"adorn-api build\"? Are your operationId rules aligned?`\n );\n }\n\n if (manifestOp.http.method !== routeOp.httpMethod || manifestOp.http.path !== routeOp.path) {\n throw new Error(\n `Route mismatch for ${opId}. ` +\n `Runtime: ${routeOp.httpMethod} ${routeOp.path}, ` +\n `Manifest: ${manifestOp.http.method} ${manifestOp.http.path}. ` +\n `Rebuild with \"adorn-api build\".`\n );\n }\n\n const expressPath = convertToExpressPath(routeOp.path);\n const fullPath = joinPaths(basePath, expressPath);\n\n bound.push({\n operationId: opId,\n fullPath,\n httpMethod: manifestOp.http.method,\n controllerCtor: ctor,\n methodName: routeOp.methodName,\n args: manifestOp.args,\n responses: manifestOp.responses,\n use: routeOp.use,\n auth: routeOp.auth,\n controllerUse: bucket.controllerUse,\n });\n }\n }\n\n return bound;\n}\n\nexport function clearRouteCache(): void {\n routeCache.clear();\n}\n\nexport function getRouteCacheStats(): { size: number; keys: string[] } {\n return {\n size: routeCache.size,\n keys: Array.from(routeCache.keys()),\n };\n}\n\n","import Ajv from \"ajv\";\nimport addFormats from \"ajv-formats\";\nimport type { ErrorObject } from \"ajv\";\n\nexport interface ValidationError {\n path: string;\n message: string;\n keyword: string;\n params: Record<string, unknown>;\n}\n\nexport interface ValidationResult {\n valid: boolean;\n errors: ValidationError[] | null;\n}\n\nexport class ValidationErrorResponse extends Error {\n constructor(\n public statusCode: number,\n public errors: ValidationError[]\n ) {\n super(\"Validation failed\");\n this.name = \"ValidationErrorResponse\";\n }\n}\n\nexport function createValidator() {\n const ajv = new Ajv.default({\n allErrors: true,\n coerceTypes: false,\n strict: false,\n validateFormats: true,\n });\n\n addFormats.default(ajv);\n\n ajv.addFormat(\"br-phone\", /^\\(\\d{2}\\)\\s\\d{5}-\\d{4}$/);\n\n return ajv;\n}\n\nexport function validateData(\n ajv: ReturnType<typeof createValidator>,\n data: unknown,\n schema: Record<string, unknown>,\n dataPath: string = \"#\"\n): ValidationResult {\n const validate = ajv.compile(schema);\n const valid = validate(data);\n\n if (valid) {\n return { valid: true, errors: null };\n }\n\n const errors: ValidationError[] = (validate.errors || []).map((err: ErrorObject) => ({\n path: formatErrorPath(dataPath, err),\n message: err.message || \"Invalid value\",\n keyword: err.keyword,\n params: err.params as Record<string, unknown>,\n }));\n\n return { valid: false, errors };\n}\n\nfunction formatErrorPath(basePath: string, err: ErrorObject): string {\n const instancePath = err.instancePath;\n\n if (!instancePath || instancePath === \"\") {\n return basePath;\n }\n\n if (basePath === \"#\" || basePath.endsWith(\"/\")) {\n return `${basePath}${instancePath.slice(1)}`;\n }\n\n return `${basePath}${instancePath}`;\n}\n\nexport function formatValidationErrors(errors: ValidationError[]): Record<string, unknown> {\n const formatted: Record<string, string[]> = {};\n\n for (const error of errors) {\n const path = error.path || \"body\";\n if (!formatted[path]) {\n formatted[path] = [];\n }\n formatted[path].push(error.message);\n }\n\n return {\n error: \"Validation failed\",\n details: formatted,\n };\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { stat } from \"node:fs/promises\";\n\ninterface OpenApi {\n openapi: string;\n components?: {\n schemas?: Record<string, unknown>;\n };\n paths?: Record<string, unknown>;\n info?: Record<string, unknown>;\n security?: Array<Record<string, string[]>>;\n}\n\ninterface Manifest {\n manifestVersion: number;\n generatedAt: string;\n generator: {\n name: string;\n version: string;\n typescript: string;\n };\n schemas: {\n kind: string;\n file: string;\n componentsSchemasPointer: string;\n };\n validation: {\n mode: \"none\" | \"ajv-runtime\" | \"precompiled\";\n precompiledModule: string | null;\n };\n controllers: Array<{\n controllerId: string;\n basePath: string;\n operations: Array<{\n operationId: string;\n http: {\n method: string;\n path: string;\n };\n handler: {\n methodName: string;\n };\n args: {\n body: {\n index: number;\n required: boolean;\n contentType: string;\n schemaRef: string;\n } | null;\n path: Array<{\n name: string;\n index: number;\n required: boolean;\n schemaRef: string;\n schemaType?: string | string[];\n }>;\n query: Array<{\n name: string;\n index: number;\n required: boolean;\n schemaRef: string;\n schemaType?: string | string[];\n }>;\n headers: Array<{\n name: string;\n index: number;\n required: boolean;\n schemaRef: string;\n schemaType?: string | string[];\n }>;\n cookies: Array<{\n name: string;\n index: number;\n required: boolean;\n schemaRef: string;\n schemaType?: string | string[];\n }>;\n };\n responses: Array<{\n status: number;\n contentType: string;\n schemaRef: string;\n isArray?: boolean;\n }>;\n }>;\n }>;\n}\n\ninterface ValidatorModule {\n validators: Record<string, {\n body?: (data: unknown) => boolean;\n response: Record<string, (data: unknown) => boolean>;\n }>;\n validateBody: (operationId: string, data: unknown) => { ok: boolean; errors: unknown[] | null };\n validateResponse: (operationId: string, status: number, contentType: string, data: unknown) => { ok: boolean; errors: unknown[] | null };\n}\n\ninterface ArtifactCacheEntry {\n openapi: OpenApi | null;\n manifest: Manifest | null;\n validators: ValidatorModule | null;\n mtimes: {\n openapi: number | null;\n manifest: number | null;\n validators: number | null;\n };\n}\n\nconst artifactCache = new Map<string, ArtifactCacheEntry>();\n\nasync function getMtime(filePath: string): Promise<number | null> {\n try {\n const stats = await stat(filePath);\n return stats.mtimeMs;\n } catch {\n return null;\n }\n}\n\nexport interface LoadArtifactsOptions {\n outDir: string;\n}\n\nexport interface LoadedArtifacts {\n openapi: OpenApi;\n manifest: Manifest;\n validators: ValidatorModule | null;\n}\n\nexport async function loadArtifacts(options: LoadArtifactsOptions): Promise<LoadedArtifacts> {\n const { outDir } = options;\n const cacheKey = path.resolve(outDir);\n\n let entry = artifactCache.get(cacheKey);\n\n const openapiPath = path.join(outDir, \"openapi.json\");\n const manifestPath = path.join(outDir, \"manifest.json\");\n const validatorsPath = path.join(outDir, \"validators.mjs\");\n\n const openapiMtime = await getMtime(openapiPath);\n const manifestMtime = await getMtime(manifestPath);\n const validatorsMtime = await getMtime(validatorsPath);\n\n if (entry) {\n const mtimesMatch = \n entry.mtimes.openapi === openapiMtime &&\n entry.mtimes.manifest === manifestMtime &&\n entry.mtimes.validators === validatorsMtime;\n\n if (mtimesMatch) {\n if (entry.openapi && entry.manifest) {\n return {\n openapi: entry.openapi,\n manifest: entry.manifest,\n validators: entry.validators,\n };\n }\n }\n }\n\n const openapiContent = fs.readFileSync(openapiPath, \"utf-8\");\n const manifestContent = fs.readFileSync(manifestPath, \"utf-8\");\n\n const openapi = JSON.parse(openapiContent) as OpenApi;\n const manifest = JSON.parse(manifestContent) as Manifest;\n\n let validators: ValidatorModule | null = null;\n\n if (manifest.validation.mode === \"precompiled\" && manifest.validation.precompiledModule) {\n try {\n const validatorsModule = await import(path.join(outDir, manifest.validation.precompiledModule));\n validators = validatorsModule as ValidatorModule;\n } catch (err) {\n console.warn(`Failed to load precompiled validators: ${err}`);\n }\n }\n\n artifactCache.set(cacheKey, {\n openapi,\n manifest,\n validators,\n mtimes: {\n openapi: openapiMtime,\n manifest: manifestMtime,\n validators: validatorsMtime,\n },\n });\n\n return {\n openapi,\n manifest,\n validators,\n };\n}\n\nexport function clearArtifactCache(outDir?: string): void {\n if (outDir) {\n const cacheKey = path.resolve(outDir);\n artifactCache.delete(cacheKey);\n } else {\n artifactCache.clear();\n }\n}\n\nexport function getArtifactCacheStats(): { size: number; keys: string[] } {\n return {\n size: artifactCache.size,\n keys: Array.from(artifactCache.keys()),\n };\n}\n","import express from \"express\";\nimport { type Server } from \"http\";\nimport { createExpressRouter, type CreateRouterOptions, setupSwagger, type SetupSwaggerOptions } from \"./index.js\";\nimport path from \"node:path\";\n\nexport interface BootstrapOptions {\n controllers: Array<new (...args: any[]) => any>;\n port?: number;\n host?: string;\n artifactsDir?: string;\n enableSwagger?: boolean;\n swaggerPath?: string;\n swaggerJsonPath?: string;\n middleware?: CreateRouterOptions[\"middleware\"];\n auth?: CreateRouterOptions[\"auth\"];\n coerce?: CreateRouterOptions[\"coerce\"];\n}\n\nexport interface BootstrapResult {\n server: Server;\n app: express.Express;\n url: string;\n port: number;\n host: string;\n close: () => Promise<void>;\n}\n\nexport function bootstrap(options: BootstrapOptions): Promise<BootstrapResult> {\n return new Promise(async (resolve, reject) => {\n try {\n const {\n controllers,\n port: userPort,\n host: userHost,\n artifactsDir: userArtifactsDir = \".adorn\",\n enableSwagger = true,\n swaggerPath = \"/docs\",\n swaggerJsonPath = \"/docs/openapi.json\",\n middleware,\n auth,\n coerce,\n } = options;\n\n if (controllers.length === 0) {\n reject(new Error(\"At least one controller must be provided to bootstrap().\"));\n return;\n }\n\n const envPort = process.env.PORT;\n const port = userPort ?? (envPort !== undefined ? Number(envPort) : 3000);\n const host = userHost ?? process.env.HOST ?? \"0.0.0.0\";\n\n if (isNaN(port) || port < 0 || port > 65535) {\n reject(new Error(`Invalid port: ${port}. Port must be between 0 and 65535.`));\n return;\n }\n\n const absoluteArtifactsDir = path.isAbsolute(userArtifactsDir)\n ? userArtifactsDir\n : path.resolve(process.cwd(), userArtifactsDir);\n\n const app = express();\n app.use(express.json());\n\n const router = await createExpressRouter({\n controllers,\n artifactsDir: absoluteArtifactsDir,\n middleware,\n auth,\n coerce,\n });\n\n app.use(router);\n\n if (enableSwagger) {\n const displayHost = host === \"0.0.0.0\" ? \"localhost\" : host;\n const serverUrl = `http://${displayHost}:${port}`;\n\n app.use(\n setupSwagger({\n artifactsDir: absoluteArtifactsDir,\n jsonPath: swaggerJsonPath,\n uiPath: swaggerPath,\n swaggerOptions: {\n servers: [{ url: serverUrl }],\n },\n })\n );\n }\n\n const server = app.listen(port, host, () => {\n const displayHost = host === \"0.0.0.0\" ? \"localhost\" : host;\n const serverUrl = `http://${displayHost}:${port}`;\n\n console.log(`🚀 Server running on ${serverUrl}`);\n if (enableSwagger) {\n console.log(`📚 Swagger UI: ${serverUrl}${swaggerPath}`);\n }\n\n const result: BootstrapResult = {\n server,\n app,\n url: serverUrl,\n port,\n host,\n close: () => new Promise<void>((closeResolve) => {\n server.close(() => {\n console.log('Server closed gracefully');\n closeResolve();\n });\n })\n };\n\n resolve(result);\n });\n\n server.on('error', (error: any) => {\n if (error.code === 'EADDRINUSE') {\n reject(new Error(`Port ${port} already in use. Please choose a different port.`));\n } else if (error.code === 'EACCES') {\n reject(new Error(`Permission denied for port ${port}. Ports below 1024 require root privileges.`));\n } else {\n reject(new Error(`Failed to start server: ${error.message}`));\n }\n });\n\n } catch (error) {\n reject(error);\n }\n });\n}\n"],"mappings":"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","names":["import_express","import_node_fs","import_node_path","path","crypto","Ajv","addFormats","path","path","fs","import_node_path","resolve","path","express","path","swaggerUi"]}
|