@livestore/solid 0.4.0-dev.21 → 0.4.0-dev.23

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 (94) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/StoreRegistryContext.d.ts +56 -0
  3. package/dist/StoreRegistryContext.d.ts.map +1 -0
  4. package/dist/StoreRegistryContext.jsx +60 -0
  5. package/dist/StoreRegistryContext.jsx.map +1 -0
  6. package/dist/__tests__/fixture.d.ts +14 -0
  7. package/dist/__tests__/fixture.d.ts.map +1 -0
  8. package/dist/__tests__/fixture.jsx +13 -0
  9. package/dist/__tests__/fixture.jsx.map +1 -0
  10. package/dist/experimental/components/LiveList.d.ts +24 -0
  11. package/dist/experimental/components/LiveList.d.ts.map +1 -0
  12. package/dist/experimental/components/LiveList.jsx +24 -0
  13. package/dist/experimental/components/LiveList.jsx.map +1 -0
  14. package/dist/experimental/mod.d.ts +2 -0
  15. package/dist/experimental/mod.d.ts.map +1 -0
  16. package/dist/experimental/mod.js +2 -0
  17. package/dist/experimental/mod.js.map +1 -0
  18. package/dist/mod.d.ts +6 -2
  19. package/dist/mod.d.ts.map +1 -1
  20. package/dist/mod.js +4 -2
  21. package/dist/mod.js.map +1 -1
  22. package/dist/useClientDocument.client.test.d.ts +2 -0
  23. package/dist/useClientDocument.client.test.d.ts.map +1 -0
  24. package/dist/useClientDocument.client.test.jsx +177 -0
  25. package/dist/useClientDocument.client.test.jsx.map +1 -0
  26. package/dist/useClientDocument.d.ts +71 -0
  27. package/dist/useClientDocument.d.ts.map +1 -0
  28. package/dist/useClientDocument.js +74 -0
  29. package/dist/useClientDocument.js.map +1 -0
  30. package/dist/useClientDocument.server.test.d.ts +6 -0
  31. package/dist/useClientDocument.server.test.d.ts.map +1 -0
  32. package/dist/useClientDocument.server.test.jsx +76 -0
  33. package/dist/useClientDocument.server.test.jsx.map +1 -0
  34. package/dist/useQuery.client.test.d.ts +2 -0
  35. package/dist/useQuery.client.test.d.ts.map +1 -0
  36. package/dist/useQuery.client.test.jsx +165 -0
  37. package/dist/useQuery.client.test.jsx.map +1 -0
  38. package/dist/useQuery.d.ts +32 -0
  39. package/dist/useQuery.d.ts.map +1 -0
  40. package/dist/useQuery.js +64 -0
  41. package/dist/useQuery.js.map +1 -0
  42. package/dist/useQuery.server.test.d.ts +6 -0
  43. package/dist/useQuery.server.test.d.ts.map +1 -0
  44. package/dist/useQuery.server.test.jsx +88 -0
  45. package/dist/useQuery.server.test.jsx.map +1 -0
  46. package/dist/useStore.client.test.d.ts +2 -0
  47. package/dist/useStore.client.test.d.ts.map +1 -0
  48. package/dist/useStore.client.test.jsx +438 -0
  49. package/dist/useStore.client.test.jsx.map +1 -0
  50. package/dist/useStore.d.ts +91 -0
  51. package/dist/useStore.d.ts.map +1 -0
  52. package/dist/useStore.js +94 -0
  53. package/dist/useStore.js.map +1 -0
  54. package/dist/useStore.server.test.d.ts +6 -0
  55. package/dist/useStore.server.test.d.ts.map +1 -0
  56. package/dist/useStore.server.test.jsx +56 -0
  57. package/dist/useStore.server.test.jsx.map +1 -0
  58. package/dist/utils.d.ts +4 -0
  59. package/dist/utils.d.ts.map +1 -0
  60. package/dist/utils.js +7 -0
  61. package/dist/utils.js.map +1 -0
  62. package/dist/whenever.d.ts +32 -0
  63. package/dist/whenever.d.ts.map +1 -0
  64. package/dist/whenever.js +51 -0
  65. package/dist/whenever.js.map +1 -0
  66. package/package.json +65 -17
  67. package/src/StoreRegistryContext.tsx +70 -0
  68. package/src/__snapshots__/useClientDocument.client.test.tsx.snap +570 -0
  69. package/src/__snapshots__/useQuery.client.test.tsx.snap +1550 -0
  70. package/src/__tests__/fixture.tsx +42 -0
  71. package/src/experimental/components/LiveList.tsx +54 -0
  72. package/src/experimental/mod.ts +1 -0
  73. package/src/mod.ts +6 -2
  74. package/src/useClientDocument.client.test.tsx +299 -0
  75. package/src/useClientDocument.server.test.tsx +107 -0
  76. package/src/useClientDocument.ts +146 -0
  77. package/src/useQuery.client.test.tsx +293 -0
  78. package/src/useQuery.server.test.tsx +128 -0
  79. package/src/useQuery.ts +115 -0
  80. package/src/useStore.client.test.tsx +632 -0
  81. package/src/useStore.server.test.tsx +70 -0
  82. package/src/useStore.ts +179 -0
  83. package/src/utils.ts +10 -0
  84. package/src/whenever.ts +80 -0
  85. package/dist/query.d.ts +0 -4
  86. package/dist/query.d.ts.map +0 -1
  87. package/dist/query.js +0 -15
  88. package/dist/query.js.map +0 -1
  89. package/dist/store.d.ts +0 -6
  90. package/dist/store.d.ts.map +0 -1
  91. package/dist/store.js +0 -99
  92. package/dist/store.js.map +0 -1
  93. package/src/query.ts +0 -22
  94. package/src/store.ts +0 -196
@@ -0,0 +1,438 @@
1
+ import { makeInMemoryAdapter } from '@livestore/adapter-web';
2
+ import { queryDb, StoreInternalsSymbol, StoreRegistry, storeOptions, } from '@livestore/livestore';
3
+ import { Schema } from '@livestore/utils/effect';
4
+ import * as SolidTesting from '@solidjs/testing-library';
5
+ import * as Solid from 'solid-js';
6
+ import { describe, expect, it } from 'vitest';
7
+ import { events, schema, tables } from "./__tests__/fixture.jsx";
8
+ import { StoreRegistryProvider } from "./StoreRegistryContext.jsx";
9
+ import { useStore } from "./useStore.js";
10
+ const suspenseCountById = new Map();
11
+ const SuspenseFallback = (props) => {
12
+ Solid.onMount(() => {
13
+ suspenseCountById.set(props.id, (suspenseCountById.get(props.id) ?? 0) + 1);
14
+ });
15
+ return <div data-testid={props.id} data-suspense-id={props.id}/>;
16
+ };
17
+ const makeSuspenseFallback = (id) => {
18
+ return <SuspenseFallback id={id}/>;
19
+ };
20
+ const createSuspenseCount = (id) => {
21
+ suspenseCountById.set(id, 0);
22
+ const Comp = (props) => {
23
+ const fallback = makeSuspenseFallback(id);
24
+ return <Solid.Suspense fallback={fallback}>{props.children}</Solid.Suspense>;
25
+ };
26
+ return Object.assign(Comp, { count: () => suspenseCountById.get(id) ?? 0, id });
27
+ };
28
+ describe('useStore', () => {
29
+ it('should return the same promise instance for concurrent getOrLoadStore calls', async () => {
30
+ const storeRegistry = new StoreRegistry();
31
+ const options = testStoreOptions();
32
+ const firstStore = storeRegistry.getOrLoadPromise(options);
33
+ const secondStore = storeRegistry.getOrLoadPromise(options);
34
+ expect(firstStore).toBeInstanceOf(Promise);
35
+ expect(secondStore).toBeInstanceOf(Promise);
36
+ expect(firstStore).toBe(secondStore);
37
+ });
38
+ it('triggers Suspense when store() is read', async () => {
39
+ const storeRegistry = new StoreRegistry();
40
+ const options = testStoreOptions();
41
+ const RootSuspense = createSuspenseCount('root');
42
+ const ChildSuspense = createSuspenseCount('child');
43
+ const ChildComponent = () => {
44
+ const store = useStore(() => options);
45
+ return (<ChildSuspense>
46
+ <div data-testid="ready">Store loaded: {store()?.storeId}</div>
47
+ </ChildSuspense>);
48
+ };
49
+ const { findByTestId, queryByTestId } = SolidTesting.render(() => (<StoreRegistryProvider storeRegistry={storeRegistry}>
50
+ <RootSuspense>
51
+ <ChildComponent />
52
+ </RootSuspense>
53
+ </StoreRegistryProvider>));
54
+ await findByTestId(ChildSuspense.id);
55
+ expect(queryByTestId(RootSuspense.id)).toBeNull();
56
+ await findByTestId('ready');
57
+ expect(queryByTestId(ChildSuspense.id)).toBeNull();
58
+ await cleanupAfterUnmount(() => { });
59
+ });
60
+ it('does not re-suspend on subsequent renders when store is already loaded', async () => {
61
+ const storeRegistry = new StoreRegistry();
62
+ const options = testStoreOptions();
63
+ const [currentOptions, setCurrentOptions] = Solid.createSignal(options);
64
+ const RootSuspense = createSuspenseCount('root');
65
+ const ChildSuspense = createSuspenseCount('child');
66
+ const StoreConsumer = (props) => {
67
+ const store = useStore(props.options);
68
+ return (<ChildSuspense>
69
+ <div data-testid="ready">Store: {store()?.storeId}</div>
70
+ </ChildSuspense>);
71
+ };
72
+ const { findByTestId, queryByTestId } = SolidTesting.render(() => (<StoreRegistryProvider storeRegistry={storeRegistry}>
73
+ <RootSuspense>
74
+ <StoreConsumer options={currentOptions}/>
75
+ </RootSuspense>
76
+ </StoreRegistryProvider>));
77
+ await findByTestId(ChildSuspense.id);
78
+ expect(queryByTestId(RootSuspense.id)).toBeNull();
79
+ // Wait for initial load
80
+ await findByTestId('ready');
81
+ expect(queryByTestId(ChildSuspense.id)).toBeNull();
82
+ expect(queryByTestId(RootSuspense.id)).toBeNull();
83
+ // Update with new options object (but same storeId) - this triggers reactivity
84
+ setCurrentOptions({ ...options });
85
+ // Should not show fallback - store is already cached and returns synchronously
86
+ expect(queryByTestId(ChildSuspense.id)).toBeNull();
87
+ expect(queryByTestId(RootSuspense.id)).toBeNull();
88
+ expect(queryByTestId('ready')).not.toBeNull();
89
+ await cleanupAfterUnmount(() => { });
90
+ });
91
+ it('throws when store loading fails', async () => {
92
+ const storeRegistry = new StoreRegistry();
93
+ const badOptions = testStoreOptions({
94
+ // @ts-expect-error - intentionally passing invalid adapter to trigger error
95
+ adapter: null,
96
+ });
97
+ // Pre-load the store to cache the error (error happens synchronously)
98
+ expect(() => storeRegistry.getOrLoadPromise(badOptions)).toThrow();
99
+ });
100
+ it('basic useStore hook works', async () => {
101
+ const storeRegistry = new StoreRegistry();
102
+ const options = testStoreOptions();
103
+ const { result } = SolidTesting.renderHook(() => useStore(options), {
104
+ wrapper: makeProvider(storeRegistry),
105
+ });
106
+ // Wait for store to be ready
107
+ await waitForStoreReady(result);
108
+ expect(result()?.[StoreInternalsSymbol].clientSession).toBeDefined();
109
+ await cleanupAfterUnmount(() => { });
110
+ });
111
+ it('handles switching between different storeId values', async () => {
112
+ const storeRegistry = new StoreRegistry();
113
+ const optionsA = testStoreOptions({ storeId: 'store-a' });
114
+ const optionsB = testStoreOptions({ storeId: 'store-b' });
115
+ // Use a signal to trigger reactive updates (Solid's pattern instead of rerender)
116
+ const [currentOptions, setCurrentOptions] = Solid.createSignal(optionsA);
117
+ const { result } = SolidTesting.renderHook(() => useStore(currentOptions), {
118
+ wrapper: makeProvider(storeRegistry),
119
+ });
120
+ // Wait for first store to load
121
+ await waitForStoreReady(result);
122
+ const storeA = result();
123
+ expect(storeA[StoreInternalsSymbol].clientSession).toBeDefined();
124
+ // Switch to different storeId - Solid's reactivity will automatically update
125
+ setCurrentOptions(optionsB);
126
+ // Wait for second store to load and verify it's different from the first
127
+ await SolidTesting.waitFor(() => {
128
+ const current = result();
129
+ expect(current).not.toBe(storeA);
130
+ expect(current?.[StoreInternalsSymbol].clientSession).toBeDefined();
131
+ });
132
+ const storeB = result();
133
+ expect(storeB[StoreInternalsSymbol].clientSession).toBeDefined();
134
+ expect(storeB).not.toBe(storeA);
135
+ await cleanupAfterUnmount(() => { });
136
+ });
137
+ // useStore doesn't handle unusedCacheTime=0 correctly because retain is called in createComputed (after resource fetch)
138
+ // See https://github.com/livestorejs/livestore/issues/916
139
+ it.skip('should load store with unusedCacheTime set to 0', async () => {
140
+ // Skipped: retain timing issue with unusedCacheTime=0
141
+ });
142
+ });
143
+ describe('useStore.useQuery', () => {
144
+ it('Triggers Suspense - returns undefined while store is loading', async () => {
145
+ const storeRegistry = new StoreRegistry();
146
+ const options = testStoreOptions();
147
+ const allTodos$ = queryDb({ query: `select * from todos`, schema: Schema.Array(tables.todos.rowSchema) });
148
+ const RootSuspense = createSuspenseCount('root');
149
+ const UseStoreSuspense = createSuspenseCount('useStore');
150
+ const UseQuerySuspense = createSuspenseCount('useQuery');
151
+ const UseQueryComponent = (props) => {
152
+ const todos = props.store.useQuery(allTodos$);
153
+ return (<UseQuerySuspense>
154
+ <div data-testid="content">Todos: {todos()?.length ?? 'loading'}</div>
155
+ </UseQuerySuspense>);
156
+ };
157
+ const UseStoreComponent = () => {
158
+ const store = useStore(() => options);
159
+ return (<UseStoreSuspense>
160
+ <UseQueryComponent store={store}/>
161
+ </UseStoreSuspense>);
162
+ };
163
+ const { findByTestId, queryByTestId } = SolidTesting.render(() => (<StoreRegistryProvider storeRegistry={storeRegistry}>
164
+ <RootSuspense>
165
+ <UseStoreComponent />
166
+ </RootSuspense>
167
+ </StoreRegistryProvider>));
168
+ await findByTestId(UseStoreSuspense.id);
169
+ expect(queryByTestId(RootSuspense.id)).toBeNull();
170
+ expect(queryByTestId(UseQuerySuspense.id)).toBeNull();
171
+ // Wait for store to fully load
172
+ await SolidTesting.waitFor(() => {
173
+ const content = queryByTestId('content');
174
+ expect(content?.textContent).toBe('Todos: 0');
175
+ });
176
+ expect(queryByTestId(RootSuspense.id)).toBeNull();
177
+ expect(queryByTestId(UseStoreSuspense.id)).toBeNull();
178
+ expect(queryByTestId(UseQuerySuspense.id)).toBeNull();
179
+ await cleanupAfterUnmount(() => { });
180
+ });
181
+ it('returns undefined before store is loaded, then returns result', async () => {
182
+ const storeRegistry = new StoreRegistry();
183
+ const options = testStoreOptions();
184
+ const allTodos$ = queryDb({ query: `select * from todos`, schema: Schema.Array(tables.todos.rowSchema) });
185
+ const { result } = SolidTesting.renderHook(() => {
186
+ const store = useStore(() => options);
187
+ return store.useQuery(allTodos$);
188
+ }, { wrapper: makeProvider(storeRegistry) });
189
+ expect(result()).toBeUndefined();
190
+ // Wait for store to load and query to return results
191
+ await SolidTesting.waitFor(() => {
192
+ expect(result()).toBeDefined();
193
+ });
194
+ expect(result()).toEqual([]);
195
+ await cleanupAfterUnmount(() => { });
196
+ });
197
+ it('updates when store changes', async () => {
198
+ const storeRegistry = new StoreRegistry();
199
+ const optionsA = testStoreOptions({ storeId: 'store-a' });
200
+ const optionsB = testStoreOptions({ storeId: 'store-b' });
201
+ const [currentOptions, setCurrentOptions] = Solid.createSignal(optionsA);
202
+ const allTodos$ = queryDb({ query: `select * from todos`, schema: Schema.Array(tables.todos.rowSchema) }, { label: 'allTodos' });
203
+ const { result } = SolidTesting.renderHook(() => {
204
+ const store = useStore(currentOptions);
205
+ return { store, todos: store.useQuery(allTodos$) };
206
+ }, { wrapper: makeProvider(storeRegistry) });
207
+ // Wait for store A to load
208
+ await SolidTesting.waitFor(() => {
209
+ expect(result.store()).toBeDefined();
210
+ });
211
+ // Add todo to store A
212
+ result.store().commit(events.todoCreated({ id: 't1', text: 'store A todo', completed: false }));
213
+ expect(result.todos()?.length).toBe(1);
214
+ expect(result.todos()?.[0]?.text).toBe('store A todo');
215
+ // Switch to store B
216
+ setCurrentOptions(optionsB);
217
+ // Wait for store B to load
218
+ await SolidTesting.waitFor(() => {
219
+ expect(result.store()?.storeId).toBe('store-b');
220
+ });
221
+ // Store B should have no todos (it's a fresh store)
222
+ expect(result.todos()).toEqual([]);
223
+ // Add todo to store B
224
+ result.store().commit(events.todoCreated({ id: 't2', text: 'store B todo', completed: false }));
225
+ expect(result.todos()?.length).toBe(1);
226
+ expect(result.todos()?.[0]?.text).toBe('store B todo');
227
+ await cleanupAfterUnmount(() => { });
228
+ });
229
+ it('updates reactively when data changes', async () => {
230
+ const storeRegistry = new StoreRegistry();
231
+ const options = testStoreOptions();
232
+ const allTodos$ = queryDb({ query: `select * from todos`, schema: Schema.Array(tables.todos.rowSchema) }, { label: 'allTodos' });
233
+ const { result } = SolidTesting.renderHook(() => {
234
+ const store = useStore(() => options);
235
+ return { store, todos: store.useQuery(allTodos$) };
236
+ }, { wrapper: makeProvider(storeRegistry) });
237
+ // Wait for store to load
238
+ await SolidTesting.waitFor(() => {
239
+ expect(result.store()).toBeDefined();
240
+ });
241
+ expect(result.todos()).toEqual([]);
242
+ // Add a todo
243
+ result.store().commit(events.todoCreated({ id: 't1', text: 'buy milk', completed: false }));
244
+ expect(result.todos()?.length).toBe(1);
245
+ expect(result.todos()?.[0]?.text).toBe('buy milk');
246
+ await cleanupAfterUnmount(() => { });
247
+ });
248
+ });
249
+ describe('useStore.useClientDocument', () => {
250
+ it('can set state before store loads', async () => {
251
+ const storeRegistry = new StoreRegistry();
252
+ const options = testStoreOptions();
253
+ const RootSuspense = createSuspenseCount('root');
254
+ const ChildSuspense = createSuspenseCount('child');
255
+ const ChildComponent = () => {
256
+ const store = useStore(() => options);
257
+ const [state, setState] = store.useClientDocument(tables.userInfo, 'u1');
258
+ // Set state immediately - should work even before store loads
259
+ setState({ username: 'early-bird', text: 'set before load' });
260
+ return (<ChildSuspense>
261
+ <div data-testid="content">Username: {state().username}</div>
262
+ </ChildSuspense>);
263
+ };
264
+ const { findByTestId, queryByTestId } = SolidTesting.render(() => (<StoreRegistryProvider storeRegistry={storeRegistry}>
265
+ <RootSuspense>
266
+ <ChildComponent />
267
+ </RootSuspense>
268
+ </StoreRegistryProvider>));
269
+ await findByTestId(RootSuspense.id);
270
+ expect(queryByTestId(ChildSuspense.id)).toBeNull();
271
+ await findByTestId('content');
272
+ const content = queryByTestId('content');
273
+ expect(content?.textContent).toBe('Username: early-bird');
274
+ expect(queryByTestId(RootSuspense.id)).toBeNull();
275
+ expect(queryByTestId(ChildSuspense.id)).toBeNull();
276
+ await cleanupAfterUnmount(() => { });
277
+ });
278
+ it('returns state accessor and setter', async () => {
279
+ const storeRegistry = new StoreRegistry();
280
+ const options = testStoreOptions();
281
+ const { result } = SolidTesting.renderHook(() => {
282
+ const store = useStore(() => options);
283
+ const [state, setState, id] = store.useClientDocument(tables.userInfo, 'u1');
284
+ return { store, state, setState, id };
285
+ }, { wrapper: makeProvider(storeRegistry) });
286
+ // Wait for store to load
287
+ await SolidTesting.waitFor(() => {
288
+ expect(result.store()).toBeDefined();
289
+ });
290
+ expect(result.id()).toBe('u1');
291
+ expect(result.state()?.username).toBe('');
292
+ // Update via setState
293
+ result.setState({ username: 'test-user' });
294
+ expect(result.state()?.username).toBe('test-user');
295
+ await cleanupAfterUnmount(() => { });
296
+ });
297
+ it('setter works with multiple updates', async () => {
298
+ const storeRegistry = new StoreRegistry();
299
+ const options = testStoreOptions();
300
+ const { result } = SolidTesting.renderHook(() => {
301
+ const store = useStore(() => options);
302
+ const [state, setState, id] = store.useClientDocument(tables.userInfo, 'u1');
303
+ return { store, state, setState, id };
304
+ }, { wrapper: makeProvider(storeRegistry) });
305
+ // Wait for store to load first
306
+ await SolidTesting.waitFor(() => {
307
+ expect(result.store()).toBeDefined();
308
+ });
309
+ // Multiple setState calls should work
310
+ result.setState({ username: 'first' });
311
+ expect(result.state()?.username).toBe('first');
312
+ result.setState({ username: 'second' });
313
+ expect(result.state()?.username).toBe('second');
314
+ result.setState({ username: 'third', text: 'hello' });
315
+ expect(result.state()?.username).toBe('third');
316
+ expect(result.state()?.text).toBe('hello');
317
+ await cleanupAfterUnmount(() => { });
318
+ });
319
+ it('buffers state when called before store loads', async () => {
320
+ const storeRegistry = new StoreRegistry();
321
+ const options = testStoreOptions();
322
+ const { result } = SolidTesting.renderHook(() => {
323
+ const store = useStore(() => options);
324
+ const [state, setState, id] = store.useClientDocument(tables.userInfo, 'u1');
325
+ return { store, state, setState, id };
326
+ }, { wrapper: makeProvider(storeRegistry) });
327
+ // Call setState BEFORE store is loaded - should buffer
328
+ result.setState({ username: 'buffered', text: 'test' });
329
+ // The buffered state should be synced
330
+ expect(result.state().username).toBe('buffered');
331
+ // Wait for store to load
332
+ await SolidTesting.waitFor(() => {
333
+ expect(result.store()).toBeDefined();
334
+ });
335
+ // The buffered state should be synced
336
+ expect(result.state().username).toBe('buffered');
337
+ // Now update again - this should overwrite
338
+ result.setState({ username: 'updated', text: 'test2' });
339
+ expect(result.state()?.username).toBe('updated');
340
+ await cleanupAfterUnmount(() => { });
341
+ });
342
+ it('updates reactively via raw store commit', async () => {
343
+ const storeRegistry = new StoreRegistry();
344
+ const options = testStoreOptions();
345
+ const { result } = SolidTesting.renderHook(() => {
346
+ const store = useStore(() => options);
347
+ const [state, setState, id] = store.useClientDocument(tables.userInfo, 'u1');
348
+ return { store, state, setState, id };
349
+ }, { wrapper: makeProvider(storeRegistry) });
350
+ // Wait for store to load
351
+ await SolidTesting.waitFor(() => {
352
+ expect(result.store()).toBeDefined();
353
+ });
354
+ expect(result.state()?.username).toBe('');
355
+ // Update via raw store commit
356
+ result.store().commit(events.UserInfoSet({ username: 'commit-user', text: 'hello' }, 'u1'));
357
+ expect(result.state()?.username).toBe('commit-user');
358
+ await cleanupAfterUnmount(() => { });
359
+ });
360
+ it('updates when store changes', async () => {
361
+ const storeRegistry = new StoreRegistry();
362
+ const optionsA = testStoreOptions({ storeId: 'store-a' });
363
+ const optionsB = testStoreOptions({ storeId: 'store-b' });
364
+ const [currentOptions, setCurrentOptions] = Solid.createSignal(optionsA);
365
+ const { result } = SolidTesting.renderHook(() => {
366
+ const store = useStore(currentOptions);
367
+ const [state, setState, id] = store.useClientDocument(tables.userInfo, 'u1');
368
+ return { store, state, setState, id };
369
+ }, { wrapper: makeProvider(storeRegistry) });
370
+ // Wait for store A to load
371
+ await SolidTesting.waitFor(() => {
372
+ expect(result.store()).toBeDefined();
373
+ });
374
+ // Set username in store A
375
+ result.setState({ username: 'store-a-user', text: 'hello from A' });
376
+ expect(result.state()?.username).toBe('store-a-user');
377
+ // Switch to store B
378
+ setCurrentOptions(optionsB);
379
+ // Wait for store B to load
380
+ await SolidTesting.waitFor(() => {
381
+ expect(result.store()?.storeId).toBe('store-b');
382
+ });
383
+ // Store B should have default/empty state (fresh store)
384
+ expect(result.state()?.username).toBe('');
385
+ // Set username in store B
386
+ result.setState({ username: 'store-b-user', text: 'hello from B' });
387
+ expect(result.state()?.username).toBe('store-b-user');
388
+ // Switch back to store A
389
+ setCurrentOptions(optionsA);
390
+ // Wait for store A to load and useClientDocument state to propagate
391
+ await SolidTesting.waitFor(() => {
392
+ expect(result.store()?.storeId).toBe('store-a');
393
+ expect(result.state()).toBeDefined();
394
+ });
395
+ // Store A is re-created fresh after retain/release cycle (RcMap disposes
396
+ // entries eagerly on release in Effect 3.19.19+), so state resets to defaults.
397
+ // Verify the hook correctly reflects the new store's default state.
398
+ expect(result.state()?.username).toBe('');
399
+ // Verify we can write to the re-created store A
400
+ result.setState({ username: 'store-a-new', text: 'fresh data' });
401
+ expect(result.state()?.username).toBe('store-a-new');
402
+ await cleanupAfterUnmount(() => { });
403
+ });
404
+ });
405
+ const makeProvider = (storeRegistry) => (props) => {
406
+ return <StoreRegistryProvider storeRegistry={storeRegistry}>{props.children}</StoreRegistryProvider>;
407
+ };
408
+ let testStoreCounter = 0;
409
+ const testStoreOptions = (overrides = {}) => storeOptions({
410
+ storeId: overrides.storeId ?? `test-store-${testStoreCounter++}`,
411
+ schema,
412
+ adapter: makeInMemoryAdapter(),
413
+ ...overrides,
414
+ });
415
+ /**
416
+ * Cleans up after component unmount and waits for pending operations to settle.
417
+ *
418
+ * When components using stores unmount, the StoreRegistry schedules garbage collection
419
+ * timers for inactive stores. This helper waits for those timers to complete naturally.
420
+ */
421
+ const cleanupAfterUnmount = async (cleanup) => {
422
+ cleanup();
423
+ // Allow any pending microtasks/timers to settle
424
+ await new Promise((resolve) => setTimeout(resolve, 100));
425
+ };
426
+ /**
427
+ * Waits for a store resource to be fully loaded and ready to use.
428
+ * The store is considered ready when it has a defined clientSession.
429
+ */
430
+ const waitForStoreReady = async (result) => {
431
+ await SolidTesting.waitFor(() => {
432
+ const store = result();
433
+ expect(store).not.toBeNull();
434
+ expect(store).not.toBeUndefined();
435
+ expect(store[StoreInternalsSymbol].clientSession).toBeDefined();
436
+ });
437
+ };
438
+ //# sourceMappingURL=useStore.client.test.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStore.client.test.jsx","sourceRoot":"","sources":["../src/useStore.client.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,91 @@
1
+ import * as Solid from 'solid-js';
2
+ import type { RowQuery, SessionIdSymbol } from '@livestore/common';
3
+ import type { LiveStoreSchema, State } from '@livestore/common/schema';
4
+ import type { Queryable, RegistryStoreOptions, Store } from '@livestore/livestore';
5
+ import type { Schema } from '@livestore/utils/effect';
6
+ import { type UseClientDocumentResult } from './useClientDocument.ts';
7
+ import { type AccessorMaybe } from './utils.ts';
8
+ /**
9
+ * Solid-specific methods added to the store Resource returned by `useStore()`.
10
+ *
11
+ * These methods handle the case where the store might not be loaded yet,
12
+ * returning `undefined` or buffering locally until ready.
13
+ */
14
+ export type SolidApi = {
15
+ useClientDocument: {
16
+ <TTableDef extends State.SQLite.ClientDocumentTableDef.Trait<any, any, any, {
17
+ partialSet: boolean;
18
+ default: {
19
+ id: string | SessionIdSymbol;
20
+ value: any;
21
+ };
22
+ }>>(table: AccessorMaybe<TTableDef>, id?: AccessorMaybe<State.SQLite.ClientDocumentTableDef.DefaultIdType<TTableDef> | SessionIdSymbol>, options?: Partial<RowQuery.GetOrCreateOptions<TTableDef>>): UseClientDocumentResult<TTableDef>;
23
+ <TTableDef extends State.SQLite.ClientDocumentTableDef.Trait<any, any, any, {
24
+ partialSet: boolean;
25
+ default: {
26
+ id: undefined;
27
+ value: any;
28
+ };
29
+ }>>(table: AccessorMaybe<TTableDef>, id: AccessorMaybe<string | SessionIdSymbol>, options?: Partial<RowQuery.GetOrCreateOptions<TTableDef>>): UseClientDocumentResult<TTableDef>;
30
+ };
31
+ /**
32
+ * Creates a reactive query that subscribes to store updates.
33
+ *
34
+ * @returns An accessor that returns:
35
+ * - `undefined` while the store is loading
36
+ * - The query result once the store is ready
37
+ */
38
+ useQuery<TQueryable extends Queryable<any>>(queryDef: AccessorMaybe<TQueryable>): Solid.Accessor<Queryable.Result<TQueryable> | undefined>;
39
+ };
40
+ /**
41
+ * Returns a store resource that suspends until the store is loaded.
42
+ * The store is cached by its `storeId` in the `StoreRegistry`.
43
+ *
44
+ * @example
45
+ * ```tsx
46
+ * import { Suspense } from 'solid-js'
47
+ *
48
+ * function Issue(props: { issueId: string }) {
49
+ * const store = useStore(issueStoreOptions(props.issueId))
50
+ * const issues = store()?.useQuery(queryDb(tables.issue.select()))
51
+ *
52
+ * return (
53
+ * <Show when={store()}>
54
+ * {(s) => <IssueView store={s()} />}
55
+ * </Show>
56
+ * )
57
+ * }
58
+ *
59
+ * // With Suspense boundary
60
+ * function App() {
61
+ * return (
62
+ * <Suspense fallback={<div>Loading...</div>}>
63
+ * <Issue issueId="abc123" />
64
+ * </Suspense>
65
+ * )
66
+ * }
67
+ * ```
68
+ *
69
+ * @remarks
70
+ * - Suspends until the store is loaded when used within a Suspense boundary.
71
+ * - Store is cached by its `storeId` in the `StoreRegistry`. Multiple calls with the same `storeId` return the same store instance.
72
+ * - Store is cached as long as it's being used, and after `unusedCacheTime` expires (default `60_000` ms in browser, `Infinity` in non-browser)
73
+ * - Default store options can be configured in `StoreRegistry` constructor.
74
+ * - Store options are only applied when the store is loaded. Subsequent calls with different options will not affect the store if it's already loaded and cached in the registry.
75
+ *
76
+ * @typeParam TSchema - The schema type for the store
77
+ * @typeParam TContext - User-defined context attached to the store
78
+ * @typeParam TSyncPayloadSchema - Schema for the sync payload sent to the backend
79
+ * @returns A Resource that resolves to the loaded store instance augmented with Solid hooks
80
+ */
81
+ export declare const useStore: <TSchema extends LiveStoreSchema, TContext = {}, TSyncPayloadSchema extends Schema.Schema<any> = typeof Schema.JsonValue>(options: AccessorMaybe<RegistryStoreOptions<TSchema, TContext, TSyncPayloadSchema>>) => Solid.Resource<Store<TSchema, TContext>> & SolidApi;
82
+ /**
83
+ * Augments a Store instance with Solid-specific methods (`useQuery`, `useClientDocument`).
84
+ *
85
+ * This is called automatically by `useStore()`. You typically don't need to call it
86
+ * directly unless you're building custom integrations.
87
+ *
88
+ * @internal
89
+ */
90
+ export declare const withSolidApi: <T extends Store<any, any> | Solid.Accessor<Store<any, any> | undefined>>(store: T) => T & SolidApi;
91
+ //# sourceMappingURL=useStore.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStore.d.ts","sourceRoot":"","sources":["../src/useStore.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,UAAU,CAAA;AAEjC,OAAO,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAA;AAClE,OAAO,KAAK,EAAE,eAAe,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAA;AACtE,OAAO,KAAK,EAAE,SAAS,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAClF,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAGrD,OAAO,EAAE,KAAK,uBAAuB,EAAqB,MAAM,wBAAwB,CAAA;AAExF,OAAO,EAAE,KAAK,aAAa,EAAW,MAAM,YAAY,CAAA;AAGxD;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG;IACrB,iBAAiB,EAAE;QAEjB,CACE,SAAS,SAAS,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,KAAK,CACzD,GAAG,EACH,GAAG,EACH,GAAG,EACH;YACE,UAAU,EAAE,OAAO,CAAA;YACnB,OAAO,EAAE;gBAAE,EAAE,EAAE,MAAM,GAAG,eAAe,CAAC;gBAAC,KAAK,EAAE,GAAG,CAAA;aAAE,CAAA;SACtD,CACF,EAED,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,EAC/B,EAAE,CAAC,EAAE,aAAa,CAAC,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,aAAa,CAAC,SAAS,CAAC,GAAG,eAAe,CAAC,EAClG,OAAO,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,GACxD,uBAAuB,CAAC,SAAS,CAAC,CAAA;QAGrC,CACE,SAAS,SAAS,KAAK,CAAC,MAAM,CAAC,sBAAsB,CAAC,KAAK,CACzD,GAAG,EACH,GAAG,EACH,GAAG,EACH;YAAE,UAAU,EAAE,OAAO,CAAC;YAAC,OAAO,EAAE;gBAAE,EAAE,EAAE,SAAS,CAAC;gBAAC,KAAK,EAAE,GAAG,CAAA;aAAE,CAAA;SAAE,CAChE,EAED,KAAK,EAAE,aAAa,CAAC,SAAS,CAAC,EAC/B,EAAE,EAAE,aAAa,CAAC,MAAM,GAAG,eAAe,CAAC,EAC3C,OAAO,CAAC,EAAE,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAC,SAAS,CAAC,CAAC,GACxD,uBAAuB,CAAC,SAAS,CAAC,CAAA;KACtC,CAAA;IACD;;;;;;OAMG;IACH,QAAQ,CAAC,UAAU,SAAS,SAAS,CAAC,GAAG,CAAC,EACxC,QAAQ,EAAE,aAAa,CAAC,UAAU,CAAC,GAClC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC,CAAA;CAC5D,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,eAAO,MAAM,QAAQ,GACnB,OAAO,SAAS,eAAe,EAC/B,QAAQ,GAAG,EAAE,EACb,kBAAkB,SAAS,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,MAAM,CAAC,SAAS,EAEvE,SAAS,aAAa,CAAC,oBAAoB,CAAC,OAAO,EAAE,QAAQ,EAAE,kBAAkB,CAAC,CAAC,KAClF,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,GAAG,QAc7C,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,SAAS,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,SAAS,CAAC,EAClG,OAAO,CAAC,KACP,CAAC,GAAG,QAyCN,CAAA"}