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 CHANGED
@@ -1,37 +1,58 @@
1
- # Backend-error
1
+ # backend-error
2
2
 
3
- BackendError is a lightweight utility for structured and user-aware error handling in Node.js backends. It helps distinguish operational errors from unexpected crashes, and supports standardized error responses across services.
3
+ ![npm](https://img.shields.io/npm/v/backend-error)
4
+ ![downloads](https://img.shields.io/npm/dm/backend-error)
5
+ ![license](https://img.shields.io/npm/l/backend-error)
4
6
 
5
- > ⚠️ Note: backend-error is not a middleware it's a flexible utility for throwing and formatting structured errors. It works seamlessly with Express, Cloud Functions, and any other Node.js-based backend environment where you want standardized, user-aware error responses.
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
- > 💬 Tip: This package doesn't handle headers or CORS. If you're building an API for browsers, remember to configure CORS separately.
8
-
9
- [![GitHub package.json version (master)](https://img.shields.io/github/package-json/v/eriksturesson/backendError/master)](https://github.com/eriksturesson/backendError)
10
- [![npm](https://img.shields.io/npm/dy/backend-error?label=npm%20downloads)](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
- ## 🔥 Custom BackendError class
19
-
20
- Use `BackendError` class for standardized backend error handling:
17
+ ---
21
18
 
22
- ## Usage
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
- throw BackendError.BadRequest("Missing required field");
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
- Or construct it manually for full control:
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 terribly wrong",
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
- Properties available:
63
+ ### Selected BackendError options
43
64
 
44
- - `message`: The error message
65
+ - `message`: Error message
45
66
  - `code`: HTTP status code
46
- - `isOperational`: Marks it as a handled error (vs. crash)
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`: Additional metadata (optional and anything accepted)
69
+ - `data`: Optional metadata
50
70
 
51
- ## 🧠 Example where you also import `httpErrorFormatter`:
71
+ ---
72
+
73
+ ## ⚙️ Static error helpers
52
74
 
53
75
  ```ts
54
- import { BackendError, httpErrorFormatter } from "backend-error";
55
- try {
56
- const user = null;
57
- if (!user) throw BackendError.NotFound("User not found");
58
- res.json(user);
59
- } catch (err) {
60
- const { status, body, message, showUser } = await httpErrorFormatter(err);
61
- res.status(status).json(body);
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
- ## 🧠 Example of manual showUser handling (done automatically in httpErrorFormatter above)
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, next) => {
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
- ## Available static error constructors
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
  ![GitHub package.json version (master)](https://img.shields.io/github/package-json/v/eriksturesson/errorDrawings/master)
116
130
  ![npm downloads](https://img.shields.io/npm/dy/error-drawings?label=npm%20downloads)
117
131
 
118
- `npm install error-drawings`
132
+ ```bash
133
+ npm install error-drawings
134
+ ```
119
135
 
120
- If you want fun and visual error output during development, you can combine backend-error with error-drawings. Both libraries support the same severity field ("info" | "warning" | "error" | "critical"), making them plug-and-play together.
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
- // 🔥 Draw dramatic error output to highlight critical issues during development
132
- // 🧠 Important: log BEFORE formatting, since the formatter may hide details if showUser is false
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
- [https://github.com/eriksturesson/backendError](https://github.com/eriksturesson/backendError)
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
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
- };
16
- })();
17
- Object.defineProperty(exports, "__esModule", { value: true });
18
- exports.BackendError = void 0;
19
- var BackendError = /** @class */ (function (_super) {
20
- __extends(BackendError, _super);
21
- function BackendError(options) {
22
- var _this = this;
23
- var _a, _b, _c;
24
- _this = _super.call(this, options.message) || this;
25
- _this.name = "BackendError";
26
- _this.isOperational = (_a = options.isOperational) !== null && _a !== void 0 ? _a : true;
27
- _this.showUser = (_b = options.showUser) !== null && _b !== void 0 ? _b : true;
28
- _this.severity = (_c = options.severity) !== null && _c !== void 0 ? _c : "error";
29
- _this.code = options.code;
30
- _this.data = options.data;
31
- Object.setPrototypeOf(_this, BackendError.prototype);
32
- return _this;
33
- }
34
- BackendError.BadRequest = function (msg) {
35
- return new BackendError({ message: msg, code: 400, severity: "warning", showUser: true });
36
- };
37
- BackendError.Unauthorized = function (msg) {
38
- return new BackendError({ message: msg, code: 401, severity: "warning", showUser: true });
39
- };
40
- BackendError.Forbidden = function (msg) {
41
- return new BackendError({ message: msg, code: 403, severity: "warning", showUser: true });
42
- };
43
- BackendError.NotFound = function (msg) {
44
- return new BackendError({ message: msg, code: 404, severity: "warning", showUser: true });
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
- var __assign = (this && this.__assign) || function () {
3
- __assign = Object.assign || function(t) {
4
- for (var s, i = 1, n = arguments.length; i < n; i++) {
5
- s = arguments[i];
6
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
- t[p] = s[p];
8
- }
9
- return t;
10
- };
11
- return __assign.apply(this, arguments);
12
- };
13
- Object.defineProperty(exports, "__esModule", { value: true });
14
- exports.httpErrorFormatter = void 0;
15
- var BackendError_1 = require("./BackendError");
16
- function isValidStatusCode(code) {
17
- return typeof code === "number" && Number.isInteger(code) && code >= 100 && code <= 599;
18
- }
19
- function httpErrorFormatter(err) {
20
- // Handle your custom BackendError type
21
- if (err instanceof BackendError_1.BackendError) {
22
- var status_1 = isValidStatusCode(err.code) ? err.code : 400;
23
- // If developer explicitly set showUser, trust that; otherwise default: true for 4xx, false for 5xx
24
- var showUser_1 = typeof err.showUser === "boolean" ? err.showUser : status_1 < 500;
25
- var message_1 = err.message || "Error";
26
- // If showUser is true, return detailed info including data, code, severity; else generic message
27
- var body_1 = showUser_1
28
- ? __assign(__assign({ message: message_1 }, (err.data !== undefined && { data: err.data })), { code: status_1, severity: err.severity }) : { message: "Internal Server Error" };
29
- return { status: status_1, body: body_1, showUser: showUser_1, message: message_1 };
30
- }
31
- // Handle generic Error or string or unknown
32
- var status = 500;
33
- var message = "Internal Server Error";
34
- var showUser = false;
35
- if (err instanceof Error) {
36
- message = err.message;
37
- // Try to extract HTTP status code from common fields 'status' or 'code'
38
- var maybeStatus = err.status || err.code;
39
- if (isValidStatusCode(maybeStatus)) {
40
- status = maybeStatus;
41
- showUser = status < 500; // show message for 4xx errors by default
42
- }
43
- }
44
- else if (typeof err === "string") {
45
- message = err;
46
- status = 400;
47
- showUser = true;
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"}
@@ -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,7 @@
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"}
@@ -0,0 +1,4 @@
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"}
@@ -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
- "npm": "^10.0.0",
33
- "node": "^22.0.0"
37
+ "node": ">=16"
34
38
  },
35
39
  "main": "dist/index.js",
36
40
  "types": "dist/index.d.ts",