function createVirtualParameters()

in powershell/plugins/plugin-create-inline-properties.ts [341:410]


function createVirtualParameters(operation: CommandOperation) {
  // dolauli expand body parameter
  // for virtual parameters, there are two keys, operation and body
  const virtualParameters = {
    operation: new Array<VirtualParameter>(),
    body: new Array<VirtualParameter>()
  };

  const dropBodyParameter = !!operation.details.default.dropBodyParameter;
  // loop thru the parameters of the command operation, and if there is a body parameter, expand it if necessary.
  for (const parameter of values(operation.parameters)) {
    if (parameter.details.default.constantValue) {
      // this parameter has a constant value -- SKIP IT
      continue;
    }
    // dolauli fromhost and apiversion are not exposed, this if block looks useless
    if (parameter.details.default.fromHost || parameter.details.default.apiversion) {
      // handled in the generator right now. Not exposed to the user directly.
      continue;
    }

    if (dropBodyParameter && parameter.details.default.isBodyParameter) {
      // the client will make a hidden body parameter for this, and we're expected to fill it.
      const vps = parameter.schema.language.default.virtualProperties;
      if (vps) {
        for (const virtualProperty of [...vps.inherited, ...vps.owned, ...vps.inlined]) {
          // dolauli add virtual parameter for virtual property
          if (virtualProperty.private || virtualProperty.readOnly || virtualProperty.property.readOnly || virtualProperty.property.language.default.constantValue !== undefined || virtualProperty.property.language.default.HeaderProperty === 'Header') {
            // private or readonly properties aren't needed as parameters. 
            continue;
          }
          // Add support for x-ms-mutability
          if (operation.operationType === OperationType.Create && !(<VirtualProperty>virtualProperty).create) {
            continue;
          } else if (operation.operationType === OperationType.Update && !(<VirtualProperty>virtualProperty).update) {
            continue;
          }
          virtualParameters.body.push({
            name: virtualProperty.name,
            description: virtualProperty.property.language.default.description,
            nameOptions: virtualProperty.nameOptions,
            required: parameter.required ? shouldBeRequired(operation, virtualProperty) : false,
            schema: virtualProperty.property.schema,
            origin: virtualProperty,
            alias: []
          });
        }
      }
    } else {
      // dolauli if not drop body or not body parameter add it to operation 
      const combinedDescription = getCombinedDescription(parameter.schema.language.default.description, parameter.schema.externalDocs?.url);
      parameter.schema.language.default.description = combinedDescription;

      virtualParameters.operation.push({
        name: parameter.details.default.name,
        nameOptions: [parameter.details.default.name],
        description: parameter.details.default.description,
        required: parameter.details.default.isBodyParameter ? true : parameter.required,
        schema: parameter.schema,
        origin: parameter,
        alias: []
      });
    }
  }

  resolveParameterNames([], virtualParameters);

  // dolauli see operation.details.default.virtualParameters
  operation.details.default.virtualParameters = virtualParameters;
}