async addCommandOperation()

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);
  }