@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.
- package/README.md +287 -0
- package/dist/QraftContext.d.ts +8 -0
- package/dist/QraftContext.d.ts.map +1 -0
- package/dist/QraftContext.js +3 -0
- package/dist/QraftContext.js.map +1 -0
- package/dist/RequestClient.d.ts +19 -0
- package/dist/RequestClient.d.ts.map +1 -0
- package/dist/RequestClient.js +2 -0
- package/dist/RequestClient.js.map +1 -0
- package/dist/ServiceOperation.d.ts +122 -0
- package/dist/ServiceOperation.d.ts.map +1 -0
- package/dist/ServiceOperation.js +2 -0
- package/dist/ServiceOperation.js.map +1 -0
- package/dist/callbacks/getInfiniteQueryData.d.ts +6 -0
- package/dist/callbacks/getInfiniteQueryData.d.ts.map +1 -0
- package/dist/callbacks/getInfiniteQueryData.js +8 -0
- package/dist/callbacks/getInfiniteQueryData.js.map +1 -0
- package/dist/callbacks/getInfiniteQueryKey.d.ts +8 -0
- package/dist/callbacks/getInfiniteQueryKey.d.ts.map +1 -0
- package/dist/callbacks/getInfiniteQueryKey.js +7 -0
- package/dist/callbacks/getInfiniteQueryKey.js.map +1 -0
- package/dist/callbacks/getMutationKey.d.ts +5 -0
- package/dist/callbacks/getMutationKey.d.ts.map +1 -0
- package/dist/callbacks/getMutationKey.js +22 -0
- package/dist/callbacks/getMutationKey.js.map +1 -0
- package/dist/callbacks/getQueryData.d.ts +5 -0
- package/dist/callbacks/getQueryData.d.ts.map +1 -0
- package/dist/callbacks/getQueryData.js +8 -0
- package/dist/callbacks/getQueryData.js.map +1 -0
- package/dist/callbacks/getQueryKey.d.ts +7 -0
- package/dist/callbacks/getQueryKey.d.ts.map +1 -0
- package/dist/callbacks/getQueryKey.js +4 -0
- package/dist/callbacks/getQueryKey.js.map +1 -0
- package/dist/callbacks/mutationFn.d.ts +4 -0
- package/dist/callbacks/mutationFn.d.ts.map +1 -0
- package/dist/callbacks/mutationFn.js +8 -0
- package/dist/callbacks/mutationFn.js.map +1 -0
- package/dist/callbacks/queryFn.d.ts +15 -0
- package/dist/callbacks/queryFn.d.ts.map +1 -0
- package/dist/callbacks/queryFn.js +10 -0
- package/dist/callbacks/queryFn.js.map +1 -0
- package/dist/callbacks/setInfiniteQueryData.d.ts +6 -0
- package/dist/callbacks/setInfiniteQueryData.d.ts.map +1 -0
- package/dist/callbacks/setInfiniteQueryData.js +6 -0
- package/dist/callbacks/setInfiniteQueryData.js.map +1 -0
- package/dist/callbacks/setQueryData.d.ts +5 -0
- package/dist/callbacks/setQueryData.d.ts.map +1 -0
- package/dist/callbacks/setQueryData.js +9 -0
- package/dist/callbacks/setQueryData.js.map +1 -0
- package/dist/callbacks/useInfiniteQuery.d.ts +13 -0
- package/dist/callbacks/useInfiniteQuery.d.ts.map +1 -0
- package/dist/callbacks/useInfiniteQuery.js +50 -0
- package/dist/callbacks/useInfiniteQuery.js.map +1 -0
- package/dist/callbacks/useMutation.d.ts +7 -0
- package/dist/callbacks/useMutation.d.ts.map +1 -0
- package/dist/callbacks/useMutation.js +51 -0
- package/dist/callbacks/useMutation.js.map +1 -0
- package/dist/callbacks/useQuery.d.ts +9 -0
- package/dist/callbacks/useQuery.d.ts.map +1 -0
- package/dist/callbacks/useQuery.js +27 -0
- package/dist/callbacks/useQuery.js.map +1 -0
- package/dist/index.d.ts +9 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -0
- package/dist/lib/createCallbackProxyDecoration.d.ts +5 -0
- package/dist/lib/createCallbackProxyDecoration.d.ts.map +1 -0
- package/dist/lib/createCallbackProxyDecoration.js +21 -0
- package/dist/lib/createCallbackProxyDecoration.js.map +1 -0
- package/dist/lib/createRecursiveProxy.d.ts +7 -0
- package/dist/lib/createRecursiveProxy.d.ts.map +1 -0
- package/dist/lib/createRecursiveProxy.js +24 -0
- package/dist/lib/createRecursiveProxy.js.map +1 -0
- package/dist/lib/request.d.ts +32 -0
- package/dist/lib/request.d.ts.map +1 -0
- package/dist/lib/request.js +167 -0
- package/dist/lib/request.js.map +1 -0
- package/dist/qraftAPIClient.d.ts +25 -0
- package/dist/qraftAPIClient.d.ts.map +1 -0
- package/dist/qraftAPIClient.js +22 -0
- package/dist/qraftAPIClient.js.map +1 -0
- package/package.json +79 -0
- package/src/QraftContext.ts +12 -0
- package/src/RequestClient.ts +32 -0
- package/src/ServiceOperation.ts +306 -0
- package/src/callbacks/getInfiniteQueryData.ts +26 -0
- package/src/callbacks/getInfiniteQueryKey.ts +23 -0
- package/src/callbacks/getMutationKey.ts +47 -0
- package/src/callbacks/getQueryData.ts +20 -0
- package/src/callbacks/getQueryKey.ts +19 -0
- package/src/callbacks/mutationFn.ts +22 -0
- package/src/callbacks/queryFn.ts +21 -0
- package/src/callbacks/setInfiniteQueryData.ts +29 -0
- package/src/callbacks/setQueryData.ts +23 -0
- package/src/callbacks/shelfMerge.test.ts +94 -0
- package/src/callbacks/useInfiniteQuery.ts +88 -0
- package/src/callbacks/useMutation.ts +100 -0
- package/src/callbacks/useQuery.ts +56 -0
- package/src/index.ts +11 -0
- package/src/lib/createCallbackProxyDecoration.ts +34 -0
- package/src/lib/createRecursiveProxy.ts +27 -0
- package/src/lib/request.ts +252 -0
- package/src/mocks/handlers.ts +252 -0
- package/src/mocks/node.ts +5 -0
- package/src/qraftAPIClient.test.tsx +595 -0
- package/src/qraftAPIClient.ts +77 -0
- 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
|
+
};
|