@evolu/common 8.9.0 → 8.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (337) hide show
  1. package/dist/src/Bytes.d.ts +647 -0
  2. package/dist/src/Bytes.d.ts.map +1 -0
  3. package/dist/src/{Binary.js → Bytes.js} +266 -16
  4. package/dist/src/Config.d.ts +142 -0
  5. package/dist/src/Config.d.ts.map +1 -0
  6. package/dist/src/Config.js +181 -0
  7. package/dist/src/Console.d.ts +62 -7
  8. package/dist/src/Console.d.ts.map +1 -1
  9. package/dist/src/Console.js +20 -4
  10. package/dist/src/Crypto.d.ts +76 -4
  11. package/dist/src/Crypto.d.ts.map +1 -1
  12. package/dist/src/Crypto.js +55 -4
  13. package/dist/src/Error.d.ts +45 -0
  14. package/dist/src/Error.d.ts.map +1 -1
  15. package/dist/src/Error.js +69 -0
  16. package/dist/src/Fs.d.ts +376 -0
  17. package/dist/src/Fs.d.ts.map +1 -0
  18. package/dist/src/Fs.js +113 -0
  19. package/dist/src/Identicon.d.ts +2 -2
  20. package/dist/src/Identicon.js +2 -2
  21. package/dist/src/LeakDetector.d.ts +22 -3
  22. package/dist/src/LeakDetector.d.ts.map +1 -1
  23. package/dist/src/LeakDetector.js +12 -2
  24. package/dist/src/LockManager.d.ts +8 -0
  25. package/dist/src/LockManager.d.ts.map +1 -1
  26. package/dist/src/LockManager.js +6 -0
  27. package/dist/src/Number.d.ts +50 -7
  28. package/dist/src/Number.d.ts.map +1 -1
  29. package/dist/src/Number.js +47 -8
  30. package/dist/src/Object.d.ts +32 -0
  31. package/dist/src/Object.d.ts.map +1 -1
  32. package/dist/src/Object.js +46 -0
  33. package/dist/src/Platform.d.ts +47 -7
  34. package/dist/src/Platform.d.ts.map +1 -1
  35. package/dist/src/Platform.js +24 -5
  36. package/dist/src/Random.d.ts +25 -2
  37. package/dist/src/Random.d.ts.map +1 -1
  38. package/dist/src/Random.js +14 -2
  39. package/dist/src/Resource.d.ts +156 -1
  40. package/dist/src/Resource.d.ts.map +1 -1
  41. package/dist/src/Resource.js +201 -72
  42. package/dist/src/Schedule.d.ts +11 -10
  43. package/dist/src/Schedule.d.ts.map +1 -1
  44. package/dist/src/Schedule.js +1 -1
  45. package/dist/src/Sqlite.d.ts +132 -16
  46. package/dist/src/Sqlite.d.ts.map +1 -1
  47. package/dist/src/Sqlite.js +64 -10
  48. package/dist/src/Task.d.ts +15 -4
  49. package/dist/src/Task.d.ts.map +1 -1
  50. package/dist/src/Task.js +41 -15
  51. package/dist/src/Test.d.ts +9 -0
  52. package/dist/src/Test.d.ts.map +1 -1
  53. package/dist/src/Test.js +4 -0
  54. package/dist/src/Time.d.ts +179 -20
  55. package/dist/src/Time.d.ts.map +1 -1
  56. package/dist/src/Time.js +95 -6
  57. package/dist/src/Type.d.ts +3056 -1539
  58. package/dist/src/Type.d.ts.map +1 -1
  59. package/dist/src/Type.js +2548 -584
  60. package/dist/src/WebSocket.d.ts +164 -13
  61. package/dist/src/WebSocket.d.ts.map +1 -1
  62. package/dist/src/WebSocket.js +133 -24
  63. package/dist/src/Worker.d.ts +90 -8
  64. package/dist/src/Worker.d.ts.map +1 -1
  65. package/dist/src/Worker.js +28 -2
  66. package/dist/src/index.d.ts +9 -8
  67. package/dist/src/index.d.ts.map +1 -1
  68. package/dist/src/index.js +5 -4
  69. package/dist/src/intl/_en.d.ts +24 -1
  70. package/dist/src/intl/_en.d.ts.map +1 -1
  71. package/dist/src/intl/_en.js +20 -0
  72. package/dist/src/intl/ar.d.ts +24 -1
  73. package/dist/src/intl/ar.d.ts.map +1 -1
  74. package/dist/src/intl/ar.js +20 -0
  75. package/dist/src/intl/bn.d.ts +24 -1
  76. package/dist/src/intl/bn.d.ts.map +1 -1
  77. package/dist/src/intl/bn.js +20 -0
  78. package/dist/src/intl/ca.d.ts +24 -1
  79. package/dist/src/intl/ca.d.ts.map +1 -1
  80. package/dist/src/intl/ca.js +20 -0
  81. package/dist/src/intl/cs.d.ts +24 -1
  82. package/dist/src/intl/cs.d.ts.map +1 -1
  83. package/dist/src/intl/cs.js +20 -0
  84. package/dist/src/intl/da.d.ts +24 -1
  85. package/dist/src/intl/da.d.ts.map +1 -1
  86. package/dist/src/intl/da.js +20 -0
  87. package/dist/src/intl/de.d.ts +24 -1
  88. package/dist/src/intl/de.d.ts.map +1 -1
  89. package/dist/src/intl/de.js +20 -0
  90. package/dist/src/intl/el.d.ts +24 -1
  91. package/dist/src/intl/el.d.ts.map +1 -1
  92. package/dist/src/intl/el.js +20 -0
  93. package/dist/src/intl/es.d.ts +24 -1
  94. package/dist/src/intl/es.d.ts.map +1 -1
  95. package/dist/src/intl/es.js +20 -0
  96. package/dist/src/intl/fa.d.ts +24 -1
  97. package/dist/src/intl/fa.d.ts.map +1 -1
  98. package/dist/src/intl/fa.js +20 -0
  99. package/dist/src/intl/fi.d.ts +24 -1
  100. package/dist/src/intl/fi.d.ts.map +1 -1
  101. package/dist/src/intl/fi.js +20 -0
  102. package/dist/src/intl/fil.d.ts +24 -1
  103. package/dist/src/intl/fil.d.ts.map +1 -1
  104. package/dist/src/intl/fil.js +20 -0
  105. package/dist/src/intl/fr.d.ts +24 -1
  106. package/dist/src/intl/fr.d.ts.map +1 -1
  107. package/dist/src/intl/fr.js +20 -0
  108. package/dist/src/intl/he.d.ts +24 -1
  109. package/dist/src/intl/he.d.ts.map +1 -1
  110. package/dist/src/intl/he.js +20 -0
  111. package/dist/src/intl/hi.d.ts +24 -1
  112. package/dist/src/intl/hi.d.ts.map +1 -1
  113. package/dist/src/intl/hi.js +20 -0
  114. package/dist/src/intl/hr.d.ts +24 -1
  115. package/dist/src/intl/hr.d.ts.map +1 -1
  116. package/dist/src/intl/hr.js +20 -0
  117. package/dist/src/intl/hu.d.ts +22 -1
  118. package/dist/src/intl/hu.d.ts.map +1 -1
  119. package/dist/src/intl/hu.js +18 -0
  120. package/dist/src/intl/id.d.ts +24 -1
  121. package/dist/src/intl/id.d.ts.map +1 -1
  122. package/dist/src/intl/id.js +20 -0
  123. package/dist/src/intl/it.d.ts +24 -1
  124. package/dist/src/intl/it.d.ts.map +1 -1
  125. package/dist/src/intl/it.js +20 -0
  126. package/dist/src/intl/ja.d.ts +24 -1
  127. package/dist/src/intl/ja.d.ts.map +1 -1
  128. package/dist/src/intl/ja.js +20 -0
  129. package/dist/src/intl/ko.d.ts +24 -1
  130. package/dist/src/intl/ko.d.ts.map +1 -1
  131. package/dist/src/intl/ko.js +20 -0
  132. package/dist/src/intl/ml.d.ts +24 -1
  133. package/dist/src/intl/ml.d.ts.map +1 -1
  134. package/dist/src/intl/ml.js +20 -0
  135. package/dist/src/intl/mr.d.ts +24 -1
  136. package/dist/src/intl/mr.d.ts.map +1 -1
  137. package/dist/src/intl/mr.js +20 -0
  138. package/dist/src/intl/ms.d.ts +24 -1
  139. package/dist/src/intl/ms.d.ts.map +1 -1
  140. package/dist/src/intl/ms.js +20 -0
  141. package/dist/src/intl/nb.d.ts +22 -1
  142. package/dist/src/intl/nb.d.ts.map +1 -1
  143. package/dist/src/intl/nb.js +18 -0
  144. package/dist/src/intl/nl.d.ts +24 -1
  145. package/dist/src/intl/nl.d.ts.map +1 -1
  146. package/dist/src/intl/nl.js +20 -0
  147. package/dist/src/intl/pa.d.ts +24 -1
  148. package/dist/src/intl/pa.d.ts.map +1 -1
  149. package/dist/src/intl/pa.js +20 -0
  150. package/dist/src/intl/pl.d.ts +23 -0
  151. package/dist/src/intl/pl.d.ts.map +1 -1
  152. package/dist/src/intl/pl.js +20 -0
  153. package/dist/src/intl/pt-BR.d.ts +24 -1
  154. package/dist/src/intl/pt-BR.d.ts.map +1 -1
  155. package/dist/src/intl/pt-BR.js +20 -0
  156. package/dist/src/intl/pt.d.ts +24 -1
  157. package/dist/src/intl/pt.d.ts.map +1 -1
  158. package/dist/src/intl/pt.js +20 -0
  159. package/dist/src/intl/ro.d.ts +24 -1
  160. package/dist/src/intl/ro.d.ts.map +1 -1
  161. package/dist/src/intl/ro.js +20 -0
  162. package/dist/src/intl/sk.d.ts +24 -1
  163. package/dist/src/intl/sk.d.ts.map +1 -1
  164. package/dist/src/intl/sk.js +20 -0
  165. package/dist/src/intl/sl.d.ts +24 -1
  166. package/dist/src/intl/sl.d.ts.map +1 -1
  167. package/dist/src/intl/sl.js +20 -0
  168. package/dist/src/intl/sv.d.ts +24 -1
  169. package/dist/src/intl/sv.d.ts.map +1 -1
  170. package/dist/src/intl/sv.js +20 -0
  171. package/dist/src/intl/sw.d.ts +21 -0
  172. package/dist/src/intl/sw.d.ts.map +1 -1
  173. package/dist/src/intl/sw.js +18 -0
  174. package/dist/src/intl/ta.d.ts +24 -1
  175. package/dist/src/intl/ta.d.ts.map +1 -1
  176. package/dist/src/intl/ta.js +20 -0
  177. package/dist/src/intl/te.d.ts +24 -1
  178. package/dist/src/intl/te.d.ts.map +1 -1
  179. package/dist/src/intl/te.js +20 -0
  180. package/dist/src/intl/th.d.ts +24 -1
  181. package/dist/src/intl/th.d.ts.map +1 -1
  182. package/dist/src/intl/th.js +20 -0
  183. package/dist/src/intl/tr.d.ts +24 -1
  184. package/dist/src/intl/tr.d.ts.map +1 -1
  185. package/dist/src/intl/tr.js +20 -0
  186. package/dist/src/intl/uk.d.ts +80 -57
  187. package/dist/src/intl/uk.d.ts.map +1 -1
  188. package/dist/src/intl/uk.js +174 -149
  189. package/dist/src/intl/ur.d.ts +24 -1
  190. package/dist/src/intl/ur.d.ts.map +1 -1
  191. package/dist/src/intl/ur.js +20 -0
  192. package/dist/src/intl/vi.d.ts +24 -1
  193. package/dist/src/intl/vi.d.ts.map +1 -1
  194. package/dist/src/intl/vi.js +20 -0
  195. package/dist/src/intl/zh-CN.d.ts +24 -1
  196. package/dist/src/intl/zh-CN.d.ts.map +1 -1
  197. package/dist/src/intl/zh-CN.js +20 -0
  198. package/dist/src/intl/zh-TW.d.ts +24 -1
  199. package/dist/src/intl/zh-TW.d.ts.map +1 -1
  200. package/dist/src/intl/zh-TW.js +20 -0
  201. package/dist/src/local-first/Db.d.ts +52 -3
  202. package/dist/src/local-first/Db.d.ts.map +1 -1
  203. package/dist/src/local-first/Db.js +412 -137
  204. package/dist/src/local-first/Evolu.d.ts +336 -211
  205. package/dist/src/local-first/Evolu.d.ts.map +1 -1
  206. package/dist/src/local-first/Evolu.js +102 -15
  207. package/dist/src/local-first/Owner.d.ts +13 -30
  208. package/dist/src/local-first/Owner.d.ts.map +1 -1
  209. package/dist/src/local-first/Owner.js +13 -30
  210. package/dist/src/local-first/Protocol.d.ts +95 -17
  211. package/dist/src/local-first/Protocol.d.ts.map +1 -1
  212. package/dist/src/local-first/Protocol.js +119 -39
  213. package/dist/src/local-first/Query.d.ts +8 -15
  214. package/dist/src/local-first/Query.d.ts.map +1 -1
  215. package/dist/src/local-first/Schema.d.ts +345 -21
  216. package/dist/src/local-first/Schema.d.ts.map +1 -1
  217. package/dist/src/local-first/Schema.js +214 -17
  218. package/dist/src/local-first/Shared.d.ts +537 -22
  219. package/dist/src/local-first/Shared.d.ts.map +1 -1
  220. package/dist/src/local-first/Shared.js +1437 -234
  221. package/dist/src/local-first/Storage.d.ts +192 -14
  222. package/dist/src/local-first/Storage.d.ts.map +1 -1
  223. package/dist/src/local-first/Storage.js +82 -21
  224. package/dist/src/local-first/Timestamp.d.ts +392 -41
  225. package/dist/src/local-first/Timestamp.d.ts.map +1 -1
  226. package/dist/src/local-first/Timestamp.js +404 -82
  227. package/dist/src/local-first/index.d.ts +0 -1
  228. package/dist/src/local-first/index.d.ts.map +1 -1
  229. package/dist/src/local-first/index.js +0 -1
  230. package/package.json +1 -1
  231. package/src/Assert.test.ts +2 -5
  232. package/src/{Binary.test.ts → Bytes.test.ts} +286 -1
  233. package/src/{Binary.ts → Bytes.ts} +652 -21
  234. package/src/Config.test.ts +668 -0
  235. package/src/Config.ts +410 -0
  236. package/src/Console.ts +62 -7
  237. package/src/Crypto.ts +76 -4
  238. package/src/Eq.test.ts +2 -3
  239. package/src/Error.test.ts +76 -3
  240. package/src/Error.ts +71 -0
  241. package/src/Fs.test.ts +105 -0
  242. package/src/Fs.ts +488 -0
  243. package/src/Identicon.ts +2 -2
  244. package/src/LeakDetector.ts +22 -3
  245. package/src/LockManager.ts +8 -0
  246. package/src/Number.test.ts +82 -18
  247. package/src/Number.ts +76 -8
  248. package/src/Object.test.ts +139 -10
  249. package/src/Object.ts +49 -0
  250. package/src/Platform.ts +50 -8
  251. package/src/Random.ts +25 -2
  252. package/src/Resource.test.ts +837 -0
  253. package/src/Resource.ts +235 -15
  254. package/src/Schedule.test.ts +50 -12
  255. package/src/Schedule.ts +24 -14
  256. package/src/Sqlite.ts +138 -18
  257. package/src/Task.test.ts +189 -8
  258. package/src/Task.ts +56 -17
  259. package/src/Test.ts +9 -0
  260. package/src/Time.test.ts +82 -11
  261. package/src/Time.ts +246 -24
  262. package/src/Type.test.ts +3994 -1119
  263. package/src/Type.ts +7258 -3842
  264. package/src/Types.test.ts +4 -14
  265. package/src/WebSocket.ts +313 -40
  266. package/src/Worker.ts +90 -8
  267. package/src/index.ts +18 -7
  268. package/src/intl/_en.ts +70 -0
  269. package/src/intl/ar.ts +71 -0
  270. package/src/intl/bn.ts +70 -0
  271. package/src/intl/ca.ts +70 -0
  272. package/src/intl/cs.ts +70 -0
  273. package/src/intl/da.ts +70 -0
  274. package/src/intl/de.ts +70 -0
  275. package/src/intl/el.ts +70 -0
  276. package/src/intl/es.ts +70 -0
  277. package/src/intl/fa.ts +70 -0
  278. package/src/intl/fi.ts +70 -0
  279. package/src/intl/fil.ts +70 -0
  280. package/src/intl/fr.ts +70 -0
  281. package/src/intl/he.ts +70 -0
  282. package/src/intl/hi.ts +70 -0
  283. package/src/intl/hr.ts +70 -0
  284. package/src/intl/hu.ts +69 -0
  285. package/src/intl/id.ts +70 -0
  286. package/src/intl/intl.test.ts +819 -1
  287. package/src/intl/it.ts +70 -0
  288. package/src/intl/ja.ts +70 -0
  289. package/src/intl/ko.ts +68 -0
  290. package/src/intl/ml.ts +70 -0
  291. package/src/intl/mr.ts +70 -0
  292. package/src/intl/ms.ts +71 -0
  293. package/src/intl/nb.ts +69 -0
  294. package/src/intl/nl.ts +70 -0
  295. package/src/intl/pa.ts +70 -0
  296. package/src/intl/pl.ts +63 -0
  297. package/src/intl/pt-BR.ts +70 -0
  298. package/src/intl/pt.ts +71 -0
  299. package/src/intl/ro.ts +70 -0
  300. package/src/intl/sk.ts +71 -0
  301. package/src/intl/sl.ts +70 -0
  302. package/src/intl/sv.ts +70 -0
  303. package/src/intl/sw.ts +62 -0
  304. package/src/intl/ta.ts +70 -0
  305. package/src/intl/te.ts +70 -0
  306. package/src/intl/th.ts +68 -0
  307. package/src/intl/tr.ts +70 -0
  308. package/src/intl/uk.ts +228 -155
  309. package/src/intl/ur.ts +70 -0
  310. package/src/intl/vi.ts +70 -0
  311. package/src/intl/zh-CN.ts +68 -0
  312. package/src/intl/zh-TW.ts +68 -0
  313. package/src/local-first/Db.ts +644 -339
  314. package/src/local-first/Evolu.test.ts +686 -21
  315. package/src/local-first/Evolu.ts +450 -228
  316. package/src/local-first/Owner.ts +13 -30
  317. package/src/local-first/Protocol.test.ts +618 -11
  318. package/src/local-first/Protocol.ts +197 -73
  319. package/src/local-first/Query.ts +8 -15
  320. package/src/local-first/Schema.test.ts +143 -0
  321. package/src/local-first/Schema.ts +374 -24
  322. package/src/local-first/Shared.test.ts +7731 -559
  323. package/src/local-first/Shared.ts +2036 -267
  324. package/src/local-first/Storage.ts +219 -33
  325. package/src/local-first/Timestamp.test.ts +344 -70
  326. package/src/local-first/Timestamp.ts +435 -119
  327. package/src/local-first/index.ts +0 -1
  328. package/dist/src/Binary.d.ts +0 -254
  329. package/dist/src/Binary.d.ts.map +0 -1
  330. package/dist/src/local-first/Error.d.ts +0 -12
  331. package/dist/src/local-first/Error.d.ts.map +0 -1
  332. package/dist/src/local-first/Error.js +0 -6
  333. package/dist/src/local-first/LocalAuth.d.ts +0 -150
  334. package/dist/src/local-first/LocalAuth.d.ts.map +0 -1
  335. package/dist/src/local-first/LocalAuth.js +0 -179
  336. package/src/local-first/Error.ts +0 -17
  337. package/src/local-first/LocalAuth.ts +0 -457
@@ -7,9 +7,177 @@ import * as Kysely from "kysely";
7
7
  import { assertNonNullable } from "../Assert.js";
8
8
  import { getOwnProp, mapObject } from "../Object.js";
9
9
  import { eqSqliteIndex, getSqliteSchema, sql, sqliteQueryToSqliteQueryString, SqliteBoolean, SqliteQueryParameters, SqliteValue, } from "../Sqlite.js";
10
- import { assertType, DateIso, IdBytes, Null, nullOr, object, } from "../Type.js";
11
- import { OwnerId } from "./Owner.js";
10
+ import { assertType, createIdFromString, DateIso, id, IdBytes, NonEmptyTrimmedString100, Null, nullOr, object, } from "../Type.js";
11
+ import { OwnerEncryptionKey, OwnerId, OwnerSecret, OwnerWriteKey, } from "./Owner.js";
12
12
  import { TimestampBytes } from "./Timestamp.js";
13
+ /**
14
+ * Whether a table is local-only: its name starts with an underscore, so its
15
+ * changes are stored without synchronization.
16
+ *
17
+ * @group Core
18
+ */
19
+ export const isLocalOnlyTable = (table) => table.startsWith("_");
20
+ /**
21
+ * Todo ID Type for {@link testEvoluSchema}.
22
+ *
23
+ * @group Testing
24
+ */
25
+ export const TestTodoId = /*#__PURE__*/ id("Todo");
26
+ /**
27
+ * Deterministic {@link TestTodoId} for tests and examples.
28
+ *
29
+ * @group Testing
30
+ */
31
+ export const testTodoId = /*#__PURE__*/ TestTodoId.orThrow(
32
+ /*#__PURE__*/ createIdFromString("testTodo"));
33
+ /**
34
+ * Project ID Type for {@link testEvoluSchema}.
35
+ *
36
+ * @group Testing
37
+ */
38
+ export const TestProjectId = /*#__PURE__*/ id("Project");
39
+ /**
40
+ * Deterministic {@link TestProjectId} for tests and examples.
41
+ *
42
+ * @group Testing
43
+ */
44
+ export const testProjectId = /*#__PURE__*/ TestProjectId.orThrow(
45
+ /*#__PURE__*/ createIdFromString("testProject"));
46
+ /**
47
+ * Todo and project schema for tests and examples. A todo can belong to a
48
+ * project or have no project. Use an explicit schema when teaching schema
49
+ * definition.
50
+ *
51
+ * ### Example
52
+ *
53
+ * ```ts
54
+ * import {
55
+ * assertOk,
56
+ * testEvoluSchema,
57
+ * testProjectId,
58
+ * testTodoId,
59
+ * } from "@evolu/common";
60
+ *
61
+ * assertOk(testEvoluSchema.todo.id.from(testTodoId), testTodoId);
62
+ * assertOk(
63
+ * testEvoluSchema.todo.projectId.from(testProjectId),
64
+ * testProjectId,
65
+ * );
66
+ * ```
67
+ *
68
+ * @group Testing
69
+ */
70
+ export const testEvoluSchema = {
71
+ todo: {
72
+ id: TestTodoId,
73
+ title: NonEmptyTrimmedString100,
74
+ isCompleted: /*#__PURE__*/ nullOr(SqliteBoolean),
75
+ projectId: /*#__PURE__*/ nullOr(TestProjectId),
76
+ },
77
+ project: {
78
+ id: TestProjectId,
79
+ name: NonEmptyTrimmedString100,
80
+ },
81
+ };
82
+ /**
83
+ * App-owner registry schema with local tables for tests and examples.
84
+ *
85
+ * Stores operational keys separately from optional recovery material. A null
86
+ * secret represents an owner whose recovery material is managed elsewhere or
87
+ * unavailable. Names are optional device-local labels; identicons can be
88
+ * derived from the owner identity without an additional column.
89
+ *
90
+ * This fixture does not define the production registry's persistence contract.
91
+ *
92
+ * @group Testing
93
+ */
94
+ export const testLocalOnlyEvoluSchema = {
95
+ _appOwner: {
96
+ id: OwnerId,
97
+ encryptionKey: OwnerEncryptionKey,
98
+ writeKey: OwnerWriteKey,
99
+ secret: /*#__PURE__*/ nullOr(OwnerSecret),
100
+ name: /*#__PURE__*/ nullOr(NonEmptyTrimmedString100),
101
+ },
102
+ };
103
+ /**
104
+ * Why a message is stored in `evolu_message_quarantine` instead of being
105
+ * applied to its table. Persisted codes: names may change, but numbers must not
106
+ * be reassigned.
107
+ *
108
+ * Quarantine is queryable state, not an error. An application subscribes to a
109
+ * query over `evolu_message_quarantine` to tell the user what is waiting. Each
110
+ * row is one column of a message, so distinct `ownerId` and `timestamp` pairs
111
+ * count messages. `origin` records whether this database stamped the message
112
+ * for a local mutation or received it from sync, see {@link QuarantineOrigin}.
113
+ * `quarantinedAt` is the system time captured for the request that quarantined
114
+ * the row, in milliseconds; it is null for rows written before Evolu recorded
115
+ * it. The clock-drift rules are described in the Timestamp module.
116
+ *
117
+ * ### Example
118
+ *
119
+ * ```ts
120
+ * import {
121
+ * assertType,
122
+ * createQueryBuilder,
123
+ * type Millis,
124
+ * type OwnerIdBytes,
125
+ * type QuarantineOrigin,
126
+ * QuarantineReason,
127
+ * testEvoluSchema,
128
+ * type TimestampBytes,
129
+ * } from "@evolu/common";
130
+ *
131
+ * const createQuery = createQueryBuilder(testEvoluSchema);
132
+ *
133
+ * // Messages waiting in drift quarantine, one row per message.
134
+ * const driftQuarantineQuery = createQuery((db) =>
135
+ * db
136
+ * .selectFrom("evolu_message_quarantine")
137
+ * .select(["ownerId", "timestamp", "origin", "quarantinedAt"])
138
+ * .where("reason", "=", QuarantineReason.TimestampDrift)
139
+ * .distinct(),
140
+ * );
141
+ *
142
+ * assertType<
143
+ * typeof driftQuarantineQuery.Row,
144
+ * {
145
+ * ownerId: OwnerIdBytes;
146
+ * timestamp: TimestampBytes;
147
+ * origin: QuarantineOrigin;
148
+ * quarantinedAt: Millis | null;
149
+ * }
150
+ * >();
151
+ * ```
152
+ *
153
+ * @group Queries
154
+ */
155
+ export const QuarantineReason = {
156
+ /**
157
+ * The message has a table or column the current schema does not define. It is
158
+ * applied automatically once a schema update defines them. A received change
159
+ * to a {@link isLocalOnlyTable | local-only} table is also stored here and is
160
+ * never applied.
161
+ */
162
+ Schema: 0,
163
+ /**
164
+ * The message's timestamp exceeded the drift limit when it was stored. It is
165
+ * applied when the database worker starts, once system time comes within the
166
+ * limit of the timestamp.
167
+ */
168
+ TimestampDrift: 1,
169
+ };
170
+ /**
171
+ * Whether a quarantined message was stamped by this database for a local
172
+ * mutation or received from sync. Persisted codes: names may change, but
173
+ * numbers must not be reassigned.
174
+ *
175
+ * @group Queries
176
+ */
177
+ export const QuarantineOrigin = {
178
+ LocalMutation: 0,
179
+ ReceivedMessage: 1,
180
+ };
13
181
  /**
14
182
  * System columns that are implicitly defined by Evolu.
15
183
  *
@@ -18,6 +186,8 @@ import { TimestampBytes } from "./Timestamp.js";
18
186
  * - `isDeleted`: Soft delete flag created by Evolu and used by the developer to
19
187
  * mark rows as deleted.
20
188
  * - `ownerId`: Represents ownership and logically partitions the database.
189
+ *
190
+ * @group Core
21
191
  */
22
192
  export const SystemColumns = /*#__PURE__*/ object({
23
193
  createdAt: DateIso,
@@ -25,12 +195,27 @@ export const SystemColumns = /*#__PURE__*/ object({
25
195
  isDeleted: /*#__PURE__*/ nullOr(SqliteBoolean),
26
196
  ownerId: OwnerId,
27
197
  });
198
+ /**
199
+ * Names of {@link SystemColumns}.
200
+ *
201
+ * @group Core
202
+ */
28
203
  export const systemColumns = /*#__PURE__*/ new Set(
29
204
  /*#__PURE__*/ Object.keys(SystemColumns.props));
205
+ /**
206
+ * Names of {@link SystemColumns} together with `id`.
207
+ *
208
+ * @group Core
209
+ */
30
210
  export const systemColumnsWithId = [
31
211
  ...systemColumns,
32
212
  "id",
33
213
  ];
214
+ /**
215
+ * Derives {@link SqliteSchema} tables and indexes from an {@link EvoluSchema}.
216
+ *
217
+ * @group SQLite
218
+ */
34
219
  export const evoluSchemaToSqliteSchema = (schema, indexesConfig) => {
35
220
  const validSchema = schema;
36
221
  const tables = mapObject(validSchema, (table) => new Set(Object.keys(table).filter((k) => k !== "id")));
@@ -57,24 +242,14 @@ export const evoluSchemaToSqliteSchema = (schema, indexesConfig) => {
57
242
  * import {
58
243
  * assertType,
59
244
  * createQueryBuilder,
60
- * id,
245
+ * testEvoluSchema,
246
+ * type TestTodoId,
61
247
  * NonEmptyTrimmedString100,
62
- * nullOr,
63
248
  * SqliteBoolean,
64
249
  * } from "@evolu/common";
65
250
  *
66
- * const TodoId = id("Todo");
67
- * type TodoId = typeof TodoId.Output;
68
- * const Schema = {
69
- * todo: {
70
- * id: TodoId,
71
- * title: NonEmptyTrimmedString100,
72
- * isCompleted: nullOr(SqliteBoolean),
73
- * },
74
- * };
75
- *
76
251
  * // Create one typed builder per schema and reuse it for every query.
77
- * const createQuery = createQueryBuilder(Schema);
252
+ * const createQuery = createQueryBuilder(testEvoluSchema);
78
253
  * const todosQuery = createQuery((db) =>
79
254
  * db.selectFrom("todo").select(["id", "title", "isCompleted"]),
80
255
  * );
@@ -82,12 +257,14 @@ export const evoluSchemaToSqliteSchema = (schema, indexesConfig) => {
82
257
  * assertType<
83
258
  * typeof todosQuery.Row,
84
259
  * {
85
- * id: TodoId;
260
+ * id: TestTodoId;
86
261
  * title: NonEmptyTrimmedString100 | null;
87
262
  * isCompleted: SqliteBoolean | null;
88
263
  * }
89
264
  * >();
90
265
  * ```
266
+ *
267
+ * @group Queries
91
268
  */
92
269
  export const createQueryBuilder = (_schema) => {
93
270
  const createQuery = (queryCallback, options) => {
@@ -102,6 +279,12 @@ export const createQueryBuilder = (_schema) => {
102
279
  };
103
280
  return createQuery;
104
281
  };
282
+ /**
283
+ * Creates missing tables, columns, and indexes, and drops indexes that the new
284
+ * schema no longer defines.
285
+ *
286
+ * @group SQLite
287
+ */
105
288
  export const ensureSqliteSchema = (deps) => (newSchema, currentSchema) => {
106
289
  const queries = [];
107
290
  currentSchema ??= getEvoluSqliteSchema(deps)();
@@ -136,8 +319,22 @@ export const ensureSqliteSchema = (deps) => (newSchema, currentSchema) => {
136
319
  deps.sqlite.exec(query);
137
320
  }
138
321
  };
322
+ /**
323
+ * Reads the current application {@link SqliteSchema}, excluding Evolu's internal
324
+ * indexes.
325
+ *
326
+ * @group SQLite
327
+ */
139
328
  export const getEvoluSqliteSchema = (deps) => () => getSqliteSchema(deps)({ excludeIndexNamePrefix: "evolu_" });
140
- // https://kysely.dev/docs/recipes/splitting-query-building-and-execution
329
+ /**
330
+ * Kysely instance that only compiles queries to SQL. It never executes them;
331
+ * Evolu runs the compiled SQL itself.
332
+ *
333
+ * See [Splitting query building and
334
+ * execution](https://kysely.dev/docs/recipes/splitting-query-building-and-execution).
335
+ *
336
+ * @group Queries
337
+ */
141
338
  export const kysely = /*#__PURE__*/ new Kysely.Kysely({
142
339
  dialect: {
143
340
  createAdapter: () => new Kysely.SqliteAdapter(),