@forge/cli

12.15.0-experimental-43cfec412.16.0-next.6
out/command-line/register-installation-commands.js
~out/command-line/register-installation-commands.jsModified
+48−6
Index: package/out/command-line/register-installation-commands.js
===================================================================
--- package/out/command-line/register-installation-commands.js
+++ package/out/command-line/register-installation-commands.js
@@ -89,12 +89,13 @@
     cmd
         .command('uninstall')
         .contextOption()
         .environmentOption()
+        .batchUninstallOption()
         .requireAppId()
         .description(cli_shared_1.Text.uninstall.cmd.desc)
-        .action(async ({ site, environment, product }) => {
-        if (site && product) {
+        .action(async ({ site, environment, product, batch }) => {
+        if (site && product && !batch) {
             const installation = await installationsService.findOnlyMatchingInstallation({
                 site,
                 product,
                 environment
@@ -105,16 +106,31 @@
             const context = (0, uninstall_command_helpers_1.getInstallationContext)(installation, product);
             await (0, uninstall_command_helpers_1.performSingleUninstall)(installation.id, context, deps);
         }
         else {
-            const { installations } = await installationsService.listAppInstallations({ site, environment, product });
+            if (batch && environment === 'production') {
+                ui.info(cli_shared_1.Text.uninstall.uninstallBatchProductionError);
+                return;
+            }
+            const { installations } = await installationsService.listAppInstallations({ site, product });
             if (!installations.length) {
                 ui.info(cli_shared_1.Text.installList.noInstallations);
                 return;
             }
             const filteredInstallations = installations.filter((install) => install.product !== 'identity' && install.product !== 'jira-servicedesk');
-            const options = (0, uninstall_command_helpers_1.getMultiChoiceOptionsForUninstall)(filteredInstallations);
-            const selectedSitesIndexes = await ui.promptForTable(cli_shared_1.Text.uninstall.interactive.desc, cli_shared_1.Text.uninstall.interactive.progressInfo, ['Environment', 'Site', 'Atlassian app'], options);
+            let options = [];
+            let selectedSitesIndexes = [];
+            let completionMessage;
+            if (batch) {
+                const bulkUninstallDetails = await getBulkUninstallDetails(filteredInstallations, ui);
+                if (!bulkUninstallDetails) {
+                    return;
+                }
+                ({ options, selectedSitesIndexes, completionMessage } = bulkUninstallDetails);
+            }
+            else {
+                ({ options, selectedSitesIndexes, completionMessage } = await getSingleUninstallDetails(filteredInstallations, ui));
+            }
             const [firstUninstall, secondUninstall, hadAutoSelected] = (0, uninstall_command_helpers_1.getInstallationsFromSelection)(options, selectedSitesIndexes, filteredInstallations);
             if (hadAutoSelected) {
                 const confirmation = await ui.confirm(cli_shared_1.Text.uninstall.interactive.confirmOptionalContexts);
                 if (!confirmation) {
@@ -126,9 +142,9 @@
                 .filter((_, index) => !selectedSitesIndexes.includes(index))
                 .map(({ extra }) => filteredInstallations[extra.installationIdx]);
             firstUninstall.push(...(0, shared_1.getHangingIdentityInstallationsFromSite)(installations, remainingApps, selectedSites));
             if (firstUninstall.length > 1 || secondUninstall.length > 0) {
-                await (0, uninstall_command_helpers_1.performMultipleUninstalls)(firstUninstall, secondUninstall, deps);
+                await (0, uninstall_command_helpers_1.performMultipleUninstalls)(firstUninstall, secondUninstall, deps, completionMessage);
             }
             else if (firstUninstall.length === 1) {
                 await (0, uninstall_command_helpers_1.performSingleUninstall)(firstUninstall[0].id, firstUninstall[0].context, deps);
             }
@@ -143,5 +159,31 @@
     registerInstallAppCommand({ cmd: install, ...deps });
     (0, exports.registerListInstallationsCommand)({ cmd: install, ...deps });
 };
 exports.registerCommands = registerCommands;
+const getBulkUninstallDetails = async (installations, ui) => {
+    const filteredInstallations = installations.filter((install) => install.environmentType !== cli_shared_1.AppEnvironmentType.Production);
+    const options = (0, uninstall_command_helpers_1.getMultiChoiceOptionsForUninstall)(filteredInstallations).slice(0, cli_shared_1.MAX_BATCH_UNINSTALLS);
+    const remainingInstallations = filteredInstallations.length - options.length;
+    await ui.table([
+        ['environment', 'Environment'],
+        ['site', 'Site'],
+        ['product', 'Atlassian app']
+    ], options.map(({ names }) => ({
+        environment: names[0],
+        site: names[1],
+        product: names[2]
+    })));
+    const confirmuninstallBatch = await ui.confirm(cli_shared_1.Text.uninstall.interactive.confirmAllInstallations);
+    if (!confirmuninstallBatch) {
+        return;
+    }
+    const selectedSitesIndexes = options.map((_, index) => index);
+    const completionMessage = remainingInstallations > 0 ? cli_shared_1.Text.uninstall.uninstallBatchBanner(remainingInstallations) : undefined;
+    return { options, selectedSitesIndexes, completionMessage };
+};
+const getSingleUninstallDetails = async (installations, ui) => {
+    const options = (0, uninstall_command_helpers_1.getMultiChoiceOptionsForUninstall)(installations);
+    const selectedSitesIndexes = await ui.promptForTable(cli_shared_1.Text.uninstall.interactive.desc, cli_shared_1.Text.uninstall.interactive.progressInfo, ['Environment', 'Site', 'Atlassian app'], options);
+    return { options, selectedSitesIndexes, completionMessage: undefined };
+};
 //# sourceMappingURL=register-installation-commands.js.map
\ No newline at end of file