@signalium/query 0.0.0 → 0.0.2

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 (95) hide show
  1. package/.turbo/turbo-build.log +12 -0
  2. package/CHANGELOG.md +17 -0
  3. package/dist/cjs/EntityMap.js +46 -0
  4. package/dist/cjs/EntityMap.js.map +1 -0
  5. package/dist/cjs/QueryClient.js +368 -0
  6. package/dist/cjs/QueryClient.js.map +1 -0
  7. package/dist/cjs/QueryStore.js +222 -0
  8. package/dist/cjs/QueryStore.js.map +1 -0
  9. package/dist/cjs/errors.js +105 -0
  10. package/dist/cjs/errors.js.map +1 -0
  11. package/dist/cjs/index.js +24 -0
  12. package/dist/cjs/index.js.map +1 -0
  13. package/dist/cjs/parseEntities.js +127 -0
  14. package/dist/cjs/parseEntities.js.map +1 -0
  15. package/dist/cjs/pathInterpolator.js +69 -0
  16. package/dist/cjs/pathInterpolator.js.map +1 -0
  17. package/dist/cjs/proxy.js +187 -0
  18. package/dist/cjs/proxy.js.map +1 -0
  19. package/dist/cjs/query.js +41 -0
  20. package/dist/cjs/query.js.map +1 -0
  21. package/dist/cjs/tsconfig.cjs.tsbuildinfo +1 -0
  22. package/dist/cjs/typeDefs.js +249 -0
  23. package/dist/cjs/typeDefs.js.map +1 -0
  24. package/dist/cjs/types.js +15 -0
  25. package/dist/cjs/types.js.map +1 -0
  26. package/dist/cjs/utils.js +65 -0
  27. package/dist/cjs/utils.js.map +1 -0
  28. package/dist/esm/EntityMap.d.ts +18 -0
  29. package/dist/esm/EntityMap.d.ts.map +1 -0
  30. package/dist/esm/EntityMap.js +42 -0
  31. package/dist/esm/EntityMap.js.map +1 -0
  32. package/dist/esm/QueryClient.d.ts +123 -0
  33. package/dist/esm/QueryClient.d.ts.map +1 -0
  34. package/dist/esm/QueryClient.js +363 -0
  35. package/dist/esm/QueryClient.js.map +1 -0
  36. package/dist/esm/QueryStore.d.ts +77 -0
  37. package/dist/esm/QueryStore.d.ts.map +1 -0
  38. package/dist/esm/QueryStore.js +212 -0
  39. package/dist/esm/QueryStore.js.map +1 -0
  40. package/dist/esm/errors.d.ts +4 -0
  41. package/dist/esm/errors.d.ts.map +1 -0
  42. package/dist/esm/errors.js +101 -0
  43. package/dist/esm/errors.js.map +1 -0
  44. package/dist/esm/index.d.ts +7 -0
  45. package/dist/esm/index.d.ts.map +1 -0
  46. package/dist/esm/index.js +4 -0
  47. package/dist/esm/index.js.map +1 -0
  48. package/dist/esm/parseEntities.d.ts +8 -0
  49. package/dist/esm/parseEntities.d.ts.map +1 -0
  50. package/dist/esm/parseEntities.js +120 -0
  51. package/dist/esm/parseEntities.js.map +1 -0
  52. package/dist/esm/pathInterpolator.d.ts +29 -0
  53. package/dist/esm/pathInterpolator.d.ts.map +1 -0
  54. package/dist/esm/pathInterpolator.js +66 -0
  55. package/dist/esm/pathInterpolator.js.map +1 -0
  56. package/dist/esm/proxy.d.ts +8 -0
  57. package/dist/esm/proxy.d.ts.map +1 -0
  58. package/dist/esm/proxy.js +180 -0
  59. package/dist/esm/proxy.js.map +1 -0
  60. package/dist/esm/query.d.ts +41 -0
  61. package/dist/esm/query.d.ts.map +1 -0
  62. package/dist/esm/query.js +38 -0
  63. package/dist/esm/query.js.map +1 -0
  64. package/dist/esm/typeDefs.d.ts +25 -0
  65. package/dist/esm/typeDefs.d.ts.map +1 -0
  66. package/dist/esm/typeDefs.js +239 -0
  67. package/dist/esm/typeDefs.js.map +1 -0
  68. package/dist/esm/types.d.ts +96 -0
  69. package/dist/esm/types.d.ts.map +1 -0
  70. package/dist/esm/types.js +12 -0
  71. package/dist/esm/types.js.map +1 -0
  72. package/dist/esm/utils.d.ts +6 -0
  73. package/dist/esm/utils.d.ts.map +1 -0
  74. package/dist/esm/utils.js +60 -0
  75. package/dist/esm/utils.js.map +1 -0
  76. package/dist/tsconfig.esm.tsbuildinfo +1 -0
  77. package/package.json +3 -3
  78. package/src/QueryClient.ts +321 -105
  79. package/src/QueryStore.ts +15 -7
  80. package/src/__tests__/caching-persistence.test.ts +31 -2
  81. package/src/__tests__/entity-system.test.ts +5 -1
  82. package/src/__tests__/gc-time.test.ts +327 -0
  83. package/src/__tests__/mock-fetch.test.ts +8 -4
  84. package/src/__tests__/parse-entities.test.ts +5 -1
  85. package/src/__tests__/reactivity.test.ts +5 -1
  86. package/src/__tests__/refetch-interval.test.ts +262 -0
  87. package/src/__tests__/rest-query-api.test.ts +5 -1
  88. package/src/__tests__/stale-time.test.ts +357 -0
  89. package/src/__tests__/utils.ts +28 -12
  90. package/src/__tests__/validation-edge-cases.test.ts +1 -0
  91. package/src/query.ts +2 -1
  92. package/src/react/__tests__/basic.test.tsx +9 -4
  93. package/src/react/__tests__/component.test.tsx +10 -3
  94. package/src/types.ts +11 -0
  95. package/vitest.config.ts +4 -10
@@ -0,0 +1,12 @@
1
+
2
+ > @signalium/query@0.0.2 build
3
+ > npm run build:esm && npm run build:cjs
4
+
5
+
6
+ > @signalium/query@0.0.2 build:esm
7
+ > tsc --build tsconfig.esm.json
8
+
9
+
10
+ > @signalium/query@0.0.2 build:cjs
11
+ > tsc --build tsconfig.cjs.json
12
+
package/CHANGELOG.md ADDED
@@ -0,0 +1,17 @@
1
+ # @signalium/query
2
+
3
+ ## 0.0.2
4
+
5
+ ### Patch Changes
6
+
7
+ - 6eddfdc: Adds `staleTime`, `gcTime`, and `refetchInterval` options to queries.
8
+ - Updated dependencies [6eddfdc]
9
+ - signalium@2.0.9
10
+
11
+ ## 0.0.1
12
+
13
+ ### Patch Changes
14
+
15
+ - e6c39ee: Initial Signalium Query release
16
+ - Updated dependencies [e6c39ee]
17
+ - signalium@2.0.7
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EntityStore = void 0;
4
+ const signalium_1 = require("signalium");
5
+ const proxy_js_1 = require("./proxy.js");
6
+ class EntityStore {
7
+ map = new Map();
8
+ hasEntity(key) {
9
+ return this.map.has(key);
10
+ }
11
+ getEntity(key) {
12
+ return this.map.get(key);
13
+ }
14
+ hydratePreloadedEntity(key, shape) {
15
+ const record = this.getEntity(key);
16
+ if (record === undefined) {
17
+ throw new Error(`Entity ${key} not found`);
18
+ }
19
+ record.proxy = (0, proxy_js_1.createEntityProxy)(key, record, shape);
20
+ return record;
21
+ }
22
+ setPreloadedEntity(key, obj) {
23
+ const record = {
24
+ key,
25
+ signal: (0, signalium_1.signal)(obj),
26
+ cache: new Map(),
27
+ proxy: undefined,
28
+ };
29
+ this.map.set(key, record);
30
+ return record;
31
+ }
32
+ setEntity(key, obj, shape) {
33
+ let record = this.map.get(key);
34
+ if (record === undefined) {
35
+ record = this.setPreloadedEntity(key, obj);
36
+ record.proxy = (0, proxy_js_1.createEntityProxy)(key, record, shape);
37
+ }
38
+ else {
39
+ record.signal.value = obj;
40
+ record.cache.clear();
41
+ }
42
+ return record;
43
+ }
44
+ }
45
+ exports.EntityStore = EntityStore;
46
+ //# sourceMappingURL=EntityMap.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EntityMap.js","sourceRoot":"","sources":["../../src/EntityMap.ts"],"names":[],"mappings":";;;AAAA,yCAA2C;AAE3C,yCAA+C;AAW/C,MAAa,WAAW;IACd,GAAG,GAAG,IAAI,GAAG,EAAgD,CAAC;IAEtE,SAAS,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,SAAS,CAAC,GAAW;QACnB,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAED,sBAAsB,CAAC,GAAW,EAAE,KAAgB;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,IAAI,KAAK,CAAC,UAAU,GAAG,YAAY,CAAC,CAAC;QAC7C,CAAC;QAED,MAAM,CAAC,KAAK,GAAG,IAAA,4BAAiB,EAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QAErD,OAAO,MAAsB,CAAC;IAChC,CAAC;IAED,kBAAkB,CAAC,GAAW,EAAE,GAA4B;QAC1D,MAAM,MAAM,GAA0B;YACpC,GAAG;YACH,MAAM,EAAE,IAAA,kBAAM,EAAC,GAAG,CAAC;YACnB,KAAK,EAAE,IAAI,GAAG,EAAE;YAChB,KAAK,EAAE,SAAS;SACjB,CAAC;QAEF,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAE1B,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS,CAAC,GAAW,EAAE,GAA4B,EAAE,KAAgB;QACnE,IAAI,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAE/B,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YAE3C,MAAM,CAAC,KAAK,GAAG,IAAA,4BAAiB,EAAC,GAAG,EAAE,MAAM,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,MAAM,CAAC,KAAK,GAAG,GAAG,CAAC;YAC1B,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;QAED,OAAO,MAAsB,CAAC;IAChC,CAAC;CACF;AAjDD,kCAiDC"}
@@ -0,0 +1,368 @@
1
+ "use strict";
2
+ /**
3
+ * Query Client with Entity Caching and Deduplication
4
+ *
5
+ * Features:
6
+ * - Global entity map for deduplication
7
+ * - Entity definitions with cached sub-entity paths
8
+ * - Eager entity discovery and caching
9
+ * - Permanent proxy cache for entities
10
+ * - Response caching for offline access
11
+ * - Signalium-based reactivity for entity updates
12
+ * - Self-contained validator (no external dependencies except Signalium)
13
+ */
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.QueryClientContext = exports.QueryClient = exports.QueryResultImpl = void 0;
16
+ const signalium_1 = require("signalium");
17
+ const utils_1 = require("signalium/utils");
18
+ const proxy_js_1 = require("./proxy.js");
19
+ const parseEntities_js_1 = require("./parseEntities.js");
20
+ const EntityMap_js_1 = require("./EntityMap.js");
21
+ const typeDefs_js_1 = require("./typeDefs.js");
22
+ // QueryInstance is now merged into QueryResultImpl below
23
+ const queryKeyFor = (queryDef, params) => {
24
+ return (0, utils_1.hashValue)([queryDef.id, params]);
25
+ };
26
+ const BASE_TICK_INTERVAL = 1000; // 1 second
27
+ // Refetch interval manager - uses a fixed 1-second tick
28
+ class RefetchManager {
29
+ multiplier;
30
+ intervalId;
31
+ clock = 0; // Increments by 1000ms on each tick
32
+ // Buckets: Map of actual interval -> Set of query instances
33
+ buckets = new Map();
34
+ constructor(multiplier = 1) {
35
+ this.multiplier = multiplier;
36
+ // Start the timer immediately and keep it running
37
+ const tickInterval = BASE_TICK_INTERVAL * this.multiplier;
38
+ this.intervalId = setTimeout(() => this.tick(), tickInterval);
39
+ }
40
+ addQuery(instance) {
41
+ const interval = instance.def.cache?.refetchInterval;
42
+ if (!interval) {
43
+ return;
44
+ }
45
+ const actualInterval = interval * this.multiplier;
46
+ // Add to bucket by actual interval
47
+ let bucket = this.buckets.get(actualInterval);
48
+ if (!bucket) {
49
+ bucket = new Set();
50
+ this.buckets.set(actualInterval, bucket);
51
+ }
52
+ bucket.add(instance);
53
+ }
54
+ removeQuery(query) {
55
+ const interval = query.def.cache?.refetchInterval;
56
+ if (!interval) {
57
+ return;
58
+ }
59
+ const actualInterval = interval * this.multiplier;
60
+ // Remove from bucket
61
+ const bucket = this.buckets.get(actualInterval);
62
+ if (bucket) {
63
+ bucket.delete(query);
64
+ if (bucket.size === 0) {
65
+ this.buckets.delete(actualInterval);
66
+ }
67
+ }
68
+ }
69
+ tick() {
70
+ this.clock += BASE_TICK_INTERVAL * this.multiplier;
71
+ // Only process buckets where clock is aligned with the interval
72
+ for (const [interval, bucket] of this.buckets.entries()) {
73
+ if (this.clock % interval === 0) {
74
+ // Process all queries in this bucket
75
+ for (const query of bucket) {
76
+ // Skip if already fetching - let the current fetch complete
77
+ if (query && !query.isFetching) {
78
+ query.refetch();
79
+ }
80
+ }
81
+ }
82
+ }
83
+ const tickInterval = BASE_TICK_INTERVAL * this.multiplier;
84
+ this.intervalId = setTimeout(() => this.tick(), tickInterval);
85
+ }
86
+ destroy() {
87
+ clearTimeout(this.intervalId);
88
+ }
89
+ }
90
+ const EVICTION_INTERVAL = 60 * 1000; // 1 minute
91
+ // Memory eviction manager - uses a single interval with rotating sets to avoid timeout overhead
92
+ class MemoryEvictionManager {
93
+ queryClient;
94
+ multiplier;
95
+ intervalId;
96
+ currentFlush = new Set(); // Queries to evict on next tick
97
+ nextFlush = new Set(); // Queries to evict on tick after next
98
+ constructor(queryClient, multiplier = 1) {
99
+ this.queryClient = queryClient;
100
+ this.multiplier = multiplier;
101
+ this.intervalId = setInterval(this.tick, EVICTION_INTERVAL * this.multiplier);
102
+ }
103
+ scheduleEviction(queryKey) {
104
+ // Add to nextFlush so it waits at least one full interval
105
+ // This prevents immediate eviction if scheduled right before a tick
106
+ this.nextFlush.add(queryKey);
107
+ }
108
+ cancelEviction(queryKey) {
109
+ // Remove from both sets to handle reactivation
110
+ this.currentFlush.delete(queryKey);
111
+ this.nextFlush.delete(queryKey);
112
+ }
113
+ tick = () => {
114
+ if (!this.queryClient)
115
+ return;
116
+ // Evict all queries in currentFlush
117
+ for (const queryKey of this.currentFlush) {
118
+ this.queryClient.queryInstances.delete(queryKey);
119
+ }
120
+ // Rotate: currentFlush becomes nextFlush, nextFlush becomes empty
121
+ this.currentFlush = this.nextFlush;
122
+ this.nextFlush = new Set();
123
+ };
124
+ destroy() {
125
+ clearInterval(this.intervalId);
126
+ }
127
+ }
128
+ /**
129
+ * QueryResult wraps a DiscriminatedReactivePromise and adds additional functionality
130
+ * like refetch, while forwarding all the base relay properties.
131
+ * This class combines the old QueryInstance and QueryResultImpl into a single entity.
132
+ */
133
+ class QueryResultImpl {
134
+ // Fields from old QueryInstance
135
+ def;
136
+ initialized = false;
137
+ isRefetchingSignal;
138
+ updatedAt = undefined;
139
+ // References for refetch functionality
140
+ queryClient;
141
+ queryKey;
142
+ params;
143
+ relay;
144
+ relayState = undefined;
145
+ constructor(def, queryClient, queryKey, params) {
146
+ (0, utils_1.setReactivePromise)(this);
147
+ this.def = def;
148
+ this.queryClient = queryClient;
149
+ this.queryKey = queryKey;
150
+ this.params = params;
151
+ this.isRefetchingSignal = (0, signalium_1.signal)(false);
152
+ // Create the relay and handle activation/deactivation
153
+ this.relay = (0, signalium_1.relay)(state => {
154
+ this.relayState = state;
155
+ // Load from cache first, then fetch fresh data
156
+ this.queryClient.activateQuery(this);
157
+ if (this.initialized) {
158
+ if (this.isStale()) {
159
+ this.refetch();
160
+ }
161
+ }
162
+ else {
163
+ this.initialize(state);
164
+ }
165
+ // Return deactivation callback
166
+ return {
167
+ update: () => {
168
+ state.setPromise(this.runQuery());
169
+ },
170
+ deactivate: () => {
171
+ // Last subscriber left, deactivate refetch and schedule memory eviction
172
+ if (this.def.cache?.refetchInterval) {
173
+ this.queryClient.refetchManager.removeQuery(this);
174
+ }
175
+ // Schedule removal from memory using the global eviction manager
176
+ // This allows quick reactivation from memory if needed again soon
177
+ // Disk cache (if configured) will still be available after eviction
178
+ this.queryClient.memoryEvictionManager.scheduleEviction(this.queryKey);
179
+ },
180
+ };
181
+ });
182
+ }
183
+ get value() {
184
+ return this.relay.value;
185
+ }
186
+ get error() {
187
+ return this.relay.error;
188
+ }
189
+ get isPending() {
190
+ return this.relay.isPending;
191
+ }
192
+ get isRejected() {
193
+ return this.relay.isRejected;
194
+ }
195
+ get isResolved() {
196
+ return this.relay.isResolved;
197
+ }
198
+ get isSettled() {
199
+ return this.relay.isSettled;
200
+ }
201
+ get isReady() {
202
+ return this.relay.isReady;
203
+ }
204
+ get isRefetching() {
205
+ return this.isRefetchingSignal.value;
206
+ }
207
+ get isFetching() {
208
+ return this.relay.isPending || this.isRefetching;
209
+ }
210
+ // TODO: Intimate APIs needed for `useReactive`, this is a code smell and
211
+ // we should find a better way to entangle these more generically
212
+ get _version() {
213
+ return this.relay._version;
214
+ }
215
+ get _signal() {
216
+ return this.relay._signal;
217
+ }
218
+ get _flags() {
219
+ return this.relay._flags;
220
+ }
221
+ // Forward Promise methods
222
+ then(onfulfilled, onrejected) {
223
+ return this.relay.then(onfulfilled, onrejected);
224
+ }
225
+ catch(onrejected) {
226
+ return this.relay.catch(onrejected);
227
+ }
228
+ finally(onfinally) {
229
+ return this.relay.finally(onfinally);
230
+ }
231
+ // Additional methods
232
+ async refetch() {
233
+ this.isRefetchingSignal.value = true;
234
+ try {
235
+ const result = await this.runQuery();
236
+ if (this.relayState) {
237
+ this.relayState.value = result;
238
+ // Update the version to trigger a re-render for direct React consumers
239
+ // e.g. `useReactive(query, params)`
240
+ this._version.update(v => v + 1);
241
+ }
242
+ return result;
243
+ }
244
+ finally {
245
+ this.isRefetchingSignal.value = false;
246
+ }
247
+ }
248
+ /**
249
+ * Fetches fresh data, updates the cache, and updates updatedAt timestamp
250
+ */
251
+ async runQuery() {
252
+ const freshData = await this.def.fetchFn(this.queryClient.getContext(), this.params);
253
+ // Parse and cache the fresh data
254
+ const entityRefs = new Set();
255
+ const shape = this.def.shape;
256
+ const parsedData = shape instanceof typeDefs_js_1.ValidatorDef
257
+ ? (0, parseEntities_js_1.parseEntities)(freshData, shape, this.queryClient, entityRefs)
258
+ : (0, proxy_js_1.parseValue)(freshData, shape, this.def.id);
259
+ // Cache the data (synchronous, fire-and-forget)
260
+ this.queryClient.saveQueryData(this.def, this.queryKey, freshData, entityRefs);
261
+ // Update the timestamp
262
+ this.updatedAt = Date.now();
263
+ return parsedData;
264
+ }
265
+ isStale() {
266
+ if (this.updatedAt === undefined) {
267
+ return true; // No data yet, needs fetch
268
+ }
269
+ const staleTime = this.def.cache?.staleTime ?? 0;
270
+ return Date.now() - this.updatedAt >= staleTime;
271
+ }
272
+ /**
273
+ * Initialize the query by loading from cache and fetching if stale
274
+ */
275
+ async initialize(state) {
276
+ try {
277
+ this.initialized = true;
278
+ // Load from cache first
279
+ const cached = await this.queryClient.loadCachedQuery(this.def, this.queryKey);
280
+ if (cached !== undefined) {
281
+ const shape = this.def.shape;
282
+ state.value =
283
+ shape instanceof typeDefs_js_1.ValidatorDef
284
+ ? (0, parseEntities_js_1.parseEntities)(cached.value, shape, this.queryClient, new Set())
285
+ : (0, proxy_js_1.parseValue)(cached.value, shape, this.def.id);
286
+ // Set the cached timestamp
287
+ this.updatedAt = cached.updatedAt;
288
+ // Check if data is stale
289
+ if (this.isStale()) {
290
+ // Data is stale, trigger background refetch
291
+ this.refetch();
292
+ }
293
+ }
294
+ else {
295
+ // No cached data, fetch fresh
296
+ state.setPromise(this.runQuery());
297
+ }
298
+ }
299
+ catch (error) {
300
+ // Relay will handle the error state automatically
301
+ state.setError(error);
302
+ }
303
+ }
304
+ // Make it work with Symbol.toStringTag for Promise detection
305
+ get [Symbol.toStringTag]() {
306
+ return 'QueryResult';
307
+ }
308
+ }
309
+ exports.QueryResultImpl = QueryResultImpl;
310
+ class QueryClient {
311
+ store;
312
+ context;
313
+ entityMap = new EntityMap_js_1.EntityStore();
314
+ queryInstances = new Map();
315
+ memoryEvictionManager;
316
+ refetchManager;
317
+ constructor(store, context = { fetch }) {
318
+ this.store = store;
319
+ this.context = context;
320
+ this.memoryEvictionManager = new MemoryEvictionManager(this, this.context.evictionMultiplier);
321
+ this.refetchManager = new RefetchManager(this.context.refetchMultiplier);
322
+ }
323
+ getContext() {
324
+ return this.context;
325
+ }
326
+ saveQueryData(queryDef, queryKey, data, entityRefs) {
327
+ this.store.saveQuery(queryDef, queryKey, data, entityRefs);
328
+ }
329
+ activateQuery(queryInstance) {
330
+ const { def, queryKey } = queryInstance;
331
+ this.store.activateQuery(def, queryKey);
332
+ this.refetchManager.addQuery(queryInstance);
333
+ this.memoryEvictionManager.cancelEviction(queryKey);
334
+ }
335
+ loadCachedQuery(queryDef, queryKey) {
336
+ return this.store.loadQuery(queryDef, queryKey, this.entityMap);
337
+ }
338
+ /**
339
+ * Loads a query from the document store and returns a QueryResult
340
+ * that triggers fetches and prepopulates with cached data
341
+ */
342
+ getQuery(queryDef, params) {
343
+ const queryKey = queryKeyFor(queryDef, params);
344
+ let queryInstance = this.queryInstances.get(queryKey);
345
+ // Create a new instance if it doesn't exist
346
+ if (queryInstance === undefined) {
347
+ queryInstance = new QueryResultImpl(queryDef, this, queryKey, params);
348
+ // Store for future use
349
+ this.queryInstances.set(queryKey, queryInstance);
350
+ }
351
+ return queryInstance;
352
+ }
353
+ hydrateEntity(key, shape) {
354
+ return this.entityMap.hydratePreloadedEntity(key, shape);
355
+ }
356
+ saveEntity(key, obj, shape, entityRefs) {
357
+ const record = this.entityMap.setEntity(key, obj, shape);
358
+ this.store.saveEntity(key, obj, entityRefs);
359
+ return record;
360
+ }
361
+ destroy() {
362
+ this.refetchManager.destroy();
363
+ this.memoryEvictionManager.destroy();
364
+ }
365
+ }
366
+ exports.QueryClient = QueryClient;
367
+ exports.QueryClientContext = (0, signalium_1.context)(undefined);
368
+ //# sourceMappingURL=QueryClient.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"QueryClient.js","sourceRoot":"","sources":["../../src/QueryClient.ts"],"names":[],"mappings":"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"}