|
| 1 | +import maskWithReference from "./mask"; |
| 2 | +import type { MediaTypeObject } from "@omer-x/openapi-types/media-type"; |
| 3 | +import type { OperationObject } from "@omer-x/openapi-types/operation"; |
| 4 | +import type { ParameterObject } from "@omer-x/openapi-types/parameter"; |
| 5 | +import type { ReferenceObject } from "@omer-x/openapi-types/reference"; |
| 6 | +import type { RequestBodyObject } from "@omer-x/openapi-types/request-body"; |
| 7 | +import type { ResponseObject, ResponsesObject } from "@omer-x/openapi-types/response"; |
| 8 | +import type { SchemaObject } from "@omer-x/openapi-types/schema"; |
| 9 | +import type { ZodType } from "zod"; |
| 10 | + |
| 11 | +function maskSchema(storedSchemas: Record<string, ZodType>, schema?: SchemaObject) { |
| 12 | + if (!schema) return schema; |
| 13 | + return maskWithReference(schema, storedSchemas, true); |
| 14 | +} |
| 15 | + |
| 16 | +function maskParameterSchema(param: ParameterObject | ReferenceObject, storedSchemas: Record<string, ZodType>) { |
| 17 | + if ("$ref" in param) return param; |
| 18 | + return { ...param, schema: maskSchema(storedSchemas, param.schema) } as ParameterObject; |
| 19 | +} |
| 20 | + |
| 21 | +function maskContentSchema(storedSchemas: Record<string, ZodType>, bodyContent?: Record<string, MediaTypeObject>) { |
| 22 | + if (!bodyContent) return bodyContent; |
| 23 | + return Object.entries(bodyContent).reduce((collection, [contentType, content]) => ({ |
| 24 | + ...collection, |
| 25 | + [contentType]: { |
| 26 | + ...content, |
| 27 | + schema: maskSchema(storedSchemas, content.schema), |
| 28 | + }, |
| 29 | + }), {} as Record<string, MediaTypeObject>); |
| 30 | +} |
| 31 | + |
| 32 | +function maskRequestBodySchema(storedSchemas: Record<string, ZodType>, body?: RequestBodyObject | ReferenceObject) { |
| 33 | + if (!body || "$ref" in body) return body; |
| 34 | + return { ...body, content: maskContentSchema(storedSchemas, body.content) } as RequestBodyObject; |
| 35 | +} |
| 36 | + |
| 37 | +function maskResponseSchema(storedSchemas: Record<string, ZodType>, response: ResponseObject | ReferenceObject) { |
| 38 | + if ("$ref" in response) return response; |
| 39 | + return { ...response, content: maskContentSchema(storedSchemas, response.content) }; |
| 40 | +} |
| 41 | + |
| 42 | +function maskSchemasInResponses(storedSchemas: Record<string, ZodType>, responses?: ResponsesObject) { |
| 43 | + if (!responses) return responses; |
| 44 | + return Object.entries(responses).reduce((collection, [key, response]) => ({ |
| 45 | + ...collection, |
| 46 | + [key]: maskResponseSchema(storedSchemas, response), |
| 47 | + }), {} as ResponsesObject); |
| 48 | +} |
| 49 | + |
| 50 | +export default function maskOperationSchemas(operation: OperationObject, storedSchemas: Record<string, ZodType>) { |
| 51 | + return { |
| 52 | + ...operation, |
| 53 | + parameters: operation.parameters?.map(p => maskParameterSchema(p, storedSchemas)), |
| 54 | + requestBody: maskRequestBodySchema(storedSchemas, operation.requestBody), |
| 55 | + responses: maskSchemasInResponses(storedSchemas, operation.responses), |
| 56 | + } as OperationObject; |
| 57 | +} |
0 commit comments