@openapi-qraft/react 2.4.0 → 2.5.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/cjs/callbacks/useMutation.cjs +3 -2
  3. package/dist/cjs/callbacks/useMutation.cjs.map +1 -1
  4. package/dist/cjs/callbacks/useQueries.cjs +2 -1
  5. package/dist/cjs/callbacks/useQueries.cjs.map +1 -1
  6. package/dist/cjs/callbacks/useSuspenseQueries.cjs +2 -1
  7. package/dist/cjs/callbacks/useSuspenseQueries.cjs.map +1 -1
  8. package/dist/cjs/lib/callQueryClientFetchMethod.cjs +2 -1
  9. package/dist/cjs/lib/callQueryClientFetchMethod.cjs.map +1 -1
  10. package/dist/cjs/lib/requestFn.cjs +4 -1
  11. package/dist/cjs/lib/requestFn.cjs.map +1 -1
  12. package/dist/cjs/lib/requestFnResponseRejecter.cjs +12 -0
  13. package/dist/cjs/lib/requestFnResponseRejecter.cjs.map +1 -0
  14. package/dist/cjs/lib/useComposeUseQueryOptions.cjs +5 -2
  15. package/dist/cjs/lib/useComposeUseQueryOptions.cjs.map +1 -1
  16. package/dist/esm/callbacks/useMutation.js +3 -2
  17. package/dist/esm/callbacks/useMutation.js.map +1 -1
  18. package/dist/esm/callbacks/useQueries.js +2 -1
  19. package/dist/esm/callbacks/useQueries.js.map +1 -1
  20. package/dist/esm/callbacks/useSuspenseQueries.js +2 -1
  21. package/dist/esm/callbacks/useSuspenseQueries.js.map +1 -1
  22. package/dist/esm/lib/callQueryClientFetchMethod.js +2 -1
  23. package/dist/esm/lib/callQueryClientFetchMethod.js.map +1 -1
  24. package/dist/esm/lib/requestFn.js +4 -1
  25. package/dist/esm/lib/requestFn.js.map +1 -1
  26. package/dist/esm/lib/requestFnResponseRejecter.js +10 -0
  27. package/dist/esm/lib/requestFnResponseRejecter.js.map +1 -0
  28. package/dist/esm/lib/useComposeUseQueryOptions.js +5 -2
  29. package/dist/esm/lib/useComposeUseQueryOptions.js.map +1 -1
  30. package/dist/types/callbacks/useMutation.d.ts.map +1 -1
  31. package/dist/types/callbacks/useQueries.d.ts.map +1 -1
  32. package/dist/types/callbacks/useSuspenseQueries.d.ts.map +1 -1
  33. package/dist/types/lib/callQueryClientFetchMethod.d.ts.map +1 -1
  34. package/dist/types/lib/requestFn.d.ts.map +1 -1
  35. package/dist/types/lib/requestFn.test.d.ts +2 -0
  36. package/dist/types/lib/requestFn.test.d.ts.map +1 -0
  37. package/dist/types/lib/requestFnResponseRejecter.d.ts +3 -0
  38. package/dist/types/lib/requestFnResponseRejecter.d.ts.map +1 -0
  39. package/dist/types/lib/requestFnResponseRejecter.test.d.ts +2 -0
  40. package/dist/types/lib/requestFnResponseRejecter.test.d.ts.map +1 -0
  41. package/dist/types/lib/useComposeUseQueryOptions.d.ts.map +1 -1
  42. package/package.json +6 -6
  43. package/src/callbacks/useMutation.ts +3 -2
  44. package/src/callbacks/useQueries.ts +2 -1
  45. package/src/callbacks/useSuspenseQueries.ts +2 -1
  46. package/src/lib/callQueryClientFetchMethod.ts +2 -1
  47. package/src/lib/requestFn.test.ts +125 -0
  48. package/src/lib/requestFn.ts +20 -6
  49. package/src/lib/requestFnResponseRejecter.test.ts +46 -0
  50. package/src/lib/requestFnResponseRejecter.ts +11 -0
  51. package/src/lib/useComposeUseQueryOptions.ts +10 -3
@@ -178,12 +178,7 @@ export function bodySerializer(
178
178
  schema: OperationSchema,
179
179
  body: RequestFnInfo['body']
180
180
  ) {
181
- if (
182
- schema.method === 'get' ||
183
- schema.method === 'head' ||
184
- schema.method === 'options'
185
- )
186
- return undefined;
181
+ if (isReadOnlyOperation(schema)) return undefined;
187
182
 
188
183
  if (body === undefined || body === null) return undefined;
189
184
 
@@ -314,3 +309,22 @@ export type {
314
309
  * @deprecated use `RequestFnInfo` instead
315
310
  */
316
311
  export type RequestFnPayload = RequestFnInfo;
312
+
313
+ function isReadOnlyOperation(operation: {
314
+ readonly method:
315
+ | 'get'
316
+ | 'put'
317
+ | 'post'
318
+ | 'patch'
319
+ | 'delete'
320
+ | 'options'
321
+ | 'head'
322
+ | 'trace';
323
+ }) {
324
+ return (
325
+ operation.method === 'get' ||
326
+ operation.method === 'head' ||
327
+ operation.method === 'trace' ||
328
+ operation.method === 'options'
329
+ );
330
+ }
@@ -0,0 +1,46 @@
1
+ import { describe, expect, it } from 'vitest';
2
+ import { requestFnResponseRejecter } from './requestFnResponseRejecter.js';
3
+
4
+ describe('requestFnResponseRejecter', () => {
5
+ it('should throw error if input is an Error instance', () => {
6
+ const error = new Error('Test error');
7
+ expect(() => requestFnResponseRejecter(error)).toThrow(error);
8
+ });
9
+
10
+ it('should throw error from error property if input contains error field', () => {
11
+ const customError = new Error('Error from error property');
12
+ const responseWithError = { error: customError };
13
+ expect(() => requestFnResponseRejecter(responseWithError)).toThrow(
14
+ customError
15
+ );
16
+ });
17
+
18
+ it('should throw generic "Unhandled `requestFn` response" if input does not match known formats', () => {
19
+ const unknownResponse = { data: 'some data' };
20
+ expect(() =>
21
+ requestFnResponseRejecter(
22
+ // @ts-expect-error - invalid test case
23
+ unknownResponse
24
+ )
25
+ ).toThrow('Unhandled `requestFn` response');
26
+ });
27
+
28
+ it('should add source data to cause property when throwing unhandled response error', () => {
29
+ const unknownResponse = { data: 'some data' };
30
+
31
+ try {
32
+ requestFnResponseRejecter(
33
+ // @ts-expect-error - invalid test case
34
+ unknownResponse
35
+ );
36
+ expect.fail('Expected an error to be thrown');
37
+ } catch (error) {
38
+ if (error instanceof Error) {
39
+ expect(error.message).toBe('Unhandled `requestFn` response');
40
+ expect(error.cause).toBe(unknownResponse);
41
+ } else {
42
+ expect.fail('Thrown error should be an instance of Error');
43
+ }
44
+ }
45
+ });
46
+ });
@@ -0,0 +1,11 @@
1
+ import type { RequestFnResponse } from './requestFn.js';
2
+
3
+ export function requestFnResponseRejecter<TData, TError>(
4
+ requestFnResponseOrError: RequestFnResponse<TData, TError> | Error
5
+ ): TData | undefined {
6
+ if (requestFnResponseOrError instanceof Error) throw requestFnResponseOrError;
7
+ if ('error' in requestFnResponseOrError) throw requestFnResponseOrError.error;
8
+ throw new Error('Unhandled `requestFn` response', {
9
+ cause: requestFnResponseOrError,
10
+ });
11
+ }
@@ -7,6 +7,7 @@ import type { CreateAPIQueryClientOptions } from '../qraftAPIClient.js';
7
7
  import type { OperationSchema } from './requestFn.js';
8
8
  import { composeInfiniteQueryKey } from './composeInfiniteQueryKey.js';
9
9
  import { composeQueryKey } from './composeQueryKey.js';
10
+ import { requestFnResponseRejecter } from './requestFnResponseRejecter.js';
10
11
  import { requestFnResponseResolver } from './requestFnResponseResolver.js';
11
12
  import { shelfMerge } from './shelfMerge.js';
12
13
 
@@ -25,17 +26,23 @@ export function useComposeUseQueryOptions(
25
26
  const queryFn =
26
27
  options?.queryFn ??
27
28
  function ({ queryKey: [, queryParams], signal, meta, pageParam }) {
29
+ const { body, ...parameters } = queryParams as {
30
+ body: BodyInit;
31
+ parameters: Record<string, unknown>;
32
+ };
33
+
28
34
  return qraftOptions
29
35
  .requestFn(schema, {
30
36
  // @ts-expect-error - Too complex to type
31
37
  parameters: infinite
32
- ? (shelfMerge(2, queryParams, pageParam) as never)
33
- : queryParams,
38
+ ? (shelfMerge(2, parameters, pageParam) as never)
39
+ : parameters,
34
40
  baseUrl: qraftOptions.baseUrl,
41
+ body,
35
42
  signal,
36
43
  meta,
37
44
  })
38
- .then(requestFnResponseResolver, requestFnResponseResolver);
45
+ .then(requestFnResponseResolver, requestFnResponseRejecter);
39
46
  };
40
47
 
41
48
  const queryKey = Array.isArray(parameters)