UNPKG

@samchon/openapi

Version:

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

1 lines 30.3 kB
{"version":3,"file":"SwaggerV2Upgrader.mjs","sources":["../../src/converters/SwaggerV2Upgrader.ts"],"sourcesContent":["import { OpenApi } from \"../OpenApi\";\nimport { SwaggerV2 } from \"../SwaggerV2\";\nimport { OpenApiExclusiveEmender } from \"../utils/OpenApiExclusiveEmender\";\nimport { OpenApiTypeChecker } from \"../utils/OpenApiTypeChecker\";\n\nexport namespace SwaggerV2Upgrader {\n export const convert = (input: SwaggerV2.IDocument): OpenApi.IDocument => ({\n openapi: \"3.1.0\",\n info: input.info,\n components: convertComponents(input),\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 servers: input.host\n ? [\n {\n url: input.host,\n },\n ]\n : undefined,\n security: input.security,\n tags: input.tags,\n \"x-samchon-emended-v4\": true,\n });\n\n /* -----------------------------------------------------------\n OPERATORS\n ----------------------------------------------------------- */\n const convertPathItem =\n (doc: SwaggerV2.IDocument) =>\n (pathItem: SwaggerV2.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: SwaggerV2.IDocument) =>\n (pathItem: SwaggerV2.IPath) =>\n (input: SwaggerV2.IOperation): OpenApi.IOperation => ({\n ...input,\n parameters:\n pathItem.parameters !== undefined || input.parameters !== undefined\n ? (\n [...(pathItem.parameters ?? []), ...(input.parameters ?? [])]\n .map((p) =>\n TypeChecker.isReference(p)\n ? doc.parameters?.[p.$ref.split(\"/\").pop() ?? \"\"]!\n : p,\n )\n .filter(\n (p) =>\n p !== undefined &&\n p.in !== \"body\" &&\n (p as SwaggerV2.IOperation.IBodyParameter).schema ===\n undefined,\n ) as SwaggerV2.IOperation.IGeneralParameter[]\n ).map(convertParameter(doc.definitions ?? {}))\n : undefined,\n requestBody: (() => {\n const found: SwaggerV2.IOperation.IBodyParameter | undefined =\n input.parameters?.find((p) => {\n if (TypeChecker.isReference(p))\n p = doc.parameters?.[p.$ref.split(\"/\").pop() ?? \"\"]!;\n return (\n (p as SwaggerV2.IOperation.IBodyParameter)?.schema !== undefined\n );\n }) as SwaggerV2.IOperation.IBodyParameter | undefined;\n return found\n ? convertRequestBody(doc.definitions ?? {})(found)\n : undefined;\n })(),\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 (definitions: Record<string, SwaggerV2.IJsonSchema>) =>\n (\n input: SwaggerV2.IOperation.IGeneralParameter,\n ): OpenApi.IOperation.IParameter => ({\n name: input.name,\n in: input.in as any,\n description: input.description,\n schema: convertSchema(definitions)(input),\n required: true,\n });\n const convertRequestBody =\n (definitions: Record<string, SwaggerV2.IJsonSchema>) =>\n (\n input: SwaggerV2.IOperation.IBodyParameter,\n ): OpenApi.IOperation.IRequestBody => ({\n description: input.description,\n content: {\n \"application/json\": {\n schema: convertSchema(definitions)(input.schema),\n },\n },\n });\n\n const convertResponse =\n (doc: SwaggerV2.IDocument) =>\n (\n input:\n | SwaggerV2.IOperation.IResponse\n | SwaggerV2.IJsonSchema.IReference<`#/definitions/responses/${string}`>,\n ): OpenApi.IOperation.IResponse | undefined => {\n if (TypeChecker.isReference(input)) {\n const found: SwaggerV2.IOperation.IResponse | undefined =\n doc.responses?.[input.$ref.split(\"/\").pop() ?? \"\"]!;\n if (found === undefined) return undefined;\n input = found;\n }\n return {\n description: input.description,\n content: input.schema\n ? {\n \"application/json\": {\n schema: convertSchema(doc.definitions ?? {})(input.schema),\n example: input.example,\n },\n }\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 schema: convertSchema(doc.definitions ?? {})(value),\n in: \"header\",\n },\n ] as const,\n ),\n )\n : undefined,\n };\n };\n\n /* -----------------------------------------------------------\n DEFINITIONS\n ----------------------------------------------------------- */\n const convertComponents = (\n input: SwaggerV2.IDocument,\n ): OpenApi.IComponents => ({\n schemas: Object.fromEntries(\n Object.entries(input.definitions ?? {})\n .filter(([_, v]) => v !== undefined)\n .map(([key, value]) => [\n key,\n convertSchema(input.definitions ?? {})(value),\n ]),\n ),\n securitySchemes: input.securityDefinitions\n ? Object.fromEntries(\n Object.entries(input.securityDefinitions)\n .filter(([_, v]) => v !== undefined)\n .map(([key, value]) => [key, convertSecurityScheme(value)])\n .filter(([_, v]) => v !== undefined),\n )\n : undefined,\n });\n\n const convertSecurityScheme = (\n input: SwaggerV2.ISecurityDefinition,\n ): OpenApi.ISecurityScheme => {\n if (input.type === \"apiKey\") return input;\n else if (input.type === \"basic\")\n return {\n type: \"http\",\n scheme: \"basic\",\n description: input.description,\n };\n else if (input.type === \"oauth2\")\n if (input.flow === \"implicit\")\n return {\n type: \"oauth2\",\n description: input.description,\n flows: {\n implicit: {\n authorizationUrl: input.authorizationUrl,\n scopes: input.scopes,\n },\n },\n };\n else if (input.flow === \"accessCode\")\n return {\n type: \"oauth2\",\n description: input.description,\n flows: {\n authorizationCode: {\n authorizationUrl: input.authorizationUrl,\n tokenUrl: input.tokenUrl,\n scopes: input.scopes,\n },\n },\n };\n else if (input.flow === \"password\")\n return {\n type: \"oauth2\",\n description: input.description,\n flows: {\n password: {\n tokenUrl: input.tokenUrl,\n scopes: input.scopes,\n },\n },\n };\n else if (input.flow === \"application\")\n return {\n type: \"oauth2\",\n description: input.description,\n flows: {\n clientCredentials: {\n tokenUrl: input.tokenUrl,\n scopes: input.scopes,\n },\n },\n };\n else return undefined!;\n return undefined!;\n };\n\n export const convertSchema =\n (definitions: Record<string, SwaggerV2.IJsonSchema>) =>\n (input: SwaggerV2.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 ? Object.fromEntries(input.examples.map((v, i) => [`v${i}`, v]))\n : undefined,\n };\n const visit = (schema: SwaggerV2.IJsonSchema): void => {\n // NULLABLE PROPERTY\n if (\n (schema as SwaggerV2.IJsonSchema.__ISignificant<any>)[\n \"x-nullable\"\n ] === true\n ) {\n nullable.value ||= true;\n if ((schema as SwaggerV2.IJsonSchema.INumber).default === null)\n nullable.default = null;\n }\n if (\n Array.isArray((schema as SwaggerV2.IJsonSchema.INumber).enum) &&\n (schema as SwaggerV2.IJsonSchema.INumber).enum?.length &&\n (schema as SwaggerV2.IJsonSchema.INumber).enum?.some(\n (e) => e === null,\n )\n )\n nullable.value ||= true;\n // UNION TYPE CASE\n if (TypeChecker.isAnyOf(schema)) schema[\"x-anyOf\"].forEach(visit);\n else if (TypeChecker.isOneOf(schema)) schema[\"x-oneOf\"].forEach(visit);\n else if (TypeChecker.isAllOf(schema))\n if (schema.allOf.length === 1) visit(schema.allOf[0]);\n else union.push(convertAllOfSchema(definitions)(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 examples: schema.examples\n ? Object.fromEntries(\n schema.examples.map((v, i) => [`v${i}`, v]),\n )\n : undefined,\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 examples: schema.examples\n ? Object.fromEntries(\n schema.examples.map((v, i) => [`v${i}`, v]),\n )\n : undefined,\n ...{ enum: undefined },\n });\n // INSTANCE TYPE CASE\n else if (TypeChecker.isArray(schema))\n union.push({\n ...schema,\n items: convertSchema(definitions)(schema.items),\n examples: schema.examples\n ? Object.fromEntries(schema.examples.map((v, i) => [`v${i}`, v]))\n : undefined,\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(definitions)(value),\n ]),\n )\n : {},\n additionalProperties: schema.additionalProperties\n ? typeof schema.additionalProperties === \"object\" &&\n schema.additionalProperties !== null\n ? convertSchema(definitions)(schema.additionalProperties)\n : schema.additionalProperties\n : undefined,\n },\n examples: schema.examples\n ? Object.fromEntries(schema.examples.map((v, i) => [`v${i}`, v]))\n : undefined,\n required: schema.required ?? [],\n });\n else if (TypeChecker.isReference(schema))\n union.push({\n ...schema,\n $ref: schema.$ref.replace(\n \"#/definitions/\",\n \"#/components/schemas/\",\n ),\n examples: schema.examples\n ? Object.fromEntries(schema.examples.map((v, i) => [`v${i}`, v]))\n : undefined,\n });\n else\n union.push({\n ...schema,\n examples: schema.examples\n ? Object.fromEntries(schema.examples.map((v, i) => [`v${i}`, v]))\n : undefined,\n });\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, \"x-nullable\": undefined })) }),\n ...attribute,\n ...{ \"x-nullable\": undefined },\n };\n };\n\n const convertAllOfSchema =\n (definitions: Record<string, SwaggerV2.IJsonSchema>) =>\n (input: SwaggerV2.IJsonSchema.IAllOf): OpenApi.IJsonSchema => {\n const objects: Array<SwaggerV2.IJsonSchema.IObject | null> =\n input.allOf.map((schema) => retrieveObject(definitions)(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(definitions)(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 (definitions: Record<string, SwaggerV2.IJsonSchema>) =>\n (\n input: SwaggerV2.IJsonSchema,\n visited: Set<SwaggerV2.IJsonSchema> = new Set(),\n ): SwaggerV2.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(definitions)(\n definitions?.[input.$ref.split(\"/\").pop() ?? \"\"] ?? {},\n visited,\n );\n return null;\n };\n\n namespace TypeChecker {\n export const isBoolean = (\n schema: SwaggerV2.IJsonSchema,\n ): schema is SwaggerV2.IJsonSchema.IBoolean =>\n (schema as SwaggerV2.IJsonSchema.IBoolean).type === \"boolean\";\n export const isInteger = (\n schema: SwaggerV2.IJsonSchema,\n ): schema is SwaggerV2.IJsonSchema.IInteger =>\n (schema as SwaggerV2.IJsonSchema.IInteger).type === \"integer\";\n export const isNumber = (\n schema: SwaggerV2.IJsonSchema,\n ): schema is SwaggerV2.IJsonSchema.INumber =>\n (schema as SwaggerV2.IJsonSchema.INumber).type === \"number\";\n export const isString = (\n schema: SwaggerV2.IJsonSchema,\n ): schema is SwaggerV2.IJsonSchema.IString =>\n (schema as SwaggerV2.IJsonSchema.IString).type === \"string\";\n export const isArray = (\n schema: SwaggerV2.IJsonSchema,\n ): schema is SwaggerV2.IJsonSchema.IArray =>\n (schema as SwaggerV2.IJsonSchema.IArray).type === \"array\";\n export const isObject = (\n schema: SwaggerV2.IJsonSchema,\n ): schema is SwaggerV2.IJsonSchema.IObject =>\n (schema as SwaggerV2.IJsonSchema.IObject).type === \"object\";\n export const isReference = (\n schema: SwaggerV2.IJsonSchema,\n ): schema is SwaggerV2.IJsonSchema.IReference =>\n (schema as SwaggerV2.IJsonSchema.IReference).$ref !== undefined;\n export const isAllOf = (\n schema: SwaggerV2.IJsonSchema,\n ): schema is SwaggerV2.IJsonSchema.IAllOf =>\n (schema as SwaggerV2.IJsonSchema.IAllOf).allOf !== undefined;\n export const isOneOf = (\n schema: SwaggerV2.IJsonSchema,\n ): schema is SwaggerV2.IJsonSchema.IOneOf =>\n (schema as SwaggerV2.IJsonSchema.IOneOf)[\"x-oneOf\"] !== undefined;\n export const isAnyOf = (\n schema: SwaggerV2.IJsonSchema,\n ): schema is SwaggerV2.IJsonSchema.IAnyOf =>\n (schema as SwaggerV2.IJsonSchema.IAnyOf)[\"x-anyOf\"] !== undefined;\n export const isNullOnly = (\n schema: SwaggerV2.IJsonSchema,\n ): schema is SwaggerV2.IJsonSchema.INullOnly =>\n (schema as SwaggerV2.IJsonSchema.INullOnly).type === \"null\";\n }\n}\n"],"names":["SwaggerV2Upgrader","convert","input","openapi","info","components","convertComponents","paths","Object","fromEntries","entries","filter","_","v","undefined","map","key","value","convertPathItem","servers","host","url","security","tags","doc","pathItem","get","convertOperation","put","post","delete","options","head","patch","trace","parameters","p","TypeChecker","isReference","$ref","split","pop","in","schema","convertParameter","definitions","requestBody","found","find","convertRequestBody","responses","convertResponse","name","description","convertSchema","required","content","example","headers","schemas","securitySchemes","securityDefinitions","convertSecurityScheme","type","scheme","flow","flows","implicit","authorizationUrl","scopes","authorizationCode","tokenUrl","password","clientCredentials","nullable","default","union","attribute","title","startsWith","examples","i","visit","Array","isArray","enum","length","some","e","isAnyOf","forEach","isOneOf","isAllOf","allOf","push","convertAllOfSchema","isBoolean","isInteger","isNumber","isString","const","OpenApiExclusiveEmender","emend","exclusiveMinimum","minimum","exclusiveMaximum","maximum","items","isObject","properties","additionalProperties","replace","x","OpenApiTypeChecker","isNull","oneOf","u","objects","retrieveObject","obj","o","flat","Set","visited","has","add","isNullOnly"],"mappings":"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"}