{"version":3,"file":"SwaggerV2Downgrader.mjs","sources":["../../src/converters/SwaggerV2Downgrader.ts"],"sourcesContent":["import { OpenApi } from \"../OpenApi\";\nimport { SwaggerV2 } from \"../SwaggerV2\";\nimport { OpenApiTypeChecker } from \"../utils/OpenApiTypeChecker\";\n\nexport namespace SwaggerV2Downgrader {\n  export interface IComponentsCollection {\n    original: OpenApi.IComponents;\n    downgraded: Record<string, SwaggerV2.IJsonSchema>;\n  }\n\n  export const downgrade = (input: OpenApi.IDocument): SwaggerV2.IDocument => {\n    const collection: IComponentsCollection = downgradeComponents(\n      input.components,\n    );\n    return {\n      swagger: \"2.0\",\n      info: input.info,\n      host: input.servers?.[0]?.url\n        ? input.servers[0].url.split(\"://\").pop()!\n        : \"\",\n      definitions: collection.downgraded,\n      securityDefinitions: input.components?.securitySchemes\n        ? Object.fromEntries(\n            Object.entries(input.components.securitySchemes)\n              .filter(([_, v]) => v !== undefined)\n              .map(([key, value]) =>\n                downgradeSecurityScheme(value).map((v) => [key, v]),\n              )\n              .flat(),\n          )\n        : undefined,\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): SwaggerV2.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): SwaggerV2.IOperation => ({\n      ...input,\n      parameters:\n        input.parameters !== undefined || input.requestBody !== undefined\n          ? [\n              ...(input.parameters ?? []).map(downgradeParameter(collection)),\n              ...(input.requestBody\n                ? [downgradeRequestBody(collection)(input.requestBody)]\n                : []),\n            ]\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        requestBody: undefined,\n        servers: undefined,\n      },\n    });\n\n  const downgradeParameter =\n    (collection: IComponentsCollection) =>\n    (\n      input: OpenApi.IOperation.IParameter,\n      i: number,\n    ): SwaggerV2.IOperation.IParameter =>\n      ({\n        ...downgradeSchema(collection)(input.schema),\n        ...input,\n        required: (input.schema as any)?.required,\n        schema: undefined,\n        name: input.name ?? `p${i}`,\n        ...{\n          example: undefined,\n          examples: undefined,\n        },\n      }) as any;\n\n  const downgradeRequestBody =\n    (collection: IComponentsCollection) =>\n    (\n      input: OpenApi.IOperation.IRequestBody,\n    ): SwaggerV2.IOperation.IParameter => ({\n      name: \"body\",\n      in: \"body\",\n      description: input.description,\n      required: input.required,\n      schema: downgradeSchema(collection)(\n        Object.values(input.content ?? {})[0]?.schema ?? {},\n      ),\n    });\n\n  const downgradeResponse =\n    (collection: IComponentsCollection) =>\n    (input: OpenApi.IOperation.IResponse): SwaggerV2.IOperation.IResponse => ({\n      description: input.description,\n      schema: downgradeSchema(collection)(\n        Object.values(input.content ?? {})[0]?.schema ?? {},\n      ),\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                    example: undefined,\n                    examples: undefined,\n                  },\n                },\n              ]),\n          )\n        : undefined,\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    };\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[key.split(\"/\").pop()!] =\n            downgradeSchema(collection)(value);\n    }\n    return collection;\n  };\n\n  export const downgradeSchema =\n    (collection: IComponentsCollection) =>\n    (input: OpenApi.IJsonSchema): SwaggerV2.IJsonSchema => {\n      const nullable: boolean = isNullable(new Set())(collection.original)(\n        input,\n      );\n      const union: SwaggerV2.IJsonSchema[] = [];\n      const attribute: SwaggerV2.IJsonSchema.__IAttribute = {\n        title: input.title,\n        description: input.description,\n        deprecated: input.deprecated,\n        readOnly: input.readOnly,\n        example: input.example,\n        examples: input.examples ? Object.values(input.examples) : undefined,\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        )\n          union.push({\n            ...schema,\n            examples: schema.examples\n              ? Object.values(schema.examples)\n              : undefined,\n          });\n        else if (OpenApiTypeChecker.isReference(schema))\n          union.push({ $ref: `#/definitions/${schema.$ref.split(\"/\").pop()}` });\n        else if (OpenApiTypeChecker.isArray(schema))\n          union.push({\n            ...schema,\n            items: downgradeSchema(collection)(schema.items),\n            examples: schema.examples\n              ? Object.values(schema.examples)\n              : undefined,\n          });\n        else if (OpenApiTypeChecker.isTuple(schema))\n          union.push({\n            ...schema,\n            items: ((): SwaggerV2.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                \"x-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            examples: schema.examples\n              ? Object.values(schema.examples)\n              : undefined,\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            examples: schema.examples\n              ? Object.values(schema.examples)\n              : undefined,\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: SwaggerV2.IJsonSchema.INumber | undefined = union.find(\n            (u) =>\n              (u as SwaggerV2.IJsonSchema.__ISignificant<any>).type === value,\n          ) as SwaggerV2.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          if (OpenApiTypeChecker.isConstant(schema)) insert(schema.const);\n          else if (OpenApiTypeChecker.isOneOf(schema))\n            schema.oneOf.forEach(insert);\n        };\n      };\n\n      visit(input);\n      visitConstant(input);\n      if (nullable) {\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 SwaggerV2.IJsonSchema.IArray)[\"x-nullable\"] = true;\n      }\n\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            : { \"x-oneOf\": union }),\n        ...attribute,\n        ...(union.length > 1 ? { discriminator: undefined } : {}),\n      };\n    };\n\n  const downgradeNullableReference =\n    (visited: Set<string>) =>\n    (collection: IComponentsCollection) =>\n    (schema: SwaggerV2.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 (collection.downgraded[`${key}.Nullable`] === undefined) {\n        collection.downgraded[`${key}.Nullable`] = {};\n        collection.downgraded[`${key}.Nullable`] = downgradeSchema(collection)(\n          OpenApiTypeChecker.isOneOf(found)\n            ? {\n                ...found,\n                oneOf: [...found.oneOf, { type: \"null\" }],\n              }\n            : {\n                title: found.title,\n                description: found.description,\n                example: found.example,\n                examples: found.examples\n                  ? Object.values(found.examples)\n                  : undefined,\n                ...Object.fromEntries(\n                  Object.entries(found).filter(\n                    ([key, value]) =>\n                      key.startsWith(\"x-\") && value !== undefined,\n                  ),\n                ),\n                oneOf: [found, { type: \"null\" }],\n              },\n        );\n      }\n      schema.$ref += \".Nullable\";\n    };\n\n  const downgradeSecurityScheme = (\n    input: OpenApi.ISecurityScheme,\n  ): SwaggerV2.ISecurityDefinition[] => {\n    if (input.type === \"apiKey\") return [input];\n    else if (input.type === \"http\")\n      if (input.scheme === \"basic\")\n        return [{ type: \"basic\", description: input.description }];\n      else return [];\n    else if (input.type === \"oauth2\") {\n      const output: SwaggerV2.ISecurityDefinition[] = [];\n      if (input.flows.implicit)\n        output.push({\n          type: \"oauth2\",\n          flow: \"implicit\",\n          authorizationUrl: input.flows.implicit.authorizationUrl,\n          scopes: input.flows.implicit.scopes,\n        });\n      if (input.flows.password)\n        output.push({\n          type: \"oauth2\",\n          flow: \"password\",\n          tokenUrl: input.flows.password.tokenUrl,\n          scopes: input.flows.password.scopes,\n        });\n      if (input.flows.clientCredentials)\n        output.push({\n          type: \"oauth2\",\n          flow: \"application\",\n          tokenUrl: input.flows.clientCredentials.tokenUrl,\n          scopes: input.flows.clientCredentials.scopes,\n        });\n      if (input.flows.authorizationCode)\n        output.push({\n          type: \"oauth2\",\n          flow: \"accessCode\",\n          authorizationUrl: input.flows.authorizationCode.authorizationUrl,\n          tokenUrl: input.flows.authorizationCode.tokenUrl,\n          scopes: input.flows.authorizationCode.scopes,\n        });\n      return output;\n    }\n    return [];\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":["SwaggerV2Downgrader","downgrade","input","collection","downgradeComponents","components","swagger","info","host","servers","url","split","pop","definitions","downgraded","securityDefinitions","securitySchemes","Object","fromEntries","entries","filter","_","v","undefined","map","key","value","downgradeSecurityScheme","flat","paths","downgradePathItem","security","tags","pathItem","get","downgradeOperation","put","post","delete","options","head","patch","trace","parameters","requestBody","downgradeParameter","downgradeRequestBody","responses","downgradeResponse","i","downgradeSchema","schema","required","name","example","examples","in","description","values","content","headers","original","schemas","nullable","isNullable","Set","union","attribute","title","deprecated","readOnly","startsWith","visit","OpenApiTypeChecker","isBoolean","push","type","isInteger","isNumber","isString","isReference","$ref","isArray","items","isTuple","additionalItems","elements","prefixItems","length","minItems","maxItems","isObject","properties","additionalProperties","isOneOf","oneOf","forEach","u","downgradeNullableReference","discriminator","visited","endsWith","found","scheme","output","flows","implicit","flow","authorizationUrl","scopes","password","tokenUrl","clientCredentials","authorizationCode","isNull","has","add","next","some"],"mappings":"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"}