@livestore/react 0.4.0-dev.16 → 0.4.0-dev.18

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 (36) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/LiveStoreProvider.test.js +2 -2
  3. package/dist/LiveStoreProvider.test.js.map +1 -1
  4. package/dist/experimental/multi-store/StoreRegistry.d.ts.map +1 -1
  5. package/dist/experimental/multi-store/StoreRegistry.js +58 -58
  6. package/dist/experimental/multi-store/StoreRegistry.js.map +1 -1
  7. package/dist/experimental/multi-store/StoreRegistry.test.d.ts +2 -0
  8. package/dist/experimental/multi-store/StoreRegistry.test.d.ts.map +1 -0
  9. package/dist/experimental/multi-store/StoreRegistry.test.js +373 -0
  10. package/dist/experimental/multi-store/StoreRegistry.test.js.map +1 -0
  11. package/dist/experimental/multi-store/useStore.d.ts.map +1 -1
  12. package/dist/experimental/multi-store/useStore.js +7 -3
  13. package/dist/experimental/multi-store/useStore.js.map +1 -1
  14. package/dist/experimental/multi-store/useStore.test.d.ts +2 -0
  15. package/dist/experimental/multi-store/useStore.test.d.ts.map +1 -0
  16. package/dist/experimental/multi-store/useStore.test.js +144 -0
  17. package/dist/experimental/multi-store/useStore.test.js.map +1 -0
  18. package/dist/useClientDocument.js +1 -1
  19. package/dist/useClientDocument.js.map +1 -1
  20. package/dist/useClientDocument.test.js +7 -3
  21. package/dist/useClientDocument.test.js.map +1 -1
  22. package/dist/useQuery.d.ts.map +1 -1
  23. package/dist/useQuery.js +3 -3
  24. package/dist/useQuery.js.map +1 -1
  25. package/dist/useQuery.test.js +9 -9
  26. package/dist/useQuery.test.js.map +1 -1
  27. package/package.json +6 -6
  28. package/src/LiveStoreProvider.test.tsx +2 -2
  29. package/src/experimental/multi-store/StoreRegistry.test.ts +511 -0
  30. package/src/experimental/multi-store/StoreRegistry.ts +63 -64
  31. package/src/experimental/multi-store/useStore.test.tsx +197 -0
  32. package/src/experimental/multi-store/useStore.ts +7 -3
  33. package/src/useClientDocument.test.tsx +73 -72
  34. package/src/useClientDocument.ts +1 -1
  35. package/src/useQuery.test.tsx +15 -9
  36. package/src/useQuery.ts +4 -3
@@ -0,0 +1,373 @@
1
+ import { makeInMemoryAdapter } from '@livestore/adapter-web';
2
+ import { StoreInternalsSymbol } from '@livestore/livestore';
3
+ import { afterEach, describe, expect, it, vi } from 'vitest';
4
+ import { schema } from "../../__tests__/fixture.js";
5
+ import { DEFAULT_GC_TIME, StoreRegistry } from "./StoreRegistry.js";
6
+ import { storeOptions } from "./storeOptions.js";
7
+ describe('StoreRegistry', () => {
8
+ afterEach(() => {
9
+ vi.clearAllTimers();
10
+ vi.useRealTimers();
11
+ });
12
+ it('returns a Promise when the store is loading', async () => {
13
+ const registry = new StoreRegistry();
14
+ const result = registry.getOrLoad(testStoreOptions());
15
+ expect(result).toBeInstanceOf(Promise);
16
+ // Clean up
17
+ const store = await result;
18
+ await store.shutdownPromise();
19
+ });
20
+ it('returns cached store synchronously after first load resolves', async () => {
21
+ const registry = new StoreRegistry();
22
+ const initial = registry.getOrLoad(testStoreOptions());
23
+ expect(initial).toBeInstanceOf(Promise);
24
+ const store = await initial;
25
+ const cached = registry.getOrLoad(testStoreOptions());
26
+ expect(cached).toBe(store);
27
+ expect(cached).not.toBeInstanceOf(Promise);
28
+ // Clean up
29
+ await store.shutdownPromise();
30
+ });
31
+ it('reuses the same promise for concurrent getOrLoad calls while loading', async () => {
32
+ const registry = new StoreRegistry();
33
+ const options = testStoreOptions();
34
+ const first = registry.getOrLoad(options);
35
+ const second = registry.getOrLoad(options);
36
+ // Both should be the same promise
37
+ expect(first).toBe(second);
38
+ expect(first).toBeInstanceOf(Promise);
39
+ const store = await first;
40
+ // Both promises should resolve to the same store
41
+ expect(await second).toBe(store);
42
+ // Clean up
43
+ await store.shutdownPromise();
44
+ });
45
+ it('stores and rethrows the rejection on subsequent getOrLoad calls after a failure', async () => {
46
+ const registry = new StoreRegistry();
47
+ // Create an invalid adapter that will cause an error
48
+ const badOptions = testStoreOptions({
49
+ // @ts-expect-error - intentionally passing invalid adapter to trigger error
50
+ adapter: null,
51
+ });
52
+ await expect(registry.getOrLoad(badOptions)).rejects.toThrow();
53
+ // Subsequent call should throw the cached error synchronously
54
+ expect(() => registry.getOrLoad(badOptions)).toThrow();
55
+ });
56
+ it('disposes store after gc timeout expires', async () => {
57
+ vi.useFakeTimers();
58
+ const registry = new StoreRegistry();
59
+ const gcTime = 25;
60
+ const options = testStoreOptions({ gcTime });
61
+ const store = await registry.getOrLoad(options);
62
+ // Store should be cached
63
+ expect(registry.getOrLoad(options)).toBe(store);
64
+ // Advance time to trigger GC
65
+ await vi.advanceTimersByTimeAsync(gcTime);
66
+ // After GC, store should be disposed
67
+ // The store is removed from cache, so next getOrLoad creates a new one
68
+ const nextStore = await registry.getOrLoad(options);
69
+ // Should be a different store instance
70
+ expect(nextStore).not.toBe(store);
71
+ expect(nextStore[StoreInternalsSymbol].clientSession.debugInstanceId).toBeDefined();
72
+ // Clean up the second store (first one was cleaned up by GC)
73
+ await nextStore.shutdownPromise();
74
+ });
75
+ it('keeps the longest gcTime seen for a store when options vary across calls', async () => {
76
+ vi.useFakeTimers();
77
+ const registry = new StoreRegistry();
78
+ const options = testStoreOptions({ gcTime: 10 });
79
+ const unsubscribe = registry.subscribe(options.storeId, () => { });
80
+ const store = await registry.getOrLoad(options);
81
+ // Call with longer gcTime
82
+ await registry.getOrLoad(testStoreOptions({ gcTime: 100 }));
83
+ unsubscribe();
84
+ // After 99ms, store should still be alive (100ms gcTime used)
85
+ await vi.advanceTimersByTimeAsync(99);
86
+ // Store should still be cached
87
+ expect(registry.getOrLoad(options)).toBe(store);
88
+ // After the full 100ms, store should be disposed
89
+ await vi.advanceTimersByTimeAsync(1);
90
+ // Next getOrLoad should create a new store
91
+ const nextStore = await registry.getOrLoad(options);
92
+ expect(nextStore).not.toBe(store);
93
+ // Clean up the second store (first one was cleaned up by GC)
94
+ await nextStore.shutdownPromise();
95
+ });
96
+ it('preload does not throw', async () => {
97
+ const registry = new StoreRegistry();
98
+ // Create invalid options that would cause an error
99
+ const badOptions = testStoreOptions({
100
+ // @ts-expect-error - intentionally passing invalid adapter to trigger error
101
+ adapter: null,
102
+ });
103
+ // preload should not throw
104
+ await expect(registry.preload(badOptions)).resolves.toBeUndefined();
105
+ // But subsequent getOrLoad should throw the cached error
106
+ expect(() => registry.getOrLoad(badOptions)).toThrow();
107
+ });
108
+ it('does not garbage collect when gcTime is Infinity', async () => {
109
+ vi.useFakeTimers();
110
+ const registry = new StoreRegistry();
111
+ const options = testStoreOptions({ gcTime: Number.POSITIVE_INFINITY });
112
+ const store = await registry.getOrLoad(options);
113
+ // Store should be cached
114
+ expect(registry.getOrLoad(options)).toBe(store);
115
+ // Advance time by a very long duration
116
+ await vi.advanceTimersByTimeAsync(1000000);
117
+ // Store should still be cached (not garbage collected)
118
+ expect(registry.getOrLoad(options)).toBe(store);
119
+ // Clean up manually
120
+ await store.shutdownPromise();
121
+ });
122
+ it('throws the same error instance on multiple synchronous calls after failure', async () => {
123
+ const registry = new StoreRegistry();
124
+ const badOptions = testStoreOptions({
125
+ // @ts-expect-error - intentionally passing invalid adapter to trigger error
126
+ adapter: null,
127
+ });
128
+ // Wait for the first failure
129
+ await expect(registry.getOrLoad(badOptions)).rejects.toThrow();
130
+ // Capture the errors from subsequent synchronous calls
131
+ let error1;
132
+ let error2;
133
+ try {
134
+ registry.getOrLoad(badOptions);
135
+ }
136
+ catch (err) {
137
+ error1 = err;
138
+ }
139
+ try {
140
+ registry.getOrLoad(badOptions);
141
+ }
142
+ catch (err) {
143
+ error2 = err;
144
+ }
145
+ // Both should be the exact same error instance (cached)
146
+ expect(error1).toBeDefined();
147
+ expect(error1).toBe(error2);
148
+ });
149
+ it('notifies subscribers when store state changes', async () => {
150
+ const registry = new StoreRegistry();
151
+ const options = testStoreOptions();
152
+ let notificationCount = 0;
153
+ const listener = () => {
154
+ notificationCount++;
155
+ };
156
+ const unsubscribe = registry.subscribe(options.storeId, listener);
157
+ // Start loading the store
158
+ const storePromise = registry.getOrLoad(options);
159
+ // Listener should be called when store starts loading
160
+ expect(notificationCount).toBe(1);
161
+ const store = await storePromise;
162
+ // Listener should be called when store loads successfully
163
+ expect(notificationCount).toBe(2);
164
+ unsubscribe();
165
+ // Clean up
166
+ await store.shutdownPromise();
167
+ });
168
+ it('handles rapid subscribe/unsubscribe cycles without errors', async () => {
169
+ vi.useFakeTimers();
170
+ const registry = new StoreRegistry();
171
+ const gcTime = 50;
172
+ const options = testStoreOptions({ gcTime });
173
+ const store = await registry.getOrLoad(options);
174
+ // Rapidly subscribe and unsubscribe multiple times
175
+ for (let i = 0; i < 10; i++) {
176
+ const unsubscribe = registry.subscribe(options.storeId, () => { });
177
+ unsubscribe();
178
+ }
179
+ // Advance time to check if GC is scheduled correctly
180
+ await vi.advanceTimersByTimeAsync(gcTime);
181
+ // Store should be disposed after the last unsubscribe
182
+ const nextStore = await registry.getOrLoad(options);
183
+ expect(nextStore).not.toBe(store);
184
+ await nextStore.shutdownPromise();
185
+ });
186
+ it('swallows errors thrown by subscribers during notification', async () => {
187
+ const registry = new StoreRegistry();
188
+ const options = testStoreOptions();
189
+ let errorListenerCalled = false;
190
+ let goodListenerCalled = false;
191
+ const errorListener = () => {
192
+ errorListenerCalled = true;
193
+ throw new Error('Listener error');
194
+ };
195
+ const goodListener = () => {
196
+ goodListenerCalled = true;
197
+ };
198
+ registry.subscribe(options.storeId, errorListener);
199
+ registry.subscribe(options.storeId, goodListener);
200
+ // Should not throw despite errorListener throwing
201
+ const store = await registry.getOrLoad(options);
202
+ // Both listeners should have been called
203
+ expect(errorListenerCalled).toBe(true);
204
+ expect(goodListenerCalled).toBe(true);
205
+ await store.shutdownPromise();
206
+ });
207
+ it('supports concurrent load and subscribe operations', async () => {
208
+ const registry = new StoreRegistry();
209
+ const options = testStoreOptions();
210
+ let notificationCount = 0;
211
+ const listener = () => {
212
+ notificationCount++;
213
+ };
214
+ // Subscribe before loading starts
215
+ const unsubscribe = registry.subscribe(options.storeId, listener);
216
+ // Start loading
217
+ const storePromise = registry.getOrLoad(options);
218
+ // Listener should be notified when loading starts
219
+ expect(notificationCount).toBeGreaterThan(0);
220
+ const store = await storePromise;
221
+ // Listener should be notified when loading completes
222
+ expect(notificationCount).toBe(2);
223
+ unsubscribe();
224
+ // Clean up
225
+ await store.shutdownPromise();
226
+ });
227
+ it('cancels GC when a new subscription is added', async () => {
228
+ vi.useFakeTimers();
229
+ const registry = new StoreRegistry();
230
+ const gcTime = 50;
231
+ const options = testStoreOptions({ gcTime });
232
+ const store = await registry.getOrLoad(options);
233
+ // Advance time almost to GC threshold
234
+ await vi.advanceTimersByTimeAsync(gcTime - 5);
235
+ // Add a new subscription before GC triggers
236
+ const unsubscribe = registry.subscribe(options.storeId, () => { });
237
+ // Complete the original GC time
238
+ await vi.advanceTimersByTimeAsync(5);
239
+ // Store should not have been disposed because we added a subscription
240
+ expect(registry.getOrLoad(options)).toBe(store);
241
+ // Clean up
242
+ unsubscribe();
243
+ await vi.advanceTimersByTimeAsync(gcTime);
244
+ // Now it should be disposed
245
+ const nextStore = await registry.getOrLoad(options);
246
+ expect(nextStore).not.toBe(store);
247
+ await nextStore.shutdownPromise();
248
+ });
249
+ it('schedules GC if store becomes inactive during loading', async () => {
250
+ vi.useFakeTimers();
251
+ const registry = new StoreRegistry();
252
+ const gcTime = 50;
253
+ const options = testStoreOptions({ gcTime });
254
+ // Start loading without any subscription
255
+ const storePromise = registry.getOrLoad(options);
256
+ // Wait for store to load (no subscribers registered)
257
+ const store = await storePromise;
258
+ // Since there were no subscribers when loading completed, GC should be scheduled
259
+ await vi.advanceTimersByTimeAsync(gcTime);
260
+ // Store should be disposed
261
+ const nextStore = await registry.getOrLoad(options);
262
+ expect(nextStore).not.toBe(store);
263
+ await nextStore.shutdownPromise();
264
+ });
265
+ it('manages multiple stores with different IDs independently', async () => {
266
+ vi.useFakeTimers();
267
+ const registry = new StoreRegistry();
268
+ const options1 = testStoreOptions({ storeId: 'store-1', gcTime: 50 });
269
+ const options2 = testStoreOptions({ storeId: 'store-2', gcTime: 100 });
270
+ const store1 = await registry.getOrLoad(options1);
271
+ const store2 = await registry.getOrLoad(options2);
272
+ // Should be different store instances
273
+ expect(store1).not.toBe(store2);
274
+ // Both should be cached independently
275
+ expect(registry.getOrLoad(options1)).toBe(store1);
276
+ expect(registry.getOrLoad(options2)).toBe(store2);
277
+ // Advance time to dispose store1 only
278
+ await vi.advanceTimersByTimeAsync(50);
279
+ // store1 should be disposed, store2 should still be cached
280
+ const newStore1 = await registry.getOrLoad(options1);
281
+ expect(newStore1).not.toBe(store1);
282
+ expect(registry.getOrLoad(options2)).toBe(store2);
283
+ // Subscribe to prevent GC of newStore1
284
+ const unsub1 = registry.subscribe(options1.storeId, () => { });
285
+ // Advance remaining time to dispose store2
286
+ await vi.advanceTimersByTimeAsync(50);
287
+ // store2 should be disposed
288
+ const newStore2 = await registry.getOrLoad(options2);
289
+ expect(newStore2).not.toBe(store2);
290
+ // Subscribe to prevent GC of newStore2
291
+ const unsub2 = registry.subscribe(options2.storeId, () => { });
292
+ // Clean up
293
+ unsub1();
294
+ unsub2();
295
+ await newStore1.shutdownPromise();
296
+ await newStore2.shutdownPromise();
297
+ });
298
+ it('applies default options from constructor', async () => {
299
+ vi.useFakeTimers();
300
+ const registry = new StoreRegistry({
301
+ defaultOptions: {
302
+ gcTime: DEFAULT_GC_TIME * 2,
303
+ },
304
+ });
305
+ const options = testStoreOptions();
306
+ const store = await registry.getOrLoad(options);
307
+ // Verify the store loads successfully
308
+ expect(store).toBeDefined();
309
+ expect(store[StoreInternalsSymbol].clientSession.debugInstanceId).toBeDefined();
310
+ // Verify configured default gcTime is applied by checking GC doesn't happen at library's default gc time
311
+ await vi.advanceTimersByTimeAsync(DEFAULT_GC_TIME);
312
+ // Store should still be cached after default gc time
313
+ expect(registry.getOrLoad(options)).toBe(store);
314
+ await store.shutdownPromise();
315
+ });
316
+ it('allows call-site options to override default options', async () => {
317
+ vi.useFakeTimers();
318
+ const registry = new StoreRegistry({
319
+ defaultOptions: {
320
+ gcTime: 1000, // Default is long
321
+ },
322
+ });
323
+ const options = testStoreOptions({
324
+ gcTime: 10, // Override with shorter time
325
+ });
326
+ const store = await registry.getOrLoad(options);
327
+ // Advance by the override time (10ms)
328
+ await vi.advanceTimersByTimeAsync(10);
329
+ // Should be disposed according to the override time, not default
330
+ const nextStore = await registry.getOrLoad(options);
331
+ expect(nextStore).not.toBe(store);
332
+ await nextStore.shutdownPromise();
333
+ });
334
+ it('warms the cache so subsequent getOrLoad is synchronous after preload', async () => {
335
+ const registry = new StoreRegistry();
336
+ const options = testStoreOptions();
337
+ // Preload the store
338
+ await registry.preload(options);
339
+ // Subsequent getOrLoad should return synchronously (not a Promise)
340
+ const store = registry.getOrLoad(options);
341
+ expect(store).not.toBeInstanceOf(Promise);
342
+ // TypeScript doesn't narrow the type, so we need to assert
343
+ if (store instanceof Promise) {
344
+ throw new Error('Expected store, got Promise');
345
+ }
346
+ // Clean up
347
+ await store.shutdownPromise();
348
+ });
349
+ it('schedules GC after preload if no subscribers are added', async () => {
350
+ vi.useFakeTimers();
351
+ const registry = new StoreRegistry();
352
+ const gcTime = 50;
353
+ const options = testStoreOptions({ gcTime });
354
+ // Preload without subscribing
355
+ await registry.preload(options);
356
+ // Get the store
357
+ const store = registry.getOrLoad(options);
358
+ expect(store).not.toBeInstanceOf(Promise);
359
+ // Advance time to trigger GC
360
+ await vi.advanceTimersByTimeAsync(gcTime);
361
+ // Store should be disposed since no subscribers were added
362
+ const nextStore = await registry.getOrLoad(options);
363
+ expect(nextStore).not.toBe(store);
364
+ await nextStore.shutdownPromise();
365
+ });
366
+ });
367
+ const testStoreOptions = (overrides = {}) => storeOptions({
368
+ storeId: 'test-store',
369
+ schema,
370
+ adapter: makeInMemoryAdapter(),
371
+ ...overrides,
372
+ });
373
+ //# sourceMappingURL=StoreRegistry.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StoreRegistry.test.js","sourceRoot":"","sources":["../../../src/experimental/multi-store/StoreRegistry.test.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"useStore.d.ts","sourceRoot":"","sources":["../../../src/experimental/multi-store/useStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAEjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAGzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEpD;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,SAAS,eAAe,EACtD,SAAS,kBAAkB,CAAC,OAAO,CAAC,KACnC,KAAK,CAAC,OAAO,CAAC,GAAG,QAcnB,CAAA"}
1
+ {"version":3,"file":"useStore.d.ts","sourceRoot":"","sources":["../../../src/experimental/multi-store/useStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAA;AAC/D,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAEjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAGzD,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAA;AAEpD;;;;GAIG;AACH,eAAO,MAAM,QAAQ,GAAI,OAAO,SAAS,eAAe,EACtD,SAAS,kBAAkB,CAAC,OAAO,CAAC,KACnC,KAAK,CAAC,OAAO,CAAC,GAAG,QAkBnB,CAAA"}
@@ -9,9 +9,13 @@ import { useStoreRegistry } from "./StoreRegistryContext.js";
9
9
  export const useStore = (options) => {
10
10
  const storeRegistry = useStoreRegistry();
11
11
  const subscribe = React.useCallback((onChange) => storeRegistry.subscribe(options.storeId, onChange), [storeRegistry, options.storeId]);
12
- const getSnapshot = React.useCallback(() => storeRegistry.getOrLoad(options), [storeRegistry, options]);
13
- const storeOrPromise = React.useSyncExternalStore(subscribe, getSnapshot);
14
- const loadedStore = storeOrPromise instanceof Promise ? React.use(storeOrPromise) : storeOrPromise;
12
+ const getSnapshot = React.useCallback(() => {
13
+ const storeOrPromise = storeRegistry.getOrLoad(options);
14
+ if (storeOrPromise instanceof Promise)
15
+ throw storeOrPromise;
16
+ return storeOrPromise;
17
+ }, [storeRegistry, options]);
18
+ const loadedStore = React.useSyncExternalStore(subscribe, getSnapshot, getSnapshot);
15
19
  return withReactApi(loadedStore);
16
20
  };
17
21
  //# sourceMappingURL=useStore.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useStore.js","sourceRoot":"","sources":["../../../src/experimental/multi-store/useStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA4B,CAAA;AAG7D;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,OAAoC,EACT,EAAE;IAC7B,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAA;IAExC,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CACjC,CAAC,QAAoB,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC5E,CAAC,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,CACjC,CAAA;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAA;IAEvG,MAAM,cAAc,GAAG,KAAK,CAAC,oBAAoB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IAEzE,MAAM,WAAW,GAAG,cAAc,YAAY,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,cAAc,CAAA;IAElG,OAAO,YAAY,CAAC,WAAW,CAAC,CAAA;AAClC,CAAC,CAAA"}
1
+ {"version":3,"file":"useStore.js","sourceRoot":"","sources":["../../../src/experimental/multi-store/useStore.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,EAAE,gBAAgB,EAAE,MAAM,2BAA4B,CAAA;AAG7D;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CACtB,OAAoC,EACT,EAAE;IAC7B,MAAM,aAAa,GAAG,gBAAgB,EAAE,CAAA;IAExC,MAAM,SAAS,GAAG,KAAK,CAAC,WAAW,CACjC,CAAC,QAAoB,EAAE,EAAE,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,EAC5E,CAAC,aAAa,EAAE,OAAO,CAAC,OAAO,CAAC,CACjC,CAAA;IACD,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE;QACzC,MAAM,cAAc,GAAG,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;QAEvD,IAAI,cAAc,YAAY,OAAO;YAAE,MAAM,cAAc,CAAA;QAE3D,OAAO,cAAc,CAAA;IACvB,CAAC,EAAE,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC,CAAA;IAE5B,MAAM,WAAW,GAAG,KAAK,CAAC,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,WAAW,CAAC,CAAA;IAEnF,OAAO,YAAY,CAAC,WAAW,CAAC,CAAA;AAClC,CAAC,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useStore.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStore.test.d.ts","sourceRoot":"","sources":["../../../src/experimental/multi-store/useStore.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,144 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import { makeInMemoryAdapter } from '@livestore/adapter-web';
3
+ import { StoreInternalsSymbol } from '@livestore/livestore';
4
+ import { render, renderHook, waitFor } from '@testing-library/react';
5
+ import * as React from 'react';
6
+ import { afterEach, describe, expect, it, vi } from 'vitest';
7
+ import { schema } from "../../__tests__/fixture.js";
8
+ import { StoreRegistry } from "./StoreRegistry.js";
9
+ import { StoreRegistryProvider } from "./StoreRegistryContext.js";
10
+ import { storeOptions } from "./storeOptions.js";
11
+ import { useStore } from "./useStore.js";
12
+ describe('experimental useStore', () => {
13
+ afterEach(() => {
14
+ vi.clearAllTimers();
15
+ vi.useRealTimers();
16
+ });
17
+ it('suspends when the store is loading', async () => {
18
+ const registry = new StoreRegistry();
19
+ const options = testStoreOptions();
20
+ const view = render(_jsx(StoreRegistryProvider, { storeRegistry: registry, children: _jsx(React.Suspense, { fallback: _jsx("div", { "data-testid": "fallback" }), children: _jsx(StoreConsumer, { options: options }) }) }));
21
+ // Should show fallback while loading
22
+ expect(view.getByTestId('fallback')).toBeDefined();
23
+ // Wait for store to load and component to render
24
+ await waitForSuspenseResolved(view);
25
+ expect(view.getByTestId('ready')).toBeDefined();
26
+ cleanupWithPendingTimers(() => view.unmount());
27
+ });
28
+ it('does not re-suspend on subsequent renders when store is already loaded', async () => {
29
+ const registry = new StoreRegistry();
30
+ const options = testStoreOptions();
31
+ const Wrapper = ({ opts }) => (_jsx(StoreRegistryProvider, { storeRegistry: registry, children: _jsx(React.Suspense, { fallback: _jsx("div", { "data-testid": "fallback" }), children: _jsx(StoreConsumer, { options: opts }) }) }));
32
+ const view = render(_jsx(Wrapper, { opts: options }));
33
+ // Wait for initial load
34
+ await waitForSuspenseResolved(view);
35
+ expect(view.getByTestId('ready')).toBeDefined();
36
+ // Rerender with new options object (but same storeId)
37
+ view.rerender(_jsx(Wrapper, { opts: { ...options } }));
38
+ // Should not show fallback
39
+ expect(view.queryByTestId('fallback')).toBeNull();
40
+ expect(view.getByTestId('ready')).toBeDefined();
41
+ cleanupWithPendingTimers(() => view.unmount());
42
+ });
43
+ it('throws when store loading fails', async () => {
44
+ const registry = new StoreRegistry();
45
+ const badOptions = testStoreOptions({
46
+ // @ts-expect-error - intentionally passing invalid adapter to trigger error
47
+ adapter: null,
48
+ });
49
+ // Pre-load the store to cache the error
50
+ await expect(registry.getOrLoad(badOptions)).rejects.toThrow();
51
+ // Now when useStore tries to get it, it should throw synchronously
52
+ expect(() => renderHook(() => useStore(badOptions), {
53
+ wrapper: makeProvider(registry),
54
+ })).toThrow();
55
+ });
56
+ it.each([
57
+ { label: 'non-strict mode', strictMode: false },
58
+ { label: 'strict mode', strictMode: true },
59
+ ])('works in $label', async ({ strictMode }) => {
60
+ const registry = new StoreRegistry();
61
+ const options = testStoreOptions();
62
+ const { result, unmount } = renderHook(() => useStore(options), {
63
+ wrapper: makeProvider(registry, { suspense: true }),
64
+ reactStrictMode: strictMode,
65
+ });
66
+ // Wait for store to be ready
67
+ await waitForStoreReady(result);
68
+ expect(result.current[StoreInternalsSymbol].clientSession).toBeDefined();
69
+ cleanupWithPendingTimers(unmount);
70
+ });
71
+ it('handles switching between different storeId values', async () => {
72
+ const registry = new StoreRegistry();
73
+ const optionsA = testStoreOptions({ storeId: 'store-a' });
74
+ const optionsB = testStoreOptions({ storeId: 'store-b' });
75
+ const { result, rerender, unmount } = renderHook((opts) => useStore(opts), {
76
+ initialProps: optionsA,
77
+ wrapper: makeProvider(registry, { suspense: true }),
78
+ });
79
+ // Wait for first store to load
80
+ await waitForStoreReady(result);
81
+ const storeA = result.current;
82
+ expect(storeA[StoreInternalsSymbol].clientSession).toBeDefined();
83
+ // Switch to different storeId
84
+ rerender(optionsB);
85
+ // Wait for second store to load and verify it's different from the first
86
+ await waitFor(() => {
87
+ expect(result.current).not.toBe(storeA);
88
+ expect(result.current?.[StoreInternalsSymbol].clientSession).toBeDefined();
89
+ });
90
+ const storeB = result.current;
91
+ expect(storeB[StoreInternalsSymbol].clientSession).toBeDefined();
92
+ expect(storeB).not.toBe(storeA);
93
+ cleanupWithPendingTimers(unmount);
94
+ });
95
+ });
96
+ const StoreConsumer = ({ options }) => {
97
+ useStore(options);
98
+ return _jsx("div", { "data-testid": "ready" });
99
+ };
100
+ const makeProvider = (registry, { suspense = false } = {}) => ({ children }) => {
101
+ let content = _jsx(StoreRegistryProvider, { storeRegistry: registry, children: children });
102
+ if (suspense) {
103
+ content = _jsx(React.Suspense, { fallback: null, children: content });
104
+ }
105
+ return content;
106
+ };
107
+ const testStoreOptions = (overrides = {}) => storeOptions({
108
+ storeId: 'test-store',
109
+ schema,
110
+ adapter: makeInMemoryAdapter(),
111
+ ...overrides,
112
+ });
113
+ /**
114
+ * Cleans up after component unmount by synchronously executing any pending GC timers.
115
+ *
116
+ * When components using stores unmount, the StoreRegistry schedules garbage collection
117
+ * timers for inactive stores. Without this cleanup, those timers may fire during
118
+ * subsequent tests, causing cross-test pollution and flaky failures.
119
+ *
120
+ * This helper switches to fake timers, executes only the already-pending timers
121
+ * (allowing stores to shut down cleanly), then restores real timers for the next test.
122
+ */
123
+ const cleanupWithPendingTimers = (cleanup) => {
124
+ vi.useFakeTimers();
125
+ cleanup();
126
+ vi.runOnlyPendingTimers();
127
+ };
128
+ /**
129
+ * Waits for React Suspense fallback to resolve and the actual content to render.
130
+ */
131
+ const waitForSuspenseResolved = async (view) => {
132
+ await waitFor(() => expect(view.queryByTestId('fallback')).toBeNull());
133
+ };
134
+ /**
135
+ * Waits for a store to be fully loaded and ready to use.
136
+ * The store is considered ready when it has a defined clientSession.
137
+ */
138
+ const waitForStoreReady = async (result) => {
139
+ await waitFor(() => {
140
+ expect(result.current).not.toBeNull();
141
+ expect(result.current[StoreInternalsSymbol].clientSession).toBeDefined();
142
+ });
143
+ };
144
+ //# sourceMappingURL=useStore.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStore.test.js","sourceRoot":"","sources":["../../../src/experimental/multi-store/useStore.test.tsx"],"names":[],"mappings":"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"}
@@ -48,7 +48,7 @@ export const useClientDocument = (table, idOrOptions, options_, storeArg) => {
48
48
  React.useContext(LiveStoreContext)?.store ??
49
49
  shouldNeverHappen(`No store provided to useClientDocument`);
50
50
  // console.debug('useClientDocument', tableName, id)
51
- const idStr = id === SessionIdSymbol ? store.clientSession.sessionId : id;
51
+ const idStr = id === SessionIdSymbol ? store.sessionId : id;
52
52
  const queryDef = React.useMemo(() => queryDb(table.get(id, { default: defaultValues }), {
53
53
  deps: [idStr, table.sqliteDef.name, JSON.stringify(defaultValues)],
54
54
  }), [table, id, defaultValues, idStr]);
@@ -1 +1 @@
1
- {"version":3,"file":"useClientDocument.js","sourceRoot":"","sources":["../src/useClientDocument.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useClientDocument.js","sourceRoot":"","sources":["../src/useClientDocument.ts"],"names":[],"mappings":"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"}