@conte-ltd/trpc-shield
Version:
tRPC permissions as another layer of abstraction!
54 lines • 2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateMiddlewareFromRuleTree = void 0;
/**
*
* @param ruleTree
* @param options
*
* Generates middleware from given rules.
*
*/
function generateMiddlewareFromRuleTree(ruleTree, options) {
return ({ next, ctx, type, path, input, rawInput, }) => {
var _a, _b;
const opWithPath = path.split('.');
let rule;
if (opWithPath.length > 1) {
const opNames = opWithPath.reduce((prev, current, index) => {
if (index === 0) {
return [current, `${current}.*`];
}
else if (index === opWithPath.length - 1) {
const [prevHead, ...prevTail] = prev;
return [`${prevHead}.${current}`, ...prevTail, `*.${current}`];
}
else {
const [prevHead, ...prevTail] = prev;
return [`${prevHead}.${current}`, ...prevTail, `*.${current}.*`];
}
}, []);
opNames.push('*');
for (const opName of opNames) {
rule = (_a = ruleTree === null || ruleTree === void 0 ? void 0 : ruleTree[type]) === null || _a === void 0 ? void 0 : _a[opName];
if (rule !== undefined) {
break;
}
}
}
else {
const opName = opWithPath[0];
rule = (_b = ruleTree === null || ruleTree === void 0 ? void 0 : ruleTree[type]) === null || _b === void 0 ? void 0 : _b[opName];
}
if (rule) {
return rule.resolve(ctx, type, path, input, rawInput, options).then((result) => {
if (!result)
throw options.fallbackError;
return next();
});
}
return next();
};
}
exports.generateMiddlewareFromRuleTree = generateMiddlewareFromRuleTree;
//# sourceMappingURL=generator.js.map