From c6ac29203416e6a91387ab16c6f578b201f22a1b Mon Sep 17 00:00:00 2001 From: lotmek <55419526+lotmek@users.noreply.github.com> Date: Tue, 12 Sep 2023 13:41:41 -0400 Subject: [PATCH] Refactor errorFromResponse (#246) Make `request` and `url` optional parameters in the `errorFromResponse` method and clean up the implementation. Co-authored-by: lotmek --- .changeset/tricky-keys-press.md | 5 +++++ src/RESTDataSource.ts | 16 +++++++++------- src/__tests__/RESTDataSource.test.ts | 1 + 3 files changed, 15 insertions(+), 7 deletions(-) create mode 100644 .changeset/tricky-keys-press.md diff --git a/.changeset/tricky-keys-press.md b/.changeset/tricky-keys-press.md new file mode 100644 index 0000000..16615c0 --- /dev/null +++ b/.changeset/tricky-keys-press.md @@ -0,0 +1,5 @@ +--- +'@apollo/datasource-rest': patch +--- + +Make `request` and `url` optional parameters in the `errorFromResponse` method and clean up the implementation. diff --git a/src/RESTDataSource.ts b/src/RESTDataSource.ts index 547f114..79e5e9d 100644 --- a/src/RESTDataSource.ts +++ b/src/RESTDataSource.ts @@ -356,18 +356,20 @@ export abstract class RESTDataSource { response, parsedBody, }: { - url: URL; - request: RequestOptions; + url?: URL; + request?: RequestOptions; response: FetcherResponse; parsedBody: unknown; }) { + const codeByStatus = new Map([ + [401, 'UNAUTHENTICATED'], + [403, 'FORBIDDEN'], + ]); + const code = codeByStatus.get(response.status); + return new GraphQLError(`${response.status}: ${response.statusText}`, { extensions: { - ...(response.status === 401 - ? { code: 'UNAUTHENTICATED' } - : response.status === 403 - ? { code: 'FORBIDDEN' } - : {}), + ...(code && { code }), response: { url: response.url, status: response.status, diff --git a/src/__tests__/RESTDataSource.test.ts b/src/__tests__/RESTDataSource.test.ts index c084fff..686d207 100644 --- a/src/__tests__/RESTDataSource.test.ts +++ b/src/__tests__/RESTDataSource.test.ts @@ -1638,6 +1638,7 @@ describe('RESTDataSource', () => { }, }, }); + await expect(result).rejects.not.toHaveProperty('extensions.code'); }); it('puts JSON error responses on the error as an object', async () => {