UNPKG

kinto

Version:

An Offline-First JavaScript client for Kinto.

234 lines (195 loc) 5.73 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.sortObjects = sortObjects; exports.filterObject = filterObject; exports.filterObjects = filterObjects; exports.waterfall = waterfall; exports.deepEqual = deepEqual; exports.omitKeys = omitKeys; exports.arrayEqual = arrayEqual; exports.transformSubObjectFilters = transformSubObjectFilters; exports.RE_RECORD_ID = void 0; var _objectSpread2 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread")); var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof")); var RE_RECORD_ID = /^[a-zA-Z0-9][a-zA-Z0-9_-]*$/; /** * Checks if a value is undefined. * @param {Any} value * @return {Boolean} */ exports.RE_RECORD_ID = RE_RECORD_ID; function _isUndefined(value) { return typeof value === "undefined"; } /** * Sorts records in a list according to a given ordering. * * @param {String} order The ordering, eg. `-last_modified`. * @param {Array} list The collection to order. * @return {Array} */ function sortObjects(order, list) { var hasDash = order[0] === "-"; var field = hasDash ? order.slice(1) : order; var direction = hasDash ? -1 : 1; return list.slice().sort(function (a, b) { if (a[field] && _isUndefined(b[field])) { return direction; } if (b[field] && _isUndefined(a[field])) { return -direction; } if (_isUndefined(a[field]) && _isUndefined(b[field])) { return 0; } return a[field] > b[field] ? direction : -direction; }); } /** * Test if a single object matches all given filters. * * @param {Object} filters The filters object. * @param {Object} entry The object to filter. * @return {Boolean} */ function filterObject(filters, entry) { return Object.keys(filters).every(function (filter) { var value = filters[filter]; if (Array.isArray(value)) { return value.some(function (candidate) { return candidate === entry[filter]; }); } else if ((0, _typeof2.default)(value) === "object") { return filterObject(value, entry[filter]); } else if (!Object.prototype.hasOwnProperty.call(entry, filter)) { console.error("The property ".concat(filter, " does not exist")); return false; } return entry[filter] === value; }); } /** * Filters records in a list matching all given filters. * * @param {Object} filters The filters object. * @param {Array} list The collection to filter. * @return {Array} */ function filterObjects(filters, list) { return list.filter(function (entry) { return filterObject(filters, entry); }); } /** * Resolves a list of functions sequentially, which can be sync or async; in * case of async, functions must return a promise. * * @param {Array} fns The list of functions. * @param {Any} init The initial value. * @return {Promise} */ function waterfall(fns, init) { if (!fns.length) { return Promise.resolve(init); } return fns.reduce(function (promise, nextFn) { return promise.then(nextFn); }, Promise.resolve(init)); } /** * Simple deep object comparison function. This only supports comparison of * serializable JavaScript objects. * * @param {Object} a The source object. * @param {Object} b The compared object. * @return {Boolean} */ function deepEqual(a, b) { if (a === b) { return true; } if ((0, _typeof2.default)(a) !== (0, _typeof2.default)(b)) { return false; } if (!(a && (0, _typeof2.default)(a) == "object") || !(b && (0, _typeof2.default)(b) == "object")) { return false; } if (Object.keys(a).length !== Object.keys(b).length) { return false; } for (var k in a) { if (!deepEqual(a[k], b[k])) { return false; } } return true; } /** * Return an object without the specified keys. * * @param {Object} obj The original object. * @param {Array} keys The list of keys to exclude. * @return {Object} A copy without the specified keys. */ function omitKeys(obj) { var keys = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : []; var result = (0, _objectSpread2.default)({}, obj); var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = keys[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var key = _step.value; delete result[key]; } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } return result; } function arrayEqual(a, b) { if (a.length !== b.length) { return false; } for (var i = a.length; i--;) { if (a[i] !== b[i]) { return false; } } return true; } function makeNestedObjectFromArr(arr, val, nestedFiltersObj) { var last = arr.length - 1; return arr.reduce(function (acc, cv, i) { if (i === last) { return acc[cv] = val; } else if (Object.prototype.hasOwnProperty.call(acc, cv)) { return acc[cv]; } else { return acc[cv] = {}; } }, nestedFiltersObj); } function transformSubObjectFilters(filtersObj) { var transformedFilters = {}; for (var key in filtersObj) { var keysArr = key.split("."); var val = filtersObj[key]; makeNestedObjectFromArr(keysArr, val, transformedFilters); } return transformedFilters; }