backend-error 1.1.0 → 1.2.0
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 +68 -57
- package/dist/core/BackendError.js +45 -60
- package/dist/core/BackendError.js.map +1 -0
- package/dist/core/httpErrorFormatter.js +47 -52
- package/dist/core/httpErrorFormatter.js.map +1 -0
- package/dist/index.js +8 -7
- package/dist/index.js.map +1 -0
- package/dist/interfaces/Types.js +3 -2
- package/dist/interfaces/Types.js.map +1 -0
- package/dist/types/core/BackendError.d.ts +19 -0
- package/dist/types/core/BackendError.d.ts.map +1 -0
- package/dist/types/core/httpErrorFormatter.d.ts +7 -0
- package/dist/types/core/httpErrorFormatter.d.ts.map +1 -0
- package/dist/types/index.d.ts +4 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/interfaces/Types.d.ts +10 -0
- package/dist/types/interfaces/Types.d.ts.map +1 -0
- package/package.json +17 -13
package/README.md
CHANGED
|
@@ -1,37 +1,58 @@
|
|
|
1
|
-
#
|
|
1
|
+
# backend-error
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+

|
|
4
|
+

|
|
5
|
+

|
|
4
6
|
|
|
5
|
-
|
|
7
|
+
`backend-error` is a lightweight Node.js / TypeScript utility that formats all errors—custom or native—into standardized HTTP responses with correct status codes and user-friendly messages. The `httpErrorFormatter` ensures secure, consistent error output by controlling what is exposed to the frontend.
|
|
6
8
|
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
[](https://github.com/eriksturesson/backendError)
|
|
10
|
-
[](https://www.npmjs.com/package/backend-error)
|
|
9
|
+
---
|
|
11
10
|
|
|
12
|
-
## Installation
|
|
11
|
+
## 📦 Installation
|
|
13
12
|
|
|
14
13
|
```bash
|
|
15
14
|
npm install backend-error
|
|
16
15
|
```
|
|
17
16
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
Use `BackendError` class for standardized backend error handling:
|
|
17
|
+
---
|
|
21
18
|
|
|
22
|
-
##
|
|
19
|
+
## 🚀 Throw `BackendError`, catch with `httpErrorFormatter`
|
|
23
20
|
|
|
24
21
|
```ts
|
|
25
|
-
import { BackendError } from "backend-error";
|
|
22
|
+
import { BackendError, httpErrorFormatter } from "backend-error";
|
|
26
23
|
|
|
27
|
-
|
|
24
|
+
app.post("/signup", async (req, res) => {
|
|
25
|
+
try {
|
|
26
|
+
const auth = req.headers.authorization;
|
|
27
|
+
const { email, id } = req.body;
|
|
28
|
+
if (!auth) throw BackendError.Unauthorized("Missing auth token"); // 401, showUser:true
|
|
29
|
+
if (!email) throw BackendError.BadRequest("Email is required"); // 400, showUser:true
|
|
30
|
+
const user = await getUser(req.params.id);
|
|
31
|
+
if (!user) throw BackendError.NotFound("User not found"); // 404, showUser:true
|
|
32
|
+
|
|
33
|
+
// Normal logic...
|
|
34
|
+
} catch (err) {
|
|
35
|
+
const { status, body } = httpErrorFormatter(err); // Handles BackendError and native Error safely
|
|
36
|
+
res.status(status).json(body);
|
|
37
|
+
}
|
|
38
|
+
});
|
|
28
39
|
```
|
|
29
40
|
|
|
30
|
-
|
|
41
|
+
✅ No manual showUser checks — handled automatically by the formatter
|
|
42
|
+
✅ Returns generic 500 for critical or unknown errors (or if `showUser` is false)
|
|
43
|
+
✅ Formatter supports both BackendError instances and native Error objects
|
|
44
|
+
|
|
45
|
+
> The httpErrorFormatter inspects any error, formats it consistently, and decides what message is safe to show to users.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## ✨ Custom BackendError creation
|
|
50
|
+
|
|
51
|
+
If you prefer, create your own error with full control including custom metadata:
|
|
31
52
|
|
|
32
53
|
```ts
|
|
33
54
|
const error = new BackendError({
|
|
34
|
-
message: "Something went
|
|
55
|
+
message: "Something went wrong",
|
|
35
56
|
severity: "critical",
|
|
36
57
|
showUser: true,
|
|
37
58
|
code: 500,
|
|
@@ -39,35 +60,37 @@ const error = new BackendError({
|
|
|
39
60
|
});
|
|
40
61
|
```
|
|
41
62
|
|
|
42
|
-
|
|
63
|
+
### Selected BackendError options
|
|
43
64
|
|
|
44
|
-
- `message`:
|
|
65
|
+
- `message`: Error message
|
|
45
66
|
- `code`: HTTP status code
|
|
46
|
-
- `
|
|
47
|
-
- `showUser`: Whether frontend should show the message
|
|
67
|
+
- `showUser`: Whether to expose the message to frontend clients
|
|
48
68
|
- `severity`: "info" | "warning" | "error" | "critical"
|
|
49
|
-
- `data`:
|
|
69
|
+
- `data`: Optional metadata
|
|
50
70
|
|
|
51
|
-
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## ⚙️ Static error helpers
|
|
52
74
|
|
|
53
75
|
```ts
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
}
|
|
76
|
+
BackendError.BadRequest("..."); // 400, showUser: true
|
|
77
|
+
BackendError.Unauthorized("..."); // 401, showUser: true
|
|
78
|
+
BackendError.Forbidden("..."); // 403, showUser: true
|
|
79
|
+
BackendError.NotFound("..."); // 404, showUser: true
|
|
80
|
+
BackendError.Conflict("..."); // 409, showUser: true
|
|
81
|
+
BackendError.UnprocessableEntity("..."); // 422, showUser: true
|
|
82
|
+
BackendError.Internal("..."); // 500, showUser: false
|
|
83
|
+
BackendError.ServiceUnavailable("..."); // 503, showUser: false
|
|
63
84
|
```
|
|
64
85
|
|
|
65
|
-
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## 🧠 Manual error handling (if not using `httpErrorFormatter`)
|
|
66
89
|
|
|
67
90
|
```ts
|
|
68
91
|
import { BackendError } from "backend-error";
|
|
69
92
|
|
|
70
|
-
app.get("/user/:id", async (req, res
|
|
93
|
+
app.get("/user/:id", async (req, res) => {
|
|
71
94
|
try {
|
|
72
95
|
const user = null;
|
|
73
96
|
if (!user) throw BackendError.NotFound("User not found");
|
|
@@ -82,24 +105,13 @@ app.get("/user/:id", async (req, res, next) => {
|
|
|
82
105
|
});
|
|
83
106
|
```
|
|
84
107
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
- `BackendError.BadRequest(message: string)` // 400, showUser: true
|
|
88
|
-
- `BackendError.Unauthorized(message: string)` // 401, showUser: true
|
|
89
|
-
- `BackendError.Forbidden(message: string)` // 403, showUser: true
|
|
90
|
-
- `BackendError.NotFound(message: string)` // 404, showUser: true
|
|
91
|
-
- `BackendError.Conflict(message: string)` // 409, showUser: true
|
|
92
|
-
- `BackendError.UnprocessableEntity(message: string)`// 422, showUser: true
|
|
93
|
-
- `BackendError.Internal(message: string)` // 500, showUser: false
|
|
94
|
-
- `BackendError.ServiceUnavailable(message: string)` // 503, showUser: false
|
|
108
|
+
---
|
|
95
109
|
|
|
96
110
|
## 🧩 Types
|
|
97
111
|
|
|
98
112
|
```ts
|
|
99
113
|
export type Severity = "info" | "warning" | "error" | "critical";
|
|
100
|
-
```
|
|
101
114
|
|
|
102
|
-
```ts
|
|
103
115
|
export interface BackendErrorOptions {
|
|
104
116
|
message: string;
|
|
105
117
|
isOperational?: boolean;
|
|
@@ -110,29 +122,30 @@ export interface BackendErrorOptions {
|
|
|
110
122
|
}
|
|
111
123
|
```
|
|
112
124
|
|
|
125
|
+
---
|
|
126
|
+
|
|
113
127
|
## 🎨 Works well with [error-drawings](https://www.npmjs.com/package/error-drawings)
|
|
114
128
|
|
|
115
129
|

|
|
116
130
|

|
|
117
131
|
|
|
118
|
-
|
|
132
|
+
```bash
|
|
133
|
+
npm install error-drawings
|
|
134
|
+
```
|
|
119
135
|
|
|
120
|
-
|
|
136
|
+
Use for dev-friendly terminal logs — with a bit of dramatic flair for critical errors:
|
|
121
137
|
|
|
122
138
|
```ts
|
|
123
|
-
import { BackendError } from "backend-error";
|
|
139
|
+
import { BackendError, httpErrorFormatter } from "backend-error";
|
|
124
140
|
import drawLog from "error-drawings";
|
|
125
141
|
|
|
126
142
|
try {
|
|
127
143
|
throw BackendError.Forbidden("No access to resource");
|
|
128
144
|
} catch (err) {
|
|
129
145
|
const isCritical = !(err instanceof BackendError && err.isOperational) || err.code >= 500;
|
|
130
|
-
if (isCritical)
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
drawLog(err);
|
|
134
|
-
}
|
|
135
|
-
const { status, body } = await httpErrorFormatter(err); //Use the formatter as always
|
|
146
|
+
if (isCritical) drawLog(err); // Dramatic terminal art for critical errors!
|
|
147
|
+
|
|
148
|
+
const { status, body } = httpErrorFormatter(err);
|
|
136
149
|
res.status(status).json(body);
|
|
137
150
|
}
|
|
138
151
|
```
|
|
@@ -141,8 +154,6 @@ try {
|
|
|
141
154
|
|
|
142
155
|
## 🌐 Repo
|
|
143
156
|
|
|
144
|
-
[
|
|
145
|
-
|
|
146
|
-
---
|
|
157
|
+
[GitHub](https://github.com/eriksturesson/backendError)
|
|
147
158
|
|
|
148
159
|
Created by [@eriksturesson](https://eriksturesson.se)
|
|
@@ -1,60 +1,45 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
return
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
return new BackendError({ message: msg, code:
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
return new BackendError({ message: msg, code
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
return new BackendError({ message: msg, code:
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
BackendError.Conflict = function (msg) {
|
|
47
|
-
return new BackendError({ message: msg, code: 409, severity: "warning", showUser: true });
|
|
48
|
-
};
|
|
49
|
-
BackendError.UnprocessableEntity = function (msg) {
|
|
50
|
-
return new BackendError({ message: msg, code: 422, severity: "warning", showUser: true });
|
|
51
|
-
};
|
|
52
|
-
BackendError.Internal = function (msg) {
|
|
53
|
-
return new BackendError({ message: msg, code: 500, severity: "critical", showUser: false });
|
|
54
|
-
};
|
|
55
|
-
BackendError.ServiceUnavailable = function (msg) {
|
|
56
|
-
return new BackendError({ message: msg, code: 503, severity: "critical", showUser: false });
|
|
57
|
-
};
|
|
58
|
-
return BackendError;
|
|
59
|
-
}(Error));
|
|
60
|
-
exports.BackendError = BackendError;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.BackendError = void 0;
|
|
4
|
+
class BackendError extends Error {
|
|
5
|
+
constructor(options) {
|
|
6
|
+
var _a, _b, _c;
|
|
7
|
+
super(options.message);
|
|
8
|
+
this.name = "BackendError";
|
|
9
|
+
this.isOperational = (_a = options.isOperational) !== null && _a !== void 0 ? _a : true;
|
|
10
|
+
this.showUser = (_b = options.showUser) !== null && _b !== void 0 ? _b : true;
|
|
11
|
+
this.severity = (_c = options.severity) !== null && _c !== void 0 ? _c : "error";
|
|
12
|
+
this.code = options.code;
|
|
13
|
+
this.data = options.data;
|
|
14
|
+
Object.setPrototypeOf(this, BackendError.prototype);
|
|
15
|
+
}
|
|
16
|
+
static BadRequest(msg) {
|
|
17
|
+
return new BackendError({ message: msg, code: 400, severity: "warning", showUser: true });
|
|
18
|
+
}
|
|
19
|
+
static Unauthorized(msg) {
|
|
20
|
+
return new BackendError({ message: msg, code: 401, severity: "warning", showUser: true });
|
|
21
|
+
}
|
|
22
|
+
static Forbidden(msg) {
|
|
23
|
+
return new BackendError({ message: msg, code: 403, severity: "warning", showUser: true });
|
|
24
|
+
}
|
|
25
|
+
static NotFound(msg) {
|
|
26
|
+
return new BackendError({ message: msg, code: 404, severity: "warning", showUser: true });
|
|
27
|
+
}
|
|
28
|
+
static Conflict(msg) {
|
|
29
|
+
return new BackendError({ message: msg, code: 409, severity: "warning", showUser: true });
|
|
30
|
+
}
|
|
31
|
+
static UnprocessableEntity(msg) {
|
|
32
|
+
return new BackendError({ message: msg, code: 422, severity: "warning", showUser: true });
|
|
33
|
+
}
|
|
34
|
+
static Internal(msg) {
|
|
35
|
+
return new BackendError({ message: msg, code: 500, severity: "critical", showUser: false });
|
|
36
|
+
}
|
|
37
|
+
static ExternalAPI(msg, code = 502) {
|
|
38
|
+
return new BackendError({ message: msg, code, severity: "warning", showUser: true });
|
|
39
|
+
}
|
|
40
|
+
static ServiceUnavailable(msg) {
|
|
41
|
+
return new BackendError({ message: msg, code: 503, severity: "critical", showUser: false });
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
exports.BackendError = BackendError;
|
|
45
|
+
//# sourceMappingURL=BackendError.js.map
|
|
@@ -0,0 +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,52 +1,47 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
}
|
|
49
|
-
var body = showUser ? { message: message } : { message: "Internal Server Error" };
|
|
50
|
-
return { status: status, body: body, showUser: showUser, message: message };
|
|
51
|
-
}
|
|
52
|
-
exports.httpErrorFormatter = httpErrorFormatter;
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.httpErrorFormatter = httpErrorFormatter;
|
|
4
|
+
const BackendError_1 = require("./BackendError");
|
|
5
|
+
function isValidStatusCode(code) {
|
|
6
|
+
return typeof code === "number" && Number.isInteger(code) && code >= 100 && code <= 599;
|
|
7
|
+
}
|
|
8
|
+
function httpErrorFormatter(err) {
|
|
9
|
+
// Handle your custom BackendError type
|
|
10
|
+
if (err instanceof BackendError_1.BackendError) {
|
|
11
|
+
const status = isValidStatusCode(err.code) ? err.code : 400;
|
|
12
|
+
// If developer explicitly set showUser, trust that; otherwise default: true for 4xx, false for 5xx
|
|
13
|
+
const showUser = typeof err.showUser === "boolean" ? err.showUser : status < 500;
|
|
14
|
+
const message = err.message || "Error";
|
|
15
|
+
// If showUser is true, return detailed info including data, code, severity; else generic message
|
|
16
|
+
const body = showUser
|
|
17
|
+
? {
|
|
18
|
+
message,
|
|
19
|
+
...(err.data !== undefined && { data: err.data }),
|
|
20
|
+
code: status,
|
|
21
|
+
severity: err.severity,
|
|
22
|
+
}
|
|
23
|
+
: { message: "Internal Server Error" };
|
|
24
|
+
return { status, body, showUser, message };
|
|
25
|
+
}
|
|
26
|
+
// Handle generic Error or string or unknown
|
|
27
|
+
let status = 500;
|
|
28
|
+
let message = "Internal Server Error";
|
|
29
|
+
let showUser = false;
|
|
30
|
+
if (err instanceof Error) {
|
|
31
|
+
message = err.message;
|
|
32
|
+
// Try to extract HTTP status code from common fields 'status' or 'code'
|
|
33
|
+
const maybeStatus = err.status || err.code;
|
|
34
|
+
if (isValidStatusCode(maybeStatus)) {
|
|
35
|
+
status = maybeStatus;
|
|
36
|
+
showUser = status < 500; // show message for 4xx errors by default
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
else if (typeof err === "string") {
|
|
40
|
+
message = err;
|
|
41
|
+
status = 400;
|
|
42
|
+
showUser = true;
|
|
43
|
+
}
|
|
44
|
+
const body = showUser ? { message } : { message: "Internal Server Error" };
|
|
45
|
+
return { status, body, showUser, message };
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=httpErrorFormatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"httpErrorFormatter.js","sourceRoot":"","sources":["../../src/core/httpErrorFormatter.ts"],"names":[],"mappings":";;AAMA,gDAmDC;AAzDD,iDAA8C;AAE9C,SAAS,iBAAiB,CAAC,IAAa;IACtC,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,IAAI,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,CAAC;AAC1F,CAAC;AAED,SAAgB,kBAAkB,CAAC,GAAY;IAM7C,uCAAuC;IACvC,IAAI,GAAG,YAAY,2BAAY,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC;QAE5D,mGAAmG;QACnG,MAAM,QAAQ,GAAG,OAAO,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC;QAEjF,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,IAAI,OAAO,CAAC;QAEvC,iGAAiG;QACjG,MAAM,IAAI,GAAG,QAAQ;YACnB,CAAC,CAAC;gBACE,OAAO;gBACP,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,IAAI,EAAE,IAAI,EAAE,GAAG,CAAC,IAAI,EAAE,CAAC;gBACjD,IAAI,EAAE,MAAM;gBACZ,QAAQ,EAAE,GAAG,CAAC,QAAQ;aACvB;YACH,CAAC,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC;QAEzC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;IAC7C,CAAC;IAED,4CAA4C;IAC5C,IAAI,MAAM,GAAG,GAAG,CAAC;IACjB,IAAI,OAAO,GAAG,uBAAuB,CAAC;IACtC,IAAI,QAAQ,GAAG,KAAK,CAAC;IAErB,IAAI,GAAG,YAAY,KAAK,EAAE,CAAC;QACzB,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;QAEtB,wEAAwE;QACxE,MAAM,WAAW,GAAI,GAAW,CAAC,MAAM,IAAK,GAAW,CAAC,IAAI,CAAC;QAC7D,IAAI,iBAAiB,CAAC,WAAW,CAAC,EAAE,CAAC;YACnC,MAAM,GAAG,WAAW,CAAC;YACrB,QAAQ,GAAG,MAAM,GAAG,GAAG,CAAC,CAAC,yCAAyC;QACpE,CAAC;IACH,CAAC;SAAM,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,OAAO,GAAG,GAAG,CAAC;QACd,MAAM,GAAG,GAAG,CAAC;QACb,QAAQ,GAAG,IAAI,CAAC;IAClB,CAAC;IAED,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,uBAAuB,EAAE,CAAC;IAE3E,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC;AAC7C,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.httpErrorFormatter = exports.BackendError = void 0;
|
|
4
|
-
var BackendError_1 = require("./core/BackendError");
|
|
5
|
-
Object.defineProperty(exports, "BackendError", { enumerable: true, get: function () { return BackendError_1.BackendError; } });
|
|
6
|
-
var httpErrorFormatter_1 = require("./core/httpErrorFormatter");
|
|
7
|
-
Object.defineProperty(exports, "httpErrorFormatter", { enumerable: true, get: function () { return httpErrorFormatter_1.httpErrorFormatter; } });
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.httpErrorFormatter = exports.BackendError = void 0;
|
|
4
|
+
var BackendError_1 = require("./core/BackendError");
|
|
5
|
+
Object.defineProperty(exports, "BackendError", { enumerable: true, get: function () { return BackendError_1.BackendError; } });
|
|
6
|
+
var httpErrorFormatter_1 = require("./core/httpErrorFormatter");
|
|
7
|
+
Object.defineProperty(exports, "httpErrorFormatter", { enumerable: true, get: function () { return httpErrorFormatter_1.httpErrorFormatter; } });
|
|
8
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,oDAAmD;AAA1C,4GAAA,YAAY,OAAA;AACrB,gEAA+D;AAAtD,wHAAA,kBAAkB,OAAA"}
|
package/dist/interfaces/Types.js
CHANGED
|
@@ -1,2 +1,3 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=Types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Types.js","sourceRoot":"","sources":["../../src/interfaces/Types.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
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 ExternalAPI(msg: string, code?: number): BackendError;
|
|
17
|
+
static ServiceUnavailable(msg: string): BackendError;
|
|
18
|
+
}
|
|
19
|
+
//# 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;IAaxC,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;IAI3B,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM;IAI3B,MAAM,CAAC,mBAAmB,CAAC,GAAG,EAAE,MAAM;IAItC,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,MAAM;IAI3B,MAAM,CAAC,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,MAAY;IAIlD,MAAM,CAAC,kBAAkB,CAAC,GAAG,EAAE,MAAM;CAGtC"}
|
|
@@ -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"}
|
|
@@ -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"}
|
|
@@ -0,0 +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
|
+
}
|
|
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,6 +1,21 @@
|
|
|
1
1
|
{
|
|
2
|
+
"version": "1.2.0",
|
|
2
3
|
"name": "backend-error",
|
|
3
4
|
"license": "MIT",
|
|
5
|
+
"keywords": [
|
|
6
|
+
"error",
|
|
7
|
+
"error-handler",
|
|
8
|
+
"http-errors",
|
|
9
|
+
"express",
|
|
10
|
+
"firebase-functions",
|
|
11
|
+
"nodejs",
|
|
12
|
+
"api",
|
|
13
|
+
"backend",
|
|
14
|
+
"error-handling",
|
|
15
|
+
"http-status",
|
|
16
|
+
"custom-error",
|
|
17
|
+
"structured-error"
|
|
18
|
+
],
|
|
4
19
|
"maintainers": [
|
|
5
20
|
"Erik Sturesson"
|
|
6
21
|
],
|
|
@@ -9,28 +24,17 @@
|
|
|
9
24
|
"email": "hej@eriksturesson.se",
|
|
10
25
|
"url": "https://eriksturesson.se"
|
|
11
26
|
},
|
|
12
|
-
"version": "1.1.0",
|
|
13
27
|
"description": "Simple Error handling library.",
|
|
14
|
-
"keywords": [
|
|
15
|
-
"error",
|
|
16
|
-
"fail",
|
|
17
|
-
"drawing",
|
|
18
|
-
"drawings",
|
|
19
|
-
"summarized",
|
|
20
|
-
"help",
|
|
21
|
-
"fun"
|
|
22
|
-
],
|
|
23
28
|
"repository": {
|
|
24
29
|
"type": "git",
|
|
25
|
-
"url": "https://github.com/eriksturesson/backendError"
|
|
30
|
+
"url": "git+https://github.com/eriksturesson/backendError.git"
|
|
26
31
|
},
|
|
27
32
|
"bugs": {
|
|
28
33
|
"email": "hej@eriksturesson.se",
|
|
29
34
|
"url": "https://github.com/eriksturesson/backendError/issues"
|
|
30
35
|
},
|
|
31
36
|
"engines": {
|
|
32
|
-
"
|
|
33
|
-
"node": "^22.0.0"
|
|
37
|
+
"node": ">=16"
|
|
34
38
|
},
|
|
35
39
|
"main": "dist/index.js",
|
|
36
40
|
"types": "dist/index.d.ts",
|