{"version":3,"sources":["../src/serializers/transformer/yaml.ts","../src/utils.ts","../src/swagger/extend-swagger-spec.ts","../src/swagger/api/swagger-handler.ts"],"names":["yamlTransformer","data","stringify","yaml_default","toHeaderCase","string_","c","jsonMediaType","prepareStatusContent","methodSpec","status","mediaType","extendComponentSchemas","spec","schemaName","schema","extendResponseSchema","schemaIsArray","extendSwaggerWithMediaTypeSchema","responseSpec","allowedMediaTypes","pathKey","example","examples","mediaName","contentSpec","allowed","extendSwaggerWithMediaTypeExample","transformers","transformed","regex","transformer","extendComponentExamples","exampleName","prepareResponseExamples","transformedExamples","extendSwaggerWithMediaTypeExamples","examplesName","extendSwaggerSpec","value","toXML","pathSpec","swaggerCrudDebug","debug","swaggerHandler","options","crud","specs","swaggerFilePath","request","response","swaggerPath","join","existsSync","fileContents","readFileSync","crudSwagger","modelsOpenApi","modelsToOpenApi","merge","error","swagger_handler_default"],"mappings":"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","file":"chunk-67LLYNYS.mjs","sourcesContent":["import { stringify } from \"yaml\";\n\nimport type { Serializer } from \"../types\";\n\nconst yamlTransformer: Serializer = (data) => stringify(data, { indent: 2 });\n\nexport default yamlTransformer;\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { URL } from \"node:url\";\n\ntype IncomingApiRequest<TApiRequest = IncomingMessage> = TApiRequest & {\n    body?: any;\n    query?: any;\n};\n\nexport const jsonResponse = (response: ServerResponse, status: number, data?: unknown): void => {\n    response.statusCode = status;\n    response.setHeader(\"Content-Type\", \"application/json\");\n    response.end(data ? JSON.stringify(data) : \"\");\n};\n\nexport const parseBody = async (request: IncomingApiRequest): Promise<any> => {\n    if (request.body) {\n        return request.body;\n    }\n\n    const buffers = [];\n\n    // eslint-disable-next-line no-restricted-syntax,no-loops/no-loops\n    for await (const chunk of request) {\n        buffers.push(chunk);\n    }\n\n    const data = Buffer.concat(buffers).toString();\n\n    return data ? JSON.parse(data) : null;\n};\n\nexport const parseQuery = (request: IncomingApiRequest): Record<string, unknown> => {\n    if (request.query) {\n        return request.query;\n    }\n\n    if (!request.url) {\n        return {};\n    }\n\n    // Note: Fake protocol is required to parse query string\n    const url = new URL(`https://${request.headers.host?.replace(/\\/$/u, \"\")}/${request.url}`);\n\n    return Object.fromEntries(url.searchParams.entries());\n};\n\nexport const toHeaderCase = (string_: string): string =>\n    string_\n        .toLowerCase()\n        .replaceAll(/[^\\s\\w]/gu, \" \") // Remove all non-word characters\n        .trimEnd() // Remove trailing spaces\n        .replaceAll(/\\s+|_/gu, \"-\") // Replace multiple spaces or underline with a single hyphen\n        .replaceAll(/\\b\\w/gu, (c) => c.toUpperCase());\n","import type { XmlElement } from \"jstoxml\";\nimport { toXML } from \"jstoxml\";\nimport type { OpenAPIV3 } from \"openapi-types\";\nimport { stringify } from \"yaml\";\n\nimport { toHeaderCase } from \"../utils\";\n\ntype Transformers = { regex: RegExp; transformer: (data: any) => string }[];\n\nconst jsonMediaType = \"application/json\";\n\nconst prepareStatusContent = (methodSpec: OpenAPIV3.OperationObject, status: string, mediaType: string) => {\n    if (((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content === undefined) {\n        // eslint-disable-next-line no-param-reassign\n        ((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content = {};\n    }\n\n    if (((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content?.[mediaType] === undefined) {\n        // prettier-ignore\n        // eslint-disable-next-line no-param-reassign\n        (((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n                string,\n                OpenAPIV3.MediaTypeObject\n            >)[\n            mediaType\n        ] = {} as OpenAPIV3.MediaTypeObject;\n    }\n};\n\nconst extendComponentSchemas = (spec: Partial<OpenAPIV3.Document>, schemaName: string, schema: OpenAPIV3.SchemaObject) => {\n    if (typeof spec.components !== \"object\") {\n        // eslint-disable-next-line no-param-reassign\n        spec.components = {};\n    }\n\n    if (typeof spec.components.schemas !== \"object\") {\n        // eslint-disable-next-line no-param-reassign\n        spec.components.schemas = {};\n    }\n\n    if (spec.components.schemas[schemaName] === undefined) {\n        // eslint-disable-next-line no-param-reassign\n        spec.components.schemas[schemaName] = schema;\n    }\n};\n\nconst extendResponseSchema = (methodSpec: OpenAPIV3.OperationObject, status: string, mediaType: string, schemaName: string, schemaIsArray: boolean) => {\n    prepareStatusContent(methodSpec, status, mediaType);\n\n    if (((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content?.[mediaType]?.schema === undefined) {\n        // prettier-ignore\n        // eslint-disable-next-line no-param-reassign\n        ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n                    string,\n                    OpenAPIV3.MediaTypeObject\n                >)[\n                mediaType\n            ] as OpenAPIV3.MediaTypeObject).schema =\n            {} as OpenAPIV3.SchemaObject;\n    }\n\n    // prettier-ignore\n    // eslint-disable-next-line no-param-reassign\n    ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n                string,\n                OpenAPIV3.MediaTypeObject\n            >)[\n            mediaType\n        ] as OpenAPIV3.MediaTypeObject).schema =\n        schemaIsArray\n            ? {\n                  items: {\n                      $ref: `#/components/schemas/${schemaName}`,\n                  },\n                  type: \"array\",\n              }\n            : {\n                  $ref: `#/components/schemas/${schemaName}`,\n              };\n};\n\nconst extendSwaggerWithMediaTypeSchema = (\n    methodSpec: OpenAPIV3.OperationObject,\n    responseSpec: OpenAPIV3.ResponseObject,\n    allowedMediaTypes: Record<string, boolean> | undefined,\n    pathKey: string,\n    spec: Partial<OpenAPIV3.Document>,\n    status: string,\n): {\n    example?: any;\n    examples?: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject>;\n} => {\n    let example: any | undefined;\n    let examples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject> | undefined;\n\n    // eslint-disable-next-line sonarjs/cognitive-complexity\n    Object.entries(responseSpec.content as object).forEach(([mediaName, contentSpec]) => {\n        if (typeof contentSpec.schema === \"object\") {\n            const { schema } = contentSpec;\n\n            if (mediaName === jsonMediaType && contentSpec.examples !== undefined) {\n                examples = contentSpec.examples;\n            } else if (mediaName === jsonMediaType && contentSpec.example !== undefined) {\n                example = contentSpec.example;\n            }\n\n            const schemaIsArray = (schema as OpenAPIV3.SchemaObject).type === \"array\";\n\n            Object.entries(allowedMediaTypes ?? {}).forEach(([mediaType, allowed]) => {\n                if (!allowed) {\n                    return;\n                }\n\n                let schemaName: string;\n\n                if (schema?.$ref === undefined) {\n                    schemaName = `${toHeaderCase(pathKey.trim().replace(\"/\", \"\"))}${mediaType === \"application/ld+json\" ? \".jsonld\" : \"\"}`;\n\n                    extendComponentSchemas(spec as OpenAPIV3.Document, schemaName, schema as OpenAPIV3.SchemaObject);\n                } else {\n                    schemaName = (schema as OpenAPIV3.ReferenceObject).$ref.replace(\"#/components/schemas/\", \"\");\n                }\n\n                extendResponseSchema(methodSpec, status, mediaType, schemaName, schemaIsArray);\n            });\n        }\n    });\n\n    return { example, examples };\n};\n\nconst extendSwaggerWithMediaTypeExample = (\n    methodSpec: OpenAPIV3.OperationObject,\n    responseSpec: OpenAPIV3.ResponseObject,\n    status: string,\n    allowedMediaTypes: Record<string, boolean> | undefined,\n    transformers: Transformers,\n    example: any,\n) => {\n    Object.keys(responseSpec.content as object).forEach((mediaName) => {\n        if (mediaName === jsonMediaType) {\n            return;\n        }\n\n        Object.entries(allowedMediaTypes ?? {}).forEach(([mediaType, allowed]) => {\n            if (!allowed) {\n                return;\n            }\n\n            prepareStatusContent(methodSpec, status, mediaType);\n\n            if (\n                ((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content?.[mediaType]?.example === undefined\n            ) {\n                // prettier-ignore\n                // eslint-disable-next-line no-param-reassign\n                ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n                            string,\n                            OpenAPIV3.MediaTypeObject\n                        >)[\n                        mediaType\n                    ] as OpenAPIV3.MediaTypeObject).example =\n                    {};\n            }\n\n            let transformed = false;\n\n            transformers.forEach(({ regex, transformer }) => {\n                if (!transformed && regex.test(mediaType)) {\n                    // prettier-ignore\n                    // eslint-disable-next-line no-param-reassign\n                    ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n                                string,\n                                OpenAPIV3.MediaTypeObject\n                            >)[\n                            mediaType\n                        ] as OpenAPIV3.MediaTypeObject).example =\n                        transformer(example);\n\n                    transformed = true;\n                }\n            });\n\n            if (!transformed) {\n                // prettier-ignore\n                // eslint-disable-next-line no-param-reassign\n                ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n                            string,\n                            OpenAPIV3.MediaTypeObject\n                        >)[\n                        mediaType\n                    ] as OpenAPIV3.MediaTypeObject).example =\n                    example;\n            }\n        });\n    });\n};\n\nconst extendComponentExamples = (\n    spec: Partial<OpenAPIV3.Document>,\n    exampleName: string,\n    examples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject>,\n) => {\n    if (typeof spec.components !== \"object\") {\n        // eslint-disable-next-line no-param-reassign\n        spec.components = {};\n    }\n\n    if (typeof spec.components.examples !== \"object\") {\n        // eslint-disable-next-line no-param-reassign\n        spec.components.examples = {};\n    }\n\n    if (spec.components.examples[exampleName] === undefined && examples[exampleName] !== undefined) {\n        // eslint-disable-next-line no-param-reassign\n        spec.components.examples[exampleName] = examples[exampleName] as OpenAPIV3.ExampleObject;\n    }\n};\n\nconst prepareResponseExamples = (\n    spec: Partial<OpenAPIV3.Document>,\n    methodSpec: OpenAPIV3.OperationObject,\n    status: string,\n    mediaType: string,\n    transformers: Transformers,\n    examples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject>,\n    // eslint-disable-next-line sonarjs/cognitive-complexity\n) => {\n    prepareStatusContent(methodSpec, status, mediaType);\n\n    if (((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content?.[mediaType]?.examples === undefined) {\n        // prettier-ignore\n        // eslint-disable-next-line no-param-reassign\n        ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n                    string,\n                    OpenAPIV3.MediaTypeObject\n                >)[\n                mediaType\n            ] as OpenAPIV3.MediaTypeObject).examples =\n            {};\n    }\n\n    const transformedExamples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject> = {};\n\n    Object.entries(examples).forEach(([exampleName, example]) => {\n        let transformed = false;\n\n        transformers.forEach(({ regex, transformer }) => {\n            if (!transformed && regex.test(mediaType)) {\n                let data: any = \"\";\n\n                if (spec.components?.examples?.[exampleName]) {\n                    data = (spec.components.examples[exampleName] as OpenAPIV3.ExampleObject).value;\n                } else if ((example as OpenAPIV3.ReferenceObject).$ref) {\n                    data = (\n                        spec.components?.examples?.[\n                            (example as OpenAPIV3.ReferenceObject).$ref.replace(\"#/components/examples/\", \"\")\n                        ] as OpenAPIV3.ExampleObject\n                    ).value;\n                } else if (typeof (example as OpenAPIV3.ExampleObject).value === \"string\") {\n                    data = (example as OpenAPIV3.ExampleObject).value;\n                }\n\n                transformedExamples[exampleName] = {\n                    value: transformer(data),\n                };\n\n                transformed = true;\n            }\n        });\n\n        if (!transformed) {\n            transformedExamples[exampleName] =\n                spec.components?.examples?.[exampleName] === undefined\n                    ? example\n                    : {\n                          $ref: `#/components/examples/${exampleName}`,\n                      };\n        }\n    });\n\n    // prettier-ignore\n    // eslint-disable-next-line no-param-reassign\n    ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n                string,\n                OpenAPIV3.MediaTypeObject\n            >)[\n            mediaType\n        ] as OpenAPIV3.MediaTypeObject).examples =\n        transformedExamples;\n};\n\nconst extendSwaggerWithMediaTypeExamples = (\n    spec: Partial<OpenAPIV3.Document>,\n    methodSpec: OpenAPIV3.OperationObject,\n    status: string,\n    responseSpec: OpenAPIV3.ResponseObject,\n    allowedMediaTypes: Record<string, boolean> | undefined,\n    pathKey: string,\n    transformers: Transformers,\n    examples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject>,\n) => {\n    const examplesName = toHeaderCase(pathKey.trim().replace(\"/\", \"\"));\n\n    Object.keys(responseSpec.content as object).forEach((mediaName) => {\n        if (mediaName === jsonMediaType) {\n            return;\n        }\n\n        Object.entries(allowedMediaTypes ?? {}).forEach(([mediaType, allowed]) => {\n            if (!allowed) {\n                return;\n            }\n\n            extendComponentExamples(spec, examplesName, examples);\n\n            prepareResponseExamples(spec, methodSpec, status, mediaType, transformers, examples);\n        });\n    });\n};\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nexport default function extendSwaggerSpec(\n    spec: Partial<OpenAPIV3.Document>,\n    allowedMediaTypes?: Record<string, boolean>,\n    transformers: Transformers = [\n        {\n            regex: /xml/u,\n            transformer: (value: XmlElement | XmlElement[] | undefined) =>\n                toXML(value, {\n                    header: true,\n                    indent: \"  \",\n                }),\n        },\n        {\n            regex: /yaml|yml/,\n            transformer: (value) => stringify(value, { indent: 2 }),\n        },\n    ],\n): Partial<OpenAPIV3.Document> {\n    if (typeof spec === \"object\" && typeof spec.paths === \"object\") {\n        Object.entries(spec.paths).forEach(([pathKey, pathSpec]) => {\n            Object.values(pathSpec as OpenAPIV3.OperationObject & OpenAPIV3.PathsObject).forEach((methodSpec) => {\n                if (typeof (methodSpec as OpenAPIV3.OperationObject).responses === \"object\") {\n                    Object.entries((methodSpec as OpenAPIV3.OperationObject).responses).forEach(([status, responseSpec]) => {\n                        if (typeof (responseSpec as OpenAPIV3.ResponseObject).content === \"object\") {\n                            const { example, examples } = extendSwaggerWithMediaTypeSchema(\n                                methodSpec as OpenAPIV3.OperationObject,\n                                responseSpec as OpenAPIV3.ResponseObject,\n                                allowedMediaTypes,\n                                pathKey,\n                                spec,\n                                status,\n                            );\n\n                            if (example !== undefined) {\n                                extendSwaggerWithMediaTypeExample(\n                                    methodSpec as OpenAPIV3.OperationObject,\n                                    responseSpec as OpenAPIV3.ResponseObject,\n                                    status,\n                                    allowedMediaTypes,\n                                    transformers,\n                                    example,\n                                );\n                            } else if (examples !== undefined) {\n                                extendSwaggerWithMediaTypeExamples(\n                                    spec,\n                                    methodSpec as OpenAPIV3.OperationObject,\n                                    status,\n                                    responseSpec as OpenAPIV3.ResponseObject,\n                                    allowedMediaTypes,\n                                    pathKey,\n                                    transformers,\n                                    examples,\n                                );\n                            }\n                        }\n                    });\n                }\n            });\n        });\n    }\n\n    return spec;\n}\n","import { existsSync, readFileSync } from \"node:fs\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\n\nimport type { ModelsToOpenApiParameters, SwaggerModelsConfig } from \"@visulima/crud\";\nimport { modelsToOpenApi } from \"@visulima/crud\";\nimport { join } from \"@visulima/path\";\nimport debug from \"debug\";\n// eslint-disable-next-line no-restricted-imports\nimport merge from \"lodash.merge\";\nimport type { OpenAPIV3 } from \"openapi-types\";\n\nimport yamlTransformer from \"../../serializers/transformer/yaml\";\nimport extendSwaggerSpec from \"../extend-swagger-spec\";\n\nconst swaggerCrudDebug = debug(\"visulima:api-platform:swagger:crud:get-static-properties-swagger\");\n\nconst swaggerHandler = <M extends string, PrismaClient>(\n    options: Partial<SwaggerHandlerOptions<M, PrismaClient>> = {},\n): ((request: IncomingMessage, response: ServerResponse) => Promise<void>) => {\n    const {\n        allowedMediaTypes = {\n            \"application/json\": true,\n        },\n        crud,\n        specs,\n        swaggerFilePath,\n    } = options;\n\n    return async <Request extends IncomingMessage, Response extends ServerResponse>(request: Request, response: Response) => {\n        const swaggerPath = join(process.cwd(), swaggerFilePath ?? \"swagger/swagger.json\");\n\n        if (!existsSync(swaggerPath)) {\n            throw new Error(`Swagger file not found at \"${swaggerPath}\".`);\n        }\n\n        const fileContents = readFileSync(swaggerPath, \"utf8\");\n\n        let spec = extendSwaggerSpec(JSON.parse(fileContents) as OpenAPIV3.Document, allowedMediaTypes) as OpenAPIV3.Document;\n        let crudSwagger: Partial<OpenAPIV3.Document> = {};\n\n        if (crud !== undefined) {\n            try {\n                const modelsOpenApi = await modelsToOpenApi(crud);\n\n                crudSwagger = {\n                    components: { examples: modelsOpenApi.examples, schemas: modelsOpenApi.schemas },\n                    paths: modelsOpenApi.paths,\n                    tags: modelsOpenApi.tags,\n                };\n\n                crudSwagger = extendSwaggerSpec(crudSwagger, allowedMediaTypes);\n\n                swaggerCrudDebug(JSON.stringify(crudSwagger, null, 2));\n\n                spec = merge(spec, crudSwagger);\n            } catch (error) {\n                // eslint-disable-next-line no-console\n                console.log(error);\n\n                throw new Error(\"Please install @visulima/crud to use the crud swagger generator.\");\n            }\n        }\n\n        if (Array.isArray(specs)) {\n            specs.forEach((value) => {\n                spec = merge(spec, extendSwaggerSpec(value, allowedMediaTypes));\n            });\n        }\n\n        let data: Buffer | Uint8Array | string;\n\n        if (typeof request.headers.accept === \"string\" && /yaml|yml/.test(request.headers.accept)) {\n            response.setHeader(\"Content-Type\", request.headers.accept);\n\n            data = yamlTransformer(spec);\n        } else {\n            response.setHeader(\"Content-Type\", \"application/json\");\n\n            data = JSON.stringify(spec, null, 2);\n        }\n\n        response.statusCode = 200;\n        response.end(data);\n    };\n};\n\nexport interface SwaggerHandlerOptions<M extends string, PrismaClient> {\n    allowedMediaTypes: Record<string, boolean>;\n    crud: Exclude<ModelsToOpenApiParameters<M, PrismaClient>, \"swagger\"> & {\n        swagger?: {\n            models?: SwaggerModelsConfig<M>;\n        };\n    };\n    specs?: Partial<OpenAPIV3.Document>[];\n    swaggerFilePath: string;\n}\n\nexport default swaggerHandler;\n"]}