@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,74 @@
1
+ import * as Solid from 'solid-js';
2
+ import { SessionIdSymbol } from '@livestore/common';
3
+ import { State } from '@livestore/common/schema';
4
+ import { removeUndefinedValues, validateTableOptions } from '@livestore/framework-toolkit';
5
+ import { queryDb } from '@livestore/livestore';
6
+ import { useQueryRef } from "./useQuery.js";
7
+ import { resolve } from "./utils.js";
8
+ /**
9
+ * Similar to `Solid.createSignal` but returns a tuple of `[state, setState, id, query$]` for a given table where ...
10
+ *
11
+ * - `state` is the current value of the row (fully decoded according to the table schema)
12
+ * - `setState` is a function that can be used to update the document
13
+ * - `id` is the id of the document
14
+ * - `query$` is a `LiveQuery` that e.g. can be used to subscribe to changes to the document
15
+ *
16
+ * `useClientDocument` only works for client-document tables:
17
+ *
18
+ * ```tsx
19
+ * const MyState = State.SQLite.clientDocument({
20
+ * name: 'MyState',
21
+ * schema: Schema.Struct({
22
+ * showSidebar: Schema.Boolean,
23
+ * }),
24
+ * default: { id: SessionIdSymbol, value: { showSidebar: true } },
25
+ * })
26
+ *
27
+ * const MyComponent = () => {
28
+ * const [{ showSidebar }, setState] = useClientDocument(MyState)
29
+ * return (
30
+ * <div onClick={() => setState({ showSidebar: !showSidebar })}>
31
+ * {showSidebar ? 'Sidebar is open' : 'Sidebar is closed'}
32
+ * </div>
33
+ * )
34
+ * }
35
+ * ```
36
+ *
37
+ * If the table has a default id, `useClientDocument` can be called without an `id` argument. Otherwise, the `id` argument is required.
38
+ */
39
+ export const useClientDocument = (table, _id, options, config) => {
40
+ const id = () => {
41
+ const id = resolve(_id);
42
+ return typeof id === 'string' || id === SessionIdSymbol
43
+ ? id
44
+ : resolve(table)[State.SQLite.ClientDocumentTableDefSymbol].options.default.id;
45
+ };
46
+ const serializedId = () => {
47
+ const _id = id();
48
+ return typeof _id === 'string' ? _id : config.store.sessionId;
49
+ };
50
+ Solid.createComputed(() => validateTableOptions(resolve(table)));
51
+ const queryDef = Solid.createMemo(() => queryDb(resolve(table).get(id(), options?.default !== undefined
52
+ ? {
53
+ default: options.default,
54
+ }
55
+ : undefined), {
56
+ deps: [serializedId(), resolve(table).sqliteDef.name, JSON.stringify(options?.default)],
57
+ }));
58
+ const queryRef = useQueryRef(queryDef, {
59
+ get otelSpanName() {
60
+ return `LiveStore:useClientDocument:${resolve(table).sqliteDef.name}:${serializedId()}`;
61
+ },
62
+ get store() {
63
+ return config.store;
64
+ },
65
+ });
66
+ const setState = (newValueOrFn) => {
67
+ const newValue = typeof newValueOrFn === 'function' ? newValueOrFn(queryRef.valueRef()) : newValueOrFn;
68
+ if (queryRef.valueRef() === newValue)
69
+ return;
70
+ config.store.commit(resolve(table).set(removeUndefinedValues(newValue), id()));
71
+ };
72
+ return [queryRef.valueRef, setState, serializedId, () => queryRef.queryRcRef().value];
73
+ };
74
+ //# sourceMappingURL=useClientDocument.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useClientDocument.js","sourceRoot":"","sources":["../src/useClientDocument.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * SSR tests for useClientDocument
3
+ * These tests run in node environment with SSR JSX transform using renderToString.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=useClientDocument.server.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useClientDocument.server.test.d.ts","sourceRoot":"","sources":["../src/useClientDocument.server.test.tsx"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,76 @@
1
+ /**
2
+ * SSR tests for useClientDocument
3
+ * These tests run in node environment with SSR JSX transform using renderToString.
4
+ */
5
+ import { isServer, renderToString } from 'solid-js/web';
6
+ import { describe, expect, it } from 'vitest';
7
+ import { provideOtel } from '@livestore/common';
8
+ import * as LiveStore from '@livestore/livestore';
9
+ import { Effect, Schema } from '@livestore/utils/effect';
10
+ import { events, makeTodoMvcSolid, tables } from "./__tests__/fixture.jsx";
11
+ describe('environment', () => {
12
+ it('runs on server', () => {
13
+ // Use 'window' in globalThis to avoid TypeScript error without DOM lib
14
+ expect('window' in globalThis).toBe(false);
15
+ expect(isServer).toBe(true);
16
+ });
17
+ });
18
+ describe('useClientDocument SSR', () => {
19
+ it('renders client document with default value to string', async () => {
20
+ await Effect.gen(function* () {
21
+ const { store } = yield* makeTodoMvcSolid({});
22
+ const UserDisplay = () => {
23
+ const [state] = store.useClientDocument(tables.userInfo, 'u1');
24
+ return <div>Username: {state().username || 'anonymous'}</div>;
25
+ };
26
+ const html = renderToString(() => <UserDisplay />);
27
+ expect(html).toContain('Username:');
28
+ }).pipe(provideOtel({}), Effect.scoped, Effect.runPromise);
29
+ });
30
+ it('renders client document with committed value to string', async () => {
31
+ await Effect.gen(function* () {
32
+ const { store } = yield* makeTodoMvcSolid({});
33
+ store.commit(events.UserInfoSet({ username: 'ssr-user' }, 'u1'));
34
+ const UserDisplay = () => {
35
+ const [state] = store.useClientDocument(tables.userInfo, 'u1');
36
+ return <div>Username: {state().username}</div>;
37
+ };
38
+ const html = renderToString(() => <UserDisplay />);
39
+ expect(html).toContain('Username:');
40
+ expect(html).toContain('ssr-user');
41
+ }).pipe(provideOtel({}), Effect.scoped, Effect.runPromise);
42
+ });
43
+ it('renders larger app with useClientDocument and useQuery to string', async () => {
44
+ await Effect.gen(function* () {
45
+ const { store } = yield* makeTodoMvcSolid({});
46
+ const allTodos$ = LiveStore.queryDb({ query: `select * from todos`, schema: Schema.Array(tables.todos.rowSchema) }, { label: 'allTodos' });
47
+ store.commit(events.todoCreated({ id: 't1', text: 'buy milk', completed: false }), events.todoCreated({ id: 't2', text: 'buy eggs', completed: true }));
48
+ const App = () => {
49
+ const [routerState] = store.useClientDocument(tables.AppRouterSchema, 'singleton');
50
+ const allTodos = store.useQuery(allTodos$);
51
+ return (<div>
52
+ <div>Current Task: {routerState().currentTaskId ?? 'none'}</div>
53
+ <div>Total Tasks: {allTodos()?.length}</div>
54
+ </div>);
55
+ };
56
+ const html = renderToString(() => <App />);
57
+ expect(html).toContain('Current Task:');
58
+ expect(html).toContain('none');
59
+ expect(html).toContain('Total Tasks:');
60
+ expect(html).toContain('2');
61
+ }).pipe(provideOtel({}), Effect.scoped, Effect.runPromise);
62
+ });
63
+ it('renders kv client document to string', async () => {
64
+ await Effect.gen(function* () {
65
+ const { store } = yield* makeTodoMvcSolid({});
66
+ const KVDisplay = () => {
67
+ const [state] = store.useClientDocument(tables.kv, 'k1');
68
+ return <div>Value: {JSON.stringify(state())}</div>;
69
+ };
70
+ const html = renderToString(() => <KVDisplay />);
71
+ expect(html).toContain('Value:');
72
+ expect(html).toContain('null');
73
+ }).pipe(provideOtel({}), Effect.scoped, Effect.runPromise);
74
+ });
75
+ });
76
+ //# sourceMappingURL=useClientDocument.server.test.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useClientDocument.server.test.jsx","sourceRoot":"","sources":["../src/useClientDocument.server.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useQuery.client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQuery.client.test.d.ts","sourceRoot":"","sources":["../src/useQuery.client.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,165 @@
1
+ /** biome-ignore-all lint/a11y: test */
2
+ import * as LiveStore from '@livestore/livestore';
3
+ import { queryDb, signal } from '@livestore/livestore';
4
+ import { RG } from '@livestore/livestore/internal/testing-utils';
5
+ import { Effect, Schema } from '@livestore/utils/effect';
6
+ import { Vitest } from '@livestore/utils-dev/node-vitest';
7
+ import * as SolidTesting from '@solidjs/testing-library';
8
+ import * as Solid from 'solid-js';
9
+ import { expect } from 'vitest';
10
+ import { events, makeTodoMvcSolid, StoreInternalsSymbol, tables } from "./__tests__/fixture.jsx";
11
+ const makeVirtualContainerStyle = (containerHeight) => {
12
+ return { height: `${containerHeight}px`, overflow: 'auto' };
13
+ };
14
+ const makeVirtualContentStyle = (itemCount, itemHeight) => {
15
+ return { height: `${itemCount * itemHeight}px`, position: 'relative' };
16
+ };
17
+ const makeVirtualItemStyle = (index, itemHeight) => {
18
+ return {
19
+ position: 'absolute',
20
+ top: `${index * itemHeight}px`,
21
+ height: `${itemHeight}px`,
22
+ };
23
+ };
24
+ Vitest.describe('useQuery', () => {
25
+ Vitest.afterEach(() => {
26
+ RG.__resetIds();
27
+ });
28
+ Vitest.scopedLive('simple', () => Effect.gen(function* () {
29
+ const { wrapper, store } = yield* makeTodoMvcSolid({});
30
+ const allTodos$ = queryDb({ query: `select * from todos`, schema: Schema.Array(tables.todos.rowSchema) });
31
+ const { result } = SolidTesting.renderHook(() => {
32
+ return store.useQuery(allTodos$);
33
+ }, { wrapper });
34
+ expect(result()?.length).toBe(0);
35
+ expect(store[StoreInternalsSymbol].reactivityGraph.getSnapshot({ includeResults: true })).toMatchSnapshot();
36
+ store.commit(events.todoCreated({ id: 't1', text: 'buy milk', completed: false }));
37
+ expect(result()?.length).toBe(1);
38
+ expect(result()?.[0]?.text).toBe('buy milk');
39
+ expect(store[StoreInternalsSymbol].reactivityGraph.getSnapshot({ includeResults: true })).toMatchSnapshot();
40
+ }));
41
+ Vitest.scopedLive('same `useQuery` hook invoked with different queries', () => Effect.gen(function* () {
42
+ const { wrapper, store } = yield* makeTodoMvcSolid({});
43
+ const todo1$ = queryDb({ query: `select * from todos where id = 't1'`, schema: Schema.Array(tables.todos.rowSchema) }, { label: 'libraryTracksView1' });
44
+ const todo2$ = queryDb({ query: `select * from todos where id = 't2'`, schema: Schema.Array(tables.todos.rowSchema) }, { label: 'libraryTracksView2' });
45
+ store.commit(events.todoCreated({ id: 't1', text: 'buy milk', completed: false }), events.todoCreated({ id: 't2', text: 'buy eggs', completed: false }));
46
+ const [todoId, setTodoId] = Solid.createSignal('t1');
47
+ const { result } = SolidTesting.renderHook(() => {
48
+ const query = store.useQuery(() => (todoId() === 't1' ? todo1$ : todo2$));
49
+ return () => query()?.[0]?.text;
50
+ }, { wrapper });
51
+ expect(result()).toBe('buy milk');
52
+ expect(store[StoreInternalsSymbol].reactivityGraph.getSnapshot({ includeResults: true })).toMatchSnapshot('1: after first render');
53
+ store.commit(events.todoUpdated({ id: 't1', text: 'buy soy milk' }));
54
+ expect(result()).toBe('buy soy milk');
55
+ expect(store[StoreInternalsSymbol].reactivityGraph.getSnapshot({ includeResults: true })).toMatchSnapshot('2: after first commit');
56
+ setTodoId('t2');
57
+ expect(result()).toBe('buy eggs');
58
+ expect(store[StoreInternalsSymbol].reactivityGraph.getSnapshot({ includeResults: true })).toMatchSnapshot('3: after forced rerender');
59
+ }));
60
+ Vitest.scopedLive('filtered dependency query', () => Effect.gen(function* () {
61
+ const { wrapper, store } = yield* makeTodoMvcSolid({});
62
+ const filter$ = signal('t1', { label: 'id-filter' });
63
+ const todo$ = queryDb((get) => tables.todos.where('id', get(filter$)), { label: 'todo' });
64
+ store.commit(events.todoCreated({ id: 't1', text: 'buy milk', completed: false }), events.todoCreated({ id: 't2', text: 'buy eggs', completed: false }));
65
+ const { result } = SolidTesting.renderHook(() => {
66
+ const query = store.useQuery(todo$);
67
+ return () => query()?.[0]?.text;
68
+ }, { wrapper });
69
+ expect(result()).toBe('buy milk');
70
+ expect(store[StoreInternalsSymbol].reactivityGraph.getSnapshot({ includeResults: true })).toMatchSnapshot();
71
+ store.commit(events.todoUpdated({ id: 't1', text: 'buy soy milk' }));
72
+ expect(result()).toBe('buy soy milk');
73
+ expect(store[StoreInternalsSymbol].reactivityGraph.getSnapshot({ includeResults: true })).toMatchSnapshot();
74
+ store.setSignal(filter$, 't2');
75
+ expect(result()).toBe('buy eggs');
76
+ expect(store[StoreInternalsSymbol].reactivityGraph.getSnapshot({ includeResults: true })).toMatchSnapshot();
77
+ }));
78
+ Vitest.scopedLive('should work for a dynamic list with query swapping', () => Effect.gen(function* () {
79
+ const { wrapper, store } = yield* makeTodoMvcSolid({});
80
+ const ListItem = (props) => {
81
+ const res = store.useQuery(() => LiveStore.computed(() => props.id, { label: `ListItem.${props.id}`, deps: props.id }));
82
+ return <div role="listitem">{String(res())}</div>;
83
+ };
84
+ const [numItems, setNumItems] = Solid.createSignal(1);
85
+ const ListWrapper = () => {
86
+ return (<div>
87
+ <Solid.For each={Array.from({ length: numItems() }, (_, i) => i).toReversed()}>
88
+ {(id) => <ListItem id={id}/>}
89
+ </Solid.For>
90
+ </div>);
91
+ };
92
+ const { container } = SolidTesting.render(() => <ListWrapper />, { wrapper });
93
+ expect(container.textContent).toBe('0');
94
+ setNumItems(3);
95
+ expect(container.textContent).toBe('210');
96
+ }));
97
+ // NOTE: This test covers special Solid lifecycle patterns similar to react-window
98
+ // It causes query swapping in reactive computations and cleanup calls
99
+ // This tests the `_tag: 'destroyed'` state in the `spanAlreadyStartedCache`
100
+ Vitest.scopedLive('should work for a virtualized list with @solid-primitives/virtual', () => Effect.gen(function* () {
101
+ const { wrapper, store } = yield* makeTodoMvcSolid({});
102
+ // Create a signal to control the number of items
103
+ const [numItems, setNumItems] = Solid.createSignal(1);
104
+ const VirtualizedList = () => {
105
+ const itemData = Solid.createMemo(() => Array.from({ length: numItems() }, (_, i) => i).reverse());
106
+ const containerHeight = 100;
107
+ const itemHeight = 10;
108
+ const visibleCount = Math.ceil(containerHeight / itemHeight);
109
+ const containerStyle = makeVirtualContainerStyle(containerHeight);
110
+ const contentStyle = Solid.createMemo(() => makeVirtualContentStyle(itemData().length, itemHeight));
111
+ return (<div style={containerStyle}>
112
+ <div style={contentStyle()}>
113
+ <Solid.For each={itemData().slice(0, visibleCount + 1)}>
114
+ {(id, index) => <VirtualListItem id={id} index={index()} itemHeight={itemHeight}/>}
115
+ </Solid.For>
116
+ </div>
117
+ </div>);
118
+ };
119
+ const VirtualListItem = (props) => {
120
+ const res = store.useQuery(() => LiveStore.computed(() => props.id, { label: `VirtualListItem.${props.id}`, deps: props.id }));
121
+ const style = makeVirtualItemStyle(props.index, props.itemHeight);
122
+ return (<div role="listitem" style={style}>
123
+ {res()}
124
+ </div>);
125
+ };
126
+ const { container } = SolidTesting.render(() => <VirtualizedList />, { wrapper });
127
+ expect(container.textContent?.trim()).toBe('0');
128
+ // Test virtualized list update - this causes query swapping similar to react-window
129
+ setNumItems(3);
130
+ // In Solid, reactivity is synchronous, so we don't need to wait
131
+ expect(container.textContent?.replace(/\s+/g, '')).toBe('210');
132
+ }));
133
+ Vitest.scopedLive('should work with signal', () => Effect.gen(function* () {
134
+ const { wrapper, store } = yield* makeTodoMvcSolid({});
135
+ const num$ = signal(0);
136
+ const { result } = SolidTesting.renderHook(() => store.useQuery(num$), { wrapper });
137
+ expect(result()).toBe(0);
138
+ store.setSignal(num$, 1);
139
+ expect(result()).toBe(1);
140
+ }));
141
+ Vitest.scopedLive('supports query builders directly', () => Effect.gen(function* () {
142
+ const { wrapper, store } = yield* makeTodoMvcSolid({});
143
+ store.commit(events.todoCreated({ id: 't1', text: 'buy milk', completed: false }), events.todoCreated({ id: 't2', text: 'buy eggs', completed: true }));
144
+ const todosWhereIncomplete = tables.todos.where({ completed: false });
145
+ const { result } = SolidTesting.renderHook(() => {
146
+ const todos = store.useQuery(todosWhereIncomplete);
147
+ return () => todos()?.map((todo) => todo.id);
148
+ }, { wrapper });
149
+ expect(result()).toEqual(['t1']);
150
+ }));
151
+ Vitest.scopedLive('union of different result types with useQuery', () => Effect.gen(function* () {
152
+ const { wrapper, store } = yield* makeTodoMvcSolid({});
153
+ const str$ = signal('hello', { label: 'str' });
154
+ const num$ = signal(123, { label: 'num' });
155
+ const [useNum, setUseNum] = Solid.createSignal(false);
156
+ const { result } = SolidTesting.renderHook(() => {
157
+ const query$ = Solid.createMemo(() => (useNum() === true ? num$ : str$));
158
+ return store.useQuery(query$);
159
+ }, { wrapper });
160
+ expect(result()).toBe('hello');
161
+ setUseNum(true);
162
+ expect(result()).toBe(123);
163
+ }));
164
+ });
165
+ //# sourceMappingURL=useQuery.client.test.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQuery.client.test.jsx","sourceRoot":"","sources":["../src/useQuery.client.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ import type * as otel from '@opentelemetry/api';
2
+ import * as Solid from 'solid-js';
3
+ import type { LiveQuery, Queryable, Store } from '@livestore/livestore';
4
+ import type { LiveQueries } from '@livestore/livestore/internal';
5
+ import { type AccessorMaybe } from './utils.ts';
6
+ /**
7
+ * Returns the result of a query and subscribes to future updates.
8
+ *
9
+ * Example:
10
+ * ```tsx
11
+ * const App = () => {
12
+ * const todos = useQuery(queryDb(tables.todos.query.where({ complete: true })))
13
+ * return <div>{todos.map((todo) => <div key={todo.id}>{todo.title}</div>)}</div>
14
+ * }
15
+ * ```
16
+ */
17
+ export declare const useQuery: <TQueryable extends Queryable<any>>(queryDef: AccessorMaybe<TQueryable>, options: {
18
+ store: Store<any, any>;
19
+ }) => Solid.Accessor<Queryable.Result<TQueryable>>;
20
+ /**
21
+ */
22
+ export declare const useQueryRef: <TQueryable extends Queryable<any>>(queryable: AccessorMaybe<TQueryable>, options: {
23
+ store: Store<any, any>;
24
+ /** Parent otel context for the query */
25
+ otelContext?: otel.Context;
26
+ /** The name of the span to use for the query */
27
+ otelSpanName?: string;
28
+ }) => {
29
+ valueRef: Solid.Accessor<Queryable.Result<TQueryable>>;
30
+ queryRcRef: Solid.Accessor<LiveQueries.RcRef<LiveQuery<Queryable.Result<TQueryable>>>>;
31
+ };
32
+ //# sourceMappingURL=useQuery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../src/useQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC/C,OAAO,KAAK,KAAK,MAAM,UAAU,CAAA;AAUjC,OAAO,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,+BAA+B,CAAA;AAGhE,OAAO,EAAE,KAAK,aAAa,EAAW,MAAM,YAAY,CAAA;AAExD;;;;;;;;;;GAUG;AACH,eAAO,MAAM,QAAQ,GAAI,UAAU,SAAS,SAAS,CAAC,GAAG,CAAC,EACxD,UAAU,aAAa,CAAC,UAAU,CAAC,EACnC,SAAS;IAAE,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;CAAE,KAClC,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAA4C,CAAA;AAE1F;GACG;AACH,eAAO,MAAM,WAAW,GAAI,UAAU,SAAS,SAAS,CAAC,GAAG,CAAC,EAC3D,WAAW,aAAa,CAAC,UAAU,CAAC,EACpC,SAAS;IACP,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;IACtB,wCAAwC;IACxC,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA;IAC1B,gDAAgD;IAChD,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,KACA;IACD,QAAQ,EAAE,KAAK,CAAC,QAAQ,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAA;IACtD,UAAU,EAAE,KAAK,CAAC,QAAQ,CAAC,WAAW,CAAC,KAAK,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAA;CAoEvF,CAAA"}
@@ -0,0 +1,64 @@
1
+ import * as Solid from 'solid-js';
2
+ import { captureStackInfo, computeRcRefKey, createQueryResource, normalizeQueryable, runInitialQuery, } from '@livestore/framework-toolkit';
3
+ import { deepEqual } from '@livestore/utils';
4
+ import { resolve } from "./utils.js";
5
+ /**
6
+ * Returns the result of a query and subscribes to future updates.
7
+ *
8
+ * Example:
9
+ * ```tsx
10
+ * const App = () => {
11
+ * const todos = useQuery(queryDb(tables.todos.query.where({ complete: true })))
12
+ * return <div>{todos.map((todo) => <div key={todo.id}>{todo.title}</div>)}</div>
13
+ * }
14
+ * ```
15
+ */
16
+ export const useQuery = (queryDef, options) => useQueryRef(queryDef, options).valueRef;
17
+ /**
18
+ */
19
+ export const useQueryRef = (queryable, options) => {
20
+ const normalized = Solid.createMemo(() => normalizeQueryable(resolve(queryable)));
21
+ const rcRefKey = Solid.createMemo(() => computeRcRefKey(options.store, normalized()));
22
+ const stackInfo = captureStackInfo();
23
+ const resource = Solid.createMemo(Solid.on(rcRefKey, () => {
24
+ const _normalized = normalized();
25
+ const { queryRcRef, span, otelContext } = createQueryResource(options.store, _normalized, stackInfo, {
26
+ otelSpanName: options.otelSpanName,
27
+ otelContext: options.otelContext,
28
+ });
29
+ const [valueRef, setValueRef] = Solid.createSignal(runInitialQuery(queryRcRef.value, otelContext, stackInfo, 'solid'));
30
+ queryRcRef.value.activeSubscriptions.add(stackInfo);
31
+ // Dynamic queries only set their actual label after they've been run the first time,
32
+ // so we're also updating the span name here.
33
+ span.updateName(options.otelSpanName ?? `LiveStore:useQuery:${queryRcRef.value.label}`);
34
+ const cleanup = options.store.subscribe(queryRcRef.value, (newValue) => {
35
+ // NOTE: we return a reference to the result object within LiveStore;
36
+ // this implies that app code must not mutate the results, or else
37
+ // there may be weird reactivity bugs.
38
+ if (deepEqual(newValue, valueRef()) === false) {
39
+ setValueRef(newValue);
40
+ }
41
+ }, {
42
+ onUnsubsubscribe: () => {
43
+ queryRcRef.value.activeSubscriptions.delete(stackInfo);
44
+ },
45
+ label: queryRcRef.value.label,
46
+ otelContext,
47
+ });
48
+ Solid.onCleanup(() => {
49
+ queryRcRef.deref();
50
+ span.end();
51
+ cleanup();
52
+ });
53
+ return { valueRef, queryRcRef };
54
+ }));
55
+ return {
56
+ valueRef() {
57
+ return resource().valueRef();
58
+ },
59
+ queryRcRef() {
60
+ return resource().queryRcRef;
61
+ },
62
+ };
63
+ };
64
+ //# sourceMappingURL=useQuery.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQuery.js","sourceRoot":"","sources":["../src/useQuery.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * SSR tests for useQuery
3
+ * These tests run in node environment with SSR JSX transform using renderToString.
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=useQuery.server.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQuery.server.test.d.ts","sourceRoot":"","sources":["../src/useQuery.server.test.tsx"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -0,0 +1,88 @@
1
+ /**
2
+ * SSR tests for useQuery
3
+ * These tests run in node environment with SSR JSX transform using renderToString.
4
+ */
5
+ import { isServer, renderToString } from 'solid-js/web';
6
+ import { describe, expect, it } from 'vitest';
7
+ import { provideOtel } from '@livestore/common';
8
+ import { queryDb, signal } from '@livestore/livestore';
9
+ import { Effect, Schema } from '@livestore/utils/effect';
10
+ import { events, makeTodoMvcSolid, tables } from "./__tests__/fixture.jsx";
11
+ describe('environment', () => {
12
+ it('runs on server', () => {
13
+ // Use 'window' in globalThis to avoid TypeScript error without DOM lib
14
+ expect('window' in globalThis).toBe(false);
15
+ expect(isServer).toBe(true);
16
+ });
17
+ });
18
+ describe('useQuery SSR', () => {
19
+ it('renders simple query result to string', async () => {
20
+ await Effect.gen(function* () {
21
+ const { store } = yield* makeTodoMvcSolid({});
22
+ store.commit(events.todoCreated({ id: 't1', text: 'SSR Todo', completed: false }));
23
+ const allTodos$ = queryDb({ query: `select * from todos`, schema: Schema.Array(tables.todos.rowSchema) });
24
+ const TodoList = () => {
25
+ const todos = store.useQuery(allTodos$);
26
+ return (<ul>
27
+ {todos()?.map((todo) => (<li>{todo.text}</li>))}
28
+ </ul>);
29
+ };
30
+ const html = renderToString(() => <TodoList />);
31
+ expect(html).toContain('SSR Todo');
32
+ expect(html).toContain('<ul');
33
+ expect(html).toContain('<li');
34
+ }).pipe(provideOtel({}), Effect.scoped, Effect.runPromise);
35
+ });
36
+ it('renders filtered dependency query to string', async () => {
37
+ await Effect.gen(function* () {
38
+ const { store } = yield* makeTodoMvcSolid({});
39
+ const filter$ = signal('t1', { label: 'id-filter' });
40
+ const todo$ = queryDb((get) => tables.todos.where('id', get(filter$)), { label: 'todo' });
41
+ store.commit(events.todoCreated({ id: 't1', text: 'buy milk', completed: false }), events.todoCreated({ id: 't2', text: 'buy eggs', completed: false }));
42
+ const TodoItem = () => {
43
+ const query = store.useQuery(todo$);
44
+ return <div>{query()?.[0]?.text ?? 'No todo'}</div>;
45
+ };
46
+ const html = renderToString(() => <TodoItem />);
47
+ expect(html).toContain('buy milk');
48
+ }).pipe(provideOtel({}), Effect.scoped, Effect.runPromise);
49
+ });
50
+ it('renders signal query to string', async () => {
51
+ await Effect.gen(function* () {
52
+ const { store } = yield* makeTodoMvcSolid({});
53
+ const num$ = signal(42);
54
+ const Counter = () => {
55
+ const count = store.useQuery(num$);
56
+ return <div>Count: {count()}</div>;
57
+ };
58
+ const html = renderToString(() => <Counter />);
59
+ expect(html).toContain('Count:');
60
+ expect(html).toContain('42');
61
+ }).pipe(provideOtel({}), Effect.scoped, Effect.runPromise);
62
+ });
63
+ it('renders multiple todos to string', async () => {
64
+ await Effect.gen(function* () {
65
+ const { store } = yield* makeTodoMvcSolid({});
66
+ store.commit(events.todoCreated({ id: 't1', text: 'First', completed: false }), events.todoCreated({ id: 't2', text: 'Second', completed: true }), events.todoCreated({ id: 't3', text: 'Third', completed: false }));
67
+ const allTodos$ = queryDb({ query: `select * from todos`, schema: Schema.Array(tables.todos.rowSchema) });
68
+ const App = () => {
69
+ const todos = store.useQuery(allTodos$);
70
+ return (<div>
71
+ <h1>Todo App</h1>
72
+ <p>Count: {todos()?.length}</p>
73
+ <ul>
74
+ {todos()?.map((todo) => (<li>{todo.text}</li>))}
75
+ </ul>
76
+ </div>);
77
+ };
78
+ const html = renderToString(() => <App />);
79
+ expect(html).toContain('Todo App');
80
+ expect(html).toContain('Count:');
81
+ expect(html).toContain('3');
82
+ expect(html).toContain('First');
83
+ expect(html).toContain('Second');
84
+ expect(html).toContain('Third');
85
+ }).pipe(provideOtel({}), Effect.scoped, Effect.runPromise);
86
+ });
87
+ });
88
+ //# sourceMappingURL=useQuery.server.test.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useQuery.server.test.jsx","sourceRoot":"","sources":["../src/useQuery.server.test.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=useStore.client.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useStore.client.test.d.ts","sourceRoot":"","sources":["../src/useStore.client.test.tsx"],"names":[],"mappings":""}