UNPKG

@autorest/openapi-to-typespec

Version:

Autorest plugin to scaffold a Typespec definition from an OpenAPI document

53 lines (47 loc) 2.04 kB
import { ArraySchema, ObjectSchema, SchemaResponse } from "@autorest/codemodel"; import { getSession } from "../autorest-session"; import { getDataTypes } from "../data-types"; import { TypespecModel, TypespecObjectProperty } from "../interfaces"; import { getOptions } from "../options"; import { isArraySchema } from "./schemas"; import { isResourceListResult } from "./type-mapping"; export function transformSchemaResponse(response: SchemaResponse): TypespecModel { const codeModel = getSession().model; const dataTypes = getDataTypes(codeModel); const isArm = getOptions().isArm; const mediaTypes = response.protocol.http?.mediaTypes; let contentType = ""; if (mediaTypes && ((mediaTypes as string[]).length !== 1 || (mediaTypes as string[])[0] !== "application/json")) { contentType = (mediaTypes as string[]).map((m) => `"${m}"`).join(" | "); } const additionalProperties: TypespecObjectProperty[] | undefined = contentType !== "" ? [ { kind: "property", name: "contentType", isOptional: false, type: contentType, decorators: [{ name: "header" }], }, ] : undefined; if (isArm && isResourceListResult(response as SchemaResponse)) { const valueSchema = ((response as SchemaResponse).schema as ObjectSchema).properties?.find( (p) => p.language.default.name === "value", ); const valueName = dataTypes.get((valueSchema!.schema as ArraySchema).elementType)?.name ?? "void"; return { kind: "template", name: "ResourceListResult", arguments: [{ kind: "object", name: valueName }], additionalProperties: additionalProperties, }; } let responseTypeName = ""; if (isArraySchema(response.schema)) { const itemName = dataTypes.get(response.schema.elementType)?.name; responseTypeName = `${itemName}[]`; } else responseTypeName = response.schema.language.default.name; return { kind: "object", name: responseTypeName, additionalProperties }; }