@autorest/openapi-to-cadl
Version:
Autorest plugin to scaffold a Typespec definition from an OpenAPI document
179 lines • 8.12 kB
JavaScript
;
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