Package Exports
- set-error-props
Readme
Properly update an error's properties.
Features
- Prevents overriding error core properties (
name,message, etc.) - Protects against prototype pollution
- Prevents overriding existing properties
- Copies another error's properties
- Can set properties as non-enumerable
- Preserves properties descriptors (
enumerable,writable,configurable,get/set) - Exception-safe: this only throws syntax errors
- Strict TypeScript typing of the return value
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 readonlyInstall
npm install set-error-propsThis 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 | objectprops Error | objectoptions 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) // trueError 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) // trueNon-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) // falseException 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 throwRelated projects
modern-errors: Handle errors in a simple, stable, consistent wayerror-custom-class: Create one error classerror-class-utils: Utilities to properly create error classeserror-serializer: Convert errors to/from plain objectsnormalize-exception: Normalize exceptions/errorsis-error-instance: Check if a value is anErrorinstanceset-error-class: Properly update an error's classset-error-message: Properly update an error's messagewrap-error-message: Properly wrap an error's messageset-error-stack: Properly update an error's stackmerge-error-cause: Merge an error with itscauseerror-cause-polyfill: Polyfillerror.causehandle-cli-error: 💣 Error handler for CLI applications 💥log-process-errors: Show some ❤ to Node.js process errorserror-http-response: Create HTTP error responseswinston-error-format: Log errors with Winston
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!