Recursively assign default properties. Lightweight and Fast!
Install package:
yarn add defu
# or
npm install defuconst options = defu (object, ...defaults)Leftmost arguments have more priority when assigning defaults.
- object (Object): The destination object.
- source (Object): The source object.
const defu = require('defu')
console.log(defu({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }))
// => { a: { b: 2, c: 3 } }Sometimes default merging strategy is not desirable. Using defu.extend we can create a custom instance with different merging strategy.
This function accepts obj (source object), key and value (current value) and should return true if applied custom merging.
Example: Sum numbers instead of overriding
const ext = defu.extend((obj, key, value) => {
if (typeof obj[key] === 'number' && typeof value === 'number') {
obj[key] += val
return true
}
})
ext({ cost: 15 }, { cost: 10 }) // { cost: 25 }Using defu.fn, if user provided a function, it will be called with default value instead of merging.
I can be useful for default values manipulation.
Example: Filter some items from defaults (array) and add 20 to the count default value.
defu.fn({
ignore: (val) => val.filter(item => item !== 'dist'),
count: (count) => count + 20
}, {
ignore: ['node_modules','dist'],
count: 10
})
/*
{
ignore: ['node_modules'],
count: 30
}
*/Note: if the default value is not defined, the function defined won't be called and kept as value.
defu.arrayFn is similar to defu.fn but only applies to array values defined in defaults.
Example: Filter some items from defaults (array) and add 20 to the count default value.
defu.arrayFn({
ignore(val) => val.filter(i => i !== 'dist'),
count: () => 20
}, {
ignore: [
'node_modules',
'dist'
],
count: 10
})
/*
{
ignore: ['node_modules'],
count: () => 20
}
*/Note: the function is called only if the value defined in defaults is an aray.
objectanddefaultsare not modifiednullvalues are skipped same as defaults-deep. Please use either omit-deep or lodash.defaultsdeep if you need to preserve.- Assignment of
__proto__andconstructorkeys will be skipped to prevent security issues with object pollution. - Will concat
arrayvalues (if default property is defined)
console.log(defu({ array: ['b', 'c'] }, { array: ['a'] }))
// => { array: ['a', 'b', 'c']}MIT. Made with 💖