@livestore/livestore 0.3.0-dev.5 → 0.3.0-dev.51

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 (170) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/QueryCache.d.ts.map +1 -1
  3. package/dist/SqliteDbWrapper.d.ts +60 -0
  4. package/dist/SqliteDbWrapper.d.ts.map +1 -0
  5. package/dist/{SynchronousDatabaseWrapper.js → SqliteDbWrapper.js} +69 -34
  6. package/dist/SqliteDbWrapper.js.map +1 -0
  7. package/dist/effect/LiveStore.d.ts +6 -34
  8. package/dist/effect/LiveStore.d.ts.map +1 -1
  9. package/dist/effect/LiveStore.js +10 -12
  10. package/dist/effect/LiveStore.js.map +1 -1
  11. package/dist/effect/mod.d.ts +3 -0
  12. package/dist/effect/mod.d.ts.map +1 -0
  13. package/dist/effect/mod.js +3 -0
  14. package/dist/effect/mod.js.map +1 -0
  15. package/dist/internal/mod.d.ts +3 -0
  16. package/dist/internal/mod.d.ts.map +1 -0
  17. package/dist/internal/mod.js +3 -0
  18. package/dist/internal/mod.js.map +1 -0
  19. package/dist/live-queries/base-class.d.ts +69 -29
  20. package/dist/live-queries/base-class.d.ts.map +1 -1
  21. package/dist/live-queries/base-class.js +60 -14
  22. package/dist/live-queries/base-class.js.map +1 -1
  23. package/dist/live-queries/client-document-get-query.d.ts +12 -0
  24. package/dist/live-queries/client-document-get-query.d.ts.map +1 -0
  25. package/dist/live-queries/client-document-get-query.js +18 -0
  26. package/dist/live-queries/client-document-get-query.js.map +1 -0
  27. package/dist/live-queries/computed.d.ts +13 -15
  28. package/dist/live-queries/computed.d.ts.map +1 -1
  29. package/dist/live-queries/computed.js +37 -15
  30. package/dist/live-queries/computed.js.map +1 -1
  31. package/dist/live-queries/db-query.d.ts +93 -0
  32. package/dist/live-queries/db-query.d.ts.map +1 -0
  33. package/dist/live-queries/{db.js → db-query.js} +113 -40
  34. package/dist/live-queries/db-query.js.map +1 -0
  35. package/dist/live-queries/db-query.test.d.ts +2 -0
  36. package/dist/live-queries/db-query.test.d.ts.map +1 -0
  37. package/dist/live-queries/db-query.test.js +133 -0
  38. package/dist/live-queries/db-query.test.js.map +1 -0
  39. package/dist/live-queries/mod.d.ts +5 -0
  40. package/dist/live-queries/mod.d.ts.map +1 -0
  41. package/dist/live-queries/mod.js +5 -0
  42. package/dist/live-queries/mod.js.map +1 -0
  43. package/dist/live-queries/signal.d.ts +25 -0
  44. package/dist/live-queries/signal.d.ts.map +1 -0
  45. package/dist/live-queries/signal.js +50 -0
  46. package/dist/live-queries/signal.js.map +1 -0
  47. package/dist/live-queries/signal.test.d.ts +2 -0
  48. package/dist/live-queries/signal.test.d.ts.map +1 -0
  49. package/dist/live-queries/signal.test.js +25 -0
  50. package/dist/live-queries/signal.test.js.map +1 -0
  51. package/dist/mod.d.ts +14 -0
  52. package/dist/mod.d.ts.map +1 -0
  53. package/dist/mod.js +13 -0
  54. package/dist/mod.js.map +1 -0
  55. package/dist/reactive.d.ts +23 -17
  56. package/dist/reactive.d.ts.map +1 -1
  57. package/dist/reactive.js +23 -19
  58. package/dist/reactive.js.map +1 -1
  59. package/dist/reactive.test.js +1 -1
  60. package/dist/reactive.test.js.map +1 -1
  61. package/dist/store/create-store.d.ts +70 -12
  62. package/dist/store/create-store.d.ts.map +1 -1
  63. package/dist/store/create-store.js +68 -19
  64. package/dist/store/create-store.js.map +1 -1
  65. package/dist/store/devtools.d.ts +5 -4
  66. package/dist/store/devtools.d.ts.map +1 -1
  67. package/dist/store/devtools.js +92 -40
  68. package/dist/store/devtools.js.map +1 -1
  69. package/dist/store/store-types.d.ts +54 -42
  70. package/dist/store/store-types.d.ts.map +1 -1
  71. package/dist/store/store-types.js +2 -5
  72. package/dist/store/store-types.js.map +1 -1
  73. package/dist/store/store.d.ts +141 -35
  74. package/dist/store/store.d.ts.map +1 -1
  75. package/dist/store/store.js +322 -154
  76. package/dist/store/store.js.map +1 -1
  77. package/dist/utils/data-structures.d.ts.map +1 -1
  78. package/dist/utils/dev.d.ts.map +1 -1
  79. package/dist/utils/dev.js +6 -1
  80. package/dist/utils/dev.js.map +1 -1
  81. package/dist/utils/function-string.d.ts +7 -0
  82. package/dist/utils/function-string.d.ts.map +1 -0
  83. package/dist/utils/function-string.js +9 -0
  84. package/dist/utils/function-string.js.map +1 -0
  85. package/dist/utils/stack-info.d.ts.map +1 -1
  86. package/dist/utils/stack-info.js +6 -1
  87. package/dist/utils/stack-info.js.map +1 -1
  88. package/dist/utils/stack-info.test.js +54 -1
  89. package/dist/utils/stack-info.test.js.map +1 -1
  90. package/dist/utils/tests/fixture.d.ts +59 -216
  91. package/dist/utils/tests/fixture.d.ts.map +1 -1
  92. package/dist/utils/tests/fixture.js +23 -18
  93. package/dist/utils/tests/fixture.js.map +1 -1
  94. package/dist/utils/tests/mod.d.ts +1 -0
  95. package/dist/utils/tests/mod.d.ts.map +1 -1
  96. package/dist/utils/tests/mod.js +1 -0
  97. package/dist/utils/tests/mod.js.map +1 -1
  98. package/dist/utils/tests/otel.d.ts.map +1 -1
  99. package/dist/utils/tests/otel.js +8 -3
  100. package/dist/utils/tests/otel.js.map +1 -1
  101. package/package.json +29 -26
  102. package/src/{SynchronousDatabaseWrapper.ts → SqliteDbWrapper.ts} +92 -42
  103. package/src/effect/LiveStore.ts +27 -64
  104. package/src/effect/{index.ts → mod.ts} +2 -3
  105. package/src/internal/mod.ts +2 -0
  106. package/src/live-queries/__snapshots__/{db.test.ts.snap → db-query.test.ts.snap} +241 -45
  107. package/src/live-queries/base-class.ts +170 -53
  108. package/src/live-queries/client-document-get-query.ts +52 -0
  109. package/src/live-queries/computed.ts +51 -33
  110. package/src/live-queries/db-query.test.ts +192 -0
  111. package/src/live-queries/{db.ts → db-query.ts} +171 -82
  112. package/src/live-queries/mod.ts +4 -0
  113. package/src/live-queries/signal.test.ts +40 -0
  114. package/src/live-queries/signal.ts +81 -0
  115. package/src/mod.ts +51 -0
  116. package/src/reactive.test.ts +1 -1
  117. package/src/reactive.ts +66 -43
  118. package/src/store/create-store.ts +188 -62
  119. package/src/store/devtools.ts +124 -46
  120. package/src/store/store-types.ts +54 -43
  121. package/src/store/store.ts +457 -237
  122. package/src/utils/dev.ts +6 -1
  123. package/src/utils/function-string.ts +12 -0
  124. package/src/utils/stack-info.test.ts +58 -1
  125. package/src/utils/stack-info.ts +6 -1
  126. package/src/utils/tests/fixture.ts +22 -31
  127. package/src/utils/tests/mod.ts +1 -0
  128. package/src/utils/tests/otel.ts +10 -3
  129. package/dist/SynchronousDatabaseWrapper.d.ts +0 -41
  130. package/dist/SynchronousDatabaseWrapper.d.ts.map +0 -1
  131. package/dist/SynchronousDatabaseWrapper.js.map +0 -1
  132. package/dist/effect/index.d.ts +0 -2
  133. package/dist/effect/index.d.ts.map +0 -1
  134. package/dist/effect/index.js +0 -2
  135. package/dist/effect/index.js.map +0 -1
  136. package/dist/global-state.d.ts +0 -14
  137. package/dist/global-state.d.ts.map +0 -1
  138. package/dist/global-state.js +0 -16
  139. package/dist/global-state.js.map +0 -1
  140. package/dist/index.d.ts +0 -20
  141. package/dist/index.d.ts.map +0 -1
  142. package/dist/index.js +0 -16
  143. package/dist/index.js.map +0 -1
  144. package/dist/live-queries/db.d.ts +0 -66
  145. package/dist/live-queries/db.d.ts.map +0 -1
  146. package/dist/live-queries/db.js.map +0 -1
  147. package/dist/live-queries/db.test.d.ts +0 -2
  148. package/dist/live-queries/db.test.d.ts.map +0 -1
  149. package/dist/live-queries/db.test.js +0 -118
  150. package/dist/live-queries/db.test.js.map +0 -1
  151. package/dist/live-queries/graphql.d.ts +0 -49
  152. package/dist/live-queries/graphql.d.ts.map +0 -1
  153. package/dist/live-queries/graphql.js +0 -122
  154. package/dist/live-queries/graphql.js.map +0 -1
  155. package/dist/row-query-utils.d.ts +0 -17
  156. package/dist/row-query-utils.d.ts.map +0 -1
  157. package/dist/row-query-utils.js +0 -30
  158. package/dist/row-query-utils.js.map +0 -1
  159. package/dist/utils/otel.d.ts +0 -4
  160. package/dist/utils/otel.d.ts.map +0 -1
  161. package/dist/utils/otel.js +0 -6
  162. package/dist/utils/otel.js.map +0 -1
  163. package/src/global-state.ts +0 -20
  164. package/src/index.ts +0 -66
  165. package/src/live-queries/db.test.ts +0 -154
  166. package/src/live-queries/graphql.ts +0 -219
  167. package/src/row-query-utils.ts +0 -65
  168. package/src/utils/otel.ts +0 -9
  169. package/tsconfig.json +0 -18
  170. package/vitest.config.js +0 -9
@@ -1,28 +1,33 @@
1
+ import { makeInMemoryAdapter } from '@livestore/adapter-web';
1
2
  import { provideOtel } from '@livestore/common';
2
- import { createStore, DbSchema, globalReactivityGraph, makeReactivityGraph, makeSchema } from '@livestore/livestore';
3
- import { Effect } from '@livestore/utils/effect';
4
- import { makeInMemoryAdapter } from '@livestore/web';
5
- export const todos = DbSchema.table('todos', {
6
- id: DbSchema.text({ primaryKey: true }),
7
- text: DbSchema.text({ default: '', nullable: false }),
8
- completed: DbSchema.boolean({ default: false, nullable: false }),
9
- }, { deriveMutations: true, isSingleton: false });
10
- export const app = DbSchema.table('app', {
11
- id: DbSchema.text({ primaryKey: true, default: 'static' }),
12
- newTodoText: DbSchema.text({ default: '', nullable: true }),
13
- filter: DbSchema.text({ default: 'all', nullable: false }),
14
- }, { isSingleton: true });
3
+ import { createStore, makeSchema, State } from '@livestore/livestore';
4
+ import { Effect, Schema } from '@livestore/utils/effect';
5
+ export const todos = State.SQLite.table({
6
+ name: 'todos',
7
+ columns: {
8
+ id: State.SQLite.text({ primaryKey: true }),
9
+ text: State.SQLite.text({ default: '', nullable: false }),
10
+ completed: State.SQLite.boolean({ default: false, nullable: false }),
11
+ },
12
+ });
13
+ export const app = State.SQLite.clientDocument({
14
+ name: 'app',
15
+ schema: Schema.Struct({
16
+ newTodoText: Schema.String,
17
+ filter: Schema.String,
18
+ }),
19
+ default: { value: { newTodoText: '', filter: 'all' } },
20
+ });
15
21
  export const tables = { todos, app };
16
- export const schema = makeSchema({ tables });
17
- export const makeTodoMvc = ({ otelTracer, otelContext, useGlobalReactivityGraph = true, } = {}) => Effect.gen(function* () {
18
- const reactivityGraph = useGlobalReactivityGraph ? globalReactivityGraph : makeReactivityGraph();
22
+ export const state = State.SQLite.makeState({ tables, materializers: {} });
23
+ export const schema = makeSchema({ state, events: {} });
24
+ export const makeTodoMvc = ({ otelTracer, otelContext, } = {}) => Effect.gen(function* () {
19
25
  const store = yield* createStore({
20
26
  schema,
21
27
  storeId: 'default',
22
28
  adapter: makeInMemoryAdapter(),
23
- reactivityGraph,
24
29
  debug: { instanceId: 'test' },
25
30
  });
26
- return { store, reactivityGraph };
31
+ return store;
27
32
  }).pipe(provideOtel({ parentSpanContext: otelContext, otelTracer: otelTracer }));
28
33
  //# sourceMappingURL=fixture.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fixture.js","sourceRoot":"","sources":["../../../src/utils/tests/fixture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAG/C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAA;AACpH,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAChD,OAAO,EAAE,mBAAmB,EAAE,MAAM,gBAAgB,CAAA;AAgBpD,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CACjC,OAAO,EACP;IACE,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,EACD,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,CAC9C,CAAA;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAC/B,KAAK,EACL;IACE,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC1D,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,EACD,EAAE,WAAW,EAAE,IAAI,EAAE,CACtB,CAAA;AAED,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;AACpC,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;AAI5C,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAC1B,UAAU,EACV,WAAW,EACX,wBAAwB,GAAG,IAAI,MAK7B,EAAE,EAAE,EAAE,CACR,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,eAAe,GAAG,wBAAwB,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC,CAAC,mBAAmB,EAAE,CAAA;IAEhG,MAAM,KAAK,GAA8B,KAAK,CAAC,CAAC,WAAW,CAAC;QAC1D,MAAM;QACN,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,mBAAmB,EAAE;QAC9B,eAAe;QACf,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE;KAC9B,CAAC,CAAA;IAEF,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,CAAA;AACnC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"fixture.js","sourceRoot":"","sources":["../../../src/utils/tests/fixture.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,wBAAwB,CAAA;AAC5D,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AACrE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAA;AAgBxD,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC;IACtC,IAAI,EAAE,OAAO;IACb,OAAO,EAAE;QACP,EAAE,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC3C,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;QACzD,SAAS,EAAE,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;KACrE;CACF,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,cAAc,CAAC;IAC7C,IAAI,EAAE,KAAK;IACX,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC,MAAM;QAC1B,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;IACF,OAAO,EAAE,EAAE,KAAK,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;CACvD,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,MAAM,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,CAAA;AAEpC,MAAM,CAAC,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,CAAC,CAAA;AAC1E,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAA;AAEvD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,EAC1B,UAAU,EACV,WAAW,MAIT,EAAE,EAAE,EAAE,CACR,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,WAAW,CAAC;QAC/B,MAAM;QACN,OAAO,EAAE,SAAS;QAClB,OAAO,EAAE,mBAAmB,EAAE;QAC9B,KAAK,EAAE,EAAE,UAAU,EAAE,MAAM,EAAE;KAC9B,CAAC,CAAA;IAEF,OAAO,KAAK,CAAA;AACd,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,iBAAiB,EAAE,WAAW,EAAE,UAAU,EAAE,UAAU,EAAE,CAAC,CAAC,CAAA"}
@@ -1,3 +1,4 @@
1
1
  export * from './fixture.js';
2
2
  export * from './otel.js';
3
+ export * as RG from '../../reactive.js';
3
4
  //# sourceMappingURL=mod.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../../src/utils/tests/mod.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA"}
1
+ {"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../../src/utils/tests/mod.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,OAAO,KAAK,EAAE,MAAM,mBAAmB,CAAA"}
@@ -1,3 +1,4 @@
1
1
  export * from './fixture.js';
2
2
  export * from './otel.js';
3
+ export * as RG from '../../reactive.js';
3
4
  //# sourceMappingURL=mod.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"mod.js","sourceRoot":"","sources":["../../../src/utils/tests/mod.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA"}
1
+ {"version":3,"file":"mod.js","sourceRoot":"","sources":["../../../src/utils/tests/mod.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAA;AAC5B,cAAc,WAAW,CAAA;AACzB,OAAO,KAAK,EAAE,MAAM,mBAAmB,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../../../src/utils/tests/otel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACvF,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,kBACd,CAAC,UAAU,EAAE,UAAU,KAAK,UAAU,KACrD,oBAwCF,CAAA;AAqBD,eAAO,MAAM,WAAW,UAAW,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDhD,CAAA"}
1
+ {"version":3,"file":"otel.d.ts","sourceRoot":"","sources":["../../../src/utils/tests/otel.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAA;AACpD,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAA;AACvF,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,GAChC,UAAU,oBAAoB,EAC9B,gBAAgB,CAAC,UAAU,EAAE,UAAU,KAAK,UAAU,KACrD,oBA+CF,CAAA;AAqBD,eAAO,MAAM,WAAW,GAAI,OAAO,YAAY,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAyDhD,CAAA"}
@@ -4,12 +4,17 @@ export const getSimplifiedRootSpan = (exporter, mapAttributes) => {
4
4
  const spansMap = new Map(spans.map((span) => [span.spanContext().spanId, { span, children: [] }]));
5
5
  const mapAttributesfn = mapAttributes ?? identity;
6
6
  spansMap.forEach((nestedSpan) => {
7
- const parentSpan = nestedSpan.span.parentSpanId ? spansMap.get(nestedSpan.span.parentSpanId) : undefined;
7
+ const parentId = nestedSpan.span.parentSpanContext?.spanId;
8
+ const parentSpan = parentId ? spansMap.get(parentId) : undefined;
8
9
  if (parentSpan) {
9
10
  parentSpan.children.push(nestedSpan);
10
11
  }
11
12
  });
12
- const rootSpan = spansMap.get(spans.find((_) => _.name === 'createStore').spanContext().spanId);
13
+ const createStoreSpanData = spans.find((_) => _.name === 'createStore');
14
+ if (createStoreSpanData === undefined) {
15
+ throw new Error("Could not find the root span named 'createStore'. Available spans: " + spans.map((s) => s.name).join(', '));
16
+ }
17
+ const rootSpan = spansMap.get(createStoreSpanData.spanContext().spanId);
13
18
  const simplifySpanRec = (span) => omitEmpty({
14
19
  _name: span.span.name,
15
20
  attributes: mapAttributesfn(span.span.attributes),
@@ -64,7 +69,7 @@ export const toTraceFile = (spans) => {
64
69
  spans: spans.map((span) => ({
65
70
  traceId: span.spanContext().traceId,
66
71
  spanId: span.spanContext().spanId,
67
- ...(span.parentSpanId ? { parentSpanId: span.parentSpanId } : {}),
72
+ ...(span.parentSpanContext?.spanId ? { parentSpanId: span.parentSpanContext.spanId } : {}),
68
73
  // traceState: span.spanContext().traceState ?? '',
69
74
  name: span.name,
70
75
  kind: 'SPAN_KIND_INTERNAL',
@@ -1 +1 @@
1
- {"version":3,"file":"otel.js","sourceRoot":"","sources":["../../../src/utils/tests/otel.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"otel.js","sourceRoot":"","sources":["../../../src/utils/tests/otel.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,56 +1,59 @@
1
1
  {
2
2
  "name": "@livestore/livestore",
3
- "version": "0.3.0-dev.5",
3
+ "version": "0.3.0-dev.51",
4
4
  "type": "module",
5
5
  "sideEffects": false,
6
6
  "exports": {
7
7
  ".": {
8
- "types": "./dist/index.d.ts",
9
- "default": "./dist/index.js"
8
+ "types": "./dist/mod.d.ts",
9
+ "default": "./dist/mod.js"
10
+ },
11
+ "./internal": {
12
+ "types": "./dist/internal/mod.d.ts",
13
+ "default": "./dist/internal/mod.js"
10
14
  },
11
15
  "./internal/testing-utils": {
12
16
  "types": "./dist/utils/tests/mod.d.ts",
13
17
  "default": "./dist/utils/tests/mod.js"
14
18
  },
15
19
  "./effect": {
16
- "types": "./dist/effect/index.d.ts",
17
- "default": "./dist/effect/index.js"
20
+ "types": "./dist/effect/mod.d.ts",
21
+ "default": "./dist/effect/mod.js"
18
22
  }
19
23
  },
20
- "types": "./dist/index.d.ts",
24
+ "types": "./dist/mod.d.ts",
21
25
  "typesVersions": {
22
26
  "*": {
27
+ "internal": [
28
+ "./dist/internal/mod.d.ts"
29
+ ],
23
30
  "testing-utils": [
24
31
  "./dist/utils/tests/mod.d.ts"
25
32
  ],
26
33
  "effect": [
27
- "./dist/effect/index.d.ts"
34
+ "./dist/effect/mod.d.ts"
28
35
  ]
29
36
  }
30
37
  },
31
38
  "dependencies": {
32
- "@graphql-typed-document-node/core": "^3.2.0",
33
- "@opentelemetry/api": "^1.9.0",
34
- "@livestore/utils": "0.3.0-dev.5",
35
- "@livestore/db-schema": "0.3.0-dev.5",
36
- "@livestore/common": "0.3.0-dev.5"
39
+ "@opentelemetry/api": "1.9.0",
40
+ "@livestore/utils": "0.3.0-dev.51",
41
+ "@livestore/common": "0.3.0-dev.51"
37
42
  },
38
43
  "devDependencies": {
39
- "@opentelemetry/sdk-trace-base": "1.30.0",
40
- "jsdom": "^25.0.1",
41
- "typescript": "5.7.2",
42
- "vite": "5.4.10",
43
- "vitest": "^2.1.4",
44
- "@livestore/web": "0.3.0-dev.5"
45
- },
46
- "peerDependencies": {
47
- "graphql": "16.x"
48
- },
49
- "peerDependenciesMeta": {
50
- "graphql": {
51
- "optional": true
52
- }
44
+ "@opentelemetry/sdk-trace-base": "^2.0.0",
45
+ "jsdom": "^26.0.0",
46
+ "typescript": "^5.8.3",
47
+ "vite": "^6.3.4",
48
+ "vitest": "^3.1.2",
49
+ "@livestore/adapter-web": "0.3.0-dev.51",
50
+ "@livestore/utils-dev": "0.3.0-dev.51"
53
51
  },
52
+ "files": [
53
+ "package.json",
54
+ "src",
55
+ "dist"
56
+ ],
54
57
  "publishConfig": {
55
58
  "access": "public"
56
59
  },
@@ -5,14 +5,22 @@ import type {
5
5
  MutableDebugInfo,
6
6
  PreparedBindValues,
7
7
  PreparedStatement,
8
- SynchronousDatabase,
8
+ SqliteDb,
9
+ SqliteDbChangeset,
10
+ SqliteDbSession,
9
11
  } from '@livestore/common'
10
- import { BoundArray, BoundMap, sql } from '@livestore/common'
11
- import { isDevEnv } from '@livestore/utils'
12
+ import {
13
+ BoundArray,
14
+ BoundMap,
15
+ getDurationMsFromSpan,
16
+ getStartTimeHighResFromSpan,
17
+ sql,
18
+ SqliteError,
19
+ } from '@livestore/common'
20
+ import { isDevEnv, LS_DEV } from '@livestore/utils'
12
21
  import type * as otel from '@opentelemetry/api'
13
22
 
14
23
  import QueryCache from './QueryCache.js'
15
- import { getDurationMsFromSpan, getStartTimeHighResFromSpan } from './utils/otel.js'
16
24
 
17
25
  export const emptyDebugInfo = (): DebugInfo => ({
18
26
  slowQueries: new BoundArray(200),
@@ -21,12 +29,17 @@ export const emptyDebugInfo = (): DebugInfo => ({
21
29
  events: new BoundArray(1000),
22
30
  })
23
31
 
24
- export class SynchronousDatabaseWrapper {
32
+ /**
33
+ * This class is mostly adding result caching around a SqliteDb which is used to speed up
34
+ * SQLite queries when used through the reactivity graph.
35
+ */
36
+ export class SqliteDbWrapper implements SqliteDb {
37
+ _tag = 'SqliteDb' as const
25
38
  // TODO: how many unique active statements are expected?
26
39
  private cachedStmts = new BoundMap<string, PreparedStatement>(200)
27
40
  private tablesUsedCache = new BoundMap<string, Set<string>>(200)
28
41
  private resultCache = new QueryCache()
29
- private db: SynchronousDatabase
42
+ private db: SqliteDb
30
43
  private otelTracer: otel.Tracer
31
44
  private otelRootSpanContext: otel.Context
32
45
  private tablesUsedStmt
@@ -36,7 +49,7 @@ export class SynchronousDatabaseWrapper {
36
49
  db,
37
50
  otel,
38
51
  }: {
39
- db: SynchronousDatabase
52
+ db: SqliteDb
40
53
  otel: {
41
54
  tracer: otel.Tracer
42
55
  rootSpanContext: otel.Context
@@ -54,6 +67,25 @@ export class SynchronousDatabaseWrapper {
54
67
 
55
68
  configureSQLite(this)
56
69
  }
70
+ metadata: any
71
+ prepare(queryStr: string): PreparedStatement {
72
+ return this.db.prepare(queryStr)
73
+ }
74
+ import(data: Uint8Array<ArrayBufferLike> | SqliteDb<any, any>) {
75
+ return this.db.import(data)
76
+ }
77
+ close(): void {
78
+ return this.db.close()
79
+ }
80
+ destroy(): void {
81
+ return this.db.destroy()
82
+ }
83
+ session(): SqliteDbSession {
84
+ return this.db.session()
85
+ }
86
+ makeChangeset(data: Uint8Array): SqliteDbChangeset {
87
+ return this.db.makeChangeset(data)
88
+ }
57
89
 
58
90
  txn<TRes>(callback: () => TRes): TRes {
59
91
  this.execute(sql`begin transaction;`)
@@ -76,14 +108,20 @@ export class SynchronousDatabaseWrapper {
76
108
  return result
77
109
  }
78
110
 
79
- withChangeset<TRes>(callback: () => TRes): { result: TRes; changeset: Uint8Array | undefined } {
111
+ withChangeset<TRes>(callback: () => TRes): {
112
+ result: TRes
113
+ changeset: { _tag: 'sessionChangeset'; data: Uint8Array; debug: any } | { _tag: 'no-op' }
114
+ } {
80
115
  const session = this.db.session()
81
116
  const result = callback()
82
117
  const changeset = session.changeset()
83
118
 
84
119
  session.finish()
85
120
 
86
- return { result, changeset }
121
+ return {
122
+ result,
123
+ changeset: changeset ? { _tag: 'sessionChangeset', data: changeset, debug: null } : { _tag: 'no-op' },
124
+ }
87
125
  }
88
126
 
89
127
  rollback(changeset: Uint8Array) {
@@ -121,9 +159,13 @@ export class SynchronousDatabaseWrapper {
121
159
 
122
160
  execute(
123
161
  queryStr: string,
124
- bindValues?: PreparedBindValues,
125
- writeTables?: ReadonlySet<string>,
126
- options?: { hasNoEffects?: boolean; otelContext?: otel.Context },
162
+ bindValues?: PreparedBindValues | undefined,
163
+ options?: {
164
+ hasNoEffects?: boolean
165
+ otelContext?: otel.Context
166
+ writeTables?: ReadonlySet<string>
167
+ onRowsChanged?: (rowsChanged: number) => void
168
+ },
127
169
  ): { durationMs: number } {
128
170
  // console.debug('in-memory-db:execute', query, bindValues)
129
171
 
@@ -133,53 +175,62 @@ export class SynchronousDatabaseWrapper {
133
175
  { attributes: { 'sql.query': queryStr } },
134
176
  options?.otelContext ?? this.otelRootSpanContext,
135
177
  (span) => {
136
- let stmt = this.cachedStmts.get(queryStr)
137
- if (stmt === undefined) {
138
- stmt = this.db.prepare(queryStr)
139
- this.cachedStmts.set(queryStr, stmt)
140
- }
178
+ try {
179
+ let stmt = this.cachedStmts.get(queryStr)
180
+ if (stmt === undefined) {
181
+ stmt = this.db.prepare(queryStr)
182
+ this.cachedStmts.set(queryStr, stmt)
183
+ }
141
184
 
142
- stmt.execute(bindValues)
185
+ stmt.execute(bindValues)
143
186
 
144
- if (options?.hasNoEffects !== true && !this.resultCache.ignoreQuery(queryStr)) {
145
- // TODO use write tables instead
146
- // check what queries actually end up here.
147
- this.resultCache.invalidate(writeTables ?? this.getTablesUsed(queryStr))
148
- }
187
+ if (options?.hasNoEffects !== true && !this.resultCache.ignoreQuery(queryStr)) {
188
+ // TODO use write tables instead
189
+ // check what queries actually end up here.
190
+ this.resultCache.invalidate(options?.writeTables ?? this.getTablesUsed(queryStr))
191
+ }
149
192
 
150
- span.end()
193
+ span.end()
151
194
 
152
- const durationMs = getDurationMsFromSpan(span)
195
+ const durationMs = getDurationMsFromSpan(span)
153
196
 
154
- this.debugInfo.queryFrameDuration += durationMs
155
- this.debugInfo.queryFrameCount++
197
+ this.debugInfo.queryFrameDuration += durationMs
198
+ this.debugInfo.queryFrameCount++
156
199
 
157
- if (durationMs > 5 && isDevEnv()) {
158
- this.debugInfo.slowQueries.push({
159
- queryStr,
160
- bindValues,
161
- durationMs,
162
- rowsCount: undefined,
163
- queriedTables: new Set(),
164
- startTimePerfNow: getStartTimeHighResFromSpan(span),
165
- })
166
- }
200
+ if (durationMs > 5 && isDevEnv()) {
201
+ this.debugInfo.slowQueries.push({
202
+ queryStr,
203
+ bindValues,
204
+ durationMs,
205
+ rowsCount: undefined,
206
+ queriedTables: new Set(),
207
+ startTimePerfNow: getStartTimeHighResFromSpan(span),
208
+ })
209
+ }
167
210
 
168
- return { durationMs }
211
+ return { durationMs }
212
+ } catch (cause: any) {
213
+ span.recordException(cause)
214
+ span.end()
215
+ if (LS_DEV) {
216
+ debugger
217
+ }
218
+ throw new SqliteError({ cause, query: { bindValues: bindValues ?? {}, sql: queryStr } })
219
+ }
169
220
  },
170
221
  )
171
222
  }
172
223
 
173
224
  select<T = any>(
174
225
  queryStr: string,
226
+ bindValues?: PreparedBindValues | undefined,
175
227
  options?: {
176
228
  queriedTables?: ReadonlySet<string>
177
- bindValues?: PreparedBindValues
178
229
  skipCache?: boolean
179
230
  otelContext?: otel.Context
180
231
  },
181
232
  ): ReadonlyArray<T> {
182
- const { queriedTables, bindValues, skipCache = false, otelContext } = options ?? {}
233
+ const { queriedTables, skipCache = false, otelContext } = options ?? {}
183
234
 
184
235
  // console.debug('in-memory-db:select', query, bindValues)
185
236
 
@@ -252,13 +303,12 @@ export class SynchronousDatabaseWrapper {
252
303
  }
253
304
 
254
305
  /** Set up SQLite performance; hasn't been super carefully optimized yet. */
255
- const configureSQLite = (db: SynchronousDatabaseWrapper) => {
306
+ const configureSQLite = (db: SqliteDbWrapper) => {
256
307
  db.execute(
257
308
  // TODO: revisit these tuning parameters for max performance
258
309
  sql`
259
310
  PRAGMA page_size=32768;
260
311
  PRAGMA cache_size=10000;
261
- PRAGMA journal_mode='MEMORY'; -- we don't flush to disk before committing a write
262
312
  PRAGMA synchronous='OFF';
263
313
  PRAGMA temp_store='MEMORY';
264
314
  PRAGMA foreign_keys='ON'; -- we want foreign key constraints to be enforced
@@ -1,84 +1,31 @@
1
- import type { Adapter, BootStatus, UnexpectedError } from '@livestore/common'
1
+ import type { UnexpectedError } from '@livestore/common'
2
2
  import type { LiveStoreSchema } from '@livestore/common/schema'
3
3
  import type { Cause, OtelTracer, Scope } from '@livestore/utils/effect'
4
- import { Context, Deferred, Duration, Effect, Layer, pipe } from '@livestore/utils/effect'
5
- import type * as otel from '@opentelemetry/api'
6
- import type { GraphQLSchema } from 'graphql'
4
+ import { Deferred, Duration, Effect, Layer, pipe } from '@livestore/utils/effect'
7
5
 
8
- import { createStore } from '../store/create-store.js'
9
- import type { Store } from '../store/store.js'
10
- import type { BaseGraphQLContext, LiveStoreContextRunning as LiveStoreContextRunning_ } from '../store/store-types.js'
11
- import type { SynchronousDatabaseWrapper } from '../SynchronousDatabaseWrapper.js'
6
+ import type { LiveStoreContextProps } from '../store/create-store.js'
7
+ import { createStore, DeferredStoreContext, LiveStoreContextRunning } from '../store/create-store.js'
12
8
 
13
- export type LiveStoreContextRunning = LiveStoreContextRunning_
14
- export const LiveStoreContextRunning = Context.GenericTag<LiveStoreContextRunning>(
15
- '@livestore/livestore/effect/LiveStoreContextRunning',
16
- )
17
-
18
- export type DeferredStoreContext = Deferred.Deferred<LiveStoreContextRunning, UnexpectedError>
19
- export const DeferredStoreContext = Context.GenericTag<DeferredStoreContext>(
20
- '@livestore/livestore/effect/DeferredStoreContext',
21
- )
22
-
23
- export type LiveStoreContextProps<GraphQLContext extends BaseGraphQLContext> = {
24
- schema: LiveStoreSchema
25
- /**
26
- * The `storeId` can be used to isolate multiple stores from each other.
27
- * So it can be useful for multi-tenancy scenarios.
28
- *
29
- * The `storeId` is also used for persistence.
30
- *
31
- * @default 'default'
32
- */
33
- storeId?: string
34
- graphQLOptions?: {
35
- schema: Effect.Effect<GraphQLSchema, never, OtelTracer.OtelTracer>
36
- makeContext: (db: SynchronousDatabaseWrapper, tracer: otel.Tracer, sessionId: string) => GraphQLContext
37
- }
38
- boot?: (store: Store<GraphQLContext, LiveStoreSchema>) => Effect.Effect<void, unknown, OtelTracer.OtelTracer>
39
- adapter: Adapter
40
- disableDevtools?: boolean
41
- onBootStatus?: (status: BootStatus) => void
42
- batchUpdates: (run: () => void) => void
43
- }
44
-
45
- export const LiveStoreContextLayer = <GraphQLContext extends BaseGraphQLContext>(
46
- props: LiveStoreContextProps<GraphQLContext>,
47
- ): Layer.Layer<LiveStoreContextRunning, UnexpectedError | Cause.TimeoutException, OtelTracer.OtelTracer> =>
48
- Layer.scoped(LiveStoreContextRunning, makeLiveStoreContext(props)).pipe(
49
- Layer.withSpan('LiveStore'),
50
- Layer.provide(LiveStoreContextDeferred),
51
- )
52
-
53
- export const LiveStoreContextDeferred = Layer.effect(
54
- DeferredStoreContext,
55
- Deferred.make<LiveStoreContextRunning, UnexpectedError>(),
56
- )
57
-
58
- export const makeLiveStoreContext = <GraphQLContext extends BaseGraphQLContext>({
9
+ export const makeLiveStoreContext = <TSchema extends LiveStoreSchema, TContext = {}>({
59
10
  schema,
60
11
  storeId = 'default',
61
- graphQLOptions: graphQLOptions_,
12
+ context,
62
13
  boot,
63
14
  adapter,
64
15
  disableDevtools,
65
16
  onBootStatus,
66
17
  batchUpdates,
67
- }: LiveStoreContextProps<GraphQLContext>): Effect.Effect<
68
- LiveStoreContextRunning,
18
+ }: LiveStoreContextProps<TSchema, TContext>): Effect.Effect<
19
+ LiveStoreContextRunning['Type'],
69
20
  UnexpectedError | Cause.TimeoutException,
70
21
  DeferredStoreContext | Scope.Scope | OtelTracer.OtelTracer
71
22
  > =>
72
23
  pipe(
73
24
  Effect.gen(function* () {
74
- const graphQLOptions = yield* graphQLOptions_
75
- ? Effect.all({ schema: graphQLOptions_.schema, makeContext: Effect.succeed(graphQLOptions_.makeContext) })
76
- : Effect.succeed(undefined)
77
-
78
25
  const store = yield* createStore({
79
26
  schema,
80
27
  storeId,
81
- graphQLOptions,
28
+ context,
82
29
  boot,
83
30
  adapter,
84
31
  disableDevtools,
@@ -87,9 +34,12 @@ export const makeLiveStoreContext = <GraphQLContext extends BaseGraphQLContext>(
87
34
  })
88
35
 
89
36
  globalThis.__debugLiveStore ??= {}
90
- // window.__debugLiveStore[schema.key] = store
37
+ if (Object.keys(globalThis.__debugLiveStore).length === 0) {
38
+ globalThis.__debugLiveStore['_'] = store
39
+ }
40
+ globalThis.__debugLiveStore[storeId] = store
91
41
 
92
- return { stage: 'running', store } satisfies LiveStoreContextRunning
42
+ return { stage: 'running', store } as any as LiveStoreContextRunning['Type']
93
43
  }),
94
44
  Effect.tapErrorCause((cause) => Effect.flatMap(DeferredStoreContext, (def) => Deferred.failCause(def, cause))),
95
45
  Effect.tap((storeCtx) => Effect.flatMap(DeferredStoreContext, (def) => Deferred.succeed(def, storeCtx))),
@@ -98,3 +48,16 @@ export const makeLiveStoreContext = <GraphQLContext extends BaseGraphQLContext>(
98
48
  Effect.timeout(Duration.minutes(5)),
99
49
  Effect.withSpan('@livestore/livestore/effect:makeLiveStoreContext'),
100
50
  )
51
+
52
+ export const LiveStoreContextLayer = <TSchema extends LiveStoreSchema, TContext = {}>(
53
+ props: LiveStoreContextProps<TSchema, TContext>,
54
+ ): Layer.Layer<LiveStoreContextRunning, UnexpectedError | Cause.TimeoutException, OtelTracer.OtelTracer> =>
55
+ Layer.scoped(LiveStoreContextRunning, makeLiveStoreContext(props)).pipe(
56
+ Layer.withSpan('LiveStore'),
57
+ Layer.provide(LiveStoreContextDeferred),
58
+ )
59
+
60
+ export const LiveStoreContextDeferred = Layer.effect(
61
+ DeferredStoreContext,
62
+ Deferred.make<LiveStoreContextRunning['Type'], UnexpectedError>(),
63
+ )
@@ -1,8 +1,7 @@
1
+ export { LiveStoreContextLayer, LiveStoreContextDeferred } from './LiveStore.js'
1
2
  export {
2
- LiveStoreContextLayer,
3
3
  LiveStoreContextRunning as LiveStoreContext,
4
4
  LiveStoreContextRunning,
5
- LiveStoreContextDeferred,
6
5
  DeferredStoreContext,
7
6
  type LiveStoreContextProps,
8
- } from './LiveStore.js'
7
+ } from '../store/create-store.js'
@@ -0,0 +1,2 @@
1
+ export * as LiveQueries from '../live-queries/mod.js'
2
+ export * as ReactiveGraph from '../reactive.js'