UNPKG

@autorest/openapi-to-cadl

Version:

Autorest plugin to scaffold a Typespec definition from an OpenAPI document

179 lines 8.12 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getCadlType = exports.transformObjectProperty = exports.transformObject = void 0; const codemodel_1 = require("@autorest/codemodel"); const data_types_1 = require("../data-types"); const alias_1 = require("../utils/alias"); const decorators_1 = require("../utils/decorators"); const discriminator_1 = require("../utils/discriminator"); const logger_1 = require("../utils/logger"); const schemas_1 = require("../utils/schemas"); const values_1 = require("../utils/values"); const cadlTypes = new Map([ [codemodel_1.SchemaType.Date, "plainDate"], [codemodel_1.SchemaType.DateTime, "utcDateTime"], [codemodel_1.SchemaType.UnixTime, "plainTime"], [codemodel_1.SchemaType.String, "string"], [codemodel_1.SchemaType.Time, "plainTime"], [codemodel_1.SchemaType.Uuid, "string"], [codemodel_1.SchemaType.Uri, "string"], [codemodel_1.SchemaType.ByteArray, "bytes"], [codemodel_1.SchemaType.Binary, "bytes"], [codemodel_1.SchemaType.Number, "float32"], [codemodel_1.SchemaType.Integer, "int32"], [codemodel_1.SchemaType.Boolean, "boolean"], [codemodel_1.SchemaType.Credential, "@secret string"], [codemodel_1.SchemaType.Duration, "duration"], [codemodel_1.SchemaType.AnyObject, "object"], ]); function transformObject(schema, codeModel) { var _a; const cadlTypes = (0, data_types_1.getDataTypes)(codeModel); let visited = cadlTypes.get(schema); if (visited) { return visited; } const logger = (0, logger_1.getLogger)("transformOperationGroup"); logger.info(`Transforming object ${schema.language.default.name}`); const name = schema.language.default.name.replace(/-/g, "_"); const doc = schema.language.default.description; // Marking as visited before processing properties to avoid infinite recursion // when transforming properties that reference this object. visited = { name, doc }; cadlTypes.set(schema, visited); const properties = ((_a = schema.properties) !== null && _a !== void 0 ? _a : []) .filter((p) => !p.isDiscriminator) .map((p) => transformObjectProperty(p, codeModel)); const ownDiscriminator = (0, discriminator_1.getOwnDiscriminator)(schema); if (!ownDiscriminator) { const discriminatorProperty = (0, discriminator_1.getDiscriminator)(schema); discriminatorProperty && properties.push(discriminatorProperty); } const updatedVisited = { name, doc, kind: "object", properties, parents: getParents(schema), extendedParents: getExtendedParents(schema), spreadParents: getSpreadParents(schema, codeModel), decorators: (0, decorators_1.getModelDecorators)(schema), }; (0, alias_1.addCorePageAlias)(updatedVisited); addFixmes(updatedVisited); cadlTypes.set(schema, updatedVisited); return updatedVisited; } exports.transformObject = transformObject; function addFixmes(cadlObject) { var _a, _b, _c; cadlObject.fixMe = (_a = cadlObject.fixMe) !== null && _a !== void 0 ? _a : []; if (((_b = cadlObject.extendedParents) !== null && _b !== void 0 ? _b : []).length > 1) { cadlObject.fixMe .push(`// FIXME: (multiple-inheritance) Multiple inheritance is not supported in CADL, so this type will only inherit from one parent. // this may happen because of multiple parents having discriminator properties. // Parents not included ${(_c = cadlObject.extendedParents) === null || _c === void 0 ? void 0 : _c.join(", ")}`); } } function transformObjectProperty(propertySchema, codeModel) { const name = propertySchema.language.default.name; const doc = propertySchema.language.default.description; if ((0, codemodel_1.isObjectSchema)(propertySchema.schema)) { const dataTypes = (0, data_types_1.getDataTypes)(codeModel); let visited = dataTypes.get(propertySchema.schema); if (!visited) { visited = transformObject(propertySchema.schema, codeModel); dataTypes.set(propertySchema.schema, visited); } return { kind: "property", name: name, doc: doc, isOptional: propertySchema.required !== true, type: visited.name, decorators: (0, decorators_1.getPropertyDecorators)(propertySchema), ...(propertySchema.readOnly === true && { visibility: "read" }), }; } const logger = (0, logger_1.getLogger)("getDiscriminatorProperty"); logger.info(`Transforming property ${propertySchema.language.default.name} of type ${propertySchema.schema.type}`); return { kind: "property", doc, name, isOptional: propertySchema.required !== true, type: getCadlType(propertySchema.schema, codeModel), decorators: (0, decorators_1.getPropertyDecorators)(propertySchema), fixMe: getFixme(propertySchema, codeModel), }; } exports.transformObjectProperty = transformObjectProperty; function getFixme(property, codeModel) { const cadlType = getCadlType(property.schema, codeModel); if (cadlType === "utcDateTime") { return ["// FIXME: (utcDateTime) Please double check that this is the correct type for your scenario."]; } return []; } function getParents(schema) { var _a, _b; const immediateParents = (_b = (_a = schema.parents) === null || _a === void 0 ? void 0 : _a.immediate) !== null && _b !== void 0 ? _b : []; return immediateParents .filter((p) => p.language.default.name !== schema.language.default.name) .map((p) => p.language.default.name); } function getExtendedParents(schema) { var _a, _b; const immediateParents = (_b = (_a = schema.parents) === null || _a === void 0 ? void 0 : _a.immediate) !== null && _b !== void 0 ? _b : []; return immediateParents .filter((p) => p.language.default.name !== schema.language.default.name) .filter((p) => (0, discriminator_1.getOwnDiscriminator)(p)) .map((p) => p.language.default.name); } function getSpreadParents(schema, codeModel) { var _a, _b; const immediateParents = (_b = (_a = schema.parents) === null || _a === void 0 ? void 0 : _a.immediate) !== null && _b !== void 0 ? _b : []; const spreadingParents = immediateParents .filter((p) => p.language.default.name !== schema.language.default.name) .filter((p) => !(0, schemas_1.isDictionarySchema)(p)) .filter((p) => !(0, discriminator_1.getOwnDiscriminator)(p)) .map((p) => p.language.default.name); const dictionaryParent = immediateParents.find((p) => (0, schemas_1.isDictionarySchema)(p)); if (dictionaryParent) { spreadingParents.push(`Record<${getCadlType(dictionaryParent.elementType, codeModel)}>`); } return spreadingParents; } function getCadlType(schema, codeModel) { const schemaType = schema.type; const visited = (0, data_types_1.getDataTypes)(codeModel).get(schema); if (visited) { return visited.name; } if ((0, schemas_1.isConstantSchema)(schema)) { return `${(0, values_1.transformValue)(schema.value.value)}`; } if ((0, schemas_1.isArraySchema)(schema)) { const elementType = getCadlType(schema.elementType, codeModel); return `${elementType}[]`; } if ((0, codemodel_1.isObjectSchema)(schema)) { return schema.language.default.name.replace(/-/g, "_"); } if ((0, schemas_1.isChoiceSchema)(schema) || (0, schemas_1.isSealedChoiceSchema)(schema)) { return schema.language.default.name.replace(/-/g, "_"); } if ((0, schemas_1.isDictionarySchema)(schema)) { return `Record<${getCadlType(schema.elementType, codeModel)}>`; } if ((0, schemas_1.isAnySchema)(schema)) { return `unknown`; } const cadlType = cadlTypes.get(schemaType); if (!cadlType) { throw new Error(`Unknown type ${schema.type}`); } return cadlType; } exports.getCadlType = getCadlType; //# sourceMappingURL=transform-object.js.map