From adea8ae6b7e2e07a6336c7396f9cd03cfed00b9a Mon Sep 17 00:00:00 2001 From: Kaj Kowalski Date: Tue, 10 Jun 2025 00:27:54 +0200 Subject: [PATCH] Refactor error payload logic --- src/index.ts | 14 +++----------- src/utils/error.ts | 13 +++++++++++++ tests/formatError.test.ts | 23 +++++++++++++++++++++++ 3 files changed, 39 insertions(+), 11 deletions(-) create mode 100644 src/utils/error.ts create mode 100644 tests/formatError.test.ts diff --git a/src/index.ts b/src/index.ts index c8a6527..76dfc01 100644 --- a/src/index.ts +++ b/src/index.ts @@ -3,6 +3,7 @@ import { PrismaClient } from '@prisma/client'; import { PrismaD1 } from '@prisma/adapter-d1'; +import { formatError } from './utils/error'; export interface Env { DB: D1Database; @@ -209,17 +210,7 @@ export default { } catch (error) { console.error('Worker error:', error); - const payload: Record = { - error: 'Internal Server Error', - message: error instanceof Error ? error.message : 'Unknown error' - }; - if ( - typeof process !== 'undefined' && - process.env?.NODE_ENV !== 'production' - ) { - payload.stack = error instanceof Error ? error.stack : undefined; - } - return new Response(JSON.stringify(payload), { + return new Response(JSON.stringify(formatError(error)), { status: 500, headers: { 'Content-Type': 'application/json', @@ -229,3 +220,4 @@ export default { } }, }; + diff --git a/src/utils/error.ts b/src/utils/error.ts new file mode 100644 index 0000000..ac6804c --- /dev/null +++ b/src/utils/error.ts @@ -0,0 +1,13 @@ +export function formatError(error: unknown): Record { + const payload: Record = { + error: 'Internal Server Error', + message: error instanceof Error ? error.message : 'Unknown error' + }; + if ( + typeof process !== 'undefined' && + process.env?.NODE_ENV !== 'production' + ) { + payload.stack = error instanceof Error ? error.stack : undefined; + } + return payload; +} diff --git a/tests/formatError.test.ts b/tests/formatError.test.ts new file mode 100644 index 0000000..c29fe06 --- /dev/null +++ b/tests/formatError.test.ts @@ -0,0 +1,23 @@ +import { test } from 'node:test'; +import assert from 'node:assert'; +import { formatError } from '../src/utils/error'; + +const originalEnv = process.env.NODE_ENV; + +test('includes stack when not in production', () => { + delete process.env.NODE_ENV; + const err = new Error('boom'); + const payload = formatError(err); + assert.ok('stack' in payload); +}); + +test('omits stack in production', () => { + process.env.NODE_ENV = 'production'; + const err = new Error('boom'); + const payload = formatError(err); + assert.ok(!('stack' in payload)); +}); + +test.after(() => { + if (originalEnv === undefined) delete process.env.NODE_ENV; else process.env.NODE_ENV = originalEnv; +});