@lix-js/sdk 0.5.0-preview.0 → 0.5.0-preview.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 (1378) hide show
  1. package/dist/account/create-account.d.ts +5 -5
  2. package/dist/account/create-account.d.ts.map +1 -1
  3. package/dist/account/create-account.js +2 -2
  4. package/dist/account/create-account.js.map +1 -1
  5. package/dist/account/index.d.ts +1 -1
  6. package/dist/account/index.d.ts.map +1 -1
  7. package/dist/account/schema.d.ts +23 -7
  8. package/dist/account/schema.d.ts.map +1 -1
  9. package/dist/account/schema.js +84 -27
  10. package/dist/account/schema.js.map +1 -1
  11. package/dist/account/schema.test.js +87 -83
  12. package/dist/account/schema.test.js.map +1 -1
  13. package/dist/account/switch-account.d.ts +2 -2
  14. package/dist/account/switch-account.d.ts.map +1 -1
  15. package/dist/account/switch-account.js +3 -4
  16. package/dist/account/switch-account.js.map +1 -1
  17. package/dist/account/switch-account.test.js +4 -4
  18. package/dist/account/switch-account.test.js.map +1 -1
  19. package/dist/change/apply-changes.d.ts +13 -0
  20. package/dist/change/apply-changes.d.ts.map +1 -1
  21. package/dist/change/apply-changes.js +14 -4
  22. package/dist/change/apply-changes.js.map +1 -1
  23. package/dist/change/apply-changes.test.js +91 -1
  24. package/dist/change/apply-changes.test.js.map +1 -1
  25. package/dist/change/create-change-v2.d.ts +11 -0
  26. package/dist/change/create-change-v2.d.ts.map +1 -0
  27. package/dist/change/create-change-v2.js +31 -0
  28. package/dist/change/create-change-v2.js.map +1 -0
  29. package/dist/change/create-change-v2.test.d.ts +2 -0
  30. package/dist/change/create-change-v2.test.d.ts.map +1 -0
  31. package/dist/change/create-change-v2.test.js +39 -0
  32. package/dist/change/create-change-v2.test.js.map +1 -0
  33. package/dist/change/create-change.d.ts +2 -2
  34. package/dist/change/create-change.d.ts.map +1 -1
  35. package/dist/change/create-change.js +3 -1
  36. package/dist/change/create-change.js.map +1 -1
  37. package/dist/change/create-change.test.js +4 -6
  38. package/dist/change/create-change.test.js.map +1 -1
  39. package/dist/change/index.d.ts +1 -1
  40. package/dist/change/index.d.ts.map +1 -1
  41. package/dist/change/index.js.map +1 -1
  42. package/dist/change/schema.d.ts +40 -2
  43. package/dist/change/schema.d.ts.map +1 -1
  44. package/dist/change/schema.js +50 -9
  45. package/dist/change/schema.js.map +1 -1
  46. package/dist/change/schema.test.js +33 -0
  47. package/dist/change/schema.test.js.map +1 -1
  48. package/dist/change-author/index.d.ts +1 -1
  49. package/dist/change-author/index.d.ts.map +1 -1
  50. package/dist/change-author/index.js +1 -1
  51. package/dist/change-author/index.js.map +1 -1
  52. package/dist/change-author/schema.d.ts +12 -9
  53. package/dist/change-author/schema.d.ts.map +1 -1
  54. package/dist/change-author/schema.js +16 -10
  55. package/dist/change-author/schema.js.map +1 -1
  56. package/dist/change-author/schema.test.js +283 -229
  57. package/dist/change-author/schema.test.js.map +1 -1
  58. package/dist/change-proposal/create-change-proposal.d.ts +3 -3
  59. package/dist/change-proposal/create-change-proposal.d.ts.map +1 -1
  60. package/dist/change-proposal/database-schema.js +1 -1
  61. package/dist/change-set/apply-change-set.d.ts +2 -2
  62. package/dist/change-set/apply-change-set.d.ts.map +1 -1
  63. package/dist/change-set/apply-change-set.js +40 -51
  64. package/dist/change-set/apply-change-set.js.map +1 -1
  65. package/dist/change-set/apply-change-set.test.js +6 -3
  66. package/dist/change-set/apply-change-set.test.js.map +1 -1
  67. package/dist/change-set/before-after-of-file.d.ts +31 -0
  68. package/dist/change-set/before-after-of-file.d.ts.map +1 -0
  69. package/dist/change-set/before-after-of-file.js +191 -0
  70. package/dist/change-set/before-after-of-file.js.map +1 -0
  71. package/dist/change-set/before-after-of-file.test.d.ts +2 -0
  72. package/dist/change-set/before-after-of-file.test.d.ts.map +1 -0
  73. package/dist/change-set/before-after-of-file.test.js +221 -0
  74. package/dist/change-set/before-after-of-file.test.js.map +1 -0
  75. package/dist/change-set/change-set-element-in-symmetric-difference.d.ts +2 -1
  76. package/dist/change-set/change-set-element-in-symmetric-difference.d.ts.map +1 -1
  77. package/dist/change-set/change-set-element-in-symmetric-difference.js.map +1 -1
  78. package/dist/change-set/change-set-element-in-symmetric-difference.test.js +204 -34
  79. package/dist/change-set/change-set-element-in-symmetric-difference.test.js.map +1 -1
  80. package/dist/change-set/checkout-change-set.d.ts +15 -0
  81. package/dist/change-set/checkout-change-set.d.ts.map +1 -0
  82. package/dist/change-set/checkout-change-set.js +64 -0
  83. package/dist/change-set/checkout-change-set.js.map +1 -0
  84. package/dist/change-set/checkout-change-set.test.d.ts +2 -0
  85. package/dist/change-set/checkout-change-set.test.d.ts.map +1 -0
  86. package/dist/change-set/checkout-change-set.test.js +127 -0
  87. package/dist/change-set/checkout-change-set.test.js.map +1 -0
  88. package/dist/change-set/create-change-set.d.ts +7 -9
  89. package/dist/change-set/create-change-set.d.ts.map +1 -1
  90. package/dist/change-set/create-change-set.js +3 -25
  91. package/dist/change-set/create-change-set.js.map +1 -1
  92. package/dist/change-set/create-change-set.test.js +0 -31
  93. package/dist/change-set/create-change-set.test.js.map +1 -1
  94. package/dist/change-set/create-checkpoint.d.ts.map +1 -1
  95. package/dist/change-set/create-checkpoint.js +11 -2
  96. package/dist/change-set/create-checkpoint.js.map +1 -1
  97. package/dist/change-set/create-checkpoint.test.js +53 -0
  98. package/dist/change-set/create-checkpoint.test.js.map +1 -1
  99. package/dist/change-set/create-merge-change-set.d.ts +4 -4
  100. package/dist/change-set/create-merge-change-set.d.ts.map +1 -1
  101. package/dist/change-set/create-transition-change-set.d.ts +4 -4
  102. package/dist/change-set/create-transition-change-set.d.ts.map +1 -1
  103. package/dist/change-set/create-undo-change-set.d.ts +5 -5
  104. package/dist/change-set/create-undo-change-set.d.ts.map +1 -1
  105. package/dist/change-set/create-undo-change-set.js +4 -3
  106. package/dist/change-set/create-undo-change-set.js.map +1 -1
  107. package/dist/change-set/database-schema.d.ts +39 -0
  108. package/dist/change-set/database-schema.d.ts.map +1 -0
  109. package/dist/change-set/database-schema.js +86 -0
  110. package/dist/change-set/database-schema.js.map +1 -0
  111. package/dist/change-set/database-schema.test.d.ts +2 -0
  112. package/dist/change-set/database-schema.test.d.ts.map +1 -0
  113. package/dist/change-set/database-schema.test.js +547 -0
  114. package/dist/change-set/database-schema.test.js.map +1 -0
  115. package/dist/change-set/diff-for-file.d.ts +29 -0
  116. package/dist/change-set/diff-for-file.d.ts.map +1 -0
  117. package/dist/change-set/diff-for-file.js +19 -0
  118. package/dist/change-set/diff-for-file.js.map +1 -0
  119. package/dist/change-set/get-before-after-of-file.d.ts +31 -0
  120. package/dist/change-set/get-before-after-of-file.d.ts.map +1 -0
  121. package/dist/change-set/get-before-after-of-file.js +189 -0
  122. package/dist/change-set/get-before-after-of-file.js.map +1 -0
  123. package/dist/change-set/get-before-after-of-file.test.d.ts +2 -0
  124. package/dist/change-set/get-before-after-of-file.test.d.ts.map +1 -0
  125. package/dist/change-set/get-before-after-of-file.test.js +220 -0
  126. package/dist/change-set/get-before-after-of-file.test.js.map +1 -0
  127. package/dist/change-set/index.d.ts +1 -5
  128. package/dist/change-set/index.d.ts.map +1 -1
  129. package/dist/change-set/index.js +1 -5
  130. package/dist/change-set/index.js.map +1 -1
  131. package/dist/change-set/merge-change-sets.d.ts +23 -0
  132. package/dist/change-set/merge-change-sets.d.ts.map +1 -0
  133. package/dist/change-set/merge-change-sets.js +69 -0
  134. package/dist/change-set/merge-change-sets.js.map +1 -0
  135. package/dist/change-set/merge-change-sets.test.d.ts +2 -0
  136. package/dist/change-set/merge-change-sets.test.d.ts.map +1 -0
  137. package/dist/change-set/merge-change-sets.test.js +184 -0
  138. package/dist/change-set/merge-change-sets.test.js.map +1 -0
  139. package/dist/change-set/restore-change-set.d.ts +14 -0
  140. package/dist/change-set/restore-change-set.d.ts.map +1 -0
  141. package/dist/change-set/restore-change-set.js +98 -0
  142. package/dist/change-set/restore-change-set.js.map +1 -0
  143. package/dist/change-set/restore-change-set.test.d.ts +2 -0
  144. package/dist/change-set/restore-change-set.test.d.ts.map +1 -0
  145. package/dist/change-set/restore-change-set.test.js +238 -0
  146. package/dist/change-set/restore-change-set.test.js.map +1 -0
  147. package/dist/change-set/schema.d.ts +28 -72
  148. package/dist/change-set/schema.d.ts.map +1 -1
  149. package/dist/change-set/schema.js +37 -84
  150. package/dist/change-set/schema.js.map +1 -1
  151. package/dist/change-set/schema.test.js +0 -247
  152. package/dist/change-set/schema.test.js.map +1 -1
  153. package/dist/change-set-edge/database-schema.d.ts +11 -0
  154. package/dist/change-set-edge/database-schema.d.ts.map +1 -0
  155. package/dist/change-set-edge/database-schema.js +29 -0
  156. package/dist/change-set-edge/database-schema.js.map +1 -0
  157. package/dist/change-set-edge/database-schema.test.d.ts +2 -0
  158. package/dist/change-set-edge/database-schema.test.d.ts.map +1 -0
  159. package/dist/change-set-edge/database-schema.test.js +166 -0
  160. package/dist/change-set-edge/database-schema.test.js.map +1 -0
  161. package/dist/change-set-edge/index.d.ts +2 -0
  162. package/dist/change-set-edge/index.d.ts.map +1 -0
  163. package/dist/change-set-edge/index.js +2 -0
  164. package/dist/change-set-edge/index.js.map +1 -0
  165. package/dist/change-set-v2/apply-change-set.d.ts +10 -0
  166. package/dist/change-set-v2/apply-change-set.d.ts.map +1 -0
  167. package/dist/change-set-v2/apply-change-set.js +147 -0
  168. package/dist/change-set-v2/apply-change-set.js.map +1 -0
  169. package/dist/change-set-v2/apply-change-set.test.d.ts +2 -0
  170. package/dist/change-set-v2/apply-change-set.test.d.ts.map +1 -0
  171. package/dist/change-set-v2/apply-change-set.test.js +270 -0
  172. package/dist/change-set-v2/apply-change-set.test.js.map +1 -0
  173. package/dist/change-set-v2/create-change-set.d.ts +10 -0
  174. package/dist/change-set-v2/create-change-set.d.ts.map +1 -0
  175. package/dist/change-set-v2/create-change-set.js +57 -0
  176. package/dist/change-set-v2/create-change-set.js.map +1 -0
  177. package/dist/change-set-v2/create-change-set.test.d.ts +2 -0
  178. package/dist/change-set-v2/create-change-set.test.d.ts.map +1 -0
  179. package/dist/change-set-v2/create-change-set.test.js +59 -0
  180. package/dist/change-set-v2/create-change-set.test.js.map +1 -0
  181. package/dist/change-set-v2/create-checkpoint.d.ts +7 -0
  182. package/dist/change-set-v2/create-checkpoint.d.ts.map +1 -0
  183. package/dist/change-set-v2/create-checkpoint.js +79 -0
  184. package/dist/change-set-v2/create-checkpoint.js.map +1 -0
  185. package/dist/change-set-v2/create-checkpoint.test.d.ts +2 -0
  186. package/dist/change-set-v2/create-checkpoint.test.d.ts.map +1 -0
  187. package/dist/change-set-v2/create-checkpoint.test.js +289 -0
  188. package/dist/change-set-v2/create-checkpoint.test.js.map +1 -0
  189. package/dist/change-set-v2/create-merge-change-set.d.ts +23 -0
  190. package/dist/change-set-v2/create-merge-change-set.d.ts.map +1 -0
  191. package/dist/change-set-v2/create-merge-change-set.js +68 -0
  192. package/dist/change-set-v2/create-merge-change-set.js.map +1 -0
  193. package/dist/change-set-v2/create-merge-change-set.test.d.ts +2 -0
  194. package/dist/change-set-v2/create-merge-change-set.test.d.ts.map +1 -0
  195. package/dist/change-set-v2/create-merge-change-set.test.js +223 -0
  196. package/dist/change-set-v2/create-merge-change-set.test.js.map +1 -0
  197. package/dist/change-set-v2/index.d.ts +5 -0
  198. package/dist/change-set-v2/index.d.ts.map +1 -0
  199. package/dist/change-set-v2/index.js +5 -0
  200. package/dist/change-set-v2/index.js.map +1 -0
  201. package/dist/change-set-v2/schema.d.ts +50 -0
  202. package/dist/change-set-v2/schema.d.ts.map +1 -0
  203. package/dist/change-set-v2/schema.js +347 -0
  204. package/dist/change-set-v2/schema.js.map +1 -0
  205. package/dist/change-set-v2/schema.test.d.ts +2 -0
  206. package/dist/change-set-v2/schema.test.d.ts.map +1 -0
  207. package/dist/change-set-v2/schema.test.js +713 -0
  208. package/dist/change-set-v2/schema.test.js.map +1 -0
  209. package/dist/commit/apply-commit.d.ts +32 -0
  210. package/dist/commit/apply-commit.d.ts.map +1 -0
  211. package/dist/commit/apply-commit.js +63 -0
  212. package/dist/commit/apply-commit.js.map +1 -0
  213. package/dist/commit/apply-commit.test.d.ts +2 -0
  214. package/dist/commit/apply-commit.test.d.ts.map +1 -0
  215. package/dist/commit/apply-commit.test.js +367 -0
  216. package/dist/commit/apply-commit.test.js.map +1 -0
  217. package/dist/commit/create-checkpoint.d.ts +19 -0
  218. package/dist/commit/create-checkpoint.d.ts.map +1 -0
  219. package/dist/commit/create-checkpoint.js +118 -0
  220. package/dist/commit/create-checkpoint.js.map +1 -0
  221. package/dist/commit/create-checkpoint.test.d.ts +2 -0
  222. package/dist/commit/create-checkpoint.test.d.ts.map +1 -0
  223. package/dist/commit/create-checkpoint.test.js +472 -0
  224. package/dist/commit/create-checkpoint.test.js.map +1 -0
  225. package/dist/commit/create-commit.d.ts +38 -0
  226. package/dist/commit/create-commit.d.ts.map +1 -0
  227. package/dist/commit/create-commit.js +68 -0
  228. package/dist/commit/create-commit.js.map +1 -0
  229. package/dist/commit/create-merge-commit.d.ts +24 -0
  230. package/dist/commit/create-merge-commit.d.ts.map +1 -0
  231. package/dist/commit/create-merge-commit.js +103 -0
  232. package/dist/commit/create-merge-commit.js.map +1 -0
  233. package/dist/commit/create-merge-commit.test.d.ts +2 -0
  234. package/dist/commit/create-merge-commit.test.d.ts.map +1 -0
  235. package/dist/commit/create-merge-commit.test.js +242 -0
  236. package/dist/commit/create-merge-commit.test.js.map +1 -0
  237. package/dist/commit/create-transition-commit.d.ts +18 -0
  238. package/dist/commit/create-transition-commit.d.ts.map +1 -0
  239. package/dist/commit/create-transition-commit.js +136 -0
  240. package/dist/commit/create-transition-commit.js.map +1 -0
  241. package/dist/commit/create-transition-commit.test.d.ts +2 -0
  242. package/dist/commit/create-transition-commit.test.d.ts.map +1 -0
  243. package/dist/commit/create-transition-commit.test.js +221 -0
  244. package/dist/commit/create-transition-commit.test.js.map +1 -0
  245. package/dist/commit/create-undo-commit.d.ts +27 -0
  246. package/dist/commit/create-undo-commit.d.ts.map +1 -0
  247. package/dist/commit/create-undo-commit.js +143 -0
  248. package/dist/commit/create-undo-commit.js.map +1 -0
  249. package/dist/commit/create-undo-commit.test.d.ts +2 -0
  250. package/dist/commit/create-undo-commit.test.d.ts.map +1 -0
  251. package/dist/commit/create-undo-commit.test.js +298 -0
  252. package/dist/commit/create-undo-commit.test.js.map +1 -0
  253. package/dist/commit/index.d.ts +6 -0
  254. package/dist/commit/index.d.ts.map +1 -0
  255. package/dist/commit/index.js +6 -0
  256. package/dist/commit/index.js.map +1 -0
  257. package/dist/commit/schema.d.ts +73 -0
  258. package/dist/commit/schema.d.ts.map +1 -0
  259. package/dist/commit/schema.js +90 -0
  260. package/dist/commit/schema.js.map +1 -0
  261. package/dist/commit/schema.test.d.ts +2 -0
  262. package/dist/commit/schema.test.d.ts.map +1 -0
  263. package/dist/commit/schema.test.js +216 -0
  264. package/dist/commit/schema.test.js.map +1 -0
  265. package/dist/database/apply-schema.d.ts +3 -0
  266. package/dist/database/apply-schema.d.ts.map +1 -1
  267. package/dist/database/apply-schema.js +91 -258
  268. package/dist/database/apply-schema.js.map +1 -1
  269. package/dist/database/index.d.ts +0 -2
  270. package/dist/database/index.d.ts.map +1 -1
  271. package/dist/database/index.js +0 -2
  272. package/dist/database/index.js.map +1 -1
  273. package/dist/database/init-db.d.ts.map +1 -1
  274. package/dist/database/init-db.js +83 -44
  275. package/dist/database/init-db.js.map +1 -1
  276. package/dist/database/init-db.test.js +2 -480
  277. package/dist/database/init-db.test.js.map +1 -1
  278. package/dist/database/kysely-plugin/json-column-plugin.d.ts +5 -1
  279. package/dist/database/kysely-plugin/json-column-plugin.d.ts.map +1 -1
  280. package/dist/database/kysely-plugin/json-column-plugin.js +52 -10
  281. package/dist/database/kysely-plugin/json-column-plugin.js.map +1 -1
  282. package/dist/database/kysely-plugin/json-column-plugin.test.d.ts +2 -0
  283. package/dist/database/kysely-plugin/json-column-plugin.test.d.ts.map +1 -0
  284. package/dist/database/kysely-plugin/json-column-plugin.test.js +329 -0
  285. package/dist/database/kysely-plugin/json-column-plugin.test.js.map +1 -0
  286. package/dist/database/mutation-log/database-schema.d.ts.map +1 -1
  287. package/dist/database/mutation-log/database-schema.js +0 -4
  288. package/dist/database/mutation-log/database-schema.js.map +1 -1
  289. package/dist/database/nano-id.d.ts +4 -1
  290. package/dist/database/nano-id.d.ts.map +1 -1
  291. package/dist/database/nano-id.js +4 -1
  292. package/dist/database/nano-id.js.map +1 -1
  293. package/dist/database/nano-id.test.js +3 -3
  294. package/dist/database/nano-id.test.js.map +1 -1
  295. package/dist/database/schema.d.ts +21 -14
  296. package/dist/database/schema.d.ts.map +1 -1
  297. package/dist/database/schema.js +9 -5
  298. package/dist/database/schema.js.map +1 -1
  299. package/dist/deterministic/generate-human-id.d.ts +20 -0
  300. package/dist/deterministic/generate-human-id.d.ts.map +1 -0
  301. package/dist/deterministic/generate-human-id.js +86 -0
  302. package/dist/deterministic/generate-human-id.js.map +1 -0
  303. package/dist/deterministic/generate-human-id.test.d.ts +2 -0
  304. package/dist/deterministic/generate-human-id.test.d.ts.map +1 -0
  305. package/dist/deterministic/generate-human-id.test.js +123 -0
  306. package/dist/deterministic/generate-human-id.test.js.map +1 -0
  307. package/dist/deterministic/index.d.ts +8 -0
  308. package/dist/deterministic/index.d.ts.map +1 -0
  309. package/dist/deterministic/index.js +8 -0
  310. package/dist/deterministic/index.js.map +1 -0
  311. package/dist/deterministic/is-deterministic-mode.d.ts +14 -0
  312. package/dist/deterministic/is-deterministic-mode.d.ts.map +1 -0
  313. package/dist/deterministic/is-deterministic-mode.js +25 -0
  314. package/dist/deterministic/is-deterministic-mode.js.map +1 -0
  315. package/dist/deterministic/is-deterministic-mode.test.d.ts +2 -0
  316. package/dist/deterministic/is-deterministic-mode.test.d.ts.map +1 -0
  317. package/dist/deterministic/is-deterministic-mode.test.js +103 -0
  318. package/dist/deterministic/is-deterministic-mode.test.js.map +1 -0
  319. package/dist/deterministic/nano-id.d.ts +61 -0
  320. package/dist/deterministic/nano-id.d.ts.map +1 -0
  321. package/dist/deterministic/nano-id.js +161 -0
  322. package/dist/deterministic/nano-id.js.map +1 -0
  323. package/dist/deterministic/nano-id.test.d.ts +2 -0
  324. package/dist/deterministic/nano-id.test.d.ts.map +1 -0
  325. package/dist/deterministic/nano-id.test.js +163 -0
  326. package/dist/deterministic/nano-id.test.js.map +1 -0
  327. package/dist/deterministic/options.d.ts +53 -0
  328. package/dist/deterministic/options.d.ts.map +1 -0
  329. package/dist/deterministic/options.js +52 -0
  330. package/dist/deterministic/options.js.map +1 -0
  331. package/dist/deterministic/options.test.d.ts +2 -0
  332. package/dist/deterministic/options.test.d.ts.map +1 -0
  333. package/dist/deterministic/options.test.js +111 -0
  334. package/dist/deterministic/options.test.js.map +1 -0
  335. package/dist/deterministic/random.d.ts +68 -0
  336. package/dist/deterministic/random.d.ts.map +1 -0
  337. package/dist/deterministic/random.js +225 -0
  338. package/dist/deterministic/random.js.map +1 -0
  339. package/dist/deterministic/random.test.d.ts +2 -0
  340. package/dist/deterministic/random.test.d.ts.map +1 -0
  341. package/dist/deterministic/random.test.js +244 -0
  342. package/dist/deterministic/random.test.js.map +1 -0
  343. package/dist/deterministic/sequence.d.ts +56 -0
  344. package/dist/deterministic/sequence.d.ts.map +1 -0
  345. package/dist/deterministic/sequence.js +107 -0
  346. package/dist/deterministic/sequence.js.map +1 -0
  347. package/dist/deterministic/sequence.test.d.ts +2 -0
  348. package/dist/deterministic/sequence.test.d.ts.map +1 -0
  349. package/dist/deterministic/sequence.test.js +71 -0
  350. package/dist/deterministic/sequence.test.js.map +1 -0
  351. package/dist/deterministic/timestamp.d.ts +47 -0
  352. package/dist/deterministic/timestamp.d.ts.map +1 -0
  353. package/dist/deterministic/timestamp.js +74 -0
  354. package/dist/deterministic/timestamp.js.map +1 -0
  355. package/dist/deterministic/timestamp.test.d.ts +2 -0
  356. package/dist/deterministic/timestamp.test.d.ts.map +1 -0
  357. package/dist/deterministic/timestamp.test.js +145 -0
  358. package/dist/deterministic/timestamp.test.js.map +1 -0
  359. package/dist/deterministic/uuid-v7.d.ts +49 -0
  360. package/dist/deterministic/uuid-v7.d.ts.map +1 -0
  361. package/dist/deterministic/uuid-v7.js +75 -0
  362. package/dist/deterministic/uuid-v7.js.map +1 -0
  363. package/dist/deterministic/uuid-v7.test.d.ts +2 -0
  364. package/dist/deterministic/uuid-v7.test.d.ts.map +1 -0
  365. package/dist/deterministic/uuid-v7.test.js +114 -0
  366. package/dist/deterministic/uuid-v7.test.js.map +1 -0
  367. package/dist/discussion/create-discussion.d.ts +2 -1
  368. package/dist/discussion/create-discussion.d.ts.map +1 -1
  369. package/dist/discussion/create-discussion.js.map +1 -1
  370. package/dist/discussion/create-discussion.test.js +13 -2
  371. package/dist/discussion/create-discussion.test.js.map +1 -1
  372. package/dist/entity/eb-entity.d.ts +76 -0
  373. package/dist/entity/eb-entity.d.ts.map +1 -0
  374. package/dist/entity/eb-entity.js +156 -0
  375. package/dist/entity/eb-entity.js.map +1 -0
  376. package/dist/entity/eb-entity.test.d.ts +2 -0
  377. package/dist/entity/eb-entity.test.d.ts.map +1 -0
  378. package/dist/entity/eb-entity.test.js +573 -0
  379. package/dist/entity/eb-entity.test.js.map +1 -0
  380. package/dist/entity/index.d.ts +7 -0
  381. package/dist/entity/index.d.ts.map +1 -0
  382. package/dist/entity/index.js +4 -0
  383. package/dist/entity/index.js.map +1 -0
  384. package/dist/entity/label/create-entity-label.d.ts +61 -0
  385. package/dist/entity/label/create-entity-label.d.ts.map +1 -0
  386. package/dist/entity/label/create-entity-label.js +92 -0
  387. package/dist/entity/label/create-entity-label.js.map +1 -0
  388. package/dist/entity/label/create-entity-label.test.d.ts +2 -0
  389. package/dist/entity/label/create-entity-label.test.d.ts.map +1 -0
  390. package/dist/entity/label/create-entity-label.test.js +261 -0
  391. package/dist/entity/label/create-entity-label.test.js.map +1 -0
  392. package/dist/entity/label/schema.d.ts +40 -0
  393. package/dist/entity/label/schema.d.ts.map +1 -0
  394. package/dist/entity/label/schema.js +42 -0
  395. package/dist/entity/label/schema.js.map +1 -0
  396. package/dist/entity/label/schema.test.d.ts +2 -0
  397. package/dist/entity/label/schema.test.d.ts.map +1 -0
  398. package/dist/entity/label/schema.test.js +596 -0
  399. package/dist/entity/label/schema.test.js.map +1 -0
  400. package/dist/entity/schema.d.ts +13 -0
  401. package/dist/entity/schema.d.ts.map +1 -0
  402. package/dist/entity/schema.js +5 -0
  403. package/dist/entity/schema.js.map +1 -0
  404. package/dist/entity/thread/create-entity-thread.d.ts +75 -0
  405. package/dist/entity/thread/create-entity-thread.d.ts.map +1 -0
  406. package/dist/entity/thread/create-entity-thread.js +109 -0
  407. package/dist/entity/thread/create-entity-thread.js.map +1 -0
  408. package/dist/entity/thread/create-entity-thread.test.d.ts +2 -0
  409. package/dist/entity/thread/create-entity-thread.test.d.ts.map +1 -0
  410. package/dist/entity/thread/create-entity-thread.test.js +240 -0
  411. package/dist/entity/thread/create-entity-thread.test.js.map +1 -0
  412. package/dist/entity/thread/query-threads.test.d.ts +2 -0
  413. package/dist/entity/thread/query-threads.test.d.ts.map +1 -0
  414. package/dist/entity/thread/query-threads.test.js +330 -0
  415. package/dist/entity/thread/query-threads.test.js.map +1 -0
  416. package/dist/entity/thread/schema.d.ts +40 -0
  417. package/dist/entity/thread/schema.d.ts.map +1 -0
  418. package/dist/entity/thread/schema.js +42 -0
  419. package/dist/entity/thread/schema.js.map +1 -0
  420. package/dist/entity/thread/schema.test.d.ts +2 -0
  421. package/dist/entity/thread/schema.test.d.ts.map +1 -0
  422. package/dist/entity/thread/schema.test.js +144 -0
  423. package/dist/entity/thread/schema.test.js.map +1 -0
  424. package/dist/entity-views/entity-state-all.d.ts +52 -0
  425. package/dist/entity-views/entity-state-all.d.ts.map +1 -1
  426. package/dist/entity-views/entity-state-all.js +19 -11
  427. package/dist/entity-views/entity-state-all.js.map +1 -1
  428. package/dist/entity-views/entity-state-all.test.js +173 -0
  429. package/dist/entity-views/entity-state-all.test.js.map +1 -1
  430. package/dist/entity-views/entity-state-history.d.ts +55 -15
  431. package/dist/entity-views/entity-state-history.d.ts.map +1 -1
  432. package/dist/entity-views/entity-state-history.js +7 -4
  433. package/dist/entity-views/entity-state-history.js.map +1 -1
  434. package/dist/entity-views/entity-state-history.test.js +70 -15
  435. package/dist/entity-views/entity-state-history.test.js.map +1 -1
  436. package/dist/entity-views/entity-state.d.ts +52 -0
  437. package/dist/entity-views/entity-state.d.ts.map +1 -1
  438. package/dist/entity-views/entity-state.js +18 -10
  439. package/dist/entity-views/entity-state.js.map +1 -1
  440. package/dist/entity-views/entity-state.test.js +120 -1
  441. package/dist/entity-views/entity-state.test.js.map +1 -1
  442. package/dist/entity-views/entity-view-builder.test.js +6 -6
  443. package/dist/entity-views/entity-view-builder.test.js.map +1 -1
  444. package/dist/entity-views/types.d.ts +2 -2
  445. package/dist/file/database-schema.d.ts +25 -0
  446. package/dist/file/database-schema.d.ts.map +1 -0
  447. package/dist/file/database-schema.js +26 -0
  448. package/dist/file/database-schema.js.map +1 -0
  449. package/dist/file/database-schema.test.d.ts +2 -0
  450. package/dist/file/database-schema.test.d.ts.map +1 -0
  451. package/dist/file/database-schema.test.js +60 -0
  452. package/dist/file/database-schema.test.js.map +1 -0
  453. package/dist/file/file-handlers.d.ts.map +1 -1
  454. package/dist/file/file-handlers.js +36 -0
  455. package/dist/file/file-handlers.js.map +1 -1
  456. package/dist/file/file-handlers.test.js +4 -4
  457. package/dist/file/file-handlers.test.js.map +1 -1
  458. package/dist/file/materialize-file-data-at-changeset.d.ts +1 -1
  459. package/dist/file/materialize-file-data-at-changeset.d.ts.map +1 -1
  460. package/dist/file/materialize-file-data-at-changeset.js +55 -29
  461. package/dist/file/materialize-file-data-at-changeset.js.map +1 -1
  462. package/dist/file/materialize-file-data-at-commit.d.ts +9 -0
  463. package/dist/file/materialize-file-data-at-commit.d.ts.map +1 -0
  464. package/dist/file/materialize-file-data-at-commit.js +119 -0
  465. package/dist/file/materialize-file-data-at-commit.js.map +1 -0
  466. package/dist/file/schema.d.ts +68 -5
  467. package/dist/file/schema.d.ts.map +1 -1
  468. package/dist/file/schema.js +118 -50
  469. package/dist/file/schema.js.map +1 -1
  470. package/dist/file/schema.test.js +543 -35
  471. package/dist/file/schema.test.js.map +1 -1
  472. package/dist/file-queue/database-schema.d.ts +17 -0
  473. package/dist/file-queue/database-schema.d.ts.map +1 -0
  474. package/dist/file-queue/database-schema.js +53 -0
  475. package/dist/file-queue/database-schema.js.map +1 -0
  476. package/dist/file-queue/file-handlers.d.ts +1 -1
  477. package/dist/file-queue/file-handlers.d.ts.map +1 -1
  478. package/dist/file-queue/file-handlers.js +60 -29
  479. package/dist/file-queue/file-handlers.js.map +1 -1
  480. package/dist/file-queue/file-queue-process.d.ts.map +1 -1
  481. package/dist/file-queue/file-queue-process.js +26 -17
  482. package/dist/file-queue/file-queue-process.js.map +1 -1
  483. package/dist/file-queue/file-queue-process.test.js +133 -43
  484. package/dist/file-queue/file-queue-process.test.js.map +1 -1
  485. package/dist/file-queue/with-skip-file-queue.d.ts +18 -0
  486. package/dist/file-queue/with-skip-file-queue.d.ts.map +1 -1
  487. package/dist/file-queue/with-skip-file-queue.js +56 -10
  488. package/dist/file-queue/with-skip-file-queue.js.map +1 -1
  489. package/dist/file-queue/with-skip-file-queue.test.js +28 -12
  490. package/dist/file-queue/with-skip-file-queue.test.js.map +1 -1
  491. package/dist/hooks/create-hooks.d.ts +4 -26
  492. package/dist/hooks/create-hooks.d.ts.map +1 -1
  493. package/dist/hooks/create-hooks.js +3 -7
  494. package/dist/hooks/create-hooks.js.map +1 -1
  495. package/dist/index.d.ts +3 -0
  496. package/dist/index.d.ts.map +1 -1
  497. package/dist/index.js +3 -0
  498. package/dist/index.js.map +1 -1
  499. package/dist/key-value/database-schema.d.ts +3 -2
  500. package/dist/key-value/database-schema.d.ts.map +1 -1
  501. package/dist/key-value/database-schema.js +3 -3
  502. package/dist/key-value/database-schema.test.js +13 -4
  503. package/dist/key-value/database-schema.test.js.map +1 -1
  504. package/dist/key-value/index.d.ts +1 -1
  505. package/dist/key-value/index.d.ts.map +1 -1
  506. package/dist/key-value/index.js.map +1 -1
  507. package/dist/key-value/schema.d.ts +63 -3
  508. package/dist/key-value/schema.d.ts.map +1 -1
  509. package/dist/key-value/schema.js +8 -2
  510. package/dist/key-value/schema.js.map +1 -1
  511. package/dist/key-value/schema.test.js +91 -2
  512. package/dist/key-value/schema.test.js.map +1 -1
  513. package/dist/key-value-v2/schema.d.ts +27 -0
  514. package/dist/key-value-v2/schema.d.ts.map +1 -0
  515. package/dist/key-value-v2/schema.js +73 -0
  516. package/dist/key-value-v2/schema.js.map +1 -0
  517. package/dist/key-value-v2/schema.test.d.ts +2 -0
  518. package/dist/key-value-v2/schema.test.d.ts.map +1 -0
  519. package/dist/key-value-v2/schema.test.js +144 -0
  520. package/dist/key-value-v2/schema.test.js.map +1 -0
  521. package/dist/label/create-label.d.ts +5 -5
  522. package/dist/label/create-label.d.ts.map +1 -1
  523. package/dist/label/create-label.js +2 -2
  524. package/dist/label/create-label.js.map +1 -1
  525. package/dist/label/index.d.ts +1 -1
  526. package/dist/label/index.d.ts.map +1 -1
  527. package/dist/label/index.js.map +1 -1
  528. package/dist/label/schema.d.ts +3 -3
  529. package/dist/label/schema.d.ts.map +1 -1
  530. package/dist/label/schema.js +4 -6
  531. package/dist/label/schema.js.map +1 -1
  532. package/dist/lix/close-lix.d.ts +1 -10
  533. package/dist/lix/close-lix.d.ts.map +1 -1
  534. package/dist/lix/close-lix.js +1 -10
  535. package/dist/lix/close-lix.js.map +1 -1
  536. package/dist/lix/merge.test.js +4 -1
  537. package/dist/lix/merge.test.js.map +1 -1
  538. package/dist/lix/new-lix.d.ts +4 -2
  539. package/dist/lix/new-lix.d.ts.map +1 -1
  540. package/dist/lix/new-lix.js +244 -60
  541. package/dist/lix/new-lix.js.map +1 -1
  542. package/dist/lix/new-lix.test.js +175 -1
  543. package/dist/lix/new-lix.test.js.map +1 -1
  544. package/dist/lix/open-lix-in-memory.d.ts +1 -9
  545. package/dist/lix/open-lix-in-memory.d.ts.map +1 -1
  546. package/dist/lix/open-lix-in-memory.js +7 -15
  547. package/dist/lix/open-lix-in-memory.js.map +1 -1
  548. package/dist/lix/open-lix-in-memory.test.js +2 -1
  549. package/dist/lix/open-lix-in-memory.test.js.map +1 -1
  550. package/dist/lix/open-lix.d.ts +12 -13
  551. package/dist/lix/open-lix.d.ts.map +1 -1
  552. package/dist/lix/open-lix.js +147 -55
  553. package/dist/lix/open-lix.js.map +1 -1
  554. package/dist/lix/open-lix.test.js +242 -3
  555. package/dist/lix/open-lix.test.js.map +1 -1
  556. package/dist/lix/storage/in-memory.d.ts +7 -6
  557. package/dist/lix/storage/in-memory.d.ts.map +1 -1
  558. package/dist/lix/storage/in-memory.js +10 -17
  559. package/dist/lix/storage/in-memory.js.map +1 -1
  560. package/dist/lix/storage/in-memory.test.js +7 -68
  561. package/dist/lix/storage/in-memory.test.js.map +1 -1
  562. package/dist/lix/storage/lix-storage-adapter.d.ts +35 -5
  563. package/dist/lix/storage/lix-storage-adapter.d.ts.map +1 -1
  564. package/dist/lix/storage/opfs.d.ts +39 -10
  565. package/dist/lix/storage/opfs.d.ts.map +1 -1
  566. package/dist/lix/storage/opfs.js +148 -37
  567. package/dist/lix/storage/opfs.js.map +1 -1
  568. package/dist/lix/storage/opfs.test.js +203 -24
  569. package/dist/lix/storage/opfs.test.js.map +1 -1
  570. package/dist/lix/to-blob.d.ts +2 -9
  571. package/dist/lix/to-blob.d.ts.map +1 -1
  572. package/dist/lix/to-blob.js +2 -9
  573. package/dist/lix/to-blob.js.map +1 -1
  574. package/dist/log/create-lix-own-log.d.ts +9 -1
  575. package/dist/log/create-lix-own-log.d.ts.map +1 -1
  576. package/dist/log/create-lix-own-log.js +14 -25
  577. package/dist/log/create-lix-own-log.js.map +1 -1
  578. package/dist/log/create-lix-own-log.test.js +9 -5
  579. package/dist/log/create-lix-own-log.test.js.map +1 -1
  580. package/dist/log/create-log.d.ts +2 -2
  581. package/dist/log/create-log.d.ts.map +1 -1
  582. package/dist/log/create-log.js +2 -2
  583. package/dist/log/create-log.js.map +1 -1
  584. package/dist/log/database-schema.d.ts +33 -0
  585. package/dist/log/database-schema.d.ts.map +1 -0
  586. package/dist/log/database-schema.js +14 -0
  587. package/dist/log/database-schema.js.map +1 -0
  588. package/dist/log/database-schema.test.d.ts +2 -0
  589. package/dist/log/database-schema.test.d.ts.map +1 -0
  590. package/dist/log/database-schema.test.js +22 -0
  591. package/dist/log/database-schema.test.js.map +1 -0
  592. package/dist/log/index.d.ts +1 -1
  593. package/dist/log/index.d.ts.map +1 -1
  594. package/dist/log/index.js.map +1 -1
  595. package/dist/log/schema.d.ts +3 -3
  596. package/dist/log/schema.d.ts.map +1 -1
  597. package/dist/log/schema.js +4 -5
  598. package/dist/log/schema.js.map +1 -1
  599. package/dist/observe/create-observe.d.ts.map +1 -1
  600. package/dist/observe/create-observe.js +32 -3
  601. package/dist/observe/create-observe.js.map +1 -1
  602. package/dist/observe/create-observe.test.js +298 -44
  603. package/dist/observe/create-observe.test.js.map +1 -1
  604. package/dist/observe/determine-schema-keys.d.ts +6 -0
  605. package/dist/observe/determine-schema-keys.d.ts.map +1 -0
  606. package/dist/observe/determine-schema-keys.js +145 -0
  607. package/dist/observe/determine-schema-keys.js.map +1 -0
  608. package/dist/observe/determine-schema-keys.test.d.ts +2 -0
  609. package/dist/observe/determine-schema-keys.test.d.ts.map +1 -0
  610. package/dist/observe/determine-schema-keys.test.js +266 -0
  611. package/dist/observe/determine-schema-keys.test.js.map +1 -0
  612. package/dist/own-change-control/apply-own-change.d.ts +5 -1
  613. package/dist/own-change-control/apply-own-change.d.ts.map +1 -1
  614. package/dist/own-change-control/apply-own-change.js +26 -12
  615. package/dist/own-change-control/apply-own-change.js.map +1 -1
  616. package/dist/own-change-control/apply-own-change.test.js +86 -48
  617. package/dist/own-change-control/apply-own-change.test.js.map +1 -1
  618. package/dist/own-change-control/change-controlled-tables.d.ts +5 -7
  619. package/dist/own-change-control/change-controlled-tables.d.ts.map +1 -1
  620. package/dist/own-change-control/change-controlled-tables.js +27 -21
  621. package/dist/own-change-control/change-controlled-tables.js.map +1 -1
  622. package/dist/own-change-control/change-controlled-tables.test.js +35 -5
  623. package/dist/own-change-control/change-controlled-tables.test.js.map +1 -1
  624. package/dist/own-change-control/database-triggers.d.ts +2 -1
  625. package/dist/own-change-control/database-triggers.d.ts.map +1 -1
  626. package/dist/own-change-control/database-triggers.js +209 -67
  627. package/dist/own-change-control/database-triggers.js.map +1 -1
  628. package/dist/own-change-control/database-triggers.test.js +139 -8
  629. package/dist/own-change-control/database-triggers.test.js.map +1 -1
  630. package/dist/own-change-control/with-skip-own-change-control.d.ts.map +1 -1
  631. package/dist/own-change-control/with-skip-own-change-control.js +28 -6
  632. package/dist/own-change-control/with-skip-own-change-control.js.map +1 -1
  633. package/dist/own-change-control/with-skip-own-change-control.test.js +38 -1
  634. package/dist/own-change-control/with-skip-own-change-control.test.js.map +1 -1
  635. package/dist/plugin/lix-plugin.d.ts +3 -3
  636. package/dist/plugin/lix-plugin.d.ts.map +1 -1
  637. package/dist/plugin/load-plugin.d.ts.map +1 -1
  638. package/dist/plugin/load-plugin.js.map +1 -1
  639. package/dist/prototype/database-schema.d.ts +43 -0
  640. package/dist/prototype/database-schema.d.ts.map +1 -0
  641. package/dist/prototype/database-schema.js +72 -0
  642. package/dist/prototype/database-schema.js.map +1 -0
  643. package/dist/prototype/file-handlers.d.ts +24 -0
  644. package/dist/prototype/file-handlers.d.ts.map +1 -0
  645. package/dist/prototype/file-handlers.js +129 -0
  646. package/dist/prototype/file-handlers.js.map +1 -0
  647. package/dist/prototype/file-schema.d.ts +47 -0
  648. package/dist/prototype/file-schema.d.ts.map +1 -0
  649. package/dist/prototype/file-schema.js +135 -0
  650. package/dist/prototype/file-schema.js.map +1 -0
  651. package/dist/prototype/file-schema.test.d.ts +2 -0
  652. package/dist/prototype/file-schema.test.d.ts.map +1 -0
  653. package/dist/prototype/file-schema.test.js +146 -0
  654. package/dist/prototype/file-schema.test.js.map +1 -0
  655. package/dist/prototype/get-and-materialize-row.d.ts +5 -0
  656. package/dist/prototype/get-and-materialize-row.d.ts.map +1 -0
  657. package/dist/prototype/get-and-materialize-row.js +99 -0
  658. package/dist/prototype/get-and-materialize-row.js.map +1 -0
  659. package/dist/prototype/json-plugin.d.ts +49 -0
  660. package/dist/prototype/json-plugin.d.ts.map +1 -0
  661. package/dist/prototype/json-plugin.js +104 -0
  662. package/dist/prototype/json-plugin.js.map +1 -0
  663. package/dist/prototype/validate-file-path.d.ts +16 -0
  664. package/dist/prototype/validate-file-path.d.ts.map +1 -0
  665. package/dist/prototype/validate-file-path.js +44 -0
  666. package/dist/prototype/validate-file-path.js.map +1 -0
  667. package/dist/prototype/validate-file-path.test.d.ts +2 -0
  668. package/dist/prototype/validate-file-path.test.d.ts.map +1 -0
  669. package/dist/prototype/validate-file-path.test.js +36 -0
  670. package/dist/prototype/validate-file-path.test.js.map +1 -0
  671. package/dist/prototype/version-schema.d.ts +34 -0
  672. package/dist/prototype/version-schema.d.ts.map +1 -0
  673. package/dist/prototype/version-schema.js +86 -0
  674. package/dist/prototype/version-schema.js.map +1 -0
  675. package/dist/prototype/version-schema.test.d.ts +2 -0
  676. package/dist/prototype/version-schema.test.d.ts.map +1 -0
  677. package/dist/prototype/version-schema.test.js +114 -0
  678. package/dist/prototype/version-schema.test.js.map +1 -0
  679. package/dist/query-filter/change-conflict-in-version.d.ts +2 -0
  680. package/dist/query-filter/change-conflict-in-version.d.ts.map +1 -1
  681. package/dist/query-filter/change-conflict-in-version.js +2 -0
  682. package/dist/query-filter/change-conflict-in-version.js.map +1 -1
  683. package/dist/query-filter/change-in-version.d.ts +2 -0
  684. package/dist/query-filter/change-in-version.d.ts.map +1 -1
  685. package/dist/query-filter/change-in-version.js +2 -0
  686. package/dist/query-filter/change-in-version.js.map +1 -1
  687. package/dist/query-filter/change-is-leaf-in-version.d.ts +1 -0
  688. package/dist/query-filter/change-is-leaf-in-version.d.ts.map +1 -1
  689. package/dist/query-filter/change-is-leaf-in-version.js +1 -0
  690. package/dist/query-filter/change-is-leaf-in-version.js.map +1 -1
  691. package/dist/query-filter/change-is-leaf-of.d.ts +2 -0
  692. package/dist/query-filter/change-is-leaf-of.d.ts.map +1 -1
  693. package/dist/query-filter/change-is-leaf-of.js +2 -0
  694. package/dist/query-filter/change-is-leaf-of.js.map +1 -1
  695. package/dist/query-filter/change-is-leaf-v2.d.ts +69 -0
  696. package/dist/query-filter/change-is-leaf-v2.d.ts.map +1 -0
  697. package/dist/query-filter/change-is-leaf-v2.js +116 -0
  698. package/dist/query-filter/change-is-leaf-v2.js.map +1 -0
  699. package/dist/query-filter/change-is-leaf-v2.test.d.ts +2 -0
  700. package/dist/query-filter/change-is-leaf-v2.test.d.ts.map +1 -0
  701. package/dist/query-filter/change-is-leaf-v2.test.js +237 -0
  702. package/dist/query-filter/change-is-leaf-v2.test.js.map +1 -0
  703. package/dist/query-filter/change-is-leaf.d.ts +2 -0
  704. package/dist/query-filter/change-is-leaf.d.ts.map +1 -1
  705. package/dist/query-filter/change-is-leaf.js +2 -0
  706. package/dist/query-filter/change-is-leaf.js.map +1 -1
  707. package/dist/query-filter/change-is-lowest-common-ancestor-of.d.ts +2 -0
  708. package/dist/query-filter/change-is-lowest-common-ancestor-of.d.ts.map +1 -1
  709. package/dist/query-filter/change-is-lowest-common-ancestor-of.js +4 -0
  710. package/dist/query-filter/change-is-lowest-common-ancestor-of.js.map +1 -1
  711. package/dist/query-filter/change-is-lowest-common-ancestor-of.test.js +5 -3
  712. package/dist/query-filter/change-is-lowest-common-ancestor-of.test.js.map +1 -1
  713. package/dist/query-filter/change-set-element-in-ancestry-of.d.ts +10 -10
  714. package/dist/query-filter/change-set-element-in-ancestry-of.d.ts.map +1 -1
  715. package/dist/query-filter/change-set-element-in-ancestry-of.js +22 -17
  716. package/dist/query-filter/change-set-element-in-ancestry-of.js.map +1 -1
  717. package/dist/query-filter/change-set-element-in-ancestry-of.test.js +99 -26
  718. package/dist/query-filter/change-set-element-in-ancestry-of.test.js.map +1 -1
  719. package/dist/query-filter/change-set-element-in-symmetric-difference-of.d.ts +21 -0
  720. package/dist/query-filter/change-set-element-in-symmetric-difference-of.d.ts.map +1 -0
  721. package/dist/query-filter/change-set-element-in-symmetric-difference-of.js +37 -0
  722. package/dist/query-filter/change-set-element-in-symmetric-difference-of.js.map +1 -0
  723. package/dist/query-filter/change-set-element-in-symmetric-difference-of.test.d.ts +2 -0
  724. package/dist/query-filter/change-set-element-in-symmetric-difference-of.test.d.ts.map +1 -0
  725. package/dist/query-filter/change-set-element-in-symmetric-difference-of.test.js +276 -0
  726. package/dist/query-filter/change-set-element-in-symmetric-difference-of.test.js.map +1 -0
  727. package/dist/query-filter/change-set-element-in-symmetric-difference.d.ts +2 -2
  728. package/dist/query-filter/change-set-element-in-symmetric-difference.d.ts.map +1 -1
  729. package/dist/query-filter/change-set-element-in-symmetric-difference.js.map +1 -1
  730. package/dist/query-filter/change-set-element-in-symmetric-difference.test.js.map +1 -1
  731. package/dist/query-filter/change-set-element-is-leaf-of.d.ts +11 -11
  732. package/dist/query-filter/change-set-element-is-leaf-of.d.ts.map +1 -1
  733. package/dist/query-filter/change-set-element-is-leaf-of.js +58 -36
  734. package/dist/query-filter/change-set-element-is-leaf-of.js.map +1 -1
  735. package/dist/query-filter/change-set-element-is-leaf-of.test.js +83 -24
  736. package/dist/query-filter/change-set-element-is-leaf-of.test.js.map +1 -1
  737. package/dist/query-filter/change-set-is-ancestor-of.d.ts +2 -2
  738. package/dist/query-filter/change-set-is-ancestor-of.d.ts.map +1 -1
  739. package/dist/query-filter/change-set-is-ancestor-of.js.map +1 -1
  740. package/dist/query-filter/change-set-is-descendant-of.d.ts +2 -2
  741. package/dist/query-filter/change-set-is-descendant-of.d.ts.map +1 -1
  742. package/dist/query-filter/change-set-is-descendant-of.js.map +1 -1
  743. package/dist/query-filter/commit-is-ancestor-of.d.ts +51 -0
  744. package/dist/query-filter/commit-is-ancestor-of.d.ts.map +1 -0
  745. package/dist/query-filter/commit-is-ancestor-of.js +63 -0
  746. package/dist/query-filter/commit-is-ancestor-of.js.map +1 -0
  747. package/dist/query-filter/commit-is-ancestor-of.test.d.ts +2 -0
  748. package/dist/query-filter/commit-is-ancestor-of.test.d.ts.map +1 -0
  749. package/dist/query-filter/commit-is-ancestor-of.test.js +292 -0
  750. package/dist/query-filter/commit-is-ancestor-of.test.js.map +1 -0
  751. package/dist/query-filter/commit-is-descendant-of.d.ts +44 -0
  752. package/dist/query-filter/commit-is-descendant-of.d.ts.map +1 -0
  753. package/dist/query-filter/commit-is-descendant-of.js +56 -0
  754. package/dist/query-filter/commit-is-descendant-of.js.map +1 -0
  755. package/dist/query-filter/commit-is-descendant-of.test.d.ts +2 -0
  756. package/dist/query-filter/commit-is-descendant-of.test.d.ts.map +1 -0
  757. package/dist/query-filter/commit-is-descendant-of.test.js +325 -0
  758. package/dist/query-filter/commit-is-descendant-of.test.js.map +1 -0
  759. package/dist/query-filter/index.d.ts +2 -4
  760. package/dist/query-filter/index.d.ts.map +1 -1
  761. package/dist/query-filter/index.js +2 -4
  762. package/dist/query-filter/index.js.map +1 -1
  763. package/dist/query-filter/version-change-in-difference.d.ts +2 -0
  764. package/dist/query-filter/version-change-in-difference.d.ts.map +1 -1
  765. package/dist/query-filter/version-change-in-difference.js +2 -0
  766. package/dist/query-filter/version-change-in-difference.js.map +1 -1
  767. package/dist/query-filter/version-change-in-symmetric-difference.d.ts +2 -0
  768. package/dist/query-filter/version-change-in-symmetric-difference.d.ts.map +1 -1
  769. package/dist/query-filter/version-change-in-symmetric-difference.js +2 -0
  770. package/dist/query-filter/version-change-in-symmetric-difference.js.map +1 -1
  771. package/dist/schema-definition/definition.d.ts +73 -30
  772. package/dist/schema-definition/definition.d.ts.map +1 -1
  773. package/dist/schema-definition/definition.js +38 -14
  774. package/dist/schema-definition/definition.js.map +1 -1
  775. package/dist/schema-definition/definition.test.js +70 -25
  776. package/dist/schema-definition/definition.test.js.map +1 -1
  777. package/dist/schema-definition/validate-lix-schema.d.ts.map +1 -1
  778. package/dist/schema-definition/validate-lix-schema.js.map +1 -1
  779. package/dist/schema-definition/validate-lix-schema.test.js +1 -1
  780. package/dist/schema-definition/validate-lix-schema.test.js.map +1 -1
  781. package/dist/server-protocol-handler/environment/create-in-memory-environment.test.js +2 -2
  782. package/dist/server-protocol-handler/environment/create-in-memory-environment.test.js.map +1 -1
  783. package/dist/server-protocol-handler/routes/push-v1.test.js +1 -1
  784. package/dist/server-protocol-handler/routes/push-v1.test.js.map +1 -1
  785. package/dist/services/env-variables/index.js +1 -1
  786. package/dist/services/env-variables/index.js.map +1 -1
  787. package/dist/snapshot/create-snapshot.d.ts +2 -2
  788. package/dist/snapshot/create-snapshot.d.ts.map +1 -1
  789. package/dist/snapshot/create-snapshot.test.js +3 -3
  790. package/dist/snapshot/create-snapshot.test.js.map +1 -1
  791. package/dist/snapshot/database-schema.d.ts +19 -0
  792. package/dist/snapshot/database-schema.d.ts.map +1 -0
  793. package/dist/snapshot/database-schema.js +33 -0
  794. package/dist/snapshot/database-schema.js.map +1 -0
  795. package/dist/snapshot/database-schema.test.d.ts +2 -0
  796. package/dist/snapshot/database-schema.test.d.ts.map +1 -0
  797. package/dist/snapshot/database-schema.test.js +58 -0
  798. package/dist/snapshot/database-schema.test.js.map +1 -0
  799. package/dist/snapshot/schema.d.ts.map +1 -1
  800. package/dist/snapshot/schema.js +10 -2
  801. package/dist/snapshot/schema.js.map +1 -1
  802. package/dist/snapshot/schema.test.js +86 -0
  803. package/dist/snapshot/schema.test.js.map +1 -1
  804. package/dist/state/cache/clear-state-cache.d.ts +8 -0
  805. package/dist/state/cache/clear-state-cache.d.ts.map +1 -0
  806. package/dist/state/cache/clear-state-cache.js +14 -0
  807. package/dist/state/cache/clear-state-cache.js.map +1 -0
  808. package/dist/state/cache/clear-state-cache.test.d.ts +2 -0
  809. package/dist/state/cache/clear-state-cache.test.d.ts.map +1 -0
  810. package/dist/state/cache/clear-state-cache.test.js +34 -0
  811. package/dist/state/cache/clear-state-cache.test.js.map +1 -0
  812. package/dist/state/cache/is-stale-state-cache.d.ts +5 -0
  813. package/dist/state/cache/is-stale-state-cache.d.ts.map +1 -0
  814. package/dist/state/cache/is-stale-state-cache.js +22 -0
  815. package/dist/state/cache/is-stale-state-cache.js.map +1 -0
  816. package/dist/state/cache/is-stale-state-cache.test.d.ts +2 -0
  817. package/dist/state/cache/is-stale-state-cache.test.d.ts.map +1 -0
  818. package/dist/state/cache/is-stale-state-cache.test.js +27 -0
  819. package/dist/state/cache/is-stale-state-cache.test.js.map +1 -0
  820. package/dist/state/cache/mark-state-cache-as-stale.d.ts +10 -0
  821. package/dist/state/cache/mark-state-cache-as-stale.d.ts.map +1 -0
  822. package/dist/state/cache/mark-state-cache-as-stale.js +42 -0
  823. package/dist/state/cache/mark-state-cache-as-stale.js.map +1 -0
  824. package/dist/state/cache/populate-state-cache.d.ts +9 -0
  825. package/dist/state/cache/populate-state-cache.d.ts.map +1 -0
  826. package/dist/state/cache/populate-state-cache.js +106 -0
  827. package/dist/state/cache/populate-state-cache.js.map +1 -0
  828. package/dist/state/cache/populate-state-cache.test.d.ts +2 -0
  829. package/dist/state/cache/populate-state-cache.test.d.ts.map +1 -0
  830. package/dist/state/cache/populate-state-cache.test.js +204 -0
  831. package/dist/state/cache/populate-state-cache.test.js.map +1 -0
  832. package/dist/state/cache/schema.d.ts +20 -0
  833. package/dist/state/cache/schema.d.ts.map +1 -0
  834. package/dist/state/cache/schema.js +21 -0
  835. package/dist/state/cache/schema.js.map +1 -0
  836. package/dist/state/cache/update-state-cache.d.ts +21 -0
  837. package/dist/state/cache/update-state-cache.d.ts.map +1 -0
  838. package/dist/state/cache/update-state-cache.js +294 -0
  839. package/dist/state/cache/update-state-cache.js.map +1 -0
  840. package/dist/state/cache/update-state-cache.test.d.ts +2 -0
  841. package/dist/state/cache/update-state-cache.test.d.ts.map +1 -0
  842. package/dist/state/cache/update-state-cache.test.js +440 -0
  843. package/dist/state/cache/update-state-cache.test.js.map +1 -0
  844. package/dist/state/commit.d.ts +18 -0
  845. package/dist/state/commit.d.ts.map +1 -0
  846. package/dist/state/commit.js +457 -0
  847. package/dist/state/commit.js.map +1 -0
  848. package/dist/state/commit.test.d.ts +2 -0
  849. package/dist/state/commit.test.d.ts.map +1 -0
  850. package/dist/state/commit.test.js +1173 -0
  851. package/dist/state/commit.test.js.map +1 -0
  852. package/dist/state/get-version-record-by-id-or-throw.d.ts +2 -2
  853. package/dist/state/get-version-record-by-id-or-throw.d.ts.map +1 -1
  854. package/dist/state/get-version-record-by-id-or-throw.js.map +1 -1
  855. package/dist/state/handle-state-mutation.d.ts +0 -12
  856. package/dist/state/handle-state-mutation.d.ts.map +1 -1
  857. package/dist/state/handle-state-mutation.js +11 -206
  858. package/dist/state/handle-state-mutation.js.map +1 -1
  859. package/dist/state/handle-state-mutation.test.js +213 -159
  860. package/dist/state/handle-state-mutation.test.js.map +1 -1
  861. package/dist/state/insert-transaction-state.d.ts +71 -0
  862. package/dist/state/insert-transaction-state.d.ts.map +1 -0
  863. package/dist/state/insert-transaction-state.js +272 -0
  864. package/dist/state/insert-transaction-state.js.map +1 -0
  865. package/dist/state/insert-transaction-state.test.d.ts +2 -0
  866. package/dist/state/insert-transaction-state.test.d.ts.map +1 -0
  867. package/dist/state/insert-transaction-state.test.js +789 -0
  868. package/dist/state/insert-transaction-state.test.js.map +1 -0
  869. package/dist/state/materialize-state.d.ts +3 -0
  870. package/dist/state/materialize-state.d.ts.map +1 -0
  871. package/dist/state/materialize-state.js +230 -0
  872. package/dist/state/materialize-state.js.map +1 -0
  873. package/dist/state/materialize-state.test.d.ts +2 -0
  874. package/dist/state/materialize-state.test.d.ts.map +1 -0
  875. package/dist/state/materialize-state.test.js +1934 -0
  876. package/dist/state/materialize-state.test.js.map +1 -0
  877. package/dist/state/primary-key.d.ts +39 -0
  878. package/dist/state/primary-key.d.ts.map +1 -0
  879. package/dist/state/primary-key.js +62 -0
  880. package/dist/state/primary-key.js.map +1 -0
  881. package/dist/state/primary-key.test.d.ts +2 -0
  882. package/dist/state/primary-key.test.d.ts.map +1 -0
  883. package/dist/state/primary-key.test.js +114 -0
  884. package/dist/state/primary-key.test.js.map +1 -0
  885. package/dist/state/resolved-state-view.d.ts +33 -0
  886. package/dist/state/resolved-state-view.d.ts.map +1 -0
  887. package/dist/state/resolved-state-view.js +182 -0
  888. package/dist/state/resolved-state-view.js.map +1 -0
  889. package/dist/state/resolved-state-view.test.d.ts +2 -0
  890. package/dist/state/resolved-state-view.test.d.ts.map +1 -0
  891. package/dist/state/resolved-state-view.test.js +433 -0
  892. package/dist/state/resolved-state-view.test.js.map +1 -0
  893. package/dist/state/schema.d.ts +6 -19
  894. package/dist/state/schema.d.ts.map +1 -1
  895. package/dist/state/schema.js +533 -796
  896. package/dist/state/schema.js.map +1 -1
  897. package/dist/state/schema.test.js +1684 -1013
  898. package/dist/state/schema.test.js.map +1 -1
  899. package/dist/state/untracked/schema.d.ts +25 -0
  900. package/dist/state/untracked/schema.d.ts.map +1 -0
  901. package/dist/state/untracked/schema.js +38 -0
  902. package/dist/state/untracked/schema.js.map +1 -0
  903. package/dist/state/untracked/schema.test.d.ts +2 -0
  904. package/dist/state/untracked/schema.test.d.ts.map +1 -0
  905. package/dist/state/untracked/schema.test.js +275 -0
  906. package/dist/state/untracked/schema.test.js.map +1 -0
  907. package/dist/state/untracked/update-untracked-state.d.ts +36 -0
  908. package/dist/state/untracked/update-untracked-state.d.ts.map +1 -0
  909. package/dist/state/untracked/update-untracked-state.js +113 -0
  910. package/dist/state/untracked/update-untracked-state.js.map +1 -0
  911. package/dist/state/untracked/update-untracked-state.test.d.ts +2 -0
  912. package/dist/state/untracked/update-untracked-state.test.d.ts.map +1 -0
  913. package/dist/state/untracked/update-untracked-state.test.js +417 -0
  914. package/dist/state/untracked/update-untracked-state.test.js.map +1 -0
  915. package/dist/state/validate-snapshot-content.d.ts +9 -0
  916. package/dist/state/validate-snapshot-content.d.ts.map +1 -0
  917. package/dist/state/validate-snapshot-content.js +42 -0
  918. package/dist/state/validate-snapshot-content.js.map +1 -0
  919. package/dist/state/validate-snapshot-content.test.d.ts +2 -0
  920. package/dist/state/validate-snapshot-content.test.d.ts.map +1 -0
  921. package/dist/state/validate-snapshot-content.test.js +67 -0
  922. package/dist/state/validate-snapshot-content.test.js.map +1 -0
  923. package/dist/state/validate-state-mutation.d.ts +2 -2
  924. package/dist/state/validate-state-mutation.d.ts.map +1 -1
  925. package/dist/state/validate-state-mutation.js +211 -51
  926. package/dist/state/validate-state-mutation.js.map +1 -1
  927. package/dist/state/validate-state-mutation.test.js +910 -75
  928. package/dist/state/validate-state-mutation.test.js.map +1 -1
  929. package/dist/state-history/schema.d.ts +29 -19
  930. package/dist/state-history/schema.d.ts.map +1 -1
  931. package/dist/state-history/schema.js +49 -37
  932. package/dist/state-history/schema.js.map +1 -1
  933. package/dist/state-history/schema.test.js +221 -67
  934. package/dist/state-history/schema.test.js.map +1 -1
  935. package/dist/stored-schema/index.d.ts +1 -1
  936. package/dist/stored-schema/index.d.ts.map +1 -1
  937. package/dist/stored-schema/index.js +1 -1
  938. package/dist/stored-schema/index.js.map +1 -1
  939. package/dist/stored-schema/schema.d.ts +1 -1
  940. package/dist/stored-schema/schema.d.ts.map +1 -1
  941. package/dist/stored-schema/schema.test.js.map +1 -1
  942. package/dist/sync/push-to-server.test.js.map +1 -1
  943. package/dist/test-utilities/simulation-test/cache-miss-simulation.d.ts +8 -0
  944. package/dist/test-utilities/simulation-test/cache-miss-simulation.d.ts.map +1 -0
  945. package/dist/test-utilities/simulation-test/cache-miss-simulation.js +79 -0
  946. package/dist/test-utilities/simulation-test/cache-miss-simulation.js.map +1 -0
  947. package/dist/test-utilities/simulation-test/cache-miss-simulation.test.d.ts +2 -0
  948. package/dist/test-utilities/simulation-test/cache-miss-simulation.test.d.ts.map +1 -0
  949. package/dist/test-utilities/simulation-test/cache-miss-simulation.test.js +127 -0
  950. package/dist/test-utilities/simulation-test/cache-miss-simulation.test.js.map +1 -0
  951. package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.d.ts +2 -0
  952. package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.d.ts.map +1 -0
  953. package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.js +2 -0
  954. package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.js.map +1 -0
  955. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.d.ts +10 -0
  956. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.d.ts.map +1 -0
  957. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.js +52 -0
  958. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.js.map +1 -0
  959. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.d.ts +2 -0
  960. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.d.ts.map +1 -0
  961. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.js +71 -0
  962. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.js.map +1 -0
  963. package/dist/test-utilities/simulation-test/simulation-test.d.ts +82 -0
  964. package/dist/test-utilities/simulation-test/simulation-test.d.ts.map +1 -0
  965. package/dist/test-utilities/simulation-test/simulation-test.js +85 -0
  966. package/dist/test-utilities/simulation-test/simulation-test.js.map +1 -0
  967. package/dist/test-utilities/simulation-test/simulation-test.test.d.ts +2 -0
  968. package/dist/test-utilities/simulation-test/simulation-test.test.d.ts.map +1 -0
  969. package/dist/test-utilities/simulation-test/simulation-test.test.js +310 -0
  970. package/dist/test-utilities/simulation-test/simulation-test.test.js.map +1 -0
  971. package/dist/thread/comment-utils.d.ts +2 -0
  972. package/dist/thread/comment-utils.d.ts.map +1 -0
  973. package/dist/thread/comment-utils.js +2 -0
  974. package/dist/thread/comment-utils.js.map +1 -0
  975. package/dist/thread/comment.d.ts +24 -0
  976. package/dist/thread/comment.d.ts.map +1 -0
  977. package/dist/thread/comment.js +43 -0
  978. package/dist/thread/comment.js.map +1 -0
  979. package/dist/thread/create-thread-comment.d.ts +2 -2
  980. package/dist/thread/create-thread-comment.d.ts.map +1 -1
  981. package/dist/thread/create-thread-comment.js +20 -3
  982. package/dist/thread/create-thread-comment.js.map +1 -1
  983. package/dist/thread/create-thread-comment.test.js +49 -3
  984. package/dist/thread/create-thread-comment.test.js.map +1 -1
  985. package/dist/thread/create-thread.d.ts +18 -4
  986. package/dist/thread/create-thread.d.ts.map +1 -1
  987. package/dist/thread/create-thread.js +24 -3
  988. package/dist/thread/create-thread.js.map +1 -1
  989. package/dist/thread/create-thread.test.js +149 -0
  990. package/dist/thread/create-thread.test.js.map +1 -1
  991. package/dist/thread/database-schema.d.ts +20 -0
  992. package/dist/thread/database-schema.d.ts.map +1 -0
  993. package/dist/thread/database-schema.js +57 -0
  994. package/dist/thread/database-schema.js.map +1 -0
  995. package/dist/thread/database-schema.test.d.ts +2 -0
  996. package/dist/thread/database-schema.test.d.ts.map +1 -0
  997. package/dist/thread/database-schema.test.js +59 -0
  998. package/dist/thread/database-schema.test.js.map +1 -0
  999. package/dist/thread/index.d.ts +2 -1
  1000. package/dist/thread/index.d.ts.map +1 -1
  1001. package/dist/thread/schema.d.ts +13 -10
  1002. package/dist/thread/schema.d.ts.map +1 -1
  1003. package/dist/thread/schema.js +20 -14
  1004. package/dist/thread/schema.js.map +1 -1
  1005. package/dist/thread/schema.test.js +65 -0
  1006. package/dist/thread/schema.test.js.map +1 -1
  1007. package/dist/version/create-version.d.ts +14 -9
  1008. package/dist/version/create-version.d.ts.map +1 -1
  1009. package/dist/version/create-version.js +40 -12
  1010. package/dist/version/create-version.js.map +1 -1
  1011. package/dist/version/create-version.test.js +80 -25
  1012. package/dist/version/create-version.test.js.map +1 -1
  1013. package/dist/version/database-schema.d.ts +21 -0
  1014. package/dist/version/database-schema.d.ts.map +1 -0
  1015. package/dist/version/database-schema.js +169 -0
  1016. package/dist/version/database-schema.js.map +1 -0
  1017. package/dist/version/database-schema.test.d.ts +2 -0
  1018. package/dist/version/database-schema.test.d.ts.map +1 -0
  1019. package/dist/version/database-schema.test.js +625 -0
  1020. package/dist/version/database-schema.test.js.map +1 -0
  1021. package/dist/version/index.d.ts +1 -1
  1022. package/dist/version/index.d.ts.map +1 -1
  1023. package/dist/version/merge-version.d.ts +3 -0
  1024. package/dist/version/merge-version.d.ts.map +1 -1
  1025. package/dist/version/merge-version.js +3 -0
  1026. package/dist/version/merge-version.js.map +1 -1
  1027. package/dist/version/merge-version.test.js +10 -5
  1028. package/dist/version/merge-version.test.js.map +1 -1
  1029. package/dist/version/schema.d.ts +28 -23
  1030. package/dist/version/schema.d.ts.map +1 -1
  1031. package/dist/version/schema.js +42 -30
  1032. package/dist/version/schema.js.map +1 -1
  1033. package/dist/version/schema.test.js +311 -88
  1034. package/dist/version/schema.test.js.map +1 -1
  1035. package/dist/version/select-active-version.d.ts +7 -0
  1036. package/dist/version/select-active-version.d.ts.map +1 -0
  1037. package/dist/version/select-active-version.js +7 -0
  1038. package/dist/version/select-active-version.js.map +1 -0
  1039. package/dist/version/switch-version.d.ts +3 -3
  1040. package/dist/version/switch-version.d.ts.map +1 -1
  1041. package/dist/version/switch-version.js +1 -1
  1042. package/dist/version/switch-version.test.js +1 -1
  1043. package/dist/version/switch-version.test.js.map +1 -1
  1044. package/dist/version/update-changes-in-version.d.ts +2 -0
  1045. package/dist/version/update-changes-in-version.d.ts.map +1 -1
  1046. package/dist/version/update-changes-in-version.js +2 -0
  1047. package/dist/version/update-changes-in-version.js.map +1 -1
  1048. package/dist/version-v2/create-version.d.ts +18 -0
  1049. package/dist/version-v2/create-version.d.ts.map +1 -0
  1050. package/dist/version-v2/create-version.js +35 -0
  1051. package/dist/version-v2/create-version.js.map +1 -0
  1052. package/dist/version-v2/create-version.test.d.ts +2 -0
  1053. package/dist/version-v2/create-version.test.d.ts.map +1 -0
  1054. package/dist/version-v2/create-version.test.js +88 -0
  1055. package/dist/version-v2/create-version.test.js.map +1 -0
  1056. package/dist/version-v2/database-schema.d.ts +21 -0
  1057. package/dist/version-v2/database-schema.d.ts.map +1 -0
  1058. package/dist/version-v2/database-schema.js +169 -0
  1059. package/dist/version-v2/database-schema.js.map +1 -0
  1060. package/dist/version-v2/database-schema.test.d.ts +2 -0
  1061. package/dist/version-v2/database-schema.test.d.ts.map +1 -0
  1062. package/dist/version-v2/database-schema.test.js +625 -0
  1063. package/dist/version-v2/database-schema.test.js.map +1 -0
  1064. package/dist/version-v2/index.d.ts +2 -0
  1065. package/dist/version-v2/index.d.ts.map +1 -0
  1066. package/dist/version-v2/index.js +2 -0
  1067. package/dist/version-v2/index.js.map +1 -0
  1068. package/dist/version-v2/swich-version.d.ts +27 -0
  1069. package/dist/version-v2/swich-version.d.ts.map +1 -0
  1070. package/dist/version-v2/swich-version.js +46 -0
  1071. package/dist/version-v2/swich-version.js.map +1 -0
  1072. package/dist/version-v2/switch-version.d.ts +27 -0
  1073. package/dist/version-v2/switch-version.d.ts.map +1 -0
  1074. package/dist/version-v2/switch-version.js +91 -0
  1075. package/dist/version-v2/switch-version.js.map +1 -0
  1076. package/dist/version-v2/switch-version.test.d.ts +2 -0
  1077. package/dist/version-v2/switch-version.test.d.ts.map +1 -0
  1078. package/dist/version-v2/switch-version.test.js +110 -0
  1079. package/dist/version-v2/switch-version.test.js.map +1 -0
  1080. package/dist/version-v2/with-skip-update-working-change-set.d.ts +3 -0
  1081. package/dist/version-v2/with-skip-update-working-change-set.d.ts.map +1 -0
  1082. package/dist/version-v2/with-skip-update-working-change-set.js +50 -0
  1083. package/dist/version-v2/with-skip-update-working-change-set.js.map +1 -0
  1084. package/dist/version-v2/with-skip-update-working-change-set.test.d.ts +2 -0
  1085. package/dist/version-v2/with-skip-update-working-change-set.test.d.ts.map +1 -0
  1086. package/dist/version-v2/with-skip-update-working-change-set.test.js +49 -0
  1087. package/dist/version-v2/with-skip-update-working-change-set.test.js.map +1 -0
  1088. package/package.json +3 -3
  1089. package/src/account/create-account.ts +7 -7
  1090. package/src/account/index.ts +2 -2
  1091. package/src/account/schema.test.ts +99 -99
  1092. package/src/account/schema.ts +91 -35
  1093. package/src/account/switch-account.test.ts +4 -4
  1094. package/src/account/switch-account.ts +6 -6
  1095. package/src/change/index.ts +4 -1
  1096. package/src/change/schema.test.ts +38 -0
  1097. package/src/change/schema.ts +91 -11
  1098. package/src/change-author/index.ts +4 -1
  1099. package/src/change-author/schema.test.ts +306 -242
  1100. package/src/change-author/schema.ts +18 -12
  1101. package/src/change-proposal/create-change-proposal.ts +3 -3
  1102. package/src/change-proposal/database-schema.ts +1 -1
  1103. package/src/change-set/apply-change-set.test.ts +10 -7
  1104. package/src/change-set/apply-change-set.ts +44 -56
  1105. package/src/change-set/create-change-set.test.ts +0 -39
  1106. package/src/change-set/create-change-set.ts +9 -33
  1107. package/src/change-set/index.ts +3 -11
  1108. package/src/change-set/schema.test.ts +0 -310
  1109. package/src/change-set/schema.ts +43 -100
  1110. package/src/commit/apply-commit.test.ts +426 -0
  1111. package/src/commit/apply-commit.ts +74 -0
  1112. package/src/{change-set → commit}/create-checkpoint.test.ts +244 -26
  1113. package/src/commit/create-checkpoint.ts +140 -0
  1114. package/src/commit/create-commit.ts +80 -0
  1115. package/src/{change-set/create-merge-change-set.test.ts → commit/create-merge-commit.test.ts} +50 -19
  1116. package/src/{change-set/create-merge-change-set.ts → commit/create-merge-commit.ts} +55 -16
  1117. package/src/{change-set/create-transition-change-set.test.ts → commit/create-transition-commit.test.ts} +43 -32
  1118. package/src/{change-set/create-transition-change-set.ts → commit/create-transition-commit.ts} +60 -22
  1119. package/src/{change-set/create-undo-change-set.test.ts → commit/create-undo-commit.test.ts} +52 -23
  1120. package/src/{change-set/create-undo-change-set.ts → commit/create-undo-commit.ts} +59 -26
  1121. package/src/commit/index.ts +11 -0
  1122. package/src/commit/schema.test.ts +257 -0
  1123. package/src/commit/schema.ts +104 -0
  1124. package/src/database/index.ts +0 -2
  1125. package/src/database/init-db.ts +113 -45
  1126. package/src/database/kysely-plugin/json-column-plugin.test.ts +404 -0
  1127. package/src/database/kysely-plugin/json-column-plugin.ts +80 -15
  1128. package/src/database/nano-id.test.ts +3 -3
  1129. package/src/database/nano-id.ts +4 -1
  1130. package/src/database/schema.ts +26 -24
  1131. package/src/deterministic/generate-human-id.test.ts +154 -0
  1132. package/src/deterministic/generate-human-id.ts +94 -0
  1133. package/src/deterministic/index.ts +7 -0
  1134. package/src/deterministic/is-deterministic-mode.test.ts +133 -0
  1135. package/src/deterministic/is-deterministic-mode.ts +32 -0
  1136. package/src/deterministic/nano-id.test.ts +200 -0
  1137. package/src/deterministic/nano-id.ts +188 -0
  1138. package/src/deterministic/options.test.ts +157 -0
  1139. package/src/deterministic/options.ts +62 -0
  1140. package/src/deterministic/random.test.ts +293 -0
  1141. package/src/deterministic/random.ts +261 -0
  1142. package/src/deterministic/sequence.test.ts +93 -0
  1143. package/src/deterministic/sequence.ts +132 -0
  1144. package/src/deterministic/timestamp.test.ts +170 -0
  1145. package/src/deterministic/timestamp.ts +83 -0
  1146. package/src/deterministic/uuid-v7.test.ts +144 -0
  1147. package/src/deterministic/uuid-v7.ts +82 -0
  1148. package/src/entity/eb-entity.test.ts +687 -0
  1149. package/src/entity/eb-entity.ts +203 -0
  1150. package/src/entity/index.ts +12 -0
  1151. package/src/entity/label/create-entity-label.test.ts +316 -0
  1152. package/src/entity/label/create-entity-label.ts +113 -0
  1153. package/src/entity/label/schema.test.ts +692 -0
  1154. package/src/entity/label/schema.ts +55 -0
  1155. package/src/entity/schema.ts +22 -0
  1156. package/src/entity/thread/create-entity-thread.test.ts +282 -0
  1157. package/src/entity/thread/create-entity-thread.ts +134 -0
  1158. package/src/entity/thread/query-threads.test.ts +394 -0
  1159. package/src/entity/thread/schema.test.ts +170 -0
  1160. package/src/entity/thread/schema.ts +55 -0
  1161. package/src/entity-views/README.md +214 -0
  1162. package/src/entity-views/entity-state-all.test.ts +202 -0
  1163. package/src/entity-views/entity-state-all.ts +80 -11
  1164. package/src/entity-views/entity-state-history.test.ts +78 -16
  1165. package/src/entity-views/entity-state-history.ts +68 -19
  1166. package/src/entity-views/entity-state.test.ts +141 -1
  1167. package/src/entity-views/entity-state.ts +79 -10
  1168. package/src/entity-views/entity-view-builder.test.ts +6 -6
  1169. package/src/entity-views/types.ts +2 -2
  1170. package/src/file/file-handlers.test.ts +4 -4
  1171. package/src/file/file-handlers.ts +40 -0
  1172. package/src/file/materialize-file-data-at-commit.ts +157 -0
  1173. package/src/file/schema.test.ts +693 -37
  1174. package/src/file/schema.ts +183 -56
  1175. package/src/hooks/create-hooks.ts +7 -40
  1176. package/src/index.ts +3 -0
  1177. package/src/key-value/index.ts +1 -1
  1178. package/src/key-value/schema.test.ts +103 -2
  1179. package/src/key-value/schema.ts +66 -5
  1180. package/src/label/create-label.ts +7 -7
  1181. package/src/label/index.ts +1 -1
  1182. package/src/label/schema.ts +7 -10
  1183. package/src/lix/new-lix.test.ts +202 -2
  1184. package/src/lix/new-lix.ts +305 -81
  1185. package/src/lix/open-lix.test.ts +308 -5
  1186. package/src/lix/open-lix.ts +169 -68
  1187. package/src/lix/storage/in-memory.test.ts +9 -83
  1188. package/src/lix/storage/in-memory.ts +13 -18
  1189. package/src/lix/storage/lix-storage-adapter.ts +41 -5
  1190. package/src/lix/storage/opfs.test.ts +254 -31
  1191. package/src/lix/storage/opfs.ts +178 -40
  1192. package/src/log/create-lix-own-log.test.ts +11 -7
  1193. package/src/log/create-lix-own-log.ts +21 -32
  1194. package/src/log/create-log.ts +4 -4
  1195. package/src/log/index.ts +1 -1
  1196. package/src/log/schema.ts +6 -10
  1197. package/src/observe/create-observe.test.ts +395 -60
  1198. package/src/observe/create-observe.ts +41 -3
  1199. package/src/observe/determine-schema-keys.test.ts +371 -0
  1200. package/src/observe/determine-schema-keys.ts +165 -0
  1201. package/src/plugin/lix-plugin.ts +3 -3
  1202. package/src/query-filter/change-set-element-in-ancestry-of.test.ts +112 -26
  1203. package/src/query-filter/change-set-element-in-ancestry-of.ts +25 -20
  1204. package/src/query-filter/change-set-element-in-symmetric-difference.test.ts +6 -6
  1205. package/src/query-filter/change-set-element-in-symmetric-difference.ts +3 -3
  1206. package/src/query-filter/change-set-element-is-leaf-of.test.ts +83 -24
  1207. package/src/query-filter/change-set-element-is-leaf-of.ts +61 -39
  1208. package/src/query-filter/commit-is-ancestor-of.test.ts +333 -0
  1209. package/src/query-filter/commit-is-ancestor-of.ts +77 -0
  1210. package/src/query-filter/commit-is-descendant-of.test.ts +365 -0
  1211. package/src/query-filter/commit-is-descendant-of.ts +70 -0
  1212. package/src/query-filter/index.ts +2 -4
  1213. package/src/schema-definition/definition.test.ts +73 -25
  1214. package/src/schema-definition/definition.ts +87 -30
  1215. package/src/schema-definition/index.ts +1 -1
  1216. package/src/schema-definition/validate-lix-schema.test.ts +14 -5
  1217. package/src/schema-definition/validate-lix-schema.ts +9 -13
  1218. package/src/server-protocol-handler/environment/create-in-memory-environment.test.ts +2 -2
  1219. package/src/server-protocol-handler/routes/push-v1.test.ts +1 -1
  1220. package/src/snapshot/schema.test.ts +113 -0
  1221. package/src/snapshot/schema.ts +10 -2
  1222. package/src/state/README.md +95 -0
  1223. package/src/state/cache/clear-state-cache.test.ts +43 -0
  1224. package/src/state/cache/clear-state-cache.ts +16 -0
  1225. package/src/state/cache/is-stale-state-cache.test.ts +35 -0
  1226. package/src/state/cache/is-stale-state-cache.ts +29 -0
  1227. package/src/state/cache/mark-state-cache-as-stale.ts +53 -0
  1228. package/src/state/cache/populate-state-cache.test.ts +259 -0
  1229. package/src/state/cache/populate-state-cache.ts +124 -0
  1230. package/src/state/cache/schema.ts +41 -0
  1231. package/src/state/cache/update-state-cache.test.ts +510 -0
  1232. package/src/state/cache/update-state-cache.ts +317 -0
  1233. package/src/state/commit.test.ts +1402 -0
  1234. package/src/state/commit.ts +587 -0
  1235. package/src/state/insert-transaction-state.test.ts +928 -0
  1236. package/src/state/insert-transaction-state.ts +306 -0
  1237. package/src/state/materialize-state.test.ts +2358 -0
  1238. package/src/state/materialize-state.ts +235 -0
  1239. package/src/state/primary-key.test.ts +158 -0
  1240. package/src/state/primary-key.ts +80 -0
  1241. package/src/state/resolved-state-view.test.ts +521 -0
  1242. package/src/state/resolved-state-view.ts +202 -0
  1243. package/src/state/schema.test.ts +3116 -2272
  1244. package/src/state/schema.ts +614 -910
  1245. package/src/state/untracked/schema.test.ts +301 -0
  1246. package/src/state/untracked/schema.ts +55 -0
  1247. package/src/state/untracked/update-untracked-state.test.ts +466 -0
  1248. package/src/state/untracked/update-untracked-state.ts +133 -0
  1249. package/src/state/validate-state-mutation.test.ts +1032 -77
  1250. package/src/state/validate-state-mutation.ts +270 -68
  1251. package/src/state-history/schema.test.ts +246 -71
  1252. package/src/state-history/schema.ts +78 -55
  1253. package/src/stored-schema/index.ts +4 -1
  1254. package/src/stored-schema/schema.test.ts +7 -7
  1255. package/src/stored-schema/schema.ts +1 -1
  1256. package/src/sync/push-to-server.test.ts +6 -6
  1257. package/src/test-utilities/simulation-test/cache-miss-simulation.test.ts +162 -0
  1258. package/src/test-utilities/simulation-test/cache-miss-simulation.ts +99 -0
  1259. package/src/test-utilities/simulation-test/chaotic-timestamp-simulation.ts +0 -0
  1260. package/src/test-utilities/simulation-test/out-of-order-sequence-simulation.test.ts +88 -0
  1261. package/src/test-utilities/simulation-test/out-of-order-sequence-simulation.ts +69 -0
  1262. package/src/test-utilities/simulation-test/simulation-test.test.ts +400 -0
  1263. package/src/test-utilities/simulation-test/simulation-test.ts +176 -0
  1264. package/src/thread/create-thread-comment.test.ts +62 -3
  1265. package/src/thread/create-thread-comment.ts +34 -6
  1266. package/src/thread/create-thread.test.ts +180 -0
  1267. package/src/thread/create-thread.ts +32 -7
  1268. package/src/thread/index.ts +3 -2
  1269. package/src/thread/schema.test.ts +81 -0
  1270. package/src/thread/schema.ts +24 -19
  1271. package/src/version/create-version.test.ts +92 -26
  1272. package/src/version/create-version.ts +49 -19
  1273. package/src/version/index.ts +2 -2
  1274. package/src/version/schema.test.ts +328 -92
  1275. package/src/version/schema.ts +47 -33
  1276. package/src/version/select-active-version.ts +18 -0
  1277. package/src/version/switch-version.test.ts +1 -1
  1278. package/src/version/switch-version.ts +3 -3
  1279. package/dist/entity-views/entity-state_history.d.ts +0 -67
  1280. package/dist/entity-views/entity-state_history.d.ts.map +0 -1
  1281. package/dist/entity-views/entity-state_history.js +0 -58
  1282. package/dist/entity-views/entity-state_history.js.map +0 -1
  1283. package/dist/entity-views/generic-types.d.ts +0 -128
  1284. package/dist/entity-views/generic-types.d.ts.map +0 -1
  1285. package/dist/entity-views/generic-types.js +0 -2
  1286. package/dist/entity-views/generic-types.js.map +0 -1
  1287. package/dist/entity-views/generic-types.test.d.ts +0 -2
  1288. package/dist/entity-views/generic-types.test.d.ts.map +0 -1
  1289. package/dist/entity-views/generic-types.test.js +0 -99
  1290. package/dist/entity-views/generic-types.test.js.map +0 -1
  1291. package/dist/lix/to-blob.test.d.ts +0 -2
  1292. package/dist/lix/to-blob.test.d.ts.map +0 -1
  1293. package/dist/lix/to-blob.test.js +0 -18
  1294. package/dist/lix/to-blob.test.js.map +0 -1
  1295. package/dist/repository/comparison-example.js +0 -173
  1296. package/dist/repository/comparison-example.js.map +0 -1
  1297. package/dist/repository/entity-repository.d.ts +0 -53
  1298. package/dist/repository/entity-repository.d.ts.map +0 -1
  1299. package/dist/repository/entity-repository.js +0 -187
  1300. package/dist/repository/entity-repository.js.map +0 -1
  1301. package/dist/repository/entity-repository.test.d.ts +0 -2
  1302. package/dist/repository/entity-repository.test.d.ts.map +0 -1
  1303. package/dist/repository/entity-repository.test.js +0 -94
  1304. package/dist/repository/entity-repository.test.js.map +0 -1
  1305. package/dist/repository/example.d.ts +0 -6
  1306. package/dist/repository/example.d.ts.map +0 -1
  1307. package/dist/repository/example.js +0 -87
  1308. package/dist/repository/example.js.map +0 -1
  1309. package/dist/repository/file-repository.d.ts +0 -39
  1310. package/dist/repository/file-repository.d.ts.map +0 -1
  1311. package/dist/repository/file-repository.js +0 -93
  1312. package/dist/repository/file-repository.js.map +0 -1
  1313. package/dist/repository/file-repository.test.d.ts +0 -2
  1314. package/dist/repository/file-repository.test.d.ts.map +0 -1
  1315. package/dist/repository/file-repository.test.js +0 -165
  1316. package/dist/repository/file-repository.test.js.map +0 -1
  1317. package/dist/repository/index.d.ts +0 -6
  1318. package/dist/repository/index.d.ts.map +0 -1
  1319. package/dist/repository/index.js +0 -6
  1320. package/dist/repository/index.js.map +0 -1
  1321. package/dist/repository/integration.test.d.ts +0 -2
  1322. package/dist/repository/integration.test.d.ts.map +0 -1
  1323. package/dist/repository/integration.test.js +0 -136
  1324. package/dist/repository/integration.test.js.map +0 -1
  1325. package/dist/repository/key-value-repository.d.ts +0 -30
  1326. package/dist/repository/key-value-repository.d.ts.map +0 -1
  1327. package/dist/repository/key-value-repository.js +0 -60
  1328. package/dist/repository/key-value-repository.js.map +0 -1
  1329. package/dist/repository/key-value-repository.test.d.ts +0 -2
  1330. package/dist/repository/key-value-repository.test.d.ts.map +0 -1
  1331. package/dist/repository/key-value-repository.test.js +0 -122
  1332. package/dist/repository/key-value-repository.test.js.map +0 -1
  1333. package/dist/repository/markdown-plugin-example.js +0 -118
  1334. package/dist/repository/markdown-plugin-example.js.map +0 -1
  1335. package/dist/repository/query-builder.d.ts +0 -69
  1336. package/dist/repository/query-builder.d.ts.map +0 -1
  1337. package/dist/repository/query-builder.js +0 -155
  1338. package/dist/repository/query-builder.js.map +0 -1
  1339. package/dist/repository/query-builder.test.d.ts +0 -2
  1340. package/dist/repository/query-builder.test.d.ts.map +0 -1
  1341. package/dist/repository/query-builder.test.js +0 -244
  1342. package/dist/repository/query-builder.test.js.map +0 -1
  1343. package/dist/repository/repository-manager.d.ts +0 -27
  1344. package/dist/repository/repository-manager.d.ts.map +0 -1
  1345. package/dist/repository/repository-manager.js +0 -19
  1346. package/dist/repository/repository-manager.js.map +0 -1
  1347. package/dist/repository/repository-manager.test.d.ts +0 -2
  1348. package/dist/repository/repository-manager.test.d.ts.map +0 -1
  1349. package/dist/repository/repository-manager.test.js +0 -65
  1350. package/dist/repository/repository-manager.test.js.map +0 -1
  1351. package/dist/repository/test-helpers.js +0 -402
  1352. package/dist/repository/test-helpers.js.map +0 -1
  1353. package/dist/schema-definition/lix-generated.test.d.ts +0 -2
  1354. package/dist/schema-definition/lix-generated.test.d.ts.map +0 -1
  1355. package/dist/schema-definition/lix-generated.test.js +0 -127
  1356. package/dist/schema-definition/lix-generated.test.js.map +0 -1
  1357. package/dist/state/entity-view-builder.d.ts +0 -145
  1358. package/dist/state/entity-view-builder.d.ts.map +0 -1
  1359. package/dist/state/entity-view-builder.js +0 -280
  1360. package/dist/state/entity-view-builder.js.map +0 -1
  1361. package/dist/state/entity-view-builder.test.d.ts +0 -2
  1362. package/dist/state/entity-view-builder.test.d.ts.map +0 -1
  1363. package/dist/state/entity-view-builder.test.js +0 -523
  1364. package/dist/state/entity-view-builder.test.js.map +0 -1
  1365. package/src/change-set/create-checkpoint.ts +0 -101
  1366. package/src/file/materialize-file-data-at-changeset.ts +0 -123
  1367. package/src/query-filter/change-has-label.test.ts +0 -79
  1368. package/src/query-filter/change-has-label.ts +0 -45
  1369. package/src/query-filter/change-set-has-label.test.ts +0 -42
  1370. package/src/query-filter/change-set-has-label.ts +0 -50
  1371. package/src/query-filter/change-set-is-ancestor-of.test.ts +0 -178
  1372. package/src/query-filter/change-set-is-ancestor-of.ts +0 -77
  1373. package/src/query-filter/change-set-is-descendant-of.test.ts +0 -169
  1374. package/src/query-filter/change-set-is-descendant-of.ts +0 -70
  1375. package/src/state/create-changeset-for-transaction.ts +0 -321
  1376. package/src/state/get-version-record-by-id-or-throw.ts +0 -51
  1377. package/src/state/handle-state-mutation.test.ts +0 -761
  1378. package/src/state/handle-state-mutation.ts +0 -418
@@ -0,0 +1,2358 @@
1
+ import { describe, expect } from "vitest";
2
+ import { selectActiveVersion } from "../version/select-active-version.js";
3
+ import { createVersion } from "../version/create-version.js";
4
+ import { timestamp } from "../deterministic/timestamp.js";
5
+ import {
6
+ simulationTest,
7
+ normalSimulation,
8
+ outOfOrderSequenceSimulation,
9
+ } from "../test-utilities/simulation-test/simulation-test.js";
10
+
11
+ describe("internal_materialization_version_tips", () => {
12
+ simulationTest(
13
+ "includes all versions with state, even if other versions branch from them",
14
+ async ({ openSimulatedLix }) => {
15
+ // Test the rule: "if a version entity exists, the version is active.
16
+ // even if other versions 'build' on this version by branching away from the commit"
17
+ const lix = await openSimulatedLix({
18
+ keyValues: [
19
+ {
20
+ key: "lix_deterministic_mode",
21
+ value: { enabled: true, bootstrap: true },
22
+ },
23
+ ],
24
+ });
25
+
26
+ // Create base version with state
27
+ await createVersion({ lix, id: "base-version" });
28
+ await lix.db
29
+ .insertInto("state_all")
30
+ .values({
31
+ entity_id: "base-entity",
32
+ schema_key: "mock_entity",
33
+ schema_version: "1.0",
34
+ file_id: "mock-file",
35
+ version_id: "base-version",
36
+ plugin_key: "mock-plugin",
37
+ snapshot_content: { id: "base-entity", name: "Base Entity" },
38
+ })
39
+ .execute();
40
+
41
+ // Get base version's current commit
42
+ const baseVersion = await lix.db
43
+ .selectFrom("version")
44
+ .select("commit_id")
45
+ .where("id", "=", "base-version")
46
+ .executeTakeFirstOrThrow();
47
+
48
+ // Create version A that branches from base version's commit
49
+ await createVersion({ lix, id: "version-a" });
50
+ await lix.db
51
+ .updateTable("version")
52
+ .set({ commit_id: baseVersion.commit_id })
53
+ .where("id", "=", "version-a")
54
+ .execute();
55
+
56
+ // Add state to version A (this will create a new commit, making base-version no longer a "tip")
57
+ await lix.db
58
+ .insertInto("state_all")
59
+ .values({
60
+ entity_id: "entity-a",
61
+ schema_key: "mock_entity",
62
+ schema_version: "1.0",
63
+ file_id: "mock-file",
64
+ version_id: "version-a",
65
+ plugin_key: "mock-plugin",
66
+ snapshot_content: { id: "entity-a", name: "Version A Entity" },
67
+ })
68
+ .execute();
69
+
70
+ // Create version B that also branches from base version's commit
71
+ await createVersion({ lix, id: "version-b" });
72
+ await lix.db
73
+ .updateTable("version")
74
+ .set({ commit_id: baseVersion.commit_id })
75
+ .where("id", "=", "version-b")
76
+ .execute();
77
+
78
+ // Add state to version B
79
+ await lix.db
80
+ .insertInto("state_all")
81
+ .values({
82
+ entity_id: "entity-b",
83
+ schema_key: "mock_entity",
84
+ schema_version: "1.0",
85
+ file_id: "mock-file",
86
+ version_id: "version-b",
87
+ plugin_key: "mock-plugin",
88
+ snapshot_content: { id: "entity-b", name: "Version B Entity" },
89
+ })
90
+ .execute();
91
+
92
+ // Now base-version has children (version-a and version-b branched from it),
93
+ // so it's no longer a "tip" commit. But it still has important state that should be materialized.
94
+
95
+ // Query version tips - should include ALL versions with state, not just leaf tips
96
+ const tips = await lix.db
97
+ .selectFrom("internal_materialization_version_tips" as any)
98
+ .selectAll()
99
+ .where("version_id", "in", ["base-version", "version-a", "version-b"])
100
+ .orderBy("version_id")
101
+ .execute();
102
+
103
+ // All three versions should be included because they all have entities/state
104
+ expect(tips).toHaveLength(3);
105
+
106
+ const baseVersionTip = tips.find(
107
+ (t: any) => t.version_id === "base-version"
108
+ );
109
+ const versionATip = tips.find((t: any) => t.version_id === "version-a");
110
+ const versionBTip = tips.find((t: any) => t.version_id === "version-b");
111
+
112
+ // All versions should be present in version tips
113
+ expect(baseVersionTip).toBeDefined();
114
+ expect(versionATip).toBeDefined();
115
+ expect(versionBTip).toBeDefined();
116
+
117
+ // Verify that the base version's state can be materialized (not excluded from materialization pipeline)
118
+ const baseMaterializedState = await lix.db
119
+ .selectFrom("internal_state_materializer" as any)
120
+ .selectAll()
121
+ .where("version_id", "=", "base-version")
122
+ .where("entity_id", "=", "base-entity")
123
+ .executeTakeFirst();
124
+
125
+ expect(baseMaterializedState).toBeDefined();
126
+ expect(baseMaterializedState!.snapshot_content).toEqual({
127
+ id: "base-entity",
128
+ name: "Base Entity",
129
+ });
130
+ },
131
+ {
132
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
133
+ }
134
+ );
135
+
136
+ simulationTest(
137
+ "finds tip commit for a version with single commit",
138
+ async ({ openSimulatedLix }) => {
139
+ const lix = await openSimulatedLix({
140
+ keyValues: [
141
+ {
142
+ key: "lix_deterministic_mode",
143
+ value: { enabled: true, bootstrap: true },
144
+ },
145
+ ],
146
+ });
147
+
148
+ const activeVersion =
149
+ await selectActiveVersion(lix).executeTakeFirstOrThrow();
150
+
151
+ // Query the view
152
+ const results = await lix.db
153
+ .selectFrom("internal_materialization_version_tips" as any)
154
+ .where("version_id", "=", activeVersion.id)
155
+ .selectAll()
156
+ .execute();
157
+
158
+ // Verify results
159
+ expect(results).toHaveLength(1);
160
+ expect(results[0]?.version_id).toBe(activeVersion.id);
161
+ expect(results[0]?.tip_commit_id).toBe(activeVersion.commit_id);
162
+ },
163
+ {
164
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
165
+ }
166
+ );
167
+
168
+ simulationTest(
169
+ "updates tip when new commit is added",
170
+ async ({ openSimulatedLix }) => {
171
+ const lix = await openSimulatedLix({
172
+ keyValues: [
173
+ {
174
+ key: "lix_deterministic_mode",
175
+ value: { enabled: true, bootstrap: true },
176
+ },
177
+ ],
178
+ });
179
+
180
+ const activeVersion =
181
+ await selectActiveVersion(lix).executeTakeFirstOrThrow();
182
+
183
+ // Get initial tip
184
+ const initialResults = await lix.db
185
+ .selectFrom("internal_materialization_version_tips" as any)
186
+ .where("version_id", "=", activeVersion.id)
187
+ .selectAll()
188
+ .execute();
189
+
190
+ const initialTip = initialResults[0]?.tip_commit_id;
191
+
192
+ // Insert state to trigger a new commit
193
+ await lix.db
194
+ .insertInto("state")
195
+ .values({
196
+ entity_id: "entity-1",
197
+ schema_key: "mock_entity",
198
+ schema_version: "1.0",
199
+ file_id: "mock-file",
200
+ plugin_key: "mock-plugin",
201
+ snapshot_content: { id: "entity-1", name: "Test Entity" },
202
+ })
203
+ .execute();
204
+
205
+ // Get updated tip
206
+ const updatedResults = await lix.db
207
+ .selectFrom("internal_materialization_version_tips" as any)
208
+ .where("version_id", "=", activeVersion.id)
209
+ .selectAll()
210
+ .execute();
211
+
212
+ const updatedTip = updatedResults[0]?.tip_commit_id;
213
+
214
+ // Verify tip changed
215
+ expect(updatedTip).not.toBe(initialTip);
216
+ expect(updatedResults).toHaveLength(1);
217
+ expect(updatedResults[0]?.version_id).toBe(activeVersion.id);
218
+ },
219
+ {
220
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
221
+ }
222
+ );
223
+
224
+ simulationTest(
225
+ "handles multiple versions with independent tips",
226
+ async ({ openSimulatedLix }) => {
227
+ const lix = await openSimulatedLix({
228
+ keyValues: [
229
+ {
230
+ key: "lix_deterministic_mode",
231
+ value: { enabled: true, bootstrap: true },
232
+ },
233
+ ],
234
+ });
235
+
236
+ // Create two versions
237
+ await createVersion({ lix, id: "version-1" });
238
+ await createVersion({ lix, id: "version-2" });
239
+
240
+ // Add state to version1 to create a commit
241
+ await lix.db
242
+ .insertInto("state_all")
243
+ .values({
244
+ entity_id: "entity-1",
245
+ schema_key: "mock_entity",
246
+ schema_version: "1.0",
247
+ file_id: "mock-file",
248
+ version_id: "version-1",
249
+ plugin_key: "mock-plugin",
250
+ snapshot_content: { id: "entity-1", name: "Version 1 Entity" },
251
+ })
252
+ .execute();
253
+
254
+ // Add state to version2 to create a commit
255
+ await lix.db
256
+ .insertInto("state_all")
257
+ .values({
258
+ entity_id: "entity-2",
259
+ schema_key: "mock_entity",
260
+ schema_version: "1.0",
261
+ file_id: "mock-file",
262
+ version_id: "version-2",
263
+ plugin_key: "mock-plugin",
264
+ snapshot_content: { id: "entity-2", name: "Version 2 Entity" },
265
+ })
266
+ .execute();
267
+
268
+ // Get tips for both versions
269
+ const tips = await lix.db
270
+ .selectFrom("internal_materialization_version_tips" as any)
271
+ .selectAll()
272
+ .where("version_id", "in", ["version-1", "version-2"])
273
+ .orderBy("version_id")
274
+ .execute();
275
+
276
+ // Should have two different tips
277
+ expect(tips).toHaveLength(2); // includes the default version
278
+ const v1Tip = tips.find((t: any) => t.version_id === "version-1");
279
+ const v2Tip = tips.find((t: any) => t.version_id === "version-2");
280
+
281
+ expect(v1Tip).toBeDefined();
282
+ expect(v2Tip).toBeDefined();
283
+ expect(v1Tip?.tip_commit_id).not.toBe(v2Tip?.tip_commit_id);
284
+
285
+ // Add more state to version1 to move its tip
286
+ await lix.db
287
+ .insertInto("state_all")
288
+ .values({
289
+ entity_id: "entity-3",
290
+ schema_key: "mock_entity",
291
+ schema_version: "1.0",
292
+ file_id: "mock-file",
293
+ version_id: "version-1",
294
+ plugin_key: "mock-plugin",
295
+ snapshot_content: {
296
+ id: "entity-3",
297
+ name: "Another Version 1 Entity",
298
+ },
299
+ })
300
+ .execute();
301
+
302
+ // Get updated tips
303
+ const updatedTips = await lix.db
304
+ .selectFrom("internal_materialization_version_tips" as any)
305
+ .selectAll()
306
+ .orderBy("version_id")
307
+ .execute();
308
+
309
+ const v1UpdatedTip = updatedTips.find(
310
+ (t: any) => t.version_id === "version-1"
311
+ );
312
+ const v2UpdatedTip = updatedTips.find(
313
+ (t: any) => t.version_id === "version-2"
314
+ );
315
+
316
+ // Version 1 tip should have changed, version 2 should remain the same
317
+ expect(v1UpdatedTip?.tip_commit_id).not.toBe(v1Tip?.tip_commit_id);
318
+ expect(v2UpdatedTip?.tip_commit_id).toBe(v2Tip?.tip_commit_id);
319
+ },
320
+ {
321
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
322
+ }
323
+ );
324
+ });
325
+
326
+ describe("internal_materialization_commit_graph", () => {
327
+ simulationTest(
328
+ "builds linear commit history with correct depths",
329
+ async ({ openSimulatedLix }) => {
330
+ // Linear history: initial -> commit1 -> commit2 -> commit3 (tip)
331
+ // Expected depths: 3 2 1 0
332
+ const lix = await openSimulatedLix({
333
+ keyValues: [
334
+ {
335
+ key: "lix_deterministic_mode",
336
+ value: { enabled: true, bootstrap: true },
337
+ },
338
+ ],
339
+ });
340
+
341
+ // Create a version
342
+ const initialVersion = await createVersion({
343
+ lix,
344
+ id: "linear-test-version",
345
+ });
346
+
347
+ // Create commit 1 (will be at depth 2)
348
+ await lix.db
349
+ .insertInto("state_all")
350
+ .values({
351
+ entity_id: "entity-1",
352
+ schema_key: "mock_entity",
353
+ schema_version: "1.0",
354
+ file_id: "mock-file",
355
+ version_id: "linear-test-version",
356
+ plugin_key: "mock-plugin",
357
+ snapshot_content: { id: "entity-1", name: "First commit" },
358
+ })
359
+ .execute();
360
+
361
+ // Get first commit id
362
+ const commits1 = await lix.db
363
+ .selectFrom("commit")
364
+ .innerJoin("version", "version.commit_id", "commit.id")
365
+ .select("commit.id")
366
+ .where("version.id", "=", "linear-test-version")
367
+ .orderBy("commit.lixcol_created_at", "desc")
368
+ .limit(1)
369
+ .execute();
370
+ const commit1Id = commits1[0]!.id;
371
+
372
+ // Create commit 2 (will be at depth 1)
373
+ await lix.db
374
+ .insertInto("state_all")
375
+ .values({
376
+ entity_id: "entity-2",
377
+ schema_key: "mock_entity",
378
+ schema_version: "1.0",
379
+ file_id: "mock-file",
380
+ version_id: "linear-test-version",
381
+ plugin_key: "mock-plugin",
382
+ snapshot_content: { id: "entity-2", name: "Second commit" },
383
+ })
384
+ .execute();
385
+
386
+ // Get second commit id
387
+ const commits2 = await lix.db
388
+ .selectFrom("commit")
389
+ .innerJoin("version", "version.commit_id", "commit.id")
390
+ .select("commit.id")
391
+ .where("version.id", "=", "linear-test-version")
392
+ .orderBy("commit.lixcol_created_at", "desc")
393
+ .limit(1)
394
+ .execute();
395
+ const commit2Id = commits2[0]!.id;
396
+
397
+ // Create commit 3 (will be at depth 0 - tip)
398
+ await lix.db
399
+ .insertInto("state_all")
400
+ .values({
401
+ entity_id: "entity-3",
402
+ schema_key: "mock_entity",
403
+ schema_version: "1.0",
404
+ file_id: "mock-file",
405
+ version_id: "linear-test-version",
406
+ plugin_key: "mock-plugin",
407
+ snapshot_content: { id: "entity-3", name: "Third commit" },
408
+ })
409
+ .execute();
410
+
411
+ // Get third commit id
412
+ const commits3 = await lix.db
413
+ .selectFrom("commit")
414
+ .innerJoin("version", "version.commit_id", "commit.id")
415
+ .select("commit.id")
416
+ .where("version.id", "=", "linear-test-version")
417
+ .orderBy("commit.lixcol_created_at", "desc")
418
+ .limit(1)
419
+ .execute();
420
+
421
+ const commit3Id = commits3[0]!.id;
422
+
423
+ // Query the commit graph view
424
+ const graph = await lix.db
425
+ .selectFrom("internal_materialization_commit_graph" as any)
426
+ .selectAll()
427
+ .where("version_id", "=", "linear-test-version")
428
+ .orderBy("depth")
429
+ .execute();
430
+
431
+ // Verify we have 4 commits with correct depths (including initial)
432
+ expect(graph).toHaveLength(4);
433
+
434
+ // Commit 3 (tip) should be at depth 0
435
+ expect(graph[0]).toMatchObject({
436
+ commit_id: commit3Id,
437
+ version_id: "linear-test-version",
438
+ depth: 0,
439
+ });
440
+
441
+ // Commit 2 should be at depth 1
442
+ expect(graph[1]).toMatchObject({
443
+ commit_id: commit2Id,
444
+ version_id: "linear-test-version",
445
+ depth: 1,
446
+ });
447
+
448
+ // Commit 1 should be at depth 2
449
+ expect(graph[2]).toMatchObject({
450
+ commit_id: commit1Id,
451
+ version_id: "linear-test-version",
452
+ depth: 2,
453
+ });
454
+
455
+ // Initial commit should be at depth 3
456
+ expect(graph[3]).toMatchObject({
457
+ version_id: "linear-test-version",
458
+ commit_id: initialVersion.commit_id,
459
+ depth: 3,
460
+ });
461
+ },
462
+ {
463
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
464
+ }
465
+ );
466
+
467
+ simulationTest(
468
+ "handles branching commit history",
469
+ async ({ openSimulatedLix }) => {
470
+ // Branching history:
471
+ // initial
472
+ // |
473
+ // commit1 (depth 2)
474
+ // / \
475
+ // commit2a commit2b (both depth 1)
476
+ // | |
477
+ // commit3a commit3b (both depth 0 - tips)
478
+
479
+ const lix = await openSimulatedLix({
480
+ keyValues: [
481
+ {
482
+ key: "lix_deterministic_mode",
483
+ value: { enabled: true, bootstrap: true },
484
+ },
485
+ ],
486
+ });
487
+
488
+ // Create two versions that branch from a common commit
489
+ await createVersion({ lix, id: "branch-version-1" });
490
+ await createVersion({ lix, id: "branch-version-2" });
491
+
492
+ // Create a common commit in version1
493
+ await lix.db
494
+ .insertInto("state_all")
495
+ .values({
496
+ entity_id: "common-entity",
497
+ schema_key: "mock_entity",
498
+ schema_version: "1.0",
499
+ file_id: "mock-file",
500
+ version_id: "branch-version-1",
501
+ plugin_key: "mock-plugin",
502
+ snapshot_content: { id: "common-entity", name: "Common commit" },
503
+ })
504
+ .execute();
505
+
506
+ // Get the common commit id
507
+ const commonCommit = await lix.db
508
+ .selectFrom("commit")
509
+ .innerJoin("version", "version.commit_id", "commit.id")
510
+ .select("commit.id")
511
+ .where("version.id", "=", "branch-version-1")
512
+ .orderBy("commit.lixcol_created_at", "desc")
513
+ .limit(1)
514
+ .execute();
515
+ const commonCommitId = commonCommit[0]!.id;
516
+
517
+ // Update version2 to point to the common commit (simulating a branch)
518
+ await lix.db
519
+ .updateTable("version")
520
+ .set({ commit_id: commonCommitId })
521
+ .where("id", "=", "branch-version-2")
522
+ .execute();
523
+
524
+ // Create diverging commits in version1
525
+ await lix.db
526
+ .insertInto("state_all")
527
+ .values({
528
+ entity_id: "branch1-entity",
529
+ schema_key: "mock_entity",
530
+ schema_version: "1.0",
531
+ file_id: "mock-file",
532
+ version_id: "branch-version-1",
533
+ plugin_key: "mock-plugin",
534
+ snapshot_content: { id: "branch1-entity", name: "Branch 1 commit" },
535
+ })
536
+ .execute();
537
+
538
+ // Create diverging commits in version2
539
+ await lix.db
540
+ .insertInto("state_all")
541
+ .values({
542
+ entity_id: "branch2-entity",
543
+ schema_key: "mock_entity",
544
+ schema_version: "1.0",
545
+ file_id: "mock-file",
546
+ version_id: "branch-version-2",
547
+ plugin_key: "mock-plugin",
548
+ snapshot_content: { id: "branch2-entity", name: "Branch 2 commit" },
549
+ })
550
+ .execute();
551
+
552
+ // Query the commit graph for version1
553
+ const graph1 = await lix.db
554
+ .selectFrom("internal_materialization_commit_graph" as any)
555
+ .selectAll()
556
+ .where("version_id", "=", "branch-version-1")
557
+ .orderBy("depth")
558
+ .execute();
559
+
560
+ // Query the commit graph for version2
561
+ const graph2 = await lix.db
562
+ .selectFrom("internal_materialization_commit_graph" as any)
563
+ .selectAll()
564
+ .where("version_id", "=", "branch-version-2")
565
+ .orderBy("depth")
566
+ .execute();
567
+
568
+ // Version 1 should have its own tip at depth 0 and common commit at depth 1
569
+ expect(graph1).toHaveLength(3); // initial, common, branch1
570
+ expect(graph1[0]).toMatchObject({
571
+ version_id: "branch-version-1",
572
+ depth: 0,
573
+ });
574
+ expect(graph1[1]).toMatchObject({
575
+ commit_id: commonCommitId,
576
+ version_id: "branch-version-1",
577
+ depth: 1,
578
+ });
579
+
580
+ // Version 2 should have its own tip at depth 0 and common commit at depth 1
581
+ expect(graph2).toHaveLength(3); // initial, common, branch2
582
+ expect(graph2[0]).toMatchObject({
583
+ version_id: "branch-version-2",
584
+ depth: 0,
585
+ });
586
+ expect(graph2[1]).toMatchObject({
587
+ commit_id: commonCommitId,
588
+ version_id: "branch-version-2",
589
+ depth: 1,
590
+ });
591
+
592
+ // Both versions should see the common commit at the same relative depth
593
+ const v1CommonDepth = graph1.find(
594
+ (g: any) => g.commit_id === commonCommitId
595
+ )?.depth;
596
+ const v2CommonDepth = graph2.find(
597
+ (g: any) => g.commit_id === commonCommitId
598
+ )?.depth;
599
+ expect(v1CommonDepth).toBe(1);
600
+ expect(v2CommonDepth).toBe(1);
601
+ },
602
+ {
603
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
604
+ }
605
+ );
606
+
607
+ simulationTest(
608
+ "handles merge commits without duplicates",
609
+ async ({ openSimulatedLix }) => {
610
+ // Diamond pattern:
611
+ // initial
612
+ // |
613
+ // commit1
614
+ // / \
615
+ // commit2a commit2b
616
+ // \ /
617
+ // commit3 (merge commit with two parents)
618
+
619
+ const lix = await openSimulatedLix({
620
+ keyValues: [
621
+ {
622
+ key: "lix_deterministic_mode",
623
+ value: { enabled: true, bootstrap: true },
624
+ },
625
+ ],
626
+ });
627
+
628
+ // Create version A
629
+ await createVersion({ lix, id: "merge-version-a" });
630
+
631
+ // Create version B that will diverge
632
+ await createVersion({ lix, id: "merge-version-b" });
633
+
634
+ // Add unique changes to version A
635
+ await lix.db
636
+ .insertInto("state_all")
637
+ .values({
638
+ entity_id: "entity-a",
639
+ schema_key: "mock_entity",
640
+ schema_version: "1.0",
641
+ file_id: "mock-file",
642
+ version_id: "merge-version-a",
643
+ plugin_key: "mock-plugin",
644
+ snapshot_content: { id: "entity-a", name: "Version A change" },
645
+ })
646
+ .execute();
647
+
648
+ // Add unique changes to version B
649
+ await lix.db
650
+ .insertInto("state_all")
651
+ .values({
652
+ entity_id: "entity-b",
653
+ schema_key: "mock_entity",
654
+ schema_version: "1.0",
655
+ file_id: "mock-file",
656
+ version_id: "merge-version-b",
657
+ plugin_key: "mock-plugin",
658
+ snapshot_content: { id: "entity-b", name: "Version B change" },
659
+ })
660
+ .execute();
661
+
662
+ // Get both version tips
663
+ const versionATip = await lix.db
664
+ .selectFrom("version")
665
+ .select("commit_id")
666
+ .where("id", "=", "merge-version-a")
667
+ .executeTakeFirstOrThrow();
668
+
669
+ const versionBTip = await lix.db
670
+ .selectFrom("version")
671
+ .select("commit_id")
672
+ .where("id", "=", "merge-version-b")
673
+ .executeTakeFirstOrThrow();
674
+
675
+ // Create a merge commit manually with two parent edges
676
+ const ts = timestamp({ lix });
677
+ const mergeCommitId = `merge-${ts}`;
678
+ const mergeChangeSetId = `cs-${mergeCommitId}`;
679
+
680
+ // Create the change set first
681
+ await lix.db
682
+ .insertInto("change_set_all")
683
+ .values({
684
+ id: mergeChangeSetId,
685
+ lixcol_version_id: "global",
686
+ })
687
+ .execute();
688
+
689
+ // Create the merge commit in commit_all (global version)
690
+ await lix.db
691
+ .insertInto("commit_all")
692
+ .values({
693
+ id: mergeCommitId,
694
+ change_set_id: mergeChangeSetId,
695
+ lixcol_version_id: "global",
696
+ })
697
+ .execute();
698
+
699
+ // Create edges to both parents
700
+ await lix.db
701
+ .insertInto("change")
702
+ .values([
703
+ {
704
+ id: `edge-1-${mergeCommitId}`,
705
+ entity_id: `edge-${mergeCommitId}-${versionATip.commit_id}`,
706
+ schema_key: "lix_commit_edge",
707
+ schema_version: "1.0",
708
+ file_id: "lix-file",
709
+ plugin_key: "lix",
710
+ snapshot_content: {
711
+ parent_id: versionATip.commit_id,
712
+ child_id: mergeCommitId,
713
+ },
714
+ created_at: ts,
715
+ },
716
+ {
717
+ id: `edge-2-${mergeCommitId}`,
718
+ entity_id: `edge-${mergeCommitId}-${versionBTip.commit_id}`,
719
+ schema_key: "lix_commit_edge",
720
+ schema_version: "1.0",
721
+ file_id: "lix-file",
722
+ plugin_key: "lix",
723
+ snapshot_content: {
724
+ parent_id: versionBTip.commit_id,
725
+ child_id: mergeCommitId,
726
+ },
727
+ created_at: ts,
728
+ },
729
+ ])
730
+ .execute();
731
+
732
+ // Update version A to point to the merge commit
733
+ await lix.db
734
+ .updateTable("version")
735
+ .set({ commit_id: mergeCommitId })
736
+ .where("id", "=", "merge-version-a")
737
+ .execute();
738
+
739
+ // Query the commit graph for the merged version
740
+ const graph = await lix.db
741
+ .selectFrom("internal_materialization_commit_graph" as any)
742
+ .selectAll()
743
+ .where("version_id", "=", "merge-version-a")
744
+ .orderBy("depth")
745
+ .execute();
746
+
747
+ // Count how many times each commit appears
748
+ const commitCounts = new Map<string, number>();
749
+ for (const entry of graph) {
750
+ const count = commitCounts.get(entry.commit_id) || 0;
751
+ commitCounts.set(entry.commit_id, count + 1);
752
+ }
753
+
754
+ // Verify no commit appears more than once (no duplicates)
755
+ for (const [, count] of commitCounts) {
756
+ expect(count).toBe(1);
757
+ }
758
+
759
+ // Verify the merge commit is at depth 0 (tip)
760
+ expect(graph[0]).toMatchObject({
761
+ commit_id: mergeCommitId,
762
+ version_id: "merge-version-a",
763
+ depth: 0,
764
+ });
765
+
766
+ // Verify both parent commits appear in the graph
767
+ const hasVersionATip = graph.some(
768
+ (g: any) => g.commit_id === versionATip.commit_id
769
+ );
770
+ const hasVersionBTip = graph.some(
771
+ (g: any) => g.commit_id === versionBTip.commit_id
772
+ );
773
+ expect(hasVersionATip).toBe(true);
774
+ expect(hasVersionBTip).toBe(true);
775
+
776
+ // Verify we have expected commits
777
+ // We should have at least 4 commits:
778
+ // - 1 merge commit (depth 0)
779
+ // - 2 parent commits from divergent versions (depth 1)
780
+ // - At least 1 shared initial commit (depth 2)
781
+ expect(graph.length).toBeGreaterThanOrEqual(4);
782
+
783
+ // The merge commit should have two commits at depth 1 (its parents)
784
+ const depth1Commits = graph.filter((g: any) => g.depth === 1);
785
+ expect(depth1Commits).toHaveLength(2);
786
+ },
787
+ {
788
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
789
+ }
790
+ );
791
+
792
+ simulationTest(
793
+ "detects and handles cycles gracefully",
794
+ async ({ openSimulatedLix }) => {
795
+ // Test that cycle detection prevents infinite loops in recursive CTEs
796
+ // This tests the path-based cycle detection in version ancestry
797
+ const lix = await openSimulatedLix({
798
+ keyValues: [
799
+ {
800
+ key: "lix_deterministic_mode",
801
+ value: { enabled: true, bootstrap: true },
802
+ },
803
+ ],
804
+ });
805
+
806
+ // Create three versions
807
+ await createVersion({ lix, id: "version-cycle-a" });
808
+ await createVersion({
809
+ lix,
810
+ id: "version-cycle-b",
811
+ inherits_from_version_id: "version-cycle-a",
812
+ });
813
+ await createVersion({
814
+ lix,
815
+ id: "version-cycle-c",
816
+ inherits_from_version_id: "version-cycle-b",
817
+ });
818
+
819
+ // Manually create a cycle by updating version A to inherit from C
820
+ // This simulates data corruption: A -> B -> C -> A
821
+ await lix.db
822
+ .updateTable("version")
823
+ .set({
824
+ inherits_from_version_id: "version-cycle-c",
825
+ })
826
+ .where("id", "=", "version-cycle-a")
827
+ .execute();
828
+
829
+ // Query version ancestry - should not hang due to cycle detection
830
+ const ancestry = await lix.db
831
+ .selectFrom("internal_materialization_version_ancestry" as any)
832
+ .selectAll()
833
+ .where("version_id", "=", "version-cycle-a")
834
+ .execute();
835
+
836
+ // Version A should see itself and its ancestors, but stop when cycle detected
837
+ const ancestorIds = ancestry.map((a: any) => a.ancestor_version_id);
838
+ const uniqueAncestors = new Set(ancestorIds);
839
+
840
+ // Should contain A (itself), B, and C - cycle detection should have stopped
841
+ expect(uniqueAncestors.has("version-cycle-a")).toBe(true);
842
+ expect(uniqueAncestors.has("version-cycle-b")).toBe(true);
843
+ expect(uniqueAncestors.has("version-cycle-c")).toBe(true);
844
+
845
+ // The important part is that cycle detection prevented infinite recursion
846
+ // We should have a finite number of results even with a cycle
847
+ expect(ancestry.length).toBeLessThan(20); // Would be infinite without cycle detection
848
+
849
+ // Check that we stopped at reasonable inheritance depths
850
+ const maxDepth = Math.max(
851
+ ...ancestry.map((a: any) => a.inheritance_depth)
852
+ );
853
+ expect(maxDepth).toBeLessThanOrEqual(3); // Should stop after traversing the cycle once
854
+ },
855
+ {
856
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
857
+ }
858
+ );
859
+
860
+ simulationTest(
861
+ "associates commits with correct version",
862
+ async ({ openSimulatedLix }) => {
863
+ // Create multiple versions and verify version_id association
864
+ const lix = await openSimulatedLix({
865
+ keyValues: [
866
+ {
867
+ key: "lix_deterministic_mode",
868
+ value: { enabled: true, bootstrap: true },
869
+ },
870
+ ],
871
+ });
872
+
873
+ // Create three versions
874
+ await createVersion({ lix, id: "version-x" });
875
+ await createVersion({ lix, id: "version-y" });
876
+ await createVersion({ lix, id: "version-z" });
877
+
878
+ // Add commits to each version
879
+ await lix.db
880
+ .insertInto("state_all")
881
+ .values({
882
+ entity_id: "entity-x",
883
+ schema_key: "mock_entity",
884
+ schema_version: "1.0",
885
+ file_id: "mock-file",
886
+ version_id: "version-x",
887
+ plugin_key: "mock-plugin",
888
+ snapshot_content: { id: "entity-x", name: "Version X Entity" },
889
+ })
890
+ .execute();
891
+
892
+ await lix.db
893
+ .insertInto("state_all")
894
+ .values({
895
+ entity_id: "entity-y",
896
+ schema_key: "mock_entity",
897
+ schema_version: "1.0",
898
+ file_id: "mock-file",
899
+ version_id: "version-y",
900
+ plugin_key: "mock-plugin",
901
+ snapshot_content: { id: "entity-y", name: "Version Y Entity" },
902
+ })
903
+ .execute();
904
+
905
+ // Query graphs for each version
906
+ const graphX = await lix.db
907
+ .selectFrom("internal_materialization_commit_graph" as any)
908
+ .selectAll()
909
+ .where("version_id", "=", "version-x")
910
+ .execute();
911
+
912
+ const graphY = await lix.db
913
+ .selectFrom("internal_materialization_commit_graph" as any)
914
+ .selectAll()
915
+ .where("version_id", "=", "version-y")
916
+ .execute();
917
+
918
+ const graphZ = await lix.db
919
+ .selectFrom("internal_materialization_commit_graph" as any)
920
+ .selectAll()
921
+ .where("version_id", "=", "version-z")
922
+ .execute();
923
+
924
+ // Each version should only see commits associated with it
925
+ expect(graphX.every((g: any) => g.version_id === "version-x")).toBe(true);
926
+ expect(graphY.every((g: any) => g.version_id === "version-y")).toBe(true);
927
+
928
+ // Version X should have 2 commits (initial + one change)
929
+ expect(graphX).toHaveLength(2);
930
+
931
+ // Version Y should have 2 commits (initial + one change)
932
+ expect(graphY).toHaveLength(2);
933
+
934
+ // Version Z has only the initial commit, so will appear with 1 commit in the graph
935
+ expect(graphZ).toHaveLength(1);
936
+
937
+ // Verify each version has its own unique tip commit
938
+ const xTip = graphX.find((g: any) => g.depth === 0);
939
+ const yTip = graphY.find((g: any) => g.depth === 0);
940
+
941
+ expect(xTip).toBeDefined();
942
+ expect(yTip).toBeDefined();
943
+ expect(xTip!.commit_id).not.toBe(yTip!.commit_id);
944
+
945
+ // The commit graph correctly associates commits with their versions
946
+ // Each graph entry has the correct version_id
947
+ const allGraphEntries = [...graphX, ...graphY, ...graphZ];
948
+ expect(
949
+ allGraphEntries.every(
950
+ (g: any) =>
951
+ g.version_id === "version-x" ||
952
+ g.version_id === "version-y" ||
953
+ g.version_id === "version-z"
954
+ )
955
+ ).toBe(true);
956
+ },
957
+ {
958
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
959
+ }
960
+ );
961
+ });
962
+
963
+ describe("internal_materialization_latest_visible_state", () => {
964
+ simulationTest(
965
+ "finds latest change for each entity in a single version",
966
+ async ({ openSimulatedLix }) => {
967
+ // Create version with multiple changes to same entity
968
+ // Verify only the latest (closest to tip) change is visible
969
+ const lix = await openSimulatedLix({
970
+ keyValues: [
971
+ {
972
+ key: "lix_deterministic_mode",
973
+ value: { enabled: true, bootstrap: true },
974
+ },
975
+ ],
976
+ });
977
+
978
+ // Create a version
979
+ await createVersion({ lix, id: "latest-test-version" });
980
+
981
+ // Create multiple changes to the same entity
982
+ // First change - create entity
983
+ await lix.db
984
+ .insertInto("state_all")
985
+ .values({
986
+ entity_id: "entity-1",
987
+ schema_key: "mock_entity",
988
+ schema_version: "1.0",
989
+ file_id: "mock-file",
990
+ version_id: "latest-test-version",
991
+ plugin_key: "mock-plugin",
992
+ snapshot_content: { id: "entity-1", name: "Initial Name", value: 1 },
993
+ })
994
+ .execute();
995
+
996
+ // Second change - update entity
997
+ await lix.db
998
+ .insertInto("state_all")
999
+ .values({
1000
+ entity_id: "entity-1",
1001
+ schema_key: "mock_entity",
1002
+ schema_version: "1.0",
1003
+ file_id: "mock-file",
1004
+ version_id: "latest-test-version",
1005
+ plugin_key: "mock-plugin",
1006
+ snapshot_content: { id: "entity-1", name: "Updated Name", value: 2 },
1007
+ })
1008
+ .execute();
1009
+
1010
+ // Third change - another update
1011
+ await lix.db
1012
+ .insertInto("state_all")
1013
+ .values({
1014
+ entity_id: "entity-1",
1015
+ schema_key: "mock_entity",
1016
+ schema_version: "1.0",
1017
+ file_id: "mock-file",
1018
+ version_id: "latest-test-version",
1019
+ plugin_key: "mock-plugin",
1020
+ snapshot_content: { id: "entity-1", name: "Final Name", value: 3 },
1021
+ })
1022
+ .execute();
1023
+
1024
+ // Query the latest visible state view
1025
+ const latestState = await lix.db
1026
+ .selectFrom("internal_materialization_latest_visible_state" as any)
1027
+ .selectAll()
1028
+ .where("version_id", "=", "latest-test-version")
1029
+ .where("entity_id", "=", "entity-1")
1030
+ .execute();
1031
+
1032
+ // Should only have one entry (the latest)
1033
+ expect(latestState).toHaveLength(1);
1034
+
1035
+ // Should be the most recent change (closest to tip, depth 0)
1036
+ const state = latestState[0]!;
1037
+ expect(state.entity_id).toBe("entity-1");
1038
+ expect(state.snapshot_content).toEqual({
1039
+ id: "entity-1",
1040
+ name: "Final Name",
1041
+ value: 3,
1042
+ });
1043
+ expect(state.depth).toBe(0); // Latest commit is at depth 0
1044
+
1045
+ // Verify it selected the change from the newest commit
1046
+ const commits = await lix.db
1047
+ .selectFrom("commit")
1048
+ .innerJoin("version", "version.commit_id", "commit.id")
1049
+ .select("commit.id")
1050
+ .where("version.id", "=", "latest-test-version")
1051
+ .orderBy("commit.lixcol_created_at", "desc")
1052
+ .execute();
1053
+
1054
+ expect(state.commit_id).toBe(commits[0]!.id);
1055
+ },
1056
+ {
1057
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
1058
+ }
1059
+ );
1060
+
1061
+ simulationTest(
1062
+ "handles multiple entities with different change histories",
1063
+ async ({ openSimulatedLix }) => {
1064
+ // Create multiple entities with different numbers of changes
1065
+ // Verify each entity shows its latest state
1066
+ const lix = await openSimulatedLix({
1067
+ keyValues: [
1068
+ {
1069
+ key: "lix_deterministic_mode",
1070
+ value: { enabled: true, bootstrap: true },
1071
+ },
1072
+ ],
1073
+ });
1074
+
1075
+ // Create a version
1076
+ await createVersion({ lix, id: "multi-entity-version" });
1077
+
1078
+ // Entity 1: Three changes
1079
+ await lix.db
1080
+ .insertInto("state_all")
1081
+ .values({
1082
+ entity_id: "entity-1",
1083
+ schema_key: "mock_entity",
1084
+ schema_version: "1.0",
1085
+ file_id: "mock-file",
1086
+ version_id: "multi-entity-version",
1087
+ plugin_key: "mock-plugin",
1088
+ snapshot_content: { id: "entity-1", version: 1 },
1089
+ })
1090
+ .execute();
1091
+
1092
+ await lix.db
1093
+ .insertInto("state_all")
1094
+ .values({
1095
+ entity_id: "entity-1",
1096
+ schema_key: "mock_entity",
1097
+ schema_version: "1.0",
1098
+ file_id: "mock-file",
1099
+ version_id: "multi-entity-version",
1100
+ plugin_key: "mock-plugin",
1101
+ snapshot_content: { id: "entity-1", version: 2 },
1102
+ })
1103
+ .execute();
1104
+
1105
+ await lix.db
1106
+ .insertInto("state_all")
1107
+ .values({
1108
+ entity_id: "entity-1",
1109
+ schema_key: "mock_entity",
1110
+ schema_version: "1.0",
1111
+ file_id: "mock-file",
1112
+ version_id: "multi-entity-version",
1113
+ plugin_key: "mock-plugin",
1114
+ snapshot_content: { id: "entity-1", version: 3 },
1115
+ })
1116
+ .execute();
1117
+
1118
+ // Entity 2: Two changes
1119
+ await lix.db
1120
+ .insertInto("state_all")
1121
+ .values({
1122
+ entity_id: "entity-2",
1123
+ schema_key: "mock_entity",
1124
+ schema_version: "1.0",
1125
+ file_id: "mock-file",
1126
+ version_id: "multi-entity-version",
1127
+ plugin_key: "mock-plugin",
1128
+ snapshot_content: { id: "entity-2", status: "created" },
1129
+ })
1130
+ .execute();
1131
+
1132
+ await lix.db
1133
+ .insertInto("state_all")
1134
+ .values({
1135
+ entity_id: "entity-2",
1136
+ schema_key: "mock_entity",
1137
+ schema_version: "1.0",
1138
+ file_id: "mock-file",
1139
+ version_id: "multi-entity-version",
1140
+ plugin_key: "mock-plugin",
1141
+ snapshot_content: { id: "entity-2", status: "updated" },
1142
+ })
1143
+ .execute();
1144
+
1145
+ // Entity 3: Single change
1146
+ await lix.db
1147
+ .insertInto("state_all")
1148
+ .values({
1149
+ entity_id: "entity-3",
1150
+ schema_key: "mock_entity",
1151
+ schema_version: "1.0",
1152
+ file_id: "mock-file",
1153
+ version_id: "multi-entity-version",
1154
+ plugin_key: "mock-plugin",
1155
+ snapshot_content: { id: "entity-3", data: "single-change" },
1156
+ })
1157
+ .execute();
1158
+
1159
+ // Query the latest visible state view
1160
+ const latestStates = await lix.db
1161
+ .selectFrom("internal_materialization_latest_visible_state" as any)
1162
+ .selectAll()
1163
+ .where("version_id", "=", "multi-entity-version")
1164
+ .where("schema_key", "=", "mock_entity")
1165
+ .orderBy("entity_id")
1166
+ .execute();
1167
+
1168
+ // Should have exactly 3 entries (one per entity)
1169
+ expect(latestStates).toHaveLength(3);
1170
+
1171
+ // Verify each entity shows its latest state
1172
+ const entity1State = latestStates.find(
1173
+ (s: any) => s.entity_id === "entity-1"
1174
+ );
1175
+ const entity2State = latestStates.find(
1176
+ (s: any) => s.entity_id === "entity-2"
1177
+ );
1178
+ const entity3State = latestStates.find(
1179
+ (s: any) => s.entity_id === "entity-3"
1180
+ );
1181
+
1182
+ expect(entity1State).toBeDefined();
1183
+ expect(entity1State!.snapshot_content).toEqual({
1184
+ id: "entity-1",
1185
+ version: 3,
1186
+ });
1187
+
1188
+ expect(entity2State).toBeDefined();
1189
+ expect(entity2State!.snapshot_content).toEqual({
1190
+ id: "entity-2",
1191
+ status: "updated",
1192
+ });
1193
+
1194
+ expect(entity3State).toBeDefined();
1195
+ expect(entity3State!.snapshot_content).toEqual({
1196
+ id: "entity-3",
1197
+ data: "single-change",
1198
+ });
1199
+
1200
+ // The depths depend on which commit each entity's latest change was in
1201
+ // Entity-1's latest change (version 3) was in the 4th commit from tip
1202
+ expect(entity1State!.depth).toBe(3);
1203
+
1204
+ // Entity-2's latest change was in the 2nd commit from tip
1205
+ expect(entity2State!.depth).toBe(1);
1206
+
1207
+ // Entity-3's only change was in the tip commit
1208
+ expect(entity3State!.depth).toBe(0);
1209
+
1210
+ // Each entity correctly shows its latest state regardless of depth
1211
+ // This demonstrates that the view correctly selects the most recent
1212
+ // change for each entity, even when they're at different depths
1213
+ },
1214
+ {
1215
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
1216
+ }
1217
+ );
1218
+
1219
+ simulationTest(
1220
+ "respects first-seen-wins principle for commits at same depth",
1221
+ async () => {
1222
+ // TODO: Create scenario where multiple changes exist at same depth
1223
+ // Verify consistent selection based on first-seen
1224
+ },
1225
+ {
1226
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
1227
+ }
1228
+ );
1229
+
1230
+ simulationTest(
1231
+ "includes NULL snapshots (deletions) in results",
1232
+ async ({ openSimulatedLix }) => {
1233
+ // Create entity, then delete it (NULL snapshot)
1234
+ // Verify deletion tombstone appears in latest visible state
1235
+ const lix = await openSimulatedLix({
1236
+ keyValues: [
1237
+ {
1238
+ key: "lix_deterministic_mode",
1239
+ value: { enabled: true, bootstrap: true },
1240
+ },
1241
+ ],
1242
+ });
1243
+
1244
+ // Create a version
1245
+ await createVersion({ lix, id: "deletion-test-version" });
1246
+
1247
+ // Create an entity
1248
+ await lix.db
1249
+ .insertInto("state_all")
1250
+ .values({
1251
+ entity_id: "entity-to-delete",
1252
+ schema_key: "mock_entity",
1253
+ schema_version: "1.0",
1254
+ file_id: "mock-file",
1255
+ version_id: "deletion-test-version",
1256
+ plugin_key: "mock-plugin",
1257
+ snapshot_content: {
1258
+ id: "entity-to-delete",
1259
+ name: "Original Entity",
1260
+ active: true,
1261
+ },
1262
+ })
1263
+ .execute();
1264
+
1265
+ // Update the entity
1266
+ await lix.db
1267
+ .insertInto("state_all")
1268
+ .values({
1269
+ entity_id: "entity-to-delete",
1270
+ schema_key: "mock_entity",
1271
+ schema_version: "1.0",
1272
+ file_id: "mock-file",
1273
+ version_id: "deletion-test-version",
1274
+ plugin_key: "mock-plugin",
1275
+ snapshot_content: {
1276
+ id: "entity-to-delete",
1277
+ name: "Updated Entity",
1278
+ active: true,
1279
+ },
1280
+ })
1281
+ .execute();
1282
+
1283
+ // Delete the entity by inserting NULL snapshot
1284
+ await lix.db
1285
+ .insertInto("state_all")
1286
+ .values({
1287
+ entity_id: "entity-to-delete",
1288
+ schema_key: "mock_entity",
1289
+ schema_version: "1.0",
1290
+ file_id: "mock-file",
1291
+ version_id: "deletion-test-version",
1292
+ plugin_key: "mock-plugin",
1293
+ // @ts-expect-error - snapshot_content is intentionally NULL for deletion
1294
+ snapshot_content: null, // Deletion tombstone
1295
+ })
1296
+ .execute();
1297
+
1298
+ // Query the latest visible state view
1299
+ const latestState = await lix.db
1300
+ .selectFrom("internal_materialization_latest_visible_state" as any)
1301
+ .selectAll()
1302
+ .where("version_id", "=", "deletion-test-version")
1303
+ .where("entity_id", "=", "entity-to-delete")
1304
+ .execute();
1305
+
1306
+ // Should have exactly one entry - the deletion tombstone
1307
+ expect(latestState).toHaveLength(1);
1308
+
1309
+ const deletionState = latestState[0]!;
1310
+
1311
+ // Verify it's the deletion (NULL snapshot)
1312
+ expect(deletionState.entity_id).toBe("entity-to-delete");
1313
+ expect(deletionState.snapshot_content).toBeNull();
1314
+ expect(deletionState.depth).toBe(0); // Latest commit
1315
+
1316
+ // Verify it's tracking the deletion, not earlier states
1317
+ expect(deletionState.schema_key).toBe("mock_entity");
1318
+ expect(deletionState.file_id).toBe("mock-file");
1319
+
1320
+ // Create another entity that is NOT deleted to verify filtering
1321
+ await lix.db
1322
+ .insertInto("state_all")
1323
+ .values({
1324
+ entity_id: "entity-still-exists",
1325
+ schema_key: "mock_entity",
1326
+ schema_version: "1.0",
1327
+ file_id: "mock-file",
1328
+ version_id: "deletion-test-version",
1329
+ plugin_key: "mock-plugin",
1330
+ snapshot_content: {
1331
+ id: "entity-still-exists",
1332
+ name: "Active Entity",
1333
+ },
1334
+ })
1335
+ .execute();
1336
+
1337
+ // Query all latest states for this version
1338
+ const allStates = await lix.db
1339
+ .selectFrom("internal_materialization_latest_visible_state" as any)
1340
+ .selectAll()
1341
+ .where("version_id", "=", "deletion-test-version")
1342
+ .where("schema_key", "=", "mock_entity")
1343
+ .orderBy("entity_id")
1344
+ .execute();
1345
+
1346
+ // Should have both entities
1347
+ expect(allStates).toHaveLength(2);
1348
+
1349
+ // One is deleted (NULL), one exists
1350
+ const deletedEntity = allStates.find(
1351
+ (s: any) => s.entity_id === "entity-to-delete"
1352
+ );
1353
+ const activeEntity = allStates.find(
1354
+ (s: any) => s.entity_id === "entity-still-exists"
1355
+ );
1356
+
1357
+ expect(deletedEntity!.snapshot_content).toBeNull();
1358
+ expect(activeEntity!.snapshot_content).not.toBeNull();
1359
+ expect(activeEntity!.snapshot_content).toEqual({
1360
+ id: "entity-still-exists",
1361
+ name: "Active Entity",
1362
+ });
1363
+ },
1364
+ {
1365
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
1366
+ }
1367
+ );
1368
+ });
1369
+
1370
+ describe("internal_materialization_version_ancestry", () => {
1371
+ simulationTest(
1372
+ "version is its own ancestor at depth 0",
1373
+ async ({ openSimulatedLix }) => {
1374
+ // Create a version and verify it appears as its own ancestor
1375
+ // at inheritance depth 0
1376
+ const lix = await openSimulatedLix({
1377
+ keyValues: [
1378
+ {
1379
+ key: "lix_deterministic_mode",
1380
+ value: { enabled: true, bootstrap: true },
1381
+ },
1382
+ ],
1383
+ });
1384
+
1385
+ // Create a standalone version
1386
+ await createVersion({ lix, id: "standalone-version" });
1387
+
1388
+ // Query the version ancestry view
1389
+ const ancestry = await lix.db
1390
+ .selectFrom("internal_materialization_version_ancestry" as any)
1391
+ .selectAll()
1392
+ .where("version_id", "=", "standalone-version")
1393
+ .execute();
1394
+
1395
+ // By default, versions inherit from 'global'
1396
+ // Should have two entries: itself (depth 0) and global (depth 1)
1397
+ expect(ancestry).toHaveLength(2);
1398
+
1399
+ // Check self-ancestry at depth 0
1400
+ const selfAncestor = ancestry.find(
1401
+ (a: any) => a.ancestor_version_id === "standalone-version"
1402
+ );
1403
+ expect(selfAncestor).toBeDefined();
1404
+ expect(selfAncestor!.version_id).toBe("standalone-version");
1405
+ expect(selfAncestor!.ancestor_version_id).toBe("standalone-version");
1406
+ expect(selfAncestor!.inheritance_depth).toBe(0);
1407
+
1408
+ // Check global ancestry at depth 1
1409
+ const globalAncestor = ancestry.find(
1410
+ (a: any) => a.ancestor_version_id === "global"
1411
+ );
1412
+ expect(globalAncestor).toBeDefined();
1413
+ expect(globalAncestor!.version_id).toBe("standalone-version");
1414
+ expect(globalAncestor!.ancestor_version_id).toBe("global");
1415
+ expect(globalAncestor!.inheritance_depth).toBe(1);
1416
+ },
1417
+ {
1418
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
1419
+ }
1420
+ );
1421
+
1422
+ simulationTest(
1423
+ "handles single-level inheritance",
1424
+ async ({ openSimulatedLix }) => {
1425
+ const lix = await openSimulatedLix({
1426
+ keyValues: [
1427
+ {
1428
+ key: "lix_deterministic_mode",
1429
+ value: { enabled: true, bootstrap: true },
1430
+ },
1431
+ ],
1432
+ });
1433
+
1434
+ // Create parent version A
1435
+ await createVersion({ lix, id: "version-a" });
1436
+
1437
+ // Create child version B that inherits from A
1438
+ await createVersion({
1439
+ lix,
1440
+ id: "version-b",
1441
+ inherits_from_version_id: "version-a",
1442
+ });
1443
+
1444
+ // Query ancestry for version B
1445
+ const ancestry = await lix.db
1446
+ .selectFrom("internal_materialization_version_ancestry" as any)
1447
+ .selectAll()
1448
+ .where("version_id", "=", "version-b")
1449
+ .orderBy("inheritance_depth", "asc")
1450
+ .execute();
1451
+
1452
+ // Version B should see:
1453
+ // - Itself at depth 0
1454
+ // - Version A at depth 1
1455
+ // - Global at depth 2 (inherited through A)
1456
+ expect(ancestry).toHaveLength(3);
1457
+
1458
+ expect(ancestry[0]).toEqual({
1459
+ version_id: "version-b",
1460
+ ancestor_version_id: "version-b",
1461
+ inheritance_depth: 0,
1462
+ });
1463
+
1464
+ expect(ancestry[1]).toEqual({
1465
+ version_id: "version-b",
1466
+ ancestor_version_id: "version-a",
1467
+ inheritance_depth: 1,
1468
+ });
1469
+
1470
+ expect(ancestry[2]).toEqual({
1471
+ version_id: "version-b",
1472
+ ancestor_version_id: "global",
1473
+ inheritance_depth: 2,
1474
+ });
1475
+ },
1476
+ {
1477
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
1478
+ }
1479
+ );
1480
+
1481
+ simulationTest(
1482
+ "handles multi-level inheritance chain",
1483
+ async ({ openSimulatedLix }) => {
1484
+ const lix = await openSimulatedLix({
1485
+ keyValues: [
1486
+ {
1487
+ key: "lix_deterministic_mode",
1488
+ value: { enabled: true, bootstrap: true },
1489
+ },
1490
+ ],
1491
+ });
1492
+
1493
+ // Create inheritance chain: global → A → B → C → D
1494
+ await createVersion({ lix, id: "version-a" });
1495
+
1496
+ await createVersion({
1497
+ lix,
1498
+ id: "version-b",
1499
+ inherits_from_version_id: "version-a",
1500
+ });
1501
+
1502
+ await createVersion({
1503
+ lix,
1504
+ id: "version-c",
1505
+ inherits_from_version_id: "version-b",
1506
+ });
1507
+
1508
+ await createVersion({
1509
+ lix,
1510
+ id: "version-d",
1511
+ inherits_from_version_id: "version-c",
1512
+ });
1513
+
1514
+ // Query ancestry for version D
1515
+ const ancestry = await lix.db
1516
+ .selectFrom("internal_materialization_version_ancestry" as any)
1517
+ .selectAll()
1518
+ .where("version_id", "=", "version-d")
1519
+ .orderBy("inheritance_depth", "asc")
1520
+ .execute();
1521
+
1522
+ // Version D should see all ancestors at correct depths
1523
+ expect(ancestry).toHaveLength(5);
1524
+
1525
+ expect(ancestry[0]).toEqual({
1526
+ version_id: "version-d",
1527
+ ancestor_version_id: "version-d",
1528
+ inheritance_depth: 0,
1529
+ });
1530
+
1531
+ expect(ancestry[1]).toEqual({
1532
+ version_id: "version-d",
1533
+ ancestor_version_id: "version-c",
1534
+ inheritance_depth: 1,
1535
+ });
1536
+
1537
+ expect(ancestry[2]).toEqual({
1538
+ version_id: "version-d",
1539
+ ancestor_version_id: "version-b",
1540
+ inheritance_depth: 2,
1541
+ });
1542
+
1543
+ expect(ancestry[3]).toEqual({
1544
+ version_id: "version-d",
1545
+ ancestor_version_id: "version-a",
1546
+ inheritance_depth: 3,
1547
+ });
1548
+
1549
+ expect(ancestry[4]).toEqual({
1550
+ version_id: "version-d",
1551
+ ancestor_version_id: "global",
1552
+ inheritance_depth: 4,
1553
+ });
1554
+ },
1555
+ {
1556
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
1557
+ }
1558
+ );
1559
+
1560
+ simulationTest(
1561
+ "handles diamond inheritance pattern",
1562
+ async ({ openSimulatedLix }) => {
1563
+ const lix = await openSimulatedLix({
1564
+ keyValues: [
1565
+ {
1566
+ key: "lix_deterministic_mode",
1567
+ value: { enabled: true, bootstrap: true },
1568
+ },
1569
+ ],
1570
+ });
1571
+
1572
+ // Create diamond pattern:
1573
+ // global
1574
+ // |
1575
+ // A
1576
+ // / \
1577
+ // B C
1578
+ // \ /
1579
+ // D
1580
+
1581
+ // Note: In this system, a version can only inherit from ONE parent
1582
+ // So D inherits from B, which inherits from A
1583
+ // C also inherits from A, but D doesn't directly inherit from C
1584
+
1585
+ await createVersion({ lix, id: "version-a" });
1586
+
1587
+ await createVersion({
1588
+ lix,
1589
+ id: "version-b",
1590
+ inherits_from_version_id: "version-a",
1591
+ });
1592
+
1593
+ await createVersion({
1594
+ lix,
1595
+ id: "version-c",
1596
+ inherits_from_version_id: "version-a",
1597
+ });
1598
+
1599
+ // D inherits from B (not from both B and C)
1600
+ await createVersion({
1601
+ lix,
1602
+ id: "version-d",
1603
+ inherits_from_version_id: "version-b",
1604
+ });
1605
+
1606
+ // Query ancestry for version D
1607
+ const ancestryD = await lix.db
1608
+ .selectFrom("internal_materialization_version_ancestry" as any)
1609
+ .selectAll()
1610
+ .where("version_id", "=", "version-d")
1611
+ .orderBy("inheritance_depth", "asc")
1612
+ .execute();
1613
+
1614
+ // D should see: itself, B, A, global
1615
+ expect(ancestryD).toHaveLength(4);
1616
+
1617
+ expect(ancestryD[0]).toEqual({
1618
+ version_id: "version-d",
1619
+ ancestor_version_id: "version-d",
1620
+ inheritance_depth: 0,
1621
+ });
1622
+
1623
+ expect(ancestryD[1]).toEqual({
1624
+ version_id: "version-d",
1625
+ ancestor_version_id: "version-b",
1626
+ inheritance_depth: 1,
1627
+ });
1628
+
1629
+ expect(ancestryD[2]).toEqual({
1630
+ version_id: "version-d",
1631
+ ancestor_version_id: "version-a",
1632
+ inheritance_depth: 2,
1633
+ });
1634
+
1635
+ expect(ancestryD[3]).toEqual({
1636
+ version_id: "version-d",
1637
+ ancestor_version_id: "global",
1638
+ inheritance_depth: 3,
1639
+ });
1640
+
1641
+ // Verify C also sees A as ancestor
1642
+ const ancestryC = await lix.db
1643
+ .selectFrom("internal_materialization_version_ancestry" as any)
1644
+ .selectAll()
1645
+ .where("version_id", "=", "version-c")
1646
+ .orderBy("inheritance_depth", "asc")
1647
+ .execute();
1648
+
1649
+ expect(ancestryC).toHaveLength(3);
1650
+ expect(ancestryC[1]?.ancestor_version_id).toBe("version-a");
1651
+ expect(ancestryC[1]?.inheritance_depth).toBe(1);
1652
+ },
1653
+ {
1654
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
1655
+ }
1656
+ );
1657
+
1658
+ simulationTest(
1659
+ "handles version with no inheritance",
1660
+ async ({ openSimulatedLix }) => {
1661
+ const lix = await openSimulatedLix({
1662
+ keyValues: [
1663
+ {
1664
+ key: "lix_deterministic_mode",
1665
+ value: { enabled: true, bootstrap: true },
1666
+ },
1667
+ ],
1668
+ });
1669
+
1670
+ // Create a version that explicitly does NOT inherit from global
1671
+ await createVersion({
1672
+ lix,
1673
+ id: "standalone-version",
1674
+ inherits_from_version_id: null,
1675
+ });
1676
+
1677
+ // Query ancestry
1678
+ const ancestry = await lix.db
1679
+ .selectFrom("internal_materialization_version_ancestry" as any)
1680
+ .selectAll()
1681
+ .where("version_id", "=", "standalone-version")
1682
+ .orderBy("inheritance_depth", "asc")
1683
+ .execute();
1684
+
1685
+ // Should only see itself as ancestor
1686
+ expect(ancestry).toHaveLength(1);
1687
+
1688
+ expect(ancestry[0]).toEqual({
1689
+ version_id: "standalone-version",
1690
+ ancestor_version_id: "standalone-version",
1691
+ inheritance_depth: 0,
1692
+ });
1693
+ },
1694
+ {
1695
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
1696
+ }
1697
+ );
1698
+
1699
+ simulationTest(
1700
+ "cycle detection prevents infinite recursion",
1701
+ async ({ openSimulatedLix }) => {
1702
+ const lix = await openSimulatedLix({
1703
+ keyValues: [
1704
+ {
1705
+ key: "lix_deterministic_mode",
1706
+ value: { enabled: true, bootstrap: true },
1707
+ },
1708
+ ],
1709
+ });
1710
+
1711
+ // Create version A that will later point to B
1712
+ await createVersion({
1713
+ lix,
1714
+ id: "version-a",
1715
+ inherits_from_version_id: null, // Start with no inheritance
1716
+ });
1717
+
1718
+ // Create version B that inherits from A
1719
+ await createVersion({
1720
+ lix,
1721
+ id: "version-b",
1722
+ inherits_from_version_id: "version-a",
1723
+ });
1724
+
1725
+ // Now update A to inherit from B, creating a cycle
1726
+ // This would create A -> B -> A -> B -> ...
1727
+ await lix.db
1728
+ .updateTable("version")
1729
+ .set({ inherits_from_version_id: "version-b" })
1730
+ .where("id", "=", "version-a")
1731
+ .execute();
1732
+
1733
+ // Query ancestry for version A with DISTINCT to remove duplicates
1734
+ const ancestryA = await lix.db
1735
+ .selectFrom("internal_materialization_version_ancestry" as any)
1736
+ .selectAll()
1737
+ .where("version_id", "=", "version-a")
1738
+ .distinct()
1739
+ .orderBy("inheritance_depth", "asc")
1740
+ .execute();
1741
+
1742
+ // Should have exactly 2 entries due to cycle detection
1743
+ // A sees: itself (depth 0), B (depth 1)
1744
+ // The cycle detection prevents seeing A again at depth 2
1745
+ expect(ancestryA).toHaveLength(2);
1746
+
1747
+ expect(ancestryA[0]).toEqual({
1748
+ version_id: "version-a",
1749
+ ancestor_version_id: "version-a",
1750
+ inheritance_depth: 0,
1751
+ });
1752
+
1753
+ expect(ancestryA[1]).toEqual({
1754
+ version_id: "version-a",
1755
+ ancestor_version_id: "version-b",
1756
+ inheritance_depth: 1,
1757
+ });
1758
+
1759
+ // Query ancestry for version B
1760
+ const ancestryB = await lix.db
1761
+ .selectFrom("internal_materialization_version_ancestry" as any)
1762
+ .selectAll()
1763
+ .where("version_id", "=", "version-b")
1764
+ .distinct()
1765
+ .orderBy("inheritance_depth", "asc")
1766
+ .execute();
1767
+
1768
+ // B should also see exactly 2 entries
1769
+ // B sees: itself (depth 0), A (depth 1)
1770
+ expect(ancestryB).toHaveLength(2);
1771
+
1772
+ expect(ancestryB[0]).toEqual({
1773
+ version_id: "version-b",
1774
+ ancestor_version_id: "version-b",
1775
+ inheritance_depth: 0,
1776
+ });
1777
+
1778
+ expect(ancestryB[1]).toEqual({
1779
+ version_id: "version-b",
1780
+ ancestor_version_id: "version-a",
1781
+ inheritance_depth: 1,
1782
+ });
1783
+ },
1784
+ {
1785
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
1786
+ }
1787
+ );
1788
+ });
1789
+
1790
+ describe("internal_state_materializer", () => {
1791
+ simulationTest(
1792
+ "shows entity from own version",
1793
+ async ({ openSimulatedLix }) => {
1794
+ const lix = await openSimulatedLix({
1795
+ keyValues: [
1796
+ {
1797
+ key: "lix_deterministic_mode",
1798
+ value: { enabled: true, bootstrap: true },
1799
+ },
1800
+ ],
1801
+ });
1802
+
1803
+ // Create a version
1804
+ await createVersion({ lix, id: "version-1" });
1805
+
1806
+ // Insert an entity directly to version-1
1807
+ await lix.db
1808
+ .insertInto("key_value_all")
1809
+ .values({
1810
+ key: "test-key",
1811
+ value: "test-value",
1812
+ lixcol_version_id: "version-1",
1813
+ })
1814
+ .execute();
1815
+
1816
+ // Query the materializer for version-1
1817
+ const materializedState = await lix.db
1818
+ .selectFrom("internal_state_materializer" as any)
1819
+ .selectAll()
1820
+ .where("version_id", "=", "version-1")
1821
+ .where("entity_id", "=", "test-key")
1822
+ .executeTakeFirst();
1823
+
1824
+ const cachedState = await lix.db
1825
+ .selectFrom("state_all")
1826
+ .selectAll()
1827
+ .where("version_id", "=", "version-1")
1828
+ .where("entity_id", "=", "test-key")
1829
+ .executeTakeFirst();
1830
+
1831
+ expect(materializedState).toBeDefined();
1832
+ expect(materializedState!.snapshot_content).toEqual({
1833
+ key: "test-key",
1834
+ value: "test-value",
1835
+ });
1836
+ expect(materializedState!.inherited_from_version_id).toBeNull(); // Not inherited
1837
+
1838
+ expect(materializedState).toEqual(cachedState);
1839
+ },
1840
+ {
1841
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
1842
+ }
1843
+ );
1844
+
1845
+ simulationTest(
1846
+ "inherits entity from parent version",
1847
+ async ({ openSimulatedLix }) => {
1848
+ const lix = await openSimulatedLix({
1849
+ keyValues: [
1850
+ {
1851
+ key: "lix_deterministic_mode",
1852
+ value: { enabled: true, bootstrap: true },
1853
+ },
1854
+ ],
1855
+ });
1856
+
1857
+ // Create parent and child versions
1858
+ await createVersion({ lix, id: "parent-version" });
1859
+ await createVersion({
1860
+ lix,
1861
+ id: "child-version",
1862
+ inherits_from_version_id: "parent-version",
1863
+ });
1864
+
1865
+ // Add entity to parent version
1866
+ await lix.db
1867
+ .insertInto("key_value_all")
1868
+ .values({
1869
+ key: "inherited-key",
1870
+ value: "parent-value",
1871
+ lixcol_version_id: "parent-version",
1872
+ })
1873
+ .execute();
1874
+
1875
+ // Query the materializer for child version
1876
+ const materializedState = await lix.db
1877
+ .selectFrom("internal_state_materializer" as any)
1878
+ .selectAll()
1879
+ .where("version_id", "=", "child-version")
1880
+ .where("entity_id", "=", "inherited-key")
1881
+ .executeTakeFirst();
1882
+
1883
+ const cachedState = await lix.db
1884
+ .selectFrom("state_all")
1885
+ .selectAll()
1886
+ .where("version_id", "=", "child-version")
1887
+ .where("entity_id", "=", "inherited-key")
1888
+ .executeTakeFirst();
1889
+
1890
+ // Child should see the entity from parent
1891
+ expect(materializedState).toBeDefined();
1892
+ expect(materializedState!.snapshot_content).toEqual({
1893
+ key: "inherited-key",
1894
+ value: "parent-value",
1895
+ });
1896
+ expect(materializedState!.inherited_from_version_id).toBe(
1897
+ "parent-version"
1898
+ );
1899
+
1900
+ expect(materializedState).toEqual(cachedState);
1901
+ },
1902
+ {
1903
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
1904
+ }
1905
+ );
1906
+
1907
+ simulationTest(
1908
+ "child version overrides parent entity",
1909
+ async ({ openSimulatedLix }) => {
1910
+ const lix = await openSimulatedLix({
1911
+ keyValues: [
1912
+ {
1913
+ key: "lix_deterministic_mode",
1914
+ value: { enabled: true, bootstrap: true },
1915
+ },
1916
+ ],
1917
+ });
1918
+
1919
+ // Create parent and child versions
1920
+ await createVersion({ lix, id: "parent-version" });
1921
+ await createVersion({
1922
+ lix,
1923
+ id: "child-version",
1924
+ inherits_from_version_id: "parent-version",
1925
+ });
1926
+
1927
+ // Add entity to parent version
1928
+ await lix.db
1929
+ .insertInto("key_value_all")
1930
+ .values({
1931
+ key: "shared-key",
1932
+ value: "parent-value",
1933
+ lixcol_version_id: "parent-version",
1934
+ })
1935
+ .execute();
1936
+
1937
+ // Update the inherited entity in child version
1938
+ await lix.db
1939
+ .updateTable("key_value_all")
1940
+ .set({
1941
+ value: "child-value",
1942
+ })
1943
+ .where("key", "=", "shared-key")
1944
+ .where("lixcol_version_id", "=", "child-version")
1945
+ .execute();
1946
+
1947
+ // Query the materializer for child version
1948
+ const materializedState = await lix.db
1949
+ .selectFrom("internal_state_materializer" as any)
1950
+ .selectAll()
1951
+ .where("version_id", "=", "child-version")
1952
+ .where("entity_id", "=", "shared-key")
1953
+ .executeTakeFirst();
1954
+
1955
+ const cachedState = await lix.db
1956
+ .selectFrom("state_all")
1957
+ .selectAll()
1958
+ .where("version_id", "=", "child-version")
1959
+ .where("entity_id", "=", "shared-key")
1960
+ .executeTakeFirst();
1961
+
1962
+ // Child should see its own value, not parent's
1963
+ expect(materializedState).toBeDefined();
1964
+ expect(materializedState!.snapshot_content).toEqual({
1965
+ key: "shared-key",
1966
+ value: "child-value",
1967
+ });
1968
+ expect(materializedState!.inherited_from_version_id).toBeNull(); // Not inherited
1969
+
1970
+ expect(materializedState).toEqual(cachedState);
1971
+ },
1972
+ {
1973
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
1974
+ }
1975
+ );
1976
+
1977
+ simulationTest(
1978
+ "handles multi-level inheritance",
1979
+ async ({ openSimulatedLix }) => {
1980
+ const lix = await openSimulatedLix({
1981
+ keyValues: [
1982
+ {
1983
+ key: "lix_deterministic_mode",
1984
+ value: { enabled: true, bootstrap: true },
1985
+ },
1986
+ ],
1987
+ });
1988
+
1989
+ // Create inheritance chain: A -> B -> C
1990
+ await createVersion({ lix, id: "version-a" });
1991
+ await createVersion({
1992
+ lix,
1993
+ id: "version-b",
1994
+ inherits_from_version_id: "version-a",
1995
+ });
1996
+ await createVersion({
1997
+ lix,
1998
+ id: "version-c",
1999
+ inherits_from_version_id: "version-b",
2000
+ });
2001
+
2002
+ // Add entity to version A
2003
+ await lix.db
2004
+ .insertInto("key_value_all")
2005
+ .values({
2006
+ key: "deep-key",
2007
+ value: "value-from-a",
2008
+ lixcol_version_id: "version-a",
2009
+ })
2010
+ .execute();
2011
+
2012
+ // Add different entity to version B
2013
+ await lix.db
2014
+ .insertInto("key_value_all")
2015
+ .values({
2016
+ key: "b-only-key",
2017
+ value: "value-from-b",
2018
+ lixcol_version_id: "version-b",
2019
+ })
2020
+ .execute();
2021
+
2022
+ // Query materializer for version C
2023
+ const materializedStates = await lix.db
2024
+ .selectFrom("internal_state_materializer" as any)
2025
+ .selectAll()
2026
+ .where("version_id", "=", "version-c")
2027
+ .where("schema_key", "=", "lix_key_value")
2028
+ .where("entity_id", "in", ["deep-key", "b-only-key"])
2029
+ .orderBy("entity_id")
2030
+ .execute();
2031
+
2032
+ // C should see both entities
2033
+ expect(materializedStates).toHaveLength(2);
2034
+
2035
+ // Check inherited from A (through B)
2036
+ const deepKey = materializedStates.find(
2037
+ (s: any) => s.entity_id === "deep-key"
2038
+ );
2039
+ expect(deepKey).toBeDefined();
2040
+ expect(deepKey!.snapshot_content).toEqual({
2041
+ key: "deep-key",
2042
+ value: "value-from-a",
2043
+ });
2044
+ expect(deepKey!.inherited_from_version_id).toBe("version-a");
2045
+
2046
+ // Check inherited from B
2047
+ const bKey = materializedStates.find(
2048
+ (s: any) => s.entity_id === "b-only-key"
2049
+ );
2050
+ expect(bKey).toBeDefined();
2051
+ expect(bKey!.snapshot_content).toEqual({
2052
+ key: "b-only-key",
2053
+ value: "value-from-b",
2054
+ });
2055
+ expect(bKey!.inherited_from_version_id).toBe("version-b");
2056
+ },
2057
+ {
2058
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
2059
+ }
2060
+ );
2061
+
2062
+ simulationTest(
2063
+ "includes deleted entities as tombstones (NULL snapshots)",
2064
+ async ({ openSimulatedLix }) => {
2065
+ const lix = await openSimulatedLix({
2066
+ keyValues: [
2067
+ {
2068
+ key: "lix_deterministic_mode",
2069
+ value: { enabled: true, bootstrap: true },
2070
+ },
2071
+ ],
2072
+ });
2073
+
2074
+ // Create a version
2075
+ await createVersion({ lix, id: "version-1" });
2076
+
2077
+ // Insert an entity
2078
+ await lix.db
2079
+ .insertInto("key_value_all")
2080
+ .values({
2081
+ key: "entity-to-delete",
2082
+ value: "initial-value",
2083
+ lixcol_version_id: "version-1",
2084
+ })
2085
+ .execute();
2086
+
2087
+ // Delete the entity (update to NULL snapshot)
2088
+ await lix.db
2089
+ .deleteFrom("key_value_all")
2090
+ .where("key", "=", "entity-to-delete")
2091
+ .where("lixcol_version_id", "=", "version-1")
2092
+ .execute();
2093
+
2094
+ // Query the materializer - should return deleted entities as tombstones
2095
+ const materializedState = await lix.db
2096
+ .selectFrom("internal_state_materializer" as any)
2097
+ .selectAll()
2098
+ .where("version_id", "=", "version-1")
2099
+ .where("entity_id", "=", "entity-to-delete")
2100
+ .executeTakeFirst();
2101
+
2102
+ // Materializer should include the deleted entity as a tombstone
2103
+ expect(materializedState).toBeDefined();
2104
+ expect(materializedState!.snapshot_content).toBeNull();
2105
+ expect(materializedState!.entity_id).toBe("entity-to-delete");
2106
+ expect(materializedState!.version_id).toBe("version-1");
2107
+
2108
+ // But the latest visible state should still have it with NULL
2109
+ const latestVisible = await lix.db
2110
+ .selectFrom("internal_materialization_latest_visible_state" as any)
2111
+ .selectAll()
2112
+ .where("version_id", "=", "version-1")
2113
+ .where("entity_id", "=", "entity-to-delete")
2114
+ .executeTakeFirst();
2115
+
2116
+ expect(latestVisible).toBeDefined();
2117
+ expect(latestVisible!.snapshot_content).toBeNull();
2118
+ },
2119
+ {
2120
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
2121
+ }
2122
+ );
2123
+
2124
+ simulationTest(
2125
+ "deletion in child overrides parent entity",
2126
+ async ({ openSimulatedLix }) => {
2127
+ const lix = await openSimulatedLix({
2128
+ keyValues: [
2129
+ {
2130
+ key: "lix_deterministic_mode",
2131
+ value: { enabled: true, bootstrap: true },
2132
+ },
2133
+ ],
2134
+ });
2135
+
2136
+ // Create parent and child versions
2137
+ await createVersion({ lix, id: "parent-version" });
2138
+ await createVersion({
2139
+ lix,
2140
+ id: "child-version",
2141
+ inherits_from_version_id: "parent-version",
2142
+ });
2143
+
2144
+ // Add entity to parent version
2145
+ await lix.db
2146
+ .insertInto("key_value_all")
2147
+ .values({
2148
+ key: "entity-to-override",
2149
+ value: "parent-value",
2150
+ lixcol_version_id: "parent-version",
2151
+ })
2152
+ .execute();
2153
+
2154
+ // Delete the inherited entity in child version
2155
+ await lix.db
2156
+ .deleteFrom("key_value_all")
2157
+ .where("key", "=", "entity-to-override")
2158
+ .where("lixcol_version_id", "=", "child-version")
2159
+ .execute();
2160
+
2161
+ // Query materializer for parent - should see the entity
2162
+ const parentState = await lix.db
2163
+ .selectFrom("internal_state_materializer" as any)
2164
+ .selectAll()
2165
+ .where("version_id", "=", "parent-version")
2166
+ .where("entity_id", "=", "entity-to-override")
2167
+ .executeTakeFirst();
2168
+
2169
+ const parentCachedState = await lix.db
2170
+ .selectFrom("state_all")
2171
+ .selectAll()
2172
+ .where("version_id", "=", "parent-version")
2173
+ .where("entity_id", "=", "entity-to-override")
2174
+ .executeTakeFirst();
2175
+
2176
+ expect(parentCachedState).toEqual(parentState);
2177
+
2178
+ expect(parentState).toBeDefined();
2179
+ expect(parentState!.snapshot_content).toEqual({
2180
+ key: "entity-to-override",
2181
+ value: "parent-value",
2182
+ });
2183
+
2184
+ // Query materializer for child - should see the entity as a tombstone (deleted)
2185
+ const childState = await lix.db
2186
+ .selectFrom("internal_state_materializer" as any)
2187
+ .selectAll()
2188
+ .where("version_id", "=", "child-version")
2189
+ .where("entity_id", "=", "entity-to-override")
2190
+ .executeTakeFirst();
2191
+
2192
+ expect(childState).toBeDefined();
2193
+ expect(childState!.snapshot_content).toBeNull();
2194
+ expect(childState!.entity_id).toBe("entity-to-override");
2195
+ expect(childState!.version_id).toBe("child-version");
2196
+ expect(childState!.inherited_from_version_id).toBeNull(); // Direct deletion in child
2197
+
2198
+ // But the latest visible state for child should have NULL snapshot
2199
+ const childLatestVisible = await lix.db
2200
+ .selectFrom("internal_materialization_latest_visible_state" as any)
2201
+ .selectAll()
2202
+ .where("version_id", "=", "child-version")
2203
+ .where("entity_id", "=", "entity-to-override")
2204
+ .executeTakeFirst();
2205
+
2206
+ expect(childLatestVisible).toBeDefined();
2207
+ expect(childLatestVisible!.snapshot_content).toBeNull();
2208
+ },
2209
+ {
2210
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
2211
+ }
2212
+ );
2213
+
2214
+ simulationTest(
2215
+ "handles diamond inheritance - takes from closest ancestor",
2216
+ async ({ openSimulatedLix }) => {
2217
+ const lix = await openSimulatedLix({
2218
+ keyValues: [
2219
+ {
2220
+ key: "lix_deterministic_mode",
2221
+ value: { enabled: true, bootstrap: true },
2222
+ },
2223
+ ],
2224
+ });
2225
+
2226
+ // Create diamond inheritance pattern:
2227
+ // A (root)
2228
+ // / \
2229
+ // B C
2230
+ // \ /
2231
+ // D
2232
+ //
2233
+ // Note: In Lix, a version can only inherit from one parent directly
2234
+ // So D inherits from B, B inherits from A, C also inherits from A
2235
+
2236
+ await createVersion({ lix, id: "version-a" });
2237
+ await createVersion({
2238
+ lix,
2239
+ id: "version-b",
2240
+ inherits_from_version_id: "version-a",
2241
+ });
2242
+ await createVersion({
2243
+ lix,
2244
+ id: "version-c",
2245
+ inherits_from_version_id: "version-a",
2246
+ });
2247
+ await createVersion({
2248
+ lix,
2249
+ id: "version-d",
2250
+ inherits_from_version_id: "version-b",
2251
+ });
2252
+
2253
+ // Add entity to root version A
2254
+ await lix.db
2255
+ .insertInto("key_value_all")
2256
+ .values({
2257
+ key: "shared-entity",
2258
+ value: "value-from-a",
2259
+ lixcol_version_id: "version-a",
2260
+ })
2261
+ .execute();
2262
+
2263
+ // Override the entity in version B
2264
+ await lix.db
2265
+ .updateTable("key_value_all")
2266
+ .set({
2267
+ value: "value-from-b",
2268
+ })
2269
+ .where("key", "=", "shared-entity")
2270
+ .where("lixcol_version_id", "=", "version-b")
2271
+ .execute();
2272
+
2273
+ // Also override the entity in version C
2274
+ await lix.db
2275
+ .updateTable("key_value_all")
2276
+ .set({
2277
+ value: "value-from-c",
2278
+ })
2279
+ .where("key", "=", "shared-entity")
2280
+ .where("lixcol_version_id", "=", "version-c")
2281
+ .execute();
2282
+
2283
+ // Query materializer for version D
2284
+ const dState = await lix.db
2285
+ .selectFrom("internal_state_materializer" as any)
2286
+ .selectAll()
2287
+ .where("version_id", "=", "version-d")
2288
+ .where("entity_id", "=", "shared-entity")
2289
+ .executeTakeFirst();
2290
+
2291
+ // D should see the value from B (its direct parent), not from A or C
2292
+ expect(dState).toBeDefined();
2293
+ expect(dState!.snapshot_content).toEqual({
2294
+ key: "shared-entity",
2295
+ value: "value-from-b",
2296
+ });
2297
+ expect(dState!.inherited_from_version_id).toBe("version-b");
2298
+
2299
+ // Verify that B sees its own value
2300
+ const bState = await lix.db
2301
+ .selectFrom("internal_state_materializer" as any)
2302
+ .selectAll()
2303
+ .where("version_id", "=", "version-b")
2304
+ .where("entity_id", "=", "shared-entity")
2305
+ .executeTakeFirst();
2306
+
2307
+ expect(bState).toBeDefined();
2308
+ expect(bState!.snapshot_content).toEqual({
2309
+ key: "shared-entity",
2310
+ value: "value-from-b",
2311
+ });
2312
+ expect(bState!.inherited_from_version_id).toBeNull(); // B has its own value
2313
+
2314
+ // Verify that C sees its own value
2315
+ const cState = await lix.db
2316
+ .selectFrom("internal_state_materializer" as any)
2317
+ .selectAll()
2318
+ .where("version_id", "=", "version-c")
2319
+ .where("entity_id", "=", "shared-entity")
2320
+ .executeTakeFirst();
2321
+
2322
+ expect(cState).toBeDefined();
2323
+ expect(cState!.snapshot_content).toEqual({
2324
+ key: "shared-entity",
2325
+ value: "value-from-c",
2326
+ });
2327
+ expect(cState!.inherited_from_version_id).toBeNull(); // C has its own value
2328
+
2329
+ // Test inheritance ranking - add a different entity only in A
2330
+ await lix.db
2331
+ .insertInto("key_value_all")
2332
+ .values({
2333
+ key: "root-only-entity",
2334
+ value: "only-in-a",
2335
+ lixcol_version_id: "version-a",
2336
+ })
2337
+ .execute();
2338
+
2339
+ // D should inherit it through B (depth 2 from D's perspective)
2340
+ const dRootEntity = await lix.db
2341
+ .selectFrom("internal_state_materializer" as any)
2342
+ .selectAll()
2343
+ .where("version_id", "=", "version-d")
2344
+ .where("entity_id", "=", "root-only-entity")
2345
+ .executeTakeFirst();
2346
+
2347
+ expect(dRootEntity).toBeDefined();
2348
+ expect(dRootEntity!.snapshot_content).toEqual({
2349
+ key: "root-only-entity",
2350
+ value: "only-in-a",
2351
+ });
2352
+ expect(dRootEntity!.inherited_from_version_id).toBe("version-a");
2353
+ },
2354
+ {
2355
+ simulations: [normalSimulation, outOfOrderSequenceSimulation],
2356
+ }
2357
+ );
2358
+ });