Skip to content

Commit 0281b80

Browse files
lycliyachun01
lyc
authored andcommitted
chore(PostgrestBuilder): dynamic import @supabase/node-fetch
1 parent 0af65f5 commit 0281b80

File tree

3 files changed

+62
-10
lines changed

3 files changed

+62
-10
lines changed

src/PostgrestBuilder.ts

+2-10
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
// @ts-ignore
2-
import nodeFetch from '@supabase/node-fetch'
3-
41
import type { Fetch, PostgrestSingleResponse } from './types'
52
import PostgrestError from './PostgrestError'
3+
import { resolveFetch } from './lib/helpers'
64

75
export default abstract class PostgrestBuilder<Result>
86
implements PromiseLike<PostgrestSingleResponse<Result>>
@@ -27,13 +25,7 @@ export default abstract class PostgrestBuilder<Result>
2725
this.signal = builder.signal
2826
this.isMaybeSingle = builder.isMaybeSingle
2927

30-
if (builder.fetch) {
31-
this.fetch = builder.fetch
32-
} else if (typeof fetch === 'undefined') {
33-
this.fetch = nodeFetch
34-
} else {
35-
this.fetch = fetch
36-
}
28+
this.fetch = resolveFetch(builder.fetch)
3729
}
3830

3931
/**

src/lib/helpers.ts

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
import { Fetch } from '../types'
2+
3+
export const resolveFetch = (customFetch?: Fetch): Fetch => {
4+
let _fetch: Fetch
5+
if (customFetch) {
6+
_fetch = customFetch
7+
} else if (typeof fetch === 'undefined') {
8+
_fetch = (...args) =>
9+
import('@supabase/node-fetch' as any).then(({ default: fetch }) => fetch(...args))
10+
} else {
11+
_fetch = fetch
12+
}
13+
return (...args) => _fetch(...args)
14+
}

test/helpers.test.ts

+46
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import { resolveFetch } from '../src/lib/helpers'
2+
3+
describe('resolveFetch', () => {
4+
const TEST_URL = 'https://example.com'
5+
const TEST_OPTIONS = { method: 'GET' }
6+
7+
beforeEach(() => {
8+
// Reset any mocks between tests
9+
jest.resetModules()
10+
jest.clearAllMocks()
11+
})
12+
13+
it('should use custom fetch if provided', async () => {
14+
const customFetch = jest.fn()
15+
const resolvedFetch = resolveFetch(customFetch)
16+
17+
await resolvedFetch(TEST_URL, TEST_OPTIONS)
18+
19+
expect(customFetch).toHaveBeenCalledTimes(1)
20+
expect(customFetch).toHaveBeenCalledWith(TEST_URL, TEST_OPTIONS)
21+
})
22+
23+
it('should use global fetch if no custom fetch is provided', async () => {
24+
const globalFetch = jest.fn()
25+
global.fetch = globalFetch
26+
const resolvedFetch = resolveFetch()
27+
28+
await resolvedFetch(TEST_URL, TEST_OPTIONS)
29+
30+
expect(globalFetch).toHaveBeenCalledTimes(1)
31+
expect(globalFetch).toHaveBeenCalledWith(TEST_URL, TEST_OPTIONS)
32+
})
33+
34+
it('should use node-fetch if global fetch is not available', async () => {
35+
const nodeFetch = jest.fn()
36+
jest.mock('@supabase/node-fetch', () => nodeFetch)
37+
38+
global.fetch = undefined as any
39+
const resolvedFetch = resolveFetch()
40+
41+
await resolvedFetch(TEST_URL, TEST_OPTIONS)
42+
43+
expect(nodeFetch).toHaveBeenCalledTimes(1)
44+
expect(nodeFetch).toHaveBeenCalledWith(TEST_URL, TEST_OPTIONS)
45+
})
46+
})

0 commit comments

Comments
 (0)