UNPKG

@samchon/openapi

Version:

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

1 lines 19.7 kB
{"version":3,"file":"OpenApiV3Downgrader.mjs","sources":["../../src/converters/OpenApiV3Downgrader.ts"],"sourcesContent":["import { OpenApi } from \"../OpenApi\";\nimport { OpenApiV3 } from \"../OpenApiV3\";\nimport { OpenApiTypeChecker } from \"../utils/OpenApiTypeChecker\";\n\nexport namespace OpenApiV3Downgrader {\n export interface IComponentsCollection {\n original: OpenApi.IComponents;\n downgraded: OpenApiV3.IComponents;\n }\n\n export const downgrade = (input: OpenApi.IDocument): OpenApiV3.IDocument => {\n const collection: IComponentsCollection = downgradeComponents(\n input.components,\n );\n return {\n openapi: \"3.0.0\",\n servers: input.servers,\n info: input.info,\n components: collection.downgraded,\n paths: input.paths\n ? Object.fromEntries(\n Object.entries(input.paths)\n .filter(([_, v]) => v !== undefined)\n .map(\n ([key, value]) =>\n [key, downgradePathItem(collection)(value)] as const,\n ),\n )\n : undefined,\n security: input.security,\n tags: input.tags,\n };\n };\n\n /* -----------------------------------------------------------\n OPERATORS\n ----------------------------------------------------------- */\n const downgradePathItem =\n (collection: IComponentsCollection) =>\n (pathItem: OpenApi.IPath): OpenApiV3.IPath => ({\n ...(pathItem as any),\n ...(pathItem.get\n ? { get: downgradeOperation(collection)(pathItem.get) }\n : undefined),\n ...(pathItem.put\n ? { put: downgradeOperation(collection)(pathItem.put) }\n : undefined),\n ...(pathItem.post\n ? { post: downgradeOperation(collection)(pathItem.post) }\n : undefined),\n ...(pathItem.delete\n ? { delete: downgradeOperation(collection)(pathItem.delete) }\n : undefined),\n ...(pathItem.options\n ? { options: downgradeOperation(collection)(pathItem.options) }\n : undefined),\n ...(pathItem.head\n ? { head: downgradeOperation(collection)(pathItem.head) }\n : undefined),\n ...(pathItem.patch\n ? { patch: downgradeOperation(collection)(pathItem.patch) }\n : undefined),\n ...(pathItem.trace\n ? { trace: downgradeOperation(collection)(pathItem.trace) }\n : undefined),\n });\n\n const downgradeOperation =\n (collection: IComponentsCollection) =>\n (input: OpenApi.IOperation): OpenApiV3.IOperation => ({\n ...input,\n parameters: input.parameters\n ? input.parameters.map(downgradeParameter(collection))\n : undefined,\n requestBody: input.requestBody\n ? downgradeRequestBody(collection)(input.requestBody)\n : undefined,\n responses: input.responses\n ? Object.fromEntries(\n Object.entries(input.responses)\n .filter(([_, v]) => v !== undefined)\n .map(([key, value]) => [\n key,\n downgradeResponse(collection)(value),\n ]),\n )\n : undefined,\n });\n\n const downgradeParameter =\n (collection: IComponentsCollection) =>\n (\n input: OpenApi.IOperation.IParameter,\n ): OpenApiV3.IOperation.IParameter => ({\n ...input,\n schema: downgradeSchema(collection)(input.schema),\n });\n\n const downgradeRequestBody =\n (collection: IComponentsCollection) =>\n (\n input: OpenApi.IOperation.IRequestBody,\n ): OpenApiV3.IOperation.IRequestBody => ({\n ...input,\n content: input.content\n ? downgradeContent(collection)(input.content)\n : undefined,\n });\n\n const downgradeResponse =\n (collection: IComponentsCollection) =>\n (input: OpenApi.IOperation.IResponse): OpenApiV3.IOperation.IResponse => ({\n ...input,\n content: input.content\n ? downgradeContent(collection)(input.content)\n : undefined,\n headers: input.headers\n ? Object.fromEntries(\n Object.entries(input.headers)\n .filter(([_, v]) => v !== undefined)\n .map(([key, value]) => [\n key,\n {\n ...value,\n schema: downgradeSchema(collection)(value.schema),\n },\n ]),\n )\n : undefined,\n });\n\n const downgradeContent =\n (collection: IComponentsCollection) =>\n (\n record: OpenApi.IOperation.IContent,\n ): Record<string, OpenApiV3.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 ? downgradeSchema(collection)(value.schema)\n : undefined,\n },\n ] as const,\n ),\n );\n\n /* -----------------------------------------------------------\n DEFINITIONS\n ----------------------------------------------------------- */\n export const downgradeComponents = (\n input: OpenApi.IComponents,\n ): IComponentsCollection => {\n const collection: IComponentsCollection = {\n original: input,\n downgraded: {\n securitySchemes: input.securitySchemes,\n },\n };\n if (input.schemas) {\n collection.downgraded.schemas = {};\n for (const [key, value] of Object.entries(input.schemas))\n if (value !== undefined)\n collection.downgraded.schemas[key] =\n downgradeSchema(collection)(value);\n }\n return collection;\n };\n\n export const downgradeSchema =\n (collection: IComponentsCollection) =>\n (input: OpenApi.IJsonSchema): OpenApiV3.IJsonSchema => {\n const nullable: boolean = isNullable(new Set())(collection.original)(\n input,\n );\n const union: OpenApiV3.IJsonSchema[] = [];\n const attribute: OpenApiV3.IJsonSchema.__IAttribute = {\n title: input.title,\n description: input.description,\n example: input.example,\n examples: input.examples,\n ...Object.fromEntries(\n Object.entries(input).filter(\n ([key, value]) => key.startsWith(\"x-\") && value !== undefined,\n ),\n ),\n };\n const visit = (schema: OpenApi.IJsonSchema): void => {\n if (OpenApiTypeChecker.isBoolean(schema))\n union.push({ type: \"boolean\" });\n else if (\n OpenApiTypeChecker.isBoolean(schema) ||\n OpenApiTypeChecker.isInteger(schema) ||\n OpenApiTypeChecker.isNumber(schema) ||\n OpenApiTypeChecker.isString(schema) ||\n OpenApiTypeChecker.isReference(schema)\n )\n union.push({ ...schema });\n else if (OpenApiTypeChecker.isArray(schema))\n union.push({\n ...schema,\n items: downgradeSchema(collection)(schema.items),\n });\n else if (OpenApiTypeChecker.isTuple(schema))\n union.push({\n ...schema,\n items: ((): OpenApiV3.IJsonSchema => {\n if (schema.additionalItems === true) return {};\n const elements = [\n ...schema.prefixItems,\n ...(typeof schema.additionalItems === \"object\"\n ? [downgradeSchema(collection)(schema.additionalItems)]\n : []),\n ];\n if (elements.length === 0) return {};\n return {\n oneOf: elements.map(downgradeSchema(collection) as any),\n };\n })(),\n minItems: schema.prefixItems.length,\n maxItems:\n !!schema.additionalItems === true\n ? undefined\n : schema.prefixItems.length,\n ...{\n prefixItems: undefined,\n additionalItems: undefined,\n },\n });\n else if (OpenApiTypeChecker.isObject(schema))\n union.push({\n ...schema,\n properties: schema.properties\n ? Object.fromEntries(\n Object.entries(schema.properties)\n .filter(([_, v]) => v !== undefined)\n .map(([key, value]) => [\n key,\n downgradeSchema(collection)(value),\n ]),\n )\n : undefined,\n additionalProperties:\n typeof schema.additionalProperties === \"object\"\n ? downgradeSchema(collection)(schema.additionalProperties)\n : schema.additionalProperties,\n required: schema.required,\n });\n else if (OpenApiTypeChecker.isOneOf(schema))\n schema.oneOf.forEach(visit);\n };\n const visitConstant = (schema: OpenApi.IJsonSchema): void => {\n const insert = (value: any): void => {\n const matched: OpenApiV3.IJsonSchema.INumber | undefined = union.find(\n (u) => (u as OpenApiV3.IJsonSchema.INumber).type === typeof value,\n ) as OpenApiV3.IJsonSchema.INumber | undefined;\n if (matched !== undefined) {\n matched.enum ??= [];\n matched.enum.push(value);\n } else union.push({ type: typeof value as \"number\", enum: [value] });\n };\n if (OpenApiTypeChecker.isConstant(schema)) insert(schema.const);\n else if (OpenApiTypeChecker.isOneOf(schema))\n for (const u of schema.oneOf)\n if (OpenApiTypeChecker.isConstant(u)) insert(u.const);\n };\n\n visit(input);\n visitConstant(input);\n if (nullable === true)\n for (const u of union)\n if (OpenApiTypeChecker.isReference(u as any))\n downgradeNullableReference(new Set())(collection)(u as any);\n else (u as OpenApiV3.IJsonSchema.IArray).nullable = true;\n if (nullable === true && union.length === 0)\n return { type: \"null\", ...attribute };\n return {\n ...(union.length === 0\n ? { type: undefined }\n : union.length === 1\n ? { ...union[0] }\n : { oneOf: union }),\n ...attribute,\n };\n };\n\n const downgradeNullableReference =\n (visited: Set<string>) =>\n (collection: IComponentsCollection) =>\n (schema: OpenApiV3.IJsonSchema.IReference): void => {\n const key: string = schema.$ref.split(\"/\").pop()!;\n if (key.endsWith(\".Nullable\")) return;\n\n const found: OpenApi.IJsonSchema | undefined =\n collection.original.schemas?.[key];\n if (found === undefined) return;\n else if (isNullable(visited)(collection.original)(found) === true) return;\n else if (\n collection.downgraded.schemas?.[`${key}.Nullable`] === undefined\n ) {\n collection.downgraded.schemas ??= {};\n collection.downgraded.schemas[`${key}.Nullable`] = {};\n collection.downgraded.schemas[`${key}.Nullable`] = downgradeSchema(\n collection,\n )(\n OpenApiTypeChecker.isOneOf(found)\n ? {\n ...found,\n oneOf: [...found.oneOf, { type: \"null\" }],\n }\n : {\n oneOf: [found, { type: \"null\" }],\n title: found.title,\n description: found.description,\n example: found.example,\n examples: found.examples,\n ...Object.fromEntries(\n Object.entries(found).filter(\n ([key, value]) =>\n key.startsWith(\"x-\") && value !== undefined,\n ),\n ),\n },\n );\n }\n schema.$ref += \".Nullable\";\n };\n\n const isNullable =\n (visited: Set<string>) =>\n (components: OpenApi.IComponents) =>\n (schema: OpenApi.IJsonSchema): boolean => {\n if (OpenApiTypeChecker.isNull(schema)) return true;\n else if (OpenApiTypeChecker.isReference(schema)) {\n if (visited.has(schema.$ref)) return false;\n visited.add(schema.$ref);\n const key: string = schema.$ref.split(\"/\").pop()!;\n const next: OpenApi.IJsonSchema | undefined = components.schemas?.[key];\n return next ? isNullable(visited)(components)(next) : false;\n }\n return (\n OpenApiTypeChecker.isOneOf(schema) &&\n schema.oneOf.some(isNullable(visited)(components))\n );\n };\n}\n"],"names":["OpenApiV3Downgrader","downgrade","input","collection","downgradeComponents","components","openapi","servers","info","downgraded","paths","Object","fromEntries","entries","filter","_","v","undefined","map","key","value","downgradePathItem","security","tags","pathItem","get","downgradeOperation","put","post","delete","options","head","patch","trace","parameters","downgradeParameter","requestBody","downgradeRequestBody","responses","downgradeResponse","schema","downgradeSchema","content","downgradeContent","headers","record","original","securitySchemes","schemas","nullable","isNullable","Set","union","attribute","title","description","example","examples","startsWith","visit","OpenApiTypeChecker","isBoolean","push","type","isInteger","isNumber","isString","isReference","isArray","items","isTuple","additionalItems","elements","prefixItems","length","oneOf","minItems","maxItems","isObject","properties","additionalProperties","required","isOneOf","forEach","visitConstant","insert","matched","find","u","enum","isConstant","const","downgradeNullableReference","visited","$ref","split","pop","endsWith","found","_a","isNull","has","add","next","some"],"mappings":"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"}