@forge/cli

10.13.611.0.0-next.18
out/command-line/register-installation-commands.js
out/command-line/register-installation-commands.js
+29−32
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
@@ -1,41 +1,29 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.registerCommands = exports.performMultipleUninstalls = exports.performSingleUninstall = exports.validateContext = void 0;
+exports.registerCommands = exports.performMultipleUninstalls = exports.performSingleUninstall = exports.registerListInstallationsCommand = void 0;
 const cli_shared_1 = require("@forge/cli-shared");
 const shared_1 = require("../installations/shared");
 const errors_1 = require("./errors");
 const semver_1 = require("semver");
 const COMMAND_NAME = 'install';
-async function validateContext({ site, product }) {
-    if (product) {
-        product = (0, cli_shared_1.productDisplayName)(product);
-        if (!(0, cli_shared_1.isSupportedProduct)(product)) {
-            throw new cli_shared_1.ValidationError(cli_shared_1.Text.error.invalidProduct);
-        }
-    }
-    const siteURL = site ? (0, cli_shared_1.validateSite)(site, product) : undefined;
-    return { siteURL, product };
-}
-exports.validateContext = validateContext;
-const registerInstallAppCommand = ({ cmd, controllers: { installController } }) => {
+const registerInstallAppCommand = async ({ cmd, controllers: { installController }, services: { supportedProductsService } }) => {
+    const supportedProducts = await supportedProductsService.getSupportedProducts();
     cmd
         .requireAppId()
         .environmentOption()
-        .option('-s, --site [site]', cli_shared_1.Text.optionSite)
-        .option('-p, --product [product]', cli_shared_1.Text.optionProduct((0, cli_shared_1.getSupportedProducts)()))
-        .precondition(validateContext)
+        .contextOption(supportedProducts)
         .option('--upgrade', cli_shared_1.Text.install.optionUpgrade, false)
         .option('--confirm-scopes', cli_shared_1.Text.install.optionConfirmScopes, false)
         .option('-l, --license [license]', cli_shared_1.Text.install.optionLicense)
         .option('--license-modes [licenseModes...]', cli_shared_1.Text.install.optionLicenseModes)
         .option('--users-with-access [user...]', cli_shared_1.Text.install.optionUsersWithAccess)
         .nonInteractiveOption('--site', '--product', '--environment')
         .description(cli_shared_1.Text.install.cmd.description)
-        .action(async ({ environment, siteURL, product, upgrade, confirmScopes, license, licenseModes, usersWithAccess, nonInteractive }) => {
+        .action(async ({ environment, site, product, upgrade, confirmScopes, license, licenseModes, usersWithAccess, nonInteractive }) => {
         await installController.run({
             environment,
-            site: siteURL,
+            site,
             product,
             upgrade,
             confirmScopes,
             license,
@@ -53,20 +41,21 @@
         .jsonOption()
         .description(cli_shared_1.Text.installList.cmd)
         .action(async ({ json }) => {
         const { installations } = await installationsService.listAppInstallations();
+        const hasSecondaryInstallations = installations.some(({ secondaryProducts }) => secondaryProducts?.length);
         ui.table([
             ['id', 'Installation ID'],
             ['environment', 'Environment'],
             ['site', 'Site'],
-            ['product', 'Product'],
+            ['product', hasSecondaryInstallations ? 'Product(s)' : 'Product'],
             ['version', 'Version'],
             ['majorVersion', 'Major Version']
-        ], installations.map(({ id, environmentKey, product, site, version: { isLatest, version } }) => ({
+        ], installations.map(({ id, environmentKey, product, secondaryProducts, site, version: { isLatest, version } }) => ({
             id,
             environment: (0, cli_shared_1.environmentToOption)(environmentKey),
             site,
-            product: (0, cli_shared_1.productDisplayName)(product),
+            product: (0, cli_shared_1.productsDisplayName)(product, secondaryProducts),
             version: cli_shared_1.Text.install.booleanToScope(isLatest),
             majorVersion: (0, semver_1.major)(version).toString()
         })), {
             json,
@@ -74,8 +63,9 @@
             preMessage: cli_shared_1.Text.installList.banner
         });
     });
 };
+exports.registerListInstallationsCommand = registerListInstallationsCommand;
 const performSingleUninstall = async (installId, { ui, commands: { uninstallAppCommand } }) => {
     const installation = await ui.displayProgress(() => uninstallAppCommand.execute(installId), cli_shared_1.Text.uninstall.cmd.start, (result) => ({
         successful: !!result.successful,
         message: cli_shared_1.Text.uninstall.cmd.success(false)
@@ -120,26 +110,33 @@
         ui.info(cli_shared_1.Text.uninstall.interactive.done);
     }
 };
 exports.performMultipleUninstalls = performMultipleUninstalls;
-const registerUninstallCommand = (deps) => {
-    const { cmd, ui, services: { installationsService } } = deps;
+const registerUninstallCommand = async (deps) => {
+    const { cmd, ui, services: { installationsService, supportedProductsService } } = deps;
+    const supportedProducts = await supportedProductsService.getSupportedProducts();
     cmd
-        .command('uninstall [installationId]')
+        .command('uninstall')
+        .contextOption(supportedProducts)
+        .environmentOption()
         .requireAppId()
         .description(cli_shared_1.Text.uninstall.cmd.desc)
-        .action(async (installationId) => {
+        .action(async ({ site, environment, product }) => {
         const { installations } = await installationsService.listAppInstallations();
         if (!installations.length) {
             ui.info(cli_shared_1.Text.installList.noInstallations);
             return;
         }
-        const installId = installationId?.trim();
-        if (installId && installId.length > 0) {
+        if (site && product) {
+            const installation = await installationsService.findOnlyMatchingInstallation({
+                site,
+                product,
+                environment
+            });
             ui.info(cli_shared_1.Text.uninstall.info);
             ui.info(cli_shared_1.Text.ctrlC);
             ui.emptyLine();
-            await (0, exports.performSingleUninstall)(installId, deps);
+            await (0, exports.performSingleUninstall)(installation.id, deps);
         }
         else {
             const filteredInstallations = installations.filter((install) => install.product !== 'identity' && install.product !== 'jira-servicedesk');
             const selectedSitesIndexes = await ui.promptForTable(cli_shared_1.Text.uninstall.interactive.desc, cli_shared_1.Text.uninstall.interactive.progressInfo, ['Environment', 'Site', 'Product'], filteredInstallations.map(({ id, environmentKey, product, site }) => ({
@@ -159,12 +156,12 @@
         }
     });
 };
 const DEPRECATED_LIST_COMMAND = 'install:list';
-const registerCommands = ({ cmd, ...deps }) => {
+const registerCommands = async ({ cmd, ...deps }) => {
     const install = cmd.command(COMMAND_NAME).description(cli_shared_1.Text.variables.description);
-    registerUninstallCommand({ cmd, ...deps });
+    await registerUninstallCommand({ cmd, ...deps });
     cmd.deprecatedCommand(DEPRECATED_LIST_COMMAND, `${COMMAND_NAME} ${LIST_COMMAND_NAME}`, deps.controllers.stubController);
-    registerInstallAppCommand({ cmd: install, ...deps });
-    registerListInstallationsCommand({ cmd: install, ...deps });
+    await registerInstallAppCommand({ cmd: install, ...deps });
+    (0, exports.registerListInstallationsCommand)({ cmd: install, ...deps });
 };
 exports.registerCommands = registerCommands;