UNPKG

@autorest/openapi-to-typespec

Version:

Autorest plugin to scaffold a Typespec definition from an OpenAPI document

204 lines 10.6 kB
"use strict"; 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