defu

by nuxt-contrib

nuxt-contrib / defu

πŸ‡© Recursively assign default properties. Lightweight and Fast!

136 Stars 8 Forks Last release: 3 months ago (v3.1.0) MIT License 48 Commits 13 Releases

Available items

No Items, yet!

The developer of this repository has not created any items for sale yet. Need a bug fixed? Help with integration? A different license? Create a request here:

πŸ‡© defu

Recursively assign default properties. Lightweight and Fast!

Standard JS david dm codecov

npm version npm downloads package phobia bundle phobia

Install

Install package:

yarn add defu
# or
npm install defu

Usage

const options = defu (object, ...defaults)

Leftmost arguments have more priority when assigning defaults.

Arguments

  • 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 } }

Custom Merger

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 }

Function Merger

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.

Array Function Merger

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.

Remarks

  • object
    and
    defaults
    are not modified
  • null
    values are skipped same as defaults-deep. Please use either omit-deep or lodash.defaultsdeep if you need to preserve.
  • Assignment of
    __proto__
    and
    constructor
    keys will be skipped to prevent security issues with object pollution.
  • Will concat
    array
    values (if default property is defined)
    js
    console.log(defu({ array: ['b', 'c'] }, { array: ['a'] }))
    // => { array: ['a', 'b', 'c']}
    

License

MIT. Made with πŸ’–

We use cookies. If you continue to browse the site, you agree to the use of cookies. For more information on our use of cookies please see our Privacy Policy.