@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.
- package/CHANGELOG.md +17 -0
- package/dist/cjs/callbacks/useMutation.cjs +3 -2
- package/dist/cjs/callbacks/useMutation.cjs.map +1 -1
- package/dist/cjs/callbacks/useQueries.cjs +2 -1
- package/dist/cjs/callbacks/useQueries.cjs.map +1 -1
- package/dist/cjs/callbacks/useSuspenseQueries.cjs +2 -1
- package/dist/cjs/callbacks/useSuspenseQueries.cjs.map +1 -1
- package/dist/cjs/lib/callQueryClientFetchMethod.cjs +2 -1
- package/dist/cjs/lib/callQueryClientFetchMethod.cjs.map +1 -1
- package/dist/cjs/lib/requestFn.cjs +4 -1
- package/dist/cjs/lib/requestFn.cjs.map +1 -1
- package/dist/cjs/lib/requestFnResponseRejecter.cjs +12 -0
- package/dist/cjs/lib/requestFnResponseRejecter.cjs.map +1 -0
- package/dist/cjs/lib/useComposeUseQueryOptions.cjs +5 -2
- package/dist/cjs/lib/useComposeUseQueryOptions.cjs.map +1 -1
- package/dist/esm/callbacks/useMutation.js +3 -2
- package/dist/esm/callbacks/useMutation.js.map +1 -1
- package/dist/esm/callbacks/useQueries.js +2 -1
- package/dist/esm/callbacks/useQueries.js.map +1 -1
- package/dist/esm/callbacks/useSuspenseQueries.js +2 -1
- package/dist/esm/callbacks/useSuspenseQueries.js.map +1 -1
- package/dist/esm/lib/callQueryClientFetchMethod.js +2 -1
- package/dist/esm/lib/callQueryClientFetchMethod.js.map +1 -1
- package/dist/esm/lib/requestFn.js +4 -1
- package/dist/esm/lib/requestFn.js.map +1 -1
- package/dist/esm/lib/requestFnResponseRejecter.js +10 -0
- package/dist/esm/lib/requestFnResponseRejecter.js.map +1 -0
- package/dist/esm/lib/useComposeUseQueryOptions.js +5 -2
- package/dist/esm/lib/useComposeUseQueryOptions.js.map +1 -1
- package/dist/types/callbacks/useMutation.d.ts.map +1 -1
- package/dist/types/callbacks/useQueries.d.ts.map +1 -1
- package/dist/types/callbacks/useSuspenseQueries.d.ts.map +1 -1
- package/dist/types/lib/callQueryClientFetchMethod.d.ts.map +1 -1
- package/dist/types/lib/requestFn.d.ts.map +1 -1
- package/dist/types/lib/requestFn.test.d.ts +2 -0
- package/dist/types/lib/requestFn.test.d.ts.map +1 -0
- package/dist/types/lib/requestFnResponseRejecter.d.ts +3 -0
- package/dist/types/lib/requestFnResponseRejecter.d.ts.map +1 -0
- package/dist/types/lib/requestFnResponseRejecter.test.d.ts +2 -0
- package/dist/types/lib/requestFnResponseRejecter.test.d.ts.map +1 -0
- package/dist/types/lib/useComposeUseQueryOptions.d.ts.map +1 -1
- package/package.json +6 -6
- package/src/callbacks/useMutation.ts +3 -2
- package/src/callbacks/useQueries.ts +2 -1
- package/src/callbacks/useSuspenseQueries.ts +2 -1
- package/src/lib/callQueryClientFetchMethod.ts +2 -1
- package/src/lib/requestFn.test.ts +125 -0
- package/src/lib/requestFn.ts +20 -6
- package/src/lib/requestFnResponseRejecter.test.ts +46 -0
- package/src/lib/requestFnResponseRejecter.ts +11 -0
- package/src/lib/useComposeUseQueryOptions.ts +10 -3
package/src/lib/requestFn.ts
CHANGED
|
@@ -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,
|
|
33
|
-
:
|
|
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,
|
|
45
|
+
.then(requestFnResponseResolver, requestFnResponseRejecter);
|
|
39
46
|
};
|
|
40
47
|
|
|
41
48
|
const queryKey = Array.isArray(parameters)
|