@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.
Files changed (93) hide show
  1. package/dist/client/MQClient.d.ts +23 -0
  2. package/dist/client/MQClientAccessor.d.ts +12 -0
  3. package/dist/client/index.d.ts +5 -0
  4. package/{src/libs/mobx-query/client/types.ts → dist/client/types.d.ts} +31 -37
  5. package/dist/core.js +1830 -0
  6. package/dist/entity/Entity.d.ts +31 -0
  7. package/dist/entity/EntityCollection.d.ts +29 -0
  8. package/dist/entity/constants.d.ts +6 -0
  9. package/dist/entity/index.d.ts +6 -0
  10. package/{src/libs/mobx-query/entity/types.ts → dist/entity/types.d.ts} +8 -11
  11. package/dist/index.d.ts +6 -0
  12. package/dist/mutations/BatchMutationBase.d.ts +14 -0
  13. package/dist/mutations/BatchUpdateMutation.d.ts +9 -0
  14. package/dist/mutations/CreateMutation.d.ts +15 -0
  15. package/dist/mutations/DeleteMutation.d.ts +14 -0
  16. package/dist/mutations/EntityMutationBase.d.ts +22 -0
  17. package/dist/mutations/MutationBase.d.ts +13 -0
  18. package/dist/mutations/OptimisticMutationStrategy.d.ts +19 -0
  19. package/dist/mutations/UpdateMutation.d.ts +10 -0
  20. package/dist/mutations/constants.d.ts +12 -0
  21. package/dist/mutations/index.d.ts +11 -0
  22. package/dist/mutations/types.d.ts +55 -0
  23. package/dist/queries/QueryBase.d.ts +14 -0
  24. package/dist/queries/QueryFragmentMany.d.ts +9 -0
  25. package/dist/queries/QueryFragmentOne.d.ts +9 -0
  26. package/dist/queries/QueryMany.d.ts +11 -0
  27. package/dist/queries/QueryManyBase.d.ts +34 -0
  28. package/dist/queries/QueryOne.d.ts +11 -0
  29. package/dist/queries/QueryOneBase.d.ts +19 -0
  30. package/dist/queries/index.d.ts +10 -0
  31. package/dist/queries/types.d.ts +23 -0
  32. package/dist/react/createReactContext.d.ts +8 -0
  33. package/dist/react/index.d.ts +2 -0
  34. package/dist/utils/generateEntityId.d.ts +2 -0
  35. package/dist/utils/index.d.ts +5 -0
  36. package/dist/utils/invalidateQueryByHash.d.ts +2 -0
  37. package/dist/utils/types.d.ts +7 -0
  38. package/package.json +6 -1
  39. package/.gitattributes +0 -2
  40. package/eslint.config.js +0 -29
  41. package/index.html +0 -13
  42. package/src/App.css +0 -0
  43. package/src/App.tsx +0 -5
  44. package/src/api/constants.ts +0 -1
  45. package/src/api/fetch.ts +0 -29
  46. package/src/api/todos.ts +0 -14
  47. package/src/api/types.ts +0 -30
  48. package/src/api/users.ts +0 -19
  49. package/src/assets/react.svg +0 -1
  50. package/src/index.css +0 -60
  51. package/src/libs/mobx-query/client/MQClient.ts +0 -75
  52. package/src/libs/mobx-query/client/MQClientAccessor.ts +0 -74
  53. package/src/libs/mobx-query/client/index.ts +0 -8
  54. package/src/libs/mobx-query/entity/Entity.ts +0 -232
  55. package/src/libs/mobx-query/entity/EntityCollection.ts +0 -285
  56. package/src/libs/mobx-query/entity/constants.ts +0 -7
  57. package/src/libs/mobx-query/entity/index.ts +0 -15
  58. package/src/libs/mobx-query/index.ts +0 -6
  59. package/src/libs/mobx-query/mutations/BatchMutationBase.ts +0 -105
  60. package/src/libs/mobx-query/mutations/BatchUpdateMutation.ts +0 -48
  61. package/src/libs/mobx-query/mutations/CreateMutation.ts +0 -172
  62. package/src/libs/mobx-query/mutations/DeleteMutation.ts +0 -94
  63. package/src/libs/mobx-query/mutations/EntityMutationBase.ts +0 -110
  64. package/src/libs/mobx-query/mutations/MutationBase.ts +0 -40
  65. package/src/libs/mobx-query/mutations/OptimisticMutationStrategy.ts +0 -122
  66. package/src/libs/mobx-query/mutations/UpdateMutation.ts +0 -76
  67. package/src/libs/mobx-query/mutations/constants.ts +0 -16
  68. package/src/libs/mobx-query/mutations/index.ts +0 -44
  69. package/src/libs/mobx-query/mutations/types.ts +0 -205
  70. package/src/libs/mobx-query/queries/QueryBase.ts +0 -65
  71. package/src/libs/mobx-query/queries/QueryFragmentMany.ts +0 -31
  72. package/src/libs/mobx-query/queries/QueryFragmentOne.ts +0 -35
  73. package/src/libs/mobx-query/queries/QueryMany.ts +0 -80
  74. package/src/libs/mobx-query/queries/QueryManyBase.ts +0 -135
  75. package/src/libs/mobx-query/queries/QueryOne.ts +0 -84
  76. package/src/libs/mobx-query/queries/QueryOneBase.ts +0 -93
  77. package/src/libs/mobx-query/queries/index.ts +0 -33
  78. package/src/libs/mobx-query/queries/types.ts +0 -60
  79. package/src/libs/mobx-query/react/createReactContext.tsx +0 -23
  80. package/src/libs/mobx-query/react/index.ts +0 -3
  81. package/src/libs/mobx-query/utils/generateEntityId.ts +0 -12
  82. package/src/libs/mobx-query/utils/index.ts +0 -8
  83. package/src/libs/mobx-query/utils/invalidateQueryByHash.ts +0 -18
  84. package/src/libs/mobx-query/utils/types.ts +0 -18
  85. package/src/libs/react-query.ts +0 -11
  86. package/src/main.tsx +0 -16
  87. package/src/utils.ts +0 -3
  88. package/src/vite-env.d.ts +0 -1
  89. package/tsconfig.app.json +0 -27
  90. package/tsconfig.json +0 -7
  91. package/tsconfig.node.json +0 -25
  92. package/vite.config.ts +0 -52
  93. /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
- }