{"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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"}