in powershell/plugins/create-commands-v2.ts [452:559]
async addCommandOperation(vname: string, parameters: Array<Parameter>, operation: Operation, variant: CommandVariant, state: State, preOperations: Array<Operation> | undefined, commandType?: CommandType): Promise<CommandOperation> {
// skip-for-time-being following code seems redundant -----
// let apiversion = '';
// for (const each of items(operation.responses)) {
// for (const rsp of items(each)) {
// if (rsp.schema && rsp.schema.details && rsp.schema.details.default && rsp.schema.details.default.apiversion) {
// apiversion = rsp.schema.details.default.apiversion;
// break;
// }
// }
// }
// ----------------------------------------------------------
// if vname is > 64 characters, let's trim it
// after trimming it, make sure there aren't any other operation with a name that's exactly the same
if (length(vname) > 64) {
const names = deconstruct(vname);
let newVName = '';
for (let i = 0; i < length(names); i++) {
newVName = pascalCase(names.slice(0, i));
if (length(newVName) > 60) {
break;
}
}
vname = newVName;
}
// if we have an identical vname, let's add 'etc'
let fname = `${variant.verb}-${variant.subject}-${vname}`;
let n = 1;
while (this.operationIdentities.has(fname)) {
vname = `${vname.replace(/\d*$/g, '')}${n++}`;
fname = `${variant.verb}-${variant.subject}-${vname}`;
}
this.operationIdentities.add(fname);
variant.variant = vname;
vname = pascalCase(vname);
let commandName = operation.language.default.name;
let operations = [operation];
const language = { default: { ...operation.language.default } };
//handle when there are pre operataions
if (preOperations && preOperations.length > 0) {
commandName = 'Update';
language.default.name = 'Update';
operations = [...preOperations, ...operations];
}
// skip-for-time-being x-ms-metadata looks not supported any more.
//const xmsMetadata = operation.pathExtensions ? operation.pathExtensions['x-ms-metadata'] ? clone(operation.pathExtensions['x-ms-metadata']) : {} : {};
// Add operation type to support x-ms-mutability
let operationType = OperationType.Other;
if (operation.requests) {
if (operation.requests[0].protocol.http?.method === 'put' && (variant.action.toLowerCase() === 'create' || variant.action.toLowerCase() === 'update' && variant.verb.toLowerCase() === 'set')) {
// put create and put set
operationType = OperationType.Create;
} else if ((operation.requests[0].protocol.http?.method === 'patch' || operation.requests[0].protocol.http?.method === 'put') && variant.action.toLowerCase() === 'update') {
// patch update, get+put update and exclude set update
operationType = OperationType.Update;
}
}
return state.model.commands.operations[`${length(state.model.commands.operations)}`] = new CommandOperation(commandName,
{
asjob: language.default.asjob ? true : false,
operationType: operationType,
extensions: {
},
...variant,
details: {
...language,
default: {
...language.default,
subject: variant.subject,
subjectPrefix: variant.subjectPrefix,
verb: variant.verb,
name: vname,
alias: variant.alias,
externalDocs: operation.externalDocs
}
},
// operationId is not needed any more
operationId: '',
parameters: parameters.map(httpParameter => {
// make it's own copy of the parameter since after this,
// the parameter can be altered for each operation individually.
const each = clone(httpParameter, false, undefined, undefined, ['schema', 'origin']);
each.language.default = {
...each.language.default,
name: pascalCase(each.language.default.name),
httpParameter
};
each.details = {};
each.details.default = {
...each.language.default,
name: pascalCase(each.language.default.name),
httpParameter
};
each.name = each.language.default.serializedName;
return each;
}),
// skip-for-time-being, this callGraph is used in the header comments
callGraph: operations
},
commandType);
}