@openapi-qraft/react 1.0.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 (107) hide show
  1. package/README.md +287 -0
  2. package/dist/QraftContext.d.ts +8 -0
  3. package/dist/QraftContext.d.ts.map +1 -0
  4. package/dist/QraftContext.js +3 -0
  5. package/dist/QraftContext.js.map +1 -0
  6. package/dist/RequestClient.d.ts +19 -0
  7. package/dist/RequestClient.d.ts.map +1 -0
  8. package/dist/RequestClient.js +2 -0
  9. package/dist/RequestClient.js.map +1 -0
  10. package/dist/ServiceOperation.d.ts +122 -0
  11. package/dist/ServiceOperation.d.ts.map +1 -0
  12. package/dist/ServiceOperation.js +2 -0
  13. package/dist/ServiceOperation.js.map +1 -0
  14. package/dist/callbacks/getInfiniteQueryData.d.ts +6 -0
  15. package/dist/callbacks/getInfiniteQueryData.d.ts.map +1 -0
  16. package/dist/callbacks/getInfiniteQueryData.js +8 -0
  17. package/dist/callbacks/getInfiniteQueryData.js.map +1 -0
  18. package/dist/callbacks/getInfiniteQueryKey.d.ts +8 -0
  19. package/dist/callbacks/getInfiniteQueryKey.d.ts.map +1 -0
  20. package/dist/callbacks/getInfiniteQueryKey.js +7 -0
  21. package/dist/callbacks/getInfiniteQueryKey.js.map +1 -0
  22. package/dist/callbacks/getMutationKey.d.ts +5 -0
  23. package/dist/callbacks/getMutationKey.d.ts.map +1 -0
  24. package/dist/callbacks/getMutationKey.js +22 -0
  25. package/dist/callbacks/getMutationKey.js.map +1 -0
  26. package/dist/callbacks/getQueryData.d.ts +5 -0
  27. package/dist/callbacks/getQueryData.d.ts.map +1 -0
  28. package/dist/callbacks/getQueryData.js +8 -0
  29. package/dist/callbacks/getQueryData.js.map +1 -0
  30. package/dist/callbacks/getQueryKey.d.ts +7 -0
  31. package/dist/callbacks/getQueryKey.d.ts.map +1 -0
  32. package/dist/callbacks/getQueryKey.js +4 -0
  33. package/dist/callbacks/getQueryKey.js.map +1 -0
  34. package/dist/callbacks/mutationFn.d.ts +4 -0
  35. package/dist/callbacks/mutationFn.d.ts.map +1 -0
  36. package/dist/callbacks/mutationFn.js +8 -0
  37. package/dist/callbacks/mutationFn.js.map +1 -0
  38. package/dist/callbacks/queryFn.d.ts +15 -0
  39. package/dist/callbacks/queryFn.d.ts.map +1 -0
  40. package/dist/callbacks/queryFn.js +10 -0
  41. package/dist/callbacks/queryFn.js.map +1 -0
  42. package/dist/callbacks/setInfiniteQueryData.d.ts +6 -0
  43. package/dist/callbacks/setInfiniteQueryData.d.ts.map +1 -0
  44. package/dist/callbacks/setInfiniteQueryData.js +6 -0
  45. package/dist/callbacks/setInfiniteQueryData.js.map +1 -0
  46. package/dist/callbacks/setQueryData.d.ts +5 -0
  47. package/dist/callbacks/setQueryData.d.ts.map +1 -0
  48. package/dist/callbacks/setQueryData.js +9 -0
  49. package/dist/callbacks/setQueryData.js.map +1 -0
  50. package/dist/callbacks/useInfiniteQuery.d.ts +13 -0
  51. package/dist/callbacks/useInfiniteQuery.d.ts.map +1 -0
  52. package/dist/callbacks/useInfiniteQuery.js +50 -0
  53. package/dist/callbacks/useInfiniteQuery.js.map +1 -0
  54. package/dist/callbacks/useMutation.d.ts +7 -0
  55. package/dist/callbacks/useMutation.d.ts.map +1 -0
  56. package/dist/callbacks/useMutation.js +51 -0
  57. package/dist/callbacks/useMutation.js.map +1 -0
  58. package/dist/callbacks/useQuery.d.ts +9 -0
  59. package/dist/callbacks/useQuery.d.ts.map +1 -0
  60. package/dist/callbacks/useQuery.js +27 -0
  61. package/dist/callbacks/useQuery.js.map +1 -0
  62. package/dist/index.d.ts +9 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +4 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/lib/createCallbackProxyDecoration.d.ts +5 -0
  67. package/dist/lib/createCallbackProxyDecoration.d.ts.map +1 -0
  68. package/dist/lib/createCallbackProxyDecoration.js +21 -0
  69. package/dist/lib/createCallbackProxyDecoration.js.map +1 -0
  70. package/dist/lib/createRecursiveProxy.d.ts +7 -0
  71. package/dist/lib/createRecursiveProxy.d.ts.map +1 -0
  72. package/dist/lib/createRecursiveProxy.js +24 -0
  73. package/dist/lib/createRecursiveProxy.js.map +1 -0
  74. package/dist/lib/request.d.ts +32 -0
  75. package/dist/lib/request.d.ts.map +1 -0
  76. package/dist/lib/request.js +167 -0
  77. package/dist/lib/request.js.map +1 -0
  78. package/dist/qraftAPIClient.d.ts +25 -0
  79. package/dist/qraftAPIClient.d.ts.map +1 -0
  80. package/dist/qraftAPIClient.js +22 -0
  81. package/dist/qraftAPIClient.js.map +1 -0
  82. package/package.json +79 -0
  83. package/src/QraftContext.ts +12 -0
  84. package/src/RequestClient.ts +32 -0
  85. package/src/ServiceOperation.ts +306 -0
  86. package/src/callbacks/getInfiniteQueryData.ts +26 -0
  87. package/src/callbacks/getInfiniteQueryKey.ts +23 -0
  88. package/src/callbacks/getMutationKey.ts +47 -0
  89. package/src/callbacks/getQueryData.ts +20 -0
  90. package/src/callbacks/getQueryKey.ts +19 -0
  91. package/src/callbacks/mutationFn.ts +22 -0
  92. package/src/callbacks/queryFn.ts +21 -0
  93. package/src/callbacks/setInfiniteQueryData.ts +29 -0
  94. package/src/callbacks/setQueryData.ts +23 -0
  95. package/src/callbacks/shelfMerge.test.ts +94 -0
  96. package/src/callbacks/useInfiniteQuery.ts +88 -0
  97. package/src/callbacks/useMutation.ts +100 -0
  98. package/src/callbacks/useQuery.ts +56 -0
  99. package/src/index.ts +11 -0
  100. package/src/lib/createCallbackProxyDecoration.ts +34 -0
  101. package/src/lib/createRecursiveProxy.ts +27 -0
  102. package/src/lib/request.ts +252 -0
  103. package/src/mocks/handlers.ts +252 -0
  104. package/src/mocks/node.ts +5 -0
  105. package/src/qraftAPIClient.test.tsx +595 -0
  106. package/src/qraftAPIClient.ts +77 -0
  107. package/src/setupTests.ts +17 -0
@@ -0,0 +1,25 @@
1
+ import { Context } from 'react';
2
+ import { QraftContextValue } from './QraftContext.js';
3
+ import type { RequestClientSchema } from './RequestClient.js';
4
+ export type QraftClientOptions = {
5
+ context?: Context<QraftContextValue>;
6
+ };
7
+ export declare const qraftAPIClient: <Services extends { [service in keyof Services]: { [method in keyof Services[service]]: {
8
+ schema: RequestClientSchema;
9
+ }; }; }, Callbacks extends Record<string, (...rest: any[]) => any>>(services: { [service_1 in keyof Services]: { [method_1 in keyof Services[service_1]]: {
10
+ schema: Services[service_1][method_1]["schema"];
11
+ }; }; }, callbacks: Callbacks, options?: QraftClientOptions) => ServicesCallbacksFilter<Services, keyof Callbacks>;
12
+ type ServicesCallbacksFilter<Services, Callbacks> = Services extends {
13
+ [serviceName in keyof Services]: {
14
+ [method in keyof Services[serviceName]]: {
15
+ schema: RequestClientSchema;
16
+ };
17
+ };
18
+ } ? {
19
+ [serviceName in keyof Services]: {
20
+ [method in keyof Services[serviceName]]: Pick<Services[serviceName][method], FilterKeys<keyof Services[serviceName][method], Callbacks | 'schema'>>;
21
+ };
22
+ } : never;
23
+ type FilterKeys<T, K> = K extends T ? K : never;
24
+ export {};
25
+ //# sourceMappingURL=qraftAPIClient.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qraftAPIClient.d.ts","sourceRoot":"","sources":["../src/qraftAPIClient.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AAGhC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE9D,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,CAAC,EAAE,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACtC,CAAC;AAEF,eAAO,MAAM,cAAc;YAG0B,mBAAmB;oDAG3B,GAAG,EAAE,KAAK,GAAG;;yCAU9C,kBAAkB,uDAoB7B,CAAC;AAeF,KAAK,uBAAuB,CAAC,QAAQ,EAAE,SAAS,IAAI,QAAQ,SAAS;KAClE,WAAW,IAAI,MAAM,QAAQ,GAAG;SAC9B,MAAM,IAAI,MAAM,QAAQ,CAAC,WAAW,CAAC,GAAG;YAAE,MAAM,EAAE,mBAAmB,CAAA;SAAE;KACzE;CACF,GACG;KACG,WAAW,IAAI,MAAM,QAAQ,GAAG;SAC9B,MAAM,IAAI,MAAM,QAAQ,CAAC,WAAW,CAAC,GAAG,IAAI,CAC3C,QAAQ,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,EAC7B,UAAU,CAAC,MAAM,QAAQ,CAAC,WAAW,CAAC,CAAC,MAAM,CAAC,EAAE,SAAS,GAAG,QAAQ,CAAC,CACtE;KACF;CACF,GACD,KAAK,CAAC;AAEV,KAAK,UAAU,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { createCallbackProxyDecoration } from './lib/createCallbackProxyDecoration.js';
2
+ export const qraftAPIClient = (services, callbacks, options) => {
3
+ return createCallbackProxyDecoration(Object.keys(callbacks), (path, functionName, args) => {
4
+ const serviceOperation = getByPath(services, path);
5
+ if (!isServiceOperation(serviceOperation))
6
+ throw new Error(`Service operation not found: ${path.join('.')}`);
7
+ if (functionName in callbacks) {
8
+ return callbacks[functionName](options, serviceOperation.schema, args);
9
+ }
10
+ throw new Error(`Not supported API method: ${String(functionName)}`);
11
+ });
12
+ };
13
+ function isServiceOperation(input) {
14
+ return input !== null && typeof input === 'object' && 'schema' in input;
15
+ }
16
+ function getByPath(obj, path) {
17
+ return path.reduce((acc, key) => {
18
+ if (acc && typeof acc === 'object' && key in acc)
19
+ return acc[key];
20
+ }, obj);
21
+ }
22
+ //# sourceMappingURL=qraftAPIClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qraftAPIClient.js","sourceRoot":"","sources":["../src/qraftAPIClient.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,6BAA6B,EAAE,MAAM,wCAAwC,CAAC;AAQvF,MAAM,CAAC,MAAM,cAAc,GAAG,CAQ5B,QAMC,EACD,SAAoB,EACpB,OAA4B,EACwB,EAAE;IACtD,OAAO,6BAA6B,CAClC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,EACtB,CAAC,IAAI,EAAE,YAAY,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,gBAAgB,GAAG,SAAS,CAAC,QAAQ,EAAE,IAAI,CAAC,CAAC;QACnD,IAAI,CAAC,kBAAkB,CAAC,gBAAgB,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAEpE,IAAI,YAAY,IAAI,SAAS,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAC,YAA+B,CAAC,CAC/C,OAAO,EACP,gBAAgB,CAAC,MAAM,EACvB,IAAI,CACL,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,KAAK,CAAC,6BAA6B,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;IACvE,CAAC,CACO,CAAC;AACb,CAAC,CAAC;AAEF,SAAS,kBAAkB,CACzB,KAAc;IAEd,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,QAAQ,IAAI,KAAK,CAAC;AAC1E,CAAC;AAED,SAAS,SAAS,CAAC,GAA4B,EAAE,IAAc;IAC7D,OAAO,IAAI,CAAC,MAAM,CAAU,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;QACvC,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,IAAI,GAAG;YAC9C,OAAO,GAAG,CAAC,GAAuB,CAAC,CAAC;IACxC,CAAC,EAAE,GAAG,CAAC,CAAC;AACV,CAAC"}
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "@openapi-qraft/react",
3
+ "version": "1.0.0-beta.0",
4
+ "description": "API client for React, providing type-safe requests and dynamic Tanstack Query React Hooks via a modular, Proxy-based architecture.",
5
+ "scripts": {
6
+ "build": "rimraf dist/ && tsc --project tsconfig.build.json",
7
+ "dev": "rimraf dist/ && tsc --project tsconfig.dev.json --watch",
8
+ "test": "vitest run",
9
+ "typecheck": "tsc --noEmit",
10
+ "generate-qraft": "openapi-qraft ./src/fixtures/openapi.json --clean -o src/fixtures/api --openapi-types-import-path '../../openapi.js' --explicit-import-extensions",
11
+ "generate-types": "openapi-qraft-typescript ./src/fixtures/openapi.json -o src/fixtures/openapi.ts"
12
+ },
13
+ "type": "module",
14
+ "sideEffects": false,
15
+ "devDependencies": {
16
+ "@openapi-qraft/cli": "~1.0.0-beta.0",
17
+ "@openapi-qraft/openapi-typescript": "^1.0.0-beta.0",
18
+ "@tanstack/react-query": "^5.17.3",
19
+ "@testing-library/jest-dom": "^5.17.0",
20
+ "@testing-library/react": "^13.4.0",
21
+ "@testing-library/user-event": "^14.5.2",
22
+ "@types/react": "^18.2.47",
23
+ "@vitejs/plugin-react": "latest",
24
+ "@vitest/coverage-v8": "^1.1.3",
25
+ "jsdom": "latest",
26
+ "msw": "^2.0.12",
27
+ "query-string": "^8.1.0",
28
+ "react": "^18.2.0",
29
+ "rimraf": "^5.0.5",
30
+ "vitest": "^1.1.3"
31
+ },
32
+ "peerDependencies": {
33
+ "@tanstack/query-core": "^5.0.0",
34
+ "@tanstack/react-query": "^5.0.0",
35
+ "react": "^18.0.0"
36
+ },
37
+ "files": [
38
+ "dist",
39
+ "src",
40
+ "!dist/fixtures/**",
41
+ "!src/fixtures/**"
42
+ ],
43
+ "exports": {
44
+ "./package.json": "./package.json",
45
+ ".": "./dist/index.js",
46
+ "./*": "./dist/*.js"
47
+ },
48
+ "typesVersions": {
49
+ "*": {
50
+ "*": [
51
+ "dist/*"
52
+ ]
53
+ }
54
+ },
55
+ "repository": {
56
+ "type": "git",
57
+ "url": "git+https://github.com/OpenAPI-Qraft/openapi-qraft.git",
58
+ "directory": "packages/react-client"
59
+ },
60
+ "bugs": {
61
+ "url": "https://github.com/OpenAPI-Qraft/openapi-qraft/issues"
62
+ },
63
+ "keywords": [
64
+ "openapi",
65
+ "swagger",
66
+ "rest",
67
+ "api",
68
+ "oapi_3",
69
+ "oapi_3_1",
70
+ "typescript",
71
+ "fetch",
72
+ "react",
73
+ "hooks",
74
+ "react-query"
75
+ ],
76
+ "publishConfig": {
77
+ "access": "public"
78
+ }
79
+ }
@@ -0,0 +1,12 @@
1
+ import { createContext } from 'react';
2
+
3
+ import type { RequestClient } from './RequestClient.js';
4
+
5
+ export type QraftContextValue =
6
+ | {
7
+ /** The request client to use for making requests. Will be invoked with every request. */
8
+ requestClient: RequestClient;
9
+ }
10
+ | undefined;
11
+
12
+ export const QraftContext = createContext<QraftContextValue>(undefined);
@@ -0,0 +1,32 @@
1
+ export type RequestClient = <T>(
2
+ schema: RequestClientSchema,
3
+ options: RequestClientOptions
4
+ ) => Promise<T>;
5
+
6
+ export type RequestClientSchema = {
7
+ url: string;
8
+ method:
9
+ | 'get'
10
+ | 'put'
11
+ | 'post'
12
+ | 'patch'
13
+ | 'delete'
14
+ | 'options'
15
+ | 'head'
16
+ | 'trace';
17
+ mediaType?: string;
18
+ };
19
+
20
+ export type RequestClientOptions = {
21
+ body?: BodyInit | Record<string, unknown> | null;
22
+ parameters?: RequestClientParams;
23
+ signal?: AbortSignal;
24
+ meta?: Record<string, unknown>;
25
+ };
26
+
27
+ export type RequestClientParams = {
28
+ header?: Record<string, any>;
29
+ path?: Record<string, any>;
30
+ query?: Record<string, any>;
31
+ cookie?: Record<string, any>;
32
+ };
@@ -0,0 +1,306 @@
1
+ import {
2
+ DefaultError,
3
+ InfiniteData,
4
+ QueryClient,
5
+ InfiniteQueryPageParamsOptions,
6
+ NoInfer,
7
+ SetDataOptions,
8
+ Updater,
9
+ } from '@tanstack/query-core';
10
+ import type {
11
+ DefinedInitialDataInfiniteOptions,
12
+ DefinedInitialDataOptions,
13
+ DefinedUseInfiniteQueryResult,
14
+ DefinedUseQueryResult,
15
+ UndefinedInitialDataInfiniteOptions,
16
+ UndefinedInitialDataOptions,
17
+ UseInfiniteQueryResult,
18
+ UseMutationOptions,
19
+ UseMutationResult,
20
+ UseQueryResult,
21
+ } from '@tanstack/react-query';
22
+
23
+ export type ServiceOperationQueryKey<S extends { url: string }, T> = [
24
+ Pick<S, 'url'>,
25
+ T,
26
+ ];
27
+
28
+ export type ServiceOperationInfiniteQueryKey<S extends { url: string }, T> = [
29
+ Pick<S, 'url'> & { infinite: true },
30
+ T,
31
+ ];
32
+
33
+ export type ServiceOperationMutationKey<
34
+ S extends Record<'url' | 'method', string>,
35
+ T,
36
+ > = [Pick<S, 'url' | 'method'>, T];
37
+
38
+ export interface ServiceOperationQuery<
39
+ TSchema extends { url: string; method: string },
40
+ TData,
41
+ TParams,
42
+ TError = DefaultError,
43
+ > extends ServiceOperationUseQuery<TSchema, TData, TParams, TError>,
44
+ ServiceOperationUseInfiniteQuery<TSchema, TData, TParams, TError>,
45
+ ServiceOperationQueryFn<TSchema, TData, TParams>,
46
+ ServiceOperationGetQueryData<TData, TParams>,
47
+ ServiceOperationGetInfiniteQueryData<TData, TParams>,
48
+ ServiceOperationSetQueryData<TData, TParams>,
49
+ ServiceOperationSetInfiniteQueryData<TData, TParams> {
50
+ schema: TSchema;
51
+ }
52
+
53
+ interface ServiceOperationUseQuery<
54
+ TSchema extends { url: string; method: string },
55
+ TData,
56
+ TParams = {},
57
+ TError = DefaultError,
58
+ > {
59
+ getQueryKey<QueryKeyParams extends TParams>(
60
+ params: QueryKeyParams
61
+ ): ServiceOperationQueryKey<TSchema, QueryKeyParams>;
62
+
63
+ useQuery(
64
+ params: TParams,
65
+ options?: Omit<
66
+ UndefinedInitialDataOptions<
67
+ TData,
68
+ TError,
69
+ TData,
70
+ | ServiceOperationQueryKey<TSchema, TParams>
71
+ | readonly [...ServiceOperationQueryKey<TSchema, TParams>]
72
+ >,
73
+ 'queryKey'
74
+ >,
75
+ queryClient?: QueryClient
76
+ ): UseQueryResult<TData, TError | Error>;
77
+ useQuery(
78
+ params: TParams,
79
+ options: Omit<
80
+ DefinedInitialDataOptions<
81
+ TData,
82
+ TError,
83
+ TData,
84
+ | ServiceOperationQueryKey<TSchema, TParams>
85
+ | readonly [...ServiceOperationQueryKey<TSchema, TParams>]
86
+ >,
87
+ 'queryKey'
88
+ >,
89
+ queryClient?: QueryClient
90
+ ): DefinedUseQueryResult<TData, TError | Error>;
91
+ }
92
+
93
+ type PartialParams<T> = T extends object
94
+ ? { [K in keyof T]?: T[K] extends object ? Partial<T[K]> : T[K] }
95
+ : T;
96
+
97
+ interface ServiceOperationUseInfiniteQuery<
98
+ TSchema extends { url: string; method: string },
99
+ TData,
100
+ TParams = {},
101
+ TError = DefaultError,
102
+ > {
103
+ getInfiniteQueryKey<QueryKeyParams extends TParams>(
104
+ params: QueryKeyParams
105
+ ): ServiceOperationInfiniteQueryKey<TSchema, QueryKeyParams>;
106
+
107
+ useInfiniteQuery<TPageParam extends TParams>(
108
+ params: TParams,
109
+ options: Omit<
110
+ UndefinedInitialDataInfiniteOptions<
111
+ TData,
112
+ TError,
113
+ InfiniteData<TData>,
114
+ | ServiceOperationInfiniteQueryKey<TSchema, TParams>
115
+ | readonly [...ServiceOperationInfiniteQueryKey<TSchema, TParams>],
116
+ PartialParams<TPageParam>
117
+ >,
118
+ | 'queryKey'
119
+ | 'getPreviousPageParam'
120
+ | 'getNextPageParam'
121
+ | 'initialPageParam'
122
+ > &
123
+ InfiniteQueryPageParamsOptions<TData, PartialParams<TPageParam>>,
124
+ queryClient?: QueryClient
125
+ ): UseInfiniteQueryResult<InfiniteData<TData>, TError | Error>;
126
+ useInfiniteQuery<TPageParam extends TParams>(
127
+ params: TParams,
128
+ options: Omit<
129
+ DefinedInitialDataInfiniteOptions<
130
+ TData,
131
+ TError,
132
+ InfiniteData<TData>,
133
+ | ServiceOperationInfiniteQueryKey<TSchema, TParams>
134
+ | readonly [...ServiceOperationInfiniteQueryKey<TSchema, TParams>],
135
+ PartialParams<TPageParam>
136
+ >,
137
+ | 'queryKey'
138
+ | 'getPreviousPageParam'
139
+ | 'getNextPageParam'
140
+ | 'initialPageParam'
141
+ > &
142
+ InfiniteQueryPageParamsOptions<TData, PartialParams<TPageParam>>,
143
+ queryClient?: QueryClient
144
+ ): DefinedUseInfiniteQueryResult<InfiniteData<TData>, TError | Error>;
145
+ }
146
+
147
+ export interface ServiceOperationMutation<
148
+ TSchema extends { url: string; method: string },
149
+ TBody,
150
+ TData,
151
+ TParams,
152
+ TError = DefaultError,
153
+ > extends ServiceOperationUseMutation<TSchema, TBody, TData, TParams, TError>,
154
+ ServiceOperationMutationFn<TSchema, TBody, TData, TParams>,
155
+ ServiceOperationSetQueryData<TData, TParams> {
156
+ schema: TSchema;
157
+ }
158
+
159
+ interface ServiceOperationUseMutation<
160
+ TSchema extends { url: string; method: string },
161
+ TBody,
162
+ TData,
163
+ TParams,
164
+ TError = DefaultError,
165
+ > {
166
+ getMutationKey<T extends TParams>(
167
+ params: T
168
+ ): ServiceOperationMutationKey<TSchema, T>;
169
+
170
+ useMutation<
171
+ TVariables extends { body: TBody } & (NonNullable<TParams> extends never
172
+ ? {}
173
+ : TParams),
174
+ TContext = unknown,
175
+ >(
176
+ params?: undefined,
177
+ options?: Omit<
178
+ UseMutationOptions<TData, TError, TVariables, TContext>,
179
+ 'mutationKey'
180
+ > & {
181
+ mutationKey?: ServiceOperationMutationKey<
182
+ TSchema,
183
+ NonNullable<TParams> extends never ? {} : TParams
184
+ >;
185
+ },
186
+ queryClient?: QueryClient
187
+ ): UseMutationResult<TData, TError | Error, TVariables, TContext>;
188
+
189
+ useMutation<TVariables extends TBody, TContext = unknown>(
190
+ params: TParams,
191
+ options?: Omit<
192
+ UseMutationOptions<TData, TError, TVariables, TContext>,
193
+ 'mutationKey'
194
+ >,
195
+ queryClient?: QueryClient
196
+ ): UseMutationResult<TData, TError | Error, TVariables, TContext>;
197
+ }
198
+
199
+ interface ServiceOperationQueryFn<
200
+ TSchema extends { url: string; method: string },
201
+ TData,
202
+ TParams,
203
+ > {
204
+ queryFn<
205
+ TMeta extends Record<string, any>,
206
+ TSignal extends AbortSignal = AbortSignal,
207
+ >(
208
+ options: { signal?: TSignal; meta?: TMeta } & (
209
+ | { queryKey: [unknown, TParams] }
210
+ | { parameters: TParams }
211
+ ),
212
+ client: (
213
+ schema: TSchema,
214
+ options: {
215
+ parameters: TParams;
216
+ signal?: TSignal;
217
+ meta?: TMeta;
218
+ }
219
+ ) => TData
220
+ ): TData;
221
+
222
+ queryFn<
223
+ TMeta extends Record<string, any>,
224
+ TSignal extends AbortSignal = AbortSignal,
225
+ >(
226
+ options: { signal?: TSignal; meta?: TMeta } & (
227
+ | { queryKey: [unknown, TParams] }
228
+ | { parameters: TParams }
229
+ ),
230
+ client: (
231
+ schema: TSchema,
232
+ options: {
233
+ parameters: TParams;
234
+ signal?: TSignal;
235
+ meta?: TMeta;
236
+ }
237
+ ) => Promise<TData>
238
+ ): Promise<TData>;
239
+ }
240
+
241
+ interface ServiceOperationSetQueryData<TData, TParams = {}> {
242
+ setQueryData(
243
+ queryKey: TParams,
244
+ updater: Updater<NoInfer<TData> | undefined, NoInfer<TData> | undefined>,
245
+ queryClient: QueryClient,
246
+ options?: SetDataOptions
247
+ ): TData | undefined;
248
+ }
249
+
250
+ interface ServiceOperationSetInfiniteQueryData<TData, TParams = {}> {
251
+ setInfiniteQueryData(
252
+ queryKey: TParams,
253
+ updater: Updater<
254
+ NoInfer<InfiniteData<TData>> | undefined,
255
+ NoInfer<InfiniteData<TData>> | undefined
256
+ >,
257
+ queryClient: QueryClient,
258
+ options?: SetDataOptions
259
+ ): InfiniteData<TData> | undefined;
260
+ }
261
+
262
+ interface ServiceOperationGetQueryData<TData, TParams = {}> {
263
+ getQueryData(queryKey: TParams, queryClient: QueryClient): TData | undefined;
264
+ }
265
+
266
+ interface ServiceOperationGetInfiniteQueryData<TData, TParams = {}> {
267
+ getInfiniteQueryData(
268
+ queryKey: TParams,
269
+ queryClient: QueryClient
270
+ ): InfiniteData<TData> | undefined;
271
+ }
272
+
273
+ export interface ServiceOperationMutationFn<
274
+ TSchema extends { url: string; method: string },
275
+ TBody,
276
+ TData,
277
+ TParams,
278
+ > {
279
+ mutationFn(
280
+ client: (
281
+ schema: TSchema,
282
+ options: {
283
+ parameters: TParams;
284
+ body: TBody;
285
+ }
286
+ ) => TData,
287
+ options: {
288
+ parameters: TParams;
289
+ body: TBody;
290
+ }
291
+ ): TData;
292
+
293
+ mutationFn(
294
+ client: (
295
+ schema: TSchema,
296
+ options: {
297
+ parameters: TParams;
298
+ body: TBody;
299
+ }
300
+ ) => Promise<TData>,
301
+ options: {
302
+ parameters: TParams;
303
+ body: TBody;
304
+ }
305
+ ): Promise<TData>;
306
+ }
@@ -0,0 +1,26 @@
1
+ import { InfiniteData } from '@tanstack/query-core';
2
+
3
+ import type { QraftClientOptions } from '../qraftAPIClient.js';
4
+ import type { RequestClientSchema } from '../RequestClient.js';
5
+ import {
6
+ ServiceOperationInfiniteQueryKey,
7
+ ServiceOperationQuery,
8
+ } from '../ServiceOperation.js';
9
+
10
+ export function getInfiniteQueryData<TData>(
11
+ qraftOptions: QraftClientOptions | undefined,
12
+ schema: RequestClientSchema,
13
+ args: Parameters<
14
+ ServiceOperationQuery<
15
+ RequestClientSchema,
16
+ unknown,
17
+ TData
18
+ >['getInfiniteQueryData']
19
+ >
20
+ ): InfiniteData<TData> | undefined {
21
+ const [params, queryClient] = args;
22
+ return queryClient.getQueryData([
23
+ { url: schema.url, infinite: true },
24
+ params,
25
+ ] satisfies ServiceOperationInfiniteQueryKey<RequestClientSchema, unknown>);
26
+ }
@@ -0,0 +1,23 @@
1
+ import type { QraftClientOptions } from '../qraftAPIClient.js';
2
+ import type { RequestClientSchema } from '../RequestClient.js';
3
+ import {
4
+ ServiceOperationInfiniteQueryKey,
5
+ ServiceOperationQuery,
6
+ } from '../ServiceOperation.js';
7
+
8
+ export const getInfiniteQueryKey = (
9
+ qraftOptions: QraftClientOptions | undefined,
10
+ schema: RequestClientSchema,
11
+ args: Parameters<
12
+ ServiceOperationQuery<
13
+ RequestClientSchema,
14
+ unknown,
15
+ unknown
16
+ >['getInfiniteQueryKey']
17
+ >
18
+ ) => {
19
+ return [
20
+ { url: schema.url, infinite: true },
21
+ args[0],
22
+ ] satisfies ServiceOperationInfiniteQueryKey<RequestClientSchema, unknown>;
23
+ };
@@ -0,0 +1,47 @@
1
+ import type { QraftClientOptions } from '../qraftAPIClient.js';
2
+ import type { RequestClientSchema } from '../RequestClient.js';
3
+ import {
4
+ ServiceOperationMutation,
5
+ ServiceOperationMutationKey,
6
+ } from '../ServiceOperation.js';
7
+
8
+ export const getMutationKey = (
9
+ qraftOptions: QraftClientOptions | undefined,
10
+ schema: RequestClientSchema,
11
+ args: unknown
12
+ ) => {
13
+ const [parameters] = args as Parameters<
14
+ ServiceOperationMutation<
15
+ RequestClientSchema,
16
+ unknown,
17
+ unknown,
18
+ unknown
19
+ >['getMutationKey']
20
+ >;
21
+
22
+ const key: ServiceOperationMutationKey<RequestClientSchema, unknown> = [
23
+ {
24
+ url: schema.url,
25
+ method: schema.method,
26
+ },
27
+ omitMutationPayload(parameters),
28
+ ];
29
+
30
+ return key;
31
+ };
32
+
33
+ function omitMutationPayload<T>(params: T) {
34
+ if (!params || typeof params !== 'object')
35
+ throw new Error('`params` must be object');
36
+
37
+ if ('body' in params || 'requestBody' in params) {
38
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
39
+ const { body, requestBody, ...paramsRest } = params as Record<
40
+ 'body' | 'requestBody',
41
+ unknown
42
+ >;
43
+ return paramsRest;
44
+ }
45
+
46
+ return params as Omit<T, 'body' | 'requestBody'>;
47
+ }
@@ -0,0 +1,20 @@
1
+ import type { QraftClientOptions } from '../qraftAPIClient.js';
2
+ import type { RequestClientSchema } from '../RequestClient.js';
3
+ import {
4
+ ServiceOperationQuery,
5
+ ServiceOperationQueryKey,
6
+ } from '../ServiceOperation.js';
7
+
8
+ export function getQueryData<TData>(
9
+ qraftOptions: QraftClientOptions | undefined,
10
+ schema: RequestClientSchema,
11
+ args: Parameters<
12
+ ServiceOperationQuery<RequestClientSchema, unknown, TData>['getQueryData']
13
+ >
14
+ ): TData | undefined {
15
+ const [params, queryClient] = args;
16
+ return queryClient.getQueryData([
17
+ { url: schema.url },
18
+ params,
19
+ ] satisfies ServiceOperationQueryKey<RequestClientSchema, unknown>);
20
+ }
@@ -0,0 +1,19 @@
1
+ import type { QraftClientOptions } from '../qraftAPIClient.js';
2
+ import type { RequestClientSchema } from '../RequestClient.js';
3
+ import {
4
+ ServiceOperationQuery,
5
+ ServiceOperationQueryKey,
6
+ } from '../ServiceOperation.js';
7
+
8
+ export const getQueryKey = (
9
+ qraftOptions: QraftClientOptions | undefined,
10
+ schema: RequestClientSchema,
11
+ args: Parameters<
12
+ ServiceOperationQuery<RequestClientSchema, unknown, unknown>['getQueryKey']
13
+ >
14
+ ) => {
15
+ return [{ url: schema.url }, args[0]] satisfies ServiceOperationQueryKey<
16
+ RequestClientSchema,
17
+ unknown
18
+ >;
19
+ };
@@ -0,0 +1,22 @@
1
+ import type { QraftClientOptions } from '../qraftAPIClient.js';
2
+ import type { RequestClientSchema } from '../RequestClient.js';
3
+ import { ServiceOperationMutation } from '../ServiceOperation.js';
4
+
5
+ export const mutationFn = (
6
+ qraftOptions: QraftClientOptions | undefined,
7
+ schema: RequestClientSchema,
8
+ args: unknown
9
+ ) => {
10
+ const [client, options] = args as Parameters<
11
+ ServiceOperationMutation<
12
+ RequestClientSchema,
13
+ unknown,
14
+ unknown,
15
+ never
16
+ >['mutationFn']
17
+ >;
18
+ return client(schema, {
19
+ parameters: options.parameters,
20
+ body: options.body,
21
+ });
22
+ };
@@ -0,0 +1,21 @@
1
+ import type { QraftClientOptions } from '../qraftAPIClient.js';
2
+ import type { RequestClientSchema } from '../RequestClient.js';
3
+ import { ServiceOperationQuery } from '../ServiceOperation.js';
4
+
5
+ export const queryFn = (
6
+ qraftOptions: QraftClientOptions | undefined,
7
+ schema: RequestClientSchema,
8
+ args: Parameters<
9
+ ServiceOperationQuery<RequestClientSchema, unknown, never>['queryFn']
10
+ >
11
+ ) => {
12
+ const [options, client] = args;
13
+ const parameters =
14
+ 'queryKey' in options ? options.queryKey[1] : options.parameters;
15
+
16
+ return client(schema, {
17
+ parameters,
18
+ meta: options.meta,
19
+ signal: options.signal,
20
+ });
21
+ };