helping-js
Version:
helping-js: zero-dependency JavaScript utilities — type guards, 50+ regex patterns, validate(), TypeScript .d.ts, v3 helpers (string, array, object, async, date, URL, tree, DOM). Official docs: https://helping-js.netlify.app
171 lines (169 loc) • 4.92 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.assign = assign;
exports.cloneObject = cloneObject;
exports.dotGet = dotGet;
exports.dotSet = dotSet;
exports.findAll = findAll;
exports.iterateAll = iterateAll;
exports.joinRows = joinRows;
exports.mapObjects = mapObjects;
exports.objectAssign = objectAssign;
exports.objectAssignField = objectAssignField;
exports.objectDefineProxyProperty = objectDefineProxyProperty;
exports.objectExcept = objectExcept;
exports.objectMap = objectMap;
exports.objectOnly = objectOnly;
exports.unset = unset;
exports.withoutUndefined = withoutUndefined;
var _types = require("./types");
/**
* Object helpers (ported from helper-js); dotSet guards prototype pollution.
*/
var PROTO_POLLUTION_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
function isSafePathSegment(key) {
return !PROTO_POLLUTION_KEYS.has(key);
}
function cloneObject(obj) {
return JSON.parse(JSON.stringify(obj));
}
function objectMap(obj, fn) {
var r = {};
for (var _i = 0, _Object$keys = Object.keys(obj); _i < _Object$keys.length; _i++) {
var k = _Object$keys[_i];
r[k] = fn(obj[k], k);
}
return r;
}
function objectOnly(obj, keys) {
var r = {};
for (var i = 0; i < keys.length; i++) {
var k = keys[i];
if (Object.prototype.hasOwnProperty.call(obj, k)) r[k] = obj[k];
}
return r;
}
function objectExcept(obj, keys) {
var set = new Set(keys);
var r = {};
for (var _i2 = 0, _Object$keys2 = Object.keys(obj); _i2 < _Object$keys2.length; _i2++) {
var k = _Object$keys2[_i2];
if (!set.has(k)) r[k] = obj[k];
}
return r;
}
function iterateAll(obj, fn) {
var path = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : [];
if (!(0, _types.isPlainObject)(obj)) return;
for (var _i3 = 0, _Object$keys3 = Object.keys(obj); _i3 < _Object$keys3.length; _i3++) {
var k = _Object$keys3[_i3];
var v = obj[k];
var p = path.concat(k);
fn(v, k, p);
if ((0, _types.isPlainObject)(v)) iterateAll(v, fn, p);
}
}
function findAll(obj, fn) {
var r = [];
iterateAll(obj, function (v, k, p) {
if (fn(v, k, p)) r.push({
value: v,
key: k,
path: p
});
});
return r;
}
function dotGet(obj, path) {
if (!path) return obj;
var parts = (0, _types.isString)(path) ? path.split('.') : path;
var cur = obj;
for (var i = 0; i < parts.length; i++) {
if (cur == null) return undefined;
cur = cur[parts[i]];
}
return cur;
}
function dotSet(obj, path, value) {
if (!path) return obj;
var parts = (0, _types.isString)(path) ? path.split('.') : path;
if (parts.length === 0) return obj;
var cur = obj;
for (var i = 0; i < parts.length - 1; i++) {
var key = parts[i];
if (!isSafePathSegment(key)) return obj;
if (cur[key] == null || !(0, _types.isPlainObject)(cur[key])) cur[key] = {};
cur = cur[key];
}
var last = parts[parts.length - 1];
if (!isSafePathSegment(last)) return obj;
cur[last] = value;
return obj;
}
function unset(obj, path) {
var parts = (0, _types.isString)(path) ? path.split('.') : path;
if (parts.length === 0) return obj;
var cur = obj;
for (var i = 0; i < parts.length - 1; i++) {
var key = parts[i];
if (!isSafePathSegment(key)) return obj;
if (cur[key] == null) return obj;
cur = cur[key];
}
var last = parts[parts.length - 1];
if (!isSafePathSegment(last)) return obj;
delete cur[last];
return obj;
}
function assign(target) {
for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
sources[_key - 1] = arguments[_key];
}
return Object.assign.apply(Object, [target].concat(sources));
}
function objectAssign(target) {
for (var _len2 = arguments.length, sources = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
sources[_key2 - 1] = arguments[_key2];
}
return Object.assign.apply(Object, [target].concat(sources));
}
function objectAssignField(field) {
return function (target, source) {
if (source && Object.prototype.hasOwnProperty.call(source, field)) {
target[field] = source[field];
}
return target;
};
}
function withoutUndefined(obj) {
var r = {};
for (var _i4 = 0, _Object$keys4 = Object.keys(obj); _i4 < _Object$keys4.length; _i4++) {
var k = _Object$keys4[_i4];
if (obj[k] !== undefined) r[k] = obj[k];
}
return r;
}
function objectDefineProxyProperty(obj, name, descriptor) {
Object.defineProperty(obj, name, descriptor);
return obj;
}
function mapObjects(arr, keyField) {
var r = {};
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
r[item[keyField]] = item;
}
return r;
}
function joinRows(rows, keyFn) {
var r = {};
for (var i = 0; i < rows.length; i++) {
var row = rows[i];
var k = keyFn(row);
if (!r[k]) r[k] = [];
r[k].push(row);
}
return r;
}