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