shapey
Version:
A simple syntax for remapping objects, inspired by several of Ramda's spec based functions
47 lines (40 loc) • 2.1 kB
JavaScript
;
exports.__esModule = true;
exports.default = void 0;
var _has = _interopRequireDefault(require("vanillas/has"));
var _curry = _interopRequireDefault(require("vanillas/curry"));
var _isObject = _interopRequireDefault(require("vanillas/isObject"));
var _util = require("./util");
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
/**
* A port of [Ramda's evolve()](http://ramdajs.com/docs/#evolve), but any primitive value or array in the transform spec is wrapped in a function that always returns that value.
* Any functions already on the transform spec are applied at the prop-level (like evolve() always does) and any objects on the transform spec call the evolver recursively (again, normal behavior for evolve()).
* In other words, the only difference between this and Ramda's evolve() function is that primitives and array vales are wrapped in an always() function before the spec is fed to evolve() rather than being omitted from the final output.
*
* @function
* @name evolveSpec
* @sig {k: (a -> b)} -> {k: v} -> {k: v}
* @param {Object} transforms An object with transform functions or nested transform functions or primitive vales to be wrapped with a function.
* @param {Object} input The input object to pass through prop-level transformations
* @returns {Object} The modified input object, with any prop-level transforms applied to it
*/
var evolveSpec = (0, _curry.default)(function (transforms, input) {
var result = {};
var spec = (0, _util.safeSpecTransforms)(transforms);
var object = (0, _util.objectify)(input);
Object.keys(object).forEach(function (key) {
if (typeof spec[key] === 'function') {
result[key] = spec[key](object[key]);
} else if ((0, _isObject.default)(spec[key])) {
result[key] = evolveSpec(spec[key], object[key]);
} else if ((0, _has.default)(key, spec)) {
result[key] = spec[key];
} else {
result[key] = object[key];
}
});
return result;
});
var _default = evolveSpec;
exports.default = _default;
module.exports = exports.default;