@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())