Noctiflorous Pansy Mulch

    defu
    TypeScript icon, indicating that this package has built-in type declarations

    6.1.0 • Public • Published

    defu

    🌊 defu

    Assign default properties, recursively. Lightweight and Fast!

    Standard JS codecov npm version npm downloads package phobia bundle phobia

    Install

    Install package:

    # yarn
    yarn add defu
    # npm
    npm install defu
    # pnpm
    pnpm install defu

    Usage

    import { defu } from 'defu'
    
    const options = defu(object, ...defaults)

    Leftmost arguments have more priority when assigning defaults.

    Arguments

    • object (Object): The destination object.
    • source (Object): The source object.
    import { defu } from 'defu'
    
    console.log(defu({ 'a': { 'b': 2 } }, { 'a': { 'b': 1, 'c': 3 } }))
    // => { a: { b: 2, c: 3 } }

    Using with CommonJS

    const { defu } = require('defu')

    Custom Merger

    Sometimes default merging strategy is not desirable. Using createDefu 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

    import { createDefu } from 'defu'
    
    const ext = createDefu((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 defuFn, 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.

    import { defuFn } from 'defu'
    
    defuFn({
      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

    defuArrayFn is similar to defuFn but only applies to array values defined in defaults.

    Example: Filter some items from defaults (array) and add 20 to the count default value.

    import { defuArrayFn } from 'defu'
    
    defuArrayFn({
      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
    • Nullish values (null and undefined) are skipped. Please use defaults-deep or omit-deep or lodash.defaultsdeep if you need to preserve or different behavior.
    • 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)
    console.log(defu({ array: ['b', 'c'] }, { array: ['a'] }))
    // => { array: ['a', 'b', 'c']}

    Type

    We expose Defu as a type utility to return a merged type that follows the rules that defu follows.

    import type { Defu } from 'defu'
    
    type Options = Defu<{ foo: 'bar' }, [{}, { bar: 'baz' }, { something: 42 }]>
    // returns { foo: 'bar', bar: 'baz', 'something': 42 }

    License

    MIT. Made with 💖

    Keywords

    none

    Install

    npm i defu

    DownloadsWeekly Downloads

    2,126,565

    Version

    6.1.0

    License

    MIT

    Unpacked Size

    12.6 kB

    Total Files

    6

    Last publish

    Collaborators

    • pi0