UNPKG

@autorest/openapi-to-cadl

Version:

Autorest plugin to scaffold a Typespec definition from an OpenAPI document

77 lines 3.66 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.generateOperationGroup = exports.generateOperation = void 0; const docs_1 = require("../utils/docs"); function generateOperation(operation, operationGroup) { var _a; const doc = (0, docs_1.generateDocs)(operation); const summary = (0, docs_1.generateSummary)(operation); const { verb, name, route, responses, parameters } = operation; const params = generateParameters(parameters); const statements = []; summary && statements.push(summary); statements.push(doc); generateMultiResponseWarning(responses, statements); for (const fixme of (_a = operation.fixMe) !== null && _a !== void 0 ? _a : []) { statements.push(fixme); } if (!operation.resource) { const names = [name, ...responses, ...parameters.map((p) => p.name)]; const duplicateNames = findDuplicates(names); generateNameCollisionWarning(duplicateNames, statements); statements.push(`@route("${route}")`); statements.push(`@${verb} op ${name} is Azure.Core.Foundations.Operation<{${params ? params : ""}}, ${responses.join(" | ")}>;\n\n\n`); } else { const { resource } = operation; const names = [name, ...responses, ...parameters.map((p) => p.name)]; const duplicateNames = findDuplicates(names); generateNameCollisionWarning(duplicateNames, statements); const resourceParameters = generateParameters(parameters.filter((param) => !["path", "body"].some((p) => p === param.location))); const parametersString = !resourceParameters ? `` : `, { parameters: {${resourceParameters}}}`; statements.push(`${operationGroup.name ? "" : "op "}`, `${name} is Azure.Core.${resource.kind}<${resource.response.name} ${parametersString}>;\n\n\n`); } return statements.join("\n"); } exports.generateOperation = generateOperation; function findDuplicates(arr) { return arr.filter((item, index) => arr.indexOf(item) != index); } function generateNameCollisionWarning(duplicateNames, statements) { if (!duplicateNames.length) { return; } const unique = [...new Set(duplicateNames)]; const message = `// FIXME: (name-collision-error) There is a potential collision with Operation, Parameter and Response names. // Problematic names: [${unique.join()}]`; statements.push(message); } function generateMultiResponseWarning(responses, statements) { responses.length > 2 && statements.push(`// FIXME: (multi-response) Swagger defines multiple requests and responses. // This needs to be revisited as CADL supports linking specific responses to each request`); } function generateParameters(parameters) { const params = []; for (const parameter of parameters) { const location = parameter.location; params.push((0, docs_1.generateDocs)(parameter)); params.push(`@${location} "${parameter.name}": ${parameter.type},`); } return params.join("\n"); } function generateOperationGroup(operationGroup) { const statements = []; const doc = (0, docs_1.generateDocs)(operationGroup); const { name, operations } = operationGroup; statements.push(`${doc}`); const hasInterface = Boolean(name); hasInterface && statements.push(`interface ${name} {`); for (const operation of operations) { statements.push(generateOperation(operation, operationGroup)); } hasInterface && statements.push(`}`); return statements.join("\n"); } exports.generateOperationGroup = generateOperationGroup; //# sourceMappingURL=generate-operations.js.map