From 8ace045c8ad9f623a934792aeb6d7a865a3b6083 Mon Sep 17 00:00:00 2001 From: Gypsophyllite Date: Fri, 12 May 2023 13:16:22 +0800 Subject: [PATCH 1/5] fix(nuxt): useFetch method type infer error --- packages/nuxt/src/app/composables/fetch.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/nuxt/src/app/composables/fetch.ts b/packages/nuxt/src/app/composables/fetch.ts index fe487dcecd15..c519811ebe17 100644 --- a/packages/nuxt/src/app/composables/fetch.ts +++ b/packages/nuxt/src/app/composables/fetch.ts @@ -31,7 +31,7 @@ export function useFetch< ResT = void, ErrorT = FetchError, ReqT extends NitroFetchRequest = NitroFetchRequest, - Method extends AvailableRouterMethod = 'get' extends AvailableRouterMethod ? 'get' : AvailableRouterMethod, + Method extends AvailableRouterMethod = AvailableRouterMethod, _ResT = ResT extends void ? FetchResult : ResT, DataT = _ResT, PickKeys extends KeysOf = KeysOf @@ -43,7 +43,7 @@ export function useFetch< ResT = void, ErrorT = FetchError, ReqT extends NitroFetchRequest = NitroFetchRequest, - Method extends AvailableRouterMethod = 'get' extends AvailableRouterMethod ? 'get' : AvailableRouterMethod, + Method extends AvailableRouterMethod = AvailableRouterMethod, _ResT = ResT extends void ? FetchResult : ResT, DataT = _ResT, PickKeys extends KeysOf = KeysOf @@ -124,7 +124,7 @@ export function useLazyFetch< ResT = void, ErrorT = FetchError, ReqT extends NitroFetchRequest = NitroFetchRequest, - Method extends AvailableRouterMethod = 'get' extends AvailableRouterMethod ? 'get' : AvailableRouterMethod, + Method extends AvailableRouterMethod = AvailableRouterMethod, _ResT = ResT extends void ? FetchResult : ResT, DataT = _ResT, PickKeys extends KeysOf = KeysOf @@ -136,7 +136,7 @@ export function useLazyFetch< ResT = void, ErrorT = FetchError, ReqT extends NitroFetchRequest = NitroFetchRequest, - Method extends AvailableRouterMethod = 'get' extends AvailableRouterMethod ? 'get' : AvailableRouterMethod, + Method extends AvailableRouterMethod = AvailableRouterMethod, _ResT = ResT extends void ? FetchResult : ResT, DataT = _ResT, PickKeys extends KeysOf = KeysOf From bbe12352f9dd0ab1347667bc9c7757de3b26cf34 Mon Sep 17 00:00:00 2001 From: Gypsophyllite Date: Mon, 15 May 2023 09:45:31 +0800 Subject: [PATCH 2/5] fix(*): add useFetch test case --- test/fixtures/basic/types.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/test/fixtures/basic/types.ts b/test/fixtures/basic/types.ts index 4caf8a256f5b..57fb11dd99b8 100644 --- a/test/fixtures/basic/types.ts +++ b/test/fixtures/basic/types.ts @@ -60,6 +60,7 @@ describe('API routes', () => { expectTypeOf(useFetch('/api/union', { pick: ['type'] }).data).toEqualTypeOf>() expectTypeOf(useFetch('/api/other').data).toEqualTypeOf>() expectTypeOf(useFetch('/test').data).toEqualTypeOf>() + expectTypeOf(useFetch('/test', { method: 'POST' }).data).toEqualTypeOf>() expectTypeOf(useFetch('/error').error).toEqualTypeOf>() expectTypeOf(useFetch('/error').error).toEqualTypeOf>() From 52dfc847be30a787bcb9e51249187b086821406e Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Mon, 15 May 2023 12:19:33 +0100 Subject: [PATCH 3/5] test: push failing test --- test/fixtures/basic/server/api/hey/index.post.ts | 3 +++ test/fixtures/basic/types.ts | 3 +++ 2 files changed, 6 insertions(+) create mode 100644 test/fixtures/basic/server/api/hey/index.post.ts diff --git a/test/fixtures/basic/server/api/hey/index.post.ts b/test/fixtures/basic/server/api/hey/index.post.ts new file mode 100644 index 000000000000..b09599aed336 --- /dev/null +++ b/test/fixtures/basic/server/api/hey/index.post.ts @@ -0,0 +1,3 @@ +export default defineEventHandler(() => ({ + method: 'post' as const +})) diff --git a/test/fixtures/basic/types.ts b/test/fixtures/basic/types.ts index 57fb11dd99b8..ddb0924d1895 100644 --- a/test/fixtures/basic/types.ts +++ b/test/fixtures/basic/types.ts @@ -17,6 +17,7 @@ describe('API routes', () => { expectTypeOf($fetch('/api/hello')).toEqualTypeOf>() expectTypeOf($fetch('/api/hey')).toEqualTypeOf>() expectTypeOf($fetch('/api/hey', { method: 'get' })).toEqualTypeOf>() + expectTypeOf($fetch('/api/hey', { method: 'post' })).toEqualTypeOf>() // @ts-expect-error not a valid method expectTypeOf($fetch('/api/hey', { method: 'patch ' })).toEqualTypeOf>() expectTypeOf($fetch('/api/union')).toEqualTypeOf>() @@ -51,8 +52,10 @@ describe('API routes', () => { it('works with useFetch', () => { expectTypeOf(useFetch('/api/hello').data).toEqualTypeOf>() expectTypeOf(useFetch('/api/hey').data).toEqualTypeOf>() + // TODO: this assertion (with uppercase) is currently broken on main as well (ie. not broken as a result of this PR) expectTypeOf(useFetch('/api/hey', { method: 'GET' }).data).toEqualTypeOf>() expectTypeOf(useFetch('/api/hey', { method: 'get' }).data).toEqualTypeOf>() + expectTypeOf(useFetch('/api/hey', { method: 'post' }).data).toEqualTypeOf>() // @ts-expect-error not a valid method useFetch('/api/hey', { method: 'PATCH' }) expectTypeOf(useFetch('/api/hey', { pick: ['baz'] }).data).toEqualTypeOf>() From 1e135f45a5f21bbf4bb12c621faa3d784e1e9baf Mon Sep 17 00:00:00 2001 From: Gypsophyllite Date: Wed, 17 May 2023 10:28:05 +0800 Subject: [PATCH 4/5] fix(nuxt): update method type --- packages/nuxt/src/app/composables/fetch.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/nuxt/src/app/composables/fetch.ts b/packages/nuxt/src/app/composables/fetch.ts index c519811ebe17..c06271cb4353 100644 --- a/packages/nuxt/src/app/composables/fetch.ts +++ b/packages/nuxt/src/app/composables/fetch.ts @@ -31,7 +31,7 @@ export function useFetch< ResT = void, ErrorT = FetchError, ReqT extends NitroFetchRequest = NitroFetchRequest, - Method extends AvailableRouterMethod = AvailableRouterMethod, + Method extends AvailableRouterMethod = ResT extends void ? 'get' extends AvailableRouterMethod ? 'get' : AvailableRouterMethod : AvailableRouterMethod, _ResT = ResT extends void ? FetchResult : ResT, DataT = _ResT, PickKeys extends KeysOf = KeysOf @@ -43,7 +43,7 @@ export function useFetch< ResT = void, ErrorT = FetchError, ReqT extends NitroFetchRequest = NitroFetchRequest, - Method extends AvailableRouterMethod = AvailableRouterMethod, + Method extends AvailableRouterMethod = ResT extends void ? 'get' extends AvailableRouterMethod ? 'get' : AvailableRouterMethod : AvailableRouterMethod, _ResT = ResT extends void ? FetchResult : ResT, DataT = _ResT, PickKeys extends KeysOf = KeysOf @@ -124,7 +124,7 @@ export function useLazyFetch< ResT = void, ErrorT = FetchError, ReqT extends NitroFetchRequest = NitroFetchRequest, - Method extends AvailableRouterMethod = AvailableRouterMethod, + Method extends AvailableRouterMethod = ResT extends void ? 'get' extends AvailableRouterMethod ? 'get' : AvailableRouterMethod : AvailableRouterMethod, _ResT = ResT extends void ? FetchResult : ResT, DataT = _ResT, PickKeys extends KeysOf = KeysOf @@ -136,7 +136,7 @@ export function useLazyFetch< ResT = void, ErrorT = FetchError, ReqT extends NitroFetchRequest = NitroFetchRequest, - Method extends AvailableRouterMethod = AvailableRouterMethod, + Method extends AvailableRouterMethod = ResT extends void ? 'get' extends AvailableRouterMethod ? 'get' : AvailableRouterMethod : AvailableRouterMethod, _ResT = ResT extends void ? FetchResult : ResT, DataT = _ResT, PickKeys extends KeysOf = KeysOf From 3bf8d035bcab494385e7159748cdebd349318054 Mon Sep 17 00:00:00 2001 From: Daniel Roe Date: Wed, 17 May 2023 09:25:42 +0100 Subject: [PATCH 5/5] test: ignore failing test until fixed upstream --- test/fixtures/basic/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/fixtures/basic/types.ts b/test/fixtures/basic/types.ts index ddb0924d1895..1b61186a60e7 100644 --- a/test/fixtures/basic/types.ts +++ b/test/fixtures/basic/types.ts @@ -52,7 +52,7 @@ describe('API routes', () => { it('works with useFetch', () => { expectTypeOf(useFetch('/api/hello').data).toEqualTypeOf>() expectTypeOf(useFetch('/api/hey').data).toEqualTypeOf>() - // TODO: this assertion (with uppercase) is currently broken on main as well (ie. not broken as a result of this PR) + // @ts-expect-error TODO: remove when fixed upstream: https://github.com/unjs/nitro/pull/1247 expectTypeOf(useFetch('/api/hey', { method: 'GET' }).data).toEqualTypeOf>() expectTypeOf(useFetch('/api/hey', { method: 'get' }).data).toEqualTypeOf>() expectTypeOf(useFetch('/api/hey', { method: 'post' }).data).toEqualTypeOf>()