import { AutoBeOpenApi } from "@autobe/interface"; import { IHttpMigrateApplication, OpenApi } from "@typia/interface"; import { HttpMigration, OpenApiTypeChecker } from "@typia/utils"; export function invertOpenApiDocument( document: OpenApi.IDocument, ): AutoBeOpenApi.IDocument { const app: IHttpMigrateApplication = HttpMigration.application(document); return { operations: app.routes .filter((r) => r.query === null) .map( (r) => ({ authorizationType: null, method: r.method as "post", path: r.path, description: writeDescription(r.operation()) ?? empty("description"), specification: r.operation() ? // biome-ignore lint: intended ((r.operation() as any)["x-autobe-specification"] ?? empty("x-autobe-specification")) : empty("x-autobe-specification"), accessor: r.accessor, parameters: r.parameters.map( (p) => ({ name: p.name, description: p.parameter().description ?? empty("description"), // biome-ignore lint: intended schema: p.schema as any, }) satisfies AutoBeOpenApi.IParameter, ), requestBody: r.body?.type === "application/json" && OpenApiTypeChecker.isReference(r.body.schema) ? { description: r.body.description() ?? empty("description"), typeName: r.body.schema.$ref.split("/").pop()!, } : null, responseBody: r.success?.type === "application/json" && OpenApiTypeChecker.isReference(r.success.schema) ? { description: r.success.description() ?? empty("description"), typeName: r.success.schema.$ref.split("/").pop()!, } : null, authorizationActor: null, name: r.accessor.at(-1)!, prerequisites: [], }) satisfies AutoBeOpenApi.IOperation, ), components: { schemas: (document.components?.schemas ?? {}) as Record< string, AutoBeOpenApi.IJsonSchemaDescriptive >, authorizations: [], }, }; } function writeDescription(operation: OpenApi.IOperation): string | undefined { if (operation.summary === undefined && operation.description === undefined) return undefined; if (operation.summary === undefined) return operation.description; else if (operation.description === undefined) return operation.summary; else if (operation.description.startsWith(operation.summary)) return operation.description; return `${operation.summary}${operation.summary.endsWith(".") ? "" : "."}\n\n${operation.description}`; } function empty(key: string): string { return `Describe ${key} as much as possible with clear and concise words.`; }