{"version":3,"file":"index.cjs","names":["SwaggerModule"],"sources":["../src/constants.ts","../src/dtos/index.ts","../src/decorators/index.ts","../src/swagger.service.ts"],"sourcesContent":["export const API_RESPONSE_DESCRIPTION =\n  \"If the server is available, it always responds with code 200 or 201. Error code 400 and higher will replace the ok field: it equals false and the error text in the error field. If the input data does not pass validation, the error field contains an object with invalid fields and error text\";\n\nexport const ERROR_DESCRIPTIONS = {\n  BAD_REQUEST: \"Invalid request data or parameters\",\n  UNAUTHORIZED: \"Authentication required\",\n  FORBIDDEN: \"Access denied\",\n  NOT_FOUND: \"Resource not found\",\n  CONFLICT: \"Resource already exists or conflict detected\",\n  UNPROCESSABLE_ENTITY: \"Validation error\",\n  RATE_LIMIT_EXCEEDED: \"Rate limit exceeded. Too many requests\",\n  INTERNAL_SERVER_ERROR: \"Internal server error\",\n  SERVICE_UNAVAILABLE: \"Service temporarily unavailable\",\n};\n","import { ApiProperty } from \"@nestjs/swagger\";\n\nexport class PaginatedResponseDto<T> {\n  data!: T[];\n\n  @ApiProperty()\n  totalCount!: number;\n\n  @ApiProperty()\n  offset!: number;\n\n  @ApiProperty()\n  limit!: number;\n}\n","import { applyDecorators } from \"@nestjs/common\";\nimport {\n  ApiBadRequestResponse,\n  ApiConflictResponse,\n  ApiExtraModels,\n  ApiForbiddenResponse,\n  ApiInternalServerErrorResponse,\n  ApiNotFoundResponse,\n  ApiOkResponse,\n  ApiOperation,\n  ApiServiceUnavailableResponse,\n  ApiTooManyRequestsResponse,\n  ApiUnauthorizedResponse,\n  ApiUnprocessableEntityResponse,\n  getSchemaPath,\n} from \"@nestjs/swagger\";\nimport { API_RESPONSE_DESCRIPTION } from \"../constants\";\nimport { PaginatedResponseDto } from \"../dtos\";\nimport { SwaggerDocumentationOptions } from \"../interfaces\";\nimport { createHash } from \"crypto\";\n\n// SwaggerDocumentation is a decorator function to generate Swagger documentation for endpoints based on the provided options.\nexport const SwaggerDocumentation = (data: SwaggerDocumentationOptions) => {\n  const operationId = data.operationId;\n\n  const decorators = [\n    ApiOperation({\n      operationId,\n      description: data.endpointDescription,\n      summary: data.endpointSummary,\n      deprecated: data.deprecated,\n    }),\n  ];\n\n  if (data.error400Description) {\n    decorators.push(\n      ApiBadRequestResponse({\n        description: data.error400Description,\n      })\n    );\n  }\n\n  if (data.error401Description) {\n    decorators.push(\n      ApiUnauthorizedResponse({\n        description: data.error401Description,\n      })\n    );\n  }\n\n  if (data.error403Description) {\n    decorators.push(\n      ApiForbiddenResponse({\n        description: data.error403Description,\n      })\n    );\n  }\n\n  if (data.error404Description) {\n    decorators.push(\n      ApiNotFoundResponse({\n        description: data.error404Description,\n      })\n    );\n  }\n\n  if (data.error409Description) {\n    decorators.push(\n      ApiConflictResponse({\n        description: data.error409Description,\n      })\n    );\n  }\n\n  if (data.error422Description) {\n    decorators.push(\n      ApiUnprocessableEntityResponse({\n        description: data.error422Description,\n      })\n    );\n  }\n\n  if (data.error429Description) {\n    decorators.push(\n      ApiTooManyRequestsResponse({\n        description: data.error429Description,\n      })\n    );\n  }\n\n  if (data.error500Description) {\n    decorators.push(\n      ApiInternalServerErrorResponse({\n        description: data.error500Description,\n      })\n    );\n  }\n\n  if (data.error503Description) {\n    decorators.push(\n      ApiServiceUnavailableResponse({\n        description: data.error503Description,\n      })\n    );\n  }\n\n  if (data.isPaginated && data.responseDto) {\n    decorators.push(\n      ApiOkResponse({\n        schema: {\n          allOf: [\n            { $ref: getSchemaPath(PaginatedResponseDto) },\n            {\n              properties: {\n                data: {\n                  type: \"array\",\n                  items: {\n                    $ref: getSchemaPath(data.responseDto),\n                  },\n                },\n              },\n            },\n          ],\n        },\n        description: API_RESPONSE_DESCRIPTION,\n      }),\n      ApiExtraModels(data.responseDto, PaginatedResponseDto)\n    );\n  } else if (data.responseDto) {\n    decorators.push(\n      ApiOkResponse({\n        schema: data.isArray\n          ? {\n              type: \"array\",\n              items: { $ref: getSchemaPath(data.responseDto) },\n            }\n          : { $ref: getSchemaPath(data.responseDto) },\n        description: API_RESPONSE_DESCRIPTION,\n      }),\n      ApiExtraModels(data.responseDto)\n    );\n  } else {\n    decorators.push(\n      ApiOkResponse({\n        description: API_RESPONSE_DESCRIPTION,\n      })\n    );\n  }\n\n  return applyDecorators(...decorators);\n};\n","import { INestApplication, Injectable } from '@nestjs/common';\nimport { OpenAPIObject, SwaggerModule } from '@nestjs/swagger';\nimport { cleanupOpenApiDoc } from '@globalart/nestjs-zod';\n\ntype Paths = OpenAPIObject['paths'];\n\nclass OpenApiDocsBuilder {\n  constructor(\n    private readonly doc: OpenAPIObject,\n    private readonly metaTags: string[],\n  ) {}\n\n  stripMetaTags(): OpenAPIObject {\n    return this.mapOperations((op) => ({ ...op, tags: this.removeMeta(op.tags) }));\n  }\n\n  filterByTags(tags: string[]): OpenAPIObject {\n    const filteredPaths: Paths = {};\n    for (const [path, methods] of Object.entries(this.doc.paths ?? {})) {\n      const filteredMethods: Record<string, unknown> = {};\n      for (const [method, operation] of Object.entries(methods as Record<string, unknown>)) {\n        const op = operation as { tags?: string[] };\n        if (op.tags?.some((t) => tags.includes(t))) {\n          filteredMethods[method] = { ...op, tags: this.removeMeta(op.tags) };\n        }\n      }\n      if (Object.keys(filteredMethods).length > 0) {\n        filteredPaths[path] = filteredMethods as Paths[string];\n      }\n    }\n    return { ...this.doc, paths: filteredPaths };\n  }\n\n  private mapOperations(fn: (op: { tags?: string[] }) => unknown): OpenAPIObject {\n    const paths: Paths = {};\n    for (const [path, methods] of Object.entries(this.doc.paths ?? {})) {\n      const mapped: Record<string, unknown> = {};\n      for (const [method, operation] of Object.entries(methods as Record<string, unknown>)) {\n        mapped[method] = fn(operation as { tags?: string[] });\n      }\n      paths[path] = mapped as Paths[string];\n    }\n    return { ...this.doc, paths };\n  }\n\n  private removeMeta(tags?: string[]): string[] {\n    return (tags ?? []).filter((t) => !this.metaTags.includes(t));\n  }\n}\n\ninterface Version {\n  name: string;\n  url: string;\n  config: Omit<OpenAPIObject, 'paths'>;\n  filterTags?: string[];\n}\n\n@Injectable()\nexport class SwaggerService {\n  private app: INestApplication | null = null;\n  private documents: Record<string, OpenAPIObject> = {};\n  private versions: Version[] = [];\n  private metaTags: string[] = [];\n  private zod = false;\n\n  setApp(app: any) {\n    this.app = app;\n  }\n\n  setVersions(versions: Version[]) {\n    this.versions = versions;\n  }\n\n  setMetaTags(tags: string[]) {\n    this.metaTags = tags;\n  }\n\n  getDocument(key: string, serverUrl?: string): OpenAPIObject | undefined {\n    const doc = this.documents[key];\n    if (!doc) return undefined;\n    if (!serverUrl) return doc;\n    return { ...doc, servers: [{ url: serverUrl }] };\n  }\n\n  formatZod() {\n    this.zod = true;\n    for (const key of Object.keys(this.documents)) {\n      this.documents[key] = cleanupOpenApiDoc(this.documents[key]);\n    }\n  }\n\n  init() {\n    if (!this.app) {\n      throw new Error('App not found');\n    }\n\n    for (const version of this.versions) {\n      const { config, filterTags, url } = version;\n      const tempDoc = SwaggerModule.createDocument(this.app, config);\n      const builder = new OpenApiDocsBuilder(tempDoc, this.metaTags);\n\n      const document = filterTags?.length\n        ? builder.filterByTags(filterTags)\n        : builder.stripMetaTags();\n\n      if (this.zod) {\n        this.documents[version.name] = cleanupOpenApiDoc(document);\n        SwaggerModule.setup(url, this.app, cleanupOpenApiDoc(document));\n      } else {\n        this.documents[version.name] = document;\n        SwaggerModule.setup(url, this.app, document);\n      }\n    }\n  }\n}\n"],"mappings":"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"}