diff --git a/src/index.ts b/src/index.ts index 10e15ac..0192310 100644 --- a/src/index.ts +++ b/src/index.ts @@ -309,6 +309,21 @@ function requestNotMatches(request: Request, urlOrPredicate: UrlOrPredicate): bo return !requestMatches(request, urlOrPredicate); } +// Node 18 does not support URL.canParse() +export function canParseURL(url: string): boolean { + try { + new URL(url); + return true; + } catch (err) { + return false; + } +} + +// Node Requests cannot be relative +function resolveInput(input: string): string { + return typeof location !== 'undefined' && !canParseURL(input) ? new URL(input, location.origin).toString() : input; +} + function normalizeRequest(input: RequestInput, requestInit?: RequestInit): Request { if (input instanceof Request) { if (input.signal && input.signal.aborted) { @@ -319,12 +334,12 @@ function normalizeRequest(input: RequestInput, requestInit?: RequestInit): Reque if (requestInit && requestInit.signal && requestInit.signal.aborted) { abort(); } - return new Request(input, requestInit); + return new Request(resolveInput(input), requestInit); } else { if (requestInit && requestInit.signal && requestInit.signal.aborted) { abort(); } - return new Request(input.toString(), requestInit); + return new Request(resolveInput(input.toString()), requestInit); } } diff --git a/tests/api.test.ts b/tests/api.test.ts index 23d816a..9517547 100644 --- a/tests/api.test.ts +++ b/tests/api.test.ts @@ -100,6 +100,14 @@ describe('testing mockResponse', () => { expect(fetch.mock.calls[0]![0]).toEqual(new URL('https://instagram.com')); }); + it('should support relative request urls', async () => { + fetch.mockResponseOnce(JSON.stringify({ data: 'abcde' }), { status: 200 }); + + const response = await fetch('folder/file.json').then((res) => res.json()); + + expect(response).toEqual({ data: 'abcde' }); + }); + it('should allow empty response bodies', async () => { fetch.mockResponseOnce(null, { status: 204 }); fetch.mockResponseOnce(undefined, { status: 204 }); diff --git a/tsconfig.json b/tsconfig.json index 51e76b6..1537b89 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,7 +3,8 @@ "module": "NodeNext", "moduleResolution": "NodeNext", "lib": [ - "es2022" + "es2022", + "dom", ], "baseUrl": "./", "paths": { diff --git a/vitest.config.ts b/vitest.config.ts index 75f855e..58a9b1e 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -6,4 +6,7 @@ export default defineConfig({ 'vitest-fetch-mock': './src/index', }, }, + test: { + environment: 'jsdom', + }, });