diff --git a/packages/common/exceptions/http.exception.ts b/packages/common/exceptions/http.exception.ts index 84ec9361b3c..540844298e1 100644 --- a/packages/common/exceptions/http.exception.ts +++ b/packages/common/exceptions/http.exception.ts @@ -41,6 +41,22 @@ export class HttpException extends Error { super(); this.initMessage(); this.initName(); + this.initCause(); + } + + public cause: Error | undefined; + + /** + * Configures error chaining support + * + * See: + * - https://nodejs.org/en/blog/release/v16.9.0/#error-cause + * - https://github.com/microsoft/TypeScript/issues/45167 + */ + public initCause() { + if (this.response instanceof Error) { + this.cause = this.response; + } } public initMessage() { diff --git a/packages/common/test/exceptions/http.exception.spec.ts b/packages/common/test/exceptions/http.exception.spec.ts index c9fbab7310d..a880c1bfc53 100644 --- a/packages/common/test/exceptions/http.exception.spec.ts +++ b/packages/common/test/exceptions/http.exception.spec.ts @@ -129,4 +129,15 @@ describe('HttpException', () => { }); }); }); + + describe('initCause', () => { + it('configures a cause when message is an instance of error', () => { + const message = new Error('Some Error'); + const error = new HttpException(message, 400); + expect(`${error}`).to.be.eql(`HttpException: ${message.message}`); + const { cause } = error; + + expect(cause).to.be.eql(message); + }); + }); });