@forge/manifest

12.5.0-next.412.5.0-next.5
out/validators/compatibility-validator.js
~out/validators/compatibility-validator.jsModified
+16−1
Index: package/out/validators/compatibility-validator.js
===================================================================
--- package/out/validators/compatibility-validator.js
+++ package/out/validators/compatibility-validator.js
@@ -12,10 +12,25 @@
                 manifestObject: manifest
             };
         }
         const validationErrors = [];
+        const app = manifest.typedContent.app;
         const modules = manifest.typedContent.modules || {};
-        const compatibility = manifest.typedContent.app?.compatibility || {};
+        const compatibility = app?.compatibility || {};
+        const installationTarget = app?.installationTarget;
+        const shouldCheckRequiredContext = installationTarget === undefined || installationTarget === 'site';
+        if (shouldCheckRequiredContext) {
+            const hasCompatibilityKeys = Object.keys(compatibility).length > 0;
+            const requiredContexts = Object.keys(compatibility).filter((key) => compatibility[key]?.required === true);
+            if (hasCompatibilityKeys && requiredContexts.length !== 1) {
+                validationErrors.push({
+                    message: text_1.errors.app.compatibility.oneRequiredContext(),
+                    reference: text_2.References.SchemaError,
+                    level: 'error',
+                    ...(0, utils_1.findPosition)('compatibility', manifest.yamlContentByLine)
+                });
+            }
+        }
         const isJiraPrimary = compatibility.jira?.required === true;
         const isConfluencePrimary = compatibility.confluence?.required === true;
         const moduleKeys = Object.keys(modules);
         if (isJiraPrimary && moduleKeys.some((key) => key === 'confluence:fullPage')) {