{"version":3,"file":"OpenApiV3Upgrader.mjs","sources":["../../src/converters/OpenApiV3Upgrader.ts"],"sourcesContent":["import { OpenApi } from \"../OpenApi\";\nimport { OpenApiV3 } from \"../OpenApiV3\";\nimport { OpenApiTypeChecker } from \"../utils/OpenApiTypeChecker\";\n\nexport namespace OpenApiV3Upgrader {\n  export const convert = (input: OpenApiV3.IDocument): OpenApi.IDocument => ({\n    ...input,\n    components: convertComponents(input.components ?? {}),\n    paths: input.paths\n      ? Object.fromEntries(\n          Object.entries(input.paths)\n            .filter(([_, v]) => v !== undefined)\n            .map(\n              ([key, value]) => [key, convertPathItem(input)(value)] as const,\n            ),\n        )\n      : undefined,\n    openapi: \"3.1.0\",\n    \"x-samchon-emended\": true,\n  });\n\n  /* -----------------------------------------------------------\n    OPERATORS\n  ----------------------------------------------------------- */\n  const convertPathItem =\n    (doc: OpenApiV3.IDocument) =>\n    (pathItem: OpenApiV3.IPath): OpenApi.IPath => ({\n      ...(pathItem as any),\n      ...(pathItem.get\n        ? { get: convertOperation(doc)(pathItem)(pathItem.get) }\n        : undefined),\n      ...(pathItem.put\n        ? { put: convertOperation(doc)(pathItem)(pathItem.put) }\n        : undefined),\n      ...(pathItem.post\n        ? { post: convertOperation(doc)(pathItem)(pathItem.post) }\n        : undefined),\n      ...(pathItem.delete\n        ? { delete: convertOperation(doc)(pathItem)(pathItem.delete) }\n        : undefined),\n      ...(pathItem.options\n        ? { options: convertOperation(doc)(pathItem)(pathItem.options) }\n        : undefined),\n      ...(pathItem.head\n        ? { head: convertOperation(doc)(pathItem)(pathItem.head) }\n        : undefined),\n      ...(pathItem.patch\n        ? { patch: convertOperation(doc)(pathItem)(pathItem.patch) }\n        : undefined),\n      ...(pathItem.trace\n        ? { trace: convertOperation(doc)(pathItem)(pathItem.trace) }\n        : undefined),\n    });\n\n  const convertOperation =\n    (doc: OpenApiV3.IDocument) =>\n    (pathItem: OpenApiV3.IPath) =>\n    (input: OpenApiV3.IOperation): OpenApi.IOperation => ({\n      ...input,\n      parameters:\n        pathItem.parameters !== undefined || input.parameters !== undefined\n          ? [...(pathItem.parameters ?? []), ...(input.parameters ?? [])]\n              .map((p) => {\n                if (!TypeChecker.isReference(p))\n                  return convertParameter(doc.components ?? {})(p);\n                const found:\n                  | Omit<OpenApiV3.IOperation.IParameter, \"in\">\n                  | undefined = p.$ref.startsWith(\"#/components/headers/\")\n                  ? doc.components?.headers?.[p.$ref.split(\"/\").pop() ?? \"\"]\n                  : doc.components?.parameters?.[p.$ref.split(\"/\").pop() ?? \"\"];\n                return found !== undefined\n                  ? convertParameter(doc.components ?? {})({\n                      ...found,\n                      in: \"header\",\n                    })\n                  : undefined!;\n              })\n              .filter((_, v) => v !== undefined)\n          : undefined,\n      requestBody: input.requestBody\n        ? convertRequestBody(doc)(input.requestBody)\n        : undefined,\n      responses: input.responses\n        ? Object.fromEntries(\n            Object.entries(input.responses)\n              .filter(([_, v]) => v !== undefined)\n              .map(\n                ([key, value]) => [key, convertResponse(doc)(value)!] as const,\n              )\n              .filter(([_, v]) => v !== undefined),\n          )\n        : undefined,\n    });\n\n  const convertParameter =\n    (components: OpenApiV3.IComponents) =>\n    (\n      input: OpenApiV3.IOperation.IParameter,\n    ): OpenApi.IOperation.IParameter => ({\n      ...input,\n      schema: convertSchema(components)(input.schema),\n      examples: input.examples\n        ? Object.fromEntries(\n            Object.entries(input.examples)\n              .map(([key, value]) => [\n                key,\n                TypeChecker.isReference(value)\n                  ? components.examples?.[value.$ref.split(\"/\").pop() ?? \"\"]\n                  : value,\n              ])\n              .filter(([_, v]) => v !== undefined),\n          )\n        : undefined,\n    });\n\n  const convertRequestBody =\n    (doc: OpenApiV3.IDocument) =>\n    (\n      input:\n        | OpenApiV3.IOperation.IRequestBody\n        | OpenApiV3.IJsonSchema.IReference<`#/components/requestBodies/${string}`>,\n    ): OpenApi.IOperation.IRequestBody | undefined => {\n      if (TypeChecker.isReference(input)) {\n        const found: OpenApiV3.IOperation.IRequestBody | undefined =\n          doc.components?.requestBodies?.[input.$ref.split(\"/\").pop() ?? \"\"];\n        if (found === undefined) return undefined;\n        input = found;\n      }\n      return {\n        ...input,\n        content: input.content\n          ? convertContent(doc.components ?? {})(input.content)\n          : undefined,\n      };\n    };\n\n  const convertResponse =\n    (doc: OpenApiV3.IDocument) =>\n    (\n      input:\n        | OpenApiV3.IOperation.IResponse\n        | OpenApiV3.IJsonSchema.IReference<`#/components/responses/${string}`>,\n    ): OpenApi.IOperation.IResponse | undefined => {\n      if (TypeChecker.isReference(input)) {\n        const found: OpenApiV3.IOperation.IResponse | undefined =\n          doc.components?.responses?.[input.$ref.split(\"/\").pop() ?? \"\"];\n        if (found === undefined) return undefined;\n        input = found;\n      }\n      return {\n        ...input,\n        content: input.content\n          ? convertContent(doc.components ?? {})(input.content)\n          : undefined,\n        headers: input.headers\n          ? Object.fromEntries(\n              Object.entries(input.headers)\n                .filter(([_, v]) => v !== undefined)\n                .map(\n                  ([key, value]) =>\n                    [\n                      key,\n                      (() => {\n                        if (TypeChecker.isReference(value) === false)\n                          return convertParameter(doc.components ?? {})({\n                            ...value,\n                            in: \"header\",\n                          });\n                        const found:\n                          | Omit<OpenApiV3.IOperation.IParameter, \"in\">\n                          | undefined = value.$ref.startsWith(\n                          \"#/components/headers/\",\n                        )\n                          ? doc.components?.headers?.[\n                              value.$ref.split(\"/\").pop() ?? \"\"\n                            ]\n                          : undefined;\n                        return found !== undefined\n                          ? convertParameter(doc.components ?? {})({\n                              ...found,\n                              in: \"header\",\n                            })\n                          : undefined!;\n                      })(),\n                    ] as const,\n                )\n                .filter(([_, v]) => v !== undefined),\n            )\n          : undefined,\n      };\n    };\n\n  const convertContent =\n    (components: OpenApiV3.IComponents) =>\n    (\n      record: Record<string, OpenApiV3.IOperation.IMediaType>,\n    ): Record<string, OpenApi.IOperation.IMediaType> =>\n      Object.fromEntries(\n        Object.entries(record)\n          .filter(([_, v]) => v !== undefined)\n          .map(\n            ([key, value]) =>\n              [\n                key,\n                {\n                  ...value,\n                  schema: value.schema\n                    ? convertSchema(components)(value.schema)\n                    : undefined,\n                  examples: value.examples\n                    ? Object.fromEntries(\n                        Object.entries(value.examples)\n                          .map(([key, value]) => [\n                            key,\n                            TypeChecker.isReference(value)\n                              ? components.examples?.[\n                                  value.$ref.split(\"/\").pop() ?? \"\"\n                                ]\n                              : value,\n                          ])\n                          .filter(([_, v]) => v !== undefined),\n                      )\n                    : undefined,\n                },\n              ] as const,\n          ),\n      );\n\n  /* -----------------------------------------------------------\n    DEFINITIONS\n  ----------------------------------------------------------- */\n  export const convertComponents = (\n    input: OpenApiV3.IComponents,\n  ): OpenApi.IComponents => ({\n    schemas: Object.fromEntries(\n      Object.entries(input.schemas ?? {})\n        .filter(([_, v]) => v !== undefined)\n        .map(([key, value]) => [key, convertSchema(input)(value)]),\n    ),\n    securitySchemes: input.securitySchemes,\n  });\n\n  export const convertSchema =\n    (components: OpenApiV3.IComponents) =>\n    (input: OpenApiV3.IJsonSchema): OpenApi.IJsonSchema => {\n      const nullable: { value: boolean; default?: null } = {\n        value: false,\n        default: undefined,\n      };\n      const union: OpenApi.IJsonSchema[] = [];\n      const attribute: OpenApi.IJsonSchema.__IAttribute = {\n        title: input.title,\n        description: input.description,\n        ...Object.fromEntries(\n          Object.entries(input).filter(\n            ([key, value]) => key.startsWith(\"x-\") && value !== undefined,\n          ),\n        ),\n        example: input.example,\n        examples: input.examples,\n      };\n      const visit = (schema: OpenApiV3.IJsonSchema): void => {\n        // NULLABLE PROPERTY\n        if (\n          (schema as OpenApiV3.IJsonSchema.__ISignificant<any>).nullable ===\n          true\n        ) {\n          nullable.value ||= true;\n          if ((schema as OpenApiV3.IJsonSchema.INumber).default === null)\n            nullable.default = null;\n        }\n        if (\n          Array.isArray((schema as OpenApiV3.IJsonSchema.INumber).enum) &&\n          (schema as OpenApiV3.IJsonSchema.INumber).enum?.length &&\n          (schema as OpenApiV3.IJsonSchema.INumber).enum?.some(\n            (e) => e === null,\n          )\n        )\n          nullable.value ||= true;\n        // UNION TYPE CASE\n        if (TypeChecker.isAnyOf(schema)) schema.anyOf.forEach(visit);\n        else if (TypeChecker.isOneOf(schema)) schema.oneOf.forEach(visit);\n        else if (TypeChecker.isAllOf(schema))\n          if (schema.allOf.length === 1) visit(schema.allOf[0]);\n          else union.push(convertAllOfSchema(components)(schema));\n        // ATOMIC TYPE CASE (CONSIDER ENUM VALUES)\n        else if (\n          TypeChecker.isBoolean(schema) ||\n          TypeChecker.isInteger(schema) ||\n          TypeChecker.isNumber(schema) ||\n          TypeChecker.isString(schema)\n        )\n          if (\n            schema.enum?.length &&\n            schema.enum.filter((e) => e !== null).length\n          )\n            union.push(\n              ...schema.enum\n                .filter((v) => v !== null)\n                .map((value) => ({ const: value })),\n            );\n          else\n            union.push({\n              ...schema,\n              default: (schema.default ?? undefined) satisfies\n                | boolean\n                | number\n                | string\n                | undefined as any,\n              ...{ enum: undefined },\n            });\n        // INSTANCE TYPE CASE\n        else if (TypeChecker.isArray(schema))\n          union.push({\n            ...schema,\n            items: convertSchema(components)(schema.items),\n          });\n        else if (TypeChecker.isObject(schema))\n          union.push({\n            ...schema,\n            ...{\n              properties: schema.properties\n                ? Object.fromEntries(\n                    Object.entries(schema.properties)\n                      .filter(([_, v]) => v !== undefined)\n                      .map(([key, value]) => [\n                        key,\n                        convertSchema(components)(value),\n                      ]),\n                  )\n                : {},\n              additionalProperties: schema.additionalProperties\n                ? typeof schema.additionalProperties === \"object\" &&\n                  schema.additionalProperties !== null\n                  ? convertSchema(components)(schema.additionalProperties)\n                  : schema.additionalProperties\n                : undefined,\n              required: schema.required ?? [],\n            },\n          });\n        else if (TypeChecker.isReference(schema)) union.push(schema);\n        else union.push(schema);\n      };\n\n      visit(input);\n      if (\n        nullable.value === true &&\n        !union.some((e) => (e as OpenApi.IJsonSchema.INull).type === \"null\")\n      )\n        union.push({\n          type: \"null\",\n          default: nullable.default,\n        });\n      if (\n        union.length === 2 &&\n        union.filter((x) => OpenApiTypeChecker.isNull(x)).length === 1\n      ) {\n        const type: OpenApi.IJsonSchema = union.filter(\n          (x) => OpenApiTypeChecker.isNull(x) === false,\n        )[0];\n        for (const key of [\n          \"title\",\n          \"description\",\n          \"deprecated\",\n          \"example\",\n          \"examples\",\n        ] as const)\n          if (type[key] !== undefined) delete type[key];\n      }\n      return {\n        ...(union.length === 0\n          ? { type: undefined }\n          : union.length === 1\n            ? { ...union[0] }\n            : { oneOf: union.map((u) => ({ ...u, nullable: undefined })) }),\n        ...attribute,\n        ...{ nullable: undefined },\n      };\n    };\n\n  const convertAllOfSchema =\n    (components: OpenApiV3.IComponents) =>\n    (input: OpenApiV3.IJsonSchema.IAllOf): OpenApi.IJsonSchema => {\n      const objects: Array<OpenApiV3.IJsonSchema.IObject | null> =\n        input.allOf.map((schema) => retrieveObject(components)(schema));\n      if (objects.some((obj) => obj === null))\n        return {\n          type: undefined,\n          ...{\n            allOf: undefined,\n          },\n        };\n      return {\n        ...input,\n        type: \"object\",\n        properties: Object.fromEntries(\n          objects\n            .map((o) => Object.entries(o?.properties ?? {}))\n            .flat()\n            .map(\n              ([key, value]) =>\n                [key, convertSchema(components)(value)] as const,\n            ),\n        ),\n        ...{\n          allOf: undefined,\n          required: [...new Set(objects.map((o) => o?.required ?? []).flat())],\n        },\n      };\n    };\n\n  const retrieveObject =\n    (components: OpenApiV3.IComponents) =>\n    (\n      input: OpenApiV3.IJsonSchema,\n      visited: Set<OpenApiV3.IJsonSchema> = new Set(),\n    ): OpenApiV3.IJsonSchema.IObject | null => {\n      if (TypeChecker.isObject(input))\n        return input.properties !== undefined && !input.additionalProperties\n          ? input\n          : null;\n      else if (visited.has(input)) return null;\n      else visited.add(input);\n\n      if (TypeChecker.isReference(input))\n        return retrieveObject(components)(\n          components.schemas?.[input.$ref.split(\"/\").pop() ?? \"\"] ?? {},\n          visited,\n        );\n      return null;\n    };\n\n  export namespace TypeChecker {\n    export const isBoolean = (\n      schema: OpenApiV3.IJsonSchema,\n    ): schema is OpenApiV3.IJsonSchema.IBoolean =>\n      (schema as OpenApiV3.IJsonSchema.IBoolean).type === \"boolean\";\n    export const isInteger = (\n      schema: OpenApiV3.IJsonSchema,\n    ): schema is OpenApiV3.IJsonSchema.IInteger =>\n      (schema as OpenApiV3.IJsonSchema.IInteger).type === \"integer\";\n    export const isNumber = (\n      schema: OpenApiV3.IJsonSchema,\n    ): schema is OpenApiV3.IJsonSchema.INumber =>\n      (schema as OpenApiV3.IJsonSchema.INumber).type === \"number\";\n    export const isString = (\n      schema: OpenApiV3.IJsonSchema,\n    ): schema is OpenApiV3.IJsonSchema.IString =>\n      (schema as OpenApiV3.IJsonSchema.IString).type === \"string\";\n    export const isArray = (\n      schema: OpenApiV3.IJsonSchema,\n    ): schema is OpenApiV3.IJsonSchema.IArray =>\n      (schema as OpenApiV3.IJsonSchema.IArray).type === \"array\";\n    export const isObject = (\n      schema: OpenApiV3.IJsonSchema,\n    ): schema is OpenApiV3.IJsonSchema.IObject =>\n      (schema as OpenApiV3.IJsonSchema.IObject).type === \"object\";\n    export const isReference = (\n      schema: OpenApiV3.IJsonSchema,\n    ): schema is OpenApiV3.IJsonSchema.IReference =>\n      (schema as OpenApiV3.IJsonSchema.IReference).$ref !== undefined;\n    export const isAllOf = (\n      schema: OpenApiV3.IJsonSchema,\n    ): schema is OpenApiV3.IJsonSchema.IAllOf =>\n      (schema as OpenApiV3.IJsonSchema.IAllOf).allOf !== undefined;\n    export const isAnyOf = (\n      schema: OpenApiV3.IJsonSchema,\n    ): schema is OpenApiV3.IJsonSchema.IAnyOf =>\n      (schema as OpenApiV3.IJsonSchema.IAnyOf).anyOf !== undefined;\n    export const isOneOf = (\n      schema: OpenApiV3.IJsonSchema,\n    ): schema is OpenApiV3.IJsonSchema.IOneOf =>\n      (schema as OpenApiV3.IJsonSchema.IOneOf).oneOf !== undefined;\n    export const isNullOnly = (\n      schema: OpenApiV3.IJsonSchema,\n    ): schema is OpenApiV3.IJsonSchema.INullOnly =>\n      (schema as OpenApiV3.IJsonSchema.INullOnly).type === \"null\";\n  }\n}\n"],"names":["OpenApiV3Upgrader","convert","input","components","convertComponents","paths","Object","fromEntries","entries","filter","_","v","undefined","map","key","value","convertPathItem","openapi","doc","pathItem","get","convertOperation","put","post","delete","options","head","patch","trace","parameters","p","TypeChecker","isReference","convertParameter","found","$ref","startsWith","headers","split","pop","in","requestBody","convertRequestBody","responses","convertResponse","schema","convertSchema","examples","requestBodies","content","convertContent","record","schemas","securitySchemes","nullable","default","union","attribute","title","description","example","visit","Array","isArray","enum","length","some","e","isAnyOf","anyOf","forEach","isOneOf","oneOf","isAllOf","allOf","push","convertAllOfSchema","isBoolean","isInteger","isNumber","isString","const","items","isObject","properties","additionalProperties","required","type","x","OpenApiTypeChecker","isNull","u","objects","retrieveObject","obj","o","flat","Set","visited","has","add","isNullOnly"],"mappings":"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"}