function createPromptCommand()

in cli/azd/extensions/microsoft.azd.extensions/internal/resources/languages/javascript/commands/prompt.js [7:203]


function createPromptCommand() {
  const cmd = new Command('prompt');
  cmd.description('Examples of prompting the user for input.');

  cmd.action(async () => {
    const client = new AzdClient();

    logger.info('Prompting user for multi-select...');

    // === Prompt for multi-select
    await new Promise((resolve, reject) => {
      client.Prompt.multiSelect({
        options: {
          message: 'Which Azure services do you use most with AZD?',
          choices: [
            { label: 'Container Apps', value: 'container-apps' },
            { label: 'Functions', value: 'functions' },
            { label: 'Static Web Apps', value: 'static-web-apps' },
            { label: 'App Service', value: 'app-service' },
            { label: 'Cosmos DB', value: 'cosmos-db' },
            { label: 'SQL Database', value: 'sql-db' },
            { label: 'Storage', value: 'storage' },
            { label: 'Key Vault', value: 'key-vault' },
            { label: 'Kubernetes Service', value: 'kubernetes-service' }
          ]
        }
      }, client._metadata, (err, res) => {
        if (err) return reject(err);
        logger.info('Selected services', { values: res.values });
        resolve();
      });
    });

    // === Confirm whether to continue
    const confirm = await new Promise((resolve, reject) => {
      client.Prompt.confirm({
        options: {
          message: 'Do you want to search for Azure resources?',
          default_value: true
        }
      }, client._metadata, (err, res) => {
        if (err) return reject(err);
        resolve(res);
      });
    });

    if (!confirm?.value) {
      logger.info('Cancelled by user.');
      return;
    }

    // === Prompt for subscription
    const subRes = await new Promise((resolve, reject) => {
      client.Prompt.promptSubscription({}, client._metadata, (err, res) => {
        if (err) return reject(err);
        resolve(res);
      });
    });

    const subscription_id = subRes.subscription.id;
    const tenant_id = subRes.subscription.tenant_id;
    logger.info('Subscription selected', { subscription_id });
    logger.info('Tenant', { tenant_id });

    const credential = new DefaultAzureCredential();
    const armClient = new ResourceManagementClient(credential, subscription_id);

    let resource_type = '';

    // === Ask to filter by resource type
    const filterType = await new Promise((resolve, reject) => {
      client.Prompt.confirm({
        options: {
          message: 'Do you want to filter by resource type?',
          default_value: false
        }
      }, client._metadata, (err, res) => {
        if (err) return reject(err);
        resolve(res);
      });
    });

    if (filterType?.value) {
      const providers = [];
      for await (const p of armClient.providers.list()) {
        if (p.registrationState === 'Registered') {
          providers.push(p);
        }
      }

      const selectProviderRes = await new Promise((resolve, reject) => {
        client.Prompt.select({
          options: {
            message: 'Select a resource provider',
            choices: providers.map((p, i) => ({
              label: p.namespace,
              value: i.toString()
            }))
          }
        }, client._metadata, (err, res) => {
          if (err) return reject(err);
          resolve(res);
        });
      });

      const selectedProvider = providers[selectProviderRes.value];
      const resourceTypes = selectedProvider.resourceTypes || [];

      const selectTypeRes = await new Promise((resolve, reject) => {
        client.Prompt.select({
          options: {
            message: `Select a ${selectedProvider.namespace} resource type`,
            choices: resourceTypes.map((rt, i) => ({
              label: rt.resourceType,
              value: i.toString()
            }))
          }
        }, client._metadata, (err, res) => {
          if (err) return reject(err);
          resolve(res);
        });
      });

      resource_type = `${selectedProvider.namespace}/${resourceTypes[selectTypeRes.value].resourceType}`;
    }

    // === Ask to filter by resource group
    const filterGroup = await new Promise((resolve, reject) => {
      client.Prompt.confirm({
        options: {
          message: 'Do you want to filter by resource group?',
          default_value: false
        }
      }, client._metadata, (err, res) => {
        if (err) return reject(err);
        resolve(res);
      });
    });

    let context = {
      scope: {
        subscription_id,
        tenant_id
      }
    };

    if (filterGroup?.value) {
      // === Prompt for resource group
      const rgRes = await new Promise((resolve, reject) => {
        client.Prompt.promptResourceGroup({
          azure_context: context
        }, client._metadata, (err, res) => {
          if (err) return reject(err);
          resolve(res);
        });
      });

      context.scope.resource_group = rgRes.resource_group.name;

      const resourceRes = await new Promise((resolve, reject) => {
        client.Prompt.promptResourceGroupResource({
          azure_context: context,
          options: {
            resource_type,
            select_options: {
              allow_new_resource: false
            }
          }
        }, client._metadata, (err, res) => {
          if (err) return reject(err);
          resolve(res);
        });
      });

      logSelected(resourceRes?.resource);
    } else {
      const resourceRes = await new Promise((resolve, reject) => {
        client.Prompt.promptSubscriptionResource({
          azure_context: context,
          options: {
            resource_type,
            select_options: {
              allow_new_resource: false
            }
          }
        }, client._metadata, (err, res) => {
          if (err) return reject(err);
          resolve(res);
        });
      });

      logSelected(resourceRes?.resource);
    }
  });

  return cmd;
}