@livestore/common 0.3.1 → 0.3.2-dev.1

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 (323) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/ClientSessionLeaderThreadProxy.d.ts +35 -0
  3. package/dist/ClientSessionLeaderThreadProxy.d.ts.map +1 -0
  4. package/dist/ClientSessionLeaderThreadProxy.js +6 -0
  5. package/dist/ClientSessionLeaderThreadProxy.js.map +1 -0
  6. package/dist/__tests__/fixture.d.ts +4 -4
  7. package/dist/__tests__/fixture.js +2 -2
  8. package/dist/adapter-types.d.ts +11 -162
  9. package/dist/adapter-types.d.ts.map +1 -1
  10. package/dist/adapter-types.js +5 -49
  11. package/dist/adapter-types.js.map +1 -1
  12. package/dist/debug-info.d.ts +2 -2
  13. package/dist/debug-info.js +2 -2
  14. package/dist/defs.d.ts +20 -0
  15. package/dist/defs.d.ts.map +1 -0
  16. package/dist/defs.js +12 -0
  17. package/dist/defs.js.map +1 -0
  18. package/dist/devtools/devtools-messages-client-session.d.ts +29 -27
  19. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -1
  20. package/dist/devtools/devtools-messages-client-session.js +4 -4
  21. package/dist/devtools/devtools-messages-common.d.ts +6 -6
  22. package/dist/devtools/devtools-messages-common.d.ts.map +1 -1
  23. package/dist/devtools/devtools-messages-common.js +1 -1
  24. package/dist/devtools/devtools-messages-leader.d.ts +37 -35
  25. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -1
  26. package/dist/devtools/devtools-messages-leader.js +4 -4
  27. package/dist/devtools/devtools-messages.d.ts +3 -3
  28. package/dist/devtools/devtools-messages.d.ts.map +1 -1
  29. package/dist/devtools/devtools-messages.js +3 -3
  30. package/dist/devtools/devtools-messages.js.map +1 -1
  31. package/dist/devtools/mod.d.ts +3 -3
  32. package/dist/devtools/mod.js +3 -3
  33. package/dist/errors.d.ts +50 -0
  34. package/dist/errors.d.ts.map +1 -0
  35. package/dist/errors.js +36 -0
  36. package/dist/errors.js.map +1 -0
  37. package/dist/index.d.ts +16 -16
  38. package/dist/index.d.ts.map +1 -1
  39. package/dist/index.js +16 -16
  40. package/dist/index.js.map +1 -1
  41. package/dist/leader-thread/LeaderSyncProcessor.d.ts +10 -11
  42. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -1
  43. package/dist/leader-thread/LeaderSyncProcessor.js +122 -132
  44. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -1
  45. package/dist/leader-thread/connection.d.ts +4 -4
  46. package/dist/leader-thread/connection.js +2 -2
  47. package/dist/leader-thread/eventlog.d.ts +21 -10
  48. package/dist/leader-thread/eventlog.d.ts.map +1 -1
  49. package/dist/leader-thread/eventlog.js +39 -24
  50. package/dist/leader-thread/eventlog.js.map +1 -1
  51. package/dist/leader-thread/leader-worker-devtools.d.ts +3 -3
  52. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  53. package/dist/leader-thread/leader-worker-devtools.js +4 -5
  54. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  55. package/dist/leader-thread/make-leader-thread-layer.d.ts +7 -7
  56. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  57. package/dist/leader-thread/make-leader-thread-layer.js +44 -14
  58. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  59. package/dist/leader-thread/materialize-event.d.ts +4 -4
  60. package/dist/leader-thread/materialize-event.d.ts.map +1 -1
  61. package/dist/leader-thread/materialize-event.js +14 -8
  62. package/dist/leader-thread/materialize-event.js.map +1 -1
  63. package/dist/leader-thread/mod.d.ts +8 -7
  64. package/dist/leader-thread/mod.d.ts.map +1 -1
  65. package/dist/leader-thread/mod.js +8 -7
  66. package/dist/leader-thread/mod.js.map +1 -1
  67. package/dist/leader-thread/recreate-db.d.ts +14 -7
  68. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  69. package/dist/leader-thread/recreate-db.js +3 -5
  70. package/dist/leader-thread/recreate-db.js.map +1 -1
  71. package/dist/leader-thread/shutdown-channel.d.ts +1 -1
  72. package/dist/leader-thread/shutdown-channel.js +1 -1
  73. package/dist/leader-thread/types.d.ts +8 -10
  74. package/dist/leader-thread/types.d.ts.map +1 -1
  75. package/dist/make-client-session.d.ts +3 -3
  76. package/dist/make-client-session.d.ts.map +1 -1
  77. package/dist/make-client-session.js +3 -3
  78. package/dist/make-client-session.js.map +1 -1
  79. package/dist/materializer-helper.d.ts +5 -5
  80. package/dist/materializer-helper.js +5 -5
  81. package/dist/rematerialize-from-eventlog.d.ts +4 -4
  82. package/dist/rematerialize-from-eventlog.d.ts.map +1 -1
  83. package/dist/rematerialize-from-eventlog.js +13 -5
  84. package/dist/rematerialize-from-eventlog.js.map +1 -1
  85. package/dist/schema/EventDef.d.ts +5 -5
  86. package/dist/schema/EventDef.d.ts.map +1 -1
  87. package/dist/schema/EventDef.js +2 -2
  88. package/dist/schema/EventDef.js.map +1 -1
  89. package/dist/schema/EventSequenceNumber.d.ts +20 -2
  90. package/dist/schema/EventSequenceNumber.d.ts.map +1 -1
  91. package/dist/schema/EventSequenceNumber.js +71 -19
  92. package/dist/schema/EventSequenceNumber.js.map +1 -1
  93. package/dist/schema/EventSequenceNumber.test.js +89 -4
  94. package/dist/schema/EventSequenceNumber.test.js.map +1 -1
  95. package/dist/schema/LiveStoreEvent.d.ts +26 -12
  96. package/dist/schema/LiveStoreEvent.d.ts.map +1 -1
  97. package/dist/schema/LiveStoreEvent.js +13 -5
  98. package/dist/schema/LiveStoreEvent.js.map +1 -1
  99. package/dist/schema/events.d.ts +1 -1
  100. package/dist/schema/events.d.ts.map +1 -1
  101. package/dist/schema/events.js +1 -1
  102. package/dist/schema/events.js.map +1 -1
  103. package/dist/schema/mod.d.ts +9 -9
  104. package/dist/schema/mod.d.ts.map +1 -1
  105. package/dist/schema/mod.js +9 -9
  106. package/dist/schema/mod.js.map +1 -1
  107. package/dist/schema/schema.d.ts +4 -4
  108. package/dist/schema/schema.js +3 -3
  109. package/dist/schema/state/mod.d.ts +2 -2
  110. package/dist/schema/state/mod.js +2 -2
  111. package/dist/schema/state/sqlite/client-document-def.d.ts +5 -5
  112. package/dist/schema/state/sqlite/client-document-def.d.ts.map +1 -1
  113. package/dist/schema/state/sqlite/client-document-def.js +6 -6
  114. package/dist/schema/state/sqlite/client-document-def.js.map +1 -1
  115. package/dist/schema/state/sqlite/client-document-def.test.js +4 -6
  116. package/dist/schema/state/sqlite/client-document-def.test.js.map +1 -1
  117. package/dist/schema/state/sqlite/db-schema/ast/sqlite.js +1 -1
  118. package/dist/schema/state/sqlite/db-schema/ast/validate.d.ts +1 -1
  119. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js +2 -2
  120. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.js.map +1 -1
  121. package/dist/schema/state/sqlite/db-schema/dsl/field-defs.test.js +1 -1
  122. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts +3 -3
  123. package/dist/schema/state/sqlite/db-schema/dsl/mod.d.ts.map +1 -1
  124. package/dist/schema/state/sqlite/db-schema/dsl/mod.js +1 -1
  125. package/dist/schema/state/sqlite/db-schema/dsl/mod.js.map +1 -1
  126. package/dist/schema/state/sqlite/db-schema/hash.d.ts.map +1 -1
  127. package/dist/schema/state/sqlite/db-schema/hash.js +3 -2
  128. package/dist/schema/state/sqlite/db-schema/hash.js.map +1 -1
  129. package/dist/schema/state/sqlite/db-schema/mod.d.ts +2 -2
  130. package/dist/schema/state/sqlite/db-schema/mod.d.ts.map +1 -1
  131. package/dist/schema/state/sqlite/db-schema/mod.js +2 -2
  132. package/dist/schema/state/sqlite/db-schema/mod.js.map +1 -1
  133. package/dist/schema/state/sqlite/mod.d.ts +7 -7
  134. package/dist/schema/state/sqlite/mod.d.ts.map +1 -1
  135. package/dist/schema/state/sqlite/mod.js +7 -7
  136. package/dist/schema/state/sqlite/mod.js.map +1 -1
  137. package/dist/schema/state/sqlite/query-builder/api.d.ts +40 -13
  138. package/dist/schema/state/sqlite/query-builder/api.d.ts.map +1 -1
  139. package/dist/schema/state/sqlite/query-builder/api.js.map +1 -1
  140. package/dist/schema/state/sqlite/query-builder/astToSql.d.ts +2 -2
  141. package/dist/schema/state/sqlite/query-builder/astToSql.js +1 -1
  142. package/dist/schema/state/sqlite/query-builder/impl.d.ts +2 -2
  143. package/dist/schema/state/sqlite/query-builder/impl.d.ts.map +1 -1
  144. package/dist/schema/state/sqlite/query-builder/impl.js +20 -25
  145. package/dist/schema/state/sqlite/query-builder/impl.js.map +1 -1
  146. package/dist/schema/state/sqlite/query-builder/impl.test.d.ts +1 -81
  147. package/dist/schema/state/sqlite/query-builder/impl.test.d.ts.map +1 -1
  148. package/dist/schema/state/sqlite/query-builder/impl.test.js +36 -22
  149. package/dist/schema/state/sqlite/query-builder/impl.test.js.map +1 -1
  150. package/dist/schema/state/sqlite/query-builder/mod.d.ts +2 -2
  151. package/dist/schema/state/sqlite/query-builder/mod.js +2 -2
  152. package/dist/schema/state/sqlite/schema-helpers.d.ts +1 -1
  153. package/dist/schema/state/sqlite/schema-helpers.js +1 -1
  154. package/dist/schema/state/sqlite/system-tables.d.ts +72 -67
  155. package/dist/schema/state/sqlite/system-tables.d.ts.map +1 -1
  156. package/dist/schema/state/sqlite/system-tables.js +11 -20
  157. package/dist/schema/state/sqlite/system-tables.js.map +1 -1
  158. package/dist/schema/state/sqlite/table-def.d.ts +3 -3
  159. package/dist/schema/state/sqlite/table-def.d.ts.map +1 -1
  160. package/dist/schema/state/sqlite/table-def.js +2 -2
  161. package/dist/schema-management/common.d.ts +2 -2
  162. package/dist/schema-management/common.js +1 -1
  163. package/dist/schema-management/migrations.d.ts +6 -4
  164. package/dist/schema-management/migrations.d.ts.map +1 -1
  165. package/dist/schema-management/migrations.js +5 -5
  166. package/dist/schema-management/migrations.js.map +1 -1
  167. package/dist/schema-management/validate-schema.d.ts +4 -4
  168. package/dist/schema-management/validate-schema.js +1 -1
  169. package/dist/sql-queries/index.d.ts +3 -3
  170. package/dist/sql-queries/index.js +3 -3
  171. package/dist/sql-queries/sql-queries.d.ts +2 -2
  172. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  173. package/dist/sql-queries/sql-queries.js +5 -3
  174. package/dist/sql-queries/sql-queries.js.map +1 -1
  175. package/dist/sql-queries/sql-query-builder.d.ts +3 -3
  176. package/dist/sql-queries/sql-query-builder.js +1 -1
  177. package/dist/sql-queries/types.d.ts +1 -1
  178. package/dist/sqlite-db-helper.d.ts +2 -2
  179. package/dist/sqlite-db-helper.js +1 -1
  180. package/dist/sqlite-types.d.ts +72 -0
  181. package/dist/sqlite-types.d.ts.map +1 -0
  182. package/dist/sqlite-types.js +5 -0
  183. package/dist/sqlite-types.js.map +1 -0
  184. package/dist/sync/ClientSessionSyncProcessor.d.ts +22 -7
  185. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -1
  186. package/dist/sync/ClientSessionSyncProcessor.js +43 -21
  187. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -1
  188. package/dist/sync/index.d.ts +3 -3
  189. package/dist/sync/index.d.ts.map +1 -1
  190. package/dist/sync/index.js +3 -3
  191. package/dist/sync/index.js.map +1 -1
  192. package/dist/sync/next/compact-events.d.ts +1 -1
  193. package/dist/sync/next/compact-events.js +4 -4
  194. package/dist/sync/next/facts.d.ts +3 -3
  195. package/dist/sync/next/facts.js +2 -2
  196. package/dist/sync/next/graphology.d.ts.map +1 -1
  197. package/dist/sync/next/graphology.js +0 -6
  198. package/dist/sync/next/graphology.js.map +1 -1
  199. package/dist/sync/next/graphology_.d.ts +1 -1
  200. package/dist/sync/next/graphology_.d.ts.map +1 -1
  201. package/dist/sync/next/graphology_.js +1 -1
  202. package/dist/sync/next/graphology_.js.map +1 -1
  203. package/dist/sync/next/history-dag-common.d.ts +3 -3
  204. package/dist/sync/next/history-dag-common.js +2 -2
  205. package/dist/sync/next/history-dag.d.ts +2 -2
  206. package/dist/sync/next/history-dag.js +3 -3
  207. package/dist/sync/next/mod.d.ts +5 -5
  208. package/dist/sync/next/mod.d.ts.map +1 -1
  209. package/dist/sync/next/mod.js +5 -5
  210. package/dist/sync/next/mod.js.map +1 -1
  211. package/dist/sync/next/rebase-events.d.ts +4 -4
  212. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  213. package/dist/sync/next/rebase-events.js +3 -2
  214. package/dist/sync/next/rebase-events.js.map +1 -1
  215. package/dist/sync/next/test/compact-events.calculator.test.js +4 -4
  216. package/dist/sync/next/test/compact-events.test.js +5 -5
  217. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  218. package/dist/sync/next/test/event-fixtures.d.ts +3 -3
  219. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -1
  220. package/dist/sync/next/test/event-fixtures.js +17 -8
  221. package/dist/sync/next/test/event-fixtures.js.map +1 -1
  222. package/dist/sync/next/test/mod.d.ts +1 -1
  223. package/dist/sync/next/test/mod.js +1 -1
  224. package/dist/sync/sync.d.ts +6 -4
  225. package/dist/sync/sync.d.ts.map +1 -1
  226. package/dist/sync/sync.js +4 -1
  227. package/dist/sync/sync.js.map +1 -1
  228. package/dist/sync/syncstate.d.ts +14 -5
  229. package/dist/sync/syncstate.d.ts.map +1 -1
  230. package/dist/sync/syncstate.js +25 -12
  231. package/dist/sync/syncstate.js.map +1 -1
  232. package/dist/sync/syncstate.test.js +20 -21
  233. package/dist/sync/syncstate.test.js.map +1 -1
  234. package/dist/sync/validate-push-payload.d.ts +2 -2
  235. package/dist/sync/validate-push-payload.js +1 -1
  236. package/dist/util.d.ts.map +1 -1
  237. package/dist/util.js +0 -1
  238. package/dist/util.js.map +1 -1
  239. package/dist/version.d.ts +1 -1
  240. package/dist/version.d.ts.map +1 -1
  241. package/dist/version.js +1 -1
  242. package/dist/version.js.map +1 -1
  243. package/package.json +6 -5
  244. package/src/ClientSessionLeaderThreadProxy.ts +40 -0
  245. package/src/__tests__/fixture.ts +2 -2
  246. package/src/adapter-types.ts +21 -167
  247. package/src/debug-info.ts +2 -2
  248. package/src/defs.ts +17 -0
  249. package/src/devtools/devtools-messages-client-session.ts +4 -4
  250. package/src/devtools/devtools-messages-common.ts +1 -1
  251. package/src/devtools/devtools-messages-leader.ts +4 -4
  252. package/src/devtools/devtools-messages.ts +3 -3
  253. package/src/devtools/mod.ts +3 -3
  254. package/src/errors.ts +49 -0
  255. package/src/index.ts +16 -16
  256. package/src/leader-thread/LeaderSyncProcessor.ts +154 -193
  257. package/src/leader-thread/connection.ts +5 -5
  258. package/src/leader-thread/eventlog.ts +89 -67
  259. package/src/leader-thread/leader-worker-devtools.ts +5 -6
  260. package/src/leader-thread/make-leader-thread-layer.ts +64 -20
  261. package/src/leader-thread/materialize-event.ts +17 -10
  262. package/src/leader-thread/mod.ts +8 -7
  263. package/src/leader-thread/recreate-db.ts +101 -93
  264. package/src/leader-thread/shutdown-channel.ts +1 -1
  265. package/src/leader-thread/types.ts +10 -15
  266. package/src/make-client-session.ts +5 -6
  267. package/src/materializer-helper.ts +11 -11
  268. package/src/rematerialize-from-eventlog.ts +16 -8
  269. package/src/schema/EventDef.ts +8 -6
  270. package/src/schema/EventSequenceNumber.test.ts +121 -4
  271. package/src/schema/EventSequenceNumber.ts +95 -23
  272. package/src/schema/LiveStoreEvent.ts +23 -7
  273. package/src/schema/events.ts +1 -1
  274. package/src/schema/mod.ts +9 -9
  275. package/src/schema/schema.ts +7 -7
  276. package/src/schema/state/mod.ts +2 -2
  277. package/src/schema/state/sqlite/client-document-def.test.ts +9 -7
  278. package/src/schema/state/sqlite/client-document-def.ts +45 -33
  279. package/src/schema/state/sqlite/db-schema/ast/sqlite.ts +1 -1
  280. package/src/schema/state/sqlite/db-schema/ast/validate.ts +1 -1
  281. package/src/schema/state/sqlite/db-schema/dsl/field-defs.test.ts +1 -1
  282. package/src/schema/state/sqlite/db-schema/dsl/field-defs.ts +2 -2
  283. package/src/schema/state/sqlite/db-schema/dsl/mod.ts +19 -13
  284. package/src/schema/state/sqlite/db-schema/hash.ts +3 -4
  285. package/src/schema/state/sqlite/db-schema/mod.ts +2 -2
  286. package/src/schema/state/sqlite/mod.ts +13 -13
  287. package/src/schema/state/sqlite/query-builder/api.ts +43 -13
  288. package/src/schema/state/sqlite/query-builder/astToSql.ts +4 -4
  289. package/src/schema/state/sqlite/query-builder/impl.test.ts +63 -23
  290. package/src/schema/state/sqlite/query-builder/impl.ts +23 -28
  291. package/src/schema/state/sqlite/query-builder/mod.ts +2 -2
  292. package/src/schema/state/sqlite/schema-helpers.ts +2 -2
  293. package/src/schema/state/sqlite/system-tables.ts +12 -25
  294. package/src/schema/state/sqlite/table-def.ts +4 -4
  295. package/src/schema-management/common.ts +3 -3
  296. package/src/schema-management/migrations.ts +11 -9
  297. package/src/schema-management/validate-schema.ts +4 -4
  298. package/src/sql-queries/index.ts +3 -3
  299. package/src/sql-queries/sql-queries.ts +6 -4
  300. package/src/sql-queries/sql-query-builder.ts +4 -4
  301. package/src/sql-queries/types.ts +1 -1
  302. package/src/sqlite-db-helper.ts +3 -3
  303. package/src/sqlite-types.ts +76 -0
  304. package/src/sync/ClientSessionSyncProcessor.ts +65 -30
  305. package/src/sync/index.ts +3 -3
  306. package/src/sync/next/compact-events.ts +5 -5
  307. package/src/sync/next/facts.ts +4 -4
  308. package/src/sync/next/graphology.ts +3 -11
  309. package/src/sync/next/graphology_.ts +1 -1
  310. package/src/sync/next/history-dag-common.ts +3 -3
  311. package/src/sync/next/history-dag.ts +3 -3
  312. package/src/sync/next/mod.ts +5 -5
  313. package/src/sync/next/rebase-events.ts +7 -6
  314. package/src/sync/next/test/compact-events.calculator.test.ts +4 -4
  315. package/src/sync/next/test/compact-events.test.ts +6 -6
  316. package/src/sync/next/test/event-fixtures.ts +19 -10
  317. package/src/sync/next/test/mod.ts +1 -1
  318. package/src/sync/sync.ts +7 -4
  319. package/src/sync/syncstate.test.ts +25 -22
  320. package/src/sync/syncstate.ts +33 -12
  321. package/src/sync/validate-push-payload.ts +2 -2
  322. package/src/util.ts +0 -1
  323. package/src/version.ts +1 -1
@@ -1,20 +1,19 @@
1
+ /** biome-ignore-all lint/complexity/noArguments: using arguments is fine here */
1
2
  import { casesHandled, shouldNeverHappen } from '@livestore/utils'
2
3
  import { Match, Option, Predicate, Schema } from '@livestore/utils/effect'
3
4
 
4
- import type { TableDefBase } from '../table-def.js'
5
- import type { QueryBuilder, QueryBuilderAst } from './api.js'
6
- import { QueryBuilderAstSymbol, QueryBuilderTypeId } from './api.js'
7
- import { astToSql } from './astToSql.js'
5
+ import type { TableDefBase } from '../table-def.ts'
6
+ import type { QueryBuilder, QueryBuilderAst } from './api.ts'
7
+ import { QueryBuilderAstSymbol, QueryBuilderTypeId } from './api.ts'
8
+ import { astToSql } from './astToSql.ts'
8
9
  export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
9
10
  tableDef: TTableDef,
10
11
  ast: QueryBuilderAst = emptyAst(tableDef),
11
12
  ): QueryBuilder<TResult, TTableDef, never> => {
12
13
  const api = {
13
- // eslint-disable-next-line prefer-arrow/prefer-arrow-functions
14
14
  select() {
15
15
  assertSelectQueryBuilderAst(ast)
16
16
 
17
- // eslint-disable-next-line prefer-rest-params
18
17
  const params = [...arguments]
19
18
 
20
19
  // Pluck if there's only one column selected
@@ -36,13 +35,12 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
36
35
  select: { columns },
37
36
  }) as any
38
37
  },
39
- // eslint-disable-next-line prefer-arrow/prefer-arrow-functions
38
+ // biome-ignore lint/complexity/useArrowFunction: prefer function over arrow function for this case
40
39
  where: function () {
41
40
  if (ast._tag === 'InsertQuery') return invalidQueryBuilder('Cannot use where with insert')
42
41
  if (ast._tag === 'RowQuery') return invalidQueryBuilder('Cannot use where with row')
43
42
 
44
43
  if (arguments.length === 1) {
45
- // eslint-disable-next-line prefer-rest-params
46
44
  const params = arguments[0]
47
45
  const newOps = Object.entries(params)
48
46
  .filter(([, value]) => value !== undefined)
@@ -68,7 +66,6 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
68
66
  }
69
67
  }
70
68
 
71
- // eslint-disable-next-line prefer-rest-params
72
69
  const [col, opOrValue, valueOrUndefined] = arguments
73
70
  const op = valueOrUndefined === undefined ? '=' : opOrValue
74
71
  const value = valueOrUndefined === undefined ? opOrValue : valueOrUndefined
@@ -88,14 +85,13 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
88
85
  }
89
86
  }
90
87
  },
91
- // eslint-disable-next-line prefer-arrow/prefer-arrow-functions
88
+
92
89
  orderBy() {
93
90
  assertSelectQueryBuilderAst(ast)
94
91
 
95
92
  if (arguments.length === 0 || arguments.length > 2) return invalidQueryBuilder()
96
93
 
97
94
  if (arguments.length === 1) {
98
- // eslint-disable-next-line prefer-rest-params
99
95
  const params = arguments[0] as QueryBuilder.OrderByParams<TTableDef>
100
96
  return makeQueryBuilder(tableDef, {
101
97
  ...ast,
@@ -103,7 +99,6 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
103
99
  })
104
100
  }
105
101
 
106
- // eslint-disable-next-line prefer-rest-params
107
102
  const [col, direction] = arguments as any as [keyof TTableDef['sqliteDef']['columns'] & string, 'asc' | 'desc']
108
103
 
109
104
  return makeQueryBuilder(tableDef, {
@@ -136,7 +131,7 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
136
131
  ),
137
132
  })
138
133
  },
139
- first: (options) => {
134
+ first: (behaviour) => {
140
135
  assertSelectQueryBuilderAst(ast)
141
136
 
142
137
  if (ast.limit._tag === 'Some') return invalidQueryBuilder(`.first() can't be called after .limit()`)
@@ -144,17 +139,16 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
144
139
  return makeQueryBuilder(tableDef, {
145
140
  ...ast,
146
141
  limit: Option.some(1),
147
- pickFirst:
148
- options?.fallback !== undefined && options.fallback !== 'throws' ? { fallback: options.fallback } : 'throws',
142
+ pickFirst: { _tag: 'enabled', ...(behaviour ?? { behaviour: 'undefined' }) },
149
143
  })
150
144
  },
151
- // // eslint-disable-next-line prefer-arrow/prefer-arrow-functions
145
+ //
152
146
  // getOrCreate() {
153
147
  // if (tableDef.options.isClientDocumentTable === false) {
154
148
  // return invalidQueryBuilder(`getOrCreate() is not allowed when table is not a client document table`)
155
149
  // }
156
150
 
157
- // // eslint-disable-next-line prefer-rest-params
151
+ //
158
152
  // const params = [...arguments]
159
153
 
160
154
  // let id: string | number
@@ -249,7 +243,7 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
249
243
  return {
250
244
  [QueryBuilderTypeId]: QueryBuilderTypeId,
251
245
  [QueryBuilderAstSymbol]: ast,
252
- ['ResultType']: 'only-for-type-inference' as TResult,
246
+ ResultType: 'only-for-type-inference' as TResult,
253
247
  asSql: () => astToSql(ast),
254
248
  toString: () => {
255
249
  try {
@@ -266,7 +260,7 @@ export const makeQueryBuilder = <TResult, TTableDef extends TableDefBase>(
266
260
  const emptyAst = (tableDef: TableDefBase): QueryBuilderAst.SelectQuery => ({
267
261
  _tag: 'SelectQuery',
268
262
  columns: [],
269
- pickFirst: false,
263
+ pickFirst: { _tag: 'disabled' },
270
264
  select: { columns: [] },
271
265
  orderBy: [],
272
266
  offset: Option.none(),
@@ -277,31 +271,29 @@ const emptyAst = (tableDef: TableDefBase): QueryBuilderAst.SelectQuery => ({
277
271
  })
278
272
 
279
273
  // Helper functions
280
- // eslint-disable-next-line prefer-arrow/prefer-arrow-functions
274
+
281
275
  function assertSelectQueryBuilderAst(ast: QueryBuilderAst): asserts ast is QueryBuilderAst.SelectQuery {
282
276
  if (ast._tag !== 'SelectQuery') {
283
- return shouldNeverHappen('Expected SelectQuery but got ' + ast._tag)
277
+ return shouldNeverHappen(`Expected SelectQuery but got ${ast._tag}`)
284
278
  }
285
279
  }
286
280
 
287
- // eslint-disable-next-line prefer-arrow/prefer-arrow-functions
288
281
  function assertInsertQueryBuilderAst(ast: QueryBuilderAst): asserts ast is QueryBuilderAst.InsertQuery {
289
282
  if (ast._tag !== 'InsertQuery') {
290
- return shouldNeverHappen('Expected InsertQuery but got ' + ast._tag)
283
+ return shouldNeverHappen(`Expected InsertQuery but got ${ast._tag}`)
291
284
  }
292
285
  }
293
286
 
294
- // eslint-disable-next-line prefer-arrow/prefer-arrow-functions
295
287
  function assertWriteQueryBuilderAst(ast: QueryBuilderAst): asserts ast is QueryBuilderAst.WriteQuery {
296
288
  if (ast._tag !== 'InsertQuery' && ast._tag !== 'UpdateQuery' && ast._tag !== 'DeleteQuery') {
297
- return shouldNeverHappen('Expected WriteQuery but got ' + ast._tag)
289
+ return shouldNeverHappen(`Expected WriteQuery but got ${ast._tag}`)
298
290
  }
299
291
  }
300
292
 
301
293
  const isRowQuery = (ast: QueryBuilderAst): ast is QueryBuilderAst.RowQuery => ast._tag === 'RowQuery'
302
294
 
303
295
  export const invalidQueryBuilder = (msg?: string) => {
304
- return shouldNeverHappen('Invalid query builder' + (msg ? `: ${msg}` : ''))
296
+ return shouldNeverHappen(`Invalid query builder${msg ? `: ${msg}` : ''}`)
305
297
  }
306
298
 
307
299
  export const getResultSchema = (qb: QueryBuilder<any, any, any>): Schema.Schema<any> => {
@@ -309,9 +301,12 @@ export const getResultSchema = (qb: QueryBuilder<any, any, any>): Schema.Schema<
309
301
  switch (queryAst._tag) {
310
302
  case 'SelectQuery': {
311
303
  const arraySchema = Schema.Array(queryAst.resultSchemaSingle)
312
- if (queryAst.pickFirst === false) {
304
+ if (queryAst.pickFirst._tag === 'disabled') {
313
305
  return arraySchema
314
- } else if (queryAst.pickFirst === 'throws') {
306
+ } else if (queryAst.pickFirst.behaviour === 'undefined') {
307
+ const arraySchema = Schema.Array(Schema.UndefinedOr(queryAst.resultSchemaSingle))
308
+ return arraySchema.pipe(Schema.headOrElse(() => undefined))
309
+ } else if (queryAst.pickFirst.behaviour === 'error') {
315
310
  // Will throw if the array is empty
316
311
  return arraySchema.pipe(Schema.headOrElse())
317
312
  } else {
@@ -1,5 +1,5 @@
1
- export * from './api.js'
2
- export * from './impl.js'
1
+ export * from './api.ts'
2
+ export * from './impl.ts'
3
3
 
4
4
  /**
5
5
  * Design decisions:
@@ -1,8 +1,8 @@
1
1
  import { shouldNeverHappen } from '@livestore/utils'
2
2
  import { pipe, ReadonlyRecord, Schema } from '@livestore/utils/effect'
3
3
 
4
- import { SqliteDsl } from './db-schema/mod.js'
5
- import type { TableDef, TableDefBase } from './table-def.js'
4
+ import { SqliteDsl } from './db-schema/mod.ts'
5
+ import type { TableDef, TableDefBase } from './table-def.ts'
6
6
 
7
7
  export const getDefaultValuesEncoded = <TTableDef extends TableDef>(
8
8
  tableDef: TTableDef,
@@ -1,10 +1,10 @@
1
1
  import { Schema } from '@livestore/utils/effect'
2
2
 
3
- import * as EventSequenceNumber from '../../EventSequenceNumber.js'
4
- import { SqliteDsl } from './db-schema/mod.js'
5
- import { table } from './table-def.js'
3
+ import * as EventSequenceNumber from '../../EventSequenceNumber.ts'
4
+ import { SqliteDsl } from './db-schema/mod.ts'
5
+ import { table } from './table-def.ts'
6
6
 
7
- /// Read model DB
7
+ /// State DB
8
8
 
9
9
  export const SCHEMA_META_TABLE = '__livestore_schema'
10
10
 
@@ -46,6 +46,7 @@ export const sessionChangesetMetaTable = table({
46
46
  // TODO bring back primary key
47
47
  seqNumGlobal: SqliteDsl.integer({ schema: EventSequenceNumber.GlobalEventSequenceNumber }),
48
48
  seqNumClient: SqliteDsl.integer({ schema: EventSequenceNumber.ClientEventSequenceNumber }),
49
+ seqNumRebaseGeneration: SqliteDsl.integer({}),
49
50
  changeset: SqliteDsl.blob({ nullable: true }),
50
51
  debug: SqliteDsl.json({ nullable: true }),
51
52
  },
@@ -54,25 +55,7 @@ export const sessionChangesetMetaTable = table({
54
55
 
55
56
  export type SessionChangesetMetaRow = typeof sessionChangesetMetaTable.Type
56
57
 
57
- export const LEADER_MERGE_COUNTER_TABLE = '__livestore_leader_merge_counter'
58
-
59
- // TODO get rid of this table in favour of client-only merge generation
60
- export const leaderMergeCounterTable = table({
61
- name: LEADER_MERGE_COUNTER_TABLE,
62
- columns: {
63
- id: SqliteDsl.integer({ primaryKey: true, schema: Schema.Literal(0) }),
64
- mergeCounter: SqliteDsl.integer({ primaryKey: true }),
65
- },
66
- })
67
-
68
- export type LeaderMergeCounterRow = typeof leaderMergeCounterTable.Type
69
-
70
- export const stateSystemTables = [
71
- schemaMetaTable,
72
- schemaEventDefsMetaTable,
73
- sessionChangesetMetaTable,
74
- leaderMergeCounterTable,
75
- ]
58
+ export const stateSystemTables = [schemaMetaTable, schemaEventDefsMetaTable, sessionChangesetMetaTable] as const
76
59
 
77
60
  export const isStateSystemTable = (tableName: string) => stateSystemTables.some((_) => _.sqliteDef.name === tableName)
78
61
 
@@ -86,8 +69,11 @@ export const eventlogMetaTable = table({
86
69
  // TODO Adjust modeling so a global event never needs a client id component
87
70
  seqNumGlobal: SqliteDsl.integer({ primaryKey: true, schema: EventSequenceNumber.GlobalEventSequenceNumber }),
88
71
  seqNumClient: SqliteDsl.integer({ primaryKey: true, schema: EventSequenceNumber.ClientEventSequenceNumber }),
72
+ seqNumRebaseGeneration: SqliteDsl.integer({ primaryKey: true }),
89
73
  parentSeqNumGlobal: SqliteDsl.integer({ schema: EventSequenceNumber.GlobalEventSequenceNumber }),
90
74
  parentSeqNumClient: SqliteDsl.integer({ schema: EventSequenceNumber.ClientEventSequenceNumber }),
75
+ parentSeqNumRebaseGeneration: SqliteDsl.integer({}),
76
+ /** Event definition name */
91
77
  name: SqliteDsl.text({}),
92
78
  argsJson: SqliteDsl.text({ schema: Schema.parseJson(Schema.Any) }),
93
79
  clientId: SqliteDsl.text({}),
@@ -97,7 +83,7 @@ export const eventlogMetaTable = table({
97
83
  },
98
84
  indexes: [
99
85
  { columns: ['seqNumGlobal'], name: 'idx_eventlog_seqNumGlobal' },
100
- { columns: ['seqNumGlobal', 'seqNumClient'], name: 'idx_eventlog_seqNum' },
86
+ { columns: ['seqNumGlobal', 'seqNumClient', 'seqNumRebaseGeneration'], name: 'idx_eventlog_seqNum' },
101
87
  ],
102
88
  })
103
89
 
@@ -105,6 +91,7 @@ export type EventlogMetaRow = typeof eventlogMetaTable.Type
105
91
 
106
92
  export const SYNC_STATUS_TABLE = '__livestore_sync_status'
107
93
 
94
+ // TODO support sync backend identity (to detect if sync backend changes)
108
95
  export const syncStatusTable = table({
109
96
  name: SYNC_STATUS_TABLE,
110
97
  columns: {
@@ -114,4 +101,4 @@ export const syncStatusTable = table({
114
101
 
115
102
  export type SyncStatusRow = typeof syncStatusTable.Type
116
103
 
117
- export const eventlogSystemTables = [eventlogMetaTable, syncStatusTable]
104
+ export const eventlogSystemTables = [eventlogMetaTable, syncStatusTable] as const
@@ -1,9 +1,9 @@
1
- import { type Nullable } from '@livestore/utils'
1
+ import type { Nullable } from '@livestore/utils'
2
2
  import type { Schema, Types } from '@livestore/utils/effect'
3
3
 
4
- import { SqliteDsl } from './db-schema/mod.js'
5
- import type { QueryBuilder } from './query-builder/mod.js'
6
- import { makeQueryBuilder, QueryBuilderAstSymbol, QueryBuilderTypeId } from './query-builder/mod.js'
4
+ import { SqliteDsl } from './db-schema/mod.ts'
5
+ import type { QueryBuilder } from './query-builder/mod.ts'
6
+ import { makeQueryBuilder, QueryBuilderAstSymbol, QueryBuilderTypeId } from './query-builder/mod.ts'
7
7
 
8
8
  export const { blob, boolean, column, datetime, integer, isColumnDefinition, json, real, text } = SqliteDsl
9
9
 
@@ -1,6 +1,6 @@
1
- import type { SqliteDb } from '../adapter-types.js'
2
- import type { ParamsObject } from '../util.js'
3
- import { prepareBindValues } from '../util.js'
1
+ import type { SqliteDb } from '../adapter-types.ts'
2
+ import type { ParamsObject } from '../util.ts'
3
+ import { prepareBindValues } from '../util.ts'
4
4
 
5
5
  // TODO bring back statement caching
6
6
  // will require proper scope-aware cleanup etc (for testing and apps with multiple LiveStore instances)
@@ -1,21 +1,23 @@
1
1
  import { memoizeByStringifyArgs } from '@livestore/utils'
2
2
  import { Effect, Schema as EffectSchema } from '@livestore/utils/effect'
3
3
 
4
- import type { MigrationsReport, MigrationsReportEntry, SqliteDb, UnexpectedError } from '../adapter-types.js'
5
- import type { LiveStoreSchema } from '../schema/mod.js'
6
- import { SqliteAst, SqliteDsl } from '../schema/state/sqlite/db-schema/mod.js'
7
- import type { SchemaEventDefsMetaRow, SchemaMetaRow } from '../schema/state/sqlite/system-tables.js'
4
+ import type { SqliteDb } from '../adapter-types.ts'
5
+ import type { MigrationsReport, MigrationsReportEntry } from '../defs.ts'
6
+ import type { UnexpectedError } from '../errors.ts'
7
+ import type { LiveStoreSchema } from '../schema/mod.ts'
8
+ import { SqliteAst, SqliteDsl } from '../schema/state/sqlite/db-schema/mod.ts'
9
+ import type { SchemaEventDefsMetaRow, SchemaMetaRow } from '../schema/state/sqlite/system-tables.ts'
8
10
  import {
9
11
  isStateSystemTable,
10
12
  SCHEMA_EVENT_DEFS_META_TABLE,
11
13
  SCHEMA_META_TABLE,
12
14
  schemaEventDefsMetaTable,
13
15
  stateSystemTables,
14
- } from '../schema/state/sqlite/system-tables.js'
15
- import { sql } from '../util.js'
16
- import type { SchemaManager } from './common.js'
17
- import { dbExecute, dbSelect } from './common.js'
18
- import { validateSchema } from './validate-schema.js'
16
+ } from '../schema/state/sqlite/system-tables.ts'
17
+ import { sql } from '../util.ts'
18
+ import type { SchemaManager } from './common.ts'
19
+ import { dbExecute, dbSelect } from './common.ts'
20
+ import { validateSchema } from './validate-schema.ts'
19
21
 
20
22
  const getMemoizedTimestamp = memoizeByStringifyArgs(() => new Date().toISOString())
21
23
 
@@ -1,9 +1,9 @@
1
1
  import { Effect, Schema } from '@livestore/utils/effect'
2
2
 
3
- import { UnexpectedError } from '../adapter-types.js'
4
- import type { EventDef } from '../schema/EventDef.js'
5
- import type { LiveStoreSchema } from '../schema/mod.js'
6
- import type { EventDefInfo, SchemaManager } from './common.js'
3
+ import { UnexpectedError } from '../adapter-types.ts'
4
+ import type { EventDef } from '../schema/EventDef.ts'
5
+ import type { LiveStoreSchema } from '../schema/mod.ts'
6
+ import type { EventDefInfo, SchemaManager } from './common.ts'
7
7
 
8
8
  export const validateSchema = (schema: LiveStoreSchema, schemaManager: SchemaManager) =>
9
9
  Effect.gen(function* () {
@@ -1,3 +1,3 @@
1
- export * from './sql-queries.js'
2
- export * from './sql-query-builder.js'
3
- export * from './types.js'
1
+ export * from './sql-queries.ts'
2
+ export * from './sql-query-builder.ts'
3
+ export * from './types.ts'
@@ -1,10 +1,10 @@
1
1
  import { shouldNeverHappen } from '@livestore/utils'
2
2
  import { pipe, ReadonlyArray, Schema, TreeFormatter } from '@livestore/utils/effect'
3
3
 
4
- import type { SqliteDsl } from '../schema/state/sqlite/db-schema/mod.js'
5
- import { sql } from '../util.js'
6
- import { objectEntries } from './misc.js'
7
- import * as ClientTypes from './types.js'
4
+ import type { SqliteDsl } from '../schema/state/sqlite/db-schema/mod.ts'
5
+ import { sql } from '../util.ts'
6
+ import { objectEntries } from './misc.ts'
7
+ import * as ClientTypes from './types.ts'
8
8
 
9
9
  export type BindValues = {
10
10
  readonly [columnName: string]: any
@@ -106,6 +106,7 @@ export const insertRows = <TColumns extends SqliteDsl.Columns>({
106
106
 
107
107
  const bindValues = valuesArray.reduce(
108
108
  (acc, values, itemIndex) => ({
109
+ // biome-ignore lint/performance/noAccumulatingSpread: TODO improve this some day
109
110
  ...acc,
110
111
  ...makeBindValues({ columns, values, variablePrefix: `item_${itemIndex}_` }),
111
112
  }),
@@ -292,6 +293,7 @@ Error: ${parseErrorStr}
292
293
  Value:`,
293
294
  value,
294
295
  )
296
+ // biome-ignore lint/suspicious/noDebugger: debug
295
297
  debugger
296
298
  throw res.left
297
299
  } else {
@@ -1,7 +1,7 @@
1
- import type { SqliteDsl } from '../schema/state/sqlite/db-schema/mod.js'
2
- import type { BindValues } from './sql-queries.js'
3
- import * as SqlQueries from './sql-queries.js'
4
- import type * as ClientTypes from './types.js'
1
+ import type { SqliteDsl } from '../schema/state/sqlite/db-schema/mod.ts'
2
+ import type { BindValues } from './sql-queries.ts'
3
+ import * as SqlQueries from './sql-queries.ts'
4
+ import type * as ClientTypes from './types.ts'
5
5
 
6
6
  export type SqlQuery = [stmt: string, bindValues: BindValues, tableName: string]
7
7
 
@@ -1,7 +1,7 @@
1
1
  import type { Prettify } from '@livestore/utils'
2
2
  import type { Schema } from '@livestore/utils/effect'
3
3
 
4
- import type { SqliteDsl } from '../schema/state/sqlite/db-schema/mod.js'
4
+ import type { SqliteDsl } from '../schema/state/sqlite/db-schema/mod.ts'
5
5
 
6
6
  export type DecodedValuesForTableAll<TSchema extends SqliteDsl.DbSchema, TTableName extends keyof TSchema> = {
7
7
  [K in keyof GetColumns<TSchema, TTableName>]: Schema.Schema.Type<GetColumn<TSchema, TTableName, K>['schema']>
@@ -1,8 +1,8 @@
1
1
  import { Schema } from '@livestore/utils/effect'
2
2
 
3
- import type { SqliteDb } from './adapter-types.js'
4
- import { getResultSchema, isQueryBuilder } from './schema/state/sqlite/query-builder/mod.js'
5
- import type { PreparedBindValues } from './util.js'
3
+ import type { SqliteDb } from './adapter-types.ts'
4
+ import { getResultSchema, isQueryBuilder } from './schema/state/sqlite/query-builder/mod.ts'
5
+ import type { PreparedBindValues } from './util.ts'
6
6
 
7
7
  export const makeExecute = (
8
8
  execute: (
@@ -0,0 +1,76 @@
1
+ import { type Effect, Schema } from '@livestore/utils/effect'
2
+ import type { SqliteError, UnexpectedError } from './errors.ts'
3
+ import type { EventSequenceNumber } from './schema/mod.ts'
4
+ import type { QueryBuilder } from './schema/state/sqlite/query-builder/api.ts'
5
+ import type { PreparedBindValues } from './util.ts'
6
+
7
+ /**
8
+ * Common interface for SQLite databases used by LiveStore to facilitate a consistent API across different platforms.
9
+ * Always assumes a synchronous SQLite build with the `bytecode` and `session` extensions enabled.
10
+ * Can be either in-memory or persisted to disk.
11
+ */
12
+ export interface SqliteDb<TReq = any, TMetadata extends TReq = TReq> {
13
+ _tag: 'SqliteDb'
14
+ metadata: TMetadata
15
+ /** Debug information (currently not persisted and only available at runtime) */
16
+ debug: SqliteDebugInfo
17
+ prepare(queryStr: string): PreparedStatement
18
+ execute(
19
+ queryStr: string,
20
+ bindValues?: PreparedBindValues | undefined,
21
+ options?: { onRowsChanged?: (rowsChanged: number) => void },
22
+ ): void
23
+ execute(queryBuilder: QueryBuilder.Any, options?: { onRowsChanged?: (rowsChanged: number) => void }): void
24
+
25
+ select<T>(queryStr: string, bindValues?: PreparedBindValues | undefined): ReadonlyArray<T>
26
+ select<T>(queryBuilder: QueryBuilder<T, any, any>): T
27
+
28
+ export(): Uint8Array
29
+ import: (data: Uint8Array | SqliteDb<TReq>) => void
30
+ close(): void
31
+ destroy(): void
32
+ session(): SqliteDbSession
33
+ makeChangeset: (data: Uint8Array) => SqliteDbChangeset
34
+ }
35
+
36
+ export type SqliteDebugInfo = { head: EventSequenceNumber.EventSequenceNumber }
37
+
38
+ // TODO refactor this helper type. It's quite cumbersome to use and should be revisited.
39
+ export type MakeSqliteDb<
40
+ TReq = { dbPointer: number; persistenceInfo: PersistenceInfo },
41
+ TInput_ extends { _tag: string } = { _tag: string },
42
+ TMetadata_ extends TReq = TReq,
43
+ R = never,
44
+ > = <
45
+ TInput extends TInput_,
46
+ TMetadata extends TMetadata_ & { _tag: TInput['_tag'] } = TMetadata_ & { _tag: TInput['_tag'] },
47
+ >(
48
+ input: TInput,
49
+ ) => Effect.Effect<SqliteDb<TReq, Extract<TMetadata, { _tag: TInput['_tag'] }>>, SqliteError | UnexpectedError, R>
50
+
51
+ export interface PreparedStatement {
52
+ execute(bindValues: PreparedBindValues | undefined, options?: { onRowsChanged?: (rowsChanged: number) => void }): void
53
+ select<T>(bindValues: PreparedBindValues | undefined): ReadonlyArray<T>
54
+ finalize(): void
55
+ sql: string
56
+ }
57
+
58
+ export type SqliteDbSession = {
59
+ changeset: () => Uint8Array | undefined
60
+ finish: () => void
61
+ }
62
+
63
+ export type SqliteDbChangeset = {
64
+ // TODO combining changesets (requires changes in the SQLite WASM binding)
65
+ invert: () => SqliteDbChangeset
66
+ apply: () => void
67
+ }
68
+
69
+ export const PersistenceInfo = Schema.Struct(
70
+ {
71
+ fileName: Schema.String,
72
+ },
73
+ { key: Schema.String, value: Schema.Any },
74
+ ).annotations({ title: 'LiveStore.PersistenceInfo' })
75
+
76
+ export type PersistenceInfo<With extends {} = {}> = typeof PersistenceInfo.Type & With