@autorest/openapi-to-typespec
Version:
Autorest plugin to scaffold a Typespec definition from an OpenAPI document
204 lines • 10.6 kB
JavaScript
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getGeneratedOperationId = exports.generateExamples = exports.generateArmResourceExamples = exports.generateArmResource = void 0;
const change_case_all_1 = require("change-case-all");
const lodash_1 = __importDefault(require("lodash"));
const pluralize_1 = __importDefault(require("pluralize"));
const options_1 = require("../options");
const decorators_1 = require("../utils/decorators");
const docs_1 = require("../utils/docs");
const logger_1 = require("../utils/logger");
const lro_1 = require("../utils/lro");
const model_generation_1 = require("../utils/model-generation");
const suppressions_1 = require("../utils/suppressions");
const generate_operations_1 = require("./generate-operations");
const generate_parameter_1 = require("./generate-parameter");
const logger = () => (0, logger_1.getLogger)("generate-arm-resource");
function generateArmResource(resource) {
var _a, _b;
const definitions = [];
definitions.push(generateArmResourceModel(resource));
definitions.push("\n");
definitions.push(generateArmResourceOperationGroups(resource));
definitions.push("\n");
for (const a of (_a = resource.augmentDecorators) !== null && _a !== void 0 ? _a : []) {
definitions.push((0, decorators_1.generateAugmentedDecorators)(a.target, [a]));
}
for (const o of resource.resourceOperationGroups.flatMap((g) => g.resourceOperations)) {
for (const d of (_b = o.augmentedDecorators) !== null && _b !== void 0 ? _b : []) {
definitions.push(`${d}`);
}
}
return definitions.join("\n");
}
exports.generateArmResource = generateArmResource;
function generateArmResourceModel(resource) {
var _a;
const definitions = [];
for (const fixme of (_a = resource.fixMe) !== null && _a !== void 0 ? _a : []) {
definitions.push(fixme);
}
const doc = (0, docs_1.generateDocs)(resource);
definitions.push(doc);
const decorators = (0, decorators_1.generateDecorators)(resource.decorators);
decorators && definitions.push(decorators);
if (resource.resourceParent) {
definitions.push(`@parentResource(${resource.resourceParent.name})`);
}
if (resource.locationParent) {
definitions.push(`@parentResource(${resource.locationParent})`);
}
definitions.push(`model ${resource.name} is Azure.ResourceManager.${resource.resourceKind}<${resource.propertiesModelName}${resource.propertiesPropertyRequired ? ", false" : ""}> {`);
for (const property of resource.properties) {
if (property.kind === "property")
definitions.push(...(0, model_generation_1.getModelPropertyDeclarations)(property));
else if (property.kind === "spread")
definitions.push((0, model_generation_1.getSpreadExpressionDecalaration)(property));
}
definitions.push("}\n");
return definitions.join("\n");
}
function generateArmResourceOperationGroups(resource) {
const definitions = [];
for (const operationGroup of resource.resourceOperationGroups) {
definitions.push(generateArmResourceOperationGroup(operationGroup));
}
return definitions.join("\n");
}
function generateArmResourceOperationGroup(operationGroup) {
var _a;
const { isFullCompatible } = (0, options_1.getOptions)();
const definitions = [];
if (operationGroup.isLegacy) {
definitions.push("@armResourceOperations");
definitions.push(`interface ${operationGroup.legacyOperationGroup.interfaceName} extends Azure.ResourceManager.Legacy.LegacyOperations<{${operationGroup.legacyOperationGroup.parentParameters.join(";")}}, ${operationGroup.legacyOperationGroup.resourceTypeParameter}> {}`);
definitions.push("\n");
}
definitions.push("@armResourceOperations");
definitions.push(`interface ${operationGroup.interfaceName} {`);
for (const operation of operationGroup.resourceOperations) {
for (const fixme of (_a = operation.fixMe) !== null && _a !== void 0 ? _a : []) {
definitions.push(fixme);
}
definitions.push((0, docs_1.generateDocs)(operation));
const decorators = (0, decorators_1.generateDecorators)(operation.decorators);
decorators && definitions.push(decorators);
if (isFullCompatible &&
operation.operationId &&
operation.operationId !== getGeneratedOperationId(operationGroup.interfaceName, operation.name)) {
definitions.push(`@operationId("${operation.operationId}")`);
definitions.push(`#suppress "@azure-tools/typespec-azure-core/no-openapi" "non-standard operations"`);
}
if (isFullCompatible && operation.suppressions) {
definitions.push(...(0, suppressions_1.generateSuppressions)(operation.suppressions));
}
const operationKind = operationGroup.isLegacy
? `${operationGroup.legacyOperationGroup.interfaceName}.${getLegacyOperationKind(operation.kind)}`
: operation.kind;
if (operation.kind === "ArmResourceActionSync" || operation.kind === "ArmResourceActionAsync") {
definitions.push(`${operation.name} is ${operationKind}<${operation.resource}, ${generateArmRequest(operation.request)}, ${generateArmResponse(operation.response)}${operation.baseParameters && !operationGroup.isLegacy
? `, BaseParameters = ${operation.baseParameters[0]}`
: ""}${operation.parameters ? `, Parameters = { ${(0, generate_operations_1.generateParameters)(operation.parameters)} }` : ""}${operation.lroHeaders ? `, LroHeaders = ${(0, lro_1.generateLroHeaders)(operation.lroHeaders)}` : ""}>;`);
}
else if (operation.kind === "ArmResourceActionAsyncBase") {
definitions.push(`${operation.name} is ${operationKind}<${operation.resource}, ${generateArmRequest(operation.request)}, ${generateArmResponse(operation.response)}, BaseParameters = ${operation.baseParameters[0]}${operation.parameters ? `, Parameters = { ${(0, generate_operations_1.generateParameters)(operation.parameters)} }` : ""}>;`);
}
else {
definitions.push(`${operation.name} is ${operationKind}<${operation.resource}${operation.patchModel ? `, PatchModel = ${operation.patchModel}` : ""}${operation.baseParameters && !operationGroup.isLegacy
? `, BaseParameters = ${operation.baseParameters[0]}`
: ""}${operation.parameters ? `, Parameters = { ${(0, generate_operations_1.generateParameters)(operation.parameters)} }` : ""}${operation.response ? `, Response = ${generateArmResponse(operation.response)}` : ""}${operation.lroHeaders ? `, LroHeaders = ${(0, lro_1.generateLroHeaders)(operation.lroHeaders)}` : ""}>;`);
}
definitions.push("\n");
}
definitions.push("}");
return definitions.join("\n");
}
function getLegacyOperationKind(kind) {
switch (kind) {
case "ArmResourceRead":
return "Read";
case "ArmResourceCheckExistence":
return "CheckExistence";
case "ArmResourceCreateOrReplaceSync":
return "CreateOrUpdateSync";
case "ArmResourceCreateOrReplaceAsync":
return "CreateOrUpdateAsync";
case "ArmResourcePatchSync":
return "PatchSync";
case "ArmResourcePatchAsync":
return "PatchAsync";
case "ArmCustomPatchSync":
return "CustomPatchSync";
case "ArmCustomPatchAsync":
return "CustomPatchAsync";
case "ArmResourceDeleteSync":
return "DeleteSync";
case "ArmResourceDeleteWithoutOkAsync":
return "DeleteWithoutOkAsync";
case "ArmResourceActionSync":
return "ActionSync";
case "ArmResourceActionAsync":
return "ActionAsync";
case "ArmResourceActionAsyncBase":
return "ActionAsyncBase";
case "ArmResourceListByParent":
return "List";
case "ArmListBySubscription":
return "ListBySubscription";
case "ArmResourceListAtScope":
return "ListAtScope";
}
}
function generateArmRequest(request) {
if (request.kind === "void") {
return "void";
}
if (request.kind === "parameter") {
return `{${(0, generate_parameter_1.generateParameter)(request)}}`;
}
return request.name;
}
function generateArmResponse(responses) {
if (!Array.isArray(responses)) {
return "void";
}
return responses.map((r) => (0, model_generation_1.generateTemplateModel)(r)).join(" | ");
}
function generateArmResourceExamples(resource) {
var _a, _b;
const formalOperationGroupName = (0, pluralize_1.default)(resource.name);
const examples = {};
for (const operation of resource.resourceOperationGroups.flatMap((g) => g.resourceOperations)) {
generateExamples((_a = operation.examples) !== null && _a !== void 0 ? _a : {}, (_b = operation.operationId) !== null && _b !== void 0 ? _b : getGeneratedOperationId(formalOperationGroupName, operation.name), examples);
}
return examples;
}
exports.generateArmResourceExamples = generateArmResourceExamples;
function generateExamples(examples, operationId, generatedExamples) {
const count = lodash_1.default.keys(examples).length;
for (const [title, example] of lodash_1.default.entries(examples)) {
example.operationId = operationId;
example.title = title;
let filename = undefined;
const originalFile = example["x-ms-original-file"];
if (originalFile) {
const exampleIndex = originalFile.lastIndexOf("/examples/");
if (exampleIndex !== -1) {
filename = originalFile.substring(exampleIndex + "/examples/".length);
delete example["x-ms-original-file"];
generatedExamples[filename] = JSON.stringify(example, null, 2);
continue;
}
}
logger().info(`Cannot find the example original path or the path isn't in the examples folder for operation ${operationId}`);
}
}
exports.generateExamples = generateExamples;
function getGeneratedOperationId(operationGroupName, operationName) {
return `${change_case_all_1.Case.pascal(operationGroupName)}_${change_case_all_1.Case.pascal(operationName)}`;
}
exports.getGeneratedOperationId = getGeneratedOperationId;
//# sourceMappingURL=generate-arm-resource.js.map
;