Node Packaged Masterfully

    set-error-props
    TypeScript icon, indicating that this package has built-in type declarations

    4.0.0 • Public • Published

    Node Browsers TypeScript Codecov Minified size Mastodon Medium

    Properly update an error's properties.

    Features

    Example

    import setErrorProps from 'set-error-props'
    
    const error = new Error('one')
    setErrorProps(error, { prop: true, message: 'two' })
    console.log(error.prop) // true
    console.log(error.message) // 'one': message is readonly

    Install

    npm install set-error-props

    This package works in both Node.js >=14.18.0 and browsers. It is an ES module and must be loaded using an import or import() statement, not require().

    API

    setErrorProps(error, props, options?)

    error Error | object
    props Error | object
    options Options?
    Return value: Error

    Assigns props to error, then returns error.

    Options

    soft

    Type: boolean
    Default: false

    Prevents overriding existing properties.

    Usage

    Error core properties

    const error = new Error('one')
    setErrorProps(error, { message: 'two' })
    console.log(error.message) // 'one'

    Prototype pollution

    const error = new Error('one')
    setErrorProps(error, { toString: () => 'injected' })
    console.log(error.toString()) // 'Error: one'
    console.log(Error.prototype.toString()) // 'Error'

    Overriding protection

    const error = new Error('message')
    error.one = true
    setErrorProps(error, { one: false, two: true }, { soft: true })
    console.log(error.one) // true
    console.log(error.two) // true

    Error copy

    const error = new Error('one')
    const secondError = new Error('two')
    secondError.prop = true
    setErrorProps(error, secondError)
    console.log(error.message) // 'one'
    console.log(error.prop) // true

    Non-enumerable properties

    const error = new Error('message')
    
    // Properties that start with `_` are not enumerable
    setErrorProps(error, { _one: true, two: true })
    
    console.log(error._one) // true
    console.log(error.two) // true
    console.log(Object.keys(error)) // ['two']
    console.log(error) // Prints `two` but not `_one`

    Descriptors

    const error = new Error('message')
    Object.defineProperty(error, 'prop', {
      value: false,
      enumerable: false,
      writable: true,
      configurable: true,
    })
    setErrorProps(error, { prop: true })
    console.log(error.prop) // true
    console.log(Object.getOwnPropertyDescriptor(error, 'prop').enumerable) // false

    Exception safety

    const error = new Proxy(new Error('message'), {
      set() {
        throw new Error('example')
      },
      defineProperty() {
        throw new Error('example')
      },
    })
    setErrorProps(error, { prop: true }) // This does not throw

    Related projects

    Support

    For any question, don't hesitate to submit an issue on GitHub.

    Everyone is welcome regardless of personal background. We enforce a Code of conduct in order to promote a positive and inclusive environment.

    Contributing

    This project was made with ❤️. The simplest way to give back is by starring and sharing it online.

    If the documentation is unclear or has a typo, please click on the page's Edit button (pencil icon) and suggest a correction.

    If you would like to help us fix a bug or add a new feature, please check our guidelines. Pull requests are welcome!

    Install

    npm i set-error-props

    DownloadsWeekly Downloads

    1,084

    Version

    4.0.0

    License

    MIT

    Unpacked Size

    13.9 kB

    Total Files

    8

    Last publish

    Collaborators

    • ehmicky