@livestore/react 0.4.0-dev.9 → 0.4.0

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 (85) hide show
  1. package/README.md +1 -1
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/StoreRegistryContext.d.ts +56 -0
  4. package/dist/StoreRegistryContext.d.ts.map +1 -0
  5. package/dist/StoreRegistryContext.js +61 -0
  6. package/dist/StoreRegistryContext.js.map +1 -0
  7. package/dist/__tests__/fixture.d.ts +12 -283
  8. package/dist/__tests__/fixture.d.ts.map +1 -1
  9. package/dist/__tests__/fixture.js +12 -86
  10. package/dist/__tests__/fixture.js.map +1 -1
  11. package/dist/experimental/components/LiveList.d.ts +4 -2
  12. package/dist/experimental/components/LiveList.d.ts.map +1 -1
  13. package/dist/experimental/components/LiveList.js +10 -8
  14. package/dist/experimental/components/LiveList.js.map +1 -1
  15. package/dist/mod.d.ts +8 -5
  16. package/dist/mod.d.ts.map +1 -1
  17. package/dist/mod.js +6 -4
  18. package/dist/mod.js.map +1 -1
  19. package/dist/useClientDocument.d.ts +12 -4
  20. package/dist/useClientDocument.d.ts.map +1 -1
  21. package/dist/useClientDocument.js +4 -18
  22. package/dist/useClientDocument.js.map +1 -1
  23. package/dist/useClientDocument.test.js +21 -9
  24. package/dist/useClientDocument.test.js.map +1 -1
  25. package/dist/useQuery.d.ts +29 -8
  26. package/dist/useQuery.d.ts.map +1 -1
  27. package/dist/useQuery.js +43 -70
  28. package/dist/useQuery.js.map +1 -1
  29. package/dist/useQuery.test.js +57 -13
  30. package/dist/useQuery.test.js.map +1 -1
  31. package/dist/useRcResource.d.ts +1 -1
  32. package/dist/useRcResource.d.ts.map +1 -1
  33. package/dist/useRcResource.js +41 -34
  34. package/dist/useRcResource.js.map +1 -1
  35. package/dist/useRcResource.test.js +72 -50
  36. package/dist/useRcResource.test.js.map +1 -1
  37. package/dist/useStore.d.ts +74 -7
  38. package/dist/useStore.d.ts.map +1 -1
  39. package/dist/useStore.js +82 -16
  40. package/dist/useStore.js.map +1 -1
  41. package/dist/useStore.test.d.ts +2 -0
  42. package/dist/useStore.test.d.ts.map +1 -0
  43. package/dist/useStore.test.js +241 -0
  44. package/dist/useStore.test.js.map +1 -0
  45. package/dist/useSyncStatus.d.ts +22 -0
  46. package/dist/useSyncStatus.d.ts.map +1 -0
  47. package/dist/useSyncStatus.js +28 -0
  48. package/dist/useSyncStatus.js.map +1 -0
  49. package/package.json +69 -26
  50. package/src/StoreRegistryContext.tsx +70 -0
  51. package/src/__snapshots__/useClientDocument.test.tsx.snap +112 -78
  52. package/src/__snapshots__/useQuery.test.tsx.snap +12 -12
  53. package/src/__tests__/fixture.tsx +29 -133
  54. package/src/experimental/components/LiveList.tsx +23 -10
  55. package/src/mod.ts +8 -12
  56. package/src/useClientDocument.test.tsx +90 -79
  57. package/src/useClientDocument.ts +19 -38
  58. package/src/useQuery.test.tsx +99 -13
  59. package/src/useQuery.ts +74 -89
  60. package/src/useRcResource.test.tsx +115 -59
  61. package/src/useRcResource.ts +51 -37
  62. package/src/useStore.test.tsx +347 -0
  63. package/src/useStore.ts +115 -22
  64. package/src/useSyncStatus.ts +34 -0
  65. package/dist/LiveStoreContext.d.ts +0 -13
  66. package/dist/LiveStoreContext.d.ts.map +0 -1
  67. package/dist/LiveStoreContext.js +0 -3
  68. package/dist/LiveStoreContext.js.map +0 -1
  69. package/dist/LiveStoreProvider.d.ts +0 -65
  70. package/dist/LiveStoreProvider.d.ts.map +0 -1
  71. package/dist/LiveStoreProvider.js +0 -221
  72. package/dist/LiveStoreProvider.js.map +0 -1
  73. package/dist/LiveStoreProvider.test.d.ts +0 -2
  74. package/dist/LiveStoreProvider.test.d.ts.map +0 -1
  75. package/dist/LiveStoreProvider.test.js +0 -117
  76. package/dist/LiveStoreProvider.test.js.map +0 -1
  77. package/dist/utils/stack-info.d.ts +0 -4
  78. package/dist/utils/stack-info.d.ts.map +0 -1
  79. package/dist/utils/stack-info.js +0 -10
  80. package/dist/utils/stack-info.js.map +0 -1
  81. package/src/LiveStoreContext.ts +0 -14
  82. package/src/LiveStoreProvider.test.tsx +0 -248
  83. package/src/LiveStoreProvider.tsx +0 -413
  84. package/src/ambient.d.ts +0 -1
  85. package/src/utils/stack-info.ts +0 -13
@@ -0,0 +1,56 @@
1
+ import * as React from 'react';
2
+ import type { StoreRegistry } from '@livestore/livestore';
3
+ export declare const StoreRegistryContext: React.Context<StoreRegistry | undefined>;
4
+ export type StoreRegistryProviderProps = {
5
+ storeRegistry: StoreRegistry;
6
+ children: React.ReactNode;
7
+ };
8
+ /**
9
+ * React context provider that makes a {@link StoreRegistry} available to descendant components.
10
+ *
11
+ * Wrap your application (or a subtree) with this provider to enable {@link useStore} and
12
+ * {@link useStoreRegistry} hooks within that tree.
13
+ *
14
+ * @example
15
+ * ```tsx
16
+ * import { StoreRegistry } from '@livestore/livestore'
17
+ * import { StoreRegistryProvider } from '@livestore/react'
18
+ * import { unstable_batchedUpdates as batchUpdates } from 'react-dom'
19
+ *
20
+ * const storeRegistry = new StoreRegistry({
21
+ * defaultOptions: { batchUpdates }
22
+ * })
23
+ *
24
+ * function App() {
25
+ * return (
26
+ * <StoreRegistryProvider storeRegistry={storeRegistry}>
27
+ * <MyComponent />
28
+ * </StoreRegistryProvider>
29
+ * )
30
+ * }
31
+ * ```
32
+ */
33
+ export declare const StoreRegistryProvider: ({ storeRegistry, children }: StoreRegistryProviderProps) => React.JSX.Element;
34
+ /**
35
+ * Hook to access the {@link StoreRegistry} from context. Useful for advanced operations like preloading.
36
+ *
37
+ * @param override - Optional registry to use instead of the context value.
38
+ * When provided, skips context lookup entirely.
39
+ * @returns The registry provided by the nearest {@link StoreRegistryProvider} ancestor, or the `override` if provided.
40
+ * @throws Error if called outside a {@link StoreRegistryProvider} and no override is provided
41
+ *
42
+ * @example
43
+ * ```tsx
44
+ * function PreloadButton({ issueId }: { issueId: string }) {
45
+ * const storeRegistry = useStoreRegistry()
46
+ *
47
+ * const handleMouseEnter = () => {
48
+ * storeRegistry.preload(issueStoreOptions(issueId))
49
+ * }
50
+ *
51
+ * return <button onMouseEnter={handleMouseEnter}>View Issue</button>
52
+ * }
53
+ * ```
54
+ */
55
+ export declare const useStoreRegistry: (override?: StoreRegistry) => StoreRegistry;
56
+ //# sourceMappingURL=StoreRegistryContext.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StoreRegistryContext.d.ts","sourceRoot":"","sources":["../src/StoreRegistryContext.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAE9B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAEzD,eAAO,MAAM,oBAAoB,0CAA4D,CAAA;AAE7F,MAAM,MAAM,0BAA0B,GAAG;IACvC,aAAa,EAAE,aAAa,CAAA;IAC5B,QAAQ,EAAE,KAAK,CAAC,SAAS,CAAA;CAC1B,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,eAAO,MAAM,qBAAqB,GAAI,6BAA6B,0BAA0B,KAAG,KAAK,CAAC,GAAG,CAAC,OAEzG,CAAA;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,gBAAgB,GAAI,WAAW,aAAa,kBAQxD,CAAA"}
@@ -0,0 +1,61 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import * as React from 'react';
3
+ export const StoreRegistryContext = React.createContext(undefined);
4
+ /**
5
+ * React context provider that makes a {@link StoreRegistry} available to descendant components.
6
+ *
7
+ * Wrap your application (or a subtree) with this provider to enable {@link useStore} and
8
+ * {@link useStoreRegistry} hooks within that tree.
9
+ *
10
+ * @example
11
+ * ```tsx
12
+ * import { StoreRegistry } from '@livestore/livestore'
13
+ * import { StoreRegistryProvider } from '@livestore/react'
14
+ * import { unstable_batchedUpdates as batchUpdates } from 'react-dom'
15
+ *
16
+ * const storeRegistry = new StoreRegistry({
17
+ * defaultOptions: { batchUpdates }
18
+ * })
19
+ *
20
+ * function App() {
21
+ * return (
22
+ * <StoreRegistryProvider storeRegistry={storeRegistry}>
23
+ * <MyComponent />
24
+ * </StoreRegistryProvider>
25
+ * )
26
+ * }
27
+ * ```
28
+ */
29
+ export const StoreRegistryProvider = ({ storeRegistry, children }) => {
30
+ return _jsx(StoreRegistryContext, { value: storeRegistry, children: children });
31
+ };
32
+ /**
33
+ * Hook to access the {@link StoreRegistry} from context. Useful for advanced operations like preloading.
34
+ *
35
+ * @param override - Optional registry to use instead of the context value.
36
+ * When provided, skips context lookup entirely.
37
+ * @returns The registry provided by the nearest {@link StoreRegistryProvider} ancestor, or the `override` if provided.
38
+ * @throws Error if called outside a {@link StoreRegistryProvider} and no override is provided
39
+ *
40
+ * @example
41
+ * ```tsx
42
+ * function PreloadButton({ issueId }: { issueId: string }) {
43
+ * const storeRegistry = useStoreRegistry()
44
+ *
45
+ * const handleMouseEnter = () => {
46
+ * storeRegistry.preload(issueStoreOptions(issueId))
47
+ * }
48
+ *
49
+ * return <button onMouseEnter={handleMouseEnter}>View Issue</button>
50
+ * }
51
+ * ```
52
+ */
53
+ export const useStoreRegistry = (override) => {
54
+ if (override !== undefined)
55
+ return override;
56
+ const storeRegistry = React.use(StoreRegistryContext);
57
+ if (storeRegistry == null)
58
+ throw new Error('useStoreRegistry() must be used within <StoreRegistryProvider>');
59
+ return storeRegistry;
60
+ };
61
+ //# sourceMappingURL=StoreRegistryContext.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StoreRegistryContext.js","sourceRoot":"","sources":["../src/StoreRegistryContext.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAA;AAI9B,MAAM,CAAC,MAAM,oBAAoB,GAAG,KAAK,CAAC,aAAa,CAA4B,SAAS,CAAC,CAAA;AAO7F;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,EAAE,aAAa,EAAE,QAAQ,EAA8B,EAAqB,EAAE;IAClH,OAAO,KAAC,oBAAoB,IAAC,KAAK,EAAE,aAAa,YAAG,QAAQ,GAAwB,CAAA;AACtF,CAAC,CAAA;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,QAAwB,EAAE,EAAE;IAC3D,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,QAAQ,CAAA;IAE3C,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAA;IAErD,IAAI,aAAa,IAAI,IAAI;QAAE,MAAM,IAAI,KAAK,CAAC,gEAAgE,CAAC,CAAA;IAE5G,OAAO,aAAa,CAAA;AACtB,CAAC,CAAA"}
@@ -1,291 +1,20 @@
1
- import { type UnexpectedError } from '@livestore/common';
2
- import { State } from '@livestore/common/schema';
3
- import type { LiveStoreSchema, SqliteDsl, Store } from '@livestore/livestore';
4
- import { Effect, Schema, type Scope } from '@livestore/utils/effect';
5
- import type * as otel from '@opentelemetry/api';
1
+ import type { UnknownError } from '@livestore/common';
2
+ import { type AppState, type CreateTodoMvcStoreOptions, events, type Filter, schema, type Todo, tables } from '@livestore/framework-toolkit/testing';
3
+ import type { Store } from '@livestore/livestore';
4
+ import { Effect, type Scope } from '@livestore/utils/effect';
6
5
  import React from 'react';
7
- import * as LiveStoreReact from '../mod.js';
8
- export type Todo = {
9
- id: string;
10
- text: string;
11
- completed: boolean;
6
+ import * as LiveStoreReact from '../mod.ts';
7
+ export { events, schema, tables };
8
+ export type { AppState, Filter, Todo };
9
+ export type MakeTodoMvcReactOptions = CreateTodoMvcStoreOptions & {
10
+ strictMode?: boolean | undefined;
12
11
  };
13
- export type Filter = 'all' | 'active' | 'completed';
14
- export type AppState = {
15
- newTodoText: string;
16
- filter: Filter;
17
- };
18
- export declare const events: {
19
- todoCreated: State.SQLite.EventDef<"todoCreated", {
20
- readonly id: string;
21
- readonly text: string;
22
- readonly completed: boolean;
23
- }, {
24
- readonly id: string;
25
- readonly text: string;
26
- readonly completed: boolean;
27
- }, false>;
28
- todoUpdated: State.SQLite.EventDef<"todoUpdated", {
29
- readonly id: string;
30
- readonly text?: string | undefined;
31
- readonly completed?: boolean | undefined;
32
- }, {
33
- readonly id: string;
34
- readonly text?: string | undefined;
35
- readonly completed?: boolean | undefined;
36
- }, false>;
37
- AppRouterSet: State.SQLite.ClientDocumentTableDef.SetEventDefLike<"AppRouter", {
38
- readonly currentTaskId: string | null;
39
- }, {
40
- partialSet: true;
41
- default: {
42
- id: "singleton";
43
- value: {
44
- readonly currentTaskId: null;
45
- };
46
- };
47
- }>;
48
- UserInfoSet: State.SQLite.ClientDocumentTableDef.SetEventDefLike<"UserInfo", {
49
- readonly text: string;
50
- readonly username: string;
51
- }, {
52
- partialSet: true;
53
- default: {
54
- id: undefined;
55
- value: {
56
- readonly username: "";
57
- readonly text: "";
58
- };
59
- };
60
- }>;
61
- KvSet: State.SQLite.ClientDocumentTableDef.SetEventDefLike<"Kv", any, {
62
- partialSet: false;
63
- default: {
64
- id: undefined;
65
- value: null;
66
- };
67
- }>;
68
- };
69
- export declare const tables: {
70
- todos: State.SQLite.TableDef<State.SQLite.SqliteTableDefForInput<"todos", {
71
- readonly id: {
72
- columnType: "text";
73
- schema: Schema.Schema<string, string, never>;
74
- default: import("effect/Option").None<never>;
75
- nullable: false;
76
- primaryKey: true;
77
- autoIncrement: false;
78
- };
79
- readonly text: {
80
- columnType: "text";
81
- schema: Schema.Schema<string, string, never>;
82
- default: import("effect/Option").Some<"">;
83
- nullable: false;
84
- primaryKey: false;
85
- autoIncrement: false;
86
- };
87
- readonly completed: {
88
- columnType: "integer";
89
- schema: Schema.Schema<boolean, number, never>;
90
- default: import("effect/Option").Some<false>;
91
- nullable: false;
92
- primaryKey: false;
93
- autoIncrement: false;
94
- };
95
- }>, State.SQLite.WithDefaults<{
96
- readonly id: {
97
- columnType: "text";
98
- schema: Schema.Schema<string, string, never>;
99
- default: import("effect/Option").None<never>;
100
- nullable: false;
101
- primaryKey: true;
102
- autoIncrement: false;
103
- };
104
- readonly text: {
105
- columnType: "text";
106
- schema: Schema.Schema<string, string, never>;
107
- default: import("effect/Option").Some<"">;
108
- nullable: false;
109
- primaryKey: false;
110
- autoIncrement: false;
111
- };
112
- readonly completed: {
113
- columnType: "integer";
114
- schema: Schema.Schema<boolean, number, never>;
115
- default: import("effect/Option").Some<false>;
116
- nullable: false;
117
- primaryKey: false;
118
- autoIncrement: false;
119
- };
120
- }>, Schema.Schema<{
121
- readonly id: string;
122
- readonly text: string;
123
- readonly completed: boolean;
124
- }, {
125
- readonly id: string;
126
- readonly text: string;
127
- readonly completed: number;
128
- }, never>>;
129
- app: State.SQLite.TableDef<State.SQLite.SqliteTableDefForInput<"app", {
130
- readonly id: {
131
- columnType: "text";
132
- schema: Schema.Schema<string, string, never>;
133
- default: import("effect/Option").Some<"static">;
134
- nullable: false;
135
- primaryKey: true;
136
- autoIncrement: false;
137
- };
138
- readonly newTodoText: {
139
- columnType: "text";
140
- schema: Schema.Schema<string | null, string | null, never>;
141
- default: import("effect/Option").Some<"">;
142
- nullable: true;
143
- primaryKey: false;
144
- autoIncrement: false;
145
- };
146
- readonly filter: {
147
- columnType: "text";
148
- schema: Schema.Schema<string, string, never>;
149
- default: import("effect/Option").Some<"all">;
150
- nullable: false;
151
- primaryKey: false;
152
- autoIncrement: false;
153
- };
154
- }>, State.SQLite.WithDefaults<{
155
- readonly id: {
156
- columnType: "text";
157
- schema: Schema.Schema<string, string, never>;
158
- default: import("effect/Option").Some<"static">;
159
- nullable: false;
160
- primaryKey: true;
161
- autoIncrement: false;
162
- };
163
- readonly newTodoText: {
164
- columnType: "text";
165
- schema: Schema.Schema<string | null, string | null, never>;
166
- default: import("effect/Option").Some<"">;
167
- nullable: true;
168
- primaryKey: false;
169
- autoIncrement: false;
170
- };
171
- readonly filter: {
172
- columnType: "text";
173
- schema: Schema.Schema<string, string, never>;
174
- default: import("effect/Option").Some<"all">;
175
- nullable: false;
176
- primaryKey: false;
177
- autoIncrement: false;
178
- };
179
- }>, Schema.Schema<{
180
- readonly id: string;
181
- readonly newTodoText: string | null;
182
- readonly filter: string;
183
- }, {
184
- readonly id: string;
185
- readonly newTodoText: string | null;
186
- readonly filter: string;
187
- }, never>>;
188
- userInfo: State.SQLite.ClientDocumentTableDef<"UserInfo", {
189
- readonly text: string;
190
- readonly username: string;
191
- }, {
192
- readonly text: string;
193
- readonly username: string;
194
- }, {
195
- partialSet: true;
196
- default: {
197
- id: undefined;
198
- value: {
199
- readonly username: "";
200
- readonly text: "";
201
- };
202
- };
203
- }>;
204
- AppRouterSchema: State.SQLite.ClientDocumentTableDef<"AppRouter", {
205
- readonly currentTaskId: string | null;
206
- }, {
207
- readonly currentTaskId: string | null;
208
- }, {
209
- partialSet: true;
210
- default: {
211
- id: "singleton";
212
- value: {
213
- readonly currentTaskId: null;
214
- };
215
- };
216
- }>;
217
- kv: State.SQLite.ClientDocumentTableDef<"Kv", any, any, {
218
- partialSet: false;
219
- default: {
220
- id: undefined;
221
- value: null;
222
- };
223
- }>;
224
- };
225
- export declare const schema: import("@livestore/livestore").FromInputSchema.DeriveSchema<{
226
- state: import("@livestore/livestore").InternalState;
227
- events: {
228
- todoCreated: State.SQLite.EventDef<"todoCreated", {
229
- readonly id: string;
230
- readonly text: string;
231
- readonly completed: boolean;
232
- }, {
233
- readonly id: string;
234
- readonly text: string;
235
- readonly completed: boolean;
236
- }, false>;
237
- todoUpdated: State.SQLite.EventDef<"todoUpdated", {
238
- readonly id: string;
239
- readonly text?: string | undefined;
240
- readonly completed?: boolean | undefined;
241
- }, {
242
- readonly id: string;
243
- readonly text?: string | undefined;
244
- readonly completed?: boolean | undefined;
245
- }, false>;
246
- AppRouterSet: State.SQLite.ClientDocumentTableDef.SetEventDefLike<"AppRouter", {
247
- readonly currentTaskId: string | null;
248
- }, {
249
- partialSet: true;
250
- default: {
251
- id: "singleton";
252
- value: {
253
- readonly currentTaskId: null;
254
- };
255
- };
256
- }>;
257
- UserInfoSet: State.SQLite.ClientDocumentTableDef.SetEventDefLike<"UserInfo", {
258
- readonly text: string;
259
- readonly username: string;
260
- }, {
261
- partialSet: true;
262
- default: {
263
- id: undefined;
264
- value: {
265
- readonly username: "";
266
- readonly text: "";
267
- };
268
- };
269
- }>;
270
- KvSet: State.SQLite.ClientDocumentTableDef.SetEventDefLike<"Kv", any, {
271
- partialSet: false;
272
- default: {
273
- id: undefined;
274
- value: null;
275
- };
276
- }>;
277
- };
278
- }>;
279
- export declare const makeTodoMvcReact: ({ otelTracer, otelContext, strictMode, }?: {
280
- otelTracer?: otel.Tracer;
281
- otelContext?: otel.Context;
282
- strictMode?: boolean;
283
- }) => Effect.Effect<{
12
+ export declare const makeTodoMvcReact: (opts?: MakeTodoMvcReactOptions) => Effect.Effect<{
284
13
  wrapper: ({ children }: any) => React.JSX.Element;
285
- store: Store<LiveStoreSchema<SqliteDsl.DbSchema, State.SQLite.EventDefRecord>, {}> & LiveStoreReact.ReactApi;
14
+ store: Store<typeof schema> & LiveStoreReact.ReactApi;
286
15
  renderCount: {
287
16
  readonly val: number;
288
17
  inc: () => void;
289
18
  };
290
- }, UnexpectedError, Scope.Scope>;
19
+ }, UnknownError, Scope.Scope>;
291
20
  //# sourceMappingURL=fixture.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fixture.d.ts","sourceRoot":"","sources":["../../src/__tests__/fixture.tsx"],"names":[],"mappings":"AACA,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,mBAAmB,CAAA;AACrE,OAAO,EAAsB,KAAK,EAAE,MAAM,0BAA0B,CAAA;AACpE,OAAO,KAAK,EAAE,eAAe,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAG7E,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,cAAc,MAAM,WAAW,CAAA;AAE3C,MAAM,MAAM,IAAI,GAAG;IACjB,EAAE,EAAE,MAAM,CAAA;IACV,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,OAAO,CAAA;CACnB,CAAA;AAED,MAAM,MAAM,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,WAAW,CAAA;AAEnD,MAAM,MAAM,QAAQ,GAAG;IACrB,WAAW,EAAE,MAAM,CAAA;IACnB,MAAM,EAAE,MAAM,CAAA;CACf,CAAA;AA8CD,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAgBlB,CAAA;AAOD,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAgD,CAAA;AAGnE,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAAgC,CAAA;AAEnD,eAAO,MAAM,gBAAgB,EAAE,CAAC,EAC9B,UAAU,EACV,WAAW,EACX,UAAU,GACX,CAAC,EAAE;IACF,UAAU,CAAC,EAAE,IAAI,CAAC,MAAM,CAAA;IACxB,WAAW,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA;IAC1B,UAAU,CAAC,EAAE,OAAO,CAAA;CACrB,KAAK,MAAM,CAAC,MAAM,CACjB;IACE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,CAAA;IACjD,KAAK,EAAE,KAAK,CAAC,eAAe,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAA;IAC5G,WAAW,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,IAAI,CAAA;KAAE,CAAA;CACvD,EACD,eAAe,EACf,KAAK,CAAC,KAAK,CAsDyE,CAAA"}
1
+ {"version":3,"file":"fixture.d.ts","sourceRoot":"","sources":["../../src/__tests__/fixture.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,OAAO,EACL,KAAK,QAAQ,EACb,KAAK,yBAAyB,EAE9B,MAAM,EACN,KAAK,MAAM,EACX,MAAM,EACN,KAAK,IAAI,EACT,MAAM,EACP,MAAM,sCAAsC,CAAA;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,KAAK,KAAK,EAAE,MAAM,yBAAyB,CAAA;AAC5D,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,cAAc,MAAM,WAAW,CAAA;AAG3C,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;AACjC,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,CAAA;AAEtC,MAAM,MAAM,uBAAuB,GAAG,yBAAyB,GAAG;IAChE,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAA;CACjC,CAAA;AAED,eAAO,MAAM,gBAAgB,EAAE,CAAC,IAAI,CAAC,EAAE,uBAAuB,KAAK,MAAM,CAAC,MAAM,CAC9E;IACE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,EAAE,GAAG,KAAK,KAAK,CAAC,GAAG,CAAC,OAAO,CAAA;IACjD,KAAK,EAAE,KAAK,CAAC,OAAO,MAAM,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAA;IACrD,WAAW,EAAE;QAAE,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,IAAI,CAAA;KAAE,CAAA;CACvD,EACD,YAAY,EACZ,KAAK,CAAC,KAAK,CA8BT,CAAA"}
@@ -1,80 +1,16 @@
1
1
  import { jsx as _jsx } from "react/jsx-runtime";
2
- import { makeInMemoryAdapter } from '@livestore/adapter-web';
3
- import { provideOtel } from '@livestore/common';
4
- import { Events, makeSchema, State } from '@livestore/common/schema';
5
- import { createStore } from '@livestore/livestore';
6
- import { omitUndefineds } from '@livestore/utils';
7
- import { Effect, Schema } from '@livestore/utils/effect';
2
+ import { createTodoMvcStore, events, schema, tables, } from '@livestore/framework-toolkit/testing';
3
+ import { Effect } from '@livestore/utils/effect';
8
4
  import React from 'react';
9
- import * as LiveStoreReact from '../mod.js';
10
- const todos = State.SQLite.table({
11
- name: 'todos',
12
- columns: {
13
- id: State.SQLite.text({ primaryKey: true }),
14
- text: State.SQLite.text({ default: '', nullable: false }),
15
- completed: State.SQLite.boolean({ default: false, nullable: false }),
16
- },
17
- });
18
- const app = State.SQLite.table({
19
- name: 'app',
20
- columns: {
21
- id: State.SQLite.text({ primaryKey: true, default: 'static' }),
22
- newTodoText: State.SQLite.text({ default: '', nullable: true }),
23
- filter: State.SQLite.text({ default: 'all', nullable: false }),
24
- },
25
- });
26
- const userInfo = State.SQLite.clientDocument({
27
- name: 'UserInfo',
28
- schema: Schema.Struct({
29
- username: Schema.String,
30
- text: Schema.String,
31
- }),
32
- default: { value: { username: '', text: '' } },
33
- });
34
- const AppRouterSchema = State.SQLite.clientDocument({
35
- name: 'AppRouter',
36
- schema: Schema.Struct({
37
- currentTaskId: Schema.String.pipe(Schema.NullOr),
38
- }),
39
- default: {
40
- value: { currentTaskId: null },
41
- id: 'singleton',
42
- },
43
- });
44
- const kv = State.SQLite.clientDocument({
45
- name: 'Kv',
46
- schema: Schema.Any,
47
- default: { value: null },
48
- });
49
- export const events = {
50
- todoCreated: Events.synced({
51
- name: 'todoCreated',
52
- schema: Schema.Struct({ id: Schema.String, text: Schema.String, completed: Schema.Boolean }),
53
- }),
54
- todoUpdated: Events.synced({
55
- name: 'todoUpdated',
56
- schema: Schema.Struct({
57
- id: Schema.String,
58
- text: Schema.String.pipe(Schema.optional),
59
- completed: Schema.Boolean.pipe(Schema.optional),
60
- }),
61
- }),
62
- AppRouterSet: AppRouterSchema.set,
63
- UserInfoSet: userInfo.set,
64
- KvSet: kv.set,
65
- };
66
- const materializers = State.SQLite.materializers(events, {
67
- todoCreated: ({ id, text, completed }) => todos.insert({ id, text, completed }),
68
- todoUpdated: ({ id, text, completed }) => todos.update({ ...omitUndefineds({ completed, text }) }).where({ id }),
69
- });
70
- export const tables = { todos, app, userInfo, AppRouterSchema, kv };
71
- const state = State.SQLite.makeState({ tables, materializers });
72
- export const schema = makeSchema({ state, events });
73
- export const makeTodoMvcReact = ({ otelTracer, otelContext, strictMode, } = {}) => Effect.gen(function* () {
5
+ import * as LiveStoreReact from "../mod.js";
6
+ // Re-export shared types and schema
7
+ export { events, schema, tables };
8
+ export const makeTodoMvcReact = (opts = {}) => Effect.gen(function* () {
9
+ const { strictMode } = opts;
74
10
  const makeRenderCount = () => {
75
11
  let val = 0;
76
12
  const inc = () => {
77
- val += strictMode ? 0.5 : 1;
13
+ val += strictMode === true ? 0.5 : 1;
78
14
  };
79
15
  return {
80
16
  get val() {
@@ -83,21 +19,11 @@ export const makeTodoMvcReact = ({ otelTracer, otelContext, strictMode, } = {})
83
19
  inc,
84
20
  };
85
21
  };
86
- const store = yield* createStore({
87
- schema,
88
- storeId: 'default',
89
- adapter: makeInMemoryAdapter(),
90
- debug: { instanceId: 'test' },
91
- });
22
+ const store = yield* createTodoMvcStore(opts);
92
23
  const storeWithReactApi = LiveStoreReact.withReactApi(store);
93
- // TODO improve typing of `LiveStoreContext`
94
- const storeContext = {
95
- stage: 'running',
96
- store: storeWithReactApi,
97
- };
98
- const MaybeStrictMode = strictMode ? React.StrictMode : React.Fragment;
99
- const wrapper = ({ children }) => (_jsx(MaybeStrictMode, { children: _jsx(LiveStoreReact.LiveStoreContext.Provider, { value: storeContext, children: children }) }));
24
+ const MaybeStrictMode = strictMode === true ? React.StrictMode : React.Fragment;
25
+ const wrapper = ({ children }) => _jsx(MaybeStrictMode, { children: children });
100
26
  const renderCount = makeRenderCount();
101
27
  return { wrapper, store: storeWithReactApi, renderCount };
102
- }).pipe(provideOtel(omitUndefineds({ parentSpanContext: otelContext, otelTracer })));
28
+ });
103
29
  //# sourceMappingURL=fixture.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fixture.js","sourceRoot":"","sources":["../../src/__tests__/fixture.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"fixture.js","sourceRoot":"","sources":["../../src/__tests__/fixture.tsx"],"names":[],"mappings":";AACA,OAAO,EAGL,kBAAkB,EAClB,MAAM,EAEN,MAAM,EAEN,MAAM,GACP,MAAM,sCAAsC,CAAA;AAE7C,OAAO,EAAE,MAAM,EAAc,MAAM,yBAAyB,CAAA;AAC5D,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,cAAc,MAAM,WAAW,CAAA;AAE3C,oCAAoC;AACpC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,CAAA;AAOjC,MAAM,CAAC,MAAM,gBAAgB,GAQzB,CAAC,OAAgC,EAAE,EAAE,EAAE,CACzC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAA;IAC3B,MAAM,eAAe,GAAG,GAAG,EAAE;QAC3B,IAAI,GAAG,GAAG,CAAC,CAAA;QAEX,MAAM,GAAG,GAAG,GAAG,EAAE;YACf,GAAG,IAAI,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;QACtC,CAAC,CAAA;QAED,OAAO;YACL,IAAI,GAAG;gBACL,OAAO,GAAG,CAAA;YACZ,CAAC;YACD,GAAG;SACJ,CAAA;IACH,CAAC,CAAA;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,CAAA;IAE7C,MAAM,iBAAiB,GAAG,cAAc,CAAC,YAAY,CAAC,KAAK,CAAC,CAAA;IAE5D,MAAM,eAAe,GAAG,UAAU,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAA;IAE/E,MAAM,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAO,EAAE,EAAE,CAAC,KAAC,eAAe,cAAE,QAAQ,GAAmB,CAAA;IAEpF,MAAM,WAAW,GAAG,eAAe,EAAE,CAAA;IAErC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,iBAAiB,EAAE,WAAW,EAAE,CAAA;AAC3D,CAAC,CAAC,CAAA"}
@@ -1,4 +1,4 @@
1
- import type { LiveQueryDef } from '@livestore/livestore';
1
+ import type { LiveQueryDef, Store } from '@livestore/livestore';
2
2
  import React from 'react';
3
3
  export type LiveListProps<TItem> = {
4
4
  items$: LiveQueryDef<ReadonlyArray<TItem>>;
@@ -8,6 +8,8 @@ export type LiveListProps<TItem> = {
8
8
  }) => React.ReactNode;
9
9
  /** Needs to be unique across all list items */
10
10
  getKey: (item: TItem, index: number) => string | number;
11
+ /** The store instance to use for queries */
12
+ store: Store<any, any>;
11
13
  };
12
14
  /**
13
15
  * This component is a helper component for rendering a list of items for a LiveQuery of an array of items.
@@ -17,5 +19,5 @@ export type LiveListProps<TItem> = {
17
19
  * In the future we want to make this component even more efficient by using incremental rendering (https://github.com/livestorejs/livestore/pull/55)
18
20
  * e.g. when an item is added/removed/moved to only re-render the affected DOM nodes.
19
21
  */
20
- export declare const LiveList: <TItem>({ items$, renderItem, getKey }: LiveListProps<TItem>) => React.ReactNode;
22
+ export declare const LiveList: <TItem>({ items$, renderItem, getKey, store }: LiveListProps<TItem>) => React.ReactNode;
21
23
  //# sourceMappingURL=LiveList.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"LiveList.d.ts","sourceRoot":"","sources":["../../../src/experimental/components/LiveList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAA;AAExD,OAAO,KAAK,MAAM,OAAO,CAAA;AAUzB,MAAM,MAAM,aAAa,CAAC,KAAK,IAAI;IACjC,MAAM,EAAE,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;IAE1C,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,OAAO,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAA;IACnG,+CAA+C;IAC/C,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAA;CACxD,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,GAAI,KAAK,EAAG,gCAAgC,aAAa,CAAC,KAAK,CAAC,KAAG,KAAK,CAAC,SAkC7F,CAAA"}
1
+ {"version":3,"file":"LiveList.d.ts","sourceRoot":"","sources":["../../../src/experimental/components/LiveList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAE/D,OAAO,KAAK,MAAM,OAAO,CAAA;AAUzB,MAAM,MAAM,aAAa,CAAC,KAAK,IAAI;IACjC,MAAM,EAAE,YAAY,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;IAE1C,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,mBAAmB,EAAE,OAAO,CAAA;KAAE,KAAK,KAAK,CAAC,SAAS,CAAA;IACnG,+CAA+C;IAC/C,MAAM,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,KAAK,MAAM,GAAG,MAAM,CAAA;IACvD,4CAA4C;IAC5C,KAAK,EAAE,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,CAAA;CACvB,CAAA;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,QAAQ,GAAI,KAAK,EAAG,uCAAuC,aAAa,CAAC,KAAK,CAAC,KAAG,KAAK,CAAC,SAuCpG,CAAA"}
@@ -1,7 +1,7 @@
1
1
  import { jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
2
  import { computed } from '@livestore/livestore';
3
3
  import React from 'react';
4
- import { useQuery } from '../../useQuery.js';
4
+ import { useQuery } from "../../useQuery.js";
5
5
  /**
6
6
  * This component is a helper component for rendering a list of items for a LiveQuery of an array of items.
7
7
  * The idea is that instead of letting React handle the rendering of the items array directly,
@@ -10,10 +10,10 @@ import { useQuery } from '../../useQuery.js';
10
10
  * In the future we want to make this component even more efficient by using incremental rendering (https://github.com/livestorejs/livestore/pull/55)
11
11
  * e.g. when an item is added/removed/moved to only re-render the affected DOM nodes.
12
12
  */
13
- export const LiveList = ({ items$, renderItem, getKey }) => {
13
+ export const LiveList = ({ items$, renderItem, getKey, store }) => {
14
14
  const [hasMounted, setHasMounted] = React.useState(false);
15
15
  React.useEffect(() => setHasMounted(true), []);
16
- const keys = useQuery(computed((get) => get(items$).map(getKey)));
16
+ const keys = useQuery(computed((get) => get(items$).map(getKey)), { store });
17
17
  const arr = React.useMemo(() => keys.map((key) =>
18
18
  // TODO figure out a way so that `item$` returns an ordered lookup map to more efficiently find the item by key
19
19
  [
@@ -22,14 +22,16 @@ export const LiveList = ({ items$, renderItem, getKey }) => {
22
22
  deps: [key],
23
23
  }),
24
24
  ]), [getKey, items$, keys]);
25
- return (_jsx(_Fragment, { children: arr.map(([key, item$], index) => (_jsx(ItemWrapperMemo, { itemKey: key, "item$": item$, opts: { isInitialListRender: !hasMounted, index }, renderItem: renderItem }, key))) }));
25
+ return (_jsx(_Fragment, { children: arr.map(([key, item$], index) => (_jsx(ItemWrapperMemo, { itemKey: key, "item$": item$, store: store, index: index, isInitialListRender: !hasMounted, renderItem: renderItem }, key))) }));
26
26
  };
27
- const ItemWrapper = ({ item$, opts, renderItem, }) => {
28
- const item = useQuery(item$);
27
+ const ItemWrapper = ({ item$, index, isInitialListRender, renderItem, store, }) => {
28
+ const item = useQuery(item$, { store });
29
+ const opts = React.useMemo(() => ({ index, isInitialListRender }), [index, isInitialListRender]);
29
30
  return _jsx(_Fragment, { children: renderItem(item, opts) });
30
31
  };
31
32
  const ItemWrapperMemo = React.memo(ItemWrapper, (prev, next) => prev.itemKey === next.itemKey &&
32
33
  prev.renderItem === next.renderItem &&
33
- prev.opts.index === next.opts.index &&
34
- prev.opts.isInitialListRender === next.opts.isInitialListRender);
34
+ prev.store === next.store &&
35
+ prev.index === next.index &&
36
+ prev.isInitialListRender === next.isInitialListRender);
35
37
  //# sourceMappingURL=LiveList.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LiveList.js","sourceRoot":"","sources":["../../../src/experimental/components/LiveList.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAgB5C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAwB,EAAmB,EAAE;IACxG,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEzD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAE9C,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;IACjE,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CACvB,GAAG,EAAE,CACH,IAAI,CAAC,GAAG,CACN,CAAC,GAAG,EAAE,EAAE;IACN,+GAA+G;IAC/G;QACE,GAAG;QACH,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,GAAG,CAAE,EAAE;YACtE,IAAI,EAAE,CAAC,GAAG,CAAC;SACZ,CAAwB;KACjB,CACb,EACH,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CACvB,CAAA;IAED,OAAO,CACL,4BACG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAChC,KAAC,eAAe,IAEd,OAAO,EAAE,GAAG,WACL,KAAK,EACZ,IAAI,EAAE,EAAE,mBAAmB,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,EACjD,UAAU,EAAE,UAAU,IAJjB,GAAG,CAKR,CACH,CAAC,GACD,CACJ,CAAA;AACH,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,CAAS,EAC3B,KAAK,EACL,IAAI,EACJ,UAAU,GAMX,EAAE,EAAE;IACH,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAA;IAE5B,OAAO,4BAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,GAAI,CAAA;AACtC,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAChC,WAAW,EACX,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO;IAC7B,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU;IACnC,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,IAAI,CAAC,KAAK;IACnC,IAAI,CAAC,IAAI,CAAC,mBAAmB,KAAK,IAAI,CAAC,IAAI,CAAC,mBAAmB,CAC5C,CAAA"}
1
+ {"version":3,"file":"LiveList.js","sourceRoot":"","sources":["../../../src/experimental/components/LiveList.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAkB5C;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAwB,EAAmB,EAAE;IAC/G,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAA;IAEzD,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC,CAAA;IAE9C,MAAM,IAAI,GAAG,QAAQ,CACnB,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAC1C,EAAE,KAAK,EAAE,CACV,CAAA;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CACvB,GAAG,EAAE,CACH,IAAI,CAAC,GAAG,CACN,CAAC,GAAG,EAAE,EAAE;IACN,+GAA+G;IAC/G;QACE,GAAG;QACH,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,GAAG,CAAE,EAAE;YACtE,IAAI,EAAE,CAAC,GAAG,CAAC;SACZ,CAAwB;KACjB,CACb,EACH,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CACvB,CAAA;IAED,OAAO,CACL,4BACG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAChC,KAAC,eAAe,IAEd,OAAO,EAAE,GAAG,WACL,KAAK,EACZ,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,KAAK,EACZ,mBAAmB,EAAE,CAAC,UAAU,EAChC,UAAU,EAAE,UAAU,IANjB,GAAG,CAOR,CACH,CAAC,GACD,CACJ,CAAA;AACH,CAAC,CAAA;AAED,MAAM,WAAW,GAAG,CAAS,EAC3B,KAAK,EACL,KAAK,EACL,mBAAmB,EACnB,UAAU,EACV,KAAK,GAQN,EAAE,EAAE;IACH,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,CAAA;IACvC,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,mBAAmB,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC,CAAA;IAEhG,OAAO,4BAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,GAAI,CAAA;AACtC,CAAC,CAAA;AAED,MAAM,eAAe,GAAG,KAAK,CAAC,IAAI,CAChC,WAAW,EACX,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CACb,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO;IAC7B,IAAI,CAAC,UAAU,KAAK,IAAI,CAAC,UAAU;IACnC,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;IACzB,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;IACzB,IAAI,CAAC,mBAAmB,KAAK,IAAI,CAAC,mBAAmB,CAClC,CAAA"}