UNPKG

@samchon/openapi

Version:

OpenAPI definitions and converters for 'typia' and 'nestia'.

1 lines 28.3 kB
{"version":3,"file":"OpenApiV3Upgrader.mjs","sources":["../../src/converters/OpenApiV3Upgrader.ts"],"sourcesContent":["import { OpenApi } from \"../OpenApi\";\nimport { OpenApiV3 } from \"../OpenApiV3\";\nimport { OpenApiExclusiveEmender } from \"../utils/OpenApiExclusiveEmender\";\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-v4\": 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: Array.isArray(input.examples)\n ? Object.fromEntries(input.examples.map((v, i) => [`v${i}`, v]))\n : input.examples,\n };\n const visit = (schema: OpenApiV3.IJsonSchema): void => {\n // NULLABLE PROPERTY\n if ((schema as OpenApiV3.IJsonSchema.IBoolean).nullable === true) {\n nullable.value ||= true;\n if ((schema as OpenApiV3.IJsonSchema.IBoolean).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 if (\n TypeChecker.isInteger(schema) ||\n TypeChecker.isNumber(schema)\n )\n union.push(\n OpenApiExclusiveEmender.emend({\n ...schema,\n default: (schema.default ?? undefined) satisfies\n | boolean\n | number\n | string\n | undefined as any,\n exclusiveMinimum:\n typeof schema.exclusiveMinimum === \"boolean\"\n ? schema.exclusiveMinimum === true\n ? schema.minimum\n : undefined\n : schema.exclusiveMinimum,\n exclusiveMaximum:\n typeof schema.exclusiveMaximum === \"boolean\"\n ? schema.exclusiveMaximum === true\n ? schema.maximum\n : undefined\n : schema.exclusiveMaximum,\n minimum:\n schema.exclusiveMinimum === true ? undefined : schema.minimum,\n maximum:\n schema.exclusiveMaximum === true ? undefined : schema.maximum,\n ...{ enum: undefined },\n }),\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","Array","isArray","i","visit","enum","length","some","e","isAnyOf","anyOf","forEach","isOneOf","oneOf","isAllOf","allOf","push","convertAllOfSchema","isBoolean","isInteger","isNumber","isString","const","OpenApiExclusiveEmender","emend","exclusiveMinimum","minimum","exclusiveMaximum","maximum","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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"}