@lix-js/sdk 0.4.7 → 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 (1812) hide show
  1. package/dist/account/create-account.d.ts +18 -4
  2. package/dist/account/create-account.d.ts.map +1 -1
  3. package/dist/account/create-account.js +27 -3
  4. package/dist/account/create-account.js.map +1 -1
  5. package/dist/account/create-account.test.js +42 -4
  6. package/dist/account/create-account.test.js.map +1 -1
  7. package/dist/account/index.d.ts +1 -1
  8. package/dist/account/index.d.ts.map +1 -1
  9. package/dist/account/index.js +1 -1
  10. package/dist/account/index.js.map +1 -1
  11. package/dist/account/schema.d.ts +44 -0
  12. package/dist/account/schema.d.ts.map +1 -0
  13. package/dist/account/schema.js +112 -0
  14. package/dist/account/schema.js.map +1 -0
  15. package/dist/account/schema.test.d.ts +2 -0
  16. package/dist/account/schema.test.d.ts.map +1 -0
  17. package/dist/account/schema.test.js +310 -0
  18. package/dist/account/schema.test.js.map +1 -0
  19. package/dist/account/switch-account.d.ts +2 -2
  20. package/dist/account/switch-account.d.ts.map +1 -1
  21. package/dist/account/switch-account.js +8 -2
  22. package/dist/account/switch-account.js.map +1 -1
  23. package/dist/account/switch-account.test.js +31 -10
  24. package/dist/account/switch-account.test.js.map +1 -1
  25. package/dist/change/apply-changes.d.ts +13 -0
  26. package/dist/change/apply-changes.d.ts.map +1 -1
  27. package/dist/change/apply-changes.js +14 -4
  28. package/dist/change/apply-changes.js.map +1 -1
  29. package/dist/change/apply-changes.test.js +91 -1
  30. package/dist/change/apply-changes.test.js.map +1 -1
  31. package/dist/change/create-change-v2.d.ts +11 -0
  32. package/dist/change/create-change-v2.d.ts.map +1 -0
  33. package/dist/change/create-change-v2.js +31 -0
  34. package/dist/change/create-change-v2.js.map +1 -0
  35. package/dist/change/create-change-v2.test.d.ts +2 -0
  36. package/dist/change/create-change-v2.test.d.ts.map +1 -0
  37. package/dist/change/create-change-v2.test.js +39 -0
  38. package/dist/change/create-change-v2.test.js.map +1 -0
  39. package/dist/change/create-change.d.ts +11 -22
  40. package/dist/change/create-change.d.ts.map +1 -1
  41. package/dist/change/create-change.js +31 -83
  42. package/dist/change/create-change.js.map +1 -1
  43. package/dist/change/create-change.test.js +127 -176
  44. package/dist/change/create-change.test.js.map +1 -1
  45. package/dist/change/index.d.ts +1 -2
  46. package/dist/change/index.d.ts.map +1 -1
  47. package/dist/change/index.js +1 -2
  48. package/dist/change/index.js.map +1 -1
  49. package/dist/change/mock-change.d.ts +1 -1
  50. package/dist/change/mock-change.d.ts.map +1 -1
  51. package/dist/change/mock-change.js +1 -0
  52. package/dist/change/mock-change.js.map +1 -1
  53. package/dist/change/schema.d.ts +66 -0
  54. package/dist/change/schema.d.ts.map +1 -0
  55. package/dist/change/schema.js +103 -0
  56. package/dist/change/schema.js.map +1 -0
  57. package/dist/change/schema.test.d.ts +2 -0
  58. package/dist/change/schema.test.d.ts.map +1 -0
  59. package/dist/change/schema.test.js +268 -0
  60. package/dist/change/schema.test.js.map +1 -0
  61. package/dist/change-author/index.d.ts +2 -0
  62. package/dist/change-author/index.d.ts.map +1 -0
  63. package/dist/change-author/index.js +2 -0
  64. package/dist/change-author/index.js.map +1 -0
  65. package/dist/change-author/schema.d.ts +34 -0
  66. package/dist/change-author/schema.d.ts.map +1 -0
  67. package/dist/change-author/schema.js +41 -0
  68. package/dist/change-author/schema.js.map +1 -0
  69. package/dist/change-author/schema.test.d.ts +2 -0
  70. package/dist/change-author/schema.test.d.ts.map +1 -0
  71. package/dist/change-author/schema.test.js +310 -0
  72. package/dist/change-author/schema.test.js.map +1 -0
  73. package/dist/change-conflict/create-change-conflict.d.ts.map +1 -1
  74. package/dist/change-conflict/create-change-conflict.js +24 -6
  75. package/dist/change-conflict/create-change-conflict.js.map +1 -1
  76. package/dist/change-conflict/create-change-conflict.test.js +13 -11
  77. package/dist/change-conflict/create-change-conflict.test.js.map +1 -1
  78. package/dist/change-conflict/detect-change-conflicts.d.ts.map +1 -1
  79. package/dist/change-conflict/detect-change-conflicts.js +2 -0
  80. package/dist/change-conflict/detect-change-conflicts.js.map +1 -1
  81. package/dist/change-conflict/detect-change-conflicts.test.js +17 -13
  82. package/dist/change-conflict/detect-change-conflicts.test.js.map +1 -1
  83. package/dist/change-conflict/detect-diverging-entity-conflict.d.ts.map +1 -1
  84. package/dist/change-conflict/detect-diverging-entity-conflict.js +3 -1
  85. package/dist/change-conflict/detect-diverging-entity-conflict.js.map +1 -1
  86. package/dist/change-conflict/detect-diverging-entity-conflict.test.js +23 -21
  87. package/dist/change-conflict/detect-diverging-entity-conflict.test.js.map +1 -1
  88. package/dist/change-conflict/garbage-collect-change-conflicts.d.ts.map +1 -1
  89. package/dist/change-conflict/garbage-collect-change-conflicts.js +2 -0
  90. package/dist/change-conflict/garbage-collect-change-conflicts.js.map +1 -1
  91. package/dist/change-conflict/garbage-collect-change-conflicts.test.js +15 -15
  92. package/dist/change-conflict/garbage-collect-change-conflicts.test.js.map +1 -1
  93. package/dist/change-conflict/resolve-conflict-by-selecting.d.ts.map +1 -1
  94. package/dist/change-conflict/resolve-conflict-by-selecting.js +2 -2
  95. package/dist/change-conflict/resolve-conflict-by-selecting.js.map +1 -1
  96. package/dist/change-conflict/resolve-conflict-by-selecting.test.js +17 -8
  97. package/dist/change-conflict/resolve-conflict-by-selecting.test.js.map +1 -1
  98. package/dist/change-proposal/create-change-proposal.d.ts +16 -0
  99. package/dist/change-proposal/create-change-proposal.d.ts.map +1 -0
  100. package/dist/change-proposal/create-change-proposal.js +52 -0
  101. package/dist/change-proposal/create-change-proposal.js.map +1 -0
  102. package/dist/change-proposal/create-change-proposal.test.d.ts +2 -0
  103. package/dist/change-proposal/create-change-proposal.test.d.ts.map +1 -0
  104. package/dist/change-proposal/create-change-proposal.test.js +91 -0
  105. package/dist/change-proposal/create-change-proposal.test.js.map +1 -0
  106. package/dist/change-proposal/database-schema.d.ts +13 -0
  107. package/dist/change-proposal/database-schema.d.ts.map +1 -0
  108. package/dist/change-proposal/database-schema.js +17 -0
  109. package/dist/change-proposal/database-schema.js.map +1 -0
  110. package/dist/change-proposal/database-schema.test.d.ts +2 -0
  111. package/dist/change-proposal/database-schema.test.d.ts.map +1 -0
  112. package/dist/change-proposal/database-schema.test.js +159 -0
  113. package/dist/change-proposal/database-schema.test.js.map +1 -0
  114. package/dist/change-proposal/index.d.ts +3 -0
  115. package/dist/change-proposal/index.d.ts.map +1 -0
  116. package/dist/change-proposal/index.js +3 -0
  117. package/dist/change-proposal/index.js.map +1 -0
  118. package/dist/change-set/apply-change-set.d.ts +10 -0
  119. package/dist/change-set/apply-change-set.d.ts.map +1 -0
  120. package/dist/change-set/apply-change-set.js +139 -0
  121. package/dist/change-set/apply-change-set.js.map +1 -0
  122. package/dist/change-set/apply-change-set.test.d.ts +2 -0
  123. package/dist/change-set/apply-change-set.test.d.ts.map +1 -0
  124. package/dist/change-set/apply-change-set.test.js +393 -0
  125. package/dist/change-set/apply-change-set.test.js.map +1 -0
  126. package/dist/change-set/before-after-of-file.d.ts +31 -0
  127. package/dist/change-set/before-after-of-file.d.ts.map +1 -0
  128. package/dist/change-set/before-after-of-file.js +191 -0
  129. package/dist/change-set/before-after-of-file.js.map +1 -0
  130. package/dist/change-set/before-after-of-file.test.d.ts +2 -0
  131. package/dist/change-set/before-after-of-file.test.d.ts.map +1 -0
  132. package/dist/change-set/before-after-of-file.test.js +221 -0
  133. package/dist/change-set/before-after-of-file.test.js.map +1 -0
  134. package/dist/change-set/change-set-element-in-symmetric-difference.d.ts +2 -1
  135. package/dist/change-set/change-set-element-in-symmetric-difference.d.ts.map +1 -1
  136. package/dist/change-set/change-set-element-in-symmetric-difference.js.map +1 -1
  137. package/dist/change-set/change-set-element-in-symmetric-difference.test.js +204 -34
  138. package/dist/change-set/change-set-element-in-symmetric-difference.test.js.map +1 -1
  139. package/dist/change-set/checkout-change-set.d.ts +15 -0
  140. package/dist/change-set/checkout-change-set.d.ts.map +1 -0
  141. package/dist/change-set/checkout-change-set.js +64 -0
  142. package/dist/change-set/checkout-change-set.js.map +1 -0
  143. package/dist/change-set/checkout-change-set.test.d.ts +2 -0
  144. package/dist/change-set/checkout-change-set.test.d.ts.map +1 -0
  145. package/dist/change-set/checkout-change-set.test.js +127 -0
  146. package/dist/change-set/checkout-change-set.test.js.map +1 -0
  147. package/dist/change-set/create-change-set.d.ts +19 -20
  148. package/dist/change-set/create-change-set.d.ts.map +1 -1
  149. package/dist/change-set/create-change-set.js +73 -34
  150. package/dist/change-set/create-change-set.js.map +1 -1
  151. package/dist/change-set/create-change-set.test.js +78 -27
  152. package/dist/change-set/create-change-set.test.js.map +1 -1
  153. package/dist/change-set/create-checkpoint.d.ts +19 -0
  154. package/dist/change-set/create-checkpoint.d.ts.map +1 -0
  155. package/dist/change-set/create-checkpoint.js +95 -0
  156. package/dist/change-set/create-checkpoint.js.map +1 -0
  157. package/dist/change-set/create-checkpoint.test.d.ts +2 -0
  158. package/dist/change-set/create-checkpoint.test.d.ts.map +1 -0
  159. package/dist/change-set/create-checkpoint.test.js +347 -0
  160. package/dist/change-set/create-checkpoint.test.js.map +1 -0
  161. package/dist/change-set/create-merge-change-set.d.ts +23 -0
  162. package/dist/change-set/create-merge-change-set.d.ts.map +1 -0
  163. package/dist/change-set/create-merge-change-set.js +68 -0
  164. package/dist/change-set/create-merge-change-set.js.map +1 -0
  165. package/dist/change-set/create-merge-change-set.test.d.ts +2 -0
  166. package/dist/change-set/create-merge-change-set.test.d.ts.map +1 -0
  167. package/dist/change-set/create-merge-change-set.test.js +211 -0
  168. package/dist/change-set/create-merge-change-set.test.js.map +1 -0
  169. package/dist/change-set/create-transition-change-set.d.ts +18 -0
  170. package/dist/change-set/create-transition-change-set.d.ts.map +1 -0
  171. package/dist/change-set/create-transition-change-set.js +102 -0
  172. package/dist/change-set/create-transition-change-set.js.map +1 -0
  173. package/dist/change-set/create-transition-change-set.test.d.ts +2 -0
  174. package/dist/change-set/create-transition-change-set.test.d.ts.map +1 -0
  175. package/dist/change-set/create-transition-change-set.test.js +211 -0
  176. package/dist/change-set/create-transition-change-set.test.js.map +1 -0
  177. package/dist/change-set/create-undo-change-set.d.ts +27 -0
  178. package/dist/change-set/create-undo-change-set.d.ts.map +1 -0
  179. package/dist/change-set/create-undo-change-set.js +122 -0
  180. package/dist/change-set/create-undo-change-set.js.map +1 -0
  181. package/dist/change-set/create-undo-change-set.test.d.ts +2 -0
  182. package/dist/change-set/create-undo-change-set.test.d.ts.map +1 -0
  183. package/dist/change-set/create-undo-change-set.test.js +273 -0
  184. package/dist/change-set/create-undo-change-set.test.js.map +1 -0
  185. package/dist/change-set/database-schema.d.ts +39 -0
  186. package/dist/change-set/database-schema.d.ts.map +1 -0
  187. package/dist/change-set/database-schema.js +86 -0
  188. package/dist/change-set/database-schema.js.map +1 -0
  189. package/dist/change-set/database-schema.test.d.ts +2 -0
  190. package/dist/change-set/database-schema.test.d.ts.map +1 -0
  191. package/dist/change-set/database-schema.test.js +547 -0
  192. package/dist/change-set/database-schema.test.js.map +1 -0
  193. package/dist/change-set/diff-for-file.d.ts +29 -0
  194. package/dist/change-set/diff-for-file.d.ts.map +1 -0
  195. package/dist/change-set/diff-for-file.js +19 -0
  196. package/dist/change-set/diff-for-file.js.map +1 -0
  197. package/dist/change-set/get-before-after-of-file.d.ts +31 -0
  198. package/dist/change-set/get-before-after-of-file.d.ts.map +1 -0
  199. package/dist/change-set/get-before-after-of-file.js +189 -0
  200. package/dist/change-set/get-before-after-of-file.js.map +1 -0
  201. package/dist/change-set/get-before-after-of-file.test.d.ts +2 -0
  202. package/dist/change-set/get-before-after-of-file.test.d.ts.map +1 -0
  203. package/dist/change-set/get-before-after-of-file.test.js +220 -0
  204. package/dist/change-set/get-before-after-of-file.test.js.map +1 -0
  205. package/dist/change-set/index.d.ts +2 -1
  206. package/dist/change-set/index.d.ts.map +1 -1
  207. package/dist/change-set/index.js +2 -1
  208. package/dist/change-set/index.js.map +1 -1
  209. package/dist/change-set/merge-change-sets.d.ts +23 -0
  210. package/dist/change-set/merge-change-sets.d.ts.map +1 -0
  211. package/dist/change-set/merge-change-sets.js +69 -0
  212. package/dist/change-set/merge-change-sets.js.map +1 -0
  213. package/dist/change-set/merge-change-sets.test.d.ts +2 -0
  214. package/dist/change-set/merge-change-sets.test.d.ts.map +1 -0
  215. package/dist/change-set/merge-change-sets.test.js +184 -0
  216. package/dist/change-set/merge-change-sets.test.js.map +1 -0
  217. package/dist/change-set/restore-change-set.d.ts +14 -0
  218. package/dist/change-set/restore-change-set.d.ts.map +1 -0
  219. package/dist/change-set/restore-change-set.js +98 -0
  220. package/dist/change-set/restore-change-set.js.map +1 -0
  221. package/dist/change-set/restore-change-set.test.d.ts +2 -0
  222. package/dist/change-set/restore-change-set.test.d.ts.map +1 -0
  223. package/dist/change-set/restore-change-set.test.js +238 -0
  224. package/dist/change-set/restore-change-set.test.js.map +1 -0
  225. package/dist/change-set/schema.d.ts +105 -0
  226. package/dist/change-set/schema.d.ts.map +1 -0
  227. package/dist/change-set/schema.js +122 -0
  228. package/dist/change-set/schema.js.map +1 -0
  229. package/dist/change-set/schema.test.d.ts +2 -0
  230. package/dist/change-set/schema.test.d.ts.map +1 -0
  231. package/dist/change-set/schema.test.js +574 -0
  232. package/dist/change-set/schema.test.js.map +1 -0
  233. package/dist/change-set-edge/database-schema.d.ts +11 -0
  234. package/dist/change-set-edge/database-schema.d.ts.map +1 -0
  235. package/dist/change-set-edge/database-schema.js +29 -0
  236. package/dist/change-set-edge/database-schema.js.map +1 -0
  237. package/dist/change-set-edge/database-schema.test.d.ts +2 -0
  238. package/dist/change-set-edge/database-schema.test.d.ts.map +1 -0
  239. package/dist/change-set-edge/database-schema.test.js +166 -0
  240. package/dist/change-set-edge/database-schema.test.js.map +1 -0
  241. package/dist/change-set-edge/index.d.ts +2 -0
  242. package/dist/change-set-edge/index.d.ts.map +1 -0
  243. package/dist/change-set-edge/index.js +2 -0
  244. package/dist/change-set-edge/index.js.map +1 -0
  245. package/dist/change-set-v2/apply-change-set.d.ts +10 -0
  246. package/dist/change-set-v2/apply-change-set.d.ts.map +1 -0
  247. package/dist/change-set-v2/apply-change-set.js +147 -0
  248. package/dist/change-set-v2/apply-change-set.js.map +1 -0
  249. package/dist/change-set-v2/apply-change-set.test.d.ts +2 -0
  250. package/dist/change-set-v2/apply-change-set.test.d.ts.map +1 -0
  251. package/dist/change-set-v2/apply-change-set.test.js +270 -0
  252. package/dist/change-set-v2/apply-change-set.test.js.map +1 -0
  253. package/dist/change-set-v2/create-change-set.d.ts +10 -0
  254. package/dist/change-set-v2/create-change-set.d.ts.map +1 -0
  255. package/dist/change-set-v2/create-change-set.js +57 -0
  256. package/dist/change-set-v2/create-change-set.js.map +1 -0
  257. package/dist/change-set-v2/create-change-set.test.d.ts +2 -0
  258. package/dist/change-set-v2/create-change-set.test.d.ts.map +1 -0
  259. package/dist/change-set-v2/create-change-set.test.js +59 -0
  260. package/dist/change-set-v2/create-change-set.test.js.map +1 -0
  261. package/dist/change-set-v2/create-checkpoint.d.ts +7 -0
  262. package/dist/change-set-v2/create-checkpoint.d.ts.map +1 -0
  263. package/dist/change-set-v2/create-checkpoint.js +79 -0
  264. package/dist/change-set-v2/create-checkpoint.js.map +1 -0
  265. package/dist/change-set-v2/create-checkpoint.test.d.ts +2 -0
  266. package/dist/change-set-v2/create-checkpoint.test.d.ts.map +1 -0
  267. package/dist/change-set-v2/create-checkpoint.test.js +289 -0
  268. package/dist/change-set-v2/create-checkpoint.test.js.map +1 -0
  269. package/dist/change-set-v2/create-merge-change-set.d.ts +23 -0
  270. package/dist/change-set-v2/create-merge-change-set.d.ts.map +1 -0
  271. package/dist/change-set-v2/create-merge-change-set.js +68 -0
  272. package/dist/change-set-v2/create-merge-change-set.js.map +1 -0
  273. package/dist/change-set-v2/create-merge-change-set.test.d.ts +2 -0
  274. package/dist/change-set-v2/create-merge-change-set.test.d.ts.map +1 -0
  275. package/dist/change-set-v2/create-merge-change-set.test.js +223 -0
  276. package/dist/change-set-v2/create-merge-change-set.test.js.map +1 -0
  277. package/dist/change-set-v2/index.d.ts +5 -0
  278. package/dist/change-set-v2/index.d.ts.map +1 -0
  279. package/dist/change-set-v2/index.js +5 -0
  280. package/dist/change-set-v2/index.js.map +1 -0
  281. package/dist/change-set-v2/schema.d.ts +50 -0
  282. package/dist/change-set-v2/schema.d.ts.map +1 -0
  283. package/dist/change-set-v2/schema.js +347 -0
  284. package/dist/change-set-v2/schema.js.map +1 -0
  285. package/dist/change-set-v2/schema.test.d.ts +2 -0
  286. package/dist/change-set-v2/schema.test.d.ts.map +1 -0
  287. package/dist/change-set-v2/schema.test.js +713 -0
  288. package/dist/change-set-v2/schema.test.js.map +1 -0
  289. package/dist/commit/apply-commit.d.ts +32 -0
  290. package/dist/commit/apply-commit.d.ts.map +1 -0
  291. package/dist/commit/apply-commit.js +63 -0
  292. package/dist/commit/apply-commit.js.map +1 -0
  293. package/dist/commit/apply-commit.test.d.ts +2 -0
  294. package/dist/commit/apply-commit.test.d.ts.map +1 -0
  295. package/dist/commit/apply-commit.test.js +367 -0
  296. package/dist/commit/apply-commit.test.js.map +1 -0
  297. package/dist/commit/create-checkpoint.d.ts +19 -0
  298. package/dist/commit/create-checkpoint.d.ts.map +1 -0
  299. package/dist/commit/create-checkpoint.js +118 -0
  300. package/dist/commit/create-checkpoint.js.map +1 -0
  301. package/dist/commit/create-checkpoint.test.d.ts +2 -0
  302. package/dist/commit/create-checkpoint.test.d.ts.map +1 -0
  303. package/dist/commit/create-checkpoint.test.js +472 -0
  304. package/dist/commit/create-checkpoint.test.js.map +1 -0
  305. package/dist/commit/create-commit.d.ts +38 -0
  306. package/dist/commit/create-commit.d.ts.map +1 -0
  307. package/dist/commit/create-commit.js +68 -0
  308. package/dist/commit/create-commit.js.map +1 -0
  309. package/dist/commit/create-merge-commit.d.ts +24 -0
  310. package/dist/commit/create-merge-commit.d.ts.map +1 -0
  311. package/dist/commit/create-merge-commit.js +103 -0
  312. package/dist/commit/create-merge-commit.js.map +1 -0
  313. package/dist/commit/create-merge-commit.test.d.ts +2 -0
  314. package/dist/commit/create-merge-commit.test.d.ts.map +1 -0
  315. package/dist/commit/create-merge-commit.test.js +242 -0
  316. package/dist/commit/create-merge-commit.test.js.map +1 -0
  317. package/dist/commit/create-transition-commit.d.ts +18 -0
  318. package/dist/commit/create-transition-commit.d.ts.map +1 -0
  319. package/dist/commit/create-transition-commit.js +136 -0
  320. package/dist/commit/create-transition-commit.js.map +1 -0
  321. package/dist/commit/create-transition-commit.test.d.ts +2 -0
  322. package/dist/commit/create-transition-commit.test.d.ts.map +1 -0
  323. package/dist/commit/create-transition-commit.test.js +221 -0
  324. package/dist/commit/create-transition-commit.test.js.map +1 -0
  325. package/dist/commit/create-undo-commit.d.ts +27 -0
  326. package/dist/commit/create-undo-commit.d.ts.map +1 -0
  327. package/dist/commit/create-undo-commit.js +143 -0
  328. package/dist/commit/create-undo-commit.js.map +1 -0
  329. package/dist/commit/create-undo-commit.test.d.ts +2 -0
  330. package/dist/commit/create-undo-commit.test.d.ts.map +1 -0
  331. package/dist/commit/create-undo-commit.test.js +298 -0
  332. package/dist/commit/create-undo-commit.test.js.map +1 -0
  333. package/dist/commit/index.d.ts +6 -0
  334. package/dist/commit/index.d.ts.map +1 -0
  335. package/dist/commit/index.js +6 -0
  336. package/dist/commit/index.js.map +1 -0
  337. package/dist/commit/schema.d.ts +73 -0
  338. package/dist/commit/schema.d.ts.map +1 -0
  339. package/dist/commit/schema.js +90 -0
  340. package/dist/commit/schema.js.map +1 -0
  341. package/dist/commit/schema.test.d.ts +2 -0
  342. package/dist/commit/schema.test.d.ts.map +1 -0
  343. package/dist/commit/schema.test.js +216 -0
  344. package/dist/commit/schema.test.js.map +1 -0
  345. package/dist/database/apply-schema.d.ts +3 -0
  346. package/dist/database/apply-schema.d.ts.map +1 -1
  347. package/dist/database/apply-schema.js +91 -258
  348. package/dist/database/apply-schema.js.map +1 -1
  349. package/dist/database/execute-sync.d.ts +12 -6
  350. package/dist/database/execute-sync.d.ts.map +1 -1
  351. package/dist/database/execute-sync.js +25 -24
  352. package/dist/database/execute-sync.js.map +1 -1
  353. package/dist/database/execute-sync.test.js +53 -60
  354. package/dist/database/execute-sync.test.js.map +1 -1
  355. package/dist/database/graph-traversal-mode.d.ts +72 -0
  356. package/dist/database/graph-traversal-mode.d.ts.map +1 -0
  357. package/dist/database/graph-traversal-mode.js +2 -0
  358. package/dist/database/graph-traversal-mode.js.map +1 -0
  359. package/dist/database/index.d.ts +1 -2
  360. package/dist/database/index.d.ts.map +1 -1
  361. package/dist/database/index.js +1 -2
  362. package/dist/database/index.js.map +1 -1
  363. package/dist/database/init-db.d.ts +2 -0
  364. package/dist/database/init-db.d.ts.map +1 -1
  365. package/dist/database/init-db.js +119 -67
  366. package/dist/database/init-db.js.map +1 -1
  367. package/dist/database/init-db.test.js +2 -480
  368. package/dist/database/init-db.test.js.map +1 -1
  369. package/dist/database/kysely-plugin/json-column-plugin.d.ts +7 -0
  370. package/dist/database/kysely-plugin/json-column-plugin.d.ts.map +1 -0
  371. package/dist/database/kysely-plugin/json-column-plugin.js +210 -0
  372. package/dist/database/kysely-plugin/json-column-plugin.js.map +1 -0
  373. package/dist/database/kysely-plugin/json-column-plugin.test.d.ts +2 -0
  374. package/dist/database/kysely-plugin/json-column-plugin.test.d.ts.map +1 -0
  375. package/dist/database/kysely-plugin/json-column-plugin.test.js +329 -0
  376. package/dist/database/kysely-plugin/json-column-plugin.test.js.map +1 -0
  377. package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.d.ts.map +1 -1
  378. package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.js +5 -10
  379. package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.js.map +1 -1
  380. package/dist/database/kysely-plugin/parse-jsonb-plugin-v2.js +1 -1
  381. package/dist/database/kysely-plugin/parse-jsonb-plugin-v2.js.map +1 -1
  382. package/dist/database/kysely-plugin/serialize-jsonb-plugin.d.ts +14 -2
  383. package/dist/database/kysely-plugin/serialize-jsonb-plugin.d.ts.map +1 -1
  384. package/dist/database/kysely-plugin/serialize-jsonb-plugin.js +145 -74
  385. package/dist/database/kysely-plugin/serialize-jsonb-plugin.js.map +1 -1
  386. package/dist/database/kysely-plugin/serialize-jsonb-plugin.test.js +145 -1
  387. package/dist/database/kysely-plugin/serialize-jsonb-plugin.test.js.map +1 -1
  388. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.d.ts +15 -0
  389. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.d.ts.map +1 -0
  390. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.js +31 -0
  391. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.js.map +1 -0
  392. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.test.d.ts +2 -0
  393. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.test.d.ts.map +1 -0
  394. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.test.js +51 -0
  395. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.test.js.map +1 -0
  396. package/dist/database/mutation-log/database-schema.d.ts.map +1 -1
  397. package/dist/database/mutation-log/database-schema.js +0 -4
  398. package/dist/database/mutation-log/database-schema.js.map +1 -1
  399. package/dist/database/nano-id.d.ts +4 -1
  400. package/dist/database/nano-id.d.ts.map +1 -1
  401. package/dist/database/nano-id.js +4 -1
  402. package/dist/database/nano-id.js.map +1 -1
  403. package/dist/database/nano-id.test.js +3 -3
  404. package/dist/database/nano-id.test.js.map +1 -1
  405. package/dist/database/schema.d.ts +50 -209
  406. package/dist/database/schema.d.ts.map +1 -1
  407. package/dist/database/schema.js +39 -1
  408. package/dist/database/schema.js.map +1 -1
  409. package/dist/deterministic/generate-human-id.d.ts +20 -0
  410. package/dist/deterministic/generate-human-id.d.ts.map +1 -0
  411. package/dist/deterministic/generate-human-id.js +86 -0
  412. package/dist/deterministic/generate-human-id.js.map +1 -0
  413. package/dist/deterministic/generate-human-id.test.d.ts +2 -0
  414. package/dist/deterministic/generate-human-id.test.d.ts.map +1 -0
  415. package/dist/deterministic/generate-human-id.test.js +123 -0
  416. package/dist/deterministic/generate-human-id.test.js.map +1 -0
  417. package/dist/deterministic/index.d.ts +8 -0
  418. package/dist/deterministic/index.d.ts.map +1 -0
  419. package/dist/deterministic/index.js +8 -0
  420. package/dist/deterministic/index.js.map +1 -0
  421. package/dist/deterministic/is-deterministic-mode.d.ts +14 -0
  422. package/dist/deterministic/is-deterministic-mode.d.ts.map +1 -0
  423. package/dist/deterministic/is-deterministic-mode.js +25 -0
  424. package/dist/deterministic/is-deterministic-mode.js.map +1 -0
  425. package/dist/deterministic/is-deterministic-mode.test.d.ts +2 -0
  426. package/dist/deterministic/is-deterministic-mode.test.d.ts.map +1 -0
  427. package/dist/deterministic/is-deterministic-mode.test.js +103 -0
  428. package/dist/deterministic/is-deterministic-mode.test.js.map +1 -0
  429. package/dist/deterministic/nano-id.d.ts +61 -0
  430. package/dist/deterministic/nano-id.d.ts.map +1 -0
  431. package/dist/deterministic/nano-id.js +161 -0
  432. package/dist/deterministic/nano-id.js.map +1 -0
  433. package/dist/deterministic/nano-id.test.d.ts +2 -0
  434. package/dist/deterministic/nano-id.test.d.ts.map +1 -0
  435. package/dist/deterministic/nano-id.test.js +163 -0
  436. package/dist/deterministic/nano-id.test.js.map +1 -0
  437. package/dist/deterministic/options.d.ts +53 -0
  438. package/dist/deterministic/options.d.ts.map +1 -0
  439. package/dist/deterministic/options.js +52 -0
  440. package/dist/deterministic/options.js.map +1 -0
  441. package/dist/deterministic/options.test.d.ts +2 -0
  442. package/dist/deterministic/options.test.d.ts.map +1 -0
  443. package/dist/deterministic/options.test.js +111 -0
  444. package/dist/deterministic/options.test.js.map +1 -0
  445. package/dist/deterministic/random.d.ts +68 -0
  446. package/dist/deterministic/random.d.ts.map +1 -0
  447. package/dist/deterministic/random.js +225 -0
  448. package/dist/deterministic/random.js.map +1 -0
  449. package/dist/deterministic/random.test.d.ts +2 -0
  450. package/dist/deterministic/random.test.d.ts.map +1 -0
  451. package/dist/deterministic/random.test.js +244 -0
  452. package/dist/deterministic/random.test.js.map +1 -0
  453. package/dist/deterministic/sequence.d.ts +56 -0
  454. package/dist/deterministic/sequence.d.ts.map +1 -0
  455. package/dist/deterministic/sequence.js +107 -0
  456. package/dist/deterministic/sequence.js.map +1 -0
  457. package/dist/deterministic/sequence.test.d.ts +2 -0
  458. package/dist/deterministic/sequence.test.d.ts.map +1 -0
  459. package/dist/deterministic/sequence.test.js +71 -0
  460. package/dist/deterministic/sequence.test.js.map +1 -0
  461. package/dist/deterministic/timestamp.d.ts +47 -0
  462. package/dist/deterministic/timestamp.d.ts.map +1 -0
  463. package/dist/deterministic/timestamp.js +74 -0
  464. package/dist/deterministic/timestamp.js.map +1 -0
  465. package/dist/deterministic/timestamp.test.d.ts +2 -0
  466. package/dist/deterministic/timestamp.test.d.ts.map +1 -0
  467. package/dist/deterministic/timestamp.test.js +145 -0
  468. package/dist/deterministic/timestamp.test.js.map +1 -0
  469. package/dist/deterministic/uuid-v7.d.ts +49 -0
  470. package/dist/deterministic/uuid-v7.d.ts.map +1 -0
  471. package/dist/deterministic/uuid-v7.js +75 -0
  472. package/dist/deterministic/uuid-v7.js.map +1 -0
  473. package/dist/deterministic/uuid-v7.test.d.ts +2 -0
  474. package/dist/deterministic/uuid-v7.test.d.ts.map +1 -0
  475. package/dist/deterministic/uuid-v7.test.js +114 -0
  476. package/dist/deterministic/uuid-v7.test.js.map +1 -0
  477. package/dist/discussion/create-discussion.d.ts +2 -1
  478. package/dist/discussion/create-discussion.d.ts.map +1 -1
  479. package/dist/discussion/create-discussion.js.map +1 -1
  480. package/dist/discussion/create-discussion.test.js +13 -2
  481. package/dist/discussion/create-discussion.test.js.map +1 -1
  482. package/dist/entity/eb-entity.d.ts +76 -0
  483. package/dist/entity/eb-entity.d.ts.map +1 -0
  484. package/dist/entity/eb-entity.js +156 -0
  485. package/dist/entity/eb-entity.js.map +1 -0
  486. package/dist/entity/eb-entity.test.d.ts +2 -0
  487. package/dist/entity/eb-entity.test.d.ts.map +1 -0
  488. package/dist/entity/eb-entity.test.js +573 -0
  489. package/dist/entity/eb-entity.test.js.map +1 -0
  490. package/dist/entity/index.d.ts +7 -0
  491. package/dist/entity/index.d.ts.map +1 -0
  492. package/dist/entity/index.js +4 -0
  493. package/dist/entity/index.js.map +1 -0
  494. package/dist/entity/label/create-entity-label.d.ts +61 -0
  495. package/dist/entity/label/create-entity-label.d.ts.map +1 -0
  496. package/dist/entity/label/create-entity-label.js +92 -0
  497. package/dist/entity/label/create-entity-label.js.map +1 -0
  498. package/dist/entity/label/create-entity-label.test.d.ts +2 -0
  499. package/dist/entity/label/create-entity-label.test.d.ts.map +1 -0
  500. package/dist/entity/label/create-entity-label.test.js +261 -0
  501. package/dist/entity/label/create-entity-label.test.js.map +1 -0
  502. package/dist/entity/label/schema.d.ts +40 -0
  503. package/dist/entity/label/schema.d.ts.map +1 -0
  504. package/dist/entity/label/schema.js +42 -0
  505. package/dist/entity/label/schema.js.map +1 -0
  506. package/dist/entity/label/schema.test.d.ts +2 -0
  507. package/dist/entity/label/schema.test.d.ts.map +1 -0
  508. package/dist/entity/label/schema.test.js +596 -0
  509. package/dist/entity/label/schema.test.js.map +1 -0
  510. package/dist/entity/schema.d.ts +13 -0
  511. package/dist/entity/schema.d.ts.map +1 -0
  512. package/dist/entity/schema.js +5 -0
  513. package/dist/entity/schema.js.map +1 -0
  514. package/dist/entity/thread/create-entity-thread.d.ts +75 -0
  515. package/dist/entity/thread/create-entity-thread.d.ts.map +1 -0
  516. package/dist/entity/thread/create-entity-thread.js +109 -0
  517. package/dist/entity/thread/create-entity-thread.js.map +1 -0
  518. package/dist/entity/thread/create-entity-thread.test.d.ts +2 -0
  519. package/dist/entity/thread/create-entity-thread.test.d.ts.map +1 -0
  520. package/dist/entity/thread/create-entity-thread.test.js +240 -0
  521. package/dist/entity/thread/create-entity-thread.test.js.map +1 -0
  522. package/dist/entity/thread/query-threads.test.d.ts +2 -0
  523. package/dist/entity/thread/query-threads.test.d.ts.map +1 -0
  524. package/dist/entity/thread/query-threads.test.js +330 -0
  525. package/dist/entity/thread/query-threads.test.js.map +1 -0
  526. package/dist/entity/thread/schema.d.ts +40 -0
  527. package/dist/entity/thread/schema.d.ts.map +1 -0
  528. package/dist/entity/thread/schema.js +42 -0
  529. package/dist/entity/thread/schema.js.map +1 -0
  530. package/dist/entity/thread/schema.test.d.ts +2 -0
  531. package/dist/entity/thread/schema.test.d.ts.map +1 -0
  532. package/dist/entity/thread/schema.test.js +144 -0
  533. package/dist/entity/thread/schema.test.js.map +1 -0
  534. package/dist/entity-views/entity-state-all.d.ts +269 -0
  535. package/dist/entity-views/entity-state-all.d.ts.map +1 -0
  536. package/dist/entity-views/entity-state-all.js +254 -0
  537. package/dist/entity-views/entity-state-all.js.map +1 -0
  538. package/dist/entity-views/entity-state-all.test.d.ts +2 -0
  539. package/dist/entity-views/entity-state-all.test.d.ts.map +1 -0
  540. package/dist/entity-views/entity-state-all.test.js +544 -0
  541. package/dist/entity-views/entity-state-all.test.js.map +1 -0
  542. package/dist/entity-views/entity-state-history.d.ts +218 -0
  543. package/dist/entity-views/entity-state-history.d.ts.map +1 -0
  544. package/dist/entity-views/entity-state-history.js +61 -0
  545. package/dist/entity-views/entity-state-history.js.map +1 -0
  546. package/dist/entity-views/entity-state-history.test.d.ts +2 -0
  547. package/dist/entity-views/entity-state-history.test.d.ts.map +1 -0
  548. package/dist/entity-views/entity-state-history.test.js +329 -0
  549. package/dist/entity-views/entity-state-history.test.js.map +1 -0
  550. package/dist/entity-views/entity-state.d.ts +269 -0
  551. package/dist/entity-views/entity-state.d.ts.map +1 -0
  552. package/dist/entity-views/entity-state.js +251 -0
  553. package/dist/entity-views/entity-state.js.map +1 -0
  554. package/dist/entity-views/entity-state.test.d.ts +2 -0
  555. package/dist/entity-views/entity-state.test.d.ts.map +1 -0
  556. package/dist/entity-views/entity-state.test.js +616 -0
  557. package/dist/entity-views/entity-state.test.js.map +1 -0
  558. package/dist/entity-views/entity-view-builder.d.ts +92 -0
  559. package/dist/entity-views/entity-view-builder.d.ts.map +1 -0
  560. package/dist/entity-views/entity-view-builder.js +63 -0
  561. package/dist/entity-views/entity-view-builder.js.map +1 -0
  562. package/dist/entity-views/entity-view-builder.test.d.ts +2 -0
  563. package/dist/entity-views/entity-view-builder.test.d.ts.map +1 -0
  564. package/dist/entity-views/entity-view-builder.test.js +247 -0
  565. package/dist/entity-views/entity-view-builder.test.js.map +1 -0
  566. package/dist/entity-views/index.d.ts +2 -0
  567. package/dist/entity-views/index.d.ts.map +1 -0
  568. package/dist/entity-views/index.js +2 -0
  569. package/dist/entity-views/index.js.map +1 -0
  570. package/dist/entity-views/types.d.ts +309 -0
  571. package/dist/entity-views/types.d.ts.map +1 -0
  572. package/dist/entity-views/types.js +2 -0
  573. package/dist/entity-views/types.js.map +1 -0
  574. package/dist/entity-views/types.test.d.ts +2 -0
  575. package/dist/entity-views/types.test.d.ts.map +1 -0
  576. package/dist/entity-views/types.test.js +62 -0
  577. package/dist/entity-views/types.test.js.map +1 -0
  578. package/dist/file/database-schema.d.ts +25 -0
  579. package/dist/file/database-schema.d.ts.map +1 -0
  580. package/dist/file/database-schema.js +26 -0
  581. package/dist/file/database-schema.js.map +1 -0
  582. package/dist/file/database-schema.test.d.ts +2 -0
  583. package/dist/file/database-schema.test.d.ts.map +1 -0
  584. package/dist/file/database-schema.test.js +60 -0
  585. package/dist/file/database-schema.test.js.map +1 -0
  586. package/dist/file/file-handlers.d.ts +15 -0
  587. package/dist/file/file-handlers.d.ts.map +1 -0
  588. package/dist/file/file-handlers.js +354 -0
  589. package/dist/file/file-handlers.js.map +1 -0
  590. package/dist/file/file-handlers.test.d.ts +2 -0
  591. package/dist/file/file-handlers.test.d.ts.map +1 -0
  592. package/dist/file/file-handlers.test.js +151 -0
  593. package/dist/file/file-handlers.test.js.map +1 -0
  594. package/dist/file/index.d.ts +1 -1
  595. package/dist/file/index.d.ts.map +1 -1
  596. package/dist/file/index.js +1 -1
  597. package/dist/file/index.js.map +1 -1
  598. package/dist/file/materialize-file-data-at-changeset.d.ts +9 -0
  599. package/dist/file/materialize-file-data-at-changeset.d.ts.map +1 -0
  600. package/dist/file/materialize-file-data-at-changeset.js +119 -0
  601. package/dist/file/materialize-file-data-at-changeset.js.map +1 -0
  602. package/dist/file/materialize-file-data-at-commit.d.ts +9 -0
  603. package/dist/file/materialize-file-data-at-commit.d.ts.map +1 -0
  604. package/dist/file/materialize-file-data-at-commit.js +119 -0
  605. package/dist/file/materialize-file-data-at-commit.js.map +1 -0
  606. package/dist/file/materialize-file-data.d.ts +8 -0
  607. package/dist/file/materialize-file-data.d.ts.map +1 -0
  608. package/dist/file/materialize-file-data.js +91 -0
  609. package/dist/file/materialize-file-data.js.map +1 -0
  610. package/dist/file/materialize-file-data.test.d.ts +2 -0
  611. package/dist/file/materialize-file-data.test.d.ts.map +1 -0
  612. package/dist/file/materialize-file-data.test.js +90 -0
  613. package/dist/file/materialize-file-data.test.js.map +1 -0
  614. package/dist/file/schema.d.ts +109 -0
  615. package/dist/file/schema.d.ts.map +1 -0
  616. package/dist/file/schema.js +333 -0
  617. package/dist/file/schema.js.map +1 -0
  618. package/dist/file/schema.test.d.ts +2 -0
  619. package/dist/file/schema.test.d.ts.map +1 -0
  620. package/dist/file/schema.test.js +1313 -0
  621. package/dist/file/schema.test.js.map +1 -0
  622. package/dist/file/store-detected-change-schema.d.ts +8 -0
  623. package/dist/file/store-detected-change-schema.d.ts.map +1 -0
  624. package/dist/file/store-detected-change-schema.js +41 -0
  625. package/dist/file/store-detected-change-schema.js.map +1 -0
  626. package/dist/file/store-detected-change-schema.test.d.ts +2 -0
  627. package/dist/file/store-detected-change-schema.test.d.ts.map +1 -0
  628. package/dist/file/store-detected-change-schema.test.js +211 -0
  629. package/dist/file/store-detected-change-schema.test.js.map +1 -0
  630. package/dist/file/unknown-file-fallback-plugin.d.ts +22 -0
  631. package/dist/file/unknown-file-fallback-plugin.d.ts.map +1 -0
  632. package/dist/file/unknown-file-fallback-plugin.js +73 -0
  633. package/dist/file/unknown-file-fallback-plugin.js.map +1 -0
  634. package/dist/file/unknown-file-fallback-plugin.test.d.ts +2 -0
  635. package/dist/file/unknown-file-fallback-plugin.test.d.ts.map +1 -0
  636. package/dist/file/unknown-file-fallback-plugin.test.js +305 -0
  637. package/dist/file/unknown-file-fallback-plugin.test.js.map +1 -0
  638. package/dist/file-queue/database-schema.d.ts +17 -0
  639. package/dist/file-queue/database-schema.d.ts.map +1 -0
  640. package/dist/file-queue/database-schema.js +53 -0
  641. package/dist/file-queue/database-schema.js.map +1 -0
  642. package/dist/file-queue/file-handlers.d.ts +1 -1
  643. package/dist/file-queue/file-handlers.d.ts.map +1 -1
  644. package/dist/file-queue/file-handlers.js +60 -29
  645. package/dist/file-queue/file-handlers.js.map +1 -1
  646. package/dist/file-queue/file-queue-process.d.ts.map +1 -1
  647. package/dist/file-queue/file-queue-process.js +26 -17
  648. package/dist/file-queue/file-queue-process.js.map +1 -1
  649. package/dist/file-queue/file-queue-process.test.js +133 -43
  650. package/dist/file-queue/file-queue-process.test.js.map +1 -1
  651. package/dist/file-queue/with-skip-file-queue.d.ts +18 -0
  652. package/dist/file-queue/with-skip-file-queue.d.ts.map +1 -1
  653. package/dist/file-queue/with-skip-file-queue.js +56 -10
  654. package/dist/file-queue/with-skip-file-queue.js.map +1 -1
  655. package/dist/file-queue/with-skip-file-queue.test.js +28 -12
  656. package/dist/file-queue/with-skip-file-queue.test.js.map +1 -1
  657. package/dist/hooks/create-hooks.d.ts +50 -0
  658. package/dist/hooks/create-hooks.d.ts.map +1 -0
  659. package/dist/hooks/create-hooks.js +25 -0
  660. package/dist/hooks/create-hooks.js.map +1 -0
  661. package/dist/hooks/create-hooks.test.d.ts +2 -0
  662. package/dist/hooks/create-hooks.test.d.ts.map +1 -0
  663. package/dist/hooks/create-hooks.test.js +98 -0
  664. package/dist/hooks/create-hooks.test.js.map +1 -0
  665. package/dist/hooks/index.d.ts +2 -0
  666. package/dist/hooks/index.d.ts.map +1 -0
  667. package/dist/hooks/index.js +2 -0
  668. package/dist/hooks/index.js.map +1 -0
  669. package/dist/index.d.ts +13 -6
  670. package/dist/index.d.ts.map +1 -1
  671. package/dist/index.js +13 -6
  672. package/dist/index.js.map +1 -1
  673. package/dist/key-value/database-schema.d.ts +3 -2
  674. package/dist/key-value/database-schema.d.ts.map +1 -1
  675. package/dist/key-value/database-schema.js +3 -3
  676. package/dist/key-value/database-schema.test.js +13 -4
  677. package/dist/key-value/database-schema.test.js.map +1 -1
  678. package/dist/key-value/index.d.ts +2 -0
  679. package/dist/key-value/index.d.ts.map +1 -0
  680. package/dist/key-value/index.js +2 -0
  681. package/dist/key-value/index.js.map +1 -0
  682. package/dist/key-value/schema.d.ts +81 -0
  683. package/dist/key-value/schema.d.ts.map +1 -0
  684. package/dist/key-value/schema.js +31 -0
  685. package/dist/key-value/schema.js.map +1 -0
  686. package/dist/key-value/schema.test.d.ts +2 -0
  687. package/dist/key-value/schema.test.d.ts.map +1 -0
  688. package/dist/key-value/schema.test.js +237 -0
  689. package/dist/key-value/schema.test.js.map +1 -0
  690. package/dist/key-value-v2/schema.d.ts +27 -0
  691. package/dist/key-value-v2/schema.d.ts.map +1 -0
  692. package/dist/key-value-v2/schema.js +73 -0
  693. package/dist/key-value-v2/schema.js.map +1 -0
  694. package/dist/key-value-v2/schema.test.d.ts +2 -0
  695. package/dist/key-value-v2/schema.test.d.ts.map +1 -0
  696. package/dist/key-value-v2/schema.test.js +144 -0
  697. package/dist/key-value-v2/schema.test.js.map +1 -0
  698. package/dist/label/create-label.d.ts +20 -0
  699. package/dist/label/create-label.d.ts.map +1 -0
  700. package/dist/label/create-label.js +45 -0
  701. package/dist/label/create-label.js.map +1 -0
  702. package/dist/label/create-label.test.d.ts +2 -0
  703. package/dist/label/create-label.test.d.ts.map +1 -0
  704. package/dist/label/create-label.test.js +191 -0
  705. package/dist/label/create-label.test.js.map +1 -0
  706. package/dist/label/index.d.ts +3 -0
  707. package/dist/label/index.d.ts.map +1 -0
  708. package/dist/label/index.js +3 -0
  709. package/dist/label/index.js.map +1 -0
  710. package/dist/label/schema.d.ts +22 -0
  711. package/dist/label/schema.d.ts.map +1 -0
  712. package/dist/label/schema.js +26 -0
  713. package/dist/label/schema.js.map +1 -0
  714. package/dist/label/schema.test.d.ts +2 -0
  715. package/dist/label/schema.test.d.ts.map +1 -0
  716. package/dist/label/schema.test.js +76 -0
  717. package/dist/label/schema.test.js.map +1 -0
  718. package/dist/lix/index.d.ts +3 -3
  719. package/dist/lix/index.d.ts.map +1 -1
  720. package/dist/lix/index.js +3 -6
  721. package/dist/lix/index.js.map +1 -1
  722. package/dist/lix/merge.test.js +4 -1
  723. package/dist/lix/merge.test.js.map +1 -1
  724. package/dist/lix/new-lix.d.ts +79 -4
  725. package/dist/lix/new-lix.d.ts.map +1 -1
  726. package/dist/lix/new-lix.js +487 -8
  727. package/dist/lix/new-lix.js.map +1 -1
  728. package/dist/lix/new-lix.test.js +346 -17
  729. package/dist/lix/new-lix.test.js.map +1 -1
  730. package/dist/lix/open-lix-in-memory.test.js +2 -7
  731. package/dist/lix/open-lix-in-memory.test.js.map +1 -1
  732. package/dist/lix/open-lix.d.ts +68 -7
  733. package/dist/lix/open-lix.d.ts.map +1 -1
  734. package/dist/lix/open-lix.js +190 -32
  735. package/dist/lix/open-lix.js.map +1 -1
  736. package/dist/lix/open-lix.test.js +296 -25
  737. package/dist/lix/open-lix.test.js.map +1 -1
  738. package/dist/lix/storage/in-memory.d.ts +35 -0
  739. package/dist/lix/storage/in-memory.d.ts.map +1 -0
  740. package/dist/lix/storage/in-memory.js +50 -0
  741. package/dist/lix/storage/in-memory.js.map +1 -0
  742. package/dist/lix/storage/in-memory.test.d.ts +2 -0
  743. package/dist/lix/storage/in-memory.test.d.ts.map +1 -0
  744. package/dist/lix/storage/in-memory.test.js +85 -0
  745. package/dist/lix/storage/in-memory.test.js.map +1 -0
  746. package/dist/lix/storage/lix-storage-adapter.d.ts +46 -0
  747. package/dist/lix/storage/lix-storage-adapter.d.ts.map +1 -0
  748. package/dist/lix/storage/lix-storage-adapter.js +2 -0
  749. package/dist/lix/storage/lix-storage-adapter.js.map +1 -0
  750. package/dist/lix/storage/opfs.d.ts +95 -0
  751. package/dist/lix/storage/opfs.d.ts.map +1 -0
  752. package/dist/lix/storage/opfs.js +263 -0
  753. package/dist/lix/storage/opfs.js.map +1 -0
  754. package/dist/lix/storage/opfs.test.d.ts +2 -0
  755. package/dist/lix/storage/opfs.test.d.ts.map +1 -0
  756. package/dist/lix/storage/opfs.test.js +350 -0
  757. package/dist/lix/storage/opfs.test.js.map +1 -0
  758. package/dist/log/create-lix-own-log.d.ts +74 -0
  759. package/dist/log/create-lix-own-log.d.ts.map +1 -0
  760. package/dist/log/create-lix-own-log.js +92 -0
  761. package/dist/log/create-lix-own-log.js.map +1 -0
  762. package/dist/log/create-lix-own-log.test.d.ts +2 -0
  763. package/dist/log/create-lix-own-log.test.d.ts.map +1 -0
  764. package/dist/log/create-lix-own-log.test.js +85 -0
  765. package/dist/log/create-lix-own-log.test.js.map +1 -0
  766. package/dist/log/create-log.d.ts +32 -0
  767. package/dist/log/create-log.d.ts.map +1 -0
  768. package/dist/log/create-log.js +43 -0
  769. package/dist/log/create-log.js.map +1 -0
  770. package/dist/log/database-schema.d.ts +33 -0
  771. package/dist/log/database-schema.d.ts.map +1 -0
  772. package/dist/log/database-schema.js +14 -0
  773. package/dist/log/database-schema.js.map +1 -0
  774. package/dist/log/database-schema.test.d.ts +2 -0
  775. package/dist/log/database-schema.test.d.ts.map +1 -0
  776. package/dist/log/database-schema.test.js +22 -0
  777. package/dist/log/database-schema.test.js.map +1 -0
  778. package/dist/log/index.d.ts +3 -0
  779. package/dist/log/index.d.ts.map +1 -0
  780. package/dist/log/index.js +3 -0
  781. package/dist/log/index.js.map +1 -0
  782. package/dist/log/schema.d.ts +32 -0
  783. package/dist/log/schema.d.ts.map +1 -0
  784. package/dist/log/schema.js +42 -0
  785. package/dist/log/schema.js.map +1 -0
  786. package/dist/log/schema.test.d.ts +2 -0
  787. package/dist/log/schema.test.d.ts.map +1 -0
  788. package/dist/log/schema.test.js +119 -0
  789. package/dist/log/schema.test.js.map +1 -0
  790. package/dist/observe/create-observe.d.ts +17 -0
  791. package/dist/observe/create-observe.d.ts.map +1 -0
  792. package/dist/observe/create-observe.js +147 -0
  793. package/dist/observe/create-observe.js.map +1 -0
  794. package/dist/observe/create-observe.test.d.ts +2 -0
  795. package/dist/observe/create-observe.test.d.ts.map +1 -0
  796. package/dist/observe/create-observe.test.js +638 -0
  797. package/dist/observe/create-observe.test.js.map +1 -0
  798. package/dist/observe/determine-schema-keys.d.ts +6 -0
  799. package/dist/observe/determine-schema-keys.d.ts.map +1 -0
  800. package/dist/observe/determine-schema-keys.js +145 -0
  801. package/dist/observe/determine-schema-keys.js.map +1 -0
  802. package/dist/observe/determine-schema-keys.test.d.ts +2 -0
  803. package/dist/observe/determine-schema-keys.test.d.ts.map +1 -0
  804. package/dist/observe/determine-schema-keys.test.js +266 -0
  805. package/dist/observe/determine-schema-keys.test.js.map +1 -0
  806. package/dist/observe/index.d.ts +2 -0
  807. package/dist/observe/index.d.ts.map +1 -0
  808. package/dist/observe/index.js +2 -0
  809. package/dist/observe/index.js.map +1 -0
  810. package/dist/observe/lix-observable.d.ts +31 -0
  811. package/dist/observe/lix-observable.d.ts.map +1 -0
  812. package/dist/observe/lix-observable.js +65 -0
  813. package/dist/observe/lix-observable.js.map +1 -0
  814. package/dist/observe/lix-observable.test.d.ts +2 -0
  815. package/dist/observe/lix-observable.test.d.ts.map +1 -0
  816. package/dist/observe/lix-observable.test.js +187 -0
  817. package/dist/observe/lix-observable.test.js.map +1 -0
  818. package/dist/own-change-control/apply-own-change.d.ts +5 -1
  819. package/dist/own-change-control/apply-own-change.d.ts.map +1 -1
  820. package/dist/own-change-control/apply-own-change.js +26 -12
  821. package/dist/own-change-control/apply-own-change.js.map +1 -1
  822. package/dist/own-change-control/apply-own-change.test.js +86 -48
  823. package/dist/own-change-control/apply-own-change.test.js.map +1 -1
  824. package/dist/own-change-control/change-controlled-tables.d.ts +5 -7
  825. package/dist/own-change-control/change-controlled-tables.d.ts.map +1 -1
  826. package/dist/own-change-control/change-controlled-tables.js +27 -21
  827. package/dist/own-change-control/change-controlled-tables.js.map +1 -1
  828. package/dist/own-change-control/change-controlled-tables.test.js +35 -5
  829. package/dist/own-change-control/change-controlled-tables.test.js.map +1 -1
  830. package/dist/own-change-control/database-triggers.d.ts +2 -1
  831. package/dist/own-change-control/database-triggers.d.ts.map +1 -1
  832. package/dist/own-change-control/database-triggers.js +209 -67
  833. package/dist/own-change-control/database-triggers.js.map +1 -1
  834. package/dist/own-change-control/database-triggers.test.js +139 -8
  835. package/dist/own-change-control/database-triggers.test.js.map +1 -1
  836. package/dist/own-change-control/with-skip-own-change-control.d.ts.map +1 -1
  837. package/dist/own-change-control/with-skip-own-change-control.js +28 -6
  838. package/dist/own-change-control/with-skip-own-change-control.js.map +1 -1
  839. package/dist/own-change-control/with-skip-own-change-control.test.js +38 -1
  840. package/dist/own-change-control/with-skip-own-change-control.test.js.map +1 -1
  841. package/dist/plugin/index.d.ts +2 -1
  842. package/dist/plugin/index.d.ts.map +1 -1
  843. package/dist/plugin/index.js +1 -1
  844. package/dist/plugin/index.js.map +1 -1
  845. package/dist/plugin/lix-plugin.d.ts +26 -47
  846. package/dist/plugin/lix-plugin.d.ts.map +1 -1
  847. package/dist/plugin/lix-plugin.js +1 -1
  848. package/dist/plugin/lix-plugin.js.map +1 -1
  849. package/dist/plugin/lix-plugin.test-d.js +17 -11
  850. package/dist/plugin/lix-plugin.test-d.js.map +1 -1
  851. package/dist/plugin/load-plugin.d.ts.map +1 -1
  852. package/dist/plugin/load-plugin.js.map +1 -1
  853. package/dist/plugin/mock-json-plugin.d.ts +17 -0
  854. package/dist/plugin/mock-json-plugin.d.ts.map +1 -0
  855. package/dist/plugin/mock-json-plugin.flatten.d.ts +3 -0
  856. package/dist/plugin/mock-json-plugin.flatten.d.ts.map +1 -0
  857. package/dist/plugin/mock-json-plugin.flatten.js +124 -0
  858. package/dist/plugin/mock-json-plugin.flatten.js.map +1 -0
  859. package/dist/plugin/mock-json-plugin.js +101 -0
  860. package/dist/plugin/mock-json-plugin.js.map +1 -0
  861. package/dist/plugin/mock-json-plugin.test.d.ts +2 -0
  862. package/dist/plugin/mock-json-plugin.test.d.ts.map +1 -0
  863. package/dist/plugin/mock-json-plugin.test.js +164 -0
  864. package/dist/plugin/mock-json-plugin.test.js.map +1 -0
  865. package/dist/prototype/database-schema.d.ts +43 -0
  866. package/dist/prototype/database-schema.d.ts.map +1 -0
  867. package/dist/prototype/database-schema.js +72 -0
  868. package/dist/prototype/database-schema.js.map +1 -0
  869. package/dist/prototype/file-handlers.d.ts +24 -0
  870. package/dist/prototype/file-handlers.d.ts.map +1 -0
  871. package/dist/prototype/file-handlers.js +129 -0
  872. package/dist/prototype/file-handlers.js.map +1 -0
  873. package/dist/prototype/file-schema.d.ts +47 -0
  874. package/dist/prototype/file-schema.d.ts.map +1 -0
  875. package/dist/prototype/file-schema.js +135 -0
  876. package/dist/prototype/file-schema.js.map +1 -0
  877. package/dist/prototype/file-schema.test.d.ts +2 -0
  878. package/dist/prototype/file-schema.test.d.ts.map +1 -0
  879. package/dist/prototype/file-schema.test.js +146 -0
  880. package/dist/prototype/file-schema.test.js.map +1 -0
  881. package/dist/prototype/get-and-materialize-row.d.ts +5 -0
  882. package/dist/prototype/get-and-materialize-row.d.ts.map +1 -0
  883. package/dist/prototype/get-and-materialize-row.js +99 -0
  884. package/dist/prototype/get-and-materialize-row.js.map +1 -0
  885. package/dist/prototype/json-plugin.d.ts +49 -0
  886. package/dist/prototype/json-plugin.d.ts.map +1 -0
  887. package/dist/prototype/json-plugin.js +104 -0
  888. package/dist/prototype/json-plugin.js.map +1 -0
  889. package/dist/prototype/validate-file-path.d.ts +16 -0
  890. package/dist/prototype/validate-file-path.d.ts.map +1 -0
  891. package/dist/prototype/validate-file-path.js +44 -0
  892. package/dist/prototype/validate-file-path.js.map +1 -0
  893. package/dist/prototype/validate-file-path.test.d.ts +2 -0
  894. package/dist/prototype/validate-file-path.test.d.ts.map +1 -0
  895. package/dist/prototype/validate-file-path.test.js +36 -0
  896. package/dist/prototype/validate-file-path.test.js.map +1 -0
  897. package/dist/prototype/version-schema.d.ts +34 -0
  898. package/dist/prototype/version-schema.d.ts.map +1 -0
  899. package/dist/prototype/version-schema.js +86 -0
  900. package/dist/prototype/version-schema.js.map +1 -0
  901. package/dist/prototype/version-schema.test.d.ts +2 -0
  902. package/dist/prototype/version-schema.test.d.ts.map +1 -0
  903. package/dist/prototype/version-schema.test.js +114 -0
  904. package/dist/prototype/version-schema.test.js.map +1 -0
  905. package/dist/query-filter/change-conflict-in-version.d.ts +2 -0
  906. package/dist/query-filter/change-conflict-in-version.d.ts.map +1 -1
  907. package/dist/query-filter/change-conflict-in-version.js +2 -0
  908. package/dist/query-filter/change-conflict-in-version.js.map +1 -1
  909. package/dist/query-filter/change-has-label.d.ts +9 -3
  910. package/dist/query-filter/change-has-label.d.ts.map +1 -1
  911. package/dist/query-filter/change-has-label.js +7 -4
  912. package/dist/query-filter/change-has-label.js.map +1 -1
  913. package/dist/query-filter/change-has-label.test.js +36 -11
  914. package/dist/query-filter/change-has-label.test.js.map +1 -1
  915. package/dist/query-filter/change-in-version.d.ts +2 -0
  916. package/dist/query-filter/change-in-version.d.ts.map +1 -1
  917. package/dist/query-filter/change-in-version.js +2 -0
  918. package/dist/query-filter/change-in-version.js.map +1 -1
  919. package/dist/query-filter/change-is-leaf-in-version.d.ts +1 -0
  920. package/dist/query-filter/change-is-leaf-in-version.d.ts.map +1 -1
  921. package/dist/query-filter/change-is-leaf-in-version.js +1 -0
  922. package/dist/query-filter/change-is-leaf-in-version.js.map +1 -1
  923. package/dist/query-filter/change-is-leaf-of.d.ts +2 -0
  924. package/dist/query-filter/change-is-leaf-of.d.ts.map +1 -1
  925. package/dist/query-filter/change-is-leaf-of.js +2 -0
  926. package/dist/query-filter/change-is-leaf-of.js.map +1 -1
  927. package/dist/query-filter/change-is-leaf-v2.d.ts +69 -0
  928. package/dist/query-filter/change-is-leaf-v2.d.ts.map +1 -0
  929. package/dist/query-filter/change-is-leaf-v2.js +116 -0
  930. package/dist/query-filter/change-is-leaf-v2.js.map +1 -0
  931. package/dist/query-filter/change-is-leaf-v2.test.d.ts +2 -0
  932. package/dist/query-filter/change-is-leaf-v2.test.d.ts.map +1 -0
  933. package/dist/query-filter/change-is-leaf-v2.test.js +237 -0
  934. package/dist/query-filter/change-is-leaf-v2.test.js.map +1 -0
  935. package/dist/query-filter/change-is-leaf.d.ts +2 -0
  936. package/dist/query-filter/change-is-leaf.d.ts.map +1 -1
  937. package/dist/query-filter/change-is-leaf.js +2 -0
  938. package/dist/query-filter/change-is-leaf.js.map +1 -1
  939. package/dist/query-filter/change-is-lowest-common-ancestor-of.d.ts +2 -0
  940. package/dist/query-filter/change-is-lowest-common-ancestor-of.d.ts.map +1 -1
  941. package/dist/query-filter/change-is-lowest-common-ancestor-of.js +4 -0
  942. package/dist/query-filter/change-is-lowest-common-ancestor-of.js.map +1 -1
  943. package/dist/query-filter/change-is-lowest-common-ancestor-of.test.js +5 -3
  944. package/dist/query-filter/change-is-lowest-common-ancestor-of.test.js.map +1 -1
  945. package/dist/query-filter/change-set-element-in-ancestry-of.d.ts +30 -0
  946. package/dist/query-filter/change-set-element-in-ancestry-of.d.ts.map +1 -0
  947. package/dist/query-filter/change-set-element-in-ancestry-of.js +51 -0
  948. package/dist/query-filter/change-set-element-in-ancestry-of.js.map +1 -0
  949. package/dist/query-filter/change-set-element-in-ancestry-of.test.d.ts +2 -0
  950. package/dist/query-filter/change-set-element-in-ancestry-of.test.d.ts.map +1 -0
  951. package/dist/query-filter/change-set-element-in-ancestry-of.test.js +396 -0
  952. package/dist/query-filter/change-set-element-in-ancestry-of.test.js.map +1 -0
  953. package/dist/query-filter/change-set-element-in-symmetric-difference-of.d.ts +21 -0
  954. package/dist/query-filter/change-set-element-in-symmetric-difference-of.d.ts.map +1 -0
  955. package/dist/query-filter/change-set-element-in-symmetric-difference-of.js +37 -0
  956. package/dist/query-filter/change-set-element-in-symmetric-difference-of.js.map +1 -0
  957. package/dist/query-filter/change-set-element-in-symmetric-difference-of.test.d.ts +2 -0
  958. package/dist/query-filter/change-set-element-in-symmetric-difference-of.test.d.ts.map +1 -0
  959. package/dist/query-filter/change-set-element-in-symmetric-difference-of.test.js +276 -0
  960. package/dist/query-filter/change-set-element-in-symmetric-difference-of.test.js.map +1 -0
  961. package/dist/query-filter/change-set-element-in-symmetric-difference.d.ts +20 -0
  962. package/dist/query-filter/change-set-element-in-symmetric-difference.d.ts.map +1 -0
  963. package/dist/query-filter/change-set-element-in-symmetric-difference.js +36 -0
  964. package/dist/query-filter/change-set-element-in-symmetric-difference.js.map +1 -0
  965. package/dist/query-filter/change-set-element-in-symmetric-difference.test.d.ts +2 -0
  966. package/dist/query-filter/change-set-element-in-symmetric-difference.test.d.ts.map +1 -0
  967. package/dist/query-filter/change-set-element-in-symmetric-difference.test.js +369 -0
  968. package/dist/query-filter/change-set-element-in-symmetric-difference.test.js.map +1 -0
  969. package/dist/query-filter/change-set-element-is-leaf-of.d.ts +29 -0
  970. package/dist/query-filter/change-set-element-is-leaf-of.d.ts.map +1 -0
  971. package/dist/query-filter/change-set-element-is-leaf-of.js +113 -0
  972. package/dist/query-filter/change-set-element-is-leaf-of.js.map +1 -0
  973. package/dist/query-filter/change-set-element-is-leaf-of.test.d.ts +2 -0
  974. package/dist/query-filter/change-set-element-is-leaf-of.test.d.ts.map +1 -0
  975. package/dist/query-filter/change-set-element-is-leaf-of.test.js +574 -0
  976. package/dist/query-filter/change-set-element-is-leaf-of.test.js.map +1 -0
  977. package/dist/query-filter/change-set-has-label.d.ts +19 -3
  978. package/dist/query-filter/change-set-has-label.d.ts.map +1 -1
  979. package/dist/query-filter/change-set-has-label.js +17 -4
  980. package/dist/query-filter/change-set-has-label.js.map +1 -1
  981. package/dist/query-filter/change-set-has-label.test.js +13 -20
  982. package/dist/query-filter/change-set-has-label.test.js.map +1 -1
  983. package/dist/query-filter/change-set-is-ancestor-of.d.ts +51 -0
  984. package/dist/query-filter/change-set-is-ancestor-of.d.ts.map +1 -0
  985. package/dist/query-filter/change-set-is-ancestor-of.js +63 -0
  986. package/dist/query-filter/change-set-is-ancestor-of.js.map +1 -0
  987. package/dist/query-filter/change-set-is-ancestor-of.test.d.ts +2 -0
  988. package/dist/query-filter/change-set-is-ancestor-of.test.d.ts.map +1 -0
  989. package/dist/query-filter/change-set-is-ancestor-of.test.js +153 -0
  990. package/dist/query-filter/change-set-is-ancestor-of.test.js.map +1 -0
  991. package/dist/query-filter/change-set-is-descendant-of.d.ts +44 -0
  992. package/dist/query-filter/change-set-is-descendant-of.d.ts.map +1 -0
  993. package/dist/query-filter/change-set-is-descendant-of.js +56 -0
  994. package/dist/query-filter/change-set-is-descendant-of.js.map +1 -0
  995. package/dist/query-filter/change-set-is-descendant-of.test.d.ts +2 -0
  996. package/dist/query-filter/change-set-is-descendant-of.test.d.ts.map +1 -0
  997. package/dist/query-filter/change-set-is-descendant-of.test.js +137 -0
  998. package/dist/query-filter/change-set-is-descendant-of.test.js.map +1 -0
  999. package/dist/query-filter/commit-is-ancestor-of.d.ts +51 -0
  1000. package/dist/query-filter/commit-is-ancestor-of.d.ts.map +1 -0
  1001. package/dist/query-filter/commit-is-ancestor-of.js +63 -0
  1002. package/dist/query-filter/commit-is-ancestor-of.js.map +1 -0
  1003. package/dist/query-filter/commit-is-ancestor-of.test.d.ts +2 -0
  1004. package/dist/query-filter/commit-is-ancestor-of.test.d.ts.map +1 -0
  1005. package/dist/query-filter/commit-is-ancestor-of.test.js +292 -0
  1006. package/dist/query-filter/commit-is-ancestor-of.test.js.map +1 -0
  1007. package/dist/query-filter/commit-is-descendant-of.d.ts +44 -0
  1008. package/dist/query-filter/commit-is-descendant-of.d.ts.map +1 -0
  1009. package/dist/query-filter/commit-is-descendant-of.js +56 -0
  1010. package/dist/query-filter/commit-is-descendant-of.js.map +1 -0
  1011. package/dist/query-filter/commit-is-descendant-of.test.d.ts +2 -0
  1012. package/dist/query-filter/commit-is-descendant-of.test.d.ts.map +1 -0
  1013. package/dist/query-filter/commit-is-descendant-of.test.js +325 -0
  1014. package/dist/query-filter/commit-is-descendant-of.test.js.map +1 -0
  1015. package/dist/query-filter/index.d.ts +5 -8
  1016. package/dist/query-filter/index.d.ts.map +1 -1
  1017. package/dist/query-filter/index.js +5 -8
  1018. package/dist/query-filter/index.js.map +1 -1
  1019. package/dist/query-filter/version-change-in-difference.d.ts +2 -0
  1020. package/dist/query-filter/version-change-in-difference.d.ts.map +1 -1
  1021. package/dist/query-filter/version-change-in-difference.js +2 -0
  1022. package/dist/query-filter/version-change-in-difference.js.map +1 -1
  1023. package/dist/query-filter/version-change-in-symmetric-difference.d.ts +2 -0
  1024. package/dist/query-filter/version-change-in-symmetric-difference.d.ts.map +1 -1
  1025. package/dist/query-filter/version-change-in-symmetric-difference.js +2 -0
  1026. package/dist/query-filter/version-change-in-symmetric-difference.js.map +1 -1
  1027. package/dist/schema-definition/definition.d.ts +449 -0
  1028. package/dist/schema-definition/definition.d.ts.map +1 -0
  1029. package/dist/schema-definition/definition.js +106 -0
  1030. package/dist/schema-definition/definition.js.map +1 -0
  1031. package/dist/schema-definition/definition.test-d.d.ts +2 -0
  1032. package/dist/schema-definition/definition.test-d.d.ts.map +1 -0
  1033. package/dist/schema-definition/definition.test-d.js +177 -0
  1034. package/dist/schema-definition/definition.test-d.js.map +1 -0
  1035. package/dist/schema-definition/definition.test.d.ts +2 -0
  1036. package/dist/schema-definition/definition.test.d.ts.map +1 -0
  1037. package/dist/schema-definition/definition.test.js +369 -0
  1038. package/dist/schema-definition/definition.test.js.map +1 -0
  1039. package/dist/schema-definition/index.d.ts +4 -0
  1040. package/dist/schema-definition/index.d.ts.map +1 -0
  1041. package/dist/schema-definition/index.js +4 -0
  1042. package/dist/schema-definition/index.js.map +1 -0
  1043. package/dist/schema-definition/json-type.d.ts +24 -0
  1044. package/dist/schema-definition/json-type.d.ts.map +1 -0
  1045. package/dist/schema-definition/json-type.js +42 -0
  1046. package/dist/schema-definition/json-type.js.map +1 -0
  1047. package/dist/schema-definition/json-type.test.d.ts +2 -0
  1048. package/dist/schema-definition/json-type.test.d.ts.map +1 -0
  1049. package/dist/schema-definition/json-type.test.js +21 -0
  1050. package/dist/schema-definition/json-type.test.js.map +1 -0
  1051. package/dist/schema-definition/validate-lix-schema.d.ts +65 -0
  1052. package/dist/schema-definition/validate-lix-schema.d.ts.map +1 -0
  1053. package/dist/schema-definition/validate-lix-schema.js +93 -0
  1054. package/dist/schema-definition/validate-lix-schema.js.map +1 -0
  1055. package/dist/schema-definition/validate-lix-schema.test.d.ts +2 -0
  1056. package/dist/schema-definition/validate-lix-schema.test.d.ts.map +1 -0
  1057. package/dist/schema-definition/validate-lix-schema.test.js +73 -0
  1058. package/dist/schema-definition/validate-lix-schema.test.js.map +1 -0
  1059. package/dist/server-protocol-handler/create-server-protocol-handler.d.ts +0 -1
  1060. package/dist/server-protocol-handler/create-server-protocol-handler.d.ts.map +1 -1
  1061. package/dist/server-protocol-handler/create-server-protocol-handler.js +0 -2
  1062. package/dist/server-protocol-handler/create-server-protocol-handler.js.map +1 -1
  1063. package/dist/server-protocol-handler/environment/create-in-memory-environment.d.ts.map +1 -1
  1064. package/dist/server-protocol-handler/environment/create-in-memory-environment.js +5 -20
  1065. package/dist/server-protocol-handler/environment/create-in-memory-environment.js.map +1 -1
  1066. package/dist/server-protocol-handler/environment/create-in-memory-environment.test.js +13 -14
  1067. package/dist/server-protocol-handler/environment/create-in-memory-environment.test.js.map +1 -1
  1068. package/dist/server-protocol-handler/environment/environment.d.ts +0 -4
  1069. package/dist/server-protocol-handler/environment/environment.d.ts.map +1 -1
  1070. package/dist/server-protocol-handler/routes/get-v1.d.ts.map +1 -1
  1071. package/dist/server-protocol-handler/routes/get-v1.js +1 -1
  1072. package/dist/server-protocol-handler/routes/get-v1.js.map +1 -1
  1073. package/dist/server-protocol-handler/routes/get-v1.test.js +11 -12
  1074. package/dist/server-protocol-handler/routes/get-v1.test.js.map +1 -1
  1075. package/dist/server-protocol-handler/routes/new-v1.d.ts.map +1 -1
  1076. package/dist/server-protocol-handler/routes/new-v1.js +3 -5
  1077. package/dist/server-protocol-handler/routes/new-v1.js.map +1 -1
  1078. package/dist/server-protocol-handler/routes/new-v1.test.js +7 -8
  1079. package/dist/server-protocol-handler/routes/new-v1.test.js.map +1 -1
  1080. package/dist/server-protocol-handler/routes/pull-v1.test.js +48 -32
  1081. package/dist/server-protocol-handler/routes/pull-v1.test.js.map +1 -1
  1082. package/dist/server-protocol-handler/routes/push-v1.d.ts.map +1 -1
  1083. package/dist/server-protocol-handler/routes/push-v1.js +2 -0
  1084. package/dist/server-protocol-handler/routes/push-v1.js.map +1 -1
  1085. package/dist/server-protocol-handler/routes/push-v1.test.js +22 -26
  1086. package/dist/server-protocol-handler/routes/push-v1.test.js.map +1 -1
  1087. package/dist/services/env-variables/index.d.ts +1 -1
  1088. package/dist/services/env-variables/index.js +2 -2
  1089. package/dist/services/env-variables/index.js.map +1 -1
  1090. package/dist/services/telemetry/capture.d.ts.map +1 -1
  1091. package/dist/snapshot/create-snapshot.d.ts +3 -14
  1092. package/dist/snapshot/create-snapshot.d.ts.map +1 -1
  1093. package/dist/snapshot/create-snapshot.js +14 -19
  1094. package/dist/snapshot/create-snapshot.js.map +1 -1
  1095. package/dist/snapshot/create-snapshot.test.js +48 -19
  1096. package/dist/snapshot/create-snapshot.test.js.map +1 -1
  1097. package/dist/snapshot/database-schema.d.ts +19 -0
  1098. package/dist/snapshot/database-schema.d.ts.map +1 -0
  1099. package/dist/snapshot/database-schema.js +33 -0
  1100. package/dist/snapshot/database-schema.js.map +1 -0
  1101. package/dist/snapshot/database-schema.test.d.ts +2 -0
  1102. package/dist/snapshot/database-schema.test.d.ts.map +1 -0
  1103. package/dist/snapshot/database-schema.test.js +58 -0
  1104. package/dist/snapshot/database-schema.test.js.map +1 -0
  1105. package/dist/snapshot/index.d.ts +1 -0
  1106. package/dist/snapshot/index.d.ts.map +1 -1
  1107. package/dist/snapshot/index.js +1 -0
  1108. package/dist/snapshot/index.js.map +1 -1
  1109. package/dist/snapshot/json-sha-256.d.ts +2 -1
  1110. package/dist/snapshot/json-sha-256.d.ts.map +1 -1
  1111. package/dist/snapshot/json-sha-256.js +1 -3
  1112. package/dist/snapshot/json-sha-256.js.map +1 -1
  1113. package/dist/snapshot/json-sha-256.test.js +40 -2
  1114. package/dist/snapshot/json-sha-256.test.js.map +1 -1
  1115. package/dist/snapshot/mock-json-snapshot.d.ts +1 -1
  1116. package/dist/snapshot/mock-json-snapshot.d.ts.map +1 -1
  1117. package/dist/snapshot/schema.d.ts +8 -0
  1118. package/dist/snapshot/schema.d.ts.map +1 -0
  1119. package/dist/snapshot/schema.js +20 -0
  1120. package/dist/snapshot/schema.js.map +1 -0
  1121. package/dist/snapshot/schema.test.d.ts +2 -0
  1122. package/dist/snapshot/schema.test.d.ts.map +1 -0
  1123. package/dist/snapshot/schema.test.js +202 -0
  1124. package/dist/snapshot/schema.test.js.map +1 -0
  1125. package/dist/state/cache/clear-state-cache.d.ts +8 -0
  1126. package/dist/state/cache/clear-state-cache.d.ts.map +1 -0
  1127. package/dist/state/cache/clear-state-cache.js +14 -0
  1128. package/dist/state/cache/clear-state-cache.js.map +1 -0
  1129. package/dist/state/cache/clear-state-cache.test.d.ts +2 -0
  1130. package/dist/state/cache/clear-state-cache.test.d.ts.map +1 -0
  1131. package/dist/state/cache/clear-state-cache.test.js +34 -0
  1132. package/dist/state/cache/clear-state-cache.test.js.map +1 -0
  1133. package/dist/state/cache/is-stale-state-cache.d.ts +5 -0
  1134. package/dist/state/cache/is-stale-state-cache.d.ts.map +1 -0
  1135. package/dist/state/cache/is-stale-state-cache.js +22 -0
  1136. package/dist/state/cache/is-stale-state-cache.js.map +1 -0
  1137. package/dist/state/cache/is-stale-state-cache.test.d.ts +2 -0
  1138. package/dist/state/cache/is-stale-state-cache.test.d.ts.map +1 -0
  1139. package/dist/state/cache/is-stale-state-cache.test.js +27 -0
  1140. package/dist/state/cache/is-stale-state-cache.test.js.map +1 -0
  1141. package/dist/state/cache/mark-state-cache-as-stale.d.ts +10 -0
  1142. package/dist/state/cache/mark-state-cache-as-stale.d.ts.map +1 -0
  1143. package/dist/state/cache/mark-state-cache-as-stale.js +42 -0
  1144. package/dist/state/cache/mark-state-cache-as-stale.js.map +1 -0
  1145. package/dist/state/cache/populate-state-cache.d.ts +9 -0
  1146. package/dist/state/cache/populate-state-cache.d.ts.map +1 -0
  1147. package/dist/state/cache/populate-state-cache.js +106 -0
  1148. package/dist/state/cache/populate-state-cache.js.map +1 -0
  1149. package/dist/state/cache/populate-state-cache.test.d.ts +2 -0
  1150. package/dist/state/cache/populate-state-cache.test.d.ts.map +1 -0
  1151. package/dist/state/cache/populate-state-cache.test.js +204 -0
  1152. package/dist/state/cache/populate-state-cache.test.js.map +1 -0
  1153. package/dist/state/cache/schema.d.ts +20 -0
  1154. package/dist/state/cache/schema.d.ts.map +1 -0
  1155. package/dist/state/cache/schema.js +21 -0
  1156. package/dist/state/cache/schema.js.map +1 -0
  1157. package/dist/state/cache/update-state-cache.d.ts +21 -0
  1158. package/dist/state/cache/update-state-cache.d.ts.map +1 -0
  1159. package/dist/state/cache/update-state-cache.js +294 -0
  1160. package/dist/state/cache/update-state-cache.js.map +1 -0
  1161. package/dist/state/cache/update-state-cache.test.d.ts +2 -0
  1162. package/dist/state/cache/update-state-cache.test.d.ts.map +1 -0
  1163. package/dist/state/cache/update-state-cache.test.js +440 -0
  1164. package/dist/state/cache/update-state-cache.test.js.map +1 -0
  1165. package/dist/state/commit.d.ts +18 -0
  1166. package/dist/state/commit.d.ts.map +1 -0
  1167. package/dist/state/commit.js +457 -0
  1168. package/dist/state/commit.js.map +1 -0
  1169. package/dist/state/commit.test.d.ts +2 -0
  1170. package/dist/state/commit.test.d.ts.map +1 -0
  1171. package/dist/state/commit.test.js +1173 -0
  1172. package/dist/state/commit.test.js.map +1 -0
  1173. package/dist/state/create-changeset-for-transaction.d.ts +15 -0
  1174. package/dist/state/create-changeset-for-transaction.d.ts.map +1 -0
  1175. package/dist/state/create-changeset-for-transaction.js +237 -0
  1176. package/dist/state/create-changeset-for-transaction.js.map +1 -0
  1177. package/dist/state/get-version-record-by-id-or-throw.d.ts +6 -0
  1178. package/dist/state/get-version-record-by-id-or-throw.d.ts.map +1 -0
  1179. package/dist/state/get-version-record-by-id-or-throw.js +36 -0
  1180. package/dist/state/get-version-record-by-id-or-throw.js.map +1 -0
  1181. package/dist/state/handle-state-mutation.d.ts +6 -0
  1182. package/dist/state/handle-state-mutation.d.ts.map +1 -0
  1183. package/dist/state/handle-state-mutation.js +157 -0
  1184. package/dist/state/handle-state-mutation.js.map +1 -0
  1185. package/dist/state/handle-state-mutation.test.d.ts +2 -0
  1186. package/dist/state/handle-state-mutation.test.d.ts.map +1 -0
  1187. package/dist/state/handle-state-mutation.test.js +686 -0
  1188. package/dist/state/handle-state-mutation.test.js.map +1 -0
  1189. package/dist/state/insert-transaction-state.d.ts +71 -0
  1190. package/dist/state/insert-transaction-state.d.ts.map +1 -0
  1191. package/dist/state/insert-transaction-state.js +272 -0
  1192. package/dist/state/insert-transaction-state.js.map +1 -0
  1193. package/dist/state/insert-transaction-state.test.d.ts +2 -0
  1194. package/dist/state/insert-transaction-state.test.d.ts.map +1 -0
  1195. package/dist/state/insert-transaction-state.test.js +789 -0
  1196. package/dist/state/insert-transaction-state.test.js.map +1 -0
  1197. package/dist/state/materialize-state.d.ts +3 -0
  1198. package/dist/state/materialize-state.d.ts.map +1 -0
  1199. package/dist/state/materialize-state.js +230 -0
  1200. package/dist/state/materialize-state.js.map +1 -0
  1201. package/dist/state/materialize-state.test.d.ts +2 -0
  1202. package/dist/state/materialize-state.test.d.ts.map +1 -0
  1203. package/dist/state/materialize-state.test.js +1934 -0
  1204. package/dist/state/materialize-state.test.js.map +1 -0
  1205. package/dist/state/primary-key.d.ts +39 -0
  1206. package/dist/state/primary-key.d.ts.map +1 -0
  1207. package/dist/state/primary-key.js +62 -0
  1208. package/dist/state/primary-key.js.map +1 -0
  1209. package/dist/state/primary-key.test.d.ts +2 -0
  1210. package/dist/state/primary-key.test.d.ts.map +1 -0
  1211. package/dist/state/primary-key.test.js +114 -0
  1212. package/dist/state/primary-key.test.js.map +1 -0
  1213. package/dist/state/resolved-state-view.d.ts +33 -0
  1214. package/dist/state/resolved-state-view.d.ts.map +1 -0
  1215. package/dist/state/resolved-state-view.js +182 -0
  1216. package/dist/state/resolved-state-view.js.map +1 -0
  1217. package/dist/state/resolved-state-view.test.d.ts +2 -0
  1218. package/dist/state/resolved-state-view.test.d.ts.map +1 -0
  1219. package/dist/state/resolved-state-view.test.js +433 -0
  1220. package/dist/state/resolved-state-view.test.js.map +1 -0
  1221. package/dist/state/schema.bench.d.ts +2 -0
  1222. package/dist/state/schema.bench.d.ts.map +1 -0
  1223. package/dist/state/schema.bench.js +36 -0
  1224. package/dist/state/schema.bench.js.map +1 -0
  1225. package/dist/state/schema.d.ts +43 -0
  1226. package/dist/state/schema.d.ts.map +1 -0
  1227. package/dist/state/schema.js +789 -0
  1228. package/dist/state/schema.js.map +1 -0
  1229. package/dist/state/schema.test.d.ts +2 -0
  1230. package/dist/state/schema.test.d.ts.map +1 -0
  1231. package/dist/state/schema.test.js +2701 -0
  1232. package/dist/state/schema.test.js.map +1 -0
  1233. package/dist/state/untracked/schema.d.ts +25 -0
  1234. package/dist/state/untracked/schema.d.ts.map +1 -0
  1235. package/dist/state/untracked/schema.js +38 -0
  1236. package/dist/state/untracked/schema.js.map +1 -0
  1237. package/dist/state/untracked/schema.test.d.ts +2 -0
  1238. package/dist/state/untracked/schema.test.d.ts.map +1 -0
  1239. package/dist/state/untracked/schema.test.js +275 -0
  1240. package/dist/state/untracked/schema.test.js.map +1 -0
  1241. package/dist/state/untracked/update-untracked-state.d.ts +36 -0
  1242. package/dist/state/untracked/update-untracked-state.d.ts.map +1 -0
  1243. package/dist/state/untracked/update-untracked-state.js +113 -0
  1244. package/dist/state/untracked/update-untracked-state.js.map +1 -0
  1245. package/dist/state/untracked/update-untracked-state.test.d.ts +2 -0
  1246. package/dist/state/untracked/update-untracked-state.test.d.ts.map +1 -0
  1247. package/dist/state/untracked/update-untracked-state.test.js +417 -0
  1248. package/dist/state/untracked/update-untracked-state.test.js.map +1 -0
  1249. package/dist/state/validate-snapshot-content.d.ts +9 -0
  1250. package/dist/state/validate-snapshot-content.d.ts.map +1 -0
  1251. package/dist/state/validate-snapshot-content.js +42 -0
  1252. package/dist/state/validate-snapshot-content.js.map +1 -0
  1253. package/dist/state/validate-snapshot-content.test.d.ts +2 -0
  1254. package/dist/state/validate-snapshot-content.test.d.ts.map +1 -0
  1255. package/dist/state/validate-snapshot-content.test.js +67 -0
  1256. package/dist/state/validate-snapshot-content.test.js.map +1 -0
  1257. package/dist/state/validate-state-mutation.d.ts +13 -0
  1258. package/dist/state/validate-state-mutation.d.ts.map +1 -0
  1259. package/dist/state/validate-state-mutation.js +645 -0
  1260. package/dist/state/validate-state-mutation.js.map +1 -0
  1261. package/dist/state/validate-state-mutation.test.d.ts +2 -0
  1262. package/dist/state/validate-state-mutation.test.d.ts.map +1 -0
  1263. package/dist/state/validate-state-mutation.test.js +2859 -0
  1264. package/dist/state/validate-state-mutation.test.js.map +1 -0
  1265. package/dist/state-history/schema.d.ts +68 -0
  1266. package/dist/state-history/schema.d.ts.map +1 -0
  1267. package/dist/state-history/schema.js +116 -0
  1268. package/dist/state-history/schema.js.map +1 -0
  1269. package/dist/state-history/schema.test.d.ts +2 -0
  1270. package/dist/state-history/schema.test.d.ts.map +1 -0
  1271. package/dist/state-history/schema.test.js +855 -0
  1272. package/dist/state-history/schema.test.js.map +1 -0
  1273. package/dist/stored-schema/index.d.ts +2 -0
  1274. package/dist/stored-schema/index.d.ts.map +1 -0
  1275. package/dist/stored-schema/index.js +2 -0
  1276. package/dist/stored-schema/index.js.map +1 -0
  1277. package/dist/stored-schema/schema.d.ts +25 -0
  1278. package/dist/stored-schema/schema.d.ts.map +1 -0
  1279. package/dist/stored-schema/schema.js +48 -0
  1280. package/dist/stored-schema/schema.js.map +1 -0
  1281. package/dist/stored-schema/schema.test.d.ts +2 -0
  1282. package/dist/stored-schema/schema.test.d.ts.map +1 -0
  1283. package/dist/stored-schema/schema.test.js +192 -0
  1284. package/dist/stored-schema/schema.test.js.map +1 -0
  1285. package/dist/sync/get-diffing-rows.d.ts +12 -0
  1286. package/dist/sync/get-diffing-rows.d.ts.map +1 -1
  1287. package/dist/sync/get-diffing-rows.js +14 -0
  1288. package/dist/sync/get-diffing-rows.js.map +1 -1
  1289. package/dist/sync/merge-state.d.ts.map +1 -1
  1290. package/dist/sync/merge-state.js +2 -1
  1291. package/dist/sync/merge-state.js.map +1 -1
  1292. package/dist/sync/pull-from-server.d.ts.map +1 -1
  1293. package/dist/sync/pull-from-server.js +2 -1
  1294. package/dist/sync/pull-from-server.js.map +1 -1
  1295. package/dist/sync/pull-from-server.test.js +32 -28
  1296. package/dist/sync/pull-from-server.test.js.map +1 -1
  1297. package/dist/sync/push-to-server.d.ts +10 -1
  1298. package/dist/sync/push-to-server.d.ts.map +1 -1
  1299. package/dist/sync/push-to-server.js +10 -1
  1300. package/dist/sync/push-to-server.js.map +1 -1
  1301. package/dist/sync/push-to-server.test.js +62 -63
  1302. package/dist/sync/push-to-server.test.js.map +1 -1
  1303. package/dist/sync/sync-process.d.ts +1 -1
  1304. package/dist/sync/sync-process.d.ts.map +1 -1
  1305. package/dist/sync/sync-process.js +1 -2
  1306. package/dist/sync/sync-process.js.map +1 -1
  1307. package/dist/sync/sync-process.test.js +20 -17
  1308. package/dist/sync/sync-process.test.js.map +1 -1
  1309. package/dist/test-utilities/simulation-test/cache-miss-simulation.d.ts +8 -0
  1310. package/dist/test-utilities/simulation-test/cache-miss-simulation.d.ts.map +1 -0
  1311. package/dist/test-utilities/simulation-test/cache-miss-simulation.js +79 -0
  1312. package/dist/test-utilities/simulation-test/cache-miss-simulation.js.map +1 -0
  1313. package/dist/test-utilities/simulation-test/cache-miss-simulation.test.d.ts +2 -0
  1314. package/dist/test-utilities/simulation-test/cache-miss-simulation.test.d.ts.map +1 -0
  1315. package/dist/test-utilities/simulation-test/cache-miss-simulation.test.js +127 -0
  1316. package/dist/test-utilities/simulation-test/cache-miss-simulation.test.js.map +1 -0
  1317. package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.d.ts +2 -0
  1318. package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.d.ts.map +1 -0
  1319. package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.js +2 -0
  1320. package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.js.map +1 -0
  1321. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.d.ts +10 -0
  1322. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.d.ts.map +1 -0
  1323. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.js +52 -0
  1324. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.js.map +1 -0
  1325. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.d.ts +2 -0
  1326. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.d.ts.map +1 -0
  1327. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.js +71 -0
  1328. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.js.map +1 -0
  1329. package/dist/test-utilities/simulation-test/simulation-test.d.ts +82 -0
  1330. package/dist/test-utilities/simulation-test/simulation-test.d.ts.map +1 -0
  1331. package/dist/test-utilities/simulation-test/simulation-test.js +85 -0
  1332. package/dist/test-utilities/simulation-test/simulation-test.js.map +1 -0
  1333. package/dist/test-utilities/simulation-test/simulation-test.test.d.ts +2 -0
  1334. package/dist/test-utilities/simulation-test/simulation-test.test.d.ts.map +1 -0
  1335. package/dist/test-utilities/simulation-test/simulation-test.test.js +310 -0
  1336. package/dist/test-utilities/simulation-test/simulation-test.test.js.map +1 -0
  1337. package/dist/thread/comment-utils.d.ts +2 -0
  1338. package/dist/thread/comment-utils.d.ts.map +1 -0
  1339. package/dist/thread/comment-utils.js +2 -0
  1340. package/dist/thread/comment-utils.js.map +1 -0
  1341. package/dist/thread/comment.d.ts +24 -0
  1342. package/dist/thread/comment.d.ts.map +1 -0
  1343. package/dist/thread/comment.js +43 -0
  1344. package/dist/thread/comment.js.map +1 -0
  1345. package/dist/thread/create-thread-comment.d.ts +18 -0
  1346. package/dist/thread/create-thread-comment.d.ts.map +1 -0
  1347. package/dist/thread/create-thread-comment.js +64 -0
  1348. package/dist/thread/create-thread-comment.js.map +1 -0
  1349. package/dist/thread/create-thread-comment.test.d.ts +2 -0
  1350. package/dist/thread/create-thread-comment.test.d.ts.map +1 -0
  1351. package/dist/thread/create-thread-comment.test.js +97 -0
  1352. package/dist/thread/create-thread-comment.test.js.map +1 -0
  1353. package/dist/thread/create-thread.d.ts +42 -0
  1354. package/dist/thread/create-thread.d.ts.map +1 -0
  1355. package/dist/thread/create-thread.js +79 -0
  1356. package/dist/thread/create-thread.js.map +1 -0
  1357. package/dist/thread/create-thread.test.d.ts +2 -0
  1358. package/dist/thread/create-thread.test.d.ts.map +1 -0
  1359. package/dist/thread/create-thread.test.js +175 -0
  1360. package/dist/thread/create-thread.test.js.map +1 -0
  1361. package/dist/thread/database-schema.d.ts +20 -0
  1362. package/dist/thread/database-schema.d.ts.map +1 -0
  1363. package/dist/thread/database-schema.js +57 -0
  1364. package/dist/thread/database-schema.js.map +1 -0
  1365. package/dist/thread/database-schema.test.d.ts +2 -0
  1366. package/dist/thread/database-schema.test.d.ts.map +1 -0
  1367. package/dist/thread/database-schema.test.js +59 -0
  1368. package/dist/thread/database-schema.test.js.map +1 -0
  1369. package/dist/thread/index.d.ts +5 -0
  1370. package/dist/thread/index.d.ts.map +1 -0
  1371. package/dist/thread/index.js +4 -0
  1372. package/dist/thread/index.js.map +1 -0
  1373. package/dist/thread/schema.d.ts +62 -0
  1374. package/dist/thread/schema.d.ts.map +1 -0
  1375. package/dist/thread/schema.js +72 -0
  1376. package/dist/thread/schema.js.map +1 -0
  1377. package/dist/thread/schema.test.d.ts +2 -0
  1378. package/dist/thread/schema.test.d.ts.map +1 -0
  1379. package/dist/thread/schema.test.js +125 -0
  1380. package/dist/thread/schema.test.js.map +1 -0
  1381. package/dist/version/create-version.d.ts +14 -17
  1382. package/dist/version/create-version.d.ts.map +1 -1
  1383. package/dist/version/create-version.js +53 -52
  1384. package/dist/version/create-version.js.map +1 -1
  1385. package/dist/version/create-version.test.js +121 -109
  1386. package/dist/version/create-version.test.js.map +1 -1
  1387. package/dist/version/database-schema.d.ts +21 -0
  1388. package/dist/version/database-schema.d.ts.map +1 -0
  1389. package/dist/version/database-schema.js +169 -0
  1390. package/dist/version/database-schema.js.map +1 -0
  1391. package/dist/version/database-schema.test.d.ts +2 -0
  1392. package/dist/version/database-schema.test.d.ts.map +1 -0
  1393. package/dist/version/database-schema.test.js +625 -0
  1394. package/dist/version/database-schema.test.js.map +1 -0
  1395. package/dist/version/index.d.ts +1 -5
  1396. package/dist/version/index.d.ts.map +1 -1
  1397. package/dist/version/index.js +1 -5
  1398. package/dist/version/index.js.map +1 -1
  1399. package/dist/version/merge-version.d.ts +3 -0
  1400. package/dist/version/merge-version.d.ts.map +1 -1
  1401. package/dist/version/merge-version.js +3 -0
  1402. package/dist/version/merge-version.js.map +1 -1
  1403. package/dist/version/merge-version.test.js +10 -5
  1404. package/dist/version/merge-version.test.js.map +1 -1
  1405. package/dist/version/schema.d.ts +78 -0
  1406. package/dist/version/schema.d.ts.map +1 -0
  1407. package/dist/version/schema.js +147 -0
  1408. package/dist/version/schema.js.map +1 -0
  1409. package/dist/version/schema.test.d.ts +2 -0
  1410. package/dist/version/schema.test.d.ts.map +1 -0
  1411. package/dist/version/schema.test.js +884 -0
  1412. package/dist/version/schema.test.js.map +1 -0
  1413. package/dist/version/select-active-version.d.ts +7 -0
  1414. package/dist/version/select-active-version.d.ts.map +1 -0
  1415. package/dist/version/select-active-version.js +7 -0
  1416. package/dist/version/select-active-version.js.map +1 -0
  1417. package/dist/version/switch-version.d.ts +5 -5
  1418. package/dist/version/switch-version.d.ts.map +1 -1
  1419. package/dist/version/switch-version.js +6 -62
  1420. package/dist/version/switch-version.js.map +1 -1
  1421. package/dist/version/switch-version.test.js +14 -214
  1422. package/dist/version/switch-version.test.js.map +1 -1
  1423. package/dist/version/update-changes-in-version.d.ts +2 -0
  1424. package/dist/version/update-changes-in-version.d.ts.map +1 -1
  1425. package/dist/version/update-changes-in-version.js +2 -0
  1426. package/dist/version/update-changes-in-version.js.map +1 -1
  1427. package/dist/version-v2/create-version.d.ts +18 -0
  1428. package/dist/version-v2/create-version.d.ts.map +1 -0
  1429. package/dist/version-v2/create-version.js +35 -0
  1430. package/dist/version-v2/create-version.js.map +1 -0
  1431. package/dist/version-v2/create-version.test.d.ts +2 -0
  1432. package/dist/version-v2/create-version.test.d.ts.map +1 -0
  1433. package/dist/version-v2/create-version.test.js +88 -0
  1434. package/dist/version-v2/create-version.test.js.map +1 -0
  1435. package/dist/version-v2/database-schema.d.ts +21 -0
  1436. package/dist/version-v2/database-schema.d.ts.map +1 -0
  1437. package/dist/version-v2/database-schema.js +169 -0
  1438. package/dist/version-v2/database-schema.js.map +1 -0
  1439. package/dist/version-v2/database-schema.test.d.ts +2 -0
  1440. package/dist/version-v2/database-schema.test.d.ts.map +1 -0
  1441. package/dist/version-v2/database-schema.test.js +625 -0
  1442. package/dist/version-v2/database-schema.test.js.map +1 -0
  1443. package/dist/version-v2/index.d.ts +2 -0
  1444. package/dist/version-v2/index.d.ts.map +1 -0
  1445. package/dist/version-v2/index.js +2 -0
  1446. package/dist/version-v2/index.js.map +1 -0
  1447. package/dist/version-v2/swich-version.d.ts +27 -0
  1448. package/dist/version-v2/swich-version.d.ts.map +1 -0
  1449. package/dist/version-v2/swich-version.js +46 -0
  1450. package/dist/version-v2/swich-version.js.map +1 -0
  1451. package/dist/version-v2/switch-version.d.ts +27 -0
  1452. package/dist/version-v2/switch-version.d.ts.map +1 -0
  1453. package/dist/version-v2/switch-version.js +91 -0
  1454. package/dist/version-v2/switch-version.js.map +1 -0
  1455. package/dist/version-v2/switch-version.test.d.ts +2 -0
  1456. package/dist/version-v2/switch-version.test.d.ts.map +1 -0
  1457. package/dist/version-v2/switch-version.test.js +110 -0
  1458. package/dist/version-v2/switch-version.test.js.map +1 -0
  1459. package/dist/version-v2/with-skip-update-working-change-set.d.ts +3 -0
  1460. package/dist/version-v2/with-skip-update-working-change-set.d.ts.map +1 -0
  1461. package/dist/version-v2/with-skip-update-working-change-set.js +50 -0
  1462. package/dist/version-v2/with-skip-update-working-change-set.js.map +1 -0
  1463. package/dist/version-v2/with-skip-update-working-change-set.test.d.ts +2 -0
  1464. package/dist/version-v2/with-skip-update-working-change-set.test.d.ts.map +1 -0
  1465. package/dist/version-v2/with-skip-update-working-change-set.test.js +49 -0
  1466. package/dist/version-v2/with-skip-update-working-change-set.test.js.map +1 -0
  1467. package/dist/zettel-ast/index.d.ts +11 -0
  1468. package/dist/zettel-ast/index.d.ts.map +1 -0
  1469. package/dist/zettel-ast/index.js +11 -0
  1470. package/dist/zettel-ast/index.js.map +1 -0
  1471. package/package.json +12 -11
  1472. package/src/account/create-account.test.ts +49 -4
  1473. package/src/account/create-account.ts +37 -7
  1474. package/src/account/index.ts +5 -1
  1475. package/src/account/schema.test.ts +370 -0
  1476. package/src/account/schema.ts +132 -0
  1477. package/src/account/switch-account.test.ts +33 -10
  1478. package/src/account/switch-account.ts +13 -4
  1479. package/src/change/index.ts +4 -2
  1480. package/src/change/schema.test.ts +322 -0
  1481. package/src/change/schema.ts +173 -0
  1482. package/src/change-author/index.ts +4 -0
  1483. package/src/change-author/schema.test.ts +364 -0
  1484. package/src/change-author/schema.ts +54 -0
  1485. package/src/change-conflict/create-change-conflict.test.ts +14 -11
  1486. package/src/change-conflict/create-change-conflict.ts +29 -6
  1487. package/src/change-conflict/detect-change-conflicts.test.ts +18 -15
  1488. package/src/change-conflict/detect-change-conflicts.ts +3 -0
  1489. package/src/change-conflict/detect-diverging-entity-conflict.test.ts +24 -21
  1490. package/src/change-conflict/detect-diverging-entity-conflict.ts +4 -1
  1491. package/src/change-conflict/garbage-collect-change-conflicts.test.ts +16 -15
  1492. package/src/change-conflict/garbage-collect-change-conflicts.ts +3 -0
  1493. package/src/change-conflict/resolve-conflict-by-selecting.test.ts +18 -8
  1494. package/src/change-conflict/resolve-conflict-by-selecting.ts +3 -2
  1495. package/src/change-proposal/create-change-proposal.test.ts +106 -0
  1496. package/src/change-proposal/create-change-proposal.ts +71 -0
  1497. package/src/change-proposal/database-schema.test.ts +180 -0
  1498. package/src/change-proposal/database-schema.ts +32 -0
  1499. package/src/change-proposal/index.ts +2 -0
  1500. package/src/change-set/apply-change-set.test.ts +472 -0
  1501. package/src/change-set/apply-change-set.ts +174 -0
  1502. package/src/change-set/create-change-set.test.ts +87 -27
  1503. package/src/change-set/create-change-set.ts +95 -43
  1504. package/src/change-set/index.ts +9 -1
  1505. package/src/change-set/schema.test.ts +671 -0
  1506. package/src/change-set/schema.ts +150 -0
  1507. package/src/commit/apply-commit.test.ts +426 -0
  1508. package/src/commit/apply-commit.ts +74 -0
  1509. package/src/commit/create-checkpoint.test.ts +605 -0
  1510. package/src/commit/create-checkpoint.ts +140 -0
  1511. package/src/commit/create-commit.ts +80 -0
  1512. package/src/commit/create-merge-commit.test.ts +268 -0
  1513. package/src/commit/create-merge-commit.ts +138 -0
  1514. package/src/commit/create-transition-commit.test.ts +256 -0
  1515. package/src/commit/create-transition-commit.ts +187 -0
  1516. package/src/commit/create-undo-commit.test.ts +358 -0
  1517. package/src/commit/create-undo-commit.ts +180 -0
  1518. package/src/commit/index.ts +11 -0
  1519. package/src/commit/schema.test.ts +257 -0
  1520. package/src/commit/schema.ts +104 -0
  1521. package/src/database/execute-sync.test.ts +60 -72
  1522. package/src/database/execute-sync.ts +26 -27
  1523. package/src/database/graph-traversal-mode.ts +75 -0
  1524. package/src/database/index.ts +1 -2
  1525. package/src/database/init-db.ts +158 -74
  1526. package/src/database/kysely-plugin/json-column-plugin.test.ts +404 -0
  1527. package/src/database/kysely-plugin/json-column-plugin.ts +280 -0
  1528. package/src/database/kysely-plugin/parse-jsonb-plugin-v1.ts +5 -10
  1529. package/src/database/kysely-plugin/parse-jsonb-plugin-v2.ts +1 -1
  1530. package/src/database/kysely-plugin/serialize-jsonb-plugin.test.ts +177 -2
  1531. package/src/database/kysely-plugin/serialize-jsonb-plugin.ts +186 -87
  1532. package/src/database/kysely-plugin/view-insert-returning-error-plugin.test.ts +62 -0
  1533. package/src/database/kysely-plugin/view-insert-returning-error-plugin.ts +49 -0
  1534. package/src/database/nano-id.test.ts +3 -3
  1535. package/src/database/nano-id.ts +4 -1
  1536. package/src/database/schema.ts +105 -270
  1537. package/src/deterministic/generate-human-id.test.ts +154 -0
  1538. package/src/deterministic/generate-human-id.ts +94 -0
  1539. package/src/deterministic/index.ts +7 -0
  1540. package/src/deterministic/is-deterministic-mode.test.ts +133 -0
  1541. package/src/deterministic/is-deterministic-mode.ts +32 -0
  1542. package/src/deterministic/nano-id.test.ts +200 -0
  1543. package/src/deterministic/nano-id.ts +188 -0
  1544. package/src/deterministic/options.test.ts +157 -0
  1545. package/src/deterministic/options.ts +62 -0
  1546. package/src/deterministic/random.test.ts +293 -0
  1547. package/src/deterministic/random.ts +261 -0
  1548. package/src/deterministic/sequence.test.ts +93 -0
  1549. package/src/deterministic/sequence.ts +132 -0
  1550. package/src/deterministic/timestamp.test.ts +170 -0
  1551. package/src/deterministic/timestamp.ts +83 -0
  1552. package/src/deterministic/uuid-v7.test.ts +144 -0
  1553. package/src/deterministic/uuid-v7.ts +82 -0
  1554. package/src/entity/eb-entity.test.ts +687 -0
  1555. package/src/entity/eb-entity.ts +203 -0
  1556. package/src/entity/index.ts +12 -0
  1557. package/src/entity/label/create-entity-label.test.ts +316 -0
  1558. package/src/entity/label/create-entity-label.ts +113 -0
  1559. package/src/entity/label/schema.test.ts +692 -0
  1560. package/src/entity/label/schema.ts +55 -0
  1561. package/src/entity/schema.ts +22 -0
  1562. package/src/entity/thread/create-entity-thread.test.ts +282 -0
  1563. package/src/entity/thread/create-entity-thread.ts +134 -0
  1564. package/src/entity/thread/query-threads.test.ts +394 -0
  1565. package/src/entity/thread/schema.test.ts +170 -0
  1566. package/src/entity/thread/schema.ts +55 -0
  1567. package/src/entity-views/README.md +214 -0
  1568. package/src/entity-views/entity-state-all.test.ts +647 -0
  1569. package/src/entity-views/entity-state-all.ts +575 -0
  1570. package/src/entity-views/entity-state-history.test.ts +387 -0
  1571. package/src/entity-views/entity-state-history.ts +275 -0
  1572. package/src/entity-views/entity-state.test.ts +732 -0
  1573. package/src/entity-views/entity-state.ts +571 -0
  1574. package/src/entity-views/entity-view-builder.test.ts +293 -0
  1575. package/src/entity-views/entity-view-builder.ts +148 -0
  1576. package/src/entity-views/index.ts +1 -0
  1577. package/src/entity-views/types.test.ts +99 -0
  1578. package/src/entity-views/types.ts +328 -0
  1579. package/src/file/file-handlers.test.ts +174 -0
  1580. package/src/file/file-handlers.ts +404 -0
  1581. package/src/file/index.ts +5 -1
  1582. package/src/file/materialize-file-data-at-commit.ts +157 -0
  1583. package/src/file/materialize-file-data.test.ts +107 -0
  1584. package/src/file/materialize-file-data.ts +120 -0
  1585. package/src/file/schema.test.ts +1646 -0
  1586. package/src/file/schema.ts +427 -0
  1587. package/src/file/store-detected-change-schema.test.ts +248 -0
  1588. package/src/file/store-detected-change-schema.ts +52 -0
  1589. package/src/file/unknown-file-fallback-plugin.test.ts +368 -0
  1590. package/src/file/unknown-file-fallback-plugin.ts +95 -0
  1591. package/src/hooks/create-hooks.test.ts +125 -0
  1592. package/src/hooks/create-hooks.ts +68 -0
  1593. package/src/hooks/index.ts +1 -0
  1594. package/src/index.ts +13 -6
  1595. package/src/key-value/index.ts +1 -0
  1596. package/src/key-value/schema.test.ts +280 -0
  1597. package/src/key-value/schema.ts +98 -0
  1598. package/src/label/create-label.test.ts +234 -0
  1599. package/src/label/create-label.ts +61 -0
  1600. package/src/label/index.ts +2 -0
  1601. package/src/label/schema.test.ts +92 -0
  1602. package/src/label/schema.ts +37 -0
  1603. package/src/lix/index.ts +3 -6
  1604. package/src/lix/new-lix.test.ts +412 -16
  1605. package/src/lix/new-lix.ts +619 -8
  1606. package/src/lix/open-lix.test.ts +369 -27
  1607. package/src/lix/open-lix.ts +256 -46
  1608. package/src/lix/storage/in-memory.test.ts +106 -0
  1609. package/src/lix/storage/in-memory.ts +64 -0
  1610. package/src/lix/storage/lix-storage-adapter.ts +52 -0
  1611. package/src/lix/storage/opfs.test.ts +438 -0
  1612. package/src/lix/storage/opfs.ts +313 -0
  1613. package/src/log/create-lix-own-log.test.ts +123 -0
  1614. package/src/log/create-lix-own-log.ts +113 -0
  1615. package/src/log/create-log.ts +52 -0
  1616. package/src/log/index.ts +2 -0
  1617. package/src/log/schema.test.ts +140 -0
  1618. package/src/log/schema.ts +51 -0
  1619. package/src/observe/create-observe.test.ts +836 -0
  1620. package/src/observe/create-observe.ts +184 -0
  1621. package/src/observe/determine-schema-keys.test.ts +371 -0
  1622. package/src/observe/determine-schema-keys.ts +165 -0
  1623. package/src/observe/index.ts +1 -0
  1624. package/src/observe/lix-observable.test.ts +247 -0
  1625. package/src/observe/lix-observable.ts +92 -0
  1626. package/src/plugin/index.ts +2 -2
  1627. package/src/plugin/lix-plugin.test-d.ts +26 -15
  1628. package/src/plugin/lix-plugin.ts +43 -52
  1629. package/src/plugin/mock-json-plugin.flatten.ts +161 -0
  1630. package/src/plugin/mock-json-plugin.test.ts +214 -0
  1631. package/src/plugin/mock-json-plugin.ts +113 -0
  1632. package/src/query-filter/change-set-element-in-ancestry-of.test.ts +440 -0
  1633. package/src/query-filter/change-set-element-in-ancestry-of.ts +69 -0
  1634. package/src/query-filter/change-set-element-in-symmetric-difference.test.ts +410 -0
  1635. package/src/{change-set → query-filter}/change-set-element-in-symmetric-difference.ts +4 -3
  1636. package/src/query-filter/change-set-element-is-leaf-of.test.ts +623 -0
  1637. package/src/query-filter/change-set-element-is-leaf-of.ts +132 -0
  1638. package/src/query-filter/commit-is-ancestor-of.test.ts +333 -0
  1639. package/src/query-filter/commit-is-ancestor-of.ts +77 -0
  1640. package/src/query-filter/commit-is-descendant-of.test.ts +365 -0
  1641. package/src/query-filter/commit-is-descendant-of.ts +70 -0
  1642. package/src/query-filter/index.ts +5 -8
  1643. package/src/schema-definition/definition.test-d.ts +253 -0
  1644. package/src/schema-definition/definition.test.ts +425 -0
  1645. package/src/schema-definition/definition.ts +502 -0
  1646. package/src/schema-definition/index.ts +13 -0
  1647. package/src/schema-definition/json-type.test.ts +30 -0
  1648. package/src/schema-definition/json-type.ts +53 -0
  1649. package/src/schema-definition/validate-lix-schema.test.ts +94 -0
  1650. package/src/schema-definition/validate-lix-schema.ts +104 -0
  1651. package/src/server-protocol-handler/create-server-protocol-handler.ts +0 -4
  1652. package/src/server-protocol-handler/environment/create-in-memory-environment.test.ts +13 -14
  1653. package/src/server-protocol-handler/environment/create-in-memory-environment.ts +5 -24
  1654. package/src/server-protocol-handler/environment/environment.ts +0 -5
  1655. package/src/server-protocol-handler/routes/get-v1.test.ts +11 -12
  1656. package/src/server-protocol-handler/routes/get-v1.ts +3 -1
  1657. package/src/server-protocol-handler/routes/new-v1.test.ts +7 -8
  1658. package/src/server-protocol-handler/routes/new-v1.ts +3 -5
  1659. package/src/server-protocol-handler/routes/pull-v1.test.ts +49 -33
  1660. package/src/server-protocol-handler/routes/pull-v1.ts +1 -1
  1661. package/src/server-protocol-handler/routes/push-v1.test.ts +26 -27
  1662. package/src/server-protocol-handler/routes/push-v1.ts +4 -1
  1663. package/src/snapshot/schema.test.ts +268 -0
  1664. package/src/snapshot/schema.ts +29 -0
  1665. package/src/state/README.md +95 -0
  1666. package/src/state/cache/clear-state-cache.test.ts +43 -0
  1667. package/src/state/cache/clear-state-cache.ts +16 -0
  1668. package/src/state/cache/is-stale-state-cache.test.ts +35 -0
  1669. package/src/state/cache/is-stale-state-cache.ts +29 -0
  1670. package/src/state/cache/mark-state-cache-as-stale.ts +53 -0
  1671. package/src/state/cache/populate-state-cache.test.ts +259 -0
  1672. package/src/state/cache/populate-state-cache.ts +124 -0
  1673. package/src/state/cache/schema.ts +41 -0
  1674. package/src/state/cache/update-state-cache.test.ts +510 -0
  1675. package/src/state/cache/update-state-cache.ts +317 -0
  1676. package/src/state/commit.test.ts +1402 -0
  1677. package/src/state/commit.ts +587 -0
  1678. package/src/state/insert-transaction-state.test.ts +928 -0
  1679. package/src/state/insert-transaction-state.ts +306 -0
  1680. package/src/state/materialize-state.test.ts +2358 -0
  1681. package/src/state/materialize-state.ts +235 -0
  1682. package/src/state/primary-key.test.ts +158 -0
  1683. package/src/state/primary-key.ts +80 -0
  1684. package/src/state/resolved-state-view.test.ts +521 -0
  1685. package/src/state/resolved-state-view.ts +202 -0
  1686. package/src/state/schema.bench.ts +43 -0
  1687. package/src/state/schema.test.ts +3260 -0
  1688. package/src/state/schema.ts +992 -0
  1689. package/src/state/untracked/schema.test.ts +301 -0
  1690. package/src/state/untracked/schema.ts +55 -0
  1691. package/src/state/untracked/update-untracked-state.test.ts +466 -0
  1692. package/src/state/untracked/update-untracked-state.ts +133 -0
  1693. package/src/state/validate-state-mutation.test.ts +3308 -0
  1694. package/src/state/validate-state-mutation.ts +866 -0
  1695. package/src/state-history/schema.test.ts +1002 -0
  1696. package/src/state-history/schema.ts +221 -0
  1697. package/src/stored-schema/index.ts +4 -0
  1698. package/src/stored-schema/schema.test.ts +240 -0
  1699. package/src/stored-schema/schema.ts +67 -0
  1700. package/src/sync/get-diffing-rows.ts +16 -0
  1701. package/src/sync/merge-state.ts +7 -4
  1702. package/src/sync/pull-from-server.test.ts +33 -28
  1703. package/src/sync/pull-from-server.ts +4 -2
  1704. package/src/sync/push-to-server.test.ts +79 -83
  1705. package/src/sync/push-to-server.ts +11 -2
  1706. package/src/sync/sync-process.test.ts +21 -18
  1707. package/src/sync/sync-process.ts +2 -3
  1708. package/src/test-utilities/simulation-test/cache-miss-simulation.test.ts +162 -0
  1709. package/src/test-utilities/simulation-test/cache-miss-simulation.ts +99 -0
  1710. package/src/test-utilities/simulation-test/chaotic-timestamp-simulation.ts +0 -0
  1711. package/src/test-utilities/simulation-test/out-of-order-sequence-simulation.test.ts +88 -0
  1712. package/src/test-utilities/simulation-test/out-of-order-sequence-simulation.ts +69 -0
  1713. package/src/test-utilities/simulation-test/simulation-test.test.ts +400 -0
  1714. package/src/test-utilities/simulation-test/simulation-test.ts +176 -0
  1715. package/src/thread/create-thread-comment.test.ts +122 -0
  1716. package/src/thread/create-thread-comment.ts +84 -0
  1717. package/src/thread/create-thread.test.ts +212 -0
  1718. package/src/thread/create-thread.ts +108 -0
  1719. package/src/thread/index.ts +9 -0
  1720. package/src/thread/schema.test.ts +157 -0
  1721. package/src/thread/schema.ts +90 -0
  1722. package/src/version/create-version.test.ts +135 -116
  1723. package/src/version/create-version.ts +64 -61
  1724. package/src/version/index.ts +5 -6
  1725. package/src/version/schema.test.ts +1030 -0
  1726. package/src/version/schema.ts +163 -0
  1727. package/src/version/select-active-version.ts +18 -0
  1728. package/src/version/switch-version.test.ts +14 -275
  1729. package/src/version/switch-version.ts +9 -79
  1730. package/src/zettel-ast/index.ts +10 -0
  1731. package/src/account/database-schema.test.ts +0 -184
  1732. package/src/account/database-schema.ts +0 -54
  1733. package/src/change/apply-changes.test.ts +0 -268
  1734. package/src/change/apply-changes.ts +0 -114
  1735. package/src/change/create-change.test.ts +0 -296
  1736. package/src/change/create-change.ts +0 -129
  1737. package/src/change/mock-change.ts +0 -21
  1738. package/src/change-schema/README.md +0 -3
  1739. package/src/change-schema/index.ts +0 -4
  1740. package/src/change-schema/types.test-d.ts +0 -52
  1741. package/src/change-schema/types.ts +0 -53
  1742. package/src/change-set/change-set-element-in-symmetric-difference.test.ts +0 -128
  1743. package/src/database/apply-schema.ts +0 -272
  1744. package/src/database/init-db.test.ts +0 -626
  1745. package/src/database/mutation-log/database-schema.ts +0 -128
  1746. package/src/database/mutation-log/lix-session.ts +0 -19
  1747. package/src/discussion/create-comment.ts +0 -18
  1748. package/src/discussion/create-discussion.test.ts +0 -45
  1749. package/src/discussion/create-discussion.ts +0 -48
  1750. package/src/discussion/index.ts +0 -2
  1751. package/src/file/validate-file-path.test.ts +0 -44
  1752. package/src/file/validate-file-path.ts +0 -60
  1753. package/src/file-queue/file-handlers.ts +0 -267
  1754. package/src/file-queue/file-queue-process.test.ts +0 -456
  1755. package/src/file-queue/file-queue-process.ts +0 -108
  1756. package/src/file-queue/file-queue-settled.test.ts +0 -56
  1757. package/src/file-queue/file-queue-settled.ts +0 -31
  1758. package/src/file-queue/index.ts +0 -1
  1759. package/src/file-queue/with-skip-file-queue.test.ts +0 -158
  1760. package/src/file-queue/with-skip-file-queue.ts +0 -33
  1761. package/src/key-value/database-schema.test.ts +0 -140
  1762. package/src/key-value/database-schema.ts +0 -66
  1763. package/src/lix/close-lix.ts +0 -8
  1764. package/src/lix/merge.get-leaf-changes-only-in-source.test.ts +0 -143
  1765. package/src/lix/merge.get-leaf-changes-only-in-source.ts +0 -46
  1766. package/src/lix/merge.test.ts +0 -858
  1767. package/src/lix/merge.ts +0 -244
  1768. package/src/lix/open-lix-in-memory.test.ts +0 -34
  1769. package/src/lix/open-lix-in-memory.ts +0 -28
  1770. package/src/lix/to-blob.ts +0 -14
  1771. package/src/own-change-control/apply-own-change.test.ts +0 -361
  1772. package/src/own-change-control/apply-own-change.ts +0 -110
  1773. package/src/own-change-control/change-controlled-tables.test.ts +0 -69
  1774. package/src/own-change-control/change-controlled-tables.ts +0 -102
  1775. package/src/own-change-control/database-triggers.test.ts +0 -259
  1776. package/src/own-change-control/database-triggers.ts +0 -189
  1777. package/src/own-change-control/index.ts +0 -1
  1778. package/src/own-change-control/with-skip-own-change-control.test.ts +0 -57
  1779. package/src/own-change-control/with-skip-own-change-control.ts +0 -34
  1780. package/src/plugin/load-plugin.ts +0 -37
  1781. package/src/plugin/with-transaction.ts +0 -22
  1782. package/src/query-filter/change-conflict-in-version.test.ts +0 -62
  1783. package/src/query-filter/change-conflict-in-version.ts +0 -25
  1784. package/src/query-filter/change-has-label.test.ts +0 -52
  1785. package/src/query-filter/change-has-label.ts +0 -41
  1786. package/src/query-filter/change-in-version.test.ts +0 -82
  1787. package/src/query-filter/change-in-version.ts +0 -31
  1788. package/src/query-filter/change-is-leaf-in-version.test.ts +0 -77
  1789. package/src/query-filter/change-is-leaf-in-version.ts +0 -36
  1790. package/src/query-filter/change-is-leaf-of.bench.ts +0 -175
  1791. package/src/query-filter/change-is-leaf-of.test.ts +0 -84
  1792. package/src/query-filter/change-is-leaf-of.ts +0 -46
  1793. package/src/query-filter/change-is-leaf.test.ts +0 -140
  1794. package/src/query-filter/change-is-leaf.ts +0 -25
  1795. package/src/query-filter/change-is-lowest-common-ancestor-of.test.ts +0 -173
  1796. package/src/query-filter/change-is-lowest-common-ancestor-of.ts +0 -57
  1797. package/src/query-filter/change-set-has-label.test.ts +0 -50
  1798. package/src/query-filter/change-set-has-label.ts +0 -36
  1799. package/src/query-filter/version-change-in-difference.test.ts +0 -105
  1800. package/src/query-filter/version-change-in-difference.ts +0 -37
  1801. package/src/query-filter/version-change-in-symmetric-difference.test.ts +0 -104
  1802. package/src/query-filter/version-change-in-symmetric-difference.ts +0 -52
  1803. package/src/snapshot/create-snapshot.test.ts +0 -68
  1804. package/src/snapshot/create-snapshot.ts +0 -40
  1805. package/src/snapshot/index.ts +0 -2
  1806. package/src/snapshot/json-sha-256.test.ts +0 -12
  1807. package/src/snapshot/json-sha-256.ts +0 -35
  1808. package/src/snapshot/mock-json-snapshot.ts +0 -14
  1809. package/src/version/merge-version.test.ts +0 -530
  1810. package/src/version/merge-version.ts +0 -88
  1811. package/src/version/update-changes-in-version.test.ts +0 -371
  1812. package/src/version/update-changes-in-version.ts +0 -47
@@ -0,0 +1,3308 @@
1
+ import { test, expect } from "vitest";
2
+ import { openLix } from "../lix/open-lix.js";
3
+ import { validateStateMutation } from "./validate-state-mutation.js";
4
+ import type { LixSchemaDefinition } from "../schema-definition/definition.js";
5
+ import { Kysely, sql } from "kysely";
6
+ import { createVersion } from "../version/create-version.js";
7
+ import type { LixChangeSetElement } from "../change-set/schema.js";
8
+ import type { LixInternalDatabaseSchema } from "../database/schema.js";
9
+
10
+ test("throws if the schema is not a valid lix schema", async () => {
11
+ const lix = await openLix({});
12
+
13
+ const schema = {
14
+ type: "object",
15
+ "x-lix-version": "1.0",
16
+ properties: {
17
+ name: { type: "string" },
18
+ },
19
+ required: ["name"],
20
+ additionalProperties: false,
21
+ // @ts-expect-error - x-version is missing
22
+ } as const satisfies LixSchemaDefinition;
23
+
24
+ const activeVersion = await lix.db
25
+ .selectFrom("active_version")
26
+ .select("version_id")
27
+ .executeTakeFirstOrThrow();
28
+
29
+ expect(() =>
30
+ validateStateMutation({
31
+ lix,
32
+ // @ts-expect-error - x-key is missing
33
+ schema,
34
+ snapshot_content: {},
35
+ operation: "insert",
36
+ version_id: activeVersion.version_id,
37
+ })
38
+ ).toThrowError();
39
+ });
40
+
41
+ test("inserts the version and active version schemas to enable validation", async () => {
42
+ const lix = await openLix({});
43
+
44
+ const result = await lix.db
45
+ .selectFrom("stored_schema")
46
+ .where("key", "in", ["lix_version", "lix_active_version"])
47
+ .selectAll()
48
+ .execute();
49
+
50
+ expect(result.length).toBeGreaterThan(0);
51
+ });
52
+
53
+ test("valid lix schema with a valid snapshot passes", async () => {
54
+ const lix = await openLix({});
55
+
56
+ const schema = {
57
+ type: "object",
58
+ "x-lix-version": "1.0",
59
+ "x-lix-key": "mock",
60
+ properties: {
61
+ name: { type: "string" },
62
+ },
63
+ required: ["name"],
64
+ additionalProperties: false,
65
+ } as const satisfies LixSchemaDefinition;
66
+
67
+ const snapshot = {
68
+ content: {
69
+ name: "John",
70
+ },
71
+ };
72
+
73
+ const activeVersion = await lix.db
74
+ .selectFrom("active_version")
75
+ .select("version_id")
76
+ .executeTakeFirstOrThrow();
77
+
78
+ expect(() =>
79
+ validateStateMutation({
80
+ lix,
81
+ schema,
82
+ snapshot_content: snapshot.content,
83
+ operation: "insert",
84
+ version_id: activeVersion.version_id,
85
+ })
86
+ ).not.toThrowError();
87
+ });
88
+
89
+ test("an invalid snapshot fails", async () => {
90
+ const lix = await openLix({});
91
+
92
+ const schema = {
93
+ type: "object",
94
+ "x-lix-version": "1.0",
95
+ "x-lix-key": "mock",
96
+ properties: {
97
+ name: { type: "string" },
98
+ },
99
+ required: ["name"],
100
+ additionalProperties: false,
101
+ } as const satisfies LixSchemaDefinition;
102
+
103
+ const snapshot = {
104
+ content: {
105
+ foo: "John",
106
+ },
107
+ };
108
+
109
+ const activeVersion = await lix.db
110
+ .selectFrom("active_version")
111
+ .select("version_id")
112
+ .executeTakeFirstOrThrow();
113
+
114
+ expect(() =>
115
+ validateStateMutation({
116
+ lix,
117
+ schema,
118
+ snapshot_content: snapshot.content,
119
+ operation: "insert",
120
+ version_id: activeVersion.version_id,
121
+ })
122
+ ).toThrowError();
123
+ });
124
+
125
+ test("passes when primary key is unique", async () => {
126
+ const lix = await openLix({});
127
+
128
+ const schema = {
129
+ type: "object",
130
+ "x-lix-version": "1.0",
131
+ "x-lix-key": "user",
132
+ "x-lix-primary-key": ["id"],
133
+ properties: {
134
+ id: { type: "string" },
135
+ name: { type: "string" },
136
+ },
137
+ required: ["id", "name"],
138
+ additionalProperties: false,
139
+ } as const satisfies LixSchemaDefinition;
140
+
141
+ const snapshot = {
142
+ content: {
143
+ id: "user1",
144
+ name: "John",
145
+ },
146
+ };
147
+
148
+ const activeVersion = await lix.db
149
+ .selectFrom("active_version")
150
+ .select("version_id")
151
+ .executeTakeFirstOrThrow();
152
+
153
+ expect(() =>
154
+ validateStateMutation({
155
+ lix,
156
+ schema,
157
+ snapshot_content: snapshot.content,
158
+ operation: "insert",
159
+ version_id: activeVersion.version_id,
160
+ })
161
+ ).not.toThrowError();
162
+ });
163
+
164
+ test("throws when primary key violates uniqueness constraint", async () => {
165
+ const lix = await openLix({});
166
+
167
+ const schema = {
168
+ type: "object",
169
+ "x-lix-version": "1.0",
170
+ "x-lix-key": "user",
171
+ "x-lix-primary-key": ["id"],
172
+ properties: {
173
+ id: { type: "string" },
174
+ name: { type: "string" },
175
+ },
176
+ required: ["id", "name"],
177
+ additionalProperties: false,
178
+ } as const satisfies LixSchemaDefinition;
179
+
180
+ // Store the schema first
181
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
182
+
183
+ // Insert first user into state
184
+ await lix.db
185
+ .insertInto("state_all")
186
+ .values({
187
+ entity_id: "user1",
188
+ file_id: "file1",
189
+ schema_key: "user",
190
+ plugin_key: "test_plugin",
191
+ version_id: lix.db.selectFrom("active_version").select("version_id"),
192
+ snapshot_content: { id: "user1", name: "John" },
193
+ schema_version: "1.0",
194
+ })
195
+ .execute();
196
+
197
+ // Try to insert another user with same primary key
198
+ const duplicateSnapshot = {
199
+ content: {
200
+ id: "user1",
201
+ name: "Jane",
202
+ },
203
+ };
204
+
205
+ const activeVersion = await lix.db
206
+ .selectFrom("active_version")
207
+ .select("version_id")
208
+ .executeTakeFirstOrThrow();
209
+
210
+ expect(() =>
211
+ validateStateMutation({
212
+ lix,
213
+ schema,
214
+ snapshot_content: duplicateSnapshot.content,
215
+ operation: "insert",
216
+ version_id: activeVersion.version_id,
217
+ })
218
+ ).toThrowError("Primary key constraint violation");
219
+ });
220
+
221
+ test("handles composite primary keys", async () => {
222
+ const lix = await openLix({});
223
+
224
+ const schema = {
225
+ type: "object",
226
+ "x-lix-version": "1.0",
227
+ "x-lix-key": "user_role",
228
+ "x-lix-primary-key": ["user_id", "role_id"],
229
+ properties: {
230
+ user_id: { type: "string" },
231
+ role_id: { type: "string" },
232
+ assigned_date: { type: "string" },
233
+ },
234
+ required: ["user_id", "role_id", "assigned_date"],
235
+ additionalProperties: false,
236
+ } as const satisfies LixSchemaDefinition;
237
+
238
+ // Store the schema first
239
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
240
+
241
+ // Insert first user-role into state
242
+ await lix.db
243
+ .insertInto("state_all")
244
+ .values({
245
+ entity_id: "user_role1",
246
+ file_id: "file1",
247
+ schema_key: "user_role",
248
+ plugin_key: "test_plugin",
249
+ version_id: lix.db.selectFrom("active_version").select("version_id"),
250
+ snapshot_content: {
251
+ user_id: "user1",
252
+ role_id: "admin",
253
+ assigned_date: "2024-01-01",
254
+ },
255
+ schema_version: "1.0",
256
+ })
257
+ .execute();
258
+
259
+ const activeVersion = await lix.db
260
+ .selectFrom("active_version")
261
+ .select("version_id")
262
+ .executeTakeFirstOrThrow();
263
+
264
+ // This should pass (different composite key)
265
+ expect(() =>
266
+ validateStateMutation({
267
+ lix,
268
+ schema,
269
+ snapshot_content: {
270
+ user_id: "user1",
271
+ role_id: "editor",
272
+ assigned_date: "2024-01-02",
273
+ },
274
+ operation: "insert",
275
+ version_id: activeVersion.version_id,
276
+ })
277
+ ).not.toThrowError();
278
+
279
+ // This should fail (same composite key)
280
+ expect(() =>
281
+ validateStateMutation({
282
+ lix,
283
+ schema,
284
+ snapshot_content: {
285
+ user_id: "user1",
286
+ role_id: "admin",
287
+ assigned_date: "2024-01-03",
288
+ },
289
+ operation: "insert",
290
+ version_id: activeVersion.version_id,
291
+ })
292
+ ).toThrowError("Primary key constraint violation");
293
+ });
294
+
295
+ test("passes when unique constraint is satisfied", async () => {
296
+ const lix = await openLix({});
297
+
298
+ const activeVersion = await lix.db
299
+ .selectFrom("active_version")
300
+ .select("version_id")
301
+ .executeTakeFirstOrThrow();
302
+
303
+ const schema = {
304
+ type: "object",
305
+ "x-lix-version": "1.0",
306
+ "x-lix-key": "user",
307
+ "x-lix-primary-key": ["id"],
308
+ "x-lix-unique": [["email"], ["username"]],
309
+ properties: {
310
+ id: { type: "string" },
311
+ email: { type: "string" },
312
+ username: { type: "string" },
313
+ name: { type: "string" },
314
+ },
315
+ required: ["id", "email", "username", "name"],
316
+ additionalProperties: false,
317
+ } as const satisfies LixSchemaDefinition;
318
+
319
+ const snapshot = {
320
+ content: {
321
+ id: "user1",
322
+ email: "john@example.com",
323
+ username: "john_doe",
324
+ name: "John Doe",
325
+ },
326
+ };
327
+
328
+ expect(() =>
329
+ validateStateMutation({
330
+ lix,
331
+ schema,
332
+ snapshot_content: snapshot.content,
333
+ version_id: activeVersion.version_id,
334
+ operation: "insert",
335
+ })
336
+ ).not.toThrowError();
337
+ });
338
+
339
+ test("throws when single field unique constraint is violated", async () => {
340
+ const lix = await openLix({});
341
+
342
+ const schema = {
343
+ type: "object",
344
+ "x-lix-version": "1.0",
345
+ "x-lix-key": "user",
346
+ "x-lix-primary-key": ["id"],
347
+ "x-lix-unique": [["email"], ["username"]],
348
+ properties: {
349
+ id: { type: "string" },
350
+ email: { type: "string" },
351
+ username: { type: "string" },
352
+ name: { type: "string" },
353
+ },
354
+ required: ["id", "email", "username", "name"],
355
+ additionalProperties: false,
356
+ } as const satisfies LixSchemaDefinition;
357
+
358
+ // Store the schema first
359
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
360
+
361
+ // Insert first user into state
362
+ await lix.db
363
+ .insertInto("state_all")
364
+ .values({
365
+ entity_id: "user1",
366
+ file_id: "file1",
367
+ schema_key: "user",
368
+ plugin_key: "test_plugin",
369
+ version_id: lix.db.selectFrom("active_version").select("version_id"),
370
+ snapshot_content: {
371
+ id: "user1",
372
+ email: "john@example.com",
373
+ username: "john_doe",
374
+ name: "John Doe",
375
+ },
376
+ schema_version: "1.0",
377
+ })
378
+ .execute();
379
+
380
+ // Try to insert another user with same email (unique constraint violation)
381
+ const duplicateEmailSnapshot = {
382
+ content: {
383
+ id: "user2",
384
+ email: "john@example.com", // Same email
385
+ username: "jane_doe",
386
+ name: "Jane Doe",
387
+ },
388
+ };
389
+
390
+ const activeVersion = await lix.db
391
+ .selectFrom("active_version")
392
+ .select("version_id")
393
+ .executeTakeFirstOrThrow();
394
+
395
+ expect(() =>
396
+ validateStateMutation({
397
+ lix,
398
+ schema,
399
+ snapshot_content: duplicateEmailSnapshot.content,
400
+ operation: "insert",
401
+ version_id: activeVersion.version_id,
402
+ })
403
+ ).toThrowError("Unique constraint violation");
404
+
405
+ // Try to insert another user with same username (unique constraint violation)
406
+ const duplicateUsernameSnapshot = {
407
+ content: {
408
+ id: "user3",
409
+ email: "jane@example.com",
410
+ username: "john_doe", // Same username
411
+ name: "Jane Smith",
412
+ },
413
+ };
414
+
415
+ expect(() =>
416
+ validateStateMutation({
417
+ lix,
418
+ schema,
419
+ snapshot_content: duplicateUsernameSnapshot.content,
420
+ operation: "insert",
421
+ version_id: activeVersion.version_id,
422
+ })
423
+ ).toThrowError("Unique constraint violation");
424
+ });
425
+
426
+ test("handles composite unique constraints", async () => {
427
+ const lix = await openLix({});
428
+
429
+ const schema = {
430
+ type: "object",
431
+ "x-lix-version": "1.0",
432
+ "x-lix-key": "product",
433
+ "x-lix-primary-key": ["id"],
434
+ "x-lix-unique": [
435
+ ["category", "name"], // Composite unique constraint
436
+ ["sku"], // Single field unique constraint
437
+ ],
438
+ properties: {
439
+ id: { type: "string" },
440
+ category: { type: "string" },
441
+ name: { type: "string" },
442
+ sku: { type: "string" },
443
+ price: { type: "number" },
444
+ },
445
+ required: ["id", "category", "name", "sku", "price"],
446
+ additionalProperties: false,
447
+ } as const satisfies LixSchemaDefinition;
448
+
449
+ // Store the schema first
450
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
451
+
452
+ // Insert first product into state
453
+ await lix.db
454
+ .insertInto("state_all")
455
+ .values({
456
+ entity_id: "product1",
457
+ file_id: "file1",
458
+ schema_key: "product",
459
+ plugin_key: "test_plugin",
460
+ version_id: lix.db.selectFrom("active_version").select("version_id"),
461
+ snapshot_content: {
462
+ id: "product1",
463
+ category: "electronics",
464
+ name: "Laptop",
465
+ sku: "ELEC-LAP-001",
466
+ price: 999.99,
467
+ },
468
+ schema_version: "1.0",
469
+ })
470
+ .execute();
471
+
472
+ const activeVersion = await lix.db
473
+ .selectFrom("active_version")
474
+ .select("version_id")
475
+ .executeTakeFirstOrThrow();
476
+
477
+ // This should pass (different composite unique key)
478
+ expect(() =>
479
+ validateStateMutation({
480
+ lix,
481
+ schema,
482
+ snapshot_content: {
483
+ id: "product2",
484
+ category: "electronics",
485
+ name: "Desktop", // Different name in same category
486
+ sku: "ELEC-DES-001",
487
+ price: 1299.99,
488
+ },
489
+ operation: "insert",
490
+ version_id: activeVersion.version_id,
491
+ })
492
+ ).not.toThrowError();
493
+
494
+ // This should pass (same name in different category)
495
+ expect(() =>
496
+ validateStateMutation({
497
+ lix,
498
+ schema,
499
+ snapshot_content: {
500
+ id: "product3",
501
+ category: "furniture", // Different category
502
+ name: "Laptop", // Same name but different category
503
+ sku: "FURN-LAP-001",
504
+ price: 599.99,
505
+ },
506
+ operation: "insert",
507
+ version_id: activeVersion.version_id,
508
+ })
509
+ ).not.toThrowError();
510
+
511
+ // This should fail (same composite unique key: category + name)
512
+ expect(() =>
513
+ validateStateMutation({
514
+ lix,
515
+ schema,
516
+ snapshot_content: {
517
+ id: "product4",
518
+ category: "electronics",
519
+ name: "Laptop", // Same category + name combination
520
+ sku: "ELEC-LAP-002",
521
+ price: 899.99,
522
+ },
523
+ operation: "insert",
524
+ version_id: activeVersion.version_id,
525
+ })
526
+ ).toThrowError("Unique constraint violation");
527
+
528
+ // This should fail (same SKU)
529
+ expect(() =>
530
+ validateStateMutation({
531
+ lix,
532
+ schema,
533
+ snapshot_content: {
534
+ id: "product5",
535
+ category: "accessories",
536
+ name: "Mouse",
537
+ sku: "ELEC-LAP-001", // Same SKU
538
+ price: 29.99,
539
+ },
540
+ operation: "insert",
541
+ version_id: activeVersion.version_id,
542
+ })
543
+ ).toThrowError("Unique constraint violation");
544
+ });
545
+
546
+ test("passes when foreign key references exist", async () => {
547
+ const lix = await openLix({});
548
+
549
+ const userSchema = {
550
+ type: "object",
551
+ "x-lix-version": "1.0",
552
+ "x-lix-key": "user",
553
+ "x-lix-primary-key": ["id"],
554
+ properties: {
555
+ id: { type: "string" },
556
+ name: { type: "string" },
557
+ },
558
+ required: ["id", "name"],
559
+ additionalProperties: false,
560
+ } as const satisfies LixSchemaDefinition;
561
+
562
+ const postSchema = {
563
+ type: "object",
564
+ "x-lix-version": "1.0",
565
+ "x-lix-key": "post",
566
+ "x-lix-primary-key": ["id"],
567
+ "x-lix-foreign-keys": [
568
+ {
569
+ properties: ["author_id"],
570
+ references: {
571
+ schemaKey: "user",
572
+ properties: ["id"],
573
+ },
574
+ },
575
+ ],
576
+ properties: {
577
+ id: { type: "string" },
578
+ author_id: { type: "string" },
579
+ title: { type: "string" },
580
+ },
581
+ required: ["id", "author_id", "title"],
582
+ additionalProperties: false,
583
+ } as const satisfies LixSchemaDefinition;
584
+
585
+ // Store schemas
586
+ await lix.db
587
+ .insertInto("stored_schema")
588
+ .values([{ value: userSchema }, { value: postSchema }])
589
+ .execute();
590
+
591
+ // Insert a user that will be referenced
592
+ await lix.db
593
+ .insertInto("state_all")
594
+ .values({
595
+ entity_id: "user1",
596
+ file_id: "file1",
597
+ schema_key: "user",
598
+ plugin_key: "test_plugin",
599
+ version_id: lix.db.selectFrom("active_version").select("version_id"),
600
+ snapshot_content: {
601
+ id: "user1",
602
+ name: "John Doe",
603
+ },
604
+ schema_version: "1.0",
605
+ })
606
+ .execute();
607
+
608
+ const activeVersion = await lix.db
609
+ .selectFrom("active_version")
610
+ .select("version_id")
611
+ .executeTakeFirstOrThrow();
612
+
613
+ // This should pass - foreign key reference exists
614
+ expect(() =>
615
+ validateStateMutation({
616
+ lix,
617
+ schema: postSchema,
618
+ snapshot_content: {
619
+ id: "post1",
620
+ author_id: "user1",
621
+ title: "My First Post",
622
+ },
623
+ operation: "insert",
624
+ version_id: activeVersion.version_id,
625
+ })
626
+ ).not.toThrowError();
627
+ });
628
+
629
+ test("throws when foreign key reference does not exist", async () => {
630
+ const lix = await openLix({});
631
+
632
+ const userSchema = {
633
+ type: "object",
634
+ "x-lix-version": "1.0",
635
+ "x-lix-key": "user",
636
+ "x-lix-primary-key": ["id"],
637
+ properties: {
638
+ id: { type: "string" },
639
+ name: { type: "string" },
640
+ },
641
+ required: ["id", "name"],
642
+ additionalProperties: false,
643
+ } as const satisfies LixSchemaDefinition;
644
+
645
+ const postSchema = {
646
+ type: "object",
647
+ "x-lix-version": "1.0",
648
+ "x-lix-key": "post",
649
+ "x-lix-primary-key": ["id"],
650
+ "x-lix-foreign-keys": [
651
+ {
652
+ properties: ["author_id"],
653
+ references: {
654
+ schemaKey: "user",
655
+ properties: ["id"],
656
+ },
657
+ },
658
+ ],
659
+ properties: {
660
+ id: { type: "string" },
661
+ author_id: { type: "string" },
662
+ title: { type: "string" },
663
+ },
664
+ required: ["id", "author_id", "title"],
665
+ additionalProperties: false,
666
+ } as const satisfies LixSchemaDefinition;
667
+
668
+ // Store schemas
669
+ await lix.db
670
+ .insertInto("stored_schema")
671
+ .values([{ value: userSchema }, { value: postSchema }])
672
+ .execute();
673
+
674
+ const activeVersion = await lix.db
675
+ .selectFrom("active_version")
676
+ .select("version_id")
677
+ .executeTakeFirstOrThrow();
678
+
679
+ // This should fail - foreign key reference does not exist
680
+ expect(() =>
681
+ validateStateMutation({
682
+ lix,
683
+ schema: postSchema,
684
+ snapshot_content: {
685
+ id: "post1",
686
+ author_id: "nonexistent_user",
687
+ title: "My First Post",
688
+ },
689
+ operation: "insert",
690
+ version_id: activeVersion.version_id,
691
+ })
692
+ ).toThrowError("Foreign key constraint violation");
693
+ });
694
+
695
+ test("handles multiple foreign keys", async () => {
696
+ const lix = await openLix({});
697
+
698
+ const userSchema = {
699
+ type: "object",
700
+ "x-lix-version": "1.0",
701
+ "x-lix-key": "user",
702
+ "x-lix-primary-key": ["id"],
703
+ properties: {
704
+ id: { type: "string" },
705
+ name: { type: "string" },
706
+ },
707
+ required: ["id", "name"],
708
+ additionalProperties: false,
709
+ } as const satisfies LixSchemaDefinition;
710
+
711
+ const categorySchema = {
712
+ type: "object",
713
+ "x-lix-version": "1.0",
714
+ "x-lix-key": "category",
715
+ "x-lix-primary-key": ["id"],
716
+ properties: {
717
+ id: { type: "string" },
718
+ name: { type: "string" },
719
+ },
720
+ required: ["id", "name"],
721
+ additionalProperties: false,
722
+ } as const satisfies LixSchemaDefinition;
723
+
724
+ const postSchema = {
725
+ type: "object",
726
+ "x-lix-version": "1.0",
727
+ "x-lix-key": "post",
728
+ "x-lix-primary-key": ["id"],
729
+ "x-lix-foreign-keys": [
730
+ {
731
+ properties: ["author_id"],
732
+ references: {
733
+ schemaKey: "user",
734
+ properties: ["id"],
735
+ },
736
+ },
737
+ {
738
+ properties: ["category_id"],
739
+ references: {
740
+ schemaKey: "category",
741
+ properties: ["id"],
742
+ },
743
+ },
744
+ ],
745
+ properties: {
746
+ id: { type: "string" },
747
+ author_id: { type: "string" },
748
+ category_id: { type: "string" },
749
+ title: { type: "string" },
750
+ },
751
+ required: ["id", "author_id", "category_id", "title"],
752
+ additionalProperties: false,
753
+ } as const satisfies LixSchemaDefinition;
754
+
755
+ // Store schemas
756
+ await lix.db
757
+ .insertInto("stored_schema")
758
+ .values([
759
+ { value: userSchema },
760
+ { value: categorySchema },
761
+ { value: postSchema },
762
+ ])
763
+ .execute();
764
+
765
+ // Insert referenced entities
766
+ await lix.db
767
+ .insertInto("state_all")
768
+ .values([
769
+ {
770
+ entity_id: "user1",
771
+ file_id: "file1",
772
+ schema_key: "user",
773
+ plugin_key: "test_plugin",
774
+ version_id: lix.db.selectFrom("active_version").select("version_id"),
775
+ snapshot_content: {
776
+ id: "user1",
777
+ name: "John Doe",
778
+ },
779
+ schema_version: "1.0",
780
+ },
781
+ {
782
+ entity_id: "category1",
783
+ file_id: "file1",
784
+ schema_key: "category",
785
+ plugin_key: "test_plugin",
786
+ version_id: lix.db.selectFrom("active_version").select("version_id"),
787
+ snapshot_content: {
788
+ id: "category1",
789
+ name: "Technology",
790
+ },
791
+ schema_version: "1.0",
792
+ },
793
+ ])
794
+ .execute();
795
+
796
+ const activeVersion = await lix.db
797
+ .selectFrom("active_version")
798
+ .select("version_id")
799
+ .executeTakeFirstOrThrow();
800
+
801
+ // This should pass - all foreign key references exist
802
+ expect(() =>
803
+ validateStateMutation({
804
+ lix,
805
+ schema: postSchema,
806
+ snapshot_content: {
807
+ id: "post1",
808
+ author_id: "user1",
809
+ category_id: "category1",
810
+ title: "My Tech Post",
811
+ },
812
+ operation: "insert",
813
+ version_id: activeVersion.version_id,
814
+ })
815
+ ).not.toThrowError();
816
+
817
+ // This should fail - category reference does not exist
818
+ expect(() =>
819
+ validateStateMutation({
820
+ lix,
821
+ schema: postSchema,
822
+ snapshot_content: {
823
+ id: "post2",
824
+ author_id: "user1",
825
+ category_id: "nonexistent_category",
826
+ title: "Another Post",
827
+ },
828
+ operation: "insert",
829
+ version_id: activeVersion.version_id,
830
+ })
831
+ ).toThrowError("Foreign key constraint violation");
832
+ });
833
+
834
+ test("allows null foreign key values", async () => {
835
+ const lix = await openLix({});
836
+
837
+ const userSchema = {
838
+ type: "object",
839
+ "x-lix-version": "1.0",
840
+ "x-lix-key": "user",
841
+ "x-lix-primary-key": ["id"],
842
+ properties: {
843
+ id: { type: "string" },
844
+ name: { type: "string" },
845
+ },
846
+ required: ["id", "name"],
847
+ additionalProperties: false,
848
+ } as const satisfies LixSchemaDefinition;
849
+
850
+ const postSchema = {
851
+ type: "object",
852
+ "x-lix-version": "1.0",
853
+ "x-lix-key": "post",
854
+ "x-lix-primary-key": ["id"],
855
+ "x-lix-foreign-keys": [
856
+ {
857
+ properties: ["author_id"],
858
+ references: {
859
+ schemaKey: "user",
860
+ properties: ["id"],
861
+ },
862
+ },
863
+ ],
864
+ properties: {
865
+ id: { type: "string" },
866
+ author_id: { type: ["string", "null"] },
867
+ title: { type: "string" },
868
+ },
869
+ required: ["id", "title"],
870
+ additionalProperties: false,
871
+ } as const satisfies LixSchemaDefinition;
872
+
873
+ // Store schemas
874
+ await lix.db
875
+ .insertInto("stored_schema")
876
+ .values([{ value: userSchema }, { value: postSchema }])
877
+ .execute();
878
+
879
+ const activeVersion = await lix.db
880
+ .selectFrom("active_version")
881
+ .select("version_id")
882
+ .executeTakeFirstOrThrow();
883
+
884
+ // This should pass - null foreign key is allowed
885
+ expect(() =>
886
+ validateStateMutation({
887
+ lix,
888
+ schema: postSchema,
889
+ snapshot_content: {
890
+ id: "post1",
891
+ author_id: null,
892
+ title: "Anonymous Post",
893
+ },
894
+ operation: "insert",
895
+ version_id: activeVersion.version_id,
896
+ })
897
+ ).not.toThrowError();
898
+
899
+ // This should also pass - undefined foreign key (when not required)
900
+ expect(() =>
901
+ validateStateMutation({
902
+ lix,
903
+ schema: postSchema,
904
+ snapshot_content: {
905
+ id: "post2",
906
+ title: "Another Anonymous Post",
907
+ },
908
+ operation: "insert",
909
+ version_id: activeVersion.version_id,
910
+ })
911
+ ).not.toThrowError();
912
+ });
913
+
914
+ test("handles composite foreign keys", async () => {
915
+ const lix = await openLix({});
916
+
917
+ // Create a schema that uses composite primary key
918
+ const addressSchema = {
919
+ type: "object",
920
+ "x-lix-version": "1.0",
921
+ "x-lix-key": "address",
922
+ "x-lix-primary-key": ["country", "postal_code", "street"],
923
+ properties: {
924
+ country: { type: "string" },
925
+ postal_code: { type: "string" },
926
+ street: { type: "string" },
927
+ city: { type: "string" },
928
+ },
929
+ required: ["country", "postal_code", "street", "city"],
930
+ additionalProperties: false,
931
+ } as const satisfies LixSchemaDefinition;
932
+
933
+ // Create a schema that references the composite key
934
+ const deliverySchema = {
935
+ type: "object",
936
+ "x-lix-version": "1.0",
937
+ "x-lix-key": "delivery",
938
+ "x-lix-primary-key": ["id"],
939
+ "x-lix-foreign-keys": [
940
+ {
941
+ properties: ["address_country", "address_postal", "address_street"],
942
+ references: {
943
+ schemaKey: "address",
944
+ properties: ["country", "postal_code", "street"],
945
+ },
946
+ },
947
+ ],
948
+ properties: {
949
+ id: { type: "string" },
950
+ address_country: { type: "string" },
951
+ address_postal: { type: "string" },
952
+ address_street: { type: "string" },
953
+ package_id: { type: "string" },
954
+ },
955
+ required: [
956
+ "id",
957
+ "address_country",
958
+ "address_postal",
959
+ "address_street",
960
+ "package_id",
961
+ ],
962
+ additionalProperties: false,
963
+ } as const satisfies LixSchemaDefinition;
964
+
965
+ // Store schemas
966
+ await lix.db
967
+ .insertInto("stored_schema")
968
+ .values([{ value: addressSchema }, { value: deliverySchema }])
969
+ .execute();
970
+
971
+ // Insert an address that will be referenced
972
+ await lix.db
973
+ .insertInto("state_all")
974
+ .values({
975
+ entity_id: "addr1",
976
+ file_id: "file1",
977
+ schema_key: "address",
978
+ plugin_key: "test_plugin",
979
+ version_id: lix.db.selectFrom("active_version").select("version_id"),
980
+ snapshot_content: {
981
+ country: "USA",
982
+ postal_code: "12345",
983
+ street: "123 Main St",
984
+ city: "Springfield",
985
+ },
986
+ schema_version: "1.0",
987
+ })
988
+ .execute();
989
+
990
+ const activeVersion = await lix.db
991
+ .selectFrom("active_version")
992
+ .select("version_id")
993
+ .executeTakeFirstOrThrow();
994
+
995
+ // This should pass - composite foreign key reference exists
996
+ expect(() =>
997
+ validateStateMutation({
998
+ lix,
999
+ schema: deliverySchema,
1000
+ snapshot_content: {
1001
+ id: "delivery1",
1002
+ address_country: "USA",
1003
+ address_postal: "12345",
1004
+ address_street: "123 Main St",
1005
+ package_id: "pkg123",
1006
+ },
1007
+ operation: "insert",
1008
+ version_id: activeVersion.version_id,
1009
+ })
1010
+ ).not.toThrowError();
1011
+
1012
+ // This should fail - composite foreign key reference doesn't exist (wrong postal code)
1013
+ expect(() =>
1014
+ validateStateMutation({
1015
+ lix,
1016
+ schema: deliverySchema,
1017
+ snapshot_content: {
1018
+ id: "delivery2",
1019
+ address_country: "USA",
1020
+ address_postal: "54321", // Wrong postal code
1021
+ address_street: "123 Main St",
1022
+ package_id: "pkg456",
1023
+ },
1024
+ operation: "insert",
1025
+ version_id: activeVersion.version_id,
1026
+ })
1027
+ ).toThrowError(
1028
+ /Foreign key constraint violation.*address_country, address_postal, address_street.*referencing.*address.*country, postal_code, street/
1029
+ );
1030
+ });
1031
+
1032
+ test("foreign key referencing real SQL table (change.id)", async () => {
1033
+ const lix = await openLix({});
1034
+
1035
+ // Insert a real change record into the change table
1036
+ await lix.db
1037
+ // @ts-expect-error - internal_snapshot is not a public table
1038
+ .insertInto("internal_snapshot")
1039
+ .values({
1040
+ id: "snap1",
1041
+ content: sql`jsonb(${JSON.stringify({ id: "entity1" })})`,
1042
+ })
1043
+ .execute();
1044
+
1045
+ await lix.db
1046
+ // @ts-expect-error - internal_change is not a public table
1047
+ .insertInto("internal_change")
1048
+ .values({
1049
+ id: "change1",
1050
+ entity_id: "entity1",
1051
+ plugin_key: "test_plugin",
1052
+ schema_key: "test_schema",
1053
+ schema_version: "1.0",
1054
+ file_id: "file1",
1055
+ snapshot_id: "snap1",
1056
+ })
1057
+ .execute();
1058
+
1059
+ const changeSetElementSchema = {
1060
+ type: "object",
1061
+ "x-lix-version": "1.0",
1062
+ "x-lix-key": "change_set_element_test",
1063
+ "x-lix-foreign-keys": [
1064
+ {
1065
+ properties: ["change_id"],
1066
+ references: {
1067
+ schemaKey: "lix_change",
1068
+ properties: ["id"],
1069
+ },
1070
+ },
1071
+ ],
1072
+ properties: {
1073
+ id: { type: "string" },
1074
+ change_id: { type: "string" },
1075
+ },
1076
+ required: ["id", "change_id"],
1077
+ additionalProperties: false,
1078
+ } as const satisfies LixSchemaDefinition;
1079
+
1080
+ const activeVersion = await lix.db
1081
+ .selectFrom("active_version")
1082
+ .select("version_id")
1083
+ .executeTakeFirstOrThrow();
1084
+
1085
+ // This should pass - foreign key references existing change record
1086
+ expect(() =>
1087
+ validateStateMutation({
1088
+ lix,
1089
+ schema: changeSetElementSchema,
1090
+ snapshot_content: {
1091
+ id: "element1",
1092
+ change_id: "change1",
1093
+ },
1094
+ operation: "insert",
1095
+ version_id: activeVersion.version_id,
1096
+ })
1097
+ ).not.toThrowError();
1098
+
1099
+ // This should fail - foreign key references non-existent change
1100
+ expect(() =>
1101
+ validateStateMutation({
1102
+ lix,
1103
+ schema: changeSetElementSchema,
1104
+ snapshot_content: {
1105
+ id: "element2",
1106
+ change_id: "nonexistent_change",
1107
+ },
1108
+ operation: "insert",
1109
+ version_id: activeVersion.version_id,
1110
+ })
1111
+ ).toThrowError("Foreign key constraint violation");
1112
+ });
1113
+
1114
+ test("allows updates with same primary key", async () => {
1115
+ const lix = await openLix({});
1116
+
1117
+ const activeVersion = await lix.db
1118
+ .selectFrom("active_version")
1119
+ .select("version_id")
1120
+ .executeTakeFirstOrThrow();
1121
+
1122
+ const schema = {
1123
+ type: "object",
1124
+ "x-lix-version": "1.0",
1125
+ "x-lix-key": "user",
1126
+ "x-lix-primary-key": ["id"],
1127
+ properties: {
1128
+ id: { type: "string" },
1129
+ name: { type: "string" },
1130
+ },
1131
+ required: ["id", "name"],
1132
+ additionalProperties: false,
1133
+ } as const satisfies LixSchemaDefinition;
1134
+
1135
+ // Store the schema first
1136
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
1137
+
1138
+ // Insert initial user
1139
+ await lix.db
1140
+ .insertInto("state_all")
1141
+ .values({
1142
+ entity_id: "user1",
1143
+ file_id: "file1",
1144
+ schema_key: "user",
1145
+ plugin_key: "test_plugin",
1146
+ version_id: lix.db.selectFrom("active_version").select("version_id"),
1147
+ snapshot_content: { id: "user1", name: "John Doe" },
1148
+ schema_version: "1.0",
1149
+ })
1150
+ .execute();
1151
+
1152
+ // This should pass - updating existing record with same primary key
1153
+ expect(() =>
1154
+ validateStateMutation({
1155
+ lix,
1156
+ schema,
1157
+ snapshot_content: {
1158
+ id: "user1", // Same primary key
1159
+ name: "John Smith", // Different data
1160
+ },
1161
+ operation: "update",
1162
+ entity_id: "user1",
1163
+ version_id: activeVersion.version_id,
1164
+ })
1165
+ ).not.toThrowError();
1166
+ });
1167
+
1168
+ test("unique constraints are validated per version, not globally", async () => {
1169
+ const lix = await openLix({});
1170
+
1171
+ const schema = {
1172
+ type: "object",
1173
+ "x-lix-version": "1.0",
1174
+ "x-lix-key": "file",
1175
+ "x-lix-primary-key": ["id"],
1176
+ "x-lix-unique": [["path"]], // Unique path constraint
1177
+ properties: {
1178
+ id: { type: "string" },
1179
+ path: { type: "string" },
1180
+ content: { type: "string" },
1181
+ },
1182
+ required: ["id", "path", "content"],
1183
+ additionalProperties: false,
1184
+ } as const satisfies LixSchemaDefinition;
1185
+
1186
+ // Store the schema first
1187
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
1188
+
1189
+ // Create two different versions
1190
+ await createVersion({
1191
+ lix,
1192
+ id: "version0",
1193
+ });
1194
+
1195
+ await createVersion({
1196
+ lix,
1197
+ id: "version1",
1198
+ });
1199
+ // Insert file with path "/app.js" in version1
1200
+ await lix.db
1201
+ .insertInto("state_all")
1202
+ .values({
1203
+ entity_id: "file1",
1204
+ file_id: "file1",
1205
+ schema_key: "file",
1206
+ plugin_key: "test_plugin",
1207
+ version_id: "version0",
1208
+ snapshot_content: {
1209
+ id: "file1",
1210
+ path: "/app.js",
1211
+ content: "console.log('version 0');",
1212
+ },
1213
+ schema_version: "1.0",
1214
+ })
1215
+ .execute();
1216
+
1217
+ // This should pass - same path in different version should be allowed
1218
+ expect(() =>
1219
+ validateStateMutation({
1220
+ lix,
1221
+ schema,
1222
+ snapshot_content: {
1223
+ id: "file2",
1224
+ path: "/app.js", // Same path but different version
1225
+ content: "console.log('version 1');",
1226
+ },
1227
+ operation: "insert",
1228
+ version_id: "version1",
1229
+ })
1230
+ ).not.toThrowError();
1231
+
1232
+ // This should fail - same path in same version
1233
+ expect(() =>
1234
+ validateStateMutation({
1235
+ lix,
1236
+ schema,
1237
+ snapshot_content: {
1238
+ id: "file3",
1239
+ path: "/app.js", // Same path and same version
1240
+ content: "console.log('duplicate');",
1241
+ },
1242
+ operation: "insert",
1243
+ version_id: "version0",
1244
+ })
1245
+ ).toThrowError("Unique constraint violation");
1246
+ });
1247
+
1248
+ test("throws when version_id is not provided", async () => {
1249
+ const lix = await openLix({});
1250
+
1251
+ const schema = {
1252
+ type: "object",
1253
+ "x-lix-version": "1.0",
1254
+ "x-lix-key": "user",
1255
+ "x-lix-primary-key": ["id"],
1256
+ properties: {
1257
+ id: { type: "string" },
1258
+ name: { type: "string" },
1259
+ },
1260
+ required: ["id", "name"],
1261
+ additionalProperties: false,
1262
+ } as const satisfies LixSchemaDefinition;
1263
+
1264
+ expect(() =>
1265
+ validateStateMutation({
1266
+ lix,
1267
+ schema,
1268
+ snapshot_content: { id: "user1", name: "John" },
1269
+ operation: "insert",
1270
+ // @ts-expect-error - version_id is required but missing
1271
+ version_id: undefined,
1272
+ })
1273
+ ).toThrowError("version_id is required");
1274
+ });
1275
+
1276
+ test("throws when referenced version does not exist", async () => {
1277
+ const lix = await openLix({});
1278
+
1279
+ const schema = {
1280
+ type: "object",
1281
+ "x-lix-version": "1.0",
1282
+ "x-lix-key": "user",
1283
+ "x-lix-primary-key": ["id"],
1284
+ properties: {
1285
+ id: { type: "string" },
1286
+ name: { type: "string" },
1287
+ },
1288
+ required: ["id", "name"],
1289
+ additionalProperties: false,
1290
+ } as const satisfies LixSchemaDefinition;
1291
+
1292
+ expect(() =>
1293
+ validateStateMutation({
1294
+ lix,
1295
+ schema,
1296
+ snapshot_content: { id: "user1", name: "John" },
1297
+ operation: "insert",
1298
+ version_id: "nonexistent_version",
1299
+ })
1300
+ ).toThrowError("Version with id 'nonexistent_version' does not exist");
1301
+ });
1302
+
1303
+ test("passes when version_id is provided and version exists", async () => {
1304
+ const lix = await openLix({});
1305
+
1306
+ const schema = {
1307
+ type: "object",
1308
+ "x-lix-version": "1.0",
1309
+ "x-lix-key": "user",
1310
+ "x-lix-primary-key": ["id"],
1311
+ properties: {
1312
+ id: { type: "string" },
1313
+ name: { type: "string" },
1314
+ },
1315
+ required: ["id", "name"],
1316
+ additionalProperties: false,
1317
+ } as const satisfies LixSchemaDefinition;
1318
+
1319
+ const activeVersion = await lix.db
1320
+ .selectFrom("active_version")
1321
+ .select("version_id")
1322
+ .executeTakeFirstOrThrow();
1323
+
1324
+ expect(() =>
1325
+ validateStateMutation({
1326
+ lix,
1327
+ schema,
1328
+ snapshot_content: { id: "user1", name: "John" },
1329
+ operation: "insert",
1330
+ version_id: activeVersion.version_id,
1331
+ })
1332
+ ).not.toThrowError();
1333
+ });
1334
+
1335
+ test("should prevent deletion when foreign keys reference the entity", async () => {
1336
+ const lix = await openLix({});
1337
+
1338
+ const userSchema = {
1339
+ type: "object",
1340
+ "x-lix-version": "1.0",
1341
+ "x-lix-key": "user",
1342
+ "x-lix-primary-key": ["id"],
1343
+ properties: {
1344
+ id: { type: "string" },
1345
+ name: { type: "string" },
1346
+ },
1347
+ required: ["id", "name"],
1348
+ additionalProperties: false,
1349
+ } as const satisfies LixSchemaDefinition;
1350
+
1351
+ const postSchema = {
1352
+ type: "object",
1353
+ "x-lix-version": "1.0",
1354
+ "x-lix-key": "post",
1355
+ "x-lix-primary-key": ["id"],
1356
+ "x-lix-foreign-keys": [
1357
+ {
1358
+ properties: ["author_id"],
1359
+ references: {
1360
+ schemaKey: "user",
1361
+ properties: ["id"],
1362
+ },
1363
+ },
1364
+ ],
1365
+ properties: {
1366
+ id: { type: "string" },
1367
+ author_id: { type: "string" },
1368
+ title: { type: "string" },
1369
+ },
1370
+ required: ["id", "author_id", "title"],
1371
+ additionalProperties: false,
1372
+ } as const satisfies LixSchemaDefinition;
1373
+
1374
+ // Store schemas
1375
+ await lix.db
1376
+ .insertInto("stored_schema")
1377
+ .values([{ value: userSchema }, { value: postSchema }])
1378
+ .execute();
1379
+
1380
+ const activeVersion = await lix.db
1381
+ .selectFrom("active_version")
1382
+ .select("version_id")
1383
+ .executeTakeFirstOrThrow();
1384
+
1385
+ // Insert a user that will be referenced
1386
+ await lix.db
1387
+ .insertInto("state_all")
1388
+ .values({
1389
+ entity_id: "user1",
1390
+ file_id: "file1",
1391
+ schema_key: "user",
1392
+ plugin_key: "test_plugin",
1393
+ version_id: activeVersion.version_id,
1394
+ snapshot_content: {
1395
+ id: "user1",
1396
+ name: "John Doe",
1397
+ },
1398
+ schema_version: "1.0",
1399
+ })
1400
+ .execute();
1401
+
1402
+ // Insert a post that references the user
1403
+ await lix.db
1404
+ .insertInto("state_all")
1405
+ .values({
1406
+ entity_id: "post1",
1407
+ file_id: "file1",
1408
+ schema_key: "post",
1409
+ plugin_key: "test_plugin",
1410
+ version_id: activeVersion.version_id,
1411
+ snapshot_content: {
1412
+ id: "post1",
1413
+ author_id: "user1",
1414
+ title: "My First Post",
1415
+ },
1416
+ schema_version: "1.0",
1417
+ })
1418
+ .execute();
1419
+
1420
+ // This should fail - cannot delete user because post references it
1421
+ expect(() =>
1422
+ validateStateMutation({
1423
+ lix,
1424
+ schema: userSchema,
1425
+ snapshot_content: {}, // Not used for delete operations
1426
+ operation: "delete",
1427
+ entity_id: "user1",
1428
+ version_id: activeVersion.version_id,
1429
+ })
1430
+ ).toThrowError(
1431
+ /Foreign key constraint violation.*referenced by.*post.*author_id/i
1432
+ );
1433
+ });
1434
+
1435
+ test("should allow deletion when no foreign keys reference the entity", async () => {
1436
+ const lix = await openLix({});
1437
+
1438
+ const userSchema = {
1439
+ type: "object",
1440
+ "x-lix-version": "1.0",
1441
+ "x-lix-key": "user",
1442
+ "x-lix-primary-key": ["id"],
1443
+ properties: {
1444
+ id: { type: "string" },
1445
+ name: { type: "string" },
1446
+ },
1447
+ required: ["id", "name"],
1448
+ additionalProperties: false,
1449
+ } as const satisfies LixSchemaDefinition;
1450
+
1451
+ // Store schema
1452
+ await lix.db
1453
+ .insertInto("stored_schema")
1454
+ .values({ value: userSchema })
1455
+ .execute();
1456
+
1457
+ const activeVersion = await lix.db
1458
+ .selectFrom("active_version")
1459
+ .select("version_id")
1460
+ .executeTakeFirstOrThrow();
1461
+
1462
+ // Insert a user with no references
1463
+ await lix.db
1464
+ .insertInto("state_all")
1465
+ .values({
1466
+ entity_id: "user1",
1467
+ file_id: "file1",
1468
+ schema_key: "user",
1469
+ plugin_key: "test_plugin",
1470
+ version_id: activeVersion.version_id,
1471
+ snapshot_content: {
1472
+ id: "user1",
1473
+ name: "John Doe",
1474
+ },
1475
+ schema_version: "1.0",
1476
+ })
1477
+ .execute();
1478
+
1479
+ // This should pass - no foreign keys reference this user
1480
+ expect(() =>
1481
+ validateStateMutation({
1482
+ lix,
1483
+ schema: userSchema,
1484
+ snapshot_content: {}, // Not used for delete operations
1485
+ operation: "delete",
1486
+ entity_id: "user1",
1487
+ version_id: activeVersion.version_id,
1488
+ })
1489
+ ).not.toThrowError();
1490
+ });
1491
+
1492
+ test("should throw when deleting non-existent entity", async () => {
1493
+ const lix = await openLix({});
1494
+
1495
+ const userSchema = {
1496
+ type: "object",
1497
+ "x-lix-version": "1.0",
1498
+ "x-lix-key": "user",
1499
+ "x-lix-primary-key": ["id"],
1500
+ properties: {
1501
+ id: { type: "string" },
1502
+ name: { type: "string" },
1503
+ },
1504
+ required: ["id", "name"],
1505
+ additionalProperties: false,
1506
+ } as const satisfies LixSchemaDefinition;
1507
+
1508
+ const activeVersion = await lix.db
1509
+ .selectFrom("active_version")
1510
+ .select("version_id")
1511
+ .executeTakeFirstOrThrow();
1512
+
1513
+ // This should fail - entity does not exist
1514
+ expect(() =>
1515
+ validateStateMutation({
1516
+ lix,
1517
+ schema: userSchema,
1518
+ snapshot_content: {},
1519
+ operation: "delete",
1520
+ entity_id: "nonexistent_user",
1521
+ version_id: activeVersion.version_id,
1522
+ })
1523
+ ).toThrowError(/Entity deletion failed/);
1524
+ });
1525
+
1526
+ test("should throw when entity_id is missing for delete operations", async () => {
1527
+ const lix = await openLix({});
1528
+
1529
+ const userSchema = {
1530
+ type: "object",
1531
+ "x-lix-version": "1.0",
1532
+ "x-lix-key": "user",
1533
+ "x-lix-primary-key": ["id"],
1534
+ properties: {
1535
+ id: { type: "string" },
1536
+ name: { type: "string" },
1537
+ },
1538
+ required: ["id", "name"],
1539
+ additionalProperties: false,
1540
+ } as const satisfies LixSchemaDefinition;
1541
+
1542
+ const activeVersion = await lix.db
1543
+ .selectFrom("active_version")
1544
+ .select("version_id")
1545
+ .executeTakeFirstOrThrow();
1546
+
1547
+ // This should fail - entity_id is required for delete
1548
+ expect(() =>
1549
+ validateStateMutation({
1550
+ lix,
1551
+ schema: userSchema,
1552
+ snapshot_content: {},
1553
+ operation: "delete",
1554
+ // entity_id is missing
1555
+ version_id: activeVersion.version_id,
1556
+ })
1557
+ ).toThrowError("entity_id is required for delete operations");
1558
+ });
1559
+
1560
+ test("should handle deletion validation for change sets referenced by versions", async () => {
1561
+ const lix = await openLix({});
1562
+
1563
+ // Create change sets
1564
+ await lix.db
1565
+ .insertInto("change_set_all")
1566
+ .values([
1567
+ { id: "cs_referenced", lixcol_version_id: "global" },
1568
+ { id: "cs_working", lixcol_version_id: "global" },
1569
+ ])
1570
+ .execute();
1571
+
1572
+ // Create commits that reference the change sets
1573
+ await lix.db
1574
+ .insertInto("commit_all")
1575
+ .values([
1576
+ {
1577
+ id: "commit_1",
1578
+ change_set_id: "cs_referenced",
1579
+ lixcol_version_id: "global",
1580
+ },
1581
+ {
1582
+ id: "working_commit_1",
1583
+ change_set_id: "cs_working",
1584
+ lixcol_version_id: "global",
1585
+ },
1586
+ ])
1587
+ .execute();
1588
+
1589
+ // Create a version that references the commits
1590
+ await lix.db
1591
+ .insertInto("version")
1592
+ .values({
1593
+ id: "v1",
1594
+ name: "test_version",
1595
+ commit_id: "commit_1",
1596
+ working_commit_id: "working_commit_1",
1597
+ })
1598
+ .execute();
1599
+
1600
+ // const activeVersion = await lix.db
1601
+ // .selectFrom("active_version")
1602
+ // .select("version_id")
1603
+ // .executeTakeFirstOrThrow();
1604
+
1605
+ // Get the change set schema
1606
+ const changeSetSchema = await lix.db
1607
+ .selectFrom("stored_schema")
1608
+ .select("value")
1609
+ .where("key", "=", "lix_change_set")
1610
+ .executeTakeFirstOrThrow();
1611
+
1612
+ // This should fail - cannot delete change set because version references it
1613
+ expect(() =>
1614
+ validateStateMutation({
1615
+ lix,
1616
+ schema: changeSetSchema.value as LixSchemaDefinition,
1617
+ snapshot_content: {},
1618
+ operation: "delete",
1619
+ entity_id: "cs_referenced",
1620
+ version_id: "global",
1621
+ })
1622
+ ).toThrowError(
1623
+ /Foreign key constraint violation.*Cannot delete entity.*referenced by.*lix_commit/i
1624
+ );
1625
+ });
1626
+
1627
+ test("should parse JSON object properties before validation", async () => {
1628
+ const lix = await openLix({});
1629
+
1630
+ // Define a schema with an object property
1631
+ const documentSchema = {
1632
+ type: "object",
1633
+ "x-lix-version": "1.0",
1634
+ "x-lix-key": "document",
1635
+ "x-lix-primary-key": ["id"],
1636
+ properties: {
1637
+ id: { type: "string" },
1638
+ title: { type: "string" },
1639
+ body: {
1640
+ type: "object",
1641
+ properties: {
1642
+ type: { type: "string" },
1643
+ content: { type: "array" },
1644
+ },
1645
+ required: ["type", "content"],
1646
+ },
1647
+ },
1648
+ required: ["id", "title", "body"],
1649
+ additionalProperties: false,
1650
+ } as const satisfies LixSchemaDefinition;
1651
+
1652
+ // Store the schema
1653
+ await lix.db
1654
+ .insertInto("stored_schema")
1655
+ .values({ value: documentSchema })
1656
+ .execute();
1657
+
1658
+ const activeVersion = await lix.db
1659
+ .selectFrom("active_version")
1660
+ .select("version_id")
1661
+ .executeTakeFirstOrThrow();
1662
+
1663
+ // Test with valid JSON object - this should pass
1664
+ const validSnapshotContent = {
1665
+ id: "doc1",
1666
+ title: "Test Document",
1667
+ body: JSON.stringify({
1668
+ type: "zettel_doc",
1669
+ content: [
1670
+ {
1671
+ type: "zettel_text_block",
1672
+ zettel_key: "test_key",
1673
+ style: "zettel_normal",
1674
+ children: [],
1675
+ },
1676
+ ],
1677
+ }),
1678
+ };
1679
+
1680
+ expect(() =>
1681
+ validateStateMutation({
1682
+ lix,
1683
+ schema: documentSchema,
1684
+ snapshot_content: validSnapshotContent,
1685
+ operation: "insert",
1686
+ version_id: activeVersion.version_id,
1687
+ })
1688
+ ).not.toThrowError();
1689
+
1690
+ // Test with invalid JSON object - this should fail
1691
+ const invalidSnapshotContent = {
1692
+ id: "doc2",
1693
+ title: "Invalid Document",
1694
+ body: JSON.stringify({
1695
+ type: "invalid_type", // Missing required 'content' property
1696
+ }),
1697
+ };
1698
+
1699
+ expect(() =>
1700
+ validateStateMutation({
1701
+ lix,
1702
+ schema: documentSchema,
1703
+ snapshot_content: invalidSnapshotContent,
1704
+ operation: "insert",
1705
+ version_id: activeVersion.version_id,
1706
+ })
1707
+ ).toThrowError(/body.*must have required property.*content/);
1708
+
1709
+ // Test with malformed JSON string - this should fail
1710
+ const malformedSnapshotContent = {
1711
+ id: "doc3",
1712
+ title: "Malformed Document",
1713
+ body: "{ invalid json",
1714
+ };
1715
+
1716
+ expect(() =>
1717
+ validateStateMutation({
1718
+ lix,
1719
+ schema: documentSchema,
1720
+ snapshot_content: malformedSnapshotContent,
1721
+ operation: "insert",
1722
+ version_id: activeVersion.version_id,
1723
+ })
1724
+ ).toThrowError(/Invalid JSON in property 'body'/);
1725
+ });
1726
+
1727
+ test("foreign key validation should fail when referenced entity exists in different non-inheriting version", async () => {
1728
+ const lix = await openLix({});
1729
+
1730
+ // Mock schema for a "User" entity
1731
+ const userSchema = {
1732
+ "x-lix-key": "mock_user",
1733
+ "x-lix-version": "1.0",
1734
+ "x-lix-primary-key": ["id"],
1735
+ type: "object",
1736
+ properties: {
1737
+ id: { type: "string" },
1738
+ name: { type: "string" },
1739
+ },
1740
+ required: ["id", "name"],
1741
+ additionalProperties: false,
1742
+ } as const satisfies LixSchemaDefinition;
1743
+
1744
+ // Mock schema for a "Post" entity that references User
1745
+ const postSchema = {
1746
+ "x-lix-key": "mock_post",
1747
+ "x-lix-version": "1.0",
1748
+ "x-lix-primary-key": ["id"],
1749
+ "x-lix-foreign-keys": [
1750
+ {
1751
+ properties: ["author_id"],
1752
+ references: {
1753
+ schemaKey: "mock_user",
1754
+ properties: ["id"],
1755
+ },
1756
+ },
1757
+ ],
1758
+ type: "object",
1759
+ properties: {
1760
+ id: { type: "string" },
1761
+ title: { type: "string" },
1762
+ author_id: { type: "string" },
1763
+ },
1764
+ required: ["id", "title", "author_id"],
1765
+ additionalProperties: false,
1766
+ } as const satisfies LixSchemaDefinition;
1767
+
1768
+ // Register our mock schemas
1769
+ await lix.db
1770
+ .insertInto("stored_schema")
1771
+ .values([{ value: userSchema }, { value: postSchema }])
1772
+ .execute();
1773
+
1774
+ // Create two separate versions that don't inherit from each other
1775
+ const versionA = await createVersion({
1776
+ lix,
1777
+ name: "version-a",
1778
+ });
1779
+
1780
+ const versionB = await createVersion({
1781
+ lix,
1782
+ name: "version-b",
1783
+ });
1784
+
1785
+ // Verify they don't inherit from each other
1786
+ // Both should inherit from global, but not from each other
1787
+ expect(versionA.inherits_from_version_id).toBe("global");
1788
+ expect(versionB.inherits_from_version_id).toBe("global");
1789
+
1790
+ // Create a user in version A
1791
+ await lix.db
1792
+ .insertInto("state_all")
1793
+ .values({
1794
+ entity_id: "user-1",
1795
+ schema_key: "mock_user",
1796
+ file_id: "test",
1797
+ plugin_key: "test_plugin",
1798
+ snapshot_content: {
1799
+ id: "user-1",
1800
+ name: "Alice",
1801
+ },
1802
+ schema_version: "1.0",
1803
+ version_id: versionA.id,
1804
+ })
1805
+ .execute();
1806
+
1807
+ // BUG: This should FAIL because user-1 doesn't exist in version B's context
1808
+ // but the current foreign key validation logic will find user-1 in version A
1809
+ // and incorrectly allow this validation to succeed
1810
+ expect(() =>
1811
+ validateStateMutation({
1812
+ lix,
1813
+ schema: postSchema,
1814
+ snapshot_content: {
1815
+ id: "post-1",
1816
+ title: "My Post",
1817
+ author_id: "user-1", // References user-1 which only exists in version A
1818
+ },
1819
+ operation: "insert",
1820
+ version_id: versionB.id,
1821
+ })
1822
+ ).toThrow(/Foreign key constraint violation.*mock_user.*user-1/);
1823
+
1824
+ // Verify that user-1 indeed doesn't exist in version B's context
1825
+ const userInVersionB = await lix.db
1826
+ .selectFrom("state_all")
1827
+ .where("entity_id", "=", "user-1")
1828
+ .where("schema_key", "=", "mock_user")
1829
+ .where("version_id", "=", versionB.id)
1830
+ .selectAll()
1831
+ .execute();
1832
+
1833
+ expect(userInVersionB).toHaveLength(0);
1834
+
1835
+ // But verify it does exist in version A
1836
+ const userInVersionA = await lix.db
1837
+ .selectFrom("state_all")
1838
+ .where("entity_id", "=", "user-1")
1839
+ .where("schema_key", "=", "mock_user")
1840
+ .where("version_id", "=", versionA.id)
1841
+ .selectAll()
1842
+ .execute();
1843
+
1844
+ expect(userInVersionA).toHaveLength(1);
1845
+ });
1846
+
1847
+ test("should allow self-referential foreign keys", async () => {
1848
+ const lix = await openLix({});
1849
+
1850
+ // Define a schema with self-referential foreign key (like version inheritance)
1851
+ const versionSchema = {
1852
+ type: "object",
1853
+ "x-lix-version": "1.0",
1854
+ "x-lix-key": "mock_version",
1855
+ "x-lix-primary-key": ["id"],
1856
+ "x-lix-foreign-keys": [
1857
+ {
1858
+ properties: ["inherits_from_version_id"],
1859
+ references: {
1860
+ schemaKey: "mock_version", // Self-referential foreign key
1861
+ properties: ["id"],
1862
+ },
1863
+ },
1864
+ ],
1865
+ properties: {
1866
+ id: { type: "string" },
1867
+ name: { type: "string" },
1868
+ inherits_from_version_id: { type: ["string", "null"] },
1869
+ },
1870
+ required: ["id", "name"],
1871
+ additionalProperties: false,
1872
+ } as const satisfies LixSchemaDefinition;
1873
+
1874
+ // Store the schema
1875
+ await lix.db
1876
+ .insertInto("stored_schema")
1877
+ .values({ value: versionSchema })
1878
+ .execute();
1879
+
1880
+ const activeVersion = await lix.db
1881
+ .selectFrom("active_version")
1882
+ .select("version_id")
1883
+ .executeTakeFirstOrThrow();
1884
+
1885
+ // Insert a parent version first (with null inheritance)
1886
+ await lix.db
1887
+ .insertInto("state_all")
1888
+ .values({
1889
+ entity_id: "version0",
1890
+ file_id: "file1",
1891
+ schema_key: "mock_version",
1892
+ plugin_key: "test_plugin",
1893
+ version_id: activeVersion.version_id,
1894
+ snapshot_content: {
1895
+ id: "version0",
1896
+ name: "version0",
1897
+ inherits_from_version_id: null,
1898
+ },
1899
+ schema_version: "1.0",
1900
+ })
1901
+ .execute();
1902
+
1903
+ // This should pass - child version referencing parent version (valid self-referential FK)
1904
+ expect(() =>
1905
+ validateStateMutation({
1906
+ lix,
1907
+ schema: versionSchema,
1908
+ snapshot_content: {
1909
+ id: "version1",
1910
+ name: "version1",
1911
+ inherits_from_version_id: "version0", // References another entity in same schema
1912
+ },
1913
+ operation: "insert",
1914
+ version_id: activeVersion.version_id,
1915
+ })
1916
+ ).not.toThrowError();
1917
+
1918
+ // This should also pass - version with null inheritance (no foreign key constraint)
1919
+ expect(() =>
1920
+ validateStateMutation({
1921
+ lix,
1922
+ schema: versionSchema,
1923
+ snapshot_content: {
1924
+ id: "version2",
1925
+ name: "version2",
1926
+ inherits_from_version_id: null, // No foreign key reference
1927
+ },
1928
+ operation: "insert",
1929
+ version_id: activeVersion.version_id,
1930
+ })
1931
+ ).not.toThrowError();
1932
+
1933
+ // This should fail - referencing non-existent version
1934
+ expect(() =>
1935
+ validateStateMutation({
1936
+ lix,
1937
+ schema: versionSchema,
1938
+ snapshot_content: {
1939
+ id: "version3",
1940
+ name: "version3",
1941
+ inherits_from_version_id: "nonexistent_version",
1942
+ },
1943
+ operation: "insert",
1944
+ version_id: activeVersion.version_id,
1945
+ })
1946
+ ).toThrowError("Foreign key constraint violation");
1947
+ });
1948
+
1949
+ test("should allow self-referential foreign keys for update operations", async () => {
1950
+ const lix = await openLix({});
1951
+
1952
+ // Define a schema with self-referential foreign key
1953
+ const versionSchema = {
1954
+ type: "object",
1955
+ "x-lix-version": "1.0",
1956
+ "x-lix-key": "mock_version",
1957
+ "x-lix-primary-key": ["id"],
1958
+ "x-lix-foreign-keys": [
1959
+ {
1960
+ properties: ["inherits_from_version_id"],
1961
+ references: {
1962
+ schemaKey: "mock_version",
1963
+ properties: ["id"],
1964
+ },
1965
+ },
1966
+ ],
1967
+ properties: {
1968
+ id: { type: "string" },
1969
+ name: { type: "string" },
1970
+ inherits_from_version_id: { type: ["string", "null"] },
1971
+ },
1972
+ required: ["id", "name"],
1973
+ additionalProperties: false,
1974
+ } as const satisfies LixSchemaDefinition;
1975
+
1976
+ // Store the schema
1977
+ await lix.db
1978
+ .insertInto("stored_schema")
1979
+ .values({ value: versionSchema })
1980
+ .execute();
1981
+
1982
+ const activeVersion = await lix.db
1983
+ .selectFrom("active_version")
1984
+ .select("version_id")
1985
+ .executeTakeFirstOrThrow();
1986
+
1987
+ // Insert initial versions
1988
+ await lix.db
1989
+ .insertInto("state_all")
1990
+ .values([
1991
+ {
1992
+ entity_id: "version0",
1993
+ file_id: "file1",
1994
+ schema_key: "mock_version",
1995
+ plugin_key: "test_plugin",
1996
+ version_id: activeVersion.version_id,
1997
+ snapshot_content: {
1998
+ id: "version0",
1999
+ name: "version0",
2000
+ inherits_from_version_id: null,
2001
+ },
2002
+ schema_version: "1.0",
2003
+ },
2004
+ {
2005
+ entity_id: "version1",
2006
+ file_id: "file1",
2007
+ schema_key: "mock_version",
2008
+ plugin_key: "test_plugin",
2009
+ version_id: activeVersion.version_id,
2010
+ snapshot_content: {
2011
+ id: "version1",
2012
+ name: "version1",
2013
+ inherits_from_version_id: "version0",
2014
+ },
2015
+ schema_version: "1.0",
2016
+ },
2017
+ ])
2018
+ .execute();
2019
+
2020
+ // This should pass - updating to reference a different valid version
2021
+ expect(() =>
2022
+ validateStateMutation({
2023
+ lix,
2024
+ schema: versionSchema,
2025
+ snapshot_content: {
2026
+ id: "version1",
2027
+ name: "version1_updated",
2028
+ inherits_from_version_id: null, // Change from version0 to null
2029
+ },
2030
+ operation: "update",
2031
+ entity_id: "version1",
2032
+ version_id: activeVersion.version_id,
2033
+ })
2034
+ ).not.toThrowError();
2035
+
2036
+ // This should fail - updating to reference non-existent version
2037
+ expect(() =>
2038
+ validateStateMutation({
2039
+ lix,
2040
+ schema: versionSchema,
2041
+ snapshot_content: {
2042
+ id: "version1",
2043
+ name: "version1_updated",
2044
+ inherits_from_version_id: "nonexistent_version",
2045
+ },
2046
+ operation: "update",
2047
+ entity_id: "version1",
2048
+ version_id: activeVersion.version_id,
2049
+ })
2050
+ ).toThrowError("Foreign key constraint violation");
2051
+ });
2052
+
2053
+ test("should prevent deletion when self-referential foreign keys reference the entity", async () => {
2054
+ const lix = await openLix({});
2055
+
2056
+ // Define a schema with self-referential foreign key
2057
+ const versionSchema = {
2058
+ type: "object",
2059
+ "x-lix-version": "1.0",
2060
+ "x-lix-key": "mock_version",
2061
+ "x-lix-primary-key": ["id"],
2062
+ "x-lix-foreign-keys": [
2063
+ {
2064
+ properties: ["inherits_from_version_id"],
2065
+ references: {
2066
+ schemaKey: "mock_version",
2067
+ properties: ["id"],
2068
+ },
2069
+ },
2070
+ ],
2071
+ properties: {
2072
+ id: { type: "string" },
2073
+ name: { type: "string" },
2074
+ inherits_from_version_id: { type: ["string", "null"] },
2075
+ },
2076
+ required: ["id", "name"],
2077
+ additionalProperties: false,
2078
+ } as const satisfies LixSchemaDefinition;
2079
+
2080
+ // Store the schema
2081
+ await lix.db
2082
+ .insertInto("stored_schema")
2083
+ .values({ value: versionSchema })
2084
+ .execute();
2085
+
2086
+ const activeVersion = await lix.db
2087
+ .selectFrom("active_version")
2088
+ .select("version_id")
2089
+ .executeTakeFirstOrThrow();
2090
+
2091
+ // Insert parent and child versions
2092
+ await lix.db
2093
+ .insertInto("state_all")
2094
+ .values([
2095
+ {
2096
+ entity_id: "version0",
2097
+ file_id: "file1",
2098
+ schema_key: "mock_version",
2099
+ plugin_key: "test_plugin",
2100
+ version_id: activeVersion.version_id,
2101
+ snapshot_content: {
2102
+ id: "version0",
2103
+ name: "version0",
2104
+ inherits_from_version_id: null,
2105
+ },
2106
+ schema_version: "1.0",
2107
+ },
2108
+ {
2109
+ entity_id: "version1",
2110
+ file_id: "file1",
2111
+ schema_key: "mock_version",
2112
+ plugin_key: "test_plugin",
2113
+ version_id: activeVersion.version_id,
2114
+ snapshot_content: {
2115
+ id: "version1",
2116
+ name: "version1",
2117
+ inherits_from_version_id: "version0", // References version0
2118
+ },
2119
+ schema_version: "1.0",
2120
+ },
2121
+ ])
2122
+ .execute();
2123
+
2124
+ // This should fail - cannot delete version0 because version1 references it
2125
+ expect(() =>
2126
+ validateStateMutation({
2127
+ lix,
2128
+ schema: versionSchema,
2129
+ snapshot_content: {},
2130
+ operation: "delete",
2131
+ entity_id: "version0",
2132
+ version_id: activeVersion.version_id,
2133
+ })
2134
+ ).toThrowError(
2135
+ /Foreign key constraint violation.*referenced by.*mock_version.*inherits_from_version_id/
2136
+ );
2137
+
2138
+ // This should pass - can delete version1 (no other versions reference it)
2139
+ expect(() =>
2140
+ validateStateMutation({
2141
+ lix,
2142
+ schema: versionSchema,
2143
+ snapshot_content: {},
2144
+ operation: "delete",
2145
+ entity_id: "version1",
2146
+ version_id: activeVersion.version_id,
2147
+ })
2148
+ ).not.toThrowError();
2149
+ });
2150
+
2151
+ // Foreign keys are restricted to the current version context to maintain data integrity
2152
+ // and prevent confusing dependency relationships across version boundaries. While entities
2153
+ // can be inherited from parent versions through the copy-on-write system, foreign key
2154
+ // constraints require explicit, direct relationships within the same version scope.
2155
+ // This design choice ensures that:
2156
+ // 1. FK constraints are predictable and version-scoped
2157
+ // 2. No hidden dependencies exist across version boundaries
2158
+ // 3. Copy-on-write semantics remain clear and isolated
2159
+ // 4. Data integrity is maintained within each version context
2160
+ test("should prevent foreign key references to inherited entities from different version contexts", async () => {
2161
+ const lix = await openLix({});
2162
+
2163
+ // Create a thread in global context
2164
+ await lix.db
2165
+ .insertInto("thread_all")
2166
+ .values({
2167
+ id: "global_thread",
2168
+ metadata: { title: "Global Thread" },
2169
+ lixcol_version_id: "global",
2170
+ })
2171
+ .execute();
2172
+
2173
+ // Get the active version (should be "main" version)
2174
+ const activeVersion = await lix.db
2175
+ .selectFrom("active_version")
2176
+ .select("version_id")
2177
+ .executeTakeFirstOrThrow();
2178
+
2179
+ // Get the thread comment schema
2180
+ const threadCommentSchema = await lix.db
2181
+ .selectFrom("stored_schema")
2182
+ .select("value")
2183
+ .where("key", "=", "lix_thread_comment")
2184
+ .executeTakeFirstOrThrow();
2185
+
2186
+ // This should FAIL: attempting to create a thread_comment in the active version
2187
+ // that references a thread that only exists in global context.
2188
+ // Foreign keys should only work within the same version context.
2189
+ expect(() =>
2190
+ validateStateMutation({
2191
+ lix,
2192
+ schema: threadCommentSchema.value as LixSchemaDefinition,
2193
+ snapshot_content: {
2194
+ id: "comment1",
2195
+ thread_id: "global_thread", // References thread in global context
2196
+ parent_id: null,
2197
+ body: {
2198
+ type: "zettel_doc",
2199
+ content: [
2200
+ {
2201
+ type: "zettel_text_block",
2202
+ zettel_key: "test_key",
2203
+ style: "zettel_normal",
2204
+ children: [],
2205
+ },
2206
+ ],
2207
+ },
2208
+ },
2209
+ operation: "insert",
2210
+ version_id: activeVersion.version_id, // But creating comment in active version context
2211
+ })
2212
+ ).toThrow(/Foreign key constraint violation.*lix_thread.*global_thread/);
2213
+ });
2214
+
2215
+ test("should prevent change set elements from referencing change sets defined in global context", async () => {
2216
+ const lix = await openLix({});
2217
+
2218
+ // Create a change set in global context
2219
+ await lix.db
2220
+ .insertInto("change_set_all")
2221
+ .values({
2222
+ id: "global_change_set",
2223
+ lixcol_version_id: "global",
2224
+ })
2225
+ .execute();
2226
+
2227
+ // Get the active version (should be "main" version)
2228
+ const activeVersion = await lix.db
2229
+ .selectFrom("active_version")
2230
+ .select("version_id")
2231
+ .executeTakeFirstOrThrow();
2232
+
2233
+ // Get the change set element schema
2234
+ const changeSetElementSchema = await lix.db
2235
+ .selectFrom("stored_schema")
2236
+ .select("value")
2237
+ .where("key", "=", "lix_change_set_element")
2238
+ .executeTakeFirstOrThrow();
2239
+
2240
+ // This should FAIL: attempting to create a change_set_element in the active version
2241
+ // that references a change set that exists in global context.
2242
+ // The bug is that this currently passes when it should fail.
2243
+ expect(() =>
2244
+ validateStateMutation({
2245
+ lix,
2246
+ schema: changeSetElementSchema.value as LixSchemaDefinition,
2247
+ snapshot_content: {
2248
+ change_set_id: "global_change_set", // References change set in global context
2249
+ change_id: "dummy_change_id",
2250
+ entity_id: "dummy_entity_id",
2251
+ file_id: "dummy_file_id",
2252
+ schema_key: "dummy_schema_key",
2253
+ } satisfies LixChangeSetElement,
2254
+ operation: "insert",
2255
+ version_id: activeVersion.version_id, // But creating element in active version context
2256
+ })
2257
+ ).toThrow(
2258
+ /Foreign key constraint violation.*lix_change_set.*global_change_set/
2259
+ );
2260
+ });
2261
+
2262
+ // Untracked state foreign key tests
2263
+ // SCENARIO: Tracked → Untracked Foreign Key Reference
2264
+ // WHY THIS TEST EXISTS: Untracked entities are local-only and won't be synced to remote.
2265
+ // If a tracked entity references an untracked entity, it would create broken references
2266
+ // when synced because the untracked entity doesn't exist on the remote.
2267
+ // BEHAVIOR: DISALLOWED - This would break data integrity during sync operations.
2268
+ test("should prevent tracked entities from referencing untracked entities", async () => {
2269
+ const lix = await openLix({});
2270
+
2271
+ const userSchema = {
2272
+ type: "object",
2273
+ "x-lix-version": "1.0",
2274
+ "x-lix-key": "user",
2275
+ "x-lix-primary-key": ["id"],
2276
+ properties: {
2277
+ id: { type: "string" },
2278
+ name: { type: "string" },
2279
+ },
2280
+ required: ["id", "name"],
2281
+ additionalProperties: false,
2282
+ } as const satisfies LixSchemaDefinition;
2283
+
2284
+ const postSchema = {
2285
+ type: "object",
2286
+ "x-lix-version": "1.0",
2287
+ "x-lix-key": "post",
2288
+ "x-lix-primary-key": ["id"],
2289
+ "x-lix-foreign-keys": [
2290
+ {
2291
+ properties: ["author_id"],
2292
+ references: {
2293
+ schemaKey: "user",
2294
+ properties: ["id"],
2295
+ },
2296
+ },
2297
+ ],
2298
+ properties: {
2299
+ id: { type: "string" },
2300
+ author_id: { type: "string" },
2301
+ title: { type: "string" },
2302
+ },
2303
+ required: ["id", "author_id", "title"],
2304
+ additionalProperties: false,
2305
+ } as const satisfies LixSchemaDefinition;
2306
+
2307
+ // Store schemas
2308
+ await lix.db
2309
+ .insertInto("stored_schema")
2310
+ .values([{ value: userSchema }, { value: postSchema }])
2311
+ .execute();
2312
+
2313
+ const activeVersion = await lix.db
2314
+ .selectFrom("active_version")
2315
+ .select("version_id")
2316
+ .executeTakeFirstOrThrow();
2317
+
2318
+ // Insert an untracked user
2319
+ await lix.db
2320
+ .insertInto("state_all")
2321
+ .values({
2322
+ entity_id: "untracked_user",
2323
+ file_id: "file1",
2324
+ schema_key: "user",
2325
+ plugin_key: "test_plugin",
2326
+ version_id: activeVersion.version_id,
2327
+ snapshot_content: {
2328
+ id: "untracked_user",
2329
+ name: "Untracked User",
2330
+ },
2331
+ schema_version: "1.0",
2332
+ untracked: true,
2333
+ })
2334
+ .execute();
2335
+
2336
+ // This should FAIL - tracked entity cannot reference untracked entity
2337
+ expect(() =>
2338
+ validateStateMutation({
2339
+ lix,
2340
+ schema: postSchema,
2341
+ snapshot_content: {
2342
+ id: "post1",
2343
+ author_id: "untracked_user", // References untracked user
2344
+ title: "My Post",
2345
+ },
2346
+ operation: "insert",
2347
+ version_id: activeVersion.version_id,
2348
+ })
2349
+ ).toThrow(
2350
+ /Foreign key constraint violation.*tracked entities cannot reference untracked entities.*This would create broken references during sync/
2351
+ );
2352
+ });
2353
+
2354
+ // SCENARIO: Untracked → Tracked Foreign Key Reference
2355
+ // WHY THIS TEST EXISTS: Untracked entities are local-only and won't be synced.
2356
+ // Since they remain local, they can safely reference tracked entities without
2357
+ // breaking data integrity. The untracked entity simply won't exist on remote.
2358
+ // BEHAVIOR: ALLOWED - Safe because untracked entities don't participate in sync.
2359
+ test("should allow untracked entities to reference tracked entities", async () => {
2360
+ const lix = await openLix({});
2361
+
2362
+ const userSchema = {
2363
+ type: "object",
2364
+ "x-lix-version": "1.0",
2365
+ "x-lix-key": "user",
2366
+ "x-lix-primary-key": ["id"],
2367
+ properties: {
2368
+ id: { type: "string" },
2369
+ name: { type: "string" },
2370
+ },
2371
+ required: ["id", "name"],
2372
+ additionalProperties: false,
2373
+ } as const satisfies LixSchemaDefinition;
2374
+
2375
+ const postSchema = {
2376
+ type: "object",
2377
+ "x-lix-version": "1.0",
2378
+ "x-lix-key": "post",
2379
+ "x-lix-primary-key": ["id"],
2380
+ "x-lix-foreign-keys": [
2381
+ {
2382
+ properties: ["author_id"],
2383
+ references: {
2384
+ schemaKey: "user",
2385
+ properties: ["id"],
2386
+ },
2387
+ },
2388
+ ],
2389
+ properties: {
2390
+ id: { type: "string" },
2391
+ author_id: { type: "string" },
2392
+ title: { type: "string" },
2393
+ },
2394
+ required: ["id", "author_id", "title"],
2395
+ additionalProperties: false,
2396
+ } as const satisfies LixSchemaDefinition;
2397
+
2398
+ // Store schemas
2399
+ await lix.db
2400
+ .insertInto("stored_schema")
2401
+ .values([{ value: userSchema }, { value: postSchema }])
2402
+ .execute();
2403
+
2404
+ const activeVersion = await lix.db
2405
+ .selectFrom("active_version")
2406
+ .select("version_id")
2407
+ .executeTakeFirstOrThrow();
2408
+
2409
+ // Insert a tracked user
2410
+ await lix.db
2411
+ .insertInto("state_all")
2412
+ .values({
2413
+ entity_id: "tracked_user",
2414
+ file_id: "file1",
2415
+ schema_key: "user",
2416
+ plugin_key: "test_plugin",
2417
+ version_id: activeVersion.version_id,
2418
+ snapshot_content: {
2419
+ id: "tracked_user",
2420
+ name: "Tracked User",
2421
+ },
2422
+ schema_version: "1.0",
2423
+ untracked: false,
2424
+ })
2425
+ .execute();
2426
+
2427
+ // Create validation arguments for untracked post
2428
+ const validationArgs = {
2429
+ lix,
2430
+ schema: postSchema,
2431
+ snapshot_content: {
2432
+ id: "untracked_post",
2433
+ author_id: "tracked_user", // References tracked user
2434
+ title: "My Untracked Post",
2435
+ },
2436
+ operation: "insert" as const,
2437
+ version_id: activeVersion.version_id,
2438
+ untracked: true, // Mark as untracked
2439
+ };
2440
+
2441
+ // This should PASS - untracked entity can reference tracked entity
2442
+ expect(() => validateStateMutation(validationArgs)).not.toThrow();
2443
+ });
2444
+
2445
+ // SCENARIO: Untracked → Untracked Foreign Key Reference
2446
+ // WHY THIS TEST EXISTS: Both entities are local-only and won't be synced.
2447
+ // They exist in the same local scope, so references between them are valid
2448
+ // and won't cause any sync issues since neither entity leaves the local system.
2449
+ // BEHAVIOR: ALLOWED - Both entities remain local, maintaining referential integrity.
2450
+ test("should allow untracked entities to reference other untracked entities", async () => {
2451
+ const lix = await openLix({});
2452
+
2453
+ const userSchema = {
2454
+ type: "object",
2455
+ "x-lix-version": "1.0",
2456
+ "x-lix-key": "user",
2457
+ "x-lix-primary-key": ["id"],
2458
+ properties: {
2459
+ id: { type: "string" },
2460
+ name: { type: "string" },
2461
+ },
2462
+ required: ["id", "name"],
2463
+ additionalProperties: false,
2464
+ } as const satisfies LixSchemaDefinition;
2465
+
2466
+ const postSchema = {
2467
+ type: "object",
2468
+ "x-lix-version": "1.0",
2469
+ "x-lix-key": "post",
2470
+ "x-lix-primary-key": ["id"],
2471
+ "x-lix-foreign-keys": [
2472
+ {
2473
+ properties: ["author_id"],
2474
+ references: {
2475
+ schemaKey: "user",
2476
+ properties: ["id"],
2477
+ },
2478
+ },
2479
+ ],
2480
+ properties: {
2481
+ id: { type: "string" },
2482
+ author_id: { type: "string" },
2483
+ title: { type: "string" },
2484
+ },
2485
+ required: ["id", "author_id", "title"],
2486
+ additionalProperties: false,
2487
+ } as const satisfies LixSchemaDefinition;
2488
+
2489
+ // Store schemas
2490
+ await lix.db
2491
+ .insertInto("stored_schema")
2492
+ .values([{ value: userSchema }, { value: postSchema }])
2493
+ .execute();
2494
+
2495
+ const activeVersion = await lix.db
2496
+ .selectFrom("active_version")
2497
+ .select("version_id")
2498
+ .executeTakeFirstOrThrow();
2499
+
2500
+ // Insert an untracked user
2501
+ await lix.db
2502
+ .insertInto("state_all")
2503
+ .values({
2504
+ entity_id: "untracked_user",
2505
+ file_id: "file1",
2506
+ schema_key: "user",
2507
+ plugin_key: "test_plugin",
2508
+ version_id: activeVersion.version_id,
2509
+ snapshot_content: {
2510
+ id: "untracked_user",
2511
+ name: "Untracked User",
2512
+ },
2513
+ schema_version: "1.0",
2514
+ untracked: true,
2515
+ })
2516
+ .execute();
2517
+
2518
+ // Create validation arguments for untracked post
2519
+ const validationArgs = {
2520
+ lix,
2521
+ schema: postSchema,
2522
+ snapshot_content: {
2523
+ id: "untracked_post",
2524
+ author_id: "untracked_user", // References untracked user
2525
+ title: "My Untracked Post",
2526
+ },
2527
+ operation: "insert" as const,
2528
+ version_id: activeVersion.version_id,
2529
+ untracked: true, // Mark as untracked
2530
+ };
2531
+
2532
+ // This should PASS - untracked entity can reference another untracked entity
2533
+ expect(() => validateStateMutation(validationArgs)).not.toThrow();
2534
+ });
2535
+
2536
+ test("should detect and prevent cycles in commit graph when lix_debug is enabled", async () => {
2537
+ const lix = await openLix({
2538
+ keyValues: [{ key: "lix_debug", value: "true" }],
2539
+ });
2540
+
2541
+ // Get the commit edge schema
2542
+ const commitEdgeSchema = await lix.db
2543
+ .selectFrom("stored_schema")
2544
+ .select("value")
2545
+ .where("key", "=", "lix_commit_edge")
2546
+ .executeTakeFirstOrThrow();
2547
+
2548
+ // Create a few change sets and commits
2549
+ await lix.db
2550
+ .insertInto("change_set_all")
2551
+ .values([
2552
+ { id: "cs1", lixcol_version_id: "global" },
2553
+ { id: "cs2", lixcol_version_id: "global" },
2554
+ { id: "cs3", lixcol_version_id: "global" },
2555
+ ])
2556
+ .execute();
2557
+
2558
+ await lix.db
2559
+ .insertInto("commit_all")
2560
+ .values([
2561
+ { id: "commit1", change_set_id: "cs1", lixcol_version_id: "global" },
2562
+ { id: "commit2", change_set_id: "cs2", lixcol_version_id: "global" },
2563
+ { id: "commit3", change_set_id: "cs3", lixcol_version_id: "global" },
2564
+ ])
2565
+ .execute();
2566
+
2567
+ // Create edges: commit1 -> commit2 -> commit3
2568
+ await lix.db
2569
+ .insertInto("commit_edge_all")
2570
+ .values([
2571
+ {
2572
+ parent_id: "commit1",
2573
+ child_id: "commit2",
2574
+ lixcol_version_id: "global",
2575
+ },
2576
+ {
2577
+ parent_id: "commit2",
2578
+ child_id: "commit3",
2579
+ lixcol_version_id: "global",
2580
+ },
2581
+ ])
2582
+ .execute();
2583
+
2584
+ // This should fail - creating commit3 -> commit1 would create a cycle
2585
+ expect(() =>
2586
+ validateStateMutation({
2587
+ lix,
2588
+ schema: commitEdgeSchema.value as LixSchemaDefinition,
2589
+ snapshot_content: {
2590
+ parent_id: "commit3",
2591
+ child_id: "commit1", // This would complete the cycle
2592
+ },
2593
+ operation: "insert",
2594
+ version_id: "global",
2595
+ })
2596
+ ).toThrowError(
2597
+ /Cycle detected in commit graph.*New edge: commit3 -> commit1.*Cycle path: commit1 -> commit2 -> commit3 -> commit1/s
2598
+ );
2599
+
2600
+ // This should also fail - self-loop
2601
+ expect(() =>
2602
+ validateStateMutation({
2603
+ lix,
2604
+ schema: commitEdgeSchema.value as LixSchemaDefinition,
2605
+ snapshot_content: {
2606
+ parent_id: "commit1",
2607
+ child_id: "commit1", // Self-referencing edge
2608
+ },
2609
+ operation: "insert",
2610
+ version_id: "global",
2611
+ })
2612
+ ).toThrowError(/Self-referencing edges are not allowed/);
2613
+ });
2614
+
2615
+ test("should not check for cycles when lix_debug is disabled", async () => {
2616
+ const lix = await openLix({
2617
+ keyValues: [{ key: "lix_debug", value: "false" }],
2618
+ });
2619
+
2620
+ // Get the commit edge schema
2621
+ const commitEdgeSchema = await lix.db
2622
+ .selectFrom("stored_schema")
2623
+ .select("value")
2624
+ .where("key", "=", "lix_commit_edge")
2625
+ .executeTakeFirstOrThrow();
2626
+
2627
+ // Create a few change sets and commits
2628
+ await lix.db
2629
+ .insertInto("change_set_all")
2630
+ .values([
2631
+ { id: "cs1", lixcol_version_id: "global" },
2632
+ { id: "cs2", lixcol_version_id: "global" },
2633
+ { id: "cs3", lixcol_version_id: "global" },
2634
+ ])
2635
+ .execute();
2636
+
2637
+ await lix.db
2638
+ .insertInto("commit_all")
2639
+ .values([
2640
+ { id: "commit1", change_set_id: "cs1", lixcol_version_id: "global" },
2641
+ { id: "commit2", change_set_id: "cs2", lixcol_version_id: "global" },
2642
+ { id: "commit3", change_set_id: "cs3", lixcol_version_id: "global" },
2643
+ ])
2644
+ .execute();
2645
+
2646
+ // Create edges: commit1 -> commit2 -> commit3
2647
+ await lix.db
2648
+ .insertInto("commit_edge_all")
2649
+ .values([
2650
+ {
2651
+ parent_id: "commit1",
2652
+ child_id: "commit2",
2653
+ lixcol_version_id: "global",
2654
+ },
2655
+ {
2656
+ parent_id: "commit2",
2657
+ child_id: "commit3",
2658
+ lixcol_version_id: "global",
2659
+ },
2660
+ ])
2661
+ .execute();
2662
+
2663
+ // This would create a cycle, but with lix_debug=false it won't be detected
2664
+ // (This is intentional for performance - cycle detection is expensive)
2665
+ expect(() =>
2666
+ validateStateMutation({
2667
+ lix,
2668
+ schema: commitEdgeSchema.value as LixSchemaDefinition,
2669
+ snapshot_content: {
2670
+ parent_id: "commit3",
2671
+ child_id: "commit1", // This would complete the cycle
2672
+ },
2673
+ operation: "insert",
2674
+ version_id: "global",
2675
+ })
2676
+ ).not.toThrowError();
2677
+ });
2678
+
2679
+ test("should validate foreign keys that reference changes in internal_change_in_transaction during transaction", async () => {
2680
+ const lix = await openLix({});
2681
+
2682
+ // Create a simple mock schema that references a change
2683
+ const mockChangeReferencingSchema = {
2684
+ type: "object",
2685
+ "x-lix-version": "1.0",
2686
+ "x-lix-key": "mock_change_reference",
2687
+ "x-lix-primary-key": ["change_id"],
2688
+ "x-lix-foreign-keys": [
2689
+ {
2690
+ properties: ["change_id"],
2691
+ references: {
2692
+ schemaKey: "lix_change",
2693
+ properties: ["id"],
2694
+ },
2695
+ },
2696
+ ],
2697
+ properties: {
2698
+ change_id: { type: "string" },
2699
+ },
2700
+ required: ["change_id"],
2701
+ additionalProperties: false,
2702
+ } as const satisfies LixSchemaDefinition;
2703
+
2704
+ // Store the mock schema
2705
+ await lix.db
2706
+ .insertInto("stored_schema")
2707
+ .values({ value: mockChangeReferencingSchema })
2708
+ .execute();
2709
+
2710
+ // Get active version
2711
+ const activeVersion = await lix.db
2712
+ .selectFrom("active_version")
2713
+ .select("version_id")
2714
+ .executeTakeFirstOrThrow();
2715
+
2716
+ await lix.db.transaction().execute(async (trx) => {
2717
+ // Insert a key-value entity which creates a change in internal_change_in_transaction
2718
+ await trx
2719
+ .insertInto("key_value")
2720
+ .values({
2721
+ key: "test_key_for_change_reference",
2722
+ value: "test_value",
2723
+ })
2724
+ .execute();
2725
+
2726
+ // Get the change ID that was just created in internal_change_in_transaction
2727
+ const changes = await (trx as unknown as Kysely<LixInternalDatabaseSchema>)
2728
+ .selectFrom("internal_change_in_transaction")
2729
+ .select("id")
2730
+ .where("entity_id", "=", "test_key_for_change_reference")
2731
+ .where("schema_key", "=", "lix_key_value")
2732
+ .execute();
2733
+
2734
+ expect(changes).toHaveLength(1);
2735
+ const changeId = changes[0]!.id;
2736
+
2737
+ // This should NOT throw an error because the change exists in internal_change_in_transaction
2738
+ // But currently it will throw because validation only checks the "change" table (internal_change)
2739
+ // which doesn't include internal_change_in_transaction
2740
+ expect(() =>
2741
+ validateStateMutation({
2742
+ lix: { sqlite: lix.sqlite, db: trx as any },
2743
+ schema: mockChangeReferencingSchema,
2744
+ snapshot_content: {
2745
+ change_id: changeId,
2746
+ },
2747
+ operation: "insert",
2748
+ version_id: activeVersion.version_id,
2749
+ })
2750
+ ).not.toThrowError();
2751
+ });
2752
+ });
2753
+
2754
+ /**
2755
+ * 🧪 Regression-guard for “versionless change FKs”
2756
+ *
2757
+ * Context from architecture discussion:
2758
+ * ─────────────────────────────────────
2759
+ * • `lix_change` rows are **version-agnostic** (no `version_id` column) and
2760
+ * append-only. They form the immutable source-of-truth that every branch
2761
+ * materialises state from.
2762
+ *
2763
+ * • Therefore **any** version-scoped table is allowed to carry a foreign key
2764
+ * that points at `lix_change.id`, because the target row can never disappear
2765
+ * or mutate in a way that would break the reference.
2766
+ *
2767
+ * • The validator treats these targets specially: if the referenced schema’s
2768
+ * scope is `versionless`, it skips the usual “same version” check.
2769
+ *
2770
+ * What this test proves:
2771
+ * ──────────────────────
2772
+ * 1. A table that references `lix_change.id` can be inserted **in the global
2773
+ * context**.
2774
+ * 2. The **same row** can also be inserted in an arbitrary branch
2775
+ * (`activeVersion.version_id`) without triggering a
2776
+ * “foreign-key constraint violation”.
2777
+ *
2778
+ * If either expectation starts failing, it means the validator has regressed
2779
+ * and is once again enforcing version isolation for versionless targets—
2780
+ * something we explicitly decided against.
2781
+ */
2782
+ test("should allow foreign keys to changes from any version context", async () => {
2783
+ const lix = await openLix({});
2784
+
2785
+ // Create a schema that references change.id (like change_author does)
2786
+ const mockSchema = {
2787
+ type: "object",
2788
+ "x-lix-version": "1.0",
2789
+ "x-lix-key": "mock_schema",
2790
+ "x-lix-primary-key": ["change_id"],
2791
+ "x-lix-foreign-keys": [
2792
+ {
2793
+ properties: ["change_id"],
2794
+ references: {
2795
+ schemaKey: "lix_change",
2796
+ properties: ["id"],
2797
+ },
2798
+ },
2799
+ ],
2800
+ properties: {
2801
+ change_id: { type: "string" },
2802
+ },
2803
+ required: ["change_id"],
2804
+ additionalProperties: false,
2805
+ } as const satisfies LixSchemaDefinition;
2806
+
2807
+ // Store the schema
2808
+ await lix.db
2809
+ .insertInto("stored_schema")
2810
+ .values({ value: mockSchema })
2811
+ .execute();
2812
+
2813
+ const activeVersion = await lix.db
2814
+ .selectFrom("active_version")
2815
+ .select("version_id")
2816
+ .executeTakeFirstOrThrow();
2817
+
2818
+ // First create a key-value entity to generate a real change
2819
+ await lix.db
2820
+ .insertInto("key_value")
2821
+ .values({
2822
+ key: "test_key_for_change_ref",
2823
+ value: "test_value",
2824
+ })
2825
+ .execute();
2826
+
2827
+ // Get the change that was created
2828
+ const changes = await lix.db
2829
+ .selectFrom("change")
2830
+ .where("entity_id", "=", "test_key_for_change_ref")
2831
+ .where("schema_key", "=", "lix_key_value")
2832
+ .selectAll()
2833
+ .execute();
2834
+
2835
+ expect(changes).toHaveLength(1);
2836
+ const realChangeId = changes[0]!.id;
2837
+
2838
+ // This should PASS because changes are versionless and can be referenced from global version
2839
+ expect(() =>
2840
+ validateStateMutation({
2841
+ lix,
2842
+ schema: mockSchema,
2843
+ snapshot_content: {
2844
+ change_id: realChangeId,
2845
+ },
2846
+ operation: "insert",
2847
+ version_id: "global",
2848
+ })
2849
+ ).not.toThrowError();
2850
+
2851
+ // This should ALSO PASS because changes are versionless and can be referenced from any version
2852
+ expect(() =>
2853
+ validateStateMutation({
2854
+ lix,
2855
+ schema: mockSchema,
2856
+ snapshot_content: {
2857
+ change_id: realChangeId,
2858
+ },
2859
+ operation: "insert",
2860
+ version_id: activeVersion.version_id,
2861
+ })
2862
+ ).not.toThrowError();
2863
+ });
2864
+
2865
+ // State table foreign key tests
2866
+ test("should validate composite foreign keys referencing state table", async () => {
2867
+ const lix = await openLix({});
2868
+
2869
+ // Create a schema that references state table with composite key (like entity_label does)
2870
+ const mockStateReferenceSchema = {
2871
+ type: "object",
2872
+ "x-lix-version": "1.0",
2873
+ "x-lix-key": "mock_state_reference",
2874
+ "x-lix-primary-key": ["entity_id", "schema_key", "file_id", "tag"],
2875
+ "x-lix-foreign-keys": [
2876
+ {
2877
+ properties: ["entity_id", "schema_key", "file_id"],
2878
+ references: {
2879
+ schemaKey: "state",
2880
+ properties: ["entity_id", "schema_key", "file_id"],
2881
+ },
2882
+ },
2883
+ ],
2884
+ properties: {
2885
+ entity_id: { type: "string" },
2886
+ schema_key: { type: "string" },
2887
+ file_id: { type: "string" },
2888
+ tag: { type: "string" },
2889
+ },
2890
+ required: ["entity_id", "schema_key", "file_id", "tag"],
2891
+ additionalProperties: false,
2892
+ } as const satisfies LixSchemaDefinition;
2893
+
2894
+ // Store the schema
2895
+ await lix.db
2896
+ .insertInto("stored_schema")
2897
+ .values({ value: mockStateReferenceSchema })
2898
+ .execute();
2899
+
2900
+ const activeVersion = await lix.db
2901
+ .selectFrom("active_version")
2902
+ .select("version_id")
2903
+ .executeTakeFirstOrThrow();
2904
+
2905
+ // First create a state entity that can be referenced
2906
+ await lix.db
2907
+ .insertInto("state_all")
2908
+ .values({
2909
+ entity_id: "test_entity",
2910
+ schema_key: "test_schema",
2911
+ file_id: "test_file.json",
2912
+ plugin_key: "test_plugin",
2913
+ version_id: activeVersion.version_id,
2914
+ snapshot_content: { id: "test_entity" },
2915
+ schema_version: "1.0",
2916
+ })
2917
+ .execute();
2918
+
2919
+ // This should PASS - entity exists in state table
2920
+ expect(() =>
2921
+ validateStateMutation({
2922
+ lix,
2923
+ schema: mockStateReferenceSchema,
2924
+ snapshot_content: {
2925
+ entity_id: "test_entity",
2926
+ schema_key: "test_schema",
2927
+ file_id: "test_file.json",
2928
+ tag: "important",
2929
+ },
2930
+ operation: "insert",
2931
+ version_id: activeVersion.version_id,
2932
+ })
2933
+ ).not.toThrowError();
2934
+
2935
+ // This should FAIL - entity doesn't exist in state table
2936
+ expect(() =>
2937
+ validateStateMutation({
2938
+ lix,
2939
+ schema: mockStateReferenceSchema,
2940
+ snapshot_content: {
2941
+ entity_id: "nonexistent_entity",
2942
+ schema_key: "test_schema",
2943
+ file_id: "test_file.json",
2944
+ tag: "important",
2945
+ },
2946
+ operation: "insert",
2947
+ version_id: activeVersion.version_id,
2948
+ })
2949
+ ).toThrow(
2950
+ /Foreign key constraint violation.*mock_state_reference.*\(entity_id, schema_key, file_id\).*state\.\(entity_id, schema_key, file_id\).*no matching record exists/
2951
+ );
2952
+ });
2953
+
2954
+ test("state foreign key references should respect version context", async () => {
2955
+ const lix = await openLix({});
2956
+
2957
+ // Create a schema that references state table
2958
+ const mockStateReferenceSchema = {
2959
+ type: "object",
2960
+ "x-lix-version": "1.0",
2961
+ "x-lix-key": "mock_state_reference",
2962
+ "x-lix-primary-key": ["entity_id", "schema_key", "file_id", "tag"],
2963
+ "x-lix-foreign-keys": [
2964
+ {
2965
+ properties: ["entity_id", "schema_key", "file_id"],
2966
+ references: {
2967
+ schemaKey: "state",
2968
+ properties: ["entity_id", "schema_key", "file_id"],
2969
+ },
2970
+ },
2971
+ ],
2972
+ properties: {
2973
+ entity_id: { type: "string" },
2974
+ schema_key: { type: "string" },
2975
+ file_id: { type: "string" },
2976
+ tag: { type: "string" },
2977
+ },
2978
+ required: ["entity_id", "schema_key", "file_id", "tag"],
2979
+ additionalProperties: false,
2980
+ } as const satisfies LixSchemaDefinition;
2981
+
2982
+ // Store the schema
2983
+ await lix.db
2984
+ .insertInto("stored_schema")
2985
+ .values({ value: mockStateReferenceSchema })
2986
+ .execute();
2987
+
2988
+ // Create a second version
2989
+ const version2 = await createVersion({
2990
+ lix,
2991
+ name: "version2",
2992
+ });
2993
+
2994
+ // Get the main version
2995
+ const mainVersion = await lix.db
2996
+ .selectFrom("version")
2997
+ .select("id")
2998
+ .where("name", "=", "main")
2999
+ .executeTakeFirstOrThrow();
3000
+
3001
+ // Create state entity in main version only
3002
+ await lix.db
3003
+ .insertInto("state_all")
3004
+ .values({
3005
+ entity_id: "main_only_entity",
3006
+ schema_key: "test_schema",
3007
+ file_id: "test.json",
3008
+ plugin_key: "test_plugin",
3009
+ version_id: mainVersion.id,
3010
+ snapshot_content: { id: "main_only_entity" },
3011
+ schema_version: "1.0",
3012
+ })
3013
+ .execute();
3014
+
3015
+ // Create state entity in version2 only
3016
+ await lix.db
3017
+ .insertInto("state_all")
3018
+ .values({
3019
+ entity_id: "version2_only_entity",
3020
+ schema_key: "test_schema",
3021
+ file_id: "test.json",
3022
+ plugin_key: "test_plugin",
3023
+ version_id: version2.id,
3024
+ snapshot_content: { id: "version2_only_entity" },
3025
+ schema_version: "1.0",
3026
+ })
3027
+ .execute();
3028
+
3029
+ // Reference from main version should only see main entities
3030
+ expect(() =>
3031
+ validateStateMutation({
3032
+ lix,
3033
+ schema: mockStateReferenceSchema,
3034
+ snapshot_content: {
3035
+ entity_id: "main_only_entity",
3036
+ schema_key: "test_schema",
3037
+ file_id: "test.json",
3038
+ tag: "tag1",
3039
+ },
3040
+ operation: "insert",
3041
+ version_id: mainVersion.id,
3042
+ })
3043
+ ).not.toThrowError();
3044
+
3045
+ // Reference from main version to version2 entity should fail
3046
+ expect(() =>
3047
+ validateStateMutation({
3048
+ lix,
3049
+ schema: mockStateReferenceSchema,
3050
+ snapshot_content: {
3051
+ entity_id: "version2_only_entity",
3052
+ schema_key: "test_schema",
3053
+ file_id: "test.json",
3054
+ tag: "tag2",
3055
+ },
3056
+ operation: "insert",
3057
+ version_id: mainVersion.id,
3058
+ })
3059
+ ).toThrow(/Foreign key constraint violation/);
3060
+
3061
+ // Reference from version2 should only see version2 entities
3062
+ expect(() =>
3063
+ validateStateMutation({
3064
+ lix,
3065
+ schema: mockStateReferenceSchema,
3066
+ snapshot_content: {
3067
+ entity_id: "version2_only_entity",
3068
+ schema_key: "test_schema",
3069
+ file_id: "test.json",
3070
+ tag: "tag3",
3071
+ },
3072
+ operation: "insert",
3073
+ version_id: version2.id,
3074
+ })
3075
+ ).not.toThrowError();
3076
+
3077
+ // Reference from version2 to main entity should fail
3078
+ expect(() =>
3079
+ validateStateMutation({
3080
+ lix,
3081
+ schema: mockStateReferenceSchema,
3082
+ snapshot_content: {
3083
+ entity_id: "main_only_entity",
3084
+ schema_key: "test_schema",
3085
+ file_id: "test.json",
3086
+ tag: "tag4",
3087
+ },
3088
+ operation: "insert",
3089
+ version_id: version2.id,
3090
+ })
3091
+ ).toThrow(/Foreign key constraint violation/);
3092
+ });
3093
+
3094
+ test("state foreign key references should handle inherited entities", async () => {
3095
+ const lix = await openLix({});
3096
+
3097
+ // Create a schema that references state table
3098
+ const mockStateReferenceSchema = {
3099
+ type: "object",
3100
+ "x-lix-version": "1.0",
3101
+ "x-lix-key": "mock_state_reference",
3102
+ "x-lix-primary-key": ["entity_id", "schema_key", "file_id", "tag"],
3103
+ "x-lix-foreign-keys": [
3104
+ {
3105
+ properties: ["entity_id", "schema_key", "file_id"],
3106
+ references: {
3107
+ schemaKey: "state",
3108
+ properties: ["entity_id", "schema_key", "file_id"],
3109
+ },
3110
+ },
3111
+ ],
3112
+ properties: {
3113
+ entity_id: { type: "string" },
3114
+ schema_key: { type: "string" },
3115
+ file_id: { type: "string" },
3116
+ tag: { type: "string" },
3117
+ },
3118
+ required: ["entity_id", "schema_key", "file_id", "tag"],
3119
+ additionalProperties: false,
3120
+ } as const satisfies LixSchemaDefinition;
3121
+
3122
+ // Store the schema
3123
+ await lix.db
3124
+ .insertInto("stored_schema")
3125
+ .values({ value: mockStateReferenceSchema })
3126
+ .execute();
3127
+
3128
+ // Get the main version
3129
+ const mainVersion = await lix.db
3130
+ .selectFrom("version")
3131
+ .select("id")
3132
+ .where("name", "=", "main")
3133
+ .executeTakeFirstOrThrow();
3134
+
3135
+ // Create a state entity in main version
3136
+ await lix.db
3137
+ .insertInto("state_all")
3138
+ .values({
3139
+ entity_id: "shared_entity",
3140
+ schema_key: "test_schema",
3141
+ file_id: "test.json",
3142
+ plugin_key: "test_plugin",
3143
+ version_id: mainVersion.id,
3144
+ snapshot_content: { id: "shared_entity", value: "original" },
3145
+ schema_version: "1.0",
3146
+ })
3147
+ .execute();
3148
+
3149
+ // Create a child version that inherits from main
3150
+ const childVersion = await createVersion({
3151
+ lix,
3152
+ name: "child_version",
3153
+ inherits_from_version_id: mainVersion.id,
3154
+ });
3155
+
3156
+ // The inherited entity should NOT be visible for foreign key validation
3157
+ // because foreign keys only validate entities in the same version (not inherited)
3158
+ expect(() =>
3159
+ validateStateMutation({
3160
+ lix,
3161
+ schema: mockStateReferenceSchema,
3162
+ snapshot_content: {
3163
+ entity_id: "shared_entity",
3164
+ schema_key: "test_schema",
3165
+ file_id: "test.json",
3166
+ tag: "from_child",
3167
+ },
3168
+ operation: "insert",
3169
+ version_id: childVersion.id,
3170
+ })
3171
+ ).toThrow(
3172
+ /Foreign key constraint violation.*no matching record exists.*Note: Foreign key constraints only validate entities that exist in the version context/s
3173
+ );
3174
+ });
3175
+
3176
+ test("state foreign key with mixed single and composite properties", async () => {
3177
+ const lix = await openLix({});
3178
+
3179
+ // Create a complex schema with multiple foreign keys
3180
+ const complexSchema = {
3181
+ type: "object",
3182
+ "x-lix-version": "1.0",
3183
+ "x-lix-key": "complex_reference",
3184
+ "x-lix-primary-key": ["id"],
3185
+ "x-lix-foreign-keys": [
3186
+ {
3187
+ // Composite foreign key to state
3188
+ properties: ["entity_id", "schema_key", "file_id"],
3189
+ references: {
3190
+ schemaKey: "state",
3191
+ properties: ["entity_id", "schema_key", "file_id"],
3192
+ },
3193
+ },
3194
+ {
3195
+ // Single property foreign key to change
3196
+ properties: ["change_id"],
3197
+ references: {
3198
+ schemaKey: "lix_change",
3199
+ properties: ["id"],
3200
+ },
3201
+ },
3202
+ ],
3203
+ properties: {
3204
+ id: { type: "string" },
3205
+ entity_id: { type: "string" },
3206
+ schema_key: { type: "string" },
3207
+ file_id: { type: "string" },
3208
+ change_id: { type: "string" },
3209
+ },
3210
+ required: ["id", "entity_id", "schema_key", "file_id", "change_id"],
3211
+ additionalProperties: false,
3212
+ } as const satisfies LixSchemaDefinition;
3213
+
3214
+ // Store the schema
3215
+ await lix.db
3216
+ .insertInto("stored_schema")
3217
+ .values({ value: complexSchema })
3218
+ .execute();
3219
+
3220
+ const activeVersion = await lix.db
3221
+ .selectFrom("active_version")
3222
+ .select("version_id")
3223
+ .executeTakeFirstOrThrow();
3224
+
3225
+ // Create a state entity
3226
+ await lix.db
3227
+ .insertInto("state_all")
3228
+ .values({
3229
+ entity_id: "test_entity",
3230
+ schema_key: "test_schema",
3231
+ file_id: "test.json",
3232
+ plugin_key: "test_plugin",
3233
+ version_id: activeVersion.version_id,
3234
+ snapshot_content: { id: "test_entity" },
3235
+ schema_version: "1.0",
3236
+ })
3237
+ .execute();
3238
+
3239
+ // Create a key-value to generate a change
3240
+ await lix.db
3241
+ .insertInto("key_value")
3242
+ .values({
3243
+ key: "test_key",
3244
+ value: "test_value",
3245
+ })
3246
+ .execute();
3247
+
3248
+ // Get the created change
3249
+ const changes = await lix.db
3250
+ .selectFrom("change")
3251
+ .select("id")
3252
+ .where("entity_id", "=", "test_key")
3253
+ .execute();
3254
+
3255
+ expect(changes).toHaveLength(1);
3256
+ const changeId = changes[0]!.id;
3257
+
3258
+ // This should PASS - both foreign keys are satisfied
3259
+ expect(() =>
3260
+ validateStateMutation({
3261
+ lix,
3262
+ schema: complexSchema,
3263
+ snapshot_content: {
3264
+ id: "complex1",
3265
+ entity_id: "test_entity",
3266
+ schema_key: "test_schema",
3267
+ file_id: "test.json",
3268
+ change_id: changeId,
3269
+ },
3270
+ operation: "insert",
3271
+ version_id: activeVersion.version_id,
3272
+ })
3273
+ ).not.toThrowError();
3274
+
3275
+ // This should FAIL - state foreign key not satisfied
3276
+ expect(() =>
3277
+ validateStateMutation({
3278
+ lix,
3279
+ schema: complexSchema,
3280
+ snapshot_content: {
3281
+ id: "complex2",
3282
+ entity_id: "nonexistent",
3283
+ schema_key: "test_schema",
3284
+ file_id: "test.json",
3285
+ change_id: changeId,
3286
+ },
3287
+ operation: "insert",
3288
+ version_id: activeVersion.version_id,
3289
+ })
3290
+ ).toThrow(/Foreign key constraint violation.*state/);
3291
+
3292
+ // This should FAIL - change foreign key not satisfied
3293
+ expect(() =>
3294
+ validateStateMutation({
3295
+ lix,
3296
+ schema: complexSchema,
3297
+ snapshot_content: {
3298
+ id: "complex3",
3299
+ entity_id: "test_entity",
3300
+ schema_key: "test_schema",
3301
+ file_id: "test.json",
3302
+ change_id: "nonexistent_change",
3303
+ },
3304
+ operation: "insert",
3305
+ version_id: activeVersion.version_id,
3306
+ })
3307
+ ).toThrow(/Foreign key constraint violation.*lix_change/);
3308
+ });