@livestore/livestore 0.0.13 → 0.0.14

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 (205) hide show
  1. package/README.md +18 -21
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/QueryCache.d.ts +1 -1
  4. package/dist/QueryCache.d.ts.map +1 -1
  5. package/dist/QueryCache.js.map +1 -1
  6. package/dist/__tests__/react/fixture.d.ts +5 -4
  7. package/dist/__tests__/react/fixture.d.ts.map +1 -1
  8. package/dist/__tests__/react/fixture.js +13 -14
  9. package/dist/__tests__/react/fixture.js.map +1 -1
  10. package/dist/__tests__/react/useComponentState.test.d.ts +2 -0
  11. package/dist/__tests__/react/useComponentState.test.d.ts.map +1 -0
  12. package/dist/__tests__/react/useComponentState.test.js +68 -0
  13. package/dist/__tests__/react/useComponentState.test.js.map +1 -0
  14. package/dist/__tests__/react/useLQuery.test.d.ts +2 -0
  15. package/dist/__tests__/react/useLQuery.test.d.ts.map +1 -0
  16. package/dist/__tests__/react/useLQuery.test.js +38 -0
  17. package/dist/__tests__/react/useLQuery.test.js.map +1 -0
  18. package/dist/__tests__/react/useLiveStoreComponent.test.js +4 -9
  19. package/dist/__tests__/react/useLiveStoreComponent.test.js.map +1 -1
  20. package/dist/__tests__/react/useQuery.test.d.ts +2 -0
  21. package/dist/__tests__/react/useQuery.test.d.ts.map +1 -0
  22. package/dist/__tests__/react/useQuery.test.js +33 -0
  23. package/dist/__tests__/react/useQuery.test.js.map +1 -0
  24. package/dist/__tests__/react/utils/extractStackInfoFromStackTrace.test.d.ts +2 -0
  25. package/dist/__tests__/react/utils/extractStackInfoFromStackTrace.test.d.ts.map +1 -0
  26. package/dist/__tests__/react/utils/extractStackInfoFromStackTrace.test.js +38 -0
  27. package/dist/__tests__/react/utils/extractStackInfoFromStackTrace.test.js.map +1 -0
  28. package/dist/__tests__/reactive.test.js +168 -95
  29. package/dist/__tests__/reactive.test.js.map +1 -1
  30. package/dist/__tests__/reactiveQueries/sql.test.d.ts +2 -0
  31. package/dist/__tests__/reactiveQueries/sql.test.d.ts.map +1 -0
  32. package/dist/__tests__/reactiveQueries/sql.test.js +337 -0
  33. package/dist/__tests__/reactiveQueries/sql.test.js.map +1 -0
  34. package/dist/effect/LiveStore.d.ts +3 -9
  35. package/dist/effect/LiveStore.d.ts.map +1 -1
  36. package/dist/effect/LiveStore.js +11 -7
  37. package/dist/effect/LiveStore.js.map +1 -1
  38. package/dist/inMemoryDatabase.d.ts +17 -21
  39. package/dist/inMemoryDatabase.d.ts.map +1 -1
  40. package/dist/inMemoryDatabase.js +2 -9
  41. package/dist/inMemoryDatabase.js.map +1 -1
  42. package/dist/index.d.ts +9 -7
  43. package/dist/index.d.ts.map +1 -1
  44. package/dist/index.js +7 -3
  45. package/dist/index.js.map +1 -1
  46. package/dist/migrations.d.ts +7 -0
  47. package/dist/migrations.d.ts.map +1 -1
  48. package/dist/migrations.js +18 -13
  49. package/dist/migrations.js.map +1 -1
  50. package/dist/react/LiveStoreProvider.d.ts +1 -3
  51. package/dist/react/LiveStoreProvider.d.ts.map +1 -1
  52. package/dist/react/LiveStoreProvider.js +13 -10
  53. package/dist/react/LiveStoreProvider.js.map +1 -1
  54. package/dist/react/index.d.ts +4 -4
  55. package/dist/react/index.d.ts.map +1 -1
  56. package/dist/react/index.js +3 -3
  57. package/dist/react/index.js.map +1 -1
  58. package/dist/react/useComponentState.d.ts +50 -0
  59. package/dist/react/useComponentState.d.ts.map +1 -0
  60. package/dist/react/useComponentState.js +248 -0
  61. package/dist/react/useComponentState.js.map +1 -0
  62. package/dist/react/useGlobalQuery.d.ts +2 -2
  63. package/dist/react/useGlobalQuery.d.ts.map +1 -1
  64. package/dist/react/useGlobalQuery.js +5 -2
  65. package/dist/react/useGlobalQuery.js.map +1 -1
  66. package/dist/react/useGraphQL.d.ts +5 -3
  67. package/dist/react/useGraphQL.d.ts.map +1 -1
  68. package/dist/react/useGraphQL.js +27 -7
  69. package/dist/react/useGraphQL.js.map +1 -1
  70. package/dist/react/useLiveStoreComponent.d.ts +14 -14
  71. package/dist/react/useLiveStoreComponent.d.ts.map +1 -1
  72. package/dist/react/useLiveStoreComponent.js +151 -91
  73. package/dist/react/useLiveStoreComponent.js.map +1 -1
  74. package/dist/react/useQuery.d.ts +3 -0
  75. package/dist/react/useQuery.d.ts.map +1 -0
  76. package/dist/react/useQuery.js +42 -0
  77. package/dist/react/useQuery.js.map +1 -0
  78. package/dist/react/useTemporaryQuery.d.ts +8 -0
  79. package/dist/react/useTemporaryQuery.d.ts.map +1 -0
  80. package/dist/react/useTemporaryQuery.js +17 -0
  81. package/dist/react/useTemporaryQuery.js.map +1 -0
  82. package/dist/react/utils/extractNamesFromStackTrace.d.ts +3 -0
  83. package/dist/react/utils/extractNamesFromStackTrace.d.ts.map +1 -0
  84. package/dist/react/utils/extractNamesFromStackTrace.js +40 -0
  85. package/dist/react/utils/extractNamesFromStackTrace.js.map +1 -0
  86. package/dist/react/utils/extractStackInfoFromStackTrace.d.ts +7 -0
  87. package/dist/react/utils/extractStackInfoFromStackTrace.d.ts.map +1 -0
  88. package/dist/react/utils/extractStackInfoFromStackTrace.js +40 -0
  89. package/dist/react/utils/extractStackInfoFromStackTrace.js.map +1 -0
  90. package/dist/reactive.d.ts +42 -48
  91. package/dist/reactive.d.ts.map +1 -1
  92. package/dist/reactive.js +293 -186
  93. package/dist/reactive.js.map +1 -1
  94. package/dist/reactiveQueries/base-class.d.ts +28 -20
  95. package/dist/reactiveQueries/base-class.d.ts.map +1 -1
  96. package/dist/reactiveQueries/base-class.js +25 -17
  97. package/dist/reactiveQueries/base-class.js.map +1 -1
  98. package/dist/reactiveQueries/graph.d.ts +10 -0
  99. package/dist/reactiveQueries/graph.d.ts.map +1 -0
  100. package/dist/reactiveQueries/graph.js +6 -0
  101. package/dist/reactiveQueries/graph.js.map +1 -0
  102. package/dist/reactiveQueries/graphql.d.ts +35 -18
  103. package/dist/reactiveQueries/graphql.d.ts.map +1 -1
  104. package/dist/reactiveQueries/graphql.js +91 -10
  105. package/dist/reactiveQueries/graphql.js.map +1 -1
  106. package/dist/reactiveQueries/js.d.ts +17 -13
  107. package/dist/reactiveQueries/js.d.ts.map +1 -1
  108. package/dist/reactiveQueries/js.js +31 -8
  109. package/dist/reactiveQueries/js.js.map +1 -1
  110. package/dist/reactiveQueries/sql.d.ts +22 -18
  111. package/dist/reactiveQueries/sql.d.ts.map +1 -1
  112. package/dist/reactiveQueries/sql.js +81 -16
  113. package/dist/reactiveQueries/sql.js.map +1 -1
  114. package/dist/schema.d.ts +0 -2
  115. package/dist/schema.d.ts.map +1 -1
  116. package/dist/schema.js +3 -6
  117. package/dist/schema.js.map +1 -1
  118. package/dist/storage/in-memory/index.d.ts +2 -2
  119. package/dist/storage/in-memory/index.d.ts.map +1 -1
  120. package/dist/storage/in-memory/index.js.map +1 -1
  121. package/dist/storage/index.d.ts +2 -2
  122. package/dist/storage/index.d.ts.map +1 -1
  123. package/dist/storage/tauri/index.d.ts +2 -2
  124. package/dist/storage/tauri/index.d.ts.map +1 -1
  125. package/dist/storage/tauri/index.js.map +1 -1
  126. package/dist/storage/web-worker/index.d.ts +4 -4
  127. package/dist/storage/web-worker/index.d.ts.map +1 -1
  128. package/dist/storage/web-worker/index.js +3 -5
  129. package/dist/storage/web-worker/index.js.map +1 -1
  130. package/dist/storage/web-worker/worker.js +2 -2
  131. package/dist/storage/web-worker/worker.js.map +1 -1
  132. package/dist/store.d.ts +19 -52
  133. package/dist/store.d.ts.map +1 -1
  134. package/dist/store.js +323 -266
  135. package/dist/store.js.map +1 -1
  136. package/dist/util.d.ts +3 -1
  137. package/dist/util.d.ts.map +1 -1
  138. package/dist/util.js +2 -0
  139. package/dist/util.js.map +1 -1
  140. package/package.json +2 -1
  141. package/src/QueryCache.ts +1 -1
  142. package/src/__tests__/react/fixture.tsx +21 -16
  143. package/src/__tests__/react/{useLiveStoreComponent.test.tsx → useComponentState.test.tsx} +9 -20
  144. package/src/__tests__/react/useQuery.test.tsx +48 -0
  145. package/src/__tests__/react/utils/extractStackInfoFromStackTrace.test.ts +40 -0
  146. package/src/__tests__/reactive.test.ts +194 -142
  147. package/src/__tests__/reactiveQueries/sql.test.ts +372 -0
  148. package/src/effect/LiveStore.ts +14 -18
  149. package/src/inMemoryDatabase.ts +22 -30
  150. package/src/index.ts +8 -6
  151. package/src/migrations.ts +39 -21
  152. package/src/react/LiveStoreProvider.tsx +13 -16
  153. package/src/react/index.ts +4 -8
  154. package/src/react/{useLiveStoreComponent.ts → useComponentState.ts} +98 -230
  155. package/src/react/useQuery.ts +58 -0
  156. package/src/react/useTemporaryQuery.ts +21 -0
  157. package/src/react/utils/extractStackInfoFromStackTrace.ts +47 -0
  158. package/src/reactive.ts +386 -267
  159. package/src/reactiveQueries/base-class.ts +61 -39
  160. package/src/reactiveQueries/graph.ts +15 -0
  161. package/src/reactiveQueries/graphql.ts +147 -31
  162. package/src/reactiveQueries/js.ts +54 -21
  163. package/src/reactiveQueries/sql.ts +128 -37
  164. package/src/schema.ts +2 -5
  165. package/src/storage/in-memory/index.ts +2 -2
  166. package/src/storage/index.ts +2 -2
  167. package/src/storage/tauri/index.ts +2 -2
  168. package/src/storage/web-worker/index.ts +6 -8
  169. package/src/storage/web-worker/worker.ts +2 -2
  170. package/src/store.ts +394 -418
  171. package/src/util.ts +8 -2
  172. package/dist/backends/base.d.ts +0 -13
  173. package/dist/backends/base.d.ts.map +0 -1
  174. package/dist/backends/base.js +0 -53
  175. package/dist/backends/base.js.map +0 -1
  176. package/dist/backends/in-memory/index.d.ts +0 -22
  177. package/dist/backends/in-memory/index.d.ts.map +0 -1
  178. package/dist/backends/in-memory/index.js +0 -45
  179. package/dist/backends/in-memory/index.js.map +0 -1
  180. package/dist/backends/index.d.ts +0 -41
  181. package/dist/backends/index.d.ts.map +0 -1
  182. package/dist/backends/index.js +0 -16
  183. package/dist/backends/index.js.map +0 -1
  184. package/dist/backends/tauri/index.d.ts +0 -21
  185. package/dist/backends/tauri/index.d.ts.map +0 -1
  186. package/dist/backends/tauri/index.js +0 -48
  187. package/dist/backends/tauri/index.js.map +0 -1
  188. package/dist/backends/utils/idb.d.ts +0 -10
  189. package/dist/backends/utils/idb.d.ts.map +0 -1
  190. package/dist/backends/utils/idb.js +0 -58
  191. package/dist/backends/utils/idb.js.map +0 -1
  192. package/dist/backends/web-worker/index.d.ts +0 -26
  193. package/dist/backends/web-worker/index.d.ts.map +0 -1
  194. package/dist/backends/web-worker/index.js +0 -63
  195. package/dist/backends/web-worker/index.js.map +0 -1
  196. package/dist/backends/web-worker/worker.d.ts +0 -17
  197. package/dist/backends/web-worker/worker.d.ts.map +0 -1
  198. package/dist/backends/web-worker/worker.js +0 -139
  199. package/dist/backends/web-worker/worker.js.map +0 -1
  200. package/dist/storage/base.d.ts +0 -10
  201. package/dist/storage/base.d.ts.map +0 -1
  202. package/dist/storage/base.js +0 -14
  203. package/dist/storage/base.js.map +0 -1
  204. package/src/react/useGlobalQuery.ts +0 -37
  205. package/src/react/useGraphQL.ts +0 -112
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAA;AAC3E,YAAY,EAAE,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEhH,YAAY,EAAE,eAAe,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE3G,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,uBAAuB,EACvB,UAAU,GACX,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACxF,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAC3E,YAAY,EACV,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,+BAA+B,EAC/B,cAAc,EACd,gBAAgB,GACjB,MAAM,eAAe,CAAA;AACtB,YAAY,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAA;AAC/D,YAAY,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAA;AACjE,YAAY,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAA;AAEzE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEvH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,MAAM,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,CAAA;AAE7C,OAAO,EAAE,SAAS,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAExD,OAAO,EAAE,GAAG,EAAE,KAAK,QAAQ,EAAE,MAAM,WAAW,CAAA;AAC9C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,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,cAAc,EAAE,kBAAkB,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,YAAY,CAAA;AAEhH,YAAY,EAAE,eAAe,EAAE,2BAA2B,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE3G,OAAO,EACL,0BAA0B,EAC1B,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,uBAAuB,EACvB,UAAU,GACX,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,gBAAgB,EAAE,KAAK,SAAS,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AACxF,YAAY,EAAE,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAA;AAC3E,YAAY,EACV,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,+BAA+B,EAC/B,cAAc,EACd,gBAAgB,EAChB,IAAI,GACL,MAAM,eAAe,CAAA;AACtB,OAAO,EAAE,KAAK,gBAAgB,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAA;AACxE,OAAO,EAAE,KAAK,iBAAiB,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAC3E,OAAO,EAAE,KAAK,qBAAqB,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AACvF,OAAO,EAAE,KAAK,aAAa,EAAE,MAAM,iCAAiC,CAAA;AACpE,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,MAAM,EAAE,aAAa,EAAE,iBAAiB,EAAE,KAAK,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAA;AAEvH,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AACjD,MAAM,MAAM,eAAe,GAAG,SAAS,CAAC,KAAK,CAAA;AAE7C,OAAO,EAAE,SAAS,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAExD,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAAE,KAAK,QAAQ,EAAE,KAAK,kBAAkB,EAAE,MAAM,WAAW,CAAA;AAC1F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA"}
package/dist/index.js CHANGED
@@ -1,9 +1,13 @@
1
- export { Store, createStore, RESET_DB_LOCAL_STORAGE_KEY } from './store.js';
2
- export { defineComponentStateSchema, EVENT_CURSOR_TABLE, defineAction, defineActions, defineTables, defineMaterializedViews, makeSchema, } from './schema.js';
1
+ export { Store, createStore } from './store.js';
2
+ export { defineComponentStateSchema, defineAction, defineActions, defineTables, defineMaterializedViews, makeSchema, } from './schema.js';
3
3
  export { InMemoryDatabase, emptyDebugInfo } from './inMemoryDatabase.js';
4
+ export { queryJS } from './reactiveQueries/js.js';
5
+ export { querySQL } from './reactiveQueries/sql.js';
6
+ export { queryGraphQL } from './reactiveQueries/graphql.js';
7
+ export { dbGraph } from './reactiveQueries/graph.js';
4
8
  export { labelForKey } from './componentKey.js';
5
9
  export { SqliteAst, SqliteDsl } from 'effect-db-schema';
6
10
  export { SqliteDsl as DbSchema } from 'effect-db-schema';
7
- export { sql } from './util.js';
11
+ export { prepareBindValues, sql } from './util.js';
8
12
  export { isEqual } from 'lodash-es';
9
13
  //# sourceMappingURL=index.js.map
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,0BAA0B,EAAE,MAAM,YAAY,CAAA;AAK3E,OAAO,EACL,0BAA0B,EAC1B,kBAAkB,EAClB,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,uBAAuB,EACvB,UAAU,GACX,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,gBAAgB,EAAkB,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAcxF,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAI/C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAKvD,OAAO,EAAE,SAAS,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAExD,OAAO,EAAE,GAAG,EAAiB,MAAM,WAAW,CAAA;AAC9C,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,EACL,0BAA0B,EAC1B,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,uBAAuB,EACvB,UAAU,GACX,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,gBAAgB,EAAkB,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAWxF,OAAO,EAAyB,OAAO,EAAE,MAAM,yBAAyB,CAAA;AACxE,OAAO,EAA0B,QAAQ,EAAE,MAAM,0BAA0B,CAAA;AAC3E,OAAO,EAA8B,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAEvF,OAAO,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAEpD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAI/C,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAKvD,OAAO,EAAE,SAAS,IAAI,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAExD,OAAO,EAAE,iBAAiB,EAAE,GAAG,EAA0C,MAAM,WAAW,CAAA;AAC1F,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA"}
@@ -1,4 +1,5 @@
1
1
  import type * as otel from '@opentelemetry/api';
2
+ import { SqliteAst } from 'effect-db-schema';
2
3
  import type { InMemoryDatabase } from './index.js';
3
4
  import type { Schema } from './schema.js';
4
5
  export declare const migrateDb: ({ db, otelContext, schema, }: {
@@ -6,4 +7,10 @@ export declare const migrateDb: ({ db, otelContext, schema, }: {
6
7
  otelContext: otel.Context;
7
8
  schema: Schema;
8
9
  }) => void;
10
+ export declare const migrateTable: ({ db, tableDef, otelContext, schemaHash, }: {
11
+ db: InMemoryDatabase;
12
+ tableDef: SqliteAst.Table;
13
+ otelContext: otel.Context;
14
+ schemaHash: number;
15
+ }) => void;
9
16
  //# sourceMappingURL=migrations.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAI/C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAA;AAKxD,eAAO,MAAM,SAAS;QAKhB,gBAAgB;iBACP,KAAK,OAAO;YACjB,MAAM;UAsDf,CAAA"}
1
+ {"version":3,"file":"migrations.d.ts","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAG5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAA;AAClD,OAAO,KAAK,EAAE,MAAM,EAAiB,MAAM,aAAa,CAAA;AAQxD,eAAO,MAAM,SAAS;QAKhB,gBAAgB;iBACP,KAAK,OAAO;YACjB,MAAM;UAkCf,CAAA;AAED,eAAO,MAAM,YAAY;QAMnB,gBAAgB;cACV,UAAU,KAAK;iBACZ,KAAK,OAAO;gBACb,MAAM;UAwBnB,CAAA"}
@@ -2,6 +2,7 @@ import { SqliteAst } from 'effect-db-schema';
2
2
  import { memoize, omit } from 'lodash-es';
3
3
  import { componentStateTables, SCHEMA_META_TABLE, systemTables } from './schema.js';
4
4
  import { sql } from './util.js';
5
+ const getMemoizedTimestamp = memoize(() => new Date().toISOString());
5
6
  // TODO more graceful DB migration (e.g. backup DB before destructive migrations)
6
7
  export const migrateDb = ({ db, otelContext, schema, }) => {
7
8
  db.execute(
@@ -9,7 +10,6 @@ export const migrateDb = ({ db, otelContext, schema, }) => {
9
10
  sql `create table if not exists ${SCHEMA_META_TABLE} (tableName text primary key, schemaHash text, updatedAt text);`, undefined, [], { otelContext });
10
11
  const schemaMetaRows = db.select(sql `SELECT * FROM ${SCHEMA_META_TABLE}`);
11
12
  const dbSchemaHashByTable = Object.fromEntries(schemaMetaRows.map(({ tableName, schemaHash }) => [tableName, schemaHash]));
12
- const getMemoizedTimestamp = memoize(() => new Date().toISOString());
13
13
  const tableDefs = {
14
14
  // NOTE it's important the `SCHEMA_META_TABLE` comes first since we're writing to it below
15
15
  [SCHEMA_META_TABLE]: systemTables[SCHEMA_META_TABLE],
@@ -21,21 +21,26 @@ export const migrateDb = ({ db, otelContext, schema, }) => {
21
21
  const schemaHash = SqliteAst.hash(tableDef);
22
22
  if (schemaHash !== dbSchemaHash) {
23
23
  console.log(`Schema hash mismatch for table '${tableName}' (DB: ${dbSchemaHash}, expected: ${schemaHash}), migrating table...`);
24
- const columnSpec = makeColumnSpec(tableDef);
25
- // TODO need to possibly handle cascading deletes due to foreign keys
26
- db.execute(sql `drop table if exists ${tableName}`, undefined, [], { otelContext });
27
- db.execute(sql `create table if not exists ${tableName} (${columnSpec});`, undefined, [], { otelContext });
28
- for (const index of tableDef.indexes) {
29
- db.execute(createIndexFromDefinition(tableName, index), undefined, [], { otelContext });
30
- }
31
- const updatedAt = getMemoizedTimestamp();
32
- db.execute(sql `
33
- INSERT INTO ${SCHEMA_META_TABLE} (tableName, schemaHash, updatedAt) VALUES ($tableName, $schemaHash, $updatedAt)
34
- ON CONFLICT (tableName) DO UPDATE SET schemaHash = $schemaHash, updatedAt = $updatedAt;
35
- `, { tableName, schemaHash, updatedAt }, [], { otelContext });
24
+ migrateTable({ db, tableDef, otelContext, schemaHash });
36
25
  }
37
26
  }
38
27
  };
28
+ export const migrateTable = ({ db, tableDef, otelContext, schemaHash, }) => {
29
+ console.log(`Migrating table '${tableDef.name}'...`);
30
+ const tableName = tableDef.name;
31
+ const columnSpec = makeColumnSpec(tableDef);
32
+ // TODO need to possibly handle cascading deletes due to foreign keys
33
+ db.execute(sql `drop table if exists ${tableName}`, undefined, [], { otelContext });
34
+ db.execute(sql `create table if not exists ${tableName} (${columnSpec});`, undefined, [], { otelContext });
35
+ for (const index of tableDef.indexes) {
36
+ db.execute(createIndexFromDefinition(tableName, index), undefined, [], { otelContext });
37
+ }
38
+ const updatedAt = getMemoizedTimestamp();
39
+ db.execute(sql `
40
+ INSERT INTO ${SCHEMA_META_TABLE} (tableName, schemaHash, updatedAt) VALUES ($tableName, $schemaHash, $updatedAt)
41
+ ON CONFLICT (tableName) DO UPDATE SET schemaHash = $schemaHash, updatedAt = $updatedAt;
42
+ `, { $tableName: tableName, $schemaHash: schemaHash, $updatedAt: updatedAt }, [], { otelContext });
43
+ };
39
44
  const createIndexFromDefinition = (tableName, index) => {
40
45
  const uniqueStr = index.unique ? 'UNIQUE' : '';
41
46
  return sql `create ${uniqueStr} index ${index.name} on ${tableName} (${index.columns.join(', ')})`;
@@ -1 +1 @@
1
- {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"migrations.js","sourceRoot":"","sources":["../src/migrations.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,5 @@
1
1
  import type * as otel from '@opentelemetry/api';
2
2
  import type { ReactElement, ReactNode } from 'react';
3
- import type { GlobalQueryDefs } from '../effect/LiveStore.js';
4
3
  import type { InMemoryDatabase } from '../inMemoryDatabase.js';
5
4
  import type { Schema } from '../schema.js';
6
5
  import type { StorageInit } from '../storage/index.js';
@@ -9,13 +8,12 @@ interface LiveStoreProviderProps<GraphQLContext> {
9
8
  schema: Schema;
10
9
  loadStorage: () => StorageInit | Promise<StorageInit>;
11
10
  boot?: (db: InMemoryDatabase, parentSpan: otel.Span) => unknown | Promise<unknown>;
12
- globalQueryDefs: GlobalQueryDefs;
13
11
  graphQLOptions?: GraphQLOptions<GraphQLContext>;
14
12
  otelTracer?: otel.Tracer;
15
13
  otelRootSpanContext?: otel.Context;
16
14
  fallback: ReactElement;
17
15
  }
18
- export declare const LiveStoreProvider: <GraphQLContext extends BaseGraphQLContext>({ fallback, globalQueryDefs, loadStorage, graphQLOptions, otelTracer, otelRootSpanContext, children, schema, boot, }: LiveStoreProviderProps<GraphQLContext> & {
16
+ export declare const LiveStoreProvider: <GraphQLContext extends BaseGraphQLContext>({ fallback, loadStorage, graphQLOptions, otelTracer, otelRootSpanContext, children, schema, boot, }: LiveStoreProviderProps<GraphQLContext> & {
19
17
  children?: ReactNode;
20
18
  }) => JSX.Element;
21
19
  export {};
@@ -1 +1 @@
1
- {"version":3,"file":"LiveStoreProvider.d.ts","sourceRoot":"","sources":["../../src/react/LiveStoreProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAIpD,OAAO,KAAK,EACV,eAAe,EAGhB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAIrE,UAAU,sBAAsB,CAAC,cAAc;IAC7C,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IACrD,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAClF,eAAe,EAAE,eAAe,CAAA;IAChC,cAAc,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAA;IAC/C,UAAU,CAAC,EAAE,IAAI,CAAC,MAAM,CAAA;IACxB,mBAAmB,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA;IAClC,QAAQ,EAAE,YAAY,CAAA;CACvB;AAED,eAAO,MAAM,iBAAiB;eAU2B,SAAS;MAAK,WAkBtE,CAAA"}
1
+ {"version":3,"file":"LiveStoreProvider.d.ts","sourceRoot":"","sources":["../../src/react/LiveStoreProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,IAAI,MAAM,oBAAoB,CAAA;AAC/C,OAAO,KAAK,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAMpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAA;AAC1C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,kBAAkB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAWrE,UAAU,sBAAsB,CAAC,cAAc;IAC7C,MAAM,EAAE,MAAM,CAAA;IACd,WAAW,EAAE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAA;IACrD,IAAI,CAAC,EAAE,CAAC,EAAE,EAAE,gBAAgB,EAAE,UAAU,EAAE,IAAI,CAAC,IAAI,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;IAClF,cAAc,CAAC,EAAE,cAAc,CAAC,cAAc,CAAC,CAAA;IAC/C,UAAU,CAAC,EAAE,IAAI,CAAC,MAAM,CAAA;IACxB,mBAAmB,CAAC,EAAE,IAAI,CAAC,OAAO,CAAA;IAClC,QAAQ,EAAE,YAAY,CAAA;CACvB;AAED,eAAO,MAAM,iBAAiB;eAS2B,SAAS;MAAK,WAiBtE,CAAA"}
@@ -1,11 +1,16 @@
1
- import { mapValues } from 'lodash-es';
2
1
  import React from 'react';
2
+ import initSqlite3Wasm from 'sqlite-esm';
3
3
  import { createStore } from '../store.js';
4
4
  import { LiveStoreContext } from './LiveStoreContext.js';
5
- export const LiveStoreProvider = ({ fallback, globalQueryDefs, loadStorage, graphQLOptions, otelTracer, otelRootSpanContext, children, schema, boot, }) => {
5
+ // NOTE we're starting to initialize the sqlite wasm binary here (already before calling `createStore`),
6
+ // so that it's ready when we need it
7
+ const sqlite3Promise = initSqlite3Wasm({
8
+ print: (message) => console.log(`[livestore sqlite] ${message}`),
9
+ printErr: (message) => console.error(`[livestore sqlite] ${message}`),
10
+ });
11
+ export const LiveStoreProvider = ({ fallback, loadStorage, graphQLOptions, otelTracer, otelRootSpanContext, children, schema, boot, }) => {
6
12
  const store = useCreateStore({
7
13
  schema,
8
- globalQueryDefs,
9
14
  loadStorage,
10
15
  graphQLOptions,
11
16
  otelTracer,
@@ -18,11 +23,12 @@ export const LiveStoreProvider = ({ fallback, globalQueryDefs, loadStorage, grap
18
23
  window.__debugLiveStore = store.store;
19
24
  return React.createElement(LiveStoreContext.Provider, { value: store }, children);
20
25
  };
21
- const useCreateStore = ({ schema, globalQueryDefs, loadStorage, graphQLOptions, otelTracer, otelRootSpanContext, boot, }) => {
26
+ const useCreateStore = ({ schema, loadStorage, graphQLOptions, otelTracer, otelRootSpanContext, boot, }) => {
22
27
  const [ctxValue, setCtxValue] = React.useState();
23
28
  React.useEffect(() => {
24
29
  void (async () => {
25
30
  try {
31
+ const sqlite3 = await sqlite3Promise;
26
32
  const store = await createStore({
27
33
  schema,
28
34
  loadStorage,
@@ -30,12 +36,9 @@ const useCreateStore = ({ schema, globalQueryDefs, loadStorage, graphQLOptions,
30
36
  otelTracer,
31
37
  otelRootSpanContext,
32
38
  boot,
39
+ sqlite3,
33
40
  });
34
- store.otel.tracer.startActiveSpan('LiveStore:makeGlobalQueries', {}, store.otel.queriesSpanContext, (span) => {
35
- const globalQueries = mapValues(globalQueryDefs, (queryDef) => queryDef(store));
36
- setCtxValue({ store, globalQueries });
37
- span.end();
38
- });
41
+ setCtxValue({ store });
39
42
  }
40
43
  catch (e) {
41
44
  console.error(`Error creating LiveStore store:`, e);
@@ -43,7 +46,7 @@ const useCreateStore = ({ schema, globalQueryDefs, loadStorage, graphQLOptions,
43
46
  }
44
47
  })();
45
48
  // TODO: do we need to return any cleanup function here?
46
- }, [schema, loadStorage, globalQueryDefs, graphQLOptions, otelTracer, otelRootSpanContext, boot]);
49
+ }, [schema, loadStorage, graphQLOptions, otelTracer, otelRootSpanContext, boot]);
47
50
  return ctxValue;
48
51
  };
49
52
  //# sourceMappingURL=LiveStoreProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"LiveStoreProvider.js","sourceRoot":"","sources":["../../src/react/LiveStoreProvider.tsx"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAA;AAErC,OAAO,KAAK,MAAM,OAAO,CAAA;AAYzB,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,eAAe,EACf,WAAW,EACX,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,QAAQ,EACR,MAAM,EACN,IAAI,GAC8D,EAAe,EAAE;IACnF,MAAM,KAAK,GAAG,cAAc,CAAC;QAC3B,MAAM;QACN,eAAe;QACf,WAAW;QACX,cAAc;QACd,UAAU;QACV,mBAAmB;QACnB,IAAI;KACL,CAAC,CAAA;IAEF,IAAI,KAAK,KAAK,SAAS,EAAE;QACvB,OAAO,QAAQ,CAAA;KAChB;IAED,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAA;IAErC,OAAO,oBAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,IAAG,QAAQ,CAA6B,CAAA;AACxF,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CAA4C,EACjE,MAAM,EACN,eAAe,EACf,WAAW,EACX,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,IAAI,GACwC,EAAE,EAAE;IAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,EAA6B,CAAA;IAE3E,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI;gBACF,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC;oBAC9B,MAAM;oBACN,WAAW;oBACX,cAAc;oBACd,UAAU;oBACV,mBAAmB;oBACnB,IAAI;iBACL,CAAC,CAAA;gBACF,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,6BAA6B,EAAE,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,IAAI,EAAE,EAAE;oBAC3G,MAAM,aAAa,GAAG,SAAS,CAAC,eAAe,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAA;oBAC/E,WAAW,CAAC,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAA;oBACrC,IAAI,CAAC,GAAG,EAAE,CAAA;gBACZ,CAAC,CAAC,CAAA;aACH;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAA;gBACnD,MAAM,CAAC,CAAA;aACR;QACH,CAAC,CAAC,EAAE,CAAA;QAEJ,wDAAwD;IAC1D,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,eAAe,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC,CAAA;IAEjG,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA"}
1
+ {"version":3,"file":"LiveStoreProvider.js","sourceRoot":"","sources":["../../src/react/LiveStoreProvider.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,MAAM,OAAO,CAAA;AACzB,OAAO,eAAe,MAAM,YAAY,CAAA;AAQxC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AACzC,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAExD,wGAAwG;AACxG,qCAAqC;AACrC,MAAM,cAAc,GAAG,eAAe,CAAC;IACrC,KAAK,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,sBAAsB,OAAO,EAAE,CAAC;IAChE,QAAQ,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,sBAAsB,OAAO,EAAE,CAAC;CACtE,CAAC,CAAA;AAYF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAA4C,EAC3E,QAAQ,EACR,WAAW,EACX,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,QAAQ,EACR,MAAM,EACN,IAAI,GAC8D,EAAe,EAAE;IACnF,MAAM,KAAK,GAAG,cAAc,CAAC;QAC3B,MAAM;QACN,WAAW;QACX,cAAc;QACd,UAAU;QACV,mBAAmB;QACnB,IAAI;KACL,CAAC,CAAA;IAEF,IAAI,KAAK,KAAK,SAAS,EAAE;QACvB,OAAO,QAAQ,CAAA;KAChB;IAED,MAAM,CAAC,gBAAgB,GAAG,KAAK,CAAC,KAAK,CAAA;IAErC,OAAO,oBAAC,gBAAgB,CAAC,QAAQ,IAAC,KAAK,EAAE,KAAK,IAAG,QAAQ,CAA6B,CAAA;AACxF,CAAC,CAAA;AAED,MAAM,cAAc,GAAG,CAA4C,EACjE,MAAM,EACN,WAAW,EACX,cAAc,EACd,UAAU,EACV,mBAAmB,EACnB,IAAI,GACwC,EAAE,EAAE;IAChD,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,EAA6B,CAAA;IAE3E,KAAK,CAAC,SAAS,CAAC,GAAG,EAAE;QACnB,KAAK,CAAC,KAAK,IAAI,EAAE;YACf,IAAI;gBACF,MAAM,OAAO,GAAG,MAAM,cAAc,CAAA;gBACpC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC;oBAC9B,MAAM;oBACN,WAAW;oBACX,cAAc;oBACd,UAAU;oBACV,mBAAmB;oBACnB,IAAI;oBACJ,OAAO;iBACR,CAAC,CAAA;gBACF,WAAW,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;aACvB;YAAC,OAAO,CAAC,EAAE;gBACV,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,CAAC,CAAC,CAAA;gBACnD,MAAM,CAAC,CAAA;aACR;QACH,CAAC,CAAC,EAAE,CAAA;QAEJ,wDAAwD;IAC1D,CAAC,EAAE,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,EAAE,UAAU,EAAE,mBAAmB,EAAE,IAAI,CAAC,CAAC,CAAA;IAEhF,OAAO,QAAQ,CAAA;AACjB,CAAC,CAAA"}
@@ -1,8 +1,8 @@
1
- export type { UseLiveStoreComponentProps as LiveStoreComponentConfig, ReactiveGraphQL, ReactiveSQL, Setters, ComponentKeyConfig, QueryResults, QueryDefinitions, ComponentColumns, GetStateType, GetStateTypeEncoded, } from './useLiveStoreComponent.js';
1
+ export type { Setters, ComponentKeyConfig, QueryDefinitions, ComponentColumns, GetStateType, GetStateTypeEncoded, } from './useComponentState.js';
2
2
  export { LiveStoreContext, useStore } from './LiveStoreContext.js';
3
3
  export { LiveStoreProvider } from './LiveStoreProvider.js';
4
- export { useLiveStoreComponent } from './useLiveStoreComponent.js';
5
- export { useGraphQL } from './useGraphQL.js';
6
- export { useGlobalQuery } from './useGlobalQuery.js';
4
+ export { useComponentState } from './useComponentState.js';
5
+ export { useQuery } from './useQuery.js';
6
+ export { useTemporaryQuery } from './useTemporaryQuery.js';
7
7
  export type { TypedDocumentNode } from '@graphql-typed-document-node/core';
8
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,0BAA0B,IAAI,wBAAwB,EACtD,eAAe,EACf,WAAW,EACX,OAAO,EACP,kBAAkB,EAClB,YAAY,EACZ,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,GACpB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA;AAGpD,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,OAAO,EACP,kBAAkB,EAClB,gBAAgB,EAChB,gBAAgB,EAChB,YAAY,EACZ,mBAAmB,GACpB,MAAM,wBAAwB,CAAA;AAC/B,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAG1D,YAAY,EAAE,iBAAiB,EAAE,MAAM,mCAAmC,CAAA"}
@@ -1,6 +1,6 @@
1
1
  export { LiveStoreContext, useStore } from './LiveStoreContext.js';
2
2
  export { LiveStoreProvider } from './LiveStoreProvider.js';
3
- export { useLiveStoreComponent } from './useLiveStoreComponent.js';
4
- export { useGraphQL } from './useGraphQL.js';
5
- export { useGlobalQuery } from './useGlobalQuery.js';
3
+ export { useComponentState } from './useComponentState.js';
4
+ export { useQuery } from './useQuery.js';
5
+ export { useTemporaryQuery } from './useTemporaryQuery.js';
6
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAA;AAClE,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAC5C,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAClE,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC1D,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACxC,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA"}
@@ -0,0 +1,50 @@
1
+ import type { LiteralUnion } from '@livestore/utils';
2
+ import { SqliteDsl } from 'effect-db-schema';
3
+ import type { DependencyList } from 'react';
4
+ import React from 'react';
5
+ import type { ComponentKey } from '../componentKey.js';
6
+ import { LiveStoreJSQuery } from '../reactiveQueries/js.js';
7
+ import type { LiveStoreQuery } from '../store.js';
8
+ export interface QueryDefinitions {
9
+ [queryName: string]: LiveStoreQuery;
10
+ }
11
+ export type UseComponentStateProps<TStateColumns extends ComponentColumns> = {
12
+ schema?: SqliteDsl.TableDefinition<string, TStateColumns>;
13
+ reactDeps?: React.DependencyList;
14
+ componentKey: ComponentKeyConfig;
15
+ };
16
+ export type ComponentKeyConfig = {
17
+ /**
18
+ * Name of the Component
19
+ *
20
+ * TODO we should eventually derive this info automatically from the component (TBD how though...)
21
+ */
22
+ name: string;
23
+ id: LiteralUnion<'singleton' | '__ephemeral__', string>;
24
+ };
25
+ export interface ComponentColumns extends SqliteDsl.Columns {
26
+ id: SqliteDsl.ColumnDefinition<SqliteDsl.FieldType.FieldTypeText<string, string>, false>;
27
+ }
28
+ type UseLiveStoreJsonState<TState> = <TResult>(jsonStringKey: keyof TState, parse?: (_: unknown) => TResult) => [value: TResult, setValue: (newVal: TResult | ((prevVal: TResult) => TResult)) => void];
29
+ export type GetStateType<TTableDef extends SqliteDsl.TableDefinition<any, any>> = SqliteDsl.FromColumns.RowDecoded<TTableDef['columns']>;
30
+ export type GetStateTypeEncoded<TTableDef extends SqliteDsl.TableDefinition<any, any>> = SqliteDsl.FromColumns.RowEncoded<TTableDef['columns']>;
31
+ /**
32
+ * Create reactive queries within a component.
33
+ * @param config.queries A function that returns a map of named reactive queries.
34
+ * @param config.componentKey A function that returns a unique key for this component.
35
+ * @param config.reactDeps A list of React-level dependencies that will refresh the queries.
36
+ */
37
+ export declare const useComponentState: <TStateColumns extends ComponentColumns>({ schema: stateSchema_, componentKey: componentKeyConfig, reactDeps, }: UseComponentStateProps<TStateColumns>) => {
38
+ state$: LiveStoreJSQuery<import("effect-db-schema").PrettifyFlat<import("effect-db-schema").Nullable<Pick<SqliteDsl.FromColumns.RowDecodedAll<TStateColumns>, keyof { [K in keyof TStateColumns as TStateColumns[K] extends SqliteDsl.ColumnDefinition<any, true> ? K : never]: {}; }>> & Omit<SqliteDsl.FromColumns.RowDecodedAll<TStateColumns>, keyof { [K in keyof TStateColumns as TStateColumns[K] extends SqliteDsl.ColumnDefinition<any, true> ? K : never]: {}; }>>>;
39
+ state: import("effect-db-schema").PrettifyFlat<import("effect-db-schema").Nullable<Pick<SqliteDsl.FromColumns.RowDecodedAll<TStateColumns>, keyof { [K in keyof TStateColumns as TStateColumns[K] extends SqliteDsl.ColumnDefinition<any, true> ? K : never]: {}; }>> & Omit<SqliteDsl.FromColumns.RowDecodedAll<TStateColumns>, keyof { [K in keyof TStateColumns as TStateColumns[K] extends SqliteDsl.ColumnDefinition<any, true> ? K : never]: {}; }>>;
40
+ setState: Setters<import("effect-db-schema").PrettifyFlat<import("effect-db-schema").Nullable<Pick<SqliteDsl.FromColumns.RowDecodedAll<TStateColumns>, keyof { [K in keyof TStateColumns as TStateColumns[K] extends SqliteDsl.ColumnDefinition<any, true> ? K : never]: {}; }>> & Omit<SqliteDsl.FromColumns.RowDecodedAll<TStateColumns>, keyof { [K in keyof TStateColumns as TStateColumns[K] extends SqliteDsl.ColumnDefinition<any, true> ? K : never]: {}; }>>>;
41
+ useLiveStoreJsonState: UseLiveStoreJsonState<import("effect-db-schema").PrettifyFlat<import("effect-db-schema").Nullable<Pick<SqliteDsl.FromColumns.RowDecodedAll<TStateColumns>, keyof { [K in keyof TStateColumns as TStateColumns[K] extends SqliteDsl.ColumnDefinition<any, true> ? K : never]: {}; }>> & Omit<SqliteDsl.FromColumns.RowDecodedAll<TStateColumns>, keyof { [K in keyof TStateColumns as TStateColumns[K] extends SqliteDsl.ColumnDefinition<any, true> ? K : never]: {}; }>>>;
42
+ };
43
+ export type Setters<TComponentState> = {
44
+ [k in keyof TComponentState]: (newValue: TComponentState[k]) => void;
45
+ } & {
46
+ setMany: (newValues: Partial<TComponentState>) => void;
47
+ };
48
+ export declare const useComponentKey: ({ name, id }: ComponentKeyConfig, deps?: DependencyList) => ComponentKey;
49
+ export {};
50
+ //# sourceMappingURL=useComponentState.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useComponentState.d.ts","sourceRoot":"","sources":["../../src/react/useComponentState.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAIpD,OAAO,EAAa,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,OAAO,CAAA;AAC3C,OAAO,KAAK,MAAM,OAAO,CAAA;AAGzB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAA;AAGtD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAA;AAG3D,OAAO,KAAK,EAAsB,cAAc,EAAS,MAAM,aAAa,CAAA;AAM5E,MAAM,WAAW,gBAAgB;IAC/B,CAAC,SAAS,EAAE,MAAM,GAAG,cAAc,CAAA;CACpC;AAED,MAAM,MAAM,sBAAsB,CAAC,aAAa,SAAS,gBAAgB,IAAI;IAC3E,MAAM,CAAC,EAAE,SAAS,CAAC,eAAe,CAAC,MAAM,EAAE,aAAa,CAAC,CAAA;IACzD,SAAS,CAAC,EAAE,KAAK,CAAC,cAAc,CAAA;IAChC,YAAY,EAAE,kBAAkB,CAAA;CACjC,CAAA;AAED,MAAM,MAAM,kBAAkB,GAAG;IAC/B;;;;OAIG;IACH,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,YAAY,CAAC,WAAW,GAAG,eAAe,EAAE,MAAM,CAAC,CAAA;CACxD,CAAA;AAGD,MAAM,WAAW,gBAAiB,SAAQ,SAAS,CAAC,OAAO;IACzD,EAAE,EAAE,SAAS,CAAC,gBAAgB,CAAC,SAAS,CAAC,SAAS,CAAC,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,CAAC,CAAA;CACzF;AAeD,KAAK,qBAAqB,CAAC,MAAM,IAAI,CAAC,OAAO,EAC3C,aAAa,EAAE,MAAM,MAAM,EAC3B,KAAK,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,OAAO,KAC5B,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,MAAM,EAAE,OAAO,GAAG,CAAC,CAAC,OAAO,EAAE,OAAO,KAAK,OAAO,CAAC,KAAK,IAAI,CAAC,CAAA;AAE5F,MAAM,MAAM,YAAY,CAAC,SAAS,SAAS,SAAS,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,SAAS,CAAC,WAAW,CAAC,UAAU,CAChH,SAAS,CAAC,SAAS,CAAC,CACrB,CAAA;AAED,MAAM,MAAM,mBAAmB,CAAC,SAAS,SAAS,SAAS,CAAC,eAAe,CAAC,GAAG,EAAE,GAAG,CAAC,IACnF,SAAS,CAAC,WAAW,CAAC,UAAU,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC,CAAA;AAExD;;;;;GAKG;AACH,eAAO,MAAM,iBAAiB;;;;;CA6Q7B,CAAA;AAED,MAAM,MAAM,OAAO,CAAC,eAAe,IAAI;KACpC,CAAC,IAAI,MAAM,eAAe,GAAG,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC,CAAC,KAAK,IAAI;CACrE,GAAG;IACF,OAAO,EAAE,CAAC,SAAS,EAAE,OAAO,CAAC,eAAe,CAAC,KAAK,IAAI,CAAA;CACvD,CAAA;AAED,eAAO,MAAM,eAAe,iBAAkB,kBAAkB,wCAcvC,CAAA"}
@@ -0,0 +1,248 @@
1
+ import { omit, shouldNeverHappen } from '@livestore/utils';
2
+ import { Schema } from '@livestore/utils/effect';
3
+ import * as otel from '@opentelemetry/api';
4
+ import { SqliteAst, SqliteDsl } from 'effect-db-schema';
5
+ import { isEqual, mapValues } from 'lodash-es';
6
+ import React from 'react';
7
+ import { v4 as uuid } from 'uuid';
8
+ import { labelForKey, tableNameForComponentKey } from '../componentKey.js';
9
+ import { migrateTable } from '../migrations.js';
10
+ import { LiveStoreJSQuery } from '../reactiveQueries/js.js';
11
+ import { LiveStoreSQLQuery } from '../reactiveQueries/sql.js';
12
+ import { SCHEMA_META_TABLE } from '../schema.js';
13
+ import { sql } from '../util.js';
14
+ import { useStore } from './LiveStoreContext.js';
15
+ import { extractStackInfoFromStackTrace, originalStackLimit } from './utils/extractStackInfoFromStackTrace.js';
16
+ import { useStateRefWithReactiveInput } from './utils/useStateRefWithReactiveInput.js';
17
+ // type ComponentState = {
18
+ // /** Equivalent to `componentKey.key` */
19
+ // id: string
20
+ // [key: string]: string | number | boolean | null
21
+ // }
22
+ /**
23
+ * This is needed because the `React.useMemo` call below, can sometimes be called multiple times 🤷,
24
+ * so we need to "cache" the fact that we've already started a span for this component.
25
+ * The map entry is being removed again in the `React.useEffect` call below.
26
+ */
27
+ const spanAlreadyStartedCache = new Map();
28
+ /**
29
+ * Create reactive queries within a component.
30
+ * @param config.queries A function that returns a map of named reactive queries.
31
+ * @param config.componentKey A function that returns a unique key for this component.
32
+ * @param config.reactDeps A list of React-level dependencies that will refresh the queries.
33
+ */
34
+ export const useComponentState = ({ schema: stateSchema_, componentKey: componentKeyConfig, reactDeps = [], }) => {
35
+ // TODO validate schema to make sure each column has a default value
36
+ // TODO we should clean up the state schema handling to remove this special handling for the `id` column
37
+ const stateSchema = React.useMemo(() => (stateSchema_ ? { ...stateSchema_, columns: omit(stateSchema_.columns, 'id') } : undefined), [stateSchema_]);
38
+ const componentKey = useComponentKey(componentKeyConfig, reactDeps);
39
+ const { store } = useStore();
40
+ const componentKeyLabel = React.useMemo(() => labelForKey(componentKey), [componentKey]);
41
+ // The following `React.useMemo` and `React.useEffect` calls are used to start and end a span for the lifetime of this component.
42
+ const { span, otelContext } = React.useMemo(() => {
43
+ const existingSpan = spanAlreadyStartedCache.get(componentKeyLabel);
44
+ if (existingSpan !== undefined)
45
+ return existingSpan;
46
+ const span = store.otel.tracer.startSpan(`LiveStore:useComponentState:${componentKeyLabel}`, {}, store.otel.queriesSpanContext);
47
+ const otelContext = otel.trace.setSpan(otel.context.active(), span);
48
+ spanAlreadyStartedCache.set(componentKeyLabel, { span, otelContext });
49
+ return { span, otelContext };
50
+ }, [componentKeyLabel, store.otel.queriesSpanContext, store.otel.tracer]);
51
+ React.useEffect(() => () => {
52
+ spanAlreadyStartedCache.delete(componentKeyLabel);
53
+ span.end();
54
+ }, [componentKeyLabel, span]);
55
+ const defaultComponentState = React.useMemo(() => {
56
+ const defaultState = (stateSchema === undefined ? {} : mapValues(stateSchema.columns, (c) => c.default));
57
+ // @ts-expect-error TODO fix typing
58
+ defaultState.id = componentKeyConfig.id;
59
+ return defaultState;
60
+ }, [componentKeyConfig.id, stateSchema]);
61
+ const componentStateEffectSchema = React.useMemo(() => (stateSchema ? SqliteDsl.structSchemaForTable(stateSchema) : Schema.any), [stateSchema]);
62
+ const state$ = React.useMemo(() => {
63
+ console.log('useComponentState make state$', labelForKey(componentKey));
64
+ // create state query
65
+ if (stateSchema === undefined) {
66
+ // TODO don't set up a query if there's no state schema (keeps the graph more clean)
67
+ return new LiveStoreJSQuery({
68
+ fn: () => ({}),
69
+ label: 'empty-component-state',
70
+ // otelContext,
71
+ // otelTracer: store.otel.tracer,
72
+ });
73
+ }
74
+ else {
75
+ const componentTableName = tableNameForComponentKey(componentKey);
76
+ const whereClause = componentKey._tag === 'singleton' ? '' : `where id = '${componentKey.id}'`;
77
+ // TODO find a better solution for this
78
+ if (store.tableRefs[componentTableName] === undefined) {
79
+ const schemaHash = SqliteAst.hash(stateSchema.ast);
80
+ const res = store.inMemoryDB.select(sql `SELECT schemaHash FROM ${SCHEMA_META_TABLE} WHERE tableName = '${componentTableName}'`);
81
+ if (res.length === 0 || res[0].schemaHash !== schemaHash) {
82
+ migrateTable({ db: store._proxyDb, tableDef: stateSchema.ast, otelContext, schemaHash });
83
+ }
84
+ store.tableRefs[componentTableName] = store.graph.makeRef(null, {
85
+ equal: () => false,
86
+ label: componentTableName,
87
+ meta: { liveStoreRefType: 'table' },
88
+ });
89
+ }
90
+ return (new LiveStoreSQLQuery({
91
+ label: `localState:query:${componentKeyLabel}`,
92
+ genQueryString: () => sql `select * from ${componentTableName} ${whereClause} limit 1`,
93
+ queriedTables: [componentTableName],
94
+ })
95
+ // TODO consider to instead of just returning the default value, to write the default component state to the DB
96
+ .pipe((results) => results.length === 1 ? Schema.parseSync(componentStateEffectSchema)(results[0]) : defaultComponentState));
97
+ }
98
+ }, [
99
+ componentKey,
100
+ componentKeyLabel,
101
+ componentStateEffectSchema,
102
+ defaultComponentState,
103
+ otelContext,
104
+ stateSchema,
105
+ store,
106
+ ]);
107
+ // Step 1:
108
+ // Synchronously create state and queries for initial render pass.
109
+ const initialComponentState = React.useMemo(() => state$.run(otelContext), [otelContext, state$]);
110
+ // Now that we've computed the initial state synchronously,
111
+ // we can set up our useState calls w/ a default value populated...
112
+ const [componentStateRef, setComponentState_] = useStateRefWithReactiveInput(initialComponentState);
113
+ const setState = (stateSchema === undefined
114
+ ? {}
115
+ : // TODO: do we have a better type for the values that can go in SQLite?
116
+ mapValues(stateSchema.columns, (column, columnName) => (value) => {
117
+ // Don't update the state if it's the same as the value already seen in the component
118
+ // @ts-expect-error TODO fix typing
119
+ if (componentStateRef.current[columnName] === value)
120
+ return;
121
+ const encodedValue = Schema.encodeSync(column.type.codec)(value);
122
+ if (['componentKey', 'columnNames'].includes(columnName)) {
123
+ shouldNeverHappen(`Can't use reserved column name ${columnName}`);
124
+ }
125
+ return store.applyEvent('updateComponentState', {
126
+ componentKey,
127
+ columnNames: [columnName],
128
+ [columnName]: encodedValue,
129
+ });
130
+ }));
131
+ setState.setMany = (columnValues) => {
132
+ // TODO use hashing instead
133
+ // Don't update the state if it's the same as the value already seen in the component
134
+ // @ts-expect-error TODO fix typing
135
+ if (Object.entries(columnValues).every(([columnName, value]) => componentStateRef.current[columnName] === value)) {
136
+ return;
137
+ }
138
+ const columnNames = Object.keys(columnValues);
139
+ return store.applyEvent('updateComponentState', { componentKey, columnNames, ...columnValues });
140
+ };
141
+ const subscriptionInfo = React.useMemo(() => {
142
+ Error.stackTraceLimit = 10;
143
+ // eslint-disable-next-line unicorn/error-message
144
+ const stack = new Error().stack;
145
+ Error.stackTraceLimit = originalStackLimit;
146
+ return { stack: extractStackInfoFromStackTrace(stack) };
147
+ }, []);
148
+ // OK, now all the synchronous work is done;
149
+ // time to set up our long-running queries in an effect
150
+ React.useEffect(() => {
151
+ return store.otel.tracer.startActiveSpan('LiveStore:useComponentState:long-running', { attributes: {} }, otelContext, (span) => {
152
+ const unsubs = [];
153
+ if (stateSchema !== undefined) {
154
+ insertRowForComponentInstance({ store, componentKey, stateSchema });
155
+ }
156
+ state$.activeSubscriptions.add(subscriptionInfo);
157
+ unsubs.push(store.subscribe(state$, (results) => {
158
+ if (isEqual(results, componentStateRef.current) === false) {
159
+ setComponentState_(results);
160
+ }
161
+ }, undefined, { label: `useComponentState:localState:subscribe:${state$.label}` }), () => state$.activeSubscriptions.delete(subscriptionInfo));
162
+ return () => {
163
+ for (const unsub of unsubs) {
164
+ unsub();
165
+ }
166
+ span.end();
167
+ };
168
+ });
169
+ // NOTE excluding `setComponentState_` and `setQueryResults_` from the deps array as it seems to cause an infinite loop
170
+ // This should probably be improved
171
+ // TODO is this still true?
172
+ // // eslint-disable-next-line react-hooks/exhaustive-deps
173
+ }, [
174
+ store,
175
+ subscriptionInfo,
176
+ stateSchema,
177
+ defaultComponentState,
178
+ otelContext,
179
+ componentStateRef,
180
+ state$,
181
+ setComponentState_,
182
+ componentKey,
183
+ ]);
184
+ // Very important: remove any queries / other resources associated w/ this component
185
+ React.useEffect(() => () => {
186
+ console.log('useComponentState destroy', labelForKey(componentKey));
187
+ return state$.destroy();
188
+ }, [state$]);
189
+ const state = componentStateRef.current;
190
+ const useLiveStoreJsonState = (jsonStringKey, parse = (_) => _) => {
191
+ const value = React.useMemo(() => {
192
+ return parse(JSON.parse(state[jsonStringKey]));
193
+ // eslint-disable-next-line react-hooks/exhaustive-deps
194
+ }, [state[jsonStringKey], parse]);
195
+ const setValue = React.useCallback((newValOrFn) => {
196
+ const newVal = typeof newValOrFn === 'function'
197
+ ? // NOTE we're using the ref instead of the value because we want to be sure
198
+ // we're using the latest value when the setter is called
199
+ newValOrFn(parse(JSON.parse(componentStateRef.current[jsonStringKey])))
200
+ : newValOrFn;
201
+ setState[jsonStringKey](JSON.stringify(newVal));
202
+ }, [parse, jsonStringKey]);
203
+ return [value, setValue];
204
+ };
205
+ return {
206
+ state$,
207
+ state,
208
+ setState,
209
+ useLiveStoreJsonState,
210
+ };
211
+ };
212
+ export const useComponentKey = ({ name, id }, deps = []) => React.useMemo(() => {
213
+ switch (id) {
214
+ case 'singleton': {
215
+ return { _tag: 'singleton', componentName: name, id: 'singleton' };
216
+ }
217
+ case '__ephemeral__': {
218
+ return { _tag: 'ephemeral', componentName: name, id: uuid() };
219
+ }
220
+ default: {
221
+ return { _tag: 'custom', componentName: name, id };
222
+ }
223
+ }
224
+ // eslint-disable-next-line react-hooks/exhaustive-deps
225
+ }, [...deps, id, name]);
226
+ /**
227
+ * Create a row storing the state for a component instance, if none exists yet.
228
+ * Initialized with default values, and keyed on the component key.
229
+ */
230
+ const insertRowForComponentInstance = ({ store, componentKey, stateSchema, }) => {
231
+ const columnNames = ['id', ...Object.keys(stateSchema.columns)];
232
+ const columnValues = columnNames.map((name) => `$${name}`).join(', ');
233
+ const tableName = tableNameForComponentKey(componentKey);
234
+ const insertQuery = sql `insert into ${tableName} (${columnNames.join(', ')}) select ${columnValues} where not exists(select 1 from ${tableName} where id = '${componentKey.id}')`;
235
+ void store.execute(insertQuery, {
236
+ ...mapValues(stateSchema.columns, (column) => prepareValueForSql(column.default ?? null)),
237
+ id: componentKey.id,
238
+ }, [tableName]);
239
+ };
240
+ const prepareValueForSql = (value) => {
241
+ if (typeof value === 'string' || typeof value === 'number' || value === null) {
242
+ return value;
243
+ }
244
+ else {
245
+ return value ? 1 : 0;
246
+ }
247
+ };
248
+ //# sourceMappingURL=useComponentState.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useComponentState.js","sourceRoot":"","sources":["../../src/react/useComponentState.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- import type { LiveStoreQuery, QueryResult } from '../store.js';
2
- export declare const useGlobalQuery: <Q extends LiveStoreQuery>(query: Q) => QueryResult<Q>;
1
+ import type { LiveStoreQuery, QueryResult, Store } from '../store.js';
2
+ export declare const useGlobalQuery: <Q extends LiveStoreQuery>(queryDef: (store: Store<any>) => Q) => QueryResult<Q>;
3
3
  //# sourceMappingURL=useGlobalQuery.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"useGlobalQuery.d.ts","sourceRoot":"","sources":["../../src/react/useGlobalQuery.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,aAAa,CAAA;AAE9D,eAAO,MAAM,cAAc,wDA+B1B,CAAA"}
1
+ {"version":3,"file":"useGlobalQuery.d.ts","sourceRoot":"","sources":["../../src/react/useGlobalQuery.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AAGrE,eAAO,MAAM,cAAc,+CAAgD,MAAM,GAAG,CAAC,yBAiCpF,CAAA"}