Skip to content

Commit b5c88f4

Browse files
committed
bind methods in client and tags manager
1 parent 7d5cf91 commit b5c88f4

File tree

4 files changed

+38
-7
lines changed

4 files changed

+38
-7
lines changed

packages/tanstack-query-builder/src/builder/QueryBuilderClient.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,28 @@ import type {
1111
import { MutationObserver } from '@tanstack/react-query';
1212
import type { QueryBuilderFrozen } from './QueryBuilderFrozen';
1313
import type { BuilderConfig } from './types';
14+
import { bindMethods } from './utils';
15+
16+
const methodsToBind = [
17+
'ensureData',
18+
'ensureInfiniteData',
19+
'refetch',
20+
'fetch',
21+
'fetchInfinite',
22+
'isFetching',
23+
'prefetch',
24+
'prefetchInfinite',
25+
'reset',
26+
'remove',
27+
'cancel',
28+
'invalidate',
29+
'getData',
30+
'setData',
31+
'getState',
32+
'getMutation',
33+
'isMutating',
34+
'mutate',
35+
];
1436

1537
export class QueryBuilderClient<
1638
TVars,
@@ -22,7 +44,10 @@ export class QueryBuilderClient<
2244
> {
2345
private declare _options: BuilderConfig<TVars, TData, TError, TKey>['options'];
2446
private declare _pgOptions: BuilderConfig<TVars, TData, TError, TKey>['paginationOptions'];
25-
constructor(private builder: QueryBuilderFrozen<TVars, TData, TError, TKey, TTags, any>) {}
47+
48+
constructor(private builder: QueryBuilderFrozen<TVars, TData, TError, TKey, TTags, any>) {
49+
if (builder.config.bound) bindMethods(this, methodsToBind);
50+
}
2651

2752
ensureData(vars: TVars, opts?: typeof this._options) {
2853
return this.builder.config.queryClient?.ensureQueryData(this.builder.getQueryOptions(vars, opts));

packages/tanstack-query-builder/src/builder/QueryBuilderFrozen.ts

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import { QueryBuilderClient } from './QueryBuilderClient';
3333
import { QueryBuilderTagsManager } from './QueryBuilderTagsManager';
3434
import { type BuilderOptions, BuilderPaginationOptions, mergeBuilderOptions, mergeBuilderPaginationOptions } from './options';
3535
import type { BuilderConfig, BuilderFlags, BuilderQueriesResult, HasClient, HasPagination } from './types';
36-
import { areKeysEqual, assertThis, getRandomKey, mergeMutationOptions, mergeVars } from './utils';
36+
import { areKeysEqual, assertThis, bindMethods, getRandomKey, mergeMutationOptions, mergeVars } from './utils';
3737

3838
type UseQueriesArgs<TVars, TData, TError, TKey extends unknown[]> = [
3939
queries: {
@@ -79,10 +79,7 @@ export class QueryBuilderFrozen<
7979
TFlags extends BuilderFlags = '',
8080
> {
8181
constructor(public readonly config: BuilderConfig<TVars, TData, TError, TKey>) {
82-
if (config.bound) {
83-
const self = this as unknown as any;
84-
for (const method of methodsToBind) self[method] = self[method].bind(self);
85-
}
82+
if (config.bound) bindMethods(this, methodsToBind);
8683
}
8784

8885
readonly client = new QueryBuilderClient(this) as HasClient<TFlags, QueryBuilderClient<TVars, TData, TError, TKey, TTags>>;

packages/tanstack-query-builder/src/builder/QueryBuilderTagsManager.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,14 @@ import type { QueryTagContext, QueryUpdateTag, TagOperationOptions } from '../ta
44
import { updateTags } from '../tags/updateTags';
55
import type { WithOptional } from '../type-utils';
66
import type { QueryBuilderFrozen } from './QueryBuilderFrozen';
7+
import { bindMethods } from './utils';
8+
9+
const methodsToBind = ['useOperation', 'operate', 'cancel', 'invalidate', 'refetch', 'remove', 'reset', 'update'];
710

811
export class QueryBuilderTagsManager<TVars, TData, TError, TKey extends unknown[], TTags extends Record<string, unknown>> {
9-
constructor(private builder: QueryBuilderFrozen<TVars, TData, TError, TKey, TTags, any>) {}
12+
constructor(private builder: QueryBuilderFrozen<TVars, TData, TError, TKey, TTags, any>) {
13+
if (builder.config.bound) bindMethods(this, methodsToBind);
14+
}
1015

1116
/**
1217
* This hook returns a function that can be used to operate on queries based on tags.

packages/tanstack-query-builder/src/builder/utils.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,7 @@ export function getRandomKey() {
5656
export function assertThis<T>(t: T): asserts t is T & {} {
5757
if (t === undefined) throw new Error('Method called on unbound instance. Use `asBound` to bind methods.');
5858
}
59+
60+
export function bindMethods(self: Record<string, any>, methodsToBind: string[]) {
61+
for (const method of methodsToBind) self[method] = self[method].bind(self);
62+
}

0 commit comments

Comments
 (0)