@livestore/livestore 0.0.46-dev.4 → 0.0.47-dev.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 (108) hide show
  1. package/README.md +10 -0
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/__tests__/react/fixture.d.ts +28 -12
  4. package/dist/__tests__/react/fixture.d.ts.map +1 -1
  5. package/dist/__tests__/react/fixture.js +27 -3
  6. package/dist/__tests__/react/fixture.js.map +1 -1
  7. package/dist/__tests__/react/utils/otel.d.ts +10 -0
  8. package/dist/__tests__/react/utils/otel.d.ts.map +1 -0
  9. package/dist/__tests__/react/utils/otel.js +42 -0
  10. package/dist/__tests__/react/utils/otel.js.map +1 -0
  11. package/dist/index.d.ts +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js.map +1 -1
  14. package/dist/react/LiveStoreProvider.js +39 -6
  15. package/dist/react/LiveStoreProvider.js.map +1 -1
  16. package/dist/react/LiveStoreProvider.test.d.ts +2 -0
  17. package/dist/react/LiveStoreProvider.test.d.ts.map +1 -0
  18. package/dist/react/LiveStoreProvider.test.js +40 -0
  19. package/dist/react/LiveStoreProvider.test.js.map +1 -0
  20. package/dist/react/components/LiveList.d.ts +21 -0
  21. package/dist/react/components/LiveList.d.ts.map +1 -0
  22. package/dist/react/components/LiveList.js +31 -0
  23. package/dist/react/components/LiveList.js.map +1 -0
  24. package/dist/react/index.d.ts +1 -1
  25. package/dist/react/index.d.ts.map +1 -1
  26. package/dist/react/index.js +1 -1
  27. package/dist/react/index.js.map +1 -1
  28. package/dist/react/useAtom.d.ts +1 -1
  29. package/dist/react/useAtom.d.ts.map +1 -1
  30. package/dist/react/useAtom.js +6 -1
  31. package/dist/react/useAtom.js.map +1 -1
  32. package/dist/react/useQuery.d.ts +4 -1
  33. package/dist/react/useQuery.d.ts.map +1 -1
  34. package/dist/react/useQuery.js +24 -19
  35. package/dist/react/useQuery.js.map +1 -1
  36. package/dist/react/useQuery.test.js +11 -11
  37. package/dist/react/useQuery.test.js.map +1 -1
  38. package/dist/react/useRow.d.ts.map +1 -1
  39. package/dist/react/useRow.js +14 -69
  40. package/dist/react/useRow.js.map +1 -1
  41. package/dist/react/useRow.test.js +440 -28
  42. package/dist/react/useRow.test.js.map +1 -1
  43. package/dist/react/useTemporaryQuery.d.ts +15 -3
  44. package/dist/react/useTemporaryQuery.d.ts.map +1 -1
  45. package/dist/react/useTemporaryQuery.js +60 -27
  46. package/dist/react/useTemporaryQuery.js.map +1 -1
  47. package/dist/react/useTemporaryQuery.test.js +10 -9
  48. package/dist/react/useTemporaryQuery.test.js.map +1 -1
  49. package/dist/reactive.d.ts +23 -5
  50. package/dist/reactive.d.ts.map +1 -1
  51. package/dist/reactive.js +44 -11
  52. package/dist/reactive.js.map +1 -1
  53. package/dist/reactive.test.js +1 -1
  54. package/dist/reactive.test.js.map +1 -1
  55. package/dist/reactiveQueries/base-class.d.ts +1 -1
  56. package/dist/reactiveQueries/base-class.d.ts.map +1 -1
  57. package/dist/reactiveQueries/base-class.js.map +1 -1
  58. package/dist/reactiveQueries/graphql.d.ts +2 -2
  59. package/dist/reactiveQueries/graphql.d.ts.map +1 -1
  60. package/dist/reactiveQueries/graphql.js +21 -11
  61. package/dist/reactiveQueries/graphql.js.map +1 -1
  62. package/dist/reactiveQueries/sql.d.ts +1 -1
  63. package/dist/reactiveQueries/sql.d.ts.map +1 -1
  64. package/dist/reactiveQueries/sql.js +15 -11
  65. package/dist/reactiveQueries/sql.js.map +1 -1
  66. package/dist/reactiveQueries/sql.test.js +1 -40
  67. package/dist/reactiveQueries/sql.test.js.map +1 -1
  68. package/dist/row-query.d.ts.map +1 -1
  69. package/dist/row-query.js +3 -1
  70. package/dist/row-query.js.map +1 -1
  71. package/dist/store.d.ts +7 -5
  72. package/dist/store.d.ts.map +1 -1
  73. package/dist/store.js +50 -38
  74. package/dist/store.js.map +1 -1
  75. package/package.json +11 -13
  76. package/src/__tests__/react/fixture.tsx +35 -2
  77. package/src/__tests__/react/utils/otel.ts +61 -0
  78. package/src/index.ts +12 -1
  79. package/src/react/LiveStoreProvider.test.tsx +63 -0
  80. package/src/react/LiveStoreProvider.tsx +42 -7
  81. package/src/react/components/LiveList.tsx +84 -0
  82. package/src/react/index.ts +1 -1
  83. package/src/react/useAtom.ts +6 -2
  84. package/src/react/useQuery.test.tsx +11 -11
  85. package/src/react/useQuery.ts +29 -22
  86. package/src/react/useRow.test.tsx +502 -30
  87. package/src/react/useRow.ts +19 -107
  88. package/src/react/useTemporaryQuery.test.tsx +17 -16
  89. package/src/react/useTemporaryQuery.ts +96 -28
  90. package/src/reactive.test.ts +1 -1
  91. package/src/reactive.ts +76 -15
  92. package/src/reactiveQueries/base-class.ts +2 -1
  93. package/src/reactiveQueries/graphql.ts +26 -16
  94. package/src/reactiveQueries/sql.test.ts +1 -54
  95. package/src/reactiveQueries/sql.ts +20 -14
  96. package/src/row-query.ts +3 -1
  97. package/src/store.ts +71 -49
  98. package/tsconfig.json +0 -1
  99. package/dist/react/components/DiffableList.d.ts +0 -20
  100. package/dist/react/components/DiffableList.d.ts.map +0 -1
  101. package/dist/react/components/DiffableList.js +0 -113
  102. package/dist/react/components/DiffableList.js.map +0 -1
  103. package/dist/react/utils/useCleanup.d.ts +0 -7
  104. package/dist/react/utils/useCleanup.d.ts.map +0 -1
  105. package/dist/react/utils/useCleanup.js +0 -19
  106. package/dist/react/utils/useCleanup.js.map +0 -1
  107. package/src/react/components/DiffableList.tsx +0 -192
  108. package/src/react/utils/useCleanup.ts +0 -25
@@ -19,7 +19,7 @@ export declare const todos: DbSchema.TableDef<DbSchema.SqliteDsl.TableDefinition
19
19
  default: import("effect/Option").None<never>;
20
20
  nullable: false;
21
21
  primaryKey: true;
22
- } & DbSchema.SqliteDsl.ColumnDefinition<string, string>;
22
+ };
23
23
  text: {
24
24
  columnType: "text";
25
25
  schema: __Schema.Schema<string, string, never>;
@@ -54,7 +54,7 @@ export declare const app: DbSchema.TableDef<DbSchema.SqliteDsl.TableDefinition<"
54
54
  default: import("effect/Option").None<never>;
55
55
  nullable: false;
56
56
  primaryKey: true;
57
- } & DbSchema.SqliteDsl.ColumnDefinition<string, string>;
57
+ };
58
58
  newTodoText: {
59
59
  columnType: "text";
60
60
  schema: __Schema.Schema<string | null, string | null, never>;
@@ -90,7 +90,7 @@ export declare const tables: {
90
90
  default: import("effect/Option").None<never>;
91
91
  nullable: false;
92
92
  primaryKey: true;
93
- } & DbSchema.SqliteDsl.ColumnDefinition<string, string>;
93
+ };
94
94
  text: {
95
95
  columnType: "text";
96
96
  schema: __Schema.Schema<string, string, never>;
@@ -125,7 +125,7 @@ export declare const tables: {
125
125
  default: import("effect/Option").None<never>;
126
126
  nullable: false;
127
127
  primaryKey: true;
128
- } & DbSchema.SqliteDsl.ColumnDefinition<string, string>;
128
+ };
129
129
  newTodoText: {
130
130
  columnType: "text";
131
131
  schema: __Schema.Schema<string | null, string | null, never>;
@@ -162,7 +162,7 @@ export declare const schema: import("@livestore/common/dist/schema/index.js").Li
162
162
  default: import("effect/Option").None<never>;
163
163
  nullable: false;
164
164
  primaryKey: true;
165
- } & DbSchema.SqliteDsl.ColumnDefinition<string, string>;
165
+ };
166
166
  text: {
167
167
  columnType: "text";
168
168
  schema: __Schema.Schema<string, string, never>;
@@ -185,7 +185,7 @@ export declare const schema: import("@livestore/common/dist/schema/index.js").Li
185
185
  default: import("effect/Option").None<never>;
186
186
  nullable: false;
187
187
  primaryKey: true;
188
- } & DbSchema.SqliteDsl.ColumnDefinition<string, string>;
188
+ };
189
189
  newTodoText: {
190
190
  columnType: "text";
191
191
  schema: __Schema.Schema<string | null, string | null, never>;
@@ -204,14 +204,16 @@ export declare const schema: import("@livestore/common/dist/schema/index.js").Li
204
204
  }, never>;
205
205
  export declare const parseTodos: (rawRows: readonly any[]) => readonly {
206
206
  text: string;
207
- completed: boolean;
208
207
  id: string;
208
+ completed: boolean;
209
209
  }[];
210
- export declare const makeTodoMvc: ({ otelTracer, otelContext, useGlobalDbGraph, }?: {
210
+ export declare const makeTodoMvc: ({ otelTracer, otelContext, useGlobalDbGraph, strictMode, }?: {
211
211
  otelTracer?: otel.Tracer | undefined;
212
212
  otelContext?: otel.Context | undefined;
213
213
  useGlobalDbGraph?: boolean | undefined;
214
+ strictMode?: boolean | undefined;
214
215
  }) => Promise<{
216
+ [Symbol.dispose]: () => Promise<void>;
215
217
  wrapper: ({ children }: any) => React.JSX.Element;
216
218
  AppComponentSchema: DbSchema.TableDef<DbSchema.SqliteDsl.TableDefinition<"UserInfo", {
217
219
  username: {
@@ -221,6 +223,13 @@ export declare const makeTodoMvc: ({ otelTracer, otelContext, useGlobalDbGraph,
221
223
  nullable: false;
222
224
  primaryKey: false;
223
225
  };
226
+ text: {
227
+ columnType: "text";
228
+ schema: __Schema.Schema<string, string, never>;
229
+ default: import("effect/Option").Some<"">;
230
+ nullable: false;
231
+ primaryKey: false;
232
+ };
224
233
  id: DbSchema.SqliteDsl.ColumnDefinition<string, string>;
225
234
  }>, false, {
226
235
  isSingleton: false;
@@ -228,9 +237,11 @@ export declare const makeTodoMvc: ({ otelTracer, otelContext, useGlobalDbGraph,
228
237
  disableAutomaticIdColumn: false;
229
238
  }, __Schema.Schema<{
230
239
  readonly username: string;
240
+ readonly text: string;
231
241
  readonly id: string;
232
242
  }, {
233
243
  readonly username: string;
244
+ readonly text: string;
234
245
  readonly id: string;
235
246
  }, never>>;
236
247
  store: import("@livestore/livestore/src/store.js").Store<import("@livestore/livestore/src/store.js").BaseGraphQLContext, import("@livestore/common/dist/schema/index.js").LiveStoreSchema<{
@@ -241,7 +252,7 @@ export declare const makeTodoMvc: ({ otelTracer, otelContext, useGlobalDbGraph,
241
252
  default: import("effect/Option").None<never>;
242
253
  nullable: false;
243
254
  primaryKey: true;
244
- } & DbSchema.SqliteDsl.ColumnDefinition<string, string>;
255
+ };
245
256
  text: {
246
257
  columnType: "text";
247
258
  schema: __Schema.Schema<string, string, never>;
@@ -264,7 +275,7 @@ export declare const makeTodoMvc: ({ otelTracer, otelContext, useGlobalDbGraph,
264
275
  default: import("effect/Option").None<never>;
265
276
  nullable: false;
266
277
  primaryKey: true;
267
- } & DbSchema.SqliteDsl.ColumnDefinition<string, string>;
278
+ };
268
279
  newTodoText: {
269
280
  columnType: "text";
270
281
  schema: __Schema.Schema<string | null, string | null, never>;
@@ -289,7 +300,7 @@ export declare const makeTodoMvc: ({ otelTracer, otelContext, useGlobalDbGraph,
289
300
  default: import("effect/Option").None<never>;
290
301
  nullable: false;
291
302
  primaryKey: true;
292
- } & DbSchema.SqliteDsl.ColumnDefinition<string, string>;
303
+ };
293
304
  text: {
294
305
  columnType: "text";
295
306
  schema: __Schema.Schema<string, string, never>;
@@ -323,7 +334,7 @@ export declare const makeTodoMvc: ({ otelTracer, otelContext, useGlobalDbGraph,
323
334
  default: import("effect/Option").None<never>;
324
335
  nullable: false;
325
336
  primaryKey: true;
326
- } & DbSchema.SqliteDsl.ColumnDefinition<string, string>;
337
+ };
327
338
  newTodoText: {
328
339
  columnType: "text";
329
340
  schema: __Schema.Schema<string | null, string | null, never>;
@@ -351,5 +362,10 @@ export declare const makeTodoMvc: ({ otelTracer, otelContext, useGlobalDbGraph,
351
362
  readonly newTodoText: string | null;
352
363
  readonly filter: string;
353
364
  }, never>>>;
365
+ makeRenderCount: () => {
366
+ readonly val: number;
367
+ inc: () => void;
368
+ };
369
+ strictMode: boolean;
354
370
  }>;
355
371
  //# sourceMappingURL=fixture.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fixture.d.ts","sourceRoot":"","sources":["../../../src/__tests__/react/fixture.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAE5D,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,OAAO,EAAe,QAAQ,EAA8D,MAAM,gBAAgB,CAAA;AAGlH,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;AAED,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAIhB,CAAA;AAEF,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAId,CAAA;AAEF,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAiB,CAAA;AACpC,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAAyB,CAAA;AAE5C,eAAO,MAAM,UAAU;;;;GAAyB,CAAA;AAEhD,eAAO,MAAM,WAAW;;;;;4BA6BS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAKnC,CAAA"}
1
+ {"version":3,"file":"fixture.d.ts","sourceRoot":"","sources":["../../../src/__tests__/react/fixture.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAE5D,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC/C,OAAO,KAAK,MAAM,OAAO,CAAA;AAIzB,OAAO,EAAe,QAAQ,EAA8D,MAAM,gBAAgB,CAAA;AAGlH,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;AAED,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAIhB,CAAA;AAEF,eAAO,MAAM,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;UAId,CAAA;AAEF,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAAiB,CAAA;AACpC,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SAAyB,CAAA;AAE5C,eAAO,MAAM,UAAU;;;;GAAyB,CAAA;AAEhD,eAAO,MAAM,WAAW;;;;;;;4BAiDS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAkBnC,CAAA"}
@@ -16,11 +16,24 @@ export const app = DbSchema.table('app', {
16
16
  export const tables = { todos, app };
17
17
  export const schema = makeSchema({ tables });
18
18
  export const parseTodos = ParseUtils.many(todos);
19
- export const makeTodoMvc = async ({ otelTracer, otelContext, useGlobalDbGraph = true, } = {}) => {
19
+ export const makeTodoMvc = async ({ otelTracer, otelContext, useGlobalDbGraph = true, strictMode = process.env.REACT_STRICT_MODE !== undefined, } = {}) => {
20
20
  const AppComponentSchema = DbSchema.table('UserInfo', {
21
21
  username: DbSchema.text({ default: '' }),
22
+ text: DbSchema.text({ default: '' }),
22
23
  });
23
24
  const dbGraph = useGlobalDbGraph ? globalDbGraph : makeDbGraph();
25
+ const makeRenderCount = () => {
26
+ let val = 0;
27
+ const inc = () => {
28
+ val += strictMode ? 0.5 : 1;
29
+ };
30
+ return {
31
+ get val() {
32
+ return val;
33
+ },
34
+ inc,
35
+ };
36
+ };
24
37
  const store = await createStore({
25
38
  schema,
26
39
  boot: (db) => db.execute(sql `INSERT OR IGNORE INTO app (id, newTodoText, filter) VALUES ('static', '', 'all');`),
@@ -32,7 +45,18 @@ export const makeTodoMvc = async ({ otelTracer, otelContext, useGlobalDbGraph =
32
45
  const cud = makeCudMutations(tables);
33
46
  // TODO improve typing of `LiveStoreContext`
34
47
  const storeContext = { store };
35
- const wrapper = ({ children }) => (React.createElement(LiveStoreReact.LiveStoreContext.Provider, { value: storeContext }, children));
36
- return { wrapper, AppComponentSchema, store, dbGraph, cud };
48
+ const MaybeStrictMode = strictMode ? React.StrictMode : React.Fragment;
49
+ const wrapper = ({ children }) => (React.createElement(MaybeStrictMode, null,
50
+ React.createElement(LiveStoreReact.LiveStoreContext.Provider, { value: storeContext }, children)));
51
+ return {
52
+ [Symbol.dispose]: () => store.destroy(),
53
+ wrapper,
54
+ AppComponentSchema,
55
+ store,
56
+ dbGraph,
57
+ cud,
58
+ makeRenderCount,
59
+ strictMode,
60
+ };
37
61
  };
38
62
  //# sourceMappingURL=fixture.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fixture.js","sourceRoot":"","sources":["../../../src/__tests__/react/fixture.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AAEvC,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAErD,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,gBAAgB,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,MAAM,gBAAgB,CAAA;AAClH,OAAO,KAAK,cAAc,MAAM,sBAAsB,CAAA;AAetD,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,OAAO,EAAE;IAC3C,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACvC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACrD,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;CACjE,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE;IACvC,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;IACvC,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IAC3D,MAAM,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;CAC3D,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;AACpC,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;AAE5C,MAAM,CAAC,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;AAEhD,MAAM,CAAC,MAAM,WAAW,GAAG,KAAK,EAAE,EAChC,UAAU,EACV,WAAW,EACX,gBAAgB,GAAG,IAAI,MAKrB,EAAE,EAAE,EAAE;IACR,MAAM,kBAAkB,GAAG,QAAQ,CAAC,KAAK,CAAC,UAAU,EAAE;QACpD,QAAQ,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;KACzC,CAAC,CAAA;IAEF,MAAM,OAAO,GAAG,gBAAgB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,WAAW,EAAE,CAAA;IAEhE,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC;QAC9B,MAAM;QACN,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA,mFAAmF,CAAC;QAChH,MAAM,EAAE,MAAM,EAAE;QAChB,OAAO;QACP,UAAU;QACV,mBAAmB,EAAE,WAAW;KACjC,CAAC,CAAA;IAEF,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAA;IAEpC,4CAA4C;IAC5C,MAAM,YAAY,GAAqB,EAAE,KAAK,EAAU,CAAA;IAExD,MAAM,OAAO,GAAG,CAAC,EAAE,QAAQ,EAAO,EAAE,EAAE,CAAC,CACrC,oBAAC,cAAc,CAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,YAAY,IAAG,QAAQ,CAA4C,CACrH,CAAA;IAED,OAAO,EAAE,OAAO,EAAE,kBAAkB,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,CAAA;AAC7D,CAAC,CAAA"}
1
+ {"version":3,"file":"fixture.js","sourceRoot":"","sources":["../../../src/__tests__/react/fixture.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Attributes } from '@opentelemetry/api';
2
+ import type { InMemorySpanExporter } from '@opentelemetry/sdk-trace-base';
3
+ type SimplifiedNestedSpan = {
4
+ _name: string;
5
+ attributes: any;
6
+ children: SimplifiedNestedSpan[];
7
+ };
8
+ export declare const getSimplifiedRootSpan: (exporter: InMemorySpanExporter, mapAttributes?: ((attributes: Attributes) => Attributes) | undefined) => SimplifiedNestedSpan;
9
+ export {};
10
+ //# sourceMappingURL=otel.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../../../../src/__tests__/react/utils/otel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAgB,MAAM,+BAA+B,CAAA;AAEvF,KAAK,oBAAoB,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,GAAG,CAAC;IAAC,QAAQ,EAAE,oBAAoB,EAAE,CAAA;CAAE,CAAA;AAEhG,eAAO,MAAM,qBAAqB,aACtB,oBAAoB,gCACD,UAAU,KAAK,UAAU,sCAiCvD,CAAA"}
@@ -0,0 +1,42 @@
1
+ import { identity } from '@livestore/utils/effect';
2
+ export const getSimplifiedRootSpan = (exporter, mapAttributes) => {
3
+ const spans = exporter.getFinishedSpans();
4
+ const spansMap = new Map(spans.map((span) => [span.spanContext().spanId, { span, children: [] }]));
5
+ const mapAttributesfn = mapAttributes ?? identity;
6
+ spansMap.forEach((nestedSpan) => {
7
+ const parentSpan = nestedSpan.span.parentSpanId ? spansMap.get(nestedSpan.span.parentSpanId) : undefined;
8
+ if (parentSpan) {
9
+ parentSpan.children.push(nestedSpan);
10
+ }
11
+ });
12
+ const rootSpan = spansMap.get(spans.find((_) => _.name === 'test').spanContext().spanId);
13
+ const simplifySpan = (span) => omitEmpty({
14
+ _name: span.span.name,
15
+ attributes: mapAttributesfn(span.span.attributes),
16
+ children: span.children
17
+ .filter((_) => _.span.name !== 'createStore')
18
+ // .sort((a, b) => compareHrTime(a.span.startTime, b.span.startTime))
19
+ .map(simplifySpan),
20
+ });
21
+ // console.dir(
22
+ // spans.map((_) => [_.spanContext().spanId, _.name, _.attributes, _.parentSpanId]),
23
+ // { depth: 10 },
24
+ // )
25
+ return simplifySpan(rootSpan);
26
+ };
27
+ // const compareHrTime = (a: [number, number], b: [number, number]) => {
28
+ // if (a[0] !== b[0]) return a[0] - b[0]
29
+ // return a[1] - b[1]
30
+ // }
31
+ const omitEmpty = (obj) => {
32
+ const result = {};
33
+ for (const key in obj) {
34
+ if (obj[key] !== undefined &&
35
+ !(Array.isArray(obj[key]) && obj[key].length === 0) &&
36
+ Object.keys(obj[key]).length > 0) {
37
+ result[key] = obj[key];
38
+ }
39
+ }
40
+ return result;
41
+ };
42
+ //# sourceMappingURL=otel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"otel.js","sourceRoot":"","sources":["../../../../src/__tests__/react/utils/otel.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAMlD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CACnC,QAA8B,EAC9B,aAAsD,EACtD,EAAE;IACF,MAAM,KAAK,GAAG,QAAQ,CAAC,gBAAgB,EAAE,CAAA;IACzC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAqB,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC,CAAA;IAEtH,MAAM,eAAe,GAAG,aAAa,IAAI,QAAQ,CAAA;IAEjD,QAAQ,CAAC,OAAO,CAAC,CAAC,UAAU,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QACxG,IAAI,UAAU,EAAE,CAAC;YACf,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QACtC,CAAC;IACH,CAAC,CAAC,CAAA;IAGF,MAAM,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAE,CAAC,WAAW,EAAE,CAAC,MAAM,CAAE,CAAA;IAE1F,MAAM,YAAY,GAAG,CAAC,IAAgB,EAAwB,EAAE,CAC9D,SAAS,CAAC;QACR,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI;QACrB,UAAU,EAAE,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC;QACjD,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,KAAK,aAAa,CAAC;YAC7C,qEAAqE;aACpE,GAAG,CAAC,YAAY,CAAC;KACrB,CAAC,CAAA;IAEJ,eAAe;IACf,sFAAsF;IACtF,mBAAmB;IACnB,IAAI;IAEJ,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAA;AAC/B,CAAC,CAAA;AAED,wEAAwE;AACxE,0CAA0C;AAC1C,uBAAuB;AACvB,IAAI;AAEJ,MAAM,SAAS,GAAG,CAAC,GAAQ,EAAE,EAAE;IAC7B,MAAM,MAAM,GAAQ,EAAE,CAAA;IACtB,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,CAAC;QACtB,IACE,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS;YACtB,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;YACnD,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,EAChC,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC,CAAA;QACxB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAA;AACf,CAAC,CAAA"}
package/dist/index.d.ts CHANGED
@@ -2,7 +2,7 @@ export { Store, createStore } from './store.js';
2
2
  export type { BaseGraphQLContext, QueryDebugInfo, RefreshReason, BootDb } from './store.js';
3
3
  export type { QueryDefinition, LiveStoreCreateStoreOptions, LiveStoreContext } from './effect/LiveStore.js';
4
4
  export { MainDatabaseWrapper, type DebugInfo, emptyDebugInfo } from './MainDatabaseWrapper.js';
5
- export type { GetAtom, AtomDebugInfo, RefreshDebugInfo, SerializedAtom, Atom, Node, Ref, Effect } from './reactive.js';
5
+ export type { GetAtom, AtomDebugInfo, RefreshDebugInfo, ReactiveGraphSnapshot, SerializedAtom, SerializedEffect, Atom, Node, Ref, Effect, } from './reactive.js';
6
6
  export { LiveStoreJSQuery, computed } from './reactiveQueries/js.js';
7
7
  export { LiveStoreSQLQuery, querySQL, type MapRows } from './reactiveQueries/sql.js';
8
8
  export { LiveStoreGraphQLQuery, queryGraphQL } from './reactiveQueries/graphql.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC/C,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAE3F,YAAY,EAAE,eAAe,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE3G,OAAO,EAAE,mBAAmB,EAAE,KAAK,SAAS,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAE9F,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,gBAAgB,EAAE,cAAc,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,eAAe,CAAA;AACtH,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,0BAA0B,CAAA;AACpF,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAClF,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAE/G,OAAO,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAA;AAE9E,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEhG,cAAc,UAAU,CAAA;AAExB,cAAc,0BAA0B,CAAA;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAEvC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEvD,OAAO,EAAE,iBAAiB,EAAE,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC3F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAC/C,YAAY,EAAE,kBAAkB,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,EAAE,MAAM,YAAY,CAAA;AAE3F,YAAY,EAAE,eAAe,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE3G,OAAO,EAAE,mBAAmB,EAAE,KAAK,SAAS,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAE9F,YAAY,EACV,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,qBAAqB,EACrB,cAAc,EACd,gBAAgB,EAChB,IAAI,EACJ,IAAI,EACJ,GAAG,EACH,MAAM,GACP,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,KAAK,OAAO,EAAE,MAAM,0BAA0B,CAAA;AACpF,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAClF,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,OAAO,EAAE,WAAW,EAAE,KAAK,SAAS,EAAE,MAAM,iCAAiC,CAAA;AAE/G,OAAO,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAA;AAE9E,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,gBAAgB,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEhG,cAAc,UAAU,CAAA;AAExB,cAAc,0BAA0B,CAAA;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAEvC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEvD,OAAO,EAAE,iBAAiB,EAAE,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC3F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AAEnC,YAAY,EAAE,YAAY,EAAE,eAAe,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAA"}
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAK/C,OAAO,EAAE,mBAAmB,EAAkB,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAG9F,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAgB,MAAM,0BAA0B,CAAA;AACpF,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAClF,OAAO,EAAoC,WAAW,EAAkB,MAAM,iCAAiC,CAAA;AAE/G,OAAO,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAA;AAE9E,OAAO,EAAyC,QAAQ,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEhG,cAAc,UAAU,CAAA;AAExB,cAAc,0BAA0B,CAAA;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAEvC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEvD,OAAO,EAAE,iBAAiB,EAA0C,MAAM,iBAAiB,CAAA;AAC3F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AAK/C,OAAO,EAAE,mBAAmB,EAAkB,cAAc,EAAE,MAAM,0BAA0B,CAAA;AAc9F,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AACpE,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAgB,MAAM,0BAA0B,CAAA;AACpF,OAAO,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAClF,OAAO,EAAoC,WAAW,EAAkB,MAAM,iCAAiC,CAAA;AAE/G,OAAO,EAAE,aAAa,EAAE,2BAA2B,EAAE,MAAM,mBAAmB,CAAA;AAE9E,OAAO,EAAyC,QAAQ,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAA;AAEhG,cAAc,UAAU,CAAA;AAExB,cAAc,0BAA0B,CAAA;AACxC,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AAEvC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEvD,OAAO,EAAE,iBAAiB,EAA0C,MAAM,iBAAiB,CAAA;AAC3F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA"}
@@ -19,11 +19,40 @@ export const LiveStoreProvider = ({ fallback, graphQLOptions, otelTracer, otelRo
19
19
  return React.createElement(LiveStoreContext.Provider, { value: storeCtx }, children);
20
20
  };
21
21
  const useCreateStore = ({ schema, graphQLOptions, otelTracer, otelRootSpanContext, boot, makeDb, batchUpdates, }) => {
22
- const [ctxValue, setCtxValue] = React.useState();
22
+ const [_, rerender] = React.useState(0);
23
+ const ctxValueRef = React.useRef(undefined);
24
+ const inputPropsCacheRef = React.useRef({
25
+ schema,
26
+ graphQLOptions,
27
+ otelTracer,
28
+ otelRootSpanContext,
29
+ boot,
30
+ makeDb,
31
+ batchUpdates,
32
+ });
33
+ const oldStoreAlreadyDestroyedRef = React.useRef(false);
34
+ if (inputPropsCacheRef.current.schema !== schema ||
35
+ inputPropsCacheRef.current.graphQLOptions !== graphQLOptions ||
36
+ inputPropsCacheRef.current.otelTracer !== otelTracer ||
37
+ inputPropsCacheRef.current.otelRootSpanContext !== otelRootSpanContext ||
38
+ inputPropsCacheRef.current.boot !== boot ||
39
+ inputPropsCacheRef.current.makeDb !== makeDb ||
40
+ inputPropsCacheRef.current.batchUpdates !== batchUpdates) {
41
+ inputPropsCacheRef.current = {
42
+ schema,
43
+ graphQLOptions,
44
+ otelTracer,
45
+ otelRootSpanContext,
46
+ boot,
47
+ makeDb,
48
+ batchUpdates,
49
+ };
50
+ ctxValueRef.current?.store.destroy();
51
+ oldStoreAlreadyDestroyedRef.current = true;
52
+ ctxValueRef.current = undefined;
53
+ }
23
54
  React.useEffect(() => {
24
55
  let store;
25
- // resetting the store context while we're creating a new store
26
- setCtxValue(undefined);
27
56
  void (async () => {
28
57
  try {
29
58
  store = await createStore({
@@ -35,16 +64,20 @@ const useCreateStore = ({ schema, graphQLOptions, otelTracer, otelRootSpanContex
35
64
  makeDb,
36
65
  batchUpdates,
37
66
  });
38
- setCtxValue({ store });
67
+ ctxValueRef.current = { store };
68
+ oldStoreAlreadyDestroyedRef.current = false;
69
+ rerender((c) => c + 1);
39
70
  }
40
71
  catch (e) {
41
72
  shouldNeverHappen(`Error creating LiveStore store: ${e}`);
42
73
  }
43
74
  })();
44
75
  return () => {
45
- store?.destroy();
76
+ if (oldStoreAlreadyDestroyedRef.current === false) {
77
+ store?.destroy();
78
+ }
46
79
  };
47
80
  }, [schema, graphQLOptions, otelTracer, otelRootSpanContext, boot, makeDb, batchUpdates]);
48
- return ctxValue;
81
+ return ctxValueRef.current;
49
82
  };
50
83
  //# sourceMappingURL=LiveStoreProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LiveStoreProvider.js","sourceRoot":"","sources":["../../src/react/LiveStoreProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAA;AAGpD,OAAO,KAAK,MAAM,OAAO,CAAA;AAKzB,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAaxD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAA4C,EAC3E,QAAQ,EACR,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,QAAQ,EACR,MAAM,EACN,IAAI,EACJ,MAAM,EACN,YAAY,GACsD,EAAe,EAAE;IACnF,MAAM,QAAQ,GAAG,cAAc,CAAC;QAC9B,MAAM;QACN,cAAc;QACd,UAAU;QACV,mBAAmB;QACnB,IAAI;QACJ,MAAM;QACN,YAAY;KACb,CAAC,CAAA;IAEF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,OAAO,QAAQ,CAAA;IACjB,CAAC;IAED,MAAM,CAAC,gBAAgB,GAAG,QAAQ,CAAC,KAAK,CAAA;IAExC,OAAO,oBAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,QAAQ,IAAG,QAAQ,CAA6B,CAAA;AAC3F,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CAA4C,EACjE,MAAM,EACN,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,IAAI,EACJ,MAAM,EACN,YAAY,GACgC,EAAE,EAAE;IAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,EAA6B,CAAA;IAE3E,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,IAAI,KAAwB,CAAA;QAE5B,+DAA+D;QAC/D,WAAW,CAAC,SAAS,CAAC,CAAA;QAEtB,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI,CAAC;gBACH,KAAK,GAAG,MAAM,WAAW,CAAC;oBACxB,MAAM;oBACN,cAAc;oBACd,UAAU;oBACV,mBAAmB;oBACnB,IAAI;oBACJ,MAAM;oBACN,YAAY;iBACb,CAAC,CAAA;gBACF,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;YACxB,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACX,iBAAiB,CAAC,mCAAmC,CAAC,EAAE,CAAC,CAAA;YAC3D,CAAC;QACH,CAAC,CAAC,EAAE,CAAA;QAEJ,OAAO,GAAG,EAAE;YACV,KAAK,EAAE,OAAO,EAAE,CAAA;QAClB,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,CAAA;IAEzF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA"}
1
+ {"version":3,"file":"LiveStoreProvider.js","sourceRoot":"","sources":["../../src/react/LiveStoreProvider.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=LiveStoreProvider.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiveStoreProvider.test.d.ts","sourceRoot":"","sources":["../../src/react/LiveStoreProvider.test.tsx"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ import { sql } from '@livestore/common';
2
+ import { makeDb } from '@livestore/web';
3
+ import { InMemoryStorage } from '@livestore/web/storage/in-memory';
4
+ import { render, screen, waitFor, waitForElementToBeRemoved } from '@testing-library/react';
5
+ import React from 'react';
6
+ import { describe, expect, it } from 'vitest';
7
+ import { parseTodos, schema } from '../__tests__/react/fixture.js';
8
+ import { querySQL } from '../reactiveQueries/sql.js';
9
+ import * as LiveStoreReact from './index.js';
10
+ import { LiveStoreProvider } from './LiveStoreProvider.js';
11
+ describe('LiveStoreProvider', () => {
12
+ it('simple', async () => {
13
+ let renderCount = 0;
14
+ const allTodos$ = querySQL(`select * from todos`, { map: parseTodos });
15
+ let latestStoreCtx = undefined;
16
+ const App = () => {
17
+ renderCount++;
18
+ latestStoreCtx = LiveStoreReact.useStore();
19
+ const todos = LiveStoreReact.useQuery(allTodos$);
20
+ return React.createElement("div", null, JSON.stringify(todos));
21
+ };
22
+ const Root = ({ forceUpdate }) => {
23
+ const bootCb = React.useCallback((db) => db.execute(sql `INSERT OR IGNORE INTO todos (id, text, completed) VALUES ('t1', 'buy milk', 0);`), []);
24
+ // eslint-disable-next-line react-hooks/exhaustive-deps
25
+ const makeDbMemo = React.useMemo(() => makeDb(() => InMemoryStorage.load()), [forceUpdate]);
26
+ return (React.createElement(LiveStoreProvider, { schema: schema, fallback: React.createElement("div", null, "Loading LiveStore"), makeDb: makeDbMemo, boot: bootCb },
27
+ React.createElement(App, null)));
28
+ };
29
+ const { rerender } = render(React.createElement(Root, { forceUpdate: 1 }));
30
+ expect(renderCount).toBe(0);
31
+ await waitForElementToBeRemoved(() => screen.getByText('Loading LiveStore'));
32
+ expect(renderCount).toBe(1);
33
+ rerender(React.createElement(Root, { forceUpdate: 2 }));
34
+ await waitFor(() => screen.getByText('Loading LiveStore'));
35
+ await waitForElementToBeRemoved(() => screen.getByText('Loading LiveStore'));
36
+ expect(renderCount).toBe(2);
37
+ await latestStoreCtx.store.destroy();
38
+ });
39
+ });
40
+ //# sourceMappingURL=LiveStoreProvider.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiveStoreProvider.test.js","sourceRoot":"","sources":["../../src/react/LiveStoreProvider.test.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAA;AACvC,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAA;AAClE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAA;AAC3F,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAA;AAE7C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,+BAA+B,CAAA;AAClE,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAA;AAEpD,OAAO,KAAK,cAAc,MAAM,YAAY,CAAA;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAE1D,QAAQ,CAAC,mBAAmB,EAAE,GAAG,EAAE;IACjC,EAAE,CAAC,QAAQ,EAAE,KAAK,IAAI,EAAE;QACtB,IAAI,WAAW,GAAG,CAAC,CAAA;QAEnB,MAAM,SAAS,GAAG,QAAQ,CAAC,qBAAqB,EAAE,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAA;QACtE,IAAI,cAAc,GAAiC,SAAS,CAAA;QAE5D,MAAM,GAAG,GAAG,GAAG,EAAE;YACf,WAAW,EAAE,CAAA;YAEb,cAAc,GAAG,cAAc,CAAC,QAAQ,EAAE,CAAA;YAE1C,MAAM,KAAK,GAAG,cAAc,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;YAEhD,OAAO,iCAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAO,CAAA;QAC3C,CAAC,CAAA;QAED,MAAM,IAAI,GAAG,CAAC,EAAE,WAAW,EAA2B,EAAE,EAAE;YACxD,MAAM,MAAM,GAAG,KAAK,CAAC,WAAW,CAC9B,CAAC,EAAU,EAAE,EAAE,CACb,EAAE,CAAC,OAAO,CAAC,GAAG,CAAA,iFAAiF,CAAC,EAClG,EAAE,CACH,CAAA;YACD,uDAAuD;YACvD,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,CAAC,CAAA;YAC3F,OAAO,CACL,oBAAC,iBAAiB,IAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,qDAA4B,EAAE,MAAM,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM;gBACzG,oBAAC,GAAG,OAAG,CACW,CACrB,CAAA;QACH,CAAC,CAAA;QAED,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,CAAC,oBAAC,IAAI,IAAC,WAAW,EAAE,CAAC,GAAI,CAAC,CAAA;QAErD,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAE3B,MAAM,yBAAyB,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAA;QAE5E,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAE3B,QAAQ,CAAC,oBAAC,IAAI,IAAC,WAAW,EAAE,CAAC,GAAI,CAAC,CAAA;QAElC,MAAM,OAAO,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAA;QAC1D,MAAM,yBAAyB,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC,mBAAmB,CAAC,CAAC,CAAA;QAE5E,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAE3B,MAAM,cAAe,CAAC,KAAK,CAAC,OAAO,EAAE,CAAA;IACvC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -0,0 +1,21 @@
1
+ import React from 'react';
2
+ import type { LiveQuery } from '../../reactiveQueries/base-class.js';
3
+ export type LiveListProps<TItem> = {
4
+ items$: LiveQuery<ReadonlyArray<TItem>>;
5
+ renderItem: (item: TItem, opts: {
6
+ index: number;
7
+ isInitialListRender: boolean;
8
+ }) => React.ReactNode;
9
+ /** Needs to be unique across all list items */
10
+ getKey: (item: TItem, index: number) => string | number;
11
+ };
12
+ /**
13
+ * This component is a helper component for rendering a list of items for a LiveQuery of an array of items.
14
+ * The idea is that instead of letting React handle the rendering of the items array directly,
15
+ * we derive a item LiveQuery for each item which moves the reactivity to the item level when a single item changes.
16
+ *
17
+ * In the future we want to make this component even more efficient by using incremental rendering (https://github.com/livestorejs/livestore/pull/55)
18
+ * e.g. when an item is added/removed/moved to only re-render the affected DOM nodes.
19
+ */
20
+ export declare const LiveList: <TItem>({ items$, renderItem, getKey }: LiveListProps<TItem>) => React.ReactNode;
21
+ //# sourceMappingURL=LiveList.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiveList.d.ts","sourceRoot":"","sources":["../../../src/react/components/LiveList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,qCAAqC,CAAA;AAWpE,MAAM,MAAM,aAAa,CAAC,KAAK,IAAI;IACjC,MAAM,EAAE,SAAS,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC,CAAA;IAEvC,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,0CAA4C,cAAc,KAAK,CAAC,KAAG,MAAM,SA8B7F,CAAA"}
@@ -0,0 +1,31 @@
1
+ import React from 'react';
2
+ import { computed } from '../../reactiveQueries/js.js';
3
+ import { useQuery } from '../useQuery.js';
4
+ import { useTemporaryQuery } from '../useTemporaryQuery.js';
5
+ /**
6
+ * This component is a helper component for rendering a list of items for a LiveQuery of an array of items.
7
+ * The idea is that instead of letting React handle the rendering of the items array directly,
8
+ * we derive a item LiveQuery for each item which moves the reactivity to the item level when a single item changes.
9
+ *
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
+ * e.g. when an item is added/removed/moved to only re-render the affected DOM nodes.
12
+ */
13
+ export const LiveList = ({ items$, renderItem, getKey }) => {
14
+ const [hasMounted, setHasMounted] = React.useState(false);
15
+ React.useEffect(() => setHasMounted(true), []);
16
+ const keysCb = React.useCallback(() => computed((get) => get(items$).map(getKey)), [getKey, items$]);
17
+ const keys = useTemporaryQuery(keysCb, 'fixed');
18
+ const arr = React.useMemo(() => keys.map((key) =>
19
+ // TODO figure out a way so that `item$` returns an ordered lookup map to more efficiently find the item by key
20
+ [key, computed((get) => get(items$).find((item) => getKey(item, 0) === key))]), [getKey, items$, keys]);
21
+ return (React.createElement(React.Fragment, null, arr.map(([key, item$], index) => (React.createElement(ItemWrapperMemo, { key: key, itemKey: key, "item$": item$, opts: { isInitialListRender: !hasMounted, index }, renderItem: renderItem })))));
22
+ };
23
+ const ItemWrapper = ({ item$, opts, renderItem, }) => {
24
+ const item = useQuery(item$);
25
+ return React.createElement(React.Fragment, null, renderItem(item, opts));
26
+ };
27
+ const ItemWrapperMemo = React.memo(ItemWrapper, (prev, next) => prev.itemKey === next.itemKey &&
28
+ prev.renderItem === prev.renderItem &&
29
+ prev.opts.index === next.opts.index &&
30
+ prev.opts.isInitialListRender === next.opts.isInitialListRender);
31
+ //# sourceMappingURL=LiveList.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"LiveList.js","sourceRoot":"","sources":["../../../src/react/components/LiveList.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,EAAE,QAAQ,EAAE,MAAM,6BAA6B,CAAA;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAA;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAgB3D;;;;;;;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,MAAM,GAAG,KAAK,CAAC,WAAW,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACpG,MAAM,IAAI,GAAG,iBAAiB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CACvB,GAAG,EAAE,CACH,IAAI,CAAC,GAAG,CACN,CAAC,GAAG,EAAE,EAAE;IACN,+GAA+G;IAC/G,CAAC,GAAG,EAAE,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,CAAqB,CAAU,CAC9G,EACH,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,CACvB,CAAA;IAED,OAAO,CACL,0CACG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,KAAK,EAAE,EAAE,CAAC,CAChC,oBAAC,eAAe,IACd,GAAG,EAAE,GAAG,EACR,OAAO,EAAE,GAAG,WACL,KAAK,EACZ,IAAI,EAAE,EAAE,mBAAmB,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,EACjD,UAAU,EAAE,UAAU,GACtB,CACH,CAAC,CACD,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,0CAAG,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAI,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"}
@@ -5,6 +5,6 @@ export { useTemporaryQuery } from './useTemporaryQuery.js';
5
5
  export { useStackInfo } from './utils/stack-info.js';
6
6
  export { useRow, type StateSetters, type SetStateAction, type Dispatch, type UseRowResult as UseStateResult, } from './useRow.js';
7
7
  export { useAtom } from './useAtom.js';
8
- export { DiffableList } from './components/DiffableList.js';
8
+ export { LiveList, type LiveListProps } from './components/LiveList.js';
9
9
  export type { TypedDocumentNode } from '@graphql-typed-document-node/core';
10
10
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EACL,MAAM,EACN,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,YAAY,IAAI,cAAc,GACpC,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAG3D,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EACL,MAAM,EACN,KAAK,YAAY,EACjB,KAAK,cAAc,EACnB,KAAK,QAAQ,EACb,KAAK,YAAY,IAAI,cAAc,GACpC,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAGvE,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA"}
@@ -5,5 +5,5 @@ export { useTemporaryQuery } from './useTemporaryQuery.js';
5
5
  export { useStackInfo } from './utils/stack-info.js';
6
6
  export { useRow, } from './useRow.js';
7
7
  export { useAtom } from './useAtom.js';
8
- export { DiffableList } from './components/DiffableList.js';
8
+ export { LiveList } from './components/LiveList.js';
9
9
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EACL,MAAM,GAKP,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAA;AACpD,OAAO,EACL,MAAM,GAKP,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAEtC,OAAO,EAAE,QAAQ,EAAsB,MAAM,0BAA0B,CAAA"}
@@ -1,5 +1,5 @@
1
1
  import { type QueryInfoCol, type QueryInfoRow } from '../query-info.js';
2
2
  import type { LiveQuery } from '../reactiveQueries/base-class.js';
3
3
  import type { Dispatch, SetStateAction } from './useRow.js';
4
- export declare const useAtom: <TQuery extends LiveQuery<any, QueryInfoRow<any> | QueryInfoCol<any, any>>>(query$: TQuery) => [value: TQuery["__result!"], setValue: Dispatch<SetStateAction<TQuery["__result!"]>>];
4
+ export declare const useAtom: <TQuery extends LiveQuery<any, QueryInfoRow<any> | QueryInfoCol<any, any>>>(query$: TQuery) => [value: TQuery["__result!"], setValue: Dispatch<SetStateAction<Partial<TQuery["__result!"]>>>];
5
5
  //# sourceMappingURL=useAtom.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useAtom.d.ts","sourceRoot":"","sources":["../../src/react/useAtom.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC7F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAA;AAGjE,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE3D,eAAO,MAAM,OAAO,sFACV,MAAM,0FAef,CAAA"}
1
+ {"version":3,"file":"useAtom.d.ts","sourceRoot":"","sources":["../../src/react/useAtom.ts"],"names":[],"mappings":"AAEA,OAAO,EAAwB,KAAK,YAAY,EAAE,KAAK,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAC7F,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAA;AAGjE,OAAO,KAAK,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE3D,eAAO,MAAM,OAAO,sFACV,MAAM,mGAmBf,CAAA"}
@@ -8,7 +8,12 @@ export const useAtom = (query$) => {
8
8
  const setValue = React.useMemo(() => {
9
9
  return (newValueOrFn) => {
10
10
  const newValue = typeof newValueOrFn === 'function' ? newValueOrFn(query$Ref.current) : newValueOrFn;
11
- store.mutate(mutationForQueryInfo(query$.queryInfo, newValue));
11
+ if (query$.queryInfo._tag === 'Row' && query$.queryInfo.table.isSingleColumn) {
12
+ store.mutate(mutationForQueryInfo(query$.queryInfo, { value: newValue }));
13
+ }
14
+ else {
15
+ store.mutate(mutationForQueryInfo(query$.queryInfo, newValue));
16
+ }
12
17
  };
13
18
  }, [query$.queryInfo, query$Ref, store]);
14
19
  return [query$Ref.current, setValue];
@@ -1 +1 @@
1
- {"version":3,"file":"useAtom.js","sourceRoot":"","sources":["../../src/react/useAtom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,oBAAoB,EAAwC,MAAM,kBAAkB,CAAA;AAE7F,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAG3C,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,MAAc,EACyE,EAAE;IACzF,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;IAErC,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAA;IAE5B,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAgD,GAAG,EAAE;QACjF,OAAO,CAAC,YAAiB,EAAE,EAAE;YAC3B,MAAM,QAAQ,GAAG,OAAO,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAA;YAEpG,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,SAAU,EAAE,QAAQ,CAAC,CAAC,CAAA;QACjE,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAA;IAExC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AACtC,CAAC,CAAA"}
1
+ {"version":3,"file":"useAtom.js","sourceRoot":"","sources":["../../src/react/useAtom.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,EAAE,oBAAoB,EAAwC,MAAM,kBAAkB,CAAA;AAE7F,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAA;AAG3C,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,MAAc,EACkF,EAAE;IAClG,MAAM,SAAS,GAAG,WAAW,CAAC,MAAM,CAAC,CAAA;IAErC,MAAM,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,CAAA;IAE5B,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAgD,GAAG,EAAE;QACjF,OAAO,CAAC,YAAiB,EAAE,EAAE;YAC3B,MAAM,QAAQ,GAAG,OAAO,YAAY,KAAK,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,YAAY,CAAA;YAEpG,IAAI,MAAM,CAAC,SAAS,CAAC,IAAI,KAAK,KAAK,IAAI,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC;gBAC7E,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,SAAU,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAA;YAC5E,CAAC;iBAAM,CAAC;gBACN,KAAK,CAAC,MAAM,CAAC,oBAAoB,CAAC,MAAM,CAAC,SAAU,EAAE,QAAQ,CAAC,CAAC,CAAA;YACjE,CAAC;QACH,CAAC,CAAA;IACH,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC,CAAA;IAExC,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAA;AACtC,CAAC,CAAA"}
@@ -2,5 +2,8 @@ import * as otel from '@opentelemetry/api';
2
2
  import React from 'react';
3
3
  import type { GetResult, LiveQueryAny } from '../reactiveQueries/base-class.js';
4
4
  export declare const useQuery: <TQuery extends LiveQueryAny>(query: TQuery) => GetResult<TQuery>;
5
- export declare const useQueryRef: <TQuery extends LiveQueryAny>(query: TQuery, parentOtelContext?: otel.Context) => React.MutableRefObject<GetResult<TQuery>>;
5
+ /**
6
+ *
7
+ */
8
+ export declare const useQueryRef: <TQuery extends LiveQueryAny>(query$: TQuery, parentOtelContext?: otel.Context) => React.MutableRefObject<GetResult<TQuery>>;
6
9
  //# sourceMappingURL=useQuery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../../src/react/useQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE1C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAY/E,eAAO,MAAM,QAAQ,uCAAwC,MAAM,KAAG,UAAU,MAAM,CAA+B,CAAA;AAErH,eAAO,MAAM,WAAW,uCACf,MAAM,sBACO,KAAK,OAAO,KAC/B,MAAM,gBAAgB,CAAC,UAAU,MAAM,CAAC,CA4E1C,CAAA"}
1
+ {"version":3,"file":"useQuery.d.ts","sourceRoot":"","sources":["../../src/react/useQuery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE1C,OAAO,KAAK,MAAM,OAAO,CAAA;AAEzB,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,kCAAkC,CAAA;AAiB/E,eAAO,MAAM,QAAQ,uCAAwC,MAAM,KAAG,UAAU,MAAM,CAA+B,CAAA;AAErH;;GAEG;AACH,eAAO,MAAM,WAAW,wCACd,MAAM,sBACM,KAAK,OAAO,KAC/B,MAAM,gBAAgB,CAAC,UAAU,MAAM,CAAC,CA2E1C,CAAA"}