Skip to content

Commit

Permalink
Fixes and improvements after the conversion to ESM
Browse files Browse the repository at this point in the history
  • Loading branch information
mariocasciaro committed Sep 20, 2019
1 parent 3ba5214 commit 5eb397c
Show file tree
Hide file tree
Showing 8 changed files with 258 additions and 227 deletions.
111 changes: 61 additions & 50 deletions cjs/object-path-immutable.js
Expand Up @@ -55,37 +55,6 @@ function getKey (key) {
return key
}

var objectPathImmutable = function (src) {
var dest = src;
var committed = false;

var transaction = Object.keys(api).reduce(function (proxy, prop) {
/* istanbul ignore else */
if (typeof api[prop] === 'function') {
proxy[prop] = function () {
var args = [dest, src].concat(Array.prototype.slice.call(arguments));

if (committed) {
throw new Error('Cannot call ' + prop + ' after `value`')
}

dest = api[prop].apply(null, args);

return transaction
};
}

return proxy
}, {});

transaction.value = function () {
committed = true;
return dest
};

return transaction
};

function clone (obj, createIfEmpty, assumeArray) {
if (obj == null) {
if (createIfEmpty) {
Expand All @@ -104,13 +73,13 @@ function clone (obj, createIfEmpty, assumeArray) {
return assignToObj({}, obj)
}

function deepMerge (dest, src) {
function _deepMerge (dest, src) {
if (dest !== src && isPlainObject(dest) && isPlainObject(src)) {
var merged = {};
for (var key in dest) {
if (_hasOwnProperty.call(dest, key)) {
if (_hasOwnProperty.call(src, key)) {
merged[key] = deepMerge(dest[key], src[key]);
merged[key] = _deepMerge(dest[key], src[key]);
} else {
merged[key] = dest[key];
}
Expand All @@ -119,23 +88,23 @@ function deepMerge (dest, src) {

for (key in src) {
if (_hasOwnProperty.call(src, key)) {
merged[key] = deepMerge(dest[key], src[key]);
merged[key] = _deepMerge(dest[key], src[key]);
}
}
return merged
}
return src
}

function changeImmutable (dest, src, path, changeCallback) {
function _changeImmutable (dest, src, path, changeCallback) {
if (isNumber(path)) {
path = [path];
}
if (isEmpty(path)) {
return src
}
if (isString(path)) {
return changeImmutable(dest, src, path.split('.').map(getKey), changeCallback)
return _changeImmutable(dest, src, path.split('.').map(getKey), changeCallback)
}
var currentPath = path[0];

Expand All @@ -151,7 +120,7 @@ function changeImmutable (dest, src, path, changeCallback) {
src = src[currentPath];
}

dest[currentPath] = changeImmutable(dest[currentPath], src, path.slice(1), changeCallback);
dest[currentPath] = _changeImmutable(dest[currentPath], src, path.slice(1), changeCallback);

return dest
}
Expand All @@ -161,7 +130,7 @@ api.set = function set (dest, src, path, value) {
if (isEmpty(path)) {
return value
}
return changeImmutable(dest, src, path, function (clonedObj, finalPath) {
return _changeImmutable(dest, src, path, function (clonedObj, finalPath) {
clonedObj[finalPath] = value;
return clonedObj
})
Expand All @@ -171,7 +140,7 @@ api.update = function update (dest, src, path, updater) {
if (isEmpty(path)) {
return updater(clone(src))
}
return changeImmutable(dest, src, path, function (clonedObj, finalPath) {
return _changeImmutable(dest, src, path, function (clonedObj, finalPath) {
clonedObj[finalPath] = updater(clonedObj[finalPath]);
return clonedObj
})
Expand All @@ -186,7 +155,7 @@ api.push = function push (dest, src, path /*, values */) {
return src.concat(values)
}
}
return changeImmutable(dest, src, path, function (clonedObj, finalPath) {
return _changeImmutable(dest, src, path, function (clonedObj, finalPath) {
if (!isArray(clonedObj[finalPath])) {
clonedObj[finalPath] = values;
} else {
Expand All @@ -207,7 +176,7 @@ api.insert = function insert (dest, src, path, value, at) {
first.push(value);
return first.concat(src.slice(at))
}
return changeImmutable(dest, src, path, function (clonedObj, finalPath) {
return _changeImmutable(dest, src, path, function (clonedObj, finalPath) {
var arr = clonedObj[finalPath];
if (!isArray(arr)) {
if (arr != null && typeof arr !== 'undefined') {
Expand All @@ -227,7 +196,7 @@ api.del = function del (dest, src, path) {
if (isEmpty(path)) {
return undefined
}
return changeImmutable(dest, src, path, function (clonedObj, finalPath) {
return _changeImmutable(dest, src, path, function (clonedObj, finalPath) {
if (Array.isArray(clonedObj)) {
if (clonedObj[finalPath] !== undefined) {
clonedObj.splice(finalPath, 1);
Expand All @@ -248,7 +217,7 @@ api.assign = function assign (dest, src, path, source) {
}
return assignToObj(clone(src), source)
}
return changeImmutable(dest, src, path, function (clonedObj, finalPath) {
return _changeImmutable(dest, src, path, function (clonedObj, finalPath) {
source = Object(source);
var target = clone(clonedObj[finalPath], true);
assignToObj(target, source);
Expand All @@ -263,17 +232,59 @@ api.merge = function assign (dest, src, path, source) {
if (isEmpty(source)) {
return src
}
return deepMerge(src, source)
return _deepMerge(src, source)
}
return changeImmutable(dest, src, path, function (clonedObj, finalPath) {
return _changeImmutable(dest, src, path, function (clonedObj, finalPath) {
source = Object(source);
clonedObj[finalPath] = deepMerge(clonedObj[finalPath], source);
clonedObj[finalPath] = _deepMerge(clonedObj[finalPath], source);
return clonedObj
})
};

module.exports = Object.keys(api).reduce(function (objectPathImmutable, method) {
objectPathImmutable[method] = api[method].bind(null, null);
function wrap (src) {
var dest = src;
var committed = false;

var transaction = Object.keys(api).reduce(function (proxy, prop) {
/* istanbul ignore else */
if (typeof api[prop] === 'function') {
proxy[prop] = function () {
var args = [dest, src].concat(Array.prototype.slice.call(arguments));

if (committed) {
throw new Error('Cannot call ' + prop + ' after `value`')
}

dest = api[prop].apply(null, args);

return transaction
};
}

return proxy
}, {});

transaction.value = function () {
committed = true;
return dest
};

return transaction
}

return objectPathImmutable
}, objectPathImmutable);
var set = api.set.bind(null, null);
var update = api.update.bind(null, null);
var push = api.push.bind(null, null);
var insert = api.insert.bind(null, null);
var del = api.del.bind(null, null);
var assign = api.assign.bind(null, null);
var merge = api.merge.bind(null, null);

exports.assign = assign;
exports.del = del;
exports.insert = insert;
exports.merge = merge;
exports.push = push;
exports.set = set;
exports.update = update;
exports.wrap = wrap;

0 comments on commit 5eb397c

Please sign in to comment.