diff --git a/packages/errata/src/client.ts b/packages/errata/src/client.ts index 8707839..4852a3b 100644 --- a/packages/errata/src/client.ts +++ b/packages/errata/src/client.ts @@ -330,7 +330,7 @@ export function createErrorClient>( return (err.tags ?? []).includes(tag) } - /** Promise/helper returning a tuple without try/catch at call sites. */ + /** Promise helper or function returning a tuple without try/catch at call sites. */ const safe = (async ( input: Promise | (() => T | Promise), ): Promise< diff --git a/packages/errata/test/client.test.ts b/packages/errata/test/client.test.ts index 119c95c..35afe18 100644 --- a/packages/errata/test/client.test.ts +++ b/packages/errata/test/client.test.ts @@ -337,6 +337,24 @@ describe('client safe()', () => { expect(data).toBeNull() expect(err?.code).toBe('errata.unknown_error') }) + + it('handles async function that rejects', async () => { + const [data, err] = await client.safe(async () => { + throw new Error('async boom') + }) + + expect(data).toBeNull() + expect(err?.code).toBe('errata.unknown_error') + }) + + it('returns data from async function that resolves', async () => { + const [data, err] = await client.safe(async () => { + return { ok: true as const } + }) + + expect(err).toBeNull() + expect(data).toEqual({ ok: true }) + }) }) describe('client onUnknown hook', () => { diff --git a/packages/errata/test/errata.test.ts b/packages/errata/test/errata.test.ts index 6d49afa..0a2d509 100644 --- a/packages/errata/test/errata.test.ts +++ b/packages/errata/test/errata.test.ts @@ -219,6 +219,24 @@ describe('errata basics', () => { expect(err).toBeInstanceOf(errors.ErrataError) expect(err?.code).toBe('errata.unknown_error') }) + + it('handles async function that rejects', async () => { + const [value, err] = await errors.safe(async () => { + throw new Error('async boom') + }) + + expect(value).toBeNull() + expect(err?.code).toBe('errata.unknown_error') + }) + + it('returns data from async function that resolves', async () => { + const [value, err] = await errors.safe(async () => { + return { ok: true as const } + }) + + expect(err).toBeNull() + expect(value).toEqual({ ok: true }) + }) }) describe('onUnknown hook', () => {