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