azurajs 2.5.1 → 2.5.2-2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +5 -5
- package/dist/swagger.cjs +30 -24
- package/dist/swagger.cjs.map +1 -1
- package/dist/swagger.d.cts +0 -9
- package/dist/swagger.d.ts +0 -9
- package/dist/swagger.js +31 -25
- package/dist/swagger.js.map +1 -1
- package/package.json +4 -4
- package/src/shared/swagger/index.ts +36 -37
package/README.md
CHANGED
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
⚡ Modern, fast, and TypeScript-first web framework for Node.js and Bun with decorator-based routing.
|
|
4
4
|
|
|
5
5
|
[](https://www.npmjs.com/package/azurajs)
|
|
6
|
-
[](https://github.com/
|
|
6
|
+
[](https://github.com/azurajs/azura/blob/main/LICENSE)
|
|
7
7
|
[](https://www.typescriptlang.org/)
|
|
8
8
|
|
|
9
9
|
## Features
|
|
@@ -817,13 +817,13 @@ MIT License - see LICENSE file for details
|
|
|
817
817
|
|
|
818
818
|
## Links
|
|
819
819
|
|
|
820
|
-
- [GitHub Repository](https://github.com/
|
|
820
|
+
- [GitHub Repository](https://github.com/azurajs/azura)
|
|
821
821
|
- [NPM Package](https://www.npmjs.com/package/azurajs)
|
|
822
822
|
- [Documentation](https://azura.js.org/docs/en)
|
|
823
|
-
- [Examples](https://github.com/
|
|
823
|
+
- [Examples](https://github.com/azurajs/azura/tree/main/examples)
|
|
824
824
|
|
|
825
825
|
## Support
|
|
826
826
|
|
|
827
|
-
- 🐛 [Issue Tracker](https://github.com/
|
|
828
|
-
- 💬 [Discussions](https://github.com/
|
|
827
|
+
- 🐛 [Issue Tracker](https://github.com/azurajs/azura/issues)
|
|
828
|
+
- 💬 [Discussions](https://github.com/azurajs/azura/discussions)
|
|
829
829
|
- 📧 Email: 0xviny.dev@gmail.com
|
package/dist/swagger.cjs
CHANGED
|
@@ -672,9 +672,6 @@ var SwaggerIntegration = class {
|
|
|
672
672
|
this.app = app;
|
|
673
673
|
this.generator = new SwaggerGenerator(config);
|
|
674
674
|
}
|
|
675
|
-
/**
|
|
676
|
-
* Setup Swagger routes
|
|
677
|
-
*/
|
|
678
675
|
setup() {
|
|
679
676
|
const config = this.generator.getConfig();
|
|
680
677
|
if (!config.enabled) {
|
|
@@ -686,34 +683,43 @@ var SwaggerIntegration = class {
|
|
|
686
683
|
this.app.get(config.path, (_req, res) => {
|
|
687
684
|
try {
|
|
688
685
|
const currentDir = getCurrentDir();
|
|
689
|
-
const htmlPath = path.
|
|
690
|
-
|
|
686
|
+
const htmlPath = path.normalize(
|
|
687
|
+
path.join(currentDir, "..", "dist", "shared", "swagger", "swagger-ui-modern.html")
|
|
688
|
+
);
|
|
691
689
|
if (!fs.existsSync(htmlPath)) {
|
|
692
|
-
|
|
693
|
-
if (fs.existsSync(srcPath)) {
|
|
694
|
-
finalPath = srcPath;
|
|
695
|
-
} else {
|
|
696
|
-
throw new Error(`Swagger UI HTML not found at ${htmlPath} or ${srcPath}`);
|
|
697
|
-
}
|
|
690
|
+
throw new Error(`Swagger UI HTML not found at ${htmlPath}`);
|
|
698
691
|
}
|
|
699
|
-
let html = fs.readFileSync(
|
|
692
|
+
let html = fs.readFileSync(htmlPath, "utf-8");
|
|
700
693
|
const doc = this.generator.getDocument();
|
|
701
|
-
html = html.replace(/{{TITLE}}/g, doc.info.title);
|
|
702
|
-
html = html.replace(/{{VERSION}}/g, doc.info.version);
|
|
703
|
-
html = html.replace(/{{DESCRIPTION}}/g, doc.info.description || "");
|
|
704
|
-
res.type
|
|
694
|
+
html = html.replace(/{{TITLE}}/g, String(doc.info.title || ""));
|
|
695
|
+
html = html.replace(/{{VERSION}}/g, String(doc.info.version || ""));
|
|
696
|
+
html = html.replace(/{{DESCRIPTION}}/g, String(doc.info.description || ""));
|
|
697
|
+
if (typeof res.type === "function" && typeof res.send === "function") {
|
|
698
|
+
res.type("html").send(html);
|
|
699
|
+
return;
|
|
700
|
+
}
|
|
701
|
+
if (typeof res.setHeader === "function" && typeof res.end === "function") {
|
|
702
|
+
res.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
703
|
+
res.end(html);
|
|
704
|
+
return;
|
|
705
|
+
}
|
|
706
|
+
res.json({ error: "Response object does not support sending HTML" });
|
|
705
707
|
} catch (error) {
|
|
706
|
-
|
|
707
|
-
res.status
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
708
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
709
|
+
if (typeof res.status === "function" && typeof res.json === "function") {
|
|
710
|
+
res.status(500).json({
|
|
711
|
+
error: "Failed to load Swagger UI",
|
|
712
|
+
details: message
|
|
713
|
+
});
|
|
714
|
+
return;
|
|
715
|
+
}
|
|
716
|
+
if (typeof res.end === "function") {
|
|
717
|
+
res.end(JSON.stringify({ error: "Failed to load Swagger UI", details: message }));
|
|
718
|
+
return;
|
|
719
|
+
}
|
|
711
720
|
}
|
|
712
721
|
});
|
|
713
722
|
}
|
|
714
|
-
/**
|
|
715
|
-
* Get the generator instance
|
|
716
|
-
*/
|
|
717
723
|
getGenerator() {
|
|
718
724
|
return this.generator;
|
|
719
725
|
}
|
package/dist/swagger.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/decorators/Swagger.ts","../src/shared/swagger/SwaggerGenerator.ts","../src/shared/swagger/index.ts","../src/decorators/Route.ts","../src/shared/swagger/SwaggerHelper.ts","../src/swagger.ts"],"names":["dirname","fileURLToPath","join","existsSync","readFileSync"],"mappings":"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","file":"swagger.cjs","sourcesContent":["import type {\n ApiDocMetadata,\n ApiResponseMetadata,\n ApiParameterMetadata,\n ApiBodyMetadata,\n Schema,\n SecurityRequirement,\n Header,\n} from \"../types/swagger.type\";\n\nconst API_METADATA = new WeakMap<Function, Map<string, ApiDocMetadata>>();\nconst API_RESPONSES = new WeakMap<Function, Map<string, ApiResponseMetadata[]>>();\nconst API_PARAMETERS = new WeakMap<Function, Map<string, ApiParameterMetadata[]>>();\nconst API_BODY = new WeakMap<Function, Map<string, ApiBodyMetadata>>();\nconst API_TAGS = new WeakMap<Function, string[]>();\n\n/**\n * Decorator to document an endpoint\n */\nexport function ApiDoc(metadata: Omit<ApiDocMetadata, \"method\" | \"path\">): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_METADATA.get(ctor);\n if (!map) {\n map = new Map<string, ApiDocMetadata>();\n API_METADATA.set(ctor, map);\n }\n map.set(String(propertyKey), metadata);\n };\n}\n\n/**\n * Decorator to document a response\n */\nexport function ApiResponse(\n statusCode: number,\n description: string,\n options?: {\n type?: any;\n examples?: Record<string, any>;\n headers?: Record<string, Header>;\n }\n): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_RESPONSES.get(ctor);\n if (!map) {\n map = new Map<string, ApiResponseMetadata[]>();\n API_RESPONSES.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const responses = map.get(key) ?? [];\n responses.push({\n statusCode,\n description,\n type: options?.type,\n examples: options?.examples,\n headers: options?.headers,\n });\n map.set(key, responses);\n };\n}\n\n/**\n * Decorator to document a parameter\n */\nexport function ApiParameter(\n name: string,\n paramIn: \"query\" | \"header\" | \"path\" | \"cookie\",\n options?: {\n description?: string;\n required?: boolean;\n type?: any;\n example?: any;\n schema?: Schema;\n }\n): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_PARAMETERS.get(ctor);\n if (!map) {\n map = new Map<string, ApiParameterMetadata[]>();\n API_PARAMETERS.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const params = map.get(key) ?? [];\n params.push({\n name,\n in: paramIn,\n description: options?.description,\n required: options?.required,\n type: options?.type,\n example: options?.example,\n schema: options?.schema,\n });\n map.set(key, params);\n };\n}\n\n/**\n * Decorator to document a request body\n */\nexport function ApiBody(\n description: string,\n options?: {\n type?: any;\n required?: boolean;\n examples?: Record<string, any>;\n }\n): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_BODY.get(ctor);\n if (!map) {\n map = new Map<string, ApiBodyMetadata>();\n API_BODY.set(ctor, map);\n }\n\n map.set(String(propertyKey), {\n description,\n type: options?.type,\n required: options?.required,\n examples: options?.examples,\n });\n };\n}\n\n/**\n * Decorator to add tags to a controller\n */\nexport function ApiTags(...tags: string[]): ClassDecorator {\n return (target) => {\n API_TAGS.set(target as Function, tags);\n };\n}\n\n/**\n * Decorator to mark an endpoint as deprecated\n */\nexport function ApiDeprecated(): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_METADATA.get(ctor);\n if (!map) {\n map = new Map<string, ApiDocMetadata>();\n API_METADATA.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const existing = map.get(key) ?? {};\n map.set(key, { ...existing, deprecated: true });\n };\n}\n\n/**\n * Decorator to add security requirements\n */\nexport function ApiSecurity(...requirements: SecurityRequirement[]): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_METADATA.get(ctor);\n if (!map) {\n map = new Map<string, ApiDocMetadata>();\n API_METADATA.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const existing = map.get(key) ?? {};\n map.set(key, { ...existing, security: requirements });\n };\n}\n\n/**\n * Helper to get all swagger metadata\n */\nexport function getSwaggerMetadata(target: Function) {\n return {\n metadata: API_METADATA.get(target),\n responses: API_RESPONSES.get(target),\n parameters: API_PARAMETERS.get(target),\n body: API_BODY.get(target),\n tags: API_TAGS.get(target),\n };\n}\n\n/**\n * Unified Swagger decorator - Simple and easy to use!\n * Document everything in one place with a clean object structure.\n * \n * @example\n * ```typescript\n * @Swagger({\n * summary: \"Get user by ID\",\n * description: \"Retrieve a single user\",\n * tags: [\"Users\"],\n * parameters: [\n * {\n * name: \"id\",\n * in: \"path\",\n * description: \"User ID\",\n * required: true,\n * schema: { type: \"string\" },\n * example: \"123\"\n * }\n * ],\n * responses: {\n * 200: {\n * description: \"User found\",\n * example: { id: \"123\", name: \"John\" }\n * },\n * 404: {\n * description: \"User not found\",\n * example: { error: \"Not found\" }\n * }\n * }\n * })\n * getUser(req, res) { }\n * ```\n */\nexport function Swagger(config: {\n summary?: string;\n description?: string;\n tags?: string[];\n operationId?: string;\n deprecated?: boolean;\n security?: SecurityRequirement[];\n parameters?: Array<{\n name: string;\n in: \"query\" | \"header\" | \"path\" | \"cookie\";\n description?: string;\n required?: boolean;\n schema?: Schema;\n example?: any;\n }>;\n requestBody?: {\n description?: string;\n required?: boolean;\n content?: any;\n example?: any;\n };\n responses?: Record<number, {\n description: string;\n example?: any;\n schema?: Schema;\n headers?: Record<string, Header>;\n }>;\n}): MethodDecorator {\n return (target, propertyKey) => {\n const ctor = typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n const key = String(propertyKey);\n\n // Set basic metadata\n if (config.summary || config.description || config.operationId || config.deprecated !== undefined || config.security) {\n let metaMap = API_METADATA.get(ctor);\n if (!metaMap) {\n metaMap = new Map<string, ApiDocMetadata>();\n API_METADATA.set(ctor, metaMap);\n }\n metaMap.set(key, {\n summary: config.summary,\n description: config.description,\n operationId: config.operationId,\n deprecated: config.deprecated,\n security: config.security,\n tags: config.tags,\n });\n }\n\n // Set parameters\n if (config.parameters && config.parameters.length > 0) {\n let paramMap = API_PARAMETERS.get(ctor);\n if (!paramMap) {\n paramMap = new Map<string, ApiParameterMetadata[]>();\n API_PARAMETERS.set(ctor, paramMap);\n }\n paramMap.set(key, config.parameters.map(p => ({\n name: p.name,\n in: p.in,\n description: p.description,\n required: p.required,\n schema: p.schema,\n example: p.example,\n })));\n }\n\n // Set request body\n if (config.requestBody) {\n let bodyMap = API_BODY.get(ctor);\n if (!bodyMap) {\n bodyMap = new Map<string, ApiBodyMetadata>();\n API_BODY.set(ctor, bodyMap);\n }\n bodyMap.set(key, {\n description: config.requestBody.description,\n required: config.requestBody.required,\n type: config.requestBody.content,\n examples: config.requestBody.example ? { default: config.requestBody.example } : undefined,\n });\n }\n\n // Set responses\n if (config.responses) {\n let respMap = API_RESPONSES.get(ctor);\n if (!respMap) {\n respMap = new Map<string, ApiResponseMetadata[]>();\n API_RESPONSES.set(ctor, respMap);\n }\n const responses = Object.entries(config.responses).map(([code, resp]) => ({\n statusCode: Number(code),\n description: resp.description,\n type: resp.schema,\n examples: resp.example ? { default: resp.example } : undefined,\n headers: resp.headers,\n }));\n respMap.set(key, responses);\n }\n };\n}\n","import type {\n OpenAPIDocument,\n OpenAPIPaths,\n Operation,\n PathItem,\n Parameter,\n Response,\n Schema,\n Reference,\n MediaType,\n SwaggerConfig,\n RequestBody,\n} from \"../../types/swagger.type\";\nimport { getSwaggerMetadata } from \"../../decorators/Swagger\";\nimport type { RouteDefinition } from \"../../types/routes.type\";\n\nexport class SwaggerGenerator {\n private config: Required<SwaggerConfig>;\n private document: OpenAPIDocument;\n\n constructor(config?: SwaggerConfig) {\n this.config = {\n enabled: config?.enabled ?? true,\n path: config?.path ?? \"/docs\",\n title: config?.title ?? \"AzuraJS API\",\n description: config?.description ?? \"API documentation powered by AzuraJS\",\n version: config?.version ?? \"1.0.0\",\n servers: config?.servers ?? [{ url: \"http://localhost:3000\" }],\n security: config?.security ?? [],\n tags: config?.tags ?? [],\n contact: config?.contact ?? {},\n license: config?.license ?? { name: \"MIT\" },\n };\n\n this.document = {\n openapi: \"3.0.3\",\n info: {\n title: this.config.title,\n description: this.config.description,\n version: this.config.version,\n contact: this.config.contact,\n license: this.config.license,\n },\n servers: this.config.servers,\n paths: {},\n components: {\n schemas: {},\n responses: {},\n parameters: {},\n securitySchemes: {},\n },\n tags: this.config.tags,\n security: this.config.security,\n };\n }\n\n /**\n * Add routes from a controller to the OpenAPI document\n */\n public addController(controller: any, routes: RouteDefinition[], prefix = \"\"): void {\n const metadata = getSwaggerMetadata(controller.constructor);\n const controllerTags = metadata.tags ?? [];\n\n for (const route of routes) {\n const fullPath = this.normalizePath(prefix + route.path);\n const method = route.method.toLowerCase() as keyof PathItem;\n\n if (!this.document.paths[fullPath]) {\n this.document.paths[fullPath] = {};\n }\n\n const methodMetadata = metadata.metadata?.get(route.propertyKey);\n const responses = metadata.responses?.get(route.propertyKey) ?? [];\n const parameters = metadata.parameters?.get(route.propertyKey) ?? [];\n const body = metadata.body?.get(route.propertyKey);\n\n const operation: Operation = {\n summary: methodMetadata?.summary ?? route.description,\n description: methodMetadata?.description,\n tags: methodMetadata?.tags ?? controllerTags,\n operationId:\n methodMetadata?.operationId ??\n `${route.method}_${fullPath.replace(/[^a-zA-Z0-9]/g, \"_\")}`,\n deprecated: methodMetadata?.deprecated,\n security: methodMetadata?.security,\n parameters: this.buildParameters(parameters, route),\n responses: this.buildResponses(responses),\n };\n\n if (body) {\n operation.requestBody = this.buildRequestBody(body);\n }\n\n (this.document.paths[fullPath] as any)[method] = operation;\n }\n }\n\n /**\n * Add a single route manually without decorators (for JavaScript/plain TypeScript users)\n * \n * @example\n * ```javascript\n * const swagger = setupSwagger(app, { title: \"My API\" });\n * \n * app.get('/users/:id', (req, res) => {\n * res.json({ id: req.params.id, name: 'John' });\n * });\n * \n * swagger.addRoute({\n * method: 'GET',\n * path: '/users/:id',\n * summary: 'Get user by ID',\n * description: 'Returns a single user',\n * tags: ['Users'],\n * parameters: [{\n * name: 'id',\n * in: 'path',\n * required: true,\n * schema: { type: 'string' },\n * description: 'User ID'\n * }],\n * responses: {\n * 200: {\n * description: 'Successful response',\n * content: {\n * 'application/json': {\n * schema: {\n * type: 'object',\n * properties: {\n * id: { type: 'string' },\n * name: { type: 'string' }\n * }\n * }\n * }\n * }\n * }\n * }\n * });\n * ```\n */\n public addRoute(config: {\n method: string;\n path: string;\n summary?: string;\n description?: string;\n tags?: string[];\n operationId?: string;\n deprecated?: boolean;\n security?: Array<Record<string, string[]>>;\n parameters?: Parameter[];\n requestBody?: RequestBody;\n responses?: Record<string, Response>;\n }): void {\n const fullPath = this.normalizePath(config.path);\n const method = config.method.toLowerCase() as keyof PathItem;\n\n if (!this.document.paths[fullPath]) {\n this.document.paths[fullPath] = {};\n }\n\n const pathParams = this.extractPathParams(config.path);\n const allParameters: Parameter[] = [\n ...(config.parameters || []),\n ...pathParams\n .filter(param => !config.parameters?.some(p => p.name === param))\n .map(param => ({\n name: param,\n in: 'path' as const,\n required: true,\n schema: { type: 'string' as const },\n description: `Path parameter: ${param}`,\n })),\n ];\n\n const operation: Operation = {\n summary: config.summary,\n description: config.description,\n tags: config.tags,\n operationId: config.operationId ?? `${config.method}_${fullPath.replace(/[^a-zA-Z0-9]/g, \"_\")}`,\n deprecated: config.deprecated,\n security: config.security,\n parameters: allParameters.length > 0 ? allParameters : undefined,\n responses: config.responses || {\n 200: {\n description: 'Successful response',\n },\n },\n };\n\n if (config.requestBody) {\n operation.requestBody = config.requestBody;\n }\n\n (this.document.paths[fullPath] as any)[method] = operation;\n }\n\n /**\n * SIMPLE API - Add route with easy object structure\n * This is the easiest way to document routes without decorators!\n * \n * @example\n * ```javascript\n * swagger.addDoc({\n * method: 'GET',\n * path: '/users/:id',\n * summary: 'Get user by ID',\n * tags: ['Users'],\n * parameters: [\n * { name: 'id', in: 'path', required: true, schema: { type: 'string' }, example: '123' }\n * ],\n * responses: {\n * 200: { description: 'User found', example: { id: '123', name: 'John' } },\n * 404: { description: 'Not found', example: { error: 'User not found' } }\n * }\n * });\n * ```\n */\n public addDoc(config: {\n method: string;\n path: string;\n summary?: string;\n description?: string;\n tags?: string[];\n operationId?: string;\n deprecated?: boolean;\n security?: Array<Record<string, string[]>>;\n parameters?: Array<{\n name: string;\n in: \"query\" | \"header\" | \"path\" | \"cookie\";\n description?: string;\n required?: boolean;\n schema?: Schema | Reference;\n example?: any;\n }>;\n requestBody?: {\n description?: string;\n required?: boolean;\n schema?: Schema | Reference;\n example?: any;\n };\n responses?: Record<number, {\n description: string;\n example?: any;\n schema?: Schema | Reference;\n }>;\n }): void {\n const fullPath = this.normalizePath(config.path);\n const method = config.method.toLowerCase() as keyof PathItem;\n\n if (!this.document.paths[fullPath]) {\n this.document.paths[fullPath] = {};\n }\n\n // Auto-detect path parameters and merge with provided parameters\n const pathParams = this.extractPathParams(config.path);\n const providedParams = config.parameters || [];\n \n const allParameters: Parameter[] = [\n ...providedParams.map(p => ({\n name: p.name,\n in: p.in,\n description: p.description,\n required: p.required ?? (p.in === 'path'),\n schema: p.schema,\n example: p.example,\n })),\n // Add missing path params\n ...pathParams\n .filter(param => !providedParams.some(p => p.name === param))\n .map(param => ({\n name: param,\n in: 'path' as const,\n required: true,\n schema: { type: 'string' as const },\n description: `Path parameter: ${param}`,\n })),\n ];\n\n // Build responses\n const responses: Record<string, Response> = {};\n if (config.responses) {\n for (const [code, resp] of Object.entries(config.responses)) {\n responses[code] = {\n description: resp.description,\n content: resp.schema || resp.example ? {\n 'application/json': {\n schema: resp.schema,\n ...(resp.example && { examples: { default: { value: resp.example } } }),\n },\n } : undefined,\n };\n }\n } else {\n responses['200'] = { description: 'Successful response' };\n }\n\n const operation: Operation = {\n summary: config.summary,\n description: config.description,\n tags: config.tags,\n operationId: config.operationId ?? `${config.method}_${fullPath.replace(/[^a-zA-Z0-9]/g, \"_\")}`,\n deprecated: config.deprecated,\n security: config.security,\n parameters: allParameters.length > 0 ? allParameters : undefined,\n responses,\n };\n\n // Add request body if provided\n if (config.requestBody) {\n operation.requestBody = {\n description: config.requestBody.description,\n required: config.requestBody.required ?? false,\n content: {\n 'application/json': {\n schema: config.requestBody.schema,\n ...(config.requestBody.example && { \n examples: { default: { value: config.requestBody.example } } \n }),\n },\n },\n };\n }\n\n (this.document.paths[fullPath] as any)[method] = operation;\n }\n\n /**\n * Build parameters for operation\n */\n private buildParameters(\n parameters: Array<{\n name: string;\n in: \"query\" | \"header\" | \"path\" | \"cookie\";\n description?: string;\n required?: boolean;\n type?: any;\n example?: any;\n schema?: Schema;\n }>,\n route: RouteDefinition\n ): Parameter[] {\n const params: Parameter[] = [];\n\n // Add path parameters from route\n const pathParams = this.extractPathParams(route.path);\n for (const paramName of pathParams) {\n const existing = parameters.find((p) => p.name === paramName && p.in === \"path\");\n params.push({\n name: paramName,\n in: \"path\",\n required: true,\n description: existing?.description ?? `Path parameter ${paramName}`,\n schema: existing?.schema ?? this.typeToSchema(existing?.type) ?? { type: \"string\" },\n example: existing?.example,\n });\n }\n\n // Add other parameters\n for (const param of parameters) {\n if (param.in !== \"path\") {\n params.push({\n name: param.name,\n in: param.in,\n required: param.required ?? false,\n description: param.description,\n schema: param.schema ?? this.typeToSchema(param.type) ?? { type: \"string\" },\n example: param.example,\n });\n }\n }\n\n return params;\n }\n\n /**\n * Build responses for operation\n */\n private buildResponses(\n responses: Array<{\n statusCode: number;\n description: string;\n type?: any;\n examples?: Record<string, any>;\n headers?: Record<string, any>;\n }>\n ): { [statusCode: string]: Response } {\n const result: { [statusCode: string]: Response } = {};\n\n if (responses.length === 0) {\n result[\"200\"] = {\n description: \"Successful response\",\n content: {\n \"application/json\": {\n schema: { type: \"object\" },\n },\n },\n };\n } else {\n for (const response of responses) {\n const content: Record<string, MediaType> = {};\n\n if (response.type) {\n content[\"application/json\"] = {\n schema: this.typeToSchema(response.type) ?? { type: \"object\" },\n examples: response.examples\n ? Object.entries(response.examples).reduce((acc, [key, value]) => {\n acc[key] = { value };\n return acc;\n }, {} as Record<string, { value: any }>)\n : undefined,\n };\n }\n\n result[String(response.statusCode)] = {\n description: response.description,\n content: Object.keys(content).length > 0 ? content : undefined,\n headers: response.headers,\n };\n }\n }\n\n return result;\n }\n\n /**\n * Build request body\n */\n private buildRequestBody(body: {\n description?: string;\n type?: any;\n required?: boolean;\n examples?: Record<string, any>;\n }): RequestBody {\n return {\n description: body.description,\n required: body.required ?? false,\n content: {\n \"application/json\": {\n schema: this.typeToSchema(body.type) ?? { type: \"object\" },\n examples: body.examples\n ? Object.entries(body.examples).reduce((acc, [key, value]) => {\n acc[key] = { value };\n return acc;\n }, {} as Record<string, { value: any }>)\n : undefined,\n },\n },\n };\n }\n\n /**\n * Convert TypeScript type to OpenAPI schema\n */\n private typeToSchema(type: any): Schema | undefined {\n if (!type) return undefined;\n\n // Handle primitive types\n if (type === String) return { type: \"string\" };\n if (type === Number) return { type: \"number\" };\n if (type === Boolean) return { type: \"boolean\" };\n if (type === Array) return { type: \"array\", items: { type: \"object\" } };\n if (type === Object) return { type: \"object\" };\n\n // Handle class types - extract properties\n if (typeof type === \"function\") {\n const instance = new type();\n const properties: Record<string, Schema> = {};\n\n for (const key of Object.keys(instance)) {\n const value = instance[key];\n properties[key] = this.inferSchema(value);\n }\n\n return {\n type: \"object\",\n properties,\n };\n }\n\n return undefined;\n }\n\n /**\n * Infer schema from value\n */\n private inferSchema(value: any): Schema {\n const type = typeof value;\n\n if (type === \"string\") return { type: \"string\" };\n if (type === \"number\") return { type: \"number\" };\n if (type === \"boolean\") return { type: \"boolean\" };\n if (Array.isArray(value)) {\n return {\n type: \"array\",\n items: value.length > 0 ? this.inferSchema(value[0]) : { type: \"object\" },\n };\n }\n if (type === \"object\" && value !== null) {\n const properties: Record<string, Schema> = {};\n for (const key in value) {\n properties[key] = this.inferSchema(value[key]);\n }\n return { type: \"object\", properties };\n }\n\n return { type: \"object\" };\n }\n\n /**\n * Extract path parameters from route path\n */\n private extractPathParams(path: string): string[] {\n const matches = path.match(/:([a-zA-Z0-9_]+)/g);\n return matches ? matches.map((m) => m.slice(1)) : [];\n }\n\n /**\n * Normalize path to OpenAPI format\n */\n private normalizePath(path: string): string {\n // Convert :param to {param}\n return path.replace(/:([a-zA-Z0-9_]+)/g, \"{$1}\");\n }\n\n /**\n * Add a schema to components\n */\n public addSchema(name: string, schema: Schema): void {\n if (!this.document.components) {\n this.document.components = { schemas: {} };\n }\n if (!this.document.components.schemas) {\n this.document.components.schemas = {};\n }\n this.document.components.schemas[name] = schema;\n }\n\n /**\n * Add a security scheme to components\n */\n public addSecurityScheme(name: string, scheme: any): void {\n if (!this.document.components) {\n this.document.components = { securitySchemes: {} };\n }\n if (!this.document.components.securitySchemes) {\n this.document.components.securitySchemes = {};\n }\n this.document.components.securitySchemes[name] = scheme;\n }\n\n /**\n * Get the OpenAPI document\n */\n public getDocument(): OpenAPIDocument {\n return this.document;\n }\n\n /**\n * Get the config\n */\n public getConfig(): Required<SwaggerConfig> {\n return this.config;\n }\n\n /**\n * Get the document as JSON string\n */\n public toJSON(): string {\n return JSON.stringify(this.document, null, 2);\n }\n\n /**\n * Helper to create a simple response schema\n */\n public static createResponse(description: string, schema?: Schema | Reference, example?: any): Response {\n return {\n description,\n content: schema ? {\n 'application/json': {\n schema,\n ...(example && { examples: { default: { value: example } } }),\n },\n } : undefined,\n };\n }\n\n /**\n * Helper to create a request body\n */\n public static createRequestBody(schema: Schema | Reference, description?: string, required = true, example?: any): RequestBody {\n return {\n description,\n required,\n content: {\n 'application/json': {\n schema,\n ...(example && { examples: { default: { value: example } } }),\n },\n },\n };\n }\n\n /**\n * Helper to create a parameter\n */\n public static createParameter(\n name: string,\n location: 'query' | 'path' | 'header' | 'cookie',\n schema: Schema | Reference,\n options?: {\n description?: string;\n required?: boolean;\n deprecated?: boolean;\n example?: any;\n }\n ): Parameter {\n return {\n name,\n in: location,\n description: options?.description,\n required: options?.required ?? (location === 'path'),\n deprecated: options?.deprecated,\n schema,\n example: options?.example,\n };\n }\n\n /**\n * Helper to create a simple object schema\n */\n public static createSchema(properties: Record<string, Schema | Reference>, required?: string[]): Schema {\n return {\n type: 'object',\n properties,\n required,\n };\n }\n}\n","import type { AzuraClient } from \"../../infra/Server\";\nimport { SwaggerGenerator } from \"./SwaggerGenerator\";\nimport type { SwaggerConfig } from \"../../types/swagger.type\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n// Resolve o diretório atual de forma compatível com ESM e CJS\nfunction getCurrentDir(): string {\n if (typeof __dirname !== 'undefined') {\n return __dirname;\n }\n return dirname(fileURLToPath(import.meta.url));\n}\n\nexport class SwaggerIntegration {\n private generator: SwaggerGenerator;\n private app: AzuraClient;\n\n constructor(app: AzuraClient, config?: SwaggerConfig) {\n this.app = app;\n this.generator = new SwaggerGenerator(config);\n }\n\n /**\n * Setup Swagger routes\n */\n public setup(): void {\n const config = this.generator.getConfig();\n\n if (!config.enabled) {\n return;\n }\n\n // Route to serve OpenAPI spec JSON\n this.app.get(`/api-spec.json`, (_req: any, res: any) => {\n res.json(this.generator.getDocument());\n });\n\n // Route to serve Swagger UI\n this.app.get(config.path, (_req: any, res: any) => {\n try {\n const currentDir = getCurrentDir();\n const htmlPath = join(currentDir, \"swagger-ui-modern.html\");\n \n // Fallback para buscar em diferentes locais possíveis\n let finalPath = htmlPath;\n if (!existsSync(htmlPath)) {\n // Tenta buscar na raiz do pacote (para desenvolvimento)\n const srcPath = join(currentDir, \"..\", \"..\", \"..\", \"src\", \"shared\", \"swagger\", \"swagger-ui-modern.html\");\n if (existsSync(srcPath)) {\n finalPath = srcPath;\n } else {\n throw new Error(`Swagger UI HTML not found at ${htmlPath} or ${srcPath}`);\n }\n }\n\n let html = readFileSync(finalPath, \"utf-8\");\n\n // Replace placeholders\n const doc = this.generator.getDocument();\n html = html.replace(/{{TITLE}}/g, doc.info.title);\n html = html.replace(/{{VERSION}}/g, doc.info.version);\n html = html.replace(/{{DESCRIPTION}}/g, doc.info.description || \"\");\n\n res.type(\"html\").send(html);\n } catch (error) {\n console.error(\"Swagger UI error:\", error);\n res.status(500).json({ \n error: \"Failed to load Swagger UI\",\n details: error instanceof Error ? error.message : String(error)\n });\n }\n });\n }\n\n /**\n * Get the generator instance\n */\n public getGenerator(): SwaggerGenerator {\n return this.generator;\n }\n}\n\n/**\n * Helper function to setup Swagger in an AzuraClient instance\n */\nexport function setupSwagger(app: AzuraClient, config?: SwaggerConfig): SwaggerGenerator {\n const integration = new SwaggerIntegration(app, config);\n integration.setup();\n return integration.getGenerator();\n}\n","import type { AzuraClient } from \"../infra/Server\";\nimport type { RequestServer } from \"../types/http/request.type\";\nimport type { ResponseServer } from \"../types/http/response.type\";\nimport type { ParamDefinition, ParamSource, RouteDefinition } from \"../types/routes.type\";\n\nconst PREFIX = new WeakMap<Function, string>();\nconst ROUTES = new WeakMap<Function, RouteDefinition[]>();\nconst PARAMS = new WeakMap<Function, Map<string, ParamDefinition[]>>();\nconst DESCRIPTIONS = new WeakMap<Function, Map<string, string>>();\n\nexport function Controller(prefix = \"\"): ClassDecorator {\n return (target) => {\n PREFIX.set(target as Function, prefix);\n };\n}\n\nexport function Description(description: string): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = DESCRIPTIONS.get(ctor);\n if (!map) {\n map = new Map<string, string>();\n DESCRIPTIONS.set(ctor, map);\n }\n map.set(String(propertyKey), description);\n };\n}\n\nfunction createMethodDecorator(method: string) {\n return function (path = \"\"): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n const key = String(propertyKey);\n const routes = ROUTES.get(ctor) ?? [];\n const params = PARAMS.get(ctor)?.get(key) ?? [];\n const description = DESCRIPTIONS.get(ctor)?.get(key);\n\n const exists = routes.some(\n (r) => r.method === method && r.path === path && r.propertyKey === key\n );\n if (!exists) {\n routes.push({\n method,\n path,\n propertyKey: key,\n params,\n description,\n });\n ROUTES.set(ctor, routes);\n }\n };\n };\n}\n\nfunction createParamDecorator(type: ParamSource) {\n return function (name?: string): ParameterDecorator {\n return (target, propertyKey, parameterIndex) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = PARAMS.get(ctor);\n if (!map) {\n map = new Map<string, ParamDefinition[]>();\n PARAMS.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const list = map.get(key) ?? [];\n const exists = list.some(\n (p) => p.index === parameterIndex && p.type === type && p.name === name\n );\n if (!exists) {\n list.push({\n index: parameterIndex,\n type,\n name,\n });\n map.set(key, list);\n }\n };\n };\n}\n\nexport const Get = createMethodDecorator(\"GET\");\nexport const Post = createMethodDecorator(\"POST\");\nexport const Put = createMethodDecorator(\"PUT\");\nexport const Delete = createMethodDecorator(\"DELETE\");\nexport const Patch = createMethodDecorator(\"PATCH\");\nexport const Head = createMethodDecorator(\"HEAD\");\nexport const Options = createMethodDecorator(\"OPTIONS\");\n\nexport const Req = createParamDecorator(\"req\");\nexport const Res = createParamDecorator(\"res\");\nexport const Next = createParamDecorator(\"next\");\nexport const Param = createParamDecorator(\"param\");\nexport const Query = createParamDecorator(\"query\");\nexport const Body = createParamDecorator(\"body\");\nexport const Headers = createParamDecorator(\"headers\");\nexport const Ip = createParamDecorator(\"ip\");\nexport const UserAgent = createParamDecorator(\"useragent\");\n\nexport function applyDecorators(app: AzuraClient, controllers: Array<new () => any>) {\n controllers.forEach((ControllerClass) => {\n const prefix = PREFIX.get(ControllerClass) ?? \"\";\n const instance = new ControllerClass();\n const routes = ROUTES.get(ControllerClass) ?? [];\n\n routes.forEach((r) => {\n const handler = async (\n req: RequestServer,\n res: ResponseServer,\n next?: (err?: unknown) => void\n ) => {\n try {\n const params = (r.params ?? []).slice().sort((a, b) => a.index - b.index);\n const args = params.map((p) => {\n switch (p.type) {\n case \"req\":\n return req;\n case \"res\":\n return res;\n case \"next\":\n return next;\n case \"param\":\n return p.name ? req.params[p.name] : req.params;\n case \"query\":\n return p.name ? req.query[p.name] : req.query;\n case \"body\": {\n const body = req.body as Record<string, unknown> | undefined;\n return p.name ? body?.[p.name] : body;\n }\n case \"headers\":\n return p.name ? req.headers[p.name.toLowerCase()] : req.headers;\n case \"ip\":\n return req.ip;\n case \"useragent\":\n return req.headers[\"user-agent\"];\n default:\n return undefined;\n }\n });\n\n const fn = (instance as Record<string, unknown>)[r.propertyKey] as (\n ...args: unknown[]\n ) => unknown;\n const result = fn(...args);\n if (result instanceof Promise) await result;\n } catch (err) {\n if (next) next(err);\n }\n };\n\n app.addRoute(r.method, prefix + r.path, handler);\n });\n });\n}\n\n/**\n * Get routes metadata from a controller class\n * @internal Used by Swagger integration\n */\nexport function getControllerMetadata(ControllerClass: Function) {\n return {\n prefix: PREFIX.get(ControllerClass) || \"\",\n routes: ROUTES.get(ControllerClass) || [],\n params: PARAMS.get(ControllerClass),\n descriptions: DESCRIPTIONS.get(ControllerClass),\n };\n}\n","import type { AzuraClient } from \"../../infra/Server\";\nimport type { SwaggerConfig } from \"../../types/swagger.type\";\nimport { SwaggerIntegration } from \"./index\";\nimport { SwaggerGenerator } from \"./SwaggerGenerator\";\nimport { getControllerMetadata, applyDecorators } from \"../../decorators/Route\";\n\n/**\n * Setup Swagger with automatic controller registration\n * This is the SIMPLEST way to use Swagger in AzuraJS - just pass your controllers!\n * \n * @example\n * ```typescript\n * import { AzuraClient } from \"azurajs\";\n * import { setupSwaggerWithControllers } from \"azurajs\";\n * \n * const app = new AzuraClient();\n * \n * setupSwaggerWithControllers(app, {\n * title: \"My API\",\n * version: \"1.0.0\",\n * description: \"Simple and beautiful API docs\"\n * }, [UserController, ProductController]);\n * \n * app.listen(3000);\n * // That's it! Visit http://localhost:3000/docs\n * ```\n */\nexport function setupSwaggerWithControllers(\n app: AzuraClient,\n config: SwaggerConfig,\n controllers: Array<new () => any>\n): SwaggerGenerator {\n // Setup Swagger first\n const integration = new SwaggerIntegration(app, config);\n integration.setup();\n const swaggerGen = integration.getGenerator();\n\n // Register all controllers - both routes and swagger\n applyDecorators(app, controllers);\n \n // Add controllers to Swagger\n controllers.forEach((ControllerClass) => {\n const metadata = getControllerMetadata(ControllerClass);\n \n if (metadata.routes.length > 0) {\n const instance = new ControllerClass();\n swaggerGen.addController(instance, metadata.routes, metadata.prefix);\n }\n });\n\n return swaggerGen;\n}\n","/**\n * AzuraJS Swagger/OpenAPI Integration\n * Import from \"azurajs/swagger\" to use Swagger documentation\n */\n\nimport { SwaggerGenerator } from \"./swagger\";\n\n// Main Swagger exports\nexport { setupSwagger, SwaggerIntegration } from \"./shared/swagger\";\nexport { SwaggerGenerator } from \"./shared/swagger/SwaggerGenerator\";\nexport { setupSwaggerWithControllers } from \"./shared/swagger/SwaggerHelper\";\n\n// Swagger decorators (for decorator-based approach)\nexport {\n ApiDoc,\n ApiResponse,\n ApiParameter,\n ApiBody,\n ApiTags,\n ApiDeprecated,\n ApiSecurity,\n Swagger,\n getSwaggerMetadata,\n} from \"./decorators/Swagger\";\n\n// Swagger types\nexport type * from \"./types/swagger.type\";\n\n// Re-export helpers for manual route documentation (for JavaScript/plain TypeScript)\nexport const SwaggerHelpers = {\n createResponse: SwaggerGenerator.createResponse,\n createRequestBody: SwaggerGenerator.createRequestBody,\n createParameter: SwaggerGenerator.createParameter,\n createSchema: SwaggerGenerator.createSchema,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/decorators/Swagger.ts","../src/shared/swagger/SwaggerGenerator.ts","../src/shared/swagger/index.ts","../src/decorators/Route.ts","../src/shared/swagger/SwaggerHelper.ts","../src/swagger.ts"],"names":["dirname","fileURLToPath","normalize","join","existsSync","readFileSync"],"mappings":"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","file":"swagger.cjs","sourcesContent":["import type {\n ApiDocMetadata,\n ApiResponseMetadata,\n ApiParameterMetadata,\n ApiBodyMetadata,\n Schema,\n SecurityRequirement,\n Header,\n} from \"../types/swagger.type\";\n\nconst API_METADATA = new WeakMap<Function, Map<string, ApiDocMetadata>>();\nconst API_RESPONSES = new WeakMap<Function, Map<string, ApiResponseMetadata[]>>();\nconst API_PARAMETERS = new WeakMap<Function, Map<string, ApiParameterMetadata[]>>();\nconst API_BODY = new WeakMap<Function, Map<string, ApiBodyMetadata>>();\nconst API_TAGS = new WeakMap<Function, string[]>();\n\n/**\n * Decorator to document an endpoint\n */\nexport function ApiDoc(metadata: Omit<ApiDocMetadata, \"method\" | \"path\">): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_METADATA.get(ctor);\n if (!map) {\n map = new Map<string, ApiDocMetadata>();\n API_METADATA.set(ctor, map);\n }\n map.set(String(propertyKey), metadata);\n };\n}\n\n/**\n * Decorator to document a response\n */\nexport function ApiResponse(\n statusCode: number,\n description: string,\n options?: {\n type?: any;\n examples?: Record<string, any>;\n headers?: Record<string, Header>;\n }\n): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_RESPONSES.get(ctor);\n if (!map) {\n map = new Map<string, ApiResponseMetadata[]>();\n API_RESPONSES.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const responses = map.get(key) ?? [];\n responses.push({\n statusCode,\n description,\n type: options?.type,\n examples: options?.examples,\n headers: options?.headers,\n });\n map.set(key, responses);\n };\n}\n\n/**\n * Decorator to document a parameter\n */\nexport function ApiParameter(\n name: string,\n paramIn: \"query\" | \"header\" | \"path\" | \"cookie\",\n options?: {\n description?: string;\n required?: boolean;\n type?: any;\n example?: any;\n schema?: Schema;\n }\n): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_PARAMETERS.get(ctor);\n if (!map) {\n map = new Map<string, ApiParameterMetadata[]>();\n API_PARAMETERS.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const params = map.get(key) ?? [];\n params.push({\n name,\n in: paramIn,\n description: options?.description,\n required: options?.required,\n type: options?.type,\n example: options?.example,\n schema: options?.schema,\n });\n map.set(key, params);\n };\n}\n\n/**\n * Decorator to document a request body\n */\nexport function ApiBody(\n description: string,\n options?: {\n type?: any;\n required?: boolean;\n examples?: Record<string, any>;\n }\n): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_BODY.get(ctor);\n if (!map) {\n map = new Map<string, ApiBodyMetadata>();\n API_BODY.set(ctor, map);\n }\n\n map.set(String(propertyKey), {\n description,\n type: options?.type,\n required: options?.required,\n examples: options?.examples,\n });\n };\n}\n\n/**\n * Decorator to add tags to a controller\n */\nexport function ApiTags(...tags: string[]): ClassDecorator {\n return (target) => {\n API_TAGS.set(target as Function, tags);\n };\n}\n\n/**\n * Decorator to mark an endpoint as deprecated\n */\nexport function ApiDeprecated(): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_METADATA.get(ctor);\n if (!map) {\n map = new Map<string, ApiDocMetadata>();\n API_METADATA.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const existing = map.get(key) ?? {};\n map.set(key, { ...existing, deprecated: true });\n };\n}\n\n/**\n * Decorator to add security requirements\n */\nexport function ApiSecurity(...requirements: SecurityRequirement[]): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_METADATA.get(ctor);\n if (!map) {\n map = new Map<string, ApiDocMetadata>();\n API_METADATA.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const existing = map.get(key) ?? {};\n map.set(key, { ...existing, security: requirements });\n };\n}\n\n/**\n * Helper to get all swagger metadata\n */\nexport function getSwaggerMetadata(target: Function) {\n return {\n metadata: API_METADATA.get(target),\n responses: API_RESPONSES.get(target),\n parameters: API_PARAMETERS.get(target),\n body: API_BODY.get(target),\n tags: API_TAGS.get(target),\n };\n}\n\n/**\n * Unified Swagger decorator - Simple and easy to use!\n * Document everything in one place with a clean object structure.\n * \n * @example\n * ```typescript\n * @Swagger({\n * summary: \"Get user by ID\",\n * description: \"Retrieve a single user\",\n * tags: [\"Users\"],\n * parameters: [\n * {\n * name: \"id\",\n * in: \"path\",\n * description: \"User ID\",\n * required: true,\n * schema: { type: \"string\" },\n * example: \"123\"\n * }\n * ],\n * responses: {\n * 200: {\n * description: \"User found\",\n * example: { id: \"123\", name: \"John\" }\n * },\n * 404: {\n * description: \"User not found\",\n * example: { error: \"Not found\" }\n * }\n * }\n * })\n * getUser(req, res) { }\n * ```\n */\nexport function Swagger(config: {\n summary?: string;\n description?: string;\n tags?: string[];\n operationId?: string;\n deprecated?: boolean;\n security?: SecurityRequirement[];\n parameters?: Array<{\n name: string;\n in: \"query\" | \"header\" | \"path\" | \"cookie\";\n description?: string;\n required?: boolean;\n schema?: Schema;\n example?: any;\n }>;\n requestBody?: {\n description?: string;\n required?: boolean;\n content?: any;\n example?: any;\n };\n responses?: Record<number, {\n description: string;\n example?: any;\n schema?: Schema;\n headers?: Record<string, Header>;\n }>;\n}): MethodDecorator {\n return (target, propertyKey) => {\n const ctor = typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n const key = String(propertyKey);\n\n // Set basic metadata\n if (config.summary || config.description || config.operationId || config.deprecated !== undefined || config.security) {\n let metaMap = API_METADATA.get(ctor);\n if (!metaMap) {\n metaMap = new Map<string, ApiDocMetadata>();\n API_METADATA.set(ctor, metaMap);\n }\n metaMap.set(key, {\n summary: config.summary,\n description: config.description,\n operationId: config.operationId,\n deprecated: config.deprecated,\n security: config.security,\n tags: config.tags,\n });\n }\n\n // Set parameters\n if (config.parameters && config.parameters.length > 0) {\n let paramMap = API_PARAMETERS.get(ctor);\n if (!paramMap) {\n paramMap = new Map<string, ApiParameterMetadata[]>();\n API_PARAMETERS.set(ctor, paramMap);\n }\n paramMap.set(key, config.parameters.map(p => ({\n name: p.name,\n in: p.in,\n description: p.description,\n required: p.required,\n schema: p.schema,\n example: p.example,\n })));\n }\n\n // Set request body\n if (config.requestBody) {\n let bodyMap = API_BODY.get(ctor);\n if (!bodyMap) {\n bodyMap = new Map<string, ApiBodyMetadata>();\n API_BODY.set(ctor, bodyMap);\n }\n bodyMap.set(key, {\n description: config.requestBody.description,\n required: config.requestBody.required,\n type: config.requestBody.content,\n examples: config.requestBody.example ? { default: config.requestBody.example } : undefined,\n });\n }\n\n // Set responses\n if (config.responses) {\n let respMap = API_RESPONSES.get(ctor);\n if (!respMap) {\n respMap = new Map<string, ApiResponseMetadata[]>();\n API_RESPONSES.set(ctor, respMap);\n }\n const responses = Object.entries(config.responses).map(([code, resp]) => ({\n statusCode: Number(code),\n description: resp.description,\n type: resp.schema,\n examples: resp.example ? { default: resp.example } : undefined,\n headers: resp.headers,\n }));\n respMap.set(key, responses);\n }\n };\n}\n","import type {\n OpenAPIDocument,\n OpenAPIPaths,\n Operation,\n PathItem,\n Parameter,\n Response,\n Schema,\n Reference,\n MediaType,\n SwaggerConfig,\n RequestBody,\n} from \"../../types/swagger.type\";\nimport { getSwaggerMetadata } from \"../../decorators/Swagger\";\nimport type { RouteDefinition } from \"../../types/routes.type\";\n\nexport class SwaggerGenerator {\n private config: Required<SwaggerConfig>;\n private document: OpenAPIDocument;\n\n constructor(config?: SwaggerConfig) {\n this.config = {\n enabled: config?.enabled ?? true,\n path: config?.path ?? \"/docs\",\n title: config?.title ?? \"AzuraJS API\",\n description: config?.description ?? \"API documentation powered by AzuraJS\",\n version: config?.version ?? \"1.0.0\",\n servers: config?.servers ?? [{ url: \"http://localhost:3000\" }],\n security: config?.security ?? [],\n tags: config?.tags ?? [],\n contact: config?.contact ?? {},\n license: config?.license ?? { name: \"MIT\" },\n };\n\n this.document = {\n openapi: \"3.0.3\",\n info: {\n title: this.config.title,\n description: this.config.description,\n version: this.config.version,\n contact: this.config.contact,\n license: this.config.license,\n },\n servers: this.config.servers,\n paths: {},\n components: {\n schemas: {},\n responses: {},\n parameters: {},\n securitySchemes: {},\n },\n tags: this.config.tags,\n security: this.config.security,\n };\n }\n\n /**\n * Add routes from a controller to the OpenAPI document\n */\n public addController(controller: any, routes: RouteDefinition[], prefix = \"\"): void {\n const metadata = getSwaggerMetadata(controller.constructor);\n const controllerTags = metadata.tags ?? [];\n\n for (const route of routes) {\n const fullPath = this.normalizePath(prefix + route.path);\n const method = route.method.toLowerCase() as keyof PathItem;\n\n if (!this.document.paths[fullPath]) {\n this.document.paths[fullPath] = {};\n }\n\n const methodMetadata = metadata.metadata?.get(route.propertyKey);\n const responses = metadata.responses?.get(route.propertyKey) ?? [];\n const parameters = metadata.parameters?.get(route.propertyKey) ?? [];\n const body = metadata.body?.get(route.propertyKey);\n\n const operation: Operation = {\n summary: methodMetadata?.summary ?? route.description,\n description: methodMetadata?.description,\n tags: methodMetadata?.tags ?? controllerTags,\n operationId:\n methodMetadata?.operationId ??\n `${route.method}_${fullPath.replace(/[^a-zA-Z0-9]/g, \"_\")}`,\n deprecated: methodMetadata?.deprecated,\n security: methodMetadata?.security,\n parameters: this.buildParameters(parameters, route),\n responses: this.buildResponses(responses),\n };\n\n if (body) {\n operation.requestBody = this.buildRequestBody(body);\n }\n\n (this.document.paths[fullPath] as any)[method] = operation;\n }\n }\n\n /**\n * Add a single route manually without decorators (for JavaScript/plain TypeScript users)\n * \n * @example\n * ```javascript\n * const swagger = setupSwagger(app, { title: \"My API\" });\n * \n * app.get('/users/:id', (req, res) => {\n * res.json({ id: req.params.id, name: 'John' });\n * });\n * \n * swagger.addRoute({\n * method: 'GET',\n * path: '/users/:id',\n * summary: 'Get user by ID',\n * description: 'Returns a single user',\n * tags: ['Users'],\n * parameters: [{\n * name: 'id',\n * in: 'path',\n * required: true,\n * schema: { type: 'string' },\n * description: 'User ID'\n * }],\n * responses: {\n * 200: {\n * description: 'Successful response',\n * content: {\n * 'application/json': {\n * schema: {\n * type: 'object',\n * properties: {\n * id: { type: 'string' },\n * name: { type: 'string' }\n * }\n * }\n * }\n * }\n * }\n * }\n * });\n * ```\n */\n public addRoute(config: {\n method: string;\n path: string;\n summary?: string;\n description?: string;\n tags?: string[];\n operationId?: string;\n deprecated?: boolean;\n security?: Array<Record<string, string[]>>;\n parameters?: Parameter[];\n requestBody?: RequestBody;\n responses?: Record<string, Response>;\n }): void {\n const fullPath = this.normalizePath(config.path);\n const method = config.method.toLowerCase() as keyof PathItem;\n\n if (!this.document.paths[fullPath]) {\n this.document.paths[fullPath] = {};\n }\n\n const pathParams = this.extractPathParams(config.path);\n const allParameters: Parameter[] = [\n ...(config.parameters || []),\n ...pathParams\n .filter(param => !config.parameters?.some(p => p.name === param))\n .map(param => ({\n name: param,\n in: 'path' as const,\n required: true,\n schema: { type: 'string' as const },\n description: `Path parameter: ${param}`,\n })),\n ];\n\n const operation: Operation = {\n summary: config.summary,\n description: config.description,\n tags: config.tags,\n operationId: config.operationId ?? `${config.method}_${fullPath.replace(/[^a-zA-Z0-9]/g, \"_\")}`,\n deprecated: config.deprecated,\n security: config.security,\n parameters: allParameters.length > 0 ? allParameters : undefined,\n responses: config.responses || {\n 200: {\n description: 'Successful response',\n },\n },\n };\n\n if (config.requestBody) {\n operation.requestBody = config.requestBody;\n }\n\n (this.document.paths[fullPath] as any)[method] = operation;\n }\n\n /**\n * SIMPLE API - Add route with easy object structure\n * This is the easiest way to document routes without decorators!\n * \n * @example\n * ```javascript\n * swagger.addDoc({\n * method: 'GET',\n * path: '/users/:id',\n * summary: 'Get user by ID',\n * tags: ['Users'],\n * parameters: [\n * { name: 'id', in: 'path', required: true, schema: { type: 'string' }, example: '123' }\n * ],\n * responses: {\n * 200: { description: 'User found', example: { id: '123', name: 'John' } },\n * 404: { description: 'Not found', example: { error: 'User not found' } }\n * }\n * });\n * ```\n */\n public addDoc(config: {\n method: string;\n path: string;\n summary?: string;\n description?: string;\n tags?: string[];\n operationId?: string;\n deprecated?: boolean;\n security?: Array<Record<string, string[]>>;\n parameters?: Array<{\n name: string;\n in: \"query\" | \"header\" | \"path\" | \"cookie\";\n description?: string;\n required?: boolean;\n schema?: Schema | Reference;\n example?: any;\n }>;\n requestBody?: {\n description?: string;\n required?: boolean;\n schema?: Schema | Reference;\n example?: any;\n };\n responses?: Record<number, {\n description: string;\n example?: any;\n schema?: Schema | Reference;\n }>;\n }): void {\n const fullPath = this.normalizePath(config.path);\n const method = config.method.toLowerCase() as keyof PathItem;\n\n if (!this.document.paths[fullPath]) {\n this.document.paths[fullPath] = {};\n }\n\n // Auto-detect path parameters and merge with provided parameters\n const pathParams = this.extractPathParams(config.path);\n const providedParams = config.parameters || [];\n \n const allParameters: Parameter[] = [\n ...providedParams.map(p => ({\n name: p.name,\n in: p.in,\n description: p.description,\n required: p.required ?? (p.in === 'path'),\n schema: p.schema,\n example: p.example,\n })),\n // Add missing path params\n ...pathParams\n .filter(param => !providedParams.some(p => p.name === param))\n .map(param => ({\n name: param,\n in: 'path' as const,\n required: true,\n schema: { type: 'string' as const },\n description: `Path parameter: ${param}`,\n })),\n ];\n\n // Build responses\n const responses: Record<string, Response> = {};\n if (config.responses) {\n for (const [code, resp] of Object.entries(config.responses)) {\n responses[code] = {\n description: resp.description,\n content: resp.schema || resp.example ? {\n 'application/json': {\n schema: resp.schema,\n ...(resp.example && { examples: { default: { value: resp.example } } }),\n },\n } : undefined,\n };\n }\n } else {\n responses['200'] = { description: 'Successful response' };\n }\n\n const operation: Operation = {\n summary: config.summary,\n description: config.description,\n tags: config.tags,\n operationId: config.operationId ?? `${config.method}_${fullPath.replace(/[^a-zA-Z0-9]/g, \"_\")}`,\n deprecated: config.deprecated,\n security: config.security,\n parameters: allParameters.length > 0 ? allParameters : undefined,\n responses,\n };\n\n // Add request body if provided\n if (config.requestBody) {\n operation.requestBody = {\n description: config.requestBody.description,\n required: config.requestBody.required ?? false,\n content: {\n 'application/json': {\n schema: config.requestBody.schema,\n ...(config.requestBody.example && { \n examples: { default: { value: config.requestBody.example } } \n }),\n },\n },\n };\n }\n\n (this.document.paths[fullPath] as any)[method] = operation;\n }\n\n /**\n * Build parameters for operation\n */\n private buildParameters(\n parameters: Array<{\n name: string;\n in: \"query\" | \"header\" | \"path\" | \"cookie\";\n description?: string;\n required?: boolean;\n type?: any;\n example?: any;\n schema?: Schema;\n }>,\n route: RouteDefinition\n ): Parameter[] {\n const params: Parameter[] = [];\n\n // Add path parameters from route\n const pathParams = this.extractPathParams(route.path);\n for (const paramName of pathParams) {\n const existing = parameters.find((p) => p.name === paramName && p.in === \"path\");\n params.push({\n name: paramName,\n in: \"path\",\n required: true,\n description: existing?.description ?? `Path parameter ${paramName}`,\n schema: existing?.schema ?? this.typeToSchema(existing?.type) ?? { type: \"string\" },\n example: existing?.example,\n });\n }\n\n // Add other parameters\n for (const param of parameters) {\n if (param.in !== \"path\") {\n params.push({\n name: param.name,\n in: param.in,\n required: param.required ?? false,\n description: param.description,\n schema: param.schema ?? this.typeToSchema(param.type) ?? { type: \"string\" },\n example: param.example,\n });\n }\n }\n\n return params;\n }\n\n /**\n * Build responses for operation\n */\n private buildResponses(\n responses: Array<{\n statusCode: number;\n description: string;\n type?: any;\n examples?: Record<string, any>;\n headers?: Record<string, any>;\n }>\n ): { [statusCode: string]: Response } {\n const result: { [statusCode: string]: Response } = {};\n\n if (responses.length === 0) {\n result[\"200\"] = {\n description: \"Successful response\",\n content: {\n \"application/json\": {\n schema: { type: \"object\" },\n },\n },\n };\n } else {\n for (const response of responses) {\n const content: Record<string, MediaType> = {};\n\n if (response.type) {\n content[\"application/json\"] = {\n schema: this.typeToSchema(response.type) ?? { type: \"object\" },\n examples: response.examples\n ? Object.entries(response.examples).reduce((acc, [key, value]) => {\n acc[key] = { value };\n return acc;\n }, {} as Record<string, { value: any }>)\n : undefined,\n };\n }\n\n result[String(response.statusCode)] = {\n description: response.description,\n content: Object.keys(content).length > 0 ? content : undefined,\n headers: response.headers,\n };\n }\n }\n\n return result;\n }\n\n /**\n * Build request body\n */\n private buildRequestBody(body: {\n description?: string;\n type?: any;\n required?: boolean;\n examples?: Record<string, any>;\n }): RequestBody {\n return {\n description: body.description,\n required: body.required ?? false,\n content: {\n \"application/json\": {\n schema: this.typeToSchema(body.type) ?? { type: \"object\" },\n examples: body.examples\n ? Object.entries(body.examples).reduce((acc, [key, value]) => {\n acc[key] = { value };\n return acc;\n }, {} as Record<string, { value: any }>)\n : undefined,\n },\n },\n };\n }\n\n /**\n * Convert TypeScript type to OpenAPI schema\n */\n private typeToSchema(type: any): Schema | undefined {\n if (!type) return undefined;\n\n // Handle primitive types\n if (type === String) return { type: \"string\" };\n if (type === Number) return { type: \"number\" };\n if (type === Boolean) return { type: \"boolean\" };\n if (type === Array) return { type: \"array\", items: { type: \"object\" } };\n if (type === Object) return { type: \"object\" };\n\n // Handle class types - extract properties\n if (typeof type === \"function\") {\n const instance = new type();\n const properties: Record<string, Schema> = {};\n\n for (const key of Object.keys(instance)) {\n const value = instance[key];\n properties[key] = this.inferSchema(value);\n }\n\n return {\n type: \"object\",\n properties,\n };\n }\n\n return undefined;\n }\n\n /**\n * Infer schema from value\n */\n private inferSchema(value: any): Schema {\n const type = typeof value;\n\n if (type === \"string\") return { type: \"string\" };\n if (type === \"number\") return { type: \"number\" };\n if (type === \"boolean\") return { type: \"boolean\" };\n if (Array.isArray(value)) {\n return {\n type: \"array\",\n items: value.length > 0 ? this.inferSchema(value[0]) : { type: \"object\" },\n };\n }\n if (type === \"object\" && value !== null) {\n const properties: Record<string, Schema> = {};\n for (const key in value) {\n properties[key] = this.inferSchema(value[key]);\n }\n return { type: \"object\", properties };\n }\n\n return { type: \"object\" };\n }\n\n /**\n * Extract path parameters from route path\n */\n private extractPathParams(path: string): string[] {\n const matches = path.match(/:([a-zA-Z0-9_]+)/g);\n return matches ? matches.map((m) => m.slice(1)) : [];\n }\n\n /**\n * Normalize path to OpenAPI format\n */\n private normalizePath(path: string): string {\n // Convert :param to {param}\n return path.replace(/:([a-zA-Z0-9_]+)/g, \"{$1}\");\n }\n\n /**\n * Add a schema to components\n */\n public addSchema(name: string, schema: Schema): void {\n if (!this.document.components) {\n this.document.components = { schemas: {} };\n }\n if (!this.document.components.schemas) {\n this.document.components.schemas = {};\n }\n this.document.components.schemas[name] = schema;\n }\n\n /**\n * Add a security scheme to components\n */\n public addSecurityScheme(name: string, scheme: any): void {\n if (!this.document.components) {\n this.document.components = { securitySchemes: {} };\n }\n if (!this.document.components.securitySchemes) {\n this.document.components.securitySchemes = {};\n }\n this.document.components.securitySchemes[name] = scheme;\n }\n\n /**\n * Get the OpenAPI document\n */\n public getDocument(): OpenAPIDocument {\n return this.document;\n }\n\n /**\n * Get the config\n */\n public getConfig(): Required<SwaggerConfig> {\n return this.config;\n }\n\n /**\n * Get the document as JSON string\n */\n public toJSON(): string {\n return JSON.stringify(this.document, null, 2);\n }\n\n /**\n * Helper to create a simple response schema\n */\n public static createResponse(description: string, schema?: Schema | Reference, example?: any): Response {\n return {\n description,\n content: schema ? {\n 'application/json': {\n schema,\n ...(example && { examples: { default: { value: example } } }),\n },\n } : undefined,\n };\n }\n\n /**\n * Helper to create a request body\n */\n public static createRequestBody(schema: Schema | Reference, description?: string, required = true, example?: any): RequestBody {\n return {\n description,\n required,\n content: {\n 'application/json': {\n schema,\n ...(example && { examples: { default: { value: example } } }),\n },\n },\n };\n }\n\n /**\n * Helper to create a parameter\n */\n public static createParameter(\n name: string,\n location: 'query' | 'path' | 'header' | 'cookie',\n schema: Schema | Reference,\n options?: {\n description?: string;\n required?: boolean;\n deprecated?: boolean;\n example?: any;\n }\n ): Parameter {\n return {\n name,\n in: location,\n description: options?.description,\n required: options?.required ?? (location === 'path'),\n deprecated: options?.deprecated,\n schema,\n example: options?.example,\n };\n }\n\n /**\n * Helper to create a simple object schema\n */\n public static createSchema(properties: Record<string, Schema | Reference>, required?: string[]): Schema {\n return {\n type: 'object',\n properties,\n required,\n };\n }\n}\n","import type { AzuraClient } from \"../../infra/Server\";\nimport { SwaggerGenerator } from \"./SwaggerGenerator\";\nimport type { SwaggerConfig } from \"../../types/swagger.type\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join, dirname, normalize } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nfunction getCurrentDir(): string {\n if (typeof __dirname !== \"undefined\") {\n return __dirname;\n }\n return dirname(fileURLToPath(import.meta.url));\n}\n\nexport class SwaggerIntegration {\n private generator: SwaggerGenerator;\n private app: AzuraClient;\n\n constructor(app: AzuraClient, config?: SwaggerConfig) {\n this.app = app;\n this.generator = new SwaggerGenerator(config);\n }\n\n public setup(): void {\n const config = this.generator.getConfig();\n\n if (!config.enabled) {\n return;\n }\n\n this.app.get(`/api-spec.json`, (_req: any, res: any) => {\n res.json(this.generator.getDocument());\n });\n\n this.app.get(config.path, (_req: any, res: any) => {\n try {\n const currentDir = getCurrentDir();\n const htmlPath = normalize(\n join(currentDir, \"..\", \"dist\", \"shared\", \"swagger\", \"swagger-ui-modern.html\")\n );\n\n if (!existsSync(htmlPath)) {\n throw new Error(`Swagger UI HTML not found at ${htmlPath}`);\n }\n\n let html = readFileSync(htmlPath, \"utf-8\");\n const doc = this.generator.getDocument();\n\n html = html.replace(/{{TITLE}}/g, String(doc.info.title || \"\"));\n html = html.replace(/{{VERSION}}/g, String(doc.info.version || \"\"));\n html = html.replace(/{{DESCRIPTION}}/g, String(doc.info.description || \"\"));\n\n if (typeof res.type === \"function\" && typeof res.send === \"function\") {\n res.type(\"html\").send(html);\n return;\n }\n\n if (typeof res.setHeader === \"function\" && typeof res.end === \"function\") {\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\n res.end(html);\n return;\n }\n\n res.json({ error: \"Response object does not support sending HTML\" });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (typeof res.status === \"function\" && typeof res.json === \"function\") {\n res.status(500).json({\n error: \"Failed to load Swagger UI\",\n details: message,\n });\n return;\n }\n if (typeof res.end === \"function\") {\n res.end(JSON.stringify({ error: \"Failed to load Swagger UI\", details: message }));\n return;\n }\n }\n });\n }\n\n public getGenerator(): SwaggerGenerator {\n return this.generator;\n }\n}\n\nexport function setupSwagger(app: AzuraClient, config?: SwaggerConfig): SwaggerGenerator {\n const integration = new SwaggerIntegration(app, config);\n integration.setup();\n return integration.getGenerator();\n}\n","import type { AzuraClient } from \"../infra/Server\";\nimport type { RequestServer } from \"../types/http/request.type\";\nimport type { ResponseServer } from \"../types/http/response.type\";\nimport type { ParamDefinition, ParamSource, RouteDefinition } from \"../types/routes.type\";\n\nconst PREFIX = new WeakMap<Function, string>();\nconst ROUTES = new WeakMap<Function, RouteDefinition[]>();\nconst PARAMS = new WeakMap<Function, Map<string, ParamDefinition[]>>();\nconst DESCRIPTIONS = new WeakMap<Function, Map<string, string>>();\n\nexport function Controller(prefix = \"\"): ClassDecorator {\n return (target) => {\n PREFIX.set(target as Function, prefix);\n };\n}\n\nexport function Description(description: string): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = DESCRIPTIONS.get(ctor);\n if (!map) {\n map = new Map<string, string>();\n DESCRIPTIONS.set(ctor, map);\n }\n map.set(String(propertyKey), description);\n };\n}\n\nfunction createMethodDecorator(method: string) {\n return function (path = \"\"): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n const key = String(propertyKey);\n const routes = ROUTES.get(ctor) ?? [];\n const params = PARAMS.get(ctor)?.get(key) ?? [];\n const description = DESCRIPTIONS.get(ctor)?.get(key);\n\n const exists = routes.some(\n (r) => r.method === method && r.path === path && r.propertyKey === key\n );\n if (!exists) {\n routes.push({\n method,\n path,\n propertyKey: key,\n params,\n description,\n });\n ROUTES.set(ctor, routes);\n }\n };\n };\n}\n\nfunction createParamDecorator(type: ParamSource) {\n return function (name?: string): ParameterDecorator {\n return (target, propertyKey, parameterIndex) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = PARAMS.get(ctor);\n if (!map) {\n map = new Map<string, ParamDefinition[]>();\n PARAMS.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const list = map.get(key) ?? [];\n const exists = list.some(\n (p) => p.index === parameterIndex && p.type === type && p.name === name\n );\n if (!exists) {\n list.push({\n index: parameterIndex,\n type,\n name,\n });\n map.set(key, list);\n }\n };\n };\n}\n\nexport const Get = createMethodDecorator(\"GET\");\nexport const Post = createMethodDecorator(\"POST\");\nexport const Put = createMethodDecorator(\"PUT\");\nexport const Delete = createMethodDecorator(\"DELETE\");\nexport const Patch = createMethodDecorator(\"PATCH\");\nexport const Head = createMethodDecorator(\"HEAD\");\nexport const Options = createMethodDecorator(\"OPTIONS\");\n\nexport const Req = createParamDecorator(\"req\");\nexport const Res = createParamDecorator(\"res\");\nexport const Next = createParamDecorator(\"next\");\nexport const Param = createParamDecorator(\"param\");\nexport const Query = createParamDecorator(\"query\");\nexport const Body = createParamDecorator(\"body\");\nexport const Headers = createParamDecorator(\"headers\");\nexport const Ip = createParamDecorator(\"ip\");\nexport const UserAgent = createParamDecorator(\"useragent\");\n\nexport function applyDecorators(app: AzuraClient, controllers: Array<new () => any>) {\n controllers.forEach((ControllerClass) => {\n const prefix = PREFIX.get(ControllerClass) ?? \"\";\n const instance = new ControllerClass();\n const routes = ROUTES.get(ControllerClass) ?? [];\n\n routes.forEach((r) => {\n const handler = async (\n req: RequestServer,\n res: ResponseServer,\n next?: (err?: unknown) => void\n ) => {\n try {\n const params = (r.params ?? []).slice().sort((a, b) => a.index - b.index);\n const args = params.map((p) => {\n switch (p.type) {\n case \"req\":\n return req;\n case \"res\":\n return res;\n case \"next\":\n return next;\n case \"param\":\n return p.name ? req.params[p.name] : req.params;\n case \"query\":\n return p.name ? req.query[p.name] : req.query;\n case \"body\": {\n const body = req.body as Record<string, unknown> | undefined;\n return p.name ? body?.[p.name] : body;\n }\n case \"headers\":\n return p.name ? req.headers[p.name.toLowerCase()] : req.headers;\n case \"ip\":\n return req.ip;\n case \"useragent\":\n return req.headers[\"user-agent\"];\n default:\n return undefined;\n }\n });\n\n const fn = (instance as Record<string, unknown>)[r.propertyKey] as (\n ...args: unknown[]\n ) => unknown;\n const result = fn(...args);\n if (result instanceof Promise) await result;\n } catch (err) {\n if (next) next(err);\n }\n };\n\n app.addRoute(r.method, prefix + r.path, handler);\n });\n });\n}\n\n/**\n * Get routes metadata from a controller class\n * @internal Used by Swagger integration\n */\nexport function getControllerMetadata(ControllerClass: Function) {\n return {\n prefix: PREFIX.get(ControllerClass) || \"\",\n routes: ROUTES.get(ControllerClass) || [],\n params: PARAMS.get(ControllerClass),\n descriptions: DESCRIPTIONS.get(ControllerClass),\n };\n}\n","import type { AzuraClient } from \"../../infra/Server\";\nimport type { SwaggerConfig } from \"../../types/swagger.type\";\nimport { SwaggerIntegration } from \"./index\";\nimport { SwaggerGenerator } from \"./SwaggerGenerator\";\nimport { getControllerMetadata, applyDecorators } from \"../../decorators/Route\";\n\n/**\n * Setup Swagger with automatic controller registration\n * This is the SIMPLEST way to use Swagger in AzuraJS - just pass your controllers!\n * \n * @example\n * ```typescript\n * import { AzuraClient } from \"azurajs\";\n * import { setupSwaggerWithControllers } from \"azurajs\";\n * \n * const app = new AzuraClient();\n * \n * setupSwaggerWithControllers(app, {\n * title: \"My API\",\n * version: \"1.0.0\",\n * description: \"Simple and beautiful API docs\"\n * }, [UserController, ProductController]);\n * \n * app.listen(3000);\n * // That's it! Visit http://localhost:3000/docs\n * ```\n */\nexport function setupSwaggerWithControllers(\n app: AzuraClient,\n config: SwaggerConfig,\n controllers: Array<new () => any>\n): SwaggerGenerator {\n // Setup Swagger first\n const integration = new SwaggerIntegration(app, config);\n integration.setup();\n const swaggerGen = integration.getGenerator();\n\n // Register all controllers - both routes and swagger\n applyDecorators(app, controllers);\n \n // Add controllers to Swagger\n controllers.forEach((ControllerClass) => {\n const metadata = getControllerMetadata(ControllerClass);\n \n if (metadata.routes.length > 0) {\n const instance = new ControllerClass();\n swaggerGen.addController(instance, metadata.routes, metadata.prefix);\n }\n });\n\n return swaggerGen;\n}\n","/**\n * AzuraJS Swagger/OpenAPI Integration\n * Import from \"azurajs/swagger\" to use Swagger documentation\n */\n\nimport { SwaggerGenerator } from \"./swagger\";\n\n// Main Swagger exports\nexport { setupSwagger, SwaggerIntegration } from \"./shared/swagger\";\nexport { SwaggerGenerator } from \"./shared/swagger/SwaggerGenerator\";\nexport { setupSwaggerWithControllers } from \"./shared/swagger/SwaggerHelper\";\n\n// Swagger decorators (for decorator-based approach)\nexport {\n ApiDoc,\n ApiResponse,\n ApiParameter,\n ApiBody,\n ApiTags,\n ApiDeprecated,\n ApiSecurity,\n Swagger,\n getSwaggerMetadata,\n} from \"./decorators/Swagger\";\n\n// Swagger types\nexport type * from \"./types/swagger.type\";\n\n// Re-export helpers for manual route documentation (for JavaScript/plain TypeScript)\nexport const SwaggerHelpers = {\n createResponse: SwaggerGenerator.createResponse,\n createRequestBody: SwaggerGenerator.createRequestBody,\n createParameter: SwaggerGenerator.createParameter,\n createSchema: SwaggerGenerator.createSchema,\n};\n"]}
|
package/dist/swagger.d.cts
CHANGED
|
@@ -198,18 +198,9 @@ declare class SwaggerIntegration {
|
|
|
198
198
|
private generator;
|
|
199
199
|
private app;
|
|
200
200
|
constructor(app: AzuraClient, config?: SwaggerConfig);
|
|
201
|
-
/**
|
|
202
|
-
* Setup Swagger routes
|
|
203
|
-
*/
|
|
204
201
|
setup(): void;
|
|
205
|
-
/**
|
|
206
|
-
* Get the generator instance
|
|
207
|
-
*/
|
|
208
202
|
getGenerator(): SwaggerGenerator;
|
|
209
203
|
}
|
|
210
|
-
/**
|
|
211
|
-
* Helper function to setup Swagger in an AzuraClient instance
|
|
212
|
-
*/
|
|
213
204
|
declare function setupSwagger(app: AzuraClient, config?: SwaggerConfig): SwaggerGenerator;
|
|
214
205
|
|
|
215
206
|
/**
|
package/dist/swagger.d.ts
CHANGED
|
@@ -198,18 +198,9 @@ declare class SwaggerIntegration {
|
|
|
198
198
|
private generator;
|
|
199
199
|
private app;
|
|
200
200
|
constructor(app: AzuraClient, config?: SwaggerConfig);
|
|
201
|
-
/**
|
|
202
|
-
* Setup Swagger routes
|
|
203
|
-
*/
|
|
204
201
|
setup(): void;
|
|
205
|
-
/**
|
|
206
|
-
* Get the generator instance
|
|
207
|
-
*/
|
|
208
202
|
getGenerator(): SwaggerGenerator;
|
|
209
203
|
}
|
|
210
|
-
/**
|
|
211
|
-
* Helper function to setup Swagger in an AzuraClient instance
|
|
212
|
-
*/
|
|
213
204
|
declare function setupSwagger(app: AzuraClient, config?: SwaggerConfig): SwaggerGenerator;
|
|
214
205
|
|
|
215
206
|
/**
|
package/dist/swagger.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { existsSync, readFileSync } from 'fs';
|
|
2
|
-
import { join, dirname } from 'path';
|
|
2
|
+
import { normalize, join, dirname } from 'path';
|
|
3
3
|
import { fileURLToPath } from 'url';
|
|
4
4
|
|
|
5
5
|
// src/decorators/Swagger.ts
|
|
@@ -669,9 +669,6 @@ var SwaggerIntegration = class {
|
|
|
669
669
|
this.app = app;
|
|
670
670
|
this.generator = new SwaggerGenerator(config);
|
|
671
671
|
}
|
|
672
|
-
/**
|
|
673
|
-
* Setup Swagger routes
|
|
674
|
-
*/
|
|
675
672
|
setup() {
|
|
676
673
|
const config = this.generator.getConfig();
|
|
677
674
|
if (!config.enabled) {
|
|
@@ -683,34 +680,43 @@ var SwaggerIntegration = class {
|
|
|
683
680
|
this.app.get(config.path, (_req, res) => {
|
|
684
681
|
try {
|
|
685
682
|
const currentDir = getCurrentDir();
|
|
686
|
-
const htmlPath =
|
|
687
|
-
|
|
683
|
+
const htmlPath = normalize(
|
|
684
|
+
join(currentDir, "..", "dist", "shared", "swagger", "swagger-ui-modern.html")
|
|
685
|
+
);
|
|
688
686
|
if (!existsSync(htmlPath)) {
|
|
689
|
-
|
|
690
|
-
if (existsSync(srcPath)) {
|
|
691
|
-
finalPath = srcPath;
|
|
692
|
-
} else {
|
|
693
|
-
throw new Error(`Swagger UI HTML not found at ${htmlPath} or ${srcPath}`);
|
|
694
|
-
}
|
|
687
|
+
throw new Error(`Swagger UI HTML not found at ${htmlPath}`);
|
|
695
688
|
}
|
|
696
|
-
let html = readFileSync(
|
|
689
|
+
let html = readFileSync(htmlPath, "utf-8");
|
|
697
690
|
const doc = this.generator.getDocument();
|
|
698
|
-
html = html.replace(/{{TITLE}}/g, doc.info.title);
|
|
699
|
-
html = html.replace(/{{VERSION}}/g, doc.info.version);
|
|
700
|
-
html = html.replace(/{{DESCRIPTION}}/g, doc.info.description || "");
|
|
701
|
-
res.type
|
|
691
|
+
html = html.replace(/{{TITLE}}/g, String(doc.info.title || ""));
|
|
692
|
+
html = html.replace(/{{VERSION}}/g, String(doc.info.version || ""));
|
|
693
|
+
html = html.replace(/{{DESCRIPTION}}/g, String(doc.info.description || ""));
|
|
694
|
+
if (typeof res.type === "function" && typeof res.send === "function") {
|
|
695
|
+
res.type("html").send(html);
|
|
696
|
+
return;
|
|
697
|
+
}
|
|
698
|
+
if (typeof res.setHeader === "function" && typeof res.end === "function") {
|
|
699
|
+
res.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
700
|
+
res.end(html);
|
|
701
|
+
return;
|
|
702
|
+
}
|
|
703
|
+
res.json({ error: "Response object does not support sending HTML" });
|
|
702
704
|
} catch (error) {
|
|
703
|
-
|
|
704
|
-
res.status
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
705
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
706
|
+
if (typeof res.status === "function" && typeof res.json === "function") {
|
|
707
|
+
res.status(500).json({
|
|
708
|
+
error: "Failed to load Swagger UI",
|
|
709
|
+
details: message
|
|
710
|
+
});
|
|
711
|
+
return;
|
|
712
|
+
}
|
|
713
|
+
if (typeof res.end === "function") {
|
|
714
|
+
res.end(JSON.stringify({ error: "Failed to load Swagger UI", details: message }));
|
|
715
|
+
return;
|
|
716
|
+
}
|
|
708
717
|
}
|
|
709
718
|
});
|
|
710
719
|
}
|
|
711
|
-
/**
|
|
712
|
-
* Get the generator instance
|
|
713
|
-
*/
|
|
714
720
|
getGenerator() {
|
|
715
721
|
return this.generator;
|
|
716
722
|
}
|
package/dist/swagger.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/decorators/Swagger.ts","../src/shared/swagger/SwaggerGenerator.ts","../src/shared/swagger/index.ts","../src/decorators/Route.ts","../src/shared/swagger/SwaggerHelper.ts","../src/swagger.ts"],"names":[],"mappings":";;;;;AAUA,IAAM,YAAA,uBAAmB,OAAA,EAA+C;AACxE,IAAM,aAAA,uBAAoB,OAAA,EAAsD;AAChF,IAAM,cAAA,uBAAqB,OAAA,EAAuD;AAClF,IAAM,QAAA,uBAAe,OAAA,EAAgD;AACrE,IAAM,QAAA,uBAAe,OAAA,EAA4B;AAK1C,SAAS,OAAO,QAAA,EAAoE;AACzF,EAAA,OAAO,CAAC,QAAQ,WAAA,KAAgB;AAC9B,IAAA,MAAM,IAAA,GACJ,OAAO,MAAA,KAAW,UAAA,GAAc,SAAuB,MAAA,CAAe,WAAA;AACxE,IAAA,IAAI,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAC/B,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,uBAAU,GAAA,EAA4B;AACtC,MAAA,YAAA,CAAa,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,IAC5B;AACA,IAAA,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,WAAW,CAAA,EAAG,QAAQ,CAAA;AAAA,EACvC,CAAA;AACF;AAKO,SAAS,WAAA,CACd,UAAA,EACA,WAAA,EACA,OAAA,EAKiB;AACjB,EAAA,OAAO,CAAC,QAAQ,WAAA,KAAgB;AAC9B,IAAA,MAAM,IAAA,GACJ,OAAO,MAAA,KAAW,UAAA,GAAc,SAAuB,MAAA,CAAe,WAAA;AACxE,IAAA,IAAI,GAAA,GAAM,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AAChC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,uBAAU,GAAA,EAAmC;AAC7C,MAAA,aAAA,CAAc,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,IAC7B;AAEA,IAAA,MAAM,GAAA,GAAM,OAAO,WAAW,CAAA;AAC9B,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,GAAA,CAAI,GAAG,KAAK,EAAC;AACnC,IAAA,SAAA,CAAU,IAAA,CAAK;AAAA,MACb,UAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAM,OAAA,EAAS,IAAA;AAAA,MACf,UAAU,OAAA,EAAS,QAAA;AAAA,MACnB,SAAS,OAAA,EAAS;AAAA,KACnB,CAAA;AACD,IAAA,GAAA,CAAI,GAAA,CAAI,KAAK,SAAS,CAAA;AAAA,EACxB,CAAA;AACF;AAKO,SAAS,YAAA,CACd,IAAA,EACA,OAAA,EACA,OAAA,EAOiB;AACjB,EAAA,OAAO,CAAC,QAAQ,WAAA,KAAgB;AAC9B,IAAA,MAAM,IAAA,GACJ,OAAO,MAAA,KAAW,UAAA,GAAc,SAAuB,MAAA,CAAe,WAAA;AACxE,IAAA,IAAI,GAAA,GAAM,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA;AACjC,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,uBAAU,GAAA,EAAoC;AAC9C,MAAA,cAAA,CAAe,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,IAC9B;AAEA,IAAA,MAAM,GAAA,GAAM,OAAO,WAAW,CAAA;AAC9B,IAAA,MAAM,MAAA,GAAS,GAAA,CAAI,GAAA,CAAI,GAAG,KAAK,EAAC;AAChC,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,IAAA;AAAA,MACA,EAAA,EAAI,OAAA;AAAA,MACJ,aAAa,OAAA,EAAS,WAAA;AAAA,MACtB,UAAU,OAAA,EAAS,QAAA;AAAA,MACnB,MAAM,OAAA,EAAS,IAAA;AAAA,MACf,SAAS,OAAA,EAAS,OAAA;AAAA,MAClB,QAAQ,OAAA,EAAS;AAAA,KAClB,CAAA;AACD,IAAA,GAAA,CAAI,GAAA,CAAI,KAAK,MAAM,CAAA;AAAA,EACrB,CAAA;AACF;AAKO,SAAS,OAAA,CACd,aACA,OAAA,EAKiB;AACjB,EAAA,OAAO,CAAC,QAAQ,WAAA,KAAgB;AAC9B,IAAA,MAAM,IAAA,GACJ,OAAO,MAAA,KAAW,UAAA,GAAc,SAAuB,MAAA,CAAe,WAAA;AACxE,IAAA,IAAI,GAAA,GAAM,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AAC3B,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,uBAAU,GAAA,EAA6B;AACvC,MAAA,QAAA,CAAS,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,IACxB;AAEA,IAAA,GAAA,CAAI,GAAA,CAAI,MAAA,CAAO,WAAW,CAAA,EAAG;AAAA,MAC3B,WAAA;AAAA,MACA,MAAM,OAAA,EAAS,IAAA;AAAA,MACf,UAAU,OAAA,EAAS,QAAA;AAAA,MACnB,UAAU,OAAA,EAAS;AAAA,KACpB,CAAA;AAAA,EACH,CAAA;AACF;AAKO,SAAS,WAAW,IAAA,EAAgC;AACzD,EAAA,OAAO,CAAC,MAAA,KAAW;AACjB,IAAA,QAAA,CAAS,GAAA,CAAI,QAAoB,IAAI,CAAA;AAAA,EACvC,CAAA;AACF;AAKO,SAAS,aAAA,GAAiC;AAC/C,EAAA,OAAO,CAAC,QAAQ,WAAA,KAAgB;AAC9B,IAAA,MAAM,IAAA,GACJ,OAAO,MAAA,KAAW,UAAA,GAAc,SAAuB,MAAA,CAAe,WAAA;AACxE,IAAA,IAAI,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAC/B,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,uBAAU,GAAA,EAA4B;AACtC,MAAA,YAAA,CAAa,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,GAAA,GAAM,OAAO,WAAW,CAAA;AAC9B,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,CAAI,GAAG,KAAK,EAAC;AAClC,IAAA,GAAA,CAAI,IAAI,GAAA,EAAK,EAAE,GAAG,QAAA,EAAU,UAAA,EAAY,MAAM,CAAA;AAAA,EAChD,CAAA;AACF;AAKO,SAAS,eAAe,YAAA,EAAsD;AACnF,EAAA,OAAO,CAAC,QAAQ,WAAA,KAAgB;AAC9B,IAAA,MAAM,IAAA,GACJ,OAAO,MAAA,KAAW,UAAA,GAAc,SAAuB,MAAA,CAAe,WAAA;AACxE,IAAA,IAAI,GAAA,GAAM,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AAC/B,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,GAAA,uBAAU,GAAA,EAA4B;AACtC,MAAA,YAAA,CAAa,GAAA,CAAI,MAAM,GAAG,CAAA;AAAA,IAC5B;AAEA,IAAA,MAAM,GAAA,GAAM,OAAO,WAAW,CAAA;AAC9B,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,GAAA,CAAI,GAAG,KAAK,EAAC;AAClC,IAAA,GAAA,CAAI,IAAI,GAAA,EAAK,EAAE,GAAG,QAAA,EAAU,QAAA,EAAU,cAAc,CAAA;AAAA,EACtD,CAAA;AACF;AAKO,SAAS,mBAAmB,MAAA,EAAkB;AACnD,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,YAAA,CAAa,GAAA,CAAI,MAAM,CAAA;AAAA,IACjC,SAAA,EAAW,aAAA,CAAc,GAAA,CAAI,MAAM,CAAA;AAAA,IACnC,UAAA,EAAY,cAAA,CAAe,GAAA,CAAI,MAAM,CAAA;AAAA,IACrC,IAAA,EAAM,QAAA,CAAS,GAAA,CAAI,MAAM,CAAA;AAAA,IACzB,IAAA,EAAM,QAAA,CAAS,GAAA,CAAI,MAAM;AAAA,GAC3B;AACF;AAoCO,SAAS,QAAQ,MAAA,EA2BJ;AAClB,EAAA,OAAO,CAAC,QAAQ,WAAA,KAAgB;AAC9B,IAAA,MAAM,IAAA,GAAO,OAAO,MAAA,KAAW,UAAA,GAAc,SAAuB,MAAA,CAAe,WAAA;AACnF,IAAA,MAAM,GAAA,GAAM,OAAO,WAAW,CAAA;AAG9B,IAAA,IAAI,MAAA,CAAO,OAAA,IAAW,MAAA,CAAO,WAAA,IAAe,MAAA,CAAO,eAAe,MAAA,CAAO,UAAA,KAAe,MAAA,IAAa,MAAA,CAAO,QAAA,EAAU;AACpH,MAAA,IAAI,OAAA,GAAU,YAAA,CAAa,GAAA,CAAI,IAAI,CAAA;AACnC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,uBAAc,GAAA,EAA4B;AAC1C,QAAA,YAAA,CAAa,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,MAChC;AACA,MAAA,OAAA,CAAQ,IAAI,GAAA,EAAK;AAAA,QACf,SAAS,MAAA,CAAO,OAAA;AAAA,QAChB,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,aAAa,MAAA,CAAO,WAAA;AAAA,QACpB,YAAY,MAAA,CAAO,UAAA;AAAA,QACnB,UAAU,MAAA,CAAO,QAAA;AAAA,QACjB,MAAM,MAAA,CAAO;AAAA,OACd,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,MAAA,CAAO,UAAA,IAAc,MAAA,CAAO,UAAA,CAAW,SAAS,CAAA,EAAG;AACrD,MAAA,IAAI,QAAA,GAAW,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA;AACtC,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,QAAA,uBAAe,GAAA,EAAoC;AACnD,QAAA,cAAA,CAAe,GAAA,CAAI,MAAM,QAAQ,CAAA;AAAA,MACnC;AACA,MAAA,QAAA,CAAS,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA,CAAA,MAAM;AAAA,QAC5C,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,aAAa,CAAA,CAAE,WAAA;AAAA,QACf,UAAU,CAAA,CAAE,QAAA;AAAA,QACZ,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,SAAS,CAAA,CAAE;AAAA,QACX,CAAC,CAAA;AAAA,IACL;AAGA,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,IAAI,OAAA,GAAU,QAAA,CAAS,GAAA,CAAI,IAAI,CAAA;AAC/B,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,uBAAc,GAAA,EAA6B;AAC3C,QAAA,QAAA,CAAS,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,MAC5B;AACA,MAAA,OAAA,CAAQ,IAAI,GAAA,EAAK;AAAA,QACf,WAAA,EAAa,OAAO,WAAA,CAAY,WAAA;AAAA,QAChC,QAAA,EAAU,OAAO,WAAA,CAAY,QAAA;AAAA,QAC7B,IAAA,EAAM,OAAO,WAAA,CAAY,OAAA;AAAA,QACzB,QAAA,EAAU,OAAO,WAAA,CAAY,OAAA,GAAU,EAAE,OAAA,EAAS,MAAA,CAAO,WAAA,CAAY,OAAA,EAAQ,GAAI;AAAA,OAClF,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,OAAO,SAAA,EAAW;AACpB,MAAA,IAAI,OAAA,GAAU,aAAA,CAAc,GAAA,CAAI,IAAI,CAAA;AACpC,MAAA,IAAI,CAAC,OAAA,EAAS;AACZ,QAAA,OAAA,uBAAc,GAAA,EAAmC;AACjD,QAAA,aAAA,CAAc,GAAA,CAAI,MAAM,OAAO,CAAA;AAAA,MACjC;AACA,MAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,CAAE,GAAA,CAAI,CAAC,CAAC,IAAA,EAAM,IAAI,CAAA,MAAO;AAAA,QACxE,UAAA,EAAY,OAAO,IAAI,CAAA;AAAA,QACvB,aAAa,IAAA,CAAK,WAAA;AAAA,QAClB,MAAM,IAAA,CAAK,MAAA;AAAA,QACX,UAAU,IAAA,CAAK,OAAA,GAAU,EAAE,OAAA,EAAS,IAAA,CAAK,SAAQ,GAAI,MAAA;AAAA,QACrD,SAAS,IAAA,CAAK;AAAA,OAChB,CAAE,CAAA;AACF,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,SAAS,CAAA;AAAA,IAC5B;AAAA,EACF,CAAA;AACF;;;ACrTO,IAAM,mBAAN,MAAuB;AAAA,EAI5B,YAAY,MAAA,EAAwB;AAClC,IAAA,IAAA,CAAK,MAAA,GAAS;AAAA,MACZ,OAAA,EAAS,QAAQ,OAAA,IAAW,IAAA;AAAA,MAC5B,IAAA,EAAM,QAAQ,IAAA,IAAQ,OAAA;AAAA,MACtB,KAAA,EAAO,QAAQ,KAAA,IAAS,aAAA;AAAA,MACxB,WAAA,EAAa,QAAQ,WAAA,IAAe,sCAAA;AAAA,MACpC,OAAA,EAAS,QAAQ,OAAA,IAAW,OAAA;AAAA,MAC5B,SAAS,MAAA,EAAQ,OAAA,IAAW,CAAC,EAAE,GAAA,EAAK,yBAAyB,CAAA;AAAA,MAC7D,QAAA,EAAU,MAAA,EAAQ,QAAA,IAAY,EAAC;AAAA,MAC/B,IAAA,EAAM,MAAA,EAAQ,IAAA,IAAQ,EAAC;AAAA,MACvB,OAAA,EAAS,MAAA,EAAQ,OAAA,IAAW,EAAC;AAAA,MAC7B,OAAA,EAAS,MAAA,EAAQ,OAAA,IAAW,EAAE,MAAM,KAAA;AAAM,KAC5C;AAEA,IAAA,IAAA,CAAK,QAAA,GAAW;AAAA,MACd,OAAA,EAAS,OAAA;AAAA,MACT,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,KAAK,MAAA,CAAO,KAAA;AAAA,QACnB,WAAA,EAAa,KAAK,MAAA,CAAO,WAAA;AAAA,QACzB,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,QACrB,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,QACrB,OAAA,EAAS,KAAK,MAAA,CAAO;AAAA,OACvB;AAAA,MACA,OAAA,EAAS,KAAK,MAAA,CAAO,OAAA;AAAA,MACrB,OAAO,EAAC;AAAA,MACR,UAAA,EAAY;AAAA,QACV,SAAS,EAAC;AAAA,QACV,WAAW,EAAC;AAAA,QACZ,YAAY,EAAC;AAAA,QACb,iBAAiB;AAAC,OACpB;AAAA,MACA,IAAA,EAAM,KAAK,MAAA,CAAO,IAAA;AAAA,MAClB,QAAA,EAAU,KAAK,MAAA,CAAO;AAAA,KACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKO,aAAA,CAAc,UAAA,EAAiB,MAAA,EAA2B,MAAA,GAAS,EAAA,EAAU;AAClF,IAAA,MAAM,QAAA,GAAW,kBAAA,CAAmB,UAAA,CAAW,WAAW,CAAA;AAC1D,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,IAAA,IAAQ,EAAC;AAEzC,IAAA,KAAA,MAAW,SAAS,MAAA,EAAQ;AAC1B,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,MAAA,GAAS,MAAM,IAAI,CAAA;AACvD,MAAA,MAAM,MAAA,GAAS,KAAA,CAAM,MAAA,CAAO,WAAA,EAAY;AAExC,MAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA,EAAG;AAClC,QAAA,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA,GAAI,EAAC;AAAA,MACnC;AAEA,MAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,QAAA,EAAU,GAAA,CAAI,MAAM,WAAW,CAAA;AAC/D,MAAA,MAAM,YAAY,QAAA,CAAS,SAAA,EAAW,IAAI,KAAA,CAAM,WAAW,KAAK,EAAC;AACjE,MAAA,MAAM,aAAa,QAAA,CAAS,UAAA,EAAY,IAAI,KAAA,CAAM,WAAW,KAAK,EAAC;AACnE,MAAA,MAAM,IAAA,GAAO,QAAA,CAAS,IAAA,EAAM,GAAA,CAAI,MAAM,WAAW,CAAA;AAEjD,MAAA,MAAM,SAAA,GAAuB;AAAA,QAC3B,OAAA,EAAS,cAAA,EAAgB,OAAA,IAAW,KAAA,CAAM,WAAA;AAAA,QAC1C,aAAa,cAAA,EAAgB,WAAA;AAAA,QAC7B,IAAA,EAAM,gBAAgB,IAAA,IAAQ,cAAA;AAAA,QAC9B,WAAA,EACE,cAAA,EAAgB,WAAA,IAChB,CAAA,EAAG,KAAA,CAAM,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,OAAA,CAAQ,eAAA,EAAiB,GAAG,CAAC,CAAA,CAAA;AAAA,QAC3D,YAAY,cAAA,EAAgB,UAAA;AAAA,QAC5B,UAAU,cAAA,EAAgB,QAAA;AAAA,QAC1B,UAAA,EAAY,IAAA,CAAK,eAAA,CAAgB,UAAA,EAAY,KAAK,CAAA;AAAA,QAClD,SAAA,EAAW,IAAA,CAAK,cAAA,CAAe,SAAS;AAAA,OAC1C;AAEA,MAAA,IAAI,IAAA,EAAM;AACR,QAAA,SAAA,CAAU,WAAA,GAAc,IAAA,CAAK,gBAAA,CAAiB,IAAI,CAAA;AAAA,MACpD;AAEA,MAAC,KAAK,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA,CAAU,MAAM,CAAA,GAAI,SAAA;AAAA,IACnD;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6CO,SAAS,MAAA,EAYP;AACP,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AAC/C,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,WAAA,EAAY;AAEzC,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA,GAAI,EAAC;AAAA,IACnC;AAEA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,IAAI,CAAA;AACrD,IAAA,MAAM,aAAA,GAA6B;AAAA,MACjC,GAAI,MAAA,CAAO,UAAA,IAAc,EAAC;AAAA,MAC1B,GAAG,UAAA,CACA,MAAA,CAAO,CAAA,KAAA,KAAS,CAAC,MAAA,CAAO,UAAA,EAAY,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS,KAAK,CAAC,CAAA,CAC/D,IAAI,CAAA,KAAA,MAAU;AAAA,QACb,IAAA,EAAM,KAAA;AAAA,QACN,EAAA,EAAI,MAAA;AAAA,QACJ,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAkB;AAAA,QAClC,WAAA,EAAa,mBAAmB,KAAK,CAAA;AAAA,OACvC,CAAE;AAAA,KACN;AAEA,IAAA,MAAM,SAAA,GAAuB;AAAA,MAC3B,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,WAAA,EAAa,MAAA,CAAO,WAAA,IAAe,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,OAAA,CAAQ,eAAA,EAAiB,GAAG,CAAC,CAAA,CAAA;AAAA,MAC7F,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,UAAA,EAAY,aAAA,CAAc,MAAA,GAAS,CAAA,GAAI,aAAA,GAAgB,MAAA;AAAA,MACvD,SAAA,EAAW,OAAO,SAAA,IAAa;AAAA,QAC7B,GAAA,EAAK;AAAA,UACH,WAAA,EAAa;AAAA;AACf;AACF,KACF;AAEA,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,SAAA,CAAU,cAAc,MAAA,CAAO,WAAA;AAAA,IACjC;AAEA,IAAC,KAAK,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA,CAAU,MAAM,CAAA,GAAI,SAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuBO,OAAO,MAAA,EA4BL;AACP,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,aAAA,CAAc,MAAA,CAAO,IAAI,CAAA;AAC/C,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,MAAA,CAAO,WAAA,EAAY;AAEzC,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA,EAAG;AAClC,MAAA,IAAA,CAAK,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA,GAAI,EAAC;AAAA,IACnC;AAGA,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,MAAA,CAAO,IAAI,CAAA;AACrD,IAAA,MAAM,cAAA,GAAiB,MAAA,CAAO,UAAA,IAAc,EAAC;AAE7C,IAAA,MAAM,aAAA,GAA6B;AAAA,MACjC,GAAG,cAAA,CAAe,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QAC1B,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,IAAI,CAAA,CAAE,EAAA;AAAA,QACN,aAAa,CAAA,CAAE,WAAA;AAAA,QACf,QAAA,EAAU,CAAA,CAAE,QAAA,IAAa,CAAA,CAAE,EAAA,KAAO,MAAA;AAAA,QAClC,QAAQ,CAAA,CAAE,MAAA;AAAA,QACV,SAAS,CAAA,CAAE;AAAA,OACb,CAAE,CAAA;AAAA;AAAA,MAEF,GAAG,UAAA,CACA,MAAA,CAAO,CAAA,KAAA,KAAS,CAAC,cAAA,CAAe,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,KAAS,KAAK,CAAC,CAAA,CAC3D,IAAI,CAAA,KAAA,MAAU;AAAA,QACb,IAAA,EAAM,KAAA;AAAA,QACN,EAAA,EAAI,MAAA;AAAA,QACJ,QAAA,EAAU,IAAA;AAAA,QACV,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAkB;AAAA,QAClC,WAAA,EAAa,mBAAmB,KAAK,CAAA;AAAA,OACvC,CAAE;AAAA,KACN;AAGA,IAAA,MAAM,YAAsC,EAAC;AAC7C,IAAA,IAAI,OAAO,SAAA,EAAW;AACpB,MAAA,KAAA,MAAW,CAAC,MAAM,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAC3D,QAAA,SAAA,CAAU,IAAI,CAAA,GAAI;AAAA,UAChB,aAAa,IAAA,CAAK,WAAA;AAAA,UAClB,OAAA,EAAS,IAAA,CAAK,MAAA,IAAU,IAAA,CAAK,OAAA,GAAU;AAAA,YACrC,kBAAA,EAAoB;AAAA,cAClB,QAAQ,IAAA,CAAK,MAAA;AAAA,cACb,GAAI,IAAA,CAAK,OAAA,IAAW,EAAE,QAAA,EAAU,EAAE,OAAA,EAAS,EAAE,KAAA,EAAO,IAAA,CAAK,OAAA,EAAQ,EAAE;AAAE;AACvE,WACF,GAAI;AAAA,SACN;AAAA,MACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,SAAA,CAAU,KAAK,CAAA,GAAI,EAAE,WAAA,EAAa,qBAAA,EAAsB;AAAA,IAC1D;AAEA,IAAA,MAAM,SAAA,GAAuB;AAAA,MAC3B,SAAS,MAAA,CAAO,OAAA;AAAA,MAChB,aAAa,MAAA,CAAO,WAAA;AAAA,MACpB,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,WAAA,EAAa,MAAA,CAAO,WAAA,IAAe,CAAA,EAAG,MAAA,CAAO,MAAM,CAAA,CAAA,EAAI,QAAA,CAAS,OAAA,CAAQ,eAAA,EAAiB,GAAG,CAAC,CAAA,CAAA;AAAA,MAC7F,YAAY,MAAA,CAAO,UAAA;AAAA,MACnB,UAAU,MAAA,CAAO,QAAA;AAAA,MACjB,UAAA,EAAY,aAAA,CAAc,MAAA,GAAS,CAAA,GAAI,aAAA,GAAgB,MAAA;AAAA,MACvD;AAAA,KACF;AAGA,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,SAAA,CAAU,WAAA,GAAc;AAAA,QACtB,WAAA,EAAa,OAAO,WAAA,CAAY,WAAA;AAAA,QAChC,QAAA,EAAU,MAAA,CAAO,WAAA,CAAY,QAAA,IAAY,KAAA;AAAA,QACzC,OAAA,EAAS;AAAA,UACP,kBAAA,EAAoB;AAAA,YAClB,MAAA,EAAQ,OAAO,WAAA,CAAY,MAAA;AAAA,YAC3B,GAAI,MAAA,CAAO,WAAA,CAAY,OAAA,IAAW;AAAA,cAChC,QAAA,EAAU,EAAE,OAAA,EAAS,EAAE,OAAO,MAAA,CAAO,WAAA,CAAY,SAAQ;AAAE;AAC7D;AACF;AACF,OACF;AAAA,IACF;AAEA,IAAC,KAAK,QAAA,CAAS,KAAA,CAAM,QAAQ,CAAA,CAAU,MAAM,CAAA,GAAI,SAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKQ,eAAA,CACN,YASA,KAAA,EACa;AACb,IAAA,MAAM,SAAsB,EAAC;AAG7B,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,iBAAA,CAAkB,KAAA,CAAM,IAAI,CAAA;AACpD,IAAA,KAAA,MAAW,aAAa,UAAA,EAAY;AAClC,MAAA,MAAM,QAAA,GAAW,UAAA,CAAW,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,SAAA,IAAa,CAAA,CAAE,EAAA,KAAO,MAAM,CAAA;AAC/E,MAAA,MAAA,CAAO,IAAA,CAAK;AAAA,QACV,IAAA,EAAM,SAAA;AAAA,QACN,EAAA,EAAI,MAAA;AAAA,QACJ,QAAA,EAAU,IAAA;AAAA,QACV,WAAA,EAAa,QAAA,EAAU,WAAA,IAAe,CAAA,eAAA,EAAkB,SAAS,CAAA,CAAA;AAAA,QACjE,MAAA,EAAQ,QAAA,EAAU,MAAA,IAAU,IAAA,CAAK,YAAA,CAAa,UAAU,IAAI,CAAA,IAAK,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,QAClF,SAAS,QAAA,EAAU;AAAA,OACpB,CAAA;AAAA,IACH;AAGA,IAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,MAAA,IAAI,KAAA,CAAM,OAAO,MAAA,EAAQ;AACvB,QAAA,MAAA,CAAO,IAAA,CAAK;AAAA,UACV,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,IAAI,KAAA,CAAM,EAAA;AAAA,UACV,QAAA,EAAU,MAAM,QAAA,IAAY,KAAA;AAAA,UAC5B,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,IAAA,CAAK,YAAA,CAAa,MAAM,IAAI,CAAA,IAAK,EAAE,IAAA,EAAM,QAAA,EAAS;AAAA,UAC1E,SAAS,KAAA,CAAM;AAAA,SAChB,CAAA;AAAA,MACH;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,eACN,SAAA,EAOoC;AACpC,IAAA,MAAM,SAA6C,EAAC;AAEpD,IAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,MAAA,MAAA,CAAO,KAAK,CAAA,GAAI;AAAA,QACd,WAAA,EAAa,qBAAA;AAAA,QACb,OAAA,EAAS;AAAA,UACP,kBAAA,EAAoB;AAAA,YAClB,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA;AAAS;AAC3B;AACF,OACF;AAAA,IACF,CAAA,MAAO;AACL,MAAA,KAAA,MAAW,YAAY,SAAA,EAAW;AAChC,QAAA,MAAM,UAAqC,EAAC;AAE5C,QAAA,IAAI,SAAS,IAAA,EAAM;AACjB,UAAA,OAAA,CAAQ,kBAAkB,CAAA,GAAI;AAAA,YAC5B,MAAA,EAAQ,KAAK,YAAA,CAAa,QAAA,CAAS,IAAI,CAAA,IAAK,EAAE,MAAM,QAAA,EAAS;AAAA,YAC7D,QAAA,EAAU,QAAA,CAAS,QAAA,GACf,MAAA,CAAO,QAAQ,QAAA,CAAS,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,EAAK,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC9D,cAAA,GAAA,CAAI,GAAG,CAAA,GAAI,EAAE,KAAA,EAAM;AACnB,cAAA,OAAO,GAAA;AAAA,YACT,CAAA,EAAG,EAAoC,CAAA,GACvC;AAAA,WACN;AAAA,QACF;AAEA,QAAA,MAAA,CAAO,MAAA,CAAO,QAAA,CAAS,UAAU,CAAC,CAAA,GAAI;AAAA,UACpC,aAAa,QAAA,CAAS,WAAA;AAAA,UACtB,SAAS,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,MAAA,GAAS,IAAI,OAAA,GAAU,MAAA;AAAA,UACrD,SAAS,QAAA,CAAS;AAAA,SACpB;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,iBAAiB,IAAA,EAKT;AACd,IAAA,OAAO;AAAA,MACL,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,QAAA,EAAU,KAAK,QAAA,IAAY,KAAA;AAAA,MAC3B,OAAA,EAAS;AAAA,QACP,kBAAA,EAAoB;AAAA,UAClB,MAAA,EAAQ,KAAK,YAAA,CAAa,IAAA,CAAK,IAAI,CAAA,IAAK,EAAE,MAAM,QAAA,EAAS;AAAA,UACzD,QAAA,EAAU,IAAA,CAAK,QAAA,GACX,MAAA,CAAO,QAAQ,IAAA,CAAK,QAAQ,CAAA,CAAE,MAAA,CAAO,CAAC,GAAA,EAAK,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC1D,YAAA,GAAA,CAAI,GAAG,CAAA,GAAI,EAAE,KAAA,EAAM;AACnB,YAAA,OAAO,GAAA;AAAA,UACT,CAAA,EAAG,EAAoC,CAAA,GACvC;AAAA;AACN;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKQ,aAAa,IAAA,EAA+B;AAClD,IAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAGlB,IAAA,IAAI,IAAA,KAAS,MAAA,EAAQ,OAAO,EAAE,MAAM,QAAA,EAAS;AAC7C,IAAA,IAAI,IAAA,KAAS,MAAA,EAAQ,OAAO,EAAE,MAAM,QAAA,EAAS;AAC7C,IAAA,IAAI,IAAA,KAAS,OAAA,EAAS,OAAO,EAAE,MAAM,SAAA,EAAU;AAC/C,IAAA,IAAI,IAAA,KAAS,KAAA,EAAO,OAAO,EAAE,IAAA,EAAM,SAAS,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAS,EAAE;AACtE,IAAA,IAAI,IAAA,KAAS,MAAA,EAAQ,OAAO,EAAE,MAAM,QAAA,EAAS;AAG7C,IAAA,IAAI,OAAO,SAAS,UAAA,EAAY;AAC9B,MAAA,MAAM,QAAA,GAAW,IAAI,IAAA,EAAK;AAC1B,MAAA,MAAM,aAAqC,EAAC;AAE5C,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,QAAQ,CAAA,EAAG;AACvC,QAAA,MAAM,KAAA,GAAQ,SAAS,GAAG,CAAA;AAC1B,QAAA,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,KAAK,CAAA;AAAA,MAC1C;AAEA,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,QAAA;AAAA,QACN;AAAA,OACF;AAAA,IACF;AAEA,IAAA,OAAO,MAAA;AAAA,EACT;AAAA;AAAA;AAAA;AAAA,EAKQ,YAAY,KAAA,EAAoB;AACtC,IAAA,MAAM,OAAO,OAAO,KAAA;AAEpB,IAAA,IAAI,IAAA,KAAS,QAAA,EAAU,OAAO,EAAE,MAAM,QAAA,EAAS;AAC/C,IAAA,IAAI,IAAA,KAAS,QAAA,EAAU,OAAO,EAAE,MAAM,QAAA,EAAS;AAC/C,IAAA,IAAI,IAAA,KAAS,SAAA,EAAW,OAAO,EAAE,MAAM,SAAA,EAAU;AACjD,IAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,OAAA;AAAA,QACN,KAAA,EAAO,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,EAAE,IAAA,EAAM,QAAA;AAAS,OAC1E;AAAA,IACF;AACA,IAAA,IAAI,IAAA,KAAS,QAAA,IAAY,KAAA,KAAU,IAAA,EAAM;AACvC,MAAA,MAAM,aAAqC,EAAC;AAC5C,MAAA,KAAA,MAAW,OAAO,KAAA,EAAO;AACvB,QAAA,UAAA,CAAW,GAAG,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,GAAG,CAAC,CAAA;AAAA,MAC/C;AACA,MAAA,OAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAA,EAAW;AAAA,IACtC;AAEA,IAAA,OAAO,EAAE,MAAM,QAAA,EAAS;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA,EAKQ,kBAAkB,IAAA,EAAwB;AAChD,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,KAAA,CAAM,mBAAmB,CAAA;AAC9C,IAAA,OAAO,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM,EAAE,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,EAAC;AAAA,EACrD;AAAA;AAAA;AAAA;AAAA,EAKQ,cAAc,IAAA,EAAsB;AAE1C,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,mBAAA,EAAqB,MAAM,CAAA;AAAA,EACjD;AAAA;AAAA;AAAA;AAAA,EAKO,SAAA,CAAU,MAAc,MAAA,EAAsB;AACnD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,UAAA,EAAY;AAC7B,MAAA,IAAA,CAAK,QAAA,CAAS,UAAA,GAAa,EAAE,OAAA,EAAS,EAAC,EAAE;AAAA,IAC3C;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,OAAA,EAAS;AACrC,MAAA,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,OAAA,GAAU,EAAC;AAAA,IACtC;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,OAAA,CAAQ,IAAI,CAAA,GAAI,MAAA;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA,EAKO,iBAAA,CAAkB,MAAc,MAAA,EAAmB;AACxD,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,UAAA,EAAY;AAC7B,MAAA,IAAA,CAAK,QAAA,CAAS,UAAA,GAAa,EAAE,eAAA,EAAiB,EAAC,EAAE;AAAA,IACnD;AACA,IAAA,IAAI,CAAC,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,eAAA,EAAiB;AAC7C,MAAA,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,eAAA,GAAkB,EAAC;AAAA,IAC9C;AACA,IAAA,IAAA,CAAK,QAAA,CAAS,UAAA,CAAW,eAAA,CAAgB,IAAI,CAAA,GAAI,MAAA;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKO,WAAA,GAA+B;AACpC,IAAA,OAAO,IAAA,CAAK,QAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKO,SAAA,GAAqC;AAC1C,IAAA,OAAO,IAAA,CAAK,MAAA;AAAA,EACd;AAAA;AAAA;AAAA;AAAA,EAKO,MAAA,GAAiB;AACtB,IAAA,OAAO,IAAA,CAAK,SAAA,CAAU,IAAA,CAAK,QAAA,EAAU,MAAM,CAAC,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,cAAA,CAAe,WAAA,EAAqB,MAAA,EAA6B,OAAA,EAAyB;AACtG,IAAA,OAAO;AAAA,MACL,WAAA;AAAA,MACA,SAAS,MAAA,GAAS;AAAA,QAChB,kBAAA,EAAoB;AAAA,UAClB,MAAA;AAAA,UACA,GAAI,OAAA,IAAW,EAAE,QAAA,EAAU,EAAE,SAAS,EAAE,KAAA,EAAO,OAAA,EAAQ,EAAE;AAAE;AAC7D,OACF,GAAI;AAAA,KACN;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,iBAAA,CAAkB,MAAA,EAA4B,WAAA,EAAsB,QAAA,GAAW,MAAM,OAAA,EAA4B;AAC7H,IAAA,OAAO;AAAA,MACL,WAAA;AAAA,MACA,QAAA;AAAA,MACA,OAAA,EAAS;AAAA,QACP,kBAAA,EAAoB;AAAA,UAClB,MAAA;AAAA,UACA,GAAI,OAAA,IAAW,EAAE,QAAA,EAAU,EAAE,SAAS,EAAE,KAAA,EAAO,OAAA,EAAQ,EAAE;AAAE;AAC7D;AACF,KACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,eAAA,CACZ,IAAA,EACA,QAAA,EACA,QACA,OAAA,EAMW;AACX,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,EAAA,EAAI,QAAA;AAAA,MACJ,aAAa,OAAA,EAAS,WAAA;AAAA,MACtB,QAAA,EAAU,OAAA,EAAS,QAAA,IAAa,QAAA,KAAa,MAAA;AAAA,MAC7C,YAAY,OAAA,EAAS,UAAA;AAAA,MACrB,MAAA;AAAA,MACA,SAAS,OAAA,EAAS;AAAA,KACpB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,OAAc,YAAA,CAAa,UAAA,EAAgD,QAAA,EAA6B;AACtG,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,QAAA;AAAA,MACN,UAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AACF;ACrnBA,SAAS,aAAA,GAAwB;AAC/B,EAAA,IAAI,OAAO,cAAc,WAAA,EAAa;AACpC,IAAA,OAAO,SAAA;AAAA,EACT;AACA,EAAA,OAAO,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAC/C;AAEO,IAAM,qBAAN,MAAyB;AAAA,EAI9B,WAAA,CAAY,KAAkB,MAAA,EAAwB;AACpD,IAAA,IAAA,CAAK,GAAA,GAAM,GAAA;AACX,IAAA,IAAA,CAAK,SAAA,GAAY,IAAI,gBAAA,CAAiB,MAAM,CAAA;AAAA,EAC9C;AAAA;AAAA;AAAA;AAAA,EAKO,KAAA,GAAc;AACnB,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,SAAA,CAAU,SAAA,EAAU;AAExC,IAAA,IAAI,CAAC,OAAO,OAAA,EAAS;AACnB,MAAA;AAAA,IACF;AAGA,IAAA,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,CAAA,cAAA,CAAA,EAAkB,CAAC,MAAW,GAAA,KAAa;AACtD,MAAA,GAAA,CAAI,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,WAAA,EAAa,CAAA;AAAA,IACvC,CAAC,CAAA;AAGD,IAAA,IAAA,CAAK,IAAI,GAAA,CAAI,MAAA,CAAO,IAAA,EAAM,CAAC,MAAW,GAAA,KAAa;AACjD,MAAA,IAAI;AACF,QAAA,MAAM,aAAa,aAAA,EAAc;AACjC,QAAA,MAAM,QAAA,GAAW,IAAA,CAAK,UAAA,EAAY,wBAAwB,CAAA;AAG1D,QAAA,IAAI,SAAA,GAAY,QAAA;AAChB,QAAA,IAAI,CAAC,UAAA,CAAW,QAAQ,CAAA,EAAG;AAEzB,UAAA,MAAM,OAAA,GAAU,KAAK,UAAA,EAAY,IAAA,EAAM,MAAM,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU,SAAA,EAAW,wBAAwB,CAAA;AACvG,UAAA,IAAI,UAAA,CAAW,OAAO,CAAA,EAAG;AACvB,YAAA,SAAA,GAAY,OAAA;AAAA,UACd,CAAA,MAAO;AACL,YAAA,MAAM,IAAI,KAAA,CAAM,CAAA,6BAAA,EAAgC,QAAQ,CAAA,IAAA,EAAO,OAAO,CAAA,CAAE,CAAA;AAAA,UAC1E;AAAA,QACF;AAEA,QAAA,IAAI,IAAA,GAAO,YAAA,CAAa,SAAA,EAAW,OAAO,CAAA;AAG1C,QAAA,MAAM,GAAA,GAAM,IAAA,CAAK,SAAA,CAAU,WAAA,EAAY;AACvC,QAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,YAAA,EAAc,GAAA,CAAI,KAAK,KAAK,CAAA;AAChD,QAAA,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,cAAA,EAAgB,GAAA,CAAI,KAAK,OAAO,CAAA;AACpD,QAAA,IAAA,GAAO,KAAK,OAAA,CAAQ,kBAAA,EAAoB,GAAA,CAAI,IAAA,CAAK,eAAe,EAAE,CAAA;AAElE,QAAA,GAAA,CAAI,IAAA,CAAK,MAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,MAC5B,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,KAAA,CAAM,qBAAqB,KAAK,CAAA;AACxC,QAAA,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,CAAE,IAAA,CAAK;AAAA,UACnB,KAAA,EAAO,2BAAA;AAAA,UACP,SAAS,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK;AAAA,SAC/D,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKO,YAAA,GAAiC;AACtC,IAAA,OAAO,IAAA,CAAK,SAAA;AAAA,EACd;AACF;AAKO,SAAS,YAAA,CAAa,KAAkB,MAAA,EAA0C;AACvF,EAAA,MAAM,WAAA,GAAc,IAAI,kBAAA,CAAmB,GAAA,EAAK,MAAM,CAAA;AACtD,EAAA,WAAA,CAAY,KAAA,EAAM;AAClB,EAAA,OAAO,YAAY,YAAA,EAAa;AAClC;;;ACtFA,IAAM,MAAA,uBAAa,OAAA,EAA0B;AAC7C,IAAM,MAAA,uBAAa,OAAA,EAAqC;AACxD,IAAM,MAAA,uBAAa,OAAA,EAAkD;AACrE,IAAM,YAAA,uBAAmB,OAAA,EAAuC;AA8FzD,SAAS,eAAA,CAAgB,KAAkB,WAAA,EAAmC;AACnF,EAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,eAAA,KAAoB;AACvC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,eAAe,CAAA,IAAK,EAAA;AAC9C,IAAA,MAAM,QAAA,GAAW,IAAI,eAAA,EAAgB;AACrC,IAAA,MAAM,MAAA,GAAS,MAAA,CAAO,GAAA,CAAI,eAAe,KAAK,EAAC;AAE/C,IAAA,MAAA,CAAO,OAAA,CAAQ,CAAC,CAAA,KAAM;AACpB,MAAA,MAAM,OAAA,GAAU,OACd,GAAA,EACA,GAAA,EACA,IAAA,KACG;AACH,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAA,CAAU,CAAA,CAAE,MAAA,IAAU,IAAI,KAAA,EAAM,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,KAAA,GAAQ,EAAE,KAAK,CAAA;AACxE,UAAA,MAAM,IAAA,GAAO,MAAA,CAAO,GAAA,CAAI,CAAC,CAAA,KAAM;AAC7B,YAAA,QAAQ,EAAE,IAAA;AAAM,cACd,KAAK,KAAA;AACH,gBAAA,OAAO,GAAA;AAAA,cACT,KAAK,KAAA;AACH,gBAAA,OAAO,GAAA;AAAA,cACT,KAAK,MAAA;AACH,gBAAA,OAAO,IAAA;AAAA,cACT,KAAK,OAAA;AACH,gBAAA,OAAO,EAAE,IAAA,GAAO,GAAA,CAAI,OAAO,CAAA,CAAE,IAAI,IAAI,GAAA,CAAI,MAAA;AAAA,cAC3C,KAAK,OAAA;AACH,gBAAA,OAAO,EAAE,IAAA,GAAO,GAAA,CAAI,MAAM,CAAA,CAAE,IAAI,IAAI,GAAA,CAAI,KAAA;AAAA,cAC1C,KAAK,MAAA,EAAQ;AACX,gBAAA,MAAM,OAAO,GAAA,CAAI,IAAA;AACjB,gBAAA,OAAO,CAAA,CAAE,IAAA,GAAO,IAAA,GAAO,CAAA,CAAE,IAAI,CAAA,GAAI,IAAA;AAAA,cACnC;AAAA,cACA,KAAK,SAAA;AACH,gBAAA,OAAO,CAAA,CAAE,OAAO,GAAA,CAAI,OAAA,CAAQ,EAAE,IAAA,CAAK,WAAA,EAAa,CAAA,GAAI,GAAA,CAAI,OAAA;AAAA,cAC1D,KAAK,IAAA;AACH,gBAAA,OAAO,GAAA,CAAI,EAAA;AAAA,cACb,KAAK,WAAA;AACH,gBAAA,OAAO,GAAA,CAAI,QAAQ,YAAY,CAAA;AAAA,cACjC;AACE,gBAAA,OAAO,KAAA,CAAA;AAAA;AACX,UACF,CAAC,CAAA;AAED,UAAA,MAAM,EAAA,GAAM,QAAA,CAAqC,CAAA,CAAE,WAAW,CAAA;AAG9D,UAAA,MAAM,MAAA,GAAS,EAAA,CAAG,GAAG,IAAI,CAAA;AACzB,UAAA,IAAI,MAAA,YAAkB,SAAS,MAAM,MAAA;AAAA,QACvC,SAAS,GAAA,EAAK;AACZ,UAAA,IAAI,IAAA,OAAW,GAAG,CAAA;AAAA,QACpB;AAAA,MACF,CAAA;AAEA,MAAA,GAAA,CAAI,SAAS,CAAA,CAAE,MAAA,EAAQ,MAAA,GAAS,CAAA,CAAE,MAAM,OAAO,CAAA;AAAA,IACjD,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAMO,SAAS,sBAAsB,eAAA,EAA2B;AAC/D,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,eAAe,CAAA,IAAK,EAAA;AAAA,IACvC,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,eAAe,KAAK,EAAC;AAAA,IACxC,MAAA,EAAQ,MAAA,CAAO,GAAA,CAAI,eAAe,CAAA;AAAA,IAClC,YAAA,EAAc,YAAA,CAAa,GAAA,CAAI,eAAe;AAAA,GAChD;AACF;;;AC9IO,SAAS,2BAAA,CACd,GAAA,EACA,MAAA,EACA,WAAA,EACkB;AAElB,EAAA,MAAM,WAAA,GAAc,IAAI,kBAAA,CAAmB,GAAA,EAAK,MAAM,CAAA;AACtD,EAAA,WAAA,CAAY,KAAA,EAAM;AAClB,EAAA,MAAM,UAAA,GAAa,YAAY,YAAA,EAAa;AAG5C,EAAA,eAAA,CAAgB,KAAK,WAAW,CAAA;AAGhC,EAAA,WAAA,CAAY,OAAA,CAAQ,CAAC,eAAA,KAAoB;AACvC,IAAA,MAAM,QAAA,GAAW,sBAAsB,eAAe,CAAA;AAEtD,IAAA,IAAI,QAAA,CAAS,MAAA,CAAO,MAAA,GAAS,CAAA,EAAG;AAC9B,MAAA,MAAM,QAAA,GAAW,IAAI,eAAA,EAAgB;AACrC,MAAA,UAAA,CAAW,aAAA,CAAc,QAAA,EAAU,QAAA,CAAS,MAAA,EAAQ,SAAS,MAAM,CAAA;AAAA,IACrE;AAAA,EACF,CAAC,CAAA;AAED,EAAA,OAAO,UAAA;AACT;;;ACtBO,IAAM,cAAA,GAAiB;AAAA,EAC5B,gBAAgB,gBAAA,CAAiB,cAAA;AAAA,EACjC,mBAAmB,gBAAA,CAAiB,iBAAA;AAAA,EACpC,iBAAiB,gBAAA,CAAiB,eAAA;AAAA,EAClC,cAAc,gBAAA,CAAiB;AACjC","file":"swagger.js","sourcesContent":["import type {\n ApiDocMetadata,\n ApiResponseMetadata,\n ApiParameterMetadata,\n ApiBodyMetadata,\n Schema,\n SecurityRequirement,\n Header,\n} from \"../types/swagger.type\";\n\nconst API_METADATA = new WeakMap<Function, Map<string, ApiDocMetadata>>();\nconst API_RESPONSES = new WeakMap<Function, Map<string, ApiResponseMetadata[]>>();\nconst API_PARAMETERS = new WeakMap<Function, Map<string, ApiParameterMetadata[]>>();\nconst API_BODY = new WeakMap<Function, Map<string, ApiBodyMetadata>>();\nconst API_TAGS = new WeakMap<Function, string[]>();\n\n/**\n * Decorator to document an endpoint\n */\nexport function ApiDoc(metadata: Omit<ApiDocMetadata, \"method\" | \"path\">): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_METADATA.get(ctor);\n if (!map) {\n map = new Map<string, ApiDocMetadata>();\n API_METADATA.set(ctor, map);\n }\n map.set(String(propertyKey), metadata);\n };\n}\n\n/**\n * Decorator to document a response\n */\nexport function ApiResponse(\n statusCode: number,\n description: string,\n options?: {\n type?: any;\n examples?: Record<string, any>;\n headers?: Record<string, Header>;\n }\n): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_RESPONSES.get(ctor);\n if (!map) {\n map = new Map<string, ApiResponseMetadata[]>();\n API_RESPONSES.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const responses = map.get(key) ?? [];\n responses.push({\n statusCode,\n description,\n type: options?.type,\n examples: options?.examples,\n headers: options?.headers,\n });\n map.set(key, responses);\n };\n}\n\n/**\n * Decorator to document a parameter\n */\nexport function ApiParameter(\n name: string,\n paramIn: \"query\" | \"header\" | \"path\" | \"cookie\",\n options?: {\n description?: string;\n required?: boolean;\n type?: any;\n example?: any;\n schema?: Schema;\n }\n): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_PARAMETERS.get(ctor);\n if (!map) {\n map = new Map<string, ApiParameterMetadata[]>();\n API_PARAMETERS.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const params = map.get(key) ?? [];\n params.push({\n name,\n in: paramIn,\n description: options?.description,\n required: options?.required,\n type: options?.type,\n example: options?.example,\n schema: options?.schema,\n });\n map.set(key, params);\n };\n}\n\n/**\n * Decorator to document a request body\n */\nexport function ApiBody(\n description: string,\n options?: {\n type?: any;\n required?: boolean;\n examples?: Record<string, any>;\n }\n): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_BODY.get(ctor);\n if (!map) {\n map = new Map<string, ApiBodyMetadata>();\n API_BODY.set(ctor, map);\n }\n\n map.set(String(propertyKey), {\n description,\n type: options?.type,\n required: options?.required,\n examples: options?.examples,\n });\n };\n}\n\n/**\n * Decorator to add tags to a controller\n */\nexport function ApiTags(...tags: string[]): ClassDecorator {\n return (target) => {\n API_TAGS.set(target as Function, tags);\n };\n}\n\n/**\n * Decorator to mark an endpoint as deprecated\n */\nexport function ApiDeprecated(): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_METADATA.get(ctor);\n if (!map) {\n map = new Map<string, ApiDocMetadata>();\n API_METADATA.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const existing = map.get(key) ?? {};\n map.set(key, { ...existing, deprecated: true });\n };\n}\n\n/**\n * Decorator to add security requirements\n */\nexport function ApiSecurity(...requirements: SecurityRequirement[]): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_METADATA.get(ctor);\n if (!map) {\n map = new Map<string, ApiDocMetadata>();\n API_METADATA.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const existing = map.get(key) ?? {};\n map.set(key, { ...existing, security: requirements });\n };\n}\n\n/**\n * Helper to get all swagger metadata\n */\nexport function getSwaggerMetadata(target: Function) {\n return {\n metadata: API_METADATA.get(target),\n responses: API_RESPONSES.get(target),\n parameters: API_PARAMETERS.get(target),\n body: API_BODY.get(target),\n tags: API_TAGS.get(target),\n };\n}\n\n/**\n * Unified Swagger decorator - Simple and easy to use!\n * Document everything in one place with a clean object structure.\n * \n * @example\n * ```typescript\n * @Swagger({\n * summary: \"Get user by ID\",\n * description: \"Retrieve a single user\",\n * tags: [\"Users\"],\n * parameters: [\n * {\n * name: \"id\",\n * in: \"path\",\n * description: \"User ID\",\n * required: true,\n * schema: { type: \"string\" },\n * example: \"123\"\n * }\n * ],\n * responses: {\n * 200: {\n * description: \"User found\",\n * example: { id: \"123\", name: \"John\" }\n * },\n * 404: {\n * description: \"User not found\",\n * example: { error: \"Not found\" }\n * }\n * }\n * })\n * getUser(req, res) { }\n * ```\n */\nexport function Swagger(config: {\n summary?: string;\n description?: string;\n tags?: string[];\n operationId?: string;\n deprecated?: boolean;\n security?: SecurityRequirement[];\n parameters?: Array<{\n name: string;\n in: \"query\" | \"header\" | \"path\" | \"cookie\";\n description?: string;\n required?: boolean;\n schema?: Schema;\n example?: any;\n }>;\n requestBody?: {\n description?: string;\n required?: boolean;\n content?: any;\n example?: any;\n };\n responses?: Record<number, {\n description: string;\n example?: any;\n schema?: Schema;\n headers?: Record<string, Header>;\n }>;\n}): MethodDecorator {\n return (target, propertyKey) => {\n const ctor = typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n const key = String(propertyKey);\n\n // Set basic metadata\n if (config.summary || config.description || config.operationId || config.deprecated !== undefined || config.security) {\n let metaMap = API_METADATA.get(ctor);\n if (!metaMap) {\n metaMap = new Map<string, ApiDocMetadata>();\n API_METADATA.set(ctor, metaMap);\n }\n metaMap.set(key, {\n summary: config.summary,\n description: config.description,\n operationId: config.operationId,\n deprecated: config.deprecated,\n security: config.security,\n tags: config.tags,\n });\n }\n\n // Set parameters\n if (config.parameters && config.parameters.length > 0) {\n let paramMap = API_PARAMETERS.get(ctor);\n if (!paramMap) {\n paramMap = new Map<string, ApiParameterMetadata[]>();\n API_PARAMETERS.set(ctor, paramMap);\n }\n paramMap.set(key, config.parameters.map(p => ({\n name: p.name,\n in: p.in,\n description: p.description,\n required: p.required,\n schema: p.schema,\n example: p.example,\n })));\n }\n\n // Set request body\n if (config.requestBody) {\n let bodyMap = API_BODY.get(ctor);\n if (!bodyMap) {\n bodyMap = new Map<string, ApiBodyMetadata>();\n API_BODY.set(ctor, bodyMap);\n }\n bodyMap.set(key, {\n description: config.requestBody.description,\n required: config.requestBody.required,\n type: config.requestBody.content,\n examples: config.requestBody.example ? { default: config.requestBody.example } : undefined,\n });\n }\n\n // Set responses\n if (config.responses) {\n let respMap = API_RESPONSES.get(ctor);\n if (!respMap) {\n respMap = new Map<string, ApiResponseMetadata[]>();\n API_RESPONSES.set(ctor, respMap);\n }\n const responses = Object.entries(config.responses).map(([code, resp]) => ({\n statusCode: Number(code),\n description: resp.description,\n type: resp.schema,\n examples: resp.example ? { default: resp.example } : undefined,\n headers: resp.headers,\n }));\n respMap.set(key, responses);\n }\n };\n}\n","import type {\n OpenAPIDocument,\n OpenAPIPaths,\n Operation,\n PathItem,\n Parameter,\n Response,\n Schema,\n Reference,\n MediaType,\n SwaggerConfig,\n RequestBody,\n} from \"../../types/swagger.type\";\nimport { getSwaggerMetadata } from \"../../decorators/Swagger\";\nimport type { RouteDefinition } from \"../../types/routes.type\";\n\nexport class SwaggerGenerator {\n private config: Required<SwaggerConfig>;\n private document: OpenAPIDocument;\n\n constructor(config?: SwaggerConfig) {\n this.config = {\n enabled: config?.enabled ?? true,\n path: config?.path ?? \"/docs\",\n title: config?.title ?? \"AzuraJS API\",\n description: config?.description ?? \"API documentation powered by AzuraJS\",\n version: config?.version ?? \"1.0.0\",\n servers: config?.servers ?? [{ url: \"http://localhost:3000\" }],\n security: config?.security ?? [],\n tags: config?.tags ?? [],\n contact: config?.contact ?? {},\n license: config?.license ?? { name: \"MIT\" },\n };\n\n this.document = {\n openapi: \"3.0.3\",\n info: {\n title: this.config.title,\n description: this.config.description,\n version: this.config.version,\n contact: this.config.contact,\n license: this.config.license,\n },\n servers: this.config.servers,\n paths: {},\n components: {\n schemas: {},\n responses: {},\n parameters: {},\n securitySchemes: {},\n },\n tags: this.config.tags,\n security: this.config.security,\n };\n }\n\n /**\n * Add routes from a controller to the OpenAPI document\n */\n public addController(controller: any, routes: RouteDefinition[], prefix = \"\"): void {\n const metadata = getSwaggerMetadata(controller.constructor);\n const controllerTags = metadata.tags ?? [];\n\n for (const route of routes) {\n const fullPath = this.normalizePath(prefix + route.path);\n const method = route.method.toLowerCase() as keyof PathItem;\n\n if (!this.document.paths[fullPath]) {\n this.document.paths[fullPath] = {};\n }\n\n const methodMetadata = metadata.metadata?.get(route.propertyKey);\n const responses = metadata.responses?.get(route.propertyKey) ?? [];\n const parameters = metadata.parameters?.get(route.propertyKey) ?? [];\n const body = metadata.body?.get(route.propertyKey);\n\n const operation: Operation = {\n summary: methodMetadata?.summary ?? route.description,\n description: methodMetadata?.description,\n tags: methodMetadata?.tags ?? controllerTags,\n operationId:\n methodMetadata?.operationId ??\n `${route.method}_${fullPath.replace(/[^a-zA-Z0-9]/g, \"_\")}`,\n deprecated: methodMetadata?.deprecated,\n security: methodMetadata?.security,\n parameters: this.buildParameters(parameters, route),\n responses: this.buildResponses(responses),\n };\n\n if (body) {\n operation.requestBody = this.buildRequestBody(body);\n }\n\n (this.document.paths[fullPath] as any)[method] = operation;\n }\n }\n\n /**\n * Add a single route manually without decorators (for JavaScript/plain TypeScript users)\n * \n * @example\n * ```javascript\n * const swagger = setupSwagger(app, { title: \"My API\" });\n * \n * app.get('/users/:id', (req, res) => {\n * res.json({ id: req.params.id, name: 'John' });\n * });\n * \n * swagger.addRoute({\n * method: 'GET',\n * path: '/users/:id',\n * summary: 'Get user by ID',\n * description: 'Returns a single user',\n * tags: ['Users'],\n * parameters: [{\n * name: 'id',\n * in: 'path',\n * required: true,\n * schema: { type: 'string' },\n * description: 'User ID'\n * }],\n * responses: {\n * 200: {\n * description: 'Successful response',\n * content: {\n * 'application/json': {\n * schema: {\n * type: 'object',\n * properties: {\n * id: { type: 'string' },\n * name: { type: 'string' }\n * }\n * }\n * }\n * }\n * }\n * }\n * });\n * ```\n */\n public addRoute(config: {\n method: string;\n path: string;\n summary?: string;\n description?: string;\n tags?: string[];\n operationId?: string;\n deprecated?: boolean;\n security?: Array<Record<string, string[]>>;\n parameters?: Parameter[];\n requestBody?: RequestBody;\n responses?: Record<string, Response>;\n }): void {\n const fullPath = this.normalizePath(config.path);\n const method = config.method.toLowerCase() as keyof PathItem;\n\n if (!this.document.paths[fullPath]) {\n this.document.paths[fullPath] = {};\n }\n\n const pathParams = this.extractPathParams(config.path);\n const allParameters: Parameter[] = [\n ...(config.parameters || []),\n ...pathParams\n .filter(param => !config.parameters?.some(p => p.name === param))\n .map(param => ({\n name: param,\n in: 'path' as const,\n required: true,\n schema: { type: 'string' as const },\n description: `Path parameter: ${param}`,\n })),\n ];\n\n const operation: Operation = {\n summary: config.summary,\n description: config.description,\n tags: config.tags,\n operationId: config.operationId ?? `${config.method}_${fullPath.replace(/[^a-zA-Z0-9]/g, \"_\")}`,\n deprecated: config.deprecated,\n security: config.security,\n parameters: allParameters.length > 0 ? allParameters : undefined,\n responses: config.responses || {\n 200: {\n description: 'Successful response',\n },\n },\n };\n\n if (config.requestBody) {\n operation.requestBody = config.requestBody;\n }\n\n (this.document.paths[fullPath] as any)[method] = operation;\n }\n\n /**\n * SIMPLE API - Add route with easy object structure\n * This is the easiest way to document routes without decorators!\n * \n * @example\n * ```javascript\n * swagger.addDoc({\n * method: 'GET',\n * path: '/users/:id',\n * summary: 'Get user by ID',\n * tags: ['Users'],\n * parameters: [\n * { name: 'id', in: 'path', required: true, schema: { type: 'string' }, example: '123' }\n * ],\n * responses: {\n * 200: { description: 'User found', example: { id: '123', name: 'John' } },\n * 404: { description: 'Not found', example: { error: 'User not found' } }\n * }\n * });\n * ```\n */\n public addDoc(config: {\n method: string;\n path: string;\n summary?: string;\n description?: string;\n tags?: string[];\n operationId?: string;\n deprecated?: boolean;\n security?: Array<Record<string, string[]>>;\n parameters?: Array<{\n name: string;\n in: \"query\" | \"header\" | \"path\" | \"cookie\";\n description?: string;\n required?: boolean;\n schema?: Schema | Reference;\n example?: any;\n }>;\n requestBody?: {\n description?: string;\n required?: boolean;\n schema?: Schema | Reference;\n example?: any;\n };\n responses?: Record<number, {\n description: string;\n example?: any;\n schema?: Schema | Reference;\n }>;\n }): void {\n const fullPath = this.normalizePath(config.path);\n const method = config.method.toLowerCase() as keyof PathItem;\n\n if (!this.document.paths[fullPath]) {\n this.document.paths[fullPath] = {};\n }\n\n // Auto-detect path parameters and merge with provided parameters\n const pathParams = this.extractPathParams(config.path);\n const providedParams = config.parameters || [];\n \n const allParameters: Parameter[] = [\n ...providedParams.map(p => ({\n name: p.name,\n in: p.in,\n description: p.description,\n required: p.required ?? (p.in === 'path'),\n schema: p.schema,\n example: p.example,\n })),\n // Add missing path params\n ...pathParams\n .filter(param => !providedParams.some(p => p.name === param))\n .map(param => ({\n name: param,\n in: 'path' as const,\n required: true,\n schema: { type: 'string' as const },\n description: `Path parameter: ${param}`,\n })),\n ];\n\n // Build responses\n const responses: Record<string, Response> = {};\n if (config.responses) {\n for (const [code, resp] of Object.entries(config.responses)) {\n responses[code] = {\n description: resp.description,\n content: resp.schema || resp.example ? {\n 'application/json': {\n schema: resp.schema,\n ...(resp.example && { examples: { default: { value: resp.example } } }),\n },\n } : undefined,\n };\n }\n } else {\n responses['200'] = { description: 'Successful response' };\n }\n\n const operation: Operation = {\n summary: config.summary,\n description: config.description,\n tags: config.tags,\n operationId: config.operationId ?? `${config.method}_${fullPath.replace(/[^a-zA-Z0-9]/g, \"_\")}`,\n deprecated: config.deprecated,\n security: config.security,\n parameters: allParameters.length > 0 ? allParameters : undefined,\n responses,\n };\n\n // Add request body if provided\n if (config.requestBody) {\n operation.requestBody = {\n description: config.requestBody.description,\n required: config.requestBody.required ?? false,\n content: {\n 'application/json': {\n schema: config.requestBody.schema,\n ...(config.requestBody.example && { \n examples: { default: { value: config.requestBody.example } } \n }),\n },\n },\n };\n }\n\n (this.document.paths[fullPath] as any)[method] = operation;\n }\n\n /**\n * Build parameters for operation\n */\n private buildParameters(\n parameters: Array<{\n name: string;\n in: \"query\" | \"header\" | \"path\" | \"cookie\";\n description?: string;\n required?: boolean;\n type?: any;\n example?: any;\n schema?: Schema;\n }>,\n route: RouteDefinition\n ): Parameter[] {\n const params: Parameter[] = [];\n\n // Add path parameters from route\n const pathParams = this.extractPathParams(route.path);\n for (const paramName of pathParams) {\n const existing = parameters.find((p) => p.name === paramName && p.in === \"path\");\n params.push({\n name: paramName,\n in: \"path\",\n required: true,\n description: existing?.description ?? `Path parameter ${paramName}`,\n schema: existing?.schema ?? this.typeToSchema(existing?.type) ?? { type: \"string\" },\n example: existing?.example,\n });\n }\n\n // Add other parameters\n for (const param of parameters) {\n if (param.in !== \"path\") {\n params.push({\n name: param.name,\n in: param.in,\n required: param.required ?? false,\n description: param.description,\n schema: param.schema ?? this.typeToSchema(param.type) ?? { type: \"string\" },\n example: param.example,\n });\n }\n }\n\n return params;\n }\n\n /**\n * Build responses for operation\n */\n private buildResponses(\n responses: Array<{\n statusCode: number;\n description: string;\n type?: any;\n examples?: Record<string, any>;\n headers?: Record<string, any>;\n }>\n ): { [statusCode: string]: Response } {\n const result: { [statusCode: string]: Response } = {};\n\n if (responses.length === 0) {\n result[\"200\"] = {\n description: \"Successful response\",\n content: {\n \"application/json\": {\n schema: { type: \"object\" },\n },\n },\n };\n } else {\n for (const response of responses) {\n const content: Record<string, MediaType> = {};\n\n if (response.type) {\n content[\"application/json\"] = {\n schema: this.typeToSchema(response.type) ?? { type: \"object\" },\n examples: response.examples\n ? Object.entries(response.examples).reduce((acc, [key, value]) => {\n acc[key] = { value };\n return acc;\n }, {} as Record<string, { value: any }>)\n : undefined,\n };\n }\n\n result[String(response.statusCode)] = {\n description: response.description,\n content: Object.keys(content).length > 0 ? content : undefined,\n headers: response.headers,\n };\n }\n }\n\n return result;\n }\n\n /**\n * Build request body\n */\n private buildRequestBody(body: {\n description?: string;\n type?: any;\n required?: boolean;\n examples?: Record<string, any>;\n }): RequestBody {\n return {\n description: body.description,\n required: body.required ?? false,\n content: {\n \"application/json\": {\n schema: this.typeToSchema(body.type) ?? { type: \"object\" },\n examples: body.examples\n ? Object.entries(body.examples).reduce((acc, [key, value]) => {\n acc[key] = { value };\n return acc;\n }, {} as Record<string, { value: any }>)\n : undefined,\n },\n },\n };\n }\n\n /**\n * Convert TypeScript type to OpenAPI schema\n */\n private typeToSchema(type: any): Schema | undefined {\n if (!type) return undefined;\n\n // Handle primitive types\n if (type === String) return { type: \"string\" };\n if (type === Number) return { type: \"number\" };\n if (type === Boolean) return { type: \"boolean\" };\n if (type === Array) return { type: \"array\", items: { type: \"object\" } };\n if (type === Object) return { type: \"object\" };\n\n // Handle class types - extract properties\n if (typeof type === \"function\") {\n const instance = new type();\n const properties: Record<string, Schema> = {};\n\n for (const key of Object.keys(instance)) {\n const value = instance[key];\n properties[key] = this.inferSchema(value);\n }\n\n return {\n type: \"object\",\n properties,\n };\n }\n\n return undefined;\n }\n\n /**\n * Infer schema from value\n */\n private inferSchema(value: any): Schema {\n const type = typeof value;\n\n if (type === \"string\") return { type: \"string\" };\n if (type === \"number\") return { type: \"number\" };\n if (type === \"boolean\") return { type: \"boolean\" };\n if (Array.isArray(value)) {\n return {\n type: \"array\",\n items: value.length > 0 ? this.inferSchema(value[0]) : { type: \"object\" },\n };\n }\n if (type === \"object\" && value !== null) {\n const properties: Record<string, Schema> = {};\n for (const key in value) {\n properties[key] = this.inferSchema(value[key]);\n }\n return { type: \"object\", properties };\n }\n\n return { type: \"object\" };\n }\n\n /**\n * Extract path parameters from route path\n */\n private extractPathParams(path: string): string[] {\n const matches = path.match(/:([a-zA-Z0-9_]+)/g);\n return matches ? matches.map((m) => m.slice(1)) : [];\n }\n\n /**\n * Normalize path to OpenAPI format\n */\n private normalizePath(path: string): string {\n // Convert :param to {param}\n return path.replace(/:([a-zA-Z0-9_]+)/g, \"{$1}\");\n }\n\n /**\n * Add a schema to components\n */\n public addSchema(name: string, schema: Schema): void {\n if (!this.document.components) {\n this.document.components = { schemas: {} };\n }\n if (!this.document.components.schemas) {\n this.document.components.schemas = {};\n }\n this.document.components.schemas[name] = schema;\n }\n\n /**\n * Add a security scheme to components\n */\n public addSecurityScheme(name: string, scheme: any): void {\n if (!this.document.components) {\n this.document.components = { securitySchemes: {} };\n }\n if (!this.document.components.securitySchemes) {\n this.document.components.securitySchemes = {};\n }\n this.document.components.securitySchemes[name] = scheme;\n }\n\n /**\n * Get the OpenAPI document\n */\n public getDocument(): OpenAPIDocument {\n return this.document;\n }\n\n /**\n * Get the config\n */\n public getConfig(): Required<SwaggerConfig> {\n return this.config;\n }\n\n /**\n * Get the document as JSON string\n */\n public toJSON(): string {\n return JSON.stringify(this.document, null, 2);\n }\n\n /**\n * Helper to create a simple response schema\n */\n public static createResponse(description: string, schema?: Schema | Reference, example?: any): Response {\n return {\n description,\n content: schema ? {\n 'application/json': {\n schema,\n ...(example && { examples: { default: { value: example } } }),\n },\n } : undefined,\n };\n }\n\n /**\n * Helper to create a request body\n */\n public static createRequestBody(schema: Schema | Reference, description?: string, required = true, example?: any): RequestBody {\n return {\n description,\n required,\n content: {\n 'application/json': {\n schema,\n ...(example && { examples: { default: { value: example } } }),\n },\n },\n };\n }\n\n /**\n * Helper to create a parameter\n */\n public static createParameter(\n name: string,\n location: 'query' | 'path' | 'header' | 'cookie',\n schema: Schema | Reference,\n options?: {\n description?: string;\n required?: boolean;\n deprecated?: boolean;\n example?: any;\n }\n ): Parameter {\n return {\n name,\n in: location,\n description: options?.description,\n required: options?.required ?? (location === 'path'),\n deprecated: options?.deprecated,\n schema,\n example: options?.example,\n };\n }\n\n /**\n * Helper to create a simple object schema\n */\n public static createSchema(properties: Record<string, Schema | Reference>, required?: string[]): Schema {\n return {\n type: 'object',\n properties,\n required,\n };\n }\n}\n","import type { AzuraClient } from \"../../infra/Server\";\nimport { SwaggerGenerator } from \"./SwaggerGenerator\";\nimport type { SwaggerConfig } from \"../../types/swagger.type\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join, dirname } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\n// Resolve o diretório atual de forma compatível com ESM e CJS\nfunction getCurrentDir(): string {\n if (typeof __dirname !== 'undefined') {\n return __dirname;\n }\n return dirname(fileURLToPath(import.meta.url));\n}\n\nexport class SwaggerIntegration {\n private generator: SwaggerGenerator;\n private app: AzuraClient;\n\n constructor(app: AzuraClient, config?: SwaggerConfig) {\n this.app = app;\n this.generator = new SwaggerGenerator(config);\n }\n\n /**\n * Setup Swagger routes\n */\n public setup(): void {\n const config = this.generator.getConfig();\n\n if (!config.enabled) {\n return;\n }\n\n // Route to serve OpenAPI spec JSON\n this.app.get(`/api-spec.json`, (_req: any, res: any) => {\n res.json(this.generator.getDocument());\n });\n\n // Route to serve Swagger UI\n this.app.get(config.path, (_req: any, res: any) => {\n try {\n const currentDir = getCurrentDir();\n const htmlPath = join(currentDir, \"swagger-ui-modern.html\");\n \n // Fallback para buscar em diferentes locais possíveis\n let finalPath = htmlPath;\n if (!existsSync(htmlPath)) {\n // Tenta buscar na raiz do pacote (para desenvolvimento)\n const srcPath = join(currentDir, \"..\", \"..\", \"..\", \"src\", \"shared\", \"swagger\", \"swagger-ui-modern.html\");\n if (existsSync(srcPath)) {\n finalPath = srcPath;\n } else {\n throw new Error(`Swagger UI HTML not found at ${htmlPath} or ${srcPath}`);\n }\n }\n\n let html = readFileSync(finalPath, \"utf-8\");\n\n // Replace placeholders\n const doc = this.generator.getDocument();\n html = html.replace(/{{TITLE}}/g, doc.info.title);\n html = html.replace(/{{VERSION}}/g, doc.info.version);\n html = html.replace(/{{DESCRIPTION}}/g, doc.info.description || \"\");\n\n res.type(\"html\").send(html);\n } catch (error) {\n console.error(\"Swagger UI error:\", error);\n res.status(500).json({ \n error: \"Failed to load Swagger UI\",\n details: error instanceof Error ? error.message : String(error)\n });\n }\n });\n }\n\n /**\n * Get the generator instance\n */\n public getGenerator(): SwaggerGenerator {\n return this.generator;\n }\n}\n\n/**\n * Helper function to setup Swagger in an AzuraClient instance\n */\nexport function setupSwagger(app: AzuraClient, config?: SwaggerConfig): SwaggerGenerator {\n const integration = new SwaggerIntegration(app, config);\n integration.setup();\n return integration.getGenerator();\n}\n","import type { AzuraClient } from \"../infra/Server\";\nimport type { RequestServer } from \"../types/http/request.type\";\nimport type { ResponseServer } from \"../types/http/response.type\";\nimport type { ParamDefinition, ParamSource, RouteDefinition } from \"../types/routes.type\";\n\nconst PREFIX = new WeakMap<Function, string>();\nconst ROUTES = new WeakMap<Function, RouteDefinition[]>();\nconst PARAMS = new WeakMap<Function, Map<string, ParamDefinition[]>>();\nconst DESCRIPTIONS = new WeakMap<Function, Map<string, string>>();\n\nexport function Controller(prefix = \"\"): ClassDecorator {\n return (target) => {\n PREFIX.set(target as Function, prefix);\n };\n}\n\nexport function Description(description: string): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = DESCRIPTIONS.get(ctor);\n if (!map) {\n map = new Map<string, string>();\n DESCRIPTIONS.set(ctor, map);\n }\n map.set(String(propertyKey), description);\n };\n}\n\nfunction createMethodDecorator(method: string) {\n return function (path = \"\"): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n const key = String(propertyKey);\n const routes = ROUTES.get(ctor) ?? [];\n const params = PARAMS.get(ctor)?.get(key) ?? [];\n const description = DESCRIPTIONS.get(ctor)?.get(key);\n\n const exists = routes.some(\n (r) => r.method === method && r.path === path && r.propertyKey === key\n );\n if (!exists) {\n routes.push({\n method,\n path,\n propertyKey: key,\n params,\n description,\n });\n ROUTES.set(ctor, routes);\n }\n };\n };\n}\n\nfunction createParamDecorator(type: ParamSource) {\n return function (name?: string): ParameterDecorator {\n return (target, propertyKey, parameterIndex) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = PARAMS.get(ctor);\n if (!map) {\n map = new Map<string, ParamDefinition[]>();\n PARAMS.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const list = map.get(key) ?? [];\n const exists = list.some(\n (p) => p.index === parameterIndex && p.type === type && p.name === name\n );\n if (!exists) {\n list.push({\n index: parameterIndex,\n type,\n name,\n });\n map.set(key, list);\n }\n };\n };\n}\n\nexport const Get = createMethodDecorator(\"GET\");\nexport const Post = createMethodDecorator(\"POST\");\nexport const Put = createMethodDecorator(\"PUT\");\nexport const Delete = createMethodDecorator(\"DELETE\");\nexport const Patch = createMethodDecorator(\"PATCH\");\nexport const Head = createMethodDecorator(\"HEAD\");\nexport const Options = createMethodDecorator(\"OPTIONS\");\n\nexport const Req = createParamDecorator(\"req\");\nexport const Res = createParamDecorator(\"res\");\nexport const Next = createParamDecorator(\"next\");\nexport const Param = createParamDecorator(\"param\");\nexport const Query = createParamDecorator(\"query\");\nexport const Body = createParamDecorator(\"body\");\nexport const Headers = createParamDecorator(\"headers\");\nexport const Ip = createParamDecorator(\"ip\");\nexport const UserAgent = createParamDecorator(\"useragent\");\n\nexport function applyDecorators(app: AzuraClient, controllers: Array<new () => any>) {\n controllers.forEach((ControllerClass) => {\n const prefix = PREFIX.get(ControllerClass) ?? \"\";\n const instance = new ControllerClass();\n const routes = ROUTES.get(ControllerClass) ?? [];\n\n routes.forEach((r) => {\n const handler = async (\n req: RequestServer,\n res: ResponseServer,\n next?: (err?: unknown) => void\n ) => {\n try {\n const params = (r.params ?? []).slice().sort((a, b) => a.index - b.index);\n const args = params.map((p) => {\n switch (p.type) {\n case \"req\":\n return req;\n case \"res\":\n return res;\n case \"next\":\n return next;\n case \"param\":\n return p.name ? req.params[p.name] : req.params;\n case \"query\":\n return p.name ? req.query[p.name] : req.query;\n case \"body\": {\n const body = req.body as Record<string, unknown> | undefined;\n return p.name ? body?.[p.name] : body;\n }\n case \"headers\":\n return p.name ? req.headers[p.name.toLowerCase()] : req.headers;\n case \"ip\":\n return req.ip;\n case \"useragent\":\n return req.headers[\"user-agent\"];\n default:\n return undefined;\n }\n });\n\n const fn = (instance as Record<string, unknown>)[r.propertyKey] as (\n ...args: unknown[]\n ) => unknown;\n const result = fn(...args);\n if (result instanceof Promise) await result;\n } catch (err) {\n if (next) next(err);\n }\n };\n\n app.addRoute(r.method, prefix + r.path, handler);\n });\n });\n}\n\n/**\n * Get routes metadata from a controller class\n * @internal Used by Swagger integration\n */\nexport function getControllerMetadata(ControllerClass: Function) {\n return {\n prefix: PREFIX.get(ControllerClass) || \"\",\n routes: ROUTES.get(ControllerClass) || [],\n params: PARAMS.get(ControllerClass),\n descriptions: DESCRIPTIONS.get(ControllerClass),\n };\n}\n","import type { AzuraClient } from \"../../infra/Server\";\nimport type { SwaggerConfig } from \"../../types/swagger.type\";\nimport { SwaggerIntegration } from \"./index\";\nimport { SwaggerGenerator } from \"./SwaggerGenerator\";\nimport { getControllerMetadata, applyDecorators } from \"../../decorators/Route\";\n\n/**\n * Setup Swagger with automatic controller registration\n * This is the SIMPLEST way to use Swagger in AzuraJS - just pass your controllers!\n * \n * @example\n * ```typescript\n * import { AzuraClient } from \"azurajs\";\n * import { setupSwaggerWithControllers } from \"azurajs\";\n * \n * const app = new AzuraClient();\n * \n * setupSwaggerWithControllers(app, {\n * title: \"My API\",\n * version: \"1.0.0\",\n * description: \"Simple and beautiful API docs\"\n * }, [UserController, ProductController]);\n * \n * app.listen(3000);\n * // That's it! Visit http://localhost:3000/docs\n * ```\n */\nexport function setupSwaggerWithControllers(\n app: AzuraClient,\n config: SwaggerConfig,\n controllers: Array<new () => any>\n): SwaggerGenerator {\n // Setup Swagger first\n const integration = new SwaggerIntegration(app, config);\n integration.setup();\n const swaggerGen = integration.getGenerator();\n\n // Register all controllers - both routes and swagger\n applyDecorators(app, controllers);\n \n // Add controllers to Swagger\n controllers.forEach((ControllerClass) => {\n const metadata = getControllerMetadata(ControllerClass);\n \n if (metadata.routes.length > 0) {\n const instance = new ControllerClass();\n swaggerGen.addController(instance, metadata.routes, metadata.prefix);\n }\n });\n\n return swaggerGen;\n}\n","/**\n * AzuraJS Swagger/OpenAPI Integration\n * Import from \"azurajs/swagger\" to use Swagger documentation\n */\n\nimport { SwaggerGenerator } from \"./swagger\";\n\n// Main Swagger exports\nexport { setupSwagger, SwaggerIntegration } from \"./shared/swagger\";\nexport { SwaggerGenerator } from \"./shared/swagger/SwaggerGenerator\";\nexport { setupSwaggerWithControllers } from \"./shared/swagger/SwaggerHelper\";\n\n// Swagger decorators (for decorator-based approach)\nexport {\n ApiDoc,\n ApiResponse,\n ApiParameter,\n ApiBody,\n ApiTags,\n ApiDeprecated,\n ApiSecurity,\n Swagger,\n getSwaggerMetadata,\n} from \"./decorators/Swagger\";\n\n// Swagger types\nexport type * from \"./types/swagger.type\";\n\n// Re-export helpers for manual route documentation (for JavaScript/plain TypeScript)\nexport const SwaggerHelpers = {\n createResponse: SwaggerGenerator.createResponse,\n createRequestBody: SwaggerGenerator.createRequestBody,\n createParameter: SwaggerGenerator.createParameter,\n createSchema: SwaggerGenerator.createSchema,\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/decorators/Swagger.ts","../src/shared/swagger/SwaggerGenerator.ts","../src/shared/swagger/index.ts","../src/decorators/Route.ts","../src/shared/swagger/SwaggerHelper.ts","../src/swagger.ts"],"names":[],"mappings":"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","file":"swagger.js","sourcesContent":["import type {\n ApiDocMetadata,\n ApiResponseMetadata,\n ApiParameterMetadata,\n ApiBodyMetadata,\n Schema,\n SecurityRequirement,\n Header,\n} from \"../types/swagger.type\";\n\nconst API_METADATA = new WeakMap<Function, Map<string, ApiDocMetadata>>();\nconst API_RESPONSES = new WeakMap<Function, Map<string, ApiResponseMetadata[]>>();\nconst API_PARAMETERS = new WeakMap<Function, Map<string, ApiParameterMetadata[]>>();\nconst API_BODY = new WeakMap<Function, Map<string, ApiBodyMetadata>>();\nconst API_TAGS = new WeakMap<Function, string[]>();\n\n/**\n * Decorator to document an endpoint\n */\nexport function ApiDoc(metadata: Omit<ApiDocMetadata, \"method\" | \"path\">): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_METADATA.get(ctor);\n if (!map) {\n map = new Map<string, ApiDocMetadata>();\n API_METADATA.set(ctor, map);\n }\n map.set(String(propertyKey), metadata);\n };\n}\n\n/**\n * Decorator to document a response\n */\nexport function ApiResponse(\n statusCode: number,\n description: string,\n options?: {\n type?: any;\n examples?: Record<string, any>;\n headers?: Record<string, Header>;\n }\n): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_RESPONSES.get(ctor);\n if (!map) {\n map = new Map<string, ApiResponseMetadata[]>();\n API_RESPONSES.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const responses = map.get(key) ?? [];\n responses.push({\n statusCode,\n description,\n type: options?.type,\n examples: options?.examples,\n headers: options?.headers,\n });\n map.set(key, responses);\n };\n}\n\n/**\n * Decorator to document a parameter\n */\nexport function ApiParameter(\n name: string,\n paramIn: \"query\" | \"header\" | \"path\" | \"cookie\",\n options?: {\n description?: string;\n required?: boolean;\n type?: any;\n example?: any;\n schema?: Schema;\n }\n): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_PARAMETERS.get(ctor);\n if (!map) {\n map = new Map<string, ApiParameterMetadata[]>();\n API_PARAMETERS.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const params = map.get(key) ?? [];\n params.push({\n name,\n in: paramIn,\n description: options?.description,\n required: options?.required,\n type: options?.type,\n example: options?.example,\n schema: options?.schema,\n });\n map.set(key, params);\n };\n}\n\n/**\n * Decorator to document a request body\n */\nexport function ApiBody(\n description: string,\n options?: {\n type?: any;\n required?: boolean;\n examples?: Record<string, any>;\n }\n): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_BODY.get(ctor);\n if (!map) {\n map = new Map<string, ApiBodyMetadata>();\n API_BODY.set(ctor, map);\n }\n\n map.set(String(propertyKey), {\n description,\n type: options?.type,\n required: options?.required,\n examples: options?.examples,\n });\n };\n}\n\n/**\n * Decorator to add tags to a controller\n */\nexport function ApiTags(...tags: string[]): ClassDecorator {\n return (target) => {\n API_TAGS.set(target as Function, tags);\n };\n}\n\n/**\n * Decorator to mark an endpoint as deprecated\n */\nexport function ApiDeprecated(): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_METADATA.get(ctor);\n if (!map) {\n map = new Map<string, ApiDocMetadata>();\n API_METADATA.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const existing = map.get(key) ?? {};\n map.set(key, { ...existing, deprecated: true });\n };\n}\n\n/**\n * Decorator to add security requirements\n */\nexport function ApiSecurity(...requirements: SecurityRequirement[]): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = API_METADATA.get(ctor);\n if (!map) {\n map = new Map<string, ApiDocMetadata>();\n API_METADATA.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const existing = map.get(key) ?? {};\n map.set(key, { ...existing, security: requirements });\n };\n}\n\n/**\n * Helper to get all swagger metadata\n */\nexport function getSwaggerMetadata(target: Function) {\n return {\n metadata: API_METADATA.get(target),\n responses: API_RESPONSES.get(target),\n parameters: API_PARAMETERS.get(target),\n body: API_BODY.get(target),\n tags: API_TAGS.get(target),\n };\n}\n\n/**\n * Unified Swagger decorator - Simple and easy to use!\n * Document everything in one place with a clean object structure.\n * \n * @example\n * ```typescript\n * @Swagger({\n * summary: \"Get user by ID\",\n * description: \"Retrieve a single user\",\n * tags: [\"Users\"],\n * parameters: [\n * {\n * name: \"id\",\n * in: \"path\",\n * description: \"User ID\",\n * required: true,\n * schema: { type: \"string\" },\n * example: \"123\"\n * }\n * ],\n * responses: {\n * 200: {\n * description: \"User found\",\n * example: { id: \"123\", name: \"John\" }\n * },\n * 404: {\n * description: \"User not found\",\n * example: { error: \"Not found\" }\n * }\n * }\n * })\n * getUser(req, res) { }\n * ```\n */\nexport function Swagger(config: {\n summary?: string;\n description?: string;\n tags?: string[];\n operationId?: string;\n deprecated?: boolean;\n security?: SecurityRequirement[];\n parameters?: Array<{\n name: string;\n in: \"query\" | \"header\" | \"path\" | \"cookie\";\n description?: string;\n required?: boolean;\n schema?: Schema;\n example?: any;\n }>;\n requestBody?: {\n description?: string;\n required?: boolean;\n content?: any;\n example?: any;\n };\n responses?: Record<number, {\n description: string;\n example?: any;\n schema?: Schema;\n headers?: Record<string, Header>;\n }>;\n}): MethodDecorator {\n return (target, propertyKey) => {\n const ctor = typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n const key = String(propertyKey);\n\n // Set basic metadata\n if (config.summary || config.description || config.operationId || config.deprecated !== undefined || config.security) {\n let metaMap = API_METADATA.get(ctor);\n if (!metaMap) {\n metaMap = new Map<string, ApiDocMetadata>();\n API_METADATA.set(ctor, metaMap);\n }\n metaMap.set(key, {\n summary: config.summary,\n description: config.description,\n operationId: config.operationId,\n deprecated: config.deprecated,\n security: config.security,\n tags: config.tags,\n });\n }\n\n // Set parameters\n if (config.parameters && config.parameters.length > 0) {\n let paramMap = API_PARAMETERS.get(ctor);\n if (!paramMap) {\n paramMap = new Map<string, ApiParameterMetadata[]>();\n API_PARAMETERS.set(ctor, paramMap);\n }\n paramMap.set(key, config.parameters.map(p => ({\n name: p.name,\n in: p.in,\n description: p.description,\n required: p.required,\n schema: p.schema,\n example: p.example,\n })));\n }\n\n // Set request body\n if (config.requestBody) {\n let bodyMap = API_BODY.get(ctor);\n if (!bodyMap) {\n bodyMap = new Map<string, ApiBodyMetadata>();\n API_BODY.set(ctor, bodyMap);\n }\n bodyMap.set(key, {\n description: config.requestBody.description,\n required: config.requestBody.required,\n type: config.requestBody.content,\n examples: config.requestBody.example ? { default: config.requestBody.example } : undefined,\n });\n }\n\n // Set responses\n if (config.responses) {\n let respMap = API_RESPONSES.get(ctor);\n if (!respMap) {\n respMap = new Map<string, ApiResponseMetadata[]>();\n API_RESPONSES.set(ctor, respMap);\n }\n const responses = Object.entries(config.responses).map(([code, resp]) => ({\n statusCode: Number(code),\n description: resp.description,\n type: resp.schema,\n examples: resp.example ? { default: resp.example } : undefined,\n headers: resp.headers,\n }));\n respMap.set(key, responses);\n }\n };\n}\n","import type {\n OpenAPIDocument,\n OpenAPIPaths,\n Operation,\n PathItem,\n Parameter,\n Response,\n Schema,\n Reference,\n MediaType,\n SwaggerConfig,\n RequestBody,\n} from \"../../types/swagger.type\";\nimport { getSwaggerMetadata } from \"../../decorators/Swagger\";\nimport type { RouteDefinition } from \"../../types/routes.type\";\n\nexport class SwaggerGenerator {\n private config: Required<SwaggerConfig>;\n private document: OpenAPIDocument;\n\n constructor(config?: SwaggerConfig) {\n this.config = {\n enabled: config?.enabled ?? true,\n path: config?.path ?? \"/docs\",\n title: config?.title ?? \"AzuraJS API\",\n description: config?.description ?? \"API documentation powered by AzuraJS\",\n version: config?.version ?? \"1.0.0\",\n servers: config?.servers ?? [{ url: \"http://localhost:3000\" }],\n security: config?.security ?? [],\n tags: config?.tags ?? [],\n contact: config?.contact ?? {},\n license: config?.license ?? { name: \"MIT\" },\n };\n\n this.document = {\n openapi: \"3.0.3\",\n info: {\n title: this.config.title,\n description: this.config.description,\n version: this.config.version,\n contact: this.config.contact,\n license: this.config.license,\n },\n servers: this.config.servers,\n paths: {},\n components: {\n schemas: {},\n responses: {},\n parameters: {},\n securitySchemes: {},\n },\n tags: this.config.tags,\n security: this.config.security,\n };\n }\n\n /**\n * Add routes from a controller to the OpenAPI document\n */\n public addController(controller: any, routes: RouteDefinition[], prefix = \"\"): void {\n const metadata = getSwaggerMetadata(controller.constructor);\n const controllerTags = metadata.tags ?? [];\n\n for (const route of routes) {\n const fullPath = this.normalizePath(prefix + route.path);\n const method = route.method.toLowerCase() as keyof PathItem;\n\n if (!this.document.paths[fullPath]) {\n this.document.paths[fullPath] = {};\n }\n\n const methodMetadata = metadata.metadata?.get(route.propertyKey);\n const responses = metadata.responses?.get(route.propertyKey) ?? [];\n const parameters = metadata.parameters?.get(route.propertyKey) ?? [];\n const body = metadata.body?.get(route.propertyKey);\n\n const operation: Operation = {\n summary: methodMetadata?.summary ?? route.description,\n description: methodMetadata?.description,\n tags: methodMetadata?.tags ?? controllerTags,\n operationId:\n methodMetadata?.operationId ??\n `${route.method}_${fullPath.replace(/[^a-zA-Z0-9]/g, \"_\")}`,\n deprecated: methodMetadata?.deprecated,\n security: methodMetadata?.security,\n parameters: this.buildParameters(parameters, route),\n responses: this.buildResponses(responses),\n };\n\n if (body) {\n operation.requestBody = this.buildRequestBody(body);\n }\n\n (this.document.paths[fullPath] as any)[method] = operation;\n }\n }\n\n /**\n * Add a single route manually without decorators (for JavaScript/plain TypeScript users)\n * \n * @example\n * ```javascript\n * const swagger = setupSwagger(app, { title: \"My API\" });\n * \n * app.get('/users/:id', (req, res) => {\n * res.json({ id: req.params.id, name: 'John' });\n * });\n * \n * swagger.addRoute({\n * method: 'GET',\n * path: '/users/:id',\n * summary: 'Get user by ID',\n * description: 'Returns a single user',\n * tags: ['Users'],\n * parameters: [{\n * name: 'id',\n * in: 'path',\n * required: true,\n * schema: { type: 'string' },\n * description: 'User ID'\n * }],\n * responses: {\n * 200: {\n * description: 'Successful response',\n * content: {\n * 'application/json': {\n * schema: {\n * type: 'object',\n * properties: {\n * id: { type: 'string' },\n * name: { type: 'string' }\n * }\n * }\n * }\n * }\n * }\n * }\n * });\n * ```\n */\n public addRoute(config: {\n method: string;\n path: string;\n summary?: string;\n description?: string;\n tags?: string[];\n operationId?: string;\n deprecated?: boolean;\n security?: Array<Record<string, string[]>>;\n parameters?: Parameter[];\n requestBody?: RequestBody;\n responses?: Record<string, Response>;\n }): void {\n const fullPath = this.normalizePath(config.path);\n const method = config.method.toLowerCase() as keyof PathItem;\n\n if (!this.document.paths[fullPath]) {\n this.document.paths[fullPath] = {};\n }\n\n const pathParams = this.extractPathParams(config.path);\n const allParameters: Parameter[] = [\n ...(config.parameters || []),\n ...pathParams\n .filter(param => !config.parameters?.some(p => p.name === param))\n .map(param => ({\n name: param,\n in: 'path' as const,\n required: true,\n schema: { type: 'string' as const },\n description: `Path parameter: ${param}`,\n })),\n ];\n\n const operation: Operation = {\n summary: config.summary,\n description: config.description,\n tags: config.tags,\n operationId: config.operationId ?? `${config.method}_${fullPath.replace(/[^a-zA-Z0-9]/g, \"_\")}`,\n deprecated: config.deprecated,\n security: config.security,\n parameters: allParameters.length > 0 ? allParameters : undefined,\n responses: config.responses || {\n 200: {\n description: 'Successful response',\n },\n },\n };\n\n if (config.requestBody) {\n operation.requestBody = config.requestBody;\n }\n\n (this.document.paths[fullPath] as any)[method] = operation;\n }\n\n /**\n * SIMPLE API - Add route with easy object structure\n * This is the easiest way to document routes without decorators!\n * \n * @example\n * ```javascript\n * swagger.addDoc({\n * method: 'GET',\n * path: '/users/:id',\n * summary: 'Get user by ID',\n * tags: ['Users'],\n * parameters: [\n * { name: 'id', in: 'path', required: true, schema: { type: 'string' }, example: '123' }\n * ],\n * responses: {\n * 200: { description: 'User found', example: { id: '123', name: 'John' } },\n * 404: { description: 'Not found', example: { error: 'User not found' } }\n * }\n * });\n * ```\n */\n public addDoc(config: {\n method: string;\n path: string;\n summary?: string;\n description?: string;\n tags?: string[];\n operationId?: string;\n deprecated?: boolean;\n security?: Array<Record<string, string[]>>;\n parameters?: Array<{\n name: string;\n in: \"query\" | \"header\" | \"path\" | \"cookie\";\n description?: string;\n required?: boolean;\n schema?: Schema | Reference;\n example?: any;\n }>;\n requestBody?: {\n description?: string;\n required?: boolean;\n schema?: Schema | Reference;\n example?: any;\n };\n responses?: Record<number, {\n description: string;\n example?: any;\n schema?: Schema | Reference;\n }>;\n }): void {\n const fullPath = this.normalizePath(config.path);\n const method = config.method.toLowerCase() as keyof PathItem;\n\n if (!this.document.paths[fullPath]) {\n this.document.paths[fullPath] = {};\n }\n\n // Auto-detect path parameters and merge with provided parameters\n const pathParams = this.extractPathParams(config.path);\n const providedParams = config.parameters || [];\n \n const allParameters: Parameter[] = [\n ...providedParams.map(p => ({\n name: p.name,\n in: p.in,\n description: p.description,\n required: p.required ?? (p.in === 'path'),\n schema: p.schema,\n example: p.example,\n })),\n // Add missing path params\n ...pathParams\n .filter(param => !providedParams.some(p => p.name === param))\n .map(param => ({\n name: param,\n in: 'path' as const,\n required: true,\n schema: { type: 'string' as const },\n description: `Path parameter: ${param}`,\n })),\n ];\n\n // Build responses\n const responses: Record<string, Response> = {};\n if (config.responses) {\n for (const [code, resp] of Object.entries(config.responses)) {\n responses[code] = {\n description: resp.description,\n content: resp.schema || resp.example ? {\n 'application/json': {\n schema: resp.schema,\n ...(resp.example && { examples: { default: { value: resp.example } } }),\n },\n } : undefined,\n };\n }\n } else {\n responses['200'] = { description: 'Successful response' };\n }\n\n const operation: Operation = {\n summary: config.summary,\n description: config.description,\n tags: config.tags,\n operationId: config.operationId ?? `${config.method}_${fullPath.replace(/[^a-zA-Z0-9]/g, \"_\")}`,\n deprecated: config.deprecated,\n security: config.security,\n parameters: allParameters.length > 0 ? allParameters : undefined,\n responses,\n };\n\n // Add request body if provided\n if (config.requestBody) {\n operation.requestBody = {\n description: config.requestBody.description,\n required: config.requestBody.required ?? false,\n content: {\n 'application/json': {\n schema: config.requestBody.schema,\n ...(config.requestBody.example && { \n examples: { default: { value: config.requestBody.example } } \n }),\n },\n },\n };\n }\n\n (this.document.paths[fullPath] as any)[method] = operation;\n }\n\n /**\n * Build parameters for operation\n */\n private buildParameters(\n parameters: Array<{\n name: string;\n in: \"query\" | \"header\" | \"path\" | \"cookie\";\n description?: string;\n required?: boolean;\n type?: any;\n example?: any;\n schema?: Schema;\n }>,\n route: RouteDefinition\n ): Parameter[] {\n const params: Parameter[] = [];\n\n // Add path parameters from route\n const pathParams = this.extractPathParams(route.path);\n for (const paramName of pathParams) {\n const existing = parameters.find((p) => p.name === paramName && p.in === \"path\");\n params.push({\n name: paramName,\n in: \"path\",\n required: true,\n description: existing?.description ?? `Path parameter ${paramName}`,\n schema: existing?.schema ?? this.typeToSchema(existing?.type) ?? { type: \"string\" },\n example: existing?.example,\n });\n }\n\n // Add other parameters\n for (const param of parameters) {\n if (param.in !== \"path\") {\n params.push({\n name: param.name,\n in: param.in,\n required: param.required ?? false,\n description: param.description,\n schema: param.schema ?? this.typeToSchema(param.type) ?? { type: \"string\" },\n example: param.example,\n });\n }\n }\n\n return params;\n }\n\n /**\n * Build responses for operation\n */\n private buildResponses(\n responses: Array<{\n statusCode: number;\n description: string;\n type?: any;\n examples?: Record<string, any>;\n headers?: Record<string, any>;\n }>\n ): { [statusCode: string]: Response } {\n const result: { [statusCode: string]: Response } = {};\n\n if (responses.length === 0) {\n result[\"200\"] = {\n description: \"Successful response\",\n content: {\n \"application/json\": {\n schema: { type: \"object\" },\n },\n },\n };\n } else {\n for (const response of responses) {\n const content: Record<string, MediaType> = {};\n\n if (response.type) {\n content[\"application/json\"] = {\n schema: this.typeToSchema(response.type) ?? { type: \"object\" },\n examples: response.examples\n ? Object.entries(response.examples).reduce((acc, [key, value]) => {\n acc[key] = { value };\n return acc;\n }, {} as Record<string, { value: any }>)\n : undefined,\n };\n }\n\n result[String(response.statusCode)] = {\n description: response.description,\n content: Object.keys(content).length > 0 ? content : undefined,\n headers: response.headers,\n };\n }\n }\n\n return result;\n }\n\n /**\n * Build request body\n */\n private buildRequestBody(body: {\n description?: string;\n type?: any;\n required?: boolean;\n examples?: Record<string, any>;\n }): RequestBody {\n return {\n description: body.description,\n required: body.required ?? false,\n content: {\n \"application/json\": {\n schema: this.typeToSchema(body.type) ?? { type: \"object\" },\n examples: body.examples\n ? Object.entries(body.examples).reduce((acc, [key, value]) => {\n acc[key] = { value };\n return acc;\n }, {} as Record<string, { value: any }>)\n : undefined,\n },\n },\n };\n }\n\n /**\n * Convert TypeScript type to OpenAPI schema\n */\n private typeToSchema(type: any): Schema | undefined {\n if (!type) return undefined;\n\n // Handle primitive types\n if (type === String) return { type: \"string\" };\n if (type === Number) return { type: \"number\" };\n if (type === Boolean) return { type: \"boolean\" };\n if (type === Array) return { type: \"array\", items: { type: \"object\" } };\n if (type === Object) return { type: \"object\" };\n\n // Handle class types - extract properties\n if (typeof type === \"function\") {\n const instance = new type();\n const properties: Record<string, Schema> = {};\n\n for (const key of Object.keys(instance)) {\n const value = instance[key];\n properties[key] = this.inferSchema(value);\n }\n\n return {\n type: \"object\",\n properties,\n };\n }\n\n return undefined;\n }\n\n /**\n * Infer schema from value\n */\n private inferSchema(value: any): Schema {\n const type = typeof value;\n\n if (type === \"string\") return { type: \"string\" };\n if (type === \"number\") return { type: \"number\" };\n if (type === \"boolean\") return { type: \"boolean\" };\n if (Array.isArray(value)) {\n return {\n type: \"array\",\n items: value.length > 0 ? this.inferSchema(value[0]) : { type: \"object\" },\n };\n }\n if (type === \"object\" && value !== null) {\n const properties: Record<string, Schema> = {};\n for (const key in value) {\n properties[key] = this.inferSchema(value[key]);\n }\n return { type: \"object\", properties };\n }\n\n return { type: \"object\" };\n }\n\n /**\n * Extract path parameters from route path\n */\n private extractPathParams(path: string): string[] {\n const matches = path.match(/:([a-zA-Z0-9_]+)/g);\n return matches ? matches.map((m) => m.slice(1)) : [];\n }\n\n /**\n * Normalize path to OpenAPI format\n */\n private normalizePath(path: string): string {\n // Convert :param to {param}\n return path.replace(/:([a-zA-Z0-9_]+)/g, \"{$1}\");\n }\n\n /**\n * Add a schema to components\n */\n public addSchema(name: string, schema: Schema): void {\n if (!this.document.components) {\n this.document.components = { schemas: {} };\n }\n if (!this.document.components.schemas) {\n this.document.components.schemas = {};\n }\n this.document.components.schemas[name] = schema;\n }\n\n /**\n * Add a security scheme to components\n */\n public addSecurityScheme(name: string, scheme: any): void {\n if (!this.document.components) {\n this.document.components = { securitySchemes: {} };\n }\n if (!this.document.components.securitySchemes) {\n this.document.components.securitySchemes = {};\n }\n this.document.components.securitySchemes[name] = scheme;\n }\n\n /**\n * Get the OpenAPI document\n */\n public getDocument(): OpenAPIDocument {\n return this.document;\n }\n\n /**\n * Get the config\n */\n public getConfig(): Required<SwaggerConfig> {\n return this.config;\n }\n\n /**\n * Get the document as JSON string\n */\n public toJSON(): string {\n return JSON.stringify(this.document, null, 2);\n }\n\n /**\n * Helper to create a simple response schema\n */\n public static createResponse(description: string, schema?: Schema | Reference, example?: any): Response {\n return {\n description,\n content: schema ? {\n 'application/json': {\n schema,\n ...(example && { examples: { default: { value: example } } }),\n },\n } : undefined,\n };\n }\n\n /**\n * Helper to create a request body\n */\n public static createRequestBody(schema: Schema | Reference, description?: string, required = true, example?: any): RequestBody {\n return {\n description,\n required,\n content: {\n 'application/json': {\n schema,\n ...(example && { examples: { default: { value: example } } }),\n },\n },\n };\n }\n\n /**\n * Helper to create a parameter\n */\n public static createParameter(\n name: string,\n location: 'query' | 'path' | 'header' | 'cookie',\n schema: Schema | Reference,\n options?: {\n description?: string;\n required?: boolean;\n deprecated?: boolean;\n example?: any;\n }\n ): Parameter {\n return {\n name,\n in: location,\n description: options?.description,\n required: options?.required ?? (location === 'path'),\n deprecated: options?.deprecated,\n schema,\n example: options?.example,\n };\n }\n\n /**\n * Helper to create a simple object schema\n */\n public static createSchema(properties: Record<string, Schema | Reference>, required?: string[]): Schema {\n return {\n type: 'object',\n properties,\n required,\n };\n }\n}\n","import type { AzuraClient } from \"../../infra/Server\";\nimport { SwaggerGenerator } from \"./SwaggerGenerator\";\nimport type { SwaggerConfig } from \"../../types/swagger.type\";\nimport { readFileSync, existsSync } from \"node:fs\";\nimport { join, dirname, normalize } from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nfunction getCurrentDir(): string {\n if (typeof __dirname !== \"undefined\") {\n return __dirname;\n }\n return dirname(fileURLToPath(import.meta.url));\n}\n\nexport class SwaggerIntegration {\n private generator: SwaggerGenerator;\n private app: AzuraClient;\n\n constructor(app: AzuraClient, config?: SwaggerConfig) {\n this.app = app;\n this.generator = new SwaggerGenerator(config);\n }\n\n public setup(): void {\n const config = this.generator.getConfig();\n\n if (!config.enabled) {\n return;\n }\n\n this.app.get(`/api-spec.json`, (_req: any, res: any) => {\n res.json(this.generator.getDocument());\n });\n\n this.app.get(config.path, (_req: any, res: any) => {\n try {\n const currentDir = getCurrentDir();\n const htmlPath = normalize(\n join(currentDir, \"..\", \"dist\", \"shared\", \"swagger\", \"swagger-ui-modern.html\")\n );\n\n if (!existsSync(htmlPath)) {\n throw new Error(`Swagger UI HTML not found at ${htmlPath}`);\n }\n\n let html = readFileSync(htmlPath, \"utf-8\");\n const doc = this.generator.getDocument();\n\n html = html.replace(/{{TITLE}}/g, String(doc.info.title || \"\"));\n html = html.replace(/{{VERSION}}/g, String(doc.info.version || \"\"));\n html = html.replace(/{{DESCRIPTION}}/g, String(doc.info.description || \"\"));\n\n if (typeof res.type === \"function\" && typeof res.send === \"function\") {\n res.type(\"html\").send(html);\n return;\n }\n\n if (typeof res.setHeader === \"function\" && typeof res.end === \"function\") {\n res.setHeader(\"Content-Type\", \"text/html; charset=utf-8\");\n res.end(html);\n return;\n }\n\n res.json({ error: \"Response object does not support sending HTML\" });\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n if (typeof res.status === \"function\" && typeof res.json === \"function\") {\n res.status(500).json({\n error: \"Failed to load Swagger UI\",\n details: message,\n });\n return;\n }\n if (typeof res.end === \"function\") {\n res.end(JSON.stringify({ error: \"Failed to load Swagger UI\", details: message }));\n return;\n }\n }\n });\n }\n\n public getGenerator(): SwaggerGenerator {\n return this.generator;\n }\n}\n\nexport function setupSwagger(app: AzuraClient, config?: SwaggerConfig): SwaggerGenerator {\n const integration = new SwaggerIntegration(app, config);\n integration.setup();\n return integration.getGenerator();\n}\n","import type { AzuraClient } from \"../infra/Server\";\nimport type { RequestServer } from \"../types/http/request.type\";\nimport type { ResponseServer } from \"../types/http/response.type\";\nimport type { ParamDefinition, ParamSource, RouteDefinition } from \"../types/routes.type\";\n\nconst PREFIX = new WeakMap<Function, string>();\nconst ROUTES = new WeakMap<Function, RouteDefinition[]>();\nconst PARAMS = new WeakMap<Function, Map<string, ParamDefinition[]>>();\nconst DESCRIPTIONS = new WeakMap<Function, Map<string, string>>();\n\nexport function Controller(prefix = \"\"): ClassDecorator {\n return (target) => {\n PREFIX.set(target as Function, prefix);\n };\n}\n\nexport function Description(description: string): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = DESCRIPTIONS.get(ctor);\n if (!map) {\n map = new Map<string, string>();\n DESCRIPTIONS.set(ctor, map);\n }\n map.set(String(propertyKey), description);\n };\n}\n\nfunction createMethodDecorator(method: string) {\n return function (path = \"\"): MethodDecorator {\n return (target, propertyKey) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n const key = String(propertyKey);\n const routes = ROUTES.get(ctor) ?? [];\n const params = PARAMS.get(ctor)?.get(key) ?? [];\n const description = DESCRIPTIONS.get(ctor)?.get(key);\n\n const exists = routes.some(\n (r) => r.method === method && r.path === path && r.propertyKey === key\n );\n if (!exists) {\n routes.push({\n method,\n path,\n propertyKey: key,\n params,\n description,\n });\n ROUTES.set(ctor, routes);\n }\n };\n };\n}\n\nfunction createParamDecorator(type: ParamSource) {\n return function (name?: string): ParameterDecorator {\n return (target, propertyKey, parameterIndex) => {\n const ctor =\n typeof target === \"function\" ? (target as Function) : (target as any).constructor;\n let map = PARAMS.get(ctor);\n if (!map) {\n map = new Map<string, ParamDefinition[]>();\n PARAMS.set(ctor, map);\n }\n\n const key = String(propertyKey);\n const list = map.get(key) ?? [];\n const exists = list.some(\n (p) => p.index === parameterIndex && p.type === type && p.name === name\n );\n if (!exists) {\n list.push({\n index: parameterIndex,\n type,\n name,\n });\n map.set(key, list);\n }\n };\n };\n}\n\nexport const Get = createMethodDecorator(\"GET\");\nexport const Post = createMethodDecorator(\"POST\");\nexport const Put = createMethodDecorator(\"PUT\");\nexport const Delete = createMethodDecorator(\"DELETE\");\nexport const Patch = createMethodDecorator(\"PATCH\");\nexport const Head = createMethodDecorator(\"HEAD\");\nexport const Options = createMethodDecorator(\"OPTIONS\");\n\nexport const Req = createParamDecorator(\"req\");\nexport const Res = createParamDecorator(\"res\");\nexport const Next = createParamDecorator(\"next\");\nexport const Param = createParamDecorator(\"param\");\nexport const Query = createParamDecorator(\"query\");\nexport const Body = createParamDecorator(\"body\");\nexport const Headers = createParamDecorator(\"headers\");\nexport const Ip = createParamDecorator(\"ip\");\nexport const UserAgent = createParamDecorator(\"useragent\");\n\nexport function applyDecorators(app: AzuraClient, controllers: Array<new () => any>) {\n controllers.forEach((ControllerClass) => {\n const prefix = PREFIX.get(ControllerClass) ?? \"\";\n const instance = new ControllerClass();\n const routes = ROUTES.get(ControllerClass) ?? [];\n\n routes.forEach((r) => {\n const handler = async (\n req: RequestServer,\n res: ResponseServer,\n next?: (err?: unknown) => void\n ) => {\n try {\n const params = (r.params ?? []).slice().sort((a, b) => a.index - b.index);\n const args = params.map((p) => {\n switch (p.type) {\n case \"req\":\n return req;\n case \"res\":\n return res;\n case \"next\":\n return next;\n case \"param\":\n return p.name ? req.params[p.name] : req.params;\n case \"query\":\n return p.name ? req.query[p.name] : req.query;\n case \"body\": {\n const body = req.body as Record<string, unknown> | undefined;\n return p.name ? body?.[p.name] : body;\n }\n case \"headers\":\n return p.name ? req.headers[p.name.toLowerCase()] : req.headers;\n case \"ip\":\n return req.ip;\n case \"useragent\":\n return req.headers[\"user-agent\"];\n default:\n return undefined;\n }\n });\n\n const fn = (instance as Record<string, unknown>)[r.propertyKey] as (\n ...args: unknown[]\n ) => unknown;\n const result = fn(...args);\n if (result instanceof Promise) await result;\n } catch (err) {\n if (next) next(err);\n }\n };\n\n app.addRoute(r.method, prefix + r.path, handler);\n });\n });\n}\n\n/**\n * Get routes metadata from a controller class\n * @internal Used by Swagger integration\n */\nexport function getControllerMetadata(ControllerClass: Function) {\n return {\n prefix: PREFIX.get(ControllerClass) || \"\",\n routes: ROUTES.get(ControllerClass) || [],\n params: PARAMS.get(ControllerClass),\n descriptions: DESCRIPTIONS.get(ControllerClass),\n };\n}\n","import type { AzuraClient } from \"../../infra/Server\";\nimport type { SwaggerConfig } from \"../../types/swagger.type\";\nimport { SwaggerIntegration } from \"./index\";\nimport { SwaggerGenerator } from \"./SwaggerGenerator\";\nimport { getControllerMetadata, applyDecorators } from \"../../decorators/Route\";\n\n/**\n * Setup Swagger with automatic controller registration\n * This is the SIMPLEST way to use Swagger in AzuraJS - just pass your controllers!\n * \n * @example\n * ```typescript\n * import { AzuraClient } from \"azurajs\";\n * import { setupSwaggerWithControllers } from \"azurajs\";\n * \n * const app = new AzuraClient();\n * \n * setupSwaggerWithControllers(app, {\n * title: \"My API\",\n * version: \"1.0.0\",\n * description: \"Simple and beautiful API docs\"\n * }, [UserController, ProductController]);\n * \n * app.listen(3000);\n * // That's it! Visit http://localhost:3000/docs\n * ```\n */\nexport function setupSwaggerWithControllers(\n app: AzuraClient,\n config: SwaggerConfig,\n controllers: Array<new () => any>\n): SwaggerGenerator {\n // Setup Swagger first\n const integration = new SwaggerIntegration(app, config);\n integration.setup();\n const swaggerGen = integration.getGenerator();\n\n // Register all controllers - both routes and swagger\n applyDecorators(app, controllers);\n \n // Add controllers to Swagger\n controllers.forEach((ControllerClass) => {\n const metadata = getControllerMetadata(ControllerClass);\n \n if (metadata.routes.length > 0) {\n const instance = new ControllerClass();\n swaggerGen.addController(instance, metadata.routes, metadata.prefix);\n }\n });\n\n return swaggerGen;\n}\n","/**\n * AzuraJS Swagger/OpenAPI Integration\n * Import from \"azurajs/swagger\" to use Swagger documentation\n */\n\nimport { SwaggerGenerator } from \"./swagger\";\n\n// Main Swagger exports\nexport { setupSwagger, SwaggerIntegration } from \"./shared/swagger\";\nexport { SwaggerGenerator } from \"./shared/swagger/SwaggerGenerator\";\nexport { setupSwaggerWithControllers } from \"./shared/swagger/SwaggerHelper\";\n\n// Swagger decorators (for decorator-based approach)\nexport {\n ApiDoc,\n ApiResponse,\n ApiParameter,\n ApiBody,\n ApiTags,\n ApiDeprecated,\n ApiSecurity,\n Swagger,\n getSwaggerMetadata,\n} from \"./decorators/Swagger\";\n\n// Swagger types\nexport type * from \"./types/swagger.type\";\n\n// Re-export helpers for manual route documentation (for JavaScript/plain TypeScript)\nexport const SwaggerHelpers = {\n createResponse: SwaggerGenerator.createResponse,\n createRequestBody: SwaggerGenerator.createRequestBody,\n createParameter: SwaggerGenerator.createParameter,\n createSchema: SwaggerGenerator.createSchema,\n};\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "azurajs",
|
|
3
|
-
"version": "2.5.
|
|
3
|
+
"version": "2.5.2-2",
|
|
4
4
|
"description": "Modern TypeScript-first web framework with decorator-based routing, zero dependencies, and built for performance",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|
|
@@ -187,12 +187,12 @@
|
|
|
187
187
|
"license": "MIT",
|
|
188
188
|
"repository": {
|
|
189
189
|
"type": "git",
|
|
190
|
-
"url": "git+https://github.com/
|
|
190
|
+
"url": "git+https://github.com/azurajs/azura.git"
|
|
191
191
|
},
|
|
192
192
|
"bugs": {
|
|
193
|
-
"url": "https://github.com/
|
|
193
|
+
"url": "https://github.com/azurajs/azura/issues"
|
|
194
194
|
},
|
|
195
|
-
"homepage": "https://github.com/
|
|
195
|
+
"homepage": "https://github.com/azurajs/azura#readme",
|
|
196
196
|
"engines": {
|
|
197
197
|
"node": ">=18.0.0",
|
|
198
198
|
"bun": ">=1.0.0"
|
|
@@ -2,12 +2,11 @@ import type { AzuraClient } from "../../infra/Server";
|
|
|
2
2
|
import { SwaggerGenerator } from "./SwaggerGenerator";
|
|
3
3
|
import type { SwaggerConfig } from "../../types/swagger.type";
|
|
4
4
|
import { readFileSync, existsSync } from "node:fs";
|
|
5
|
-
import { join, dirname } from "node:path";
|
|
5
|
+
import { join, dirname, normalize } from "node:path";
|
|
6
6
|
import { fileURLToPath } from "node:url";
|
|
7
7
|
|
|
8
|
-
// Resolve o diretório atual de forma compatível com ESM e CJS
|
|
9
8
|
function getCurrentDir(): string {
|
|
10
|
-
if (typeof __dirname !==
|
|
9
|
+
if (typeof __dirname !== "undefined") {
|
|
11
10
|
return __dirname;
|
|
12
11
|
}
|
|
13
12
|
return dirname(fileURLToPath(import.meta.url));
|
|
@@ -22,9 +21,6 @@ export class SwaggerIntegration {
|
|
|
22
21
|
this.generator = new SwaggerGenerator(config);
|
|
23
22
|
}
|
|
24
23
|
|
|
25
|
-
/**
|
|
26
|
-
* Setup Swagger routes
|
|
27
|
-
*/
|
|
28
24
|
public setup(): void {
|
|
29
25
|
const config = this.generator.getConfig();
|
|
30
26
|
|
|
@@ -32,59 +28,62 @@ export class SwaggerIntegration {
|
|
|
32
28
|
return;
|
|
33
29
|
}
|
|
34
30
|
|
|
35
|
-
// Route to serve OpenAPI spec JSON
|
|
36
31
|
this.app.get(`/api-spec.json`, (_req: any, res: any) => {
|
|
37
32
|
res.json(this.generator.getDocument());
|
|
38
33
|
});
|
|
39
34
|
|
|
40
|
-
// Route to serve Swagger UI
|
|
41
35
|
this.app.get(config.path, (_req: any, res: any) => {
|
|
42
36
|
try {
|
|
43
37
|
const currentDir = getCurrentDir();
|
|
44
|
-
const htmlPath =
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
38
|
+
const htmlPath = normalize(
|
|
39
|
+
join(currentDir, "..", "dist", "shared", "swagger", "swagger-ui-modern.html")
|
|
40
|
+
);
|
|
41
|
+
|
|
48
42
|
if (!existsSync(htmlPath)) {
|
|
49
|
-
|
|
50
|
-
const srcPath = join(currentDir, "..", "..", "..", "src", "shared", "swagger", "swagger-ui-modern.html");
|
|
51
|
-
if (existsSync(srcPath)) {
|
|
52
|
-
finalPath = srcPath;
|
|
53
|
-
} else {
|
|
54
|
-
throw new Error(`Swagger UI HTML not found at ${htmlPath} or ${srcPath}`);
|
|
55
|
-
}
|
|
43
|
+
throw new Error(`Swagger UI HTML not found at ${htmlPath}`);
|
|
56
44
|
}
|
|
57
45
|
|
|
58
|
-
let html = readFileSync(
|
|
59
|
-
|
|
60
|
-
// Replace placeholders
|
|
46
|
+
let html = readFileSync(htmlPath, "utf-8");
|
|
61
47
|
const doc = this.generator.getDocument();
|
|
62
|
-
html = html.replace(/{{TITLE}}/g, doc.info.title);
|
|
63
|
-
html = html.replace(/{{VERSION}}/g, doc.info.version);
|
|
64
|
-
html = html.replace(/{{DESCRIPTION}}/g, doc.info.description || "");
|
|
65
48
|
|
|
66
|
-
|
|
49
|
+
html = html.replace(/{{TITLE}}/g, String(doc.info.title || ""));
|
|
50
|
+
html = html.replace(/{{VERSION}}/g, String(doc.info.version || ""));
|
|
51
|
+
html = html.replace(/{{DESCRIPTION}}/g, String(doc.info.description || ""));
|
|
52
|
+
|
|
53
|
+
if (typeof res.type === "function" && typeof res.send === "function") {
|
|
54
|
+
res.type("html").send(html);
|
|
55
|
+
return;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
if (typeof res.setHeader === "function" && typeof res.end === "function") {
|
|
59
|
+
res.setHeader("Content-Type", "text/html; charset=utf-8");
|
|
60
|
+
res.end(html);
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
res.json({ error: "Response object does not support sending HTML" });
|
|
67
65
|
} catch (error) {
|
|
68
|
-
|
|
69
|
-
res.status
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
66
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
67
|
+
if (typeof res.status === "function" && typeof res.json === "function") {
|
|
68
|
+
res.status(500).json({
|
|
69
|
+
error: "Failed to load Swagger UI",
|
|
70
|
+
details: message,
|
|
71
|
+
});
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
if (typeof res.end === "function") {
|
|
75
|
+
res.end(JSON.stringify({ error: "Failed to load Swagger UI", details: message }));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
73
78
|
}
|
|
74
79
|
});
|
|
75
80
|
}
|
|
76
81
|
|
|
77
|
-
/**
|
|
78
|
-
* Get the generator instance
|
|
79
|
-
*/
|
|
80
82
|
public getGenerator(): SwaggerGenerator {
|
|
81
83
|
return this.generator;
|
|
82
84
|
}
|
|
83
85
|
}
|
|
84
86
|
|
|
85
|
-
/**
|
|
86
|
-
* Helper function to setup Swagger in an AzuraClient instance
|
|
87
|
-
*/
|
|
88
87
|
export function setupSwagger(app: AzuraClient, config?: SwaggerConfig): SwaggerGenerator {
|
|
89
88
|
const integration = new SwaggerIntegration(app, config);
|
|
90
89
|
integration.setup();
|