azurajs 3.0.6 → 3.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/decorators/index.d.mts +14 -1
- package/dist/decorators/index.d.ts +14 -1
- package/dist/decorators/index.js +18 -1
- package/dist/decorators/index.js.map +1 -1
- package/dist/decorators/index.mjs +18 -2
- package/dist/decorators/index.mjs.map +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js +18 -1
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +18 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/decorators/Route.ts +49 -1
- package/src/decorators/index.ts +1 -0
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/core/router.ts","../src/utils/Logger.ts","../src/types/http/status.ts","../src/utils/HttpError.ts","../src/utils/Parser.ts","../src/utils/IpResolver.ts","../src/utils/cookies/CookieManager.ts","../src/swagger/constants.ts","../src/swagger/openapi-builder.ts","../src/core/server.ts","../src/decorators/Route.ts","../src/swagger/decorators.ts","../src/plugins/CORSPlugin.ts","../src/plugins/RateLimitPlugin.ts","../src/plugins/HelmetPlugin.ts","../src/plugins/JWTPlugin.ts","../src/plugins/SessionPlugin.ts","../src/plugins/CompressionPlugin.ts","../src/plugins/StaticPlugin.ts","../src/plugins/ETagPlugin.ts","../src/plugins/RequestIdPlugin.ts","../src/plugins/TimeoutPlugin.ts","../src/plugins/HealthCheckPlugin.ts","../src/plugins/CircuitBreakerPlugin.ts","../src/plugins/SSEPlugin.ts","../src/plugins/ProxyPlugin.ts","../src/plugins/MultipartPlugin.ts","../src/swagger/swagger-ui-template.ts","../src/swagger/swagger-ui-html.ts","../src/plugins/SwaggerPlugin.ts","../src/utils/validators/Validator.ts","../src/utils/validators/DTOValidator.ts","../src/utils/validators/SchemaValidator.ts","../src/config/ConfigModule.ts","../src/middleware/LoggingMiddleware.ts"],"names":["resolve","Controller","result","createHttpsServer","readFileSync","createServer","CONTROLLER_META_KEY","ROUTES_META_KEY","PARAMS_META_KEY","createHmac","randomBytes","createGzip","createDeflate","path","join","existsSync","statSync","extname","createReadStream","createHash","randomUUID","URL","httpsRequest","httpRequest","mkdirSync","writeFileSync","v"],"mappings":"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AA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAA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","file":"index.js","sourcesContent":["import type { HttpMethod, RouteHandler, MiddlewareHandler, RouteMatch } from \"../types/common.type.js\";\r\nimport type { RouteMeta } from \"../types/routes.type.js\";\r\n\r\n/** Rota registada com metadados opcionais (OpenAPI / documentação). */\r\nexport interface RouteDocument {\r\n method: HttpMethod;\r\n path: string;\r\n meta?: RouteMeta;\r\n}\r\n\r\nconst PARAM_PREFIX = 58; // ':'\r\n\r\ninterface RadixNode {\r\n segment: string;\r\n children: Map<string, RadixNode>;\r\n paramChild: RadixNode | null;\r\n paramName: string;\r\n handlers: Map<HttpMethod, StoredRoute>;\r\n wildcardHandler: Map<HttpMethod, StoredRoute> | null;\r\n}\r\n\r\ninterface StoredRoute {\r\n handler: RouteHandler;\r\n middlewares: MiddlewareHandler[];\r\n meta?: Record<string, any>;\r\n}\r\n\r\nfunction createNode(segment: string = \"\"): RadixNode {\r\n return {\r\n segment,\r\n children: new Map(),\r\n paramChild: null,\r\n paramName: \"\",\r\n handlers: new Map(),\r\n wildcardHandler: null,\r\n };\r\n}\r\n\r\n/**\r\n * LRU Cache with O(1) get/set via doubly linked list + hash map.\r\n * Used for route lookup caching in hot paths.\r\n */\r\nclass LRUCache<K, V> {\r\n private capacity: number;\r\n private map: Map<K, { value: V; key: K; prev: any; next: any }>;\r\n private head: any;\r\n private tail: any;\r\n\r\n constructor(capacity: number) {\r\n this.capacity = capacity;\r\n this.map = new Map();\r\n this.head = { prev: null, next: null };\r\n this.tail = { prev: null, next: null };\r\n this.head.next = this.tail;\r\n this.tail.prev = this.head;\r\n }\r\n\r\n get(key: K): V | undefined {\r\n const node = this.map.get(key);\r\n if (!node) return undefined;\r\n this.moveToHead(node);\r\n return node.value;\r\n }\r\n\r\n set(key: K, value: V): void {\r\n const existing = this.map.get(key);\r\n if (existing) {\r\n existing.value = value;\r\n this.moveToHead(existing);\r\n return;\r\n }\r\n\r\n const node = { value, key, prev: null as any, next: null as any };\r\n this.map.set(key, node);\r\n this.addToHead(node);\r\n\r\n if (this.map.size > this.capacity) {\r\n const removed = this.removeTail();\r\n if (removed) this.map.delete(removed.key);\r\n }\r\n }\r\n\r\n private addToHead(node: any): void {\r\n node.prev = this.head;\r\n node.next = this.head.next;\r\n this.head.next.prev = node;\r\n this.head.next = node;\r\n }\r\n\r\n private removeNode(node: any): void {\r\n node.prev.next = node.next;\r\n node.next.prev = node.prev;\r\n }\r\n\r\n private moveToHead(node: any): void {\r\n this.removeNode(node);\r\n this.addToHead(node);\r\n }\r\n\r\n private removeTail(): any {\r\n const node = this.tail.prev;\r\n if (node === this.head) return null;\r\n this.removeNode(node);\r\n return node;\r\n }\r\n\r\n clear(): void {\r\n this.map.clear();\r\n this.head.next = this.tail;\r\n this.tail.prev = this.head;\r\n }\r\n}\r\n\r\nexport class Router {\r\n private root: RadixNode = createNode();\r\n private cache: LRUCache<string, RouteMatch | null>;\r\n private staticRoutes: Map<string, StoredRoute> = new Map();\r\n\r\n constructor(cacheSize: number = 1024) {\r\n this.cache = new LRUCache(cacheSize);\r\n }\r\n\r\n add(\r\n method: HttpMethod,\r\n path: string,\r\n handler: RouteHandler,\r\n middlewares: MiddlewareHandler[] = [],\r\n meta?: Record<string, any>,\r\n ): void {\r\n this.cache.clear();\r\n const normalizedPath = this.normalizePath(path);\r\n const stored: StoredRoute = { handler, middlewares, meta };\r\n\r\n if (!normalizedPath.includes(\":\") && !normalizedPath.includes(\"*\")) {\r\n const key = `${method}:${normalizedPath}`;\r\n this.staticRoutes.set(key, stored);\r\n return;\r\n }\r\n\r\n const segments = normalizedPath.split(\"/\").filter(Boolean);\r\n let node = this.root;\r\n\r\n for (let i = 0; i < segments.length; i++) {\r\n const seg = segments[i];\r\n\r\n if (seg === \"*\") {\r\n if (!node.wildcardHandler) {\r\n node.wildcardHandler = new Map();\r\n }\r\n node.wildcardHandler.set(method, stored);\r\n return;\r\n }\r\n\r\n if (seg.charCodeAt(0) === PARAM_PREFIX) {\r\n if (!node.paramChild) {\r\n node.paramChild = createNode(seg);\r\n node.paramChild.paramName = seg.slice(1);\r\n }\r\n node = node.paramChild;\r\n continue;\r\n }\r\n\r\n let child = node.children.get(seg);\r\n if (!child) {\r\n child = createNode(seg);\r\n node.children.set(seg, child);\r\n }\r\n node = child;\r\n }\r\n\r\n node.handlers.set(method, stored);\r\n }\r\n\r\n find(method: HttpMethod, path: string): RouteMatch | null {\r\n const normalizedPath = this.normalizePath(path);\r\n\r\n const staticKey = `${method}:${normalizedPath}`;\r\n const staticRoute = this.staticRoutes.get(staticKey);\r\n if (staticRoute) {\r\n return {\r\n handler: staticRoute.handler,\r\n params: {},\r\n middlewares: staticRoute.middlewares,\r\n meta: staticRoute.meta,\r\n };\r\n }\r\n\r\n const cacheKey = staticKey;\r\n const cached = this.cache.get(cacheKey);\r\n if (cached !== undefined) {\r\n return cached ? { ...cached, params: { ...cached.params } } : null;\r\n }\r\n\r\n const segments = normalizedPath.split(\"/\").filter(Boolean);\r\n const params: Record<string, string> = {};\r\n const result = this.matchNode(this.root, segments, 0, params, method);\r\n\r\n if (result) {\r\n const match: RouteMatch = {\r\n handler: result.handler,\r\n params,\r\n middlewares: result.middlewares,\r\n meta: result.meta,\r\n };\r\n this.cache.set(cacheKey, match);\r\n return { ...match, params: { ...params } };\r\n }\r\n\r\n this.cache.set(cacheKey, null);\r\n return null;\r\n }\r\n\r\n private matchNode(\r\n node: RadixNode,\r\n segments: string[],\r\n idx: number,\r\n params: Record<string, string>,\r\n method: HttpMethod,\r\n ): StoredRoute | null {\r\n if (idx === segments.length) {\r\n return node.handlers.get(method) ?? null;\r\n }\r\n\r\n const seg = segments[idx];\r\n\r\n const child = node.children.get(seg);\r\n if (child) {\r\n const result = this.matchNode(child, segments, idx + 1, params, method);\r\n if (result) return result;\r\n }\r\n\r\n if (node.paramChild) {\r\n params[node.paramChild.paramName] = seg;\r\n const result = this.matchNode(node.paramChild, segments, idx + 1, params, method);\r\n if (result) return result;\r\n delete params[node.paramChild.paramName];\r\n }\r\n\r\n if (node.wildcardHandler) {\r\n const route = node.wildcardHandler.get(method);\r\n if (route) return route;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private normalizePath(path: string): string {\r\n if (path === \"/\") return \"/\";\r\n if (path.endsWith(\"/\") && path.length > 1) return path.slice(0, -1);\r\n return path;\r\n }\r\n\r\n getAllRoutes(): Array<{ method: HttpMethod; path: string }> {\r\n return this.getRouteDocuments().map(({ method, path }) => ({ method, path }));\r\n }\r\n\r\n /**\r\n * Todas as rotas com metadados (ex.: OpenAPI) associados ao handler.\r\n */\r\n getRouteDocuments(): RouteDocument[] {\r\n const routes: RouteDocument[] = [];\r\n\r\n for (const [key, stored] of this.staticRoutes) {\r\n const [method, path] = key.split(\":\", 2) as [HttpMethod, string];\r\n routes.push({ method, path, meta: stored.meta });\r\n }\r\n\r\n this.collectRoutesWithMeta(this.root, \"\", routes);\r\n return routes;\r\n }\r\n\r\n private collectRoutesWithMeta(node: RadixNode, prefix: string, routes: RouteDocument[]): void {\r\n for (const [method, stored] of node.handlers) {\r\n routes.push({ method, path: prefix || \"/\", meta: stored.meta });\r\n }\r\n\r\n for (const [seg, child] of node.children) {\r\n this.collectRoutesWithMeta(child, `${prefix}/${seg}`, routes);\r\n }\r\n\r\n if (node.paramChild) {\r\n this.collectRoutesWithMeta(\r\n node.paramChild,\r\n `${prefix}/:${node.paramChild.paramName}`,\r\n routes,\r\n );\r\n }\r\n\r\n if (node.wildcardHandler) {\r\n for (const [method, stored] of node.wildcardHandler) {\r\n routes.push({ method, path: `${prefix}/*`, meta: stored.meta });\r\n }\r\n }\r\n }\r\n}\r\n","type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\r\n\r\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\r\n debug: 0,\r\n info: 1,\r\n warn: 2,\r\n error: 3,\r\n silent: 4,\r\n};\r\n\r\nconst COLORS = {\r\n reset: \"\\x1b[0m\",\r\n bold: \"\\x1b[1m\",\r\n dim: \"\\x1b[2m\",\r\n red: \"\\x1b[31m\",\r\n green: \"\\x1b[32m\",\r\n yellow: \"\\x1b[33m\",\r\n blue: \"\\x1b[34m\",\r\n magenta: \"\\x1b[35m\",\r\n cyan: \"\\x1b[36m\",\r\n white: \"\\x1b[37m\",\r\n gray: \"\\x1b[90m\",\r\n bgRed: \"\\x1b[41m\",\r\n bgGreen: \"\\x1b[42m\",\r\n bgYellow: \"\\x1b[43m\",\r\n bgBlue: \"\\x1b[44m\",\r\n} as const;\r\n\r\nconst METHOD_COLORS: Record<string, string> = {\r\n GET: COLORS.green,\r\n POST: COLORS.blue,\r\n PUT: COLORS.yellow,\r\n DELETE: COLORS.red,\r\n PATCH: COLORS.magenta,\r\n HEAD: COLORS.cyan,\r\n OPTIONS: COLORS.gray,\r\n};\r\n\r\nfunction statusColor(code: number): string {\r\n if (code < 200) return COLORS.gray;\r\n if (code < 300) return COLORS.green;\r\n if (code < 400) return COLORS.cyan;\r\n if (code < 500) return COLORS.yellow;\r\n return COLORS.red;\r\n}\r\n\r\nfunction formatDuration(ns: bigint): string {\r\n const us = Number(ns) / 1_000;\r\n if (us < 1_000) return `${us.toFixed(0)}µs`;\r\n const ms = us / 1_000;\r\n if (ms < 1_000) return `${ms.toFixed(1)}ms`;\r\n return `${(ms / 1_000).toFixed(2)}s`;\r\n}\r\n\r\nexport class Logger {\r\n private level: LogLevel;\r\n private useColors: boolean;\r\n private showTimestamp: boolean;\r\n private prefix: string;\r\n\r\n constructor(options: {\r\n level?: LogLevel;\r\n colors?: boolean;\r\n timestamp?: boolean;\r\n prefix?: string;\r\n } = {}) {\r\n this.level = options.level ?? \"info\";\r\n this.useColors = options.colors ?? process.stdout.isTTY !== false;\r\n this.showTimestamp = options.timestamp ?? true;\r\n this.prefix = options.prefix ?? \"azura\";\r\n }\r\n\r\n private shouldLog(level: LogLevel): boolean {\r\n return LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[this.level];\r\n }\r\n\r\n private timestamp(): string {\r\n if (!this.showTimestamp) return \"\";\r\n const now = new Date();\r\n return `${COLORS.gray}${now.toISOString().slice(11, 23)}${COLORS.reset} `;\r\n }\r\n\r\n private tag(level: LogLevel): string {\r\n if (!this.useColors) return `[${level.toUpperCase()}]`;\r\n const colorMap: Record<string, string> = {\r\n debug: COLORS.gray,\r\n info: COLORS.blue,\r\n warn: COLORS.yellow,\r\n error: COLORS.red,\r\n };\r\n return `${colorMap[level] ?? \"\"}[${level.toUpperCase()}]${COLORS.reset}`;\r\n }\r\n\r\n debug(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"debug\")) return;\r\n console.debug(`${this.timestamp()}${this.tag(\"debug\")} ${message}`, ...args);\r\n }\r\n\r\n info(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"info\")) return;\r\n console.info(`${this.timestamp()}${this.tag(\"info\")} ${message}`, ...args);\r\n }\r\n\r\n warn(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"warn\")) return;\r\n console.warn(`${this.timestamp()}${this.tag(\"warn\")} ${message}`, ...args);\r\n }\r\n\r\n error(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"error\")) return;\r\n console.error(`${this.timestamp()}${this.tag(\"error\")} ${message}`, ...args);\r\n }\r\n\r\n request(method: string, path: string, statusCode: number, duration: bigint): void {\r\n if (!this.shouldLog(\"info\")) return;\r\n const mc = this.useColors ? METHOD_COLORS[method] ?? COLORS.white : \"\";\r\n const sc = this.useColors ? statusColor(statusCode) : \"\";\r\n const r = this.useColors ? COLORS.reset : \"\";\r\n const dur = formatDuration(duration);\r\n console.info(\r\n `${this.timestamp()}${mc}${method.padEnd(7)}${r} ${path} ${sc}${statusCode}${r} ${COLORS.dim}${dur}${r}`,\r\n );\r\n }\r\n\r\n banner(port: number, host: string): void {\r\n if (!this.shouldLog(\"info\")) return;\r\n const c = this.useColors;\r\n const lines = [\r\n \"\",\r\n `${c ? COLORS.bold + COLORS.cyan : \"\"} ⚡ AzuraJS v3.0.0${c ? COLORS.reset : \"\"}`,\r\n \"\",\r\n `${c ? COLORS.green : \"\"} ➜ Local: ${c ? COLORS.bold : \"\"}http://${host}:${port}/${c ? COLORS.reset : \"\"}`,\r\n `${c ? COLORS.dim : \"\"} ➜ Press Ctrl+C to stop${c ? COLORS.reset : \"\"}`,\r\n \"\",\r\n ];\r\n console.info(lines.join(\"\\n\"));\r\n }\r\n\r\n setLevel(level: LogLevel): void {\r\n this.level = level;\r\n }\r\n}\r\n","export const HttpStatus = {\r\n OK: 200,\r\n CREATED: 201,\r\n ACCEPTED: 202,\r\n NO_CONTENT: 204,\r\n MOVED_PERMANENTLY: 301,\r\n FOUND: 302,\r\n NOT_MODIFIED: 304,\r\n BAD_REQUEST: 400,\r\n UNAUTHORIZED: 401,\r\n FORBIDDEN: 403,\r\n NOT_FOUND: 404,\r\n METHOD_NOT_ALLOWED: 405,\r\n CONFLICT: 409,\r\n GONE: 410,\r\n UNPROCESSABLE_ENTITY: 422,\r\n TOO_MANY_REQUESTS: 429,\r\n INTERNAL_SERVER_ERROR: 500,\r\n NOT_IMPLEMENTED: 501,\r\n BAD_GATEWAY: 502,\r\n SERVICE_UNAVAILABLE: 503,\r\n GATEWAY_TIMEOUT: 504,\r\n} as const;\r\n\r\nexport type HttpStatusCode = (typeof HttpStatus)[keyof typeof HttpStatus];\r\n\r\nexport const HttpStatusText: Record<number, string> = {\r\n 200: \"OK\",\r\n 201: \"Created\",\r\n 202: \"Accepted\",\r\n 204: \"No Content\",\r\n 301: \"Moved Permanently\",\r\n 302: \"Found\",\r\n 304: \"Not Modified\",\r\n 400: \"Bad Request\",\r\n 401: \"Unauthorized\",\r\n 403: \"Forbidden\",\r\n 404: \"Not Found\",\r\n 405: \"Method Not Allowed\",\r\n 409: \"Conflict\",\r\n 410: \"Gone\",\r\n 422: \"Unprocessable Entity\",\r\n 429: \"Too Many Requests\",\r\n 500: \"Internal Server Error\",\r\n 501: \"Not Implemented\",\r\n 502: \"Bad Gateway\",\r\n 503: \"Service Unavailable\",\r\n 504: \"Gateway Timeout\",\r\n};\r\n","import { HttpStatusText } from \"../types/http/status.js\";\r\n\r\nexport class HttpError extends Error {\r\n public readonly statusCode: number;\r\n public readonly details?: any;\r\n public readonly isOperational: boolean;\r\n\r\n constructor(statusCode: number, message?: string, details?: any) {\r\n super(message ?? HttpStatusText[statusCode] ?? \"Unknown Error\");\r\n this.statusCode = statusCode;\r\n this.details = details;\r\n this.isOperational = true;\r\n Object.setPrototypeOf(this, HttpError.prototype);\r\n }\r\n\r\n toJSON(): Record<string, any> {\r\n const obj: Record<string, any> = {\r\n error: {\r\n statusCode: this.statusCode,\r\n message: this.message,\r\n },\r\n };\r\n if (this.details) obj.error.details = this.details;\r\n return obj;\r\n }\r\n\r\n static badRequest(message?: string, details?: any): HttpError {\r\n return new HttpError(400, message ?? \"Bad Request\", details);\r\n }\r\n\r\n static unauthorized(message?: string): HttpError {\r\n return new HttpError(401, message ?? \"Unauthorized\");\r\n }\r\n\r\n static forbidden(message?: string): HttpError {\r\n return new HttpError(403, message ?? \"Forbidden\");\r\n }\r\n\r\n static notFound(message?: string): HttpError {\r\n return new HttpError(404, message ?? \"Not Found\");\r\n }\r\n\r\n static methodNotAllowed(message?: string): HttpError {\r\n return new HttpError(405, message ?? \"Method Not Allowed\");\r\n }\r\n\r\n static conflict(message?: string, details?: any): HttpError {\r\n return new HttpError(409, message ?? \"Conflict\", details);\r\n }\r\n\r\n static unprocessableEntity(message?: string, details?: any): HttpError {\r\n return new HttpError(422, message ?? \"Unprocessable Entity\", details);\r\n }\r\n\r\n static tooManyRequests(message?: string): HttpError {\r\n return new HttpError(429, message ?? \"Too Many Requests\");\r\n }\r\n\r\n static internal(message?: string): HttpError {\r\n return new HttpError(500, message ?? \"Internal Server Error\");\r\n }\r\n}\r\n","import type { IncomingMessage } from \"node:http\";\r\n\r\nexport function parseQueryString(qs: string): Record<string, string | string[]> {\r\n const result: Record<string, string | string[]> = Object.create(null);\r\n if (!qs || qs.length === 0) return result;\r\n\r\n let key = \"\";\r\n let value = \"\";\r\n let startingKey = true;\r\n let i = qs.charCodeAt(0) === 63 ? 1 : 0; // skip leading ?\r\n\r\n for (; i < qs.length; i++) {\r\n const ch = qs.charCodeAt(i);\r\n\r\n if (ch === 61 /* = */ && startingKey) {\r\n startingKey = false;\r\n continue;\r\n }\r\n\r\n if (ch === 38 /* & */) {\r\n if (key.length > 0) {\r\n const decodedKey = fastDecode(key);\r\n const decodedVal = fastDecode(value);\r\n const existing = result[decodedKey];\r\n if (existing === undefined) {\r\n result[decodedKey] = decodedVal;\r\n } else if (typeof existing === \"string\") {\r\n result[decodedKey] = [existing, decodedVal];\r\n } else {\r\n existing.push(decodedVal);\r\n }\r\n }\r\n key = \"\";\r\n value = \"\";\r\n startingKey = true;\r\n continue;\r\n }\r\n\r\n if (startingKey) {\r\n key += qs[i];\r\n } else {\r\n value += qs[i];\r\n }\r\n }\r\n\r\n if (key.length > 0) {\r\n const decodedKey = fastDecode(key);\r\n const decodedVal = fastDecode(value);\r\n const existing = result[decodedKey];\r\n if (existing === undefined) {\r\n result[decodedKey] = decodedVal;\r\n } else if (typeof existing === \"string\") {\r\n result[decodedKey] = [existing, decodedVal];\r\n } else {\r\n existing.push(decodedVal);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction fastDecode(str: string): string {\r\n if (str.indexOf(\"%\") === -1 && str.indexOf(\"+\") === -1) return str;\r\n try {\r\n return decodeURIComponent(str.replace(/\\+/g, \" \"));\r\n } catch {\r\n return str;\r\n }\r\n}\r\n\r\nexport function parseCookies(header: string | undefined): Record<string, string> {\r\n const cookies: Record<string, string> = Object.create(null);\r\n if (!header) return cookies;\r\n\r\n let i = 0;\r\n const len = header.length;\r\n\r\n while (i < len) {\r\n while (i < len && header.charCodeAt(i) === 32) i++; // skip spaces\r\n\r\n let eqIdx = -1;\r\n let semiIdx = -1;\r\n for (let j = i; j < len; j++) {\r\n const ch = header.charCodeAt(j);\r\n if (ch === 61 && eqIdx === -1) eqIdx = j;\r\n if (ch === 59) { semiIdx = j; break; }\r\n }\r\n\r\n if (eqIdx === -1) {\r\n i = semiIdx === -1 ? len : semiIdx + 1;\r\n continue;\r\n }\r\n\r\n const end = semiIdx === -1 ? len : semiIdx;\r\n const name = header.slice(i, eqIdx).trim();\r\n let val = header.slice(eqIdx + 1, end).trim();\r\n\r\n if (val.charCodeAt(0) === 34 && val.charCodeAt(val.length - 1) === 34) {\r\n val = val.slice(1, -1);\r\n }\r\n\r\n if (cookies[name] === undefined) {\r\n cookies[name] = fastDecode(val);\r\n }\r\n\r\n i = end + 1;\r\n }\r\n\r\n return cookies;\r\n}\r\n\r\nconst CONTENT_TYPE_JSON = \"application/json\";\r\nconst CONTENT_TYPE_FORM = \"application/x-www-form-urlencoded\";\r\n\r\nexport async function parseBody(req: IncomingMessage): Promise<any> {\r\n const contentType = req.headers[\"content-type\"] ?? \"\";\r\n const contentLength = req.headers[\"content-length\"];\r\n\r\n if (\r\n req.method === \"GET\" ||\r\n req.method === \"HEAD\" ||\r\n req.method === \"OPTIONS\" ||\r\n (contentLength !== undefined && contentLength === \"0\")\r\n ) {\r\n return undefined;\r\n }\r\n\r\n const chunks: Buffer[] = [];\r\n let totalSize = 0;\r\n const maxSize = 10 * 1024 * 1024; // 10MB default\r\n\r\n return new Promise((resolve, reject) => {\r\n req.on(\"data\", (chunk: Buffer) => {\r\n totalSize += chunk.length;\r\n if (totalSize > maxSize) {\r\n req.destroy();\r\n reject(new Error(\"Request body too large\"));\r\n return;\r\n }\r\n chunks.push(chunk);\r\n });\r\n\r\n req.on(\"end\", () => {\r\n if (chunks.length === 0) {\r\n resolve(undefined);\r\n return;\r\n }\r\n\r\n const raw = Buffer.concat(chunks).toString(\"utf-8\");\r\n\r\n if (contentType.startsWith(CONTENT_TYPE_JSON)) {\r\n try {\r\n resolve(JSON.parse(raw));\r\n } catch {\r\n resolve(raw);\r\n }\r\n } else if (contentType.startsWith(CONTENT_TYPE_FORM)) {\r\n resolve(parseQueryString(raw));\r\n } else {\r\n resolve(raw);\r\n }\r\n });\r\n\r\n req.on(\"error\", reject);\r\n });\r\n}\r\n\r\nexport function parseUrl(url: string): { pathname: string; search: string } {\r\n let pathname = \"\";\r\n let search = \"\";\r\n let i = 0;\r\n\r\n for (; i < url.length; i++) {\r\n if (url.charCodeAt(i) === 63) { // ?\r\n pathname = url.slice(0, i);\r\n search = url.slice(i);\r\n return { pathname, search };\r\n }\r\n }\r\n\r\n return { pathname: url, search: \"\" };\r\n}\r\n","import type { IncomingMessage } from \"node:http\";\r\n\r\nconst PROXY_HEADERS = [\r\n \"x-forwarded-for\",\r\n \"x-real-ip\",\r\n \"cf-connecting-ip\",\r\n \"x-client-ip\",\r\n \"x-cluster-client-ip\",\r\n \"fastly-client-ip\",\r\n \"true-client-ip\",\r\n] as const;\r\n\r\nexport function resolveIp(req: IncomingMessage): string {\r\n for (const header of PROXY_HEADERS) {\r\n const val = req.headers[header];\r\n if (val) {\r\n const ip = typeof val === \"string\" ? val.split(\",\")[0].trim() : val[0];\r\n if (ip && ip.length > 0) return normalizeIp(ip);\r\n }\r\n }\r\n\r\n const remoteAddr = req.socket?.remoteAddress ?? \"127.0.0.1\";\r\n return normalizeIp(remoteAddr);\r\n}\r\n\r\nfunction normalizeIp(ip: string): string {\r\n if (ip === \"::1\" || ip === \"::ffff:127.0.0.1\") return \"127.0.0.1\";\r\n if (ip.startsWith(\"::ffff:\")) return ip.slice(7);\r\n return ip;\r\n}\r\n","import type { CookieOptions } from \"../../types/common.type.js\";\r\n\r\nexport function serializeCookie(\r\n name: string,\r\n value: string,\r\n options: CookieOptions = {},\r\n): string {\r\n let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\r\n\r\n if (options.maxAge != null) {\r\n cookie += `; Max-Age=${Math.floor(options.maxAge)}`;\r\n }\r\n\r\n if (options.expires) {\r\n cookie += `; Expires=${options.expires.toUTCString()}`;\r\n }\r\n\r\n if (options.domain) {\r\n cookie += `; Domain=${options.domain}`;\r\n }\r\n\r\n cookie += `; Path=${options.path ?? \"/\"}`;\r\n\r\n if (options.secure) {\r\n cookie += \"; Secure\";\r\n }\r\n\r\n if (options.httpOnly !== false) {\r\n cookie += \"; HttpOnly\";\r\n }\r\n\r\n if (options.sameSite) {\r\n cookie += `; SameSite=${options.sameSite}`;\r\n }\r\n\r\n return cookie;\r\n}\r\n\r\nexport function clearCookieHeader(\r\n name: string,\r\n options: CookieOptions = {},\r\n): string {\r\n return serializeCookie(name, \"\", {\r\n ...options,\r\n maxAge: 0,\r\n expires: new Date(0),\r\n });\r\n}\r\n","/** Tags OpenAPI a nível de controller (todas as rotas do class) */\r\nexport const API_TAGS_KEY = \"azura:api-tags\";\r\n\r\n/** Tags por método (independente da ordem em relação a @Get/@Post) */\r\nexport const METHOD_TAGS_KEY = \"azura:swagger-method-tags\";\r\n\r\n/** Metadados OpenAPI por método (summary, responses, etc.) */\r\nexport const API_OPERATION_KEY = \"azura:swagger-operation\";\r\n","import type { HttpMethod } from \"../types/common.type.js\";\r\nimport type { RouteDocument } from \"../core/router.js\";\r\nimport type { RouteMeta } from \"../types/routes.type.js\";\r\nimport type { BuildOpenApiOptions, OpenApiInfo } from \"../types/swagger.type.js\";\r\n\r\nfunction resolveInfo(options: BuildOpenApiOptions): OpenApiInfo {\r\n return (\r\n options.info ?? {\r\n title: \"AzuraJS API\",\r\n version: \"1.0.0\",\r\n description: \"Generated OpenAPI specification\",\r\n }\r\n );\r\n}\r\n\r\n/** Converte path AzuraJS `/users/:id` → OpenAPI `/users/{id}` */\r\nexport function toOpenApiPath(path: string): string {\r\n if (path === \"/\") return \"/\";\r\n const mapped = path\r\n .split(\"/\")\r\n .map((seg) => {\r\n if (seg === \"*\") return \"{wildcard}\";\r\n return seg.startsWith(\":\") ? `{${seg.slice(1)}}` : seg;\r\n })\r\n .join(\"/\")\r\n .replace(/\\/{2,}/g, \"/\");\r\n if (mapped.endsWith(\"/*\")) {\r\n return mapped.slice(0, -2) + \"/{wildcard}\";\r\n }\r\n return mapped;\r\n}\r\n\r\nfunction pathParametersFromTemplate(path: string): Array<Record<string, unknown>> {\r\n const re = /\\{([^}]+)\\}/g;\r\n const out: Array<Record<string, unknown>> = [];\r\n let m: RegExpExecArray | null;\r\n const seen = new Set<string>();\r\n while ((m = re.exec(path)) !== null) {\r\n const name = m[1];\r\n if (seen.has(name)) continue;\r\n seen.add(name);\r\n out.push({\r\n name,\r\n in: \"path\",\r\n required: true,\r\n schema: { type: \"string\" },\r\n });\r\n }\r\n return out;\r\n}\r\n\r\nfunction defaultResponses(meta?: RouteMeta): Record<string, unknown> {\r\n if (meta?.responses && Object.keys(meta.responses).length > 0) {\r\n const out: Record<string, unknown> = {};\r\n for (const [code, r] of Object.entries(meta.responses)) {\r\n out[String(code)] = {\r\n description: r.description,\r\n ...(r.schema ? { content: { \"application/json\": { schema: r.schema } } } : {}),\r\n };\r\n }\r\n return out;\r\n }\r\n return {\r\n \"200\": {\r\n description: \"Successful response\",\r\n content: {\r\n \"application/json\": {\r\n schema: { type: \"object\", additionalProperties: true },\r\n },\r\n },\r\n },\r\n };\r\n}\r\n\r\nfunction mergeParameters(\r\n meta: RouteMeta | undefined,\r\n pathParams: Array<Record<string, unknown>>,\r\n): Array<Record<string, unknown>> {\r\n const fromMeta = meta?.parameters ?? [];\r\n const names = new Set(pathParams.map((p) => p.name as string));\r\n const rest = fromMeta.filter((p) => !(p.in === \"path\" && names.has(p.name)));\r\n const mapped = fromMeta\r\n .filter((p) => p.in === \"path\")\r\n .map((p) => ({\r\n name: p.name,\r\n in: \"path\",\r\n required: p.required ?? true,\r\n description: p.description,\r\n schema: p.schema ?? { type: p.type ?? \"string\" },\r\n }));\r\n const pathMerged = [...pathParams];\r\n for (const m of mapped) {\r\n if (!pathMerged.find((x) => x.name === m.name)) pathMerged.push(m);\r\n }\r\n return [...pathMerged, ...rest.map((p) => mapParameter(p))];\r\n}\r\n\r\nfunction mapParameter(p: import(\"../types/routes.type.js\").ParameterMeta): Record<string, unknown> {\r\n const base: Record<string, unknown> = {\r\n name: p.name,\r\n in: p.in,\r\n required: p.required ?? (p.in === \"path\" ? true : false),\r\n description: p.description,\r\n };\r\n if (p.in === \"body\") {\r\n return {\r\n ...base,\r\n content: {\r\n \"application/json\": {\r\n schema: p.schema ?? { type: \"object\" },\r\n },\r\n },\r\n };\r\n }\r\n return {\r\n ...base,\r\n schema: p.schema ?? { type: p.type ?? \"string\" },\r\n };\r\n}\r\n\r\nfunction operationIdFor(method: HttpMethod, oPath: string): string {\r\n const slug = oPath\r\n .replace(/[/{}\\-*]/g, \"_\")\r\n .replace(/_+/g, \"_\")\r\n .replace(/^_|_$/g, \"\");\r\n return `${method.toLowerCase()}_${slug || \"root\"}`;\r\n}\r\n\r\nfunction operationForMethod(\r\n method: HttpMethod,\r\n oPath: string,\r\n meta: RouteMeta | undefined,\r\n): Record<string, unknown> {\r\n const op: Record<string, unknown> = {\r\n operationId: operationIdFor(method, oPath),\r\n summary: meta?.summary ?? `${method} ${oPath}`,\r\n ...(meta?.description ? { description: meta.description } : {}),\r\n ...(meta?.deprecated ? { deprecated: true } : {}),\r\n ...(meta?.tags?.length ? { tags: meta.tags } : {}),\r\n ...(meta?.security?.length ? { security: meta.security } : {}),\r\n };\r\n\r\n if ([\"POST\", \"PUT\", \"PATCH\"].includes(method) && !meta?.parameters?.some((x) => x.in === \"body\")) {\r\n op.requestBody = {\r\n content: {\r\n \"application/json\": {\r\n schema: { type: \"object\", additionalProperties: true },\r\n },\r\n },\r\n required: false,\r\n };\r\n }\r\n\r\n op.responses = defaultResponses(meta);\r\n return op;\r\n}\r\n\r\n/**\r\n * Gera documento OpenAPI 3.0 a partir das rotas registadas.\r\n */\r\nexport function buildOpenApiDocument(\r\n routes: RouteDocument[],\r\n options: BuildOpenApiOptions,\r\n): Record<string, unknown> {\r\n const info = resolveInfo(options);\r\n const prefix = options.pathPrefix ?? \"\";\r\n const paths: Record<string, Record<string, unknown>> = {};\r\n\r\n const seen = new Set<string>();\r\n for (const r of routes) {\r\n const full = prefix + r.path;\r\n const oPath = toOpenApiPath(full);\r\n const key = `${r.method}:${oPath}`;\r\n if (seen.has(key)) continue;\r\n seen.add(key);\r\n\r\n const pathParams = pathParametersFromTemplate(oPath);\r\n const op = operationForMethod(r.method, oPath, r.meta);\r\n const parameters = mergeParameters(r.meta, pathParams);\r\n if (parameters.length) op.parameters = parameters;\r\n\r\n const methodLc = r.method.toLowerCase();\r\n if (!paths[oPath]) paths[oPath] = {};\r\n paths[oPath][methodLc] = op;\r\n }\r\n\r\n return {\r\n openapi: \"3.0.3\",\r\n info: {\r\n title: info.title,\r\n version: info.version,\r\n ...(info.description ? { description: info.description } : {}),\r\n ...(info.contact ? { contact: info.contact } : {}),\r\n ...(info.license ? { license: info.license } : {}),\r\n },\r\n ...(options.servers?.length ? { servers: options.servers } : {}),\r\n paths,\r\n };\r\n}\r\n","import { createServer, type Server, type IncomingMessage, type ServerResponse } from \"node:http\";\r\nimport { createServer as createHttpsServer } from \"node:https\";\r\nimport { readFileSync } from \"node:fs\";\r\nimport { Router } from \"./router.js\";\r\nimport { Logger } from \"../utils/Logger.js\";\r\nimport { HttpError } from \"../utils/HttpError.js\";\r\nimport { parseQueryString, parseCookies, parseBody, parseUrl } from \"../utils/Parser.js\";\r\nimport { resolveIp } from \"../utils/IpResolver.js\";\r\nimport { serializeCookie, clearCookieHeader } from \"../utils/cookies/CookieManager.js\";\r\nimport type {\r\n AzuraRequest,\r\n AzuraResponse,\r\n NextFunction,\r\n MiddlewareHandler,\r\n ErrorHandler,\r\n HttpMethod,\r\n CookieOptions,\r\n} from \"../types/common.type.js\";\r\nimport type { AzuraConfig } from \"../types/config.type.js\";\r\nimport type { PluginHandler } from \"../types/plugins/plugin.type.js\";\r\nimport type { ControllerMetadata, RouteMeta, RouteMetadata } from \"../types/routes.type.js\";\r\nimport type { BuildOpenApiOptions } from \"../types/swagger.type.js\";\r\nimport { API_OPERATION_KEY, API_TAGS_KEY, METHOD_TAGS_KEY } from \"../swagger/constants.js\";\r\nimport { buildOpenApiDocument } from \"../swagger/openapi-builder.js\";\r\n\r\nfunction isRouteDocumentMeta(o: unknown): o is RouteMeta {\r\n if (!o || typeof o !== \"object\" || Array.isArray(o)) return false;\r\n const x = o as Record<string, unknown>;\r\n return (\r\n \"summary\" in x ||\r\n \"description\" in x ||\r\n \"tags\" in x ||\r\n \"deprecated\" in x ||\r\n \"parameters\" in x ||\r\n \"responses\" in x ||\r\n \"security\" in x ||\r\n \"produces\" in x ||\r\n \"consumes\" in x\r\n );\r\n}\r\n\r\nconst CONTROLLER_META_KEY = \"azura:controller\";\r\nconst ROUTES_META_KEY = \"azura:routes\";\r\nconst PARAMS_META_KEY = \"azura:params\";\r\n\r\nexport class AzuraServer {\r\n private server: Server | null = null;\r\n private router: Router;\r\n private logger: Logger;\r\n private middlewares: MiddlewareHandler[] = [];\r\n private plugins: PluginHandler[] = [];\r\n private errorHandler: ErrorHandler | null = null;\r\n private config: AzuraConfig;\r\n private compiledChain: ((req: AzuraRequest, res: AzuraResponse) => Promise<void>) | null = null;\r\n\r\n constructor(config: AzuraConfig = {}) {\r\n this.config = {\r\n environment: config.environment ?? (process.env.NODE_ENV as any) ?? \"development\",\r\n server: {\r\n port: config.server?.port ?? 3000,\r\n host: config.server?.host ?? \"0.0.0.0\",\r\n keepAliveTimeout: config.server?.keepAliveTimeout ?? 72000,\r\n headersTimeout: config.server?.headersTimeout ?? 75000,\r\n requestTimeout: config.server?.requestTimeout ?? 30000,\r\n ...config.server,\r\n },\r\n logging: {\r\n enabled: config.logging?.enabled ?? true,\r\n level: config.logging?.level ?? \"info\",\r\n timestamp: config.logging?.timestamp ?? true,\r\n colors: config.logging?.colors ?? true,\r\n requestLogging: config.logging?.requestLogging ?? true,\r\n ...config.logging,\r\n },\r\n plugins: config.plugins ?? {},\r\n debug: config.debug ?? false,\r\n };\r\n\r\n this.router = new Router();\r\n this.logger = new Logger({\r\n level: this.config.logging?.enabled === false ? \"silent\" : this.config.logging?.level,\r\n colors: this.config.logging?.colors,\r\n timestamp: this.config.logging?.timestamp,\r\n });\r\n }\r\n\r\n use(handler: MiddlewareHandler | PluginHandler): this {\r\n this.compiledChain = null;\r\n if (handler.length <= 2) {\r\n this.plugins.push(handler as PluginHandler);\r\n } else {\r\n this.middlewares.push(handler as MiddlewareHandler);\r\n }\r\n return this;\r\n }\r\n\r\n plugin(handler: PluginHandler): this {\r\n this.compiledChain = null;\r\n this.plugins.push(handler);\r\n return this;\r\n }\r\n\r\n onError(handler: ErrorHandler): this {\r\n this.errorHandler = handler;\r\n return this;\r\n }\r\n\r\n get(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"GET\", path, handlers);\r\n }\r\n\r\n post(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"POST\", path, handlers);\r\n }\r\n\r\n put(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"PUT\", path, handlers);\r\n }\r\n\r\n delete(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"DELETE\", path, handlers);\r\n }\r\n\r\n patch(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"PATCH\", path, handlers);\r\n }\r\n\r\n head(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"HEAD\", path, handlers);\r\n }\r\n\r\n options(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"OPTIONS\", path, handlers);\r\n }\r\n\r\n all(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n const methods: HttpMethod[] = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"OPTIONS\"];\r\n for (const method of methods) {\r\n this.route(method, path, handlers);\r\n }\r\n return this;\r\n }\r\n\r\n private route(method: HttpMethod, path: string, handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n let meta: RouteMeta | undefined;\r\n let list = handlers as unknown[];\r\n const last = list[list.length - 1];\r\n if (list.length >= 2 && isRouteDocumentMeta(last)) {\r\n meta = last;\r\n list = list.slice(0, -1);\r\n }\r\n if (list.length === 0) {\r\n throw new Error(`Route ${method} ${path} requires a handler function`);\r\n }\r\n const routeHandler = list[list.length - 1] as any;\r\n const middlewares = list.slice(0, -1) as MiddlewareHandler[];\r\n this.router.add(method, path, routeHandler, middlewares, meta);\r\n return this;\r\n }\r\n\r\n register(...controllers: (new (...args: any[]) => any)[]): this {\r\n for (const Controller of controllers) {\r\n this.registerController(Controller);\r\n }\r\n return this;\r\n }\r\n\r\n private registerController(Controller: new (...args: any[]) => any): void {\r\n const instance = new Controller();\r\n const prefix: string = Reflect.getMetadata?.(CONTROLLER_META_KEY, Controller) ?? \"\";\r\n const controllerMiddlewares: MiddlewareHandler[] =\r\n Reflect.getMetadata?.(\"azura:middlewares\", Controller) ?? [];\r\n const controllerTags: string[] = Reflect.getMetadata?.(API_TAGS_KEY, Controller) ?? [];\r\n\r\n const prototype = Controller.prototype;\r\n const propertyNames = Object.getOwnPropertyNames(prototype).filter(\r\n (p) => p !== \"constructor\",\r\n );\r\n\r\n for (const propertyKey of propertyNames) {\r\n const routeMeta: RouteMetadata | undefined = Reflect.getMetadata?.(\r\n ROUTES_META_KEY,\r\n prototype,\r\n propertyKey,\r\n );\r\n\r\n if (!routeMeta) continue;\r\n\r\n const fullPath = this.joinPaths(prefix, routeMeta.path);\r\n const paramsMeta = Reflect.getMetadata?.(PARAMS_META_KEY, prototype, propertyKey) ?? [];\r\n const routeMiddlewares: MiddlewareHandler[] =\r\n Reflect.getMetadata?.(\"azura:middlewares\", prototype, propertyKey) ?? [];\r\n\r\n const allMiddlewares = [...controllerMiddlewares, ...routeMiddlewares];\r\n\r\n const methodTags: string[] = Reflect.getMetadata?.(METHOD_TAGS_KEY, prototype, propertyKey) ?? [];\r\n const opExtra = (Reflect.getMetadata?.(API_OPERATION_KEY, prototype, propertyKey) ??\r\n {}) as Partial<RouteMeta>;\r\n const tagList = [...controllerTags, ...methodTags, ...(routeMeta.meta?.tags ?? [])];\r\n const mergedMeta: RouteMeta | undefined = (() => {\r\n const m = { ...routeMeta.meta, ...opExtra } as RouteMeta;\r\n if (tagList.length) m.tags = tagList;\r\n return Object.keys(m).length ? m : undefined;\r\n })();\r\n\r\n const handler = async (req: AzuraRequest, res: AzuraResponse) => {\r\n const args = this.resolveParams(paramsMeta, req, res);\r\n const result = await instance[propertyKey](...args);\r\n if (result !== undefined && !res.sent) {\r\n if (typeof result === \"object\") {\r\n res.json(result);\r\n } else {\r\n res.send(String(result));\r\n }\r\n }\r\n };\r\n\r\n this.router.add(routeMeta.method, fullPath, handler, allMiddlewares, mergedMeta);\r\n }\r\n }\r\n\r\n private resolveParams(paramsMeta: any[], req: AzuraRequest, res: AzuraResponse): any[] {\r\n if (!paramsMeta || paramsMeta.length === 0) return [req, res];\r\n\r\n const sorted = [...paramsMeta].sort((a, b) => a.index - b.index);\r\n const args: any[] = new Array(sorted.length);\r\n\r\n for (const meta of sorted) {\r\n let value: any;\r\n\r\n switch (meta.type) {\r\n case \"body\":\r\n value = meta.name ? req.body?.[meta.name] : req.body;\r\n break;\r\n case \"query\":\r\n value = meta.name ? req.query[meta.name] : req.query;\r\n break;\r\n case \"param\":\r\n value = meta.name ? req.params[meta.name] : req.params;\r\n break;\r\n case \"header\":\r\n value = meta.name ? req.headers[meta.name.toLowerCase()] : req.headers;\r\n break;\r\n case \"cookie\":\r\n value = meta.name ? req.cookies[meta.name] : req.cookies;\r\n break;\r\n case \"req\":\r\n value = req;\r\n break;\r\n case \"res\":\r\n value = res;\r\n break;\r\n case \"next\":\r\n value = () => {};\r\n break;\r\n case \"ip\":\r\n value = req.ip;\r\n break;\r\n case \"session\":\r\n value = req.session;\r\n break;\r\n default:\r\n value = undefined;\r\n }\r\n\r\n if (meta.pipes) {\r\n for (const pipe of meta.pipes) {\r\n value = pipe(value);\r\n }\r\n }\r\n\r\n args[meta.index] = value;\r\n }\r\n\r\n return args;\r\n }\r\n\r\n private joinPaths(prefix: string, path: string): string {\r\n const p = prefix.endsWith(\"/\") ? prefix.slice(0, -1) : prefix;\r\n const s = path.startsWith(\"/\") ? path : `/${path}`;\r\n return `${p}${s}`;\r\n }\r\n\r\n private extendRequest(req: IncomingMessage, pathname: string, query: Record<string, string | string[]>): AzuraRequest {\r\n const azReq = req as AzuraRequest;\r\n azReq.pathname = pathname;\r\n azReq.query = query;\r\n azReq.params = {};\r\n azReq.cookies = parseCookies(req.headers.cookie);\r\n azReq.ip = resolveIp(req);\r\n azReq.protocol = (req.socket as any).encrypted ? \"https\" : \"http\";\r\n azReq.secure = azReq.protocol === \"https\";\r\n azReq.hostname = (req.headers.host ?? \"localhost\").split(\":\")[0];\r\n azReq.startTime = process.hrtime.bigint();\r\n azReq.raw = req;\r\n return azReq;\r\n }\r\n\r\n private extendResponse(res: ServerResponse): AzuraResponse {\r\n const azRes = res as AzuraResponse;\r\n azRes.locals = {};\r\n azRes.sent = false;\r\n\r\n azRes.status = function (code: number) {\r\n this.statusCode = code;\r\n return this;\r\n };\r\n\r\n azRes.json = function (data: unknown) {\r\n if (this.sent) return;\r\n this.sent = true;\r\n const body = JSON.stringify(data);\r\n this.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\r\n this.setHeader(\"Content-Length\", Buffer.byteLength(body));\r\n this.end(body);\r\n };\r\n\r\n azRes.send = function (body: string | Buffer) {\r\n if (this.sent) return;\r\n this.sent = true;\r\n if (!this.getHeader(\"Content-Type\")) {\r\n this.setHeader(\"Content-Type\", typeof body === \"string\" ? \"text/plain; charset=utf-8\" : \"application/octet-stream\");\r\n }\r\n const buf = typeof body === \"string\" ? Buffer.from(body) : body;\r\n this.setHeader(\"Content-Length\", buf.length);\r\n this.end(buf);\r\n };\r\n\r\n azRes.html = function (body: string) {\r\n if (this.sent) return;\r\n this.sent = true;\r\n this.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n this.setHeader(\"Content-Length\", Buffer.byteLength(body));\r\n this.end(body);\r\n };\r\n\r\n azRes.redirect = function (url: string, code = 302) {\r\n if (this.sent) return;\r\n this.sent = true;\r\n this.statusCode = code;\r\n this.setHeader(\"Location\", url);\r\n this.end();\r\n };\r\n\r\n azRes.cookie = function (name: string, value: string, options?: CookieOptions) {\r\n const header = serializeCookie(name, value, options);\r\n const existing = this.getHeader(\"Set-Cookie\");\r\n if (existing) {\r\n const arr = Array.isArray(existing) ? existing : [String(existing)];\r\n arr.push(header);\r\n this.setHeader(\"Set-Cookie\", arr);\r\n } else {\r\n this.setHeader(\"Set-Cookie\", header);\r\n }\r\n return this;\r\n };\r\n\r\n azRes.clearCookie = function (name: string, options?: CookieOptions) {\r\n const header = clearCookieHeader(name, options);\r\n const existing = this.getHeader(\"Set-Cookie\");\r\n if (existing) {\r\n const arr = Array.isArray(existing) ? existing : [String(existing)];\r\n arr.push(header);\r\n this.setHeader(\"Set-Cookie\", arr);\r\n } else {\r\n this.setHeader(\"Set-Cookie\", header);\r\n }\r\n return this;\r\n };\r\n\r\n azRes.header = function (name: string, value: string | number | string[]) {\r\n this.setHeader(name, value as any);\r\n return this;\r\n };\r\n\r\n azRes.type = function (contentType: string) {\r\n this.setHeader(\"Content-Type\", contentType);\r\n return this;\r\n };\r\n\r\n azRes.attachment = function (filename?: string) {\r\n if (filename) {\r\n this.setHeader(\"Content-Disposition\", `attachment; filename=\"${filename}\"`);\r\n } else {\r\n this.setHeader(\"Content-Disposition\", \"attachment\");\r\n }\r\n return this;\r\n };\r\n\r\n azRes.download = function (_path: string, _filename?: string) {\r\n // TODO: implement file streaming\r\n };\r\n\r\n return azRes;\r\n }\r\n\r\n private compileMiddlewareChain(): (req: AzuraRequest, res: AzuraResponse) => Promise<void> {\r\n if (this.compiledChain) return this.compiledChain;\r\n\r\n const self = this;\r\n const globalMiddlewares = [...this.middlewares];\r\n\r\n this.compiledChain = async (req: AzuraRequest, res: AzuraResponse) => {\r\n for (const plugin of self.plugins) {\r\n if (res.sent) return;\r\n await new Promise<void>((resolve, reject) => {\r\n try {\r\n const result = plugin({ req, res }, (err) => {\r\n if (err) reject(err);\r\n else resolve();\r\n });\r\n if (result && typeof (result as any).then === \"function\") {\r\n (result as Promise<void>).then(resolve, reject);\r\n }\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n }\r\n\r\n if (res.sent) return;\r\n\r\n let idx = 0;\r\n const runMiddleware = async (): Promise<void> => {\r\n if (idx >= globalMiddlewares.length || res.sent) return;\r\n const mw = globalMiddlewares[idx++];\r\n await new Promise<void>((resolve, reject) => {\r\n try {\r\n const result = mw(req, res, (err) => {\r\n if (err) reject(err);\r\n else resolve();\r\n });\r\n if (result && typeof (result as any).then === \"function\") {\r\n (result as Promise<void>).then(resolve, reject);\r\n }\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n await runMiddleware();\r\n };\r\n\r\n await runMiddleware();\r\n };\r\n\r\n return this.compiledChain;\r\n }\r\n\r\n private async handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\r\n const { pathname, search } = parseUrl(req.url ?? \"/\");\r\n const query = parseQueryString(search);\r\n\r\n const azReq = this.extendRequest(req, pathname, query);\r\n const azRes = this.extendResponse(res);\r\n\r\n try {\r\n const chain = this.compileMiddlewareChain();\r\n await chain(azReq, azRes);\r\n\r\n if (azRes.sent) return;\r\n\r\n const method = (req.method ?? \"GET\").toUpperCase() as HttpMethod;\r\n const match = this.router.find(method, pathname);\r\n\r\n if (!match) {\r\n if (pathname === \"/favicon.ico\") {\r\n azRes.status(204).send(\"\");\r\n return;\r\n }\r\n throw HttpError.notFound(`Route ${method} ${pathname} not found`);\r\n }\r\n\r\n azReq.params = match.params;\r\n\r\n if (method !== \"GET\" && method !== \"HEAD\" && method !== \"OPTIONS\") {\r\n azReq.body = await parseBody(req);\r\n }\r\n\r\n for (const mw of match.middlewares) {\r\n if (azRes.sent) return;\r\n await new Promise<void>((resolve, reject) => {\r\n try {\r\n const result = mw(azReq, azRes, (err) => {\r\n if (err) reject(err);\r\n else resolve();\r\n });\r\n if (result && typeof (result as any).then === \"function\") {\r\n (result as Promise<void>).then(resolve, reject);\r\n }\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n }\r\n\r\n if (azRes.sent) return;\r\n\r\n const result = await match.handler(azReq, azRes);\r\n\r\n if (result !== undefined && !azRes.sent) {\r\n if (typeof result === \"object\" && result !== null) {\r\n azRes.json(result);\r\n } else {\r\n azRes.send(String(result));\r\n }\r\n }\r\n } catch (err) {\r\n this.handleError(err, azReq, azRes);\r\n } finally {\r\n if (this.config.logging?.requestLogging) {\r\n const duration = process.hrtime.bigint() - azReq.startTime;\r\n this.logger.request(\r\n req.method ?? \"GET\",\r\n pathname,\r\n res.statusCode,\r\n duration,\r\n );\r\n }\r\n }\r\n }\r\n\r\n private handleError(err: any, req: AzuraRequest, res: AzuraResponse): void {\r\n if (res.sent) return;\r\n\r\n if (this.errorHandler) {\r\n try {\r\n this.errorHandler(err, req, res, () => {});\r\n return;\r\n } catch (handlerErr) {\r\n this.logger.error(\"Error handler threw:\", handlerErr);\r\n }\r\n }\r\n\r\n if (err instanceof HttpError) {\r\n res.status(err.statusCode).json(err.toJSON());\r\n return;\r\n }\r\n\r\n const statusCode = err?.statusCode ?? err?.status ?? 500;\r\n const message = this.config.environment === \"production\"\r\n ? \"Internal Server Error\"\r\n : err?.message ?? \"Internal Server Error\";\r\n\r\n this.logger.error(`Unhandled error: ${err?.message ?? err}`);\r\n if (this.config.debug && err?.stack) {\r\n this.logger.error(err.stack);\r\n }\r\n\r\n res.status(statusCode).json({\r\n error: {\r\n statusCode,\r\n message,\r\n ...(this.config.debug ? { stack: err?.stack } : {}),\r\n },\r\n });\r\n }\r\n\r\n async listen(port?: number, callback?: () => void): Promise<Server> {\r\n const serverPort = port ?? this.config.server?.port ?? 3000;\r\n const host = this.config.server?.host ?? \"0.0.0.0\";\r\n\r\n const handler = (req: IncomingMessage, res: ServerResponse) => {\r\n this.handleRequest(req, res).catch((err) => {\r\n this.logger.error(\"Fatal request error:\", err);\r\n if (!res.headersSent) {\r\n res.statusCode = 500;\r\n res.end('{\"error\":{\"statusCode\":500,\"message\":\"Internal Server Error\"}}');\r\n }\r\n });\r\n };\r\n\r\n if (this.config.server?.https) {\r\n const httpsConfig = this.config.server.https;\r\n this.server = createHttpsServer(\r\n {\r\n key: readFileSync(httpsConfig.key),\r\n cert: readFileSync(httpsConfig.cert),\r\n ...(httpsConfig.ca ? { ca: readFileSync(httpsConfig.ca) } : {}),\r\n },\r\n handler,\r\n );\r\n } else {\r\n this.server = createServer(handler);\r\n }\r\n\r\n if (this.config.server?.keepAliveTimeout) {\r\n this.server.keepAliveTimeout = this.config.server.keepAliveTimeout;\r\n }\r\n if (this.config.server?.headersTimeout) {\r\n this.server.headersTimeout = this.config.server.headersTimeout;\r\n }\r\n\r\n return new Promise((resolve) => {\r\n this.server!.listen(serverPort, host, () => {\r\n this.logger.banner(serverPort, host);\r\n callback?.();\r\n resolve(this.server!);\r\n });\r\n });\r\n }\r\n\r\n async close(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n if (!this.server) {\r\n resolve();\r\n return;\r\n }\r\n this.server.close((err) => {\r\n if (err) reject(err);\r\n else resolve();\r\n });\r\n });\r\n }\r\n\r\n getRouter(): Router {\r\n return this.router;\r\n }\r\n\r\n getLogger(): Logger {\r\n return this.logger;\r\n }\r\n\r\n getConfig(): AzuraConfig {\r\n return this.config;\r\n }\r\n\r\n getRoutes(): Array<{ method: HttpMethod; path: string }> {\r\n return this.router.getAllRoutes();\r\n }\r\n\r\n /** Rotas com metadados OpenAPI (para Swagger ou export manual). */\r\n getRouteDocuments() {\r\n return this.router.getRouteDocuments();\r\n }\r\n\r\n /** Gera documento OpenAPI 3.0 a partir das rotas registadas. */\r\n getOpenApiDocument(options: BuildOpenApiOptions = {}) {\r\n return buildOpenApiDocument(this.getRouteDocuments(), options);\r\n }\r\n}\r\n","import type { HttpMethod, MiddlewareHandler } from \"../types/common.type.js\";\r\nimport type { ParamMetadata, RouteMeta } from \"../types/routes.type.js\";\r\n\r\nconst CONTROLLER_META_KEY = \"azura:controller\";\r\nconst ROUTES_META_KEY = \"azura:routes\";\r\nconst PARAMS_META_KEY = \"azura:params\";\r\nconst MIDDLEWARES_META_KEY = \"azura:middlewares\";\r\n\r\nfunction ensureReflect(): void {\r\n if (typeof Reflect === \"undefined\" || !Reflect.getMetadata) {\r\n const store = new Map<string, Map<any, any>>();\r\n (Reflect as any).defineMetadata = (key: string, value: any, target: any, prop?: string) => {\r\n const k = prop ? `${key}::${prop}` : key;\r\n if (!store.has(k)) store.set(k, new Map());\r\n store.get(k)!.set(target, value);\r\n };\r\n (Reflect as any).getMetadata = (key: string, target: any, prop?: string) => {\r\n const k = prop ? `${key}::${prop}` : key;\r\n return store.get(k)?.get(target);\r\n };\r\n }\r\n}\r\n\r\nensureReflect();\r\n\r\nexport function Controller(prefix: string = \"\"): ClassDecorator {\r\n return (target) => {\r\n Reflect.defineMetadata(CONTROLLER_META_KEY, prefix, target);\r\n };\r\n}\r\n\r\nfunction createMethodDecorator(method: HttpMethod) {\r\n return (path: string = \"\"): MethodDecorator => {\r\n return (target, propertyKey, _descriptor) => {\r\n Reflect.defineMetadata(\r\n ROUTES_META_KEY,\r\n { method, path, propertyKey: String(propertyKey), middlewares: [], params: [], meta: undefined },\r\n target,\r\n String(propertyKey),\r\n );\r\n };\r\n };\r\n}\r\n\r\nexport const Get = createMethodDecorator(\"GET\");\r\nexport const Post = createMethodDecorator(\"POST\");\r\nexport const Put = createMethodDecorator(\"PUT\");\r\nexport const Delete = createMethodDecorator(\"DELETE\");\r\nexport const Patch = createMethodDecorator(\"PATCH\");\r\nexport const Head = createMethodDecorator(\"HEAD\");\r\nexport const Options = createMethodDecorator(\"OPTIONS\");\r\n\r\nfunction createParamDecorator(type: ParamMetadata[\"type\"]) {\r\n return (name?: string): ParameterDecorator => {\r\n return (target, propertyKey, parameterIndex) => {\r\n const key = String(propertyKey);\r\n const existing: ParamMetadata[] = Reflect.getMetadata(PARAMS_META_KEY, target, key) ?? [];\r\n existing.push({ index: parameterIndex, type, name });\r\n Reflect.defineMetadata(PARAMS_META_KEY, existing, target, key);\r\n };\r\n };\r\n}\r\n\r\nexport const Body = createParamDecorator(\"body\");\r\nexport const Query = createParamDecorator(\"query\");\r\nexport const Param = createParamDecorator(\"param\");\r\nexport const Headers = createParamDecorator(\"header\");\r\nexport const Cookies = createParamDecorator(\"cookie\");\r\nexport const Req = createParamDecorator(\"req\");\r\nexport const Res = createParamDecorator(\"res\");\r\nexport const NextFunc = createParamDecorator(\"next\");\r\nexport const Ip = createParamDecorator(\"ip\");\r\nexport const Session = createParamDecorator(\"session\");\r\n\r\nexport function UseMiddleware(...middlewares: MiddlewareHandler[]): MethodDecorator & ClassDecorator {\r\n return (target: any, propertyKey?: string | symbol, _descriptor?: PropertyDescriptor) => {\r\n if (propertyKey) {\r\n const existing: MiddlewareHandler[] =\r\n Reflect.getMetadata(MIDDLEWARES_META_KEY, target, String(propertyKey)) ?? [];\r\n Reflect.defineMetadata(MIDDLEWARES_META_KEY, [...existing, ...middlewares], target, String(propertyKey));\r\n } else {\r\n const existing: MiddlewareHandler[] =\r\n Reflect.getMetadata(MIDDLEWARES_META_KEY, target) ?? [];\r\n Reflect.defineMetadata(MIDDLEWARES_META_KEY, [...existing, ...middlewares], target);\r\n }\r\n };\r\n}\r\n\r\nexport function applyDecorators(...decorators: (MethodDecorator | ClassDecorator)[]): MethodDecorator & ClassDecorator {\r\n return (target: any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor) => {\r\n for (const decorator of decorators) {\r\n if (propertyKey !== undefined) {\r\n (decorator as MethodDecorator)(target, propertyKey, descriptor!);\r\n } else {\r\n (decorator as ClassDecorator)(target);\r\n }\r\n }\r\n };\r\n}\r\n\r\nexport function Meta(key: string, value: any): MethodDecorator {\r\n return (target, propertyKey, _descriptor) => {\r\n const routeMeta = Reflect.getMetadata(ROUTES_META_KEY, target, String(propertyKey));\r\n if (routeMeta) {\r\n if (!routeMeta.meta) routeMeta.meta = {};\r\n routeMeta.meta[key] = value;\r\n Reflect.defineMetadata(ROUTES_META_KEY, routeMeta, target, String(propertyKey));\r\n }\r\n };\r\n}\r\n","import type { RouteMeta } from \"../types/routes.type.js\";\r\nimport { API_OPERATION_KEY, API_TAGS_KEY, METHOD_TAGS_KEY } from \"./constants.js\";\r\n\r\n/**\r\n * Tags OpenAPI no controller (todas as rotas) ou num método específico.\r\n * Compatível com `experimentalDecorators` (assinatura legacy de 3 argumentos em métodos).\r\n */\r\nexport function ApiTags(...tags: string[]): ClassDecorator & MethodDecorator {\r\n return function (\r\n target: object,\r\n propertyKey?: string | symbol,\r\n _descriptor?: PropertyDescriptor,\r\n ): void {\r\n if (propertyKey === undefined) {\r\n Reflect.defineMetadata(API_TAGS_KEY, tags, target);\r\n } else {\r\n Reflect.defineMetadata(METHOD_TAGS_KEY, tags, target, String(propertyKey));\r\n }\r\n } as ClassDecorator & MethodDecorator;\r\n}\r\n\r\n/**\r\n * Metadados OpenAPI (summary, description, responses, parameters, etc.).\r\n */\r\nexport function ApiOperation(meta: Partial<RouteMeta>): MethodDecorator {\r\n return function (\r\n target: object,\r\n propertyKey: string | symbol,\r\n _descriptor: PropertyDescriptor,\r\n ): void {\r\n const key = String(propertyKey);\r\n const cur = (Reflect.getMetadata?.(API_OPERATION_KEY, target, key) ?? {}) as Partial<RouteMeta>;\r\n Reflect.defineMetadata(API_OPERATION_KEY, { ...cur, ...meta }, target, key);\r\n };\r\n}\r\n","import type { CORSOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nconst DEFAULT_METHODS = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"OPTIONS\"];\r\nconst DEFAULT_HEADERS = [\"Content-Type\", \"Authorization\", \"Accept\", \"X-Requested-With\"];\r\n\r\nexport function CORSPlugin(options: CORSOptions = {}): PluginHandler {\r\n const {\r\n origins = \"*\",\r\n methods = DEFAULT_METHODS,\r\n allowedHeaders = DEFAULT_HEADERS,\r\n exposedHeaders = [],\r\n credentials = false,\r\n maxAge = 86400,\r\n preflightContinue = false,\r\n } = options;\r\n\r\n const methodsStr = methods.join(\", \");\r\n const headersStr = allowedHeaders.join(\", \");\r\n const exposedStr = exposedHeaders.length > 0 ? exposedHeaders.join(\", \") : \"\";\r\n\r\n const isAllowedOrigin = (origin: string): string | false => {\r\n if (origins === \"*\") return credentials ? origin : \"*\";\r\n if (typeof origins === \"function\") return origins(origin) ? origin : false;\r\n if (typeof origins === \"string\") return origin === origins ? origin : false;\r\n if (Array.isArray(origins)) return origins.includes(origin) ? origin : false;\r\n return false;\r\n };\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n const origin = req.headers.origin ?? \"\";\r\n\r\n const allowedOrigin = isAllowedOrigin(origin);\r\n\r\n if (allowedOrigin) {\r\n res.setHeader(\"Access-Control-Allow-Origin\", allowedOrigin);\r\n if (credentials) res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\r\n if (exposedStr) res.setHeader(\"Access-Control-Expose-Headers\", exposedStr);\r\n if (allowedOrigin !== \"*\") res.setHeader(\"Vary\", \"Origin\");\r\n }\r\n\r\n if (req.method === \"OPTIONS\") {\r\n res.setHeader(\"Access-Control-Allow-Methods\", methodsStr);\r\n res.setHeader(\"Access-Control-Allow-Headers\", headersStr);\r\n res.setHeader(\"Access-Control-Max-Age\", String(maxAge));\r\n\r\n if (!preflightContinue) {\r\n res.statusCode = 204;\r\n res.end();\r\n return;\r\n }\r\n }\r\n\r\n next();\r\n };\r\n}\r\n","import type { RateLimitOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\nimport type { AzuraRequest } from \"../types/common.type.js\";\r\n\r\ninterface SlidingWindowEntry {\r\n count: number;\r\n resetTime: number;\r\n}\r\n\r\nclass MemoryStore {\r\n private store = new Map<string, SlidingWindowEntry>();\r\n private cleanupInterval: ReturnType<typeof setInterval>;\r\n\r\n constructor(windowMs: number) {\r\n this.cleanupInterval = setInterval(() => {\r\n const now = Date.now();\r\n for (const [key, entry] of this.store) {\r\n if (now >= entry.resetTime) this.store.delete(key);\r\n }\r\n }, windowMs);\r\n if (this.cleanupInterval.unref) this.cleanupInterval.unref();\r\n }\r\n\r\n increment(key: string, windowMs: number): { totalHits: number; resetTime: Date } {\r\n const now = Date.now();\r\n const entry = this.store.get(key);\r\n\r\n if (!entry || now >= entry.resetTime) {\r\n const resetTime = now + windowMs;\r\n this.store.set(key, { count: 1, resetTime });\r\n return { totalHits: 1, resetTime: new Date(resetTime) };\r\n }\r\n\r\n entry.count++;\r\n return { totalHits: entry.count, resetTime: new Date(entry.resetTime) };\r\n }\r\n\r\n decrement(key: string): void {\r\n const entry = this.store.get(key);\r\n if (entry && entry.count > 0) entry.count--;\r\n }\r\n\r\n resetKey(key: string): void {\r\n this.store.delete(key);\r\n }\r\n\r\n destroy(): void {\r\n clearInterval(this.cleanupInterval);\r\n this.store.clear();\r\n }\r\n}\r\n\r\nexport function RateLimitPlugin(options: RateLimitOptions = {}): PluginHandler {\r\n const {\r\n windowMs = 60_000,\r\n max = 100,\r\n message = { error: { statusCode: 429, message: \"Too many requests, please try again later\" } },\r\n statusCode = 429,\r\n keyGenerator = (req: AzuraRequest) => req.ip,\r\n skipSuccessfulRequests = false,\r\n skipFailedRequests = false,\r\n } = options;\r\n\r\n const memStore = new MemoryStore(windowMs);\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n const key = keyGenerator(req);\r\n const { totalHits, resetTime } = memStore.increment(key, windowMs);\r\n\r\n res.setHeader(\"X-RateLimit-Limit\", String(max));\r\n res.setHeader(\"X-RateLimit-Remaining\", String(Math.max(0, max - totalHits)));\r\n res.setHeader(\"X-RateLimit-Reset\", String(Math.ceil(resetTime.getTime() / 1000)));\r\n\r\n if (totalHits > max) {\r\n res.setHeader(\"Retry-After\", String(Math.ceil(windowMs / 1000)));\r\n res.statusCode = statusCode;\r\n const body = typeof message === \"string\" ? message : JSON.stringify(message);\r\n res.setHeader(\"Content-Type\", typeof message === \"string\" ? \"text/plain\" : \"application/json\");\r\n res.end(body);\r\n return;\r\n }\r\n\r\n const origEnd = res.end;\r\n res.end = function (...args: any[]) {\r\n if (skipSuccessfulRequests && res.statusCode < 400) {\r\n memStore.decrement(key);\r\n }\r\n if (skipFailedRequests && res.statusCode >= 400) {\r\n memStore.decrement(key);\r\n }\r\n return (origEnd as any).apply(this, args);\r\n };\r\n\r\n next();\r\n };\r\n}\r\n","import type { HelmetOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nexport function HelmetPlugin(options: HelmetOptions = {}): PluginHandler {\r\n const headers: [string, string][] = [];\r\n\r\n if (options.noSniff !== false) {\r\n headers.push([\"X-Content-Type-Options\", \"nosniff\"]);\r\n }\r\n\r\n if (options.xssFilter !== false) {\r\n headers.push([\"X-XSS-Protection\", \"0\"]);\r\n }\r\n\r\n if (options.ieNoOpen !== false) {\r\n headers.push([\"X-Download-Options\", \"noopen\"]);\r\n }\r\n\r\n const frameguard = options.frameguard ?? true;\r\n if (frameguard !== false) {\r\n const action = typeof frameguard === \"object\" ? frameguard.action : \"sameorigin\";\r\n headers.push([\"X-Frame-Options\", action.toUpperCase()]);\r\n }\r\n\r\n if (options.dnsPrefetchControl !== false) {\r\n const allow = typeof options.dnsPrefetchControl === \"object\"\r\n ? options.dnsPrefetchControl.allow\r\n : false;\r\n headers.push([\"X-DNS-Prefetch-Control\", allow ? \"on\" : \"off\"]);\r\n }\r\n\r\n const hsts = options.hsts ?? true;\r\n if (hsts !== false) {\r\n const maxAge = typeof hsts === \"object\" ? hsts.maxAge : 15552000;\r\n const includeSubDomains = typeof hsts === \"object\" ? hsts.includeSubDomains !== false : true;\r\n const preload = typeof hsts === \"object\" ? hsts.preload : false;\r\n let value = `max-age=${maxAge}`;\r\n if (includeSubDomains) value += \"; includeSubDomains\";\r\n if (preload) value += \"; preload\";\r\n headers.push([\"Strict-Transport-Security\", value]);\r\n }\r\n\r\n if (options.crossOriginEmbedderPolicy !== false) {\r\n headers.push([\"Cross-Origin-Embedder-Policy\", \"require-corp\"]);\r\n }\r\n\r\n if (options.crossOriginOpenerPolicy !== false) {\r\n const policy = typeof options.crossOriginOpenerPolicy === \"object\"\r\n ? options.crossOriginOpenerPolicy.policy\r\n : \"same-origin\";\r\n headers.push([\"Cross-Origin-Opener-Policy\", policy]);\r\n }\r\n\r\n if (options.crossOriginResourcePolicy !== false) {\r\n const policy = typeof options.crossOriginResourcePolicy === \"object\"\r\n ? options.crossOriginResourcePolicy.policy\r\n : \"same-origin\";\r\n headers.push([\"Cross-Origin-Resource-Policy\", policy]);\r\n }\r\n\r\n const referrer = options.referrerPolicy ?? true;\r\n if (referrer !== false) {\r\n const policy = typeof referrer === \"object\"\r\n ? (Array.isArray(referrer.policy) ? referrer.policy.join(\", \") : referrer.policy)\r\n : \"no-referrer\";\r\n headers.push([\"Referrer-Policy\", policy]);\r\n }\r\n\r\n if (options.contentSecurityPolicy !== false && options.contentSecurityPolicy) {\r\n const csp = options.contentSecurityPolicy;\r\n const directives = Object.entries(csp)\r\n .map(([key, values]) => `${key} ${values.join(\" \")}`)\r\n .join(\"; \");\r\n headers.push([\"Content-Security-Policy\", directives]);\r\n }\r\n\r\n if (options.permissionsPolicy) {\r\n const pp = Object.entries(options.permissionsPolicy)\r\n .map(([key, values]) => `${key}=(${values.join(\" \")})`)\r\n .join(\", \");\r\n headers.push([\"Permissions-Policy\", pp]);\r\n }\r\n\r\n return (ctx, next) => {\r\n for (const [name, value] of headers) {\r\n ctx.res.setHeader(name, value);\r\n }\r\n next();\r\n };\r\n}\r\n","import { createHmac } from \"node:crypto\";\r\nimport type { JWTOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\nimport type { AzuraRequest } from \"../types/common.type.js\";\r\n\r\nfunction base64urlEncode(data: string | Buffer): string {\r\n const buf = typeof data === \"string\" ? Buffer.from(data) : data;\r\n return buf.toString(\"base64url\");\r\n}\r\n\r\nfunction base64urlDecode(str: string): string {\r\n return Buffer.from(str, \"base64url\").toString(\"utf-8\");\r\n}\r\n\r\nconst ALGO_MAP: Record<string, string> = {\r\n HS256: \"sha256\",\r\n HS384: \"sha384\",\r\n HS512: \"sha512\",\r\n};\r\n\r\nexport interface JWTPayload {\r\n [key: string]: any;\r\n iat?: number;\r\n exp?: number;\r\n iss?: string;\r\n aud?: string;\r\n sub?: string;\r\n}\r\n\r\nexport function signJWT(payload: JWTPayload, secret: string, options: { algorithm?: string; expiresIn?: string | number } = {}): string {\r\n const algorithm = options.algorithm ?? \"HS256\";\r\n const header = base64urlEncode(JSON.stringify({ alg: algorithm, typ: \"JWT\" }));\r\n\r\n const now = Math.floor(Date.now() / 1000);\r\n const body: JWTPayload = { ...payload, iat: now };\r\n\r\n if (options.expiresIn) {\r\n body.exp = now + parseExpiration(options.expiresIn);\r\n }\r\n\r\n const encodedPayload = base64urlEncode(JSON.stringify(body));\r\n const signature = createHmac(ALGO_MAP[algorithm] ?? \"sha256\", secret)\r\n .update(`${header}.${encodedPayload}`)\r\n .digest(\"base64url\");\r\n\r\n return `${header}.${encodedPayload}.${signature}`;\r\n}\r\n\r\nexport function verifyJWT(token: string, secret: string, options: { algorithm?: string } = {}): JWTPayload {\r\n const parts = token.split(\".\");\r\n if (parts.length !== 3) throw new Error(\"Invalid token format\");\r\n\r\n const [header, payload, signature] = parts;\r\n const algorithm = options.algorithm ?? \"HS256\";\r\n\r\n const expectedSig = createHmac(ALGO_MAP[algorithm] ?? \"sha256\", secret)\r\n .update(`${header}.${payload}`)\r\n .digest(\"base64url\");\r\n\r\n if (signature !== expectedSig) throw new Error(\"Invalid token signature\");\r\n\r\n const decoded = JSON.parse(base64urlDecode(payload)) as JWTPayload;\r\n\r\n if (decoded.exp && decoded.exp < Math.floor(Date.now() / 1000)) {\r\n throw new Error(\"Token expired\");\r\n }\r\n\r\n return decoded;\r\n}\r\n\r\nfunction parseExpiration(exp: string | number): number {\r\n if (typeof exp === \"number\") return exp;\r\n const match = exp.match(/^(\\d+)(s|m|h|d)$/);\r\n if (!match) return 3600;\r\n const val = parseInt(match[1], 10);\r\n switch (match[2]) {\r\n case \"s\": return val;\r\n case \"m\": return val * 60;\r\n case \"h\": return val * 3600;\r\n case \"d\": return val * 86400;\r\n default: return 3600;\r\n }\r\n}\r\n\r\nfunction extractToken(req: AzuraRequest): string | null {\r\n const auth = req.headers.authorization;\r\n if (auth?.startsWith(\"Bearer \")) return auth.slice(7);\r\n return (req.query.token as string) ?? req.cookies?.token ?? null;\r\n}\r\n\r\nexport function JWTPlugin(options: JWTOptions): PluginHandler {\r\n const {\r\n secret,\r\n algorithm = \"HS256\",\r\n paths = [],\r\n exclude = [],\r\n getToken,\r\n } = options;\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n const path = req.pathname;\r\n\r\n if (exclude.some((p) => path.startsWith(p))) {\r\n next();\r\n return;\r\n }\r\n\r\n if (paths.length > 0 && !paths.some((p) => path.startsWith(p))) {\r\n next();\r\n return;\r\n }\r\n\r\n const token = getToken ? getToken(req) : extractToken(req);\r\n\r\n if (!token) {\r\n res.statusCode = 401;\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.end(JSON.stringify({ error: { statusCode: 401, message: \"No token provided\" } }));\r\n return;\r\n }\r\n\r\n try {\r\n const payload = verifyJWT(token, secret, { algorithm });\r\n req.user = payload;\r\n next();\r\n } catch (err: any) {\r\n res.statusCode = 401;\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.end(JSON.stringify({ error: { statusCode: 401, message: err.message ?? \"Invalid token\" } }));\r\n }\r\n };\r\n}\r\n","import { randomBytes } from \"node:crypto\";\r\nimport type { SessionOptions, PluginHandler, SessionStore } from \"../types/plugins/plugin.type.js\";\r\n\r\nclass MemorySessionStore implements SessionStore {\r\n private sessions = new Map<string, { data: Record<string, any>; expires: number }>();\r\n private cleanupTimer: ReturnType<typeof setInterval>;\r\n\r\n constructor() {\r\n this.cleanupTimer = setInterval(() => {\r\n const now = Date.now();\r\n for (const [id, session] of this.sessions) {\r\n if (now >= session.expires) this.sessions.delete(id);\r\n }\r\n }, 60_000);\r\n if (this.cleanupTimer.unref) this.cleanupTimer.unref();\r\n }\r\n\r\n async get(id: string): Promise<Record<string, any> | null> {\r\n const session = this.sessions.get(id);\r\n if (!session) return null;\r\n if (Date.now() >= session.expires) {\r\n this.sessions.delete(id);\r\n return null;\r\n }\r\n return session.data;\r\n }\r\n\r\n async set(id: string, data: Record<string, any>, maxAge: number): Promise<void> {\r\n this.sessions.set(id, { data, expires: Date.now() + maxAge });\r\n }\r\n\r\n async destroy(id: string): Promise<void> {\r\n this.sessions.delete(id);\r\n }\r\n\r\n async touch(id: string, maxAge: number): Promise<void> {\r\n const session = this.sessions.get(id);\r\n if (session) session.expires = Date.now() + maxAge;\r\n }\r\n}\r\n\r\nfunction generateSessionId(): string {\r\n return randomBytes(24).toString(\"hex\");\r\n}\r\n\r\nexport function SessionPlugin(options: SessionOptions): PluginHandler {\r\n const {\r\n secret: _secret,\r\n name = \"azura.sid\",\r\n maxAge = 86400_000,\r\n secure = false,\r\n httpOnly = true,\r\n sameSite = \"Lax\",\r\n store = new MemorySessionStore(),\r\n } = options;\r\n\r\n return async (ctx, next) => {\r\n const { req, res } = ctx;\r\n\r\n let sessionId = req.cookies[name];\r\n let sessionData: Record<string, any> | null = null;\r\n\r\n if (sessionId) {\r\n sessionData = await store.get(sessionId);\r\n }\r\n\r\n if (!sessionData) {\r\n sessionId = generateSessionId();\r\n sessionData = {};\r\n }\r\n\r\n req.session = sessionData;\r\n\r\n const originalEnd = res.end;\r\n (res as any).end = async function (...args: any[]) {\r\n await store.set(sessionId!, req.session ?? {}, maxAge);\r\n\r\n const cookieParts = [\r\n `${name}=${sessionId}`,\r\n `Path=/`,\r\n `Max-Age=${Math.floor(maxAge / 1000)}`,\r\n `SameSite=${sameSite}`,\r\n ];\r\n if (httpOnly) cookieParts.push(\"HttpOnly\");\r\n if (secure) cookieParts.push(\"Secure\");\r\n\r\n const existing = res.getHeader(\"Set-Cookie\");\r\n const cookies = existing\r\n ? [...(Array.isArray(existing) ? existing : [String(existing)]), cookieParts.join(\"; \")]\r\n : [cookieParts.join(\"; \")];\r\n res.setHeader(\"Set-Cookie\", cookies);\r\n\r\n return (originalEnd as any).apply(this, args);\r\n };\r\n\r\n next();\r\n };\r\n}\r\n","import { createGzip, createDeflate, type Gzip, type Deflate } from \"node:zlib\";\r\nimport type { CompressionOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nconst COMPRESSIBLE_TYPES = /^text\\/|application\\/json|application\\/javascript|application\\/xml|image\\/svg\\+xml/;\r\n\r\nexport function CompressionPlugin(options: CompressionOptions = {}): PluginHandler {\r\n const {\r\n threshold = 1024,\r\n level = 6,\r\n algorithms = [\"gzip\", \"deflate\"],\r\n filter,\r\n } = options;\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n\r\n if (filter && !filter(req as any, res as any)) {\r\n next();\r\n return;\r\n }\r\n\r\n const acceptEncoding = req.headers[\"accept-encoding\"] ?? \"\";\r\n let encoding: string | null = null;\r\n\r\n for (const algo of algorithms) {\r\n if (typeof acceptEncoding === \"string\" && acceptEncoding.includes(algo)) {\r\n encoding = algo;\r\n break;\r\n }\r\n }\r\n\r\n if (!encoding) {\r\n next();\r\n return;\r\n }\r\n\r\n const originalEnd = res.end;\r\n const originalWrite = res.write;\r\n\r\n (res as any).end = function (chunk?: any, encodingArg?: any, callback?: any) {\r\n if (!chunk || (typeof chunk !== \"string\" && !Buffer.isBuffer(chunk))) {\r\n return (originalEnd as any).call(this, chunk, encodingArg, callback);\r\n }\r\n\r\n const buf = typeof chunk === \"string\" ? Buffer.from(chunk) : chunk;\r\n\r\n if (buf.length < threshold) {\r\n return (originalEnd as any).call(this, chunk, encodingArg, callback);\r\n }\r\n\r\n const contentType = String(res.getHeader(\"Content-Type\") ?? \"\");\r\n if (!COMPRESSIBLE_TYPES.test(contentType)) {\r\n return (originalEnd as any).call(this, chunk, encodingArg, callback);\r\n }\r\n\r\n res.removeHeader(\"Content-Length\");\r\n res.setHeader(\"Content-Encoding\", encoding!);\r\n res.setHeader(\"Vary\", \"Accept-Encoding\");\r\n\r\n let stream: Gzip | Deflate;\r\n if (encoding === \"gzip\") {\r\n stream = createGzip({ level });\r\n } else {\r\n stream = createDeflate({ level });\r\n }\r\n\r\n const chunks: Buffer[] = [];\r\n stream.on(\"data\", (c: Buffer) => chunks.push(c));\r\n stream.on(\"end\", () => {\r\n const compressed = Buffer.concat(chunks);\r\n res.setHeader(\"Content-Length\", compressed.length);\r\n (originalEnd as any).call(res, compressed);\r\n });\r\n\r\n stream.end(buf);\r\n };\r\n\r\n next();\r\n };\r\n}\r\n","import { createReadStream, statSync, existsSync } from \"node:fs\";\r\nimport { join, extname, resolve } from \"node:path\";\r\nimport type { StaticOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nconst MIME_TYPES: Record<string, string> = {\r\n \".html\": \"text/html; charset=utf-8\",\r\n \".htm\": \"text/html; charset=utf-8\",\r\n \".css\": \"text/css; charset=utf-8\",\r\n \".js\": \"application/javascript; charset=utf-8\",\r\n \".mjs\": \"application/javascript; charset=utf-8\",\r\n \".json\": \"application/json; charset=utf-8\",\r\n \".xml\": \"application/xml; charset=utf-8\",\r\n \".txt\": \"text/plain; charset=utf-8\",\r\n \".csv\": \"text/csv; charset=utf-8\",\r\n \".png\": \"image/png\",\r\n \".jpg\": \"image/jpeg\",\r\n \".jpeg\": \"image/jpeg\",\r\n \".gif\": \"image/gif\",\r\n \".svg\": \"image/svg+xml\",\r\n \".ico\": \"image/x-icon\",\r\n \".webp\": \"image/webp\",\r\n \".avif\": \"image/avif\",\r\n \".woff\": \"font/woff\",\r\n \".woff2\": \"font/woff2\",\r\n \".ttf\": \"font/ttf\",\r\n \".otf\": \"font/otf\",\r\n \".eot\": \"application/vnd.ms-fontobject\",\r\n \".mp4\": \"video/mp4\",\r\n \".webm\": \"video/webm\",\r\n \".mp3\": \"audio/mpeg\",\r\n \".ogg\": \"audio/ogg\",\r\n \".wav\": \"audio/wav\",\r\n \".pdf\": \"application/pdf\",\r\n \".zip\": \"application/zip\",\r\n \".gz\": \"application/gzip\",\r\n \".wasm\": \"application/wasm\",\r\n \".map\": \"application/json\",\r\n};\r\n\r\nexport function StaticPlugin(options: StaticOptions): PluginHandler {\r\n const {\r\n root,\r\n prefix = \"/\",\r\n index = [\"index.html\"],\r\n dotfiles = \"ignore\",\r\n maxAge = 0,\r\n etag = true,\r\n lastModified = true,\r\n fallthrough = true,\r\n immutable = false,\r\n } = options;\r\n\r\n const resolvedRoot = resolve(root);\r\n const indexFiles = Array.isArray(index) ? index : [index];\r\n const normalizedPrefix = prefix.endsWith(\"/\") ? prefix.slice(0, -1) : prefix;\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n\r\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\r\n next();\r\n return;\r\n }\r\n\r\n const path = req.pathname;\r\n if (!path.startsWith(normalizedPrefix)) {\r\n next();\r\n return;\r\n }\r\n\r\n const relativePath = path.slice(normalizedPrefix.length) || \"/\";\r\n\r\n if (relativePath.includes(\"..\")) {\r\n next();\r\n return;\r\n }\r\n\r\n if (dotfiles !== \"allow\" && relativePath.split(\"/\").some((s) => s.startsWith(\".\"))) {\r\n if (dotfiles === \"deny\") {\r\n res.statusCode = 403;\r\n res.end(\"Forbidden\");\r\n return;\r\n }\r\n next();\r\n return;\r\n }\r\n\r\n let filePath = join(resolvedRoot, relativePath);\r\n\r\n if (!existsSync(filePath)) {\r\n if (fallthrough) { next(); return; }\r\n res.statusCode = 404;\r\n res.end(\"Not Found\");\r\n return;\r\n }\r\n\r\n let stat = statSync(filePath);\r\n\r\n if (stat.isDirectory()) {\r\n let found = false;\r\n for (const idx of indexFiles) {\r\n const candidate = join(filePath, idx);\r\n if (existsSync(candidate)) {\r\n filePath = candidate;\r\n stat = statSync(filePath);\r\n found = true;\r\n break;\r\n }\r\n }\r\n if (!found) {\r\n if (fallthrough) { next(); return; }\r\n res.statusCode = 404;\r\n res.end(\"Not Found\");\r\n return;\r\n }\r\n }\r\n\r\n const ext = extname(filePath).toLowerCase();\r\n const contentType = MIME_TYPES[ext] ?? \"application/octet-stream\";\r\n\r\n res.setHeader(\"Content-Type\", contentType);\r\n res.setHeader(\"Content-Length\", stat.size);\r\n\r\n if (lastModified) {\r\n res.setHeader(\"Last-Modified\", stat.mtime.toUTCString());\r\n }\r\n\r\n if (etag) {\r\n const etagValue = `W/\"${stat.size.toString(16)}-${stat.mtime.getTime().toString(16)}\"`;\r\n res.setHeader(\"ETag\", etagValue);\r\n\r\n const ifNoneMatch = req.headers[\"if-none-match\"];\r\n if (ifNoneMatch === etagValue) {\r\n res.statusCode = 304;\r\n res.end();\r\n return;\r\n }\r\n }\r\n\r\n let cacheControl = `public, max-age=${maxAge}`;\r\n if (immutable) cacheControl += \", immutable\";\r\n res.setHeader(\"Cache-Control\", cacheControl);\r\n\r\n if (req.method === \"HEAD\") {\r\n res.end();\r\n return;\r\n }\r\n\r\n const stream = createReadStream(filePath);\r\n stream.pipe(res);\r\n };\r\n}\r\n","import { createHash } from \"node:crypto\";\r\nimport type { ETagOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nexport function ETagPlugin(options: ETagOptions = {}): PluginHandler {\r\n const { weak = true } = options;\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n\r\n const originalEnd = res.end;\r\n (res as any).end = function (chunk?: any, encoding?: any, callback?: any) {\r\n if (chunk && (typeof chunk === \"string\" || Buffer.isBuffer(chunk)) && res.statusCode === 200) {\r\n const buf = typeof chunk === \"string\" ? Buffer.from(chunk) : chunk;\r\n const hash = createHash(\"md5\").update(buf).digest(\"hex\").slice(0, 16);\r\n const etag = weak ? `W/\"${hash}\"` : `\"${hash}\"`;\r\n\r\n res.setHeader(\"ETag\", etag);\r\n\r\n const ifNoneMatch = req.headers[\"if-none-match\"];\r\n if (ifNoneMatch === etag) {\r\n res.statusCode = 304;\r\n return (originalEnd as any).call(this);\r\n }\r\n }\r\n\r\n return (originalEnd as any).call(this, chunk, encoding, callback);\r\n };\r\n\r\n next();\r\n };\r\n}\r\n","import { randomUUID } from \"node:crypto\";\r\nimport type { RequestIdOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nexport function RequestIdPlugin(options: RequestIdOptions = {}): PluginHandler {\r\n const {\r\n header = \"X-Request-Id\",\r\n generator = randomUUID,\r\n } = options;\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n\r\n const existingId = req.headers[header.toLowerCase()] as string | undefined;\r\n const requestId = existingId ?? generator();\r\n\r\n req.requestId = requestId;\r\n res.setHeader(header, requestId);\r\n\r\n next();\r\n };\r\n}\r\n","import type { TimeoutOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nexport function TimeoutPlugin(options: TimeoutOptions): PluginHandler {\r\n const {\r\n timeout,\r\n message = { error: { statusCode: 408, message: \"Request Timeout\" } },\r\n statusCode = 408,\r\n } = options;\r\n\r\n return (ctx, next) => {\r\n const { res } = ctx;\r\n let timedOut = false;\r\n\r\n const timer = setTimeout(() => {\r\n timedOut = true;\r\n if (!res.headersSent) {\r\n res.statusCode = statusCode;\r\n res.setHeader(\"Content-Type\", typeof message === \"string\" ? \"text/plain\" : \"application/json\");\r\n res.end(typeof message === \"string\" ? message : JSON.stringify(message));\r\n }\r\n }, timeout);\r\n\r\n const originalEnd = res.end;\r\n (res as any).end = function (...args: any[]) {\r\n clearTimeout(timer);\r\n if (!timedOut) {\r\n return (originalEnd as any).apply(this, args);\r\n }\r\n };\r\n\r\n next();\r\n };\r\n}\r\n","import type { HealthCheckOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nexport function HealthCheckPlugin(options: HealthCheckOptions = {}): PluginHandler {\r\n const {\r\n path = \"/health\",\r\n checks = {},\r\n timeout: checkTimeout = 5000,\r\n } = options;\r\n\r\n return async (ctx, next) => {\r\n const { req, res } = ctx;\r\n\r\n if (req.pathname !== path) {\r\n next();\r\n return;\r\n }\r\n\r\n const results: Record<string, { status: string; duration: number }> = {};\r\n let allHealthy = true;\r\n\r\n for (const [name, check] of Object.entries(checks)) {\r\n const start = Date.now();\r\n try {\r\n const result = await Promise.race([\r\n Promise.resolve(check()),\r\n new Promise<boolean>((_, reject) =>\r\n setTimeout(() => reject(new Error(\"timeout\")), checkTimeout),\r\n ),\r\n ]);\r\n results[name] = {\r\n status: result ? \"healthy\" : \"unhealthy\",\r\n duration: Date.now() - start,\r\n };\r\n if (!result) allHealthy = false;\r\n } catch {\r\n results[name] = {\r\n status: \"unhealthy\",\r\n duration: Date.now() - start,\r\n };\r\n allHealthy = false;\r\n }\r\n }\r\n\r\n const body = JSON.stringify({\r\n status: allHealthy ? \"healthy\" : \"unhealthy\",\r\n timestamp: new Date().toISOString(),\r\n uptime: process.uptime(),\r\n memory: process.memoryUsage(),\r\n checks: results,\r\n });\r\n\r\n res.statusCode = allHealthy ? 200 : 503;\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.setHeader(\"Cache-Control\", \"no-cache, no-store\");\r\n res.end(body);\r\n };\r\n}\r\n","import type { CircuitBreakerOptions, CircuitBreakerState, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nexport function CircuitBreakerPlugin(options: CircuitBreakerOptions = {}): PluginHandler {\r\n const {\r\n threshold = 5,\r\n timeout: breakerTimeout = 30_000,\r\n resetTimeout = 60_000,\r\n halfOpenRequests = 1,\r\n monitor,\r\n } = options;\r\n\r\n let state: CircuitBreakerState = \"CLOSED\";\r\n let failures = 0;\r\n let successes = 0;\r\n let lastFailureTime = 0;\r\n let halfOpenCount = 0;\r\n\r\n const transition = (newState: CircuitBreakerState) => {\r\n if (state !== newState) {\r\n state = newState;\r\n monitor?.(state);\r\n }\r\n };\r\n\r\n return (ctx, next) => {\r\n const { res } = ctx;\r\n\r\n if (state === \"OPEN\") {\r\n if (Date.now() - lastFailureTime >= resetTimeout) {\r\n transition(\"HALF_OPEN\");\r\n halfOpenCount = 0;\r\n } else {\r\n res.statusCode = 503;\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.setHeader(\"Retry-After\", String(Math.ceil(resetTimeout / 1000)));\r\n res.end(\r\n JSON.stringify({\r\n error: { statusCode: 503, message: \"Service temporarily unavailable (circuit open)\" },\r\n }),\r\n );\r\n return;\r\n }\r\n }\r\n\r\n if (state === \"HALF_OPEN\" && halfOpenCount >= halfOpenRequests) {\r\n res.statusCode = 503;\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.end(\r\n JSON.stringify({\r\n error: { statusCode: 503, message: \"Service temporarily unavailable (circuit half-open)\" },\r\n }),\r\n );\r\n return;\r\n }\r\n\r\n if (state === \"HALF_OPEN\") halfOpenCount++;\r\n\r\n const originalEnd = res.end;\r\n (res as any).end = function (...args: any[]) {\r\n if (res.statusCode >= 500) {\r\n failures++;\r\n lastFailureTime = Date.now();\r\n if (state === \"HALF_OPEN\" || failures >= threshold) {\r\n transition(\"OPEN\");\r\n }\r\n } else {\r\n if (state === \"HALF_OPEN\") {\r\n successes++;\r\n if (successes >= halfOpenRequests) {\r\n failures = 0;\r\n successes = 0;\r\n transition(\"CLOSED\");\r\n }\r\n } else {\r\n failures = Math.max(0, failures - 1);\r\n }\r\n }\r\n\r\n return (originalEnd as any).apply(this, args);\r\n };\r\n\r\n next();\r\n };\r\n}\r\n","import type { SSEOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\nimport type { AzuraResponse } from \"../types/common.type.js\";\r\n\r\nexport interface SSEClient {\r\n id: string;\r\n res: AzuraResponse;\r\n send(event: string, data: any, id?: string): void;\r\n close(): void;\r\n}\r\n\r\nexport class SSEManager {\r\n private clients = new Map<string, SSEClient>();\r\n private clientCounter = 0;\r\n\r\n addClient(res: AzuraResponse): SSEClient {\r\n const id = `sse-${++this.clientCounter}-${Date.now()}`;\r\n\r\n res.setHeader(\"Content-Type\", \"text/event-stream\");\r\n res.setHeader(\"Cache-Control\", \"no-cache\");\r\n res.setHeader(\"Connection\", \"keep-alive\");\r\n res.setHeader(\"X-Accel-Buffering\", \"no\");\r\n res.statusCode = 200;\r\n res.flushHeaders();\r\n\r\n const client: SSEClient = {\r\n id,\r\n res,\r\n send(event: string, data: any, eventId?: string) {\r\n const serialized = typeof data === \"string\" ? data : JSON.stringify(data);\r\n let message = \"\";\r\n if (eventId) message += `id: ${eventId}\\n`;\r\n message += `event: ${event}\\n`;\r\n message += `data: ${serialized}\\n\\n`;\r\n res.write(message);\r\n },\r\n close() {\r\n res.end();\r\n },\r\n };\r\n\r\n this.clients.set(id, client);\r\n\r\n res.on(\"close\", () => {\r\n this.clients.delete(id);\r\n });\r\n\r\n return client;\r\n }\r\n\r\n broadcast(event: string, data: any, id?: string): void {\r\n for (const client of this.clients.values()) {\r\n client.send(event, data, id);\r\n }\r\n }\r\n\r\n getClient(id: string): SSEClient | undefined {\r\n return this.clients.get(id);\r\n }\r\n\r\n getClientCount(): number {\r\n return this.clients.size;\r\n }\r\n\r\n closeAll(): void {\r\n for (const client of this.clients.values()) {\r\n client.close();\r\n }\r\n this.clients.clear();\r\n }\r\n}\r\n\r\nexport function SSEPlugin(options: SSEOptions): PluginHandler {\r\n const {\r\n path,\r\n heartbeatInterval = 30_000,\r\n retry = 3000,\r\n maxClients = 1000,\r\n } = options;\r\n\r\n const manager = new SSEManager();\r\n\r\n let heartbeat: ReturnType<typeof setInterval> | null = null;\r\n if (heartbeatInterval > 0) {\r\n heartbeat = setInterval(() => {\r\n manager.broadcast(\"heartbeat\", { time: Date.now() });\r\n }, heartbeatInterval);\r\n if (heartbeat.unref) heartbeat.unref();\r\n }\r\n\r\n const plugin: PluginHandler & { manager: SSEManager } = Object.assign(\r\n (ctx: any, next: any) => {\r\n const { req, res } = ctx;\r\n\r\n if (req.pathname !== path || req.method !== \"GET\") {\r\n next();\r\n return;\r\n }\r\n\r\n if (manager.getClientCount() >= maxClients) {\r\n res.statusCode = 503;\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.end(JSON.stringify({ error: { statusCode: 503, message: \"Too many SSE connections\" } }));\r\n return;\r\n }\r\n\r\n const client = manager.addClient(res as any);\r\n res.write(`retry: ${retry}\\n\\n`);\r\n client.send(\"connected\", { clientId: client.id });\r\n },\r\n { manager },\r\n );\r\n\r\n return plugin;\r\n}\r\n","import { request as httpRequest } from \"node:http\";\r\nimport { request as httpsRequest } from \"node:https\";\r\nimport { URL } from \"node:url\";\r\nimport type { ProxyOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nexport function ProxyPlugin(options: ProxyOptions): PluginHandler {\r\n const {\r\n target,\r\n pathRewrite = {},\r\n changeOrigin = true,\r\n timeout = 30_000,\r\n headers: extraHeaders = {},\r\n onProxyReq,\r\n onProxyRes,\r\n } = options;\r\n\r\n const targetUrl = new URL(target);\r\n const isHttps = targetUrl.protocol === \"https:\";\r\n const requestFn = isHttps ? httpsRequest : httpRequest;\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n\r\n let targetPath = req.pathname;\r\n for (const [from, to] of Object.entries(pathRewrite)) {\r\n targetPath = targetPath.replace(new RegExp(from), to);\r\n }\r\n\r\n const search = req.url?.includes(\"?\") ? req.url.slice(req.url.indexOf(\"?\")) : \"\";\r\n const fullPath = targetPath + search;\r\n\r\n const proxyHeaders: Record<string, string> = {};\r\n for (const [key, val] of Object.entries(req.headers)) {\r\n if (val) proxyHeaders[key] = Array.isArray(val) ? val.join(\", \") : val;\r\n }\r\n\r\n if (changeOrigin) {\r\n proxyHeaders.host = targetUrl.host;\r\n }\r\n\r\n Object.assign(proxyHeaders, extraHeaders);\r\n\r\n const proxyReq = requestFn(\r\n {\r\n hostname: targetUrl.hostname,\r\n port: targetUrl.port || (isHttps ? 443 : 80),\r\n path: fullPath,\r\n method: req.method,\r\n headers: proxyHeaders,\r\n timeout,\r\n },\r\n (proxyRes) => {\r\n onProxyRes?.(proxyRes, res as any);\r\n\r\n res.statusCode = proxyRes.statusCode ?? 502;\r\n for (const [key, val] of Object.entries(proxyRes.headers)) {\r\n if (val) res.setHeader(key, val);\r\n }\r\n\r\n proxyRes.pipe(res);\r\n },\r\n );\r\n\r\n proxyReq.on(\"error\", (err) => {\r\n if (!res.headersSent) {\r\n res.statusCode = 502;\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.end(JSON.stringify({ error: { statusCode: 502, message: \"Bad Gateway\", details: err.message } }));\r\n }\r\n });\r\n\r\n proxyReq.on(\"timeout\", () => {\r\n proxyReq.destroy();\r\n if (!res.headersSent) {\r\n res.statusCode = 504;\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.end(JSON.stringify({ error: { statusCode: 504, message: \"Gateway Timeout\" } }));\r\n }\r\n });\r\n\r\n onProxyReq?.(proxyReq, req as any);\r\n\r\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\r\n req.pipe(proxyReq);\r\n } else {\r\n proxyReq.end();\r\n }\r\n };\r\n}\r\n","import { randomBytes } from \"node:crypto\";\r\nimport { writeFileSync, mkdirSync, existsSync } from \"node:fs\";\r\nimport { join } from \"node:path\";\r\nimport type { MultipartOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nexport interface UploadedFile {\r\n fieldname: string;\r\n filename: string;\r\n mimetype: string;\r\n size: number;\r\n buffer: Buffer;\r\n path?: string;\r\n}\r\n\r\nexport function MultipartPlugin(options: MultipartOptions = {}): PluginHandler {\r\n const {\r\n maxFileSize = 10 * 1024 * 1024,\r\n maxFiles = 10,\r\n maxFieldSize = 1024 * 1024,\r\n maxFields = 50,\r\n allowedMimeTypes,\r\n uploadDir,\r\n } = options;\r\n\r\n if (uploadDir && !existsSync(uploadDir)) {\r\n mkdirSync(uploadDir, { recursive: true });\r\n }\r\n\r\n return async (ctx, next) => {\r\n const { req } = ctx;\r\n const contentType = req.headers[\"content-type\"] ?? \"\";\r\n\r\n if (!contentType.startsWith(\"multipart/form-data\")) {\r\n next();\r\n return;\r\n }\r\n\r\n const boundaryMatch = contentType.match(/boundary=([^\\s;]+)/);\r\n if (!boundaryMatch) {\r\n next();\r\n return;\r\n }\r\n\r\n const boundary = boundaryMatch[1];\r\n\r\n try {\r\n const { fields, files } = await parseMultipart(req as any, boundary, {\r\n maxFileSize,\r\n maxFiles,\r\n maxFieldSize,\r\n maxFields,\r\n allowedMimeTypes,\r\n });\r\n\r\n if (uploadDir) {\r\n for (const file of files) {\r\n const ext = file.filename.includes(\".\")\r\n ? file.filename.slice(file.filename.lastIndexOf(\".\"))\r\n : \"\";\r\n const savedName = `${randomBytes(16).toString(\"hex\")}${ext}`;\r\n const savePath = join(uploadDir, savedName);\r\n writeFileSync(savePath, file.buffer);\r\n file.path = savePath;\r\n }\r\n }\r\n\r\n (req as any).files = files;\r\n (req as any).body = { ...((req as any).body ?? {}), ...fields };\r\n\r\n next();\r\n } catch (err: any) {\r\n const { res } = ctx;\r\n res.statusCode = 400;\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.end(JSON.stringify({ error: { statusCode: 400, message: err.message } }));\r\n }\r\n };\r\n}\r\n\r\ninterface ParseOptions {\r\n maxFileSize: number;\r\n maxFiles: number;\r\n maxFieldSize: number;\r\n maxFields: number;\r\n allowedMimeTypes?: string[];\r\n}\r\n\r\nasync function parseMultipart(\r\n req: NodeJS.ReadableStream,\r\n boundary: string,\r\n opts: ParseOptions,\r\n): Promise<{ fields: Record<string, string>; files: UploadedFile[] }> {\r\n const raw = await collectBody(req);\r\n const delimiter = Buffer.from(`--${boundary}`);\r\n const endDelimiter = Buffer.from(`--${boundary}--`);\r\n\r\n const fields: Record<string, string> = {};\r\n const files: UploadedFile[] = [];\r\n let fieldCount = 0;\r\n\r\n let start = bufferIndexOf(raw, delimiter, 0);\r\n if (start === -1) return { fields, files };\r\n start += delimiter.length + 2; // skip delimiter + CRLF\r\n\r\n while (start < raw.length) {\r\n const end = bufferIndexOf(raw, delimiter, start);\r\n if (end === -1) break;\r\n\r\n const part = raw.subarray(start, end - 2); // -2 for trailing CRLF before delimiter\r\n const headerEnd = bufferIndexOf(part, Buffer.from(\"\\r\\n\\r\\n\"), 0);\r\n if (headerEnd === -1) { start = end + delimiter.length + 2; continue; }\r\n\r\n const headerStr = part.subarray(0, headerEnd).toString(\"utf-8\");\r\n const body = part.subarray(headerEnd + 4);\r\n\r\n const nameMatch = headerStr.match(/name=\"([^\"]+)\"/);\r\n const filenameMatch = headerStr.match(/filename=\"([^\"]*)\"/);\r\n const typeMatch = headerStr.match(/Content-Type:\\s*(.+)/i);\r\n\r\n if (filenameMatch && nameMatch) {\r\n if (files.length >= opts.maxFiles) throw new Error(\"Too many files\");\r\n if (body.length > opts.maxFileSize) throw new Error(`File ${filenameMatch[1]} exceeds max size`);\r\n\r\n const mimetype = typeMatch?.[1]?.trim() ?? \"application/octet-stream\";\r\n if (opts.allowedMimeTypes && !opts.allowedMimeTypes.includes(mimetype)) {\r\n throw new Error(`File type ${mimetype} not allowed`);\r\n }\r\n\r\n files.push({\r\n fieldname: nameMatch[1],\r\n filename: filenameMatch[1],\r\n mimetype,\r\n size: body.length,\r\n buffer: Buffer.from(body),\r\n });\r\n } else if (nameMatch) {\r\n if (++fieldCount > opts.maxFields) throw new Error(\"Too many fields\");\r\n if (body.length > opts.maxFieldSize) throw new Error(`Field ${nameMatch[1]} exceeds max size`);\r\n fields[nameMatch[1]] = body.toString(\"utf-8\");\r\n }\r\n\r\n start = end + delimiter.length;\r\n if (bufferIndexOf(raw, endDelimiter, end) === end) break;\r\n start += 2;\r\n }\r\n\r\n return { fields, files };\r\n}\r\n\r\nfunction collectBody(stream: NodeJS.ReadableStream): Promise<Buffer> {\r\n return new Promise((resolve, reject) => {\r\n const chunks: Buffer[] = [];\r\n stream.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\r\n stream.on(\"end\", () => resolve(Buffer.concat(chunks)));\r\n stream.on(\"error\", reject);\r\n });\r\n}\r\n\r\nfunction bufferIndexOf(buf: Buffer, search: Buffer, offset: number): number {\r\n for (let i = offset; i <= buf.length - search.length; i++) {\r\n let found = true;\r\n for (let j = 0; j < search.length; j++) {\r\n if (buf[i + j] !== search[j]) { found = false; break; }\r\n }\r\n if (found) return i;\r\n }\r\n return -1;\r\n}\r\n","/**\n * Gerado por scripts/embed-swagger-ui.mjs a partir de swagger-ui-modern.html.\n * Após editar o HTML, execute: node scripts/embed-swagger-ui.mjs\n */\nexport const SWAGGER_UI_MODERN_HTML: string = \"<!DOCTYPE html>\\n<html lang=\\\"en\\\">\\n\\n<head>\\n <meta charset=\\\"UTF-8\\\" />\\n <meta name=\\\"viewport\\\" content=\\\"width=device-width,initial-scale=1.0\\\" />\\n <title>__PAGE_TITLE__</title>\\n <link rel=\\\"preconnect\\\" href=\\\"https://fonts.googleapis.com\\\" />\\n <link rel=\\\"preconnect\\\" href=\\\"https://fonts.gstatic.com\\\" crossorigin />\\n <link\\n href=\\\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap\\\"\\n rel=\\\"stylesheet\\\" />\\n <style>\\n :root {\\n --bg-body: #09090b;\\n --bg-sidebar: #18181b;\\n --bg-card: #18181b;\\n --bg-card-hover: #27272a;\\n --bg-input: #09090b;\\n --border-color: #27272a;\\n --primary-color: #6366f1;\\n --primary-hover: #4f46e5;\\n --text-primary: #f4f4f5;\\n --text-secondary: #a1a1aa;\\n --text-muted: #52525b;\\n --success: #22c55e;\\n --warning: #eab308;\\n --danger: #ef4444;\\n --info: #3b82f6;\\n --font-sans: 'Inter', system-ui, -apple-system, sans-serif;\\n --font-mono: 'JetBrains Mono', monospace;\\n }\\n\\n * {\\n margin: 0;\\n padding: 0;\\n box-sizing: border-box\\n }\\n\\n body {\\n font-family: var(--font-sans);\\n background-color: var(--bg-body);\\n color: var(--text-primary);\\n line-height: 1.5;\\n height: 100vh;\\n overflow: hidden\\n }\\n\\n ::-webkit-scrollbar {\\n width: 6px;\\n height: 6px\\n }\\n\\n ::-webkit-scrollbar-track {\\n background: transparent\\n }\\n\\n ::-webkit-scrollbar-thumb {\\n background: var(--border-color);\\n border-radius: 3px\\n }\\n\\n ::-webkit-scrollbar-thumb:hover {\\n background: var(--text-muted)\\n }\\n\\n .layout {\\n display: flex;\\n height: 100%\\n }\\n\\n .sidebar {\\n width: 300px;\\n background: var(--bg-sidebar);\\n border-right: 1px solid var(--border-color);\\n display: flex;\\n flex-direction: column;\\n flex-shrink: 0\\n }\\n\\n .sidebar-header {\\n padding: 20px;\\n border-bottom: 1px solid var(--border-color);\\n background: var(--bg-sidebar)\\n }\\n\\n .api-title {\\n font-size: 1.25rem;\\n font-weight: 700;\\n color: var(--text-primary);\\n margin-bottom: 4px\\n }\\n\\n .api-version {\\n font-size: 0.75rem;\\n color: var(--primary-color);\\n background: rgba(99, 102, 241, 0.1);\\n padding: 2px 8px;\\n border-radius: 12px;\\n font-family: var(--font-mono)\\n }\\n\\n .search-box {\\n padding: 16px\\n }\\n\\n .search-input {\\n width: 100%;\\n background: var(--bg-input);\\n border: 1px solid var(--border-color);\\n padding: 8px 12px;\\n border-radius: 6px;\\n color: var(--text-primary);\\n font-size: 0.875rem;\\n outline: none;\\n transition: border-color 0.2s\\n }\\n\\n .search-input:focus {\\n border-color: var(--primary-color)\\n }\\n\\n .nav-list {\\n flex: 1;\\n overflow-y: auto;\\n padding: 0 16px 20px\\n }\\n\\n .nav-group-title {\\n font-size: 0.75rem;\\n text-transform: uppercase;\\n color: var(--text-muted);\\n font-weight: 600;\\n margin: 24px 0 8px;\\n letter-spacing: 0.05em\\n }\\n\\n .nav-item {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n padding: 8px;\\n border-radius: 6px;\\n cursor: pointer;\\n transition: background 0.2s;\\n margin-bottom: 2px\\n }\\n\\n .nav-item:hover {\\n background: var(--bg-card-hover)\\n }\\n\\n .nav-item.active {\\n background: rgba(99, 102, 241, 0.1)\\n }\\n\\n .method-tag {\\n font-family: var(--font-mono);\\n font-size: 0.65rem;\\n font-weight: 700;\\n padding: 2px 6px;\\n border-radius: 4px;\\n width: 45px;\\n text-align: center\\n }\\n\\n .get {\\n color: var(--success);\\n background: rgba(34, 197, 94, 0.1)\\n }\\n\\n .post {\\n color: var(--primary-color);\\n background: rgba(99, 102, 241, 0.1)\\n }\\n\\n .put {\\n color: var(--warning);\\n background: rgba(234, 179, 8, 0.1)\\n }\\n\\n .delete {\\n color: var(--danger);\\n background: rgba(239, 68, 68, 0.1)\\n }\\n\\n .patch {\\n color: var(--info);\\n background: rgba(59, 130, 246, 0.1)\\n }\\n\\n .nav-path {\\n font-size: 0.8rem;\\n color: var(--text-secondary);\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n font-family: var(--font-mono)\\n }\\n\\n .main-content {\\n flex: 1;\\n overflow-y: auto;\\n padding: 40px;\\n scroll-behavior: smooth\\n }\\n\\n .content-width {\\n max-width: 1000px;\\n margin: 0 auto\\n }\\n\\n .info-section {\\n margin-bottom: 40px\\n }\\n\\n .info-title {\\n font-size: 2.5rem;\\n font-weight: 800;\\n margin-bottom: 16px;\\n letter-spacing: -0.02em\\n }\\n\\n .info-desc {\\n color: var(--text-secondary);\\n font-size: 1.1rem;\\n max-width: 700px\\n }\\n\\n .server-section {\\n background: var(--bg-card);\\n border: 1px solid var(--border-color);\\n padding: 20px;\\n border-radius: 8px;\\n margin-bottom: 40px\\n }\\n\\n .server-label {\\n display: block;\\n font-size: 0.875rem;\\n color: var(--text-muted);\\n margin-bottom: 8px\\n }\\n\\n .server-select {\\n width: 100%;\\n background: var(--bg-input);\\n border: 1px solid var(--border-color);\\n color: var(--text-primary);\\n padding: 10px;\\n border-radius: 6px;\\n font-family: var(--font-mono);\\n font-size: 0.9rem\\n }\\n\\n .endpoint-card {\\n background: var(--bg-card);\\n border: 1px solid var(--border-color);\\n border-radius: 8px;\\n margin-bottom: 24px;\\n overflow: hidden;\\n transition: border-color 0.2s\\n }\\n\\n .endpoint-card:hover {\\n border-color: var(--text-muted)\\n }\\n\\n .card-header {\\n padding: 16px 24px;\\n display: flex;\\n align-items: center;\\n gap: 16px;\\n cursor: pointer;\\n background: rgba(255, 255, 255, 0.02);\\n user-select: none\\n }\\n\\n .card-summary {\\n flex: 1;\\n font-weight: 500;\\n font-size: 1rem\\n }\\n\\n .card-path {\\n font-family: var(--font-mono);\\n font-size: 0.85rem;\\n color: var(--text-muted)\\n }\\n\\n .chevron {\\n transition: transform 0.2s;\\n color: var(--text-muted)\\n }\\n\\n .card-header[aria-expanded=\\\"true\\\"] .chevron {\\n transform: rotate(180deg)\\n }\\n\\n .card-body {\\n border-top: 1px solid var(--border-color);\\n padding: 24px;\\n display: none\\n }\\n\\n .card-header[aria-expanded=\\\"true\\\"]+.card-body {\\n display: block\\n }\\n\\n .section-header {\\n font-size: 0.75rem;\\n text-transform: uppercase;\\n color: var(--text-muted);\\n font-weight: 700;\\n margin: 24px 0 12px;\\n letter-spacing: 0.05em\\n }\\n\\n .section-header:first-child {\\n margin-top: 0\\n }\\n\\n .params-table {\\n width: 100%;\\n border-collapse: collapse;\\n font-size: 0.9rem;\\n margin-bottom: 20px\\n }\\n\\n .params-table th {\\n text-align: left;\\n color: var(--text-muted);\\n padding: 8px 12px;\\n font-weight: 500;\\n border-bottom: 1px solid var(--border-color);\\n font-size: 0.8rem\\n }\\n\\n .params-table td {\\n padding: 12px;\\n border-bottom: 1px solid var(--border-color);\\n color: var(--text-secondary);\\n vertical-align: top\\n }\\n\\n .params-table tr:last-child td {\\n border-bottom: none\\n }\\n\\n .param-name {\\n font-family: var(--font-mono);\\n color: var(--text-primary);\\n font-weight: 600\\n }\\n\\n .param-req {\\n color: var(--danger);\\n font-size: 0.7rem;\\n margin-left: 4px\\n }\\n\\n .param-meta {\\n font-size: 0.8rem;\\n color: var(--text-muted);\\n margin-top: 4px;\\n font-family: var(--font-mono)\\n }\\n\\n .code-block {\\n background: #000;\\n border: 1px solid var(--border-color);\\n border-radius: 6px;\\n padding: 16px;\\n font-family: var(--font-mono);\\n font-size: 0.85rem;\\n overflow-x: auto;\\n color: #d4d4d8\\n }\\n\\n .try-it-box {\\n background: rgba(99, 102, 241, 0.05);\\n border: 1px solid rgba(99, 102, 241, 0.2);\\n border-radius: 8px;\\n padding: 20px;\\n margin-top: 32px\\n }\\n\\n .form-grid {\\n display: grid;\\n grid-template-columns: 1fr;\\n gap: 16px;\\n margin-bottom: 20px\\n }\\n\\n .form-group label {\\n display: block;\\n font-size: 0.8rem;\\n font-weight: 600;\\n margin-bottom: 6px;\\n color: var(--text-secondary)\\n }\\n\\n .form-group input {\\n width: 100%;\\n background: var(--bg-body);\\n border: 1px solid var(--border-color);\\n padding: 8px 12px;\\n border-radius: 4px;\\n color: var(--text-primary);\\n font-family: var(--font-mono);\\n font-size: 0.85rem\\n }\\n\\n .form-group input:focus {\\n border-color: var(--primary-color);\\n outline: none\\n }\\n\\n .body-editor {\\n width: 100%;\\n height: 200px;\\n background: var(--bg-body);\\n border: 1px solid var(--border-color);\\n border-radius: 6px;\\n padding: 12px;\\n color: var(--text-primary);\\n font-family: var(--font-mono);\\n font-size: 0.85rem;\\n resize: vertical;\\n margin-bottom: 16px\\n }\\n\\n .action-btn {\\n background: var(--primary-color);\\n color: white;\\n border: none;\\n padding: 10px 20px;\\n border-radius: 6px;\\n font-weight: 600;\\n cursor: pointer;\\n font-size: 0.9rem;\\n transition: background 0.2s;\\n display: inline-flex;\\n align-items: center;\\n gap: 8px\\n }\\n\\n .action-btn:hover {\\n background: var(--primary-hover)\\n }\\n\\n .action-btn:disabled {\\n opacity: 0.6;\\n cursor: not-allowed\\n }\\n\\n .response-area {\\n margin-top: 20px;\\n border-top: 1px solid var(--border-color);\\n padding-top: 20px\\n }\\n\\n .status-badge {\\n display: inline-block;\\n padding: 4px 8px;\\n border-radius: 4px;\\n font-size: 0.8rem;\\n font-weight: 700;\\n margin-bottom: 10px;\\n font-family: var(--font-mono)\\n }\\n\\n .status-2xx {\\n background: rgba(34, 197, 94, 0.2);\\n color: var(--success)\\n }\\n\\n .status-4xx,\\n .status-5xx {\\n background: rgba(239, 68, 68, 0.2);\\n color: var(--danger)\\n }\\n\\n .loader {\\n width: 16px;\\n height: 16px;\\n border: 2px solid #ffffff;\\n border-bottom-color: transparent;\\n border-radius: 50%;\\n display: inline-block;\\n animation: rotation 1s linear infinite\\n }\\n\\n @keyframes rotation {\\n 0% {\\n transform: rotate(0deg)\\n }\\n\\n 100% {\\n transform: rotate(360deg)\\n }\\n }\\n\\n @media (max-width:768px) {\\n .layout {\\n flex-direction: column;\\n overflow: auto\\n }\\n\\n .sidebar {\\n width: 100%;\\n height: auto;\\n border-right: none;\\n border-bottom: 1px solid var(--border-color)\\n }\\n\\n .main-content {\\n padding: 20px;\\n overflow: visible\\n }\\n\\n .nav-list {\\n max-height: 300px\\n }\\n }\\n </style>\\n</head>\\n\\n<body>\\n <div class=\\\"layout\\\">\\n <aside class=\\\"sidebar\\\">\\n <div class=\\\"sidebar-header\\\">\\n <div class=\\\"api-title\\\" id=\\\"apiTitle\\\">API Docs</div>\\n <span class=\\\"api-version\\\" id=\\\"apiVersion\\\">v1.0.0</span>\\n </div>\\n <div class=\\\"search-box\\\">\\n <input type=\\\"text\\\" class=\\\"search-input\\\" id=\\\"searchNav\\\" placeholder=\\\"Filter endpoints...\\\">\\n </div>\\n <div class=\\\"nav-list\\\" id=\\\"navList\\\"></div>\\n </aside>\\n <main class=\\\"main-content\\\">\\n <div class=\\\"content-width\\\">\\n <div class=\\\"info-section\\\">\\n <h1 class=\\\"info-title\\\" id=\\\"docTitle\\\">API Reference</h1>\\n <p class=\\\"info-desc\\\" id=\\\"docDesc\\\">Loading documentation...</p>\\n </div>\\n <div class=\\\"server-section\\\">\\n <label class=\\\"server-label\\\">Base URL</label>\\n <select class=\\\"server-select\\\" id=\\\"serverUrl\\\"></select>\\n </div>\\n <div id=\\\"endpointsContainer\\\"></div>\\n </div>\\n </main>\\n </div>\\n\\n <script>\\n const state = { spec: null, server: '' };\\n function sanitizeId(str) { return String(str).replace(/[^a-zA-Z0-9_-]/g, '_'); }\\n async function init() {\\n try {\\n const res = await fetch(\\\"___AZURA_SPEC_URL_PLACEHOLDER___\\\");\\n if (!res.ok) throw new Error('Spec not found');\\n state.spec = await res.json();\\n renderHeader();\\n renderServers();\\n renderNavigation();\\n renderEndpoints();\\n setupSearch();\\n attachGlobalListeners();\\n } catch (err) {\\n const descEl = document.getElementById('docDesc');\\n descEl.textContent = 'Failed to load API definition. Check that the OpenAPI JSON endpoint is configured and reachable.';\\n descEl.style.color = 'var(--danger)';\\n }\\n }\\n\\n function renderHeader() {\\n const info = state.spec.info || {};\\n document.title = `${info.title || 'API'} - Docs`;\\n document.getElementById('apiTitle').textContent = info.title || 'API';\\n document.getElementById('apiVersion').textContent = info.version ? `v${info.version}` : '';\\n document.getElementById('docTitle').textContent = info.title || 'API Reference';\\n document.getElementById('docDesc').textContent = info.description || 'No description provided.';\\n }\\n\\n function renderServers() {\\n const select = document.getElementById('serverUrl');\\n const servers = state.spec.servers && state.spec.servers.length ? state.spec.servers : [{ url: window.location.origin, description: 'Current Origin' }];\\n select.innerHTML = servers.map(s => `<option value=\\\"${s.url}\\\">${s.url}${s.description ? ` (${s.description})` : ''}</option>`).join('');\\n state.server = servers[0].url;\\n select.addEventListener('change', (e) => state.server = e.target.value);\\n }\\n\\n function renderNavigation() {\\n const nav = document.getElementById('navList');\\n const tags = {};\\n Object.entries(state.spec.paths || {}).forEach(([path, methods]) => {\\n Object.entries(methods).forEach(([method, op]) => {\\n const tag = (op.tags && op.tags[0]) ? op.tags[0] : 'General';\\n if (!tags[tag]) tags[tag] = [];\\n tags[tag].push({ path, method, op });\\n });\\n });\\n\\n let html = '';\\n Object.entries(tags).forEach(([tag, items]) => {\\n html += `<div class=\\\"nav-group-title\\\">${tag}</div>`;\\n items.forEach(item => {\\n const label = item.op.summary || item.path;\\n const filter = `${item.method} ${item.path} ${label}`.toLowerCase();\\n const targetId = sanitizeId(`${item.method}-${item.path}`);\\n html += `<div class=\\\"nav-item\\\" data-filter=\\\"${escapeHtmlAttr(filter)}\\\" data-target-id=\\\"${escapeHtmlAttr(targetId)}\\\">\\n <span class=\\\"method-tag ${item.method.toLowerCase()}\\\">${item.method.toUpperCase()}</span>\\n <span class=\\\"nav-path\\\">${escapeHtmlAttr(label)}</span>\\n </div>`;\\n });\\n });\\n\\n nav.innerHTML = html;\\n nav.querySelectorAll('.nav-item').forEach(el => {\\n el.addEventListener('click', () => {\\n const tid = el.dataset.targetId;\\n scrollEndpoint(tid);\\n document.querySelectorAll('.nav-item').forEach(i => i.classList.toggle('active', i === el));\\n });\\n });\\n }\\n\\n function renderEndpoints() {\\n const container = document.getElementById('endpointsContainer');\\n container.innerHTML = '';\\n Object.entries(state.spec.paths || {}).forEach(([path, methods]) => {\\n Object.entries(methods).forEach(([method, op]) => {\\n container.appendChild(createEndpointCard(path, method, op));\\n });\\n });\\n }\\n\\n function createEndpointCard(path, method, op) {\\n const rawId = `${method}-${path}`;\\n const id = sanitizeId(rawId);\\n const card = document.createElement('div');\\n card.className = 'endpoint-card';\\n card.id = id;\\n\\n const descriptionHtml = op.description ? `<p style=\\\"margin-bottom:20px;color:var(--text-secondary)\\\">${escapeHtml(op.description)}</p>` : '';\\n const paramsHtml = renderParameters(op.parameters);\\n const requestBodyHtml = renderRequestBody(op.requestBody);\\n const responsesHtml = renderResponses(op.responses);\\n\\n const inputsId = `inputs_${id}`;\\n const bodyId = `body_${id}`;\\n const tryButtonId = `btn_${id}`;\\n const inputsHtmlForTry = (op.parameters || []).map(p => {\\n const placeholder = p.schema?.type || '';\\n const required = p.required ? ' <span style=\\\"color:var(--danger)\\\">*</span>' : '';\\n return `<div class=\\\"form-group\\\">\\n <label>${escapeHtml(p.name)} <span style=\\\"font-weight:400;color:var(--text-muted)\\\">(${escapeHtml(p.in)})</span>${required}</label>\\n <input type=\\\"text\\\" data-name=\\\"${escapeHtmlAttr(p.name)}\\\" data-in=\\\"${escapeHtmlAttr(p.in)}\\\" placeholder=\\\"${escapeHtmlAttr(placeholder)}\\\">\\n </div>`;\\n }).join('');\\n\\n const bodyEditorHtml = op.requestBody ? `<div class=\\\"form-group\\\">\\n <label>Request Body (JSON)</label>\\n <textarea class=\\\"body-editor\\\" id=\\\"${bodyId}\\\">${getExampleBody(op.requestBody)}</textarea>\\n </div>` : '';\\n\\n card.innerHTML = `\\n <div class=\\\"card-header\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"method-tag ${method.toLowerCase()}\\\">${method.toUpperCase()}</span>\\n <span class=\\\"card-summary\\\">${escapeHtml(op.summary || path)}</span>\\n <span class=\\\"card-path\\\">${escapeHtml(path)}</span>\\n <svg class=\\\"chevron\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><polyline points=\\\"6 9 12 15 18 9\\\"></polyline></svg>\\n </div>\\n <div class=\\\"card-body\\\">\\n ${descriptionHtml}\\n ${paramsHtml}\\n ${requestBodyHtml}\\n <div class=\\\"try-it-box\\\">\\n <div class=\\\"section-header\\\">Try It Out</div>\\n <div class=\\\"form-grid\\\" id=\\\"${inputsId}\\\">\\n ${inputsHtmlForTry}\\n </div>\\n ${bodyEditorHtml}\\n <button class=\\\"action-btn\\\" id=\\\"${tryButtonId}\\\" data-method=\\\"${escapeHtmlAttr(method)}\\\" data-path=\\\"${escapeHtmlAttr(path)}\\\" data-card-id=\\\"${escapeHtmlAttr(id)}\\\">\\n <span>Execute Request</span>\\n </button>\\n <div class=\\\"response-area\\\" style=\\\"display:none\\\"></div>\\n </div>\\n ${responsesHtml}\\n </div>\\n `;\\n\\n return card;\\n }\\n\\n function renderParameters(params) {\\n if (!params || params.length === 0) return '';\\n return `\\n <div class=\\\"section-header\\\">Parameters</div>\\n <table class=\\\"params-table\\\">\\n <thead><tr><th>Name</th><th>Description</th></tr></thead>\\n <tbody>\\n ${params.map(p => `\\n <tr>\\n <td>\\n <div class=\\\"param-name\\\">${escapeHtml(p.name)}${p.required ? '<span class=\\\"param-req\\\">*</span>' : ''}</div>\\n <div class=\\\"param-meta\\\">${escapeHtml(p.in)} • ${escapeHtml(p.schema?.type || 'string')}</div>\\n </td>\\n <td>${escapeHtml(p.description || '-')}</td>\\n </tr>\\n `).join('')}\\n </tbody>\\n </table>\\n `;\\n }\\n\\n function renderRequestBody(body) {\\n if (!body) return '';\\n const contentType = Object.keys(body.content || {})[0] || 'application/json';\\n const schema = body.content && body.content[contentType] ? body.content[contentType].schema : null;\\n return `\\n <div class=\\\"section-header\\\">Request Body <span style=\\\"font-weight:400;text-transform:none;color:var(--text-secondary)\\\">(${escapeHtml(contentType)})</span></div>\\n <div class=\\\"code-block\\\">${escapeHtml(JSON.stringify(generateExample(schema), null, 2))}</div>\\n `;\\n }\\n\\n function renderResponses(responses) {\\n if (!responses) return '';\\n return `\\n <div class=\\\"section-header\\\">Responses</div>\\n ${Object.entries(responses).map(([status, res]) => `\\n <div style=\\\"margin-bottom:16px\\\">\\n <div style=\\\"font-weight:600;font-family:var(--font-mono);margin-bottom:4px\\\">\\n <span style=\\\"color:${String(status).startsWith('2') ? 'var(--success)' : 'var(--danger)'}\\\">${escapeHtml(status)}</span>\\n <span style=\\\"color:var(--text-secondary)\\\">${escapeHtml(res.description || '')}</span>\\n </div>\\n </div>\\n `).join('')}\\n `;\\n }\\n\\n function getExampleBody(body) {\\n if (!body || !body.content) return '{}';\\n const contentType = Object.keys(body.content)[0];\\n const schema = body.content[contentType].schema;\\n try { return JSON.stringify(generateExample(schema), null, 2); } catch { return '{}'; }\\n }\\n\\n function generateExample(schema) {\\n if (!schema) return {};\\n if (schema.example !== undefined) return schema.example;\\n if (schema.$ref) {\\n const ref = String(schema.$ref).replace(/^#\\\\/components\\\\/schemas\\\\//, '');\\n const comp = state.spec.components && state.spec.components.schemas && state.spec.components.schemas[ref];\\n if (comp) return generateExample(comp);\\n return {};\\n }\\n if (schema.type === 'object' && schema.properties) {\\n const obj = {};\\n for (const [k, prop] of Object.entries(schema.properties)) {\\n obj[k] = generateExample(prop);\\n }\\n return obj;\\n }\\n if (schema.type === 'array') return [generateExample(schema.items)];\\n if (schema.type === 'string') return 'string';\\n if (schema.type === 'integer' || schema.type === 'number') return 0;\\n if (schema.type === 'boolean') return true;\\n return null;\\n }\\n\\n async function executeRequest(method, path, btn) {\\n const cardId = btn.dataset.cardId;\\n const card = document.getElementById(cardId);\\n const inputs = card.querySelectorAll('input[data-name]');\\n const bodyEditor = card.querySelector('.body-editor');\\n const responseArea = card.querySelector('.response-area');\\n const originalHtml = btn.innerHTML;\\n btn.disabled = true;\\n btn.innerHTML = '<span class=\\\"loader\\\"></span> Executing...';\\n responseArea.style.display = 'none';\\n try {\\n let url = (state.server || '') + path;\\n const headers = { 'Content-Type': 'application/json', 'Accept': 'application/json' };\\n const queryParams = new URLSearchParams();\\n inputs.forEach(input => {\\n const value = input.value.trim();\\n if (!value) return;\\n const type = input.dataset.in;\\n const name = input.dataset.name;\\n if (type === 'path') {\\n url = url.replace(`{${name}}`, encodeURIComponent(value));\\n } else if (type === 'query') {\\n queryParams.append(name, value);\\n } else if (type === 'header') {\\n headers[name] = value;\\n } else if (type === 'cookie') {\\n // cookies handled as header for demo purposes\\n headers['Cookie'] = (headers['Cookie'] ? headers['Cookie'] + '; ' : '') + `${name}=${value}`;\\n }\\n });\\n const qs = queryParams.toString();\\n if (qs) url += `?${qs}`;\\n const options = { method: method.toUpperCase(), headers };\\n if (bodyEditor && ['POST', 'PUT', 'PATCH'].includes(method.toUpperCase())) {\\n try {\\n const parsed = JSON.parse(bodyEditor.value);\\n options.body = JSON.stringify(parsed);\\n } catch (e) {\\n alert('Invalid JSON in Request Body');\\n throw new Error('Invalid JSON');\\n }\\n }\\n const start = performance.now();\\n const res = await fetch(url, options);\\n const duration = Math.round(performance.now() - start);\\n let data;\\n const ct = res.headers.get('content-type') || '';\\n if (ct.includes('application/json')) data = await res.json(); else data = await res.text();\\n const statusClass = res.ok ? 'status-2xx' : (String(res.status).startsWith('5') ? 'status-5xx' : 'status-4xx');\\n responseArea.style.display = 'block';\\n responseArea.innerHTML = `\\n <div style=\\\"display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;\\\">\\n <span class=\\\"status-badge ${statusClass}\\\">${res.status} ${escapeHtml(res.statusText)}</span>\\n <span style=\\\"font-family:var(--font-mono);font-size:0.8rem;color:var(--text-muted)\\\">${duration}ms</span>\\n </div>\\n <div class=\\\"section-header\\\">Response Body</div>\\n <div class=\\\"code-block\\\">${escapeHtml(typeof data === 'object' ? JSON.stringify(data, null, 2) : String(data))}</div>\\n <div class=\\\"section-header\\\">Response Headers</div>\\n <div class=\\\"code-block\\\">${escapeHtml(Array.from(res.headers.entries()).map(([k, v]) => `${k}: ${v}`).join('\\\\\\\\n'))}</div>\\n `;\\n } catch (err) {\\n responseArea.style.display = 'block';\\n responseArea.innerHTML = `<div style=\\\"color:var(--danger);font-weight:600\\\">Error: ${escapeHtml(err.message || String(err))}</div>`;\\n } finally {\\n btn.disabled = false;\\n btn.innerHTML = originalHtml;\\n }\\n }\\n\\n function toggleCard(header) {\\n const isExpanded = header.getAttribute('aria-expanded') === 'true';\\n header.setAttribute('aria-expanded', String(!isExpanded));\\n }\\n\\n function scrollEndpoint(sanitizedId) {\\n const el = document.getElementById(sanitizedId);\\n if (!el) return;\\n el.scrollIntoView({ behavior: 'smooth', block: 'start' });\\n const header = el.querySelector('.card-header');\\n if (header && header.getAttribute('aria-expanded') !== 'true') {\\n header.setAttribute('aria-expanded', 'true');\\n }\\n }\\n\\n function setupSearch() {\\n const input = document.getElementById('searchNav');\\n input.addEventListener('input', (e) => {\\n const val = e.target.value.toLowerCase();\\n document.querySelectorAll('.nav-item').forEach(el => {\\n const filter = el.dataset.filter || '';\\n el.style.display = filter.includes(val) ? 'flex' : 'none';\\n });\\n });\\n }\\n\\n function attachGlobalListeners() {\\n document.querySelectorAll('.endpoint-card .card-header').forEach(header => {\\n header.addEventListener('click', () => toggleCard(header));\\n });\\n document.querySelectorAll('.action-btn').forEach(btn => {\\n btn.addEventListener('click', () => executeRequest(btn.dataset.method, btn.dataset.path, btn));\\n });\\n }\\n\\n function escapeHtml(str) {\\n if (str === undefined || str === null) return '';\\n return String(str)\\n .replace(/&/g, '&')\\n .replace(/</g, '<')\\n .replace(/>/g, '>')\\n .replace(/\\\"/g, '"')\\n .replace(/'/g, ''');\\n }\\n function escapeHtmlAttr(str) {\\n return escapeHtml(str).replace(/\\\"/g, '"').replace(/'/g, ''');\\n }\\n\\n init();\\n </script>\\n</body>\\n\\n</html>\";\n","/**\n * HTML da UI de documentação OpenAPI (paridade visual com azurajs-legacy: sidebar, Inter/JetBrains Mono, tema zinc/indigo).\n */\nimport { SWAGGER_UI_MODERN_HTML } from \"./swagger-ui-template.js\";\n\nexport function renderSwaggerUiPage(options: {\n title: string;\n specUrl: string;\n deepLinking?: boolean;\n}): string {\n const { title, specUrl } = options;\n return SWAGGER_UI_MODERN_HTML.replaceAll(\"__PAGE_TITLE__\", escapeHtml(title)).replaceAll(\n '\"___AZURA_SPEC_URL_PLACEHOLDER___\"',\n JSON.stringify(specUrl),\n );\n}\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n","import type { PluginHandler } from \"../types/plugins/plugin.type.js\";\r\nimport type { SwaggerPluginOptions } from \"../types/swagger.type.js\";\r\nimport { buildOpenApiDocument } from \"../swagger/openapi-builder.js\";\r\nimport { renderSwaggerUiPage } from \"../swagger/swagger-ui-html.js\";\r\n\r\nexport function SwaggerPlugin(options: SwaggerPluginOptions): PluginHandler {\r\n const {\r\n getDocuments,\r\n specPath = \"/openapi.json\",\r\n docsPath = \"/docs\",\r\n deepLinking = true,\r\n servers,\r\n pathPrefix,\r\n info,\r\n } = options;\r\n\r\n const title = info?.title ?? \"API\";\r\n\r\n return async (ctx, next) => {\r\n const { req, res } = ctx;\r\n const path = req.pathname ?? \"\";\r\n\r\n if (path === specPath || path === `${specPath}/`) {\r\n const doc = buildOpenApiDocument(getDocuments(), {\r\n info: info ?? { title, version: \"1.0.0\" },\r\n servers,\r\n pathPrefix,\r\n });\r\n res.json(doc);\r\n return;\r\n }\r\n\r\n if (path === docsPath || path === `${docsPath}/`) {\r\n const html = renderSwaggerUiPage({\r\n title,\r\n specUrl: specPath,\r\n deepLinking,\r\n });\r\n res.html(html);\r\n return;\r\n }\r\n\r\n next();\r\n };\r\n}\r\n","/**\r\n * Azura Validator - Type-safe validation library inspired by Zod\r\n * Provides runtime validation with TypeScript type inference\r\n */\r\n\r\nimport type { ValidationIssue } from \"../../types/validators.type.js\";\r\n\r\n/**\r\n * Validation error class\r\n */\r\nexport class ValidationError extends Error {\r\n public readonly errors: ValidationIssue[];\r\n\r\n constructor(errors: ValidationIssue[]) {\r\n super(errors.map((e) => e.message).join(\", \"));\r\n this.name = \"ValidationError\";\r\n this.errors = errors;\r\n }\r\n\r\n format(): Record<string, string[]> {\r\n const formatted: Record<string, string[]> = {};\r\n for (const error of this.errors) {\r\n const path = error.path.join(\".\");\r\n if (!formatted[path]) {\r\n formatted[path] = [];\r\n }\r\n formatted[path].push(error.message);\r\n }\r\n return formatted;\r\n }\r\n}\r\n\r\n/**\r\n * Base validator class\r\n */\r\nexport abstract class BaseValidator<T> {\r\n protected _optional = false;\r\n protected _nullable = false;\r\n protected _defaultValue?: T;\r\n protected _description?: string;\r\n protected _customValidations: Array<(value: T) => boolean | string> = [];\r\n\r\n /**\r\n * Parse and validate data\r\n */\r\n abstract parse(data: unknown, path?: (string | number)[]): T;\r\n\r\n /**\r\n * Safe parse that returns result object instead of throwing\r\n */\r\n safeParse(\r\n data: unknown\r\n ): { success: true; data: T } | { success: false; error: ValidationError } {\r\n try {\r\n const result = this.parse(data);\r\n return { success: true, data: result };\r\n } catch (error) {\r\n if (error instanceof ValidationError) {\r\n return { success: false, error };\r\n }\r\n return {\r\n success: false,\r\n error: new ValidationError([\r\n {\r\n path: [],\r\n message: error instanceof Error ? error.message : String(error),\r\n code: \"unknown_error\",\r\n },\r\n ]),\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Make this field optional\r\n */\r\n optional(): BaseValidator<T | undefined> {\r\n const clone = this.clone()!;\r\n clone._optional = true;\r\n return clone as any;\r\n }\r\n\r\n /**\r\n * Make this field nullable\r\n */\r\n nullable(): BaseValidator<T | null> {\r\n const clone = this.clone();\r\n clone._nullable = true;\r\n return clone as any;\r\n }\r\n\r\n /**\r\n * Set default value\r\n */\r\n default(value: T): BaseValidator<T> {\r\n const clone = this.clone();\r\n clone._defaultValue = value;\r\n return clone;\r\n }\r\n\r\n /**\r\n * Add description\r\n */\r\n describe(description: string): this {\r\n this._description = description;\r\n return this;\r\n }\r\n\r\n /**\r\n * Add custom validation\r\n */\r\n refine(validator: (value: T) => boolean, message?: string): this {\r\n this._customValidations.push((value: T) => validator(value) || message || \"Validation failed\");\r\n return this;\r\n }\r\n\r\n /**\r\n * Clone validator\r\n */\r\n protected abstract clone(): BaseValidator<T>;\r\n\r\n /**\r\n * Handle optional/nullable/default\r\n */\r\n protected handleOptionalAndNullable(\r\n data: unknown,\r\n path: (string | number)[]\r\n ): T | undefined | null {\r\n if (data === undefined) {\r\n if (this._defaultValue !== undefined) {\r\n return this._defaultValue;\r\n }\r\n if (this._optional) {\r\n return undefined;\r\n }\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Required field\",\r\n code: \"required\",\r\n expected: \"value\",\r\n received: \"undefined\",\r\n },\r\n ]);\r\n }\r\n\r\n if (data === null) {\r\n if (this._nullable) {\r\n return null;\r\n }\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Cannot be null\",\r\n code: \"invalid_type\",\r\n expected: \"non-null\",\r\n received: \"null\",\r\n },\r\n ]);\r\n }\r\n\r\n return data as T;\r\n }\r\n\r\n /**\r\n * Run custom validations\r\n */\r\n protected runCustomValidations(value: T, path: (string | number)[]): void {\r\n for (const validation of this._customValidations) {\r\n const result = validation(value);\r\n if (result !== true) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: typeof result === \"string\" ? result : \"Custom validation failed\",\r\n code: \"custom\",\r\n },\r\n ]);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * String validator\r\n */\r\nexport class StringValidator extends BaseValidator<string> {\r\n private _minLength?: number;\r\n private _maxLength?: number;\r\n private _pattern?: RegExp;\r\n private _email = false;\r\n private _url = false;\r\n private _uuid = false;\r\n private _trim = false;\r\n private _lowercase = false;\r\n private _uppercase = false;\r\n\r\n parse(data: unknown, path: (string | number)[] = []): string {\r\n const handled = this.handleOptionalAndNullable(data, path);\r\n if (handled === undefined || handled === null) return handled as any;\r\n\r\n if (typeof data !== \"string\") {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Expected string\",\r\n code: \"invalid_type\",\r\n expected: \"string\",\r\n received: typeof data,\r\n },\r\n ]);\r\n }\r\n\r\n let value = data;\r\n\r\n if (this._trim) value = value.trim();\r\n if (this._lowercase) value = value.toLowerCase();\r\n if (this._uppercase) value = value.toUpperCase();\r\n\r\n if (this._minLength !== undefined && value.length < this._minLength) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `String must be at least ${this._minLength} characters`,\r\n code: \"too_small\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._maxLength !== undefined && value.length > this._maxLength) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `String must be at most ${this._maxLength} characters`,\r\n code: \"too_big\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._pattern && !this._pattern.test(value)) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `String does not match pattern`,\r\n code: \"invalid_string\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._email && !this.isEmail(value)) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Invalid email address\",\r\n code: \"invalid_string\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._url && !this.isUrl(value)) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Invalid URL\",\r\n code: \"invalid_string\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._uuid && !this.isUuid(value)) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Invalid UUID\",\r\n code: \"invalid_string\",\r\n },\r\n ]);\r\n }\r\n\r\n this.runCustomValidations(value, path);\r\n\r\n return value;\r\n }\r\n\r\n min(length: number, message?: string): this {\r\n this._minLength = length;\r\n return this;\r\n }\r\n\r\n max(length: number, message?: string): this {\r\n this._maxLength = length;\r\n return this;\r\n }\r\n\r\n length(length: number): this {\r\n this._minLength = length;\r\n this._maxLength = length;\r\n return this;\r\n }\r\n\r\n regex(pattern: RegExp, message?: string): this {\r\n this._pattern = pattern;\r\n return this;\r\n }\r\n\r\n email(message?: string): this {\r\n this._email = true;\r\n return this;\r\n }\r\n\r\n url(message?: string): this {\r\n this._url = true;\r\n return this;\r\n }\r\n\r\n uuid(message?: string): this {\r\n this._uuid = true;\r\n return this;\r\n }\r\n\r\n trim(): this {\r\n this._trim = true;\r\n return this;\r\n }\r\n\r\n toLowerCase(): this {\r\n this._lowercase = true;\r\n return this;\r\n }\r\n\r\n toUpperCase(): this {\r\n this._uppercase = true;\r\n return this;\r\n }\r\n\r\n startsWith(prefix: string): this {\r\n return this.refine((val) => val.startsWith(prefix), `String must start with \"${prefix}\"`);\r\n }\r\n\r\n endsWith(suffix: string): this {\r\n return this.refine((val) => val.endsWith(suffix), `String must end with \"${suffix}\"`);\r\n }\r\n\r\n includes(substring: string): this {\r\n return this.refine((val) => val.includes(substring), `String must include \"${substring}\"`);\r\n }\r\n\r\n protected clone(): StringValidator {\r\n const cloned = new StringValidator();\r\n cloned._optional = this._optional;\r\n cloned._nullable = this._nullable;\r\n cloned._defaultValue = this._defaultValue;\r\n cloned._minLength = this._minLength;\r\n cloned._maxLength = this._maxLength;\r\n cloned._pattern = this._pattern;\r\n cloned._email = this._email;\r\n cloned._url = this._url;\r\n cloned._uuid = this._uuid;\r\n cloned._trim = this._trim;\r\n cloned._lowercase = this._lowercase;\r\n cloned._uppercase = this._uppercase;\r\n cloned._customValidations = [...this._customValidations];\r\n return cloned;\r\n }\r\n\r\n private isEmail(value: string): boolean {\r\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value);\r\n }\r\n\r\n private isUrl(value: string): boolean {\r\n try {\r\n new URL(value);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private isUuid(value: string): boolean {\r\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);\r\n }\r\n}\r\n\r\n/**\r\n * Number validator\r\n */\r\nexport class NumberValidator extends BaseValidator<number> {\r\n private _min?: number;\r\n private _max?: number;\r\n private _integer = false;\r\n private _positive = false;\r\n private _negative = false;\r\n private _multipleOf?: number;\r\n\r\n parse(data: unknown, path: (string | number)[] = []): number {\r\n const handled = this.handleOptionalAndNullable(data, path);\r\n if (handled === undefined || handled === null) return handled as any;\r\n\r\n if (typeof data !== \"number\" || Number.isNaN(data)) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Expected number\",\r\n code: \"invalid_type\",\r\n expected: \"number\",\r\n received: typeof data,\r\n },\r\n ]);\r\n }\r\n\r\n if (this._integer && !Number.isInteger(data)) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Expected integer\",\r\n code: \"invalid_type\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._positive && data <= 0) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Number must be positive\",\r\n code: \"too_small\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._negative && data >= 0) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Number must be negative\",\r\n code: \"too_big\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._min !== undefined && data < this._min) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `Number must be at least ${this._min}`,\r\n code: \"too_small\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._max !== undefined && data > this._max) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `Number must be at most ${this._max}`,\r\n code: \"too_big\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._multipleOf !== undefined && data % this._multipleOf !== 0) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `Number must be multiple of ${this._multipleOf}`,\r\n code: \"invalid_number\",\r\n },\r\n ]);\r\n }\r\n\r\n this.runCustomValidations(data, path);\r\n\r\n return data;\r\n }\r\n\r\n min(value: number): this {\r\n this._min = value;\r\n return this;\r\n }\r\n\r\n max(value: number): this {\r\n this._max = value;\r\n return this;\r\n }\r\n\r\n int(): this {\r\n this._integer = true;\r\n return this;\r\n }\r\n\r\n positive(): this {\r\n this._positive = true;\r\n return this;\r\n }\r\n\r\n negative(): this {\r\n this._negative = true;\r\n return this;\r\n }\r\n\r\n multipleOf(value: number): this {\r\n this._multipleOf = value;\r\n return this;\r\n }\r\n\r\n protected clone(): NumberValidator {\r\n const cloned = new NumberValidator();\r\n cloned._optional = this._optional;\r\n cloned._nullable = this._nullable;\r\n cloned._defaultValue = this._defaultValue;\r\n cloned._min = this._min;\r\n cloned._max = this._max;\r\n cloned._integer = this._integer;\r\n cloned._positive = this._positive;\r\n cloned._negative = this._negative;\r\n cloned._multipleOf = this._multipleOf;\r\n cloned._customValidations = [...this._customValidations];\r\n return cloned;\r\n }\r\n}\r\n\r\n/**\r\n * Boolean validator\r\n */\r\nexport class BooleanValidator extends BaseValidator<boolean> {\r\n parse(data: unknown, path: (string | number)[] = []): boolean {\r\n const handled = this.handleOptionalAndNullable(data, path);\r\n if (handled === undefined || handled === null) return handled as any;\r\n\r\n if (typeof data !== \"boolean\") {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Expected boolean\",\r\n code: \"invalid_type\",\r\n expected: \"boolean\",\r\n received: typeof data,\r\n },\r\n ]);\r\n }\r\n\r\n this.runCustomValidations(data, path);\r\n\r\n return data;\r\n }\r\n\r\n protected clone(): BooleanValidator {\r\n const cloned = new BooleanValidator();\r\n cloned._optional = this._optional;\r\n cloned._nullable = this._nullable;\r\n cloned._defaultValue = this._defaultValue;\r\n cloned._customValidations = [...this._customValidations];\r\n return cloned;\r\n }\r\n}\r\n\r\n/**\r\n * Array validator\r\n */\r\nexport class ArrayValidator<T> extends BaseValidator<T[]> {\r\n private _minLength?: number;\r\n private _maxLength?: number;\r\n private _itemValidator: BaseValidator<T>;\r\n\r\n constructor(itemValidator: BaseValidator<T>) {\r\n super();\r\n this._itemValidator = itemValidator;\r\n }\r\n\r\n parse(data: unknown, path: (string | number)[] = []): T[] {\r\n const handled = this.handleOptionalAndNullable(data, path);\r\n if (handled === undefined || handled === null) return handled as any;\r\n\r\n if (!Array.isArray(data)) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Expected array\",\r\n code: \"invalid_type\",\r\n expected: \"array\",\r\n received: typeof data,\r\n },\r\n ]);\r\n }\r\n\r\n if (this._minLength !== undefined && data.length < this._minLength) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `Array must have at least ${this._minLength} items`,\r\n code: \"too_small\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._maxLength !== undefined && data.length > this._maxLength) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `Array must have at most ${this._maxLength} items`,\r\n code: \"too_big\",\r\n },\r\n ]);\r\n }\r\n\r\n const errors: ValidationIssue[] = [];\r\n const result: T[] = [];\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n try {\r\n result.push(this._itemValidator.parse(data[i], [...path, i]));\r\n } catch (error) {\r\n if (error instanceof ValidationError) {\r\n errors.push(...error.errors);\r\n }\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n throw new ValidationError(errors);\r\n }\r\n\r\n this.runCustomValidations(result, path);\r\n\r\n return result;\r\n }\r\n\r\n min(length: number): this {\r\n this._minLength = length;\r\n return this;\r\n }\r\n\r\n max(length: number): this {\r\n this._maxLength = length;\r\n return this;\r\n }\r\n\r\n length(length: number): this {\r\n this._minLength = length;\r\n this._maxLength = length;\r\n return this;\r\n }\r\n\r\n nonempty(): this {\r\n this._minLength = 1;\r\n return this;\r\n }\r\n\r\n protected clone(): ArrayValidator<T> {\r\n const cloned = new ArrayValidator(this._itemValidator);\r\n cloned._optional = this._optional;\r\n cloned._nullable = this._nullable;\r\n cloned._defaultValue = this._defaultValue;\r\n cloned._minLength = this._minLength;\r\n cloned._maxLength = this._maxLength;\r\n cloned._customValidations = [...this._customValidations];\r\n return cloned;\r\n }\r\n}\r\n\r\n/**\r\n * Object validator\r\n */\r\nexport class ObjectValidator<T extends Record<string, any>> extends BaseValidator<T> {\r\n private _shape: { [K in keyof T]: BaseValidator<T[K]> };\r\n private _strict = false;\r\n private _passthrough = false;\r\n\r\n constructor(shape: { [K in keyof T]: BaseValidator<T[K]> }) {\r\n super();\r\n this._shape = shape;\r\n }\r\n\r\n parse(data: unknown, path: (string | number)[] = []): T {\r\n const handled = this.handleOptionalAndNullable(data, path);\r\n if (handled === undefined || handled === null) return handled as any;\r\n\r\n if (typeof data !== \"object\" || data === null || Array.isArray(data)) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Expected object\",\r\n code: \"invalid_type\",\r\n expected: \"object\",\r\n received: Array.isArray(data) ? \"array\" : typeof data,\r\n },\r\n ]);\r\n }\r\n\r\n const errors: ValidationIssue[] = [];\r\n const result: any = {};\r\n const inputKeys = Object.keys(data);\r\n const shapeKeys = Object.keys(this._shape);\r\n\r\n // Validate shape keys\r\n for (const key of shapeKeys) {\r\n try {\r\n result[key] = this._shape[key]?.parse((data as any)[key], [...path, key]);\r\n } catch (error) {\r\n if (error instanceof ValidationError) {\r\n errors.push(...error.errors);\r\n }\r\n }\r\n }\r\n\r\n // Handle extra keys\r\n const extraKeys = inputKeys.filter((k) => !shapeKeys.includes(k));\r\n if (this._strict && extraKeys.length > 0) {\r\n errors.push({\r\n path,\r\n message: `Unexpected keys: ${extraKeys.join(\", \")}`,\r\n code: \"unrecognized_keys\",\r\n });\r\n } else if (this._passthrough) {\r\n for (const key of extraKeys) {\r\n result[key] = (data as any)[key];\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n throw new ValidationError(errors);\r\n }\r\n\r\n this.runCustomValidations(result, path);\r\n\r\n return result;\r\n }\r\n\r\n strict(): this {\r\n this._strict = true;\r\n return this;\r\n }\r\n\r\n passthrough(): this {\r\n this._passthrough = true;\r\n return this;\r\n }\r\n\r\n partial(): ObjectValidator<Partial<T>> {\r\n const newShape: any = {};\r\n for (const key in this._shape) {\r\n newShape[key] = this._shape[key].optional();\r\n }\r\n return new ObjectValidator(newShape);\r\n }\r\n\r\n pick<K extends keyof T>(...keys: K[]): ObjectValidator<Pick<T, K>> {\r\n const newShape: any = {};\r\n for (const key of keys) {\r\n newShape[key] = this._shape[key];\r\n }\r\n return new ObjectValidator(newShape);\r\n }\r\n\r\n omit<K extends keyof T>(...keys: K[]): ObjectValidator<Omit<T, K>> {\r\n const newShape: any = {};\r\n for (const key in this._shape) {\r\n if (!keys.includes(key as unknown as K)) {\r\n newShape[key] = this._shape[key];\r\n }\r\n }\r\n return new ObjectValidator(newShape);\r\n }\r\n\r\n protected clone(): ObjectValidator<T> {\r\n const cloned = new ObjectValidator(this._shape);\r\n cloned._optional = this._optional;\r\n cloned._nullable = this._nullable;\r\n cloned._defaultValue = this._defaultValue;\r\n cloned._strict = this._strict;\r\n cloned._passthrough = this._passthrough;\r\n cloned._customValidations = [...this._customValidations];\r\n return cloned;\r\n }\r\n}\r\n\r\n/**\r\n * Enum validator\r\n */\r\nexport class EnumValidator<T extends string | number> extends BaseValidator<T> {\r\n private _values: readonly T[];\r\n\r\n constructor(values: readonly T[]) {\r\n super();\r\n this._values = values;\r\n }\r\n\r\n parse(data: unknown, path: (string | number)[] = []): T {\r\n const handled = this.handleOptionalAndNullable(data, path);\r\n if (handled === undefined || handled === null) return handled as any;\r\n\r\n if (!this._values.includes(data as T)) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `Expected one of: ${this._values.join(\", \")}`,\r\n code: \"invalid_enum_value\",\r\n received: String(data),\r\n },\r\n ]);\r\n }\r\n\r\n this.runCustomValidations(data as T, path);\r\n\r\n return data as T;\r\n }\r\n\r\n protected clone(): EnumValidator<T> {\r\n const cloned = new EnumValidator(this._values);\r\n cloned._optional = this._optional;\r\n cloned._nullable = this._nullable;\r\n cloned._defaultValue = this._defaultValue;\r\n cloned._customValidations = [...this._customValidations];\r\n return cloned;\r\n }\r\n}\r\n\r\n/**\r\n * Date validator\r\n */\r\nexport class DateValidator extends BaseValidator<Date> {\r\n private _min?: Date;\r\n private _max?: Date;\r\n\r\n parse(data: unknown, path: (string | number)[] = []): Date {\r\n const handled = this.handleOptionalAndNullable(data, path);\r\n if (handled === undefined || handled === null) return handled as any;\r\n\r\n let date: Date;\r\n\r\n if (data instanceof Date) {\r\n date = data;\r\n } else if (typeof data === \"string\" || typeof data === \"number\") {\r\n date = new Date(data);\r\n } else {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Expected date\",\r\n code: \"invalid_type\",\r\n expected: \"date\",\r\n received: typeof data,\r\n },\r\n ]);\r\n }\r\n\r\n if (isNaN(date.getTime())) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Invalid date\",\r\n code: \"invalid_date\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._min && date < this._min) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `Date must be after ${this._min.toISOString()}`,\r\n code: \"too_small\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._max && date > this._max) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `Date must be before ${this._max.toISOString()}`,\r\n code: \"too_big\",\r\n },\r\n ]);\r\n }\r\n\r\n this.runCustomValidations(date, path);\r\n\r\n return date;\r\n }\r\n\r\n min(date: Date): this {\r\n this._min = date;\r\n return this;\r\n }\r\n\r\n max(date: Date): this {\r\n this._max = date;\r\n return this;\r\n }\r\n\r\n protected clone(): DateValidator {\r\n const cloned = new DateValidator();\r\n cloned._optional = this._optional;\r\n cloned._nullable = this._nullable;\r\n cloned._defaultValue = this._defaultValue;\r\n cloned._min = this._min;\r\n cloned._max = this._max;\r\n cloned._customValidations = [...this._customValidations];\r\n return cloned;\r\n }\r\n}\r\n\r\n/**\r\n * Literal validator\r\n */\r\nexport class LiteralValidator<T extends string | number | boolean> extends BaseValidator<T> {\r\n private _value: T;\r\n\r\n constructor(value: T) {\r\n super();\r\n this._value = value;\r\n }\r\n\r\n parse(data: unknown, path: (string | number)[] = []): T {\r\n const handled = this.handleOptionalAndNullable(data, path);\r\n if (handled === undefined || handled === null) return handled as any;\r\n\r\n if (data !== this._value) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `Expected literal value: ${this._value}`,\r\n code: \"invalid_literal\",\r\n expected: String(this._value),\r\n received: String(data),\r\n },\r\n ]);\r\n }\r\n\r\n return data as T;\r\n }\r\n\r\n protected clone(): LiteralValidator<T> {\r\n const cloned = new LiteralValidator(this._value);\r\n cloned._optional = this._optional;\r\n cloned._nullable = this._nullable;\r\n cloned._defaultValue = this._defaultValue;\r\n cloned._customValidations = [...this._customValidations];\r\n return cloned;\r\n }\r\n}\r\n\r\n/**\r\n * Union validator\r\n */\r\nexport class UnionValidator<T> extends BaseValidator<T> {\r\n private _validators: BaseValidator<any>[];\r\n\r\n constructor(validators: BaseValidator<any>[]) {\r\n super();\r\n this._validators = validators;\r\n }\r\n\r\n parse(data: unknown, path: (string | number)[] = []): T {\r\n const handled = this.handleOptionalAndNullable(data, path);\r\n if (handled === undefined || handled === null) return handled as any;\r\n\r\n const errors: ValidationIssue[] = [];\r\n\r\n for (const validator of this._validators) {\r\n try {\r\n return validator.parse(data, path);\r\n } catch (error) {\r\n if (error instanceof ValidationError) {\r\n errors.push(...error.errors);\r\n }\r\n }\r\n }\r\n\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Value does not match any union type\",\r\n code: \"invalid_union\",\r\n },\r\n ]);\r\n }\r\n\r\n protected clone(): UnionValidator<T> {\r\n const cloned = new UnionValidator<T>(this._validators);\r\n cloned._optional = this._optional;\r\n cloned._nullable = this._nullable;\r\n cloned._defaultValue = this._defaultValue as T | undefined;\r\n cloned._customValidations = [...this._customValidations] as Array<(value: T) => boolean | string>;\r\n return cloned;\r\n }\r\n}\r\n\r\n/**\r\n * Main validator factory (similar to Zod's z)\r\n */\r\nexport const v = {\r\n string: () => new StringValidator(),\r\n number: () => new NumberValidator(),\r\n boolean: () => new BooleanValidator(),\r\n date: () => new DateValidator(),\r\n array: <T>(itemValidator: BaseValidator<T>) => new ArrayValidator(itemValidator),\r\n object: <T extends Record<string, any>>(shape: { [K in keyof T]: BaseValidator<T[K]> }) =>\r\n new ObjectValidator(shape),\r\n enum: <T extends string | number>(values: readonly T[]) => new EnumValidator(values),\r\n literal: <T extends string | number | boolean>(value: T) => new LiteralValidator(value),\r\n union: <T>(...validators: BaseValidator<any>[]) => new UnionValidator<T>(validators),\r\n\r\n // Aliases\r\n str: () => new StringValidator(),\r\n num: () => new NumberValidator(),\r\n bool: () => new BooleanValidator(),\r\n arr: <T>(itemValidator: BaseValidator<T>) => new ArrayValidator(itemValidator),\r\n obj: <T extends Record<string, any>>(shape: { [K in keyof T]: BaseValidator<T[K]> }) =>\r\n new ObjectValidator(shape),\r\n};\r\n\r\n// Export types\r\nexport type Infer<T extends BaseValidator<any>> = T extends BaseValidator<infer U> ? U : never;\r\n","export interface DtoValidationError {\r\n field: string;\r\n message: string;\r\n value?: any;\r\n}\r\n\r\nexport interface ValidationResult {\r\n valid: boolean;\r\n errors: DtoValidationError[];\r\n data?: any;\r\n}\r\n\r\ntype RuleType = \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\r\n\r\ninterface FieldRule {\r\n type?: RuleType;\r\n required?: boolean;\r\n min?: number;\r\n max?: number;\r\n pattern?: RegExp;\r\n enum?: any[];\r\n custom?: (value: any) => string | null;\r\n message?: string;\r\n}\r\n\r\nexport type Schema = Record<string, FieldRule>;\r\n\r\nexport class DTOValidator {\r\n static validate(data: any, schema: Schema): ValidationResult {\r\n const errors: DtoValidationError[] = [];\r\n\r\n if (data == null || typeof data !== \"object\") {\r\n return {\r\n valid: false,\r\n errors: [{ field: \"_root\", message: \"Request body must be an object\" }],\r\n };\r\n }\r\n\r\n for (const [field, rule] of Object.entries(schema)) {\r\n const value = data[field];\r\n\r\n if (rule.required && (value === undefined || value === null || value === \"\")) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} is required`,\r\n value,\r\n });\r\n continue;\r\n }\r\n\r\n if (value === undefined || value === null) continue;\r\n\r\n if (rule.type) {\r\n const actualType = Array.isArray(value) ? \"array\" : typeof value;\r\n if (actualType !== rule.type) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be of type ${rule.type}`,\r\n value,\r\n });\r\n continue;\r\n }\r\n }\r\n\r\n if (rule.type === \"string\" || typeof value === \"string\") {\r\n if (rule.min !== undefined && value.length < rule.min) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be at least ${rule.min} characters`,\r\n value,\r\n });\r\n }\r\n if (rule.max !== undefined && value.length > rule.max) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be at most ${rule.max} characters`,\r\n value,\r\n });\r\n }\r\n if (rule.pattern && !rule.pattern.test(value)) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} has invalid format`,\r\n value,\r\n });\r\n }\r\n }\r\n\r\n if (rule.type === \"number\" || typeof value === \"number\") {\r\n if (rule.min !== undefined && value < rule.min) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be at least ${rule.min}`,\r\n value,\r\n });\r\n }\r\n if (rule.max !== undefined && value > rule.max) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be at most ${rule.max}`,\r\n value,\r\n });\r\n }\r\n }\r\n\r\n if (rule.type === \"array\" && Array.isArray(value)) {\r\n if (rule.min !== undefined && value.length < rule.min) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must have at least ${rule.min} items`,\r\n value,\r\n });\r\n }\r\n if (rule.max !== undefined && value.length > rule.max) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must have at most ${rule.max} items`,\r\n value,\r\n });\r\n }\r\n }\r\n\r\n if (rule.enum && !rule.enum.includes(value)) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be one of: ${rule.enum.join(\", \")}`,\r\n value,\r\n });\r\n }\r\n\r\n if (rule.custom) {\r\n const customError = rule.custom(value);\r\n if (customError) {\r\n errors.push({ field, message: customError, value });\r\n }\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n data: errors.length === 0 ? data : undefined,\r\n };\r\n }\r\n}\r\n","export interface ExternalSchema {\r\n parse?: (data: any) => any;\r\n safeParse?: (data: any) => { success: boolean; data?: any; error?: any };\r\n validate?: (data: any) => { value?: any; error?: any };\r\n}\r\n\r\nexport interface SchemaValidationResult {\r\n valid: boolean;\r\n data?: any;\r\n errors?: any;\r\n}\r\n\r\nexport class SchemaValidator {\r\n static validate(data: any, schema: ExternalSchema): SchemaValidationResult {\r\n // Zod-style schema\r\n if (typeof schema.safeParse === \"function\") {\r\n const result = schema.safeParse(data);\r\n if (result.success) {\r\n return { valid: true, data: result.data };\r\n }\r\n return { valid: false, errors: result.error };\r\n }\r\n\r\n // Zod parse (throws on error)\r\n if (typeof schema.parse === \"function\") {\r\n try {\r\n const parsed = schema.parse(data);\r\n return { valid: true, data: parsed };\r\n } catch (err) {\r\n return { valid: false, errors: err };\r\n }\r\n }\r\n\r\n // Joi-style schema\r\n if (typeof schema.validate === \"function\") {\r\n const result = schema.validate(data);\r\n if (result.error) {\r\n return { valid: false, errors: result.error };\r\n }\r\n return { valid: true, data: result.value };\r\n }\r\n\r\n return { valid: true, data };\r\n }\r\n}\r\n","import { readFileSync, existsSync } from \"node:fs\";\r\nimport { resolve, join } from \"node:path\";\r\nimport type { AzuraConfig } from \"../types/config.type.js\";\r\n\r\nconst CONFIG_FILES = [\r\n \"azura.config.ts\",\r\n \"azura.config.js\",\r\n \"azura.config.mjs\",\r\n \"azura.config.json\",\r\n \"azura.config.yaml\",\r\n \"azura.config.yml\",\r\n];\r\n\r\nexport class ConfigModule {\r\n private static instance: ConfigModule | null = null;\r\n private config: AzuraConfig = {};\r\n\r\n private constructor() {}\r\n\r\n static getInstance(): ConfigModule {\r\n if (!ConfigModule.instance) {\r\n ConfigModule.instance = new ConfigModule();\r\n }\r\n return ConfigModule.instance;\r\n }\r\n\r\n static async load(cwd?: string): Promise<AzuraConfig> {\r\n const instance = ConfigModule.getInstance();\r\n const baseDir = cwd ?? process.cwd();\r\n\r\n for (const file of CONFIG_FILES) {\r\n const fullPath = resolve(baseDir, file);\r\n if (!existsSync(fullPath)) continue;\r\n\r\n if (file.endsWith(\".json\")) {\r\n instance.config = JSON.parse(readFileSync(fullPath, \"utf-8\"));\r\n return instance.config;\r\n }\r\n\r\n if (file.endsWith(\".yaml\") || file.endsWith(\".yml\")) {\r\n instance.config = parseSimpleYaml(readFileSync(fullPath, \"utf-8\"));\r\n return instance.config;\r\n }\r\n\r\n if (file.endsWith(\".ts\") || file.endsWith(\".js\") || file.endsWith(\".mjs\")) {\r\n try {\r\n const mod = await import(`file://${fullPath}`);\r\n instance.config = mod.default ?? mod;\r\n return instance.config;\r\n } catch {\r\n // TS files may need transpilation — skip if import fails\r\n }\r\n }\r\n }\r\n\r\n return instance.config;\r\n }\r\n\r\n static loadSync(cwd?: string): AzuraConfig {\r\n const instance = ConfigModule.getInstance();\r\n const baseDir = cwd ?? process.cwd();\r\n\r\n for (const file of CONFIG_FILES) {\r\n const fullPath = resolve(baseDir, file);\r\n if (!existsSync(fullPath)) continue;\r\n\r\n if (file.endsWith(\".json\")) {\r\n instance.config = JSON.parse(readFileSync(fullPath, \"utf-8\"));\r\n return instance.config;\r\n }\r\n\r\n if (file.endsWith(\".yaml\") || file.endsWith(\".yml\")) {\r\n instance.config = parseSimpleYaml(readFileSync(fullPath, \"utf-8\"));\r\n return instance.config;\r\n }\r\n }\r\n\r\n return instance.config;\r\n }\r\n\r\n static get(): AzuraConfig {\r\n return ConfigModule.getInstance().config;\r\n }\r\n\r\n static set(config: AzuraConfig): void {\r\n ConfigModule.getInstance().config = config;\r\n }\r\n\r\n static merge(partial: Partial<AzuraConfig>): AzuraConfig {\r\n const instance = ConfigModule.getInstance();\r\n instance.config = deepMerge(instance.config, partial) as AzuraConfig;\r\n return instance.config;\r\n }\r\n}\r\n\r\nfunction deepMerge(target: any, source: any): any {\r\n const output = { ...target };\r\n for (const key of Object.keys(source)) {\r\n if (\r\n source[key] &&\r\n typeof source[key] === \"object\" &&\r\n !Array.isArray(source[key]) &&\r\n target[key] &&\r\n typeof target[key] === \"object\"\r\n ) {\r\n output[key] = deepMerge(target[key], source[key]);\r\n } else {\r\n output[key] = source[key];\r\n }\r\n }\r\n return output;\r\n}\r\n\r\n/**\r\n * Minimal YAML parser for flat/shallow config files.\r\n * Does not handle complex YAML features — use JSON for complex configs.\r\n */\r\nfunction parseSimpleYaml(content: string): Record<string, any> {\r\n const result: Record<string, any> = {};\r\n const lines = content.split(\"\\n\");\r\n const stack: { indent: number; obj: Record<string, any> }[] = [{ indent: -1, obj: result }];\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\r\n\r\n const indent = line.search(/\\S/);\r\n const colonIdx = trimmed.indexOf(\":\");\r\n\r\n if (colonIdx === -1) continue;\r\n\r\n const key = trimmed.slice(0, colonIdx).trim();\r\n const rawValue = trimmed.slice(colonIdx + 1).trim();\r\n\r\n while (stack.length > 1 && stack[stack.length - 1].indent >= indent) {\r\n stack.pop();\r\n }\r\n\r\n const parent = stack[stack.length - 1].obj;\r\n\r\n if (!rawValue) {\r\n const newObj: Record<string, any> = {};\r\n parent[key] = newObj;\r\n stack.push({ indent, obj: newObj });\r\n } else {\r\n parent[key] = parseYamlValue(rawValue);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction parseYamlValue(val: string): any {\r\n if (val === \"true\") return true;\r\n if (val === \"false\") return false;\r\n if (val === \"null\") return null;\r\n if (/^-?\\d+$/.test(val)) return parseInt(val, 10);\r\n if (/^-?\\d+\\.\\d+$/.test(val)) return parseFloat(val);\r\n if ((val.startsWith('\"') && val.endsWith('\"')) || (val.startsWith(\"'\") && val.endsWith(\"'\"))) {\r\n return val.slice(1, -1);\r\n }\r\n if (val.startsWith(\"[\") && val.endsWith(\"]\")) {\r\n return val\r\n .slice(1, -1)\r\n .split(\",\")\r\n .map((v) => parseYamlValue(v.trim()));\r\n }\r\n return val;\r\n}\r\n","import type { PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nexport function LoggingMiddleware(): PluginHandler {\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n const start = process.hrtime.bigint();\r\n\r\n const originalEnd = res.end;\r\n (res as any).end = function (...args: any[]) {\r\n const duration = process.hrtime.bigint() - start;\r\n const ms = Number(duration) / 1_000_000;\r\n\r\n res.setHeader(\"X-Response-Time\", `${ms.toFixed(2)}ms`);\r\n\r\n return (originalEnd as any).apply(this, args);\r\n };\r\n\r\n next();\r\n };\r\n}\r\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/core/router.ts","../src/utils/Logger.ts","../src/types/http/status.ts","../src/utils/HttpError.ts","../src/utils/Parser.ts","../src/utils/IpResolver.ts","../src/utils/cookies/CookieManager.ts","../src/swagger/constants.ts","../src/swagger/openapi-builder.ts","../src/core/server.ts","../src/decorators/Route.ts","../src/swagger/decorators.ts","../src/plugins/CORSPlugin.ts","../src/plugins/RateLimitPlugin.ts","../src/plugins/HelmetPlugin.ts","../src/plugins/JWTPlugin.ts","../src/plugins/SessionPlugin.ts","../src/plugins/CompressionPlugin.ts","../src/plugins/StaticPlugin.ts","../src/plugins/ETagPlugin.ts","../src/plugins/RequestIdPlugin.ts","../src/plugins/TimeoutPlugin.ts","../src/plugins/HealthCheckPlugin.ts","../src/plugins/CircuitBreakerPlugin.ts","../src/plugins/SSEPlugin.ts","../src/plugins/ProxyPlugin.ts","../src/plugins/MultipartPlugin.ts","../src/swagger/swagger-ui-template.ts","../src/swagger/swagger-ui-html.ts","../src/plugins/SwaggerPlugin.ts","../src/utils/validators/Validator.ts","../src/utils/validators/DTOValidator.ts","../src/utils/validators/SchemaValidator.ts","../src/config/ConfigModule.ts","../src/middleware/LoggingMiddleware.ts"],"names":["resolve","Controller","result","createHttpsServer","readFileSync","createServer","CONTROLLER_META_KEY","ROUTES_META_KEY","PARAMS_META_KEY","createHmac","randomBytes","createGzip","createDeflate","path","join","existsSync","statSync","extname","createReadStream","createHash","randomUUID","URL","httpsRequest","httpRequest","mkdirSync","writeFileSync","v"],"mappings":"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A;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA,OAAA,CAAA;;;ACCvC,SAAS,oBAAoB,OAAA,EAIzB;AACT,EAAA,MAAM,EAAE,KAAA,EAAO,OAAA,EAAQ,GAAI,OAAA;AAC3B,EAAA,OAAO,uBAAuB,UAAA,CAAW,gBAAA,EAAkB,UAAA,CAAW,KAAK,CAAC,CAAA,CAAE,UAAA;AAAA,IAC5E,oCAAA;AAAA,IACA,IAAA,CAAK,UAAU,OAAO;AAAA,GACxB;AACF;AAEA,SAAS,WAAW,CAAA,EAAmB;AACrC,EAAA,OAAO,CAAA,CACJ,OAAA,CAAQ,IAAA,EAAM,OAAO,EACrB,OAAA,CAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,QAAQ,IAAA,EAAM,MAAM,CAAA,CACpB,OAAA,CAAQ,MAAM,QAAQ,CAAA;AAC3B;;;AClBO,SAAS,cAAc,OAAA,EAA8C;AAC1E,EAAA,MAAM;AAAA,IACJ,YAAA;AAAA,IACA,QAAA,GAAW,eAAA;AAAA,IACX,QAAA,GAAW,OAAA;AAAA,IACX,WAAA,GAAc,IAAA;AAAA,IACd,OAAA;AAAA,IACA,UAAA;AAAA,IACA;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,IAAS,KAAA;AAE7B,EAAA,OAAO,OAAO,KAAK,IAAA,KAAS;AAC1B,IAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,GAAA;AACrB,IAAA,MAAM,IAAA,GAAO,IAAI,QAAA,IAAY,EAAA;AAE7B,IAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA,EAAK;AAChD,MAAA,MAAM,GAAA,GAAM,oBAAA,CAAqB,YAAA,EAAa,EAAG;AAAA,QAC/C,IAAA,EAAM,IAAA,IAAQ,EAAE,KAAA,EAAO,SAAS,OAAA,EAAQ;AAAA,QACxC,OAAA;AAAA,QACA;AAAA,OACD,CAAA;AACD,MAAA,GAAA,CAAI,KAAK,GAAG,CAAA;AACZ,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,IAAA,KAAS,QAAA,IAAY,IAAA,KAAS,CAAA,EAAG,QAAQ,CAAA,CAAA,CAAA,EAAK;AAChD,MAAA,MAAM,OAAO,mBAAA,CAAoB;AAAA,QAC/B,KAAA;AAAA,QACA,OAAA,EAAS,QAEX,CAAC,CAAA;AACD,MAAA,GAAA,CAAI,KAAK,IAAI,CAAA;AACb,MAAA;AAAA,IACF;AAEA,IAAA,IAAA,EAAK;AAAA,EACP,CAAA;AACF;;;AClCO,IAAM,eAAA,GAAN,cAA8B,KAAA,CAAM;AAAA,EACzB,MAAA;AAAA,EAEhB,YAAY,MAAA,EAA2B;AACrC,IAAA,KAAA,CAAM,MAAA,CAAO,IAAI,CAAC,CAAA,KAAM,EAAE,OAAO,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA;AAC7C,IAAA,IAAA,CAAK,IAAA,GAAO,iBAAA;AACZ,IAAA,IAAA,CAAK,MAAA,GAAS,MAAA;AAAA,EAChB;AAAA,EAEA,MAAA,GAAmC;AACjC,IAAA,MAAM,YAAsC,EAAC;AAC7C,IAAA,KAAA,MAAW,KAAA,IAAS,KAAK,MAAA,EAAQ;AAC/B,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAChC,MAAA,IAAI,CAAC,SAAA,CAAU,IAAI,CAAA,EAAG;AACpB,QAAA,SAAA,CAAU,IAAI,IAAI,EAAC;AAAA,MACrB;AACA,MAAA,SAAA,CAAU,IAAI,CAAA,CAAE,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAAA,IACpC;AACA,IAAA,OAAO,SAAA;AAAA,EACT;AACF;AAKO,IAAe,gBAAf,MAAgC;AAAA,EAC3B,SAAA,GAAY,KAAA;AAAA,EACZ,SAAA,GAAY,KAAA;AAAA,EACZ,aAAA;AAAA,EACA,YAAA;AAAA,EACA,qBAA4D,EAAC;AAAA;AAAA;AAAA;AAAA,EAUvE,UACE,IAAA,EACyE;AACzE,IAAA,IAAI;AACF,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAC9B,MAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,IACvC,SAAS,KAAA,EAAO;AACd,MAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,QAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,KAAA,EAAM;AAAA,MACjC;AACA,MAAA,OAAO;AAAA,QACL,OAAA,EAAS,KAAA;AAAA,QACT,KAAA,EAAO,IAAI,eAAA,CAAgB;AAAA,UACzB;AAAA,YACE,MAAM,EAAC;AAAA,YACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AAAA,YAC9D,IAAA,EAAM;AAAA;AACR,SACD;AAAA,OACH;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAyC;AACvC,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,KAAA,CAAM,SAAA,GAAY,IAAA;AAClB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAA,GAAoC;AAClC,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,KAAA,CAAM,SAAA,GAAY,IAAA;AAClB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ,KAAA,EAA4B;AAClC,IAAA,MAAM,KAAA,GAAQ,KAAK,KAAA,EAAM;AACzB,IAAA,KAAA,CAAM,aAAA,GAAgB,KAAA;AACtB,IAAA,OAAO,KAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS,WAAA,EAA2B;AAClC,IAAA,IAAA,CAAK,YAAA,GAAe,WAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKA,MAAA,CAAO,WAAkC,OAAA,EAAwB;AAC/D,IAAA,IAAA,CAAK,kBAAA,CAAmB,KAAK,CAAC,KAAA,KAAa,UAAU,KAAK,CAAA,IAAK,WAAW,mBAAmB,CAAA;AAC7F,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAUU,yBAAA,CACR,MACA,IAAA,EACsB;AACtB,IAAA,IAAI,SAAS,MAAA,EAAW;AACtB,MAAA,IAAI,IAAA,CAAK,kBAAkB,MAAA,EAAW;AACpC,QAAA,OAAO,IAAA,CAAK,aAAA;AAAA,MACd;AACA,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,OAAO,MAAA;AAAA,MACT;AACA,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,gBAAA;AAAA,UACT,IAAA,EAAM,UAAA;AAAA,UACN,QAAA,EAAU,OAAA;AAAA,UACV,QAAA,EAAU;AAAA;AACZ,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,SAAS,IAAA,EAAM;AACjB,MAAA,IAAI,KAAK,SAAA,EAAW;AAClB,QAAA,OAAO,IAAA;AAAA,MACT;AACA,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,gBAAA;AAAA,UACT,IAAA,EAAM,cAAA;AAAA,UACN,QAAA,EAAU,UAAA;AAAA,UACV,QAAA,EAAU;AAAA;AACZ,OACD,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKU,oBAAA,CAAqB,OAAU,IAAA,EAAiC;AACxE,IAAA,KAAA,MAAW,UAAA,IAAc,KAAK,kBAAA,EAAoB;AAChD,MAAA,MAAM,MAAA,GAAS,WAAW,KAAK,CAAA;AAC/B,MAAA,IAAI,WAAW,IAAA,EAAM;AACnB,QAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,UACxB;AAAA,YACE,IAAA;AAAA,YACA,OAAA,EAAS,OAAO,MAAA,KAAW,QAAA,GAAW,MAAA,GAAS,0BAAA;AAAA,YAC/C,IAAA,EAAM;AAAA;AACR,SACD,CAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AACF;AAKO,IAAM,eAAA,GAAN,MAAM,gBAAA,SAAwB,aAAA,CAAsB;AAAA,EACjD,UAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA,EACA,MAAA,GAAS,KAAA;AAAA,EACT,IAAA,GAAO,KAAA;AAAA,EACP,KAAA,GAAQ,KAAA;AAAA,EACR,KAAA,GAAQ,KAAA;AAAA,EACR,UAAA,GAAa,KAAA;AAAA,EACb,UAAA,GAAa,KAAA;AAAA,EAErB,KAAA,CAAM,IAAA,EAAe,IAAA,GAA4B,EAAC,EAAW;AAC3D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,IAAI,CAAA;AACzD,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM,OAAO,OAAA;AAEtD,IAAA,IAAI,OAAO,SAAS,QAAA,EAAU;AAC5B,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,iBAAA;AAAA,UACT,IAAA,EAAM,cAAA;AAAA,UACN,QAAA,EAAU,QAAA;AAAA,UACV,UAAU,OAAO;AAAA;AACnB,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAA,GAAQ,IAAA;AAEZ,IAAA,IAAI,IAAA,CAAK,KAAA,EAAO,KAAA,GAAQ,KAAA,CAAM,IAAA,EAAK;AACnC,IAAA,IAAI,IAAA,CAAK,UAAA,EAAY,KAAA,GAAQ,KAAA,CAAM,WAAA,EAAY;AAC/C,IAAA,IAAI,IAAA,CAAK,UAAA,EAAY,KAAA,GAAQ,KAAA,CAAM,WAAA,EAAY;AAE/C,IAAA,IAAI,KAAK,UAAA,KAAe,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,KAAK,UAAA,EAAY;AACnE,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,CAAA,wBAAA,EAA2B,IAAA,CAAK,UAAU,CAAA,WAAA,CAAA;AAAA,UACnD,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAK,UAAA,KAAe,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,KAAK,UAAA,EAAY;AACnE,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,CAAA,uBAAA,EAA0B,IAAA,CAAK,UAAU,CAAA,WAAA,CAAA;AAAA,UAClD,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAK,QAAA,IAAY,CAAC,KAAK,QAAA,CAAS,IAAA,CAAK,KAAK,CAAA,EAAG;AAC/C,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,CAAA,6BAAA,CAAA;AAAA,UACT,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAK,MAAA,IAAU,CAAC,IAAA,CAAK,OAAA,CAAQ,KAAK,CAAA,EAAG;AACvC,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,uBAAA;AAAA,UACT,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAK,IAAA,IAAQ,CAAC,IAAA,CAAK,KAAA,CAAM,KAAK,CAAA,EAAG;AACnC,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,aAAA;AAAA,UACT,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAK,KAAA,IAAS,CAAC,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,EAAG;AACrC,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,cAAA;AAAA,UACT,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,oBAAA,CAAqB,OAAO,IAAI,CAAA;AAErC,IAAA,OAAO,KAAA;AAAA,EACT;AAAA,EAEA,GAAA,CAAI,QAAgB,OAAA,EAAwB;AAC1C,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,GAAA,CAAI,QAAgB,OAAA,EAAwB;AAC1C,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAO,MAAA,EAAsB;AAC3B,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,KAAA,CAAM,SAAiB,OAAA,EAAwB;AAC7C,IAAA,IAAA,CAAK,QAAA,GAAW,OAAA;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,MAAM,OAAA,EAAwB;AAC5B,IAAA,IAAA,CAAK,MAAA,GAAS,IAAA;AACd,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAI,OAAA,EAAwB;AAC1B,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,KAAK,OAAA,EAAwB;AAC3B,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAA,GAAa;AACX,IAAA,IAAA,CAAK,KAAA,GAAQ,IAAA;AACb,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAW,MAAA,EAAsB;AAC/B,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,WAAW,MAAM,CAAA,EAAG,CAAA,wBAAA,EAA2B,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,EAC1F;AAAA,EAEA,SAAS,MAAA,EAAsB;AAC7B,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,SAAS,MAAM,CAAA,EAAG,CAAA,sBAAA,EAAyB,MAAM,CAAA,CAAA,CAAG,CAAA;AAAA,EACtF;AAAA,EAEA,SAAS,SAAA,EAAyB;AAChC,IAAA,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,GAAA,KAAQ,GAAA,CAAI,SAAS,SAAS,CAAA,EAAG,CAAA,qBAAA,EAAwB,SAAS,CAAA,CAAA,CAAG,CAAA;AAAA,EAC3F;AAAA,EAEU,KAAA,GAAyB;AACjC,IAAA,MAAM,MAAA,GAAS,IAAI,gBAAA,EAAgB;AACnC,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,gBAAgB,IAAA,CAAK,aAAA;AAC5B,IAAA,MAAA,CAAO,aAAa,IAAA,CAAK,UAAA;AACzB,IAAA,MAAA,CAAO,aAAa,IAAA,CAAK,UAAA;AACzB,IAAA,MAAA,CAAO,WAAW,IAAA,CAAK,QAAA;AACvB,IAAA,MAAA,CAAO,SAAS,IAAA,CAAK,MAAA;AACrB,IAAA,MAAA,CAAO,OAAO,IAAA,CAAK,IAAA;AACnB,IAAA,MAAA,CAAO,QAAQ,IAAA,CAAK,KAAA;AACpB,IAAA,MAAA,CAAO,QAAQ,IAAA,CAAK,KAAA;AACpB,IAAA,MAAA,CAAO,aAAa,IAAA,CAAK,UAAA;AACzB,IAAA,MAAA,CAAO,aAAa,IAAA,CAAK,UAAA;AACzB,IAAA,MAAA,CAAO,kBAAA,GAAqB,CAAC,GAAG,IAAA,CAAK,kBAAkB,CAAA;AACvD,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEQ,QAAQ,KAAA,EAAwB;AACtC,IAAA,OAAO,4BAAA,CAA6B,KAAK,KAAK,CAAA;AAAA,EAChD;AAAA,EAEQ,MAAM,KAAA,EAAwB;AACpC,IAAA,IAAI;AACF,MAAA,IAAI,IAAI,KAAK,CAAA;AACb,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF;AAAA,EAEQ,OAAO,KAAA,EAAwB;AACrC,IAAA,OAAO,iEAAA,CAAkE,KAAK,KAAK,CAAA;AAAA,EACrF;AACF;AAKO,IAAM,eAAA,GAAN,MAAM,gBAAA,SAAwB,aAAA,CAAsB;AAAA,EACjD,IAAA;AAAA,EACA,IAAA;AAAA,EACA,QAAA,GAAW,KAAA;AAAA,EACX,SAAA,GAAY,KAAA;AAAA,EACZ,SAAA,GAAY,KAAA;AAAA,EACZ,WAAA;AAAA,EAER,KAAA,CAAM,IAAA,EAAe,IAAA,GAA4B,EAAC,EAAW;AAC3D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,IAAI,CAAA;AACzD,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM,OAAO,OAAA;AAEtD,IAAA,IAAI,OAAO,IAAA,KAAS,QAAA,IAAY,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA,EAAG;AAClD,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,iBAAA;AAAA,UACT,IAAA,EAAM,cAAA;AAAA,UACN,QAAA,EAAU,QAAA;AAAA,UACV,UAAU,OAAO;AAAA;AACnB,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAK,QAAA,IAAY,CAAC,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA,EAAG;AAC5C,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,kBAAA;AAAA,UACT,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,IAAQ,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,yBAAA;AAAA,UACT,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,IAAA,CAAK,SAAA,IAAa,IAAA,IAAQ,CAAA,EAAG;AAC/B,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,yBAAA;AAAA,UACT,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAa,IAAA,GAAO,KAAK,IAAA,EAAM;AAC/C,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,CAAA,wBAAA,EAA2B,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,UAC7C,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,KAAS,MAAA,IAAa,IAAA,GAAO,KAAK,IAAA,EAAM;AAC/C,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,CAAA,uBAAA,EAA0B,IAAA,CAAK,IAAI,CAAA,CAAA;AAAA,UAC5C,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAK,WAAA,KAAgB,MAAA,IAAa,IAAA,GAAO,IAAA,CAAK,gBAAgB,CAAA,EAAG;AACnE,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,CAAA,2BAAA,EAA8B,IAAA,CAAK,WAAW,CAAA,CAAA;AAAA,UACvD,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,oBAAA,CAAqB,MAAM,IAAI,CAAA;AAEpC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAI,KAAA,EAAqB;AACvB,IAAA,IAAA,CAAK,IAAA,GAAO,KAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAI,KAAA,EAAqB;AACvB,IAAA,IAAA,CAAK,IAAA,GAAO,KAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,GAAA,GAAY;AACV,IAAA,IAAA,CAAK,QAAA,GAAW,IAAA;AAChB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,SAAA,GAAY,IAAA;AACjB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAW,KAAA,EAAqB;AAC9B,IAAA,IAAA,CAAK,WAAA,GAAc,KAAA;AACnB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEU,KAAA,GAAyB;AACjC,IAAA,MAAM,MAAA,GAAS,IAAI,gBAAA,EAAgB;AACnC,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,gBAAgB,IAAA,CAAK,aAAA;AAC5B,IAAA,MAAA,CAAO,OAAO,IAAA,CAAK,IAAA;AACnB,IAAA,MAAA,CAAO,OAAO,IAAA,CAAK,IAAA;AACnB,IAAA,MAAA,CAAO,WAAW,IAAA,CAAK,QAAA;AACvB,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,cAAc,IAAA,CAAK,WAAA;AAC1B,IAAA,MAAA,CAAO,kBAAA,GAAqB,CAAC,GAAG,IAAA,CAAK,kBAAkB,CAAA;AACvD,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAKO,IAAM,gBAAA,GAAN,MAAM,iBAAA,SAAyB,aAAA,CAAuB;AAAA,EAC3D,KAAA,CAAM,IAAA,EAAe,IAAA,GAA4B,EAAC,EAAY;AAC5D,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,IAAI,CAAA;AACzD,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM,OAAO,OAAA;AAEtD,IAAA,IAAI,OAAO,SAAS,SAAA,EAAW;AAC7B,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,kBAAA;AAAA,UACT,IAAA,EAAM,cAAA;AAAA,UACN,QAAA,EAAU,SAAA;AAAA,UACV,UAAU,OAAO;AAAA;AACnB,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,oBAAA,CAAqB,MAAM,IAAI,CAAA;AAEpC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEU,KAAA,GAA0B;AAClC,IAAA,MAAM,MAAA,GAAS,IAAI,iBAAA,EAAiB;AACpC,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,gBAAgB,IAAA,CAAK,aAAA;AAC5B,IAAA,MAAA,CAAO,kBAAA,GAAqB,CAAC,GAAG,IAAA,CAAK,kBAAkB,CAAA;AACvD,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAKO,IAAM,cAAA,GAAN,MAAM,eAAA,SAA0B,aAAA,CAAmB;AAAA,EAChD,UAAA;AAAA,EACA,UAAA;AAAA,EACA,cAAA;AAAA,EAER,YAAY,aAAA,EAAiC;AAC3C,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,cAAA,GAAiB,aAAA;AAAA,EACxB;AAAA,EAEA,KAAA,CAAM,IAAA,EAAe,IAAA,GAA4B,EAAC,EAAQ;AACxD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,IAAI,CAAA;AACzD,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM,OAAO,OAAA;AAEtD,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACxB,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,gBAAA;AAAA,UACT,IAAA,EAAM,cAAA;AAAA,UACN,QAAA,EAAU,OAAA;AAAA,UACV,UAAU,OAAO;AAAA;AACnB,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAK,UAAA,KAAe,MAAA,IAAa,IAAA,CAAK,MAAA,GAAS,KAAK,UAAA,EAAY;AAClE,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,CAAA,yBAAA,EAA4B,IAAA,CAAK,UAAU,CAAA,MAAA,CAAA;AAAA,UACpD,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAK,UAAA,KAAe,MAAA,IAAa,IAAA,CAAK,MAAA,GAAS,KAAK,UAAA,EAAY;AAClE,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,CAAA,wBAAA,EAA2B,IAAA,CAAK,UAAU,CAAA,MAAA,CAAA;AAAA,UACnD,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,SAA4B,EAAC;AACnC,IAAA,MAAM,SAAc,EAAC;AAErB,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,IAAA,CAAK,QAAQ,CAAA,EAAA,EAAK;AACpC,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,cAAA,CAAe,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,EAAG,CAAC,GAAG,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA;AAAA,MAC9D,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,KAAA,CAAM,MAAM,CAAA;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,gBAAgB,MAAM,CAAA;AAAA,IAClC;AAEA,IAAA,IAAA,CAAK,oBAAA,CAAqB,QAAQ,IAAI,CAAA;AAEtC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,IAAI,MAAA,EAAsB;AACxB,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAI,MAAA,EAAsB;AACxB,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAO,MAAA,EAAsB;AAC3B,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,IAAA,IAAA,CAAK,UAAA,GAAa,MAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,QAAA,GAAiB;AACf,IAAA,IAAA,CAAK,UAAA,GAAa,CAAA;AAClB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEU,KAAA,GAA2B;AACnC,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAe,IAAA,CAAK,cAAc,CAAA;AACrD,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,gBAAgB,IAAA,CAAK,aAAA;AAC5B,IAAA,MAAA,CAAO,aAAa,IAAA,CAAK,UAAA;AACzB,IAAA,MAAA,CAAO,aAAa,IAAA,CAAK,UAAA;AACzB,IAAA,MAAA,CAAO,kBAAA,GAAqB,CAAC,GAAG,IAAA,CAAK,kBAAkB,CAAA;AACvD,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAKO,IAAM,eAAA,GAAN,MAAM,gBAAA,SAAuD,aAAA,CAAiB;AAAA,EAC3E,MAAA;AAAA,EACA,OAAA,GAAU,KAAA;AAAA,EACV,YAAA,GAAe,KAAA;AAAA,EAEvB,YAAY,KAAA,EAAgD;AAC1D,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AAAA,EAChB;AAAA,EAEA,KAAA,CAAM,IAAA,EAAe,IAAA,GAA4B,EAAC,EAAM;AACtD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,IAAI,CAAA;AACzD,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM,OAAO,OAAA;AAEtD,IAAA,IAAI,OAAO,SAAS,QAAA,IAAY,IAAA,KAAS,QAAQ,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,EAAG;AACpE,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,iBAAA;AAAA,UACT,IAAA,EAAM,cAAA;AAAA,UACN,QAAA,EAAU,QAAA;AAAA,UACV,UAAU,KAAA,CAAM,OAAA,CAAQ,IAAI,CAAA,GAAI,UAAU,OAAO;AAAA;AACnD,OACD,CAAA;AAAA,IACH;AAEA,IAAA,MAAM,SAA4B,EAAC;AACnC,IAAA,MAAM,SAAc,EAAC;AACrB,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA;AAClC,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,MAAM,CAAA;AAGzC,IAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,GAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA,EAAG,KAAA,CAAO,IAAA,CAAa,GAAG,CAAA,EAAG,CAAC,GAAG,IAAA,EAAM,GAAG,CAAC,CAAA;AAAA,MAC1E,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,KAAA,CAAM,MAAM,CAAA;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,SAAA,GAAY,UAAU,MAAA,CAAO,CAAC,MAAM,CAAC,SAAA,CAAU,QAAA,CAAS,CAAC,CAAC,CAAA;AAChE,IAAA,IAAI,IAAA,CAAK,OAAA,IAAW,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AACxC,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA;AAAA,QACA,OAAA,EAAS,CAAA,iBAAA,EAAoB,SAAA,CAAU,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,QACjD,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA,MAAA,IAAW,KAAK,YAAA,EAAc;AAC5B,MAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,QAAA,MAAA,CAAO,GAAG,CAAA,GAAK,IAAA,CAAa,GAAG,CAAA;AAAA,MACjC;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,MAAM,IAAI,gBAAgB,MAAM,CAAA;AAAA,IAClC;AAEA,IAAA,IAAA,CAAK,oBAAA,CAAqB,QAAQ,IAAI,CAAA;AAEtC,IAAA,OAAO,MAAA;AAAA,EACT;AAAA,EAEA,MAAA,GAAe;AACb,IAAA,IAAA,CAAK,OAAA,GAAU,IAAA;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,WAAA,GAAoB;AAClB,IAAA,IAAA,CAAK,YAAA,GAAe,IAAA;AACpB,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,OAAA,GAAuC;AACrC,IAAA,MAAM,WAAgB,EAAC;AACvB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,MAAA,EAAQ;AAC7B,MAAA,QAAA,CAAS,GAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,GAAG,EAAE,QAAA,EAAS;AAAA,IAC5C;AACA,IAAA,OAAO,IAAI,iBAAgB,QAAQ,CAAA;AAAA,EACrC;AAAA,EAEA,QAA2B,IAAA,EAAwC;AACjE,IAAA,MAAM,WAAgB,EAAC;AACvB,IAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,MAAA,QAAA,CAAS,GAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,IACjC;AACA,IAAA,OAAO,IAAI,iBAAgB,QAAQ,CAAA;AAAA,EACrC;AAAA,EAEA,QAA2B,IAAA,EAAwC;AACjE,IAAA,MAAM,WAAgB,EAAC;AACvB,IAAA,KAAA,MAAW,GAAA,IAAO,KAAK,MAAA,EAAQ;AAC7B,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,GAAmB,CAAA,EAAG;AACvC,QAAA,QAAA,CAAS,GAAG,CAAA,GAAI,IAAA,CAAK,MAAA,CAAO,GAAG,CAAA;AAAA,MACjC;AAAA,IACF;AACA,IAAA,OAAO,IAAI,iBAAgB,QAAQ,CAAA;AAAA,EACrC;AAAA,EAEU,KAAA,GAA4B;AACpC,IAAA,MAAM,MAAA,GAAS,IAAI,gBAAA,CAAgB,IAAA,CAAK,MAAM,CAAA;AAC9C,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,gBAAgB,IAAA,CAAK,aAAA;AAC5B,IAAA,MAAA,CAAO,UAAU,IAAA,CAAK,OAAA;AACtB,IAAA,MAAA,CAAO,eAAe,IAAA,CAAK,YAAA;AAC3B,IAAA,MAAA,CAAO,kBAAA,GAAqB,CAAC,GAAG,IAAA,CAAK,kBAAkB,CAAA;AACvD,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAKO,IAAM,aAAA,GAAN,MAAM,cAAA,SAAiD,aAAA,CAAiB;AAAA,EACrE,OAAA;AAAA,EAER,YAAY,MAAA,EAAsB;AAChC,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,OAAA,GAAU,MAAA;AAAA,EACjB;AAAA,EAEA,KAAA,CAAM,IAAA,EAAe,IAAA,GAA4B,EAAC,EAAM;AACtD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,IAAI,CAAA;AACzD,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM,OAAO,OAAA;AAEtD,IAAA,IAAI,CAAC,IAAA,CAAK,OAAA,CAAQ,QAAA,CAAS,IAAS,CAAA,EAAG;AACrC,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,SAAS,CAAA,iBAAA,EAAoB,IAAA,CAAK,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,UACpD,IAAA,EAAM,oBAAA;AAAA,UACN,QAAA,EAAU,OAAO,IAAI;AAAA;AACvB,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,oBAAA,CAAqB,MAAW,IAAI,CAAA;AAEzC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEU,KAAA,GAA0B;AAClC,IAAA,MAAM,MAAA,GAAS,IAAI,cAAA,CAAc,IAAA,CAAK,OAAO,CAAA;AAC7C,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,gBAAgB,IAAA,CAAK,aAAA;AAC5B,IAAA,MAAA,CAAO,kBAAA,GAAqB,CAAC,GAAG,IAAA,CAAK,kBAAkB,CAAA;AACvD,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAKO,IAAM,aAAA,GAAN,MAAM,cAAA,SAAsB,aAAA,CAAoB;AAAA,EAC7C,IAAA;AAAA,EACA,IAAA;AAAA,EAER,KAAA,CAAM,IAAA,EAAe,IAAA,GAA4B,EAAC,EAAS;AACzD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,IAAI,CAAA;AACzD,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM,OAAO,OAAA;AAEtD,IAAA,IAAI,IAAA;AAEJ,IAAA,IAAI,gBAAgB,IAAA,EAAM;AACxB,MAAA,IAAA,GAAO,IAAA;AAAA,IACT,WAAW,OAAO,IAAA,KAAS,QAAA,IAAY,OAAO,SAAS,QAAA,EAAU;AAC/D,MAAA,IAAA,GAAO,IAAI,KAAK,IAAI,CAAA;AAAA,IACtB,CAAA,MAAO;AACL,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,eAAA;AAAA,UACT,IAAA,EAAM,cAAA;AAAA,UACN,QAAA,EAAU,MAAA;AAAA,UACV,UAAU,OAAO;AAAA;AACnB,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,KAAA,CAAM,IAAA,CAAK,OAAA,EAAS,CAAA,EAAG;AACzB,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,cAAA;AAAA,UACT,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,GAAO,IAAA,CAAK,IAAA,EAAM;AACjC,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,CAAA,mBAAA,EAAsB,IAAA,CAAK,IAAA,CAAK,aAAa,CAAA,CAAA;AAAA,UACtD,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,GAAO,IAAA,CAAK,IAAA,EAAM;AACjC,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,CAAA,oBAAA,EAAuB,IAAA,CAAK,IAAA,CAAK,aAAa,CAAA,CAAA;AAAA,UACvD,IAAA,EAAM;AAAA;AACR,OACD,CAAA;AAAA,IACH;AAEA,IAAA,IAAA,CAAK,oBAAA,CAAqB,MAAM,IAAI,CAAA;AAEpC,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAI,IAAA,EAAkB;AACpB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEA,IAAI,IAAA,EAAkB;AACpB,IAAA,IAAA,CAAK,IAAA,GAAO,IAAA;AACZ,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEU,KAAA,GAAuB;AAC/B,IAAA,MAAM,MAAA,GAAS,IAAI,cAAA,EAAc;AACjC,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,gBAAgB,IAAA,CAAK,aAAA;AAC5B,IAAA,MAAA,CAAO,OAAO,IAAA,CAAK,IAAA;AACnB,IAAA,MAAA,CAAO,OAAO,IAAA,CAAK,IAAA;AACnB,IAAA,MAAA,CAAO,kBAAA,GAAqB,CAAC,GAAG,IAAA,CAAK,kBAAkB,CAAA;AACvD,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAKO,IAAM,gBAAA,GAAN,MAAM,iBAAA,SAA8D,aAAA,CAAiB;AAAA,EAClF,MAAA;AAAA,EAER,YAAY,KAAA,EAAU;AACpB,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,MAAA,GAAS,KAAA;AAAA,EAChB;AAAA,EAEA,KAAA,CAAM,IAAA,EAAe,IAAA,GAA4B,EAAC,EAAM;AACtD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,IAAI,CAAA;AACzD,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM,OAAO,OAAA;AAEtD,IAAA,IAAI,IAAA,KAAS,KAAK,MAAA,EAAQ;AACxB,MAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,QACxB;AAAA,UACE,IAAA;AAAA,UACA,OAAA,EAAS,CAAA,wBAAA,EAA2B,IAAA,CAAK,MAAM,CAAA,CAAA;AAAA,UAC/C,IAAA,EAAM,iBAAA;AAAA,UACN,QAAA,EAAU,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AAAA,UAC5B,QAAA,EAAU,OAAO,IAAI;AAAA;AACvB,OACD,CAAA;AAAA,IACH;AAEA,IAAA,OAAO,IAAA;AAAA,EACT;AAAA,EAEU,KAAA,GAA6B;AACrC,IAAA,MAAM,MAAA,GAAS,IAAI,iBAAA,CAAiB,IAAA,CAAK,MAAM,CAAA;AAC/C,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,gBAAgB,IAAA,CAAK,aAAA;AAC5B,IAAA,MAAA,CAAO,kBAAA,GAAqB,CAAC,GAAG,IAAA,CAAK,kBAAkB,CAAA;AACvD,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAKO,IAAM,cAAA,GAAN,MAAM,eAAA,SAA0B,aAAA,CAAiB;AAAA,EAC9C,WAAA;AAAA,EAER,YAAY,UAAA,EAAkC;AAC5C,IAAA,KAAA,EAAM;AACN,IAAA,IAAA,CAAK,WAAA,GAAc,UAAA;AAAA,EACrB;AAAA,EAEA,KAAA,CAAM,IAAA,EAAe,IAAA,GAA4B,EAAC,EAAM;AACtD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,yBAAA,CAA0B,IAAA,EAAM,IAAI,CAAA;AACzD,IAAA,IAAI,OAAA,KAAY,MAAA,IAAa,OAAA,KAAY,IAAA,EAAM,OAAO,OAAA;AAEtD,IAAA,MAAM,SAA4B,EAAC;AAEnC,IAAA,KAAA,MAAW,SAAA,IAAa,KAAK,WAAA,EAAa;AACxC,MAAA,IAAI;AACF,QAAA,OAAO,SAAA,CAAU,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,MACnC,SAAS,KAAA,EAAO;AACd,QAAA,IAAI,iBAAiB,eAAA,EAAiB;AACpC,UAAA,MAAA,CAAO,IAAA,CAAK,GAAG,KAAA,CAAM,MAAM,CAAA;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,IAAI,eAAA,CAAgB;AAAA,MACxB;AAAA,QACE,IAAA;AAAA,QACA,OAAA,EAAS,qCAAA;AAAA,QACT,IAAA,EAAM;AAAA;AACR,KACD,CAAA;AAAA,EACH;AAAA,EAEU,KAAA,GAA2B;AACnC,IAAA,MAAM,MAAA,GAAS,IAAI,eAAA,CAAkB,IAAA,CAAK,WAAW,CAAA;AACrD,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,YAAY,IAAA,CAAK,SAAA;AACxB,IAAA,MAAA,CAAO,gBAAgB,IAAA,CAAK,aAAA;AAC5B,IAAA,MAAA,CAAO,kBAAA,GAAqB,CAAC,GAAG,IAAA,CAAK,kBAAkB,CAAA;AACvD,IAAA,OAAO,MAAA;AAAA,EACT;AACF;AAKO,IAAM,CAAA,GAAI;AAAA,EACf,MAAA,EAAQ,MAAM,IAAI,eAAA,EAAgB;AAAA,EAClC,MAAA,EAAQ,MAAM,IAAI,eAAA,EAAgB;AAAA,EAClC,OAAA,EAAS,MAAM,IAAI,gBAAA,EAAiB;AAAA,EACpC,IAAA,EAAM,MAAM,IAAI,aAAA,EAAc;AAAA,EAC9B,KAAA,EAAO,CAAI,aAAA,KAAoC,IAAI,eAAe,aAAa,CAAA;AAAA,EAC/E,MAAA,EAAQ,CAAgC,KAAA,KACtC,IAAI,gBAAgB,KAAK,CAAA;AAAA,EAC3B,IAAA,EAAM,CAA4B,MAAA,KAAyB,IAAI,cAAc,MAAM,CAAA;AAAA,EACnF,OAAA,EAAS,CAAsC,KAAA,KAAa,IAAI,iBAAiB,KAAK,CAAA;AAAA,EACtF,KAAA,EAAO,CAAA,GAAO,UAAA,KAAqC,IAAI,eAAkB,UAAU,CAAA;AAAA;AAAA,EAGnF,GAAA,EAAK,MAAM,IAAI,eAAA,EAAgB;AAAA,EAC/B,GAAA,EAAK,MAAM,IAAI,eAAA,EAAgB;AAAA,EAC/B,IAAA,EAAM,MAAM,IAAI,gBAAA,EAAiB;AAAA,EACjC,GAAA,EAAK,CAAI,aAAA,KAAoC,IAAI,eAAe,aAAa,CAAA;AAAA,EAC7E,GAAA,EAAK,CAAgC,KAAA,KACnC,IAAI,gBAAgB,KAAK;AAC7B;;;ACx9BO,IAAM,eAAN,MAAmB;AAAA,EACxB,OAAO,QAAA,CAAS,IAAA,EAAW,MAAA,EAAkC;AAC3D,IAAA,MAAM,SAA+B,EAAC;AAEtC,IAAA,IAAI,IAAA,IAAQ,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AAC5C,MAAA,OAAO;AAAA,QACL,KAAA,EAAO,KAAA;AAAA,QACP,QAAQ,CAAC,EAAE,OAAO,OAAA,EAAS,OAAA,EAAS,kCAAkC;AAAA,OACxE;AAAA,IACF;AAEA,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AAClD,MAAA,MAAM,KAAA,GAAQ,KAAK,KAAK,CAAA;AAExB,MAAA,IAAI,KAAK,QAAA,KAAa,KAAA,KAAU,UAAa,KAAA,KAAU,IAAA,IAAQ,UAAU,EAAA,CAAA,EAAK;AAC5E,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,KAAA;AAAA,UACA,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,CAAA,EAAG,KAAK,CAAA,YAAA,CAAA;AAAA,UACjC;AAAA,SACD,CAAA;AACD,QAAA;AAAA,MACF;AAEA,MAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AAE3C,MAAA,IAAI,KAAK,IAAA,EAAM;AACb,QAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,GAAI,UAAU,OAAO,KAAA;AAC3D,QAAA,IAAI,UAAA,KAAe,KAAK,IAAA,EAAM;AAC5B,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA;AAAA,YACA,SAAS,IAAA,CAAK,OAAA,IAAW,GAAG,KAAK,CAAA,iBAAA,EAAoB,KAAK,IAAI,CAAA,CAAA;AAAA,YAC9D;AAAA,WACD,CAAA;AACD,UAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU;AACvD,QAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,EAAK;AACrD,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA;AAAA,YACA,SAAS,IAAA,CAAK,OAAA,IAAW,GAAG,KAAK,CAAA,kBAAA,EAAqB,KAAK,GAAG,CAAA,WAAA,CAAA;AAAA,YAC9D;AAAA,WACD,CAAA;AAAA,QACH;AACA,QAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,EAAK;AACrD,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA;AAAA,YACA,SAAS,IAAA,CAAK,OAAA,IAAW,GAAG,KAAK,CAAA,iBAAA,EAAoB,KAAK,GAAG,CAAA,WAAA,CAAA;AAAA,YAC7D;AAAA,WACD,CAAA;AAAA,QACH;AACA,QAAA,IAAI,KAAK,OAAA,IAAW,CAAC,KAAK,OAAA,CAAQ,IAAA,CAAK,KAAK,CAAA,EAAG;AAC7C,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA;AAAA,YACA,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,CAAA,EAAG,KAAK,CAAA,mBAAA,CAAA;AAAA,YACjC;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU;AACvD,QAAA,IAAI,IAAA,CAAK,GAAA,KAAQ,MAAA,IAAa,KAAA,GAAQ,KAAK,GAAA,EAAK;AAC9C,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA;AAAA,YACA,SAAS,IAAA,CAAK,OAAA,IAAW,GAAG,KAAK,CAAA,kBAAA,EAAqB,KAAK,GAAG,CAAA,CAAA;AAAA,YAC9D;AAAA,WACD,CAAA;AAAA,QACH;AACA,QAAA,IAAI,IAAA,CAAK,GAAA,KAAQ,MAAA,IAAa,KAAA,GAAQ,KAAK,GAAA,EAAK;AAC9C,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA;AAAA,YACA,SAAS,IAAA,CAAK,OAAA,IAAW,GAAG,KAAK,CAAA,iBAAA,EAAoB,KAAK,GAAG,CAAA,CAAA;AAAA,YAC7D;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,IAAI,KAAK,IAAA,KAAS,OAAA,IAAW,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACjD,QAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,EAAK;AACrD,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA;AAAA,YACA,SAAS,IAAA,CAAK,OAAA,IAAW,GAAG,KAAK,CAAA,oBAAA,EAAuB,KAAK,GAAG,CAAA,MAAA,CAAA;AAAA,YAChE;AAAA,WACD,CAAA;AAAA,QACH;AACA,QAAA,IAAI,KAAK,GAAA,KAAQ,MAAA,IAAa,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,EAAK;AACrD,UAAA,MAAA,CAAO,IAAA,CAAK;AAAA,YACV,KAAA;AAAA,YACA,SAAS,IAAA,CAAK,OAAA,IAAW,GAAG,KAAK,CAAA,mBAAA,EAAsB,KAAK,GAAG,CAAA,MAAA,CAAA;AAAA,YAC/D;AAAA,WACD,CAAA;AAAA,QACH;AAAA,MACF;AAEA,MAAA,IAAI,KAAK,IAAA,IAAQ,CAAC,KAAK,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3C,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,KAAA;AAAA,UACA,OAAA,EAAS,IAAA,CAAK,OAAA,IAAW,CAAA,EAAG,KAAK,oBAAoB,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAAA,UACzE;AAAA,SACD,CAAA;AAAA,MACH;AAEA,MAAA,IAAI,KAAK,MAAA,EAAQ;AACf,QAAA,MAAM,WAAA,GAAc,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AACrC,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,MAAA,CAAO,KAAK,EAAE,KAAA,EAAO,OAAA,EAAS,WAAA,EAAa,OAAO,CAAA;AAAA,QACpD;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO;AAAA,MACL,KAAA,EAAO,OAAO,MAAA,KAAW,CAAA;AAAA,MACzB,MAAA;AAAA,MACA,IAAA,EAAM,MAAA,CAAO,MAAA,KAAW,CAAA,GAAI,IAAA,GAAO;AAAA,KACrC;AAAA,EACF;AACF;;;ACpIO,IAAM,kBAAN,MAAsB;AAAA,EAC3B,OAAO,QAAA,CAAS,IAAA,EAAW,MAAA,EAAgD;AAEzE,IAAA,IAAI,OAAO,MAAA,CAAO,SAAA,KAAc,UAAA,EAAY;AAC1C,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA;AACpC,MAAA,IAAI,OAAO,OAAA,EAAS;AAClB,QAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,OAAO,IAAA,EAAK;AAAA,MAC1C;AACA,MAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAA,EAAM;AAAA,IAC9C;AAGA,IAAA,IAAI,OAAO,MAAA,CAAO,KAAA,KAAU,UAAA,EAAY;AACtC,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAA,CAAO,KAAA,CAAM,IAAI,CAAA;AAChC,QAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,MAAA,EAAO;AAAA,MACrC,SAAS,GAAA,EAAK;AACZ,QAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,GAAA,EAAI;AAAA,MACrC;AAAA,IACF;AAGA,IAAA,IAAI,OAAO,MAAA,CAAO,QAAA,KAAa,UAAA,EAAY;AACzC,MAAA,MAAM,MAAA,GAAS,MAAA,CAAO,QAAA,CAAS,IAAI,CAAA;AACnC,MAAA,IAAI,OAAO,KAAA,EAAO;AAChB,QAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,MAAA,EAAQ,OAAO,KAAA,EAAM;AAAA,MAC9C;AACA,MAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAM,OAAO,KAAA,EAAM;AAAA,IAC3C;AAEA,IAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,IAAA,EAAK;AAAA,EAC7B;AACF;ACxCA,IAAM,YAAA,GAAe;AAAA,EACnB,iBAAA;AAAA,EACA,iBAAA;AAAA,EACA,kBAAA;AAAA,EACA,mBAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,YAAA,GAAN,MAAM,aAAA,CAAa;AAAA,EACxB,OAAe,QAAA,GAAgC,IAAA;AAAA,EACvC,SAAsB,EAAC;AAAA,EAEvB,WAAA,GAAc;AAAA,EAAC;AAAA,EAEvB,OAAO,WAAA,GAA4B;AACjC,IAAA,IAAI,CAAC,cAAa,QAAA,EAAU;AAC1B,MAAA,aAAA,CAAa,QAAA,GAAW,IAAI,aAAA,EAAa;AAAA,IAC3C;AACA,IAAA,OAAO,aAAA,CAAa,QAAA;AAAA,EACtB;AAAA,EAEA,aAAa,KAAK,GAAA,EAAoC;AACpD,IAAA,MAAM,QAAA,GAAW,cAAa,WAAA,EAAY;AAC1C,IAAA,MAAM,OAAA,GAAU,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEnC,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,MAAM,QAAA,GAAWA,YAAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AACtC,MAAA,IAAI,CAACe,aAAAA,CAAW,QAAQ,CAAA,EAAG;AAE3B,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAC1B,QAAA,QAAA,CAAS,SAAS,IAAA,CAAK,KAAA,CAAMX,eAAAA,CAAa,QAAA,EAAU,OAAO,CAAC,CAAA;AAC5D,QAAA,OAAO,QAAA,CAAS,MAAA;AAAA,MAClB;AAEA,MAAA,IAAI,KAAK,QAAA,CAAS,OAAO,KAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACnD,QAAA,QAAA,CAAS,MAAA,GAAS,eAAA,CAAgBA,eAAAA,CAAa,QAAA,EAAU,OAAO,CAAC,CAAA;AACjE,QAAA,OAAO,QAAA,CAAS,MAAA;AAAA,MAClB;AAEA,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,KAAK,CAAA,IAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACzE,QAAA,IAAI;AACF,UAAA,MAAM,GAAA,GAAM,MAAM,OAAO,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAA,CAAA;AAC3C,UAAA,QAAA,CAAS,MAAA,GAAS,IAAI,OAAA,IAAW,GAAA;AACjC,UAAA,OAAO,QAAA,CAAS,MAAA;AAAA,QAClB,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EAClB;AAAA,EAEA,OAAO,SAAS,GAAA,EAA2B;AACzC,IAAA,MAAM,QAAA,GAAW,cAAa,WAAA,EAAY;AAC1C,IAAA,MAAM,OAAA,GAAU,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AAEnC,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,MAAM,QAAA,GAAWJ,YAAAA,CAAQ,OAAA,EAAS,IAAI,CAAA;AACtC,MAAA,IAAI,CAACe,aAAAA,CAAW,QAAQ,CAAA,EAAG;AAE3B,MAAA,IAAI,IAAA,CAAK,QAAA,CAAS,OAAO,CAAA,EAAG;AAC1B,QAAA,QAAA,CAAS,SAAS,IAAA,CAAK,KAAA,CAAMX,eAAAA,CAAa,QAAA,EAAU,OAAO,CAAC,CAAA;AAC5D,QAAA,OAAO,QAAA,CAAS,MAAA;AAAA,MAClB;AAEA,MAAA,IAAI,KAAK,QAAA,CAAS,OAAO,KAAK,IAAA,CAAK,QAAA,CAAS,MAAM,CAAA,EAAG;AACnD,QAAA,QAAA,CAAS,MAAA,GAAS,eAAA,CAAgBA,eAAAA,CAAa,QAAA,EAAU,OAAO,CAAC,CAAA;AACjE,QAAA,OAAO,QAAA,CAAS,MAAA;AAAA,MAClB;AAAA,IACF;AAEA,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EAClB;AAAA,EAEA,OAAO,GAAA,GAAmB;AACxB,IAAA,OAAO,aAAA,CAAa,aAAY,CAAE,MAAA;AAAA,EACpC;AAAA,EAEA,OAAO,IAAI,MAAA,EAA2B;AACpC,IAAA,aAAA,CAAa,WAAA,GAAc,MAAA,GAAS,MAAA;AAAA,EACtC;AAAA,EAEA,OAAO,MAAM,OAAA,EAA4C;AACvD,IAAA,MAAM,QAAA,GAAW,cAAa,WAAA,EAAY;AAC1C,IAAA,QAAA,CAAS,MAAA,GAAS,SAAA,CAAU,QAAA,CAAS,MAAA,EAAQ,OAAO,CAAA;AACpD,IAAA,OAAO,QAAA,CAAS,MAAA;AAAA,EAClB;AACF;AAEA,SAAS,SAAA,CAAU,QAAa,MAAA,EAAkB;AAChD,EAAA,MAAM,MAAA,GAAS,EAAE,GAAG,MAAA,EAAO;AAC3B,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,EAAG;AACrC,IAAA,IACE,MAAA,CAAO,GAAG,CAAA,IACV,OAAO,OAAO,GAAG,CAAA,KAAM,QAAA,IACvB,CAAC,KAAA,CAAM,OAAA,CAAQ,OAAO,GAAG,CAAC,KAC1B,MAAA,CAAO,GAAG,KACV,OAAO,MAAA,CAAO,GAAG,CAAA,KAAM,QAAA,EACvB;AACA,MAAA,MAAA,CAAO,GAAG,IAAI,SAAA,CAAU,MAAA,CAAO,GAAG,CAAA,EAAG,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA,IAClD,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA,CAAO,GAAG,CAAA;AAAA,IAC1B;AAAA,EACF;AACA,EAAA,OAAO,MAAA;AACT;AAMA,SAAS,gBAAgB,OAAA,EAAsC;AAC7D,EAAA,MAAM,SAA8B,EAAC;AACrC,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,EAAA,MAAM,QAAwD,CAAC,EAAE,QAAQ,EAAA,EAAI,GAAA,EAAK,QAAQ,CAAA;AAE1F,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAU,KAAK,IAAA,EAAK;AAC1B,IAAA,IAAI,CAAC,OAAA,IAAW,OAAA,CAAQ,UAAA,CAAW,GAAG,CAAA,EAAG;AAEzC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,IAAI,CAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,OAAA,CAAQ,GAAG,CAAA;AAEpC,IAAA,IAAI,aAAa,EAAA,EAAI;AAErB,IAAA,MAAM,MAAM,OAAA,CAAQ,KAAA,CAAM,CAAA,EAAG,QAAQ,EAAE,IAAA,EAAK;AAC5C,IAAA,MAAM,WAAW,OAAA,CAAQ,KAAA,CAAM,QAAA,GAAW,CAAC,EAAE,IAAA,EAAK;AAElD,IAAA,OAAO,KAAA,CAAM,SAAS,CAAA,IAAK,KAAA,CAAM,MAAM,MAAA,GAAS,CAAC,CAAA,CAAE,MAAA,IAAU,MAAA,EAAQ;AACnE,MAAA,KAAA,CAAM,GAAA,EAAI;AAAA,IACZ;AAEA,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,CAAE,GAAA;AAEvC,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,MAAM,SAA8B,EAAC;AACrC,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,MAAA;AACd,MAAA,KAAA,CAAM,IAAA,CAAK,EAAE,MAAA,EAAQ,GAAA,EAAK,QAAQ,CAAA;AAAA,IACpC,CAAA,MAAO;AACL,MAAA,MAAA,CAAO,GAAG,CAAA,GAAI,cAAA,CAAe,QAAQ,CAAA;AAAA,IACvC;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAEA,SAAS,eAAe,GAAA,EAAkB;AACxC,EAAA,IAAI,GAAA,KAAQ,QAAQ,OAAO,IAAA;AAC3B,EAAA,IAAI,GAAA,KAAQ,SAAS,OAAO,KAAA;AAC5B,EAAA,IAAI,GAAA,KAAQ,QAAQ,OAAO,IAAA;AAC3B,EAAA,IAAI,UAAU,IAAA,CAAK,GAAG,GAAG,OAAO,QAAA,CAAS,KAAK,EAAE,CAAA;AAChD,EAAA,IAAI,eAAe,IAAA,CAAK,GAAG,CAAA,EAAG,OAAO,WAAW,GAAG,CAAA;AACnD,EAAA,IAAK,GAAA,CAAI,UAAA,CAAW,GAAG,CAAA,IAAK,IAAI,QAAA,CAAS,GAAG,CAAA,IAAO,GAAA,CAAI,WAAW,GAAG,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAI;AAC5F,IAAA,OAAO,GAAA,CAAI,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA;AAAA,EACxB;AACA,EAAA,IAAI,IAAI,UAAA,CAAW,GAAG,KAAK,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AAC5C,IAAA,OAAO,GAAA,CACJ,KAAA,CAAM,CAAA,EAAG,EAAE,EACX,KAAA,CAAM,GAAG,CAAA,CACT,GAAA,CAAI,CAACsB,EAAAA,KAAM,cAAA,CAAeA,EAAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,OAAO,GAAA;AACT;;;ACtKO,SAAS,iBAAA,GAAmC;AACjD,EAAA,OAAO,CAAC,KAAK,IAAA,KAAS;AACpB,IAAA,MAAM,EAAE,GAAA,EAAK,GAAA,EAAI,GAAI,GAAA;AACrB,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,MAAA,CAAO,MAAA,EAAO;AAEpC,IAAA,MAAM,cAAc,GAAA,CAAI,GAAA;AACxB,IAAC,GAAA,CAAY,GAAA,GAAM,SAAA,GAAa,IAAA,EAAa;AAC3C,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,CAAO,MAAA,EAAO,GAAI,KAAA;AAC3C,MAAA,MAAM,EAAA,GAAK,MAAA,CAAO,QAAQ,CAAA,GAAI,GAAA;AAE9B,MAAA,GAAA,CAAI,UAAU,iBAAA,EAAmB,CAAA,EAAG,GAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,EAAA,CAAI,CAAA;AAErD,MAAA,OAAQ,WAAA,CAAoB,KAAA,CAAM,IAAA,EAAM,IAAI,CAAA;AAAA,IAC9C,CAAA;AAEA,IAAA,IAAA,EAAK;AAAA,EACP,CAAA;AACF","file":"index.js","sourcesContent":["import type { HttpMethod, RouteHandler, MiddlewareHandler, RouteMatch } from \"../types/common.type.js\";\r\nimport type { RouteMeta } from \"../types/routes.type.js\";\r\n\r\n/** Rota registada com metadados opcionais (OpenAPI / documentação). */\r\nexport interface RouteDocument {\r\n method: HttpMethod;\r\n path: string;\r\n meta?: RouteMeta;\r\n}\r\n\r\nconst PARAM_PREFIX = 58; // ':'\r\n\r\ninterface RadixNode {\r\n segment: string;\r\n children: Map<string, RadixNode>;\r\n paramChild: RadixNode | null;\r\n paramName: string;\r\n handlers: Map<HttpMethod, StoredRoute>;\r\n wildcardHandler: Map<HttpMethod, StoredRoute> | null;\r\n}\r\n\r\ninterface StoredRoute {\r\n handler: RouteHandler;\r\n middlewares: MiddlewareHandler[];\r\n meta?: Record<string, any>;\r\n}\r\n\r\nfunction createNode(segment: string = \"\"): RadixNode {\r\n return {\r\n segment,\r\n children: new Map(),\r\n paramChild: null,\r\n paramName: \"\",\r\n handlers: new Map(),\r\n wildcardHandler: null,\r\n };\r\n}\r\n\r\n/**\r\n * LRU Cache with O(1) get/set via doubly linked list + hash map.\r\n * Used for route lookup caching in hot paths.\r\n */\r\nclass LRUCache<K, V> {\r\n private capacity: number;\r\n private map: Map<K, { value: V; key: K; prev: any; next: any }>;\r\n private head: any;\r\n private tail: any;\r\n\r\n constructor(capacity: number) {\r\n this.capacity = capacity;\r\n this.map = new Map();\r\n this.head = { prev: null, next: null };\r\n this.tail = { prev: null, next: null };\r\n this.head.next = this.tail;\r\n this.tail.prev = this.head;\r\n }\r\n\r\n get(key: K): V | undefined {\r\n const node = this.map.get(key);\r\n if (!node) return undefined;\r\n this.moveToHead(node);\r\n return node.value;\r\n }\r\n\r\n set(key: K, value: V): void {\r\n const existing = this.map.get(key);\r\n if (existing) {\r\n existing.value = value;\r\n this.moveToHead(existing);\r\n return;\r\n }\r\n\r\n const node = { value, key, prev: null as any, next: null as any };\r\n this.map.set(key, node);\r\n this.addToHead(node);\r\n\r\n if (this.map.size > this.capacity) {\r\n const removed = this.removeTail();\r\n if (removed) this.map.delete(removed.key);\r\n }\r\n }\r\n\r\n private addToHead(node: any): void {\r\n node.prev = this.head;\r\n node.next = this.head.next;\r\n this.head.next.prev = node;\r\n this.head.next = node;\r\n }\r\n\r\n private removeNode(node: any): void {\r\n node.prev.next = node.next;\r\n node.next.prev = node.prev;\r\n }\r\n\r\n private moveToHead(node: any): void {\r\n this.removeNode(node);\r\n this.addToHead(node);\r\n }\r\n\r\n private removeTail(): any {\r\n const node = this.tail.prev;\r\n if (node === this.head) return null;\r\n this.removeNode(node);\r\n return node;\r\n }\r\n\r\n clear(): void {\r\n this.map.clear();\r\n this.head.next = this.tail;\r\n this.tail.prev = this.head;\r\n }\r\n}\r\n\r\nexport class Router {\r\n private root: RadixNode = createNode();\r\n private cache: LRUCache<string, RouteMatch | null>;\r\n private staticRoutes: Map<string, StoredRoute> = new Map();\r\n\r\n constructor(cacheSize: number = 1024) {\r\n this.cache = new LRUCache(cacheSize);\r\n }\r\n\r\n add(\r\n method: HttpMethod,\r\n path: string,\r\n handler: RouteHandler,\r\n middlewares: MiddlewareHandler[] = [],\r\n meta?: Record<string, any>,\r\n ): void {\r\n this.cache.clear();\r\n const normalizedPath = this.normalizePath(path);\r\n const stored: StoredRoute = { handler, middlewares, meta };\r\n\r\n if (!normalizedPath.includes(\":\") && !normalizedPath.includes(\"*\")) {\r\n const key = `${method}:${normalizedPath}`;\r\n this.staticRoutes.set(key, stored);\r\n return;\r\n }\r\n\r\n const segments = normalizedPath.split(\"/\").filter(Boolean);\r\n let node = this.root;\r\n\r\n for (let i = 0; i < segments.length; i++) {\r\n const seg = segments[i];\r\n\r\n if (seg === \"*\") {\r\n if (!node.wildcardHandler) {\r\n node.wildcardHandler = new Map();\r\n }\r\n node.wildcardHandler.set(method, stored);\r\n return;\r\n }\r\n\r\n if (seg.charCodeAt(0) === PARAM_PREFIX) {\r\n if (!node.paramChild) {\r\n node.paramChild = createNode(seg);\r\n node.paramChild.paramName = seg.slice(1);\r\n }\r\n node = node.paramChild;\r\n continue;\r\n }\r\n\r\n let child = node.children.get(seg);\r\n if (!child) {\r\n child = createNode(seg);\r\n node.children.set(seg, child);\r\n }\r\n node = child;\r\n }\r\n\r\n node.handlers.set(method, stored);\r\n }\r\n\r\n find(method: HttpMethod, path: string): RouteMatch | null {\r\n const normalizedPath = this.normalizePath(path);\r\n\r\n const staticKey = `${method}:${normalizedPath}`;\r\n const staticRoute = this.staticRoutes.get(staticKey);\r\n if (staticRoute) {\r\n return {\r\n handler: staticRoute.handler,\r\n params: {},\r\n middlewares: staticRoute.middlewares,\r\n meta: staticRoute.meta,\r\n };\r\n }\r\n\r\n const cacheKey = staticKey;\r\n const cached = this.cache.get(cacheKey);\r\n if (cached !== undefined) {\r\n return cached ? { ...cached, params: { ...cached.params } } : null;\r\n }\r\n\r\n const segments = normalizedPath.split(\"/\").filter(Boolean);\r\n const params: Record<string, string> = {};\r\n const result = this.matchNode(this.root, segments, 0, params, method);\r\n\r\n if (result) {\r\n const match: RouteMatch = {\r\n handler: result.handler,\r\n params,\r\n middlewares: result.middlewares,\r\n meta: result.meta,\r\n };\r\n this.cache.set(cacheKey, match);\r\n return { ...match, params: { ...params } };\r\n }\r\n\r\n this.cache.set(cacheKey, null);\r\n return null;\r\n }\r\n\r\n private matchNode(\r\n node: RadixNode,\r\n segments: string[],\r\n idx: number,\r\n params: Record<string, string>,\r\n method: HttpMethod,\r\n ): StoredRoute | null {\r\n if (idx === segments.length) {\r\n return node.handlers.get(method) ?? null;\r\n }\r\n\r\n const seg = segments[idx];\r\n\r\n const child = node.children.get(seg);\r\n if (child) {\r\n const result = this.matchNode(child, segments, idx + 1, params, method);\r\n if (result) return result;\r\n }\r\n\r\n if (node.paramChild) {\r\n params[node.paramChild.paramName] = seg;\r\n const result = this.matchNode(node.paramChild, segments, idx + 1, params, method);\r\n if (result) return result;\r\n delete params[node.paramChild.paramName];\r\n }\r\n\r\n if (node.wildcardHandler) {\r\n const route = node.wildcardHandler.get(method);\r\n if (route) return route;\r\n }\r\n\r\n return null;\r\n }\r\n\r\n private normalizePath(path: string): string {\r\n if (path === \"/\") return \"/\";\r\n if (path.endsWith(\"/\") && path.length > 1) return path.slice(0, -1);\r\n return path;\r\n }\r\n\r\n getAllRoutes(): Array<{ method: HttpMethod; path: string }> {\r\n return this.getRouteDocuments().map(({ method, path }) => ({ method, path }));\r\n }\r\n\r\n /**\r\n * Todas as rotas com metadados (ex.: OpenAPI) associados ao handler.\r\n */\r\n getRouteDocuments(): RouteDocument[] {\r\n const routes: RouteDocument[] = [];\r\n\r\n for (const [key, stored] of this.staticRoutes) {\r\n const [method, path] = key.split(\":\", 2) as [HttpMethod, string];\r\n routes.push({ method, path, meta: stored.meta });\r\n }\r\n\r\n this.collectRoutesWithMeta(this.root, \"\", routes);\r\n return routes;\r\n }\r\n\r\n private collectRoutesWithMeta(node: RadixNode, prefix: string, routes: RouteDocument[]): void {\r\n for (const [method, stored] of node.handlers) {\r\n routes.push({ method, path: prefix || \"/\", meta: stored.meta });\r\n }\r\n\r\n for (const [seg, child] of node.children) {\r\n this.collectRoutesWithMeta(child, `${prefix}/${seg}`, routes);\r\n }\r\n\r\n if (node.paramChild) {\r\n this.collectRoutesWithMeta(\r\n node.paramChild,\r\n `${prefix}/:${node.paramChild.paramName}`,\r\n routes,\r\n );\r\n }\r\n\r\n if (node.wildcardHandler) {\r\n for (const [method, stored] of node.wildcardHandler) {\r\n routes.push({ method, path: `${prefix}/*`, meta: stored.meta });\r\n }\r\n }\r\n }\r\n}\r\n","type LogLevel = \"debug\" | \"info\" | \"warn\" | \"error\" | \"silent\";\r\n\r\nconst LEVEL_PRIORITY: Record<LogLevel, number> = {\r\n debug: 0,\r\n info: 1,\r\n warn: 2,\r\n error: 3,\r\n silent: 4,\r\n};\r\n\r\nconst COLORS = {\r\n reset: \"\\x1b[0m\",\r\n bold: \"\\x1b[1m\",\r\n dim: \"\\x1b[2m\",\r\n red: \"\\x1b[31m\",\r\n green: \"\\x1b[32m\",\r\n yellow: \"\\x1b[33m\",\r\n blue: \"\\x1b[34m\",\r\n magenta: \"\\x1b[35m\",\r\n cyan: \"\\x1b[36m\",\r\n white: \"\\x1b[37m\",\r\n gray: \"\\x1b[90m\",\r\n bgRed: \"\\x1b[41m\",\r\n bgGreen: \"\\x1b[42m\",\r\n bgYellow: \"\\x1b[43m\",\r\n bgBlue: \"\\x1b[44m\",\r\n} as const;\r\n\r\nconst METHOD_COLORS: Record<string, string> = {\r\n GET: COLORS.green,\r\n POST: COLORS.blue,\r\n PUT: COLORS.yellow,\r\n DELETE: COLORS.red,\r\n PATCH: COLORS.magenta,\r\n HEAD: COLORS.cyan,\r\n OPTIONS: COLORS.gray,\r\n};\r\n\r\nfunction statusColor(code: number): string {\r\n if (code < 200) return COLORS.gray;\r\n if (code < 300) return COLORS.green;\r\n if (code < 400) return COLORS.cyan;\r\n if (code < 500) return COLORS.yellow;\r\n return COLORS.red;\r\n}\r\n\r\nfunction formatDuration(ns: bigint): string {\r\n const us = Number(ns) / 1_000;\r\n if (us < 1_000) return `${us.toFixed(0)}µs`;\r\n const ms = us / 1_000;\r\n if (ms < 1_000) return `${ms.toFixed(1)}ms`;\r\n return `${(ms / 1_000).toFixed(2)}s`;\r\n}\r\n\r\nexport class Logger {\r\n private level: LogLevel;\r\n private useColors: boolean;\r\n private showTimestamp: boolean;\r\n private prefix: string;\r\n\r\n constructor(options: {\r\n level?: LogLevel;\r\n colors?: boolean;\r\n timestamp?: boolean;\r\n prefix?: string;\r\n } = {}) {\r\n this.level = options.level ?? \"info\";\r\n this.useColors = options.colors ?? process.stdout.isTTY !== false;\r\n this.showTimestamp = options.timestamp ?? true;\r\n this.prefix = options.prefix ?? \"azura\";\r\n }\r\n\r\n private shouldLog(level: LogLevel): boolean {\r\n return LEVEL_PRIORITY[level] >= LEVEL_PRIORITY[this.level];\r\n }\r\n\r\n private timestamp(): string {\r\n if (!this.showTimestamp) return \"\";\r\n const now = new Date();\r\n return `${COLORS.gray}${now.toISOString().slice(11, 23)}${COLORS.reset} `;\r\n }\r\n\r\n private tag(level: LogLevel): string {\r\n if (!this.useColors) return `[${level.toUpperCase()}]`;\r\n const colorMap: Record<string, string> = {\r\n debug: COLORS.gray,\r\n info: COLORS.blue,\r\n warn: COLORS.yellow,\r\n error: COLORS.red,\r\n };\r\n return `${colorMap[level] ?? \"\"}[${level.toUpperCase()}]${COLORS.reset}`;\r\n }\r\n\r\n debug(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"debug\")) return;\r\n console.debug(`${this.timestamp()}${this.tag(\"debug\")} ${message}`, ...args);\r\n }\r\n\r\n info(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"info\")) return;\r\n console.info(`${this.timestamp()}${this.tag(\"info\")} ${message}`, ...args);\r\n }\r\n\r\n warn(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"warn\")) return;\r\n console.warn(`${this.timestamp()}${this.tag(\"warn\")} ${message}`, ...args);\r\n }\r\n\r\n error(message: string, ...args: any[]): void {\r\n if (!this.shouldLog(\"error\")) return;\r\n console.error(`${this.timestamp()}${this.tag(\"error\")} ${message}`, ...args);\r\n }\r\n\r\n request(method: string, path: string, statusCode: number, duration: bigint): void {\r\n if (!this.shouldLog(\"info\")) return;\r\n const mc = this.useColors ? METHOD_COLORS[method] ?? COLORS.white : \"\";\r\n const sc = this.useColors ? statusColor(statusCode) : \"\";\r\n const r = this.useColors ? COLORS.reset : \"\";\r\n const dur = formatDuration(duration);\r\n console.info(\r\n `${this.timestamp()}${mc}${method.padEnd(7)}${r} ${path} ${sc}${statusCode}${r} ${COLORS.dim}${dur}${r}`,\r\n );\r\n }\r\n\r\n banner(port: number, host: string): void {\r\n if (!this.shouldLog(\"info\")) return;\r\n const c = this.useColors;\r\n const lines = [\r\n \"\",\r\n `${c ? COLORS.bold + COLORS.cyan : \"\"} ⚡ AzuraJS v3.0.0${c ? COLORS.reset : \"\"}`,\r\n \"\",\r\n `${c ? COLORS.green : \"\"} ➜ Local: ${c ? COLORS.bold : \"\"}http://${host}:${port}/${c ? COLORS.reset : \"\"}`,\r\n `${c ? COLORS.dim : \"\"} ➜ Press Ctrl+C to stop${c ? COLORS.reset : \"\"}`,\r\n \"\",\r\n ];\r\n console.info(lines.join(\"\\n\"));\r\n }\r\n\r\n setLevel(level: LogLevel): void {\r\n this.level = level;\r\n }\r\n}\r\n","export const HttpStatus = {\r\n OK: 200,\r\n CREATED: 201,\r\n ACCEPTED: 202,\r\n NO_CONTENT: 204,\r\n MOVED_PERMANENTLY: 301,\r\n FOUND: 302,\r\n NOT_MODIFIED: 304,\r\n BAD_REQUEST: 400,\r\n UNAUTHORIZED: 401,\r\n FORBIDDEN: 403,\r\n NOT_FOUND: 404,\r\n METHOD_NOT_ALLOWED: 405,\r\n CONFLICT: 409,\r\n GONE: 410,\r\n UNPROCESSABLE_ENTITY: 422,\r\n TOO_MANY_REQUESTS: 429,\r\n INTERNAL_SERVER_ERROR: 500,\r\n NOT_IMPLEMENTED: 501,\r\n BAD_GATEWAY: 502,\r\n SERVICE_UNAVAILABLE: 503,\r\n GATEWAY_TIMEOUT: 504,\r\n} as const;\r\n\r\nexport type HttpStatusCode = (typeof HttpStatus)[keyof typeof HttpStatus];\r\n\r\nexport const HttpStatusText: Record<number, string> = {\r\n 200: \"OK\",\r\n 201: \"Created\",\r\n 202: \"Accepted\",\r\n 204: \"No Content\",\r\n 301: \"Moved Permanently\",\r\n 302: \"Found\",\r\n 304: \"Not Modified\",\r\n 400: \"Bad Request\",\r\n 401: \"Unauthorized\",\r\n 403: \"Forbidden\",\r\n 404: \"Not Found\",\r\n 405: \"Method Not Allowed\",\r\n 409: \"Conflict\",\r\n 410: \"Gone\",\r\n 422: \"Unprocessable Entity\",\r\n 429: \"Too Many Requests\",\r\n 500: \"Internal Server Error\",\r\n 501: \"Not Implemented\",\r\n 502: \"Bad Gateway\",\r\n 503: \"Service Unavailable\",\r\n 504: \"Gateway Timeout\",\r\n};\r\n","import { HttpStatusText } from \"../types/http/status.js\";\r\n\r\nexport class HttpError extends Error {\r\n public readonly statusCode: number;\r\n public readonly details?: any;\r\n public readonly isOperational: boolean;\r\n\r\n constructor(statusCode: number, message?: string, details?: any) {\r\n super(message ?? HttpStatusText[statusCode] ?? \"Unknown Error\");\r\n this.statusCode = statusCode;\r\n this.details = details;\r\n this.isOperational = true;\r\n Object.setPrototypeOf(this, HttpError.prototype);\r\n }\r\n\r\n toJSON(): Record<string, any> {\r\n const obj: Record<string, any> = {\r\n error: {\r\n statusCode: this.statusCode,\r\n message: this.message,\r\n },\r\n };\r\n if (this.details) obj.error.details = this.details;\r\n return obj;\r\n }\r\n\r\n static badRequest(message?: string, details?: any): HttpError {\r\n return new HttpError(400, message ?? \"Bad Request\", details);\r\n }\r\n\r\n static unauthorized(message?: string): HttpError {\r\n return new HttpError(401, message ?? \"Unauthorized\");\r\n }\r\n\r\n static forbidden(message?: string): HttpError {\r\n return new HttpError(403, message ?? \"Forbidden\");\r\n }\r\n\r\n static notFound(message?: string): HttpError {\r\n return new HttpError(404, message ?? \"Not Found\");\r\n }\r\n\r\n static methodNotAllowed(message?: string): HttpError {\r\n return new HttpError(405, message ?? \"Method Not Allowed\");\r\n }\r\n\r\n static conflict(message?: string, details?: any): HttpError {\r\n return new HttpError(409, message ?? \"Conflict\", details);\r\n }\r\n\r\n static unprocessableEntity(message?: string, details?: any): HttpError {\r\n return new HttpError(422, message ?? \"Unprocessable Entity\", details);\r\n }\r\n\r\n static tooManyRequests(message?: string): HttpError {\r\n return new HttpError(429, message ?? \"Too Many Requests\");\r\n }\r\n\r\n static internal(message?: string): HttpError {\r\n return new HttpError(500, message ?? \"Internal Server Error\");\r\n }\r\n}\r\n","import type { IncomingMessage } from \"node:http\";\r\n\r\nexport function parseQueryString(qs: string): Record<string, string | string[]> {\r\n const result: Record<string, string | string[]> = Object.create(null);\r\n if (!qs || qs.length === 0) return result;\r\n\r\n let key = \"\";\r\n let value = \"\";\r\n let startingKey = true;\r\n let i = qs.charCodeAt(0) === 63 ? 1 : 0; // skip leading ?\r\n\r\n for (; i < qs.length; i++) {\r\n const ch = qs.charCodeAt(i);\r\n\r\n if (ch === 61 /* = */ && startingKey) {\r\n startingKey = false;\r\n continue;\r\n }\r\n\r\n if (ch === 38 /* & */) {\r\n if (key.length > 0) {\r\n const decodedKey = fastDecode(key);\r\n const decodedVal = fastDecode(value);\r\n const existing = result[decodedKey];\r\n if (existing === undefined) {\r\n result[decodedKey] = decodedVal;\r\n } else if (typeof existing === \"string\") {\r\n result[decodedKey] = [existing, decodedVal];\r\n } else {\r\n existing.push(decodedVal);\r\n }\r\n }\r\n key = \"\";\r\n value = \"\";\r\n startingKey = true;\r\n continue;\r\n }\r\n\r\n if (startingKey) {\r\n key += qs[i];\r\n } else {\r\n value += qs[i];\r\n }\r\n }\r\n\r\n if (key.length > 0) {\r\n const decodedKey = fastDecode(key);\r\n const decodedVal = fastDecode(value);\r\n const existing = result[decodedKey];\r\n if (existing === undefined) {\r\n result[decodedKey] = decodedVal;\r\n } else if (typeof existing === \"string\") {\r\n result[decodedKey] = [existing, decodedVal];\r\n } else {\r\n existing.push(decodedVal);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction fastDecode(str: string): string {\r\n if (str.indexOf(\"%\") === -1 && str.indexOf(\"+\") === -1) return str;\r\n try {\r\n return decodeURIComponent(str.replace(/\\+/g, \" \"));\r\n } catch {\r\n return str;\r\n }\r\n}\r\n\r\nexport function parseCookies(header: string | undefined): Record<string, string> {\r\n const cookies: Record<string, string> = Object.create(null);\r\n if (!header) return cookies;\r\n\r\n let i = 0;\r\n const len = header.length;\r\n\r\n while (i < len) {\r\n while (i < len && header.charCodeAt(i) === 32) i++; // skip spaces\r\n\r\n let eqIdx = -1;\r\n let semiIdx = -1;\r\n for (let j = i; j < len; j++) {\r\n const ch = header.charCodeAt(j);\r\n if (ch === 61 && eqIdx === -1) eqIdx = j;\r\n if (ch === 59) { semiIdx = j; break; }\r\n }\r\n\r\n if (eqIdx === -1) {\r\n i = semiIdx === -1 ? len : semiIdx + 1;\r\n continue;\r\n }\r\n\r\n const end = semiIdx === -1 ? len : semiIdx;\r\n const name = header.slice(i, eqIdx).trim();\r\n let val = header.slice(eqIdx + 1, end).trim();\r\n\r\n if (val.charCodeAt(0) === 34 && val.charCodeAt(val.length - 1) === 34) {\r\n val = val.slice(1, -1);\r\n }\r\n\r\n if (cookies[name] === undefined) {\r\n cookies[name] = fastDecode(val);\r\n }\r\n\r\n i = end + 1;\r\n }\r\n\r\n return cookies;\r\n}\r\n\r\nconst CONTENT_TYPE_JSON = \"application/json\";\r\nconst CONTENT_TYPE_FORM = \"application/x-www-form-urlencoded\";\r\n\r\nexport async function parseBody(req: IncomingMessage): Promise<any> {\r\n const contentType = req.headers[\"content-type\"] ?? \"\";\r\n const contentLength = req.headers[\"content-length\"];\r\n\r\n if (\r\n req.method === \"GET\" ||\r\n req.method === \"HEAD\" ||\r\n req.method === \"OPTIONS\" ||\r\n (contentLength !== undefined && contentLength === \"0\")\r\n ) {\r\n return undefined;\r\n }\r\n\r\n const chunks: Buffer[] = [];\r\n let totalSize = 0;\r\n const maxSize = 10 * 1024 * 1024; // 10MB default\r\n\r\n return new Promise((resolve, reject) => {\r\n req.on(\"data\", (chunk: Buffer) => {\r\n totalSize += chunk.length;\r\n if (totalSize > maxSize) {\r\n req.destroy();\r\n reject(new Error(\"Request body too large\"));\r\n return;\r\n }\r\n chunks.push(chunk);\r\n });\r\n\r\n req.on(\"end\", () => {\r\n if (chunks.length === 0) {\r\n resolve(undefined);\r\n return;\r\n }\r\n\r\n const raw = Buffer.concat(chunks).toString(\"utf-8\");\r\n\r\n if (contentType.startsWith(CONTENT_TYPE_JSON)) {\r\n try {\r\n resolve(JSON.parse(raw));\r\n } catch {\r\n resolve(raw);\r\n }\r\n } else if (contentType.startsWith(CONTENT_TYPE_FORM)) {\r\n resolve(parseQueryString(raw));\r\n } else {\r\n resolve(raw);\r\n }\r\n });\r\n\r\n req.on(\"error\", reject);\r\n });\r\n}\r\n\r\nexport function parseUrl(url: string): { pathname: string; search: string } {\r\n let pathname = \"\";\r\n let search = \"\";\r\n let i = 0;\r\n\r\n for (; i < url.length; i++) {\r\n if (url.charCodeAt(i) === 63) { // ?\r\n pathname = url.slice(0, i);\r\n search = url.slice(i);\r\n return { pathname, search };\r\n }\r\n }\r\n\r\n return { pathname: url, search: \"\" };\r\n}\r\n","import type { IncomingMessage } from \"node:http\";\r\n\r\nconst PROXY_HEADERS = [\r\n \"x-forwarded-for\",\r\n \"x-real-ip\",\r\n \"cf-connecting-ip\",\r\n \"x-client-ip\",\r\n \"x-cluster-client-ip\",\r\n \"fastly-client-ip\",\r\n \"true-client-ip\",\r\n] as const;\r\n\r\nexport function resolveIp(req: IncomingMessage): string {\r\n for (const header of PROXY_HEADERS) {\r\n const val = req.headers[header];\r\n if (val) {\r\n const ip = typeof val === \"string\" ? val.split(\",\")[0].trim() : val[0];\r\n if (ip && ip.length > 0) return normalizeIp(ip);\r\n }\r\n }\r\n\r\n const remoteAddr = req.socket?.remoteAddress ?? \"127.0.0.1\";\r\n return normalizeIp(remoteAddr);\r\n}\r\n\r\nfunction normalizeIp(ip: string): string {\r\n if (ip === \"::1\" || ip === \"::ffff:127.0.0.1\") return \"127.0.0.1\";\r\n if (ip.startsWith(\"::ffff:\")) return ip.slice(7);\r\n return ip;\r\n}\r\n","import type { CookieOptions } from \"../../types/common.type.js\";\r\n\r\nexport function serializeCookie(\r\n name: string,\r\n value: string,\r\n options: CookieOptions = {},\r\n): string {\r\n let cookie = `${encodeURIComponent(name)}=${encodeURIComponent(value)}`;\r\n\r\n if (options.maxAge != null) {\r\n cookie += `; Max-Age=${Math.floor(options.maxAge)}`;\r\n }\r\n\r\n if (options.expires) {\r\n cookie += `; Expires=${options.expires.toUTCString()}`;\r\n }\r\n\r\n if (options.domain) {\r\n cookie += `; Domain=${options.domain}`;\r\n }\r\n\r\n cookie += `; Path=${options.path ?? \"/\"}`;\r\n\r\n if (options.secure) {\r\n cookie += \"; Secure\";\r\n }\r\n\r\n if (options.httpOnly !== false) {\r\n cookie += \"; HttpOnly\";\r\n }\r\n\r\n if (options.sameSite) {\r\n cookie += `; SameSite=${options.sameSite}`;\r\n }\r\n\r\n return cookie;\r\n}\r\n\r\nexport function clearCookieHeader(\r\n name: string,\r\n options: CookieOptions = {},\r\n): string {\r\n return serializeCookie(name, \"\", {\r\n ...options,\r\n maxAge: 0,\r\n expires: new Date(0),\r\n });\r\n}\r\n","/** Tags OpenAPI a nível de controller (todas as rotas do class) */\r\nexport const API_TAGS_KEY = \"azura:api-tags\";\r\n\r\n/** Tags por método (independente da ordem em relação a @Get/@Post) */\r\nexport const METHOD_TAGS_KEY = \"azura:swagger-method-tags\";\r\n\r\n/** Metadados OpenAPI por método (summary, responses, etc.) */\r\nexport const API_OPERATION_KEY = \"azura:swagger-operation\";\r\n","import type { HttpMethod } from \"../types/common.type.js\";\r\nimport type { RouteDocument } from \"../core/router.js\";\r\nimport type { RouteMeta } from \"../types/routes.type.js\";\r\nimport type { BuildOpenApiOptions, OpenApiInfo } from \"../types/swagger.type.js\";\r\n\r\nfunction resolveInfo(options: BuildOpenApiOptions): OpenApiInfo {\r\n return (\r\n options.info ?? {\r\n title: \"AzuraJS API\",\r\n version: \"1.0.0\",\r\n description: \"Generated OpenAPI specification\",\r\n }\r\n );\r\n}\r\n\r\n/** Converte path AzuraJS `/users/:id` → OpenAPI `/users/{id}` */\r\nexport function toOpenApiPath(path: string): string {\r\n if (path === \"/\") return \"/\";\r\n const mapped = path\r\n .split(\"/\")\r\n .map((seg) => {\r\n if (seg === \"*\") return \"{wildcard}\";\r\n return seg.startsWith(\":\") ? `{${seg.slice(1)}}` : seg;\r\n })\r\n .join(\"/\")\r\n .replace(/\\/{2,}/g, \"/\");\r\n if (mapped.endsWith(\"/*\")) {\r\n return mapped.slice(0, -2) + \"/{wildcard}\";\r\n }\r\n return mapped;\r\n}\r\n\r\nfunction pathParametersFromTemplate(path: string): Array<Record<string, unknown>> {\r\n const re = /\\{([^}]+)\\}/g;\r\n const out: Array<Record<string, unknown>> = [];\r\n let m: RegExpExecArray | null;\r\n const seen = new Set<string>();\r\n while ((m = re.exec(path)) !== null) {\r\n const name = m[1];\r\n if (seen.has(name)) continue;\r\n seen.add(name);\r\n out.push({\r\n name,\r\n in: \"path\",\r\n required: true,\r\n schema: { type: \"string\" },\r\n });\r\n }\r\n return out;\r\n}\r\n\r\nfunction defaultResponses(meta?: RouteMeta): Record<string, unknown> {\r\n if (meta?.responses && Object.keys(meta.responses).length > 0) {\r\n const out: Record<string, unknown> = {};\r\n for (const [code, r] of Object.entries(meta.responses)) {\r\n out[String(code)] = {\r\n description: r.description,\r\n ...(r.schema ? { content: { \"application/json\": { schema: r.schema } } } : {}),\r\n };\r\n }\r\n return out;\r\n }\r\n return {\r\n \"200\": {\r\n description: \"Successful response\",\r\n content: {\r\n \"application/json\": {\r\n schema: { type: \"object\", additionalProperties: true },\r\n },\r\n },\r\n },\r\n };\r\n}\r\n\r\nfunction mergeParameters(\r\n meta: RouteMeta | undefined,\r\n pathParams: Array<Record<string, unknown>>,\r\n): Array<Record<string, unknown>> {\r\n const fromMeta = meta?.parameters ?? [];\r\n const names = new Set(pathParams.map((p) => p.name as string));\r\n const rest = fromMeta.filter((p) => !(p.in === \"path\" && names.has(p.name)));\r\n const mapped = fromMeta\r\n .filter((p) => p.in === \"path\")\r\n .map((p) => ({\r\n name: p.name,\r\n in: \"path\",\r\n required: p.required ?? true,\r\n description: p.description,\r\n schema: p.schema ?? { type: p.type ?? \"string\" },\r\n }));\r\n const pathMerged = [...pathParams];\r\n for (const m of mapped) {\r\n if (!pathMerged.find((x) => x.name === m.name)) pathMerged.push(m);\r\n }\r\n return [...pathMerged, ...rest.map((p) => mapParameter(p))];\r\n}\r\n\r\nfunction mapParameter(p: import(\"../types/routes.type.js\").ParameterMeta): Record<string, unknown> {\r\n const base: Record<string, unknown> = {\r\n name: p.name,\r\n in: p.in,\r\n required: p.required ?? (p.in === \"path\" ? true : false),\r\n description: p.description,\r\n };\r\n if (p.in === \"body\") {\r\n return {\r\n ...base,\r\n content: {\r\n \"application/json\": {\r\n schema: p.schema ?? { type: \"object\" },\r\n },\r\n },\r\n };\r\n }\r\n return {\r\n ...base,\r\n schema: p.schema ?? { type: p.type ?? \"string\" },\r\n };\r\n}\r\n\r\nfunction operationIdFor(method: HttpMethod, oPath: string): string {\r\n const slug = oPath\r\n .replace(/[/{}\\-*]/g, \"_\")\r\n .replace(/_+/g, \"_\")\r\n .replace(/^_|_$/g, \"\");\r\n return `${method.toLowerCase()}_${slug || \"root\"}`;\r\n}\r\n\r\nfunction operationForMethod(\r\n method: HttpMethod,\r\n oPath: string,\r\n meta: RouteMeta | undefined,\r\n): Record<string, unknown> {\r\n const op: Record<string, unknown> = {\r\n operationId: operationIdFor(method, oPath),\r\n summary: meta?.summary ?? `${method} ${oPath}`,\r\n ...(meta?.description ? { description: meta.description } : {}),\r\n ...(meta?.deprecated ? { deprecated: true } : {}),\r\n ...(meta?.tags?.length ? { tags: meta.tags } : {}),\r\n ...(meta?.security?.length ? { security: meta.security } : {}),\r\n };\r\n\r\n if ([\"POST\", \"PUT\", \"PATCH\"].includes(method) && !meta?.parameters?.some((x) => x.in === \"body\")) {\r\n op.requestBody = {\r\n content: {\r\n \"application/json\": {\r\n schema: { type: \"object\", additionalProperties: true },\r\n },\r\n },\r\n required: false,\r\n };\r\n }\r\n\r\n op.responses = defaultResponses(meta);\r\n return op;\r\n}\r\n\r\n/**\r\n * Gera documento OpenAPI 3.0 a partir das rotas registadas.\r\n */\r\nexport function buildOpenApiDocument(\r\n routes: RouteDocument[],\r\n options: BuildOpenApiOptions,\r\n): Record<string, unknown> {\r\n const info = resolveInfo(options);\r\n const prefix = options.pathPrefix ?? \"\";\r\n const paths: Record<string, Record<string, unknown>> = {};\r\n\r\n const seen = new Set<string>();\r\n for (const r of routes) {\r\n const full = prefix + r.path;\r\n const oPath = toOpenApiPath(full);\r\n const key = `${r.method}:${oPath}`;\r\n if (seen.has(key)) continue;\r\n seen.add(key);\r\n\r\n const pathParams = pathParametersFromTemplate(oPath);\r\n const op = operationForMethod(r.method, oPath, r.meta);\r\n const parameters = mergeParameters(r.meta, pathParams);\r\n if (parameters.length) op.parameters = parameters;\r\n\r\n const methodLc = r.method.toLowerCase();\r\n if (!paths[oPath]) paths[oPath] = {};\r\n paths[oPath][methodLc] = op;\r\n }\r\n\r\n return {\r\n openapi: \"3.0.3\",\r\n info: {\r\n title: info.title,\r\n version: info.version,\r\n ...(info.description ? { description: info.description } : {}),\r\n ...(info.contact ? { contact: info.contact } : {}),\r\n ...(info.license ? { license: info.license } : {}),\r\n },\r\n ...(options.servers?.length ? { servers: options.servers } : {}),\r\n paths,\r\n };\r\n}\r\n","import { createServer, type Server, type IncomingMessage, type ServerResponse } from \"node:http\";\r\nimport { createServer as createHttpsServer } from \"node:https\";\r\nimport { readFileSync } from \"node:fs\";\r\nimport { Router } from \"./router.js\";\r\nimport { Logger } from \"../utils/Logger.js\";\r\nimport { HttpError } from \"../utils/HttpError.js\";\r\nimport { parseQueryString, parseCookies, parseBody, parseUrl } from \"../utils/Parser.js\";\r\nimport { resolveIp } from \"../utils/IpResolver.js\";\r\nimport { serializeCookie, clearCookieHeader } from \"../utils/cookies/CookieManager.js\";\r\nimport type {\r\n AzuraRequest,\r\n AzuraResponse,\r\n NextFunction,\r\n MiddlewareHandler,\r\n ErrorHandler,\r\n HttpMethod,\r\n CookieOptions,\r\n} from \"../types/common.type.js\";\r\nimport type { AzuraConfig } from \"../types/config.type.js\";\r\nimport type { PluginHandler } from \"../types/plugins/plugin.type.js\";\r\nimport type { ControllerMetadata, RouteMeta, RouteMetadata } from \"../types/routes.type.js\";\r\nimport type { BuildOpenApiOptions } from \"../types/swagger.type.js\";\r\nimport { API_OPERATION_KEY, API_TAGS_KEY, METHOD_TAGS_KEY } from \"../swagger/constants.js\";\r\nimport { buildOpenApiDocument } from \"../swagger/openapi-builder.js\";\r\n\r\nfunction isRouteDocumentMeta(o: unknown): o is RouteMeta {\r\n if (!o || typeof o !== \"object\" || Array.isArray(o)) return false;\r\n const x = o as Record<string, unknown>;\r\n return (\r\n \"summary\" in x ||\r\n \"description\" in x ||\r\n \"tags\" in x ||\r\n \"deprecated\" in x ||\r\n \"parameters\" in x ||\r\n \"responses\" in x ||\r\n \"security\" in x ||\r\n \"produces\" in x ||\r\n \"consumes\" in x\r\n );\r\n}\r\n\r\nconst CONTROLLER_META_KEY = \"azura:controller\";\r\nconst ROUTES_META_KEY = \"azura:routes\";\r\nconst PARAMS_META_KEY = \"azura:params\";\r\n\r\nexport class AzuraServer {\r\n private server: Server | null = null;\r\n private router: Router;\r\n private logger: Logger;\r\n private middlewares: MiddlewareHandler[] = [];\r\n private plugins: PluginHandler[] = [];\r\n private errorHandler: ErrorHandler | null = null;\r\n private config: AzuraConfig;\r\n private compiledChain: ((req: AzuraRequest, res: AzuraResponse) => Promise<void>) | null = null;\r\n\r\n constructor(config: AzuraConfig = {}) {\r\n this.config = {\r\n environment: config.environment ?? (process.env.NODE_ENV as any) ?? \"development\",\r\n server: {\r\n port: config.server?.port ?? 3000,\r\n host: config.server?.host ?? \"0.0.0.0\",\r\n keepAliveTimeout: config.server?.keepAliveTimeout ?? 72000,\r\n headersTimeout: config.server?.headersTimeout ?? 75000,\r\n requestTimeout: config.server?.requestTimeout ?? 30000,\r\n ...config.server,\r\n },\r\n logging: {\r\n enabled: config.logging?.enabled ?? true,\r\n level: config.logging?.level ?? \"info\",\r\n timestamp: config.logging?.timestamp ?? true,\r\n colors: config.logging?.colors ?? true,\r\n requestLogging: config.logging?.requestLogging ?? true,\r\n ...config.logging,\r\n },\r\n plugins: config.plugins ?? {},\r\n debug: config.debug ?? false,\r\n };\r\n\r\n this.router = new Router();\r\n this.logger = new Logger({\r\n level: this.config.logging?.enabled === false ? \"silent\" : this.config.logging?.level,\r\n colors: this.config.logging?.colors,\r\n timestamp: this.config.logging?.timestamp,\r\n });\r\n }\r\n\r\n use(handler: MiddlewareHandler | PluginHandler): this {\r\n this.compiledChain = null;\r\n if (handler.length <= 2) {\r\n this.plugins.push(handler as PluginHandler);\r\n } else {\r\n this.middlewares.push(handler as MiddlewareHandler);\r\n }\r\n return this;\r\n }\r\n\r\n plugin(handler: PluginHandler): this {\r\n this.compiledChain = null;\r\n this.plugins.push(handler);\r\n return this;\r\n }\r\n\r\n onError(handler: ErrorHandler): this {\r\n this.errorHandler = handler;\r\n return this;\r\n }\r\n\r\n get(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"GET\", path, handlers);\r\n }\r\n\r\n post(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"POST\", path, handlers);\r\n }\r\n\r\n put(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"PUT\", path, handlers);\r\n }\r\n\r\n delete(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"DELETE\", path, handlers);\r\n }\r\n\r\n patch(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"PATCH\", path, handlers);\r\n }\r\n\r\n head(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"HEAD\", path, handlers);\r\n }\r\n\r\n options(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n return this.route(\"OPTIONS\", path, handlers);\r\n }\r\n\r\n all(path: string, ...handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n const methods: HttpMethod[] = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"OPTIONS\"];\r\n for (const method of methods) {\r\n this.route(method, path, handlers);\r\n }\r\n return this;\r\n }\r\n\r\n private route(method: HttpMethod, path: string, handlers: (MiddlewareHandler | Function | RouteMeta)[]): this {\r\n let meta: RouteMeta | undefined;\r\n let list = handlers as unknown[];\r\n const last = list[list.length - 1];\r\n if (list.length >= 2 && isRouteDocumentMeta(last)) {\r\n meta = last;\r\n list = list.slice(0, -1);\r\n }\r\n if (list.length === 0) {\r\n throw new Error(`Route ${method} ${path} requires a handler function`);\r\n }\r\n const routeHandler = list[list.length - 1] as any;\r\n const middlewares = list.slice(0, -1) as MiddlewareHandler[];\r\n this.router.add(method, path, routeHandler, middlewares, meta);\r\n return this;\r\n }\r\n\r\n register(...controllers: (new (...args: any[]) => any)[]): this {\r\n for (const Controller of controllers) {\r\n this.registerController(Controller);\r\n }\r\n return this;\r\n }\r\n\r\n private registerController(Controller: new (...args: any[]) => any): void {\r\n const instance = new Controller();\r\n const prefix: string = Reflect.getMetadata?.(CONTROLLER_META_KEY, Controller) ?? \"\";\r\n const controllerMiddlewares: MiddlewareHandler[] =\r\n Reflect.getMetadata?.(\"azura:middlewares\", Controller) ?? [];\r\n const controllerTags: string[] = Reflect.getMetadata?.(API_TAGS_KEY, Controller) ?? [];\r\n\r\n const prototype = Controller.prototype;\r\n const propertyNames = Object.getOwnPropertyNames(prototype).filter(\r\n (p) => p !== \"constructor\",\r\n );\r\n\r\n for (const propertyKey of propertyNames) {\r\n const routeMeta: RouteMetadata | undefined = Reflect.getMetadata?.(\r\n ROUTES_META_KEY,\r\n prototype,\r\n propertyKey,\r\n );\r\n\r\n if (!routeMeta) continue;\r\n\r\n const fullPath = this.joinPaths(prefix, routeMeta.path);\r\n const paramsMeta = Reflect.getMetadata?.(PARAMS_META_KEY, prototype, propertyKey) ?? [];\r\n const routeMiddlewares: MiddlewareHandler[] =\r\n Reflect.getMetadata?.(\"azura:middlewares\", prototype, propertyKey) ?? [];\r\n\r\n const allMiddlewares = [...controllerMiddlewares, ...routeMiddlewares];\r\n\r\n const methodTags: string[] = Reflect.getMetadata?.(METHOD_TAGS_KEY, prototype, propertyKey) ?? [];\r\n const opExtra = (Reflect.getMetadata?.(API_OPERATION_KEY, prototype, propertyKey) ??\r\n {}) as Partial<RouteMeta>;\r\n const tagList = [...controllerTags, ...methodTags, ...(routeMeta.meta?.tags ?? [])];\r\n const mergedMeta: RouteMeta | undefined = (() => {\r\n const m = { ...routeMeta.meta, ...opExtra } as RouteMeta;\r\n if (tagList.length) m.tags = tagList;\r\n return Object.keys(m).length ? m : undefined;\r\n })();\r\n\r\n const handler = async (req: AzuraRequest, res: AzuraResponse) => {\r\n const args = this.resolveParams(paramsMeta, req, res);\r\n const result = await instance[propertyKey](...args);\r\n if (result !== undefined && !res.sent) {\r\n if (typeof result === \"object\") {\r\n res.json(result);\r\n } else {\r\n res.send(String(result));\r\n }\r\n }\r\n };\r\n\r\n this.router.add(routeMeta.method, fullPath, handler, allMiddlewares, mergedMeta);\r\n }\r\n }\r\n\r\n private resolveParams(paramsMeta: any[], req: AzuraRequest, res: AzuraResponse): any[] {\r\n if (!paramsMeta || paramsMeta.length === 0) return [req, res];\r\n\r\n const sorted = [...paramsMeta].sort((a, b) => a.index - b.index);\r\n const args: any[] = new Array(sorted.length);\r\n\r\n for (const meta of sorted) {\r\n let value: any;\r\n\r\n switch (meta.type) {\r\n case \"body\":\r\n value = meta.name ? req.body?.[meta.name] : req.body;\r\n break;\r\n case \"query\":\r\n value = meta.name ? req.query[meta.name] : req.query;\r\n break;\r\n case \"param\":\r\n value = meta.name ? req.params[meta.name] : req.params;\r\n break;\r\n case \"header\":\r\n value = meta.name ? req.headers[meta.name.toLowerCase()] : req.headers;\r\n break;\r\n case \"cookie\":\r\n value = meta.name ? req.cookies[meta.name] : req.cookies;\r\n break;\r\n case \"req\":\r\n value = req;\r\n break;\r\n case \"res\":\r\n value = res;\r\n break;\r\n case \"next\":\r\n value = () => {};\r\n break;\r\n case \"ip\":\r\n value = req.ip;\r\n break;\r\n case \"session\":\r\n value = req.session;\r\n break;\r\n default:\r\n value = undefined;\r\n }\r\n\r\n if (meta.pipes) {\r\n for (const pipe of meta.pipes) {\r\n value = pipe(value);\r\n }\r\n }\r\n\r\n args[meta.index] = value;\r\n }\r\n\r\n return args;\r\n }\r\n\r\n private joinPaths(prefix: string, path: string): string {\r\n const p = prefix.endsWith(\"/\") ? prefix.slice(0, -1) : prefix;\r\n const s = path.startsWith(\"/\") ? path : `/${path}`;\r\n return `${p}${s}`;\r\n }\r\n\r\n private extendRequest(req: IncomingMessage, pathname: string, query: Record<string, string | string[]>): AzuraRequest {\r\n const azReq = req as AzuraRequest;\r\n azReq.pathname = pathname;\r\n azReq.query = query;\r\n azReq.params = {};\r\n azReq.cookies = parseCookies(req.headers.cookie);\r\n azReq.ip = resolveIp(req);\r\n azReq.protocol = (req.socket as any).encrypted ? \"https\" : \"http\";\r\n azReq.secure = azReq.protocol === \"https\";\r\n azReq.hostname = (req.headers.host ?? \"localhost\").split(\":\")[0];\r\n azReq.startTime = process.hrtime.bigint();\r\n azReq.raw = req;\r\n return azReq;\r\n }\r\n\r\n private extendResponse(res: ServerResponse): AzuraResponse {\r\n const azRes = res as AzuraResponse;\r\n azRes.locals = {};\r\n azRes.sent = false;\r\n\r\n azRes.status = function (code: number) {\r\n this.statusCode = code;\r\n return this;\r\n };\r\n\r\n azRes.json = function (data: unknown) {\r\n if (this.sent) return;\r\n this.sent = true;\r\n const body = JSON.stringify(data);\r\n this.setHeader(\"Content-Type\", \"application/json; charset=utf-8\");\r\n this.setHeader(\"Content-Length\", Buffer.byteLength(body));\r\n this.end(body);\r\n };\r\n\r\n azRes.send = function (body: string | Buffer) {\r\n if (this.sent) return;\r\n this.sent = true;\r\n if (!this.getHeader(\"Content-Type\")) {\r\n this.setHeader(\"Content-Type\", typeof body === \"string\" ? \"text/plain; charset=utf-8\" : \"application/octet-stream\");\r\n }\r\n const buf = typeof body === \"string\" ? Buffer.from(body) : body;\r\n this.setHeader(\"Content-Length\", buf.length);\r\n this.end(buf);\r\n };\r\n\r\n azRes.html = function (body: string) {\r\n if (this.sent) return;\r\n this.sent = true;\r\n this.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\r\n this.setHeader(\"Content-Length\", Buffer.byteLength(body));\r\n this.end(body);\r\n };\r\n\r\n azRes.redirect = function (url: string, code = 302) {\r\n if (this.sent) return;\r\n this.sent = true;\r\n this.statusCode = code;\r\n this.setHeader(\"Location\", url);\r\n this.end();\r\n };\r\n\r\n azRes.cookie = function (name: string, value: string, options?: CookieOptions) {\r\n const header = serializeCookie(name, value, options);\r\n const existing = this.getHeader(\"Set-Cookie\");\r\n if (existing) {\r\n const arr = Array.isArray(existing) ? existing : [String(existing)];\r\n arr.push(header);\r\n this.setHeader(\"Set-Cookie\", arr);\r\n } else {\r\n this.setHeader(\"Set-Cookie\", header);\r\n }\r\n return this;\r\n };\r\n\r\n azRes.clearCookie = function (name: string, options?: CookieOptions) {\r\n const header = clearCookieHeader(name, options);\r\n const existing = this.getHeader(\"Set-Cookie\");\r\n if (existing) {\r\n const arr = Array.isArray(existing) ? existing : [String(existing)];\r\n arr.push(header);\r\n this.setHeader(\"Set-Cookie\", arr);\r\n } else {\r\n this.setHeader(\"Set-Cookie\", header);\r\n }\r\n return this;\r\n };\r\n\r\n azRes.header = function (name: string, value: string | number | string[]) {\r\n this.setHeader(name, value as any);\r\n return this;\r\n };\r\n\r\n azRes.type = function (contentType: string) {\r\n this.setHeader(\"Content-Type\", contentType);\r\n return this;\r\n };\r\n\r\n azRes.attachment = function (filename?: string) {\r\n if (filename) {\r\n this.setHeader(\"Content-Disposition\", `attachment; filename=\"${filename}\"`);\r\n } else {\r\n this.setHeader(\"Content-Disposition\", \"attachment\");\r\n }\r\n return this;\r\n };\r\n\r\n azRes.download = function (_path: string, _filename?: string) {\r\n // TODO: implement file streaming\r\n };\r\n\r\n return azRes;\r\n }\r\n\r\n private compileMiddlewareChain(): (req: AzuraRequest, res: AzuraResponse) => Promise<void> {\r\n if (this.compiledChain) return this.compiledChain;\r\n\r\n const self = this;\r\n const globalMiddlewares = [...this.middlewares];\r\n\r\n this.compiledChain = async (req: AzuraRequest, res: AzuraResponse) => {\r\n for (const plugin of self.plugins) {\r\n if (res.sent) return;\r\n await new Promise<void>((resolve, reject) => {\r\n try {\r\n const result = plugin({ req, res }, (err) => {\r\n if (err) reject(err);\r\n else resolve();\r\n });\r\n if (result && typeof (result as any).then === \"function\") {\r\n (result as Promise<void>).then(resolve, reject);\r\n }\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n }\r\n\r\n if (res.sent) return;\r\n\r\n let idx = 0;\r\n const runMiddleware = async (): Promise<void> => {\r\n if (idx >= globalMiddlewares.length || res.sent) return;\r\n const mw = globalMiddlewares[idx++];\r\n await new Promise<void>((resolve, reject) => {\r\n try {\r\n const result = mw(req, res, (err) => {\r\n if (err) reject(err);\r\n else resolve();\r\n });\r\n if (result && typeof (result as any).then === \"function\") {\r\n (result as Promise<void>).then(resolve, reject);\r\n }\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n await runMiddleware();\r\n };\r\n\r\n await runMiddleware();\r\n };\r\n\r\n return this.compiledChain;\r\n }\r\n\r\n private async handleRequest(req: IncomingMessage, res: ServerResponse): Promise<void> {\r\n const { pathname, search } = parseUrl(req.url ?? \"/\");\r\n const query = parseQueryString(search);\r\n\r\n const azReq = this.extendRequest(req, pathname, query);\r\n const azRes = this.extendResponse(res);\r\n\r\n try {\r\n const chain = this.compileMiddlewareChain();\r\n await chain(azReq, azRes);\r\n\r\n if (azRes.sent) return;\r\n\r\n const method = (req.method ?? \"GET\").toUpperCase() as HttpMethod;\r\n const match = this.router.find(method, pathname);\r\n\r\n if (!match) {\r\n if (pathname === \"/favicon.ico\") {\r\n azRes.status(204).send(\"\");\r\n return;\r\n }\r\n throw HttpError.notFound(`Route ${method} ${pathname} not found`);\r\n }\r\n\r\n azReq.params = match.params;\r\n\r\n if (method !== \"GET\" && method !== \"HEAD\" && method !== \"OPTIONS\") {\r\n azReq.body = await parseBody(req);\r\n }\r\n\r\n for (const mw of match.middlewares) {\r\n if (azRes.sent) return;\r\n await new Promise<void>((resolve, reject) => {\r\n try {\r\n const result = mw(azReq, azRes, (err) => {\r\n if (err) reject(err);\r\n else resolve();\r\n });\r\n if (result && typeof (result as any).then === \"function\") {\r\n (result as Promise<void>).then(resolve, reject);\r\n }\r\n } catch (e) {\r\n reject(e);\r\n }\r\n });\r\n }\r\n\r\n if (azRes.sent) return;\r\n\r\n const result = await match.handler(azReq, azRes);\r\n\r\n if (result !== undefined && !azRes.sent) {\r\n if (typeof result === \"object\" && result !== null) {\r\n azRes.json(result);\r\n } else {\r\n azRes.send(String(result));\r\n }\r\n }\r\n } catch (err) {\r\n this.handleError(err, azReq, azRes);\r\n } finally {\r\n if (this.config.logging?.requestLogging) {\r\n const duration = process.hrtime.bigint() - azReq.startTime;\r\n this.logger.request(\r\n req.method ?? \"GET\",\r\n pathname,\r\n res.statusCode,\r\n duration,\r\n );\r\n }\r\n }\r\n }\r\n\r\n private handleError(err: any, req: AzuraRequest, res: AzuraResponse): void {\r\n if (res.sent) return;\r\n\r\n if (this.errorHandler) {\r\n try {\r\n this.errorHandler(err, req, res, () => {});\r\n return;\r\n } catch (handlerErr) {\r\n this.logger.error(\"Error handler threw:\", handlerErr);\r\n }\r\n }\r\n\r\n if (err instanceof HttpError) {\r\n res.status(err.statusCode).json(err.toJSON());\r\n return;\r\n }\r\n\r\n const statusCode = err?.statusCode ?? err?.status ?? 500;\r\n const message = this.config.environment === \"production\"\r\n ? \"Internal Server Error\"\r\n : err?.message ?? \"Internal Server Error\";\r\n\r\n this.logger.error(`Unhandled error: ${err?.message ?? err}`);\r\n if (this.config.debug && err?.stack) {\r\n this.logger.error(err.stack);\r\n }\r\n\r\n res.status(statusCode).json({\r\n error: {\r\n statusCode,\r\n message,\r\n ...(this.config.debug ? { stack: err?.stack } : {}),\r\n },\r\n });\r\n }\r\n\r\n async listen(port?: number, callback?: () => void): Promise<Server> {\r\n const serverPort = port ?? this.config.server?.port ?? 3000;\r\n const host = this.config.server?.host ?? \"0.0.0.0\";\r\n\r\n const handler = (req: IncomingMessage, res: ServerResponse) => {\r\n this.handleRequest(req, res).catch((err) => {\r\n this.logger.error(\"Fatal request error:\", err);\r\n if (!res.headersSent) {\r\n res.statusCode = 500;\r\n res.end('{\"error\":{\"statusCode\":500,\"message\":\"Internal Server Error\"}}');\r\n }\r\n });\r\n };\r\n\r\n if (this.config.server?.https) {\r\n const httpsConfig = this.config.server.https;\r\n this.server = createHttpsServer(\r\n {\r\n key: readFileSync(httpsConfig.key),\r\n cert: readFileSync(httpsConfig.cert),\r\n ...(httpsConfig.ca ? { ca: readFileSync(httpsConfig.ca) } : {}),\r\n },\r\n handler,\r\n );\r\n } else {\r\n this.server = createServer(handler);\r\n }\r\n\r\n if (this.config.server?.keepAliveTimeout) {\r\n this.server.keepAliveTimeout = this.config.server.keepAliveTimeout;\r\n }\r\n if (this.config.server?.headersTimeout) {\r\n this.server.headersTimeout = this.config.server.headersTimeout;\r\n }\r\n\r\n return new Promise((resolve) => {\r\n this.server!.listen(serverPort, host, () => {\r\n this.logger.banner(serverPort, host);\r\n callback?.();\r\n resolve(this.server!);\r\n });\r\n });\r\n }\r\n\r\n async close(): Promise<void> {\r\n return new Promise((resolve, reject) => {\r\n if (!this.server) {\r\n resolve();\r\n return;\r\n }\r\n this.server.close((err) => {\r\n if (err) reject(err);\r\n else resolve();\r\n });\r\n });\r\n }\r\n\r\n getRouter(): Router {\r\n return this.router;\r\n }\r\n\r\n getLogger(): Logger {\r\n return this.logger;\r\n }\r\n\r\n getConfig(): AzuraConfig {\r\n return this.config;\r\n }\r\n\r\n getRoutes(): Array<{ method: HttpMethod; path: string }> {\r\n return this.router.getAllRoutes();\r\n }\r\n\r\n /** Rotas com metadados OpenAPI (para Swagger ou export manual). */\r\n getRouteDocuments() {\r\n return this.router.getRouteDocuments();\r\n }\r\n\r\n /** Gera documento OpenAPI 3.0 a partir das rotas registadas. */\r\n getOpenApiDocument(options: BuildOpenApiOptions = {}) {\r\n return buildOpenApiDocument(this.getRouteDocuments(), options);\r\n }\r\n}\r\n","import type { HttpMethod, MiddlewareHandler } from \"../types/common.type.js\";\r\nimport type { ParamMetadata, RouteMeta } from \"../types/routes.type.js\";\r\n\r\n/** App com `register` (evita conflitos de overload com tipos duplicados entre subpaths). */\r\ntype AppRegisterable = {\r\n register(...controllers: (new (...args: any[]) => any)[]): unknown;\r\n listen(...args: any[]): unknown;\r\n};\r\n\r\nconst CONTROLLER_META_KEY = \"azura:controller\";\r\nconst ROUTES_META_KEY = \"azura:routes\";\r\nconst PARAMS_META_KEY = \"azura:params\";\r\nconst MIDDLEWARES_META_KEY = \"azura:middlewares\";\r\n\r\nfunction ensureReflect(): void {\r\n if (typeof Reflect === \"undefined\" || !Reflect.getMetadata) {\r\n const store = new Map<string, Map<any, any>>();\r\n (Reflect as any).defineMetadata = (key: string, value: any, target: any, prop?: string) => {\r\n const k = prop ? `${key}::${prop}` : key;\r\n if (!store.has(k)) store.set(k, new Map());\r\n store.get(k)!.set(target, value);\r\n };\r\n (Reflect as any).getMetadata = (key: string, target: any, prop?: string) => {\r\n const k = prop ? `${key}::${prop}` : key;\r\n return store.get(k)?.get(target);\r\n };\r\n }\r\n}\r\n\r\nensureReflect();\r\n\r\nexport function Controller(prefix: string = \"\"): ClassDecorator {\r\n return (target) => {\r\n Reflect.defineMetadata(CONTROLLER_META_KEY, prefix, target);\r\n };\r\n}\r\n\r\nfunction createMethodDecorator(method: HttpMethod) {\r\n return (path: string = \"\"): MethodDecorator => {\r\n return (target, propertyKey, _descriptor) => {\r\n Reflect.defineMetadata(\r\n ROUTES_META_KEY,\r\n { method, path, propertyKey: String(propertyKey), middlewares: [], params: [], meta: undefined },\r\n target,\r\n String(propertyKey),\r\n );\r\n };\r\n };\r\n}\r\n\r\nexport const Get = createMethodDecorator(\"GET\");\r\nexport const Post = createMethodDecorator(\"POST\");\r\nexport const Put = createMethodDecorator(\"PUT\");\r\nexport const Delete = createMethodDecorator(\"DELETE\");\r\nexport const Patch = createMethodDecorator(\"PATCH\");\r\nexport const Head = createMethodDecorator(\"HEAD\");\r\nexport const Options = createMethodDecorator(\"OPTIONS\");\r\n\r\nfunction createParamDecorator(type: ParamMetadata[\"type\"]) {\r\n return (name?: string): ParameterDecorator => {\r\n return (target, propertyKey, parameterIndex) => {\r\n const key = String(propertyKey);\r\n const existing: ParamMetadata[] = Reflect.getMetadata(PARAMS_META_KEY, target, key) ?? [];\r\n existing.push({ index: parameterIndex, type, name });\r\n Reflect.defineMetadata(PARAMS_META_KEY, existing, target, key);\r\n };\r\n };\r\n}\r\n\r\nexport const Body = createParamDecorator(\"body\");\r\nexport const Query = createParamDecorator(\"query\");\r\nexport const Param = createParamDecorator(\"param\");\r\nexport const Headers = createParamDecorator(\"header\");\r\nexport const Cookies = createParamDecorator(\"cookie\");\r\nexport const Req = createParamDecorator(\"req\");\r\nexport const Res = createParamDecorator(\"res\");\r\nexport const NextFunc = createParamDecorator(\"next\");\r\nexport const Ip = createParamDecorator(\"ip\");\r\nexport const Session = createParamDecorator(\"session\");\r\n\r\nexport function UseMiddleware(...middlewares: MiddlewareHandler[]): MethodDecorator & ClassDecorator {\r\n return (target: any, propertyKey?: string | symbol, _descriptor?: PropertyDescriptor) => {\r\n if (propertyKey) {\r\n const existing: MiddlewareHandler[] =\r\n Reflect.getMetadata(MIDDLEWARES_META_KEY, target, String(propertyKey)) ?? [];\r\n Reflect.defineMetadata(MIDDLEWARES_META_KEY, [...existing, ...middlewares], target, String(propertyKey));\r\n } else {\r\n const existing: MiddlewareHandler[] =\r\n Reflect.getMetadata(MIDDLEWARES_META_KEY, target) ?? [];\r\n Reflect.defineMetadata(MIDDLEWARES_META_KEY, [...existing, ...middlewares], target);\r\n }\r\n };\r\n}\r\n\r\nfunction isAzuraServerLike(x: unknown): x is AppRegisterable {\r\n return (\r\n typeof x === \"object\" &&\r\n x !== null &&\r\n typeof (x as AppRegisterable).register === \"function\" &&\r\n typeof (x as AppRegisterable).listen === \"function\"\r\n );\r\n}\r\n\r\n/** Compõe vários decorators (estilo NestJS). */\r\nexport function composeDecorators(...decorators: (MethodDecorator | ClassDecorator)[]): MethodDecorator & ClassDecorator {\r\n return (target: any, propertyKey?: string | symbol, descriptor?: PropertyDescriptor) => {\r\n for (const decorator of decorators) {\r\n if (propertyKey !== undefined) {\r\n (decorator as MethodDecorator)(target, propertyKey, descriptor!);\r\n } else {\r\n (decorator as ClassDecorator)(target);\r\n }\r\n }\r\n };\r\n}\r\n\r\n/**\r\n * Regista controllers na app (paridade com AzuraJS v2).\r\n * Aceita `applyDecorators(app, [A, B])` ou `applyDecorators(app, A, B)`.\r\n */\r\nexport function applyDecorators(\r\n app: AppRegisterable,\r\n controllers: Array<new (...args: any[]) => any>,\r\n): void;\r\nexport function applyDecorators(\r\n app: AppRegisterable,\r\n ...controllers: (new (...args: any[]) => any)[]\r\n): void;\r\nexport function applyDecorators(\r\n ...decorators: (MethodDecorator | ClassDecorator)[]\r\n): MethodDecorator & ClassDecorator;\r\nexport function applyDecorators(\r\n first: AppRegisterable | MethodDecorator | ClassDecorator,\r\n ...rest: unknown[]\r\n): void | (MethodDecorator & ClassDecorator) {\r\n if (isAzuraServerLike(first) && rest.length >= 1) {\r\n const second = rest[0];\r\n if (Array.isArray(second)) {\r\n first.register(...(second as (new (...args: any[]) => any)[]));\r\n } else {\r\n first.register(...(rest as (new (...args: any[]) => any)[]));\r\n }\r\n return;\r\n }\r\n const decorators = [first, ...rest] as (MethodDecorator | ClassDecorator)[];\r\n return composeDecorators(...decorators);\r\n}\r\n\r\nexport function Meta(key: string, value: any): MethodDecorator {\r\n return (target, propertyKey, _descriptor) => {\r\n const routeMeta = Reflect.getMetadata(ROUTES_META_KEY, target, String(propertyKey));\r\n if (routeMeta) {\r\n if (!routeMeta.meta) routeMeta.meta = {};\r\n routeMeta.meta[key] = value;\r\n Reflect.defineMetadata(ROUTES_META_KEY, routeMeta, target, String(propertyKey));\r\n }\r\n };\r\n}\r\n","import type { RouteMeta } from \"../types/routes.type.js\";\r\nimport { API_OPERATION_KEY, API_TAGS_KEY, METHOD_TAGS_KEY } from \"./constants.js\";\r\n\r\n/**\r\n * Tags OpenAPI no controller (todas as rotas) ou num método específico.\r\n * Compatível com `experimentalDecorators` (assinatura legacy de 3 argumentos em métodos).\r\n */\r\nexport function ApiTags(...tags: string[]): ClassDecorator & MethodDecorator {\r\n return function (\r\n target: object,\r\n propertyKey?: string | symbol,\r\n _descriptor?: PropertyDescriptor,\r\n ): void {\r\n if (propertyKey === undefined) {\r\n Reflect.defineMetadata(API_TAGS_KEY, tags, target);\r\n } else {\r\n Reflect.defineMetadata(METHOD_TAGS_KEY, tags, target, String(propertyKey));\r\n }\r\n } as ClassDecorator & MethodDecorator;\r\n}\r\n\r\n/**\r\n * Metadados OpenAPI (summary, description, responses, parameters, etc.).\r\n */\r\nexport function ApiOperation(meta: Partial<RouteMeta>): MethodDecorator {\r\n return function (\r\n target: object,\r\n propertyKey: string | symbol,\r\n _descriptor: PropertyDescriptor,\r\n ): void {\r\n const key = String(propertyKey);\r\n const cur = (Reflect.getMetadata?.(API_OPERATION_KEY, target, key) ?? {}) as Partial<RouteMeta>;\r\n Reflect.defineMetadata(API_OPERATION_KEY, { ...cur, ...meta }, target, key);\r\n };\r\n}\r\n","import type { CORSOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nconst DEFAULT_METHODS = [\"GET\", \"POST\", \"PUT\", \"DELETE\", \"PATCH\", \"HEAD\", \"OPTIONS\"];\r\nconst DEFAULT_HEADERS = [\"Content-Type\", \"Authorization\", \"Accept\", \"X-Requested-With\"];\r\n\r\nexport function CORSPlugin(options: CORSOptions = {}): PluginHandler {\r\n const {\r\n origins = \"*\",\r\n methods = DEFAULT_METHODS,\r\n allowedHeaders = DEFAULT_HEADERS,\r\n exposedHeaders = [],\r\n credentials = false,\r\n maxAge = 86400,\r\n preflightContinue = false,\r\n } = options;\r\n\r\n const methodsStr = methods.join(\", \");\r\n const headersStr = allowedHeaders.join(\", \");\r\n const exposedStr = exposedHeaders.length > 0 ? exposedHeaders.join(\", \") : \"\";\r\n\r\n const isAllowedOrigin = (origin: string): string | false => {\r\n if (origins === \"*\") return credentials ? origin : \"*\";\r\n if (typeof origins === \"function\") return origins(origin) ? origin : false;\r\n if (typeof origins === \"string\") return origin === origins ? origin : false;\r\n if (Array.isArray(origins)) return origins.includes(origin) ? origin : false;\r\n return false;\r\n };\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n const origin = req.headers.origin ?? \"\";\r\n\r\n const allowedOrigin = isAllowedOrigin(origin);\r\n\r\n if (allowedOrigin) {\r\n res.setHeader(\"Access-Control-Allow-Origin\", allowedOrigin);\r\n if (credentials) res.setHeader(\"Access-Control-Allow-Credentials\", \"true\");\r\n if (exposedStr) res.setHeader(\"Access-Control-Expose-Headers\", exposedStr);\r\n if (allowedOrigin !== \"*\") res.setHeader(\"Vary\", \"Origin\");\r\n }\r\n\r\n if (req.method === \"OPTIONS\") {\r\n res.setHeader(\"Access-Control-Allow-Methods\", methodsStr);\r\n res.setHeader(\"Access-Control-Allow-Headers\", headersStr);\r\n res.setHeader(\"Access-Control-Max-Age\", String(maxAge));\r\n\r\n if (!preflightContinue) {\r\n res.statusCode = 204;\r\n res.end();\r\n return;\r\n }\r\n }\r\n\r\n next();\r\n };\r\n}\r\n","import type { RateLimitOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\nimport type { AzuraRequest } from \"../types/common.type.js\";\r\n\r\ninterface SlidingWindowEntry {\r\n count: number;\r\n resetTime: number;\r\n}\r\n\r\nclass MemoryStore {\r\n private store = new Map<string, SlidingWindowEntry>();\r\n private cleanupInterval: ReturnType<typeof setInterval>;\r\n\r\n constructor(windowMs: number) {\r\n this.cleanupInterval = setInterval(() => {\r\n const now = Date.now();\r\n for (const [key, entry] of this.store) {\r\n if (now >= entry.resetTime) this.store.delete(key);\r\n }\r\n }, windowMs);\r\n if (this.cleanupInterval.unref) this.cleanupInterval.unref();\r\n }\r\n\r\n increment(key: string, windowMs: number): { totalHits: number; resetTime: Date } {\r\n const now = Date.now();\r\n const entry = this.store.get(key);\r\n\r\n if (!entry || now >= entry.resetTime) {\r\n const resetTime = now + windowMs;\r\n this.store.set(key, { count: 1, resetTime });\r\n return { totalHits: 1, resetTime: new Date(resetTime) };\r\n }\r\n\r\n entry.count++;\r\n return { totalHits: entry.count, resetTime: new Date(entry.resetTime) };\r\n }\r\n\r\n decrement(key: string): void {\r\n const entry = this.store.get(key);\r\n if (entry && entry.count > 0) entry.count--;\r\n }\r\n\r\n resetKey(key: string): void {\r\n this.store.delete(key);\r\n }\r\n\r\n destroy(): void {\r\n clearInterval(this.cleanupInterval);\r\n this.store.clear();\r\n }\r\n}\r\n\r\nexport function RateLimitPlugin(options: RateLimitOptions = {}): PluginHandler {\r\n const {\r\n windowMs = 60_000,\r\n max = 100,\r\n message = { error: { statusCode: 429, message: \"Too many requests, please try again later\" } },\r\n statusCode = 429,\r\n keyGenerator = (req: AzuraRequest) => req.ip,\r\n skipSuccessfulRequests = false,\r\n skipFailedRequests = false,\r\n } = options;\r\n\r\n const memStore = new MemoryStore(windowMs);\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n const key = keyGenerator(req);\r\n const { totalHits, resetTime } = memStore.increment(key, windowMs);\r\n\r\n res.setHeader(\"X-RateLimit-Limit\", String(max));\r\n res.setHeader(\"X-RateLimit-Remaining\", String(Math.max(0, max - totalHits)));\r\n res.setHeader(\"X-RateLimit-Reset\", String(Math.ceil(resetTime.getTime() / 1000)));\r\n\r\n if (totalHits > max) {\r\n res.setHeader(\"Retry-After\", String(Math.ceil(windowMs / 1000)));\r\n res.statusCode = statusCode;\r\n const body = typeof message === \"string\" ? message : JSON.stringify(message);\r\n res.setHeader(\"Content-Type\", typeof message === \"string\" ? \"text/plain\" : \"application/json\");\r\n res.end(body);\r\n return;\r\n }\r\n\r\n const origEnd = res.end;\r\n res.end = function (...args: any[]) {\r\n if (skipSuccessfulRequests && res.statusCode < 400) {\r\n memStore.decrement(key);\r\n }\r\n if (skipFailedRequests && res.statusCode >= 400) {\r\n memStore.decrement(key);\r\n }\r\n return (origEnd as any).apply(this, args);\r\n };\r\n\r\n next();\r\n };\r\n}\r\n","import type { HelmetOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nexport function HelmetPlugin(options: HelmetOptions = {}): PluginHandler {\r\n const headers: [string, string][] = [];\r\n\r\n if (options.noSniff !== false) {\r\n headers.push([\"X-Content-Type-Options\", \"nosniff\"]);\r\n }\r\n\r\n if (options.xssFilter !== false) {\r\n headers.push([\"X-XSS-Protection\", \"0\"]);\r\n }\r\n\r\n if (options.ieNoOpen !== false) {\r\n headers.push([\"X-Download-Options\", \"noopen\"]);\r\n }\r\n\r\n const frameguard = options.frameguard ?? true;\r\n if (frameguard !== false) {\r\n const action = typeof frameguard === \"object\" ? frameguard.action : \"sameorigin\";\r\n headers.push([\"X-Frame-Options\", action.toUpperCase()]);\r\n }\r\n\r\n if (options.dnsPrefetchControl !== false) {\r\n const allow = typeof options.dnsPrefetchControl === \"object\"\r\n ? options.dnsPrefetchControl.allow\r\n : false;\r\n headers.push([\"X-DNS-Prefetch-Control\", allow ? \"on\" : \"off\"]);\r\n }\r\n\r\n const hsts = options.hsts ?? true;\r\n if (hsts !== false) {\r\n const maxAge = typeof hsts === \"object\" ? hsts.maxAge : 15552000;\r\n const includeSubDomains = typeof hsts === \"object\" ? hsts.includeSubDomains !== false : true;\r\n const preload = typeof hsts === \"object\" ? hsts.preload : false;\r\n let value = `max-age=${maxAge}`;\r\n if (includeSubDomains) value += \"; includeSubDomains\";\r\n if (preload) value += \"; preload\";\r\n headers.push([\"Strict-Transport-Security\", value]);\r\n }\r\n\r\n if (options.crossOriginEmbedderPolicy !== false) {\r\n headers.push([\"Cross-Origin-Embedder-Policy\", \"require-corp\"]);\r\n }\r\n\r\n if (options.crossOriginOpenerPolicy !== false) {\r\n const policy = typeof options.crossOriginOpenerPolicy === \"object\"\r\n ? options.crossOriginOpenerPolicy.policy\r\n : \"same-origin\";\r\n headers.push([\"Cross-Origin-Opener-Policy\", policy]);\r\n }\r\n\r\n if (options.crossOriginResourcePolicy !== false) {\r\n const policy = typeof options.crossOriginResourcePolicy === \"object\"\r\n ? options.crossOriginResourcePolicy.policy\r\n : \"same-origin\";\r\n headers.push([\"Cross-Origin-Resource-Policy\", policy]);\r\n }\r\n\r\n const referrer = options.referrerPolicy ?? true;\r\n if (referrer !== false) {\r\n const policy = typeof referrer === \"object\"\r\n ? (Array.isArray(referrer.policy) ? referrer.policy.join(\", \") : referrer.policy)\r\n : \"no-referrer\";\r\n headers.push([\"Referrer-Policy\", policy]);\r\n }\r\n\r\n if (options.contentSecurityPolicy !== false && options.contentSecurityPolicy) {\r\n const csp = options.contentSecurityPolicy;\r\n const directives = Object.entries(csp)\r\n .map(([key, values]) => `${key} ${values.join(\" \")}`)\r\n .join(\"; \");\r\n headers.push([\"Content-Security-Policy\", directives]);\r\n }\r\n\r\n if (options.permissionsPolicy) {\r\n const pp = Object.entries(options.permissionsPolicy)\r\n .map(([key, values]) => `${key}=(${values.join(\" \")})`)\r\n .join(\", \");\r\n headers.push([\"Permissions-Policy\", pp]);\r\n }\r\n\r\n return (ctx, next) => {\r\n for (const [name, value] of headers) {\r\n ctx.res.setHeader(name, value);\r\n }\r\n next();\r\n };\r\n}\r\n","import { createHmac } from \"node:crypto\";\r\nimport type { JWTOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\nimport type { AzuraRequest } from \"../types/common.type.js\";\r\n\r\nfunction base64urlEncode(data: string | Buffer): string {\r\n const buf = typeof data === \"string\" ? Buffer.from(data) : data;\r\n return buf.toString(\"base64url\");\r\n}\r\n\r\nfunction base64urlDecode(str: string): string {\r\n return Buffer.from(str, \"base64url\").toString(\"utf-8\");\r\n}\r\n\r\nconst ALGO_MAP: Record<string, string> = {\r\n HS256: \"sha256\",\r\n HS384: \"sha384\",\r\n HS512: \"sha512\",\r\n};\r\n\r\nexport interface JWTPayload {\r\n [key: string]: any;\r\n iat?: number;\r\n exp?: number;\r\n iss?: string;\r\n aud?: string;\r\n sub?: string;\r\n}\r\n\r\nexport function signJWT(payload: JWTPayload, secret: string, options: { algorithm?: string; expiresIn?: string | number } = {}): string {\r\n const algorithm = options.algorithm ?? \"HS256\";\r\n const header = base64urlEncode(JSON.stringify({ alg: algorithm, typ: \"JWT\" }));\r\n\r\n const now = Math.floor(Date.now() / 1000);\r\n const body: JWTPayload = { ...payload, iat: now };\r\n\r\n if (options.expiresIn) {\r\n body.exp = now + parseExpiration(options.expiresIn);\r\n }\r\n\r\n const encodedPayload = base64urlEncode(JSON.stringify(body));\r\n const signature = createHmac(ALGO_MAP[algorithm] ?? \"sha256\", secret)\r\n .update(`${header}.${encodedPayload}`)\r\n .digest(\"base64url\");\r\n\r\n return `${header}.${encodedPayload}.${signature}`;\r\n}\r\n\r\nexport function verifyJWT(token: string, secret: string, options: { algorithm?: string } = {}): JWTPayload {\r\n const parts = token.split(\".\");\r\n if (parts.length !== 3) throw new Error(\"Invalid token format\");\r\n\r\n const [header, payload, signature] = parts;\r\n const algorithm = options.algorithm ?? \"HS256\";\r\n\r\n const expectedSig = createHmac(ALGO_MAP[algorithm] ?? \"sha256\", secret)\r\n .update(`${header}.${payload}`)\r\n .digest(\"base64url\");\r\n\r\n if (signature !== expectedSig) throw new Error(\"Invalid token signature\");\r\n\r\n const decoded = JSON.parse(base64urlDecode(payload)) as JWTPayload;\r\n\r\n if (decoded.exp && decoded.exp < Math.floor(Date.now() / 1000)) {\r\n throw new Error(\"Token expired\");\r\n }\r\n\r\n return decoded;\r\n}\r\n\r\nfunction parseExpiration(exp: string | number): number {\r\n if (typeof exp === \"number\") return exp;\r\n const match = exp.match(/^(\\d+)(s|m|h|d)$/);\r\n if (!match) return 3600;\r\n const val = parseInt(match[1], 10);\r\n switch (match[2]) {\r\n case \"s\": return val;\r\n case \"m\": return val * 60;\r\n case \"h\": return val * 3600;\r\n case \"d\": return val * 86400;\r\n default: return 3600;\r\n }\r\n}\r\n\r\nfunction extractToken(req: AzuraRequest): string | null {\r\n const auth = req.headers.authorization;\r\n if (auth?.startsWith(\"Bearer \")) return auth.slice(7);\r\n return (req.query.token as string) ?? req.cookies?.token ?? null;\r\n}\r\n\r\nexport function JWTPlugin(options: JWTOptions): PluginHandler {\r\n const {\r\n secret,\r\n algorithm = \"HS256\",\r\n paths = [],\r\n exclude = [],\r\n getToken,\r\n } = options;\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n const path = req.pathname;\r\n\r\n if (exclude.some((p) => path.startsWith(p))) {\r\n next();\r\n return;\r\n }\r\n\r\n if (paths.length > 0 && !paths.some((p) => path.startsWith(p))) {\r\n next();\r\n return;\r\n }\r\n\r\n const token = getToken ? getToken(req) : extractToken(req);\r\n\r\n if (!token) {\r\n res.statusCode = 401;\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.end(JSON.stringify({ error: { statusCode: 401, message: \"No token provided\" } }));\r\n return;\r\n }\r\n\r\n try {\r\n const payload = verifyJWT(token, secret, { algorithm });\r\n req.user = payload;\r\n next();\r\n } catch (err: any) {\r\n res.statusCode = 401;\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.end(JSON.stringify({ error: { statusCode: 401, message: err.message ?? \"Invalid token\" } }));\r\n }\r\n };\r\n}\r\n","import { randomBytes } from \"node:crypto\";\r\nimport type { SessionOptions, PluginHandler, SessionStore } from \"../types/plugins/plugin.type.js\";\r\n\r\nclass MemorySessionStore implements SessionStore {\r\n private sessions = new Map<string, { data: Record<string, any>; expires: number }>();\r\n private cleanupTimer: ReturnType<typeof setInterval>;\r\n\r\n constructor() {\r\n this.cleanupTimer = setInterval(() => {\r\n const now = Date.now();\r\n for (const [id, session] of this.sessions) {\r\n if (now >= session.expires) this.sessions.delete(id);\r\n }\r\n }, 60_000);\r\n if (this.cleanupTimer.unref) this.cleanupTimer.unref();\r\n }\r\n\r\n async get(id: string): Promise<Record<string, any> | null> {\r\n const session = this.sessions.get(id);\r\n if (!session) return null;\r\n if (Date.now() >= session.expires) {\r\n this.sessions.delete(id);\r\n return null;\r\n }\r\n return session.data;\r\n }\r\n\r\n async set(id: string, data: Record<string, any>, maxAge: number): Promise<void> {\r\n this.sessions.set(id, { data, expires: Date.now() + maxAge });\r\n }\r\n\r\n async destroy(id: string): Promise<void> {\r\n this.sessions.delete(id);\r\n }\r\n\r\n async touch(id: string, maxAge: number): Promise<void> {\r\n const session = this.sessions.get(id);\r\n if (session) session.expires = Date.now() + maxAge;\r\n }\r\n}\r\n\r\nfunction generateSessionId(): string {\r\n return randomBytes(24).toString(\"hex\");\r\n}\r\n\r\nexport function SessionPlugin(options: SessionOptions): PluginHandler {\r\n const {\r\n secret: _secret,\r\n name = \"azura.sid\",\r\n maxAge = 86400_000,\r\n secure = false,\r\n httpOnly = true,\r\n sameSite = \"Lax\",\r\n store = new MemorySessionStore(),\r\n } = options;\r\n\r\n return async (ctx, next) => {\r\n const { req, res } = ctx;\r\n\r\n let sessionId = req.cookies[name];\r\n let sessionData: Record<string, any> | null = null;\r\n\r\n if (sessionId) {\r\n sessionData = await store.get(sessionId);\r\n }\r\n\r\n if (!sessionData) {\r\n sessionId = generateSessionId();\r\n sessionData = {};\r\n }\r\n\r\n req.session = sessionData;\r\n\r\n const originalEnd = res.end;\r\n (res as any).end = async function (...args: any[]) {\r\n await store.set(sessionId!, req.session ?? {}, maxAge);\r\n\r\n const cookieParts = [\r\n `${name}=${sessionId}`,\r\n `Path=/`,\r\n `Max-Age=${Math.floor(maxAge / 1000)}`,\r\n `SameSite=${sameSite}`,\r\n ];\r\n if (httpOnly) cookieParts.push(\"HttpOnly\");\r\n if (secure) cookieParts.push(\"Secure\");\r\n\r\n const existing = res.getHeader(\"Set-Cookie\");\r\n const cookies = existing\r\n ? [...(Array.isArray(existing) ? existing : [String(existing)]), cookieParts.join(\"; \")]\r\n : [cookieParts.join(\"; \")];\r\n res.setHeader(\"Set-Cookie\", cookies);\r\n\r\n return (originalEnd as any).apply(this, args);\r\n };\r\n\r\n next();\r\n };\r\n}\r\n","import { createGzip, createDeflate, type Gzip, type Deflate } from \"node:zlib\";\r\nimport type { CompressionOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nconst COMPRESSIBLE_TYPES = /^text\\/|application\\/json|application\\/javascript|application\\/xml|image\\/svg\\+xml/;\r\n\r\nexport function CompressionPlugin(options: CompressionOptions = {}): PluginHandler {\r\n const {\r\n threshold = 1024,\r\n level = 6,\r\n algorithms = [\"gzip\", \"deflate\"],\r\n filter,\r\n } = options;\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n\r\n if (filter && !filter(req as any, res as any)) {\r\n next();\r\n return;\r\n }\r\n\r\n const acceptEncoding = req.headers[\"accept-encoding\"] ?? \"\";\r\n let encoding: string | null = null;\r\n\r\n for (const algo of algorithms) {\r\n if (typeof acceptEncoding === \"string\" && acceptEncoding.includes(algo)) {\r\n encoding = algo;\r\n break;\r\n }\r\n }\r\n\r\n if (!encoding) {\r\n next();\r\n return;\r\n }\r\n\r\n const originalEnd = res.end;\r\n const originalWrite = res.write;\r\n\r\n (res as any).end = function (chunk?: any, encodingArg?: any, callback?: any) {\r\n if (!chunk || (typeof chunk !== \"string\" && !Buffer.isBuffer(chunk))) {\r\n return (originalEnd as any).call(this, chunk, encodingArg, callback);\r\n }\r\n\r\n const buf = typeof chunk === \"string\" ? Buffer.from(chunk) : chunk;\r\n\r\n if (buf.length < threshold) {\r\n return (originalEnd as any).call(this, chunk, encodingArg, callback);\r\n }\r\n\r\n const contentType = String(res.getHeader(\"Content-Type\") ?? \"\");\r\n if (!COMPRESSIBLE_TYPES.test(contentType)) {\r\n return (originalEnd as any).call(this, chunk, encodingArg, callback);\r\n }\r\n\r\n res.removeHeader(\"Content-Length\");\r\n res.setHeader(\"Content-Encoding\", encoding!);\r\n res.setHeader(\"Vary\", \"Accept-Encoding\");\r\n\r\n let stream: Gzip | Deflate;\r\n if (encoding === \"gzip\") {\r\n stream = createGzip({ level });\r\n } else {\r\n stream = createDeflate({ level });\r\n }\r\n\r\n const chunks: Buffer[] = [];\r\n stream.on(\"data\", (c: Buffer) => chunks.push(c));\r\n stream.on(\"end\", () => {\r\n const compressed = Buffer.concat(chunks);\r\n res.setHeader(\"Content-Length\", compressed.length);\r\n (originalEnd as any).call(res, compressed);\r\n });\r\n\r\n stream.end(buf);\r\n };\r\n\r\n next();\r\n };\r\n}\r\n","import { createReadStream, statSync, existsSync } from \"node:fs\";\r\nimport { join, extname, resolve } from \"node:path\";\r\nimport type { StaticOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nconst MIME_TYPES: Record<string, string> = {\r\n \".html\": \"text/html; charset=utf-8\",\r\n \".htm\": \"text/html; charset=utf-8\",\r\n \".css\": \"text/css; charset=utf-8\",\r\n \".js\": \"application/javascript; charset=utf-8\",\r\n \".mjs\": \"application/javascript; charset=utf-8\",\r\n \".json\": \"application/json; charset=utf-8\",\r\n \".xml\": \"application/xml; charset=utf-8\",\r\n \".txt\": \"text/plain; charset=utf-8\",\r\n \".csv\": \"text/csv; charset=utf-8\",\r\n \".png\": \"image/png\",\r\n \".jpg\": \"image/jpeg\",\r\n \".jpeg\": \"image/jpeg\",\r\n \".gif\": \"image/gif\",\r\n \".svg\": \"image/svg+xml\",\r\n \".ico\": \"image/x-icon\",\r\n \".webp\": \"image/webp\",\r\n \".avif\": \"image/avif\",\r\n \".woff\": \"font/woff\",\r\n \".woff2\": \"font/woff2\",\r\n \".ttf\": \"font/ttf\",\r\n \".otf\": \"font/otf\",\r\n \".eot\": \"application/vnd.ms-fontobject\",\r\n \".mp4\": \"video/mp4\",\r\n \".webm\": \"video/webm\",\r\n \".mp3\": \"audio/mpeg\",\r\n \".ogg\": \"audio/ogg\",\r\n \".wav\": \"audio/wav\",\r\n \".pdf\": \"application/pdf\",\r\n \".zip\": \"application/zip\",\r\n \".gz\": \"application/gzip\",\r\n \".wasm\": \"application/wasm\",\r\n \".map\": \"application/json\",\r\n};\r\n\r\nexport function StaticPlugin(options: StaticOptions): PluginHandler {\r\n const {\r\n root,\r\n prefix = \"/\",\r\n index = [\"index.html\"],\r\n dotfiles = \"ignore\",\r\n maxAge = 0,\r\n etag = true,\r\n lastModified = true,\r\n fallthrough = true,\r\n immutable = false,\r\n } = options;\r\n\r\n const resolvedRoot = resolve(root);\r\n const indexFiles = Array.isArray(index) ? index : [index];\r\n const normalizedPrefix = prefix.endsWith(\"/\") ? prefix.slice(0, -1) : prefix;\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n\r\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\r\n next();\r\n return;\r\n }\r\n\r\n const path = req.pathname;\r\n if (!path.startsWith(normalizedPrefix)) {\r\n next();\r\n return;\r\n }\r\n\r\n const relativePath = path.slice(normalizedPrefix.length) || \"/\";\r\n\r\n if (relativePath.includes(\"..\")) {\r\n next();\r\n return;\r\n }\r\n\r\n if (dotfiles !== \"allow\" && relativePath.split(\"/\").some((s) => s.startsWith(\".\"))) {\r\n if (dotfiles === \"deny\") {\r\n res.statusCode = 403;\r\n res.end(\"Forbidden\");\r\n return;\r\n }\r\n next();\r\n return;\r\n }\r\n\r\n let filePath = join(resolvedRoot, relativePath);\r\n\r\n if (!existsSync(filePath)) {\r\n if (fallthrough) { next(); return; }\r\n res.statusCode = 404;\r\n res.end(\"Not Found\");\r\n return;\r\n }\r\n\r\n let stat = statSync(filePath);\r\n\r\n if (stat.isDirectory()) {\r\n let found = false;\r\n for (const idx of indexFiles) {\r\n const candidate = join(filePath, idx);\r\n if (existsSync(candidate)) {\r\n filePath = candidate;\r\n stat = statSync(filePath);\r\n found = true;\r\n break;\r\n }\r\n }\r\n if (!found) {\r\n if (fallthrough) { next(); return; }\r\n res.statusCode = 404;\r\n res.end(\"Not Found\");\r\n return;\r\n }\r\n }\r\n\r\n const ext = extname(filePath).toLowerCase();\r\n const contentType = MIME_TYPES[ext] ?? \"application/octet-stream\";\r\n\r\n res.setHeader(\"Content-Type\", contentType);\r\n res.setHeader(\"Content-Length\", stat.size);\r\n\r\n if (lastModified) {\r\n res.setHeader(\"Last-Modified\", stat.mtime.toUTCString());\r\n }\r\n\r\n if (etag) {\r\n const etagValue = `W/\"${stat.size.toString(16)}-${stat.mtime.getTime().toString(16)}\"`;\r\n res.setHeader(\"ETag\", etagValue);\r\n\r\n const ifNoneMatch = req.headers[\"if-none-match\"];\r\n if (ifNoneMatch === etagValue) {\r\n res.statusCode = 304;\r\n res.end();\r\n return;\r\n }\r\n }\r\n\r\n let cacheControl = `public, max-age=${maxAge}`;\r\n if (immutable) cacheControl += \", immutable\";\r\n res.setHeader(\"Cache-Control\", cacheControl);\r\n\r\n if (req.method === \"HEAD\") {\r\n res.end();\r\n return;\r\n }\r\n\r\n const stream = createReadStream(filePath);\r\n stream.pipe(res);\r\n };\r\n}\r\n","import { createHash } from \"node:crypto\";\r\nimport type { ETagOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nexport function ETagPlugin(options: ETagOptions = {}): PluginHandler {\r\n const { weak = true } = options;\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n\r\n const originalEnd = res.end;\r\n (res as any).end = function (chunk?: any, encoding?: any, callback?: any) {\r\n if (chunk && (typeof chunk === \"string\" || Buffer.isBuffer(chunk)) && res.statusCode === 200) {\r\n const buf = typeof chunk === \"string\" ? Buffer.from(chunk) : chunk;\r\n const hash = createHash(\"md5\").update(buf).digest(\"hex\").slice(0, 16);\r\n const etag = weak ? `W/\"${hash}\"` : `\"${hash}\"`;\r\n\r\n res.setHeader(\"ETag\", etag);\r\n\r\n const ifNoneMatch = req.headers[\"if-none-match\"];\r\n if (ifNoneMatch === etag) {\r\n res.statusCode = 304;\r\n return (originalEnd as any).call(this);\r\n }\r\n }\r\n\r\n return (originalEnd as any).call(this, chunk, encoding, callback);\r\n };\r\n\r\n next();\r\n };\r\n}\r\n","import { randomUUID } from \"node:crypto\";\r\nimport type { RequestIdOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nexport function RequestIdPlugin(options: RequestIdOptions = {}): PluginHandler {\r\n const {\r\n header = \"X-Request-Id\",\r\n generator = randomUUID,\r\n } = options;\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n\r\n const existingId = req.headers[header.toLowerCase()] as string | undefined;\r\n const requestId = existingId ?? generator();\r\n\r\n req.requestId = requestId;\r\n res.setHeader(header, requestId);\r\n\r\n next();\r\n };\r\n}\r\n","import type { TimeoutOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nexport function TimeoutPlugin(options: TimeoutOptions): PluginHandler {\r\n const {\r\n timeout,\r\n message = { error: { statusCode: 408, message: \"Request Timeout\" } },\r\n statusCode = 408,\r\n } = options;\r\n\r\n return (ctx, next) => {\r\n const { res } = ctx;\r\n let timedOut = false;\r\n\r\n const timer = setTimeout(() => {\r\n timedOut = true;\r\n if (!res.headersSent) {\r\n res.statusCode = statusCode;\r\n res.setHeader(\"Content-Type\", typeof message === \"string\" ? \"text/plain\" : \"application/json\");\r\n res.end(typeof message === \"string\" ? message : JSON.stringify(message));\r\n }\r\n }, timeout);\r\n\r\n const originalEnd = res.end;\r\n (res as any).end = function (...args: any[]) {\r\n clearTimeout(timer);\r\n if (!timedOut) {\r\n return (originalEnd as any).apply(this, args);\r\n }\r\n };\r\n\r\n next();\r\n };\r\n}\r\n","import type { HealthCheckOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nexport function HealthCheckPlugin(options: HealthCheckOptions = {}): PluginHandler {\r\n const {\r\n path = \"/health\",\r\n checks = {},\r\n timeout: checkTimeout = 5000,\r\n } = options;\r\n\r\n return async (ctx, next) => {\r\n const { req, res } = ctx;\r\n\r\n if (req.pathname !== path) {\r\n next();\r\n return;\r\n }\r\n\r\n const results: Record<string, { status: string; duration: number }> = {};\r\n let allHealthy = true;\r\n\r\n for (const [name, check] of Object.entries(checks)) {\r\n const start = Date.now();\r\n try {\r\n const result = await Promise.race([\r\n Promise.resolve(check()),\r\n new Promise<boolean>((_, reject) =>\r\n setTimeout(() => reject(new Error(\"timeout\")), checkTimeout),\r\n ),\r\n ]);\r\n results[name] = {\r\n status: result ? \"healthy\" : \"unhealthy\",\r\n duration: Date.now() - start,\r\n };\r\n if (!result) allHealthy = false;\r\n } catch {\r\n results[name] = {\r\n status: \"unhealthy\",\r\n duration: Date.now() - start,\r\n };\r\n allHealthy = false;\r\n }\r\n }\r\n\r\n const body = JSON.stringify({\r\n status: allHealthy ? \"healthy\" : \"unhealthy\",\r\n timestamp: new Date().toISOString(),\r\n uptime: process.uptime(),\r\n memory: process.memoryUsage(),\r\n checks: results,\r\n });\r\n\r\n res.statusCode = allHealthy ? 200 : 503;\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.setHeader(\"Cache-Control\", \"no-cache, no-store\");\r\n res.end(body);\r\n };\r\n}\r\n","import type { CircuitBreakerOptions, CircuitBreakerState, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nexport function CircuitBreakerPlugin(options: CircuitBreakerOptions = {}): PluginHandler {\r\n const {\r\n threshold = 5,\r\n timeout: breakerTimeout = 30_000,\r\n resetTimeout = 60_000,\r\n halfOpenRequests = 1,\r\n monitor,\r\n } = options;\r\n\r\n let state: CircuitBreakerState = \"CLOSED\";\r\n let failures = 0;\r\n let successes = 0;\r\n let lastFailureTime = 0;\r\n let halfOpenCount = 0;\r\n\r\n const transition = (newState: CircuitBreakerState) => {\r\n if (state !== newState) {\r\n state = newState;\r\n monitor?.(state);\r\n }\r\n };\r\n\r\n return (ctx, next) => {\r\n const { res } = ctx;\r\n\r\n if (state === \"OPEN\") {\r\n if (Date.now() - lastFailureTime >= resetTimeout) {\r\n transition(\"HALF_OPEN\");\r\n halfOpenCount = 0;\r\n } else {\r\n res.statusCode = 503;\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.setHeader(\"Retry-After\", String(Math.ceil(resetTimeout / 1000)));\r\n res.end(\r\n JSON.stringify({\r\n error: { statusCode: 503, message: \"Service temporarily unavailable (circuit open)\" },\r\n }),\r\n );\r\n return;\r\n }\r\n }\r\n\r\n if (state === \"HALF_OPEN\" && halfOpenCount >= halfOpenRequests) {\r\n res.statusCode = 503;\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.end(\r\n JSON.stringify({\r\n error: { statusCode: 503, message: \"Service temporarily unavailable (circuit half-open)\" },\r\n }),\r\n );\r\n return;\r\n }\r\n\r\n if (state === \"HALF_OPEN\") halfOpenCount++;\r\n\r\n const originalEnd = res.end;\r\n (res as any).end = function (...args: any[]) {\r\n if (res.statusCode >= 500) {\r\n failures++;\r\n lastFailureTime = Date.now();\r\n if (state === \"HALF_OPEN\" || failures >= threshold) {\r\n transition(\"OPEN\");\r\n }\r\n } else {\r\n if (state === \"HALF_OPEN\") {\r\n successes++;\r\n if (successes >= halfOpenRequests) {\r\n failures = 0;\r\n successes = 0;\r\n transition(\"CLOSED\");\r\n }\r\n } else {\r\n failures = Math.max(0, failures - 1);\r\n }\r\n }\r\n\r\n return (originalEnd as any).apply(this, args);\r\n };\r\n\r\n next();\r\n };\r\n}\r\n","import type { SSEOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\nimport type { AzuraResponse } from \"../types/common.type.js\";\r\n\r\nexport interface SSEClient {\r\n id: string;\r\n res: AzuraResponse;\r\n send(event: string, data: any, id?: string): void;\r\n close(): void;\r\n}\r\n\r\nexport class SSEManager {\r\n private clients = new Map<string, SSEClient>();\r\n private clientCounter = 0;\r\n\r\n addClient(res: AzuraResponse): SSEClient {\r\n const id = `sse-${++this.clientCounter}-${Date.now()}`;\r\n\r\n res.setHeader(\"Content-Type\", \"text/event-stream\");\r\n res.setHeader(\"Cache-Control\", \"no-cache\");\r\n res.setHeader(\"Connection\", \"keep-alive\");\r\n res.setHeader(\"X-Accel-Buffering\", \"no\");\r\n res.statusCode = 200;\r\n res.flushHeaders();\r\n\r\n const client: SSEClient = {\r\n id,\r\n res,\r\n send(event: string, data: any, eventId?: string) {\r\n const serialized = typeof data === \"string\" ? data : JSON.stringify(data);\r\n let message = \"\";\r\n if (eventId) message += `id: ${eventId}\\n`;\r\n message += `event: ${event}\\n`;\r\n message += `data: ${serialized}\\n\\n`;\r\n res.write(message);\r\n },\r\n close() {\r\n res.end();\r\n },\r\n };\r\n\r\n this.clients.set(id, client);\r\n\r\n res.on(\"close\", () => {\r\n this.clients.delete(id);\r\n });\r\n\r\n return client;\r\n }\r\n\r\n broadcast(event: string, data: any, id?: string): void {\r\n for (const client of this.clients.values()) {\r\n client.send(event, data, id);\r\n }\r\n }\r\n\r\n getClient(id: string): SSEClient | undefined {\r\n return this.clients.get(id);\r\n }\r\n\r\n getClientCount(): number {\r\n return this.clients.size;\r\n }\r\n\r\n closeAll(): void {\r\n for (const client of this.clients.values()) {\r\n client.close();\r\n }\r\n this.clients.clear();\r\n }\r\n}\r\n\r\nexport function SSEPlugin(options: SSEOptions): PluginHandler {\r\n const {\r\n path,\r\n heartbeatInterval = 30_000,\r\n retry = 3000,\r\n maxClients = 1000,\r\n } = options;\r\n\r\n const manager = new SSEManager();\r\n\r\n let heartbeat: ReturnType<typeof setInterval> | null = null;\r\n if (heartbeatInterval > 0) {\r\n heartbeat = setInterval(() => {\r\n manager.broadcast(\"heartbeat\", { time: Date.now() });\r\n }, heartbeatInterval);\r\n if (heartbeat.unref) heartbeat.unref();\r\n }\r\n\r\n const plugin: PluginHandler & { manager: SSEManager } = Object.assign(\r\n (ctx: any, next: any) => {\r\n const { req, res } = ctx;\r\n\r\n if (req.pathname !== path || req.method !== \"GET\") {\r\n next();\r\n return;\r\n }\r\n\r\n if (manager.getClientCount() >= maxClients) {\r\n res.statusCode = 503;\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.end(JSON.stringify({ error: { statusCode: 503, message: \"Too many SSE connections\" } }));\r\n return;\r\n }\r\n\r\n const client = manager.addClient(res as any);\r\n res.write(`retry: ${retry}\\n\\n`);\r\n client.send(\"connected\", { clientId: client.id });\r\n },\r\n { manager },\r\n );\r\n\r\n return plugin;\r\n}\r\n","import { request as httpRequest } from \"node:http\";\r\nimport { request as httpsRequest } from \"node:https\";\r\nimport { URL } from \"node:url\";\r\nimport type { ProxyOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nexport function ProxyPlugin(options: ProxyOptions): PluginHandler {\r\n const {\r\n target,\r\n pathRewrite = {},\r\n changeOrigin = true,\r\n timeout = 30_000,\r\n headers: extraHeaders = {},\r\n onProxyReq,\r\n onProxyRes,\r\n } = options;\r\n\r\n const targetUrl = new URL(target);\r\n const isHttps = targetUrl.protocol === \"https:\";\r\n const requestFn = isHttps ? httpsRequest : httpRequest;\r\n\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n\r\n let targetPath = req.pathname;\r\n for (const [from, to] of Object.entries(pathRewrite)) {\r\n targetPath = targetPath.replace(new RegExp(from), to);\r\n }\r\n\r\n const search = req.url?.includes(\"?\") ? req.url.slice(req.url.indexOf(\"?\")) : \"\";\r\n const fullPath = targetPath + search;\r\n\r\n const proxyHeaders: Record<string, string> = {};\r\n for (const [key, val] of Object.entries(req.headers)) {\r\n if (val) proxyHeaders[key] = Array.isArray(val) ? val.join(\", \") : val;\r\n }\r\n\r\n if (changeOrigin) {\r\n proxyHeaders.host = targetUrl.host;\r\n }\r\n\r\n Object.assign(proxyHeaders, extraHeaders);\r\n\r\n const proxyReq = requestFn(\r\n {\r\n hostname: targetUrl.hostname,\r\n port: targetUrl.port || (isHttps ? 443 : 80),\r\n path: fullPath,\r\n method: req.method,\r\n headers: proxyHeaders,\r\n timeout,\r\n },\r\n (proxyRes) => {\r\n onProxyRes?.(proxyRes, res as any);\r\n\r\n res.statusCode = proxyRes.statusCode ?? 502;\r\n for (const [key, val] of Object.entries(proxyRes.headers)) {\r\n if (val) res.setHeader(key, val);\r\n }\r\n\r\n proxyRes.pipe(res);\r\n },\r\n );\r\n\r\n proxyReq.on(\"error\", (err) => {\r\n if (!res.headersSent) {\r\n res.statusCode = 502;\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.end(JSON.stringify({ error: { statusCode: 502, message: \"Bad Gateway\", details: err.message } }));\r\n }\r\n });\r\n\r\n proxyReq.on(\"timeout\", () => {\r\n proxyReq.destroy();\r\n if (!res.headersSent) {\r\n res.statusCode = 504;\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.end(JSON.stringify({ error: { statusCode: 504, message: \"Gateway Timeout\" } }));\r\n }\r\n });\r\n\r\n onProxyReq?.(proxyReq, req as any);\r\n\r\n if (req.method !== \"GET\" && req.method !== \"HEAD\") {\r\n req.pipe(proxyReq);\r\n } else {\r\n proxyReq.end();\r\n }\r\n };\r\n}\r\n","import { randomBytes } from \"node:crypto\";\r\nimport { writeFileSync, mkdirSync, existsSync } from \"node:fs\";\r\nimport { join } from \"node:path\";\r\nimport type { MultipartOptions, PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nexport interface UploadedFile {\r\n fieldname: string;\r\n filename: string;\r\n mimetype: string;\r\n size: number;\r\n buffer: Buffer;\r\n path?: string;\r\n}\r\n\r\nexport function MultipartPlugin(options: MultipartOptions = {}): PluginHandler {\r\n const {\r\n maxFileSize = 10 * 1024 * 1024,\r\n maxFiles = 10,\r\n maxFieldSize = 1024 * 1024,\r\n maxFields = 50,\r\n allowedMimeTypes,\r\n uploadDir,\r\n } = options;\r\n\r\n if (uploadDir && !existsSync(uploadDir)) {\r\n mkdirSync(uploadDir, { recursive: true });\r\n }\r\n\r\n return async (ctx, next) => {\r\n const { req } = ctx;\r\n const contentType = req.headers[\"content-type\"] ?? \"\";\r\n\r\n if (!contentType.startsWith(\"multipart/form-data\")) {\r\n next();\r\n return;\r\n }\r\n\r\n const boundaryMatch = contentType.match(/boundary=([^\\s;]+)/);\r\n if (!boundaryMatch) {\r\n next();\r\n return;\r\n }\r\n\r\n const boundary = boundaryMatch[1];\r\n\r\n try {\r\n const { fields, files } = await parseMultipart(req as any, boundary, {\r\n maxFileSize,\r\n maxFiles,\r\n maxFieldSize,\r\n maxFields,\r\n allowedMimeTypes,\r\n });\r\n\r\n if (uploadDir) {\r\n for (const file of files) {\r\n const ext = file.filename.includes(\".\")\r\n ? file.filename.slice(file.filename.lastIndexOf(\".\"))\r\n : \"\";\r\n const savedName = `${randomBytes(16).toString(\"hex\")}${ext}`;\r\n const savePath = join(uploadDir, savedName);\r\n writeFileSync(savePath, file.buffer);\r\n file.path = savePath;\r\n }\r\n }\r\n\r\n (req as any).files = files;\r\n (req as any).body = { ...((req as any).body ?? {}), ...fields };\r\n\r\n next();\r\n } catch (err: any) {\r\n const { res } = ctx;\r\n res.statusCode = 400;\r\n res.setHeader(\"Content-Type\", \"application/json\");\r\n res.end(JSON.stringify({ error: { statusCode: 400, message: err.message } }));\r\n }\r\n };\r\n}\r\n\r\ninterface ParseOptions {\r\n maxFileSize: number;\r\n maxFiles: number;\r\n maxFieldSize: number;\r\n maxFields: number;\r\n allowedMimeTypes?: string[];\r\n}\r\n\r\nasync function parseMultipart(\r\n req: NodeJS.ReadableStream,\r\n boundary: string,\r\n opts: ParseOptions,\r\n): Promise<{ fields: Record<string, string>; files: UploadedFile[] }> {\r\n const raw = await collectBody(req);\r\n const delimiter = Buffer.from(`--${boundary}`);\r\n const endDelimiter = Buffer.from(`--${boundary}--`);\r\n\r\n const fields: Record<string, string> = {};\r\n const files: UploadedFile[] = [];\r\n let fieldCount = 0;\r\n\r\n let start = bufferIndexOf(raw, delimiter, 0);\r\n if (start === -1) return { fields, files };\r\n start += delimiter.length + 2; // skip delimiter + CRLF\r\n\r\n while (start < raw.length) {\r\n const end = bufferIndexOf(raw, delimiter, start);\r\n if (end === -1) break;\r\n\r\n const part = raw.subarray(start, end - 2); // -2 for trailing CRLF before delimiter\r\n const headerEnd = bufferIndexOf(part, Buffer.from(\"\\r\\n\\r\\n\"), 0);\r\n if (headerEnd === -1) { start = end + delimiter.length + 2; continue; }\r\n\r\n const headerStr = part.subarray(0, headerEnd).toString(\"utf-8\");\r\n const body = part.subarray(headerEnd + 4);\r\n\r\n const nameMatch = headerStr.match(/name=\"([^\"]+)\"/);\r\n const filenameMatch = headerStr.match(/filename=\"([^\"]*)\"/);\r\n const typeMatch = headerStr.match(/Content-Type:\\s*(.+)/i);\r\n\r\n if (filenameMatch && nameMatch) {\r\n if (files.length >= opts.maxFiles) throw new Error(\"Too many files\");\r\n if (body.length > opts.maxFileSize) throw new Error(`File ${filenameMatch[1]} exceeds max size`);\r\n\r\n const mimetype = typeMatch?.[1]?.trim() ?? \"application/octet-stream\";\r\n if (opts.allowedMimeTypes && !opts.allowedMimeTypes.includes(mimetype)) {\r\n throw new Error(`File type ${mimetype} not allowed`);\r\n }\r\n\r\n files.push({\r\n fieldname: nameMatch[1],\r\n filename: filenameMatch[1],\r\n mimetype,\r\n size: body.length,\r\n buffer: Buffer.from(body),\r\n });\r\n } else if (nameMatch) {\r\n if (++fieldCount > opts.maxFields) throw new Error(\"Too many fields\");\r\n if (body.length > opts.maxFieldSize) throw new Error(`Field ${nameMatch[1]} exceeds max size`);\r\n fields[nameMatch[1]] = body.toString(\"utf-8\");\r\n }\r\n\r\n start = end + delimiter.length;\r\n if (bufferIndexOf(raw, endDelimiter, end) === end) break;\r\n start += 2;\r\n }\r\n\r\n return { fields, files };\r\n}\r\n\r\nfunction collectBody(stream: NodeJS.ReadableStream): Promise<Buffer> {\r\n return new Promise((resolve, reject) => {\r\n const chunks: Buffer[] = [];\r\n stream.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\r\n stream.on(\"end\", () => resolve(Buffer.concat(chunks)));\r\n stream.on(\"error\", reject);\r\n });\r\n}\r\n\r\nfunction bufferIndexOf(buf: Buffer, search: Buffer, offset: number): number {\r\n for (let i = offset; i <= buf.length - search.length; i++) {\r\n let found = true;\r\n for (let j = 0; j < search.length; j++) {\r\n if (buf[i + j] !== search[j]) { found = false; break; }\r\n }\r\n if (found) return i;\r\n }\r\n return -1;\r\n}\r\n","/**\n * Gerado por scripts/embed-swagger-ui.mjs a partir de swagger-ui-modern.html.\n * Após editar o HTML, execute: node scripts/embed-swagger-ui.mjs\n */\nexport const SWAGGER_UI_MODERN_HTML: string = \"<!DOCTYPE html>\\n<html lang=\\\"en\\\">\\n\\n<head>\\n <meta charset=\\\"UTF-8\\\" />\\n <meta name=\\\"viewport\\\" content=\\\"width=device-width,initial-scale=1.0\\\" />\\n <title>__PAGE_TITLE__</title>\\n <link rel=\\\"preconnect\\\" href=\\\"https://fonts.googleapis.com\\\" />\\n <link rel=\\\"preconnect\\\" href=\\\"https://fonts.gstatic.com\\\" crossorigin />\\n <link\\n href=\\\"https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500&display=swap\\\"\\n rel=\\\"stylesheet\\\" />\\n <style>\\n :root {\\n --bg-body: #09090b;\\n --bg-sidebar: #18181b;\\n --bg-card: #18181b;\\n --bg-card-hover: #27272a;\\n --bg-input: #09090b;\\n --border-color: #27272a;\\n --primary-color: #6366f1;\\n --primary-hover: #4f46e5;\\n --text-primary: #f4f4f5;\\n --text-secondary: #a1a1aa;\\n --text-muted: #52525b;\\n --success: #22c55e;\\n --warning: #eab308;\\n --danger: #ef4444;\\n --info: #3b82f6;\\n --font-sans: 'Inter', system-ui, -apple-system, sans-serif;\\n --font-mono: 'JetBrains Mono', monospace;\\n }\\n\\n * {\\n margin: 0;\\n padding: 0;\\n box-sizing: border-box\\n }\\n\\n body {\\n font-family: var(--font-sans);\\n background-color: var(--bg-body);\\n color: var(--text-primary);\\n line-height: 1.5;\\n height: 100vh;\\n overflow: hidden\\n }\\n\\n ::-webkit-scrollbar {\\n width: 6px;\\n height: 6px\\n }\\n\\n ::-webkit-scrollbar-track {\\n background: transparent\\n }\\n\\n ::-webkit-scrollbar-thumb {\\n background: var(--border-color);\\n border-radius: 3px\\n }\\n\\n ::-webkit-scrollbar-thumb:hover {\\n background: var(--text-muted)\\n }\\n\\n .layout {\\n display: flex;\\n height: 100%\\n }\\n\\n .sidebar {\\n width: 300px;\\n background: var(--bg-sidebar);\\n border-right: 1px solid var(--border-color);\\n display: flex;\\n flex-direction: column;\\n flex-shrink: 0\\n }\\n\\n .sidebar-header {\\n padding: 20px;\\n border-bottom: 1px solid var(--border-color);\\n background: var(--bg-sidebar)\\n }\\n\\n .api-title {\\n font-size: 1.25rem;\\n font-weight: 700;\\n color: var(--text-primary);\\n margin-bottom: 4px\\n }\\n\\n .api-version {\\n font-size: 0.75rem;\\n color: var(--primary-color);\\n background: rgba(99, 102, 241, 0.1);\\n padding: 2px 8px;\\n border-radius: 12px;\\n font-family: var(--font-mono)\\n }\\n\\n .search-box {\\n padding: 16px\\n }\\n\\n .search-input {\\n width: 100%;\\n background: var(--bg-input);\\n border: 1px solid var(--border-color);\\n padding: 8px 12px;\\n border-radius: 6px;\\n color: var(--text-primary);\\n font-size: 0.875rem;\\n outline: none;\\n transition: border-color 0.2s\\n }\\n\\n .search-input:focus {\\n border-color: var(--primary-color)\\n }\\n\\n .nav-list {\\n flex: 1;\\n overflow-y: auto;\\n padding: 0 16px 20px\\n }\\n\\n .nav-group-title {\\n font-size: 0.75rem;\\n text-transform: uppercase;\\n color: var(--text-muted);\\n font-weight: 600;\\n margin: 24px 0 8px;\\n letter-spacing: 0.05em\\n }\\n\\n .nav-item {\\n display: flex;\\n align-items: center;\\n gap: 8px;\\n padding: 8px;\\n border-radius: 6px;\\n cursor: pointer;\\n transition: background 0.2s;\\n margin-bottom: 2px\\n }\\n\\n .nav-item:hover {\\n background: var(--bg-card-hover)\\n }\\n\\n .nav-item.active {\\n background: rgba(99, 102, 241, 0.1)\\n }\\n\\n .method-tag {\\n font-family: var(--font-mono);\\n font-size: 0.65rem;\\n font-weight: 700;\\n padding: 2px 6px;\\n border-radius: 4px;\\n width: 45px;\\n text-align: center\\n }\\n\\n .get {\\n color: var(--success);\\n background: rgba(34, 197, 94, 0.1)\\n }\\n\\n .post {\\n color: var(--primary-color);\\n background: rgba(99, 102, 241, 0.1)\\n }\\n\\n .put {\\n color: var(--warning);\\n background: rgba(234, 179, 8, 0.1)\\n }\\n\\n .delete {\\n color: var(--danger);\\n background: rgba(239, 68, 68, 0.1)\\n }\\n\\n .patch {\\n color: var(--info);\\n background: rgba(59, 130, 246, 0.1)\\n }\\n\\n .nav-path {\\n font-size: 0.8rem;\\n color: var(--text-secondary);\\n white-space: nowrap;\\n overflow: hidden;\\n text-overflow: ellipsis;\\n font-family: var(--font-mono)\\n }\\n\\n .main-content {\\n flex: 1;\\n overflow-y: auto;\\n padding: 40px;\\n scroll-behavior: smooth\\n }\\n\\n .content-width {\\n max-width: 1000px;\\n margin: 0 auto\\n }\\n\\n .info-section {\\n margin-bottom: 40px\\n }\\n\\n .info-title {\\n font-size: 2.5rem;\\n font-weight: 800;\\n margin-bottom: 16px;\\n letter-spacing: -0.02em\\n }\\n\\n .info-desc {\\n color: var(--text-secondary);\\n font-size: 1.1rem;\\n max-width: 700px\\n }\\n\\n .server-section {\\n background: var(--bg-card);\\n border: 1px solid var(--border-color);\\n padding: 20px;\\n border-radius: 8px;\\n margin-bottom: 40px\\n }\\n\\n .server-label {\\n display: block;\\n font-size: 0.875rem;\\n color: var(--text-muted);\\n margin-bottom: 8px\\n }\\n\\n .server-select {\\n width: 100%;\\n background: var(--bg-input);\\n border: 1px solid var(--border-color);\\n color: var(--text-primary);\\n padding: 10px;\\n border-radius: 6px;\\n font-family: var(--font-mono);\\n font-size: 0.9rem\\n }\\n\\n .endpoint-card {\\n background: var(--bg-card);\\n border: 1px solid var(--border-color);\\n border-radius: 8px;\\n margin-bottom: 24px;\\n overflow: hidden;\\n transition: border-color 0.2s\\n }\\n\\n .endpoint-card:hover {\\n border-color: var(--text-muted)\\n }\\n\\n .card-header {\\n padding: 16px 24px;\\n display: flex;\\n align-items: center;\\n gap: 16px;\\n cursor: pointer;\\n background: rgba(255, 255, 255, 0.02);\\n user-select: none\\n }\\n\\n .card-summary {\\n flex: 1;\\n font-weight: 500;\\n font-size: 1rem\\n }\\n\\n .card-path {\\n font-family: var(--font-mono);\\n font-size: 0.85rem;\\n color: var(--text-muted)\\n }\\n\\n .chevron {\\n transition: transform 0.2s;\\n color: var(--text-muted)\\n }\\n\\n .card-header[aria-expanded=\\\"true\\\"] .chevron {\\n transform: rotate(180deg)\\n }\\n\\n .card-body {\\n border-top: 1px solid var(--border-color);\\n padding: 24px;\\n display: none\\n }\\n\\n .card-header[aria-expanded=\\\"true\\\"]+.card-body {\\n display: block\\n }\\n\\n .section-header {\\n font-size: 0.75rem;\\n text-transform: uppercase;\\n color: var(--text-muted);\\n font-weight: 700;\\n margin: 24px 0 12px;\\n letter-spacing: 0.05em\\n }\\n\\n .section-header:first-child {\\n margin-top: 0\\n }\\n\\n .params-table {\\n width: 100%;\\n border-collapse: collapse;\\n font-size: 0.9rem;\\n margin-bottom: 20px\\n }\\n\\n .params-table th {\\n text-align: left;\\n color: var(--text-muted);\\n padding: 8px 12px;\\n font-weight: 500;\\n border-bottom: 1px solid var(--border-color);\\n font-size: 0.8rem\\n }\\n\\n .params-table td {\\n padding: 12px;\\n border-bottom: 1px solid var(--border-color);\\n color: var(--text-secondary);\\n vertical-align: top\\n }\\n\\n .params-table tr:last-child td {\\n border-bottom: none\\n }\\n\\n .param-name {\\n font-family: var(--font-mono);\\n color: var(--text-primary);\\n font-weight: 600\\n }\\n\\n .param-req {\\n color: var(--danger);\\n font-size: 0.7rem;\\n margin-left: 4px\\n }\\n\\n .param-meta {\\n font-size: 0.8rem;\\n color: var(--text-muted);\\n margin-top: 4px;\\n font-family: var(--font-mono)\\n }\\n\\n .code-block {\\n background: #000;\\n border: 1px solid var(--border-color);\\n border-radius: 6px;\\n padding: 16px;\\n font-family: var(--font-mono);\\n font-size: 0.85rem;\\n overflow-x: auto;\\n color: #d4d4d8\\n }\\n\\n .try-it-box {\\n background: rgba(99, 102, 241, 0.05);\\n border: 1px solid rgba(99, 102, 241, 0.2);\\n border-radius: 8px;\\n padding: 20px;\\n margin-top: 32px\\n }\\n\\n .form-grid {\\n display: grid;\\n grid-template-columns: 1fr;\\n gap: 16px;\\n margin-bottom: 20px\\n }\\n\\n .form-group label {\\n display: block;\\n font-size: 0.8rem;\\n font-weight: 600;\\n margin-bottom: 6px;\\n color: var(--text-secondary)\\n }\\n\\n .form-group input {\\n width: 100%;\\n background: var(--bg-body);\\n border: 1px solid var(--border-color);\\n padding: 8px 12px;\\n border-radius: 4px;\\n color: var(--text-primary);\\n font-family: var(--font-mono);\\n font-size: 0.85rem\\n }\\n\\n .form-group input:focus {\\n border-color: var(--primary-color);\\n outline: none\\n }\\n\\n .body-editor {\\n width: 100%;\\n height: 200px;\\n background: var(--bg-body);\\n border: 1px solid var(--border-color);\\n border-radius: 6px;\\n padding: 12px;\\n color: var(--text-primary);\\n font-family: var(--font-mono);\\n font-size: 0.85rem;\\n resize: vertical;\\n margin-bottom: 16px\\n }\\n\\n .action-btn {\\n background: var(--primary-color);\\n color: white;\\n border: none;\\n padding: 10px 20px;\\n border-radius: 6px;\\n font-weight: 600;\\n cursor: pointer;\\n font-size: 0.9rem;\\n transition: background 0.2s;\\n display: inline-flex;\\n align-items: center;\\n gap: 8px\\n }\\n\\n .action-btn:hover {\\n background: var(--primary-hover)\\n }\\n\\n .action-btn:disabled {\\n opacity: 0.6;\\n cursor: not-allowed\\n }\\n\\n .response-area {\\n margin-top: 20px;\\n border-top: 1px solid var(--border-color);\\n padding-top: 20px\\n }\\n\\n .status-badge {\\n display: inline-block;\\n padding: 4px 8px;\\n border-radius: 4px;\\n font-size: 0.8rem;\\n font-weight: 700;\\n margin-bottom: 10px;\\n font-family: var(--font-mono)\\n }\\n\\n .status-2xx {\\n background: rgba(34, 197, 94, 0.2);\\n color: var(--success)\\n }\\n\\n .status-4xx,\\n .status-5xx {\\n background: rgba(239, 68, 68, 0.2);\\n color: var(--danger)\\n }\\n\\n .loader {\\n width: 16px;\\n height: 16px;\\n border: 2px solid #ffffff;\\n border-bottom-color: transparent;\\n border-radius: 50%;\\n display: inline-block;\\n animation: rotation 1s linear infinite\\n }\\n\\n @keyframes rotation {\\n 0% {\\n transform: rotate(0deg)\\n }\\n\\n 100% {\\n transform: rotate(360deg)\\n }\\n }\\n\\n @media (max-width:768px) {\\n .layout {\\n flex-direction: column;\\n overflow: auto\\n }\\n\\n .sidebar {\\n width: 100%;\\n height: auto;\\n border-right: none;\\n border-bottom: 1px solid var(--border-color)\\n }\\n\\n .main-content {\\n padding: 20px;\\n overflow: visible\\n }\\n\\n .nav-list {\\n max-height: 300px\\n }\\n }\\n </style>\\n</head>\\n\\n<body>\\n <div class=\\\"layout\\\">\\n <aside class=\\\"sidebar\\\">\\n <div class=\\\"sidebar-header\\\">\\n <div class=\\\"api-title\\\" id=\\\"apiTitle\\\">API Docs</div>\\n <span class=\\\"api-version\\\" id=\\\"apiVersion\\\">v1.0.0</span>\\n </div>\\n <div class=\\\"search-box\\\">\\n <input type=\\\"text\\\" class=\\\"search-input\\\" id=\\\"searchNav\\\" placeholder=\\\"Filter endpoints...\\\">\\n </div>\\n <div class=\\\"nav-list\\\" id=\\\"navList\\\"></div>\\n </aside>\\n <main class=\\\"main-content\\\">\\n <div class=\\\"content-width\\\">\\n <div class=\\\"info-section\\\">\\n <h1 class=\\\"info-title\\\" id=\\\"docTitle\\\">API Reference</h1>\\n <p class=\\\"info-desc\\\" id=\\\"docDesc\\\">Loading documentation...</p>\\n </div>\\n <div class=\\\"server-section\\\">\\n <label class=\\\"server-label\\\">Base URL</label>\\n <select class=\\\"server-select\\\" id=\\\"serverUrl\\\"></select>\\n </div>\\n <div id=\\\"endpointsContainer\\\"></div>\\n </div>\\n </main>\\n </div>\\n\\n <script>\\n const state = { spec: null, server: '' };\\n function sanitizeId(str) { return String(str).replace(/[^a-zA-Z0-9_-]/g, '_'); }\\n async function init() {\\n try {\\n const res = await fetch(\\\"___AZURA_SPEC_URL_PLACEHOLDER___\\\");\\n if (!res.ok) throw new Error('Spec not found');\\n state.spec = await res.json();\\n renderHeader();\\n renderServers();\\n renderNavigation();\\n renderEndpoints();\\n setupSearch();\\n attachGlobalListeners();\\n } catch (err) {\\n const descEl = document.getElementById('docDesc');\\n descEl.textContent = 'Failed to load API definition. Check that the OpenAPI JSON endpoint is configured and reachable.';\\n descEl.style.color = 'var(--danger)';\\n }\\n }\\n\\n function renderHeader() {\\n const info = state.spec.info || {};\\n document.title = `${info.title || 'API'} - Docs`;\\n document.getElementById('apiTitle').textContent = info.title || 'API';\\n document.getElementById('apiVersion').textContent = info.version ? `v${info.version}` : '';\\n document.getElementById('docTitle').textContent = info.title || 'API Reference';\\n document.getElementById('docDesc').textContent = info.description || 'No description provided.';\\n }\\n\\n function renderServers() {\\n const select = document.getElementById('serverUrl');\\n const servers = state.spec.servers && state.spec.servers.length ? state.spec.servers : [{ url: window.location.origin, description: 'Current Origin' }];\\n select.innerHTML = servers.map(s => `<option value=\\\"${s.url}\\\">${s.url}${s.description ? ` (${s.description})` : ''}</option>`).join('');\\n state.server = servers[0].url;\\n select.addEventListener('change', (e) => state.server = e.target.value);\\n }\\n\\n function renderNavigation() {\\n const nav = document.getElementById('navList');\\n const tags = {};\\n Object.entries(state.spec.paths || {}).forEach(([path, methods]) => {\\n Object.entries(methods).forEach(([method, op]) => {\\n const tag = (op.tags && op.tags[0]) ? op.tags[0] : 'General';\\n if (!tags[tag]) tags[tag] = [];\\n tags[tag].push({ path, method, op });\\n });\\n });\\n\\n let html = '';\\n Object.entries(tags).forEach(([tag, items]) => {\\n html += `<div class=\\\"nav-group-title\\\">${tag}</div>`;\\n items.forEach(item => {\\n const label = item.op.summary || item.path;\\n const filter = `${item.method} ${item.path} ${label}`.toLowerCase();\\n const targetId = sanitizeId(`${item.method}-${item.path}`);\\n html += `<div class=\\\"nav-item\\\" data-filter=\\\"${escapeHtmlAttr(filter)}\\\" data-target-id=\\\"${escapeHtmlAttr(targetId)}\\\">\\n <span class=\\\"method-tag ${item.method.toLowerCase()}\\\">${item.method.toUpperCase()}</span>\\n <span class=\\\"nav-path\\\">${escapeHtmlAttr(label)}</span>\\n </div>`;\\n });\\n });\\n\\n nav.innerHTML = html;\\n nav.querySelectorAll('.nav-item').forEach(el => {\\n el.addEventListener('click', () => {\\n const tid = el.dataset.targetId;\\n scrollEndpoint(tid);\\n document.querySelectorAll('.nav-item').forEach(i => i.classList.toggle('active', i === el));\\n });\\n });\\n }\\n\\n function renderEndpoints() {\\n const container = document.getElementById('endpointsContainer');\\n container.innerHTML = '';\\n Object.entries(state.spec.paths || {}).forEach(([path, methods]) => {\\n Object.entries(methods).forEach(([method, op]) => {\\n container.appendChild(createEndpointCard(path, method, op));\\n });\\n });\\n }\\n\\n function createEndpointCard(path, method, op) {\\n const rawId = `${method}-${path}`;\\n const id = sanitizeId(rawId);\\n const card = document.createElement('div');\\n card.className = 'endpoint-card';\\n card.id = id;\\n\\n const descriptionHtml = op.description ? `<p style=\\\"margin-bottom:20px;color:var(--text-secondary)\\\">${escapeHtml(op.description)}</p>` : '';\\n const paramsHtml = renderParameters(op.parameters);\\n const requestBodyHtml = renderRequestBody(op.requestBody);\\n const responsesHtml = renderResponses(op.responses);\\n\\n const inputsId = `inputs_${id}`;\\n const bodyId = `body_${id}`;\\n const tryButtonId = `btn_${id}`;\\n const inputsHtmlForTry = (op.parameters || []).map(p => {\\n const placeholder = p.schema?.type || '';\\n const required = p.required ? ' <span style=\\\"color:var(--danger)\\\">*</span>' : '';\\n return `<div class=\\\"form-group\\\">\\n <label>${escapeHtml(p.name)} <span style=\\\"font-weight:400;color:var(--text-muted)\\\">(${escapeHtml(p.in)})</span>${required}</label>\\n <input type=\\\"text\\\" data-name=\\\"${escapeHtmlAttr(p.name)}\\\" data-in=\\\"${escapeHtmlAttr(p.in)}\\\" placeholder=\\\"${escapeHtmlAttr(placeholder)}\\\">\\n </div>`;\\n }).join('');\\n\\n const bodyEditorHtml = op.requestBody ? `<div class=\\\"form-group\\\">\\n <label>Request Body (JSON)</label>\\n <textarea class=\\\"body-editor\\\" id=\\\"${bodyId}\\\">${getExampleBody(op.requestBody)}</textarea>\\n </div>` : '';\\n\\n card.innerHTML = `\\n <div class=\\\"card-header\\\" aria-expanded=\\\"false\\\">\\n <span class=\\\"method-tag ${method.toLowerCase()}\\\">${method.toUpperCase()}</span>\\n <span class=\\\"card-summary\\\">${escapeHtml(op.summary || path)}</span>\\n <span class=\\\"card-path\\\">${escapeHtml(path)}</span>\\n <svg class=\\\"chevron\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 24 24\\\" fill=\\\"none\\\" stroke=\\\"currentColor\\\" stroke-width=\\\"2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\"><polyline points=\\\"6 9 12 15 18 9\\\"></polyline></svg>\\n </div>\\n <div class=\\\"card-body\\\">\\n ${descriptionHtml}\\n ${paramsHtml}\\n ${requestBodyHtml}\\n <div class=\\\"try-it-box\\\">\\n <div class=\\\"section-header\\\">Try It Out</div>\\n <div class=\\\"form-grid\\\" id=\\\"${inputsId}\\\">\\n ${inputsHtmlForTry}\\n </div>\\n ${bodyEditorHtml}\\n <button class=\\\"action-btn\\\" id=\\\"${tryButtonId}\\\" data-method=\\\"${escapeHtmlAttr(method)}\\\" data-path=\\\"${escapeHtmlAttr(path)}\\\" data-card-id=\\\"${escapeHtmlAttr(id)}\\\">\\n <span>Execute Request</span>\\n </button>\\n <div class=\\\"response-area\\\" style=\\\"display:none\\\"></div>\\n </div>\\n ${responsesHtml}\\n </div>\\n `;\\n\\n return card;\\n }\\n\\n function renderParameters(params) {\\n if (!params || params.length === 0) return '';\\n return `\\n <div class=\\\"section-header\\\">Parameters</div>\\n <table class=\\\"params-table\\\">\\n <thead><tr><th>Name</th><th>Description</th></tr></thead>\\n <tbody>\\n ${params.map(p => `\\n <tr>\\n <td>\\n <div class=\\\"param-name\\\">${escapeHtml(p.name)}${p.required ? '<span class=\\\"param-req\\\">*</span>' : ''}</div>\\n <div class=\\\"param-meta\\\">${escapeHtml(p.in)} • ${escapeHtml(p.schema?.type || 'string')}</div>\\n </td>\\n <td>${escapeHtml(p.description || '-')}</td>\\n </tr>\\n `).join('')}\\n </tbody>\\n </table>\\n `;\\n }\\n\\n function renderRequestBody(body) {\\n if (!body) return '';\\n const contentType = Object.keys(body.content || {})[0] || 'application/json';\\n const schema = body.content && body.content[contentType] ? body.content[contentType].schema : null;\\n return `\\n <div class=\\\"section-header\\\">Request Body <span style=\\\"font-weight:400;text-transform:none;color:var(--text-secondary)\\\">(${escapeHtml(contentType)})</span></div>\\n <div class=\\\"code-block\\\">${escapeHtml(JSON.stringify(generateExample(schema), null, 2))}</div>\\n `;\\n }\\n\\n function renderResponses(responses) {\\n if (!responses) return '';\\n return `\\n <div class=\\\"section-header\\\">Responses</div>\\n ${Object.entries(responses).map(([status, res]) => `\\n <div style=\\\"margin-bottom:16px\\\">\\n <div style=\\\"font-weight:600;font-family:var(--font-mono);margin-bottom:4px\\\">\\n <span style=\\\"color:${String(status).startsWith('2') ? 'var(--success)' : 'var(--danger)'}\\\">${escapeHtml(status)}</span>\\n <span style=\\\"color:var(--text-secondary)\\\">${escapeHtml(res.description || '')}</span>\\n </div>\\n </div>\\n `).join('')}\\n `;\\n }\\n\\n function getExampleBody(body) {\\n if (!body || !body.content) return '{}';\\n const contentType = Object.keys(body.content)[0];\\n const schema = body.content[contentType].schema;\\n try { return JSON.stringify(generateExample(schema), null, 2); } catch { return '{}'; }\\n }\\n\\n function generateExample(schema) {\\n if (!schema) return {};\\n if (schema.example !== undefined) return schema.example;\\n if (schema.$ref) {\\n const ref = String(schema.$ref).replace(/^#\\\\/components\\\\/schemas\\\\//, '');\\n const comp = state.spec.components && state.spec.components.schemas && state.spec.components.schemas[ref];\\n if (comp) return generateExample(comp);\\n return {};\\n }\\n if (schema.type === 'object' && schema.properties) {\\n const obj = {};\\n for (const [k, prop] of Object.entries(schema.properties)) {\\n obj[k] = generateExample(prop);\\n }\\n return obj;\\n }\\n if (schema.type === 'array') return [generateExample(schema.items)];\\n if (schema.type === 'string') return 'string';\\n if (schema.type === 'integer' || schema.type === 'number') return 0;\\n if (schema.type === 'boolean') return true;\\n return null;\\n }\\n\\n async function executeRequest(method, path, btn) {\\n const cardId = btn.dataset.cardId;\\n const card = document.getElementById(cardId);\\n const inputs = card.querySelectorAll('input[data-name]');\\n const bodyEditor = card.querySelector('.body-editor');\\n const responseArea = card.querySelector('.response-area');\\n const originalHtml = btn.innerHTML;\\n btn.disabled = true;\\n btn.innerHTML = '<span class=\\\"loader\\\"></span> Executing...';\\n responseArea.style.display = 'none';\\n try {\\n let url = (state.server || '') + path;\\n const headers = { 'Content-Type': 'application/json', 'Accept': 'application/json' };\\n const queryParams = new URLSearchParams();\\n inputs.forEach(input => {\\n const value = input.value.trim();\\n if (!value) return;\\n const type = input.dataset.in;\\n const name = input.dataset.name;\\n if (type === 'path') {\\n url = url.replace(`{${name}}`, encodeURIComponent(value));\\n } else if (type === 'query') {\\n queryParams.append(name, value);\\n } else if (type === 'header') {\\n headers[name] = value;\\n } else if (type === 'cookie') {\\n // cookies handled as header for demo purposes\\n headers['Cookie'] = (headers['Cookie'] ? headers['Cookie'] + '; ' : '') + `${name}=${value}`;\\n }\\n });\\n const qs = queryParams.toString();\\n if (qs) url += `?${qs}`;\\n const options = { method: method.toUpperCase(), headers };\\n if (bodyEditor && ['POST', 'PUT', 'PATCH'].includes(method.toUpperCase())) {\\n try {\\n const parsed = JSON.parse(bodyEditor.value);\\n options.body = JSON.stringify(parsed);\\n } catch (e) {\\n alert('Invalid JSON in Request Body');\\n throw new Error('Invalid JSON');\\n }\\n }\\n const start = performance.now();\\n const res = await fetch(url, options);\\n const duration = Math.round(performance.now() - start);\\n let data;\\n const ct = res.headers.get('content-type') || '';\\n if (ct.includes('application/json')) data = await res.json(); else data = await res.text();\\n const statusClass = res.ok ? 'status-2xx' : (String(res.status).startsWith('5') ? 'status-5xx' : 'status-4xx');\\n responseArea.style.display = 'block';\\n responseArea.innerHTML = `\\n <div style=\\\"display:flex;justify-content:space-between;align-items:center;margin-bottom:12px;\\\">\\n <span class=\\\"status-badge ${statusClass}\\\">${res.status} ${escapeHtml(res.statusText)}</span>\\n <span style=\\\"font-family:var(--font-mono);font-size:0.8rem;color:var(--text-muted)\\\">${duration}ms</span>\\n </div>\\n <div class=\\\"section-header\\\">Response Body</div>\\n <div class=\\\"code-block\\\">${escapeHtml(typeof data === 'object' ? JSON.stringify(data, null, 2) : String(data))}</div>\\n <div class=\\\"section-header\\\">Response Headers</div>\\n <div class=\\\"code-block\\\">${escapeHtml(Array.from(res.headers.entries()).map(([k, v]) => `${k}: ${v}`).join('\\\\\\\\n'))}</div>\\n `;\\n } catch (err) {\\n responseArea.style.display = 'block';\\n responseArea.innerHTML = `<div style=\\\"color:var(--danger);font-weight:600\\\">Error: ${escapeHtml(err.message || String(err))}</div>`;\\n } finally {\\n btn.disabled = false;\\n btn.innerHTML = originalHtml;\\n }\\n }\\n\\n function toggleCard(header) {\\n const isExpanded = header.getAttribute('aria-expanded') === 'true';\\n header.setAttribute('aria-expanded', String(!isExpanded));\\n }\\n\\n function scrollEndpoint(sanitizedId) {\\n const el = document.getElementById(sanitizedId);\\n if (!el) return;\\n el.scrollIntoView({ behavior: 'smooth', block: 'start' });\\n const header = el.querySelector('.card-header');\\n if (header && header.getAttribute('aria-expanded') !== 'true') {\\n header.setAttribute('aria-expanded', 'true');\\n }\\n }\\n\\n function setupSearch() {\\n const input = document.getElementById('searchNav');\\n input.addEventListener('input', (e) => {\\n const val = e.target.value.toLowerCase();\\n document.querySelectorAll('.nav-item').forEach(el => {\\n const filter = el.dataset.filter || '';\\n el.style.display = filter.includes(val) ? 'flex' : 'none';\\n });\\n });\\n }\\n\\n function attachGlobalListeners() {\\n document.querySelectorAll('.endpoint-card .card-header').forEach(header => {\\n header.addEventListener('click', () => toggleCard(header));\\n });\\n document.querySelectorAll('.action-btn').forEach(btn => {\\n btn.addEventListener('click', () => executeRequest(btn.dataset.method, btn.dataset.path, btn));\\n });\\n }\\n\\n function escapeHtml(str) {\\n if (str === undefined || str === null) return '';\\n return String(str)\\n .replace(/&/g, '&')\\n .replace(/</g, '<')\\n .replace(/>/g, '>')\\n .replace(/\\\"/g, '"')\\n .replace(/'/g, ''');\\n }\\n function escapeHtmlAttr(str) {\\n return escapeHtml(str).replace(/\\\"/g, '"').replace(/'/g, ''');\\n }\\n\\n init();\\n </script>\\n</body>\\n\\n</html>\";\n","/**\n * HTML da UI de documentação OpenAPI (paridade visual com azurajs-legacy: sidebar, Inter/JetBrains Mono, tema zinc/indigo).\n */\nimport { SWAGGER_UI_MODERN_HTML } from \"./swagger-ui-template.js\";\n\nexport function renderSwaggerUiPage(options: {\n title: string;\n specUrl: string;\n deepLinking?: boolean;\n}): string {\n const { title, specUrl } = options;\n return SWAGGER_UI_MODERN_HTML.replaceAll(\"__PAGE_TITLE__\", escapeHtml(title)).replaceAll(\n '\"___AZURA_SPEC_URL_PLACEHOLDER___\"',\n JSON.stringify(specUrl),\n );\n}\n\nfunction escapeHtml(s: string): string {\n return s\n .replace(/&/g, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\"/g, \""\");\n}\n","import type { PluginHandler } from \"../types/plugins/plugin.type.js\";\r\nimport type { SwaggerPluginOptions } from \"../types/swagger.type.js\";\r\nimport { buildOpenApiDocument } from \"../swagger/openapi-builder.js\";\r\nimport { renderSwaggerUiPage } from \"../swagger/swagger-ui-html.js\";\r\n\r\nexport function SwaggerPlugin(options: SwaggerPluginOptions): PluginHandler {\r\n const {\r\n getDocuments,\r\n specPath = \"/openapi.json\",\r\n docsPath = \"/docs\",\r\n deepLinking = true,\r\n servers,\r\n pathPrefix,\r\n info,\r\n } = options;\r\n\r\n const title = info?.title ?? \"API\";\r\n\r\n return async (ctx, next) => {\r\n const { req, res } = ctx;\r\n const path = req.pathname ?? \"\";\r\n\r\n if (path === specPath || path === `${specPath}/`) {\r\n const doc = buildOpenApiDocument(getDocuments(), {\r\n info: info ?? { title, version: \"1.0.0\" },\r\n servers,\r\n pathPrefix,\r\n });\r\n res.json(doc);\r\n return;\r\n }\r\n\r\n if (path === docsPath || path === `${docsPath}/`) {\r\n const html = renderSwaggerUiPage({\r\n title,\r\n specUrl: specPath,\r\n deepLinking,\r\n });\r\n res.html(html);\r\n return;\r\n }\r\n\r\n next();\r\n };\r\n}\r\n","/**\r\n * Azura Validator - Type-safe validation library inspired by Zod\r\n * Provides runtime validation with TypeScript type inference\r\n */\r\n\r\nimport type { ValidationIssue } from \"../../types/validators.type.js\";\r\n\r\n/**\r\n * Validation error class\r\n */\r\nexport class ValidationError extends Error {\r\n public readonly errors: ValidationIssue[];\r\n\r\n constructor(errors: ValidationIssue[]) {\r\n super(errors.map((e) => e.message).join(\", \"));\r\n this.name = \"ValidationError\";\r\n this.errors = errors;\r\n }\r\n\r\n format(): Record<string, string[]> {\r\n const formatted: Record<string, string[]> = {};\r\n for (const error of this.errors) {\r\n const path = error.path.join(\".\");\r\n if (!formatted[path]) {\r\n formatted[path] = [];\r\n }\r\n formatted[path].push(error.message);\r\n }\r\n return formatted;\r\n }\r\n}\r\n\r\n/**\r\n * Base validator class\r\n */\r\nexport abstract class BaseValidator<T> {\r\n protected _optional = false;\r\n protected _nullable = false;\r\n protected _defaultValue?: T;\r\n protected _description?: string;\r\n protected _customValidations: Array<(value: T) => boolean | string> = [];\r\n\r\n /**\r\n * Parse and validate data\r\n */\r\n abstract parse(data: unknown, path?: (string | number)[]): T;\r\n\r\n /**\r\n * Safe parse that returns result object instead of throwing\r\n */\r\n safeParse(\r\n data: unknown\r\n ): { success: true; data: T } | { success: false; error: ValidationError } {\r\n try {\r\n const result = this.parse(data);\r\n return { success: true, data: result };\r\n } catch (error) {\r\n if (error instanceof ValidationError) {\r\n return { success: false, error };\r\n }\r\n return {\r\n success: false,\r\n error: new ValidationError([\r\n {\r\n path: [],\r\n message: error instanceof Error ? error.message : String(error),\r\n code: \"unknown_error\",\r\n },\r\n ]),\r\n };\r\n }\r\n }\r\n\r\n /**\r\n * Make this field optional\r\n */\r\n optional(): BaseValidator<T | undefined> {\r\n const clone = this.clone()!;\r\n clone._optional = true;\r\n return clone as any;\r\n }\r\n\r\n /**\r\n * Make this field nullable\r\n */\r\n nullable(): BaseValidator<T | null> {\r\n const clone = this.clone();\r\n clone._nullable = true;\r\n return clone as any;\r\n }\r\n\r\n /**\r\n * Set default value\r\n */\r\n default(value: T): BaseValidator<T> {\r\n const clone = this.clone();\r\n clone._defaultValue = value;\r\n return clone;\r\n }\r\n\r\n /**\r\n * Add description\r\n */\r\n describe(description: string): this {\r\n this._description = description;\r\n return this;\r\n }\r\n\r\n /**\r\n * Add custom validation\r\n */\r\n refine(validator: (value: T) => boolean, message?: string): this {\r\n this._customValidations.push((value: T) => validator(value) || message || \"Validation failed\");\r\n return this;\r\n }\r\n\r\n /**\r\n * Clone validator\r\n */\r\n protected abstract clone(): BaseValidator<T>;\r\n\r\n /**\r\n * Handle optional/nullable/default\r\n */\r\n protected handleOptionalAndNullable(\r\n data: unknown,\r\n path: (string | number)[]\r\n ): T | undefined | null {\r\n if (data === undefined) {\r\n if (this._defaultValue !== undefined) {\r\n return this._defaultValue;\r\n }\r\n if (this._optional) {\r\n return undefined;\r\n }\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Required field\",\r\n code: \"required\",\r\n expected: \"value\",\r\n received: \"undefined\",\r\n },\r\n ]);\r\n }\r\n\r\n if (data === null) {\r\n if (this._nullable) {\r\n return null;\r\n }\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Cannot be null\",\r\n code: \"invalid_type\",\r\n expected: \"non-null\",\r\n received: \"null\",\r\n },\r\n ]);\r\n }\r\n\r\n return data as T;\r\n }\r\n\r\n /**\r\n * Run custom validations\r\n */\r\n protected runCustomValidations(value: T, path: (string | number)[]): void {\r\n for (const validation of this._customValidations) {\r\n const result = validation(value);\r\n if (result !== true) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: typeof result === \"string\" ? result : \"Custom validation failed\",\r\n code: \"custom\",\r\n },\r\n ]);\r\n }\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * String validator\r\n */\r\nexport class StringValidator extends BaseValidator<string> {\r\n private _minLength?: number;\r\n private _maxLength?: number;\r\n private _pattern?: RegExp;\r\n private _email = false;\r\n private _url = false;\r\n private _uuid = false;\r\n private _trim = false;\r\n private _lowercase = false;\r\n private _uppercase = false;\r\n\r\n parse(data: unknown, path: (string | number)[] = []): string {\r\n const handled = this.handleOptionalAndNullable(data, path);\r\n if (handled === undefined || handled === null) return handled as any;\r\n\r\n if (typeof data !== \"string\") {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Expected string\",\r\n code: \"invalid_type\",\r\n expected: \"string\",\r\n received: typeof data,\r\n },\r\n ]);\r\n }\r\n\r\n let value = data;\r\n\r\n if (this._trim) value = value.trim();\r\n if (this._lowercase) value = value.toLowerCase();\r\n if (this._uppercase) value = value.toUpperCase();\r\n\r\n if (this._minLength !== undefined && value.length < this._minLength) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `String must be at least ${this._minLength} characters`,\r\n code: \"too_small\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._maxLength !== undefined && value.length > this._maxLength) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `String must be at most ${this._maxLength} characters`,\r\n code: \"too_big\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._pattern && !this._pattern.test(value)) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `String does not match pattern`,\r\n code: \"invalid_string\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._email && !this.isEmail(value)) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Invalid email address\",\r\n code: \"invalid_string\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._url && !this.isUrl(value)) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Invalid URL\",\r\n code: \"invalid_string\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._uuid && !this.isUuid(value)) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Invalid UUID\",\r\n code: \"invalid_string\",\r\n },\r\n ]);\r\n }\r\n\r\n this.runCustomValidations(value, path);\r\n\r\n return value;\r\n }\r\n\r\n min(length: number, message?: string): this {\r\n this._minLength = length;\r\n return this;\r\n }\r\n\r\n max(length: number, message?: string): this {\r\n this._maxLength = length;\r\n return this;\r\n }\r\n\r\n length(length: number): this {\r\n this._minLength = length;\r\n this._maxLength = length;\r\n return this;\r\n }\r\n\r\n regex(pattern: RegExp, message?: string): this {\r\n this._pattern = pattern;\r\n return this;\r\n }\r\n\r\n email(message?: string): this {\r\n this._email = true;\r\n return this;\r\n }\r\n\r\n url(message?: string): this {\r\n this._url = true;\r\n return this;\r\n }\r\n\r\n uuid(message?: string): this {\r\n this._uuid = true;\r\n return this;\r\n }\r\n\r\n trim(): this {\r\n this._trim = true;\r\n return this;\r\n }\r\n\r\n toLowerCase(): this {\r\n this._lowercase = true;\r\n return this;\r\n }\r\n\r\n toUpperCase(): this {\r\n this._uppercase = true;\r\n return this;\r\n }\r\n\r\n startsWith(prefix: string): this {\r\n return this.refine((val) => val.startsWith(prefix), `String must start with \"${prefix}\"`);\r\n }\r\n\r\n endsWith(suffix: string): this {\r\n return this.refine((val) => val.endsWith(suffix), `String must end with \"${suffix}\"`);\r\n }\r\n\r\n includes(substring: string): this {\r\n return this.refine((val) => val.includes(substring), `String must include \"${substring}\"`);\r\n }\r\n\r\n protected clone(): StringValidator {\r\n const cloned = new StringValidator();\r\n cloned._optional = this._optional;\r\n cloned._nullable = this._nullable;\r\n cloned._defaultValue = this._defaultValue;\r\n cloned._minLength = this._minLength;\r\n cloned._maxLength = this._maxLength;\r\n cloned._pattern = this._pattern;\r\n cloned._email = this._email;\r\n cloned._url = this._url;\r\n cloned._uuid = this._uuid;\r\n cloned._trim = this._trim;\r\n cloned._lowercase = this._lowercase;\r\n cloned._uppercase = this._uppercase;\r\n cloned._customValidations = [...this._customValidations];\r\n return cloned;\r\n }\r\n\r\n private isEmail(value: string): boolean {\r\n return /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value);\r\n }\r\n\r\n private isUrl(value: string): boolean {\r\n try {\r\n new URL(value);\r\n return true;\r\n } catch {\r\n return false;\r\n }\r\n }\r\n\r\n private isUuid(value: string): boolean {\r\n return /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i.test(value);\r\n }\r\n}\r\n\r\n/**\r\n * Number validator\r\n */\r\nexport class NumberValidator extends BaseValidator<number> {\r\n private _min?: number;\r\n private _max?: number;\r\n private _integer = false;\r\n private _positive = false;\r\n private _negative = false;\r\n private _multipleOf?: number;\r\n\r\n parse(data: unknown, path: (string | number)[] = []): number {\r\n const handled = this.handleOptionalAndNullable(data, path);\r\n if (handled === undefined || handled === null) return handled as any;\r\n\r\n if (typeof data !== \"number\" || Number.isNaN(data)) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Expected number\",\r\n code: \"invalid_type\",\r\n expected: \"number\",\r\n received: typeof data,\r\n },\r\n ]);\r\n }\r\n\r\n if (this._integer && !Number.isInteger(data)) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Expected integer\",\r\n code: \"invalid_type\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._positive && data <= 0) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Number must be positive\",\r\n code: \"too_small\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._negative && data >= 0) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Number must be negative\",\r\n code: \"too_big\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._min !== undefined && data < this._min) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `Number must be at least ${this._min}`,\r\n code: \"too_small\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._max !== undefined && data > this._max) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `Number must be at most ${this._max}`,\r\n code: \"too_big\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._multipleOf !== undefined && data % this._multipleOf !== 0) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `Number must be multiple of ${this._multipleOf}`,\r\n code: \"invalid_number\",\r\n },\r\n ]);\r\n }\r\n\r\n this.runCustomValidations(data, path);\r\n\r\n return data;\r\n }\r\n\r\n min(value: number): this {\r\n this._min = value;\r\n return this;\r\n }\r\n\r\n max(value: number): this {\r\n this._max = value;\r\n return this;\r\n }\r\n\r\n int(): this {\r\n this._integer = true;\r\n return this;\r\n }\r\n\r\n positive(): this {\r\n this._positive = true;\r\n return this;\r\n }\r\n\r\n negative(): this {\r\n this._negative = true;\r\n return this;\r\n }\r\n\r\n multipleOf(value: number): this {\r\n this._multipleOf = value;\r\n return this;\r\n }\r\n\r\n protected clone(): NumberValidator {\r\n const cloned = new NumberValidator();\r\n cloned._optional = this._optional;\r\n cloned._nullable = this._nullable;\r\n cloned._defaultValue = this._defaultValue;\r\n cloned._min = this._min;\r\n cloned._max = this._max;\r\n cloned._integer = this._integer;\r\n cloned._positive = this._positive;\r\n cloned._negative = this._negative;\r\n cloned._multipleOf = this._multipleOf;\r\n cloned._customValidations = [...this._customValidations];\r\n return cloned;\r\n }\r\n}\r\n\r\n/**\r\n * Boolean validator\r\n */\r\nexport class BooleanValidator extends BaseValidator<boolean> {\r\n parse(data: unknown, path: (string | number)[] = []): boolean {\r\n const handled = this.handleOptionalAndNullable(data, path);\r\n if (handled === undefined || handled === null) return handled as any;\r\n\r\n if (typeof data !== \"boolean\") {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Expected boolean\",\r\n code: \"invalid_type\",\r\n expected: \"boolean\",\r\n received: typeof data,\r\n },\r\n ]);\r\n }\r\n\r\n this.runCustomValidations(data, path);\r\n\r\n return data;\r\n }\r\n\r\n protected clone(): BooleanValidator {\r\n const cloned = new BooleanValidator();\r\n cloned._optional = this._optional;\r\n cloned._nullable = this._nullable;\r\n cloned._defaultValue = this._defaultValue;\r\n cloned._customValidations = [...this._customValidations];\r\n return cloned;\r\n }\r\n}\r\n\r\n/**\r\n * Array validator\r\n */\r\nexport class ArrayValidator<T> extends BaseValidator<T[]> {\r\n private _minLength?: number;\r\n private _maxLength?: number;\r\n private _itemValidator: BaseValidator<T>;\r\n\r\n constructor(itemValidator: BaseValidator<T>) {\r\n super();\r\n this._itemValidator = itemValidator;\r\n }\r\n\r\n parse(data: unknown, path: (string | number)[] = []): T[] {\r\n const handled = this.handleOptionalAndNullable(data, path);\r\n if (handled === undefined || handled === null) return handled as any;\r\n\r\n if (!Array.isArray(data)) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Expected array\",\r\n code: \"invalid_type\",\r\n expected: \"array\",\r\n received: typeof data,\r\n },\r\n ]);\r\n }\r\n\r\n if (this._minLength !== undefined && data.length < this._minLength) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `Array must have at least ${this._minLength} items`,\r\n code: \"too_small\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._maxLength !== undefined && data.length > this._maxLength) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `Array must have at most ${this._maxLength} items`,\r\n code: \"too_big\",\r\n },\r\n ]);\r\n }\r\n\r\n const errors: ValidationIssue[] = [];\r\n const result: T[] = [];\r\n\r\n for (let i = 0; i < data.length; i++) {\r\n try {\r\n result.push(this._itemValidator.parse(data[i], [...path, i]));\r\n } catch (error) {\r\n if (error instanceof ValidationError) {\r\n errors.push(...error.errors);\r\n }\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n throw new ValidationError(errors);\r\n }\r\n\r\n this.runCustomValidations(result, path);\r\n\r\n return result;\r\n }\r\n\r\n min(length: number): this {\r\n this._minLength = length;\r\n return this;\r\n }\r\n\r\n max(length: number): this {\r\n this._maxLength = length;\r\n return this;\r\n }\r\n\r\n length(length: number): this {\r\n this._minLength = length;\r\n this._maxLength = length;\r\n return this;\r\n }\r\n\r\n nonempty(): this {\r\n this._minLength = 1;\r\n return this;\r\n }\r\n\r\n protected clone(): ArrayValidator<T> {\r\n const cloned = new ArrayValidator(this._itemValidator);\r\n cloned._optional = this._optional;\r\n cloned._nullable = this._nullable;\r\n cloned._defaultValue = this._defaultValue;\r\n cloned._minLength = this._minLength;\r\n cloned._maxLength = this._maxLength;\r\n cloned._customValidations = [...this._customValidations];\r\n return cloned;\r\n }\r\n}\r\n\r\n/**\r\n * Object validator\r\n */\r\nexport class ObjectValidator<T extends Record<string, any>> extends BaseValidator<T> {\r\n private _shape: { [K in keyof T]: BaseValidator<T[K]> };\r\n private _strict = false;\r\n private _passthrough = false;\r\n\r\n constructor(shape: { [K in keyof T]: BaseValidator<T[K]> }) {\r\n super();\r\n this._shape = shape;\r\n }\r\n\r\n parse(data: unknown, path: (string | number)[] = []): T {\r\n const handled = this.handleOptionalAndNullable(data, path);\r\n if (handled === undefined || handled === null) return handled as any;\r\n\r\n if (typeof data !== \"object\" || data === null || Array.isArray(data)) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Expected object\",\r\n code: \"invalid_type\",\r\n expected: \"object\",\r\n received: Array.isArray(data) ? \"array\" : typeof data,\r\n },\r\n ]);\r\n }\r\n\r\n const errors: ValidationIssue[] = [];\r\n const result: any = {};\r\n const inputKeys = Object.keys(data);\r\n const shapeKeys = Object.keys(this._shape);\r\n\r\n // Validate shape keys\r\n for (const key of shapeKeys) {\r\n try {\r\n result[key] = this._shape[key]?.parse((data as any)[key], [...path, key]);\r\n } catch (error) {\r\n if (error instanceof ValidationError) {\r\n errors.push(...error.errors);\r\n }\r\n }\r\n }\r\n\r\n // Handle extra keys\r\n const extraKeys = inputKeys.filter((k) => !shapeKeys.includes(k));\r\n if (this._strict && extraKeys.length > 0) {\r\n errors.push({\r\n path,\r\n message: `Unexpected keys: ${extraKeys.join(\", \")}`,\r\n code: \"unrecognized_keys\",\r\n });\r\n } else if (this._passthrough) {\r\n for (const key of extraKeys) {\r\n result[key] = (data as any)[key];\r\n }\r\n }\r\n\r\n if (errors.length > 0) {\r\n throw new ValidationError(errors);\r\n }\r\n\r\n this.runCustomValidations(result, path);\r\n\r\n return result;\r\n }\r\n\r\n strict(): this {\r\n this._strict = true;\r\n return this;\r\n }\r\n\r\n passthrough(): this {\r\n this._passthrough = true;\r\n return this;\r\n }\r\n\r\n partial(): ObjectValidator<Partial<T>> {\r\n const newShape: any = {};\r\n for (const key in this._shape) {\r\n newShape[key] = this._shape[key].optional();\r\n }\r\n return new ObjectValidator(newShape);\r\n }\r\n\r\n pick<K extends keyof T>(...keys: K[]): ObjectValidator<Pick<T, K>> {\r\n const newShape: any = {};\r\n for (const key of keys) {\r\n newShape[key] = this._shape[key];\r\n }\r\n return new ObjectValidator(newShape);\r\n }\r\n\r\n omit<K extends keyof T>(...keys: K[]): ObjectValidator<Omit<T, K>> {\r\n const newShape: any = {};\r\n for (const key in this._shape) {\r\n if (!keys.includes(key as unknown as K)) {\r\n newShape[key] = this._shape[key];\r\n }\r\n }\r\n return new ObjectValidator(newShape);\r\n }\r\n\r\n protected clone(): ObjectValidator<T> {\r\n const cloned = new ObjectValidator(this._shape);\r\n cloned._optional = this._optional;\r\n cloned._nullable = this._nullable;\r\n cloned._defaultValue = this._defaultValue;\r\n cloned._strict = this._strict;\r\n cloned._passthrough = this._passthrough;\r\n cloned._customValidations = [...this._customValidations];\r\n return cloned;\r\n }\r\n}\r\n\r\n/**\r\n * Enum validator\r\n */\r\nexport class EnumValidator<T extends string | number> extends BaseValidator<T> {\r\n private _values: readonly T[];\r\n\r\n constructor(values: readonly T[]) {\r\n super();\r\n this._values = values;\r\n }\r\n\r\n parse(data: unknown, path: (string | number)[] = []): T {\r\n const handled = this.handleOptionalAndNullable(data, path);\r\n if (handled === undefined || handled === null) return handled as any;\r\n\r\n if (!this._values.includes(data as T)) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `Expected one of: ${this._values.join(\", \")}`,\r\n code: \"invalid_enum_value\",\r\n received: String(data),\r\n },\r\n ]);\r\n }\r\n\r\n this.runCustomValidations(data as T, path);\r\n\r\n return data as T;\r\n }\r\n\r\n protected clone(): EnumValidator<T> {\r\n const cloned = new EnumValidator(this._values);\r\n cloned._optional = this._optional;\r\n cloned._nullable = this._nullable;\r\n cloned._defaultValue = this._defaultValue;\r\n cloned._customValidations = [...this._customValidations];\r\n return cloned;\r\n }\r\n}\r\n\r\n/**\r\n * Date validator\r\n */\r\nexport class DateValidator extends BaseValidator<Date> {\r\n private _min?: Date;\r\n private _max?: Date;\r\n\r\n parse(data: unknown, path: (string | number)[] = []): Date {\r\n const handled = this.handleOptionalAndNullable(data, path);\r\n if (handled === undefined || handled === null) return handled as any;\r\n\r\n let date: Date;\r\n\r\n if (data instanceof Date) {\r\n date = data;\r\n } else if (typeof data === \"string\" || typeof data === \"number\") {\r\n date = new Date(data);\r\n } else {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Expected date\",\r\n code: \"invalid_type\",\r\n expected: \"date\",\r\n received: typeof data,\r\n },\r\n ]);\r\n }\r\n\r\n if (isNaN(date.getTime())) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Invalid date\",\r\n code: \"invalid_date\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._min && date < this._min) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `Date must be after ${this._min.toISOString()}`,\r\n code: \"too_small\",\r\n },\r\n ]);\r\n }\r\n\r\n if (this._max && date > this._max) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `Date must be before ${this._max.toISOString()}`,\r\n code: \"too_big\",\r\n },\r\n ]);\r\n }\r\n\r\n this.runCustomValidations(date, path);\r\n\r\n return date;\r\n }\r\n\r\n min(date: Date): this {\r\n this._min = date;\r\n return this;\r\n }\r\n\r\n max(date: Date): this {\r\n this._max = date;\r\n return this;\r\n }\r\n\r\n protected clone(): DateValidator {\r\n const cloned = new DateValidator();\r\n cloned._optional = this._optional;\r\n cloned._nullable = this._nullable;\r\n cloned._defaultValue = this._defaultValue;\r\n cloned._min = this._min;\r\n cloned._max = this._max;\r\n cloned._customValidations = [...this._customValidations];\r\n return cloned;\r\n }\r\n}\r\n\r\n/**\r\n * Literal validator\r\n */\r\nexport class LiteralValidator<T extends string | number | boolean> extends BaseValidator<T> {\r\n private _value: T;\r\n\r\n constructor(value: T) {\r\n super();\r\n this._value = value;\r\n }\r\n\r\n parse(data: unknown, path: (string | number)[] = []): T {\r\n const handled = this.handleOptionalAndNullable(data, path);\r\n if (handled === undefined || handled === null) return handled as any;\r\n\r\n if (data !== this._value) {\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: `Expected literal value: ${this._value}`,\r\n code: \"invalid_literal\",\r\n expected: String(this._value),\r\n received: String(data),\r\n },\r\n ]);\r\n }\r\n\r\n return data as T;\r\n }\r\n\r\n protected clone(): LiteralValidator<T> {\r\n const cloned = new LiteralValidator(this._value);\r\n cloned._optional = this._optional;\r\n cloned._nullable = this._nullable;\r\n cloned._defaultValue = this._defaultValue;\r\n cloned._customValidations = [...this._customValidations];\r\n return cloned;\r\n }\r\n}\r\n\r\n/**\r\n * Union validator\r\n */\r\nexport class UnionValidator<T> extends BaseValidator<T> {\r\n private _validators: BaseValidator<any>[];\r\n\r\n constructor(validators: BaseValidator<any>[]) {\r\n super();\r\n this._validators = validators;\r\n }\r\n\r\n parse(data: unknown, path: (string | number)[] = []): T {\r\n const handled = this.handleOptionalAndNullable(data, path);\r\n if (handled === undefined || handled === null) return handled as any;\r\n\r\n const errors: ValidationIssue[] = [];\r\n\r\n for (const validator of this._validators) {\r\n try {\r\n return validator.parse(data, path);\r\n } catch (error) {\r\n if (error instanceof ValidationError) {\r\n errors.push(...error.errors);\r\n }\r\n }\r\n }\r\n\r\n throw new ValidationError([\r\n {\r\n path,\r\n message: \"Value does not match any union type\",\r\n code: \"invalid_union\",\r\n },\r\n ]);\r\n }\r\n\r\n protected clone(): UnionValidator<T> {\r\n const cloned = new UnionValidator<T>(this._validators);\r\n cloned._optional = this._optional;\r\n cloned._nullable = this._nullable;\r\n cloned._defaultValue = this._defaultValue as T | undefined;\r\n cloned._customValidations = [...this._customValidations] as Array<(value: T) => boolean | string>;\r\n return cloned;\r\n }\r\n}\r\n\r\n/**\r\n * Main validator factory (similar to Zod's z)\r\n */\r\nexport const v = {\r\n string: () => new StringValidator(),\r\n number: () => new NumberValidator(),\r\n boolean: () => new BooleanValidator(),\r\n date: () => new DateValidator(),\r\n array: <T>(itemValidator: BaseValidator<T>) => new ArrayValidator(itemValidator),\r\n object: <T extends Record<string, any>>(shape: { [K in keyof T]: BaseValidator<T[K]> }) =>\r\n new ObjectValidator(shape),\r\n enum: <T extends string | number>(values: readonly T[]) => new EnumValidator(values),\r\n literal: <T extends string | number | boolean>(value: T) => new LiteralValidator(value),\r\n union: <T>(...validators: BaseValidator<any>[]) => new UnionValidator<T>(validators),\r\n\r\n // Aliases\r\n str: () => new StringValidator(),\r\n num: () => new NumberValidator(),\r\n bool: () => new BooleanValidator(),\r\n arr: <T>(itemValidator: BaseValidator<T>) => new ArrayValidator(itemValidator),\r\n obj: <T extends Record<string, any>>(shape: { [K in keyof T]: BaseValidator<T[K]> }) =>\r\n new ObjectValidator(shape),\r\n};\r\n\r\n// Export types\r\nexport type Infer<T extends BaseValidator<any>> = T extends BaseValidator<infer U> ? U : never;\r\n","export interface DtoValidationError {\r\n field: string;\r\n message: string;\r\n value?: any;\r\n}\r\n\r\nexport interface ValidationResult {\r\n valid: boolean;\r\n errors: DtoValidationError[];\r\n data?: any;\r\n}\r\n\r\ntype RuleType = \"string\" | \"number\" | \"boolean\" | \"object\" | \"array\";\r\n\r\ninterface FieldRule {\r\n type?: RuleType;\r\n required?: boolean;\r\n min?: number;\r\n max?: number;\r\n pattern?: RegExp;\r\n enum?: any[];\r\n custom?: (value: any) => string | null;\r\n message?: string;\r\n}\r\n\r\nexport type Schema = Record<string, FieldRule>;\r\n\r\nexport class DTOValidator {\r\n static validate(data: any, schema: Schema): ValidationResult {\r\n const errors: DtoValidationError[] = [];\r\n\r\n if (data == null || typeof data !== \"object\") {\r\n return {\r\n valid: false,\r\n errors: [{ field: \"_root\", message: \"Request body must be an object\" }],\r\n };\r\n }\r\n\r\n for (const [field, rule] of Object.entries(schema)) {\r\n const value = data[field];\r\n\r\n if (rule.required && (value === undefined || value === null || value === \"\")) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} is required`,\r\n value,\r\n });\r\n continue;\r\n }\r\n\r\n if (value === undefined || value === null) continue;\r\n\r\n if (rule.type) {\r\n const actualType = Array.isArray(value) ? \"array\" : typeof value;\r\n if (actualType !== rule.type) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be of type ${rule.type}`,\r\n value,\r\n });\r\n continue;\r\n }\r\n }\r\n\r\n if (rule.type === \"string\" || typeof value === \"string\") {\r\n if (rule.min !== undefined && value.length < rule.min) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be at least ${rule.min} characters`,\r\n value,\r\n });\r\n }\r\n if (rule.max !== undefined && value.length > rule.max) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be at most ${rule.max} characters`,\r\n value,\r\n });\r\n }\r\n if (rule.pattern && !rule.pattern.test(value)) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} has invalid format`,\r\n value,\r\n });\r\n }\r\n }\r\n\r\n if (rule.type === \"number\" || typeof value === \"number\") {\r\n if (rule.min !== undefined && value < rule.min) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be at least ${rule.min}`,\r\n value,\r\n });\r\n }\r\n if (rule.max !== undefined && value > rule.max) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be at most ${rule.max}`,\r\n value,\r\n });\r\n }\r\n }\r\n\r\n if (rule.type === \"array\" && Array.isArray(value)) {\r\n if (rule.min !== undefined && value.length < rule.min) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must have at least ${rule.min} items`,\r\n value,\r\n });\r\n }\r\n if (rule.max !== undefined && value.length > rule.max) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must have at most ${rule.max} items`,\r\n value,\r\n });\r\n }\r\n }\r\n\r\n if (rule.enum && !rule.enum.includes(value)) {\r\n errors.push({\r\n field,\r\n message: rule.message ?? `${field} must be one of: ${rule.enum.join(\", \")}`,\r\n value,\r\n });\r\n }\r\n\r\n if (rule.custom) {\r\n const customError = rule.custom(value);\r\n if (customError) {\r\n errors.push({ field, message: customError, value });\r\n }\r\n }\r\n }\r\n\r\n return {\r\n valid: errors.length === 0,\r\n errors,\r\n data: errors.length === 0 ? data : undefined,\r\n };\r\n }\r\n}\r\n","export interface ExternalSchema {\r\n parse?: (data: any) => any;\r\n safeParse?: (data: any) => { success: boolean; data?: any; error?: any };\r\n validate?: (data: any) => { value?: any; error?: any };\r\n}\r\n\r\nexport interface SchemaValidationResult {\r\n valid: boolean;\r\n data?: any;\r\n errors?: any;\r\n}\r\n\r\nexport class SchemaValidator {\r\n static validate(data: any, schema: ExternalSchema): SchemaValidationResult {\r\n // Zod-style schema\r\n if (typeof schema.safeParse === \"function\") {\r\n const result = schema.safeParse(data);\r\n if (result.success) {\r\n return { valid: true, data: result.data };\r\n }\r\n return { valid: false, errors: result.error };\r\n }\r\n\r\n // Zod parse (throws on error)\r\n if (typeof schema.parse === \"function\") {\r\n try {\r\n const parsed = schema.parse(data);\r\n return { valid: true, data: parsed };\r\n } catch (err) {\r\n return { valid: false, errors: err };\r\n }\r\n }\r\n\r\n // Joi-style schema\r\n if (typeof schema.validate === \"function\") {\r\n const result = schema.validate(data);\r\n if (result.error) {\r\n return { valid: false, errors: result.error };\r\n }\r\n return { valid: true, data: result.value };\r\n }\r\n\r\n return { valid: true, data };\r\n }\r\n}\r\n","import { readFileSync, existsSync } from \"node:fs\";\r\nimport { resolve, join } from \"node:path\";\r\nimport type { AzuraConfig } from \"../types/config.type.js\";\r\n\r\nconst CONFIG_FILES = [\r\n \"azura.config.ts\",\r\n \"azura.config.js\",\r\n \"azura.config.mjs\",\r\n \"azura.config.json\",\r\n \"azura.config.yaml\",\r\n \"azura.config.yml\",\r\n];\r\n\r\nexport class ConfigModule {\r\n private static instance: ConfigModule | null = null;\r\n private config: AzuraConfig = {};\r\n\r\n private constructor() {}\r\n\r\n static getInstance(): ConfigModule {\r\n if (!ConfigModule.instance) {\r\n ConfigModule.instance = new ConfigModule();\r\n }\r\n return ConfigModule.instance;\r\n }\r\n\r\n static async load(cwd?: string): Promise<AzuraConfig> {\r\n const instance = ConfigModule.getInstance();\r\n const baseDir = cwd ?? process.cwd();\r\n\r\n for (const file of CONFIG_FILES) {\r\n const fullPath = resolve(baseDir, file);\r\n if (!existsSync(fullPath)) continue;\r\n\r\n if (file.endsWith(\".json\")) {\r\n instance.config = JSON.parse(readFileSync(fullPath, \"utf-8\"));\r\n return instance.config;\r\n }\r\n\r\n if (file.endsWith(\".yaml\") || file.endsWith(\".yml\")) {\r\n instance.config = parseSimpleYaml(readFileSync(fullPath, \"utf-8\"));\r\n return instance.config;\r\n }\r\n\r\n if (file.endsWith(\".ts\") || file.endsWith(\".js\") || file.endsWith(\".mjs\")) {\r\n try {\r\n const mod = await import(`file://${fullPath}`);\r\n instance.config = mod.default ?? mod;\r\n return instance.config;\r\n } catch {\r\n // TS files may need transpilation — skip if import fails\r\n }\r\n }\r\n }\r\n\r\n return instance.config;\r\n }\r\n\r\n static loadSync(cwd?: string): AzuraConfig {\r\n const instance = ConfigModule.getInstance();\r\n const baseDir = cwd ?? process.cwd();\r\n\r\n for (const file of CONFIG_FILES) {\r\n const fullPath = resolve(baseDir, file);\r\n if (!existsSync(fullPath)) continue;\r\n\r\n if (file.endsWith(\".json\")) {\r\n instance.config = JSON.parse(readFileSync(fullPath, \"utf-8\"));\r\n return instance.config;\r\n }\r\n\r\n if (file.endsWith(\".yaml\") || file.endsWith(\".yml\")) {\r\n instance.config = parseSimpleYaml(readFileSync(fullPath, \"utf-8\"));\r\n return instance.config;\r\n }\r\n }\r\n\r\n return instance.config;\r\n }\r\n\r\n static get(): AzuraConfig {\r\n return ConfigModule.getInstance().config;\r\n }\r\n\r\n static set(config: AzuraConfig): void {\r\n ConfigModule.getInstance().config = config;\r\n }\r\n\r\n static merge(partial: Partial<AzuraConfig>): AzuraConfig {\r\n const instance = ConfigModule.getInstance();\r\n instance.config = deepMerge(instance.config, partial) as AzuraConfig;\r\n return instance.config;\r\n }\r\n}\r\n\r\nfunction deepMerge(target: any, source: any): any {\r\n const output = { ...target };\r\n for (const key of Object.keys(source)) {\r\n if (\r\n source[key] &&\r\n typeof source[key] === \"object\" &&\r\n !Array.isArray(source[key]) &&\r\n target[key] &&\r\n typeof target[key] === \"object\"\r\n ) {\r\n output[key] = deepMerge(target[key], source[key]);\r\n } else {\r\n output[key] = source[key];\r\n }\r\n }\r\n return output;\r\n}\r\n\r\n/**\r\n * Minimal YAML parser for flat/shallow config files.\r\n * Does not handle complex YAML features — use JSON for complex configs.\r\n */\r\nfunction parseSimpleYaml(content: string): Record<string, any> {\r\n const result: Record<string, any> = {};\r\n const lines = content.split(\"\\n\");\r\n const stack: { indent: number; obj: Record<string, any> }[] = [{ indent: -1, obj: result }];\r\n\r\n for (const line of lines) {\r\n const trimmed = line.trim();\r\n if (!trimmed || trimmed.startsWith(\"#\")) continue;\r\n\r\n const indent = line.search(/\\S/);\r\n const colonIdx = trimmed.indexOf(\":\");\r\n\r\n if (colonIdx === -1) continue;\r\n\r\n const key = trimmed.slice(0, colonIdx).trim();\r\n const rawValue = trimmed.slice(colonIdx + 1).trim();\r\n\r\n while (stack.length > 1 && stack[stack.length - 1].indent >= indent) {\r\n stack.pop();\r\n }\r\n\r\n const parent = stack[stack.length - 1].obj;\r\n\r\n if (!rawValue) {\r\n const newObj: Record<string, any> = {};\r\n parent[key] = newObj;\r\n stack.push({ indent, obj: newObj });\r\n } else {\r\n parent[key] = parseYamlValue(rawValue);\r\n }\r\n }\r\n\r\n return result;\r\n}\r\n\r\nfunction parseYamlValue(val: string): any {\r\n if (val === \"true\") return true;\r\n if (val === \"false\") return false;\r\n if (val === \"null\") return null;\r\n if (/^-?\\d+$/.test(val)) return parseInt(val, 10);\r\n if (/^-?\\d+\\.\\d+$/.test(val)) return parseFloat(val);\r\n if ((val.startsWith('\"') && val.endsWith('\"')) || (val.startsWith(\"'\") && val.endsWith(\"'\"))) {\r\n return val.slice(1, -1);\r\n }\r\n if (val.startsWith(\"[\") && val.endsWith(\"]\")) {\r\n return val\r\n .slice(1, -1)\r\n .split(\",\")\r\n .map((v) => parseYamlValue(v.trim()));\r\n }\r\n return val;\r\n}\r\n","import type { PluginHandler } from \"../types/plugins/plugin.type.js\";\r\n\r\nexport function LoggingMiddleware(): PluginHandler {\r\n return (ctx, next) => {\r\n const { req, res } = ctx;\r\n const start = process.hrtime.bigint();\r\n\r\n const originalEnd = res.end;\r\n (res as any).end = function (...args: any[]) {\r\n const duration = process.hrtime.bigint() - start;\r\n const ms = Number(duration) / 1_000_000;\r\n\r\n res.setHeader(\"X-Response-Time\", `${ms.toFixed(2)}ms`);\r\n\r\n return (originalEnd as any).apply(this, args);\r\n };\r\n\r\n next();\r\n };\r\n}\r\n"]}
|