backend-error 1.2.0 → 1.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -72,6 +72,8 @@ const error = new BackendError({
72
72
 
73
73
  ## ⚙️ Static error helpers
74
74
 
75
+ Available helpers (status, showUser, severity):
76
+
75
77
  ```ts
76
78
  BackendError.BadRequest("..."); // 400, showUser: true
77
79
  BackendError.Unauthorized("..."); // 401, showUser: true
@@ -79,8 +81,34 @@ BackendError.Forbidden("..."); // 403, showUser: true
79
81
  BackendError.NotFound("..."); // 404, showUser: true
80
82
  BackendError.Conflict("..."); // 409, showUser: true
81
83
  BackendError.UnprocessableEntity("..."); // 422, showUser: true
84
+ BackendError.FailedDependency("..."); // 424, showUser: true
82
85
  BackendError.Internal("..."); // 500, showUser: false
86
+ BackendError.NotImplemented("..."); // 501, showUser: true
87
+ BackendError.ExternalAPI("..."); // 502, showUser: true
83
88
  BackendError.ServiceUnavailable("..."); // 503, showUser: false
89
+ BackendError.GatewayTimeout("..."); // 504, showUser: false
90
+ BackendError.InsufficientStorage("..."); // 507, showUser: false
91
+ ```
92
+
93
+ Notes:
94
+
95
+ - 4xx helpers generally have `showUser: true` so clients get actionable messages.
96
+ - 5xx helpers are usually `showUser: false` to avoid leaking internals, except `NotImplemented` and `ExternalAPI` which intentionally expose helpful client-facing messages.
97
+
98
+ ### External / upstream errors
99
+
100
+ Use `ExternalAPI` for failures originating from upstream services (Stripe, bank APIs, HR systems etc). It defaults to HTTP `502 Bad Gateway`, `showUser: true` (so the user gets a helpful message), and `severity: "critical"`.
101
+
102
+ Example:
103
+
104
+ ```ts
105
+ try {
106
+ // call an external API
107
+ await chargeCard();
108
+ } catch (err) {
109
+ // Indicate the error came from an external API — user can be informed
110
+ throw BackendError.ExternalAPI("Payment provider unavailable"); // 502, showUser: true
111
+ }
84
112
  ```
85
113
 
86
114
  ---
@@ -109,6 +137,14 @@ app.get("/user/:id", async (req, res) => {
109
137
 
110
138
  ## 🧩 Types
111
139
 
140
+ The package re-exports TypeScript types so you get full typings when consuming the package. Import types like this:
141
+
142
+ ```ts
143
+ import type { BackendErrorOptions, Severity } from "backend-error";
144
+ ```
145
+
146
+ For reference, the exported types look like:
147
+
112
148
  ```ts
113
149
  export type Severity = "info" | "warning" | "error" | "critical";
114
150
 
@@ -1,17 +1,23 @@
1
- import { BackendErrorOptions, Severity } from "../interfaces/Types";
2
- export declare class BackendError extends Error {
3
- isOperational: boolean;
4
- showUser: boolean;
5
- severity: Severity;
6
- code?: number;
7
- data?: any;
8
- constructor(options: BackendErrorOptions);
9
- static BadRequest(msg: string): BackendError;
10
- static Unauthorized(msg: string): BackendError;
11
- static Forbidden(msg: string): BackendError;
12
- static NotFound(msg: string): BackendError;
13
- static Conflict(msg: string): BackendError;
14
- static UnprocessableEntity(msg: string): BackendError;
15
- static Internal(msg: string): BackendError;
16
- static ServiceUnavailable(msg: string): BackendError;
17
- }
1
+ import { BackendErrorOptions, Severity } from "../interfaces/Types";
2
+ export declare class BackendError extends Error {
3
+ isOperational: boolean;
4
+ showUser: boolean;
5
+ severity: Severity;
6
+ code?: number;
7
+ data?: any;
8
+ constructor(options: BackendErrorOptions);
9
+ static BadRequest(msg: string): BackendError;
10
+ static Unauthorized(msg: string): BackendError;
11
+ static Forbidden(msg: string): BackendError;
12
+ static NotFound(msg: string): BackendError;
13
+ static Conflict(msg: string): BackendError;
14
+ static UnprocessableEntity(msg: string): BackendError;
15
+ static FailedDependency(msg: string): BackendError;
16
+ static Internal(msg: string): BackendError;
17
+ static NotImplemented(msg: string): BackendError;
18
+ static ExternalAPI(msg: string, code?: number): BackendError;
19
+ static ServiceUnavailable(msg: string): BackendError;
20
+ static GatewayTimeout(msg: string): BackendError;
21
+ static InsufficientStorage(msg: string): BackendError;
22
+ }
23
+ //# sourceMappingURL=BackendError.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BackendError.d.ts","sourceRoot":"","sources":["../../src/core/BackendError.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpE,qBAAa,YAAa,SAAQ,KAAK;IAC9B,aAAa,EAAE,OAAO,CAAC;IACvB,QAAQ,EAAE,OAAO,CAAC;IAClB,QAAQ,EAAE,QAAQ,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,GAAG,CAAC;gBAEN,OAAO,EAAE,mBAAmB;IAcxC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM;IAI7B,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,MAAM;IAI/B,MAAM,CAAC,SAAS,CAAC,GAAG,EAAE,MAAM;IAI5B,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM;IAK3B,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM;IAK3B,MAAM,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM;IAItC,MAAM,CAAC,gBAAgB,CAAC,GAAG,EAAE,MAAM;IAKnC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM;IAI3B,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM;IAIjC,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAY;IAIlD,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM;IAIrC,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,MAAM;IAIjC,MAAM,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM;CAGvC"}
@@ -13,6 +13,7 @@ class BackendError extends Error {
13
13
  this.data = options.data;
14
14
  Object.setPrototypeOf(this, BackendError.prototype);
15
15
  }
16
+ // Ordered by HTTP status code (ascending)
16
17
  static BadRequest(msg) {
17
18
  return new BackendError({ message: msg, code: 400, severity: "warning", showUser: true });
18
19
  }
@@ -25,21 +26,36 @@ class BackendError extends Error {
25
26
  static NotFound(msg) {
26
27
  return new BackendError({ message: msg, code: 404, severity: "warning", showUser: true });
27
28
  }
29
+ // 409 Conflict variants
28
30
  static Conflict(msg) {
29
31
  return new BackendError({ message: msg, code: 409, severity: "warning", showUser: true });
30
32
  }
33
+ // 422 Unprocessable / validation
31
34
  static UnprocessableEntity(msg) {
32
35
  return new BackendError({ message: msg, code: 422, severity: "warning", showUser: true });
33
36
  }
37
+ static FailedDependency(msg) {
38
+ return new BackendError({ message: msg, code: 424, severity: "warning", showUser: true });
39
+ }
40
+ // 5xx server errors
34
41
  static Internal(msg) {
35
42
  return new BackendError({ message: msg, code: 500, severity: "critical", showUser: false });
36
43
  }
44
+ static NotImplemented(msg) {
45
+ return new BackendError({ message: msg, code: 501, severity: "error", showUser: true });
46
+ }
37
47
  static ExternalAPI(msg, code = 502) {
38
- return new BackendError({ message: msg, code, severity: "warning", showUser: true });
48
+ return new BackendError({ message: msg, code, severity: "critical", showUser: true });
39
49
  }
40
50
  static ServiceUnavailable(msg) {
41
51
  return new BackendError({ message: msg, code: 503, severity: "critical", showUser: false });
42
52
  }
53
+ static GatewayTimeout(msg) {
54
+ return new BackendError({ message: msg, code: 504, severity: "critical", showUser: false });
55
+ }
56
+ static InsufficientStorage(msg) {
57
+ return new BackendError({ message: msg, code: 507, severity: "critical", showUser: false });
58
+ }
43
59
  }
44
60
  exports.BackendError = BackendError;
45
61
  //# sourceMappingURL=BackendError.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"BackendError.js","sourceRoot":"","sources":["../../src/core/BackendError.ts"],"names":[],"mappings":";;;AAEA,MAAa,YAAa,SAAQ,KAAK;IAOrC,YAAY,OAA4B;;QACtC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAE3B,IAAI,CAAC,aAAa,GAAG,MAAA,OAAO,CAAC,aAAa,mCAAI,IAAI,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAG,MAAA,OAAO,CAAC,QAAQ,mCAAI,IAAI,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,MAAA,OAAO,CAAC,QAAQ,mCAAI,OAAO,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAEzB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,GAAW;QAC3B,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,GAAW;QAC7B,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,GAAW;QAC1B,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,GAAW;QACzB,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,GAAW;QACzB,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,CAAC,mBAAmB,CAAC,GAAW;QACpC,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,GAAW;QACzB,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,GAAW,EAAE,OAAe,GAAG;QAChD,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,GAAW;QACnC,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9F,CAAC;CACF;AAvDD,oCAuDC"}
1
+ {"version":3,"file":"BackendError.js","sourceRoot":"","sources":["../../src/core/BackendError.ts"],"names":[],"mappings":";;;AAEA,MAAa,YAAa,SAAQ,KAAK;IAOrC,YAAY,OAA4B;;QACtC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACvB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAE3B,IAAI,CAAC,aAAa,GAAG,MAAA,OAAO,CAAC,aAAa,mCAAI,IAAI,CAAC;QACnD,IAAI,CAAC,QAAQ,GAAG,MAAA,OAAO,CAAC,QAAQ,mCAAI,IAAI,CAAC;QACzC,IAAI,CAAC,QAAQ,GAAG,MAAA,OAAO,CAAC,QAAQ,mCAAI,OAAO,CAAC;QAC5C,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC;QAEzB,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC,CAAC;IACtD,CAAC;IAED,0CAA0C;IAC1C,MAAM,CAAC,UAAU,CAAC,GAAW;QAC3B,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,GAAW;QAC7B,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,GAAW;QAC1B,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,CAAC,QAAQ,CAAC,GAAW;QACzB,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,wBAAwB;IACxB,MAAM,CAAC,QAAQ,CAAC,GAAW;QACzB,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,iCAAiC;IACjC,MAAM,CAAC,mBAAmB,CAAC,GAAW;QACpC,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,MAAM,CAAC,gBAAgB,CAAC,GAAW;QACjC,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5F,CAAC;IAED,oBAAoB;IACpB,MAAM,CAAC,QAAQ,CAAC,GAAW;QACzB,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,GAAW;QAC/B,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,GAAW,EAAE,OAAe,GAAG;QAChD,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IACxF,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,GAAW;QACnC,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,GAAW;QAC/B,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,MAAM,CAAC,mBAAmB,CAAC,GAAW;QACpC,OAAO,IAAI,YAAY,CAAC,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC,CAAC;IAC9F,CAAC;CACF;AA3ED,oCA2EC"}
@@ -1,6 +1,7 @@
1
- export declare function httpErrorFormatter(err: unknown): {
2
- status: number;
3
- body: Record<string, any>;
4
- showUser: boolean;
5
- message: string;
6
- };
1
+ export declare function httpErrorFormatter(err: unknown): {
2
+ status: number;
3
+ body: Record<string, any>;
4
+ showUser: boolean;
5
+ message: string;
6
+ };
7
+ //# sourceMappingURL=httpErrorFormatter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"httpErrorFormatter.d.ts","sourceRoot":"","sources":["../../src/core/httpErrorFormatter.ts"],"names":[],"mappings":"AAMA,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,OAAO,GAAG;IAChD,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1B,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;CACjB,CA8CA"}
package/dist/index.d.ts CHANGED
@@ -1,3 +1,4 @@
1
- export { BackendError } from "./core/BackendError";
2
- export { httpErrorFormatter } from "./core/httpErrorFormatter";
3
- export type { BackendErrorOptions, Severity } from "./interfaces/Types";
1
+ export { BackendError } from "./core/BackendError";
2
+ export { httpErrorFormatter } from "./core/httpErrorFormatter";
3
+ export type { BackendErrorOptions, Severity } from "./interfaces/Types";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAC/D,YAAY,EAAE,mBAAmB,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC"}
@@ -1,9 +1,10 @@
1
- export type Severity = "info" | "warning" | "error" | "critical";
2
- export interface BackendErrorOptions {
3
- message: string;
4
- isOperational?: boolean;
5
- showUser?: boolean;
6
- severity?: Severity;
7
- code?: number;
8
- data?: any;
9
- }
1
+ export type Severity = "info" | "warning" | "error" | "critical";
2
+ export interface BackendErrorOptions {
3
+ message: string;
4
+ isOperational?: boolean;
5
+ showUser?: boolean;
6
+ severity?: Severity;
7
+ code?: number;
8
+ data?: any;
9
+ }
10
+ //# sourceMappingURL=Types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Types.d.ts","sourceRoot":"","sources":["../../src/interfaces/Types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG,SAAS,GAAG,OAAO,GAAG,UAAU,CAAC;AAEjE,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,GAAG,CAAC;CACZ"}
package/package.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "1.2.0",
2
+ "version": "1.2.2",
3
3
  "name": "backend-error",
4
4
  "license": "MIT",
5
5
  "keywords": [