@forge/cli

13.3.0-next.20-experimental-cf2ad4c13.3.0-next.12-experimental-4b981ef-experimental-5b8eb3c
out/module-add/manifest-merger.js
~out/module-add/manifest-merger.jsModified
+18−39
Index: package/out/module-add/manifest-merger.js
===================================================================
--- package/out/module-add/manifest-merger.js
+++ package/out/module-add/manifest-merger.js
@@ -8,10 +8,9 @@
 const path_1 = tslib_1.__importDefault(require("path"));
 const yaml_1 = tslib_1.__importStar(require("yaml"));
 const diff_1 = require("diff");
 const cli_shared_1 = require("@forge/cli-shared");
-const COMPATIBILITY_PRODUCTS = new Set(['jira', 'confluence']);
-const GLOBAL_COMPATIBILITY_PRODUCTS = ['jira', 'confluence'];
+const COMPATIBILITY_PRODUCTS = new Set(['jira', 'confluence', 'compass']);
 const ROOT_SECTION_ORDER = ['modules', 'resources', 'permissions', 'app'];
 const RESOURCE_FIELD_ORDER = ['key', 'path', 'entry'];
 const ROOT_INSERT_OPTIONS = { orderedKeys: ROOT_SECTION_ORDER };
 const MODULE_INSERT_OPTIONS = { appendBeforeKey: 'function' };
@@ -272,55 +271,35 @@
     return value !== null && typeof value === 'object' && !Array.isArray(value);
 }
 function applyCrossProductCompatibility(existingManifest, manifestFragment, template, warnings) {
     const newProduct = template.product;
+    if (!newProduct || !COMPATIBILITY_PRODUCTS.has(newProduct))
+        return;
     const existingProducts = collectProductPrefixes(existingManifest.modules);
+    existingProducts.delete(newProduct);
+    const compatProducts = [...existingProducts].filter((p) => COMPATIBILITY_PRODUCTS.has(p));
+    if (compatProducts.length === 0)
+        return;
     const existingApp = isObject(existingManifest.app) ? existingManifest.app : undefined;
     const existingCompatibility = existingApp && isObject(existingApp.compatibility) ? existingApp.compatibility : {};
     const fragmentApp = isObject(manifestFragment.app) ? manifestFragment.app : {};
     const fragmentCompatibility = isObject(fragmentApp.compatibility) ? fragmentApp.compatibility : {};
+    const hasRequiredContext = Object.values(existingCompatibility).some((value) => isObject(value) && value.required === true);
     const nextCompatibility = { ...fragmentCompatibility };
-    const entriesToAdd = [];
-    let warningMessage;
-    if (newProduct === 'global') {
-        const requiredProduct = existingProducts.has('jira') || !existingProducts.has('confluence') ? 'jira' : 'confluence';
-        for (const product of GLOBAL_COMPATIBILITY_PRODUCTS) {
-            if (isObject(existingCompatibility[product]) || isObject(nextCompatibility[product])) {
-                continue;
-            }
-            entriesToAdd.push({ product, required: product === requiredProduct });
-        }
-        warningMessage = cli_shared_1.Text.module.add.warnAddedGlobalAppCompatibility(requiredProduct);
+    let primaryAssigned = hasRequiredContext;
+    for (const existingProduct of compatProducts) {
+        if (isObject(existingCompatibility[existingProduct]) || isObject(nextCompatibility[existingProduct]))
+            continue;
+        nextCompatibility[existingProduct] = { required: !primaryAssigned };
+        primaryAssigned = true;
     }
-    else {
-        if (!newProduct || !COMPATIBILITY_PRODUCTS.has(newProduct))
-            return;
-        existingProducts.delete(newProduct);
-        const compatProducts = [...existingProducts].filter((product) => COMPATIBILITY_PRODUCTS.has(product));
-        if (compatProducts.length === 0)
-            return;
-        const hasRequiredContext = Object.values(existingCompatibility).some((value) => isObject(value) && value.required === true);
-        let primaryAssigned = hasRequiredContext;
-        for (const existingProduct of compatProducts) {
-            if (isObject(existingCompatibility[existingProduct]) || isObject(nextCompatibility[existingProduct])) {
-                continue;
-            }
-            entriesToAdd.push({ product: existingProduct, required: !primaryAssigned });
-            primaryAssigned = true;
-        }
-        if (!isObject(existingCompatibility[newProduct]) && !isObject(nextCompatibility[newProduct])) {
-            entriesToAdd.push({ product: newProduct, required: false });
-        }
-        warningMessage = cli_shared_1.Text.module.add.warnAddedAppCompatibility(compatProducts, newProduct);
+    if (!isObject(existingCompatibility[newProduct]) && !isObject(nextCompatibility[newProduct])) {
+        nextCompatibility[newProduct] = { required: false };
     }
-    if (entriesToAdd.length === 0 || !warningMessage) {
+    if (Object.keys(nextCompatibility).length === Object.keys(fragmentCompatibility).length)
         return;
-    }
-    for (const { product, required } of entriesToAdd) {
-        nextCompatibility[product] = { required };
-    }
     manifestFragment.app = { ...fragmentApp, compatibility: nextCompatibility };
-    warnings.push(warningMessage);
+    warnings.push(cli_shared_1.Text.module.add.warnAddedAppCompatibility(compatProducts, newProduct));
 }
 function collectProductPrefixes(modules) {
     const prefixes = new Set();
     if (!isObject(modules))