@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.
- package/dist/.tsbuildinfo +1 -1
- package/dist/StoreRegistryContext.d.ts +56 -0
- package/dist/StoreRegistryContext.d.ts.map +1 -0
- package/dist/StoreRegistryContext.jsx +60 -0
- package/dist/StoreRegistryContext.jsx.map +1 -0
- package/dist/__tests__/fixture.d.ts +14 -0
- package/dist/__tests__/fixture.d.ts.map +1 -0
- package/dist/__tests__/fixture.jsx +13 -0
- package/dist/__tests__/fixture.jsx.map +1 -0
- package/dist/experimental/components/LiveList.d.ts +24 -0
- package/dist/experimental/components/LiveList.d.ts.map +1 -0
- package/dist/experimental/components/LiveList.jsx +24 -0
- package/dist/experimental/components/LiveList.jsx.map +1 -0
- package/dist/experimental/mod.d.ts +2 -0
- package/dist/experimental/mod.d.ts.map +1 -0
- package/dist/experimental/mod.js +2 -0
- package/dist/experimental/mod.js.map +1 -0
- package/dist/mod.d.ts +6 -2
- package/dist/mod.d.ts.map +1 -1
- package/dist/mod.js +4 -2
- package/dist/mod.js.map +1 -1
- package/dist/useClientDocument.client.test.d.ts +2 -0
- package/dist/useClientDocument.client.test.d.ts.map +1 -0
- package/dist/useClientDocument.client.test.jsx +177 -0
- package/dist/useClientDocument.client.test.jsx.map +1 -0
- package/dist/useClientDocument.d.ts +71 -0
- package/dist/useClientDocument.d.ts.map +1 -0
- package/dist/useClientDocument.js +74 -0
- package/dist/useClientDocument.js.map +1 -0
- package/dist/useClientDocument.server.test.d.ts +6 -0
- package/dist/useClientDocument.server.test.d.ts.map +1 -0
- package/dist/useClientDocument.server.test.jsx +76 -0
- package/dist/useClientDocument.server.test.jsx.map +1 -0
- package/dist/useQuery.client.test.d.ts +2 -0
- package/dist/useQuery.client.test.d.ts.map +1 -0
- package/dist/useQuery.client.test.jsx +165 -0
- package/dist/useQuery.client.test.jsx.map +1 -0
- package/dist/useQuery.d.ts +32 -0
- package/dist/useQuery.d.ts.map +1 -0
- package/dist/useQuery.js +64 -0
- package/dist/useQuery.js.map +1 -0
- package/dist/useQuery.server.test.d.ts +6 -0
- package/dist/useQuery.server.test.d.ts.map +1 -0
- package/dist/useQuery.server.test.jsx +88 -0
- package/dist/useQuery.server.test.jsx.map +1 -0
- package/dist/useStore.client.test.d.ts +2 -0
- package/dist/useStore.client.test.d.ts.map +1 -0
- package/dist/useStore.client.test.jsx +438 -0
- package/dist/useStore.client.test.jsx.map +1 -0
- package/dist/useStore.d.ts +91 -0
- package/dist/useStore.d.ts.map +1 -0
- package/dist/useStore.js +94 -0
- package/dist/useStore.js.map +1 -0
- package/dist/useStore.server.test.d.ts +6 -0
- package/dist/useStore.server.test.d.ts.map +1 -0
- package/dist/useStore.server.test.jsx +56 -0
- package/dist/useStore.server.test.jsx.map +1 -0
- package/dist/utils.d.ts +4 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +7 -0
- package/dist/utils.js.map +1 -0
- package/dist/whenever.d.ts +32 -0
- package/dist/whenever.d.ts.map +1 -0
- package/dist/whenever.js +51 -0
- package/dist/whenever.js.map +1 -0
- package/package.json +65 -17
- package/src/StoreRegistryContext.tsx +70 -0
- package/src/__snapshots__/useClientDocument.client.test.tsx.snap +570 -0
- package/src/__snapshots__/useQuery.client.test.tsx.snap +1550 -0
- package/src/__tests__/fixture.tsx +42 -0
- package/src/experimental/components/LiveList.tsx +54 -0
- package/src/experimental/mod.ts +1 -0
- package/src/mod.ts +6 -2
- package/src/useClientDocument.client.test.tsx +299 -0
- package/src/useClientDocument.server.test.tsx +107 -0
- package/src/useClientDocument.ts +146 -0
- package/src/useQuery.client.test.tsx +293 -0
- package/src/useQuery.server.test.tsx +128 -0
- package/src/useQuery.ts +115 -0
- package/src/useStore.client.test.tsx +632 -0
- package/src/useStore.server.test.tsx +70 -0
- package/src/useStore.ts +179 -0
- package/src/utils.ts +10 -0
- package/src/whenever.ts +80 -0
- package/dist/query.d.ts +0 -4
- package/dist/query.d.ts.map +0 -1
- package/dist/query.js +0 -15
- package/dist/query.js.map +0 -1
- package/dist/store.d.ts +0 -6
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -99
- package/dist/store.js.map +0 -1
- package/src/query.ts +0 -22
- 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"}
|