Chained custom errors for Typescript and Javascript. ('Caused by' in error stack)
npm install typescript-chained-error    
- Allows stacking errors with "Caused by: " keyword in stack
- Preserves error class name in trace (uses ts-custom-error for that)
- Automatically cleans up stack using clean-stack](https://github.com/sindresorhus/clean-stack)
- Has a ChainedErrorFactory that can extend any already existing error with Caused by clause additional properties and
- 100% test coverage. Used in healthcare-grade solutions
``bash`
$ npm install --save typescript-chained-error
1. Define custom error class with a constructor that has a cause as a second parameter
2. Throw your custom error passing the causing error as a second parameter
3. Error causes can be stacked (there may be many causes that are finally leading to the printed error)
`typescript
import ChainedCustomError from "typescript-chained-error";
class CannotPerformCalculationsError extends ChainedCustomError {
public constructor(msg?: string, cause?: Error) {
super(msg, cause);
}
}
// function that may throw
function buildArray(desiredLength: number) {
try {
return new Array(desiredLength);
} catch (error) {
throw new CannotPerformCalculationsError("Cannot build array", error);
}
}
// call function with illegal parameter
buildArray(-5);
`
The output:
`
CannotPerformCalculationsError: Cannot build array
at buildArray (/typescript-chained-error/src/test.ts:14:15)
at Object.
(...)
Caused by: RangeError: Invalid array length
at buildArray (/typescript-chained-error/src/test.ts:12:16)
at Object.
(...)
`
`typescript
interface Options {
cleanStack: boolean; // default: true
}
// Pass options in constructor
public constructor(msg?: string, cause?: Error) {
super(msg, cause, { cleanStack: false });
}
`
Example with firebase-functions https error (which is the only error that is thrown at the call site).
`typescript
import { ChainedErrorFactory } from "typescript-chained-error";
import * as functions from "firebase-functions";
throw ChainedErrorFactory.make(
// primary error that will be extended (this error is preserved in the prototype chain):
functions.https.HttpsError("resource-exhausted", "Message"),
// Causing error:
new TypeError("Cause error"),
// (optional) Additional fields that will be assigned to the returned error object
// e.g.: functions.https.HttpsError allow to add a details field to the error. That field will be reconstructed at the call site.
/ optional: / { details: { additional: "properties" } },
// (optional) Options. Specified above.
);
``
---
Extends the brilliant ts-custom-error. Uses clean-stack by @sindresorhus for pretty output. | Made with ❤️ by Jędrzej Lewandowski.