@mobx-query/core 0.2.2 → 0.2.3
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/dist/client/MQClient.d.ts +23 -0
- package/dist/client/MQClientAccessor.d.ts +12 -0
- package/dist/client/index.d.ts +5 -0
- package/{src/libs/mobx-query/client/types.ts → dist/client/types.d.ts} +31 -37
- package/dist/core.js +1830 -0
- package/dist/entity/Entity.d.ts +31 -0
- package/dist/entity/EntityCollection.d.ts +29 -0
- package/dist/entity/constants.d.ts +6 -0
- package/dist/entity/index.d.ts +6 -0
- package/{src/libs/mobx-query/entity/types.ts → dist/entity/types.d.ts} +8 -11
- package/dist/index.d.ts +6 -0
- package/dist/mutations/BatchMutationBase.d.ts +14 -0
- package/dist/mutations/BatchUpdateMutation.d.ts +9 -0
- package/dist/mutations/CreateMutation.d.ts +15 -0
- package/dist/mutations/DeleteMutation.d.ts +14 -0
- package/dist/mutations/EntityMutationBase.d.ts +22 -0
- package/dist/mutations/MutationBase.d.ts +13 -0
- package/dist/mutations/OptimisticMutationStrategy.d.ts +19 -0
- package/dist/mutations/UpdateMutation.d.ts +10 -0
- package/dist/mutations/constants.d.ts +12 -0
- package/dist/mutations/index.d.ts +11 -0
- package/dist/mutations/types.d.ts +55 -0
- package/dist/queries/QueryBase.d.ts +14 -0
- package/dist/queries/QueryFragmentMany.d.ts +9 -0
- package/dist/queries/QueryFragmentOne.d.ts +9 -0
- package/dist/queries/QueryMany.d.ts +11 -0
- package/dist/queries/QueryManyBase.d.ts +34 -0
- package/dist/queries/QueryOne.d.ts +11 -0
- package/dist/queries/QueryOneBase.d.ts +19 -0
- package/dist/queries/index.d.ts +10 -0
- package/dist/queries/types.d.ts +23 -0
- package/dist/react/createReactContext.d.ts +8 -0
- package/dist/react/index.d.ts +2 -0
- package/dist/utils/generateEntityId.d.ts +2 -0
- package/dist/utils/index.d.ts +5 -0
- package/dist/utils/invalidateQueryByHash.d.ts +2 -0
- package/dist/utils/types.d.ts +7 -0
- package/package.json +6 -1
- package/.gitattributes +0 -2
- package/eslint.config.js +0 -29
- package/index.html +0 -13
- package/src/App.css +0 -0
- package/src/App.tsx +0 -5
- package/src/api/constants.ts +0 -1
- package/src/api/fetch.ts +0 -29
- package/src/api/todos.ts +0 -14
- package/src/api/types.ts +0 -30
- package/src/api/users.ts +0 -19
- package/src/assets/react.svg +0 -1
- package/src/index.css +0 -60
- package/src/libs/mobx-query/client/MQClient.ts +0 -75
- package/src/libs/mobx-query/client/MQClientAccessor.ts +0 -74
- package/src/libs/mobx-query/client/index.ts +0 -8
- package/src/libs/mobx-query/entity/Entity.ts +0 -232
- package/src/libs/mobx-query/entity/EntityCollection.ts +0 -285
- package/src/libs/mobx-query/entity/constants.ts +0 -7
- package/src/libs/mobx-query/entity/index.ts +0 -15
- package/src/libs/mobx-query/index.ts +0 -6
- package/src/libs/mobx-query/mutations/BatchMutationBase.ts +0 -105
- package/src/libs/mobx-query/mutations/BatchUpdateMutation.ts +0 -48
- package/src/libs/mobx-query/mutations/CreateMutation.ts +0 -172
- package/src/libs/mobx-query/mutations/DeleteMutation.ts +0 -94
- package/src/libs/mobx-query/mutations/EntityMutationBase.ts +0 -110
- package/src/libs/mobx-query/mutations/MutationBase.ts +0 -40
- package/src/libs/mobx-query/mutations/OptimisticMutationStrategy.ts +0 -122
- package/src/libs/mobx-query/mutations/UpdateMutation.ts +0 -76
- package/src/libs/mobx-query/mutations/constants.ts +0 -16
- package/src/libs/mobx-query/mutations/index.ts +0 -44
- package/src/libs/mobx-query/mutations/types.ts +0 -205
- package/src/libs/mobx-query/queries/QueryBase.ts +0 -65
- package/src/libs/mobx-query/queries/QueryFragmentMany.ts +0 -31
- package/src/libs/mobx-query/queries/QueryFragmentOne.ts +0 -35
- package/src/libs/mobx-query/queries/QueryMany.ts +0 -80
- package/src/libs/mobx-query/queries/QueryManyBase.ts +0 -135
- package/src/libs/mobx-query/queries/QueryOne.ts +0 -84
- package/src/libs/mobx-query/queries/QueryOneBase.ts +0 -93
- package/src/libs/mobx-query/queries/index.ts +0 -33
- package/src/libs/mobx-query/queries/types.ts +0 -60
- package/src/libs/mobx-query/react/createReactContext.tsx +0 -23
- package/src/libs/mobx-query/react/index.ts +0 -3
- package/src/libs/mobx-query/utils/generateEntityId.ts +0 -12
- package/src/libs/mobx-query/utils/index.ts +0 -8
- package/src/libs/mobx-query/utils/invalidateQueryByHash.ts +0 -18
- package/src/libs/mobx-query/utils/types.ts +0 -18
- package/src/libs/react-query.ts +0 -11
- package/src/main.tsx +0 -16
- package/src/utils.ts +0 -3
- package/src/vite-env.d.ts +0 -1
- package/tsconfig.app.json +0 -27
- package/tsconfig.json +0 -7
- package/tsconfig.node.json +0 -25
- package/vite.config.ts +0 -52
- /package/{public → dist}/vite.svg +0 -0
|
@@ -1,205 +0,0 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
DefaultError,
|
|
3
|
-
MutationFunctionContext,
|
|
4
|
-
UseMutationOptions,
|
|
5
|
-
} from "@tanstack/react-query";
|
|
6
|
-
import type { MQClientContextRegistered } from "../client/types";
|
|
7
|
-
import type { EntityAny, EntityConstructorAny } from "../entity";
|
|
8
|
-
import { OptimisticMutationStrategy } from "./OptimisticMutationStrategy";
|
|
9
|
-
import type {
|
|
10
|
-
OptimisticMutationErrorStrategy,
|
|
11
|
-
OptimisticMutationInvalidationStrategy,
|
|
12
|
-
} from "./constants";
|
|
13
|
-
|
|
14
|
-
export type MutationFn<TInput> = (
|
|
15
|
-
input: TInput,
|
|
16
|
-
context: MQClientContextRegistered,
|
|
17
|
-
) => Promise<void>;
|
|
18
|
-
|
|
19
|
-
export type BatchMutationFn<TEntity extends EntityAny> = (
|
|
20
|
-
entities: TEntity[],
|
|
21
|
-
context: MQClientContextRegistered,
|
|
22
|
-
) => Promise<void>;
|
|
23
|
-
|
|
24
|
-
export interface CreateMutationInputInternal<
|
|
25
|
-
TInput,
|
|
26
|
-
TEntityConstructor extends EntityConstructorAny,
|
|
27
|
-
> {
|
|
28
|
-
input: TInput;
|
|
29
|
-
entity: InstanceType<TEntityConstructor>;
|
|
30
|
-
mutationStrategy: OptimisticMutationStrategy;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
export interface BatchMutationInputInternal<
|
|
34
|
-
TEntityConstructor extends EntityConstructorAny,
|
|
35
|
-
> {
|
|
36
|
-
strategy: OptimisticMutationStrategy;
|
|
37
|
-
entities: InstanceType<TEntityConstructor>[];
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
export interface OptimisticMutationStrategyOptions {
|
|
41
|
-
invalidationStrategy?: OptimisticMutationInvalidationStrategy;
|
|
42
|
-
errorStrategy?: OptimisticMutationErrorStrategy;
|
|
43
|
-
invalidateOnError?: boolean;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
export interface UseMutationHookCommonOptions<
|
|
47
|
-
TData = unknown,
|
|
48
|
-
TError = DefaultError,
|
|
49
|
-
TVariables = void,
|
|
50
|
-
TMutateResult = unknown,
|
|
51
|
-
> extends Omit<
|
|
52
|
-
UseMutationOptions<TData, TError, TVariables, TMutateResult>,
|
|
53
|
-
| "mutationFn"
|
|
54
|
-
| "mutationKey"
|
|
55
|
-
| "onSuccess"
|
|
56
|
-
| "onError"
|
|
57
|
-
| "onMutate"
|
|
58
|
-
| "onSettled"
|
|
59
|
-
> {
|
|
60
|
-
// mutationKey?: () => ReadonlyArray<unknown>
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
export interface UseCreateMutationHookOptions<
|
|
64
|
-
TInput,
|
|
65
|
-
TEntityConstructor extends EntityConstructorAny,
|
|
66
|
-
TError = DefaultError,
|
|
67
|
-
TMutateResult = unknown,
|
|
68
|
-
TEntity extends InstanceType<TEntityConstructor> =
|
|
69
|
-
InstanceType<TEntityConstructor>,
|
|
70
|
-
>
|
|
71
|
-
extends
|
|
72
|
-
UseMutationHookCommonOptions<void, TError, void, TMutateResult>,
|
|
73
|
-
OptimisticMutationStrategyOptions,
|
|
74
|
-
CreateEntityMutationCallbacks<TInput, TEntity, TError, TMutateResult> {
|
|
75
|
-
entity: TEntityConstructor;
|
|
76
|
-
mutationFn: CreateMutationFn<TInput, TEntityConstructor>;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
export type CreateMutationFn<
|
|
80
|
-
TInput,
|
|
81
|
-
TEntityConstructor extends EntityConstructorAny,
|
|
82
|
-
> = (
|
|
83
|
-
input: TInput,
|
|
84
|
-
entity: InstanceType<TEntityConstructor>,
|
|
85
|
-
context: MQClientContextRegistered,
|
|
86
|
-
) => Promise<void>;
|
|
87
|
-
|
|
88
|
-
export interface CreateEntityMutationCallbacks<
|
|
89
|
-
TInput,
|
|
90
|
-
TEntity extends EntityAny,
|
|
91
|
-
TError = DefaultError,
|
|
92
|
-
TMutateResult = unknown,
|
|
93
|
-
> {
|
|
94
|
-
onMutate?: (
|
|
95
|
-
input: TInput,
|
|
96
|
-
entity: TEntity,
|
|
97
|
-
context: MutationFunctionContext,
|
|
98
|
-
) => (TMutateResult | Promise<TMutateResult | undefined>) | undefined;
|
|
99
|
-
onSuccess?: (
|
|
100
|
-
input: TInput,
|
|
101
|
-
entity: TEntity,
|
|
102
|
-
onMutateResult: TMutateResult | undefined,
|
|
103
|
-
context: MutationFunctionContext,
|
|
104
|
-
) => void | Promise<void>;
|
|
105
|
-
onError?: (
|
|
106
|
-
error: TError,
|
|
107
|
-
input: TInput,
|
|
108
|
-
entity: TEntity,
|
|
109
|
-
onMutateResult: TMutateResult | undefined,
|
|
110
|
-
context: MutationFunctionContext,
|
|
111
|
-
) => void | Promise<void>;
|
|
112
|
-
onSettled?: (
|
|
113
|
-
input: TInput,
|
|
114
|
-
entity: TEntity,
|
|
115
|
-
error: TError | null,
|
|
116
|
-
onMutateResult: TMutateResult | undefined,
|
|
117
|
-
context: MutationFunctionContext,
|
|
118
|
-
) => void | Promise<void>;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
export interface EntityMutationCallbacks<
|
|
122
|
-
TEntity extends EntityAny,
|
|
123
|
-
TError = DefaultError,
|
|
124
|
-
TMutateResult = unknown,
|
|
125
|
-
> {
|
|
126
|
-
onMutate?: (
|
|
127
|
-
entity: TEntity,
|
|
128
|
-
context: MutationFunctionContext,
|
|
129
|
-
) => (TMutateResult | Promise<TMutateResult | undefined>) | undefined;
|
|
130
|
-
onSuccess?: (
|
|
131
|
-
entity: TEntity,
|
|
132
|
-
onMutateResult: TMutateResult | undefined,
|
|
133
|
-
context: MutationFunctionContext,
|
|
134
|
-
) => void | Promise<void>;
|
|
135
|
-
onError?: (
|
|
136
|
-
error: TError,
|
|
137
|
-
entity: TEntity,
|
|
138
|
-
onMutateResult: TMutateResult | undefined,
|
|
139
|
-
context: MutationFunctionContext,
|
|
140
|
-
) => void | Promise<void>;
|
|
141
|
-
onSettled?: (
|
|
142
|
-
entity: TEntity,
|
|
143
|
-
error: TError | null,
|
|
144
|
-
onMutateResult: TMutateResult | undefined,
|
|
145
|
-
context: MutationFunctionContext,
|
|
146
|
-
) => void | Promise<void>;
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
export interface UseEntityMutationHookOptions<
|
|
150
|
-
TEntityConstructor extends EntityConstructorAny,
|
|
151
|
-
TError = DefaultError,
|
|
152
|
-
TMutateResult = unknown,
|
|
153
|
-
TEntity extends InstanceType<TEntityConstructor> =
|
|
154
|
-
InstanceType<TEntityConstructor>,
|
|
155
|
-
>
|
|
156
|
-
extends
|
|
157
|
-
UseMutationHookCommonOptions<void, TError, void, TMutateResult>,
|
|
158
|
-
OptimisticMutationStrategyOptions,
|
|
159
|
-
EntityMutationCallbacks<TEntity, TError, TMutateResult> {
|
|
160
|
-
entity: TEntityConstructor;
|
|
161
|
-
instance: TEntity;
|
|
162
|
-
mutationFn: MutationFn<void>;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
export interface EntitiesBatchMutationCallbacks<
|
|
166
|
-
TEntity extends EntityAny,
|
|
167
|
-
TError = DefaultError,
|
|
168
|
-
TMutateResult = unknown,
|
|
169
|
-
> {
|
|
170
|
-
onMutate?: (
|
|
171
|
-
entities: TEntity[],
|
|
172
|
-
context: MutationFunctionContext,
|
|
173
|
-
) => (TMutateResult | Promise<TMutateResult | undefined>) | undefined;
|
|
174
|
-
onSuccess?: (
|
|
175
|
-
entities: TEntity[],
|
|
176
|
-
context: MutationFunctionContext,
|
|
177
|
-
onMutateResult: TMutateResult | undefined,
|
|
178
|
-
) => void | Promise<void>;
|
|
179
|
-
onError?: (
|
|
180
|
-
error: TError,
|
|
181
|
-
entities: TEntity[],
|
|
182
|
-
context: MutationFunctionContext,
|
|
183
|
-
onMutateResult: TMutateResult | undefined,
|
|
184
|
-
) => void | Promise<void>;
|
|
185
|
-
onSettled?: (
|
|
186
|
-
entities: TEntity[],
|
|
187
|
-
context: MutationFunctionContext,
|
|
188
|
-
onMutateResult: TMutateResult | undefined,
|
|
189
|
-
error: TError | null,
|
|
190
|
-
) => void | Promise<void>;
|
|
191
|
-
}
|
|
192
|
-
|
|
193
|
-
export interface UseBatchMutationHookOptions<
|
|
194
|
-
TEntityConstructor extends EntityConstructorAny,
|
|
195
|
-
TError = DefaultError,
|
|
196
|
-
TMutateResult = unknown,
|
|
197
|
-
TEntity extends EntityAny = InstanceType<TEntityConstructor>,
|
|
198
|
-
>
|
|
199
|
-
extends
|
|
200
|
-
UseMutationHookCommonOptions<void, TError, TEntity[], TMutateResult>,
|
|
201
|
-
OptimisticMutationStrategyOptions,
|
|
202
|
-
EntitiesBatchMutationCallbacks<TEntity, TError, TMutateResult> {
|
|
203
|
-
entity: TEntityConstructor;
|
|
204
|
-
mutationFn: BatchMutationFn<TEntity>;
|
|
205
|
-
}
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
import { hashKey, useIsFetching } from "@tanstack/react-query";
|
|
2
|
-
import { MQClientAccessor } from "../client";
|
|
3
|
-
import type { EntityConstructorAny, EntityDataAny } from "../entity";
|
|
4
|
-
|
|
5
|
-
export abstract class QueryBase<TArguments = unknown> extends MQClientAccessor {
|
|
6
|
-
constructor(
|
|
7
|
-
private readonly entityConstructors: EntityConstructorAny[],
|
|
8
|
-
private readonly baseQueryKeysRest: () => unknown[],
|
|
9
|
-
) {
|
|
10
|
-
super();
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
get baseQueryKey() {
|
|
14
|
-
return [
|
|
15
|
-
this.entityConstructors.map((e) => e.name).join("_"),
|
|
16
|
-
...this.baseQueryKeysRest(),
|
|
17
|
-
];
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
get baseQueryHash() {
|
|
21
|
-
return hashKey(this.baseQueryKey);
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
protected createQueryKey(args: TArguments) {
|
|
25
|
-
return [...this.baseQueryKey, args];
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
protected createQueryHash(args: TArguments) {
|
|
29
|
-
return hashKey(this.createQueryKey(args));
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
useIsFetching(args: TArguments) {
|
|
33
|
-
return useIsFetching({
|
|
34
|
-
queryKey: this.createQueryKey(args),
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
protected setOneEntity(
|
|
39
|
-
data: EntityDataAny,
|
|
40
|
-
queryKey: unknown[],
|
|
41
|
-
entityConstructor: EntityConstructorAny,
|
|
42
|
-
) {
|
|
43
|
-
const collection = this.getEntityCollection(entityConstructor);
|
|
44
|
-
const entity = collection.setEntity(data, [hashKey(queryKey)]);
|
|
45
|
-
|
|
46
|
-
return entity;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
protected setManyEntities(
|
|
50
|
-
data: EntityDataAny[],
|
|
51
|
-
queryKey: unknown[],
|
|
52
|
-
entityConstructor: EntityConstructorAny,
|
|
53
|
-
) {
|
|
54
|
-
if (typeof data !== "object" || !Array.isArray(data)) {
|
|
55
|
-
throw new Error(
|
|
56
|
-
`Query function for ${entityConstructor.name} must return an array of entities`,
|
|
57
|
-
);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
const collection = this.getEntityCollection(entityConstructor);
|
|
61
|
-
const entities = collection.setEntities(data, [hashKey(queryKey)]);
|
|
62
|
-
|
|
63
|
-
return entities;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
import { type DefaultError, useQuery } from "@tanstack/react-query";
|
|
2
|
-
import type { EntityConstructorAny } from "../entity";
|
|
3
|
-
import type { UseQueryManyOptions } from "./types";
|
|
4
|
-
import { QueryManyBase } from "./QueryManyBase";
|
|
5
|
-
|
|
6
|
-
export class QueryFragmentMany<
|
|
7
|
-
TArguments = void,
|
|
8
|
-
TEntityConstructor extends EntityConstructorAny = EntityConstructorAny,
|
|
9
|
-
TError extends DefaultError = DefaultError,
|
|
10
|
-
> extends QueryManyBase<TArguments, void, TEntityConstructor, TError> {
|
|
11
|
-
static readonly queryPrefix = "__query__fragment__many__";
|
|
12
|
-
|
|
13
|
-
constructor(
|
|
14
|
-
options: UseQueryManyOptions<TArguments, void, TEntityConstructor, TError>,
|
|
15
|
-
) {
|
|
16
|
-
super(QueryFragmentMany.queryPrefix, options);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
useQuery(args: TArguments) {
|
|
20
|
-
const queryFn = this.queryFnWrapper(args);
|
|
21
|
-
|
|
22
|
-
const res = useQuery({
|
|
23
|
-
queryKey: queryFn.queryKey,
|
|
24
|
-
queryFn: () => queryFn.run(),
|
|
25
|
-
staleTime: Infinity,
|
|
26
|
-
gcTime: Infinity,
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
return this.getEntities(res.data ?? []);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
import { type DefaultError, useQuery } from "@tanstack/react-query";
|
|
2
|
-
import type { EntityConstructorAny } from "../entity";
|
|
3
|
-
import type { UseQueryOneOptions } from "./types";
|
|
4
|
-
import { QueryOneBase } from "./QueryOneBase";
|
|
5
|
-
|
|
6
|
-
export class QueryFragmentOne<
|
|
7
|
-
TArguments = void,
|
|
8
|
-
TEntityConstructor extends EntityConstructorAny = EntityConstructorAny,
|
|
9
|
-
TError extends DefaultError = DefaultError,
|
|
10
|
-
> extends QueryOneBase<TArguments, void, TEntityConstructor, TError> {
|
|
11
|
-
static readonly queryPrefix = "__query__fragment__one__";
|
|
12
|
-
|
|
13
|
-
constructor(
|
|
14
|
-
options: UseQueryOneOptions<TArguments, void, TEntityConstructor, TError>,
|
|
15
|
-
) {
|
|
16
|
-
super(QueryFragmentOne.queryPrefix, options);
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
useQuery(args: TArguments) {
|
|
20
|
-
const queryFn = this.queryFnWrapper(args);
|
|
21
|
-
|
|
22
|
-
const res = useQuery({
|
|
23
|
-
queryKey: queryFn.queryKey,
|
|
24
|
-
queryFn: () => queryFn.run(),
|
|
25
|
-
staleTime: Infinity,
|
|
26
|
-
gcTime: Infinity,
|
|
27
|
-
});
|
|
28
|
-
|
|
29
|
-
if (!res.data) {
|
|
30
|
-
return null;
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
return this.getEntity(res.data);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type DefaultError,
|
|
3
|
-
useQuery,
|
|
4
|
-
useSuspenseQuery,
|
|
5
|
-
} from "@tanstack/react-query";
|
|
6
|
-
import type { EntityConstructorAny } from "../entity";
|
|
7
|
-
import type { UseQueryManyOptions } from "./types";
|
|
8
|
-
import { QueryManyBase } from "./QueryManyBase";
|
|
9
|
-
import { useDeferredValue } from "react";
|
|
10
|
-
|
|
11
|
-
export class QueryMany<
|
|
12
|
-
TArguments = void,
|
|
13
|
-
TMeta = void,
|
|
14
|
-
TEntityConstructor extends EntityConstructorAny = EntityConstructorAny,
|
|
15
|
-
TError extends DefaultError = DefaultError,
|
|
16
|
-
> extends QueryManyBase<TArguments, TMeta, TEntityConstructor, TError> {
|
|
17
|
-
static readonly queryPrefix = "__query__many__";
|
|
18
|
-
|
|
19
|
-
constructor(
|
|
20
|
-
options: UseQueryManyOptions<TArguments, TMeta, TEntityConstructor, TError>,
|
|
21
|
-
) {
|
|
22
|
-
super(QueryMany.queryPrefix, options);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
useSuspenseQuery(args: TArguments) {
|
|
26
|
-
const queryFn = this.queryFnWrapper(args);
|
|
27
|
-
|
|
28
|
-
const res = useSuspenseQuery({
|
|
29
|
-
queryKey: queryFn.queryKey,
|
|
30
|
-
queryFn: () => queryFn.run(),
|
|
31
|
-
...(this.options.staleTime !== undefined
|
|
32
|
-
? { staleTime: this.options.staleTime }
|
|
33
|
-
: {}),
|
|
34
|
-
...(this.options.gcTime !== undefined
|
|
35
|
-
? { gcTime: this.options.gcTime }
|
|
36
|
-
: {}),
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
return this.getEntities(res.data);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
useDeferredQuery(args: TArguments) {
|
|
43
|
-
const deferredArgs = useDeferredValue(args);
|
|
44
|
-
const queryFn = this.queryFnWrapper(deferredArgs);
|
|
45
|
-
|
|
46
|
-
const res = useSuspenseQuery({
|
|
47
|
-
queryKey: queryFn.queryKey,
|
|
48
|
-
queryFn: () => queryFn.run(),
|
|
49
|
-
...(this.options.staleTime !== undefined
|
|
50
|
-
? { staleTime: this.options.staleTime }
|
|
51
|
-
: {}),
|
|
52
|
-
...(this.options.gcTime !== undefined
|
|
53
|
-
? { gcTime: this.options.gcTime }
|
|
54
|
-
: {}),
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
return this.getEntities(res.data);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
useQuery(args: TArguments, meta: TMeta) {
|
|
61
|
-
const queryFn = this.queryFnWrapper(args);
|
|
62
|
-
|
|
63
|
-
const res = useQuery({
|
|
64
|
-
queryKey: queryFn.queryKey,
|
|
65
|
-
queryFn: () => queryFn.run(),
|
|
66
|
-
enabled:
|
|
67
|
-
typeof this.options.enabled === "function"
|
|
68
|
-
? this.options.enabled(meta, args)
|
|
69
|
-
: this.options.enabled,
|
|
70
|
-
...(this.options.staleTime !== undefined
|
|
71
|
-
? { staleTime: this.options.staleTime }
|
|
72
|
-
: {}),
|
|
73
|
-
...(this.options.gcTime !== undefined
|
|
74
|
-
? { gcTime: this.options.gcTime }
|
|
75
|
-
: {}),
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
return this.getEntities(res.data ?? []);
|
|
79
|
-
}
|
|
80
|
-
}
|
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
import type { DefaultError } from "@tanstack/react-query";
|
|
2
|
-
import type {
|
|
3
|
-
EntityAny,
|
|
4
|
-
EntityConstructorAny,
|
|
5
|
-
EntityCollection,
|
|
6
|
-
EntityId,
|
|
7
|
-
EntityDataAny,
|
|
8
|
-
} from "../entity";
|
|
9
|
-
import { type InferEntityData, invalidateQueryByHash } from "../utils";
|
|
10
|
-
import { QueryBase } from "./QueryBase";
|
|
11
|
-
import type { UseQueryManyOptions } from "./types";
|
|
12
|
-
|
|
13
|
-
export abstract class QueryManyBase<
|
|
14
|
-
TArguments,
|
|
15
|
-
TMeta = void,
|
|
16
|
-
TEntityConstructor extends EntityConstructorAny = EntityConstructorAny,
|
|
17
|
-
TError extends DefaultError = DefaultError,
|
|
18
|
-
> extends QueryBase<TArguments> {
|
|
19
|
-
protected readonly collection: EntityCollection<TEntityConstructor>;
|
|
20
|
-
|
|
21
|
-
constructor(
|
|
22
|
-
queryPrefix: string,
|
|
23
|
-
protected readonly options: UseQueryManyOptions<
|
|
24
|
-
TArguments,
|
|
25
|
-
TMeta,
|
|
26
|
-
TEntityConstructor,
|
|
27
|
-
TError
|
|
28
|
-
>,
|
|
29
|
-
) {
|
|
30
|
-
super([options.entity], () => [queryPrefix, ...options.queryKey()]);
|
|
31
|
-
this.collection = this.getEntityCollection(options.entity);
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
prefetch(args: TArguments) {
|
|
35
|
-
const queryFn = this.queryFnWrapper(args);
|
|
36
|
-
return this.queryClient.prefetchQuery({
|
|
37
|
-
queryKey: this.createQueryKey(args),
|
|
38
|
-
queryFn: () => queryFn.run(),
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
ensureData(args: TArguments) {
|
|
43
|
-
const queryFn = this.queryFnWrapper(args);
|
|
44
|
-
return this.queryClient.ensureQueryData({
|
|
45
|
-
queryKey: queryFn.queryKey,
|
|
46
|
-
queryFn: () => queryFn.run(),
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
invalidate(args: TArguments) {
|
|
51
|
-
invalidateQueryByHash(
|
|
52
|
-
this.createQueryHash(args),
|
|
53
|
-
this.queryClient.getQueryCache(),
|
|
54
|
-
);
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
setQueryData(data: InferEntityData<TEntityConstructor>[], args: TArguments) {
|
|
58
|
-
const queryKey = this.createQueryKey(args);
|
|
59
|
-
const [_, ids] = this.setManyEntities(
|
|
60
|
-
data as EntityDataAny[],
|
|
61
|
-
queryKey,
|
|
62
|
-
this.options.entity,
|
|
63
|
-
);
|
|
64
|
-
this.queryClient.setQueryData(queryKey, ids);
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
* Returns the current entity ID array stored in the TanStack query cache
|
|
69
|
-
* for the given arguments.
|
|
70
|
-
*/
|
|
71
|
-
getQueryIds(args: TArguments): EntityId[] {
|
|
72
|
-
return (
|
|
73
|
-
this.queryClient.getQueryData<EntityId[]>(this.createQueryKey(args)) ?? []
|
|
74
|
-
);
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/**
|
|
78
|
-
* Directly sets the entity ID array in the TanStack query cache
|
|
79
|
-
* for the given arguments. Used by relation mutations for optimistic updates.
|
|
80
|
-
*/
|
|
81
|
-
setQueryIds(ids: EntityId[], args: TArguments) {
|
|
82
|
-
this.queryClient.setQueryData(this.createQueryKey(args), ids);
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/**
|
|
86
|
-
* Public accessor for the query key. Used by relation mutations
|
|
87
|
-
* to construct invalidation targets.
|
|
88
|
-
*/
|
|
89
|
-
getQueryKey(args: TArguments) {
|
|
90
|
-
return this.createQueryKey(args);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
protected getEntities(ids: EntityId[]) {
|
|
94
|
-
const list: EntityAny[] = [];
|
|
95
|
-
|
|
96
|
-
for (const id of ids) {
|
|
97
|
-
if (this.collection.deletedRecordIds.has(id)) {
|
|
98
|
-
continue;
|
|
99
|
-
}
|
|
100
|
-
|
|
101
|
-
const entity = this.collection.collection.get(id);
|
|
102
|
-
|
|
103
|
-
if (entity) {
|
|
104
|
-
list.push(entity);
|
|
105
|
-
}
|
|
106
|
-
}
|
|
107
|
-
|
|
108
|
-
return list as unknown as InstanceType<TEntityConstructor>[];
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
protected queryFnWrapper(args: TArguments) {
|
|
112
|
-
const queryKey = this.createQueryKey(args);
|
|
113
|
-
return {
|
|
114
|
-
run: async () => {
|
|
115
|
-
if (!this.options.queryFn) {
|
|
116
|
-
throw new Error("Query function is not defined");
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
const data = (await this.options.queryFn(
|
|
120
|
-
args,
|
|
121
|
-
this.context,
|
|
122
|
-
)) as EntityDataAny[];
|
|
123
|
-
|
|
124
|
-
const [_, ids] = this.setManyEntities(
|
|
125
|
-
data,
|
|
126
|
-
queryKey,
|
|
127
|
-
this.options.entity,
|
|
128
|
-
);
|
|
129
|
-
|
|
130
|
-
return ids;
|
|
131
|
-
},
|
|
132
|
-
queryKey,
|
|
133
|
-
};
|
|
134
|
-
}
|
|
135
|
-
}
|
|
@@ -1,84 +0,0 @@
|
|
|
1
|
-
import {
|
|
2
|
-
type DefaultError,
|
|
3
|
-
useQuery,
|
|
4
|
-
useSuspenseQuery,
|
|
5
|
-
} from "@tanstack/react-query";
|
|
6
|
-
import type { EntityConstructorAny } from "../entity";
|
|
7
|
-
import type { UseQueryOneOptions } from "./types";
|
|
8
|
-
import { QueryOneBase } from "./QueryOneBase";
|
|
9
|
-
import { useDeferredValue } from "react";
|
|
10
|
-
|
|
11
|
-
export class QueryOne<
|
|
12
|
-
TArguments = void,
|
|
13
|
-
TMeta = void,
|
|
14
|
-
TEntityConstructor extends EntityConstructorAny = EntityConstructorAny,
|
|
15
|
-
TError extends DefaultError = DefaultError,
|
|
16
|
-
> extends QueryOneBase<TArguments, TMeta, TEntityConstructor, TError> {
|
|
17
|
-
static readonly queryPrefix = "__query__one__";
|
|
18
|
-
|
|
19
|
-
constructor(
|
|
20
|
-
options: UseQueryOneOptions<TArguments, TMeta, TEntityConstructor, TError>,
|
|
21
|
-
) {
|
|
22
|
-
super(QueryOne.queryPrefix, options);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
useSuspenseQuery(args: TArguments) {
|
|
26
|
-
const queryFn = this.queryFnWrapper(args);
|
|
27
|
-
|
|
28
|
-
const res = useSuspenseQuery({
|
|
29
|
-
queryKey: queryFn.queryKey,
|
|
30
|
-
queryFn: () => queryFn.run(),
|
|
31
|
-
...(this.options.staleTime !== undefined
|
|
32
|
-
? { staleTime: this.options.staleTime }
|
|
33
|
-
: {}),
|
|
34
|
-
...(this.options.gcTime !== undefined
|
|
35
|
-
? { gcTime: this.options.gcTime }
|
|
36
|
-
: {}),
|
|
37
|
-
});
|
|
38
|
-
|
|
39
|
-
return this.getEntity(res.data);
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
useDeferredQuery(args: TArguments) {
|
|
43
|
-
const deferredArgs = useDeferredValue(args);
|
|
44
|
-
const queryFn = this.queryFnWrapper(deferredArgs);
|
|
45
|
-
|
|
46
|
-
const res = useSuspenseQuery({
|
|
47
|
-
queryKey: queryFn.queryKey,
|
|
48
|
-
queryFn: () => queryFn.run(),
|
|
49
|
-
...(this.options.staleTime !== undefined
|
|
50
|
-
? { staleTime: this.options.staleTime }
|
|
51
|
-
: {}),
|
|
52
|
-
...(this.options.gcTime !== undefined
|
|
53
|
-
? { gcTime: this.options.gcTime }
|
|
54
|
-
: {}),
|
|
55
|
-
});
|
|
56
|
-
|
|
57
|
-
return this.getEntity(res.data);
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
useQuery(args: TArguments, meta: TMeta) {
|
|
61
|
-
const queryFn = this.queryFnWrapper(args);
|
|
62
|
-
|
|
63
|
-
const res = useQuery({
|
|
64
|
-
queryKey: queryFn.queryKey,
|
|
65
|
-
queryFn: () => queryFn.run(),
|
|
66
|
-
enabled:
|
|
67
|
-
typeof this.options.enabled === "function"
|
|
68
|
-
? this.options.enabled(meta, args)
|
|
69
|
-
: this.options.enabled,
|
|
70
|
-
...(this.options.staleTime !== undefined
|
|
71
|
-
? { staleTime: this.options.staleTime }
|
|
72
|
-
: {}),
|
|
73
|
-
...(this.options.gcTime !== undefined
|
|
74
|
-
? { gcTime: this.options.gcTime }
|
|
75
|
-
: {}),
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
if (!res.data) {
|
|
79
|
-
return null;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
return this.getEntity(res.data);
|
|
83
|
-
}
|
|
84
|
-
}
|