@forge/manifest

13.8.0-next.313.8.0-next.4
out/validators/display-conditions-validator.js
~out/validators/display-conditions-validator.jsModified
+20−1
Index: package/out/validators/display-conditions-validator.js
===================================================================
--- package/out/validators/display-conditions-validator.js
+++ package/out/validators/display-conditions-validator.js
@@ -1,13 +1,14 @@
 "use strict";
 Object.defineProperty(exports, "__esModule", { value: true });
-exports.DisplayConditionsValidator = void 0;
+exports.DisplayConditionsValidator = exports.MAX_FLAG_ENABLED_CONDITIONS = void 0;
 const tslib_1 = require("tslib");
 const ajv_1 = tslib_1.__importDefault(require("ajv"));
 const display_condition_types_1 = require("../types/display-condition-types");
 const text_1 = require("../text");
 const isPlainObject = (obj) => Object.prototype.toString.call(obj) === '[object Object]';
 const errors = text_1.errors.modules.displayConditions;
+exports.MAX_FLAG_ENABLED_CONDITIONS = 10;
 const pageLocation = (page, index) => typeof page?.route === 'string' ? `page "${page.route}"` : `page[${index}]`;
 const sectionLocation = (section, index) => typeof section?.header === 'string' ? `section "${section.header}"` : `section[${index}]`;
 const isJiraOrJsmModuleType = (moduleType) => moduleType.startsWith('jira:') || moduleType.startsWith('jiraServiceManagement:');
 class DisplayConditionsValidator {
@@ -126,8 +127,20 @@
                 }
             });
         });
     }
+    countIsFlagEnabledConditions(moduleType, moduleKey, displayConditions) {
+        if (!isPlainObject(displayConditions)) {
+            return 0;
+        }
+        try {
+            const flattened = this.flattenDisplayConditions(moduleType, moduleKey, displayConditions);
+            return flattened.filter((condition) => Object.prototype.hasOwnProperty.call(condition, 'isFlagEnabled')).length;
+        }
+        catch {
+            return 0;
+        }
+    }
     async validate(manifest) {
         if (!manifest ||
             !manifest.typedContent ||
             (!manifest.typedContent.modules && !manifest.typedContent.connectModules)) {
@@ -143,8 +156,9 @@
                 manifestObject: manifest
             };
         }
         const validationErrors = new Map();
+        let flagEnabledConditionCount = 0;
         Object.keys(this.moduleSchemas).forEach((moduleType) => {
             modules[moduleType]?.forEach((module) => {
                 const reportError = (errorKey, message) => {
                     const key = `${module.key}__${errorKey}`;
@@ -152,8 +166,9 @@
                         validationErrors.set(key, this.toValidationError(message));
                     }
                 };
                 this.validateDisplayConditions(moduleType, module.key, module.displayConditions, reportError);
+                flagEnabledConditionCount += this.countIsFlagEnabledConditions(moduleType, module.key, module.displayConditions);
             });
         });
         Object.keys(this.moduleSchemas).forEach((moduleType) => {
             if (!display_condition_types_1.ModuleWithNestedDisplayConditions.includes(moduleType)) {
@@ -167,11 +182,15 @@
                             validationErrors.set(key, this.toValidationError(message));
                         }
                     };
                     this.validateDisplayConditions(moduleType, module.key, target.displayConditions, reportError, target.location);
+                    flagEnabledConditionCount += this.countIsFlagEnabledConditions(moduleType, module.key, target.displayConditions);
                 });
             });
         });
+        if (flagEnabledConditionCount > exports.MAX_FLAG_ENABLED_CONDITIONS) {
+            validationErrors.set('app__isFlagEnabledLimit', this.toValidationError(errors.tooManyFlagEnabledConditions(exports.MAX_FLAG_ENABLED_CONDITIONS)));
+        }
         return {
             success: validationErrors.size === 0,
             manifestObject: manifest,
             errors: Array.from(validationErrors.values())