UNPKG

graphql-shield

Version:

GraphQL Server permissions as another layer of abstraction!

85 lines (84 loc) 2.49 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ValidationError = exports.validateRuleTree = void 0; const utils_js_1 = require("./utils.js"); /** * * @param ruleTree * * Validates the rule tree declaration by checking references of rule * functions. We deem rule tree valid if no two rules with the same name point * to different rules. * */ function validateRuleTree(ruleTree) { const rules = extractRules(ruleTree); const valid = rules.reduce(({ map, duplicates }, rule) => { if (!map.has(rule.name)) { return { map: map.set(rule.name, rule), duplicates }; } else if (!map.get(rule.name).equals(rule) && !duplicates.includes(rule.name)) { return { map: map.set(rule.name, rule), duplicates: [...duplicates, rule.name], }; } else { return { map, duplicates }; } }, { map: new Map(), duplicates: [] }); if (valid.duplicates.length === 0) { return { status: 'ok' }; } else { const duplicates = valid.duplicates.join(', '); return { status: 'err', message: `There seem to be multiple definitions of these rules: ${duplicates}`, }; } /* Helper functions */ /** * * @param ruleTree * * Extracts rules from rule tree. * */ function extractRules(ruleTree) { const resolvers = (0, utils_js_1.flattenObjectOf)(ruleTree, utils_js_1.isRuleFunction); const rules = resolvers.reduce((rules, rule) => { if ((0, utils_js_1.isLogicRule)(rule)) { return [...rules, ...extractLogicRules(rule)]; } else { return [...rules, rule]; } }, []); return rules; } /** * * Recursively extracts Rules from LogicRule * * @param rule */ function extractLogicRules(rule) { return rule.getRules().reduce((acc, shieldRule) => { if ((0, utils_js_1.isLogicRule)(shieldRule)) { return [...acc, ...extractLogicRules(shieldRule)]; } else { return [...acc, shieldRule]; } }, []); } } exports.validateRuleTree = validateRuleTree; class ValidationError extends Error { constructor(message) { super(message); } } exports.ValidationError = ValidationError;