@forge/cli

14.1.0-next.19-experimental-fd0ebbc14.1.0-next.32
out/command-line/controller/install-controller.js
~out/command-line/controller/install-controller.jsModified
+60−5
Index: package/out/command-line/controller/install-controller.js
===================================================================
--- package/out/command-line/controller/install-controller.js
+++ package/out/command-line/controller/install-controller.js
@@ -3,8 +3,9 @@
 exports.InstallController = exports.NoDeploymentError = void 0;
 const cli_shared_1 = require("@forge/cli-shared");
 const manifest_1 = require("@forge/manifest");
 const install_deeplinks_1 = require("./install-deeplinks");
+const global_app_1 = require("../../installations/global-app");
 const register_version_commands_1 = require("../register-version-commands");
 class NoDeploymentError extends Error {
     constructor(environment) {
         super(cli_shared_1.Text.install.error.noDeploymentFound(environment));
@@ -21,9 +22,10 @@
     supportedProductsService;
     statsigService;
     devSpaceService;
     siteService;
-    constructor(appConfigProvider, configFile, ui, installAppSiteCommand, installationService, installView, supportedProductsService, statsigService, devSpaceService, siteService) {
+    globalInstallController;
+    constructor(appConfigProvider, configFile, ui, installAppSiteCommand, installationService, installView, supportedProductsService, statsigService, devSpaceService, siteService, globalInstallController) {
         this.appConfigProvider = appConfigProvider;
         this.configFile = configFile;
         this.ui = ui;
         this.installAppSiteCommand = installAppSiteCommand;
@@ -32,8 +34,9 @@
         this.supportedProductsService = supportedProductsService;
         this.statsigService = statsigService;
         this.devSpaceService = devSpaceService;
         this.siteService = siteService;
+        this.globalInstallController = globalInstallController;
     }
     async securityPrompt(site) {
         this.ui.info(cli_shared_1.Text.install.security.banner(site.host));
         let isTrustedApp = true;
@@ -210,20 +213,71 @@
             throw new cli_shared_1.UserError(cli_shared_1.Text.install.error.majorVersionNotFound);
         }
         return result;
     }
-    async run({ environment, site, products, upgrade, confirmScopes, license, licenseModes, usersWithAccess, nonInteractive, majorVersion, appIdOverride }) {
+    async run({ environment, site, products, upgrade, confirmScopes, license, licenseModes, usersWithAccess, nonInteractive, majorVersion, appIdOverride, unitId }) {
         const id = appIdOverride ?? (await this.appConfigProvider()).id;
         await this.devSpaceService.displayEnforcementWarningsIfNeeded(this.ui, id, 'install');
+        let manifestConfig;
+        let versionPermissions;
+        let isGlobal;
+        if (appIdOverride) {
+            versionPermissions = majorVersion
+                ? await this.getVersionPermissionsByMajorVersion(id, environment, majorVersion)
+                : await this.installationService.getAppEnvironmentPermissions(id, environment);
+            isGlobal = versionPermissions?.installationTarget === cli_shared_1.InstallationTarget.Unit;
+        }
+        else {
+            manifestConfig = await this.configFile.readConfig();
+            isGlobal = (0, global_app_1.isGlobalApp)(manifestConfig.app);
+        }
+        if (isGlobal) {
+            const { isUpgrade, isCodeUpgrade } = this.validateUpgradeTarget(upgrade);
+            const validLicense = this.validateLicenseOption(license, environment);
+            const overrides = await this.validateEcosystemAppInstallationOverridesInput(licenseModes, usersWithAccess, environment);
+            const majorVersionResult = majorVersion
+                ? versionPermissions ?? (await this.getVersionPermissionsByMajorVersion(id, environment, majorVersion))
+                : undefined;
+            const majorVersionId = majorVersionResult?.versionId;
+            if (isUpgrade) {
+                await this.globalInstallController.runUpgrade({
+                    appId: id,
+                    environment,
+                    nonInteractive,
+                    unitId,
+                    majorVersionId,
+                    isCodeUpgrade
+                });
+            }
+            else {
+                if (majorVersionResult && !majorVersionResult.isLatest && majorVersionResult.version) {
+                    this.ui.warn(cli_shared_1.Text.install.majorVersionIsNotLatest(majorVersionResult.version));
+                    if (!nonInteractive && !(await this.ui.confirm(cli_shared_1.Text.install.devAppInstallConfirm)))
+                        return;
+                }
+                await this.globalInstallController.run({
+                    appId: id,
+                    environment,
+                    nonInteractive,
+                    unitId,
+                    majorVersionId,
+                    licenseOverride: validLicense,
+                    overrides,
+                    product: products?.[0],
+                    site
+                });
+            }
+            return;
+        }
         const { isUpgrade, isCodeUpgrade } = this.validateUpgradeTarget(upgrade);
         const text = isUpgrade ? cli_shared_1.Text.upgrade : cli_shared_1.Text.install;
         const validLicense = this.validateLicenseOption(license, environment);
         const overrides = await this.validateEcosystemAppInstallationOverridesInput(licenseModes, usersWithAccess, environment);
         let environmentPermissions;
         let requiredProducts;
         let appFeatures;
         if (majorVersion) {
-            const majorVersionResult = await this.getVersionPermissionsByMajorVersion(id, environment, majorVersion);
+            const majorVersionResult = versionPermissions ?? (await this.getVersionPermissionsByMajorVersion(id, environment, majorVersion));
             if (!isUpgrade && !majorVersionResult.isLatest && majorVersionResult.version) {
                 this.ui.warn(cli_shared_1.Text.install.majorVersionIsNotLatest(majorVersionResult.version));
                 if (!nonInteractive && !(await this.ui.confirm(cli_shared_1.Text.install.devAppInstallConfirm)))
                     return;
@@ -232,9 +286,10 @@
             requiredProducts = majorVersionResult.requiredProducts;
             appFeatures = majorVersionResult.appFeatures;
         }
         else {
-            environmentPermissions = await this.installationService.getAppEnvironmentPermissions(id, environment);
+            environmentPermissions =
+                versionPermissions ?? (await this.installationService.getAppEnvironmentPermissions(id, environment));
             requiredProducts = environmentPermissions?.requiredProducts;
             appFeatures = environmentPermissions?.appFeatures;
         }
         let scopesFromLastInstallation = new Set();
@@ -273,9 +328,9 @@
         let manifestEgressAddresses = [...environmentEgressAddresses];
         let manifestModules;
         if (!appIdOverride) {
             const [{ permissions, modules }, manifestEgressEntries] = await Promise.all([
-                this.configFile.readConfig(),
+                manifestConfig ? Promise.resolve(manifestConfig) : this.configFile.readConfig(),
                 this.configFile.getEgressPermissions()
             ]);
             this.checkForUIKit1Modules(modules);
             manifestModules = modules;