@riktajs/swagger 0.10.2 → 0.10.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +1253 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +498 -0
- package/dist/index.d.ts +498 -7
- package/dist/index.js +1163 -6
- package/dist/index.js.map +1 -0
- package/package.json +13 -6
- package/dist/constants.d.ts +0 -11
- package/dist/constants.js +0 -11
- package/dist/decorators/api-body.decorator.d.ts +0 -4
- package/dist/decorators/api-body.decorator.js +0 -11
- package/dist/decorators/api-exclude.decorator.d.ts +0 -9
- package/dist/decorators/api-exclude.decorator.js +0 -31
- package/dist/decorators/api-header.decorator.d.ts +0 -4
- package/dist/decorators/api-header.decorator.js +0 -12
- package/dist/decorators/api-operation.decorator.d.ts +0 -4
- package/dist/decorators/api-operation.decorator.js +0 -11
- package/dist/decorators/api-param.decorator.d.ts +0 -4
- package/dist/decorators/api-param.decorator.js +0 -12
- package/dist/decorators/api-property.decorator.d.ts +0 -11
- package/dist/decorators/api-property.decorator.js +0 -20
- package/dist/decorators/api-query.decorator.d.ts +0 -4
- package/dist/decorators/api-query.decorator.js +0 -12
- package/dist/decorators/api-response.decorator.d.ts +0 -15
- package/dist/decorators/api-response.decorator.js +0 -45
- package/dist/decorators/api-security.decorator.d.ts +0 -8
- package/dist/decorators/api-security.decorator.js +0 -35
- package/dist/decorators/api-tags.decorator.d.ts +0 -3
- package/dist/decorators/api-tags.decorator.js +0 -22
- package/dist/decorators/index.d.ts +0 -10
- package/dist/decorators/index.js +0 -10
- package/dist/openapi/generator.d.ts +0 -49
- package/dist/openapi/generator.js +0 -409
- package/dist/openapi/index.d.ts +0 -2
- package/dist/openapi/index.js +0 -2
- package/dist/openapi/zod-to-openapi.d.ts +0 -5
- package/dist/openapi/zod-to-openapi.js +0 -115
- package/dist/plugin/index.d.ts +0 -1
- package/dist/plugin/index.js +0 -1
- package/dist/plugin/swagger.plugin.d.ts +0 -38
- package/dist/plugin/swagger.plugin.js +0 -126
- package/dist/types.d.ts +0 -338
- package/dist/types.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/constants.ts","../src/decorators/api-tags.decorator.ts","../src/decorators/api-operation.decorator.ts","../src/decorators/api-response.decorator.ts","../src/decorators/api-body.decorator.ts","../src/decorators/api-param.decorator.ts","../src/decorators/api-query.decorator.ts","../src/decorators/api-header.decorator.ts","../src/decorators/api-security.decorator.ts","../src/decorators/api-property.decorator.ts","../src/decorators/api-exclude.decorator.ts","../src/openapi/generator.ts","../src/openapi/zod-to-openapi.ts","../src/plugin/swagger.plugin.ts"],"sourcesContent":["/**\n * @riktajs/swagger\n * \n * Automatic OpenAPI/Swagger documentation generation for Rikta Framework.\n * \n * This package provides decorators and utilities to automatically generate\n * OpenAPI 3.0/3.1 documentation from your Rikta controllers and routes.\n * \n * Features:\n * - Automatic route extraction from @Controller, @Get, @Post, etc.\n * - Decorators for enriching API documentation (@ApiTags, @ApiOperation, @ApiResponse, etc.)\n * - Zod schema integration for automatic request/response type documentation\n * - Interactive Swagger UI served via Fastify\n * - Full OpenAPI 3.0/3.1 specification support\n * \n * @example\n * ```typescript\n * import { Rikta, Controller, Get } from '@riktajs/core';\n * import { swaggerPlugin, ApiTags, ApiOperation, ApiResponse } from '@riktajs/swagger';\n * import { z } from 'zod';\n * \n * const UserSchema = z.object({\n * id: z.string().uuid(),\n * name: z.string(),\n * email: z.string().email(),\n * });\n * \n * @ApiTags('Users')\n * @Controller('/users')\n * class UserController {\n * @Get('/')\n * @ApiOperation({ summary: 'List all users' })\n * @ApiResponse({ status: 200, description: 'Array of users', schema: z.array(UserSchema) })\n * async listUsers() {\n * return [];\n * }\n * }\n * \n * const app = await Rikta.create({ port: 3000 });\n * \n * // Register swagger plugin\n * app.server.register(swaggerPlugin, {\n * title: 'My API',\n * version: '1.0.0',\n * description: 'My awesome API documentation',\n * });\n * \n * await app.listen();\n * // Swagger UI available at http://localhost:3000/docs\n * // OpenAPI JSON available at http://localhost:3000/docs/json\n * ```\n * \n * @packageDocumentation\n */\n\n// Export swagger-specific constants\nexport * from './constants.js';\n\n// Re-export core constants needed for metadata reading\n// These are imported from @riktajs/core to avoid duplication\nexport {\n CONTROLLER_METADATA,\n ROUTES_METADATA,\n PARAM_METADATA,\n HTTP_CODE_METADATA,\n GUARDS_METADATA,\n ZOD_SCHEMA_METADATA,\n} from '@riktajs/core';\n\n// Export types\nexport type * from './types.js';\n\n// Export decorators\nexport * from './decorators/index.js';\n\n// Export OpenAPI generator\nexport { OpenApiGenerator } from './openapi/generator.js';\n\n// Export Zod-to-OpenAPI utilities\nexport { zodToOpenApi, toOpenApiSchema, isZodSchema } from './openapi/zod-to-openapi.js';\n\n// Export Fastify plugin\nexport { swaggerPlugin, registerSwagger, createSwaggerConfig } from './plugin/swagger.plugin.js';\n","/** Swagger metadata keys. Using Symbol.for() for cross-package sharing. */\n\nexport const API_TAGS_METADATA = Symbol.for('rikta:swagger:apiTags');\nexport const API_OPERATION_METADATA = Symbol.for('rikta:swagger:apiOperation');\nexport const API_RESPONSE_METADATA = Symbol.for('rikta:swagger:apiResponse');\nexport const API_PROPERTY_METADATA = Symbol.for('rikta:swagger:apiProperty');\nexport const API_BODY_METADATA = Symbol.for('rikta:swagger:apiBody');\nexport const API_PARAM_METADATA = Symbol.for('rikta:swagger:apiParam');\nexport const API_QUERY_METADATA = Symbol.for('rikta:swagger:apiQuery');\nexport const API_HEADER_METADATA = Symbol.for('rikta:swagger:apiHeader');\nexport const API_SECURITY_METADATA = Symbol.for('rikta:swagger:apiSecurity');\nexport const API_EXCLUDE_METADATA = Symbol.for('rikta:swagger:apiExclude');\nexport const API_DEPRECATED_METADATA = Symbol.for('rikta:swagger:apiDeprecated');\n","import 'reflect-metadata';\nimport { API_TAGS_METADATA } from '../constants.js';\n\n/**\n * @ApiTags() decorator\n * \n * Groups endpoints under one or more tags in the Swagger UI.\n * Tags are used to organize operations in the documentation.\n * \n * Can be applied to:\n * - Controller classes (applies to all routes in the controller)\n * - Individual route methods (overrides or adds to controller tags)\n * \n * @param tags - One or more tag names\n * \n * @example\n * ```typescript\n * @ApiTags('Users', 'Authentication')\n * @Controller('/users')\n * class UserController {\n * @Get('/')\n * @ApiTags('Admin') // Adds 'Admin' tag to this specific route\n * listUsers() { }\n * }\n * ```\n */\nexport function ApiTags(...tags: string[]): ClassDecorator & MethodDecorator {\n return (\n target: Function | Object,\n propertyKey?: string | symbol,\n descriptor?: PropertyDescriptor\n ): void => {\n if (propertyKey !== undefined && descriptor !== undefined) {\n // Method decorator - save on target (prototype)\n const existingTags: string[] = \n Reflect.getMetadata(API_TAGS_METADATA, target, propertyKey) ?? [];\n Reflect.defineMetadata(\n API_TAGS_METADATA,\n [...existingTags, ...tags],\n target,\n propertyKey\n );\n } else {\n // Class decorator\n const existingTags: string[] = \n Reflect.getMetadata(API_TAGS_METADATA, target) ?? [];\n Reflect.defineMetadata(\n API_TAGS_METADATA,\n [...existingTags, ...tags],\n target\n );\n }\n };\n}\n\n/**\n * Get tags metadata from a class or method\n * @internal\n */\nexport function getApiTags(target: Function, propertyKey?: string | symbol): string[] {\n if (propertyKey !== undefined) {\n const methodTags: string[] = \n Reflect.getMetadata(API_TAGS_METADATA, target.prototype, propertyKey) ?? [];\n const classTags: string[] = \n Reflect.getMetadata(API_TAGS_METADATA, target) ?? [];\n return [...new Set([...classTags, ...methodTags])];\n }\n return Reflect.getMetadata(API_TAGS_METADATA, target) ?? [];\n}\n","import 'reflect-metadata';\nimport { API_OPERATION_METADATA } from '../constants.js';\nimport type { ApiOperationOptions } from '../types.js';\n\n/**\n * @ApiOperation() decorator\n * \n * Describes a single API operation (endpoint) with summary, description,\n * and other OpenAPI operation metadata.\n * \n * @param options - Operation options\n * \n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Get('/:id')\n * @ApiOperation({\n * summary: 'Get user by ID',\n * description: 'Retrieves a single user by their unique identifier',\n * operationId: 'getUserById',\n * deprecated: false,\n * })\n * getUser(@Param('id') id: string) { }\n * }\n * ```\n */\nexport function ApiOperation(options: ApiOperationOptions): MethodDecorator {\n return (\n target: Object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor => {\n Reflect.defineMetadata(\n API_OPERATION_METADATA,\n options,\n target,\n propertyKey\n );\n return descriptor;\n };\n}\n\n/**\n * Get operation metadata from a method\n * @internal\n */\nexport function getApiOperation(\n target: Function,\n propertyKey: string | symbol\n): ApiOperationOptions | undefined {\n return Reflect.getMetadata(API_OPERATION_METADATA, target.prototype, propertyKey);\n}\n","import 'reflect-metadata';\nimport { API_RESPONSE_METADATA } from '../constants.js';\nimport type { ApiResponseOptions } from '../types.js';\n\n/**\n * @ApiResponse() decorator\n * \n * Documents a possible response for an API operation.\n * Multiple @ApiResponse decorators can be applied to document different response scenarios.\n * \n * @param options - Response options including status code, description, and schema\n * \n * @example\n * ```typescript\n * @Get('/:id')\n * @ApiResponse({ status: 200, description: 'User found', schema: UserSchema })\n * @ApiResponse({ status: 404, description: 'User not found' })\n * @ApiResponse({ status: 500, description: 'Internal server error' })\n * getUser(@Param('id') id: string) { }\n * ```\n */\nexport function ApiResponse(options: ApiResponseOptions): MethodDecorator {\n return (\n target: Object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor => {\n const existingResponses: ApiResponseOptions[] =\n Reflect.getMetadata(API_RESPONSE_METADATA, target, propertyKey) ?? [];\n \n Reflect.defineMetadata(\n API_RESPONSE_METADATA,\n [...existingResponses, options],\n target,\n propertyKey\n );\n return descriptor;\n };\n}\n\n/**\n * @ApiOkResponse() - Shorthand for 200 OK response\n */\nexport function ApiOkResponse(\n options: Omit<ApiResponseOptions, 'status'> = {}\n): MethodDecorator {\n return ApiResponse({ ...options, status: 200 });\n}\n\n/**\n * @ApiCreatedResponse() - Shorthand for 201 Created response\n */\nexport function ApiCreatedResponse(\n options: Omit<ApiResponseOptions, 'status'> = {}\n): MethodDecorator {\n return ApiResponse({ ...options, status: 201 });\n}\n\n/**\n * @ApiAcceptedResponse() - Shorthand for 202 Accepted response\n */\nexport function ApiAcceptedResponse(\n options: Omit<ApiResponseOptions, 'status'> = {}\n): MethodDecorator {\n return ApiResponse({ ...options, status: 202 });\n}\n\n/**\n * @ApiNoContentResponse() - Shorthand for 204 No Content response\n */\nexport function ApiNoContentResponse(\n options: Omit<ApiResponseOptions, 'status'> = {}\n): MethodDecorator {\n return ApiResponse({ ...options, status: 204 });\n}\n\n/**\n * @ApiBadRequestResponse() - Shorthand for 400 Bad Request response\n */\nexport function ApiBadRequestResponse(\n options: Omit<ApiResponseOptions, 'status'> = {}\n): MethodDecorator {\n return ApiResponse({ ...options, status: 400, description: options.description ?? 'Bad Request' });\n}\n\n/**\n * @ApiUnauthorizedResponse() - Shorthand for 401 Unauthorized response\n */\nexport function ApiUnauthorizedResponse(\n options: Omit<ApiResponseOptions, 'status'> = {}\n): MethodDecorator {\n return ApiResponse({ ...options, status: 401, description: options.description ?? 'Unauthorized' });\n}\n\n/**\n * @ApiForbiddenResponse() - Shorthand for 403 Forbidden response\n */\nexport function ApiForbiddenResponse(\n options: Omit<ApiResponseOptions, 'status'> = {}\n): MethodDecorator {\n return ApiResponse({ ...options, status: 403, description: options.description ?? 'Forbidden' });\n}\n\n/**\n * @ApiNotFoundResponse() - Shorthand for 404 Not Found response\n */\nexport function ApiNotFoundResponse(\n options: Omit<ApiResponseOptions, 'status'> = {}\n): MethodDecorator {\n return ApiResponse({ ...options, status: 404, description: options.description ?? 'Not Found' });\n}\n\n/**\n * @ApiConflictResponse() - Shorthand for 409 Conflict response\n */\nexport function ApiConflictResponse(\n options: Omit<ApiResponseOptions, 'status'> = {}\n): MethodDecorator {\n return ApiResponse({ ...options, status: 409, description: options.description ?? 'Conflict' });\n}\n\n/**\n * @ApiUnprocessableEntityResponse() - Shorthand for 422 Unprocessable Entity response\n */\nexport function ApiUnprocessableEntityResponse(\n options: Omit<ApiResponseOptions, 'status'> = {}\n): MethodDecorator {\n return ApiResponse({ ...options, status: 422, description: options.description ?? 'Unprocessable Entity' });\n}\n\n/**\n * @ApiInternalServerErrorResponse() - Shorthand for 500 Internal Server Error response\n */\nexport function ApiInternalServerErrorResponse(\n options: Omit<ApiResponseOptions, 'status'> = {}\n): MethodDecorator {\n return ApiResponse({ ...options, status: 500, description: options.description ?? 'Internal Server Error' });\n}\n\n/**\n * Get all response metadata from a method\n * @internal\n */\nexport function getApiResponses(\n target: Function,\n propertyKey: string | symbol\n): ApiResponseOptions[] {\n return Reflect.getMetadata(API_RESPONSE_METADATA, target.prototype, propertyKey) ?? [];\n}\n","import 'reflect-metadata';\nimport { API_BODY_METADATA } from '../constants.js';\nimport type { ApiBodyOptions } from '../types.js';\n\n/**\n * @ApiBody() decorator\n * \n * Documents the request body for an API operation.\n * Supports both Zod schemas and OpenAPI schema objects.\n * \n * @param options - Body options including schema, description, and examples\n * \n * @example\n * ```typescript\n * const CreateUserSchema = z.object({\n * name: z.string().min(2),\n * email: z.string().email(),\n * });\n * \n * @Post('/')\n * @ApiBody({\n * description: 'User creation data',\n * schema: CreateUserSchema,\n * required: true,\n * })\n * createUser(@Body() data: z.infer<typeof CreateUserSchema>) { }\n * ```\n */\nexport function ApiBody(options: ApiBodyOptions): MethodDecorator {\n return (\n target: Object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor => {\n Reflect.defineMetadata(\n API_BODY_METADATA,\n { ...options, required: options.required ?? true },\n target,\n propertyKey\n );\n return descriptor;\n };\n}\n\n/**\n * Get body metadata from a method\n * @internal\n */\nexport function getApiBody(\n target: Function,\n propertyKey: string | symbol\n): ApiBodyOptions | undefined {\n return Reflect.getMetadata(API_BODY_METADATA, target.prototype, propertyKey);\n}\n","import 'reflect-metadata';\nimport { API_PARAM_METADATA } from '../constants.js';\nimport type { ApiParamOptions } from '../types.js';\n\n/**\n * @ApiParam() decorator\n * \n * Documents a path parameter for an API operation.\n * Multiple @ApiParam decorators can be applied for routes with multiple parameters.\n * \n * @param options - Parameter options including name, description, and type\n * \n * @example\n * ```typescript\n * @Get('/:userId/posts/:postId')\n * @ApiParam({ name: 'userId', description: 'User ID', type: 'string', format: 'uuid' })\n * @ApiParam({ name: 'postId', description: 'Post ID', type: 'integer' })\n * getUserPost(\n * @Param('userId') userId: string,\n * @Param('postId') postId: number\n * ) { }\n * ```\n */\nexport function ApiParam(options: ApiParamOptions): MethodDecorator {\n return (\n target: Object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor => {\n const existingParams: ApiParamOptions[] =\n Reflect.getMetadata(API_PARAM_METADATA, target, propertyKey) ?? [];\n \n Reflect.defineMetadata(\n API_PARAM_METADATA,\n [...existingParams, { ...options, required: options.required ?? true }],\n target,\n propertyKey\n );\n return descriptor;\n };\n}\n\n/**\n * Get all path parameter metadata from a method\n * @internal\n */\nexport function getApiParams(\n target: Function,\n propertyKey: string | symbol\n): ApiParamOptions[] {\n return Reflect.getMetadata(API_PARAM_METADATA, target.prototype, propertyKey) ?? [];\n}\n","import 'reflect-metadata';\nimport { API_QUERY_METADATA } from '../constants.js';\nimport type { ApiQueryOptions } from '../types.js';\n\n/**\n * @ApiQuery() decorator\n * \n * Documents a query parameter for an API operation.\n * Multiple @ApiQuery decorators can be applied for routes with multiple query parameters.\n * \n * @param options - Query parameter options including name, description, and type\n * \n * @example\n * ```typescript\n * @Get('/')\n * @ApiQuery({ name: 'page', description: 'Page number', type: 'integer', required: false })\n * @ApiQuery({ name: 'limit', description: 'Items per page', type: 'integer', required: false })\n * @ApiQuery({ name: 'sort', description: 'Sort order', enum: ['asc', 'desc'] })\n * listUsers(\n * @Query('page') page?: number,\n * @Query('limit') limit?: number,\n * @Query('sort') sort?: string\n * ) { }\n * ```\n */\nexport function ApiQuery(options: ApiQueryOptions): MethodDecorator {\n return (\n target: Object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor => {\n const existingQueries: ApiQueryOptions[] =\n Reflect.getMetadata(API_QUERY_METADATA, target, propertyKey) ?? [];\n \n Reflect.defineMetadata(\n API_QUERY_METADATA,\n [...existingQueries, { ...options, required: options.required ?? false }],\n target,\n propertyKey\n );\n return descriptor;\n };\n}\n\n/**\n * Get all query parameter metadata from a method\n * @internal\n */\nexport function getApiQueries(\n target: Function,\n propertyKey: string | symbol\n): ApiQueryOptions[] {\n return Reflect.getMetadata(API_QUERY_METADATA, target.prototype, propertyKey) ?? [];\n}\n","import 'reflect-metadata';\nimport { API_HEADER_METADATA } from '../constants.js';\nimport type { ApiHeaderOptions } from '../types.js';\n\n/**\n * @ApiHeader() decorator\n * \n * Documents a header parameter for an API operation.\n * Multiple @ApiHeader decorators can be applied for routes with multiple headers.\n * \n * @param options - Header options including name, description, and required flag\n * \n * @example\n * ```typescript\n * @Get('/')\n * @ApiHeader({ name: 'X-Request-ID', description: 'Unique request identifier', required: true })\n * @ApiHeader({ name: 'X-Correlation-ID', description: 'Correlation ID for tracing' })\n * listUsers() { }\n * ```\n */\nexport function ApiHeader(options: ApiHeaderOptions): MethodDecorator {\n return (\n target: Object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor => {\n const existingHeaders: ApiHeaderOptions[] =\n Reflect.getMetadata(API_HEADER_METADATA, target, propertyKey) ?? [];\n \n Reflect.defineMetadata(\n API_HEADER_METADATA,\n [...existingHeaders, options],\n target,\n propertyKey\n );\n return descriptor;\n };\n}\n\n/**\n * Get all header parameter metadata from a method\n * @internal\n */\nexport function getApiHeaders(\n target: Function,\n propertyKey: string | symbol\n): ApiHeaderOptions[] {\n return Reflect.getMetadata(API_HEADER_METADATA, target.prototype, propertyKey) ?? [];\n}\n","import 'reflect-metadata';\nimport { API_SECURITY_METADATA } from '../constants.js';\nimport type { ApiSecurityOptions } from '../types.js';\n\n/**\n * @ApiSecurity() decorator\n * \n * Applies a security requirement to a controller or method.\n * The security scheme must be defined in the SwaggerConfig.securitySchemes.\n * \n * Can be applied to:\n * - Controller classes (applies to all routes)\n * - Individual route methods\n * \n * @param name - Name of the security scheme\n * @param scopes - Required scopes (for OAuth2)\n * \n * @example\n * ```typescript\n * @ApiSecurity('bearerAuth')\n * @Controller('/users')\n * class UserController {\n * @Get('/')\n * listUsers() { } // Protected by bearerAuth\n * \n * @Get('/public')\n * @ApiSecurity() // Remove security for this endpoint\n * getPublicInfo() { }\n * }\n * ```\n */\nexport function ApiSecurity(\n name?: string,\n scopes: string[] = []\n): ClassDecorator & MethodDecorator {\n return (\n target: Function | Object,\n propertyKey?: string | symbol,\n descriptor?: PropertyDescriptor\n ): void => {\n const security: ApiSecurityOptions | null = name ? { name, scopes } : null;\n \n if (propertyKey !== undefined && descriptor !== undefined) {\n // Method decorator - save on target (prototype)\n Reflect.defineMetadata(\n API_SECURITY_METADATA,\n security,\n target,\n propertyKey\n );\n } else {\n // Class decorator\n Reflect.defineMetadata(API_SECURITY_METADATA, security, target);\n }\n };\n}\n\n/**\n * @ApiBearerAuth() decorator\n * \n * Shorthand for @ApiSecurity('bearerAuth').\n * Applies Bearer token authentication to a controller or method.\n * \n * @param name - Name of the bearer auth scheme (default: 'bearerAuth')\n * \n * @example\n * ```typescript\n * @ApiBearerAuth()\n * @Controller('/users')\n * class UserController {\n * @Get('/')\n * listUsers() { } // Requires Bearer token\n * }\n * ```\n */\nexport function ApiBearerAuth(name: string = 'bearerAuth'): ClassDecorator & MethodDecorator {\n return ApiSecurity(name);\n}\n\n/**\n * @ApiBasicAuth() decorator\n * \n * Shorthand for @ApiSecurity('basicAuth').\n * Applies HTTP Basic authentication to a controller or method.\n * \n * @param name - Name of the basic auth scheme (default: 'basicAuth')\n */\nexport function ApiBasicAuth(name: string = 'basicAuth'): ClassDecorator & MethodDecorator {\n return ApiSecurity(name);\n}\n\n/**\n * @ApiOAuth2() decorator\n * \n * Applies OAuth2 authentication with specific scopes.\n * \n * @param scopes - Required OAuth2 scopes\n * @param name - Name of the OAuth2 scheme (default: 'oauth2')\n * \n * @example\n * ```typescript\n * @ApiOAuth2(['read:users', 'write:users'])\n * @Controller('/users')\n * class UserController { }\n * ```\n */\nexport function ApiOAuth2(\n scopes: string[] = [],\n name: string = 'oauth2'\n): ClassDecorator & MethodDecorator {\n return ApiSecurity(name, scopes);\n}\n\n/**\n * @ApiCookieAuth() decorator\n * \n * Applies cookie-based authentication.\n * \n * @param name - Name of the cookie auth scheme (default: 'cookieAuth')\n */\nexport function ApiCookieAuth(name: string = 'cookieAuth'): ClassDecorator & MethodDecorator {\n return ApiSecurity(name);\n}\n\n/**\n * Get security metadata from a class or method\n * @internal\n */\nexport function getApiSecurity(\n target: Function,\n propertyKey?: string | symbol\n): ApiSecurityOptions | null | undefined {\n if (propertyKey !== undefined) {\n // Check if method has explicit security (including null for \"no security\")\n const methodSecurity = Reflect.getMetadata(API_SECURITY_METADATA, target.prototype, propertyKey);\n if (methodSecurity !== undefined) {\n return methodSecurity;\n }\n // Fall back to class-level security\n return Reflect.getMetadata(API_SECURITY_METADATA, target);\n }\n return Reflect.getMetadata(API_SECURITY_METADATA, target);\n}\n","import 'reflect-metadata';\nimport { API_PROPERTY_METADATA } from '../constants.js';\nimport type { ApiPropertyOptions } from '../types.js';\n\n/**\n * Stored property metadata structure\n */\ninterface StoredPropertyMetadata {\n propertyKey: string | symbol;\n options: ApiPropertyOptions;\n}\n\n/**\n * @ApiProperty() decorator\n * \n * Documents a property of a DTO class for schema generation.\n * Used when you want to manually define schema properties instead of using Zod.\n * \n * @param options - Property options including type, description, and validation rules\n * \n * @example\n * ```typescript\n * class CreateUserDto {\n * @ApiProperty({\n * description: 'User email address',\n * type: 'string',\n * format: 'email',\n * example: 'user@example.com',\n * required: true,\n * })\n * email!: string;\n * \n * @ApiProperty({\n * description: 'User age',\n * type: 'integer',\n * minimum: 0,\n * maximum: 150,\n * required: false,\n * })\n * age?: number;\n * \n * @ApiProperty({\n * description: 'User role',\n * enum: ['admin', 'user', 'guest'],\n * default: 'user',\n * })\n * role!: string;\n * }\n * ```\n */\nexport function ApiProperty(options: ApiPropertyOptions = {}): PropertyDecorator {\n return (target: Object, propertyKey: string | symbol): void => {\n const existingProperties: StoredPropertyMetadata[] =\n Reflect.getMetadata(API_PROPERTY_METADATA, target.constructor) ?? [];\n \n Reflect.defineMetadata(\n API_PROPERTY_METADATA,\n [...existingProperties, { propertyKey, options }],\n target.constructor\n );\n };\n}\n\n/**\n * @ApiPropertyOptional() decorator\n * \n * Shorthand for @ApiProperty({ required: false }).\n * Marks a property as optional in the schema.\n */\nexport function ApiPropertyOptional(\n options: Omit<ApiPropertyOptions, 'required'> = {}\n): PropertyDecorator {\n return ApiProperty({ ...options, required: false });\n}\n\n/**\n * @ApiHideProperty() decorator\n * \n * Excludes a property from the generated schema.\n * Useful for internal properties that shouldn't be documented.\n */\nexport function ApiHideProperty(): PropertyDecorator {\n return (target: Object, propertyKey: string | symbol): void => {\n const existingProperties: StoredPropertyMetadata[] =\n Reflect.getMetadata(API_PROPERTY_METADATA, target.constructor) ?? [];\n \n // Add property with special flag to hide it\n Reflect.defineMetadata(\n API_PROPERTY_METADATA,\n [...existingProperties, { propertyKey, options: { _hidden: true } as ApiPropertyOptions }],\n target.constructor\n );\n };\n}\n\n/**\n * Get all property metadata from a class\n * @internal\n */\nexport function getApiProperties(target: Function): StoredPropertyMetadata[] {\n return Reflect.getMetadata(API_PROPERTY_METADATA, target) ?? [];\n}\n","import 'reflect-metadata';\nimport { API_EXCLUDE_METADATA, API_DEPRECATED_METADATA } from '../constants.js';\n\n/**\n * @ApiExcludeEndpoint() decorator\n * \n * Excludes an endpoint from the Swagger documentation.\n * The route will still work but won't appear in the docs.\n * \n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Get('/')\n * listUsers() { } // Documented\n * \n * @Get('/internal')\n * @ApiExcludeEndpoint()\n * internalEndpoint() { } // Not documented\n * }\n * ```\n */\nexport function ApiExcludeEndpoint(): MethodDecorator {\n return (\n target: Object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor => {\n Reflect.defineMetadata(\n API_EXCLUDE_METADATA,\n true,\n target,\n propertyKey\n );\n return descriptor;\n };\n}\n\n/**\n * @ApiExcludeController() decorator\n * \n * Excludes an entire controller from the Swagger documentation.\n * All routes in the controller will still work but won't appear in the docs.\n * \n * @example\n * ```typescript\n * @ApiExcludeController()\n * @Controller('/internal')\n * class InternalController {\n * @Get('/health')\n * health() { } // Not documented\n * }\n * ```\n */\nexport function ApiExcludeController(): ClassDecorator {\n return (target: Function): void => {\n Reflect.defineMetadata(API_EXCLUDE_METADATA, true, target);\n };\n}\n\n/**\n * Check if an endpoint is excluded from documentation\n * @internal\n */\nexport function isApiExcluded(target: Function, propertyKey?: string | symbol): boolean {\n // Check class-level exclusion\n if (Reflect.getMetadata(API_EXCLUDE_METADATA, target) === true) {\n return true;\n }\n // Check method-level exclusion\n if (propertyKey !== undefined) {\n return Reflect.getMetadata(API_EXCLUDE_METADATA, target.prototype, propertyKey) === true;\n }\n return false;\n}\n\n/**\n * @ApiDeprecated() decorator\n * \n * Marks an endpoint as deprecated in the documentation.\n * The endpoint will be styled differently in Swagger UI.\n * \n * @param message - Optional deprecation message\n * \n * @example\n * ```typescript\n * @Controller('/users')\n * class UserController {\n * @Get('/v1')\n * @ApiDeprecated('Use /v2 instead')\n * legacyEndpoint() { }\n * }\n * ```\n */\nexport function ApiDeprecated(message?: string): MethodDecorator {\n return (\n target: Object,\n propertyKey: string | symbol,\n descriptor: PropertyDescriptor\n ): PropertyDescriptor => {\n Reflect.defineMetadata(\n API_DEPRECATED_METADATA,\n { deprecated: true, message },\n target,\n propertyKey\n );\n return descriptor;\n };\n}\n\n/**\n * Check if an endpoint is deprecated\n * @internal\n */\nexport function getApiDeprecated(\n target: Function,\n propertyKey: string | symbol\n): { deprecated: boolean; message?: string } | undefined {\n return Reflect.getMetadata(API_DEPRECATED_METADATA, target.prototype, propertyKey);\n}\n","import 'reflect-metadata';\nimport {\n ParamType,\n type RouteDefinition,\n type ControllerMetadata,\n type ParamMetadata,\n // Metadata helper functions\n getControllerMetadata,\n getRoutes,\n getParamMetadata as getCoreParamMetadata,\n getHttpCode,\n getClassMetadata,\n getMethodMetadata,\n} from '@riktajs/core';\n\nimport {\n API_TAGS_METADATA,\n API_OPERATION_METADATA,\n API_RESPONSE_METADATA,\n API_BODY_METADATA,\n API_PARAM_METADATA,\n API_QUERY_METADATA,\n API_HEADER_METADATA,\n API_SECURITY_METADATA,\n API_EXCLUDE_METADATA,\n API_DEPRECATED_METADATA,\n} from '../constants.js';\n\nimport type {\n SwaggerConfig,\n OpenApiDocument,\n OpenApiPathItem,\n OpenApiOperation,\n OpenApiSchemaObject,\n OpenApiSecurityScheme,\n OpenApiInfoObject,\n ApiOperationOptions,\n ApiResponseOptions,\n ApiBodyOptions,\n ApiParamOptions,\n ApiQueryOptions,\n ApiHeaderOptions,\n ApiSecurityOptions,\n} from '../types.js';\n\nimport { zodToOpenApi, toOpenApiSchema } from './zod-to-openapi.js';\n\n// Type alias for any class constructor\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Constructor<T = unknown> = new (...args: any[]) => T;\n\n/**\n * Default swagger config values\n */\nconst DEFAULT_SWAGGER_CONFIG: SwaggerConfig = {\n info: {\n title: 'API Documentation',\n version: '1.0.0',\n },\n};\n\n/**\n * Shorthand config options that allow flat title/version/description\n */\ninterface OpenApiGeneratorConfig extends Omit<SwaggerConfig, 'info'> {\n /** API title (shorthand for info.title) */\n title?: string;\n /** API version (shorthand for info.version) */\n version?: string;\n /** API description (shorthand for info.description) */\n description?: string;\n /** API contact (shorthand for info.contact) */\n contact?: OpenApiInfoObject['contact'];\n /** API license (shorthand for info.license) */\n license?: OpenApiInfoObject['license'];\n /** API terms of service (shorthand for info.termsOfService) */\n termsOfService?: string;\n /** Full info object (takes precedence over shorthand) */\n info?: OpenApiInfoObject;\n}\n\n/**\n * OpenAPI Specification Generator\n * \n * Collects metadata from controllers and generates a complete\n * OpenAPI 3.0.3 specification document.\n * \n * @example\n * ```typescript\n * const generator = new OpenApiGenerator({\n * info: {\n * title: 'My API',\n * version: '1.0.0',\n * },\n * });\n * \n * // Add controllers to scan\n * generator.addController(UserController);\n * generator.addController(ProductController);\n * \n * // Generate the specification\n * const spec = generator.generate();\n * ```\n */\nexport class OpenApiGenerator {\n private config: SwaggerConfig;\n private controllers: Constructor[] = [];\n private globalSecuritySchemes: Map<string, OpenApiSecurityScheme> = new Map();\n\n constructor(config: OpenApiGeneratorConfig = {}) {\n // Build info object from shorthand or full info\n const info: OpenApiInfoObject = config.info ?? {\n title: config.title ?? DEFAULT_SWAGGER_CONFIG.info?.title ?? 'API Documentation',\n version: config.version ?? DEFAULT_SWAGGER_CONFIG.info?.version ?? '1.0.0',\n description: config.description,\n contact: config.contact,\n license: config.license,\n termsOfService: config.termsOfService,\n };\n\n // Extract remaining config (excluding shorthand properties)\n const { title, version, description, contact, license, termsOfService, ...restConfig } = config;\n \n this.config = { \n ...DEFAULT_SWAGGER_CONFIG, \n ...restConfig,\n info,\n };\n }\n\n /**\n * Add a controller to be documented\n */\n addController(controller: Constructor): this {\n this.controllers.push(controller);\n return this;\n }\n\n /**\n * Add multiple controllers\n */\n addControllers(controllers: Constructor[]): this {\n this.controllers.push(...controllers);\n return this;\n }\n\n /**\n * Add a global security scheme\n */\n addSecurityScheme(name: string, scheme: OpenApiSecurityScheme): this {\n this.globalSecuritySchemes.set(name, scheme);\n return this;\n }\n\n /**\n * Generate the OpenAPI specification document\n */\n generate(): OpenApiDocument {\n const paths: Record<string, OpenApiPathItem> = {};\n const tags: Array<{ name: string; description?: string }> = [];\n const seenTags = new Set<string>();\n\n for (const controller of this.controllers) {\n // Check if controller is excluded\n if (this.isControllerExcluded(controller)) {\n continue;\n }\n\n const controllerMeta = this.getControllerMeta(controller);\n if (!controllerMeta) continue;\n\n const controllerTags = this.getControllerTags(controller);\n const controllerDeprecated = this.isControllerDeprecated(controller);\n\n // Add controller tags to the global tags list\n for (const tag of controllerTags) {\n if (!seenTags.has(tag)) {\n seenTags.add(tag);\n tags.push({ name: tag });\n }\n }\n\n // Process each route\n const routes = this.getControllerRoutes(controller);\n for (const route of routes) {\n // Check if endpoint is excluded\n if (this.isEndpointExcluded(controller, route.handlerName)) {\n continue;\n }\n\n const fullPath = this.normalizePath(controllerMeta.prefix, route.path);\n const method = route.method.toLowerCase();\n\n if (!paths[fullPath]) {\n paths[fullPath] = {};\n }\n\n const operation = this.buildOperation(\n controller,\n route,\n controllerTags,\n controllerDeprecated\n );\n\n // Assign operation to the path item using method as key\n (paths[fullPath] as Record<string, OpenApiOperation>)[method] = operation;\n }\n }\n\n // Build security schemes from global and controller-level definitions\n const securitySchemes = this.buildSecuritySchemes();\n\n const document: OpenApiDocument = {\n openapi: '3.0.3',\n info: this.config.info!,\n paths,\n };\n\n if (tags.length > 0) {\n document.tags = tags;\n }\n\n if (this.config.servers && this.config.servers.length > 0) {\n document.servers = this.config.servers;\n }\n\n if (Object.keys(securitySchemes).length > 0) {\n document.components = {\n ...document.components,\n securitySchemes,\n };\n }\n\n if (this.config.externalDocs) {\n document.externalDocs = this.config.externalDocs;\n }\n\n return document;\n }\n\n // ============================================================================\n // Private: Metadata Getters (using core helpers)\n // ============================================================================\n\n private getControllerMeta(controller: Constructor): ControllerMetadata | undefined {\n return getControllerMetadata(controller);\n }\n\n private getControllerRoutes(controller: Constructor): RouteDefinition[] {\n return getRoutes(controller);\n }\n\n private getControllerTags(controller: Constructor): string[] {\n return getClassMetadata<string[]>(API_TAGS_METADATA, controller) || [];\n }\n\n private isControllerExcluded(controller: Constructor): boolean {\n return getClassMetadata<boolean>(API_EXCLUDE_METADATA, controller) === true;\n }\n\n private isControllerDeprecated(controller: Constructor): boolean {\n return getClassMetadata<boolean>(API_DEPRECATED_METADATA, controller) === true;\n }\n\n private isEndpointExcluded(controller: Constructor, handlerName: string | symbol): boolean {\n return getMethodMetadata<boolean>(API_EXCLUDE_METADATA, controller, handlerName) === true;\n }\n\n private isEndpointDeprecated(controller: Constructor, handlerName: string | symbol): boolean {\n const controllerLevel = getClassMetadata<{ deprecated: boolean; message?: string }>(API_DEPRECATED_METADATA, controller);\n const methodLevel = getMethodMetadata<{ deprecated: boolean; message?: string }>(API_DEPRECATED_METADATA, controller, handlerName);\n return controllerLevel?.deprecated === true || methodLevel?.deprecated === true;\n }\n\n private getOperationMetadata(controller: Constructor, handlerName: string | symbol): ApiOperationOptions | undefined {\n return getMethodMetadata<ApiOperationOptions>(API_OPERATION_METADATA, controller, handlerName);\n }\n\n private getResponseMetadata(controller: Constructor, handlerName: string | symbol): ApiResponseOptions[] {\n return getMethodMetadata<ApiResponseOptions[]>(API_RESPONSE_METADATA, controller, handlerName) || [];\n }\n\n private getBodyMetadata(controller: Constructor, handlerName: string | symbol): ApiBodyOptions | undefined {\n return getMethodMetadata<ApiBodyOptions>(API_BODY_METADATA, controller, handlerName);\n }\n\n private getSwaggerParamMetadata(controller: Constructor, handlerName: string | symbol): ApiParamOptions[] {\n return getMethodMetadata<ApiParamOptions[]>(API_PARAM_METADATA, controller, handlerName) || [];\n }\n\n private getQueryMetadata(controller: Constructor, handlerName: string | symbol): ApiQueryOptions[] {\n return getMethodMetadata<ApiQueryOptions[]>(API_QUERY_METADATA, controller, handlerName) || [];\n }\n\n private getHeaderMetadata(controller: Constructor, handlerName: string | symbol): ApiHeaderOptions[] {\n return getMethodMetadata<ApiHeaderOptions[]>(API_HEADER_METADATA, controller, handlerName) || [];\n }\n\n private getSecurityMetadata(controller: Constructor, handlerName: string | symbol): ApiSecurityOptions[] {\n const controllerLevel = getClassMetadata<ApiSecurityOptions | ApiSecurityOptions[]>(API_SECURITY_METADATA, controller);\n const methodLevel = getMethodMetadata<ApiSecurityOptions | ApiSecurityOptions[]>(API_SECURITY_METADATA, controller, handlerName);\n \n const result: ApiSecurityOptions[] = [];\n \n // Controller level can be a single object or null (to remove security)\n if (controllerLevel && typeof controllerLevel === 'object' && 'name' in controllerLevel) {\n result.push(controllerLevel as ApiSecurityOptions);\n } else if (Array.isArray(controllerLevel)) {\n result.push(...controllerLevel);\n }\n \n // Method level can override or add to controller level\n if (methodLevel && typeof methodLevel === 'object' && 'name' in methodLevel) {\n result.push(methodLevel as ApiSecurityOptions);\n } else if (Array.isArray(methodLevel)) {\n result.push(...methodLevel);\n }\n \n return result;\n }\n\n private getMethodTags(controller: Constructor, handlerName: string | symbol): string[] | undefined {\n const operation = this.getOperationMetadata(controller, handlerName);\n return operation?.tags;\n }\n\n private getHttpStatusCode(controller: Constructor, handlerName: string | symbol): number | undefined {\n return getHttpCode(controller, handlerName);\n }\n\n private getCoreParams(controller: Constructor, handlerName: string | symbol): ParamMetadata[] {\n return getCoreParamMetadata(controller, handlerName);\n }\n\n // ============================================================================\n // Private: Path Utilities\n // ============================================================================\n\n private normalizePath(prefix: string, path: string): string {\n // Ensure prefix starts with / and path handling\n let fullPath = '';\n \n if (prefix) {\n fullPath = prefix.startsWith('/') ? prefix : `/${prefix}`;\n }\n \n if (path) {\n const cleanPath = path.startsWith('/') ? path : `/${path}`;\n fullPath = fullPath + cleanPath;\n }\n \n // Handle root path\n if (!fullPath) {\n fullPath = '/';\n }\n \n // Convert :param to {param} (Fastify to OpenAPI format)\n fullPath = fullPath.replace(/:([^/]+)/g, '{$1}');\n \n // Remove trailing slash (except for root)\n if (fullPath !== '/' && fullPath.endsWith('/')) {\n fullPath = fullPath.slice(0, -1);\n }\n \n return fullPath;\n }\n\n // ============================================================================\n // Private: Operation Builder\n // ============================================================================\n\n private buildOperation(\n controller: Constructor,\n route: RouteDefinition,\n controllerTags: string[],\n controllerDeprecated: boolean\n ): OpenApiOperation {\n const handlerName = route.handlerName;\n const operationMeta = this.getOperationMetadata(controller, handlerName);\n const methodTags = this.getMethodTags(controller, handlerName);\n\n const operation: OpenApiOperation = {\n responses: {},\n };\n\n // Tags (method level overrides controller level)\n const tags = methodTags || controllerTags;\n if (tags.length > 0) {\n operation.tags = tags;\n }\n\n // Summary and description from @ApiOperation\n if (operationMeta?.summary) {\n operation.summary = operationMeta.summary;\n }\n if (operationMeta?.description) {\n operation.description = operationMeta.description;\n }\n if (operationMeta?.operationId) {\n operation.operationId = operationMeta.operationId;\n }\n\n // Deprecated flag\n if (controllerDeprecated || operationMeta?.deprecated || this.isEndpointDeprecated(controller, handlerName)) {\n operation.deprecated = true;\n }\n\n // Parameters (path, query, header)\n const parameters = this.buildParameters(controller, handlerName, route.path);\n if (parameters.length > 0) {\n operation.parameters = parameters;\n }\n\n // Request body (for POST, PUT, PATCH)\n if (['POST', 'PUT', 'PATCH'].includes(route.method)) {\n const requestBody = this.buildRequestBody(controller, handlerName);\n if (requestBody) {\n operation.requestBody = requestBody;\n }\n }\n\n // Responses\n operation.responses = this.buildResponses(controller, handlerName, route.statusCode);\n\n // Security\n const security = this.getSecurityMetadata(controller, handlerName);\n if (security.length > 0) {\n operation.security = security.map(s => ({ [s.name]: s.scopes || [] }));\n }\n\n return operation;\n }\n\n private buildParameters(\n controller: Constructor,\n handlerName: string | symbol,\n routePath: string\n ): Array<{\n name: string;\n in: 'path' | 'query' | 'header' | 'cookie';\n required?: boolean;\n deprecated?: boolean;\n description?: string;\n schema?: OpenApiSchemaObject;\n example?: unknown;\n }> {\n const parameters: Array<{\n name: string;\n in: 'path' | 'query' | 'header' | 'cookie';\n required?: boolean;\n deprecated?: boolean;\n description?: string;\n schema?: OpenApiSchemaObject;\n example?: unknown;\n }> = [];\n\n // Extract path parameters from route pattern\n const pathParams = this.extractPathParams(routePath);\n const paramDecorators = this.getSwaggerParamMetadata(controller, handlerName);\n const queryDecorators = this.getQueryMetadata(controller, handlerName);\n const headerDecorators = this.getHeaderMetadata(controller, handlerName);\n const coreParams = this.getCoreParams(controller, handlerName);\n\n // Add path parameters from decorator metadata or extract from path\n const usedPathParams = new Set<string>();\n for (const param of paramDecorators) {\n usedPathParams.add(param.name);\n const baseSchema = toOpenApiSchema(param.schema);\n const fallbackSchema: OpenApiSchemaObject = { \n type: (param.type as OpenApiSchemaObject['type']) || 'string' \n };\n if (param.format) {\n fallbackSchema.format = param.format;\n }\n parameters.push({\n name: param.name,\n in: 'path',\n required: true, // Path params are always required\n deprecated: param.deprecated,\n description: param.description,\n schema: baseSchema || fallbackSchema,\n example: param.example,\n });\n }\n\n // Add any path parameters not covered by decorators\n for (const paramName of pathParams) {\n if (!usedPathParams.has(paramName)) {\n // Check if there's a Zod schema for this parameter\n const coreParam = coreParams.find(p => p.type === ParamType.PARAM && p.key === paramName);\n const schema = coreParam?.zodSchema ? zodToOpenApi(coreParam.zodSchema) : { type: 'string' as const };\n \n parameters.push({\n name: paramName,\n in: 'path',\n required: true,\n schema,\n });\n }\n }\n\n // Add query parameters\n for (const query of queryDecorators) {\n const baseSchema = toOpenApiSchema(query.schema);\n const fallbackSchema: OpenApiSchemaObject = { \n type: (query.type as OpenApiSchemaObject['type']) || 'string' \n };\n if (query.format) {\n fallbackSchema.format = query.format;\n }\n parameters.push({\n name: query.name,\n in: 'query',\n required: query.required,\n deprecated: query.deprecated,\n description: query.description,\n schema: baseSchema || fallbackSchema,\n example: query.example,\n });\n }\n\n // Add header parameters\n for (const header of headerDecorators) {\n parameters.push({\n name: header.name,\n in: 'header',\n required: header.required,\n deprecated: header.deprecated,\n description: header.description,\n schema: toOpenApiSchema(header.schema) || { \n type: (header.type as OpenApiSchemaObject['type']) || 'string' \n },\n example: header.example,\n });\n }\n\n return parameters;\n }\n\n private extractPathParams(path: string): string[] {\n const params: string[] = [];\n // Match both :param (Fastify) and {param} (OpenAPI) formats\n const regex = /:([^/]+)|{([^}]+)}/g;\n let match;\n while ((match = regex.exec(path)) !== null) {\n const paramName = match[1] ?? match[2];\n if (paramName) {\n params.push(paramName);\n }\n }\n return params;\n }\n\n private buildRequestBody(\n controller: Constructor,\n handlerName: string | symbol\n ): {\n description?: string;\n required?: boolean;\n content: Record<string, { schema?: OpenApiSchemaObject; example?: unknown }>;\n } | undefined {\n const bodyMeta = this.getBodyMetadata(controller, handlerName);\n const coreParams = this.getCoreParams(controller, handlerName);\n \n // Check for @ApiBody decorator first\n if (bodyMeta) {\n const schema = toOpenApiSchema(bodyMeta.schema);\n return {\n description: bodyMeta.description,\n required: bodyMeta.required ?? true,\n content: {\n [bodyMeta.type || 'application/json']: {\n schema: bodyMeta.isArray && schema ? { type: 'array', items: schema } : schema,\n example: bodyMeta.example,\n },\n },\n };\n }\n\n // Fallback: check for @Body() decorator with Zod schema\n const bodyParam = coreParams.find(p => p.type === ParamType.BODY);\n if (bodyParam?.zodSchema) {\n return {\n required: true,\n content: {\n 'application/json': {\n schema: zodToOpenApi(bodyParam.zodSchema),\n },\n },\n };\n }\n\n return undefined;\n }\n\n private buildResponses(\n controller: Constructor,\n handlerName: string | symbol,\n defaultStatusCode?: number\n ): Record<string, {\n description: string;\n content?: Record<string, { schema?: OpenApiSchemaObject; example?: unknown }>;\n }> {\n const responses: Record<string, {\n description: string;\n content?: Record<string, { schema?: OpenApiSchemaObject; example?: unknown }>;\n }> = {};\n\n const responseMeta = this.getResponseMetadata(controller, handlerName);\n const httpCode = this.getHttpStatusCode(controller, handlerName);\n\n if (responseMeta.length > 0) {\n for (const response of responseMeta) {\n const statusCode = response.status.toString();\n const schema = toOpenApiSchema(response.schema);\n\n responses[statusCode] = {\n description: response.description || this.getDefaultStatusDescription(response.status),\n };\n\n if (schema || response.example) {\n responses[statusCode].content = {\n [response.type || 'application/json']: {\n schema: response.isArray && schema ? { type: 'array', items: schema } : schema,\n example: response.example,\n },\n };\n }\n }\n } else {\n // Add default response based on HTTP code\n const status = (httpCode || defaultStatusCode || 200).toString();\n responses[status] = {\n description: this.getDefaultStatusDescription(Number(status)),\n };\n }\n\n return responses;\n }\n\n private getDefaultStatusDescription(status: number): string {\n const descriptions: Record<number, string> = {\n 200: 'Successful response',\n 201: 'Resource created successfully',\n 204: 'No content',\n 400: 'Bad request',\n 401: 'Unauthorized',\n 403: 'Forbidden',\n 404: 'Not found',\n 409: 'Conflict',\n 422: 'Unprocessable entity',\n 500: 'Internal server error',\n };\n return descriptions[status] || 'Response';\n }\n\n private buildSecuritySchemes(): Record<string, {\n type: string;\n description?: string;\n name?: string;\n in?: string;\n scheme?: string;\n bearerFormat?: string;\n flows?: unknown;\n }> {\n const schemes: Record<string, {\n type: string;\n description?: string;\n name?: string;\n in?: string;\n scheme?: string;\n bearerFormat?: string;\n flows?: unknown;\n }> = {};\n\n for (const [name, options] of this.globalSecuritySchemes) {\n schemes[name] = {\n type: options.type,\n description: options.description,\n };\n\n if (options.type === 'apiKey') {\n schemes[name].name = options.name;\n schemes[name].in = options.in;\n } else if (options.type === 'http') {\n schemes[name].scheme = options.scheme;\n if (options.bearerFormat) {\n schemes[name].bearerFormat = options.bearerFormat;\n }\n } else if (options.type === 'oauth2' && options.flows) {\n schemes[name].flows = options.flows;\n }\n }\n\n return schemes;\n }\n}\n\n/**\n * Create a new OpenAPI generator instance\n */\nexport function createOpenApiGenerator(config?: Partial<SwaggerConfig>): OpenApiGenerator {\n return new OpenApiGenerator(config);\n}\n","import { z, type ZodType } from 'zod';\r\nimport type { OpenApiSchemaObject } from '../types.js';\r\n\r\n/**\r\n * JSON Schema type (simplified)\r\n */\r\ntype JsonSchema = Record<string, unknown>;\r\n\r\n/**\r\n * Type guard to check if a value is a Zod schema\r\n * Uses duck typing to detect Zod schemas without requiring the full library\r\n * Compatible with both Zod v3 (_def) and Zod v4 (_zod)\r\n */\r\nexport function isZodSchema(value: unknown): value is ZodType<unknown> {\r\n return (\r\n value !== null &&\r\n typeof value === 'object' &&\r\n ('_zod' in value || '_def' in value) &&\r\n 'safeParse' in value &&\r\n typeof (value as { safeParse: unknown }).safeParse === 'function'\r\n );\r\n}\r\n\r\n/**\r\n * Convert JSON Schema to OpenAPI 3.0 compatible schema\r\n * \r\n * Main differences:\r\n * - OpenAPI uses `nullable: true` instead of `type: ['string', 'null']`\r\n * - OpenAPI 3.0 doesn't support `$schema`, `$id`, etc.\r\n * - Some JSON Schema features need to be simplified\r\n */\r\nfunction jsonSchemaToOpenApi(jsonSchema: JsonSchema | boolean): OpenApiSchemaObject {\r\n if (typeof jsonSchema === 'boolean') {\r\n return jsonSchema ? {} : { not: {} };\r\n }\r\n\r\n const result: OpenApiSchemaObject = {};\r\n const schema = jsonSchema as Record<string, unknown>;\r\n\r\n // Handle type with null (convert to nullable)\r\n if (Array.isArray(schema.type)) {\r\n const types = schema.type as string[];\r\n const nullIndex = types.indexOf('null');\r\n if (nullIndex !== -1) {\r\n result.nullable = true;\r\n const nonNullTypes = types.filter(t => t !== 'null');\r\n if (nonNullTypes.length === 1) {\r\n result.type = nonNullTypes[0] as OpenApiSchemaObject['type'];\r\n } else if (nonNullTypes.length > 1) {\r\n // Multiple non-null types - use oneOf\r\n result.oneOf = nonNullTypes.map(t => ({ type: t as OpenApiSchemaObject['type'] }));\r\n }\r\n } else if (types.length === 1) {\r\n result.type = types[0] as OpenApiSchemaObject['type'];\r\n }\r\n } else if (schema.type) {\r\n result.type = schema.type as OpenApiSchemaObject['type'];\r\n }\r\n\r\n // Copy simple properties\r\n const simpleProps = [\r\n 'format', 'description', 'default', 'example', 'enum',\r\n 'minimum', 'maximum', 'exclusiveMinimum', 'exclusiveMaximum',\r\n 'minLength', 'maxLength', 'pattern',\r\n 'minItems', 'maxItems', 'uniqueItems',\r\n 'minProperties', 'maxProperties',\r\n 'required', 'readOnly', 'writeOnly', 'deprecated',\r\n ] as const;\r\n\r\n for (const prop of simpleProps) {\r\n if (schema[prop] !== undefined) {\r\n (result as Record<string, unknown>)[prop] = schema[prop];\r\n }\r\n }\r\n\r\n // Handle items (for arrays)\r\n if (schema.items) {\r\n if (Array.isArray(schema.items)) {\r\n // Tuple - OpenAPI 3.0 doesn't support tuple validation well\r\n result.items = { oneOf: (schema.items as JsonSchema[]).map(jsonSchemaToOpenApi) };\r\n } else {\r\n result.items = jsonSchemaToOpenApi(schema.items as JsonSchema);\r\n }\r\n }\r\n\r\n // Handle properties (for objects)\r\n if (schema.properties) {\r\n result.properties = {};\r\n for (const [key, value] of Object.entries(schema.properties as Record<string, JsonSchema>)) {\r\n result.properties[key] = jsonSchemaToOpenApi(value);\r\n }\r\n }\r\n\r\n // Handle additionalProperties\r\n if (schema.additionalProperties !== undefined) {\r\n if (typeof schema.additionalProperties === 'boolean') {\r\n result.additionalProperties = schema.additionalProperties;\r\n } else {\r\n result.additionalProperties = jsonSchemaToOpenApi(schema.additionalProperties as JsonSchema);\r\n }\r\n }\r\n\r\n // Handle allOf, oneOf, anyOf\r\n if (schema.allOf) {\r\n result.allOf = (schema.allOf as JsonSchema[]).map(jsonSchemaToOpenApi);\r\n }\r\n if (schema.oneOf) {\r\n result.oneOf = (schema.oneOf as JsonSchema[]).map(jsonSchemaToOpenApi);\r\n }\r\n if (schema.anyOf) {\r\n result.anyOf = (schema.anyOf as JsonSchema[]).map(jsonSchemaToOpenApi);\r\n }\r\n\r\n // Handle not\r\n if (schema.not) {\r\n result.not = jsonSchemaToOpenApi(schema.not as JsonSchema);\r\n }\r\n\r\n // Handle const (convert to enum with single value)\r\n if (schema.const !== undefined) {\r\n result.enum = [schema.const];\r\n }\r\n\r\n return result;\r\n}\r\n\r\n/**\r\n * Convert a Zod schema to an OpenAPI 3.0 schema object\r\n * \r\n * Uses Zod v4's native z.toJSONSchema() for the heavy lifting, then converts\r\n * JSON Schema to OpenAPI 3.0 compatible format.\r\n * \r\n * Supports all Zod types including:\r\n * - Primitives: string, number, boolean, bigint\r\n * - Complex: object, array, tuple, record\r\n * - Modifiers: optional, nullable, default\r\n * - Validators: min, max, email, uuid, url, etc.\r\n * - Enums: enum, nativeEnum\r\n * - Unions and intersections\r\n * - Literals\r\n * - Effects (transform, refine)\r\n * \r\n * @param schema - The Zod schema to convert\r\n * @returns OpenAPI schema object\r\n * \r\n * @example\r\n * ```typescript\r\n * const UserSchema = z.object({\r\n * id: z.string().uuid(),\r\n * email: z.string().email(),\r\n * age: z.number().int().min(0).optional(),\r\n * });\r\n * \r\n * const openApiSchema = zodToOpenApi(UserSchema);\r\n * // {\r\n * // type: 'object',\r\n * // properties: {\r\n * // id: { type: 'string', format: 'uuid' },\r\n * // email: { type: 'string', format: 'email' },\r\n * // age: { type: 'integer', minimum: 0 }\r\n * // },\r\n * // required: ['id', 'email']\r\n * // }\r\n * ```\r\n */\r\nexport function zodToOpenApi(schema: ZodType): OpenApiSchemaObject {\r\n // Convert to JSON Schema using Zod v4 native method with OpenAPI 3.0 target\r\n // and custom handling for unrepresentable types\r\n const jsonSchema = z.toJSONSchema(schema, {\r\n // Target OpenAPI 3.0 Schema Object format\r\n target: 'openapi-3.0',\r\n // Allow unrepresentable types to be converted to {} instead of throwing\r\n unrepresentable: 'any',\r\n // Custom override for types that need special handling\r\n override: (ctx) => {\r\n const def = ctx.zodSchema._zod?.def;\r\n if (!def) return;\r\n \r\n // Handle z.date() - convert to string with date-time format\r\n if (def.type === 'date') {\r\n ctx.jsonSchema.type = 'string';\r\n ctx.jsonSchema.format = 'date-time';\r\n }\r\n \r\n // Handle z.bigint() - convert to integer with int64 format\r\n if (def.type === 'bigint') {\r\n ctx.jsonSchema.type = 'integer';\r\n ctx.jsonSchema.format = 'int64';\r\n }\r\n },\r\n }) as JsonSchema;\r\n\r\n // Convert JSON Schema to OpenAPI format (handle remaining differences)\r\n return jsonSchemaToOpenApi(jsonSchema);\r\n}\r\n\r\n/**\r\n * Convert a Zod schema to OpenAPI schema, or pass through if already an OpenAPI schema\r\n */\r\nexport function toOpenApiSchema(\r\n schemaOrOpenApi: ZodType | OpenApiSchemaObject | undefined\r\n): OpenApiSchemaObject | undefined {\r\n if (!schemaOrOpenApi) {\r\n return undefined;\r\n }\r\n \r\n if (isZodSchema(schemaOrOpenApi)) {\r\n return zodToOpenApi(schemaOrOpenApi);\r\n }\r\n \r\n // Already an OpenAPI schema object\r\n return schemaOrOpenApi as OpenApiSchemaObject;\r\n}\r\n","import type { FastifyInstance, FastifyPluginAsync } from 'fastify';\nimport fp from 'fastify-plugin';\nimport fastifySwagger from '@fastify/swagger';\nimport fastifySwaggerUI, { type FastifySwaggerUiOptions } from '@fastify/swagger-ui';\n\nimport { OpenApiGenerator } from '../openapi/generator.js';\nimport type { SwaggerConfig, OpenApiDocument, OpenApiInfoObject } from '../types.js';\nimport { registry } from '@riktajs/core';\n\n// Type for any class constructor\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Constructor<T = unknown> = new (...args: any[]) => T;\n\n/**\n * Swagger plugin options\n */\nexport interface SwaggerPluginOptions {\n /**\n * Swagger/OpenAPI configuration\n */\n config?: SwaggerConfig;\n\n /**\n * API Info (title, version, description, etc.)\n * Can also be provided via config.info\n */\n info?: OpenApiInfoObject;\n\n /**\n * Controllers to document (optional - will auto-discover from registry if not provided)\n */\n controllers?: Constructor[];\n\n /**\n * Path to serve the OpenAPI JSON specification\n * @default '/docs/json'\n */\n jsonPath?: string;\n\n /**\n * Path to serve the Swagger UI\n * @default '/docs'\n */\n uiPath?: string;\n\n /**\n * Whether to expose the Swagger UI\n * @default true\n */\n exposeUI?: boolean;\n\n /**\n * Whether to expose the OpenAPI JSON specification\n * @default true\n */\n exposeSpec?: boolean;\n\n /**\n * Logo configuration for Swagger UI\n */\n logo?: {\n url: string;\n altText?: string;\n backgroundColor?: string;\n };\n\n /**\n * Swagger UI theme\n * @default 'default'\n */\n theme?: 'default' | 'dark';\n\n /**\n * Transform the OpenAPI specification before serving\n */\n transform?: (spec: OpenApiDocument) => OpenApiDocument | Promise<OpenApiDocument>;\n}\n\n/**\n * Default plugin options\n */\nconst DEFAULT_OPTIONS: Required<Pick<SwaggerPluginOptions, 'jsonPath' | 'uiPath' | 'exposeUI' | 'exposeSpec'>> = {\n jsonPath: '/docs/json',\n uiPath: '/docs',\n exposeUI: true,\n exposeSpec: true,\n};\n\n/**\n * Swagger plugin implementation\n * \n * Registers @fastify/swagger and @fastify/swagger-ui with automatic\n * OpenAPI specification generation from Rikta controllers.\n */\nasync function swaggerPluginImpl(\n fastify: FastifyInstance,\n options: SwaggerPluginOptions\n): Promise<void> {\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const { jsonPath, uiPath, exposeUI, exposeSpec, controllers, config, info, transform } = mergedOptions;\n\n // Build info object from options or config\n const apiInfo: OpenApiInfoObject = info || config?.info || {\n title: 'API Documentation',\n version: '1.0.0',\n };\n\n // Create OpenAPI generator\n const generator = new OpenApiGenerator({\n ...config,\n info: apiInfo,\n });\n\n // Get controllers to document\n const controllersToDocument = controllers || registry.getControllers();\n \n // Add controllers to generator\n for (const controller of controllersToDocument) {\n generator.addController(controller);\n }\n\n // Add security schemes from config\n if (config?.securitySchemes) {\n for (const [name, scheme] of Object.entries(config.securitySchemes)) {\n generator.addSecurityScheme(name, scheme);\n }\n }\n\n // Generate OpenAPI specification\n let spec = generator.generate();\n\n // Apply transform if provided\n if (transform) {\n spec = await transform(spec);\n }\n\n // Register @fastify/swagger with static specification\n await fastify.register(fastifySwagger, {\n mode: 'static',\n specification: {\n document: spec as never, // Type assertion needed due to fastify-swagger types\n },\n });\n\n // Register @fastify/swagger-ui if enabled\n if (exposeUI) {\n const uiOptions: FastifySwaggerUiOptions = {\n routePrefix: uiPath,\n uiConfig: {\n docExpansion: 'list',\n deepLinking: true,\n displayRequestDuration: true,\n filter: true,\n syntaxHighlight: {\n activate: true,\n theme: mergedOptions.theme === 'dark' ? 'monokai' : 'agate',\n },\n },\n staticCSP: true,\n transformStaticCSP: (header) => header,\n };\n\n // Add logo if provided\n if (mergedOptions.logo) {\n uiOptions.logo = {\n type: 'image/png',\n content: mergedOptions.logo.url,\n href: mergedOptions.logo.url,\n };\n }\n\n await fastify.register(fastifySwaggerUI, uiOptions);\n }\n\n // Add JSON spec route if enabled\n // @fastify/swagger-ui registers routes at {uiPath}/json when UI is enabled\n // So we only add custom route if:\n // 1. UI is disabled (no swagger-ui default route exists)\n // 2. jsonPath differs from swagger-ui default path\n const defaultSwaggerUIJsonPath = `${uiPath}/json`;\n const shouldRegisterCustomJsonRoute = exposeSpec && (\n !exposeUI || \n (jsonPath !== defaultSwaggerUIJsonPath && jsonPath !== '/docs/json')\n );\n \n if (shouldRegisterCustomJsonRoute) {\n fastify.get(jsonPath, {\n schema: {\n hide: true,\n },\n }, async () => {\n return spec;\n });\n }\n\n // Store spec on fastify instance for later access\n fastify.decorate('openApiSpec', spec);\n}\n\n// Declaration merging for fastify instance\ndeclare module 'fastify' {\n interface FastifyInstance {\n openApiSpec?: OpenApiDocument;\n }\n}\n\n/**\n * Swagger plugin for Fastify/Rikta\n * \n * Automatically generates OpenAPI documentation from Rikta controllers\n * and serves Swagger UI for interactive API exploration.\n * \n * @example\n * ```typescript\n * import { RiktaFactory } from '@riktajs/core';\n * import { swaggerPlugin } from '@riktajs/swagger';\n * \n * const app = await RiktaFactory.create();\n * \n * await app.register(swaggerPlugin, {\n * info: {\n * title: 'My API',\n * version: '1.0.0',\n * description: 'API documentation for My App',\n * },\n * config: {\n * servers: [\n * { url: 'http://localhost:3000', description: 'Development' },\n * ],\n * },\n * });\n * \n * // Swagger UI available at /docs\n * // OpenAPI JSON at /docs/json\n * ```\n */\nexport const swaggerPlugin: FastifyPluginAsync<SwaggerPluginOptions> = fp(\n swaggerPluginImpl,\n {\n fastify: '>=4.0.0',\n name: '@riktajs/swagger',\n dependencies: [],\n }\n);\n\n/**\n * Register swagger plugin with a Rikta application\n * \n * Helper function that provides a simpler API for registering the plugin.\n * \n * @param app - Fastify instance\n * @param options - Swagger plugin options\n * \n * @example\n * ```typescript\n * import { RiktaFactory } from '@riktajs/core';\n * import { registerSwagger } from '@riktajs/swagger';\n * \n * const app = await RiktaFactory.create();\n * \n * await registerSwagger(app, {\n * info: {\n * title: 'My API',\n * version: '1.0.0',\n * },\n * });\n * ```\n */\nexport async function registerSwagger(\n app: FastifyInstance,\n options: SwaggerPluginOptions = {}\n): Promise<void> {\n await app.register(swaggerPlugin, options);\n}\n\n/**\n * Create a standalone Swagger configuration for manual use\n * \n * Use this when you need more control over the Swagger setup,\n * or when integrating with an existing Fastify application.\n * \n * @param options - Swagger plugin options\n * @returns Object containing swagger and swaggerUI options and specification\n * \n * @example\n * ```typescript\n * import fastify from 'fastify';\n * import fastifySwagger from '@fastify/swagger';\n * import fastifySwaggerUI from '@fastify/swagger-ui';\n * import { createSwaggerConfig } from '@riktajs/swagger';\n * \n * const app = fastify();\n * const { swaggerOptions, swaggerUIOptions, specification } = createSwaggerConfig({\n * info: { title: 'My API', version: '1.0.0' },\n * controllers: [UserController, ProductController],\n * });\n * \n * await app.register(fastifySwagger, swaggerOptions);\n * await app.register(fastifySwaggerUI, swaggerUIOptions);\n * ```\n */\nexport function createSwaggerConfig(options: SwaggerPluginOptions = {}): {\n swaggerOptions: {\n mode: 'static';\n specification: { document: OpenApiDocument };\n };\n swaggerUIOptions: FastifySwaggerUiOptions;\n specification: OpenApiDocument;\n} {\n const mergedOptions = { ...DEFAULT_OPTIONS, ...options };\n const { uiPath, controllers, config, info } = mergedOptions;\n\n // Build info object\n const apiInfo: OpenApiInfoObject = info || config?.info || {\n title: 'API Documentation',\n version: '1.0.0',\n };\n\n // Create generator\n const generator = new OpenApiGenerator({\n ...config,\n info: apiInfo,\n });\n\n // Add controllers\n const controllersToDocument = controllers || registry.getControllers();\n for (const controller of controllersToDocument) {\n generator.addController(controller);\n }\n\n // Add security schemes\n if (config?.securitySchemes) {\n for (const [name, scheme] of Object.entries(config.securitySchemes)) {\n generator.addSecurityScheme(name, scheme);\n }\n }\n\n const specification = generator.generate();\n\n return {\n swaggerOptions: {\n mode: 'static',\n specification: { document: specification },\n },\n swaggerUIOptions: {\n routePrefix: uiPath,\n uiConfig: {\n docExpansion: 'list',\n deepLinking: true,\n displayRequestDuration: true,\n filter: true,\n },\n },\n specification,\n };\n}\n"],"mappings":"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","names":["API_TAGS_METADATA","Symbol","for","API_OPERATION_METADATA","API_RESPONSE_METADATA","API_PROPERTY_METADATA","API_BODY_METADATA","API_PARAM_METADATA","API_QUERY_METADATA","API_HEADER_METADATA","API_SECURITY_METADATA","API_EXCLUDE_METADATA","API_DEPRECATED_METADATA","import_core","ApiTags","tags","target","propertyKey","descriptor","undefined","existingTags","Reflect","getMetadata","API_TAGS_METADATA","defineMetadata","getApiTags","methodTags","prototype","classTags","Set","import_reflect_metadata","ApiOperation","options","target","propertyKey","descriptor","Reflect","defineMetadata","API_OPERATION_METADATA","getApiOperation","getMetadata","prototype","import_reflect_metadata","ApiResponse","options","target","propertyKey","descriptor","existingResponses","Reflect","getMetadata","API_RESPONSE_METADATA","defineMetadata","ApiOkResponse","status","ApiCreatedResponse","ApiAcceptedResponse","ApiNoContentResponse","ApiBadRequestResponse","description","ApiUnauthorizedResponse","ApiForbiddenResponse","ApiNotFoundResponse","ApiConflictResponse","ApiUnprocessableEntityResponse","ApiInternalServerErrorResponse","getApiResponses","prototype","import_reflect_metadata","ApiBody","options","target","propertyKey","descriptor","Reflect","defineMetadata","API_BODY_METADATA","required","getApiBody","getMetadata","prototype","import_reflect_metadata","ApiParam","options","target","propertyKey","descriptor","existingParams","Reflect","getMetadata","API_PARAM_METADATA","defineMetadata","required","getApiParams","prototype","import_reflect_metadata","ApiQuery","options","target","propertyKey","descriptor","existingQueries","Reflect","getMetadata","API_QUERY_METADATA","defineMetadata","required","getApiQueries","prototype","import_reflect_metadata","ApiHeader","options","target","propertyKey","descriptor","existingHeaders","Reflect","getMetadata","API_HEADER_METADATA","defineMetadata","getApiHeaders","prototype","import_reflect_metadata","ApiSecurity","name","scopes","target","propertyKey","descriptor","security","undefined","Reflect","defineMetadata","API_SECURITY_METADATA","ApiBearerAuth","ApiBasicAuth","ApiOAuth2","ApiCookieAuth","getApiSecurity","methodSecurity","getMetadata","prototype","import_reflect_metadata","ApiProperty","options","target","propertyKey","existingProperties","Reflect","getMetadata","API_PROPERTY_METADATA","defineMetadata","ApiPropertyOptional","required","ApiHideProperty","_hidden","getApiProperties","import_reflect_metadata","ApiExcludeEndpoint","target","propertyKey","descriptor","Reflect","defineMetadata","API_EXCLUDE_METADATA","ApiExcludeController","isApiExcluded","getMetadata","undefined","prototype","ApiDeprecated","message","API_DEPRECATED_METADATA","deprecated","getApiDeprecated","import_reflect_metadata","isZodSchema","value","safeParse","jsonSchemaToOpenApi","jsonSchema","not","result","schema","Array","isArray","type","types","nullIndex","indexOf","nullable","nonNullTypes","filter","t","length","oneOf","map","simpleProps","prop","undefined","items","properties","key","Object","entries","additionalProperties","allOf","anyOf","const","enum","zodToOpenApi","z","toJSONSchema","target","unrepresentable","override","ctx","def","zodSchema","_zod","format","toOpenApiSchema","schemaOrOpenApi","DEFAULT_SWAGGER_CONFIG","info","title","version","OpenApiGenerator","config","controllers","globalSecuritySchemes","Map","description","contact","license","termsOfService","restConfig","addController","controller","push","addControllers","addSecurityScheme","name","scheme","set","generate","paths","tags","seenTags","Set","isControllerExcluded","controllerMeta","getControllerMeta","controllerTags","getControllerTags","controllerDeprecated","isControllerDeprecated","tag","has","add","routes","getControllerRoutes","route","isEndpointExcluded","handlerName","fullPath","normalizePath","prefix","path","method","toLowerCase","operation","buildOperation","securitySchemes","buildSecuritySchemes","document","openapi","length","servers","Object","keys","components","externalDocs","getControllerMetadata","getRoutes","getClassMetadata","API_TAGS_METADATA","API_EXCLUDE_METADATA","API_DEPRECATED_METADATA","getMethodMetadata","isEndpointDeprecated","controllerLevel","methodLevel","deprecated","getOperationMetadata","API_OPERATION_METADATA","getResponseMetadata","API_RESPONSE_METADATA","getBodyMetadata","API_BODY_METADATA","getSwaggerParamMetadata","API_PARAM_METADATA","getQueryMetadata","API_QUERY_METADATA","getHeaderMetadata","API_HEADER_METADATA","getSecurityMetadata","API_SECURITY_METADATA","result","Array","isArray","getMethodTags","getHttpStatusCode","getHttpCode","getCoreParams","getCoreParamMetadata","startsWith","cleanPath","replace","endsWith","slice","operationMeta","methodTags","responses","summary","operationId","parameters","buildParameters","includes","requestBody","buildRequestBody","buildResponses","statusCode","security","map","s","scopes","routePath","pathParams","extractPathParams","paramDecorators","queryDecorators","headerDecorators","coreParams","usedPathParams","param","baseSchema","toOpenApiSchema","schema","fallbackSchema","type","format","in","required","example","paramName","coreParam","find","p","ParamType","PARAM","key","zodSchema","zodToOpenApi","query","header","params","regex","match","exec","bodyMeta","content","items","bodyParam","BODY","undefined","defaultStatusCode","responseMeta","httpCode","response","status","toString","getDefaultStatusDescription","Number","descriptions","schemes","options","bearerFormat","flows","import_core","DEFAULT_OPTIONS","jsonPath","uiPath","exposeUI","exposeSpec","swaggerPluginImpl","fastify","options","mergedOptions","controllers","config","info","transform","apiInfo","title","version","generator","OpenApiGenerator","controllersToDocument","registry","getControllers","controller","addController","securitySchemes","name","scheme","Object","entries","addSecurityScheme","spec","generate","register","fastifySwagger","mode","specification","document","uiOptions","routePrefix","uiConfig","docExpansion","deepLinking","displayRequestDuration","filter","syntaxHighlight","activate","theme","staticCSP","transformStaticCSP","header","logo","type","content","url","href","fastifySwaggerUI","defaultSwaggerUIJsonPath","shouldRegisterCustomJsonRoute","get","schema","hide","decorate","swaggerPlugin","fp","dependencies","registerSwagger","app","createSwaggerConfig","swaggerOptions","swaggerUIOptions"]}
|