UNPKG

@autorest/openapi-to-typespec

Version:

Autorest plugin to scaffold a Typespec definition from an OpenAPI document

109 lines (103 loc) 3.21 kB
import { Property } from "@autorest/codemodel"; import { TypespecDecorator, TypespecSpreadStatement } from "../interfaces"; import { extendedLocationLibraryType, isEquivalent, LibraryType, managedServiceIdentityLibraryType, planLibraryType, skuLibraryType, } from "./library-type-mapping"; import { ArmResourceSchema } from "./resource-discovery"; interface Envelope { serializedName: string; required: boolean; isReadOnly: boolean; schema: LibraryType; envelopeName: string; } const knownEnvelopes: Record<string, Envelope> = { sku: { serializedName: "sku", required: false, isReadOnly: false, schema: skuLibraryType, envelopeName: "Azure.ResourceManager.ResourceSkuProperty", }, plan: { serializedName: "plan", required: false, isReadOnly: false, schema: planLibraryType, envelopeName: "Azure.ResourceManager.ResourcePlanProperty", }, extendedLocation: { serializedName: "extendedLocation", required: false, isReadOnly: true, schema: extendedLocationLibraryType, envelopeName: "Azure.ResourceManager.ExtendedLocationProperty", }, zones: { serializedName: "zones", required: false, isReadOnly: false, schema: { name: "_", type: "array", elementType: () => ({ name: "string", type: "primitive", schema: (schema) => schema.type === "string" }), }, envelopeName: "Azure.ResourceManager.AvailabilityZonesProperty", }, identity: { serializedName: "identity", required: false, isReadOnly: false, schema: managedServiceIdentityLibraryType, envelopeName: "Azure.ResourceManager.ManagedServiceIdentityProperty", }, eTag: { serializedName: "eTag", required: false, isReadOnly: true, schema: { name: "string", type: "primitive", schema: (schema) => schema.type === "string" }, envelopeName: "Azure.ResourceManager.EntityTagProperty", }, }; export function getEnvelopeProperty(property: Property): TypespecSpreadStatement | undefined { for (const key of Object.keys(knownEnvelopes)) { const envelope = knownEnvelopes[key]; if ( property.serializedName.toLowerCase() === envelope.serializedName.toLowerCase() && (property.required ?? false) === envelope.required && (property.readOnly ?? false) === envelope.isReadOnly && isEquivalent(property.schema, envelope.schema) ) { return { kind: "spread", model: { kind: "template", name: envelope.envelopeName, }, }; } } } export function getEnvelopeAugmentedDecorator( schema: ArmResourceSchema, property: Property, ): TypespecDecorator | undefined { for (const key of Object.keys(knownEnvelopes)) { const envelope = knownEnvelopes[key]; if ( property.serializedName.toLowerCase() === envelope.serializedName.toLowerCase() && property.serializedName !== envelope.serializedName ) { return { name: "encodedName", target: `${schema.resourceMetadata[0].SwaggerModelName}.${envelope.serializedName}`, arguments: ["application/json", property.serializedName], // Currently we only support application/json }; } } }