Skip to content

Commit afe9d33

Browse files
abretonc7sclaude
andcommitted
refactor: Simplify ensureError to use cause instead of string conversion
- Use `{ cause: error }` to preserve original value instead of string conversion - Standardize message to "Unknown error" for all non-Error values - Remove unnecessary number-to-error test case - Update tests to verify cause preservation Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
1 parent ffab427 commit afe9d33

2 files changed

Lines changed: 21 additions & 24 deletions

File tree

src/errors.test.ts

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -344,60 +344,61 @@ describe('ensureError', () => {
344344
expect(result).toBe(originalError);
345345
});
346346

347-
it('converts string to Error with string as message', () => {
347+
it('converts string to Error and preserves original as cause', () => {
348348
const result = ensureError('something went wrong');
349349

350350
expect(result).toBeInstanceOf(Error);
351-
expect(result.message).toBe('something went wrong');
352-
});
353-
354-
it('converts number to Error', () => {
355-
const result = ensureError(42);
356-
357-
expect(result).toBeInstanceOf(Error);
358-
expect(result.message).toBe('42');
351+
expect(result.message).toBe('Unknown error');
352+
expect(result.cause).toBe('something went wrong');
359353
});
360354

361-
it('converts object to Error using String()', () => {
362-
const result = ensureError({ some: 'object' });
355+
it('converts object to Error and preserves original as cause', () => {
356+
const originalObject = { some: 'object' };
357+
const result = ensureError(originalObject);
363358

364359
expect(result).toBeInstanceOf(Error);
365-
expect(result.message).toBe('[object Object]');
360+
expect(result.message).toBe('Unknown error');
361+
expect(result.cause).toBe(originalObject);
366362
});
367363

368-
it('handles null with descriptive message', () => {
364+
it('handles null with descriptive message and preserves as cause', () => {
369365
const result = ensureError(null);
370366

371367
expect(result).toBeInstanceOf(Error);
372368
expect(result.message).toBe('Unknown error');
369+
expect(result.cause).toBeNull();
373370
});
374371

375-
it('handles undefined with descriptive message', () => {
372+
it('handles undefined with descriptive message and preserves as cause', () => {
376373
const result = ensureError(undefined);
377374

378375
expect(result).toBeInstanceOf(Error);
379376
expect(result.message).toBe('Unknown error');
377+
expect(result.cause).toBeUndefined();
380378
});
381379

382380
it('appends context to message for null', () => {
383381
const result = ensureError(null, 'fetchData');
384382

385383
expect(result).toBeInstanceOf(Error);
386384
expect(result.message).toBe('Unknown error (fetchData)');
385+
expect(result.cause).toBeNull();
387386
});
388387

389388
it('appends context to message for undefined', () => {
390389
const result = ensureError(undefined, 'processInput');
391390

392391
expect(result).toBeInstanceOf(Error);
393392
expect(result.message).toBe('Unknown error (processInput)');
393+
expect(result.cause).toBeUndefined();
394394
});
395395

396-
it('appends context for non-Error values', () => {
396+
it('appends context for non-Error values and preserves original as cause', () => {
397397
const result = ensureError('network failure', 'apiCall');
398398

399399
expect(result).toBeInstanceOf(Error);
400-
expect(result.message).toBe('network failure (apiCall)');
400+
expect(result.message).toBe('Unknown error (apiCall)');
401+
expect(result.cause).toBe('network failure');
401402
});
402403

403404
it('does NOT add context to existing Error instances', () => {

src/errors.ts

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -123,7 +123,8 @@ export function wrapError<Throwable>(
123123
/**
124124
* Ensures we have a proper Error object.
125125
* If the input is already an Error, returns it unchanged.
126-
* Otherwise, converts to an Error with an appropriate message.
126+
* Otherwise, converts to an Error with an appropriate message and preserves
127+
* the original value as the cause.
127128
*
128129
* @param error - The caught error (could be Error, string, or unknown).
129130
* @param context - Optional context to help identify the error source.
@@ -134,11 +135,6 @@ export function ensureError(error: unknown, context?: string): Error {
134135
return error;
135136
}
136137

137-
if (isNullOrUndefined(error)) {
138-
const message = context ? `Unknown error (${context})` : 'Unknown error';
139-
return new Error(message);
140-
}
141-
142-
const message = context ? `${String(error)} (${context})` : String(error);
143-
return new Error(message);
138+
const message = context ? `Unknown error (${context})` : 'Unknown error';
139+
return new Error(message, { cause: error });
144140
}

0 commit comments

Comments
 (0)