@livestore/common 0.3.0-dev.3 → 0.3.0-dev.31

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 (426) hide show
  1. package/dist/.tsbuildinfo +1 -1
  2. package/dist/__tests__/fixture.d.ts +83 -221
  3. package/dist/__tests__/fixture.d.ts.map +1 -1
  4. package/dist/__tests__/fixture.js +33 -11
  5. package/dist/__tests__/fixture.js.map +1 -1
  6. package/dist/adapter-types.d.ts +128 -68
  7. package/dist/adapter-types.d.ts.map +1 -1
  8. package/dist/adapter-types.js +36 -7
  9. package/dist/adapter-types.js.map +1 -1
  10. package/dist/bounded-collections.d.ts.map +1 -1
  11. package/dist/debug-info.d.ts +1 -1
  12. package/dist/debug-info.d.ts.map +1 -1
  13. package/dist/debug-info.js +1 -0
  14. package/dist/debug-info.js.map +1 -1
  15. package/dist/devtools/devtools-messages-client-session.d.ts +389 -0
  16. package/dist/devtools/devtools-messages-client-session.d.ts.map +1 -0
  17. package/dist/devtools/devtools-messages-client-session.js +96 -0
  18. package/dist/devtools/devtools-messages-client-session.js.map +1 -0
  19. package/dist/devtools/devtools-messages-common.d.ts +68 -0
  20. package/dist/devtools/devtools-messages-common.d.ts.map +1 -0
  21. package/dist/devtools/devtools-messages-common.js +60 -0
  22. package/dist/devtools/devtools-messages-common.js.map +1 -0
  23. package/dist/devtools/devtools-messages-leader.d.ts +394 -0
  24. package/dist/devtools/devtools-messages-leader.d.ts.map +1 -0
  25. package/dist/devtools/devtools-messages-leader.js +147 -0
  26. package/dist/devtools/devtools-messages-leader.js.map +1 -0
  27. package/dist/devtools/devtools-messages.d.ts +3 -592
  28. package/dist/devtools/devtools-messages.d.ts.map +1 -1
  29. package/dist/devtools/devtools-messages.js +3 -171
  30. package/dist/devtools/devtools-messages.js.map +1 -1
  31. package/dist/devtools/devtools-sessioninfo.d.ts +28 -0
  32. package/dist/devtools/devtools-sessioninfo.d.ts.map +1 -0
  33. package/dist/devtools/devtools-sessioninfo.js +34 -0
  34. package/dist/devtools/devtools-sessioninfo.js.map +1 -0
  35. package/dist/devtools/mod.d.ts +39 -0
  36. package/dist/devtools/mod.d.ts.map +1 -0
  37. package/dist/devtools/mod.js +27 -0
  38. package/dist/devtools/mod.js.map +1 -0
  39. package/dist/index.d.ts +4 -11
  40. package/dist/index.d.ts.map +1 -1
  41. package/dist/index.js +4 -7
  42. package/dist/index.js.map +1 -1
  43. package/dist/leader-thread/LeaderSyncProcessor.d.ts +62 -0
  44. package/dist/leader-thread/LeaderSyncProcessor.d.ts.map +1 -0
  45. package/dist/leader-thread/LeaderSyncProcessor.js +589 -0
  46. package/dist/leader-thread/LeaderSyncProcessor.js.map +1 -0
  47. package/dist/leader-thread/apply-event.d.ts +16 -0
  48. package/dist/leader-thread/apply-event.d.ts.map +1 -0
  49. package/dist/leader-thread/apply-event.js +103 -0
  50. package/dist/leader-thread/apply-event.js.map +1 -0
  51. package/dist/leader-thread/connection.d.ts +34 -6
  52. package/dist/leader-thread/connection.d.ts.map +1 -1
  53. package/dist/leader-thread/connection.js +22 -7
  54. package/dist/leader-thread/connection.js.map +1 -1
  55. package/dist/leader-thread/eventlog.d.ts +27 -0
  56. package/dist/leader-thread/eventlog.d.ts.map +1 -0
  57. package/dist/leader-thread/eventlog.js +123 -0
  58. package/dist/leader-thread/eventlog.js.map +1 -0
  59. package/dist/leader-thread/leader-worker-devtools.d.ts +1 -1
  60. package/dist/leader-thread/leader-worker-devtools.d.ts.map +1 -1
  61. package/dist/leader-thread/leader-worker-devtools.js +154 -132
  62. package/dist/leader-thread/leader-worker-devtools.js.map +1 -1
  63. package/dist/leader-thread/make-leader-thread-layer.d.ts +26 -12
  64. package/dist/leader-thread/make-leader-thread-layer.d.ts.map +1 -1
  65. package/dist/leader-thread/make-leader-thread-layer.js +82 -47
  66. package/dist/leader-thread/make-leader-thread-layer.js.map +1 -1
  67. package/dist/leader-thread/mod.d.ts +1 -1
  68. package/dist/leader-thread/mod.d.ts.map +1 -1
  69. package/dist/leader-thread/mod.js +1 -1
  70. package/dist/leader-thread/mod.js.map +1 -1
  71. package/dist/leader-thread/recreate-db.d.ts +4 -2
  72. package/dist/leader-thread/recreate-db.d.ts.map +1 -1
  73. package/dist/leader-thread/recreate-db.js +35 -25
  74. package/dist/leader-thread/recreate-db.js.map +1 -1
  75. package/dist/leader-thread/shutdown-channel.d.ts +2 -5
  76. package/dist/leader-thread/shutdown-channel.d.ts.map +1 -1
  77. package/dist/leader-thread/shutdown-channel.js +2 -4
  78. package/dist/leader-thread/shutdown-channel.js.map +1 -1
  79. package/dist/leader-thread/types.d.ts +86 -39
  80. package/dist/leader-thread/types.d.ts.map +1 -1
  81. package/dist/leader-thread/types.js +1 -3
  82. package/dist/leader-thread/types.js.map +1 -1
  83. package/dist/materializer-helper.d.ts +23 -0
  84. package/dist/materializer-helper.d.ts.map +1 -0
  85. package/dist/materializer-helper.js +70 -0
  86. package/dist/materializer-helper.js.map +1 -0
  87. package/dist/otel.d.ts +2 -0
  88. package/dist/otel.d.ts.map +1 -1
  89. package/dist/otel.js +5 -0
  90. package/dist/otel.js.map +1 -1
  91. package/dist/query-builder/api.d.ts +158 -55
  92. package/dist/query-builder/api.d.ts.map +1 -1
  93. package/dist/query-builder/api.js +3 -5
  94. package/dist/query-builder/api.js.map +1 -1
  95. package/dist/query-builder/astToSql.d.ts +7 -0
  96. package/dist/query-builder/astToSql.d.ts.map +1 -0
  97. package/dist/query-builder/astToSql.js +190 -0
  98. package/dist/query-builder/astToSql.js.map +1 -0
  99. package/dist/query-builder/impl.d.ts +3 -8
  100. package/dist/query-builder/impl.d.ts.map +1 -1
  101. package/dist/query-builder/impl.js +166 -124
  102. package/dist/query-builder/impl.js.map +1 -1
  103. package/dist/query-builder/impl.test.d.ts +86 -1
  104. package/dist/query-builder/impl.test.d.ts.map +1 -1
  105. package/dist/query-builder/impl.test.js +411 -69
  106. package/dist/query-builder/impl.test.js.map +1 -1
  107. package/dist/query-builder/mod.d.ts +7 -0
  108. package/dist/query-builder/mod.d.ts.map +1 -1
  109. package/dist/query-builder/mod.js +7 -0
  110. package/dist/query-builder/mod.js.map +1 -1
  111. package/dist/rehydrate-from-eventlog.d.ts +14 -0
  112. package/dist/rehydrate-from-eventlog.d.ts.map +1 -0
  113. package/dist/rehydrate-from-eventlog.js +65 -0
  114. package/dist/rehydrate-from-eventlog.js.map +1 -0
  115. package/dist/schema/EventDef.d.ts +136 -0
  116. package/dist/schema/EventDef.d.ts.map +1 -0
  117. package/dist/schema/EventDef.js +58 -0
  118. package/dist/schema/EventDef.js.map +1 -0
  119. package/dist/schema/EventId.d.ts +35 -15
  120. package/dist/schema/EventId.d.ts.map +1 -1
  121. package/dist/schema/EventId.js +57 -11
  122. package/dist/schema/EventId.js.map +1 -1
  123. package/dist/schema/EventId.test.d.ts +2 -0
  124. package/dist/schema/EventId.test.d.ts.map +1 -0
  125. package/dist/schema/EventId.test.js +11 -0
  126. package/dist/schema/EventId.test.js.map +1 -0
  127. package/dist/schema/LiveStoreEvent.d.ts +255 -0
  128. package/dist/schema/LiveStoreEvent.d.ts.map +1 -0
  129. package/dist/schema/LiveStoreEvent.js +118 -0
  130. package/dist/schema/LiveStoreEvent.js.map +1 -0
  131. package/dist/schema/client-document-def.d.ts +223 -0
  132. package/dist/schema/client-document-def.d.ts.map +1 -0
  133. package/dist/schema/client-document-def.js +170 -0
  134. package/dist/schema/client-document-def.js.map +1 -0
  135. package/dist/schema/client-document-def.test.d.ts +2 -0
  136. package/dist/schema/client-document-def.test.d.ts.map +1 -0
  137. package/dist/schema/client-document-def.test.js +201 -0
  138. package/dist/schema/client-document-def.test.js.map +1 -0
  139. package/dist/schema/db-schema/ast/sqlite.d.ts +69 -0
  140. package/dist/schema/db-schema/ast/sqlite.d.ts.map +1 -0
  141. package/dist/schema/db-schema/ast/sqlite.js +71 -0
  142. package/dist/schema/db-schema/ast/sqlite.js.map +1 -0
  143. package/dist/schema/db-schema/ast/validate.d.ts +3 -0
  144. package/dist/schema/db-schema/ast/validate.d.ts.map +1 -0
  145. package/dist/schema/db-schema/ast/validate.js +12 -0
  146. package/dist/schema/db-schema/ast/validate.js.map +1 -0
  147. package/dist/schema/db-schema/dsl/field-defs.d.ts +90 -0
  148. package/dist/schema/db-schema/dsl/field-defs.d.ts.map +1 -0
  149. package/dist/schema/db-schema/dsl/field-defs.js +87 -0
  150. package/dist/schema/db-schema/dsl/field-defs.js.map +1 -0
  151. package/dist/schema/db-schema/dsl/field-defs.test.d.ts +2 -0
  152. package/dist/schema/db-schema/dsl/field-defs.test.d.ts.map +1 -0
  153. package/dist/schema/db-schema/dsl/field-defs.test.js +29 -0
  154. package/dist/schema/db-schema/dsl/field-defs.test.js.map +1 -0
  155. package/dist/schema/db-schema/dsl/mod.d.ts +90 -0
  156. package/dist/schema/db-schema/dsl/mod.d.ts.map +1 -0
  157. package/dist/schema/db-schema/dsl/mod.js +41 -0
  158. package/dist/schema/db-schema/dsl/mod.js.map +1 -0
  159. package/dist/schema/db-schema/hash.d.ts +2 -0
  160. package/dist/schema/db-schema/hash.d.ts.map +1 -0
  161. package/dist/schema/db-schema/hash.js +14 -0
  162. package/dist/schema/db-schema/hash.js.map +1 -0
  163. package/dist/schema/db-schema/mod.d.ts +3 -0
  164. package/dist/schema/db-schema/mod.d.ts.map +1 -0
  165. package/dist/schema/db-schema/mod.js +3 -0
  166. package/dist/schema/db-schema/mod.js.map +1 -0
  167. package/dist/schema/events.d.ts +2 -0
  168. package/dist/schema/events.d.ts.map +1 -0
  169. package/dist/schema/events.js +2 -0
  170. package/dist/schema/events.js.map +1 -0
  171. package/dist/schema/mod.d.ts +5 -3
  172. package/dist/schema/mod.d.ts.map +1 -1
  173. package/dist/schema/mod.js +5 -3
  174. package/dist/schema/mod.js.map +1 -1
  175. package/dist/schema/schema-helpers.d.ts.map +1 -1
  176. package/dist/schema/schema-helpers.js +1 -1
  177. package/dist/schema/schema-helpers.js.map +1 -1
  178. package/dist/schema/schema.d.ts +30 -23
  179. package/dist/schema/schema.d.ts.map +1 -1
  180. package/dist/schema/schema.js +48 -35
  181. package/dist/schema/schema.js.map +1 -1
  182. package/dist/schema/sqlite-state.d.ts +12 -0
  183. package/dist/schema/sqlite-state.d.ts.map +1 -0
  184. package/dist/schema/sqlite-state.js +36 -0
  185. package/dist/schema/sqlite-state.js.map +1 -0
  186. package/dist/schema/system-tables.d.ts +179 -125
  187. package/dist/schema/system-tables.d.ts.map +1 -1
  188. package/dist/schema/system-tables.js +76 -41
  189. package/dist/schema/system-tables.js.map +1 -1
  190. package/dist/schema/table-def.d.ts +37 -109
  191. package/dist/schema/table-def.d.ts.map +1 -1
  192. package/dist/schema/table-def.js +23 -66
  193. package/dist/schema/table-def.js.map +1 -1
  194. package/dist/schema/view.d.ts +3 -0
  195. package/dist/schema/view.d.ts.map +1 -0
  196. package/dist/schema/view.js +3 -0
  197. package/dist/schema/view.js.map +1 -0
  198. package/dist/schema-management/common.d.ts +7 -7
  199. package/dist/schema-management/common.d.ts.map +1 -1
  200. package/dist/schema-management/common.js.map +1 -1
  201. package/dist/schema-management/migrations.d.ts +6 -6
  202. package/dist/schema-management/migrations.d.ts.map +1 -1
  203. package/dist/schema-management/migrations.js +19 -14
  204. package/dist/schema-management/migrations.js.map +1 -1
  205. package/dist/schema-management/validate-mutation-defs.d.ts +3 -3
  206. package/dist/schema-management/validate-mutation-defs.d.ts.map +1 -1
  207. package/dist/schema-management/validate-mutation-defs.js +17 -17
  208. package/dist/schema-management/validate-mutation-defs.js.map +1 -1
  209. package/dist/sql-queries/misc.d.ts.map +1 -1
  210. package/dist/sql-queries/sql-queries.d.ts +1 -1
  211. package/dist/sql-queries/sql-queries.d.ts.map +1 -1
  212. package/dist/sql-queries/sql-queries.js.map +1 -1
  213. package/dist/sql-queries/sql-query-builder.d.ts +1 -1
  214. package/dist/sql-queries/sql-query-builder.d.ts.map +1 -1
  215. package/dist/sql-queries/sql-query-builder.js.map +1 -1
  216. package/dist/sql-queries/types.d.ts +2 -1
  217. package/dist/sql-queries/types.d.ts.map +1 -1
  218. package/dist/sql-queries/types.js.map +1 -1
  219. package/dist/sync/ClientSessionSyncProcessor.d.ts +66 -0
  220. package/dist/sync/ClientSessionSyncProcessor.d.ts.map +1 -0
  221. package/dist/sync/ClientSessionSyncProcessor.js +209 -0
  222. package/dist/sync/ClientSessionSyncProcessor.js.map +1 -0
  223. package/dist/sync/index.d.ts +1 -1
  224. package/dist/sync/index.d.ts.map +1 -1
  225. package/dist/sync/index.js +1 -1
  226. package/dist/sync/index.js.map +1 -1
  227. package/dist/sync/next/compact-events.d.ts.map +1 -1
  228. package/dist/sync/next/facts.d.ts +19 -19
  229. package/dist/sync/next/facts.d.ts.map +1 -1
  230. package/dist/sync/next/facts.js +3 -3
  231. package/dist/sync/next/facts.js.map +1 -1
  232. package/dist/sync/next/history-dag-common.d.ts +6 -7
  233. package/dist/sync/next/history-dag-common.d.ts.map +1 -1
  234. package/dist/sync/next/history-dag-common.js +4 -2
  235. package/dist/sync/next/history-dag-common.js.map +1 -1
  236. package/dist/sync/next/history-dag.d.ts.map +1 -1
  237. package/dist/sync/next/history-dag.js +2 -2
  238. package/dist/sync/next/history-dag.js.map +1 -1
  239. package/dist/sync/next/rebase-events.d.ts +10 -8
  240. package/dist/sync/next/rebase-events.d.ts.map +1 -1
  241. package/dist/sync/next/rebase-events.js +11 -8
  242. package/dist/sync/next/rebase-events.js.map +1 -1
  243. package/dist/sync/next/test/compact-events.calculator.test.js +38 -33
  244. package/dist/sync/next/test/compact-events.calculator.test.js.map +1 -1
  245. package/dist/sync/next/test/compact-events.test.js +76 -76
  246. package/dist/sync/next/test/compact-events.test.js.map +1 -1
  247. package/dist/sync/next/test/{mutation-fixtures.d.ts → event-fixtures.d.ts} +29 -29
  248. package/dist/sync/next/test/event-fixtures.d.ts.map +1 -0
  249. package/dist/sync/next/test/{mutation-fixtures.js → event-fixtures.js} +67 -36
  250. package/dist/sync/next/test/event-fixtures.js.map +1 -0
  251. package/dist/sync/next/test/mod.d.ts +1 -1
  252. package/dist/sync/next/test/mod.d.ts.map +1 -1
  253. package/dist/sync/next/test/mod.js +1 -1
  254. package/dist/sync/next/test/mod.js.map +1 -1
  255. package/dist/sync/sync.d.ts +55 -20
  256. package/dist/sync/sync.d.ts.map +1 -1
  257. package/dist/sync/sync.js +7 -3
  258. package/dist/sync/sync.js.map +1 -1
  259. package/dist/sync/syncstate.d.ts +213 -82
  260. package/dist/sync/syncstate.d.ts.map +1 -1
  261. package/dist/sync/syncstate.js +319 -120
  262. package/dist/sync/syncstate.js.map +1 -1
  263. package/dist/sync/syncstate.test.js +295 -275
  264. package/dist/sync/syncstate.test.js.map +1 -1
  265. package/dist/sync/validate-push-payload.d.ts +2 -2
  266. package/dist/sync/validate-push-payload.d.ts.map +1 -1
  267. package/dist/sync/validate-push-payload.js +2 -2
  268. package/dist/sync/validate-push-payload.js.map +1 -1
  269. package/dist/util.d.ts +2 -2
  270. package/dist/util.d.ts.map +1 -1
  271. package/dist/version.d.ts +1 -1
  272. package/dist/version.d.ts.map +1 -1
  273. package/dist/version.js +1 -1
  274. package/dist/version.js.map +1 -1
  275. package/package.json +6 -6
  276. package/src/__tests__/fixture.ts +36 -15
  277. package/src/adapter-types.ts +111 -74
  278. package/src/debug-info.ts +1 -0
  279. package/src/devtools/devtools-messages-client-session.ts +141 -0
  280. package/src/devtools/devtools-messages-common.ts +115 -0
  281. package/src/devtools/devtools-messages-leader.ts +191 -0
  282. package/src/devtools/devtools-messages.ts +3 -243
  283. package/src/devtools/devtools-sessioninfo.ts +99 -0
  284. package/src/devtools/mod.ts +36 -0
  285. package/src/index.ts +4 -13
  286. package/src/leader-thread/LeaderSyncProcessor.ts +935 -0
  287. package/src/leader-thread/apply-event.ts +173 -0
  288. package/src/leader-thread/connection.ts +54 -9
  289. package/src/leader-thread/eventlog.ts +199 -0
  290. package/src/leader-thread/leader-worker-devtools.ts +212 -189
  291. package/src/leader-thread/make-leader-thread-layer.ts +143 -77
  292. package/src/leader-thread/mod.ts +1 -1
  293. package/src/leader-thread/recreate-db.ts +41 -30
  294. package/src/leader-thread/shutdown-channel.ts +2 -4
  295. package/src/leader-thread/types.ts +95 -51
  296. package/src/materializer-helper.ts +110 -0
  297. package/src/otel.ts +8 -0
  298. package/src/query-builder/api.ts +236 -85
  299. package/src/query-builder/astToSql.ts +232 -0
  300. package/src/query-builder/impl.test.ts +447 -78
  301. package/src/query-builder/impl.ts +209 -144
  302. package/src/query-builder/mod.ts +7 -0
  303. package/src/rehydrate-from-eventlog.ts +114 -0
  304. package/src/schema/EventDef.ts +216 -0
  305. package/src/schema/EventId.test.ts +12 -0
  306. package/src/schema/EventId.ts +75 -15
  307. package/src/schema/LiveStoreEvent.ts +239 -0
  308. package/src/schema/client-document-def.test.ts +239 -0
  309. package/src/schema/client-document-def.ts +444 -0
  310. package/src/schema/db-schema/ast/sqlite.ts +142 -0
  311. package/src/schema/db-schema/ast/validate.ts +13 -0
  312. package/src/schema/db-schema/dsl/__snapshots__/field-defs.test.ts.snap +206 -0
  313. package/src/schema/db-schema/dsl/field-defs.test.ts +35 -0
  314. package/src/schema/db-schema/dsl/field-defs.ts +242 -0
  315. package/src/schema/db-schema/dsl/mod.ts +222 -0
  316. package/src/schema/db-schema/hash.ts +14 -0
  317. package/src/schema/db-schema/mod.ts +2 -0
  318. package/src/schema/events.ts +1 -0
  319. package/src/schema/mod.ts +5 -3
  320. package/src/schema/schema-helpers.ts +1 -1
  321. package/src/schema/schema.ts +84 -62
  322. package/src/schema/sqlite-state.ts +62 -0
  323. package/src/schema/system-tables.ts +68 -50
  324. package/src/schema/table-def.ts +68 -214
  325. package/src/schema/view.ts +2 -0
  326. package/src/schema-management/common.ts +7 -7
  327. package/src/schema-management/migrations.ts +27 -24
  328. package/src/schema-management/validate-mutation-defs.ts +22 -24
  329. package/src/sql-queries/sql-queries.ts +1 -1
  330. package/src/sql-queries/sql-query-builder.ts +1 -2
  331. package/src/sql-queries/types.ts +3 -1
  332. package/src/sync/ClientSessionSyncProcessor.ts +332 -0
  333. package/src/sync/index.ts +1 -1
  334. package/src/sync/next/facts.ts +32 -33
  335. package/src/sync/next/history-dag-common.ts +9 -5
  336. package/src/sync/next/history-dag.ts +2 -2
  337. package/src/sync/next/rebase-events.ts +22 -16
  338. package/src/sync/next/test/compact-events.calculator.test.ts +45 -45
  339. package/src/sync/next/test/compact-events.test.ts +78 -78
  340. package/src/sync/next/test/event-fixtures.ts +219 -0
  341. package/src/sync/next/test/mod.ts +1 -1
  342. package/src/sync/sync.ts +51 -19
  343. package/src/sync/syncstate.test.ts +335 -308
  344. package/src/sync/syncstate.ts +394 -212
  345. package/src/sync/validate-push-payload.ts +7 -4
  346. package/src/version.ts +1 -1
  347. package/tmp/pack.tgz +0 -0
  348. package/tsconfig.json +2 -1
  349. package/dist/derived-mutations.d.ts +0 -109
  350. package/dist/derived-mutations.d.ts.map +0 -1
  351. package/dist/derived-mutations.js +0 -54
  352. package/dist/derived-mutations.js.map +0 -1
  353. package/dist/derived-mutations.test.d.ts +0 -2
  354. package/dist/derived-mutations.test.d.ts.map +0 -1
  355. package/dist/derived-mutations.test.js +0 -93
  356. package/dist/derived-mutations.test.js.map +0 -1
  357. package/dist/devtools/devtools-bridge.d.ts +0 -12
  358. package/dist/devtools/devtools-bridge.d.ts.map +0 -1
  359. package/dist/devtools/devtools-bridge.js +0 -2
  360. package/dist/devtools/devtools-bridge.js.map +0 -1
  361. package/dist/devtools/index.d.ts +0 -42
  362. package/dist/devtools/index.d.ts.map +0 -1
  363. package/dist/devtools/index.js +0 -48
  364. package/dist/devtools/index.js.map +0 -1
  365. package/dist/init-singleton-tables.d.ts +0 -4
  366. package/dist/init-singleton-tables.d.ts.map +0 -1
  367. package/dist/init-singleton-tables.js +0 -16
  368. package/dist/init-singleton-tables.js.map +0 -1
  369. package/dist/leader-thread/apply-mutation.d.ts +0 -8
  370. package/dist/leader-thread/apply-mutation.d.ts.map +0 -1
  371. package/dist/leader-thread/apply-mutation.js +0 -95
  372. package/dist/leader-thread/apply-mutation.js.map +0 -1
  373. package/dist/leader-thread/leader-sync-processor.d.ts +0 -47
  374. package/dist/leader-thread/leader-sync-processor.d.ts.map +0 -1
  375. package/dist/leader-thread/leader-sync-processor.js +0 -422
  376. package/dist/leader-thread/leader-sync-processor.js.map +0 -1
  377. package/dist/leader-thread/mutationlog.d.ts +0 -23
  378. package/dist/leader-thread/mutationlog.d.ts.map +0 -1
  379. package/dist/leader-thread/mutationlog.js +0 -27
  380. package/dist/leader-thread/mutationlog.js.map +0 -1
  381. package/dist/leader-thread/pull-queue-set.d.ts +0 -7
  382. package/dist/leader-thread/pull-queue-set.d.ts.map +0 -1
  383. package/dist/leader-thread/pull-queue-set.js +0 -39
  384. package/dist/leader-thread/pull-queue-set.js.map +0 -1
  385. package/dist/mutation.d.ts +0 -13
  386. package/dist/mutation.d.ts.map +0 -1
  387. package/dist/mutation.js +0 -57
  388. package/dist/mutation.js.map +0 -1
  389. package/dist/query-info.d.ts +0 -38
  390. package/dist/query-info.d.ts.map +0 -1
  391. package/dist/query-info.js +0 -7
  392. package/dist/query-info.js.map +0 -1
  393. package/dist/rehydrate-from-mutationlog.d.ts +0 -14
  394. package/dist/rehydrate-from-mutationlog.d.ts.map +0 -1
  395. package/dist/rehydrate-from-mutationlog.js +0 -72
  396. package/dist/rehydrate-from-mutationlog.js.map +0 -1
  397. package/dist/schema/MutationEvent.d.ts +0 -191
  398. package/dist/schema/MutationEvent.d.ts.map +0 -1
  399. package/dist/schema/MutationEvent.js +0 -56
  400. package/dist/schema/MutationEvent.js.map +0 -1
  401. package/dist/schema/mutations.d.ts +0 -107
  402. package/dist/schema/mutations.d.ts.map +0 -1
  403. package/dist/schema/mutations.js +0 -42
  404. package/dist/schema/mutations.js.map +0 -1
  405. package/dist/sync/client-session-sync-processor.d.ts +0 -45
  406. package/dist/sync/client-session-sync-processor.d.ts.map +0 -1
  407. package/dist/sync/client-session-sync-processor.js +0 -131
  408. package/dist/sync/client-session-sync-processor.js.map +0 -1
  409. package/dist/sync/next/test/mutation-fixtures.d.ts.map +0 -1
  410. package/dist/sync/next/test/mutation-fixtures.js.map +0 -1
  411. package/src/derived-mutations.test.ts +0 -101
  412. package/src/derived-mutations.ts +0 -166
  413. package/src/devtools/devtools-bridge.ts +0 -13
  414. package/src/devtools/index.ts +0 -48
  415. package/src/init-singleton-tables.ts +0 -24
  416. package/src/leader-thread/apply-mutation.ts +0 -143
  417. package/src/leader-thread/leader-sync-processor.ts +0 -666
  418. package/src/leader-thread/mutationlog.ts +0 -42
  419. package/src/leader-thread/pull-queue-set.ts +0 -58
  420. package/src/mutation.ts +0 -81
  421. package/src/query-info.ts +0 -78
  422. package/src/rehydrate-from-mutationlog.ts +0 -127
  423. package/src/schema/MutationEvent.ts +0 -161
  424. package/src/schema/mutations.ts +0 -192
  425. package/src/sync/client-session-sync-processor.ts +0 -207
  426. package/src/sync/next/test/mutation-fixtures.ts +0 -231
@@ -0,0 +1,142 @@
1
+ import { type Option, Schema } from '@livestore/utils/effect'
2
+
3
+ import { hashCode } from '../hash.js'
4
+
5
+ export namespace ColumnType {
6
+ export type ColumnType = Text | Null | Real | Integer | Blob
7
+
8
+ export type Text = { _tag: 'text' }
9
+
10
+ export type Null = { _tag: 'null' }
11
+
12
+ export type Real = { _tag: 'real' }
13
+
14
+ export type Integer = { _tag: 'integer' }
15
+
16
+ export type Blob = { _tag: 'blob' }
17
+ }
18
+
19
+ export type Column = {
20
+ _tag: 'column'
21
+ name: string
22
+ type: ColumnType.ColumnType
23
+ primaryKey: boolean
24
+ nullable: boolean
25
+ default: Option.Option<any>
26
+ schema: Schema.Schema<any>
27
+ }
28
+
29
+ export const column = (props: Omit<Column, '_tag'>): Column => ({ _tag: 'column', ...props })
30
+
31
+ export type Index = {
32
+ _tag: 'index'
33
+ columns: ReadonlyArray<string>
34
+ name?: string
35
+ unique?: boolean
36
+ primaryKey?: boolean
37
+ }
38
+
39
+ export const index = (
40
+ columns: ReadonlyArray<string>,
41
+ name?: string,
42
+ unique?: boolean,
43
+ primaryKey?: boolean,
44
+ ): Index => ({
45
+ _tag: 'index',
46
+ columns,
47
+ name,
48
+ unique,
49
+ primaryKey,
50
+ })
51
+
52
+ export type ForeignKey = {
53
+ _tag: 'foreignKey'
54
+ references: {
55
+ table: string
56
+ columns: ReadonlyArray<string>
57
+ }
58
+ key: {
59
+ table: string
60
+ columns: ReadonlyArray<string>
61
+ }
62
+ columns: ReadonlyArray<string>
63
+ }
64
+
65
+ export type Table = {
66
+ _tag: 'table'
67
+ name: string
68
+ columns: ReadonlyArray<Column>
69
+ indexes: ReadonlyArray<Index>
70
+ }
71
+
72
+ export const table = (name: string, columns: ReadonlyArray<Column>, indexes: ReadonlyArray<Index>): Table => ({
73
+ _tag: 'table',
74
+ name,
75
+ columns,
76
+ indexes,
77
+ })
78
+
79
+ export type DbSchema = {
80
+ _tag: 'dbSchema'
81
+ tables: Table[]
82
+ }
83
+
84
+ export const dbSchema = (tables: Table[]): DbSchema => ({ _tag: 'dbSchema', tables })
85
+
86
+ /**
87
+ * NOTE we're only including SQLite-relevant information in the hash (which excludes the schema mapping)
88
+ */
89
+ export const hash = (obj: Table | Column | Index | ForeignKey | DbSchema): number =>
90
+ hashCode(JSON.stringify(trimInfoForHasing(obj)))
91
+
92
+ const trimInfoForHasing = (obj: Table | Column | Index | ForeignKey | DbSchema): Record<string, any> => {
93
+ switch (obj._tag) {
94
+ case 'table': {
95
+ return {
96
+ _tag: 'table',
97
+ name: obj.name,
98
+ columns: obj.columns.map((column) => trimInfoForHasing(column)),
99
+ indexes: obj.indexes.map((index) => trimInfoForHasing(index)),
100
+ }
101
+ }
102
+ case 'column': {
103
+ return {
104
+ _tag: 'column',
105
+ name: obj.name,
106
+ type: obj.type._tag,
107
+ primaryKey: obj.primaryKey,
108
+ nullable: obj.nullable,
109
+ default: obj.default,
110
+ }
111
+ }
112
+ case 'index': {
113
+ return {
114
+ _tag: 'index',
115
+ columns: obj.columns,
116
+ name: obj.name,
117
+ unique: obj.unique,
118
+ primaryKey: obj.primaryKey,
119
+ }
120
+ }
121
+ case 'foreignKey': {
122
+ return {
123
+ _tag: 'foreignKey',
124
+ references: obj.references,
125
+ key: obj.key,
126
+ columns: obj.columns,
127
+ }
128
+ }
129
+ case 'dbSchema': {
130
+ return {
131
+ _tag: 'dbSchema',
132
+ tables: obj.tables.map(trimInfoForHasing),
133
+ }
134
+ }
135
+ default: {
136
+ throw new Error(`Unreachable: ${obj}`)
137
+ }
138
+ }
139
+ }
140
+
141
+ export const structSchemaForTable = (tableDef: Table) =>
142
+ Schema.Struct(Object.fromEntries(tableDef.columns.map((column) => [column.name, column.schema])))
@@ -0,0 +1,13 @@
1
+ import type { DbSchema } from './sqlite.js'
2
+
3
+ // TODO
4
+ export const validate = (_dbSchema: DbSchema) => {
5
+ /*
6
+ TODO:
7
+
8
+ - ensure no duplicate table names
9
+ - ensure no duplicate column names within a table
10
+ - ensure no duplicate index names globally
11
+ - ...
12
+ */
13
+ }
@@ -0,0 +1,206 @@
1
+ // Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html
2
+
3
+ exports[`FieldDefs > boolean 1`] = `
4
+ {
5
+ "columnType": "text",
6
+ "default": {
7
+ "_id": "Option",
8
+ "_tag": "None",
9
+ },
10
+ "nullable": false,
11
+ "primaryKey": false,
12
+ "schema": [Function],
13
+ }
14
+ `;
15
+
16
+ exports[`FieldDefs > boolean 2`] = `
17
+ {
18
+ "columnType": "text",
19
+ "default": {
20
+ "_id": "Option",
21
+ "_tag": "None",
22
+ },
23
+ "nullable": false,
24
+ "primaryKey": false,
25
+ "schema": [Function],
26
+ }
27
+ `;
28
+
29
+ exports[`FieldDefs > boolean 3`] = `
30
+ {
31
+ "columnType": "text",
32
+ "default": {
33
+ "_id": "Option",
34
+ "_tag": "Some",
35
+ "value": null,
36
+ },
37
+ "nullable": true,
38
+ "primaryKey": false,
39
+ "schema": [Function],
40
+ }
41
+ `;
42
+
43
+ exports[`FieldDefs > boolean 4`] = `
44
+ {
45
+ "columnType": "text",
46
+ "default": {
47
+ "_id": "Option",
48
+ "_tag": "Some",
49
+ "value": "foo",
50
+ },
51
+ "nullable": true,
52
+ "primaryKey": false,
53
+ "schema": [Function],
54
+ }
55
+ `;
56
+
57
+ exports[`FieldDefs > boolean 5`] = `
58
+ {
59
+ "columnType": "text",
60
+ "default": {
61
+ "_id": "Option",
62
+ "_tag": "Some",
63
+ "value": "foo",
64
+ },
65
+ "nullable": true,
66
+ "primaryKey": false,
67
+ "schema": [Function],
68
+ }
69
+ `;
70
+
71
+ exports[`FieldDefs > boolean 6`] = `
72
+ {
73
+ "columnType": "text",
74
+ "default": {
75
+ "_id": "Option",
76
+ "_tag": "None",
77
+ },
78
+ "nullable": false,
79
+ "primaryKey": false,
80
+ "schema": [Function],
81
+ }
82
+ `;
83
+
84
+ exports[`FieldDefs > boolean 7`] = `
85
+ {
86
+ "columnType": "text",
87
+ "default": {
88
+ "_id": "Option",
89
+ "_tag": "Some",
90
+ "value": null,
91
+ },
92
+ "nullable": true,
93
+ "primaryKey": false,
94
+ "schema": [Function],
95
+ }
96
+ `;
97
+
98
+ exports[`FieldDefs > boolean 8`] = `
99
+ {
100
+ "columnType": "text",
101
+ "default": {
102
+ "_id": "Option",
103
+ "_tag": "Some",
104
+ "value": {
105
+ "name": "Bob",
106
+ },
107
+ },
108
+ "nullable": true,
109
+ "primaryKey": false,
110
+ "schema": [Function],
111
+ }
112
+ `;
113
+
114
+ exports[`FieldDefs > boolean 9`] = `
115
+ {
116
+ "columnType": "text",
117
+ "default": {
118
+ "_id": "Option",
119
+ "_tag": "None",
120
+ },
121
+ "nullable": false,
122
+ "primaryKey": false,
123
+ "schema": [Function],
124
+ }
125
+ `;
126
+
127
+ exports[`FieldDefs > boolean 10`] = `
128
+ {
129
+ "columnType": "text",
130
+ "default": {
131
+ "_id": "Option",
132
+ "_tag": "None",
133
+ },
134
+ "nullable": false,
135
+ "primaryKey": false,
136
+ "schema": [Function],
137
+ }
138
+ `;
139
+
140
+ exports[`FieldDefs > boolean 11`] = `
141
+ {
142
+ "columnType": "text",
143
+ "default": {
144
+ "_id": "Option",
145
+ "_tag": "Some",
146
+ "value": null,
147
+ },
148
+ "nullable": true,
149
+ "primaryKey": false,
150
+ "schema": [Function],
151
+ }
152
+ `;
153
+
154
+ exports[`FieldDefs > boolean 12`] = `
155
+ {
156
+ "columnType": "text",
157
+ "default": {
158
+ "_id": "Option",
159
+ "_tag": "Some",
160
+ "value": 2022-02-02T00:00:00.000Z,
161
+ },
162
+ "nullable": false,
163
+ "primaryKey": false,
164
+ "schema": [Function],
165
+ }
166
+ `;
167
+
168
+ exports[`FieldDefs > boolean 13`] = `
169
+ {
170
+ "columnType": "integer",
171
+ "default": {
172
+ "_id": "Option",
173
+ "_tag": "None",
174
+ },
175
+ "nullable": false,
176
+ "primaryKey": false,
177
+ "schema": [Function],
178
+ }
179
+ `;
180
+
181
+ exports[`FieldDefs > boolean 14`] = `
182
+ {
183
+ "columnType": "integer",
184
+ "default": {
185
+ "_id": "Option",
186
+ "_tag": "None",
187
+ },
188
+ "nullable": false,
189
+ "primaryKey": false,
190
+ "schema": [Function],
191
+ }
192
+ `;
193
+
194
+ exports[`FieldDefs > boolean 15`] = `
195
+ {
196
+ "columnType": "integer",
197
+ "default": {
198
+ "_id": "Option",
199
+ "_tag": "Some",
200
+ "value": false,
201
+ },
202
+ "nullable": false,
203
+ "primaryKey": false,
204
+ "schema": [Function],
205
+ }
206
+ `;
@@ -0,0 +1,35 @@
1
+ import { Schema } from '@livestore/utils/effect'
2
+ import { describe, expect, test } from 'vitest'
3
+
4
+ import * as F from './field-defs.js'
5
+
6
+ describe.concurrent('FieldDefs', () => {
7
+ test('text', () => {
8
+ expect(F.text()).toMatchSnapshot()
9
+ expect(F.text({})).toMatchSnapshot()
10
+ expect(F.text({ default: null, nullable: true })).toMatchSnapshot()
11
+ expect(F.text({ schema: Schema.Literal('foo'), nullable: true, default: 'foo' })).toMatchSnapshot()
12
+ expect(F.text({ schema: Schema.Union(Schema.Literal('foo')), nullable: true, default: 'foo' })).toMatchSnapshot()
13
+ })
14
+
15
+ test('json', () => {
16
+ expect(F.json()).toMatchSnapshot()
17
+ expect(F.json({ default: null, nullable: true })).toMatchSnapshot()
18
+ expect(
19
+ F.json({ schema: Schema.Struct({ name: Schema.String }), default: { name: 'Bob' }, nullable: true }),
20
+ ).toMatchSnapshot()
21
+ })
22
+
23
+ test('datetime', () => {
24
+ expect(F.datetime()).toMatchSnapshot()
25
+ expect(F.datetime({})).toMatchSnapshot()
26
+ expect(F.datetime({ default: null, nullable: true })).toMatchSnapshot()
27
+ expect(F.datetime({ default: new Date('2022-02-02') })).toMatchSnapshot()
28
+ })
29
+
30
+ test('boolean', () => {
31
+ expect(F.boolean()).toMatchSnapshot()
32
+ expect(F.boolean({})).toMatchSnapshot()
33
+ expect(F.boolean({ default: false })).toMatchSnapshot()
34
+ })
35
+ })
@@ -0,0 +1,242 @@
1
+ import { casesHandled } from '@livestore/utils'
2
+ import { Option, Schema } from '@livestore/utils/effect'
3
+
4
+ export type ColumnDefinition<TEncoded, TDecoded> = {
5
+ readonly columnType: FieldColumnType
6
+ readonly schema: Schema.Schema<TDecoded, TEncoded>
7
+ readonly default: Option.Option<TEncoded>
8
+ /** @default false */
9
+ readonly nullable: boolean
10
+ /** @default false */
11
+ readonly primaryKey: boolean
12
+ }
13
+
14
+ export const isColumnDefinition = (value: unknown): value is ColumnDefinition<any, any> => {
15
+ const validColumnTypes = ['text', 'integer', 'real', 'blob'] as const
16
+ return (
17
+ typeof value === 'object' &&
18
+ value !== null &&
19
+ 'columnType' in value &&
20
+ validColumnTypes.includes(value['columnType'] as any)
21
+ )
22
+ }
23
+
24
+ export type ColumnDefinitionInput = {
25
+ readonly schema?: Schema.Schema<unknown>
26
+ readonly default?: unknown | NoDefault
27
+ readonly nullable?: boolean
28
+ readonly primaryKey?: boolean
29
+ }
30
+
31
+ export const NoDefault = Symbol.for('NoDefault')
32
+ export type NoDefault = typeof NoDefault
33
+
34
+ export type SqlDefaultValue = {
35
+ readonly sql: string
36
+ }
37
+
38
+ export const isSqlDefaultValue = (value: unknown): value is SqlDefaultValue => {
39
+ return typeof value === 'object' && value !== null && 'sql' in value && typeof value['sql'] === 'string'
40
+ }
41
+
42
+ export type ColDefFn<TColumnType extends FieldColumnType> = {
43
+ (): {
44
+ columnType: TColumnType
45
+ schema: Schema.Schema<DefaultEncodedForColumnType<TColumnType>>
46
+ default: Option.None<never>
47
+ nullable: false
48
+ primaryKey: false
49
+ }
50
+ <
51
+ TEncoded extends DefaultEncodedForColumnType<TColumnType>,
52
+ TDecoded = DefaultEncodedForColumnType<TColumnType>,
53
+ const TNullable extends boolean = false,
54
+ const TDefault extends TDecoded | SqlDefaultValue | NoDefault | (TNullable extends true ? null : never) = NoDefault,
55
+ const TPrimaryKey extends boolean = false,
56
+ >(args: {
57
+ schema?: Schema.Schema<TDecoded, TEncoded>
58
+ default?: TDefault
59
+ nullable?: TNullable
60
+ primaryKey?: TPrimaryKey
61
+ }): {
62
+ columnType: TColumnType
63
+ schema: TNullable extends true
64
+ ? Schema.Schema<NoInfer<TDecoded> | null, NoInfer<TEncoded> | null>
65
+ : Schema.Schema<NoInfer<TDecoded>, NoInfer<TEncoded>>
66
+ default: TDefault extends NoDefault ? Option.None<never> : Option.Some<NoInfer<TDefault>>
67
+ nullable: NoInfer<TNullable>
68
+ primaryKey: NoInfer<TPrimaryKey>
69
+ }
70
+ }
71
+
72
+ const makeColDef =
73
+ <TColumnType extends FieldColumnType>(columnType: TColumnType): ColDefFn<TColumnType> =>
74
+ (def?: ColumnDefinitionInput) => {
75
+ const nullable = def?.nullable ?? false
76
+ const schemaWithoutNull: Schema.Schema<any> = def?.schema ?? defaultSchemaForColumnType(columnType)
77
+ const schema = nullable === true ? Schema.NullOr(schemaWithoutNull) : schemaWithoutNull
78
+ const default_ = def?.default === undefined || def.default === NoDefault ? Option.none() : Option.some(def.default)
79
+
80
+ return {
81
+ columnType,
82
+ schema,
83
+ default: default_,
84
+ nullable,
85
+ primaryKey: def?.primaryKey ?? false,
86
+ } as any
87
+ }
88
+
89
+ export const column = <TColumnType extends FieldColumnType>(columnType: TColumnType): ColDefFn<TColumnType> =>
90
+ makeColDef(columnType)
91
+
92
+ /// Column definitions
93
+
94
+ export const text: ColDefFn<'text'> = makeColDef('text')
95
+ export const integer: ColDefFn<'integer'> = makeColDef('integer')
96
+ export const real: ColDefFn<'real'> = makeColDef('real')
97
+ export const blob: ColDefFn<'blob'> = makeColDef('blob')
98
+
99
+ /**
100
+ * `NoInfer` is needed for some generics to work properly in certain cases.
101
+ * See full explanation here: https://gist.github.com/schickling/a15e96819826530492b41a10d79d3c04?permalink_comment_id=4805120#gistcomment-4805120
102
+ *
103
+ * Big thanks to @andarist for their help with this!
104
+ */
105
+ type NoInfer<T> = [T][T extends any ? 0 : never]
106
+
107
+ export type SpecializedColDefFn<
108
+ TColumnType extends FieldColumnType,
109
+ TAllowsCustomSchema extends boolean,
110
+ TBaseDecoded,
111
+ > = {
112
+ (): {
113
+ columnType: TColumnType
114
+ schema: Schema.Schema<TBaseDecoded, DefaultEncodedForColumnType<TColumnType>>
115
+ default: Option.None<never>
116
+ nullable: false
117
+ primaryKey: false
118
+ }
119
+ <
120
+ TDecoded = TBaseDecoded,
121
+ const TNullable extends boolean = false,
122
+ const TDefault extends TDecoded | NoDefault | (TNullable extends true ? null : never) = NoDefault,
123
+ const TPrimaryKey extends boolean = false,
124
+ >(
125
+ args: TAllowsCustomSchema extends true
126
+ ? {
127
+ schema?: Schema.Schema<TDecoded, any>
128
+ default?: TDefault
129
+ nullable?: TNullable
130
+ primaryKey?: TPrimaryKey
131
+ }
132
+ : {
133
+ default?: TDefault
134
+ nullable?: TNullable
135
+ primaryKey?: TPrimaryKey
136
+ },
137
+ ): {
138
+ columnType: TColumnType
139
+ schema: TNullable extends true
140
+ ? Schema.Schema<NoInfer<TDecoded> | null, DefaultEncodedForColumnType<TColumnType> | null>
141
+ : Schema.Schema<NoInfer<TDecoded>, DefaultEncodedForColumnType<TColumnType>>
142
+ default: TDefault extends NoDefault ? Option.None<never> : Option.Some<TDefault>
143
+ nullable: NoInfer<TNullable>
144
+ primaryKey: NoInfer<TPrimaryKey>
145
+ }
146
+ }
147
+
148
+ type MakeSpecializedColDefFn = {
149
+ <TColumnType extends FieldColumnType, TBaseDecoded>(
150
+ columnType: TColumnType,
151
+ opts: {
152
+ _tag: 'baseSchema'
153
+ baseSchema: Schema.Schema<TBaseDecoded, DefaultEncodedForColumnType<TColumnType>>
154
+ },
155
+ ): SpecializedColDefFn<TColumnType, false, TBaseDecoded>
156
+ <TColumnType extends FieldColumnType, TBaseDecoded>(
157
+ columnType: TColumnType,
158
+ opts: {
159
+ _tag: 'baseSchemaFn'
160
+ baseSchemaFn: <TDecoded>(
161
+ customSchema: Schema.Schema<TDecoded, TBaseDecoded> | undefined,
162
+ ) => Schema.Schema<TBaseDecoded, DefaultEncodedForColumnType<TColumnType>>
163
+ },
164
+ ): SpecializedColDefFn<TColumnType, true, TBaseDecoded>
165
+ }
166
+
167
+ const makeSpecializedColDef: MakeSpecializedColDefFn = (columnType, opts) => (def?: ColumnDefinitionInput) => {
168
+ const nullable = def?.nullable ?? false
169
+ const schemaWithoutNull = opts._tag === 'baseSchemaFn' ? opts.baseSchemaFn(def?.schema as any) : opts.baseSchema
170
+ const schema = nullable === true ? Schema.NullOr(schemaWithoutNull) : schemaWithoutNull
171
+ const default_ = def?.default === undefined || def.default === NoDefault ? Option.none() : Option.some(def.default)
172
+
173
+ return {
174
+ columnType,
175
+ schema,
176
+ default: default_,
177
+ nullable,
178
+ primaryKey: def?.primaryKey ?? false,
179
+ } as any
180
+ }
181
+
182
+ export const json: SpecializedColDefFn<'text', true, unknown> = makeSpecializedColDef('text', {
183
+ _tag: 'baseSchemaFn',
184
+ baseSchemaFn: (customSchema) => Schema.parseJson(customSchema ?? Schema.Any),
185
+ })
186
+
187
+ export const datetime: SpecializedColDefFn<'text', false, Date> = makeSpecializedColDef('text', {
188
+ _tag: 'baseSchema',
189
+ baseSchema: Schema.Date,
190
+ })
191
+
192
+ export const datetimeInteger: SpecializedColDefFn<'integer', false, Date> = makeSpecializedColDef('integer', {
193
+ _tag: 'baseSchema',
194
+ baseSchema: Schema.transform(Schema.Number, Schema.DateFromSelf, {
195
+ decode: (ms) => new Date(ms),
196
+ encode: (date) => date.getTime(),
197
+ }),
198
+ })
199
+
200
+ export const boolean: SpecializedColDefFn<'integer', false, boolean> = makeSpecializedColDef('integer', {
201
+ _tag: 'baseSchema',
202
+ baseSchema: Schema.transform(Schema.Number, Schema.Boolean, {
203
+ decode: (_) => _ === 1,
204
+ encode: (_) => (_ ? 1 : 0),
205
+ }),
206
+ })
207
+
208
+ export type FieldColumnType = 'text' | 'integer' | 'real' | 'blob'
209
+
210
+ export type DefaultEncodedForColumnType<TColumnType extends FieldColumnType> = TColumnType extends 'text'
211
+ ? string
212
+ : TColumnType extends 'integer'
213
+ ? number
214
+ : TColumnType extends 'real'
215
+ ? number
216
+ : TColumnType extends 'blob'
217
+ ? Uint8Array
218
+ : never
219
+
220
+ export const defaultSchemaForColumnType = <TColumnType extends FieldColumnType>(
221
+ columnType: TColumnType,
222
+ ): Schema.Schema<DefaultEncodedForColumnType<TColumnType>> => {
223
+ type T = DefaultEncodedForColumnType<TColumnType>
224
+
225
+ switch (columnType) {
226
+ case 'text': {
227
+ return Schema.String as any as Schema.Schema<T>
228
+ }
229
+ case 'integer': {
230
+ return Schema.Number as any as Schema.Schema<T>
231
+ }
232
+ case 'real': {
233
+ return Schema.Number as any as Schema.Schema<T>
234
+ }
235
+ case 'blob': {
236
+ return Schema.Uint8ArrayFromSelf as any as Schema.Schema<T>
237
+ }
238
+ default: {
239
+ return casesHandled(columnType)
240
+ }
241
+ }
242
+ }