@erangamadhushan/express-advanced-error-kit 1.3.0 โ 1.4.1
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 +95 -23
- package/dist/index.cjs +12 -0
- package/dist/index.js +12 -0
- package/package.json +9 -2
package/README.md
CHANGED
|
@@ -3,30 +3,32 @@
|
|
|
3
3
|
Advanced TypeScript-based error handling middleware for Express.js.
|
|
4
4
|
|
|
5
5
|

|
|
6
|
-

|
|
6
|
+

|
|
9
7
|
|
|
8
|
+
---
|
|
10
9
|
|
|
11
|
-
## Features
|
|
10
|
+
## โจ Features
|
|
12
11
|
|
|
13
12
|
- Async handler wrapper
|
|
14
|
-
- Custom ApiError class
|
|
13
|
+
- Custom `ApiError` class
|
|
15
14
|
- Global error middleware
|
|
16
|
-
- 404
|
|
17
|
-
-
|
|
15
|
+
- 404 Not Found middleware
|
|
16
|
+
- Logger integration (Pino, Winston, custom)
|
|
17
|
+
- MongoDB duplicate key smart parsing
|
|
18
|
+
- Zod validation error formatting
|
|
19
|
+
- Production-safe stack handling
|
|
18
20
|
- ESM + CommonJS support
|
|
19
|
-
- Full TypeScript
|
|
21
|
+
- Full TypeScript support
|
|
20
22
|
|
|
21
23
|
---
|
|
22
24
|
|
|
23
|
-
## Installation
|
|
25
|
+
## ๐ฆ Installation
|
|
24
26
|
|
|
25
27
|
```bash
|
|
26
28
|
npm install @erangamadhushan/express-advanced-error-kit
|
|
27
29
|
```
|
|
28
30
|
|
|
29
|
-
|
|
31
|
+
# ๐ Quick Start
|
|
30
32
|
|
|
31
33
|
```ts
|
|
32
34
|
import express from "express";
|
|
@@ -34,46 +36,116 @@ import {
|
|
|
34
36
|
asyncHandler,
|
|
35
37
|
ApiError,
|
|
36
38
|
notFoundMiddleware,
|
|
37
|
-
errorMiddleware
|
|
39
|
+
errorMiddleware,
|
|
38
40
|
} from "@erangamadhushan/express-advanced-error-kit";
|
|
39
41
|
|
|
40
42
|
const app = express();
|
|
43
|
+
app.use(express.json());
|
|
41
44
|
|
|
42
45
|
app.get(
|
|
43
46
|
"/error",
|
|
44
47
|
asyncHandler(async () => {
|
|
45
48
|
throw new ApiError("Something went wrong", 400);
|
|
46
|
-
})
|
|
49
|
+
}),
|
|
47
50
|
);
|
|
48
51
|
|
|
49
52
|
app.use(notFoundMiddleware);
|
|
50
|
-
app.use(errorMiddleware);
|
|
53
|
+
app.use(errorMiddleware());
|
|
51
54
|
|
|
52
55
|
app.listen(5000);
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
# ๐ง Smart MongoDB Error Handling
|
|
59
|
+
|
|
60
|
+
## Duplicate key errors are automatically formatted:
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
// Mongo duplicate key error
|
|
64
|
+
{
|
|
65
|
+
code: 11000,
|
|
66
|
+
keyValue: { email: "test@example.com" }
|
|
67
|
+
}
|
|
68
|
+
```
|
|
53
69
|
|
|
70
|
+
Response:
|
|
71
|
+
|
|
72
|
+
```json
|
|
73
|
+
{
|
|
74
|
+
"success": false,
|
|
75
|
+
"message": "email already exists"
|
|
76
|
+
}
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
# ๐งพ Zod Validation Formatting
|
|
80
|
+
|
|
81
|
+
If using Zod:
|
|
82
|
+
|
|
83
|
+
```ts
|
|
84
|
+
throw new ZodError([...]);
|
|
54
85
|
```
|
|
55
86
|
|
|
56
|
-
|
|
87
|
+
Response:
|
|
88
|
+
|
|
89
|
+
```json
|
|
90
|
+
{
|
|
91
|
+
"success": false,
|
|
92
|
+
"message": "email: Invalid email"
|
|
93
|
+
}
|
|
94
|
+
```
|
|
57
95
|
|
|
58
|
-
|
|
96
|
+
# ๐ชต Logger Integration
|
|
59
97
|
|
|
60
|
-
|
|
98
|
+
Use any logger:
|
|
61
99
|
|
|
62
100
|
```ts
|
|
63
101
|
import pino from "pino";
|
|
102
|
+
|
|
64
103
|
const logger = pino();
|
|
65
104
|
|
|
66
105
|
app.use(
|
|
67
106
|
errorMiddleware({
|
|
68
107
|
logger: logger.error.bind(logger),
|
|
69
|
-
showStack:
|
|
70
|
-
})
|
|
108
|
+
showStack: false,
|
|
109
|
+
}),
|
|
71
110
|
);
|
|
72
111
|
```
|
|
73
112
|
|
|
74
|
-
|
|
113
|
+
# ๐ Middleware Order (Important)
|
|
114
|
+
|
|
115
|
+
```js
|
|
116
|
+
app.use(routes);
|
|
117
|
+
........
|
|
118
|
+
........
|
|
119
|
+
app.use(notFoundMiddleware);
|
|
120
|
+
app.use(errorMiddleware());
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
# ๐งฉ Creating Custom Errors
|
|
124
|
+
|
|
125
|
+
```ts
|
|
126
|
+
throw new ApiError(404, "User not found");
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
Also You can extend it:
|
|
130
|
+
```ts
|
|
131
|
+
class ValidationError extends ApiError {
|
|
132
|
+
constructor(message: string) {
|
|
133
|
+
super(400, message);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
# โ๏ธ Configuration Options
|
|
139
|
+
```ts
|
|
140
|
+
errorMiddleware({
|
|
141
|
+
logger?: (error: any) => void;
|
|
142
|
+
showStack?: boolean;
|
|
143
|
+
});
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
# ๐ก Production Behavior
|
|
147
|
+
|
|
148
|
+
- Stack traces hidden automatically in production
|
|
149
|
+
- Clean JSON response format
|
|
150
|
+
- Centralized error control
|
|
75
151
|
|
|
76
|
-
- console
|
|
77
|
-
- winston
|
|
78
|
-
- pino
|
|
79
|
-
- custom logger
|
package/dist/index.cjs
CHANGED
|
@@ -69,11 +69,23 @@ var errorMiddleware = (options = {}) => (err, req, res, next) => {
|
|
|
69
69
|
}
|
|
70
70
|
return null;
|
|
71
71
|
};
|
|
72
|
+
const handleZodError = (err2) => {
|
|
73
|
+
if ((err2 == null ? void 0 : err2.name) === "ZodError") {
|
|
74
|
+
const message2 = err2.errors.map((e) => `${e.path.join(".")}: ${e.message}`).join(", ");
|
|
75
|
+
return new ApiError(400, message2);
|
|
76
|
+
}
|
|
77
|
+
return null;
|
|
78
|
+
};
|
|
72
79
|
const mongoError = handleMongoError(err);
|
|
73
80
|
if (mongoError) {
|
|
74
81
|
statusCode = mongoError.statusCode;
|
|
75
82
|
message = mongoError.message;
|
|
76
83
|
}
|
|
84
|
+
const zodError = handleZodError(err);
|
|
85
|
+
if (zodError) {
|
|
86
|
+
statusCode = zodError.statusCode;
|
|
87
|
+
message = zodError.message;
|
|
88
|
+
}
|
|
77
89
|
res.status(statusCode).json({
|
|
78
90
|
success: false,
|
|
79
91
|
statusCode,
|
package/dist/index.js
CHANGED
|
@@ -40,11 +40,23 @@ var errorMiddleware = (options = {}) => (err, req, res, next) => {
|
|
|
40
40
|
}
|
|
41
41
|
return null;
|
|
42
42
|
};
|
|
43
|
+
const handleZodError = (err2) => {
|
|
44
|
+
if ((err2 == null ? void 0 : err2.name) === "ZodError") {
|
|
45
|
+
const message2 = err2.errors.map((e) => `${e.path.join(".")}: ${e.message}`).join(", ");
|
|
46
|
+
return new ApiError(400, message2);
|
|
47
|
+
}
|
|
48
|
+
return null;
|
|
49
|
+
};
|
|
43
50
|
const mongoError = handleMongoError(err);
|
|
44
51
|
if (mongoError) {
|
|
45
52
|
statusCode = mongoError.statusCode;
|
|
46
53
|
message = mongoError.message;
|
|
47
54
|
}
|
|
55
|
+
const zodError = handleZodError(err);
|
|
56
|
+
if (zodError) {
|
|
57
|
+
statusCode = zodError.statusCode;
|
|
58
|
+
message = zodError.message;
|
|
59
|
+
}
|
|
48
60
|
res.status(statusCode).json({
|
|
49
61
|
success: false,
|
|
50
62
|
statusCode,
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@erangamadhushan/express-advanced-error-kit",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "Advanced TypeScript error handling middleware for Express applications.",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -29,6 +29,9 @@
|
|
|
29
29
|
"url": "https://github.com/Erangamadhushan/express-advanced-error-kit/issues"
|
|
30
30
|
},
|
|
31
31
|
"homepage": "https://github.com/Erangamadhushan/express-advanced-error-kit#readme",
|
|
32
|
+
"peerDependencies": {
|
|
33
|
+
"zod": "^4.3.6"
|
|
34
|
+
},
|
|
32
35
|
"devDependencies": {
|
|
33
36
|
"@semantic-release/changelog": "^6.0.3",
|
|
34
37
|
"@semantic-release/git": "^10.0.1",
|
|
@@ -44,6 +47,10 @@
|
|
|
44
47
|
"supertest": "^7.2.2",
|
|
45
48
|
"ts-jest": "^29.4.6",
|
|
46
49
|
"tsup": "^8.5.1",
|
|
47
|
-
"typescript": "^5.9.3"
|
|
50
|
+
"typescript": "^5.9.3",
|
|
51
|
+
"zod": "^4.3.6"
|
|
52
|
+
},
|
|
53
|
+
"dependencies": {
|
|
54
|
+
"zod": "^4.3.6"
|
|
48
55
|
}
|
|
49
56
|
}
|