@openapi-qraft/react 2.3.2 → 2.4.1
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 +13 -0
- package/README.md +167 -513
- 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/requestFnResponseRejecter.cjs +12 -0
- package/dist/cjs/lib/requestFnResponseRejecter.cjs.map +1 -0
- package/dist/cjs/lib/useComposeUseQueryOptions.cjs +2 -1
- 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/requestFnResponseRejecter.js +10 -0
- package/dist/esm/lib/requestFnResponseRejecter.js.map +1 -0
- package/dist/esm/lib/useComposeUseQueryOptions.js +2 -1
- 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.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/requestFnResponseRejecter.test.ts +46 -0
- package/src/lib/requestFnResponseRejecter.ts +11 -0
- package/src/lib/useComposeUseQueryOptions.ts +2 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useComposeUseQueryOptions.js","sources":["../../../src/lib/useComposeUseQueryOptions.ts"],"sourcesContent":["'use client';\n\nimport type { ServiceOperationQueryKey } from '@openapi-qraft/tanstack-query-react-types';\nimport type { QueryClient } from '@tanstack/query-core';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CreateAPIQueryClientOptions } from '../qraftAPIClient.js';\nimport type { OperationSchema } from './requestFn.js';\nimport { composeInfiniteQueryKey } from './composeInfiniteQueryKey.js';\nimport { composeQueryKey } from './composeQueryKey.js';\nimport { requestFnResponseResolver } from './requestFnResponseResolver.js';\nimport { shelfMerge } from './shelfMerge.js';\n\n/**\n * Composes the options for useQuery, useInfiniteQuery, useSuspenseQuery, and useSuspenseQueries.\n * @internal\n */\nexport function useComposeUseQueryOptions(\n qraftOptions: CreateAPIQueryClientOptions,\n schema: OperationSchema,\n args: UseQueryOptionsArgs,\n infinite: boolean\n): never {\n const [parameters, options] = args;\n\n const queryFn =\n options?.queryFn ??\n function ({ queryKey: [, queryParams], signal, meta, pageParam }) {\n return qraftOptions\n .requestFn(schema, {\n // @ts-expect-error - Too complex to type\n parameters: infinite\n ? (shelfMerge(2, queryParams, pageParam) as never)\n : queryParams,\n baseUrl: qraftOptions.baseUrl,\n signal,\n meta,\n })\n .then(requestFnResponseResolver,
|
|
1
|
+
{"version":3,"file":"useComposeUseQueryOptions.js","sources":["../../../src/lib/useComposeUseQueryOptions.ts"],"sourcesContent":["'use client';\n\nimport type { ServiceOperationQueryKey } from '@openapi-qraft/tanstack-query-react-types';\nimport type { QueryClient } from '@tanstack/query-core';\nimport type { UseQueryOptions } from '@tanstack/react-query';\nimport type { CreateAPIQueryClientOptions } from '../qraftAPIClient.js';\nimport type { OperationSchema } from './requestFn.js';\nimport { composeInfiniteQueryKey } from './composeInfiniteQueryKey.js';\nimport { composeQueryKey } from './composeQueryKey.js';\nimport { requestFnResponseRejecter } from './requestFnResponseRejecter.js';\nimport { requestFnResponseResolver } from './requestFnResponseResolver.js';\nimport { shelfMerge } from './shelfMerge.js';\n\n/**\n * Composes the options for useQuery, useInfiniteQuery, useSuspenseQuery, and useSuspenseQueries.\n * @internal\n */\nexport function useComposeUseQueryOptions(\n qraftOptions: CreateAPIQueryClientOptions,\n schema: OperationSchema,\n args: UseQueryOptionsArgs,\n infinite: boolean\n): never {\n const [parameters, options] = args;\n\n const queryFn =\n options?.queryFn ??\n function ({ queryKey: [, queryParams], signal, meta, pageParam }) {\n return qraftOptions\n .requestFn(schema, {\n // @ts-expect-error - Too complex to type\n parameters: infinite\n ? (shelfMerge(2, queryParams, pageParam) as never)\n : queryParams,\n baseUrl: qraftOptions.baseUrl,\n signal,\n meta,\n })\n .then(requestFnResponseResolver, requestFnResponseRejecter);\n };\n\n const queryKey = Array.isArray(parameters)\n ? (parameters as ServiceOperationQueryKey<OperationSchema, unknown>)\n : infinite\n ? composeInfiniteQueryKey(schema, parameters)\n : composeQueryKey(schema, parameters);\n\n return [{ ...options, queryFn, queryKey }, qraftOptions.queryClient] as never;\n}\n\ntype UseQueryOptionsArgs = [\n parameters: unknown,\n options?: UseQueryOptions,\n queryClient?: QueryClient,\n];\n"],"names":["useComposeUseQueryOptions","qraftOptions","schema","args","infinite","parameters","options","queryFn","queryKey","queryParams","signal","meta","pageParam","requestFn","shelfMerge","baseUrl","then","requestFnResponseResolver","requestFnResponseRejecter","Array","isArray","composeInfiniteQueryKey","composeQueryKey","queryClient"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useMutation.d.ts","sourceRoot":"","sources":["../../../src/callbacks/useMutation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EAEf,2BAA2B,EAC5B,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"useMutation.d.ts","sourceRoot":"","sources":["../../../src/callbacks/useMutation.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EAEf,2BAA2B,EAC5B,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAC/D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAMxE,eAAO,MAAM,WAAW,EAAE,CACxB,KAAK,GAAG,OAAO,EACf,MAAM,GAAG,YAAY,EACrB,UAAU,GAAG,IAAI,EACjB,QAAQ,GAAG,OAAO,EAElB,YAAY,EAAE,2BAA2B,EACzC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,UAAU,CACd,2BAA2B,CACzB,eAAe,EACf,MAAM,GAAG,SAAS,EAClB,UAAU,EACV,KAAK,EACL,YAAY,CACb,CAAC,aAAa,CAAC,CACjB,KACE,iBAAiB,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,CA0DzD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useQueries.d.ts","sourceRoot":"","sources":["../../../src/callbacks/useQueries.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC3B,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"useQueries.d.ts","sourceRoot":"","sources":["../../../src/callbacks/useQueries.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,0BAA0B,EAC3B,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAC5D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAMxE,eAAO,MAAM,UAAU,EAAE,CACvB,YAAY,EAAE,2BAA2B,EACzC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,UAAU,CACd,0BAA0B,CACxB,eAAe,EACf,OAAO,EACP,OAAO,EACP,YAAY,CACb,CAAC,YAAY,CAAC,CAChB,KACE,cAAc,CAAC,KAAK,CAyCxB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useSuspenseQueries.d.ts","sourceRoot":"","sources":["../../../src/callbacks/useSuspenseQueries.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,kCAAkC,EACnC,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;
|
|
1
|
+
{"version":3,"file":"useSuspenseQueries.d.ts","sourceRoot":"","sources":["../../../src/callbacks/useSuspenseQueries.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,eAAe,EACf,kCAAkC,EACnC,MAAM,2CAA2C,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AACpE,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AAMxE,eAAO,MAAM,kBAAkB,EAAE,CAC/B,YAAY,EAAE,2BAA2B,EACzC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,UAAU,CACd,kCAAkC,CAChC,eAAe,EACf,OAAO,EACP,OAAO,EACP,YAAY,CACb,CAAC,oBAAoB,CAAC,CACxB,KACE,sBAAsB,CAAC,KAAK,CAyChC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"callQueryClientFetchMethod.d.ts","sourceRoot":"","sources":["../../../src/lib/callQueryClientFetchMethod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"callQueryClientFetchMethod.d.ts","sourceRoot":"","sources":["../../../src/lib/callQueryClientFetchMethod.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAOjE;;;GAGG;AACH,wBAAgB,iCAAiC,CAC/C,QAAQ,SAAS,eAAe,EAEhC,YAAY,EAAE,2BAA2B,EACzC,iBAAiB,EAAE,QAAQ,EAC3B,MAAM,EAAE,eAAe,EACvB,QAAQ,EAAE,OAAO,EACjB,IAAI,EAAE,qBAAqB,CAAC,QAAQ,CAAC,GACpC,UAAU,CAAC,CAAC,OAAO,WAAW,CAAC,SAAS,CAAC,CAAC,QAAQ,CAAC,CAAC,CAoDtD;AAED,KAAK,qBAAqB,CAAC,OAAO,SAAS,MAAM,oBAAoB,IAAI;IACvE,OAAO,EAAE,UAAU,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG;QACtD,UAAU,CAAC,EAAE,OAAO,CAAC;QACrB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;KACzC;IACD,WAAW,EAAE,WAAW;CACzB,CAAC;AAEF,KAAK,eAAe,GAChB,cAAc,CAAC,YAAY,CAAC,GAC5B,cAAc,CAAC,eAAe,CAAC,GAC/B,cAAc,CAAC,iBAAiB,CAAC,GACjC,cAAc,CAAC,oBAAoB,CAAC,GACpC,cAAc,CAAC,uBAAuB,CAAC,GACvC,cAAc,CAAC,yBAAyB,CAAC,CAAC;AAE9C,KAAK,oBAAoB,GAAG,OAAO,WAAW,CAAC,SAAS,CAAC;AAEzD,KAAK,cAAc,CAAC,QAAQ,SAAS,MAAM,OAAO,WAAW,CAAC,SAAS,IACrE,QAAQ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestFn.test.d.ts","sourceRoot":"","sources":["../../../src/lib/requestFn.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestFnResponseRejecter.d.ts","sourceRoot":"","sources":["../../../src/lib/requestFnResponseRejecter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAExD,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,EACrD,wBAAwB,EAAE,iBAAiB,CAAC,KAAK,EAAE,MAAM,CAAC,GAAG,KAAK,GACjE,KAAK,GAAG,SAAS,CAMnB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requestFnResponseRejecter.test.d.ts","sourceRoot":"","sources":["../../../src/lib/requestFnResponseRejecter.test.ts"],"names":[],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useComposeUseQueryOptions.d.ts","sourceRoot":"","sources":["../../../src/lib/useComposeUseQueryOptions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"useComposeUseQueryOptions.d.ts","sourceRoot":"","sources":["../../../src/lib/useComposeUseQueryOptions.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,2BAA2B,EAAE,MAAM,sBAAsB,CAAC;AACxE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAOtD;;;GAGG;AACH,wBAAgB,yBAAyB,CACvC,YAAY,EAAE,2BAA2B,EACzC,MAAM,EAAE,eAAe,EACvB,IAAI,EAAE,mBAAmB,EACzB,QAAQ,EAAE,OAAO,GAChB,KAAK,CA0BP;AAED,KAAK,mBAAmB,GAAG;IACzB,UAAU,EAAE,OAAO;IACnB,OAAO,CAAC,EAAE,eAAe;IACzB,WAAW,CAAC,EAAE,WAAW;CAC1B,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@openapi-qraft/react",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.1",
|
|
4
4
|
"description": "OpenAPI client for React, providing type-safe requests and dynamic TanStack Query React Hooks via a modular, Proxy-based architecture.",
|
|
5
5
|
"scripts": {
|
|
6
6
|
"build": "NODE_ENV=production rollup --config rollup.config.mjs && tsc --project tsconfig.build.json --emitDeclarationOnly",
|
|
@@ -10,12 +10,12 @@
|
|
|
10
10
|
"typecheck": "tsc --noEmit",
|
|
11
11
|
"lint": "eslint",
|
|
12
12
|
"clean": "rimraf dist/",
|
|
13
|
-
"codegen": "openapi-qraft --
|
|
13
|
+
"codegen": "openapi-qraft --redocly && yarn _prettify-api",
|
|
14
14
|
"_prettify-api": "prettier --write src/tests/fixtures/api/**/*.ts"
|
|
15
15
|
},
|
|
16
16
|
"sideEffects": false,
|
|
17
17
|
"dependencies": {
|
|
18
|
-
"@openapi-qraft/tanstack-query-react-types": "2.
|
|
18
|
+
"@openapi-qraft/tanstack-query-react-types": "2.4.1"
|
|
19
19
|
},
|
|
20
20
|
"peerDependencies": {
|
|
21
21
|
"@tanstack/query-core": "^5.0.0",
|
|
@@ -23,11 +23,11 @@
|
|
|
23
23
|
"react": "^18 || ^19"
|
|
24
24
|
},
|
|
25
25
|
"devDependencies": {
|
|
26
|
-
"@openapi-qraft/cli": "2.
|
|
26
|
+
"@openapi-qraft/cli": "2.4.1",
|
|
27
27
|
"@openapi-qraft/eslint-config": "1.0.1",
|
|
28
|
-
"@openapi-qraft/openapi-typescript-plugin": "^1.2.
|
|
28
|
+
"@openapi-qraft/openapi-typescript-plugin": "^1.2.14",
|
|
29
29
|
"@openapi-qraft/rollup-config": "1.1.1",
|
|
30
|
-
"@openapi-qraft/tanstack-query-react-plugin": "2.
|
|
30
|
+
"@openapi-qraft/tanstack-query-react-plugin": "2.4.1",
|
|
31
31
|
"@openapi-qraft/test-fixtures": "1.0.1",
|
|
32
32
|
"@tanstack/query-core": "^5.66.3",
|
|
33
33
|
"@tanstack/react-query": "^5.66.3",
|
|
@@ -10,6 +10,7 @@ import type { UseMutationResult } from '@tanstack/react-query';
|
|
|
10
10
|
import type { CreateAPIQueryClientOptions } from '../qraftAPIClient.js';
|
|
11
11
|
import { useMutation as useMutationBase } from '@tanstack/react-query';
|
|
12
12
|
import { composeMutationKey } from '../lib/composeMutationKey.js';
|
|
13
|
+
import { requestFnResponseRejecter } from '../lib/requestFnResponseRejecter.js';
|
|
13
14
|
import { requestFnResponseResolver } from '../lib/requestFnResponseResolver.js';
|
|
14
15
|
|
|
15
16
|
export const useMutation: <
|
|
@@ -69,7 +70,7 @@ export const useMutation: <
|
|
|
69
70
|
baseUrl: qraftOptions.baseUrl,
|
|
70
71
|
body: bodyPayload as never,
|
|
71
72
|
})
|
|
72
|
-
.then(requestFnResponseResolver,
|
|
73
|
+
.then(requestFnResponseResolver, requestFnResponseRejecter);
|
|
73
74
|
}
|
|
74
75
|
: function (parametersAndBodyPayload) {
|
|
75
76
|
const { body, ...parameters } = parametersAndBodyPayload as {
|
|
@@ -82,7 +83,7 @@ export const useMutation: <
|
|
|
82
83
|
baseUrl: qraftOptions.baseUrl,
|
|
83
84
|
body,
|
|
84
85
|
} as never)
|
|
85
|
-
.then(requestFnResponseResolver,
|
|
86
|
+
.then(requestFnResponseResolver, requestFnResponseRejecter);
|
|
86
87
|
}),
|
|
87
88
|
},
|
|
88
89
|
qraftOptions.queryClient
|
|
@@ -9,6 +9,7 @@ import type { QueriesResults } from '@tanstack/react-query';
|
|
|
9
9
|
import type { CreateAPIQueryClientOptions } from '../qraftAPIClient.js';
|
|
10
10
|
import { useQueries as useQueriesTanstack } from '@tanstack/react-query';
|
|
11
11
|
import { composeQueryKey } from '../lib/composeQueryKey.js';
|
|
12
|
+
import { requestFnResponseRejecter } from '../lib/requestFnResponseRejecter.js';
|
|
12
13
|
import { requestFnResponseResolver } from '../lib/requestFnResponseResolver.js';
|
|
13
14
|
|
|
14
15
|
export const useQueries: (
|
|
@@ -56,7 +57,7 @@ export const useQueries: (
|
|
|
56
57
|
signal,
|
|
57
58
|
meta,
|
|
58
59
|
})
|
|
59
|
-
.then(requestFnResponseResolver,
|
|
60
|
+
.then(requestFnResponseResolver, requestFnResponseRejecter);
|
|
60
61
|
},
|
|
61
62
|
};
|
|
62
63
|
}),
|
|
@@ -9,6 +9,7 @@ import type { SuspenseQueriesResults } from '@tanstack/react-query';
|
|
|
9
9
|
import type { CreateAPIQueryClientOptions } from '../qraftAPIClient.js';
|
|
10
10
|
import { useSuspenseQueries as useSuspenseQueriesTanstack } from '@tanstack/react-query';
|
|
11
11
|
import { composeQueryKey } from '../lib/composeQueryKey.js';
|
|
12
|
+
import { requestFnResponseRejecter } from '../lib/requestFnResponseRejecter.js';
|
|
12
13
|
import { requestFnResponseResolver } from '../lib/requestFnResponseResolver.js';
|
|
13
14
|
|
|
14
15
|
export const useSuspenseQueries: (
|
|
@@ -56,7 +57,7 @@ export const useSuspenseQueries: (
|
|
|
56
57
|
signal,
|
|
57
58
|
meta,
|
|
58
59
|
})
|
|
59
|
-
.then(requestFnResponseResolver,
|
|
60
|
+
.then(requestFnResponseResolver, requestFnResponseRejecter);
|
|
60
61
|
},
|
|
61
62
|
};
|
|
62
63
|
}),
|
|
@@ -3,6 +3,7 @@ import type { CreateAPIQueryClientOptions } from '../qraftAPIClient.js';
|
|
|
3
3
|
import type { OperationSchema, RequestFn } from './requestFn.js';
|
|
4
4
|
import { composeInfiniteQueryKey } from './composeInfiniteQueryKey.js';
|
|
5
5
|
import { composeQueryKey } from './composeQueryKey.js';
|
|
6
|
+
import { requestFnResponseRejecter } from './requestFnResponseRejecter.js';
|
|
6
7
|
import { requestFnResponseResolver } from './requestFnResponseResolver.js';
|
|
7
8
|
import { shelfMerge } from './shelfMerge.js';
|
|
8
9
|
|
|
@@ -56,7 +57,7 @@ export function callQueryClientMethodWithQueryKey<
|
|
|
56
57
|
baseUrl,
|
|
57
58
|
signal,
|
|
58
59
|
meta,
|
|
59
|
-
}).then(requestFnResponseResolver,
|
|
60
|
+
}).then(requestFnResponseResolver, requestFnResponseRejecter);
|
|
60
61
|
}
|
|
61
62
|
: undefined);
|
|
62
63
|
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import type { OperationSchema } from '@openapi-qraft/tanstack-query-react-types';
|
|
2
|
+
import { describe, expect, it } from 'vitest';
|
|
3
|
+
import { bodySerializer } from './requestFn.js';
|
|
4
|
+
|
|
5
|
+
describe('requestFn', () => {
|
|
6
|
+
describe('bodySerializer', () => {
|
|
7
|
+
const createSchema = (
|
|
8
|
+
method: OperationSchema['method'],
|
|
9
|
+
mediaType?: string[]
|
|
10
|
+
): OperationSchema => ({
|
|
11
|
+
method,
|
|
12
|
+
url: '/test',
|
|
13
|
+
mediaType,
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it('should return undefined for GET, HEAD, and OPTIONS methods', () => {
|
|
17
|
+
const methods = ['get', 'head', 'options'] as const;
|
|
18
|
+
methods.forEach((method) => {
|
|
19
|
+
const schema = createSchema(method);
|
|
20
|
+
expect(bodySerializer(schema, { data: 'test' })).toBeUndefined();
|
|
21
|
+
});
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it('should return undefined for null or undefined body', () => {
|
|
25
|
+
const schema = createSchema('post');
|
|
26
|
+
expect(bodySerializer(schema, null)).toBeUndefined();
|
|
27
|
+
expect(bodySerializer(schema, undefined)).toBeUndefined();
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
it('should handle string body', () => {
|
|
31
|
+
const schema = createSchema('post', ['text/plain']);
|
|
32
|
+
const result = bodySerializer(schema, 'test string');
|
|
33
|
+
expect(result).toEqual({
|
|
34
|
+
body: 'test string',
|
|
35
|
+
headers: {
|
|
36
|
+
'Content-Type': 'text/plain',
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it('should handle FormData body', () => {
|
|
42
|
+
const schema = createSchema('post');
|
|
43
|
+
const formData = new FormData();
|
|
44
|
+
formData.append('test', 'value');
|
|
45
|
+
|
|
46
|
+
const result = bodySerializer(schema, formData);
|
|
47
|
+
expect(result).toEqual({
|
|
48
|
+
body: formData,
|
|
49
|
+
headers: {
|
|
50
|
+
// If the serialized body is FormData, remove the 'Content-Type' header.
|
|
51
|
+
// The browser will automatically set the correct `Content-Type` and boundary expression.
|
|
52
|
+
'Content-Type': null,
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
it('should handle Blob body', () => {
|
|
58
|
+
const schema = createSchema('post', ['application/octet-stream']);
|
|
59
|
+
const blob = new Blob(['test'], { type: 'text/plain' });
|
|
60
|
+
|
|
61
|
+
const result = bodySerializer(schema, blob);
|
|
62
|
+
expect(result).toEqual({
|
|
63
|
+
body: blob,
|
|
64
|
+
headers: {
|
|
65
|
+
'Content-Type': 'text/plain',
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
it('should handle JSON body with form-data media type', () => {
|
|
71
|
+
const schema = createSchema('post', ['multipart/form-data']);
|
|
72
|
+
const body = { test: 'value', file: new Blob(['test']) };
|
|
73
|
+
|
|
74
|
+
const result = bodySerializer(schema, body)!;
|
|
75
|
+
expect(result).toEqual({
|
|
76
|
+
body: expect.any(FormData),
|
|
77
|
+
headers: {
|
|
78
|
+
'Content-Type': null,
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
const formData = result.body as FormData;
|
|
83
|
+
expect(formData.get('test')).toBe('value');
|
|
84
|
+
expect(formData.get('file')).toBeInstanceOf(Blob);
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
it('should handle JSON body with JSON media type', () => {
|
|
88
|
+
const schema = createSchema('post', ['application/json']);
|
|
89
|
+
const body = { test: 'value' };
|
|
90
|
+
|
|
91
|
+
const result = bodySerializer(schema, body);
|
|
92
|
+
expect(result).toEqual({
|
|
93
|
+
body: JSON.stringify(body),
|
|
94
|
+
headers: {
|
|
95
|
+
'Content-Type': 'application/json',
|
|
96
|
+
},
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it('should handle complex nested objects in form-data', () => {
|
|
101
|
+
const schema = createSchema('post', ['multipart/form-data']);
|
|
102
|
+
const body = {
|
|
103
|
+
simple: 'value',
|
|
104
|
+
array: [1, 2, 3],
|
|
105
|
+
nested: { key: 'value' },
|
|
106
|
+
file: new Blob(['test']),
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const result = bodySerializer(schema, body)!;
|
|
110
|
+
expect(result).toEqual({
|
|
111
|
+
body: expect.any(FormData),
|
|
112
|
+
headers: {
|
|
113
|
+
'Content-Type': null,
|
|
114
|
+
},
|
|
115
|
+
});
|
|
116
|
+
|
|
117
|
+
const formData = result.body as FormData;
|
|
118
|
+
|
|
119
|
+
expect(formData.get('simple')).toBe('value');
|
|
120
|
+
expect(formData.getAll('array')).toEqual(['1', '2', '3']);
|
|
121
|
+
expect(formData.get('nested')).toBe(JSON.stringify({ key: 'value' }));
|
|
122
|
+
expect(formData.get('file')).toBeInstanceOf(Blob);
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
});
|
|
@@ -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
|
|
|
@@ -35,7 +36,7 @@ export function useComposeUseQueryOptions(
|
|
|
35
36
|
signal,
|
|
36
37
|
meta,
|
|
37
38
|
})
|
|
38
|
-
.then(requestFnResponseResolver,
|
|
39
|
+
.then(requestFnResponseResolver, requestFnResponseRejecter);
|
|
39
40
|
};
|
|
40
41
|
|
|
41
42
|
const queryKey = Array.isArray(parameters)
|