Repository URL to install this package:
|
Version:
1.2.19 ▾
|
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.filterWithRules = filterWithRules;
exports.filterWithRulesLoop = filterWithRulesLoop;
exports.default = void 0;
function filterWithRulesLoop(rules, obj, basePropPath = '') {
return Object.keys(rules).reduce((acc, key) => {
const propPath = basePropPath !== '' ? `${basePropPath}.${key}` : key;
if (typeof rules[key] === 'object') {
if (typeof obj[key] !== 'object') {
throw new Error(`Expected prop at path "${propPath}" to be an object`);
}
acc[key] = filterWithRulesLoop(rules[key], obj[key], propPath); // eslint-disable-line no-param-reassign,max-len
} else if (rules[key]) {
if (typeof obj[key] === 'undefined') {
throw new Error(`Filter set an "allow" on path "${propPath}", however, this path was not found on the source object.`);
}
acc[key] = obj[key]; // eslint-disable-line no-param-reassign
}
return acc;
}, {});
}
/**
* Applies a rules object to filter a given object's structure.
*
* The rules object should match the shape of the source object and should
* have a truthy/falsey value indicating if a property should be included/
* excluded. If the filters do not contain a property that exists on the
* source object then the respective property will be excluded.
*
* @param {Object} rules : The filter rules.
* @param {Object} obj : The object to filter.
*
* @return {Object}
* The filtered object.
*
* @example
* filter(
* // rules
* {
* foo: { bar: true },
* poop: true
* },
* // source
* {
* foo: { bar: 'bar', qux: 'qux' },
* bob: 'bob',
* poop: { plop: 'splash' }
* },
* )
*/
function filterWithRules(rules, obj) {
return filterWithRulesLoop(rules, obj);
}
var _default = filterWithRules;
exports.default = _default;