Skip to content

Commit 98f68ac

Browse files
committed
unify query fn
1 parent 7d73a41 commit 98f68ac

File tree

10 files changed

+48
-47
lines changed

10 files changed

+48
-47
lines changed

README.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ It uses the builder pattern, the best pattern that works with complex Typescript
3232
## TODO
3333

3434
- Strong typed customizable tags
35-
- QueryClient API on builders
3635
- Middlewares on builder
3736
- Context on builder
3837

src/builder/HttpMutationBuilder.ts

Lines changed: 5 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,17 @@
1-
import { httpRequest } from '../http/request';
21
import { ExtractPathParams } from '../http/types';
32
import { Prettify, WithOptional } from '../types/utils';
43
import { MutationBuilder, MutationBuilderConfig } from './MutationBuilder';
54
import { HttpBaseHeaders, HttpBaseParams, HttpBaseSearch, HttpBuilderTypeTemplate } from './types';
65
import { PrettifyWithVars } from './types';
7-
import { mergeHttpVars } from './utils';
6+
import { createHttpQueryFn, mergeHttpVars } from './utils';
87

98
export class HttpMutationBuilder<
109
T extends HttpBuilderTypeTemplate = HttpBuilderTypeTemplate,
1110
> extends MutationBuilder<T> {
12-
constructor(config?: WithOptional<MutationBuilderConfig<T>, 'mutationFn'>) {
13-
super({
14-
mergeVars: mergeHttpVars,
15-
mutationFn: async (vars) => {
16-
const search = { ...vars?.search! };
17-
const params = { ...vars?.params! } as any;
18-
19-
return httpRequest<T['data']>({ ...(vars as any), vars, search, params });
20-
},
21-
...config,
22-
});
11+
constructor(config?: WithOptional<MutationBuilderConfig<T>, 'queryFn'>) {
12+
const mergeVars = config?.mergeVars || mergeHttpVars;
13+
const queryFn = config?.queryFn || createHttpQueryFn<T>(mergeVars);
14+
super({ mergeVars, queryFn, ...config });
2315
}
2416

2517
withBody<TBody>(body?: TBody): HttpMutationBuilder<PrettifyWithVars<T, { body: TBody }>> {

src/builder/HttpQueryBuilder.ts

Lines changed: 6 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,16 @@
1-
import { httpRequest } from '../http/request';
21
import { ExtractPathParams } from '../http/types';
32
import { Prettify, WithOptional } from '../types/utils';
3+
import { HttpMutationBuilder } from './HttpMutationBuilder';
44
import { QueryBuilder, QueryBuilderConfig } from './QueryBuilder';
55
import { HttpBaseHeaders, HttpBaseParams, HttpBaseSearch, HttpBuilderTypeTemplate } from './types';
66
import { PrettifyWithVars } from './types';
7-
import { mergeHttpVars } from './utils';
7+
import { createHttpQueryFn, mergeHttpVars } from './utils';
88

99
export class HttpQueryBuilder<T extends HttpBuilderTypeTemplate = HttpBuilderTypeTemplate> extends QueryBuilder<T> {
1010
constructor(config?: WithOptional<QueryBuilderConfig<T>, 'queryFn'>) {
11-
super({
12-
mergeVars: mergeHttpVars,
13-
queryFn: async ({ queryKey, signal, meta, pageParam }) => {
14-
const [vars] = queryKey || [''];
15-
const search = { ...vars?.search!, ...pageParam! };
16-
const params = { ...vars?.params! } as any;
17-
18-
return httpRequest<T['data']>({ ...(vars as any), meta, vars, search, params, signal });
19-
},
20-
...config,
21-
});
11+
const mergeVars = config?.mergeVars || mergeHttpVars;
12+
const queryFn = config?.queryFn || createHttpQueryFn<T>(mergeVars);
13+
super({ mergeVars, queryFn, ...config });
2214
}
2315

2416
withBody<TBody>(body?: TBody): HttpQueryBuilder<PrettifyWithVars<T, { body: TBody }>> {
@@ -62,4 +54,5 @@ export class HttpQueryBuilder<T extends HttpBuilderTypeTemplate = HttpBuilderTyp
6254
declare withData: <TData>() => HttpQueryBuilder<Prettify<T & { data: TData }>>;
6355
declare withError: <TError>() => HttpQueryBuilder<Prettify<T & { error: TError }>>;
6456
declare withVars: <TVars = T['vars']>(vars?: TVars) => HttpQueryBuilder<PrettifyWithVars<T, Partial<TVars>>>;
57+
declare asMutationBuilder: () => HttpMutationBuilder<T>;
6558
}

src/builder/MutationBuilder.ts

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import {
22
MutationFilters,
3-
MutationFunction,
43
MutationKey,
54
QueryClient,
65
UseMutationOptions,
@@ -10,7 +9,7 @@ import {
109
import { mergeTagOptions } from '../tags/mergeTagOptions';
1110
import { QueryInvalidatesMetadata } from '../tags/types';
1211
import { Prettify } from '../types/utils';
13-
import { BuilderMergeVarsFn } from './types';
12+
import { BuilderMergeVarsFn, BuilderQueryFn } from './types';
1413
import { BuilderTypeTemplate, PrettifyWithVars } from './types';
1514
import { mergeMutationOptions, mergeVars } from './utils';
1615

@@ -53,7 +52,12 @@ export class MutationBuilderFrozen<T extends BuilderTypeTemplate> {
5352
) => UseMutationOptions<T['data'], T['error'], T['vars']> = (opts) => {
5453
return mergeMutationOptions([
5554
{
56-
mutationFn: (vars) => this.config.mutationFn(this.mergeVars([this.config.vars, vars])),
55+
mutationFn: async (vars) => {
56+
return this.config.queryFn({
57+
queryKey: [this.mergeVars([this.config.vars, vars])],
58+
meta: opts?.meta as any,
59+
});
60+
},
5761
meta: {
5862
invalidates: this.config.invalidates,
5963
updates: this.config.updates,
@@ -127,7 +131,7 @@ export type MutationBuilderConfig<T extends BuilderTypeTemplate> = QueryInvalida
127131
T['data'],
128132
T['error']
129133
> & {
130-
mutationFn: MutationFunction<T['data'], T['vars']>;
134+
queryFn: BuilderQueryFn<T['data'], T['vars']>;
131135

132136
vars?: Partial<T['vars']>;
133137
mergeVars?: BuilderMergeVarsFn<T['vars']>;

src/builder/QueryBuilder.ts

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import {
44
InvalidateOptions,
55
QueryClient,
66
QueryFilters,
7-
QueryFunction,
87
RefetchOptions,
98
ResetOptions,
109
SetDataOptions,
@@ -19,7 +18,8 @@ import {
1918
import { mergeTagOptions } from '../tags/mergeTagOptions';
2019
import { QueryTagOption } from '../tags/types';
2120
import { FunctionType, Prettify } from '../types/utils';
22-
import { BuilderMergeVarsFn, BuilderQueriesResult } from './types';
21+
import { MutationBuilder } from './MutationBuilder';
22+
import { BuilderMergeVarsFn, BuilderQueriesResult, BuilderQueryFn } from './types';
2323
import { BuilderTypeTemplate, PrettifyWithVars } from './types';
2424
import { mergeQueryOptions, mergeVars } from './utils';
2525

@@ -200,12 +200,21 @@ export class QueryBuilder<T extends BuilderTypeTemplate = BuilderTypeTemplate> e
200200
freeze(): QueryBuilderFrozen<T> {
201201
return this;
202202
}
203+
204+
asMutationBuilder(): MutationBuilder<T> {
205+
return new MutationBuilder({
206+
queryFn: this.config.queryFn,
207+
queryClient: this.config.queryClient,
208+
mergeVars: this.config.mergeVars,
209+
vars: this.config.vars,
210+
});
211+
}
203212
}
204213

205214
type Updater<T> = T | undefined | ((oldData: T | undefined) => T | undefined);
206215

207216
export type QueryBuilderConfig<T extends BuilderTypeTemplate> = {
208-
queryFn: QueryFunction<T['data'], [T['vars']]>;
217+
queryFn: BuilderQueryFn<T['data'], T['vars']>;
209218
vars?: Partial<T['vars']>;
210219
mergeVars?: BuilderMergeVarsFn<T['vars']>;
211220

src/builder/types.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { UseQueryResult } from '@tanstack/react-query';
1+
import { QueryFunctionContext, UseQueryResult } from '@tanstack/react-query';
22
import { RequestError } from '../http/errors';
33
import { HttpRequestOptions } from '../http/types';
44
import { Prettify } from '../types/utils';
@@ -39,3 +39,5 @@ type QueriesResultMapType<T extends BuilderTypeTemplate> = Record<PropertyKey, Q
3939
export type BuilderQueriesResult<T extends BuilderTypeTemplate> = QueriesResultItemType<T>[] & {
4040
queryMap: QueriesResultMapType<T>;
4141
};
42+
43+
export type BuilderQueryFn<TData, TVars> = (context: Partial<QueryFunctionContext<[TVars]>>) => TData | Promise<TData>;

src/builder/utils.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import type { DefaultError, QueryKey, UseMutationOptions, UseQueryOptions } from '@tanstack/react-query';
2+
import { httpRequest } from '../http/request';
23
import { mergeQueryEnabled } from '../tags/mergeQueryEnabled';
34
import { mergeTagOptions } from '../tags/mergeTagOptions';
45
import { FunctionType } from '../types/utils';
5-
import { BuilderMergeVarsFn, HttpBuilderTypeTemplate } from './types';
6+
import { BuilderMergeVarsFn, BuilderQueryFn, HttpBuilderTypeTemplate } from './types';
67

78
export function mergeQueryOptions<
89
TQueryFnData = unknown,
@@ -79,3 +80,13 @@ export const mergeHttpVars: BuilderMergeVarsFn<HttpBuilderTypeTemplate['vars']>
7980
},
8081
};
8182
};
83+
84+
export function createHttpQueryFn<T extends HttpBuilderTypeTemplate>(
85+
mergeVarsFn: BuilderMergeVarsFn<T['vars']>,
86+
): BuilderQueryFn<T['data'], T['vars']> {
87+
return async ({ queryKey, signal, meta, pageParam }: any) => {
88+
const [vars] = queryKey || [];
89+
const mergedVars = mergeVarsFn(vars, pageParam);
90+
return httpRequest<T['data']>({ ...(mergedVars as any), meta, signal });
91+
};
92+
}

src/http/request.ts

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ export async function httpRequest<TData = unknown>(options: HttpRequestOptions)
6363
params,
6464
method = 'get',
6565
search,
66-
token,
6766
headers,
6867
credentials,
6968
timeout,
@@ -84,10 +83,7 @@ export async function httpRequest<TData = unknown>(options: HttpRequestOptions)
8483
const hasBody = method !== 'get' && body != null;
8584
const bodySerialized = !hasBody ? undefined : prepareBody(body);
8685

87-
const resolvedHeaders = new Headers({
88-
...(!!token && { Authorization: `Bearer ${token}` }),
89-
...headers,
90-
});
86+
const resolvedHeaders = new Headers(headers as HeadersInit);
9187

9288
const resolvedCredentials: RequestInit['credentials'] = resolveCredentials(credentials);
9389

src/http/types.ts

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,11 +49,6 @@ export type HttpRequestOptions<
4949
*/
5050
baseUrl?: string;
5151

52-
/**
53-
* JWT token that will be added to the `Authorization` header.
54-
*/
55-
token?: string;
56-
5752
/**
5853
* The request will be aborted after the specified number of milliseconds.
5954
*/

tests/MutationBuilder.test-d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ describe('QueryBuilder', () => {
55
type TVar = { readonly sym: unique symbol };
66
type TErr = { readonly sym: unique symbol };
77

8-
const mt = new MutationBuilder({ mutationFn: async () => 0 }).withData<TData>().withVars<TVar>().withError<TErr>();
8+
const mt = new MutationBuilder({ queryFn: async () => 0 }).withData<TData>().withVars<TVar>().withError<TErr>();
99

1010
describe('useQuery', () => {
1111
const query = mt.useMutation();

0 commit comments

Comments
 (0)