@forge/cli

12.13.2-next.0-experimental-5b1825712.14.0-next.2
out/command-line/register-installation-commands.js
out/command-line/register-installation-commands.js
+28−9
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,8 +1,10 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
 exports.registerCommands = exports.registerListInstallationsCommand = void 0;
+const tslib_1 = require("tslib");
 const cli_shared_1 = require("@forge/cli-shared");
+const chalk_1 = tslib_1.__importDefault(require("chalk"));
 const shared_1 = require("../installations/shared");
 const uninstall_command_helpers_1 = require("./uninstall-command-helpers");
 const semver_1 = require("semver");
 const COMMAND_NAME = 'install';
@@ -42,21 +44,38 @@
         .jsonOption()
         .description(cli_shared_1.Text.installList.cmd)
         .action(async ({ json }) => {
         const { installations } = await installationsService.listAppInstallations();
-        ui.table([
+        const getStatus = (permissionVersionIsLatest, appVersion, computeVersion) => {
+            if (permissionVersionIsLatest) {
+                return 'Up-to-date';
+            }
+            return (0, semver_1.lt)(appVersion, computeVersion) ? 'Permissions outdated' : 'App update available';
+        };
+        const formatByStatus = (isUpToDate, value) => isUpToDate ? chalk_1.default.green(value) : chalk_1.default.yellow(value);
+        const columns = [
             ['id', 'Installation ID'],
             ['environment', 'Environment'],
             ['site', 'Site'],
             ['product', 'Atlassian apps'],
-            ['majorVersion', 'Major 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.productsDisplayName)(product, secondaryProducts),
-            majorVersion: `${(0, semver_1.major)(version).toString()} ${cli_shared_1.Text.install.booleanToScope(isLatest)}`
-        })), {
+            ...(json ? [['majorVersion', 'Major Version']] : []),
+            ['appVersion', 'App version'],
+            ['status', 'Status']
+        ];
+        ui.table(columns, installations.map(({ id, environmentKey, product, secondaryProducts, site, version: { isLatest: permissionVersionIsLatest, version: appVersion }, computeVersion }) => {
+            const status = getStatus(permissionVersionIsLatest, appVersion, computeVersion.version);
+            const isUpToDate = permissionVersionIsLatest;
+            const appVersionValue = (0, semver_1.major)(computeVersion.version).toString();
+            return {
+                id,
+                environment: (0, cli_shared_1.environmentToOption)(environmentKey),
+                site,
+                product: (0, cli_shared_1.productsDisplayName)(product, secondaryProducts),
+                majorVersion: `${(0, semver_1.major)(appVersion).toString()} ${cli_shared_1.Text.install.booleanToScope(permissionVersionIsLatest)}`,
+                appVersion: json ? appVersionValue : formatByStatus(isUpToDate, appVersionValue),
+                status: json ? status : formatByStatus(isUpToDate, status)
+            };
+        }), {
             json,
             emptyMessage: cli_shared_1.Text.installList.noInstallations,
             preMessage: cli_shared_1.Text.installList.banner
         });