shineout
Version:
A components library for React
260 lines (254 loc) • 11.1 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.entries = exports.deepSet = exports.deepRemove = exports.deepMerge = exports.deepHas = exports.deepGet = void 0;
exports.filterProps = filterProps;
exports.objectValues = void 0;
exports.pathGenerator = pathGenerator;
var _is = require("./is");
var _flat = require("./flat");
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
var hasOwnProperty = Object.prototype.hasOwnProperty;
var PATH_MODE = {
loose: '?',
strict: '!',
insert: '^',
append: '$'
};
function filterProps(obj) {
var props = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : [];
if (!(0, _is.isObject)(obj)) return obj;
if (typeof props === 'function') {
var prediction = props;
props = [];
Object.keys(obj).forEach(function (k) {
if (prediction(obj[k])) props.push(k);
});
}
var newObj = {};
props.forEach(function (k) {
newObj[k] = obj[k];
});
return newObj;
}
// Object.values()
var objectValues = exports.objectValues = function objectValues(obj) {
if (!obj) return [];
return Object.keys(obj).map(function (k) {
return obj[k];
});
};
// object only, not handle array.
var deepMerge = exports.deepMerge = function deepMerge() {
var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var source = arguments.length > 1 ? arguments[1] : undefined;
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
var clone = options.clone,
removeUndefined = options.removeUndefined,
skipUndefined = options.skipUndefined;
if (!(0, _is.isMergeable)(source)) return source;
var dest = {};
if ((0, _is.isMergeable)(target)) {
Object.keys(target).forEach(function (k) {
dest[k] = clone ? deepMerge({}, target[k], options) : target[k];
if (removeUndefined && dest[k] === undefined) delete dest[k];
});
}
Object.keys(source).forEach(function (k) {
if ((0, _is.isMergeable)(source[k]) && (0, _is.isMergeable)(target[k])) {
dest[k] = deepMerge(target[k], source[k], options);
} else {
if (skipUndefined && source[k] === undefined) return;
dest[k] = deepMerge({}, source[k], options);
if (removeUndefined && dest[k] === undefined) delete dest[k];
}
});
return dest;
};
function pathGenerator(raw) {
var path = (0, _flat.insertPoint)(raw);
var reg = /^\[(\d+)\]$/;
var pathModeValues = objectValues(PATH_MODE);
var index = 0;
var last = 0;
var prop = '';
var results = [];
while (index >= 0) {
index = path.indexOf('.', last);
prop = path.substring(last, index === -1 ? undefined : index);
var mode = void 0;
var lastChar = prop.charAt(prop.length - 1);
if (pathModeValues.includes(lastChar)) {
mode = lastChar;
prop = prop.substring(0, prop.length - 1);
}
// array index
var match = reg.exec(prop);
// eslint-disable-next-line
if (match) prop = parseInt(match[1], 10);
last = index + 1;
results.push([prop, index === -1 ? undefined : path.substring(last), mode]);
}
return results;
}
var deepSet = exports.deepSet = function deepSet(target, path, value) {
var options = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
if (!(0, _is.isObject)(target)) throw new Error('Target must be an object.');
if (typeof path !== 'string') throw new Error('Path must be a string.');
var removeUndefined = options.removeUndefined,
skipUndefined = options.skipUndefined;
var mergeOptions = {
clone: true,
removeUndefined: removeUndefined,
skipUndefined: skipUndefined
};
// empty root
if (path === '') {
var dest = deepMerge(target, value, mergeOptions);
Object.keys(dest).forEach(function (k) {
target[k] = dest[k];
});
return target;
}
var current = target;
var _iterator = _createForOfIteratorHelper(pathGenerator(path)),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var _step$value = _slicedToArray(_step.value, 3),
_prop = _step$value[0],
next = _step$value[1],
mode = _step$value[2];
if (next) {
var nextIsArray = /^\[\d+\]/.test(next);
if (!current[_prop]) current[_prop] = nextIsArray ? [] : {};
if (nextIsArray && !Array.isArray(current[_prop])) {
throw new Error("Path ".concat(path, " expect an array."));
} else if (Array.isArray(current[_prop]) && !nextIsArray) {
throw new Error("Path ".concat(path, " is an array, expect an object."));
}
current = current[_prop];
continue;
}
if (options.forceSet) {
current[_prop] = value;
} else if (mode === PATH_MODE.insert) {
current.splice(_prop, 0, value);
} else if (mode === PATH_MODE.append) {
current.splice(_prop + 1, 0, value);
} else {
if (skipUndefined && value === undefined) break;
current[_prop] = (0, _is.isMergeable)(current[_prop]) && (0, _is.isMergeable)(value) ? deepMerge(current[_prop], value, mergeOptions) : value;
}
if (removeUndefined && value === undefined) delete current[_prop];
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
return target;
};
var deepGet = exports.deepGet = function deepGet(target, path) {
var options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
if (!(0, _is.isObject)(target)) throw new Error('Target must be an object.');
if (typeof path !== 'string') throw new Error('Path must be a string.');
// empty root
if (path === '') return target;
var defaultValue = options.defaultValue,
strictMode = options.strictMode;
var current = target;
var _iterator2 = _createForOfIteratorHelper(pathGenerator(path)),
_step2;
try {
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
var _step2$value = _slicedToArray(_step2.value, 3),
_prop2 = _step2$value[0],
mode = _step2$value[2];
var isStrict = mode === PATH_MODE.strict || strictMode && defaultValue === undefined && mode !== PATH_MODE.loose;
if (current != null && hasOwnProperty.call(current, _prop2)) {
current = current[_prop2];
} else if (isStrict) {
throw new Error("Path ".concat(path, " is not exist."));
} else {
current = defaultValue;
break;
}
}
} catch (err) {
_iterator2.e(err);
} finally {
_iterator2.f();
}
return current;
};
var deepRemove = exports.deepRemove = function deepRemove(target, path) {
if (!(0, _is.isObject)(target)) throw new Error('Target must be an object.');
if (typeof path !== 'string' || !path) throw new Error('Path must be a string.');
var current = target;
var nextIsArray = false;
var _iterator3 = _createForOfIteratorHelper(pathGenerator(path)),
_step3;
try {
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
var _step3$value = _slicedToArray(_step3.value, 2),
_prop3 = _step3$value[0],
next = _step3$value[1];
if (current == null || !hasOwnProperty.call(current, _prop3)) {
break;
}
if (next) {
current = current[_prop3];
nextIsArray = /^\[\d+\]/.test(next);
} else if ((0, _is.isObject)(current)) {
if (nextIsArray) throw new Error('Target is an object, expect array');
delete current[_prop3];
} else {
if (!nextIsArray) {
throw new Error('Target is an array, expect object');
}
current.splice(_prop3, 1);
}
}
} catch (err) {
_iterator3.e(err);
} finally {
_iterator3.f();
}
return target;
};
var deepHas = exports.deepHas = function deepHas(target, path) {
if (!(0, _is.isObject)(target)) throw new Error('Target must be an object.');
if (typeof path !== 'string') throw new Error('Path must be a string.');
if (path === '') return true;
var current = target;
var _iterator4 = _createForOfIteratorHelper(pathGenerator(path)),
_step4;
try {
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
var _step4$value = _slicedToArray(_step4.value, 2),
_prop4 = _step4$value[0];
if (!current || !hasOwnProperty.call(current, _prop4)) return false;
current = current[_prop4];
}
} catch (err) {
_iterator4.e(err);
} finally {
_iterator4.f();
}
return true;
};
var entries = exports.entries = function entries(obj) {
if (!obj) return [];
var keys = Object.keys(obj);
return keys.map(function (key) {
return [key, obj[key]];
});
};