updeep
Version:
Easily update nested frozen objects and arrays in a declarative and immutable manner.
1 lines • 21.8 kB
Source Map (JSON)
{"version":3,"file":"index.modern.mjs","sources":["../lib/freeze.js","../lib/constant.js","../lib/util/splitPath.js","../lib/util/curry.js","../lib/is.js","../lib/wrap.js","../lib/update.js","../lib/ifElse.js","../lib/if.js","../lib/map.js","../lib/util/size.js","../lib/omit.js","../lib/omitBy.js","../lib/reject.js","../lib/updateIn.js","../lib/withDefault.js","../lib/index.js"],"sourcesContent":["function isFreezable(object) {\n if (object === null) return false\n if (object instanceof RegExp) return false\n if (object instanceof ArrayBuffer) return false\n\n return Array.isArray(object) || typeof object === 'object'\n}\n\nfunction needsFreezing(object) {\n return isFreezable(object) && !Object.isFrozen(object)\n}\n\nfunction recur(object) {\n Object.freeze(object)\n\n Object.keys(object).forEach((key) => {\n const value = object[key]\n if (needsFreezing(value)) {\n recur(value)\n }\n })\n\n return object\n}\n\n/**\n * Deeply freeze a plain javascript object.\n *\n * If `process.env.NODE_ENV === 'production'`, this returns the original object\n * without freezing.\n *\n * Or if `process.env.UPDEEP_MODE === 'dangerously_never_freeze'`, this returns the original object\n * without freezing.\n *\n * If in a browser and built without replacing process, never freeze.\n *\n * @function\n * @sig a -> a\n * @param {object} object Object to freeze.\n * @return {object} Frozen object, unless in production, then the same object.\n */\nfunction freeze(object) {\n if (typeof process === 'undefined') {\n return object\n }\n\n if (process.env.NODE_ENV === 'production') {\n return object\n }\n\n if (process.env.UPDEEP_MODE === 'dangerously_never_freeze') {\n return object\n }\n\n if (needsFreezing(object)) {\n recur(object)\n }\n\n return object\n}\n\nexport default freeze\n","import freeze from './freeze'\n\n/**\n * Returns a function that always returns the supplied value.\n *\n * Useful for replacing an object outright rather than merging it.\n *\n * @function\n * @sig a -> (* -> a)\n * @memberOf u\n * @param {*} value what to return from returned function.\n * @return {function} a new function that will always return value.\n *\n * @example\n * var alwaysFour = u.constant(4);\n * expect(alwaysFour(32)).toEqual(4);\n *\n * @example\n * var user = {\n * name: 'Mitch',\n * favorites: {\n * band: 'Nirvana',\n * movie: 'The Matrix'\n * }\n * };\n *\n * var newFavorites = {\n * band: 'Coldplay'\n * };\n *\n * var result = u({ favorites: u.constant(newFavorites) }, user);\n *\n * expect(result).toEqual({ name: 'Mitch', favorites: { band: 'Coldplay' } });\n */\nfunction constant(value) {\n const frozen = freeze(value)\n return () => frozen\n}\n\nexport default constant\n","import reject from 'lodash/reject'\n\nexport default function splitPath(path) {\n return Array.isArray(path) ? path : reject(`${path}`.split('.'), (x) => !x)\n}\n","/* eslint no-shadow:0, no-param-reassign:0 prefer-rest-params:0 */\nexport const _ = '@@updeep/placeholder'\n\nfunction countArguments(args, max) {\n let n = args.length\n if (n > max) n = max\n\n while (args[n - 1] === _) {\n n -= 1\n }\n\n return n\n}\n\nexport function curry1(fn) {\n return function curried(a, ...args) {\n const [b, c] = args\n const n = countArguments(arguments)\n\n if (n >= 1) return fn(a, b, c)\n return curried\n }\n}\n\nexport function curry2(fn) {\n return function curried(a, b, ...args) {\n const [c, d] = args\n const n = countArguments(arguments, 2)\n\n if (b === _ || c === _ || d === _) {\n throw new Error(\n 'Can only use placeholder on first argument of this function.'\n )\n }\n\n if (n >= 2) {\n if (a === _) return curry1((a, c, d) => fn(a, b, c, d))\n return fn(a, b, c, d)\n }\n\n if (n === 1) return curry1((b, c, d) => fn(a, b, c, d))\n return curried\n }\n}\n\nexport function curry3(fn) {\n return function curried(a, b, c, ...args) {\n const [d, e] = args\n const n = countArguments(arguments, 3)\n\n if (c === _ || d === _ || e === _) {\n throw new Error(\n 'Can only use placeholder on first or second argument of this function.'\n )\n }\n\n if (n >= 3) {\n if (a === _) {\n if (b === _) return curry2((a, b, d, e) => fn(a, b, c, d, e))\n return curry1((a, d, e) => fn(a, b, c, d, e))\n }\n if (b === _) return curry1((b, d, e) => fn(a, b, c, d, e))\n return fn(a, b, c, d, e)\n }\n\n if (n === 2) {\n if (a === _) return curry2((a, c, d, e) => fn(a, b, c, d, e))\n return curry1((c, d, e) => fn(a, b, c, d, e))\n }\n\n if (n === 1) return curry2((b, c, d, e) => fn(a, b, c, d, e))\n\n return curried\n }\n}\n\nexport function curry4(fn) {\n return function curried(a, b, c, d, ...args) {\n const [e, f] = args\n const n = countArguments(arguments, 4)\n\n if (d === _ || e === _ || f === _) {\n throw new Error(\n 'Can only use placeholder on first, second or third argument of this function.'\n )\n }\n\n if (n >= 4) {\n if (a === _) {\n if (b === _) {\n if (c === _) return curry3((a, b, c, e, f) => fn(a, b, c, d, e, f))\n return curry2((a, b, e, f) => fn(a, b, c, d, e, f))\n }\n if (c === _) return curry2((a, c, e, f) => fn(a, b, c, d, e, f))\n return curry1((a, e, f) => fn(a, b, c, d, e, f))\n }\n if (b === _) {\n if (c === _) return curry2((b, c, e, f) => fn(a, b, c, d, e, f))\n return curry1((b, e, f) => fn(a, b, c, d, e, f))\n }\n if (c === _) return curry1((c, e, f) => fn(a, b, c, d, e, f))\n return fn(a, b, c, d, e, f)\n }\n\n if (n === 3) {\n if (a === _) {\n if (b === _) return curry3((a, b, d, e, f) => fn(a, b, c, d, e, f))\n return curry2((a, d, e, f) => fn(a, b, c, d, e, f))\n }\n if (b === _) return curry2((b, d, e, f) => fn(a, b, c, d, e, f))\n return curry1((d, e, f) => fn(a, b, c, d, e, f))\n }\n\n if (n === 2) {\n if (a === _) return curry3((a, c, d, e, f) => fn(a, b, c, d, e, f))\n return curry2((c, d, e, f) => fn(a, b, c, d, e, f))\n }\n\n if (n === 1) return curry3((b, c, d, e, f) => fn(a, b, c, d, e, f))\n return curried\n }\n}\n\nexport default function curry(fn, length = fn.length) {\n return [fn, curry1, curry2, curry3, curry4][length](fn)\n}\n","import splitPath from './util/splitPath'\nimport curry from './util/curry'\n\nfunction is(path, predicate, object) {\n const parts = splitPath(path)\n\n let rest = object\n for (let i = 0; i < parts.length; i += 1) {\n if (typeof rest === 'undefined') return false\n const part = parts[i]\n rest = rest[part]\n }\n\n if (typeof predicate === 'function') {\n return predicate(rest)\n }\n\n return predicate === rest\n}\n\nexport default curry(is)\n","import curry from './util/curry'\nimport freeze from './freeze'\n\nexport default function wrap(func, length = func.length) {\n return curry((...args) => freeze(func(...args)), length)\n}\n","import isPlainObject from 'lodash/isPlainObject'\nimport _omitBy from 'lodash/omitBy'\n\nimport wrap from './wrap'\nimport constant from './constant'\n\nconst innerOmitted = { __omitted: true }\nexport const omitted = constant(innerOmitted)\n\nfunction isEmpty(object) {\n return !Object.keys(object).length\n}\n\nfunction reduce(object, callback, initialValue) {\n return Object.keys(object).reduce(\n (acc, key) => callback(acc, object[key], key),\n initialValue\n )\n}\n\nfunction resolveUpdates(updates, object) {\n return reduce(\n updates,\n (acc, value, key) => {\n let updatedValue = value\n\n if (\n !Array.isArray(value) &&\n value !== null &&\n typeof value === 'object'\n ) {\n updatedValue = update(value, object[key]) // eslint-disable-line no-use-before-define\n } else if (typeof value === 'function') {\n updatedValue = value(object[key])\n }\n\n if (isUpdateChange(updatedValue, key, object)) {\n acc[key] = updatedValue // eslint-disable-line no-param-reassign\n }\n\n return acc\n },\n {}\n )\n}\n\nfunction isUpdateChange(value, key, object) {\n // Omitting a property that does not exist is not a change\n if (value === innerOmitted) {\n return object.hasOwnProperty(key)\n } else {\n return object[key] !== value\n }\n}\n\nfunction updateArray(updates, object) {\n const newArray = [...object]\n\n Object.keys(updates).forEach((key) => {\n newArray[key] = updates[key]\n })\n\n return newArray\n}\n\n/**\n * Recursively update an object or array.\n *\n * Can update with values:\n * update({ foo: 3 }, { foo: 1, bar: 2 });\n * // => { foo: 3, bar: 2 }\n *\n * Or with a function:\n * update({ foo: x => (x + 1) }, { foo: 2 });\n * // => { foo: 3 }\n *\n * @function\n * @name update\n * @param {Object|Function} updates\n * @param {Object|Array} object to update\n * @return {Object|Array} new object with modifications\n */\nfunction update(updates, object, ...args) {\n if (typeof updates === 'function') {\n return updates(object, ...args)\n }\n\n if (!isPlainObject(updates)) {\n return updates\n }\n\n const defaultedObject =\n typeof object === 'undefined' || object === null ? {} : object\n\n const resolvedUpdates = resolveUpdates(updates, defaultedObject)\n\n if (isEmpty(resolvedUpdates)) {\n return defaultedObject\n }\n\n if (Array.isArray(defaultedObject)) {\n return updateArray(resolvedUpdates, defaultedObject).filter(\n (value) => value !== innerOmitted\n )\n }\n\n return _omitBy(\n { ...defaultedObject, ...resolvedUpdates },\n (value) => value === innerOmitted\n )\n}\n\nexport default wrap(update, 2)\n","import update from './update'\nimport wrap from './wrap'\n\nfunction updateIfElse(predicate, trueUpdates, falseUpdates, object) {\n const test = typeof predicate === 'function' ? predicate(object) : predicate\n\n const updates = test ? trueUpdates : falseUpdates\n\n return update(updates, object)\n}\n\nexport default wrap(updateIfElse)\n","import ifElse from './ifElse'\nimport curry from './util/curry'\n\nexport default curry((predicate, trueUpdates, object) =>\n ifElse(predicate, trueUpdates, (x) => x, object)\n)\n","import forEach from 'lodash/forEach'\nimport mapArray from 'lodash/map'\nimport mapObject from 'lodash/mapValues'\nimport update from './update'\nimport wrap from './wrap'\n\nfunction shallowEqual(object, otherObject) {\n let equal = true\n // eslint-disable-next-line consistent-return\n forEach(otherObject, (value, key) => {\n if (value !== object[key]) {\n equal = false\n\n // exit early\n return false\n }\n })\n\n return equal\n}\n\nfunction map(iteratee, object) {\n const updater = typeof iteratee === 'function' ? iteratee : update(iteratee)\n\n const mapper = Array.isArray(object) ? mapArray : mapObject\n\n const newObject = mapper(object, updater)\n const equal = shallowEqual(object, newObject)\n\n return equal ? object : newObject\n}\n\nexport default wrap(map)\n","export default function size(obj) {\n if (Array.isArray(obj)) {\n return obj.length\n } else {\n return Object.keys(obj).length\n }\n}\n","import _omit from 'lodash/omit'\nimport wrap from './wrap'\nimport size from './util/size'\n\nfunction omit(predicate, collection) {\n const result = _omit(collection, predicate)\n\n const changed = collection == null || size(result) !== size(collection)\n if (changed) {\n return result\n } else {\n return collection\n }\n}\n\nexport default wrap(omit)\n","import _omitBy from 'lodash/omitBy'\nimport size from './util/size'\nimport wrap from './wrap'\n\nfunction omitBy(predicate, collection) {\n const result = _omitBy(collection, predicate)\n\n const changed = collection == null || size(result) !== size(collection)\n if (changed) {\n return result\n } else {\n return collection\n }\n}\n\nexport default wrap(omitBy)\n","import _reject from 'lodash/reject'\nimport wrap from './wrap'\n\nfunction reject(predicate, collection) {\n const result = _reject(collection, predicate)\n const equal = collection.length === result.length\n\n return equal ? collection : result\n}\n\nexport default wrap(reject)\n","import curry from './util/curry'\nimport update from './update'\nimport map from './map'\nimport splitPath from './util/splitPath'\n\nconst wildcard = '*'\n\nfunction reducePath(acc, key) {\n if (key === wildcard) {\n return (value) =>\n Object.prototype.hasOwnProperty.call(value, wildcard)\n ? // If we actually have wildcard as a property, update that\n update({ [wildcard]: acc }, value)\n : // Otherwise map over all properties\n map(acc, value)\n }\n\n return { [key]: acc }\n}\n\nfunction updateIn(path, value, object) {\n const parts = splitPath(path)\n const updates = parts.reduceRight(reducePath, value)\n\n return update(updates, object)\n}\n\nexport default curry(updateIn)\n","import update from './update'\nimport curry from './util/curry'\n\nfunction withDefault(defaultValue, updates, object) {\n if (typeof object === 'undefined') {\n return update(updates, defaultValue)\n }\n\n return update(updates, object)\n}\n\nexport default curry(withDefault)\n","import constant from './constant'\nimport freeze from './freeze'\nimport is from './is'\nimport _if from './if'\nimport ifElse from './ifElse'\nimport map from './map'\nimport omit from './omit'\nimport omitBy from './omitBy'\nimport reject from './reject'\nimport update, { omitted } from './update'\nimport updateIn from './updateIn'\nimport withDefault from './withDefault'\nimport { _ } from './util/curry'\n\nconst u = update\n\nu._ = _\nu.constant = constant\nu.if = _if\nu.ifElse = ifElse\nu.is = is\nu.freeze = freeze\nu.map = map\nu.omit = omit\nu.omitBy = omitBy\nu.reject = reject\nu.update = update\nu.updateIn = updateIn\nu.omitted = omitted\nu.withDefault = withDefault\n\nexport default u\n"],"names":["needsFreezing","object","RegExp","ArrayBuffer","Array","isArray","isFreezable","Object","isFrozen","recur","freeze","keys","forEach","key","value","process","env","NODE_ENV","UPDEEP_MODE","constant","frozen","splitPath","path","reject","split","x","_","countArguments","args","max","n","length","curry1","fn","curried","a","b","c","arguments","curry2","d","Error","curry3","e","curry4","f","curry","predicate","parts","rest","i","wrap","func","innerOmitted","__omitted","omitted","update","updates","isPlainObject","defaultedObject","resolvedUpdates","callback","initialValue","reduce","acc","updatedValue","hasOwnProperty","isUpdateChange","resolveUpdates","isEmpty","newArray","updateArray","filter","_omitBy","_extends","trueUpdates","falseUpdates","test","ifElse","iteratee","updater","newObject","mapArray","mapObject","otherObject","equal","shallowEqual","size","obj","collection","result","_omit","_reject","wildcard","reducePath","prototype","call","map","reduceRight","withDefault$1","defaultValue","u","if","_if","is","omit","omitBy","updateIn","withDefault"],"mappings":"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"}