60 lines
2.0 KiB
JavaScript
60 lines
2.0 KiB
JavaScript
|
import includes from 'lodash-es/includes';
|
||
|
import isArray from 'lodash-es/isArray';
|
||
|
import isFunction from 'lodash-es/isFunction';
|
||
|
import map from 'lodash-es/map';
|
||
|
import reduce from 'lodash-es/reduce';
|
||
|
import trim from 'lodash-es/trim';
|
||
|
|
||
|
/**
|
||
|
* Returns an Array of visibility values.
|
||
|
* e.g. public,all => ['public, 'all']
|
||
|
* @param visibility
|
||
|
* @returns {*}
|
||
|
*/
|
||
|
export const parse = (visibility) => {
|
||
|
if (!visibility) {
|
||
|
return ['public'];
|
||
|
}
|
||
|
|
||
|
return map(visibility.split(','), trim);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Filter resources by visibility.
|
||
|
*
|
||
|
* All resources that have a visibility property, can use this static helper function.
|
||
|
*
|
||
|
*
|
||
|
* @param {Array|Object} items - the items to filter
|
||
|
* @param {Array|String} visibility - the visibility setting to filter on (default: 'public')
|
||
|
* @param {Function} [fn] - function to apply to each item before returning
|
||
|
* @returns {Array|Object} filtered items
|
||
|
*/
|
||
|
export const filter = (items, visibility, fn) => {
|
||
|
if (isFunction(visibility)) {
|
||
|
fn = visibility;
|
||
|
visibility = null;
|
||
|
}
|
||
|
|
||
|
const memo = isArray(items) ? [] : {};
|
||
|
const visArray = isArray(visibility) ? visibility : parse(visibility);
|
||
|
|
||
|
// Fallback behaviour for items that don't have visibility set on them
|
||
|
const defaultVisibility = 'public';
|
||
|
const returnByDefault = includes(visArray, defaultVisibility);
|
||
|
|
||
|
// We don't want to change the structure of what is returned
|
||
|
return reduce(items, function (accumulator, item, key) {
|
||
|
// If the item has visibility, check to see if it matches, else if there's no visibility check for a match with the default visibility
|
||
|
if (includes(visArray, 'all') || item.visibility && includes(visArray, item.visibility) || !item.visibility && returnByDefault) {
|
||
|
const newItem = fn ? fn(item) : item;
|
||
|
if (isArray(items)) {
|
||
|
accumulator.push(newItem);
|
||
|
} else {
|
||
|
accumulator[key] = newItem;
|
||
|
}
|
||
|
}
|
||
|
return accumulator;
|
||
|
}, memo);
|
||
|
};
|