From 2a4046df635330afc68c5dc6d738dd2ae3d56645 Mon Sep 17 00:00:00 2001 From: Junjie Wu <58950132+junjie-w@users.noreply.github.com> Date: Sat, 21 Dec 2024 13:10:33 +0100 Subject: [PATCH] fix: update tests and docs (#12) --- README.md | 110 +++++----- examples/README.md | 31 ++- examples/package-lock.json | 296 +------------------------- examples/package.json | 9 +- package-lock.json | 285 +++---------------------- package.json | 2 +- src/__tests__/error-processor.test.ts | 105 +++------ 7 files changed, 140 insertions(+), 698 deletions(-) diff --git a/README.md b/README.md index 064b267..69c994c 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,15 @@ # handle-http-errors -HTTP error handling library with TypeScript support, providing error classes, handlers, and middleware support. +Type-safe HTTP error handling package providing error classes, standardized responses, error handler, and built-in Express middleware support. Available as [NPM package](https://www.npmjs.com/package/handle-http-errors). -## ☘️ Features +## 🚂 Features -- Error Classes - Built-in HTTP error classes with type support -- Error Handler - Flexible error handling with standardized responses -- Middleware Support - Ready-to-use Express middleware -- TypeScript Support - Full type safety with TypeScript +- Error Classes +- Error Handler +- Express Middleware Support +- TypeScript Support -## 📥 Installation - -```bash -npm install handle-http-errors -# or -yarn add handle-http-errors -# or -pnpm add handle-http-errors -``` - -## 📖 Usage +## ☘️ Usage ### 🔧 Error Handler @@ -41,7 +31,7 @@ app.post('/users', async (req, res) => { }); ``` -### 🌐 Middleware +### 🌐 Express Middleware ```typescript import express from 'express'; @@ -60,17 +50,44 @@ app.get('/users/:id', (req, res, next) => { app.use(errorMiddleware()); ``` +## ⚙️ Configuration + +```typescript +interface ErrorHandlerOptions { + includeStack?: boolean; // Include stack traces + onError?: (error: unknown) => void; // onError callback +} + +// Use with handler +app.post('/users', async (req, res) => { + try { + throw new ValidationError('Invalid data'); + } catch (error) { + return errorHandler(error, res, { + includeStack: process.env.NODE_ENV !== 'production', + onError: (error) => console.error(error) + }); + } +}); + +// Use with middleware +app.use(errorMiddleware({ + includeStack: process.env.NODE_ENV !== 'production', + onError: (error) => console.error(error) +})); +``` + ## 🗂️ Error Classes ```typescript import { - HttpError, // Base error class - ValidationError, // 400 - Validation errors - BadRequestError, // 400 - Malformed requests - UnauthorizedError, // 401 - Authentication errors - ForbiddenError, // 403 - Authorization errors - NotFoundError, // 404 - Resource not found - InternalServerError // 500 - Server errors + HttpError, // Base error class + ValidationError, // 400 - Validation errors + BadRequestError, // 400 - Malformed requests + UnauthorizedError, // 401 - Authentication errors + ForbiddenError, // 403 - Authorization errors + NotFoundError, // 404 - Resource not found + InternalServerError // 500 - Server errors } from 'handle-http-errors'; ``` @@ -79,46 +96,29 @@ import { ```typescript { status: number; // HTTP status code - code: string; // Error code (e.g., 'VALIDATION_ERROR') + code: string; // Error code message: string; // Error message timestamp: string; // ISO timestamp details?: object; // Optional error details - stack?: string; // Stack trace (development only) + stack?: string; // Stack trace } ``` -## ⚙️ Configuration +## 🪺 Examples -```typescript -// Middleware options -interface ErrorHandlerOptions { - includeStack?: boolean; // Include stack traces - onError?: (error: unknown) => void; // Error callback -} +Check out the [examples](https://github.com/junjie-w/handle-http-errors/tree/main/examples) directory for detailed usage examples: -// Using with options -app.use(errorMiddleware({ - includeStack: process.env.NODE_ENV !== 'production', - onError: (error) => console.error(error) -})); +```bash +git clone https://github.com/junjie-w/handle-http-errors.git +cd handle-http-errors/examples +npm install + +# Try different examples +npm run dev:handler # Error handler usage +npm run dev:middleware # Express middleware usage +npm run dev:custom-middleware # Creating custom error-throwing middlewares ``` -## 🔍 Development vs Production - -Development Mode (`NODE_ENV !== 'production'`): -- Detailed error messages -- Stack traces (when enabled) -- Error details included - -Production Mode (`NODE_ENV === 'production'`): -- Generic error messages -- No stack traces -- Limited error details - -## 📚 Examples - -Check out the [examples](https://github.com/junjie-w/handle-http-errors/tree/main/examples) directory for detailed usage examples. - ## 📄 License MIT diff --git a/examples/README.md b/examples/README.md index 2bd311f..d6bc480 100644 --- a/examples/README.md +++ b/examples/README.md @@ -1,24 +1,24 @@ # handle-http-errors Examples -Examples of using [handle-http-errors](https://www.npmjs.com/package/handle-http-errors) with different approaches. +Examples of using [handle-http-errors](https://www.npmjs.com/package/handle-http-errors) package. -## 🚀 Running Examples +## 🚂 Run Examples ```bash npm install -npm run dev:handler # Error handler usage (Port 3001) -npm run dev:middleware # Middleware usage (Port 3002) -npm run dev:custom # Custom middlewares usage (Port 3003) +npm run dev:handler # Error handler usage +npm run dev:middleware # Express middleware usage +npm run dev:custom-middleware # Creating custom error-throwing middlewares ``` -### 🔧 Error Handler Example (Port 3001) +### 🔧 Error Handler Usage ```bash npm run dev:handler ``` -Test endpoints: +#### 🌱 Error Handling Test Scenarios: ```bash # Test NotFoundError @@ -43,13 +43,13 @@ curl -X POST \ http://localhost:3001/products ``` -### 🌐 Middleware Example (Port 3002) +### 🌐 Express Middleware Usage ```bash npm run dev:middleware ``` -Test endpoints: +#### 🌱 Error Handling Test Scenarios: ```bash # Test NotFoundError @@ -73,7 +73,7 @@ curl -X POST \ -d '{"email":"invalid-email","username":"test"}' \ http://localhost:3002/users/register -# Test ValidationError with short username +# Test ValidationError with invalid username curl -X POST \ -H "Content-Type: application/json" \ -d '{"email":"test@example.com","username":"a"}' \ @@ -86,13 +86,13 @@ curl -X POST \ http://localhost:3002/users/register ``` -### 🛠️ Custom Middleware Example (Port 3003) +### 🛠️ Creating Custom Error-throwing Middlewares ```bash npm run dev:custom-middleware ``` -Test endpoints: +#### 🌱 Error Handling Test Scenarios: ```bash # Test UnauthorizedError without token @@ -123,7 +123,7 @@ curl -X POST \ -d '{"email":"invalid-email","username":"a"}' \ http://localhost:3003/users/register -# Test ForbiddenError when creating admin +# Test ForbiddenError when creating admin users curl -X POST \ -H "Authorization: valid-token" \ -H "Content-Type: application/json" \ @@ -137,8 +137,3 @@ curl -X POST \ -d '{"email":"test@example.com","username":"testuser"}' \ http://localhost:3003/users/register ``` - -Each example demonstrates different aspects of error handling: -- Error Handler: Direct usage of errorHandler -- Middleware: Global error handling with middleware -- Custom Middleware: Creating custom error-throwing middlewares diff --git a/examples/package-lock.json b/examples/package-lock.json index 27ded2c..aae9d28 100644 --- a/examples/package-lock.json +++ b/examples/package-lock.json @@ -1,23 +1,17 @@ { - "name": "express-typescript-example", + "name": "handle-http-errors-examples", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "express-typescript-example", + "name": "handle-http-errors-examples", "dependencies": { "express": "^4.18.2", "handle-http-errors": "file:../" - }, - "devDependencies": { - "@types/express": "^4.17.17", - "ts-node": "^10.9.1", - "typescript": "^5.0.4" } }, "..": { - "name": "handle-http-errors", "version": "1.0.0", "license": "MIT", "dependencies": { @@ -45,164 +39,6 @@ } }, "../../..": {}, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/body-parser": { - "version": "1.19.5", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz", - "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==", - "dev": true, - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz", - "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", - "dev": true, - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^4.17.33", - "@types/qs": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "4.19.6", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz", - "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==", - "dev": true, - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz", - "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==", - "dev": true - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "dev": true - }, - "node_modules/@types/node": { - "version": "22.10.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.2.tgz", - "integrity": "sha512-Xxr6BBRCAOQixvonOye19wnzyDiUtTeqldOOmj3CkeblonbccA12PFwlufvRdrpjXxqnmUaeiU5EOA+7s5diUQ==", - "dev": true, - "dependencies": { - "undici-types": "~6.20.0" - } - }, - "node_modules/@types/qs": { - "version": "6.9.17", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz", - "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==", - "dev": true - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "dev": true - }, - "node_modules/@types/send": { - "version": "0.17.4", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", - "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==", - "dev": true, - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.7", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", - "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", - "dev": true, - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, "node_modules/accepts": { "version": "1.3.8", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", @@ -215,36 +51,6 @@ "node": ">= 0.6" } }, - "node_modules/acorn": { - "version": "8.14.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", - "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "dev": true, - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -340,12 +146,6 @@ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, "node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -371,15 +171,6 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -631,12 +422,6 @@ "node": ">= 0.10" } }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, "node_modules/math-intrinsics": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.0.0.tgz", @@ -958,49 +743,6 @@ "node": ">=0.6" } }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -1013,25 +755,6 @@ "node": ">= 0.6" } }, - "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/undici-types": { - "version": "6.20.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", - "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", - "dev": true - }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -1048,12 +771,6 @@ "node": ">= 0.4.0" } }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, "node_modules/vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -1061,15 +778,6 @@ "engines": { "node": ">= 0.8" } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } } } } diff --git a/examples/package.json b/examples/package.json index 46776a3..606be44 100644 --- a/examples/package.json +++ b/examples/package.json @@ -1,19 +1,14 @@ { - "name": "express-typescript-example", + "name": "handle-http-errors-examples", "private": true, "type": "module", "scripts": { "dev:handler": "node src/withHandler.js", "dev:middleware": "node src/withMiddleware.js", - "dev:custom-middlware": "node src/withCustomMiddleware.js" + "dev:custom-middleware": "node src/withCustomMiddleware.js" }, "dependencies": { "express": "^4.18.2", "handle-http-errors": "file:../" - }, - "devDependencies": { - "@types/express": "^4.17.17", - "ts-node": "^10.9.1", - "typescript": "^5.0.4" } } diff --git a/package-lock.json b/package-lock.json index 679c96d..73c3896 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,13 +1,13 @@ { - "name": "http-error-handler", + "name": "handle-http-errors", "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "http-error-handler", + "name": "handle-http-errors", "version": "1.0.0", - "license": "ISC", + "license": "MIT", "dependencies": { "http-status-codes": "^2.3.0" }, @@ -7974,7 +7974,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "string-width": "^5.1.2", "string-width-cjs": "npm:string-width@^4.2.0", @@ -7992,7 +7991,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -8004,15 +8002,13 @@ "version": "9.2.2", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/@isaacs/cliui/node_modules/string-width": { "version": "5.1.2", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -8030,7 +8026,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -8046,7 +8041,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^7.0.4" }, @@ -8058,15 +8052,13 @@ "version": "1.1.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/@npmcli/agent": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "agent-base": "^7.1.0", "http-proxy-agent": "^7.0.0", @@ -8083,7 +8075,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@isaacs/string-locale-compare": "^1.1.0", "@npmcli/fs": "^4.0.0", @@ -8133,7 +8124,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/map-workspaces": "^4.0.1", "@npmcli/package-json": "^6.0.1", @@ -8153,7 +8143,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "semver": "^7.3.5" }, @@ -8166,7 +8155,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/promise-spawn": "^8.0.0", "ini": "^5.0.0", @@ -8187,7 +8175,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "npm-bundled": "^4.0.0", "npm-normalize-package-bin": "^4.0.0" @@ -8204,7 +8191,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/name-from-folder": "^3.0.0", "@npmcli/package-json": "^6.0.0", @@ -8220,7 +8206,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "cacache": "^19.0.0", "json-parse-even-better-errors": "^4.0.0", @@ -8237,7 +8222,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/git": "^6.0.0", "@npmcli/installed-package-contents": "^3.0.0", @@ -8269,7 +8253,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -8279,7 +8262,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -8289,7 +8271,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/git": "^6.0.0", "glob": "^10.2.2", @@ -8308,7 +8289,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "which": "^5.0.0" }, @@ -8321,7 +8301,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "postcss-selector-parser": "^6.1.2" }, @@ -8334,7 +8313,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -8344,7 +8322,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/node-gyp": "^4.0.0", "@npmcli/package-json": "^6.0.0", @@ -8363,7 +8340,6 @@ "inBundle": true, "license": "MIT", "optional": true, - "peer": true, "engines": { "node": ">=14" } @@ -8373,7 +8349,6 @@ "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "^16.14.0 || >=18.0.0" } @@ -8383,7 +8358,6 @@ "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@sigstore/protobuf-specs": "^0.3.2", "tuf-js": "^3.0.1" @@ -8397,7 +8371,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": "^16.14.0 || >=18.0.0" } @@ -8407,7 +8380,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -8417,7 +8389,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "debug": "^4.3.4" }, @@ -8430,7 +8401,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "clean-stack": "^2.0.0", "indent-string": "^4.0.0" @@ -8444,7 +8414,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -8454,7 +8423,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -8466,29 +8434,25 @@ "version": "2.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/archy": { "version": "1.0.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/balanced-match": { "version": "1.0.2", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/bin-links": { "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "cmd-shim": "^7.0.0", "npm-normalize-package-bin": "^4.0.0", @@ -8505,7 +8469,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" }, @@ -8518,7 +8481,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "balanced-match": "^1.0.0" } @@ -8528,7 +8490,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/fs": "^4.0.0", "fs-minipass": "^3.0.0", @@ -8552,7 +8513,6 @@ "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -8562,7 +8522,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^7.0.4", "rimraf": "^5.0.5" @@ -8576,7 +8535,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "bin": { "mkdirp": "dist/cjs/src/bin.js" }, @@ -8592,7 +8550,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=18" }, @@ -8605,7 +8562,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -8623,7 +8579,6 @@ "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -8633,7 +8588,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -8646,7 +8600,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": ">=10" } @@ -8662,7 +8615,6 @@ ], "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -8672,7 +8624,6 @@ "dev": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "ip-regex": "^5.0.0" }, @@ -8685,7 +8636,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -8695,7 +8645,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "string-width": "^4.2.3", "strip-ansi": "^6.0.1" @@ -8709,7 +8658,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -8719,7 +8667,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "color-name": "~1.1.4" }, @@ -8731,22 +8678,19 @@ "version": "1.1.4", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/common-ancestor-path": { "version": "1.0.1", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/cross-spawn": { "version": "7.0.6", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -8761,7 +8705,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "isexe": "^2.0.0" }, @@ -8777,7 +8720,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "bin": { "cssesc": "bin/cssesc" }, @@ -8790,7 +8732,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ms": "^2.1.3" }, @@ -8808,7 +8749,6 @@ "dev": true, "inBundle": true, "license": "BSD-3-Clause", - "peer": true, "engines": { "node": ">=0.3.1" } @@ -8817,15 +8757,13 @@ "version": "0.2.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/emoji-regex": { "version": "8.0.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/encoding": { "version": "0.1.13", @@ -8833,7 +8771,6 @@ "inBundle": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -8843,7 +8780,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -8852,22 +8788,19 @@ "version": "2.0.3", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/exponential-backoff": { "version": "3.1.1", "dev": true, "inBundle": true, - "license": "Apache-2.0", - "peer": true + "license": "Apache-2.0" }, "node_modules/npm/node_modules/fastest-levenshtein": { "version": "1.0.16", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 4.9.1" } @@ -8877,7 +8810,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "cross-spawn": "^7.0.0", "signal-exit": "^4.0.1" @@ -8894,7 +8826,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^7.0.3" }, @@ -8907,7 +8838,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", @@ -8927,15 +8857,13 @@ "version": "4.2.11", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/hosted-git-info": { "version": "8.0.2", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "lru-cache": "^10.0.1" }, @@ -8947,15 +8875,13 @@ "version": "4.1.1", "dev": true, "inBundle": true, - "license": "BSD-2-Clause", - "peer": true + "license": "BSD-2-Clause" }, "node_modules/npm/node_modules/http-proxy-agent": { "version": "7.0.2", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -8969,7 +8895,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "4" @@ -8984,7 +8909,6 @@ "inBundle": true, "license": "MIT", "optional": true, - "peer": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" }, @@ -8997,7 +8921,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minimatch": "^9.0.0" }, @@ -9010,7 +8933,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=0.8.19" } @@ -9020,7 +8942,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -9030,7 +8951,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -9040,7 +8960,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/package-json": "^6.0.0", "npm-package-arg": "^12.0.0", @@ -9059,7 +8978,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "jsbn": "1.1.0", "sprintf-js": "^1.1.3" @@ -9073,7 +8991,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, @@ -9086,7 +9003,6 @@ "dev": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "cidr-regex": "^4.1.1" }, @@ -9099,7 +9015,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -9108,15 +9023,13 @@ "version": "2.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/jackspeak": { "version": "3.4.3", "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "@isaacs/cliui": "^8.0.2" }, @@ -9131,15 +9044,13 @@ "version": "1.1.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/json-parse-even-better-errors": { "version": "4.0.0", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -9149,7 +9060,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -9161,29 +9071,25 @@ "node >= 0.2.0" ], "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/just-diff": { "version": "6.0.2", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/just-diff-apply": { "version": "5.5.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/libnpmaccess": { "version": "9.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "npm-package-arg": "^12.0.0", "npm-registry-fetch": "^18.0.1" @@ -9197,7 +9103,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/arborist": "^8.0.0", "@npmcli/installed-package-contents": "^3.0.0", @@ -9217,7 +9122,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/arborist": "^8.0.0", "@npmcli/run-script": "^9.0.1", @@ -9239,7 +9143,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/arborist": "^8.0.0" }, @@ -9252,7 +9155,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^2.0.0", "npm-registry-fetch": "^18.0.1" @@ -9266,7 +9168,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^2.0.0", "npm-registry-fetch": "^18.0.1" @@ -9280,7 +9181,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/arborist": "^8.0.0", "@npmcli/run-script": "^9.0.1", @@ -9296,7 +9196,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "ci-info": "^4.0.0", "normalize-package-data": "^7.0.0", @@ -9316,7 +9215,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "npm-registry-fetch": "^18.0.1" }, @@ -9329,7 +9227,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "aproba": "^2.0.0", "npm-registry-fetch": "^18.0.1" @@ -9343,7 +9240,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/git": "^6.0.1", "@npmcli/run-script": "^9.0.1", @@ -9359,15 +9255,13 @@ "version": "10.4.3", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/make-fetch-happen": { "version": "14.0.3", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/agent": "^3.0.0", "cacache": "^19.0.1", @@ -9390,7 +9284,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -9400,7 +9293,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "brace-expansion": "^2.0.1" }, @@ -9416,7 +9308,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": ">=16 || 14 >=14.17" } @@ -9426,7 +9317,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^7.0.3" }, @@ -9439,7 +9329,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^7.0.3", "minipass-sized": "^1.0.3", @@ -9457,7 +9346,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^7.0.4", "rimraf": "^5.0.5" @@ -9471,7 +9359,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -9484,7 +9371,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -9497,7 +9383,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -9510,7 +9395,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -9523,7 +9407,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -9536,7 +9419,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -9549,7 +9431,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" @@ -9563,7 +9444,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -9576,7 +9456,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "bin": { "mkdirp": "bin/cmd.js" }, @@ -9588,15 +9467,13 @@ "version": "2.1.3", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/mute-stream": { "version": "2.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -9606,7 +9483,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "env-paths": "^2.2.0", "exponential-backoff": "^3.1.1", @@ -9631,7 +9507,6 @@ "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -9641,7 +9516,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^7.0.4", "rimraf": "^5.0.5" @@ -9655,7 +9529,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "bin": { "mkdirp": "dist/cjs/src/bin.js" }, @@ -9671,7 +9544,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", @@ -9689,7 +9561,6 @@ "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", - "peer": true, "engines": { "node": ">=18" } @@ -9699,7 +9570,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "abbrev": "^2.0.0" }, @@ -9715,7 +9585,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -9725,7 +9594,6 @@ "dev": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "hosted-git-info": "^8.0.0", "semver": "^7.3.5", @@ -9740,7 +9608,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -9750,7 +9617,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "npm-normalize-package-bin": "^4.0.0" }, @@ -9763,7 +9629,6 @@ "dev": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "semver": "^7.1.1" }, @@ -9776,7 +9641,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -9786,7 +9650,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "hosted-git-info": "^8.0.0", "proc-log": "^5.0.0", @@ -9802,7 +9665,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "ignore-walk": "^7.0.0" }, @@ -9815,7 +9677,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "npm-install-checks": "^7.1.0", "npm-normalize-package-bin": "^4.0.0", @@ -9831,7 +9692,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "npm-registry-fetch": "^18.0.0", "proc-log": "^5.0.0" @@ -9845,7 +9705,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/redact": "^3.0.0", "jsonparse": "^1.3.1", @@ -9865,7 +9724,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "minipass": "^7.0.4", "rimraf": "^5.0.5" @@ -9879,7 +9737,6 @@ "dev": true, "inBundle": true, "license": "BSD-2-Clause", - "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -9889,7 +9746,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "aggregate-error": "^3.0.0" }, @@ -9904,15 +9760,13 @@ "version": "1.0.1", "dev": true, "inBundle": true, - "license": "BlueOak-1.0.0", - "peer": true + "license": "BlueOak-1.0.0" }, "node_modules/npm/node_modules/pacote": { "version": "19.0.1", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "@npmcli/git": "^6.0.0", "@npmcli/installed-package-contents": "^3.0.0", @@ -9944,7 +9798,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "json-parse-even-better-errors": "^4.0.0", "just-diff": "^6.0.0", @@ -9959,7 +9812,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -9969,7 +9821,6 @@ "dev": true, "inBundle": true, "license": "BlueOak-1.0.0", - "peer": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" @@ -9986,7 +9837,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -10000,7 +9850,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -10010,7 +9859,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -10020,7 +9868,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -10030,7 +9877,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "funding": { "url": "https://github.com/sponsors/isaacs" } @@ -10039,15 +9885,13 @@ "version": "1.0.1", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/promise-retry": { "version": "2.0.1", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "err-code": "^2.0.2", "retry": "^0.12.0" @@ -10061,7 +9905,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "read": "^4.0.0" }, @@ -10073,7 +9916,6 @@ "version": "0.12.0", "dev": true, "inBundle": true, - "peer": true, "bin": { "qrcode-terminal": "bin/qrcode-terminal.js" } @@ -10083,7 +9925,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "mute-stream": "^2.0.0" }, @@ -10096,7 +9937,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -10106,7 +9946,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "json-parse-even-better-errors": "^4.0.0", "npm-normalize-package-bin": "^4.0.0" @@ -10120,7 +9959,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 4" } @@ -10130,7 +9968,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "glob": "^10.3.7" }, @@ -10146,15 +9983,13 @@ "dev": true, "inBundle": true, "license": "MIT", - "optional": true, - "peer": true + "optional": true }, "node_modules/npm/node_modules/semver": { "version": "7.6.3", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -10167,7 +10002,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -10180,7 +10014,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -10190,7 +10023,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": ">=14" }, @@ -10203,7 +10035,6 @@ "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@sigstore/bundle": "^3.0.0", "@sigstore/core": "^2.0.0", @@ -10221,7 +10052,6 @@ "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@sigstore/protobuf-specs": "^0.3.2" }, @@ -10234,7 +10064,6 @@ "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -10244,7 +10073,6 @@ "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@sigstore/bundle": "^3.0.0", "@sigstore/core": "^2.0.0", @@ -10262,7 +10090,6 @@ "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@sigstore/bundle": "^3.0.0", "@sigstore/core": "^2.0.0", @@ -10277,7 +10104,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 6.0.0", "npm": ">= 3.0.0" @@ -10288,7 +10114,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" @@ -10303,7 +10128,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "agent-base": "^7.1.1", "debug": "^4.3.4", @@ -10318,7 +10142,6 @@ "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" @@ -10329,7 +10152,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -10339,15 +10161,13 @@ "version": "2.5.0", "dev": true, "inBundle": true, - "license": "CC-BY-3.0", - "peer": true + "license": "CC-BY-3.0" }, "node_modules/npm/node_modules/spdx-expression-parse": { "version": "4.0.0", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -10357,22 +10177,19 @@ "version": "3.0.20", "dev": true, "inBundle": true, - "license": "CC0-1.0", - "peer": true + "license": "CC0-1.0" }, "node_modules/npm/node_modules/sprintf-js": { "version": "1.1.3", "dev": true, "inBundle": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/npm/node_modules/ssri": { "version": "12.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^7.0.3" }, @@ -10385,7 +10202,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -10401,7 +10217,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -10416,7 +10231,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -10430,7 +10244,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -10443,7 +10256,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -10456,7 +10268,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", @@ -10474,7 +10285,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "minipass": "^3.0.0" }, @@ -10487,7 +10297,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "yallist": "^4.0.0" }, @@ -10500,7 +10309,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": ">=8" } @@ -10509,22 +10317,19 @@ "version": "0.2.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/tiny-relative-date": { "version": "1.3.0", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/treeverse": { "version": "3.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -10534,7 +10339,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "@tufjs/models": "3.0.1", "debug": "^4.3.6", @@ -10549,7 +10353,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "@tufjs/canonical-json": "2.0.0", "minimatch": "^9.0.5" @@ -10563,7 +10366,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "unique-slug": "^5.0.0" }, @@ -10576,7 +10378,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "imurmurhash": "^0.1.4" }, @@ -10588,15 +10389,13 @@ "version": "1.0.2", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/validate-npm-package-license": { "version": "3.0.4", "dev": true, "inBundle": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" @@ -10607,7 +10406,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" @@ -10618,7 +10416,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": "^18.17.0 || >=20.5.0" } @@ -10627,15 +10424,13 @@ "version": "3.0.1", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/npm/node_modules/which": { "version": "5.0.0", "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "isexe": "^3.1.1" }, @@ -10651,7 +10446,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "engines": { "node": ">=16" } @@ -10661,7 +10455,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^6.1.0", "string-width": "^5.0.1", @@ -10680,7 +10473,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", @@ -10698,7 +10490,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -10714,7 +10505,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -10726,15 +10516,13 @@ "version": "9.2.2", "dev": true, "inBundle": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/npm/node_modules/wrap-ansi/node_modules/string-width": { "version": "5.1.2", "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "eastasianwidth": "^0.2.0", "emoji-regex": "^9.2.2", @@ -10752,7 +10540,6 @@ "dev": true, "inBundle": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^6.0.1" }, @@ -10768,7 +10555,6 @@ "dev": true, "inBundle": true, "license": "ISC", - "peer": true, "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^4.0.1" @@ -10781,8 +10567,7 @@ "version": "4.0.0", "dev": true, "inBundle": true, - "license": "ISC", - "peer": true + "license": "ISC" }, "node_modules/object-assign": { "version": "4.1.1", diff --git a/package.json b/package.json index 5f71105..d6ab1c6 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "handle-http-errors", "version": "1.0.0", - "description": "TypeScript-enabled HTTP error handling library providing error classes, standardized responses, flexible handlers, and built-in Express middleware support.", + "description": "Type-safe HTTP error handling package providing error classes, standardized responses, error handler, and built-in Express middleware support.", "author": "Junjie Wu", "license": "MIT", "type": "module", diff --git a/src/__tests__/error-processor.test.ts b/src/__tests__/error-processor.test.ts index d0e5317..a9ed9ac 100644 --- a/src/__tests__/error-processor.test.ts +++ b/src/__tests__/error-processor.test.ts @@ -10,7 +10,8 @@ jest.mock('../config', () => ({ describe('errorProcessor', () => { const options = { includeStack: false }; - let originalEnv = process.env + const timestamp = expect.any(String); + describe('HttpError handling', () => { it('should process HttpError with stack trace when includeStack is true', async () => { const error = new HttpError(400, 'TEST_ERROR', 'Test message'); @@ -20,7 +21,7 @@ describe('errorProcessor', () => { status: 400, code: 'TEST_ERROR', message: 'Test message', - timestamp: expect.any(String), + timestamp, stack: expect.any(String) }); }); @@ -33,7 +34,7 @@ describe('errorProcessor', () => { status: 400, code: 'TEST_ERROR', message: 'Test message', - timestamp: expect.any(String) + timestamp }); expect(result.stack).toBeUndefined(); }); @@ -47,7 +48,7 @@ describe('errorProcessor', () => { status: 400, code: 'TEST_ERROR', message: 'Test message', - timestamp: expect.any(String) + timestamp }); expect(result.stack).toBeUndefined(); }); @@ -60,10 +61,18 @@ describe('errorProcessor', () => { status: 400, code: 'TEST_ERROR', message: 'Test message', - timestamp: expect.any(String), + timestamp, details: { foo: 'bar' } }); }); + + it('should call onError if provided', async () => { + const onError = jest.fn(); + const error = new Error('Test error'); + + await errorProcessor(error, { onError }); + expect(onError).toHaveBeenCalledWith(error); + }); it('should handle error when parsing HttpError fails', async () => { const error = new HttpError(400, 'TEST', 'Test'); @@ -77,49 +86,12 @@ describe('errorProcessor', () => { status: 400, code: 'PARSE_ERROR', message: 'Could not parse request', - timestamp: expect.any(String), + timestamp, details: isDevelopment ? { error: 'Parse error' } : undefined }); }); - - it('should call onError if provided', async () => { - const onError = jest.fn(); - const error = new Error('Test error'); - - await errorProcessor(error, { onError }); - expect(onError).toHaveBeenCalledWith(error); - }); describe('parse error handling', () => { - beforeEach(() => { - jest.resetModules(); - jest.resetAllMocks(); - process.env = { ...originalEnv, NODE_ENV: 'development' }; - }); - - afterEach(() => { - process.env = originalEnv - }); - - - it('should include parse error details in development', async () => { - const error = new HttpError(400, 'TEST', 'Test'); - Object.defineProperty(error, 'details', { - get: () => { throw new Error('Custom parse error message'); } - }); - - const result = await errorProcessor(error, options); - - expect(result).toEqual({ - status: 400, - code: 'PARSE_ERROR', - message: 'Could not parse request', - timestamp: expect.any(String), - details: { error: 'Custom parse error message' } - }); - }); - - it('should include parse error details in development', async () => { const error = new HttpError(400, 'TEST', 'Test'); Object.defineProperty(error, 'details', { @@ -132,7 +104,7 @@ describe('errorProcessor', () => { status: 400, code: 'PARSE_ERROR', message: 'Could not parse request', - timestamp: expect.any(String), + timestamp, details: { error: 'Custom parse error message' } @@ -151,7 +123,7 @@ describe('errorProcessor', () => { status: 400, code: 'PARSE_ERROR', message: 'Could not parse request', - timestamp: expect.any(String), + timestamp, details: { error: 'Parse error' } }); }); @@ -169,7 +141,7 @@ describe('errorProcessor', () => { status: 400, code: 'PARSE_ERROR', message: 'Could not parse request', - timestamp: expect.any(String), + timestamp, details: isDevelopment ? { error: 'Parse error with stack' } : undefined, stack: expect.any(String) }); @@ -187,7 +159,7 @@ describe('errorProcessor', () => { status: 400, code: 'PARSE_ERROR', message: 'Could not parse request', - timestamp: expect.any(String), + timestamp, details: isDevelopment ? { error: 'Parse error' } : undefined, stack: undefined }); @@ -204,7 +176,7 @@ describe('errorProcessor', () => { status: StatusCodes.BAD_REQUEST, code: 'VALIDATION_ERROR', message: 'Validation failed', - timestamp: expect.any(String) + timestamp }); }); @@ -216,7 +188,7 @@ describe('errorProcessor', () => { status: StatusCodes.BAD_REQUEST, code: 'VALIDATION_ERROR', message: ReasonPhrases.BAD_REQUEST, - timestamp: expect.any(String) + timestamp }); }); }); @@ -230,7 +202,7 @@ describe('errorProcessor', () => { status: StatusCodes.BAD_REQUEST, code: 'BAD_REQUEST', message: 'Bad request', - timestamp: expect.any(String), + timestamp, }); }); @@ -242,7 +214,7 @@ describe('errorProcessor', () => { status: StatusCodes.BAD_REQUEST, code: 'BAD_REQUEST', message: ReasonPhrases.BAD_REQUEST, - timestamp: expect.any(String) + timestamp }); }); }); @@ -256,7 +228,7 @@ describe('errorProcessor', () => { status: 401, code: 'UNAUTHORIZED', message: 'Not logged in', - timestamp: expect.any(String) + timestamp }); }); @@ -268,7 +240,7 @@ describe('errorProcessor', () => { status: StatusCodes.UNAUTHORIZED, code: 'UNAUTHORIZED', message: ReasonPhrases.UNAUTHORIZED, - timestamp: expect.any(String) + timestamp }); }); }); @@ -282,7 +254,7 @@ describe('errorProcessor', () => { status: 403, code: 'FORBIDDEN', message: 'No access', - timestamp: expect.any(String) + timestamp }); }); @@ -293,7 +265,7 @@ describe('errorProcessor', () => { status: StatusCodes.FORBIDDEN, code: 'FORBIDDEN', message: ReasonPhrases.FORBIDDEN, - timestamp: expect.any(String) + timestamp }); }) }) @@ -307,7 +279,7 @@ describe('errorProcessor', () => { status: 404, code: 'NOT_FOUND', message: 'User not found', - timestamp: expect.any(String) + timestamp }); }); @@ -318,7 +290,7 @@ describe('errorProcessor', () => { status: StatusCodes.NOT_FOUND, code: 'NOT_FOUND', message: ReasonPhrases.NOT_FOUND, - timestamp: expect.any(String) + timestamp }); }) }); @@ -332,7 +304,7 @@ describe('errorProcessor', () => { status: 500, code: 'INTERNAL_ERROR', message: 'Internal server error', - timestamp: expect.any(String) + timestamp }); }); }) @@ -346,7 +318,7 @@ describe('errorProcessor', () => { status: 500, code: 'INTERNAL_ERROR', message: isDevelopment ? 'Standard error' : 'Internal Server Error', - timestamp: expect.any(String), + timestamp, details: isDevelopment ? { error: 'Standard error' } : undefined, stack: undefined }); @@ -361,22 +333,9 @@ describe('errorProcessor', () => { status: 503, code: 'SERVICE_UNAVAILABLE', message: isDevelopment ? 'unknown error' : 'Service Unavailable', - timestamp: expect.any(String), + timestamp, details: isDevelopment ? { error: 'unknown error' } : undefined }); }); - - it('should process unknown errors as service unavailable in development', async () => { - process.env.NODE_ENV = 'development'; - const result = await errorProcessor('unknown error', options); - - expect(result).toEqual({ - status: 503, - code: 'SERVICE_UNAVAILABLE', - message: 'unknown error', - timestamp: expect.any(String), - details: { error: 'unknown error' } - }); - }); }) });