@forge/bridge
5.13.1-next.35.14.0-next.4
out/permissions/permissionsUtil.js~
out/permissions/permissionsUtil.jsModified+29
Index: package/out/permissions/permissionsUtil.js
===================================================================
--- package/out/permissions/permissionsUtil.js
+++ package/out/permissions/permissionsUtil.js
@@ -105,13 +105,42 @@
Object.assign(missingExternal, missingResources);
}
return missingExternal;
}
+function validateObjectField(value, fieldPath) {
+ if (value !== undefined) {
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
+ throw new TypeError(`${fieldPath} should be an object, not ${Array.isArray(value) ? 'an array' : `a ${typeof value}`}`);
+ }
+ }
+}
+function validateArrayField(value, fieldPath) {
+ if (value !== undefined && !Array.isArray(value)) {
+ throw new TypeError(`${fieldPath} should be an array, not a ${typeof value}`);
+ }
+}
+function validatePermissionShape(requiredPermissions) {
+ validateArrayField(requiredPermissions.scopes, 'scopes');
+ const external = requiredPermissions.external;
+ if (external === undefined)
+ return;
+ validateObjectField(external, 'external');
+ if (external.fetch !== undefined) {
+ validateObjectField(external.fetch, 'external.fetch');
+ for (const type of FETCH_TYPES) {
+ validateArrayField(external.fetch[type], `external.fetch.${type}`);
+ }
+ }
+ for (const type of RESOURCE_TYPES) {
+ validateArrayField(external[type], `external.${type}`);
+ }
+}
async function checkPermissions(requiredPermissions, runtimePermissions) {
var _a;
if (!requiredPermissions) {
return { granted: false, missing: null };
}
+ validatePermissionShape(requiredPermissions);
if (!((_a = requiredPermissions.scopes) === null || _a === void 0 ? void 0 : _a.length) && !requiredPermissions.external) {
return { granted: true, missing: null };
}
let permissionsToCheck = runtimePermissions;