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