@lix-js/sdk 0.5.0-preview.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2710) hide show
  1. package/README.md +6 -6
  2. package/dist/account/create-account.d.ts +5 -6
  3. package/dist/account/create-account.d.ts.map +1 -1
  4. package/dist/account/create-account.js +7 -9
  5. package/dist/account/create-account.js.map +1 -1
  6. package/dist/account/create-account.test.js +5 -17
  7. package/dist/account/create-account.test.js.map +1 -1
  8. package/dist/account/index.d.ts +1 -1
  9. package/dist/account/index.d.ts.map +1 -1
  10. package/dist/account/index.js +1 -1
  11. package/dist/account/index.js.map +1 -1
  12. package/dist/account/schema-definition.d.ts +53 -0
  13. package/dist/account/schema-definition.d.ts.map +1 -0
  14. package/dist/account/schema-definition.js +50 -0
  15. package/dist/account/schema-definition.js.map +1 -0
  16. package/dist/account/schema.test.js +129 -98
  17. package/dist/account/schema.test.js.map +1 -1
  18. package/dist/account/switch-account.d.ts +2 -2
  19. package/dist/account/switch-account.d.ts.map +1 -1
  20. package/dist/account/switch-account.js +3 -4
  21. package/dist/account/switch-account.js.map +1 -1
  22. package/dist/account/switch-account.test.js +9 -19
  23. package/dist/account/switch-account.test.js.map +1 -1
  24. package/dist/change/index.d.ts +1 -1
  25. package/dist/change/index.d.ts.map +1 -1
  26. package/dist/change/index.js +1 -1
  27. package/dist/change/index.js.map +1 -1
  28. package/dist/change/schema-definition.d.ts +82 -0
  29. package/dist/change/schema-definition.d.ts.map +1 -0
  30. package/dist/change/schema-definition.js +36 -0
  31. package/dist/change/schema-definition.js.map +1 -0
  32. package/dist/change/schema.bench.d.ts +2 -0
  33. package/dist/change/schema.bench.d.ts.map +1 -0
  34. package/dist/change/schema.bench.js +334 -0
  35. package/dist/change/schema.bench.js.map +1 -0
  36. package/dist/change/schema.d.ts +3 -16
  37. package/dist/change/schema.d.ts.map +1 -1
  38. package/dist/change/schema.js +49 -20
  39. package/dist/change/schema.js.map +1 -1
  40. package/dist/change/schema.test.js +115 -6
  41. package/dist/change/schema.test.js.map +1 -1
  42. package/dist/change-author/index.d.ts +1 -1
  43. package/dist/change-author/index.d.ts.map +1 -1
  44. package/dist/change-author/index.js +1 -1
  45. package/dist/change-author/index.js.map +1 -1
  46. package/dist/change-author/schema-definition.d.ts +37 -0
  47. package/dist/change-author/schema-definition.d.ts.map +1 -0
  48. package/dist/change-author/schema-definition.js +35 -0
  49. package/dist/change-author/schema-definition.js.map +1 -0
  50. package/dist/change-author/schema.test.js +392 -223
  51. package/dist/change-author/schema.test.js.map +1 -1
  52. package/dist/change-proposal/accept-change-proposal.d.ts +7 -0
  53. package/dist/change-proposal/accept-change-proposal.d.ts.map +1 -0
  54. package/dist/change-proposal/accept-change-proposal.js +36 -0
  55. package/dist/change-proposal/accept-change-proposal.js.map +1 -0
  56. package/dist/change-proposal/accept-change-proposal.test.d.ts +2 -0
  57. package/dist/change-proposal/accept-change-proposal.test.d.ts.map +1 -0
  58. package/dist/change-proposal/accept-change-proposal.test.js +55 -0
  59. package/dist/change-proposal/accept-change-proposal.test.js.map +1 -0
  60. package/dist/change-proposal/create-change-proposal.d.ts +11 -9
  61. package/dist/change-proposal/create-change-proposal.d.ts.map +1 -1
  62. package/dist/change-proposal/create-change-proposal.js +28 -43
  63. package/dist/change-proposal/create-change-proposal.js.map +1 -1
  64. package/dist/change-proposal/create-change-proposal.test.js +61 -82
  65. package/dist/change-proposal/create-change-proposal.test.js.map +1 -1
  66. package/dist/change-proposal/index.d.ts +4 -2
  67. package/dist/change-proposal/index.d.ts.map +1 -1
  68. package/dist/change-proposal/index.js +4 -2
  69. package/dist/change-proposal/index.js.map +1 -1
  70. package/dist/change-proposal/reject-change-proposal.d.ts +7 -0
  71. package/dist/change-proposal/reject-change-proposal.d.ts.map +1 -0
  72. package/dist/change-proposal/reject-change-proposal.js +15 -0
  73. package/dist/change-proposal/reject-change-proposal.js.map +1 -0
  74. package/dist/change-proposal/reject-change-proposal.test.d.ts +2 -0
  75. package/dist/change-proposal/reject-change-proposal.test.d.ts.map +1 -0
  76. package/dist/change-proposal/reject-change-proposal.test.js +28 -0
  77. package/dist/change-proposal/reject-change-proposal.test.js.map +1 -0
  78. package/dist/change-proposal/schema-definition.d.ts +45 -0
  79. package/dist/change-proposal/schema-definition.d.ts.map +1 -0
  80. package/dist/change-proposal/schema-definition.js +34 -0
  81. package/dist/change-proposal/schema-definition.js.map +1 -0
  82. package/dist/change-proposal/schema.test.d.ts.map +1 -0
  83. package/dist/change-proposal/schema.test.js +103 -0
  84. package/dist/change-proposal/schema.test.js.map +1 -0
  85. package/dist/change-set/apply-change-set.d.ts +2 -2
  86. package/dist/change-set/apply-change-set.d.ts.map +1 -1
  87. package/dist/change-set/apply-change-set.js +49 -72
  88. package/dist/change-set/apply-change-set.js.map +1 -1
  89. package/dist/change-set/apply-change-set.test.js +9 -5
  90. package/dist/change-set/apply-change-set.test.js.map +1 -1
  91. package/dist/change-set/create-change-set.d.ts +6 -10
  92. package/dist/change-set/create-change-set.d.ts.map +1 -1
  93. package/dist/change-set/create-change-set.js +6 -50
  94. package/dist/change-set/create-change-set.js.map +1 -1
  95. package/dist/change-set/create-change-set.test.js +5 -74
  96. package/dist/change-set/create-change-set.test.js.map +1 -1
  97. package/dist/change-set/index.d.ts +1 -5
  98. package/dist/change-set/index.d.ts.map +1 -1
  99. package/dist/change-set/index.js +1 -5
  100. package/dist/change-set/index.js.map +1 -1
  101. package/dist/change-set/schema-definition.d.ts +73 -0
  102. package/dist/change-set/schema-definition.d.ts.map +1 -0
  103. package/dist/change-set/schema-definition.js +72 -0
  104. package/dist/change-set/schema-definition.js.map +1 -0
  105. package/dist/change-set/schema.test.js +12 -401
  106. package/dist/change-set/schema.test.js.map +1 -1
  107. package/dist/commit/index.d.ts +2 -0
  108. package/dist/commit/index.d.ts.map +1 -0
  109. package/dist/commit/index.js +2 -0
  110. package/dist/commit/index.js.map +1 -0
  111. package/dist/commit/schema-definition.d.ts +97 -0
  112. package/dist/commit/schema-definition.d.ts.map +1 -0
  113. package/dist/commit/schema-definition.js +89 -0
  114. package/dist/commit/schema-definition.js.map +1 -0
  115. package/dist/commit/schema.test.d.ts.map +1 -0
  116. package/dist/commit/schema.test.js +295 -0
  117. package/dist/commit/schema.test.js.map +1 -0
  118. package/dist/conversation/create-conversation-message.d.ts +11 -0
  119. package/dist/conversation/create-conversation-message.d.ts.map +1 -0
  120. package/dist/conversation/create-conversation-message.js +59 -0
  121. package/dist/conversation/create-conversation-message.js.map +1 -0
  122. package/dist/conversation/create-conversation-message.test.d.ts +2 -0
  123. package/dist/conversation/create-conversation-message.test.d.ts.map +1 -0
  124. package/dist/conversation/create-conversation-message.test.js +98 -0
  125. package/dist/conversation/create-conversation-message.test.js.map +1 -0
  126. package/dist/conversation/create-conversation.d.ts +39 -0
  127. package/dist/conversation/create-conversation.d.ts.map +1 -0
  128. package/dist/conversation/create-conversation.js +80 -0
  129. package/dist/conversation/create-conversation.js.map +1 -0
  130. package/dist/conversation/create-conversation.test.d.ts +2 -0
  131. package/dist/conversation/create-conversation.test.d.ts.map +1 -0
  132. package/dist/conversation/create-conversation.test.js +157 -0
  133. package/dist/conversation/create-conversation.test.js.map +1 -0
  134. package/dist/conversation/index.d.ts +4 -0
  135. package/dist/conversation/index.d.ts.map +1 -0
  136. package/dist/conversation/index.js +4 -0
  137. package/dist/conversation/index.js.map +1 -0
  138. package/dist/conversation/schema-definition.d.ts +64 -0
  139. package/dist/conversation/schema-definition.d.ts.map +1 -0
  140. package/dist/conversation/schema-definition.js +59 -0
  141. package/dist/conversation/schema-definition.js.map +1 -0
  142. package/dist/database/index.d.ts +0 -3
  143. package/dist/database/index.d.ts.map +1 -1
  144. package/dist/database/index.js +0 -3
  145. package/dist/database/index.js.map +1 -1
  146. package/dist/database/init-db.d.ts +30 -4
  147. package/dist/database/init-db.d.ts.map +1 -1
  148. package/dist/database/init-db.js +99 -80
  149. package/dist/database/init-db.js.map +1 -1
  150. package/dist/database/kysely/index.d.ts +2 -0
  151. package/dist/database/kysely/index.d.ts.map +1 -0
  152. package/dist/database/kysely/index.js +2 -0
  153. package/dist/database/kysely/index.js.map +1 -0
  154. package/dist/database/kysely/json-column-config.d.ts +6 -0
  155. package/dist/database/kysely/json-column-config.d.ts.map +1 -0
  156. package/dist/database/kysely/json-column-config.js +55 -0
  157. package/dist/database/kysely/json-column-config.js.map +1 -0
  158. package/dist/database/kysely/plugins/json-column-plugin.d.ts +7 -0
  159. package/dist/database/kysely/plugins/json-column-plugin.d.ts.map +1 -0
  160. package/dist/database/kysely/plugins/json-column-plugin.js +216 -0
  161. package/dist/database/kysely/plugins/json-column-plugin.js.map +1 -0
  162. package/dist/database/kysely/plugins/json-column-plugin.test.d.ts +2 -0
  163. package/dist/database/kysely/plugins/json-column-plugin.test.d.ts.map +1 -0
  164. package/dist/database/kysely/plugins/json-column-plugin.test.js +441 -0
  165. package/dist/database/kysely/plugins/json-column-plugin.test.js.map +1 -0
  166. package/dist/database/kysely/plugins/view-insert-returning-error-plugin.d.ts.map +1 -0
  167. package/dist/database/kysely/plugins/view-insert-returning-error-plugin.js.map +1 -0
  168. package/dist/database/kysely/plugins/view-insert-returning-error-plugin.test.d.ts.map +1 -0
  169. package/dist/database/kysely/plugins/view-insert-returning-error-plugin.test.js +51 -0
  170. package/dist/database/kysely/plugins/view-insert-returning-error-plugin.test.js.map +1 -0
  171. package/dist/database/kysely/plugins.d.ts +3 -0
  172. package/dist/database/kysely/plugins.d.ts.map +1 -0
  173. package/dist/database/kysely/plugins.js +15 -0
  174. package/dist/database/kysely/plugins.js.map +1 -0
  175. package/dist/database/nano-id.d.ts +4 -1
  176. package/dist/database/nano-id.d.ts.map +1 -1
  177. package/dist/database/nano-id.js +4 -1
  178. package/dist/database/nano-id.js.map +1 -1
  179. package/dist/database/nano-id.test.js +4 -4
  180. package/dist/database/nano-id.test.js.map +1 -1
  181. package/dist/database/schema-view-map.d.ts +3 -0
  182. package/dist/database/schema-view-map.d.ts.map +1 -0
  183. package/dist/database/schema-view-map.js +35 -0
  184. package/dist/database/schema-view-map.js.map +1 -0
  185. package/dist/database/schema.d.ts +73 -30
  186. package/dist/database/schema.d.ts.map +1 -1
  187. package/dist/database/schema.js +15 -30
  188. package/dist/database/schema.js.map +1 -1
  189. package/dist/database/sqlite/content-from-database.d.ts +10 -0
  190. package/dist/database/sqlite/content-from-database.d.ts.map +1 -0
  191. package/dist/database/sqlite/content-from-database.js +11 -0
  192. package/dist/database/sqlite/content-from-database.js.map +1 -0
  193. package/dist/database/sqlite/create-in-memory-database.d.ts +23 -0
  194. package/dist/database/sqlite/create-in-memory-database.d.ts.map +1 -0
  195. package/dist/database/sqlite/create-in-memory-database.js +44 -0
  196. package/dist/database/sqlite/create-in-memory-database.js.map +1 -0
  197. package/dist/database/sqlite/environment-dialect.d.ts +21 -0
  198. package/dist/database/sqlite/environment-dialect.d.ts.map +1 -0
  199. package/dist/database/sqlite/environment-dialect.js +198 -0
  200. package/dist/database/sqlite/environment-dialect.js.map +1 -0
  201. package/dist/database/sqlite/environment-dialect.test.d.ts +2 -0
  202. package/dist/database/sqlite/environment-dialect.test.d.ts.map +1 -0
  203. package/dist/database/sqlite/environment-dialect.test.js +66 -0
  204. package/dist/database/sqlite/environment-dialect.test.js.map +1 -0
  205. package/dist/database/sqlite/import-database.d.ts +18 -0
  206. package/dist/database/sqlite/import-database.d.ts.map +1 -0
  207. package/dist/database/sqlite/import-database.js +24 -0
  208. package/dist/database/sqlite/import-database.js.map +1 -0
  209. package/dist/database/sqlite/index.d.ts +8 -0
  210. package/dist/database/sqlite/index.d.ts.map +1 -0
  211. package/dist/database/sqlite/index.js +7 -0
  212. package/dist/database/sqlite/index.js.map +1 -0
  213. package/dist/database/sqlite/kysely-driver/connection-mutex.d.ts +6 -0
  214. package/dist/database/sqlite/kysely-driver/connection-mutex.d.ts.map +1 -0
  215. package/dist/database/sqlite/kysely-driver/connection-mutex.js +19 -0
  216. package/dist/database/sqlite/kysely-driver/connection-mutex.js.map +1 -0
  217. package/dist/database/sqlite/kysely-driver/index.d.ts +5 -0
  218. package/dist/database/sqlite/kysely-driver/index.d.ts.map +1 -0
  219. package/dist/database/sqlite/kysely-driver/index.js +4 -0
  220. package/dist/database/sqlite/kysely-driver/index.js.map +1 -0
  221. package/dist/database/sqlite/kysely-driver/sqlite-wasm-connection.d.ts +9 -0
  222. package/dist/database/sqlite/kysely-driver/sqlite-wasm-connection.d.ts.map +1 -0
  223. package/dist/database/sqlite/kysely-driver/sqlite-wasm-connection.js +43 -0
  224. package/dist/database/sqlite/kysely-driver/sqlite-wasm-connection.js.map +1 -0
  225. package/dist/database/sqlite/kysely-driver/sqlite-wasm-dialect-config.d.ts +19 -0
  226. package/dist/database/sqlite/kysely-driver/sqlite-wasm-dialect-config.d.ts.map +1 -0
  227. package/dist/database/sqlite/kysely-driver/sqlite-wasm-dialect-config.js +2 -0
  228. package/dist/database/sqlite/kysely-driver/sqlite-wasm-dialect-config.js.map +1 -0
  229. package/dist/database/sqlite/kysely-driver/sqlite-wasm-driver.d.ts +14 -0
  230. package/dist/database/sqlite/kysely-driver/sqlite-wasm-driver.d.ts.map +1 -0
  231. package/dist/database/sqlite/kysely-driver/sqlite-wasm-driver.js +45 -0
  232. package/dist/database/sqlite/kysely-driver/sqlite-wasm-driver.js.map +1 -0
  233. package/dist/database/sqlite/lix-dialect.d.ts +23 -0
  234. package/dist/database/sqlite/lix-dialect.d.ts.map +1 -0
  235. package/dist/database/sqlite/lix-dialect.js +24 -0
  236. package/dist/database/sqlite/lix-dialect.js.map +1 -0
  237. package/dist/database/sqlite/load-database-in-memory.d.ts +13 -0
  238. package/dist/database/sqlite/load-database-in-memory.d.ts.map +1 -0
  239. package/dist/database/sqlite/load-database-in-memory.js +23 -0
  240. package/dist/database/sqlite/load-database-in-memory.js.map +1 -0
  241. package/dist/database/sqlite/sqlite-wasm-binary.d.ts +2 -0
  242. package/dist/database/sqlite/sqlite-wasm-binary.js +42835 -0
  243. package/dist/dependency/kysely/helpers/sqlite.d.ts +5 -0
  244. package/dist/dependency/kysely/helpers/sqlite.d.ts.map +1 -0
  245. package/dist/dependency/kysely/helpers/sqlite.js +5 -0
  246. package/dist/dependency/kysely/helpers/sqlite.js.map +1 -0
  247. package/dist/dependency/kysely/index.d.ts +9 -0
  248. package/dist/dependency/kysely/index.d.ts.map +1 -0
  249. package/dist/dependency/kysely/index.js +9 -0
  250. package/dist/dependency/kysely/index.js.map +1 -0
  251. package/dist/dependency/zettel-ast/index.d.ts.map +1 -0
  252. package/dist/dependency/zettel-ast/index.js.map +1 -0
  253. package/dist/diff/index.d.ts +3 -0
  254. package/dist/diff/index.d.ts.map +1 -0
  255. package/dist/diff/index.js +3 -0
  256. package/dist/diff/index.js.map +1 -0
  257. package/dist/diff/select-commit-diff.bench.d.ts +2 -0
  258. package/dist/diff/select-commit-diff.bench.d.ts.map +1 -0
  259. package/dist/diff/select-commit-diff.bench.js +136 -0
  260. package/dist/diff/select-commit-diff.bench.js.map +1 -0
  261. package/dist/diff/select-commit-diff.d.ts +56 -0
  262. package/dist/diff/select-commit-diff.d.ts.map +1 -0
  263. package/dist/diff/select-commit-diff.js +212 -0
  264. package/dist/diff/select-commit-diff.js.map +1 -0
  265. package/dist/diff/select-commit-diff.test.d.ts +2 -0
  266. package/dist/diff/select-commit-diff.test.d.ts.map +1 -0
  267. package/dist/diff/select-commit-diff.test.js +52 -0
  268. package/dist/diff/select-commit-diff.test.js.map +1 -0
  269. package/dist/diff/select-working-diff.bench.d.ts +2 -0
  270. package/dist/diff/select-working-diff.bench.d.ts.map +1 -0
  271. package/dist/diff/select-working-diff.bench.js +82 -0
  272. package/dist/diff/select-working-diff.bench.js.map +1 -0
  273. package/dist/diff/select-working-diff.d.ts +105 -0
  274. package/dist/diff/select-working-diff.d.ts.map +1 -0
  275. package/dist/diff/select-working-diff.js +95 -0
  276. package/dist/diff/select-working-diff.js.map +1 -0
  277. package/dist/diff/select-working-diff.test.d.ts +2 -0
  278. package/dist/diff/select-working-diff.test.d.ts.map +1 -0
  279. package/dist/diff/select-working-diff.test.js +231 -0
  280. package/dist/diff/select-working-diff.test.js.map +1 -0
  281. package/dist/engine/boot.d.ts +90 -0
  282. package/dist/engine/boot.d.ts.map +1 -0
  283. package/dist/engine/boot.js +149 -0
  284. package/dist/engine/boot.js.map +1 -0
  285. package/dist/engine/boot.test.d.ts +2 -0
  286. package/dist/engine/boot.test.d.ts.map +1 -0
  287. package/dist/engine/boot.test.js +75 -0
  288. package/dist/engine/boot.test.js.map +1 -0
  289. package/dist/engine/cel-environment/cel-environment.d.ts +17 -0
  290. package/dist/engine/cel-environment/cel-environment.d.ts.map +1 -0
  291. package/dist/engine/cel-environment/cel-environment.js +54 -0
  292. package/dist/engine/cel-environment/cel-environment.js.map +1 -0
  293. package/dist/engine/cel-environment/cel-environment.test.d.ts +2 -0
  294. package/dist/engine/cel-environment/cel-environment.test.d.ts.map +1 -0
  295. package/dist/engine/cel-environment/cel-environment.test.js +19 -0
  296. package/dist/engine/cel-environment/cel-environment.test.js.map +1 -0
  297. package/dist/engine/deterministic-mode/is-deterministic-mode.d.ts +36 -0
  298. package/dist/engine/deterministic-mode/is-deterministic-mode.d.ts.map +1 -0
  299. package/dist/engine/deterministic-mode/is-deterministic-mode.js +80 -0
  300. package/dist/engine/deterministic-mode/is-deterministic-mode.js.map +1 -0
  301. package/dist/engine/deterministic-mode/is-deterministic-mode.test.d.ts +2 -0
  302. package/dist/engine/deterministic-mode/is-deterministic-mode.test.d.ts.map +1 -0
  303. package/dist/engine/deterministic-mode/is-deterministic-mode.test.js +95 -0
  304. package/dist/engine/deterministic-mode/is-deterministic-mode.test.js.map +1 -0
  305. package/dist/engine/deterministic-mode/options.d.ts +48 -0
  306. package/dist/engine/deterministic-mode/options.d.ts.map +1 -0
  307. package/dist/engine/deterministic-mode/options.js +47 -0
  308. package/dist/engine/deterministic-mode/options.js.map +1 -0
  309. package/dist/engine/deterministic-mode/options.test.d.ts +2 -0
  310. package/dist/engine/deterministic-mode/options.test.d.ts.map +1 -0
  311. package/dist/engine/deterministic-mode/options.test.js +111 -0
  312. package/dist/engine/deterministic-mode/options.test.js.map +1 -0
  313. package/dist/engine/entity-views/build-json-object-entries.d.ts +12 -0
  314. package/dist/engine/entity-views/build-json-object-entries.d.ts.map +1 -0
  315. package/dist/engine/entity-views/build-json-object-entries.js +37 -0
  316. package/dist/engine/entity-views/build-json-object-entries.js.map +1 -0
  317. package/dist/engine/entity-views/build-json-object-entries.test.d.ts +2 -0
  318. package/dist/engine/entity-views/build-json-object-entries.test.d.ts.map +1 -0
  319. package/dist/engine/entity-views/build-json-object-entries.test.js +35 -0
  320. package/dist/engine/entity-views/build-json-object-entries.test.js.map +1 -0
  321. package/dist/engine/entity-views/entity-state-by-version.d.ts +238 -0
  322. package/dist/engine/entity-views/entity-state-by-version.d.ts.map +1 -0
  323. package/dist/engine/entity-views/entity-state-by-version.js +2 -0
  324. package/dist/engine/entity-views/entity-state-by-version.js.map +1 -0
  325. package/dist/engine/entity-views/entity-state-history.d.ts +189 -0
  326. package/dist/engine/entity-views/entity-state-history.d.ts.map +1 -0
  327. package/dist/engine/entity-views/entity-state-history.js +2 -0
  328. package/dist/engine/entity-views/entity-state-history.js.map +1 -0
  329. package/dist/engine/entity-views/entity-state.d.ts +218 -0
  330. package/dist/engine/entity-views/entity-state.d.ts.map +1 -0
  331. package/dist/engine/entity-views/entity-state.js +2 -0
  332. package/dist/engine/entity-views/entity-state.js.map +1 -0
  333. package/dist/engine/entity-views/entity-view-builder.d.ts +34 -0
  334. package/dist/engine/entity-views/entity-view-builder.d.ts.map +1 -0
  335. package/dist/engine/entity-views/entity-view-builder.js +4 -0
  336. package/dist/engine/entity-views/entity-view-builder.js.map +1 -0
  337. package/dist/engine/entity-views/index.d.ts.map +1 -0
  338. package/dist/engine/entity-views/index.js.map +1 -0
  339. package/dist/engine/entity-views/types.d.ts +309 -0
  340. package/dist/engine/entity-views/types.d.ts.map +1 -0
  341. package/dist/engine/entity-views/types.js.map +1 -0
  342. package/dist/engine/entity-views/types.test.d.ts.map +1 -0
  343. package/dist/engine/entity-views/types.test.js +62 -0
  344. package/dist/engine/entity-views/types.test.js.map +1 -0
  345. package/dist/engine/execute-sync.d.ts +5 -0
  346. package/dist/engine/execute-sync.d.ts.map +1 -0
  347. package/dist/engine/execute-sync.js +38 -0
  348. package/dist/engine/execute-sync.js.map +1 -0
  349. package/dist/engine/execute-sync.test.d.ts.map +1 -0
  350. package/dist/engine/execute-sync.test.js +64 -0
  351. package/dist/engine/execute-sync.test.js.map +1 -0
  352. package/dist/engine/explain-query.d.ts +15 -0
  353. package/dist/engine/explain-query.d.ts.map +1 -0
  354. package/dist/engine/explain-query.js +66 -0
  355. package/dist/engine/explain-query.js.map +1 -0
  356. package/dist/engine/explain-query.test.d.ts +2 -0
  357. package/dist/engine/explain-query.test.d.ts.map +1 -0
  358. package/dist/engine/explain-query.test.js +17 -0
  359. package/dist/engine/explain-query.test.js.map +1 -0
  360. package/dist/engine/functions/function-registry.d.ts +20 -0
  361. package/dist/engine/functions/function-registry.d.ts.map +1 -0
  362. package/dist/engine/functions/function-registry.js +25 -0
  363. package/dist/engine/functions/function-registry.js.map +1 -0
  364. package/dist/engine/functions/generate-human-id.d.ts +43 -0
  365. package/dist/engine/functions/generate-human-id.d.ts.map +1 -0
  366. package/dist/engine/functions/generate-human-id.js +335 -0
  367. package/dist/engine/functions/generate-human-id.js.map +1 -0
  368. package/dist/engine/functions/generate-human-id.test.d.ts +2 -0
  369. package/dist/engine/functions/generate-human-id.test.d.ts.map +1 -0
  370. package/dist/engine/functions/generate-human-id.test.js +156 -0
  371. package/dist/engine/functions/generate-human-id.test.js.map +1 -0
  372. package/dist/engine/functions/index.d.ts +7 -0
  373. package/dist/engine/functions/index.d.ts.map +1 -0
  374. package/dist/engine/functions/index.js +7 -0
  375. package/dist/engine/functions/index.js.map +1 -0
  376. package/dist/engine/functions/nano-id.bench.d.ts +2 -0
  377. package/dist/engine/functions/nano-id.bench.d.ts.map +1 -0
  378. package/dist/engine/functions/nano-id.bench.js +48 -0
  379. package/dist/engine/functions/nano-id.bench.js.map +1 -0
  380. package/dist/engine/functions/nano-id.d.ts +69 -0
  381. package/dist/engine/functions/nano-id.d.ts.map +1 -0
  382. package/dist/engine/functions/nano-id.js +170 -0
  383. package/dist/engine/functions/nano-id.js.map +1 -0
  384. package/dist/engine/functions/nano-id.test.d.ts +2 -0
  385. package/dist/engine/functions/nano-id.test.d.ts.map +1 -0
  386. package/dist/engine/functions/nano-id.test.js +163 -0
  387. package/dist/engine/functions/nano-id.test.js.map +1 -0
  388. package/dist/engine/functions/random.d.ts +57 -0
  389. package/dist/engine/functions/random.d.ts.map +1 -0
  390. package/dist/engine/functions/random.js +214 -0
  391. package/dist/engine/functions/random.js.map +1 -0
  392. package/dist/engine/functions/random.test.d.ts +2 -0
  393. package/dist/engine/functions/random.test.d.ts.map +1 -0
  394. package/dist/engine/functions/random.test.js +244 -0
  395. package/dist/engine/functions/random.test.js.map +1 -0
  396. package/dist/engine/functions/register-builtins.d.ts +9 -0
  397. package/dist/engine/functions/register-builtins.d.ts.map +1 -0
  398. package/dist/engine/functions/register-builtins.js +110 -0
  399. package/dist/engine/functions/register-builtins.js.map +1 -0
  400. package/dist/engine/functions/sequence.d.ts +77 -0
  401. package/dist/engine/functions/sequence.d.ts.map +1 -0
  402. package/dist/engine/functions/sequence.js +136 -0
  403. package/dist/engine/functions/sequence.js.map +1 -0
  404. package/dist/engine/functions/sequence.test.d.ts +2 -0
  405. package/dist/engine/functions/sequence.test.d.ts.map +1 -0
  406. package/dist/engine/functions/sequence.test.js +77 -0
  407. package/dist/engine/functions/sequence.test.js.map +1 -0
  408. package/dist/engine/functions/timestamp.d.ts +44 -0
  409. package/dist/engine/functions/timestamp.d.ts.map +1 -0
  410. package/dist/engine/functions/timestamp.js +70 -0
  411. package/dist/engine/functions/timestamp.js.map +1 -0
  412. package/dist/engine/functions/timestamp.test.d.ts +2 -0
  413. package/dist/engine/functions/timestamp.test.d.ts.map +1 -0
  414. package/dist/engine/functions/timestamp.test.js +147 -0
  415. package/dist/engine/functions/timestamp.test.js.map +1 -0
  416. package/dist/engine/functions/uuid-v7.d.ts +50 -0
  417. package/dist/engine/functions/uuid-v7.d.ts.map +1 -0
  418. package/dist/engine/functions/uuid-v7.js +75 -0
  419. package/dist/engine/functions/uuid-v7.js.map +1 -0
  420. package/dist/engine/functions/uuid-v7.test.d.ts +2 -0
  421. package/dist/engine/functions/uuid-v7.test.d.ts.map +1 -0
  422. package/dist/engine/functions/uuid-v7.test.js +114 -0
  423. package/dist/engine/functions/uuid-v7.test.js.map +1 -0
  424. package/dist/engine/index.d.ts +2 -0
  425. package/dist/engine/index.d.ts.map +1 -0
  426. package/dist/engine/index.js +2 -0
  427. package/dist/engine/index.js.map +1 -0
  428. package/dist/engine/internal-query-builder.d.ts +26 -0
  429. package/dist/engine/internal-query-builder.d.ts.map +1 -0
  430. package/dist/engine/internal-query-builder.js +34 -0
  431. package/dist/engine/internal-query-builder.js.map +1 -0
  432. package/dist/engine/preprocessor/create-preprocessor.d.ts +18 -0
  433. package/dist/engine/preprocessor/create-preprocessor.d.ts.map +1 -0
  434. package/dist/engine/preprocessor/create-preprocessor.js +217 -0
  435. package/dist/engine/preprocessor/create-preprocessor.js.map +1 -0
  436. package/dist/engine/preprocessor/create-preprocessor.test.d.ts +2 -0
  437. package/dist/engine/preprocessor/create-preprocessor.test.d.ts.map +1 -0
  438. package/dist/engine/preprocessor/create-preprocessor.test.js +216 -0
  439. package/dist/engine/preprocessor/create-preprocessor.test.js.map +1 -0
  440. package/dist/engine/preprocessor/entity-views/delete.d.ts +3 -0
  441. package/dist/engine/preprocessor/entity-views/delete.d.ts.map +1 -0
  442. package/dist/engine/preprocessor/entity-views/delete.js +235 -0
  443. package/dist/engine/preprocessor/entity-views/delete.js.map +1 -0
  444. package/dist/engine/preprocessor/entity-views/delete.test.d.ts +2 -0
  445. package/dist/engine/preprocessor/entity-views/delete.test.d.ts.map +1 -0
  446. package/dist/engine/preprocessor/entity-views/delete.test.js +700 -0
  447. package/dist/engine/preprocessor/entity-views/delete.test.js.map +1 -0
  448. package/dist/engine/preprocessor/entity-views/insert.d.ts +3 -0
  449. package/dist/engine/preprocessor/entity-views/insert.d.ts.map +1 -0
  450. package/dist/engine/preprocessor/entity-views/insert.js +675 -0
  451. package/dist/engine/preprocessor/entity-views/insert.js.map +1 -0
  452. package/dist/engine/preprocessor/entity-views/insert.test.d.ts +2 -0
  453. package/dist/engine/preprocessor/entity-views/insert.test.d.ts.map +1 -0
  454. package/dist/engine/preprocessor/entity-views/insert.test.js +1014 -0
  455. package/dist/engine/preprocessor/entity-views/insert.test.js.map +1 -0
  456. package/dist/engine/preprocessor/entity-views/select.bench.d.ts +2 -0
  457. package/dist/engine/preprocessor/entity-views/select.bench.d.ts.map +1 -0
  458. package/dist/engine/preprocessor/entity-views/select.bench.js +145 -0
  459. package/dist/engine/preprocessor/entity-views/select.bench.js.map +1 -0
  460. package/dist/engine/preprocessor/entity-views/select.d.ts +6 -0
  461. package/dist/engine/preprocessor/entity-views/select.d.ts.map +1 -0
  462. package/dist/engine/preprocessor/entity-views/select.js +1306 -0
  463. package/dist/engine/preprocessor/entity-views/select.js.map +1 -0
  464. package/dist/engine/preprocessor/entity-views/select.test.d.ts +2 -0
  465. package/dist/engine/preprocessor/entity-views/select.test.d.ts.map +1 -0
  466. package/dist/engine/preprocessor/entity-views/select.test.js +320 -0
  467. package/dist/engine/preprocessor/entity-views/select.test.js.map +1 -0
  468. package/dist/engine/preprocessor/entity-views/shared.d.ts +165 -0
  469. package/dist/engine/preprocessor/entity-views/shared.d.ts.map +1 -0
  470. package/dist/engine/preprocessor/entity-views/shared.js +1080 -0
  471. package/dist/engine/preprocessor/entity-views/shared.js.map +1 -0
  472. package/dist/engine/preprocessor/entity-views/update.d.ts +3 -0
  473. package/dist/engine/preprocessor/entity-views/update.d.ts.map +1 -0
  474. package/dist/engine/preprocessor/entity-views/update.js +527 -0
  475. package/dist/engine/preprocessor/entity-views/update.js.map +1 -0
  476. package/dist/engine/preprocessor/entity-views/update.test.d.ts +2 -0
  477. package/dist/engine/preprocessor/entity-views/update.test.d.ts.map +1 -0
  478. package/dist/engine/preprocessor/entity-views/update.test.js +356 -0
  479. package/dist/engine/preprocessor/entity-views/update.test.js.map +1 -0
  480. package/dist/engine/preprocessor/inheritance/version-inheritance-cache.d.ts +38 -0
  481. package/dist/engine/preprocessor/inheritance/version-inheritance-cache.d.ts.map +1 -0
  482. package/dist/engine/preprocessor/inheritance/version-inheritance-cache.js +296 -0
  483. package/dist/engine/preprocessor/inheritance/version-inheritance-cache.js.map +1 -0
  484. package/dist/engine/preprocessor/inheritance/version-inheritance-cache.test.d.ts +2 -0
  485. package/dist/engine/preprocessor/inheritance/version-inheritance-cache.test.d.ts.map +1 -0
  486. package/dist/engine/preprocessor/inheritance/version-inheritance-cache.test.js +80 -0
  487. package/dist/engine/preprocessor/inheritance/version-inheritance-cache.test.js.map +1 -0
  488. package/dist/engine/preprocessor/sql-parser/ast-helpers.d.ts +110 -0
  489. package/dist/engine/preprocessor/sql-parser/ast-helpers.d.ts.map +1 -0
  490. package/dist/engine/preprocessor/sql-parser/ast-helpers.js +196 -0
  491. package/dist/engine/preprocessor/sql-parser/ast-helpers.js.map +1 -0
  492. package/dist/engine/preprocessor/sql-parser/column-usage.d.ts +14 -0
  493. package/dist/engine/preprocessor/sql-parser/column-usage.d.ts.map +1 -0
  494. package/dist/engine/preprocessor/sql-parser/column-usage.js +300 -0
  495. package/dist/engine/preprocessor/sql-parser/column-usage.js.map +1 -0
  496. package/dist/engine/preprocessor/sql-parser/compile.d.ts +30 -0
  497. package/dist/engine/preprocessor/sql-parser/compile.d.ts.map +1 -0
  498. package/dist/engine/preprocessor/sql-parser/compile.js +719 -0
  499. package/dist/engine/preprocessor/sql-parser/compile.js.map +1 -0
  500. package/dist/engine/preprocessor/sql-parser/compile.test.d.ts +2 -0
  501. package/dist/engine/preprocessor/sql-parser/compile.test.d.ts.map +1 -0
  502. package/dist/engine/preprocessor/sql-parser/compile.test.js +100 -0
  503. package/dist/engine/preprocessor/sql-parser/compile.test.js.map +1 -0
  504. package/dist/engine/preprocessor/sql-parser/cst.d.ts +49 -0
  505. package/dist/engine/preprocessor/sql-parser/cst.d.ts.map +1 -0
  506. package/dist/engine/preprocessor/sql-parser/cst.js +768 -0
  507. package/dist/engine/preprocessor/sql-parser/cst.js.map +1 -0
  508. package/dist/engine/preprocessor/sql-parser/lexer.d.ts +93 -0
  509. package/dist/engine/preprocessor/sql-parser/lexer.d.ts.map +1 -0
  510. package/dist/engine/preprocessor/sql-parser/lexer.js +517 -0
  511. package/dist/engine/preprocessor/sql-parser/lexer.js.map +1 -0
  512. package/dist/engine/preprocessor/sql-parser/nodes.d.ts +268 -0
  513. package/dist/engine/preprocessor/sql-parser/nodes.d.ts.map +1 -0
  514. package/dist/engine/preprocessor/sql-parser/nodes.js +20 -0
  515. package/dist/engine/preprocessor/sql-parser/nodes.js.map +1 -0
  516. package/dist/engine/preprocessor/sql-parser/parse.d.ts +15 -0
  517. package/dist/engine/preprocessor/sql-parser/parse.d.ts.map +1 -0
  518. package/dist/engine/preprocessor/sql-parser/parse.js +1503 -0
  519. package/dist/engine/preprocessor/sql-parser/parse.js.map +1 -0
  520. package/dist/engine/preprocessor/sql-parser/parse.test.d.ts +2 -0
  521. package/dist/engine/preprocessor/sql-parser/parse.test.d.ts.map +1 -0
  522. package/dist/engine/preprocessor/sql-parser/parse.test.js +1483 -0
  523. package/dist/engine/preprocessor/sql-parser/parse.test.js.map +1 -0
  524. package/dist/engine/preprocessor/sql-parser/visitor.d.ts +80 -0
  525. package/dist/engine/preprocessor/sql-parser/visitor.d.ts.map +1 -0
  526. package/dist/engine/preprocessor/sql-parser/visitor.js +875 -0
  527. package/dist/engine/preprocessor/sql-parser/visitor.js.map +1 -0
  528. package/dist/engine/preprocessor/sql-parser/visitor.test.d.ts +2 -0
  529. package/dist/engine/preprocessor/sql-parser/visitor.test.d.ts.map +1 -0
  530. package/dist/engine/preprocessor/sql-parser/visitor.test.js +142 -0
  531. package/dist/engine/preprocessor/sql-parser/visitor.test.js.map +1 -0
  532. package/dist/engine/preprocessor/steps/cache-populator.d.ts +12 -0
  533. package/dist/engine/preprocessor/steps/cache-populator.d.ts.map +1 -0
  534. package/dist/engine/preprocessor/steps/cache-populator.js +603 -0
  535. package/dist/engine/preprocessor/steps/cache-populator.js.map +1 -0
  536. package/dist/engine/preprocessor/steps/cache-populator.test.d.ts +2 -0
  537. package/dist/engine/preprocessor/steps/cache-populator.test.d.ts.map +1 -0
  538. package/dist/engine/preprocessor/steps/cache-populator.test.js +95 -0
  539. package/dist/engine/preprocessor/steps/cache-populator.test.js.map +1 -0
  540. package/dist/engine/preprocessor/steps/expand-sql-views.d.ts +13 -0
  541. package/dist/engine/preprocessor/steps/expand-sql-views.d.ts.map +1 -0
  542. package/dist/engine/preprocessor/steps/expand-sql-views.js +894 -0
  543. package/dist/engine/preprocessor/steps/expand-sql-views.js.map +1 -0
  544. package/dist/engine/preprocessor/steps/expand-sql-views.test.d.ts +2 -0
  545. package/dist/engine/preprocessor/steps/expand-sql-views.test.d.ts.map +1 -0
  546. package/dist/engine/preprocessor/steps/expand-sql-views.test.js +1177 -0
  547. package/dist/engine/preprocessor/steps/expand-sql-views.test.js.map +1 -0
  548. package/dist/engine/preprocessor/steps/rewrite-active-version-subquery.d.ts +7 -0
  549. package/dist/engine/preprocessor/steps/rewrite-active-version-subquery.d.ts.map +1 -0
  550. package/dist/engine/preprocessor/steps/rewrite-active-version-subquery.js +190 -0
  551. package/dist/engine/preprocessor/steps/rewrite-active-version-subquery.js.map +1 -0
  552. package/dist/engine/preprocessor/steps/rewrite-active-version-subquery.test.d.ts +2 -0
  553. package/dist/engine/preprocessor/steps/rewrite-active-version-subquery.test.d.ts.map +1 -0
  554. package/dist/engine/preprocessor/steps/rewrite-active-version-subquery.test.js +74 -0
  555. package/dist/engine/preprocessor/steps/rewrite-active-version-subquery.test.js.map +1 -0
  556. package/dist/engine/preprocessor/steps/rewrite-vtable-selects.bench.d.ts +2 -0
  557. package/dist/engine/preprocessor/steps/rewrite-vtable-selects.bench.d.ts.map +1 -0
  558. package/dist/engine/preprocessor/steps/rewrite-vtable-selects.bench.js +64 -0
  559. package/dist/engine/preprocessor/steps/rewrite-vtable-selects.bench.js.map +1 -0
  560. package/dist/engine/preprocessor/steps/rewrite-vtable-selects.d.ts +16 -0
  561. package/dist/engine/preprocessor/steps/rewrite-vtable-selects.d.ts.map +1 -0
  562. package/dist/engine/preprocessor/steps/rewrite-vtable-selects.js +2305 -0
  563. package/dist/engine/preprocessor/steps/rewrite-vtable-selects.js.map +1 -0
  564. package/dist/engine/preprocessor/steps/rewrite-vtable-selects.test.d.ts +2 -0
  565. package/dist/engine/preprocessor/steps/rewrite-vtable-selects.test.d.ts.map +1 -0
  566. package/dist/engine/preprocessor/steps/rewrite-vtable-selects.test.js +975 -0
  567. package/dist/engine/preprocessor/steps/rewrite-vtable-selects.test.js.map +1 -0
  568. package/dist/engine/preprocessor/types.d.ts +93 -0
  569. package/dist/engine/preprocessor/types.d.ts.map +1 -0
  570. package/dist/engine/preprocessor/types.js.map +1 -0
  571. package/dist/engine/sql-parser/tokenizer.d.ts +60 -0
  572. package/dist/engine/sql-parser/tokenizer.d.ts.map +1 -0
  573. package/dist/engine/sql-parser/tokenizer.js +188 -0
  574. package/dist/engine/sql-parser/tokenizer.js.map +1 -0
  575. package/dist/engine/sql-parser/tokenizer.test.d.ts +2 -0
  576. package/dist/engine/sql-parser/tokenizer.test.d.ts.map +1 -0
  577. package/dist/engine/sql-parser/tokenizer.test.js +252 -0
  578. package/dist/engine/sql-parser/tokenizer.test.js.map +1 -0
  579. package/dist/engine/with-runtime-cache.d.ts +27 -0
  580. package/dist/engine/with-runtime-cache.d.ts.map +1 -0
  581. package/dist/engine/with-runtime-cache.js +140 -0
  582. package/dist/engine/with-runtime-cache.js.map +1 -0
  583. package/dist/engine/with-runtime-cache.test.d.ts +2 -0
  584. package/dist/engine/with-runtime-cache.test.d.ts.map +1 -0
  585. package/dist/engine/with-runtime-cache.test.js +129 -0
  586. package/dist/engine/with-runtime-cache.test.js.map +1 -0
  587. package/dist/entity/conversation/attach-conversation.d.ts +49 -0
  588. package/dist/entity/conversation/attach-conversation.d.ts.map +1 -0
  589. package/dist/entity/conversation/attach-conversation.js +74 -0
  590. package/dist/entity/conversation/attach-conversation.js.map +1 -0
  591. package/dist/entity/conversation/attach-conversation.test.d.ts +2 -0
  592. package/dist/entity/conversation/attach-conversation.test.d.ts.map +1 -0
  593. package/dist/entity/conversation/attach-conversation.test.js +220 -0
  594. package/dist/entity/conversation/attach-conversation.test.js.map +1 -0
  595. package/dist/entity/conversation/schema-definition.d.ts +43 -0
  596. package/dist/entity/conversation/schema-definition.d.ts.map +1 -0
  597. package/dist/entity/conversation/schema-definition.js +44 -0
  598. package/dist/entity/conversation/schema-definition.js.map +1 -0
  599. package/dist/entity/conversation/schema.test.d.ts.map +1 -0
  600. package/dist/entity/conversation/schema.test.js +91 -0
  601. package/dist/entity/conversation/schema.test.js.map +1 -0
  602. package/dist/entity/eb-entity.d.ts +76 -0
  603. package/dist/entity/eb-entity.d.ts.map +1 -0
  604. package/dist/entity/eb-entity.js +156 -0
  605. package/dist/entity/eb-entity.js.map +1 -0
  606. package/dist/entity/eb-entity.test.d.ts +2 -0
  607. package/dist/entity/eb-entity.test.d.ts.map +1 -0
  608. package/dist/entity/eb-entity.test.js +650 -0
  609. package/dist/entity/eb-entity.test.js.map +1 -0
  610. package/dist/entity/index.d.ts +7 -0
  611. package/dist/entity/index.d.ts.map +1 -0
  612. package/dist/entity/index.js +4 -0
  613. package/dist/entity/index.js.map +1 -0
  614. package/dist/entity/label/attach-label.d.ts +79 -0
  615. package/dist/entity/label/attach-label.d.ts.map +1 -0
  616. package/dist/entity/label/attach-label.js +144 -0
  617. package/dist/entity/label/attach-label.js.map +1 -0
  618. package/dist/entity/label/attach-label.test.d.ts +2 -0
  619. package/dist/entity/label/attach-label.test.d.ts.map +1 -0
  620. package/dist/entity/label/attach-label.test.js +295 -0
  621. package/dist/entity/label/attach-label.test.js.map +1 -0
  622. package/dist/entity/label/schema-definition.d.ts +43 -0
  623. package/dist/entity/label/schema-definition.d.ts.map +1 -0
  624. package/dist/entity/label/schema-definition.js +39 -0
  625. package/dist/entity/label/schema-definition.js.map +1 -0
  626. package/dist/entity/label/schema.test.d.ts +2 -0
  627. package/dist/entity/label/schema.test.d.ts.map +1 -0
  628. package/dist/entity/label/schema.test.js +829 -0
  629. package/dist/entity/label/schema.test.js.map +1 -0
  630. package/dist/entity/types.d.ts +11 -0
  631. package/dist/entity/types.d.ts.map +1 -0
  632. package/dist/entity/types.js +2 -0
  633. package/dist/entity/types.js.map +1 -0
  634. package/dist/environment/api.d.ts +38 -0
  635. package/dist/environment/api.d.ts.map +1 -0
  636. package/dist/environment/api.js +2 -0
  637. package/dist/environment/api.js.map +1 -0
  638. package/dist/environment/api.test.d.ts +2 -0
  639. package/dist/environment/api.test.d.ts.map +1 -0
  640. package/dist/environment/api.test.js +76 -0
  641. package/dist/environment/api.test.js.map +1 -0
  642. package/dist/environment/in-memory.d.ts +22 -0
  643. package/dist/environment/in-memory.d.ts.map +1 -0
  644. package/dist/environment/in-memory.js +55 -0
  645. package/dist/environment/in-memory.js.map +1 -0
  646. package/dist/environment/in-memory.test.d.ts.map +1 -0
  647. package/dist/environment/in-memory.test.js +69 -0
  648. package/dist/environment/in-memory.test.js.map +1 -0
  649. package/dist/environment/index.d.ts +4 -0
  650. package/dist/environment/index.d.ts.map +1 -0
  651. package/dist/environment/index.js +3 -0
  652. package/dist/environment/index.js.map +1 -0
  653. package/dist/environment/kysely/kysely-driver.test.d.ts +2 -0
  654. package/dist/environment/kysely/kysely-driver.test.d.ts.map +1 -0
  655. package/dist/environment/kysely/kysely-driver.test.js +26 -0
  656. package/dist/environment/kysely/kysely-driver.test.js.map +1 -0
  657. package/dist/environment/load-from-string.d.ts +3 -0
  658. package/dist/environment/load-from-string.d.ts.map +1 -0
  659. package/dist/environment/load-from-string.js +64 -0
  660. package/dist/environment/load-from-string.js.map +1 -0
  661. package/dist/environment/load-from-string.test.d.ts +2 -0
  662. package/dist/environment/load-from-string.test.d.ts.map +1 -0
  663. package/dist/environment/load-from-string.test.js +16 -0
  664. package/dist/environment/load-from-string.test.js.map +1 -0
  665. package/dist/environment/opfs-sah.browser.test.d.ts +2 -0
  666. package/dist/environment/opfs-sah.browser.test.d.ts.map +1 -0
  667. package/dist/environment/opfs-sah.browser.test.js +309 -0
  668. package/dist/environment/opfs-sah.browser.test.js.map +1 -0
  669. package/dist/environment/opfs-sah.d.ts +63 -0
  670. package/dist/environment/opfs-sah.d.ts.map +1 -0
  671. package/dist/environment/opfs-sah.js +240 -0
  672. package/dist/environment/opfs-sah.js.map +1 -0
  673. package/dist/environment/opfs-sah.worker.d.ts +2 -0
  674. package/dist/environment/opfs-sah.worker.d.ts.map +1 -0
  675. package/dist/environment/opfs-sah.worker.js +212 -0
  676. package/dist/environment/opfs-sah.worker.js.map +1 -0
  677. package/dist/environment/test-actors/echo.actor.d.ts +2 -0
  678. package/dist/environment/test-actors/echo.actor.d.ts.map +1 -0
  679. package/dist/environment/test-actors/echo.actor.js +7 -0
  680. package/dist/environment/test-actors/echo.actor.js.map +1 -0
  681. package/dist/filesystem/directory/ensure-directories.d.ts +48 -0
  682. package/dist/filesystem/directory/ensure-directories.d.ts.map +1 -0
  683. package/dist/filesystem/directory/ensure-directories.js +223 -0
  684. package/dist/filesystem/directory/ensure-directories.js.map +1 -0
  685. package/dist/filesystem/directory/schema-definition.d.ts +36 -0
  686. package/dist/filesystem/directory/schema-definition.d.ts.map +1 -0
  687. package/dist/filesystem/directory/schema-definition.js +35 -0
  688. package/dist/filesystem/directory/schema-definition.js.map +1 -0
  689. package/dist/filesystem/directory/schema.d.ts +11 -0
  690. package/dist/filesystem/directory/schema.d.ts.map +1 -0
  691. package/dist/filesystem/directory/schema.js +494 -0
  692. package/dist/filesystem/directory/schema.js.map +1 -0
  693. package/dist/filesystem/directory/schema.test.d.ts +2 -0
  694. package/dist/filesystem/directory/schema.test.d.ts.map +1 -0
  695. package/dist/filesystem/directory/schema.test.js +93 -0
  696. package/dist/filesystem/directory/schema.test.js.map +1 -0
  697. package/dist/filesystem/file/cache/clear-file-data-cache.d.ts +17 -0
  698. package/dist/filesystem/file/cache/clear-file-data-cache.d.ts.map +1 -0
  699. package/dist/filesystem/file/cache/clear-file-data-cache.js +54 -0
  700. package/dist/filesystem/file/cache/clear-file-data-cache.js.map +1 -0
  701. package/dist/filesystem/file/cache/lixcol-schema.d.ts +27 -0
  702. package/dist/filesystem/file/cache/lixcol-schema.d.ts.map +1 -0
  703. package/dist/filesystem/file/cache/lixcol-schema.js +31 -0
  704. package/dist/filesystem/file/cache/lixcol-schema.js.map +1 -0
  705. package/dist/filesystem/file/cache/path-cache-schema.d.ts +25 -0
  706. package/dist/filesystem/file/cache/path-cache-schema.d.ts.map +1 -0
  707. package/dist/filesystem/file/cache/path-cache-schema.js +30 -0
  708. package/dist/filesystem/file/cache/path-cache-schema.js.map +1 -0
  709. package/dist/filesystem/file/cache/schema.d.ts +21 -0
  710. package/dist/filesystem/file/cache/schema.d.ts.map +1 -0
  711. package/dist/filesystem/file/cache/schema.js +24 -0
  712. package/dist/filesystem/file/cache/schema.js.map +1 -0
  713. package/dist/filesystem/file/cache/schema.test.d.ts +2 -0
  714. package/dist/filesystem/file/cache/schema.test.d.ts.map +1 -0
  715. package/dist/filesystem/file/cache/schema.test.js +264 -0
  716. package/dist/filesystem/file/cache/schema.test.js.map +1 -0
  717. package/dist/filesystem/file/cache/update-file-data-cache.d.ts +20 -0
  718. package/dist/filesystem/file/cache/update-file-data-cache.d.ts.map +1 -0
  719. package/dist/filesystem/file/cache/update-file-data-cache.js +25 -0
  720. package/dist/filesystem/file/cache/update-file-data-cache.js.map +1 -0
  721. package/dist/filesystem/file/cache/update-file-lixcol-cache.d.ts +21 -0
  722. package/dist/filesystem/file/cache/update-file-lixcol-cache.d.ts.map +1 -0
  723. package/dist/filesystem/file/cache/update-file-lixcol-cache.js +78 -0
  724. package/dist/filesystem/file/cache/update-file-lixcol-cache.js.map +1 -0
  725. package/dist/filesystem/file/cache/update-file-path-cache.d.ts +25 -0
  726. package/dist/filesystem/file/cache/update-file-path-cache.d.ts.map +1 -0
  727. package/dist/filesystem/file/cache/update-file-path-cache.js +38 -0
  728. package/dist/filesystem/file/cache/update-file-path-cache.js.map +1 -0
  729. package/dist/filesystem/file/descriptor-utils.d.ts +70 -0
  730. package/dist/filesystem/file/descriptor-utils.d.ts.map +1 -0
  731. package/dist/filesystem/file/descriptor-utils.js +218 -0
  732. package/dist/filesystem/file/descriptor-utils.js.map +1 -0
  733. package/dist/filesystem/file/file-handlers.d.ts +22 -0
  734. package/dist/filesystem/file/file-handlers.d.ts.map +1 -0
  735. package/dist/filesystem/file/file-handlers.js +540 -0
  736. package/dist/filesystem/file/file-handlers.js.map +1 -0
  737. package/dist/filesystem/file/file-handlers.test.d.ts.map +1 -0
  738. package/dist/filesystem/file/file-handlers.test.js +344 -0
  739. package/dist/filesystem/file/file-handlers.test.js.map +1 -0
  740. package/dist/filesystem/file/materialize-file-data-at-commit.d.ts +9 -0
  741. package/dist/filesystem/file/materialize-file-data-at-commit.d.ts.map +1 -0
  742. package/dist/filesystem/file/materialize-file-data-at-commit.js +156 -0
  743. package/dist/filesystem/file/materialize-file-data-at-commit.js.map +1 -0
  744. package/dist/filesystem/file/materialize-file-data.d.ts +8 -0
  745. package/dist/filesystem/file/materialize-file-data.d.ts.map +1 -0
  746. package/dist/filesystem/file/materialize-file-data.js +111 -0
  747. package/dist/filesystem/file/materialize-file-data.js.map +1 -0
  748. package/dist/filesystem/file/materialize-file-data.test.d.ts.map +1 -0
  749. package/dist/filesystem/file/materialize-file-data.test.js +104 -0
  750. package/dist/filesystem/file/materialize-file-data.test.js.map +1 -0
  751. package/dist/filesystem/file/schema-definition.d.ts +46 -0
  752. package/dist/filesystem/file/schema-definition.d.ts.map +1 -0
  753. package/dist/filesystem/file/schema-definition.js +39 -0
  754. package/dist/filesystem/file/schema-definition.js.map +1 -0
  755. package/dist/filesystem/file/schema.d.ts +47 -0
  756. package/dist/filesystem/file/schema.d.ts.map +1 -0
  757. package/dist/filesystem/file/schema.js +610 -0
  758. package/dist/filesystem/file/schema.js.map +1 -0
  759. package/dist/filesystem/file/schema.test.d.ts +2 -0
  760. package/dist/filesystem/file/schema.test.d.ts.map +1 -0
  761. package/dist/filesystem/file/schema.test.js +1885 -0
  762. package/dist/filesystem/file/schema.test.js.map +1 -0
  763. package/dist/filesystem/file/select-file-data.d.ts +21 -0
  764. package/dist/filesystem/file/select-file-data.d.ts.map +1 -0
  765. package/dist/filesystem/file/select-file-data.js +48 -0
  766. package/dist/filesystem/file/select-file-data.js.map +1 -0
  767. package/dist/filesystem/file/select-file-lixcol.d.ts +27 -0
  768. package/dist/filesystem/file/select-file-lixcol.d.ts.map +1 -0
  769. package/dist/filesystem/file/select-file-lixcol.js +120 -0
  770. package/dist/filesystem/file/select-file-lixcol.js.map +1 -0
  771. package/dist/filesystem/file/store-detected-change-schema.d.ts +8 -0
  772. package/dist/filesystem/file/store-detected-change-schema.d.ts.map +1 -0
  773. package/dist/filesystem/file/store-detected-change-schema.js +38 -0
  774. package/dist/filesystem/file/store-detected-change-schema.js.map +1 -0
  775. package/dist/filesystem/file/store-detected-change-schema.test.d.ts.map +1 -0
  776. package/dist/filesystem/file/store-detected-change-schema.test.js +222 -0
  777. package/dist/filesystem/file/store-detected-change-schema.test.js.map +1 -0
  778. package/dist/filesystem/file/unknown-file-fallback-plugin.d.ts +23 -0
  779. package/dist/filesystem/file/unknown-file-fallback-plugin.d.ts.map +1 -0
  780. package/dist/filesystem/file/unknown-file-fallback-plugin.js +74 -0
  781. package/dist/filesystem/file/unknown-file-fallback-plugin.js.map +1 -0
  782. package/dist/filesystem/file/unknown-file-fallback-plugin.test.d.ts.map +1 -0
  783. package/dist/filesystem/file/unknown-file-fallback-plugin.test.js +319 -0
  784. package/dist/filesystem/file/unknown-file-fallback-plugin.test.js.map +1 -0
  785. package/dist/filesystem/fs.bench.d.ts +2 -0
  786. package/dist/filesystem/fs.bench.d.ts.map +1 -0
  787. package/dist/filesystem/fs.bench.js +534 -0
  788. package/dist/filesystem/fs.bench.js.map +1 -0
  789. package/dist/filesystem/index.d.ts +5 -0
  790. package/dist/filesystem/index.d.ts.map +1 -0
  791. package/dist/filesystem/index.js +4 -0
  792. package/dist/filesystem/index.js.map +1 -0
  793. package/dist/filesystem/path.d.ts +37 -0
  794. package/dist/filesystem/path.d.ts.map +1 -0
  795. package/dist/filesystem/path.js +94 -0
  796. package/dist/filesystem/path.js.map +1 -0
  797. package/dist/filesystem/path.test.d.ts +2 -0
  798. package/dist/filesystem/path.test.d.ts.map +1 -0
  799. package/dist/filesystem/path.test.js +102 -0
  800. package/dist/filesystem/path.test.js.map +1 -0
  801. package/dist/filesystem/schema.d.ts +11 -0
  802. package/dist/filesystem/schema.d.ts.map +1 -0
  803. package/dist/filesystem/schema.js +13 -0
  804. package/dist/filesystem/schema.js.map +1 -0
  805. package/dist/filesystem/schema.test.d.ts +2 -0
  806. package/dist/filesystem/schema.test.d.ts.map +1 -0
  807. package/dist/filesystem/schema.test.js +502 -0
  808. package/dist/filesystem/schema.test.js.map +1 -0
  809. package/dist/filesystem/util/glob.d.ts +18 -0
  810. package/dist/filesystem/util/glob.d.ts.map +1 -0
  811. package/dist/filesystem/util/glob.js +26 -0
  812. package/dist/filesystem/util/glob.js.map +1 -0
  813. package/dist/hooks/create-hooks.d.ts +68 -35
  814. package/dist/hooks/create-hooks.d.ts.map +1 -1
  815. package/dist/hooks/create-hooks.js +18 -7
  816. package/dist/hooks/create-hooks.js.map +1 -1
  817. package/dist/hooks/create-hooks.test.js +114 -17
  818. package/dist/hooks/create-hooks.test.js.map +1 -1
  819. package/dist/index.d.ts +11 -4
  820. package/dist/index.d.ts.map +1 -1
  821. package/dist/index.js +11 -4
  822. package/dist/index.js.map +1 -1
  823. package/dist/key-value/index.d.ts +1 -1
  824. package/dist/key-value/index.d.ts.map +1 -1
  825. package/dist/key-value/index.js +1 -1
  826. package/dist/key-value/index.js.map +1 -1
  827. package/dist/key-value/schema-definition.d.ts +74 -0
  828. package/dist/key-value/schema-definition.d.ts.map +1 -0
  829. package/dist/key-value/schema-definition.js +19 -0
  830. package/dist/key-value/schema-definition.js.map +1 -0
  831. package/dist/key-value/schema.test.js +203 -13
  832. package/dist/key-value/schema.test.js.map +1 -1
  833. package/dist/label/create-label.d.ts +5 -5
  834. package/dist/label/create-label.d.ts.map +1 -1
  835. package/dist/label/create-label.js +7 -4
  836. package/dist/label/create-label.js.map +1 -1
  837. package/dist/label/create-label.test.js +2 -2
  838. package/dist/label/create-label.test.js.map +1 -1
  839. package/dist/label/index.d.ts +1 -1
  840. package/dist/label/index.d.ts.map +1 -1
  841. package/dist/label/index.js +1 -1
  842. package/dist/label/index.js.map +1 -1
  843. package/dist/label/schema-definition.d.ts +24 -0
  844. package/dist/label/schema-definition.d.ts.map +1 -0
  845. package/dist/label/schema-definition.js +21 -0
  846. package/dist/label/schema-definition.js.map +1 -0
  847. package/dist/lix/index.d.ts +0 -3
  848. package/dist/lix/index.d.ts.map +1 -1
  849. package/dist/lix/index.js +0 -3
  850. package/dist/lix/index.js.map +1 -1
  851. package/dist/lix/new-lix.d.ts +5 -3
  852. package/dist/lix/new-lix.d.ts.map +1 -1
  853. package/dist/lix/new-lix.js +403 -94
  854. package/dist/lix/new-lix.js.map +1 -1
  855. package/dist/lix/new-lix.test.js +247 -19
  856. package/dist/lix/new-lix.test.js.map +1 -1
  857. package/dist/lix/open-lix.bench.d.ts +2 -0
  858. package/dist/lix/open-lix.bench.d.ts.map +1 -0
  859. package/dist/lix/open-lix.bench.js +22 -0
  860. package/dist/lix/open-lix.bench.js.map +1 -0
  861. package/dist/lix/open-lix.d.ts +93 -41
  862. package/dist/lix/open-lix.d.ts.map +1 -1
  863. package/dist/lix/open-lix.js +80 -80
  864. package/dist/lix/open-lix.js.map +1 -1
  865. package/dist/lix/open-lix.test.js +320 -6
  866. package/dist/lix/open-lix.test.js.map +1 -1
  867. package/dist/log/create-lix-own-log.d.ts +26 -19
  868. package/dist/log/create-lix-own-log.d.ts.map +1 -1
  869. package/dist/log/create-lix-own-log.js +33 -45
  870. package/dist/log/create-lix-own-log.js.map +1 -1
  871. package/dist/log/create-lix-own-log.test.js +49 -17
  872. package/dist/log/create-lix-own-log.test.js.map +1 -1
  873. package/dist/log/create-log.d.ts +23 -13
  874. package/dist/log/create-log.d.ts.map +1 -1
  875. package/dist/log/create-log.js +20 -11
  876. package/dist/log/create-log.js.map +1 -1
  877. package/dist/log/index.d.ts +1 -1
  878. package/dist/log/index.d.ts.map +1 -1
  879. package/dist/log/index.js +1 -1
  880. package/dist/log/index.js.map +1 -1
  881. package/dist/log/schema-definition.d.ts +36 -0
  882. package/dist/log/schema-definition.d.ts.map +1 -0
  883. package/dist/log/schema-definition.js +39 -0
  884. package/dist/log/schema-definition.js.map +1 -0
  885. package/dist/log/schema.test.js +51 -18
  886. package/dist/log/schema.test.js.map +1 -1
  887. package/dist/observe/create-observe.d.ts.map +1 -1
  888. package/dist/observe/create-observe.js +198 -72
  889. package/dist/observe/create-observe.js.map +1 -1
  890. package/dist/observe/create-observe.test.js +688 -44
  891. package/dist/observe/create-observe.test.js.map +1 -1
  892. package/dist/observe/determine-schema-keys.d.ts +14 -0
  893. package/dist/observe/determine-schema-keys.d.ts.map +1 -0
  894. package/dist/observe/determine-schema-keys.js +387 -0
  895. package/dist/observe/determine-schema-keys.js.map +1 -0
  896. package/dist/observe/determine-schema-keys.test.d.ts +2 -0
  897. package/dist/observe/determine-schema-keys.test.d.ts.map +1 -0
  898. package/dist/observe/determine-schema-keys.test.js +308 -0
  899. package/dist/observe/determine-schema-keys.test.js.map +1 -0
  900. package/dist/plugin/index.d.ts +2 -1
  901. package/dist/plugin/index.d.ts.map +1 -1
  902. package/dist/plugin/index.js +1 -0
  903. package/dist/plugin/index.js.map +1 -1
  904. package/dist/plugin/lix-plugin.d.ts +48 -9
  905. package/dist/plugin/lix-plugin.d.ts.map +1 -1
  906. package/dist/plugin/lix-plugin.test-d.js +1 -0
  907. package/dist/plugin/lix-plugin.test-d.js.map +1 -1
  908. package/dist/plugin/lix-plugin.test.d.ts +2 -0
  909. package/dist/plugin/lix-plugin.test.d.ts.map +1 -0
  910. package/dist/plugin/lix-plugin.test.js +49 -0
  911. package/dist/plugin/lix-plugin.test.js.map +1 -0
  912. package/dist/plugin/mock-json-plugin.d.ts.map +1 -1
  913. package/dist/plugin/mock-json-plugin.js +1 -0
  914. package/dist/plugin/mock-json-plugin.js.map +1 -1
  915. package/dist/plugin/mock-json-plugin.test.js +14 -4
  916. package/dist/plugin/mock-json-plugin.test.js.map +1 -1
  917. package/dist/plugin/query-sync.d.ts +85 -0
  918. package/dist/plugin/query-sync.d.ts.map +1 -0
  919. package/dist/plugin/query-sync.js +110 -0
  920. package/dist/plugin/query-sync.js.map +1 -0
  921. package/dist/plugin/query-sync.test.d.ts +2 -0
  922. package/dist/plugin/query-sync.test.d.ts.map +1 -0
  923. package/dist/plugin/query-sync.test.js +110 -0
  924. package/dist/plugin/query-sync.test.js.map +1 -0
  925. package/dist/query-filter/commit-is-ancestor-of.d.ts +51 -0
  926. package/dist/query-filter/commit-is-ancestor-of.d.ts.map +1 -0
  927. package/dist/query-filter/commit-is-ancestor-of.js +63 -0
  928. package/dist/query-filter/commit-is-ancestor-of.js.map +1 -0
  929. package/dist/query-filter/commit-is-ancestor-of.test.d.ts +2 -0
  930. package/dist/query-filter/commit-is-ancestor-of.test.d.ts.map +1 -0
  931. package/dist/query-filter/commit-is-ancestor-of.test.js +202 -0
  932. package/dist/query-filter/commit-is-ancestor-of.test.js.map +1 -0
  933. package/dist/query-filter/commit-is-descendant-of.d.ts +44 -0
  934. package/dist/query-filter/commit-is-descendant-of.d.ts.map +1 -0
  935. package/dist/query-filter/commit-is-descendant-of.js +56 -0
  936. package/dist/query-filter/commit-is-descendant-of.js.map +1 -0
  937. package/dist/query-filter/commit-is-descendant-of.test.d.ts +2 -0
  938. package/dist/query-filter/commit-is-descendant-of.test.d.ts.map +1 -0
  939. package/dist/query-filter/commit-is-descendant-of.test.js +218 -0
  940. package/dist/query-filter/commit-is-descendant-of.test.js.map +1 -0
  941. package/dist/query-filter/index.d.ts +2 -7
  942. package/dist/query-filter/index.d.ts.map +1 -1
  943. package/dist/query-filter/index.js +2 -7
  944. package/dist/query-filter/index.js.map +1 -1
  945. package/dist/schema-definition/definition.d.ts +200 -51
  946. package/dist/schema-definition/definition.d.ts.map +1 -1
  947. package/dist/schema-definition/definition.js +102 -18
  948. package/dist/schema-definition/definition.js.map +1 -1
  949. package/dist/schema-definition/definition.test-d.js +78 -10
  950. package/dist/schema-definition/definition.test-d.js.map +1 -1
  951. package/dist/schema-definition/definition.test.js +389 -108
  952. package/dist/schema-definition/definition.test.js.map +1 -1
  953. package/dist/schema-definition/json-pointer.d.ts +51 -0
  954. package/dist/schema-definition/json-pointer.d.ts.map +1 -0
  955. package/dist/schema-definition/json-pointer.js +143 -0
  956. package/dist/schema-definition/json-pointer.js.map +1 -0
  957. package/dist/schema-definition/json-pointer.test.d.ts +2 -0
  958. package/dist/schema-definition/json-pointer.test.d.ts.map +1 -0
  959. package/dist/schema-definition/json-pointer.test.js +72 -0
  960. package/dist/schema-definition/json-pointer.test.js.map +1 -0
  961. package/dist/schema-definition/validate-lix-schema.d.ts.map +1 -1
  962. package/dist/schema-definition/validate-lix-schema.js +73 -0
  963. package/dist/schema-definition/validate-lix-schema.js.map +1 -1
  964. package/dist/schema-definition/validate-lix-schema.test.js +78 -1
  965. package/dist/schema-definition/validate-lix-schema.test.js.map +1 -1
  966. package/dist/server-protocol-handler/environment/create-in-memory-environment.js +1 -1
  967. package/dist/server-protocol-handler/environment/create-in-memory-environment.js.map +1 -1
  968. package/dist/server-protocol-handler/environment/create-in-memory-environment.test.js +2 -2
  969. package/dist/server-protocol-handler/environment/create-in-memory-environment.test.js.map +1 -1
  970. package/dist/server-protocol-handler/routes/get-v1.d.ts.map +1 -1
  971. package/dist/server-protocol-handler/routes/get-v1.js +4 -2
  972. package/dist/server-protocol-handler/routes/get-v1.js.map +1 -1
  973. package/dist/server-protocol-handler/routes/push-v1.test.js +2 -2
  974. package/dist/server-protocol-handler/routes/push-v1.test.js.map +1 -1
  975. package/dist/services/env-variables/index.d.ts +1 -1
  976. package/dist/services/env-variables/index.js +2 -2
  977. package/dist/services/env-variables/index.js.map +1 -1
  978. package/dist/services/telemetry/capture.test.js +4 -4
  979. package/dist/services/telemetry/capture.test.js.map +1 -1
  980. package/dist/snapshot/schema.d.ts +1 -1
  981. package/dist/snapshot/schema.d.ts.map +1 -1
  982. package/dist/snapshot/schema.js +16 -4
  983. package/dist/snapshot/schema.js.map +1 -1
  984. package/dist/snapshot/schema.test.js +98 -12
  985. package/dist/snapshot/schema.test.js.map +1 -1
  986. package/dist/state/cache/builtin-schemas.d.ts +3 -0
  987. package/dist/state/cache/builtin-schemas.d.ts.map +1 -0
  988. package/dist/state/cache/builtin-schemas.js +16 -0
  989. package/dist/state/cache/builtin-schemas.js.map +1 -0
  990. package/dist/state/cache/clear-state-cache.d.ts +17 -0
  991. package/dist/state/cache/clear-state-cache.d.ts.map +1 -0
  992. package/dist/state/cache/clear-state-cache.js +43 -0
  993. package/dist/state/cache/clear-state-cache.js.map +1 -0
  994. package/dist/state/cache/clear-state-cache.test.d.ts +2 -0
  995. package/dist/state/cache/clear-state-cache.test.d.ts.map +1 -0
  996. package/dist/state/cache/clear-state-cache.test.js +38 -0
  997. package/dist/state/cache/clear-state-cache.test.js.map +1 -0
  998. package/dist/state/cache/create-schema-cache-table.d.ts +37 -0
  999. package/dist/state/cache/create-schema-cache-table.d.ts.map +1 -0
  1000. package/dist/state/cache/create-schema-cache-table.js +137 -0
  1001. package/dist/state/cache/create-schema-cache-table.js.map +1 -0
  1002. package/dist/state/cache/create-schema-cache-table.test.d.ts +2 -0
  1003. package/dist/state/cache/create-schema-cache-table.test.d.ts.map +1 -0
  1004. package/dist/state/cache/create-schema-cache-table.test.js +49 -0
  1005. package/dist/state/cache/create-schema-cache-table.test.js.map +1 -0
  1006. package/dist/state/cache/is-stale-state-cache.d.ts +27 -0
  1007. package/dist/state/cache/is-stale-state-cache.d.ts.map +1 -0
  1008. package/dist/state/cache/is-stale-state-cache.js +64 -0
  1009. package/dist/state/cache/is-stale-state-cache.js.map +1 -0
  1010. package/dist/state/cache/is-stale-state-cache.test.d.ts +2 -0
  1011. package/dist/state/cache/is-stale-state-cache.test.d.ts.map +1 -0
  1012. package/dist/state/cache/is-stale-state-cache.test.js +30 -0
  1013. package/dist/state/cache/is-stale-state-cache.test.js.map +1 -0
  1014. package/dist/state/cache/mark-state-cache-as-stale.d.ts +10 -0
  1015. package/dist/state/cache/mark-state-cache-as-stale.d.ts.map +1 -0
  1016. package/dist/state/cache/mark-state-cache-as-stale.js +50 -0
  1017. package/dist/state/cache/mark-state-cache-as-stale.js.map +1 -0
  1018. package/dist/state/cache/populate-state-cache.d.ts +19 -0
  1019. package/dist/state/cache/populate-state-cache.d.ts.map +1 -0
  1020. package/dist/state/cache/populate-state-cache.js +196 -0
  1021. package/dist/state/cache/populate-state-cache.js.map +1 -0
  1022. package/dist/state/cache/populate-state-cache.test.d.ts +2 -0
  1023. package/dist/state/cache/populate-state-cache.test.d.ts.map +1 -0
  1024. package/dist/state/cache/populate-state-cache.test.js +526 -0
  1025. package/dist/state/cache/populate-state-cache.test.js.map +1 -0
  1026. package/dist/state/cache/schema-indexes.d.ts +19 -0
  1027. package/dist/state/cache/schema-indexes.d.ts.map +1 -0
  1028. package/dist/state/cache/schema-indexes.js +137 -0
  1029. package/dist/state/cache/schema-indexes.js.map +1 -0
  1030. package/dist/state/cache/schema-indexes.test.d.ts +2 -0
  1031. package/dist/state/cache/schema-indexes.test.d.ts.map +1 -0
  1032. package/dist/state/cache/schema-indexes.test.js +124 -0
  1033. package/dist/state/cache/schema-indexes.test.js.map +1 -0
  1034. package/dist/state/cache/schema-resolver.d.ts +34 -0
  1035. package/dist/state/cache/schema-resolver.d.ts.map +1 -0
  1036. package/dist/state/cache/schema-resolver.js +49 -0
  1037. package/dist/state/cache/schema-resolver.js.map +1 -0
  1038. package/dist/state/cache/schema.bench.d.ts +2 -0
  1039. package/dist/state/cache/schema.bench.d.ts.map +1 -0
  1040. package/dist/state/cache/schema.bench.js +305 -0
  1041. package/dist/state/cache/schema.bench.js.map +1 -0
  1042. package/dist/state/cache/schema.d.ts +23 -0
  1043. package/dist/state/cache/schema.d.ts.map +1 -0
  1044. package/dist/state/cache/schema.js +41 -0
  1045. package/dist/state/cache/schema.js.map +1 -0
  1046. package/dist/state/cache/schema.test.d.ts +2 -0
  1047. package/dist/state/cache/schema.test.d.ts.map +1 -0
  1048. package/dist/state/cache/schema.test.js +126 -0
  1049. package/dist/state/cache/schema.test.js.map +1 -0
  1050. package/dist/state/cache/select-from-state-cache.d.ts +11 -0
  1051. package/dist/state/cache/select-from-state-cache.d.ts.map +1 -0
  1052. package/dist/state/cache/select-from-state-cache.js +50 -0
  1053. package/dist/state/cache/select-from-state-cache.js.map +1 -0
  1054. package/dist/state/cache/select-from-state-cache.test.d.ts +2 -0
  1055. package/dist/state/cache/select-from-state-cache.test.d.ts.map +1 -0
  1056. package/dist/state/cache/select-from-state-cache.test.js +49 -0
  1057. package/dist/state/cache/select-from-state-cache.test.js.map +1 -0
  1058. package/dist/state/cache/update-state-cache.bench.d.ts +2 -0
  1059. package/dist/state/cache/update-state-cache.bench.d.ts.map +1 -0
  1060. package/dist/state/cache/update-state-cache.bench.js +129 -0
  1061. package/dist/state/cache/update-state-cache.bench.js.map +1 -0
  1062. package/dist/state/cache/update-state-cache.d.ts +40 -0
  1063. package/dist/state/cache/update-state-cache.d.ts.map +1 -0
  1064. package/dist/state/cache/update-state-cache.js +378 -0
  1065. package/dist/state/cache/update-state-cache.js.map +1 -0
  1066. package/dist/state/cache/update-state-cache.test.d.ts +2 -0
  1067. package/dist/state/cache/update-state-cache.test.d.ts.map +1 -0
  1068. package/dist/state/cache/update-state-cache.test.js +970 -0
  1069. package/dist/state/cache/update-state-cache.test.js.map +1 -0
  1070. package/dist/state/cache-v2/cache-columns.d.ts +3 -0
  1071. package/dist/state/cache-v2/cache-columns.d.ts.map +1 -0
  1072. package/dist/state/cache-v2/cache-columns.js +20 -0
  1073. package/dist/state/cache-v2/cache-columns.js.map +1 -0
  1074. package/dist/state/cache-v2/clear-state-cache.d.ts +17 -0
  1075. package/dist/state/cache-v2/clear-state-cache.d.ts.map +1 -0
  1076. package/dist/state/cache-v2/clear-state-cache.js +42 -0
  1077. package/dist/state/cache-v2/clear-state-cache.js.map +1 -0
  1078. package/dist/state/cache-v2/clear-state-cache.test.d.ts +2 -0
  1079. package/dist/state/cache-v2/clear-state-cache.test.d.ts.map +1 -0
  1080. package/dist/state/cache-v2/clear-state-cache.test.js +87 -0
  1081. package/dist/state/cache-v2/clear-state-cache.test.js.map +1 -0
  1082. package/dist/state/cache-v2/create-schema-cache-table.d.ts +48 -0
  1083. package/dist/state/cache-v2/create-schema-cache-table.d.ts.map +1 -0
  1084. package/dist/state/cache-v2/create-schema-cache-table.js +152 -0
  1085. package/dist/state/cache-v2/create-schema-cache-table.js.map +1 -0
  1086. package/dist/state/cache-v2/create-schema-cache-table.test.d.ts +2 -0
  1087. package/dist/state/cache-v2/create-schema-cache-table.test.d.ts.map +1 -0
  1088. package/dist/state/cache-v2/create-schema-cache-table.test.js +76 -0
  1089. package/dist/state/cache-v2/create-schema-cache-table.test.js.map +1 -0
  1090. package/dist/state/cache-v2/is-stale-state-cache.d.ts +27 -0
  1091. package/dist/state/cache-v2/is-stale-state-cache.d.ts.map +1 -0
  1092. package/dist/state/cache-v2/is-stale-state-cache.js +64 -0
  1093. package/dist/state/cache-v2/is-stale-state-cache.js.map +1 -0
  1094. package/dist/state/cache-v2/is-stale-state-cache.test.d.ts +2 -0
  1095. package/dist/state/cache-v2/is-stale-state-cache.test.d.ts.map +1 -0
  1096. package/dist/state/cache-v2/is-stale-state-cache.test.js +30 -0
  1097. package/dist/state/cache-v2/is-stale-state-cache.test.js.map +1 -0
  1098. package/dist/state/cache-v2/mark-state-cache-as-stale.d.ts +22 -0
  1099. package/dist/state/cache-v2/mark-state-cache-as-stale.d.ts.map +1 -0
  1100. package/dist/state/cache-v2/mark-state-cache-as-stale.js +62 -0
  1101. package/dist/state/cache-v2/mark-state-cache-as-stale.js.map +1 -0
  1102. package/dist/state/cache-v2/populate-state-cache.d.ts +22 -0
  1103. package/dist/state/cache-v2/populate-state-cache.d.ts.map +1 -0
  1104. package/dist/state/cache-v2/populate-state-cache.js +143 -0
  1105. package/dist/state/cache-v2/populate-state-cache.js.map +1 -0
  1106. package/dist/state/cache-v2/populate-state-cache.test.d.ts +2 -0
  1107. package/dist/state/cache-v2/populate-state-cache.test.d.ts.map +1 -0
  1108. package/dist/state/cache-v2/populate-state-cache.test.js +102 -0
  1109. package/dist/state/cache-v2/populate-state-cache.test.js.map +1 -0
  1110. package/dist/state/cache-v2/schema-metadata.d.ts +20 -0
  1111. package/dist/state/cache-v2/schema-metadata.d.ts.map +1 -0
  1112. package/dist/state/cache-v2/schema-metadata.js +18 -0
  1113. package/dist/state/cache-v2/schema-metadata.js.map +1 -0
  1114. package/dist/state/cache-v2/schema.bench.d.ts +2 -0
  1115. package/dist/state/cache-v2/schema.bench.d.ts.map +1 -0
  1116. package/dist/state/cache-v2/schema.bench.js +194 -0
  1117. package/dist/state/cache-v2/schema.bench.js.map +1 -0
  1118. package/dist/state/cache-v2/schema.d.ts +30 -0
  1119. package/dist/state/cache-v2/schema.d.ts.map +1 -0
  1120. package/dist/state/cache-v2/schema.js +72 -0
  1121. package/dist/state/cache-v2/schema.js.map +1 -0
  1122. package/dist/state/cache-v2/schema.test.d.ts +2 -0
  1123. package/dist/state/cache-v2/schema.test.d.ts.map +1 -0
  1124. package/dist/state/cache-v2/schema.test.js +246 -0
  1125. package/dist/state/cache-v2/schema.test.js.map +1 -0
  1126. package/dist/state/cache-v2/select-from-state-cache.d.ts +19 -0
  1127. package/dist/state/cache-v2/select-from-state-cache.d.ts.map +1 -0
  1128. package/dist/state/cache-v2/select-from-state-cache.js +141 -0
  1129. package/dist/state/cache-v2/select-from-state-cache.js.map +1 -0
  1130. package/dist/state/cache-v2/select-from-state-cache.test.d.ts +2 -0
  1131. package/dist/state/cache-v2/select-from-state-cache.test.d.ts.map +1 -0
  1132. package/dist/state/cache-v2/select-from-state-cache.test.js +72 -0
  1133. package/dist/state/cache-v2/select-from-state-cache.test.js.map +1 -0
  1134. package/dist/state/cache-v2/sqlite-type-mapper.d.ts +6 -0
  1135. package/dist/state/cache-v2/sqlite-type-mapper.d.ts.map +1 -0
  1136. package/dist/state/cache-v2/sqlite-type-mapper.js +50 -0
  1137. package/dist/state/cache-v2/sqlite-type-mapper.js.map +1 -0
  1138. package/dist/state/cache-v2/sqlite-type-mapper.test.d.ts +2 -0
  1139. package/dist/state/cache-v2/sqlite-type-mapper.test.d.ts.map +1 -0
  1140. package/dist/state/cache-v2/sqlite-type-mapper.test.js +41 -0
  1141. package/dist/state/cache-v2/sqlite-type-mapper.test.js.map +1 -0
  1142. package/dist/state/cache-v2/update-state-cache.bench.d.ts +2 -0
  1143. package/dist/state/cache-v2/update-state-cache.bench.d.ts.map +1 -0
  1144. package/dist/state/cache-v2/update-state-cache.bench.js +165 -0
  1145. package/dist/state/cache-v2/update-state-cache.bench.js.map +1 -0
  1146. package/dist/state/cache-v2/update-state-cache.d.ts +23 -0
  1147. package/dist/state/cache-v2/update-state-cache.d.ts.map +1 -0
  1148. package/dist/state/cache-v2/update-state-cache.js +403 -0
  1149. package/dist/state/cache-v2/update-state-cache.js.map +1 -0
  1150. package/dist/state/cache-v2/update-state-cache.test.d.ts +2 -0
  1151. package/dist/state/cache-v2/update-state-cache.test.d.ts.map +1 -0
  1152. package/dist/state/cache-v2/update-state-cache.test.js +281 -0
  1153. package/dist/state/cache-v2/update-state-cache.test.js.map +1 -0
  1154. package/dist/state/create-checkpoint.d.ts +22 -0
  1155. package/dist/state/create-checkpoint.d.ts.map +1 -0
  1156. package/dist/state/create-checkpoint.js +226 -0
  1157. package/dist/state/create-checkpoint.js.map +1 -0
  1158. package/dist/state/create-checkpoint.test.d.ts.map +1 -0
  1159. package/dist/state/create-checkpoint.test.js +649 -0
  1160. package/dist/state/create-checkpoint.test.js.map +1 -0
  1161. package/dist/state/index.d.ts +7 -0
  1162. package/dist/state/index.d.ts.map +1 -0
  1163. package/dist/state/index.js +5 -0
  1164. package/dist/state/index.js.map +1 -0
  1165. package/dist/state/materialize-state.bench.d.ts +2 -0
  1166. package/dist/state/materialize-state.bench.d.ts.map +1 -0
  1167. package/dist/state/materialize-state.bench.js +196 -0
  1168. package/dist/state/materialize-state.bench.js.map +1 -0
  1169. package/dist/state/materialize-state.d.ts +5 -0
  1170. package/dist/state/materialize-state.d.ts.map +1 -0
  1171. package/dist/state/materialize-state.js +561 -0
  1172. package/dist/state/materialize-state.js.map +1 -0
  1173. package/dist/state/materialize-state.test.d.ts +2 -0
  1174. package/dist/state/materialize-state.test.d.ts.map +1 -0
  1175. package/dist/state/materialize-state.test.js +2314 -0
  1176. package/dist/state/materialize-state.test.js.map +1 -0
  1177. package/dist/state/schema.bench.js +100 -28
  1178. package/dist/state/schema.bench.js.map +1 -1
  1179. package/dist/state/schema.d.ts +4 -55
  1180. package/dist/state/schema.d.ts.map +1 -1
  1181. package/dist/state/schema.js +31 -1048
  1182. package/dist/state/schema.js.map +1 -1
  1183. package/dist/state/transaction/insert-transaction-state.d.ts +65 -0
  1184. package/dist/state/transaction/insert-transaction-state.d.ts.map +1 -0
  1185. package/dist/state/transaction/insert-transaction-state.js +116 -0
  1186. package/dist/state/transaction/insert-transaction-state.js.map +1 -0
  1187. package/dist/state/transaction/insert-transaction-state.test.d.ts +2 -0
  1188. package/dist/state/transaction/insert-transaction-state.test.d.ts.map +1 -0
  1189. package/dist/state/transaction/insert-transaction-state.test.js +946 -0
  1190. package/dist/state/transaction/insert-transaction-state.test.js.map +1 -0
  1191. package/dist/state/transaction/schema.d.ts +22 -0
  1192. package/dist/state/transaction/schema.d.ts.map +1 -0
  1193. package/dist/state/transaction/schema.js +25 -0
  1194. package/dist/state/transaction/schema.js.map +1 -0
  1195. package/dist/state/transition.bench.d.ts +2 -0
  1196. package/dist/state/transition.bench.d.ts.map +1 -0
  1197. package/dist/state/transition.bench.js +215 -0
  1198. package/dist/state/transition.bench.js.map +1 -0
  1199. package/dist/state/transition.d.ts +21 -0
  1200. package/dist/state/transition.d.ts.map +1 -0
  1201. package/dist/state/transition.js +336 -0
  1202. package/dist/state/transition.js.map +1 -0
  1203. package/dist/state/transition.test.d.ts +2 -0
  1204. package/dist/state/transition.test.d.ts.map +1 -0
  1205. package/dist/state/transition.test.js +226 -0
  1206. package/dist/state/transition.test.js.map +1 -0
  1207. package/dist/state/untracked/schema.d.ts +25 -0
  1208. package/dist/state/untracked/schema.d.ts.map +1 -0
  1209. package/dist/state/untracked/schema.js +45 -0
  1210. package/dist/state/untracked/schema.js.map +1 -0
  1211. package/dist/state/untracked/schema.test.d.ts +2 -0
  1212. package/dist/state/untracked/schema.test.d.ts.map +1 -0
  1213. package/dist/state/untracked/schema.test.js +275 -0
  1214. package/dist/state/untracked/schema.test.js.map +1 -0
  1215. package/dist/state/untracked/update-untracked-state.d.ts +36 -0
  1216. package/dist/state/untracked/update-untracked-state.d.ts.map +1 -0
  1217. package/dist/state/untracked/update-untracked-state.js +144 -0
  1218. package/dist/state/untracked/update-untracked-state.js.map +1 -0
  1219. package/dist/state/untracked/update-untracked-state.test.d.ts +2 -0
  1220. package/dist/state/untracked/update-untracked-state.test.d.ts.map +1 -0
  1221. package/dist/state/untracked/update-untracked-state.test.js +435 -0
  1222. package/dist/state/untracked/update-untracked-state.test.js.map +1 -0
  1223. package/dist/state/views/state-by-version.d.ts +30 -0
  1224. package/dist/state/views/state-by-version.d.ts.map +1 -0
  1225. package/dist/state/views/state-by-version.js +94 -0
  1226. package/dist/state/views/state-by-version.js.map +1 -0
  1227. package/dist/state/views/state-with-tombstones.d.ts +34 -0
  1228. package/dist/state/views/state-with-tombstones.d.ts.map +1 -0
  1229. package/dist/state/views/state-with-tombstones.js +37 -0
  1230. package/dist/state/views/state-with-tombstones.js.map +1 -0
  1231. package/dist/state/views/state-with-tombstones.test.d.ts +2 -0
  1232. package/dist/state/views/state-with-tombstones.test.d.ts.map +1 -0
  1233. package/dist/state/views/state-with-tombstones.test.js +148 -0
  1234. package/dist/state/views/state-with-tombstones.test.js.map +1 -0
  1235. package/dist/state/views/state.bench.d.ts +2 -0
  1236. package/dist/state/views/state.bench.d.ts.map +1 -0
  1237. package/dist/state/views/state.bench.js +308 -0
  1238. package/dist/state/views/state.bench.js.map +1 -0
  1239. package/dist/state/views/state.d.ts +15 -0
  1240. package/dist/state/views/state.d.ts.map +1 -0
  1241. package/dist/state/views/state.js +85 -0
  1242. package/dist/state/views/state.js.map +1 -0
  1243. package/dist/state/views/state.test.d.ts +2 -0
  1244. package/dist/state/views/state.test.d.ts.map +1 -0
  1245. package/dist/state/views/state.test.js +340 -0
  1246. package/dist/state/views/state.test.js.map +1 -0
  1247. package/dist/state/vtable/commit.bench.d.ts +2 -0
  1248. package/dist/state/vtable/commit.bench.d.ts.map +1 -0
  1249. package/dist/state/vtable/commit.bench.js +287 -0
  1250. package/dist/state/vtable/commit.bench.js.map +1 -0
  1251. package/dist/state/vtable/commit.d.ts +18 -0
  1252. package/dist/state/vtable/commit.d.ts.map +1 -0
  1253. package/dist/state/vtable/commit.js +426 -0
  1254. package/dist/state/vtable/commit.js.map +1 -0
  1255. package/dist/state/vtable/commit.test.d.ts +2 -0
  1256. package/dist/state/vtable/commit.test.d.ts.map +1 -0
  1257. package/dist/state/vtable/commit.test.js +1644 -0
  1258. package/dist/state/vtable/commit.test.js.map +1 -0
  1259. package/dist/state/vtable/generate-commit.d.ts +33 -0
  1260. package/dist/state/vtable/generate-commit.d.ts.map +1 -0
  1261. package/dist/state/vtable/generate-commit.js +277 -0
  1262. package/dist/state/vtable/generate-commit.js.map +1 -0
  1263. package/dist/state/vtable/generate-commit.test.d.ts +2 -0
  1264. package/dist/state/vtable/generate-commit.test.d.ts.map +1 -0
  1265. package/dist/state/vtable/generate-commit.test.js +377 -0
  1266. package/dist/state/vtable/generate-commit.test.js.map +1 -0
  1267. package/dist/state/vtable/index.d.ts +3 -0
  1268. package/dist/state/vtable/index.d.ts.map +1 -0
  1269. package/dist/state/vtable/index.js +3 -0
  1270. package/dist/state/vtable/index.js.map +1 -0
  1271. package/dist/state/vtable/insert-vtable-log.d.ts +18 -0
  1272. package/dist/state/vtable/insert-vtable-log.d.ts.map +1 -0
  1273. package/dist/state/vtable/insert-vtable-log.js +49 -0
  1274. package/dist/state/vtable/insert-vtable-log.js.map +1 -0
  1275. package/dist/state/vtable/primary-key.d.ts +41 -0
  1276. package/dist/state/vtable/primary-key.d.ts.map +1 -0
  1277. package/dist/state/vtable/primary-key.js +64 -0
  1278. package/dist/state/vtable/primary-key.js.map +1 -0
  1279. package/dist/state/vtable/primary-key.test.d.ts +2 -0
  1280. package/dist/state/vtable/primary-key.test.d.ts.map +1 -0
  1281. package/dist/state/vtable/primary-key.test.js +32 -0
  1282. package/dist/state/vtable/primary-key.test.js.map +1 -0
  1283. package/dist/state/vtable/validate-state-mutation.bench.d.ts +2 -0
  1284. package/dist/state/vtable/validate-state-mutation.bench.d.ts.map +1 -0
  1285. package/dist/state/vtable/validate-state-mutation.bench.js +284 -0
  1286. package/dist/state/vtable/validate-state-mutation.bench.js.map +1 -0
  1287. package/dist/state/vtable/validate-state-mutation.d.ts +21 -0
  1288. package/dist/state/vtable/validate-state-mutation.d.ts.map +1 -0
  1289. package/dist/state/vtable/validate-state-mutation.js +886 -0
  1290. package/dist/state/vtable/validate-state-mutation.js.map +1 -0
  1291. package/dist/state/vtable/validate-state-mutation.playground.test.d.ts +2 -0
  1292. package/dist/state/vtable/validate-state-mutation.playground.test.d.ts.map +1 -0
  1293. package/dist/state/vtable/validate-state-mutation.playground.test.js +389 -0
  1294. package/dist/state/vtable/validate-state-mutation.playground.test.js.map +1 -0
  1295. package/dist/state/vtable/validate-state-mutation.test.d.ts.map +1 -0
  1296. package/dist/state/vtable/validate-state-mutation.test.js +3655 -0
  1297. package/dist/state/vtable/validate-state-mutation.test.js.map +1 -0
  1298. package/dist/state/vtable/vtable.d.ts +26 -0
  1299. package/dist/state/vtable/vtable.d.ts.map +1 -0
  1300. package/dist/state/vtable/vtable.insert.bench.d.ts +2 -0
  1301. package/dist/state/vtable/vtable.insert.bench.d.ts.map +1 -0
  1302. package/dist/state/vtable/vtable.insert.bench.js +100 -0
  1303. package/dist/state/vtable/vtable.insert.bench.js.map +1 -0
  1304. package/dist/state/vtable/vtable.js +951 -0
  1305. package/dist/state/vtable/vtable.js.map +1 -0
  1306. package/dist/state/vtable/vtable.select.bench.d.ts +2 -0
  1307. package/dist/state/vtable/vtable.select.bench.d.ts.map +1 -0
  1308. package/dist/state/vtable/vtable.select.bench.js +334 -0
  1309. package/dist/state/vtable/vtable.select.bench.js.map +1 -0
  1310. package/dist/state/vtable/vtable.test.d.ts +2 -0
  1311. package/dist/state/vtable/vtable.test.d.ts.map +1 -0
  1312. package/dist/state/vtable/vtable.test.js +3516 -0
  1313. package/dist/state/vtable/vtable.test.js.map +1 -0
  1314. package/dist/state/working-change-set/refresh-working-change-set.d.ts +21 -0
  1315. package/dist/state/working-change-set/refresh-working-change-set.d.ts.map +1 -0
  1316. package/dist/state/working-change-set/refresh-working-change-set.js +185 -0
  1317. package/dist/state/working-change-set/refresh-working-change-set.js.map +1 -0
  1318. package/dist/state/working-change-set/refresh-working-change-set.test.d.ts +2 -0
  1319. package/dist/state/working-change-set/refresh-working-change-set.test.d.ts.map +1 -0
  1320. package/dist/state/working-change-set/refresh-working-change-set.test.js +89 -0
  1321. package/dist/state/working-change-set/refresh-working-change-set.test.js.map +1 -0
  1322. package/dist/state/writer.d.ts +42 -0
  1323. package/dist/state/writer.d.ts.map +1 -0
  1324. package/dist/state/writer.js +62 -0
  1325. package/dist/state/writer.js.map +1 -0
  1326. package/dist/state-history/schema.d.ts +33 -19
  1327. package/dist/state-history/schema.d.ts.map +1 -1
  1328. package/dist/state-history/schema.js +129 -53
  1329. package/dist/state-history/schema.js.map +1 -1
  1330. package/dist/state-history/schema.test.js +248 -94
  1331. package/dist/state-history/schema.test.js.map +1 -1
  1332. package/dist/stored-schema/get-stored-schema.d.ts +27 -0
  1333. package/dist/stored-schema/get-stored-schema.d.ts.map +1 -0
  1334. package/dist/stored-schema/get-stored-schema.js +129 -0
  1335. package/dist/stored-schema/get-stored-schema.js.map +1 -0
  1336. package/dist/stored-schema/get-stored-schema.test.d.ts +2 -0
  1337. package/dist/stored-schema/get-stored-schema.test.d.ts.map +1 -0
  1338. package/dist/stored-schema/get-stored-schema.test.js +259 -0
  1339. package/dist/stored-schema/get-stored-schema.test.js.map +1 -0
  1340. package/dist/stored-schema/index.d.ts +1 -1
  1341. package/dist/stored-schema/index.d.ts.map +1 -1
  1342. package/dist/stored-schema/index.js +1 -1
  1343. package/dist/stored-schema/index.js.map +1 -1
  1344. package/dist/stored-schema/schema-definition.d.ts +22 -0
  1345. package/dist/stored-schema/schema-definition.d.ts.map +1 -0
  1346. package/dist/stored-schema/schema-definition.js +20 -0
  1347. package/dist/stored-schema/schema-definition.js.map +1 -0
  1348. package/dist/stored-schema/schema.test.js +34 -91
  1349. package/dist/stored-schema/schema.test.js.map +1 -1
  1350. package/dist/sync/pull-from-server.test.js +6 -6
  1351. package/dist/sync/pull-from-server.test.js.map +1 -1
  1352. package/dist/sync/push-to-server.test.js +4 -4
  1353. package/dist/sync/push-to-server.test.js.map +1 -1
  1354. package/dist/sync/sync-process.d.ts +1 -1
  1355. package/dist/sync/sync-process.d.ts.map +1 -1
  1356. package/dist/sync/sync-process.js +18 -9
  1357. package/dist/sync/sync-process.js.map +1 -1
  1358. package/dist/sync/sync-process.test.js +3 -6
  1359. package/dist/sync/sync-process.test.js.map +1 -1
  1360. package/dist/test-utilities/simulation-test/cache-miss-simulation.d.ts +8 -0
  1361. package/dist/test-utilities/simulation-test/cache-miss-simulation.d.ts.map +1 -0
  1362. package/dist/test-utilities/simulation-test/cache-miss-simulation.js +79 -0
  1363. package/dist/test-utilities/simulation-test/cache-miss-simulation.js.map +1 -0
  1364. package/dist/test-utilities/simulation-test/cache-miss-simulation.test.d.ts +2 -0
  1365. package/dist/test-utilities/simulation-test/cache-miss-simulation.test.d.ts.map +1 -0
  1366. package/dist/test-utilities/simulation-test/cache-miss-simulation.test.js +150 -0
  1367. package/dist/test-utilities/simulation-test/cache-miss-simulation.test.js.map +1 -0
  1368. package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.d.ts +2 -0
  1369. package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.d.ts.map +1 -0
  1370. package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.js +2 -0
  1371. package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.js.map +1 -0
  1372. package/dist/test-utilities/simulation-test/engine-boundary-simulation.d.ts +3 -0
  1373. package/dist/test-utilities/simulation-test/engine-boundary-simulation.d.ts.map +1 -0
  1374. package/dist/test-utilities/simulation-test/engine-boundary-simulation.js +52 -0
  1375. package/dist/test-utilities/simulation-test/engine-boundary-simulation.js.map +1 -0
  1376. package/dist/test-utilities/simulation-test/engine-boundary-simulation.test.d.ts +2 -0
  1377. package/dist/test-utilities/simulation-test/engine-boundary-simulation.test.d.ts.map +1 -0
  1378. package/dist/test-utilities/simulation-test/engine-boundary-simulation.test.js +10 -0
  1379. package/dist/test-utilities/simulation-test/engine-boundary-simulation.test.js.map +1 -0
  1380. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.d.ts +10 -0
  1381. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.d.ts.map +1 -0
  1382. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.js +50 -0
  1383. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.js.map +1 -0
  1384. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.d.ts +2 -0
  1385. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.d.ts.map +1 -0
  1386. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.js +71 -0
  1387. package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.js.map +1 -0
  1388. package/dist/test-utilities/simulation-test/simulation-test.d.ts +87 -0
  1389. package/dist/test-utilities/simulation-test/simulation-test.d.ts.map +1 -0
  1390. package/dist/test-utilities/simulation-test/simulation-test.js +89 -0
  1391. package/dist/test-utilities/simulation-test/simulation-test.js.map +1 -0
  1392. package/dist/test-utilities/simulation-test/simulation-test.test.d.ts +2 -0
  1393. package/dist/test-utilities/simulation-test/simulation-test.test.d.ts.map +1 -0
  1394. package/dist/test-utilities/simulation-test/simulation-test.test.js +308 -0
  1395. package/dist/test-utilities/simulation-test/simulation-test.test.js.map +1 -0
  1396. package/dist/version/create-version-from-commit.d.ts +44 -0
  1397. package/dist/version/create-version-from-commit.d.ts.map +1 -0
  1398. package/dist/version/create-version-from-commit.js +119 -0
  1399. package/dist/version/create-version-from-commit.js.map +1 -0
  1400. package/dist/version/create-version-from-commit.test.d.ts +2 -0
  1401. package/dist/version/create-version-from-commit.test.d.ts.map +1 -0
  1402. package/dist/version/create-version-from-commit.test.js +166 -0
  1403. package/dist/version/create-version-from-commit.test.js.map +1 -0
  1404. package/dist/version/create-version.d.ts +8 -12
  1405. package/dist/version/create-version.d.ts.map +1 -1
  1406. package/dist/version/create-version.js +26 -31
  1407. package/dist/version/create-version.js.map +1 -1
  1408. package/dist/version/create-version.test.js +120 -25
  1409. package/dist/version/create-version.test.js.map +1 -1
  1410. package/dist/version/index.d.ts +4 -1
  1411. package/dist/version/index.d.ts.map +1 -1
  1412. package/dist/version/index.js +4 -1
  1413. package/dist/version/index.js.map +1 -1
  1414. package/dist/version/merge-version.d.ts +3 -3
  1415. package/dist/version/merge-version.d.ts.map +1 -1
  1416. package/dist/version/merge-version.js +472 -54
  1417. package/dist/version/merge-version.js.map +1 -1
  1418. package/dist/version/merge-version.test.js +783 -373
  1419. package/dist/version/merge-version.test.js.map +1 -1
  1420. package/dist/version/schema-definition.d.ts +107 -0
  1421. package/dist/version/schema-definition.d.ts.map +1 -0
  1422. package/dist/version/schema-definition.js +93 -0
  1423. package/dist/version/schema-definition.js.map +1 -0
  1424. package/dist/version/schema.d.ts +5 -72
  1425. package/dist/version/schema.d.ts.map +1 -1
  1426. package/dist/version/schema.js +433 -116
  1427. package/dist/version/schema.js.map +1 -1
  1428. package/dist/version/schema.test.js +561 -151
  1429. package/dist/version/schema.test.js.map +1 -1
  1430. package/dist/version/select-active-version.d.ts +7 -0
  1431. package/dist/version/select-active-version.d.ts.map +1 -0
  1432. package/dist/version/select-active-version.js +7 -0
  1433. package/dist/version/select-active-version.js.map +1 -0
  1434. package/dist/version/select-version-diff.bench.d.ts +2 -0
  1435. package/dist/version/select-version-diff.bench.d.ts.map +1 -0
  1436. package/dist/version/select-version-diff.bench.js +126 -0
  1437. package/dist/version/select-version-diff.bench.js.map +1 -0
  1438. package/dist/version/select-version-diff.d.ts +121 -0
  1439. package/dist/version/select-version-diff.d.ts.map +1 -0
  1440. package/dist/version/select-version-diff.js +179 -0
  1441. package/dist/version/select-version-diff.js.map +1 -0
  1442. package/dist/version/select-version-diff.playground.test.d.ts +2 -0
  1443. package/dist/version/select-version-diff.playground.test.d.ts.map +1 -0
  1444. package/dist/version/select-version-diff.playground.test.js +114 -0
  1445. package/dist/version/select-version-diff.playground.test.js.map +1 -0
  1446. package/dist/version/select-version-diff.test.d.ts +2 -0
  1447. package/dist/version/select-version-diff.test.d.ts.map +1 -0
  1448. package/dist/version/select-version-diff.test.js +689 -0
  1449. package/dist/version/select-version-diff.test.js.map +1 -0
  1450. package/dist/version/switch-version.d.ts +3 -3
  1451. package/dist/version/switch-version.d.ts.map +1 -1
  1452. package/dist/version/switch-version.js +1 -1
  1453. package/dist/version/switch-version.test.js +2 -2
  1454. package/dist/version/switch-version.test.js.map +1 -1
  1455. package/package.json +51 -22
  1456. package/src/account/create-account.test.ts +5 -19
  1457. package/src/account/create-account.ts +14 -17
  1458. package/src/account/index.ts +4 -3
  1459. package/src/account/schema-definition.ts +60 -0
  1460. package/src/account/schema.test.ts +157 -118
  1461. package/src/account/switch-account.test.ts +9 -21
  1462. package/src/account/switch-account.ts +6 -6
  1463. package/src/change/index.ts +4 -1
  1464. package/src/change/schema-definition.ts +84 -0
  1465. package/src/change/schema.bench.ts +411 -0
  1466. package/src/change/schema.test.ts +135 -6
  1467. package/src/change/schema.ts +52 -37
  1468. package/src/change-author/index.ts +4 -1
  1469. package/src/change-author/schema-definition.ts +43 -0
  1470. package/src/change-author/schema.test.ts +246 -36
  1471. package/src/change-proposal/accept-change-proposal.test.ts +64 -0
  1472. package/src/change-proposal/accept-change-proposal.ts +46 -0
  1473. package/src/change-proposal/create-change-proposal.test.ts +64 -89
  1474. package/src/change-proposal/create-change-proposal.ts +33 -58
  1475. package/src/change-proposal/index.ts +7 -2
  1476. package/src/change-proposal/reject-change-proposal.test.ts +34 -0
  1477. package/src/change-proposal/reject-change-proposal.ts +22 -0
  1478. package/src/change-proposal/schema-definition.ts +42 -0
  1479. package/src/change-proposal/schema.test.ts +124 -0
  1480. package/src/change-set/apply-change-set.test.ts +13 -9
  1481. package/src/change-set/apply-change-set.ts +60 -80
  1482. package/src/change-set/create-change-set.test.ts +5 -92
  1483. package/src/change-set/create-change-set.ts +11 -63
  1484. package/src/change-set/index.ts +3 -13
  1485. package/src/change-set/schema-definition.ts +83 -0
  1486. package/src/change-set/schema.test.ts +13 -497
  1487. package/src/commit/index.ts +6 -0
  1488. package/src/commit/schema-definition.ts +103 -0
  1489. package/src/commit/schema.test.ts +353 -0
  1490. package/src/conversation/create-conversation-message.test.ts +118 -0
  1491. package/src/conversation/create-conversation-message.ts +82 -0
  1492. package/src/conversation/create-conversation.test.ts +194 -0
  1493. package/src/conversation/create-conversation.ts +110 -0
  1494. package/src/conversation/index.ts +8 -0
  1495. package/src/conversation/schema-definition.ts +74 -0
  1496. package/src/database/index.ts +0 -3
  1497. package/src/database/init-db.ts +120 -89
  1498. package/src/database/kysely/index.ts +1 -0
  1499. package/src/database/kysely/json-column-config.ts +63 -0
  1500. package/src/database/kysely/plugins/json-column-plugin.test.ts +533 -0
  1501. package/src/database/kysely/plugins/json-column-plugin.ts +286 -0
  1502. package/src/database/kysely/plugins/view-insert-returning-error-plugin.test.ts +62 -0
  1503. package/src/database/kysely/plugins.ts +16 -0
  1504. package/src/database/nano-id.test.ts +4 -4
  1505. package/src/database/nano-id.ts +4 -1
  1506. package/src/database/schema-view-map.ts +48 -0
  1507. package/src/database/schema.ts +125 -66
  1508. package/src/database/sqlite/content-from-database.ts +12 -0
  1509. package/src/database/sqlite/create-in-memory-database.ts +61 -0
  1510. package/src/database/sqlite/environment-dialect.test.ts +84 -0
  1511. package/src/database/sqlite/environment-dialect.ts +227 -0
  1512. package/src/database/sqlite/import-database.ts +43 -0
  1513. package/src/database/sqlite/index.ts +7 -0
  1514. package/src/database/sqlite/kysely-driver/connection-mutex.ts +23 -0
  1515. package/src/database/sqlite/kysely-driver/index.ts +4 -0
  1516. package/src/database/sqlite/kysely-driver/sqlite-wasm-connection.ts +58 -0
  1517. package/src/database/sqlite/kysely-driver/sqlite-wasm-dialect-config.ts +19 -0
  1518. package/src/database/sqlite/kysely-driver/sqlite-wasm-driver.ts +59 -0
  1519. package/src/database/sqlite/lix-dialect.ts +27 -0
  1520. package/src/database/sqlite/load-database-in-memory.ts +28 -0
  1521. package/src/database/sqlite/sqlite-wasm-binary.d.ts +2 -0
  1522. package/src/database/sqlite/sqlite-wasm-binary.js +42835 -0
  1523. package/src/dependency/kysely/helpers/sqlite.ts +4 -0
  1524. package/src/dependency/kysely/index.ts +8 -0
  1525. package/src/diff/index.ts +2 -0
  1526. package/src/diff/select-commit-diff.bench.ts +156 -0
  1527. package/src/diff/select-commit-diff.test.ts +65 -0
  1528. package/src/diff/select-commit-diff.ts +234 -0
  1529. package/src/diff/select-working-diff.bench.ts +99 -0
  1530. package/src/diff/select-working-diff.test.ts +275 -0
  1531. package/src/diff/select-working-diff.ts +233 -0
  1532. package/src/engine/boot.test.ts +88 -0
  1533. package/src/engine/boot.ts +280 -0
  1534. package/src/engine/cel-environment/cel-environment.test.ts +20 -0
  1535. package/src/engine/cel-environment/cel-environment.ts +85 -0
  1536. package/src/engine/deterministic-mode/is-deterministic-mode.test.ts +121 -0
  1537. package/src/engine/deterministic-mode/is-deterministic-mode.ts +105 -0
  1538. package/src/engine/deterministic-mode/options.test.ts +159 -0
  1539. package/src/engine/deterministic-mode/options.ts +57 -0
  1540. package/src/engine/entity-views/README.md +214 -0
  1541. package/src/engine/entity-views/build-json-object-entries.test.ts +42 -0
  1542. package/src/engine/entity-views/build-json-object-entries.ts +43 -0
  1543. package/src/engine/entity-views/entity-state-by-version.ts +263 -0
  1544. package/src/engine/entity-views/entity-state-history.ts +208 -0
  1545. package/src/engine/entity-views/entity-state.ts +239 -0
  1546. package/src/engine/entity-views/entity-view-builder.ts +58 -0
  1547. package/src/engine/entity-views/types.test.ts +99 -0
  1548. package/src/engine/entity-views/types.ts +330 -0
  1549. package/src/engine/execute-sync.test.ts +90 -0
  1550. package/src/engine/execute-sync.ts +47 -0
  1551. package/src/engine/explain-query.test.ts +21 -0
  1552. package/src/engine/explain-query.ts +89 -0
  1553. package/src/engine/functions/function-registry.ts +69 -0
  1554. package/src/engine/functions/generate-human-id.test.ts +199 -0
  1555. package/src/engine/functions/generate-human-id.ts +383 -0
  1556. package/src/engine/functions/index.ts +6 -0
  1557. package/src/engine/functions/nano-id.bench.ts +57 -0
  1558. package/src/engine/functions/nano-id.test.ts +200 -0
  1559. package/src/engine/functions/nano-id.ts +205 -0
  1560. package/src/engine/functions/random.test.ts +293 -0
  1561. package/src/engine/functions/random.ts +267 -0
  1562. package/src/engine/functions/register-builtins.ts +154 -0
  1563. package/src/engine/functions/sequence.test.ts +99 -0
  1564. package/src/engine/functions/sequence.ts +165 -0
  1565. package/src/engine/functions/timestamp.test.ts +172 -0
  1566. package/src/engine/functions/timestamp.ts +86 -0
  1567. package/src/engine/functions/uuid-v7.test.ts +144 -0
  1568. package/src/engine/functions/uuid-v7.ts +88 -0
  1569. package/src/engine/index.ts +1 -0
  1570. package/src/engine/internal-query-builder.ts +42 -0
  1571. package/src/engine/preprocessor/create-preprocessor.test.ts +275 -0
  1572. package/src/engine/preprocessor/create-preprocessor.ts +267 -0
  1573. package/src/engine/preprocessor/entity-views/__bench__/entity-view-select-all-rows.explain.txt +287 -0
  1574. package/src/engine/preprocessor/entity-views/__bench__/entity-view-select-id-filter.explain.txt +290 -0
  1575. package/src/engine/preprocessor/entity-views/delete.test.ts +994 -0
  1576. package/src/engine/preprocessor/entity-views/delete.ts +359 -0
  1577. package/src/engine/preprocessor/entity-views/insert.test.ts +1175 -0
  1578. package/src/engine/preprocessor/entity-views/insert.ts +903 -0
  1579. package/src/engine/preprocessor/entity-views/select.bench.ts +168 -0
  1580. package/src/engine/preprocessor/entity-views/select.test.ts +385 -0
  1581. package/src/engine/preprocessor/entity-views/select.ts +2079 -0
  1582. package/src/engine/preprocessor/entity-views/shared.ts +1560 -0
  1583. package/src/engine/preprocessor/entity-views/update.test.ts +424 -0
  1584. package/src/engine/preprocessor/entity-views/update.ts +753 -0
  1585. package/src/engine/preprocessor/inheritance/version-inheritance-cache.test.ts +128 -0
  1586. package/src/engine/preprocessor/inheritance/version-inheritance-cache.ts +385 -0
  1587. package/src/engine/preprocessor/sql-parser/ast-helpers.ts +235 -0
  1588. package/src/engine/preprocessor/sql-parser/column-usage.ts +504 -0
  1589. package/src/engine/preprocessor/sql-parser/compile.test.ts +147 -0
  1590. package/src/engine/preprocessor/sql-parser/compile.ts +898 -0
  1591. package/src/engine/preprocessor/sql-parser/cst.ts +1012 -0
  1592. package/src/engine/preprocessor/sql-parser/lexer.ts +608 -0
  1593. package/src/engine/preprocessor/sql-parser/nodes.ts +395 -0
  1594. package/src/engine/preprocessor/sql-parser/parse.test.ts +1646 -0
  1595. package/src/engine/preprocessor/sql-parser/parse.ts +1984 -0
  1596. package/src/engine/preprocessor/sql-parser/visitor.test.ts +173 -0
  1597. package/src/engine/preprocessor/sql-parser/visitor.ts +1403 -0
  1598. package/src/engine/preprocessor/steps/cache-populator.test.ts +128 -0
  1599. package/src/engine/preprocessor/steps/cache-populator.ts +797 -0
  1600. package/src/engine/preprocessor/steps/expand-sql-views.test.ts +1353 -0
  1601. package/src/engine/preprocessor/steps/expand-sql-views.ts +1167 -0
  1602. package/src/engine/preprocessor/steps/rewrite-active-version-subquery.test.ts +83 -0
  1603. package/src/engine/preprocessor/steps/rewrite-active-version-subquery.ts +251 -0
  1604. package/src/engine/preprocessor/steps/rewrite-vtable-selects.bench.ts +68 -0
  1605. package/src/engine/preprocessor/steps/rewrite-vtable-selects.test.ts +1326 -0
  1606. package/src/engine/preprocessor/steps/rewrite-vtable-selects.ts +3751 -0
  1607. package/src/engine/preprocessor/types.ts +103 -0
  1608. package/src/engine/sql-parser/tokenizer.test.ts +408 -0
  1609. package/src/engine/sql-parser/tokenizer.ts +205 -0
  1610. package/src/engine/with-runtime-cache.test.ts +173 -0
  1611. package/src/engine/with-runtime-cache.ts +206 -0
  1612. package/src/entity/conversation/attach-conversation.test.ts +251 -0
  1613. package/src/entity/conversation/attach-conversation.ts +98 -0
  1614. package/src/entity/conversation/schema-definition.ts +52 -0
  1615. package/src/entity/conversation/schema.test.ts +105 -0
  1616. package/src/entity/eb-entity.test.ts +769 -0
  1617. package/src/entity/eb-entity.ts +203 -0
  1618. package/src/entity/index.ts +9 -0
  1619. package/src/entity/label/attach-label.test.ts +356 -0
  1620. package/src/entity/label/attach-label.ts +165 -0
  1621. package/src/entity/label/schema-definition.ts +47 -0
  1622. package/src/entity/label/schema.test.ts +945 -0
  1623. package/src/entity/types.ts +13 -0
  1624. package/src/environment/api.test.ts +102 -0
  1625. package/src/environment/api.ts +39 -0
  1626. package/src/environment/in-memory.test.ts +100 -0
  1627. package/src/environment/in-memory.ts +68 -0
  1628. package/src/environment/index.ts +7 -0
  1629. package/src/environment/kysely/kysely-driver.test.ts +29 -0
  1630. package/src/environment/load-from-string.test.ts +17 -0
  1631. package/src/environment/load-from-string.ts +77 -0
  1632. package/src/environment/opfs-sah.browser.test.ts +352 -0
  1633. package/src/environment/opfs-sah.ts +279 -0
  1634. package/src/environment/opfs-sah.worker.ts +271 -0
  1635. package/src/environment/test-actors/echo.actor.ts +6 -0
  1636. package/src/filesystem/__bench__/batch-file-reads-select-multiple-files.explain.txt +523 -0
  1637. package/src/filesystem/__bench__/file-delete-operations-delete.explain.txt +90 -0
  1638. package/src/filesystem/__bench__/file-delete-operations-insert.explain.txt +11 -0
  1639. package/src/filesystem/__bench__/file-insert-operations.explain.txt +11 -0
  1640. package/src/filesystem/__bench__/file-read-by-exact-path.explain.txt +523 -0
  1641. package/src/filesystem/__bench__/file-read-excluding-file-path-via-not-like.explain.txt +458 -0
  1642. package/src/filesystem/__bench__/file-read-with-path-based-like.explain.txt +523 -0
  1643. package/src/filesystem/__bench__/file-reads-with-varying-sizes.explain.txt +523 -0
  1644. package/src/filesystem/__bench__/file-table-full-scan.explain.txt +522 -0
  1645. package/src/filesystem/__bench__/file-update-by-path.explain.txt +90 -0
  1646. package/src/filesystem/__bench__/mixed-file-read-pattern-80-20-distribution.explain.txt +523 -0
  1647. package/src/filesystem/__bench__/repeated-file-reads-same-file-cache-hit-scenario.explain.txt +523 -0
  1648. package/src/filesystem/__bench__/sequential-file-reads-unique-files.explain.txt +523 -0
  1649. package/src/filesystem/directory/ensure-directories.ts +311 -0
  1650. package/src/filesystem/directory/schema-definition.ts +44 -0
  1651. package/src/filesystem/directory/schema.test.ts +119 -0
  1652. package/src/filesystem/directory/schema.ts +577 -0
  1653. package/src/filesystem/file/cache/clear-file-data-cache.ts +56 -0
  1654. package/src/filesystem/file/cache/lixcol-schema.ts +48 -0
  1655. package/src/filesystem/file/cache/path-cache-schema.ts +45 -0
  1656. package/src/filesystem/file/cache/schema.test.ts +326 -0
  1657. package/src/filesystem/file/cache/schema.ts +36 -0
  1658. package/src/filesystem/file/cache/update-file-data-cache.ts +31 -0
  1659. package/src/filesystem/file/cache/update-file-lixcol-cache.ts +88 -0
  1660. package/src/filesystem/file/cache/update-file-path-cache.ts +47 -0
  1661. package/src/filesystem/file/descriptor-utils.ts +356 -0
  1662. package/src/filesystem/file/file-handlers.test.ts +390 -0
  1663. package/src/filesystem/file/file-handlers.ts +670 -0
  1664. package/src/filesystem/file/materialize-file-data-at-commit.ts +203 -0
  1665. package/src/filesystem/file/materialize-file-data.test.ts +123 -0
  1666. package/src/filesystem/file/materialize-file-data.ts +140 -0
  1667. package/src/filesystem/file/schema-definition.ts +49 -0
  1668. package/src/filesystem/file/schema.test.ts +2452 -0
  1669. package/src/filesystem/file/schema.ts +671 -0
  1670. package/src/filesystem/file/select-file-data.ts +59 -0
  1671. package/src/filesystem/file/select-file-lixcol.ts +144 -0
  1672. package/src/filesystem/file/store-detected-change-schema.test.ts +285 -0
  1673. package/src/filesystem/file/store-detected-change-schema.ts +62 -0
  1674. package/src/filesystem/file/unknown-file-fallback-plugin.test.ts +383 -0
  1675. package/src/filesystem/file/unknown-file-fallback-plugin.ts +96 -0
  1676. package/src/filesystem/fs.bench.ts +661 -0
  1677. package/src/filesystem/index.ts +15 -0
  1678. package/src/filesystem/path.test.ts +130 -0
  1679. package/src/filesystem/path.ts +127 -0
  1680. package/src/filesystem/schema.test.ts +656 -0
  1681. package/src/filesystem/schema.ts +14 -0
  1682. package/src/filesystem/util/glob.ts +31 -0
  1683. package/src/hooks/create-hooks.test.ts +135 -20
  1684. package/src/hooks/create-hooks.ts +94 -40
  1685. package/src/index.ts +11 -4
  1686. package/src/key-value/index.ts +1 -1
  1687. package/src/key-value/schema-definition.ts +78 -0
  1688. package/src/key-value/schema.test.ts +240 -14
  1689. package/src/label/create-label.test.ts +2 -2
  1690. package/src/label/create-label.ts +13 -9
  1691. package/src/label/index.ts +1 -1
  1692. package/src/label/schema-definition.ts +27 -0
  1693. package/src/lix/index.ts +0 -3
  1694. package/src/lix/new-lix.test.ts +287 -20
  1695. package/src/lix/new-lix.ts +484 -113
  1696. package/src/lix/open-lix.bench.ts +23 -0
  1697. package/src/lix/open-lix.test.ts +391 -8
  1698. package/src/lix/open-lix.ts +181 -121
  1699. package/src/log/create-lix-own-log.test.ts +51 -23
  1700. package/src/log/create-lix-own-log.ts +54 -66
  1701. package/src/log/create-log.ts +27 -16
  1702. package/src/log/index.ts +1 -1
  1703. package/src/log/schema-definition.ts +45 -0
  1704. package/src/log/schema.test.ts +57 -18
  1705. package/src/observe/create-observe.test.ts +890 -60
  1706. package/src/observe/create-observe.ts +223 -68
  1707. package/src/observe/determine-schema-keys.test.ts +430 -0
  1708. package/src/observe/determine-schema-keys.ts +424 -0
  1709. package/src/plugin/index.ts +2 -1
  1710. package/src/plugin/lix-plugin.test-d.ts +1 -0
  1711. package/src/plugin/lix-plugin.test.ts +57 -0
  1712. package/src/plugin/lix-plugin.ts +48 -9
  1713. package/src/plugin/mock-json-plugin.test.ts +15 -4
  1714. package/src/plugin/mock-json-plugin.ts +1 -0
  1715. package/src/plugin/query-sync.test.ts +132 -0
  1716. package/src/plugin/query-sync.ts +170 -0
  1717. package/src/query-filter/commit-is-ancestor-of.test.ts +234 -0
  1718. package/src/query-filter/commit-is-ancestor-of.ts +77 -0
  1719. package/src/query-filter/commit-is-descendant-of.test.ts +249 -0
  1720. package/src/query-filter/commit-is-descendant-of.ts +70 -0
  1721. package/src/query-filter/index.ts +2 -7
  1722. package/src/schema-definition/definition.test-d.ts +98 -13
  1723. package/src/schema-definition/definition.test.ts +424 -124
  1724. package/src/schema-definition/definition.ts +241 -49
  1725. package/src/schema-definition/index.ts +1 -1
  1726. package/src/schema-definition/json-pointer.test.ts +101 -0
  1727. package/src/schema-definition/json-pointer.ts +168 -0
  1728. package/src/schema-definition/validate-lix-schema.test.ts +113 -5
  1729. package/src/schema-definition/validate-lix-schema.ts +81 -13
  1730. package/src/server-protocol-handler/environment/create-in-memory-environment.test.ts +2 -2
  1731. package/src/server-protocol-handler/environment/create-in-memory-environment.ts +1 -1
  1732. package/src/server-protocol-handler/routes/get-v1.ts +4 -2
  1733. package/src/server-protocol-handler/routes/pull-v1.test.ts +1 -1
  1734. package/src/server-protocol-handler/routes/pull-v1.ts +1 -1
  1735. package/src/server-protocol-handler/routes/push-v1.test.ts +3 -3
  1736. package/src/server-protocol-handler/routes/push-v1.ts +1 -1
  1737. package/src/services/env-variables/index.d.ts +1 -1
  1738. package/src/services/telemetry/capture.test.ts +4 -4
  1739. package/src/snapshot/schema.test.ts +125 -12
  1740. package/src/snapshot/schema.ts +17 -5
  1741. package/src/state/README.md +95 -0
  1742. package/src/state/cache/builtin-schemas.ts +25 -0
  1743. package/src/state/cache/clear-state-cache.test.ts +44 -0
  1744. package/src/state/cache/clear-state-cache.ts +52 -0
  1745. package/src/state/cache/create-schema-cache-table.test.ts +67 -0
  1746. package/src/state/cache/create-schema-cache-table.ts +164 -0
  1747. package/src/state/cache/is-stale-state-cache.test.ts +39 -0
  1748. package/src/state/cache/is-stale-state-cache.ts +86 -0
  1749. package/src/state/cache/mark-state-cache-as-stale.ts +66 -0
  1750. package/src/state/cache/populate-state-cache.test.ts +605 -0
  1751. package/src/state/cache/populate-state-cache.ts +227 -0
  1752. package/src/state/cache/schema-indexes.test.ts +144 -0
  1753. package/src/state/cache/schema-indexes.ts +191 -0
  1754. package/src/state/cache/schema-resolver.ts +59 -0
  1755. package/src/state/cache/schema.bench.ts +361 -0
  1756. package/src/state/cache/schema.test.ts +143 -0
  1757. package/src/state/cache/schema.ts +72 -0
  1758. package/src/state/cache/select-from-state-cache.test.ts +72 -0
  1759. package/src/state/cache/select-from-state-cache.ts +71 -0
  1760. package/src/state/cache/update-state-cache.bench.ts +158 -0
  1761. package/src/state/cache/update-state-cache.test.ts +1110 -0
  1762. package/src/state/cache/update-state-cache.ts +458 -0
  1763. package/src/state/cache-v2/cache-columns.ts +20 -0
  1764. package/src/state/cache-v2/clear-state-cache.test.ts +101 -0
  1765. package/src/state/cache-v2/clear-state-cache.ts +51 -0
  1766. package/src/state/cache-v2/create-schema-cache-table.test.ts +96 -0
  1767. package/src/state/cache-v2/create-schema-cache-table.ts +205 -0
  1768. package/src/state/cache-v2/is-stale-state-cache.test.ts +39 -0
  1769. package/src/state/cache-v2/is-stale-state-cache.ts +86 -0
  1770. package/src/state/cache-v2/mark-state-cache-as-stale.ts +78 -0
  1771. package/src/state/cache-v2/populate-state-cache.test.ts +124 -0
  1772. package/src/state/cache-v2/populate-state-cache.ts +178 -0
  1773. package/src/state/cache-v2/schema-metadata.ts +46 -0
  1774. package/src/state/cache-v2/schema.bench.ts +238 -0
  1775. package/src/state/cache-v2/schema.test.ts +330 -0
  1776. package/src/state/cache-v2/schema.ts +114 -0
  1777. package/src/state/cache-v2/select-from-state-cache.test.ts +109 -0
  1778. package/src/state/cache-v2/select-from-state-cache.ts +201 -0
  1779. package/src/state/cache-v2/sqlite-type-mapper.test.ts +56 -0
  1780. package/src/state/cache-v2/sqlite-type-mapper.ts +64 -0
  1781. package/src/state/cache-v2/update-state-cache.bench.ts +198 -0
  1782. package/src/state/cache-v2/update-state-cache.test.ts +344 -0
  1783. package/src/state/cache-v2/update-state-cache.ts +607 -0
  1784. package/src/state/create-checkpoint.test.ts +848 -0
  1785. package/src/state/create-checkpoint.ts +278 -0
  1786. package/src/state/index.ts +24 -0
  1787. package/src/state/materialize-state.bench.ts +231 -0
  1788. package/src/state/materialize-state.test.ts +2837 -0
  1789. package/src/state/materialize-state.ts +569 -0
  1790. package/src/state/schema.bench.ts +128 -39
  1791. package/src/state/schema.ts +40 -1284
  1792. package/src/state/transaction/insert-transaction-state.test.ts +1119 -0
  1793. package/src/state/transaction/insert-transaction-state.ts +149 -0
  1794. package/src/state/transaction/schema.ts +49 -0
  1795. package/src/state/transition.bench.ts +271 -0
  1796. package/src/state/transition.test.ts +295 -0
  1797. package/src/state/transition.ts +413 -0
  1798. package/src/state/untracked/schema.test.ts +301 -0
  1799. package/src/state/untracked/schema.ts +62 -0
  1800. package/src/state/untracked/update-untracked-state.test.ts +484 -0
  1801. package/src/state/untracked/update-untracked-state.ts +181 -0
  1802. package/src/state/views/__bench__/state-delete-tracked-row.explain.txt +79 -0
  1803. package/src/state/views/__bench__/state-insert-tracked-row.explain.txt +20 -0
  1804. package/src/state/views/__bench__/state-insert-untracked-row.explain.txt +20 -0
  1805. package/src/state/views/__bench__/state-select-recent-file-scan.explain.txt +1133 -0
  1806. package/src/state/views/__bench__/state-select-tracked-entity.explain.txt +296 -0
  1807. package/src/state/views/__bench__/state-select-untracked-filter.explain.txt +301 -0
  1808. package/src/state/views/__bench__/state-update-tracked-row.explain.txt +80 -0
  1809. package/src/state/views/state-by-version.ts +121 -0
  1810. package/src/state/views/state-with-tombstones.test.ts +166 -0
  1811. package/src/state/views/state-with-tombstones.ts +61 -0
  1812. package/src/state/views/state.bench.1_base.json +189 -0
  1813. package/src/state/views/state.bench.2_dml.json +189 -0
  1814. package/src/state/views/state.bench.ts +382 -0
  1815. package/src/state/views/state.test.ts +417 -0
  1816. package/src/state/views/state.ts +97 -0
  1817. package/src/state/vtable/__bench__/cache-entity-version-file-plugin.explain.txt +237 -0
  1818. package/src/state/vtable/__bench__/cache-entity-version-file.explain.txt +236 -0
  1819. package/src/state/vtable/__bench__/cache-entity-version.explain.txt +235 -0
  1820. package/src/state/vtable/__bench__/inherited-cache-entity-version-file-plugin.explain.txt +363 -0
  1821. package/src/state/vtable/__bench__/inherited-cache-entity-version-file.explain.txt +362 -0
  1822. package/src/state/vtable/__bench__/inherited-cache-entity-version.explain.txt +367 -0
  1823. package/src/state/vtable/__bench__/inherited-untracked-entity-version-file-plugin.explain.txt +363 -0
  1824. package/src/state/vtable/__bench__/inherited-untracked-entity-version-file.explain.txt +362 -0
  1825. package/src/state/vtable/__bench__/inherited-untracked-entity-version.explain.txt +367 -0
  1826. package/src/state/vtable/__bench__/transaction-entity-version-file-plugin.explain.txt +237 -0
  1827. package/src/state/vtable/__bench__/transaction-entity-version-file.explain.txt +236 -0
  1828. package/src/state/vtable/__bench__/transaction-entity-version.explain.txt +235 -0
  1829. package/src/state/vtable/__bench__/untracked-entity-version-file-plugin.explain.txt +237 -0
  1830. package/src/state/vtable/__bench__/untracked-entity-version-file.explain.txt +236 -0
  1831. package/src/state/vtable/__bench__/untracked-entity-version.explain.txt +235 -0
  1832. package/src/state/vtable/__playground__/validate-state-mutation.foreign-key.explain.txt +173 -0
  1833. package/src/state/vtable/__playground__/validate-state-mutation.primary-key.explain.txt +173 -0
  1834. package/src/state/vtable/__playground__/validate-state-mutation.unique-nested.explain.txt +173 -0
  1835. package/src/state/vtable/commit.bench.ts +339 -0
  1836. package/src/state/vtable/commit.test.ts +1924 -0
  1837. package/src/state/vtable/commit.ts +508 -0
  1838. package/src/state/vtable/generate-commit.test.ts +417 -0
  1839. package/src/state/vtable/generate-commit.ts +346 -0
  1840. package/src/state/vtable/index.ts +5 -0
  1841. package/src/state/vtable/insert-vtable-log.ts +64 -0
  1842. package/src/state/vtable/primary-key.test.ts +44 -0
  1843. package/src/state/vtable/primary-key.ts +82 -0
  1844. package/src/state/vtable/validate-state-mutation.bench.ts +326 -0
  1845. package/src/state/vtable/validate-state-mutation.playground.test.ts +456 -0
  1846. package/src/state/vtable/validate-state-mutation.test.ts +4265 -0
  1847. package/src/state/vtable/validate-state-mutation.ts +1236 -0
  1848. package/src/state/vtable/vtable.insert.bench.ts +127 -0
  1849. package/src/state/vtable/vtable.select.bench.ts +439 -0
  1850. package/src/state/vtable/vtable.test.ts +4211 -0
  1851. package/src/state/vtable/vtable.ts +1223 -0
  1852. package/src/state/working-change-set/refresh-working-change-set.test.ts +116 -0
  1853. package/src/state/working-change-set/refresh-working-change-set.ts +290 -0
  1854. package/src/state/writer.ts +71 -0
  1855. package/src/state-history/schema.test.ts +273 -98
  1856. package/src/state-history/schema.ts +162 -72
  1857. package/src/stored-schema/get-stored-schema.test.ts +352 -0
  1858. package/src/stored-schema/get-stored-schema.ts +163 -0
  1859. package/src/stored-schema/index.ts +4 -1
  1860. package/src/stored-schema/schema-definition.ts +30 -0
  1861. package/src/stored-schema/schema.test.ts +74 -116
  1862. package/src/sync/pull-from-server.test.ts +6 -6
  1863. package/src/sync/pull-from-server.ts +1 -1
  1864. package/src/sync/push-to-server.test.ts +10 -10
  1865. package/src/sync/push-to-server.ts +1 -1
  1866. package/src/sync/sync-process.test.ts +3 -6
  1867. package/src/sync/sync-process.ts +24 -11
  1868. package/src/test-utilities/simulation-test/cache-miss-simulation.test.ts +198 -0
  1869. package/src/test-utilities/simulation-test/cache-miss-simulation.ts +96 -0
  1870. package/src/test-utilities/simulation-test/chaotic-timestamp-simulation.ts +0 -0
  1871. package/src/test-utilities/simulation-test/engine-boundary-simulation.test.ts +14 -0
  1872. package/src/test-utilities/simulation-test/engine-boundary-simulation.ts +65 -0
  1873. package/src/test-utilities/simulation-test/out-of-order-sequence-simulation.test.ts +88 -0
  1874. package/src/test-utilities/simulation-test/out-of-order-sequence-simulation.ts +61 -0
  1875. package/src/test-utilities/simulation-test/simulation-test.test.ts +404 -0
  1876. package/src/test-utilities/simulation-test/simulation-test.ts +194 -0
  1877. package/src/types/fs.d.ts +11 -0
  1878. package/src/version/create-version-from-commit.test.ts +211 -0
  1879. package/src/version/create-version-from-commit.ts +141 -0
  1880. package/src/version/create-version.test.ts +139 -26
  1881. package/src/version/create-version.ts +32 -43
  1882. package/src/version/index.ts +12 -4
  1883. package/src/version/merge-version.test.ts +1051 -0
  1884. package/src/version/merge-version.ts +583 -0
  1885. package/src/version/schema-definition.ts +111 -0
  1886. package/src/version/schema.test.ts +624 -162
  1887. package/src/version/schema.ts +456 -130
  1888. package/src/version/select-active-version.ts +18 -0
  1889. package/src/version/select-version-diff.bench.ts +145 -0
  1890. package/src/version/select-version-diff.playground-plan.txt +3837 -0
  1891. package/src/version/select-version-diff.playground.test.ts +129 -0
  1892. package/src/version/select-version-diff.test.ts +805 -0
  1893. package/src/version/select-version-diff.ts +201 -0
  1894. package/src/version/switch-version.test.ts +2 -2
  1895. package/src/version/switch-version.ts +3 -3
  1896. package/dist/account/database-schema.d.ts +0 -18
  1897. package/dist/account/database-schema.d.ts.map +0 -1
  1898. package/dist/account/database-schema.js +0 -32
  1899. package/dist/account/database-schema.js.map +0 -1
  1900. package/dist/account/database-schema.test.d.ts +0 -2
  1901. package/dist/account/database-schema.test.d.ts.map +0 -1
  1902. package/dist/account/database-schema.test.js +0 -135
  1903. package/dist/account/database-schema.test.js.map +0 -1
  1904. package/dist/account/schema.d.ts +0 -28
  1905. package/dist/account/schema.d.ts.map +0 -1
  1906. package/dist/account/schema.js +0 -55
  1907. package/dist/account/schema.js.map +0 -1
  1908. package/dist/change/apply-changes.d.ts +0 -25
  1909. package/dist/change/apply-changes.d.ts.map +0 -1
  1910. package/dist/change/apply-changes.js +0 -98
  1911. package/dist/change/apply-changes.js.map +0 -1
  1912. package/dist/change/apply-changes.test.d.ts +0 -2
  1913. package/dist/change/apply-changes.test.d.ts.map +0 -1
  1914. package/dist/change/apply-changes.test.js +0 -222
  1915. package/dist/change/apply-changes.test.js.map +0 -1
  1916. package/dist/change/create-change.d.ts +0 -16
  1917. package/dist/change/create-change.d.ts.map +0 -1
  1918. package/dist/change/create-change.js +0 -43
  1919. package/dist/change/create-change.js.map +0 -1
  1920. package/dist/change/create-change.test.d.ts +0 -2
  1921. package/dist/change/create-change.test.d.ts.map +0 -1
  1922. package/dist/change/create-change.test.js +0 -188
  1923. package/dist/change/create-change.test.js.map +0 -1
  1924. package/dist/change/mock-change.d.ts +0 -10
  1925. package/dist/change/mock-change.d.ts.map +0 -1
  1926. package/dist/change/mock-change.js +0 -21
  1927. package/dist/change/mock-change.js.map +0 -1
  1928. package/dist/change-author/schema.d.ts +0 -31
  1929. package/dist/change-author/schema.d.ts.map +0 -1
  1930. package/dist/change-author/schema.js +0 -35
  1931. package/dist/change-author/schema.js.map +0 -1
  1932. package/dist/change-proposal/database-schema.d.ts +0 -13
  1933. package/dist/change-proposal/database-schema.d.ts.map +0 -1
  1934. package/dist/change-proposal/database-schema.js +0 -17
  1935. package/dist/change-proposal/database-schema.js.map +0 -1
  1936. package/dist/change-proposal/database-schema.test.d.ts +0 -2
  1937. package/dist/change-proposal/database-schema.test.d.ts.map +0 -1
  1938. package/dist/change-proposal/database-schema.test.js +0 -159
  1939. package/dist/change-proposal/database-schema.test.js.map +0 -1
  1940. package/dist/change-schema/index.d.ts +0 -2
  1941. package/dist/change-schema/index.d.ts.map +0 -1
  1942. package/dist/change-schema/index.js +0 -2
  1943. package/dist/change-schema/index.js.map +0 -1
  1944. package/dist/change-schema/types.d.ts +0 -40
  1945. package/dist/change-schema/types.d.ts.map +0 -1
  1946. package/dist/change-schema/types.js.map +0 -1
  1947. package/dist/change-schema/types.test-d.d.ts +0 -2
  1948. package/dist/change-schema/types.test-d.d.ts.map +0 -1
  1949. package/dist/change-schema/types.test-d.js +0 -34
  1950. package/dist/change-schema/types.test-d.js.map +0 -1
  1951. package/dist/change-set/change-set-element-in-symmetric-difference.d.ts +0 -19
  1952. package/dist/change-set/change-set-element-in-symmetric-difference.d.ts.map +0 -1
  1953. package/dist/change-set/change-set-element-in-symmetric-difference.js +0 -36
  1954. package/dist/change-set/change-set-element-in-symmetric-difference.js.map +0 -1
  1955. package/dist/change-set/change-set-element-in-symmetric-difference.test.d.ts +0 -2
  1956. package/dist/change-set/change-set-element-in-symmetric-difference.test.d.ts.map +0 -1
  1957. package/dist/change-set/change-set-element-in-symmetric-difference.test.js +0 -106
  1958. package/dist/change-set/change-set-element-in-symmetric-difference.test.js.map +0 -1
  1959. package/dist/change-set/create-checkpoint.d.ts +0 -19
  1960. package/dist/change-set/create-checkpoint.d.ts.map +0 -1
  1961. package/dist/change-set/create-checkpoint.js +0 -86
  1962. package/dist/change-set/create-checkpoint.js.map +0 -1
  1963. package/dist/change-set/create-checkpoint.test.d.ts.map +0 -1
  1964. package/dist/change-set/create-checkpoint.test.js +0 -294
  1965. package/dist/change-set/create-checkpoint.test.js.map +0 -1
  1966. package/dist/change-set/create-merge-change-set.d.ts +0 -23
  1967. package/dist/change-set/create-merge-change-set.d.ts.map +0 -1
  1968. package/dist/change-set/create-merge-change-set.js +0 -68
  1969. package/dist/change-set/create-merge-change-set.js.map +0 -1
  1970. package/dist/change-set/create-merge-change-set.test.d.ts +0 -2
  1971. package/dist/change-set/create-merge-change-set.test.d.ts.map +0 -1
  1972. package/dist/change-set/create-merge-change-set.test.js +0 -211
  1973. package/dist/change-set/create-merge-change-set.test.js.map +0 -1
  1974. package/dist/change-set/create-transition-change-set.d.ts +0 -18
  1975. package/dist/change-set/create-transition-change-set.d.ts.map +0 -1
  1976. package/dist/change-set/create-transition-change-set.js +0 -102
  1977. package/dist/change-set/create-transition-change-set.js.map +0 -1
  1978. package/dist/change-set/create-transition-change-set.test.d.ts +0 -2
  1979. package/dist/change-set/create-transition-change-set.test.d.ts.map +0 -1
  1980. package/dist/change-set/create-transition-change-set.test.js +0 -211
  1981. package/dist/change-set/create-transition-change-set.test.js.map +0 -1
  1982. package/dist/change-set/create-undo-change-set.d.ts +0 -27
  1983. package/dist/change-set/create-undo-change-set.d.ts.map +0 -1
  1984. package/dist/change-set/create-undo-change-set.js +0 -121
  1985. package/dist/change-set/create-undo-change-set.js.map +0 -1
  1986. package/dist/change-set/create-undo-change-set.test.d.ts +0 -2
  1987. package/dist/change-set/create-undo-change-set.test.d.ts.map +0 -1
  1988. package/dist/change-set/create-undo-change-set.test.js +0 -273
  1989. package/dist/change-set/create-undo-change-set.test.js.map +0 -1
  1990. package/dist/change-set/schema.d.ts +0 -149
  1991. package/dist/change-set/schema.d.ts.map +0 -1
  1992. package/dist/change-set/schema.js +0 -169
  1993. package/dist/change-set/schema.js.map +0 -1
  1994. package/dist/database/apply-schema.d.ts +0 -8
  1995. package/dist/database/apply-schema.d.ts.map +0 -1
  1996. package/dist/database/apply-schema.js +0 -266
  1997. package/dist/database/apply-schema.js.map +0 -1
  1998. package/dist/database/execute-sync.d.ts +0 -24
  1999. package/dist/database/execute-sync.d.ts.map +0 -1
  2000. package/dist/database/execute-sync.js +0 -37
  2001. package/dist/database/execute-sync.js.map +0 -1
  2002. package/dist/database/execute-sync.test.d.ts.map +0 -1
  2003. package/dist/database/execute-sync.test.js +0 -111
  2004. package/dist/database/execute-sync.test.js.map +0 -1
  2005. package/dist/database/init-db.test.d.ts +0 -2
  2006. package/dist/database/init-db.test.d.ts.map +0 -1
  2007. package/dist/database/init-db.test.js +0 -497
  2008. package/dist/database/init-db.test.js.map +0 -1
  2009. package/dist/database/kysely-plugin/json-column-plugin.d.ts +0 -3
  2010. package/dist/database/kysely-plugin/json-column-plugin.d.ts.map +0 -1
  2011. package/dist/database/kysely-plugin/json-column-plugin.js +0 -168
  2012. package/dist/database/kysely-plugin/json-column-plugin.js.map +0 -1
  2013. package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.d.ts +0 -3
  2014. package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.d.ts.map +0 -1
  2015. package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.js +0 -39
  2016. package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.js.map +0 -1
  2017. package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.test.d.ts +0 -2
  2018. package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.test.d.ts.map +0 -1
  2019. package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.test.js +0 -162
  2020. package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.test.js.map +0 -1
  2021. package/dist/database/kysely-plugin/parse-jsonb-plugin-v2.d.ts +0 -12
  2022. package/dist/database/kysely-plugin/parse-jsonb-plugin-v2.d.ts.map +0 -1
  2023. package/dist/database/kysely-plugin/parse-jsonb-plugin-v2.js +0 -149
  2024. package/dist/database/kysely-plugin/parse-jsonb-plugin-v2.js.map +0 -1
  2025. package/dist/database/kysely-plugin/parse-jsonb-plugin-v2.no_test.d.ts +0 -2
  2026. package/dist/database/kysely-plugin/parse-jsonb-plugin-v2.no_test.d.ts.map +0 -1
  2027. package/dist/database/kysely-plugin/parse-jsonb-plugin-v2.no_test.js +0 -162
  2028. package/dist/database/kysely-plugin/parse-jsonb-plugin-v2.no_test.js.map +0 -1
  2029. package/dist/database/kysely-plugin/serialize-jsonb-plugin.d.ts +0 -15
  2030. package/dist/database/kysely-plugin/serialize-jsonb-plugin.d.ts.map +0 -1
  2031. package/dist/database/kysely-plugin/serialize-jsonb-plugin.js +0 -171
  2032. package/dist/database/kysely-plugin/serialize-jsonb-plugin.js.map +0 -1
  2033. package/dist/database/kysely-plugin/serialize-jsonb-plugin.test.d.ts +0 -2
  2034. package/dist/database/kysely-plugin/serialize-jsonb-plugin.test.d.ts.map +0 -1
  2035. package/dist/database/kysely-plugin/serialize-jsonb-plugin.test.js +0 -251
  2036. package/dist/database/kysely-plugin/serialize-jsonb-plugin.test.js.map +0 -1
  2037. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.d.ts.map +0 -1
  2038. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.js.map +0 -1
  2039. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.test.d.ts.map +0 -1
  2040. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.test.js +0 -51
  2041. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.test.js.map +0 -1
  2042. package/dist/database/mutation-log/database-schema.d.ts +0 -16
  2043. package/dist/database/mutation-log/database-schema.d.ts.map +0 -1
  2044. package/dist/database/mutation-log/database-schema.js +0 -101
  2045. package/dist/database/mutation-log/database-schema.js.map +0 -1
  2046. package/dist/database/mutation-log/lix-session.d.ts +0 -8
  2047. package/dist/database/mutation-log/lix-session.d.ts.map +0 -1
  2048. package/dist/database/mutation-log/lix-session.js +0 -18
  2049. package/dist/database/mutation-log/lix-session.js.map +0 -1
  2050. package/dist/discussion/create-comment.d.ts +0 -8
  2051. package/dist/discussion/create-comment.d.ts.map +0 -1
  2052. package/dist/discussion/create-comment.js +0 -12
  2053. package/dist/discussion/create-comment.js.map +0 -1
  2054. package/dist/discussion/create-discussion.d.ts +0 -21
  2055. package/dist/discussion/create-discussion.d.ts.map +0 -1
  2056. package/dist/discussion/create-discussion.js +0 -40
  2057. package/dist/discussion/create-discussion.js.map +0 -1
  2058. package/dist/discussion/create-discussion.test.d.ts +0 -2
  2059. package/dist/discussion/create-discussion.test.d.ts.map +0 -1
  2060. package/dist/discussion/create-discussion.test.js +0 -38
  2061. package/dist/discussion/create-discussion.test.js.map +0 -1
  2062. package/dist/discussion/index.d.ts +0 -3
  2063. package/dist/discussion/index.d.ts.map +0 -1
  2064. package/dist/discussion/index.js +0 -3
  2065. package/dist/discussion/index.js.map +0 -1
  2066. package/dist/entity-views/entity-state-all.d.ts +0 -217
  2067. package/dist/entity-views/entity-state-all.d.ts.map +0 -1
  2068. package/dist/entity-views/entity-state-all.js +0 -246
  2069. package/dist/entity-views/entity-state-all.js.map +0 -1
  2070. package/dist/entity-views/entity-state-all.test.d.ts +0 -2
  2071. package/dist/entity-views/entity-state-all.test.d.ts.map +0 -1
  2072. package/dist/entity-views/entity-state-all.test.js +0 -371
  2073. package/dist/entity-views/entity-state-all.test.js.map +0 -1
  2074. package/dist/entity-views/entity-state-history.d.ts +0 -178
  2075. package/dist/entity-views/entity-state-history.d.ts.map +0 -1
  2076. package/dist/entity-views/entity-state-history.js +0 -58
  2077. package/dist/entity-views/entity-state-history.js.map +0 -1
  2078. package/dist/entity-views/entity-state-history.test.d.ts +0 -2
  2079. package/dist/entity-views/entity-state-history.test.d.ts.map +0 -1
  2080. package/dist/entity-views/entity-state-history.test.js +0 -274
  2081. package/dist/entity-views/entity-state-history.test.js.map +0 -1
  2082. package/dist/entity-views/entity-state.d.ts +0 -217
  2083. package/dist/entity-views/entity-state.d.ts.map +0 -1
  2084. package/dist/entity-views/entity-state.js +0 -243
  2085. package/dist/entity-views/entity-state.js.map +0 -1
  2086. package/dist/entity-views/entity-state.test.d.ts +0 -2
  2087. package/dist/entity-views/entity-state.test.d.ts.map +0 -1
  2088. package/dist/entity-views/entity-state.test.js +0 -497
  2089. package/dist/entity-views/entity-state.test.js.map +0 -1
  2090. package/dist/entity-views/entity-state_history.d.ts +0 -67
  2091. package/dist/entity-views/entity-state_history.d.ts.map +0 -1
  2092. package/dist/entity-views/entity-state_history.js +0 -58
  2093. package/dist/entity-views/entity-state_history.js.map +0 -1
  2094. package/dist/entity-views/entity-view-builder.d.ts +0 -92
  2095. package/dist/entity-views/entity-view-builder.d.ts.map +0 -1
  2096. package/dist/entity-views/entity-view-builder.js +0 -63
  2097. package/dist/entity-views/entity-view-builder.js.map +0 -1
  2098. package/dist/entity-views/entity-view-builder.test.d.ts +0 -2
  2099. package/dist/entity-views/entity-view-builder.test.d.ts.map +0 -1
  2100. package/dist/entity-views/entity-view-builder.test.js +0 -247
  2101. package/dist/entity-views/entity-view-builder.test.js.map +0 -1
  2102. package/dist/entity-views/generic-types.d.ts +0 -128
  2103. package/dist/entity-views/generic-types.d.ts.map +0 -1
  2104. package/dist/entity-views/generic-types.js +0 -2
  2105. package/dist/entity-views/generic-types.js.map +0 -1
  2106. package/dist/entity-views/generic-types.test.d.ts +0 -2
  2107. package/dist/entity-views/generic-types.test.d.ts.map +0 -1
  2108. package/dist/entity-views/generic-types.test.js +0 -99
  2109. package/dist/entity-views/generic-types.test.js.map +0 -1
  2110. package/dist/entity-views/index.d.ts.map +0 -1
  2111. package/dist/entity-views/index.js.map +0 -1
  2112. package/dist/entity-views/types.d.ts +0 -309
  2113. package/dist/entity-views/types.d.ts.map +0 -1
  2114. package/dist/entity-views/types.js.map +0 -1
  2115. package/dist/entity-views/types.test.d.ts.map +0 -1
  2116. package/dist/entity-views/types.test.js +0 -62
  2117. package/dist/entity-views/types.test.js.map +0 -1
  2118. package/dist/file/file-handlers.d.ts +0 -15
  2119. package/dist/file/file-handlers.d.ts.map +0 -1
  2120. package/dist/file/file-handlers.js +0 -318
  2121. package/dist/file/file-handlers.js.map +0 -1
  2122. package/dist/file/file-handlers.test.d.ts.map +0 -1
  2123. package/dist/file/file-handlers.test.js +0 -151
  2124. package/dist/file/file-handlers.test.js.map +0 -1
  2125. package/dist/file/index.d.ts +0 -2
  2126. package/dist/file/index.d.ts.map +0 -1
  2127. package/dist/file/index.js +0 -2
  2128. package/dist/file/index.js.map +0 -1
  2129. package/dist/file/materialize-file-data-at-changeset.d.ts +0 -9
  2130. package/dist/file/materialize-file-data-at-changeset.d.ts.map +0 -1
  2131. package/dist/file/materialize-file-data-at-changeset.js +0 -93
  2132. package/dist/file/materialize-file-data-at-changeset.js.map +0 -1
  2133. package/dist/file/materialize-file-data.d.ts +0 -8
  2134. package/dist/file/materialize-file-data.d.ts.map +0 -1
  2135. package/dist/file/materialize-file-data.js +0 -91
  2136. package/dist/file/materialize-file-data.js.map +0 -1
  2137. package/dist/file/materialize-file-data.test.d.ts.map +0 -1
  2138. package/dist/file/materialize-file-data.test.js +0 -90
  2139. package/dist/file/materialize-file-data.test.js.map +0 -1
  2140. package/dist/file/schema.d.ts +0 -46
  2141. package/dist/file/schema.d.ts.map +0 -1
  2142. package/dist/file/schema.js +0 -265
  2143. package/dist/file/schema.js.map +0 -1
  2144. package/dist/file/schema.test.d.ts.map +0 -1
  2145. package/dist/file/schema.test.js +0 -805
  2146. package/dist/file/schema.test.js.map +0 -1
  2147. package/dist/file/store-detected-change-schema.d.ts +0 -8
  2148. package/dist/file/store-detected-change-schema.d.ts.map +0 -1
  2149. package/dist/file/store-detected-change-schema.js +0 -41
  2150. package/dist/file/store-detected-change-schema.js.map +0 -1
  2151. package/dist/file/store-detected-change-schema.test.d.ts.map +0 -1
  2152. package/dist/file/store-detected-change-schema.test.js +0 -211
  2153. package/dist/file/store-detected-change-schema.test.js.map +0 -1
  2154. package/dist/file/unknown-file-fallback-plugin.d.ts +0 -22
  2155. package/dist/file/unknown-file-fallback-plugin.d.ts.map +0 -1
  2156. package/dist/file/unknown-file-fallback-plugin.js +0 -73
  2157. package/dist/file/unknown-file-fallback-plugin.js.map +0 -1
  2158. package/dist/file/unknown-file-fallback-plugin.test.d.ts.map +0 -1
  2159. package/dist/file/unknown-file-fallback-plugin.test.js +0 -305
  2160. package/dist/file/unknown-file-fallback-plugin.test.js.map +0 -1
  2161. package/dist/file/validate-file-path.d.ts +0 -16
  2162. package/dist/file/validate-file-path.d.ts.map +0 -1
  2163. package/dist/file/validate-file-path.js +0 -44
  2164. package/dist/file/validate-file-path.js.map +0 -1
  2165. package/dist/file/validate-file-path.test.d.ts +0 -2
  2166. package/dist/file/validate-file-path.test.d.ts.map +0 -1
  2167. package/dist/file/validate-file-path.test.js +0 -36
  2168. package/dist/file/validate-file-path.test.js.map +0 -1
  2169. package/dist/file-queue/file-handlers.d.ts +0 -24
  2170. package/dist/file-queue/file-handlers.d.ts.map +0 -1
  2171. package/dist/file-queue/file-handlers.js +0 -204
  2172. package/dist/file-queue/file-handlers.js.map +0 -1
  2173. package/dist/file-queue/file-queue-process.d.ts +0 -5
  2174. package/dist/file-queue/file-queue-process.d.ts.map +0 -1
  2175. package/dist/file-queue/file-queue-process.js +0 -91
  2176. package/dist/file-queue/file-queue-process.js.map +0 -1
  2177. package/dist/file-queue/file-queue-process.test.d.ts +0 -2
  2178. package/dist/file-queue/file-queue-process.test.d.ts.map +0 -1
  2179. package/dist/file-queue/file-queue-process.test.js +0 -372
  2180. package/dist/file-queue/file-queue-process.test.js.map +0 -1
  2181. package/dist/file-queue/file-queue-settled.d.ts +0 -13
  2182. package/dist/file-queue/file-queue-settled.d.ts.map +0 -1
  2183. package/dist/file-queue/file-queue-settled.js +0 -25
  2184. package/dist/file-queue/file-queue-settled.js.map +0 -1
  2185. package/dist/file-queue/file-queue-settled.test.d.ts +0 -2
  2186. package/dist/file-queue/file-queue-settled.test.d.ts.map +0 -1
  2187. package/dist/file-queue/file-queue-settled.test.js +0 -47
  2188. package/dist/file-queue/file-queue-settled.test.js.map +0 -1
  2189. package/dist/file-queue/index.d.ts +0 -2
  2190. package/dist/file-queue/index.d.ts.map +0 -1
  2191. package/dist/file-queue/index.js +0 -2
  2192. package/dist/file-queue/index.js.map +0 -1
  2193. package/dist/file-queue/with-skip-file-queue.d.ts +0 -3
  2194. package/dist/file-queue/with-skip-file-queue.d.ts.map +0 -1
  2195. package/dist/file-queue/with-skip-file-queue.js +0 -26
  2196. package/dist/file-queue/with-skip-file-queue.js.map +0 -1
  2197. package/dist/file-queue/with-skip-file-queue.test.d.ts +0 -2
  2198. package/dist/file-queue/with-skip-file-queue.test.d.ts.map +0 -1
  2199. package/dist/file-queue/with-skip-file-queue.test.js +0 -138
  2200. package/dist/file-queue/with-skip-file-queue.test.js.map +0 -1
  2201. package/dist/key-value/database-schema.d.ts +0 -42
  2202. package/dist/key-value/database-schema.d.ts.map +0 -1
  2203. package/dist/key-value/database-schema.js +0 -21
  2204. package/dist/key-value/database-schema.js.map +0 -1
  2205. package/dist/key-value/database-schema.test.d.ts +0 -2
  2206. package/dist/key-value/database-schema.test.d.ts.map +0 -1
  2207. package/dist/key-value/database-schema.test.js +0 -114
  2208. package/dist/key-value/database-schema.test.js.map +0 -1
  2209. package/dist/key-value/schema.d.ts +0 -21
  2210. package/dist/key-value/schema.d.ts.map +0 -1
  2211. package/dist/key-value/schema.js +0 -25
  2212. package/dist/key-value/schema.js.map +0 -1
  2213. package/dist/label/schema.d.ts +0 -22
  2214. package/dist/label/schema.d.ts.map +0 -1
  2215. package/dist/label/schema.js +0 -28
  2216. package/dist/label/schema.js.map +0 -1
  2217. package/dist/lix/close-lix.d.ts +0 -17
  2218. package/dist/lix/close-lix.d.ts.map +0 -1
  2219. package/dist/lix/close-lix.js +0 -16
  2220. package/dist/lix/close-lix.js.map +0 -1
  2221. package/dist/lix/merge.d.ts +0 -9
  2222. package/dist/lix/merge.d.ts.map +0 -1
  2223. package/dist/lix/merge.get-leaf-changes-only-in-source.d.ts +0 -15
  2224. package/dist/lix/merge.get-leaf-changes-only-in-source.d.ts.map +0 -1
  2225. package/dist/lix/merge.get-leaf-changes-only-in-source.js +0 -34
  2226. package/dist/lix/merge.get-leaf-changes-only-in-source.js.map +0 -1
  2227. package/dist/lix/merge.get-leaf-changes-only-in-source.test.d.ts +0 -2
  2228. package/dist/lix/merge.get-leaf-changes-only-in-source.test.d.ts.map +0 -1
  2229. package/dist/lix/merge.get-leaf-changes-only-in-source.test.js +0 -121
  2230. package/dist/lix/merge.get-leaf-changes-only-in-source.test.js.map +0 -1
  2231. package/dist/lix/merge.js +0 -195
  2232. package/dist/lix/merge.js.map +0 -1
  2233. package/dist/lix/merge.test.d.ts +0 -2
  2234. package/dist/lix/merge.test.d.ts.map +0 -1
  2235. package/dist/lix/merge.test.js +0 -689
  2236. package/dist/lix/merge.test.js.map +0 -1
  2237. package/dist/lix/open-lix-in-memory.d.ts +0 -20
  2238. package/dist/lix/open-lix-in-memory.d.ts.map +0 -1
  2239. package/dist/lix/open-lix-in-memory.js +0 -27
  2240. package/dist/lix/open-lix-in-memory.js.map +0 -1
  2241. package/dist/lix/open-lix-in-memory.test.d.ts +0 -2
  2242. package/dist/lix/open-lix-in-memory.test.d.ts.map +0 -1
  2243. package/dist/lix/open-lix-in-memory.test.js +0 -24
  2244. package/dist/lix/open-lix-in-memory.test.js.map +0 -1
  2245. package/dist/lix/storage/in-memory.d.ts +0 -34
  2246. package/dist/lix/storage/in-memory.d.ts.map +0 -1
  2247. package/dist/lix/storage/in-memory.js +0 -57
  2248. package/dist/lix/storage/in-memory.js.map +0 -1
  2249. package/dist/lix/storage/in-memory.test.d.ts.map +0 -1
  2250. package/dist/lix/storage/in-memory.test.js +0 -146
  2251. package/dist/lix/storage/in-memory.test.js.map +0 -1
  2252. package/dist/lix/storage/lix-storage-adapter.d.ts +0 -16
  2253. package/dist/lix/storage/lix-storage-adapter.d.ts.map +0 -1
  2254. package/dist/lix/storage/lix-storage-adapter.js +0 -2
  2255. package/dist/lix/storage/lix-storage-adapter.js.map +0 -1
  2256. package/dist/lix/storage/opfs.d.ts +0 -66
  2257. package/dist/lix/storage/opfs.d.ts.map +0 -1
  2258. package/dist/lix/storage/opfs.js +0 -152
  2259. package/dist/lix/storage/opfs.js.map +0 -1
  2260. package/dist/lix/storage/opfs.test.d.ts +0 -2
  2261. package/dist/lix/storage/opfs.test.d.ts.map +0 -1
  2262. package/dist/lix/storage/opfs.test.js +0 -171
  2263. package/dist/lix/storage/opfs.test.js.map +0 -1
  2264. package/dist/lix/to-blob.d.ts +0 -18
  2265. package/dist/lix/to-blob.d.ts.map +0 -1
  2266. package/dist/lix/to-blob.js +0 -18
  2267. package/dist/lix/to-blob.js.map +0 -1
  2268. package/dist/lix/to-blob.test.d.ts +0 -2
  2269. package/dist/lix/to-blob.test.d.ts.map +0 -1
  2270. package/dist/lix/to-blob.test.js +0 -18
  2271. package/dist/lix/to-blob.test.js.map +0 -1
  2272. package/dist/log/schema.d.ts +0 -32
  2273. package/dist/log/schema.d.ts.map +0 -1
  2274. package/dist/log/schema.js +0 -43
  2275. package/dist/log/schema.js.map +0 -1
  2276. package/dist/own-change-control/apply-own-change.d.ts +0 -10
  2277. package/dist/own-change-control/apply-own-change.d.ts.map +0 -1
  2278. package/dist/own-change-control/apply-own-change.js +0 -69
  2279. package/dist/own-change-control/apply-own-change.js.map +0 -1
  2280. package/dist/own-change-control/apply-own-change.test.d.ts +0 -2
  2281. package/dist/own-change-control/apply-own-change.test.d.ts.map +0 -1
  2282. package/dist/own-change-control/apply-own-change.test.js +0 -297
  2283. package/dist/own-change-control/apply-own-change.test.js.map +0 -1
  2284. package/dist/own-change-control/change-controlled-tables.d.ts +0 -60
  2285. package/dist/own-change-control/change-controlled-tables.d.ts.map +0 -1
  2286. package/dist/own-change-control/change-controlled-tables.js +0 -70
  2287. package/dist/own-change-control/change-controlled-tables.js.map +0 -1
  2288. package/dist/own-change-control/change-controlled-tables.test.d.ts +0 -2
  2289. package/dist/own-change-control/change-controlled-tables.test.d.ts.map +0 -1
  2290. package/dist/own-change-control/change-controlled-tables.test.js +0 -48
  2291. package/dist/own-change-control/change-controlled-tables.test.js.map +0 -1
  2292. package/dist/own-change-control/database-triggers.d.ts +0 -5
  2293. package/dist/own-change-control/database-triggers.d.ts.map +0 -1
  2294. package/dist/own-change-control/database-triggers.js +0 -135
  2295. package/dist/own-change-control/database-triggers.js.map +0 -1
  2296. package/dist/own-change-control/database-triggers.test.d.ts +0 -2
  2297. package/dist/own-change-control/database-triggers.test.d.ts.map +0 -1
  2298. package/dist/own-change-control/database-triggers.test.js +0 -214
  2299. package/dist/own-change-control/database-triggers.test.js.map +0 -1
  2300. package/dist/own-change-control/index.d.ts +0 -2
  2301. package/dist/own-change-control/index.d.ts.map +0 -1
  2302. package/dist/own-change-control/index.js +0 -2
  2303. package/dist/own-change-control/index.js.map +0 -1
  2304. package/dist/own-change-control/with-skip-own-change-control.d.ts +0 -3
  2305. package/dist/own-change-control/with-skip-own-change-control.d.ts.map +0 -1
  2306. package/dist/own-change-control/with-skip-own-change-control.js +0 -28
  2307. package/dist/own-change-control/with-skip-own-change-control.js.map +0 -1
  2308. package/dist/own-change-control/with-skip-own-change-control.test.d.ts +0 -2
  2309. package/dist/own-change-control/with-skip-own-change-control.test.d.ts.map +0 -1
  2310. package/dist/own-change-control/with-skip-own-change-control.test.js +0 -49
  2311. package/dist/own-change-control/with-skip-own-change-control.test.js.map +0 -1
  2312. package/dist/plugin/load-plugin.d.ts +0 -5
  2313. package/dist/plugin/load-plugin.d.ts.map +0 -1
  2314. package/dist/plugin/load-plugin.js +0 -27
  2315. package/dist/plugin/load-plugin.js.map +0 -1
  2316. package/dist/plugin/with-transaction.d.ts +0 -11
  2317. package/dist/plugin/with-transaction.d.ts.map +0 -1
  2318. package/dist/plugin/with-transaction.js +0 -15
  2319. package/dist/plugin/with-transaction.js.map +0 -1
  2320. package/dist/query-filter/change-conflict-in-version.d.ts +0 -15
  2321. package/dist/query-filter/change-conflict-in-version.d.ts.map +0 -1
  2322. package/dist/query-filter/change-conflict-in-version.js +0 -18
  2323. package/dist/query-filter/change-conflict-in-version.js.map +0 -1
  2324. package/dist/query-filter/change-conflict-in-version.test.d.ts +0 -2
  2325. package/dist/query-filter/change-conflict-in-version.test.d.ts.map +0 -1
  2326. package/dist/query-filter/change-conflict-in-version.test.js +0 -55
  2327. package/dist/query-filter/change-conflict-in-version.test.js.map +0 -1
  2328. package/dist/query-filter/change-has-label.d.ts +0 -31
  2329. package/dist/query-filter/change-has-label.d.ts.map +0 -1
  2330. package/dist/query-filter/change-has-label.js +0 -33
  2331. package/dist/query-filter/change-has-label.js.map +0 -1
  2332. package/dist/query-filter/change-has-label.test.d.ts +0 -2
  2333. package/dist/query-filter/change-has-label.test.d.ts.map +0 -1
  2334. package/dist/query-filter/change-has-label.test.js +0 -71
  2335. package/dist/query-filter/change-has-label.test.js.map +0 -1
  2336. package/dist/query-filter/change-in-version.d.ts +0 -16
  2337. package/dist/query-filter/change-in-version.d.ts.map +0 -1
  2338. package/dist/query-filter/change-in-version.js +0 -29
  2339. package/dist/query-filter/change-in-version.js.map +0 -1
  2340. package/dist/query-filter/change-in-version.test.d.ts +0 -2
  2341. package/dist/query-filter/change-in-version.test.d.ts.map +0 -1
  2342. package/dist/query-filter/change-in-version.test.js +0 -75
  2343. package/dist/query-filter/change-in-version.test.js.map +0 -1
  2344. package/dist/query-filter/change-is-leaf-in-version.d.ts +0 -16
  2345. package/dist/query-filter/change-is-leaf-in-version.d.ts.map +0 -1
  2346. package/dist/query-filter/change-is-leaf-in-version.js +0 -35
  2347. package/dist/query-filter/change-is-leaf-in-version.js.map +0 -1
  2348. package/dist/query-filter/change-is-leaf-in-version.test.d.ts +0 -2
  2349. package/dist/query-filter/change-is-leaf-in-version.test.d.ts.map +0 -1
  2350. package/dist/query-filter/change-is-leaf-in-version.test.js +0 -70
  2351. package/dist/query-filter/change-is-leaf-in-version.test.js.map +0 -1
  2352. package/dist/query-filter/change-is-leaf-of.bench.d.ts +0 -2
  2353. package/dist/query-filter/change-is-leaf-of.bench.d.ts.map +0 -1
  2354. package/dist/query-filter/change-is-leaf-of.bench.js +0 -132
  2355. package/dist/query-filter/change-is-leaf-of.bench.js.map +0 -1
  2356. package/dist/query-filter/change-is-leaf-of.d.ts +0 -29
  2357. package/dist/query-filter/change-is-leaf-of.d.ts.map +0 -1
  2358. package/dist/query-filter/change-is-leaf-of.js +0 -44
  2359. package/dist/query-filter/change-is-leaf-of.js.map +0 -1
  2360. package/dist/query-filter/change-is-leaf-of.test.d.ts +0 -2
  2361. package/dist/query-filter/change-is-leaf-of.test.d.ts.map +0 -1
  2362. package/dist/query-filter/change-is-leaf-of.test.js +0 -71
  2363. package/dist/query-filter/change-is-leaf-of.test.js.map +0 -1
  2364. package/dist/query-filter/change-is-leaf.d.ts +0 -18
  2365. package/dist/query-filter/change-is-leaf.d.ts.map +0 -1
  2366. package/dist/query-filter/change-is-leaf.js +0 -18
  2367. package/dist/query-filter/change-is-leaf.js.map +0 -1
  2368. package/dist/query-filter/change-is-leaf.test.d.ts +0 -2
  2369. package/dist/query-filter/change-is-leaf.test.d.ts.map +0 -1
  2370. package/dist/query-filter/change-is-leaf.test.js +0 -122
  2371. package/dist/query-filter/change-is-leaf.test.js.map +0 -1
  2372. package/dist/query-filter/change-is-lowest-common-ancestor-of.d.ts +0 -16
  2373. package/dist/query-filter/change-is-lowest-common-ancestor-of.d.ts.map +0 -1
  2374. package/dist/query-filter/change-is-lowest-common-ancestor-of.js +0 -55
  2375. package/dist/query-filter/change-is-lowest-common-ancestor-of.js.map +0 -1
  2376. package/dist/query-filter/change-is-lowest-common-ancestor-of.test.d.ts +0 -2
  2377. package/dist/query-filter/change-is-lowest-common-ancestor-of.test.d.ts.map +0 -1
  2378. package/dist/query-filter/change-is-lowest-common-ancestor-of.test.js +0 -155
  2379. package/dist/query-filter/change-is-lowest-common-ancestor-of.test.js.map +0 -1
  2380. package/dist/query-filter/change-set-element-in-ancestry-of.d.ts +0 -30
  2381. package/dist/query-filter/change-set-element-in-ancestry-of.d.ts.map +0 -1
  2382. package/dist/query-filter/change-set-element-in-ancestry-of.js +0 -46
  2383. package/dist/query-filter/change-set-element-in-ancestry-of.js.map +0 -1
  2384. package/dist/query-filter/change-set-element-in-ancestry-of.test.d.ts +0 -2
  2385. package/dist/query-filter/change-set-element-in-ancestry-of.test.d.ts.map +0 -1
  2386. package/dist/query-filter/change-set-element-in-ancestry-of.test.js +0 -323
  2387. package/dist/query-filter/change-set-element-in-ancestry-of.test.js.map +0 -1
  2388. package/dist/query-filter/change-set-element-in-symmetric-difference.d.ts +0 -20
  2389. package/dist/query-filter/change-set-element-in-symmetric-difference.d.ts.map +0 -1
  2390. package/dist/query-filter/change-set-element-in-symmetric-difference.js +0 -36
  2391. package/dist/query-filter/change-set-element-in-symmetric-difference.js.map +0 -1
  2392. package/dist/query-filter/change-set-element-in-symmetric-difference.test.d.ts +0 -2
  2393. package/dist/query-filter/change-set-element-in-symmetric-difference.test.d.ts.map +0 -1
  2394. package/dist/query-filter/change-set-element-in-symmetric-difference.test.js +0 -369
  2395. package/dist/query-filter/change-set-element-in-symmetric-difference.test.js.map +0 -1
  2396. package/dist/query-filter/change-set-element-is-leaf-of.d.ts +0 -29
  2397. package/dist/query-filter/change-set-element-is-leaf-of.d.ts.map +0 -1
  2398. package/dist/query-filter/change-set-element-is-leaf-of.js +0 -91
  2399. package/dist/query-filter/change-set-element-is-leaf-of.js.map +0 -1
  2400. package/dist/query-filter/change-set-element-is-leaf-of.test.d.ts +0 -2
  2401. package/dist/query-filter/change-set-element-is-leaf-of.test.d.ts.map +0 -1
  2402. package/dist/query-filter/change-set-element-is-leaf-of.test.js +0 -515
  2403. package/dist/query-filter/change-set-element-is-leaf-of.test.js.map +0 -1
  2404. package/dist/query-filter/change-set-has-label.d.ts +0 -41
  2405. package/dist/query-filter/change-set-has-label.d.ts.map +0 -1
  2406. package/dist/query-filter/change-set-has-label.js +0 -42
  2407. package/dist/query-filter/change-set-has-label.js.map +0 -1
  2408. package/dist/query-filter/change-set-has-label.test.d.ts +0 -2
  2409. package/dist/query-filter/change-set-has-label.test.d.ts.map +0 -1
  2410. package/dist/query-filter/change-set-has-label.test.js +0 -36
  2411. package/dist/query-filter/change-set-has-label.test.js.map +0 -1
  2412. package/dist/query-filter/change-set-is-ancestor-of.d.ts +0 -51
  2413. package/dist/query-filter/change-set-is-ancestor-of.d.ts.map +0 -1
  2414. package/dist/query-filter/change-set-is-ancestor-of.js +0 -63
  2415. package/dist/query-filter/change-set-is-ancestor-of.js.map +0 -1
  2416. package/dist/query-filter/change-set-is-ancestor-of.test.d.ts +0 -2
  2417. package/dist/query-filter/change-set-is-ancestor-of.test.d.ts.map +0 -1
  2418. package/dist/query-filter/change-set-is-ancestor-of.test.js +0 -153
  2419. package/dist/query-filter/change-set-is-ancestor-of.test.js.map +0 -1
  2420. package/dist/query-filter/change-set-is-descendant-of.d.ts +0 -44
  2421. package/dist/query-filter/change-set-is-descendant-of.d.ts.map +0 -1
  2422. package/dist/query-filter/change-set-is-descendant-of.js +0 -56
  2423. package/dist/query-filter/change-set-is-descendant-of.js.map +0 -1
  2424. package/dist/query-filter/change-set-is-descendant-of.test.d.ts +0 -2
  2425. package/dist/query-filter/change-set-is-descendant-of.test.d.ts.map +0 -1
  2426. package/dist/query-filter/change-set-is-descendant-of.test.js +0 -137
  2427. package/dist/query-filter/change-set-is-descendant-of.test.js.map +0 -1
  2428. package/dist/query-filter/version-change-in-difference.d.ts +0 -18
  2429. package/dist/query-filter/version-change-in-difference.d.ts.map +0 -1
  2430. package/dist/query-filter/version-change-in-difference.js +0 -25
  2431. package/dist/query-filter/version-change-in-difference.js.map +0 -1
  2432. package/dist/query-filter/version-change-in-difference.test.d.ts +0 -2
  2433. package/dist/query-filter/version-change-in-difference.test.d.ts.map +0 -1
  2434. package/dist/query-filter/version-change-in-difference.test.js +0 -85
  2435. package/dist/query-filter/version-change-in-difference.test.js.map +0 -1
  2436. package/dist/query-filter/version-change-in-symmetric-difference.d.ts +0 -19
  2437. package/dist/query-filter/version-change-in-symmetric-difference.d.ts.map +0 -1
  2438. package/dist/query-filter/version-change-in-symmetric-difference.js +0 -36
  2439. package/dist/query-filter/version-change-in-symmetric-difference.js.map +0 -1
  2440. package/dist/query-filter/version-change-in-symmetric-difference.test.d.ts +0 -2
  2441. package/dist/query-filter/version-change-in-symmetric-difference.test.d.ts.map +0 -1
  2442. package/dist/query-filter/version-change-in-symmetric-difference.test.js +0 -84
  2443. package/dist/query-filter/version-change-in-symmetric-difference.test.js.map +0 -1
  2444. package/dist/repository/comparison-example.js +0 -173
  2445. package/dist/repository/comparison-example.js.map +0 -1
  2446. package/dist/repository/entity-repository.d.ts +0 -53
  2447. package/dist/repository/entity-repository.d.ts.map +0 -1
  2448. package/dist/repository/entity-repository.js +0 -187
  2449. package/dist/repository/entity-repository.js.map +0 -1
  2450. package/dist/repository/entity-repository.test.d.ts +0 -2
  2451. package/dist/repository/entity-repository.test.d.ts.map +0 -1
  2452. package/dist/repository/entity-repository.test.js +0 -94
  2453. package/dist/repository/entity-repository.test.js.map +0 -1
  2454. package/dist/repository/example.d.ts +0 -6
  2455. package/dist/repository/example.d.ts.map +0 -1
  2456. package/dist/repository/example.js +0 -87
  2457. package/dist/repository/example.js.map +0 -1
  2458. package/dist/repository/file-repository.d.ts +0 -39
  2459. package/dist/repository/file-repository.d.ts.map +0 -1
  2460. package/dist/repository/file-repository.js +0 -93
  2461. package/dist/repository/file-repository.js.map +0 -1
  2462. package/dist/repository/file-repository.test.d.ts +0 -2
  2463. package/dist/repository/file-repository.test.d.ts.map +0 -1
  2464. package/dist/repository/file-repository.test.js +0 -165
  2465. package/dist/repository/file-repository.test.js.map +0 -1
  2466. package/dist/repository/index.d.ts +0 -6
  2467. package/dist/repository/index.d.ts.map +0 -1
  2468. package/dist/repository/index.js +0 -6
  2469. package/dist/repository/index.js.map +0 -1
  2470. package/dist/repository/integration.test.d.ts +0 -2
  2471. package/dist/repository/integration.test.d.ts.map +0 -1
  2472. package/dist/repository/integration.test.js +0 -136
  2473. package/dist/repository/integration.test.js.map +0 -1
  2474. package/dist/repository/key-value-repository.d.ts +0 -30
  2475. package/dist/repository/key-value-repository.d.ts.map +0 -1
  2476. package/dist/repository/key-value-repository.js +0 -60
  2477. package/dist/repository/key-value-repository.js.map +0 -1
  2478. package/dist/repository/key-value-repository.test.d.ts +0 -2
  2479. package/dist/repository/key-value-repository.test.d.ts.map +0 -1
  2480. package/dist/repository/key-value-repository.test.js +0 -122
  2481. package/dist/repository/key-value-repository.test.js.map +0 -1
  2482. package/dist/repository/markdown-plugin-example.js +0 -118
  2483. package/dist/repository/markdown-plugin-example.js.map +0 -1
  2484. package/dist/repository/query-builder.d.ts +0 -69
  2485. package/dist/repository/query-builder.d.ts.map +0 -1
  2486. package/dist/repository/query-builder.js +0 -155
  2487. package/dist/repository/query-builder.js.map +0 -1
  2488. package/dist/repository/query-builder.test.d.ts +0 -2
  2489. package/dist/repository/query-builder.test.d.ts.map +0 -1
  2490. package/dist/repository/query-builder.test.js +0 -244
  2491. package/dist/repository/query-builder.test.js.map +0 -1
  2492. package/dist/repository/repository-manager.d.ts +0 -27
  2493. package/dist/repository/repository-manager.d.ts.map +0 -1
  2494. package/dist/repository/repository-manager.js +0 -19
  2495. package/dist/repository/repository-manager.js.map +0 -1
  2496. package/dist/repository/repository-manager.test.d.ts +0 -2
  2497. package/dist/repository/repository-manager.test.d.ts.map +0 -1
  2498. package/dist/repository/repository-manager.test.js +0 -65
  2499. package/dist/repository/repository-manager.test.js.map +0 -1
  2500. package/dist/repository/test-helpers.js +0 -402
  2501. package/dist/repository/test-helpers.js.map +0 -1
  2502. package/dist/schema-definition/lix-generated.test.d.ts +0 -2
  2503. package/dist/schema-definition/lix-generated.test.d.ts.map +0 -1
  2504. package/dist/schema-definition/lix-generated.test.js +0 -127
  2505. package/dist/schema-definition/lix-generated.test.js.map +0 -1
  2506. package/dist/snapshot/create-snapshot.d.ts +0 -7
  2507. package/dist/snapshot/create-snapshot.d.ts.map +0 -1
  2508. package/dist/snapshot/create-snapshot.js +0 -28
  2509. package/dist/snapshot/create-snapshot.js.map +0 -1
  2510. package/dist/snapshot/create-snapshot.test.d.ts +0 -2
  2511. package/dist/snapshot/create-snapshot.test.d.ts.map +0 -1
  2512. package/dist/snapshot/create-snapshot.test.js +0 -83
  2513. package/dist/snapshot/create-snapshot.test.js.map +0 -1
  2514. package/dist/snapshot/index.d.ts +0 -4
  2515. package/dist/snapshot/index.d.ts.map +0 -1
  2516. package/dist/snapshot/index.js +0 -4
  2517. package/dist/snapshot/index.js.map +0 -1
  2518. package/dist/snapshot/json-sha-256.d.ts +0 -9
  2519. package/dist/snapshot/json-sha-256.d.ts.map +0 -1
  2520. package/dist/snapshot/json-sha-256.js +0 -27
  2521. package/dist/snapshot/json-sha-256.js.map +0 -1
  2522. package/dist/snapshot/json-sha-256.test.d.ts +0 -2
  2523. package/dist/snapshot/json-sha-256.test.d.ts.map +0 -1
  2524. package/dist/snapshot/json-sha-256.test.js +0 -48
  2525. package/dist/snapshot/json-sha-256.test.js.map +0 -1
  2526. package/dist/snapshot/mock-json-snapshot.d.ts +0 -8
  2527. package/dist/snapshot/mock-json-snapshot.d.ts.map +0 -1
  2528. package/dist/snapshot/mock-json-snapshot.js +0 -13
  2529. package/dist/snapshot/mock-json-snapshot.js.map +0 -1
  2530. package/dist/state/create-changeset-for-transaction.d.ts +0 -15
  2531. package/dist/state/create-changeset-for-transaction.d.ts.map +0 -1
  2532. package/dist/state/create-changeset-for-transaction.js +0 -237
  2533. package/dist/state/create-changeset-for-transaction.js.map +0 -1
  2534. package/dist/state/entity-view-builder.d.ts +0 -145
  2535. package/dist/state/entity-view-builder.d.ts.map +0 -1
  2536. package/dist/state/entity-view-builder.js +0 -280
  2537. package/dist/state/entity-view-builder.js.map +0 -1
  2538. package/dist/state/entity-view-builder.test.d.ts +0 -2
  2539. package/dist/state/entity-view-builder.test.d.ts.map +0 -1
  2540. package/dist/state/entity-view-builder.test.js +0 -523
  2541. package/dist/state/entity-view-builder.test.js.map +0 -1
  2542. package/dist/state/get-version-record-by-id-or-throw.d.ts +0 -6
  2543. package/dist/state/get-version-record-by-id-or-throw.d.ts.map +0 -1
  2544. package/dist/state/get-version-record-by-id-or-throw.js +0 -36
  2545. package/dist/state/get-version-record-by-id-or-throw.js.map +0 -1
  2546. package/dist/state/handle-state-mutation.d.ts +0 -18
  2547. package/dist/state/handle-state-mutation.d.ts.map +0 -1
  2548. package/dist/state/handle-state-mutation.js +0 -352
  2549. package/dist/state/handle-state-mutation.js.map +0 -1
  2550. package/dist/state/handle-state-mutation.test.d.ts +0 -2
  2551. package/dist/state/handle-state-mutation.test.d.ts.map +0 -1
  2552. package/dist/state/handle-state-mutation.test.js +0 -632
  2553. package/dist/state/handle-state-mutation.test.js.map +0 -1
  2554. package/dist/state/schema.test.d.ts.map +0 -1
  2555. package/dist/state/schema.test.js +0 -2030
  2556. package/dist/state/schema.test.js.map +0 -1
  2557. package/dist/state/validate-state-mutation.d.ts +0 -13
  2558. package/dist/state/validate-state-mutation.d.ts.map +0 -1
  2559. package/dist/state/validate-state-mutation.js +0 -485
  2560. package/dist/state/validate-state-mutation.js.map +0 -1
  2561. package/dist/state/validate-state-mutation.test.d.ts.map +0 -1
  2562. package/dist/state/validate-state-mutation.test.js +0 -2024
  2563. package/dist/state/validate-state-mutation.test.js.map +0 -1
  2564. package/dist/stored-schema/schema.d.ts +0 -25
  2565. package/dist/stored-schema/schema.d.ts.map +0 -1
  2566. package/dist/stored-schema/schema.js +0 -48
  2567. package/dist/stored-schema/schema.js.map +0 -1
  2568. package/dist/thread/create-thread-comment.d.ts +0 -18
  2569. package/dist/thread/create-thread-comment.d.ts.map +0 -1
  2570. package/dist/thread/create-thread-comment.js +0 -47
  2571. package/dist/thread/create-thread-comment.js.map +0 -1
  2572. package/dist/thread/create-thread-comment.test.d.ts +0 -2
  2573. package/dist/thread/create-thread-comment.test.d.ts.map +0 -1
  2574. package/dist/thread/create-thread-comment.test.js +0 -51
  2575. package/dist/thread/create-thread-comment.test.js.map +0 -1
  2576. package/dist/thread/create-thread.d.ts +0 -28
  2577. package/dist/thread/create-thread.d.ts.map +0 -1
  2578. package/dist/thread/create-thread.js +0 -58
  2579. package/dist/thread/create-thread.js.map +0 -1
  2580. package/dist/thread/create-thread.test.d.ts +0 -2
  2581. package/dist/thread/create-thread.test.d.ts.map +0 -1
  2582. package/dist/thread/create-thread.test.js +0 -26
  2583. package/dist/thread/create-thread.test.js.map +0 -1
  2584. package/dist/thread/index.d.ts +0 -4
  2585. package/dist/thread/index.d.ts.map +0 -1
  2586. package/dist/thread/index.js +0 -4
  2587. package/dist/thread/index.js.map +0 -1
  2588. package/dist/thread/schema.d.ts +0 -59
  2589. package/dist/thread/schema.d.ts.map +0 -1
  2590. package/dist/thread/schema.js +0 -66
  2591. package/dist/thread/schema.js.map +0 -1
  2592. package/dist/thread/schema.test.d.ts.map +0 -1
  2593. package/dist/thread/schema.test.js +0 -60
  2594. package/dist/thread/schema.test.js.map +0 -1
  2595. package/dist/version/update-changes-in-version.d.ts +0 -13
  2596. package/dist/version/update-changes-in-version.d.ts.map +0 -1
  2597. package/dist/version/update-changes-in-version.js +0 -36
  2598. package/dist/version/update-changes-in-version.js.map +0 -1
  2599. package/dist/version/update-changes-in-version.test.d.ts +0 -2
  2600. package/dist/version/update-changes-in-version.test.d.ts.map +0 -1
  2601. package/dist/version/update-changes-in-version.test.js +0 -323
  2602. package/dist/version/update-changes-in-version.test.js.map +0 -1
  2603. package/dist/zettel-ast/index.d.ts.map +0 -1
  2604. package/dist/zettel-ast/index.js.map +0 -1
  2605. package/src/account/schema.ts +0 -76
  2606. package/src/change-author/schema.ts +0 -48
  2607. package/src/change-proposal/database-schema.test.ts +0 -180
  2608. package/src/change-proposal/database-schema.ts +0 -32
  2609. package/src/change-set/create-checkpoint.test.ts +0 -387
  2610. package/src/change-set/create-checkpoint.ts +0 -101
  2611. package/src/change-set/create-merge-change-set.test.ts +0 -237
  2612. package/src/change-set/create-merge-change-set.ts +0 -99
  2613. package/src/change-set/create-transition-change-set.test.ts +0 -245
  2614. package/src/change-set/create-transition-change-set.ts +0 -149
  2615. package/src/change-set/create-undo-change-set.test.ts +0 -329
  2616. package/src/change-set/create-undo-change-set.ts +0 -147
  2617. package/src/change-set/schema.ts +0 -207
  2618. package/src/database/execute-sync.test.ts +0 -140
  2619. package/src/database/execute-sync.ts +0 -46
  2620. package/src/database/kysely-plugin/json-column-plugin.ts +0 -215
  2621. package/src/database/kysely-plugin/parse-jsonb-plugin-v1.test.ts +0 -204
  2622. package/src/database/kysely-plugin/parse-jsonb-plugin-v1.ts +0 -50
  2623. package/src/database/kysely-plugin/parse-jsonb-plugin-v2.no_test.ts +0 -204
  2624. package/src/database/kysely-plugin/parse-jsonb-plugin-v2.ts +0 -194
  2625. package/src/database/kysely-plugin/serialize-jsonb-plugin.test.ts +0 -307
  2626. package/src/database/kysely-plugin/serialize-jsonb-plugin.ts +0 -221
  2627. package/src/database/kysely-plugin/view-insert-returning-error-plugin.test.ts +0 -62
  2628. package/src/entity-views/entity-state-all.test.ts +0 -445
  2629. package/src/entity-views/entity-state-all.ts +0 -506
  2630. package/src/entity-views/entity-state-history.test.ts +0 -325
  2631. package/src/entity-views/entity-state-history.ts +0 -226
  2632. package/src/entity-views/entity-state.test.ts +0 -592
  2633. package/src/entity-views/entity-state.ts +0 -502
  2634. package/src/entity-views/entity-view-builder.test.ts +0 -293
  2635. package/src/entity-views/entity-view-builder.ts +0 -148
  2636. package/src/entity-views/types.test.ts +0 -99
  2637. package/src/entity-views/types.ts +0 -328
  2638. package/src/file/file-handlers.test.ts +0 -174
  2639. package/src/file/file-handlers.ts +0 -364
  2640. package/src/file/index.ts +0 -5
  2641. package/src/file/materialize-file-data-at-changeset.ts +0 -123
  2642. package/src/file/materialize-file-data.test.ts +0 -107
  2643. package/src/file/materialize-file-data.ts +0 -120
  2644. package/src/file/schema.test.ts +0 -990
  2645. package/src/file/schema.ts +0 -300
  2646. package/src/file/store-detected-change-schema.test.ts +0 -248
  2647. package/src/file/store-detected-change-schema.ts +0 -52
  2648. package/src/file/unknown-file-fallback-plugin.test.ts +0 -368
  2649. package/src/file/unknown-file-fallback-plugin.ts +0 -95
  2650. package/src/key-value/schema.ts +0 -37
  2651. package/src/label/schema.ts +0 -40
  2652. package/src/lix/storage/in-memory.test.ts +0 -180
  2653. package/src/lix/storage/in-memory.ts +0 -69
  2654. package/src/lix/storage/lix-storage-adapter.ts +0 -16
  2655. package/src/lix/storage/opfs.test.ts +0 -215
  2656. package/src/lix/storage/opfs.ts +0 -175
  2657. package/src/log/schema.ts +0 -55
  2658. package/src/query-filter/change-has-label.test.ts +0 -79
  2659. package/src/query-filter/change-has-label.ts +0 -45
  2660. package/src/query-filter/change-set-element-in-ancestry-of.test.ts +0 -354
  2661. package/src/query-filter/change-set-element-in-ancestry-of.ts +0 -64
  2662. package/src/query-filter/change-set-element-in-symmetric-difference.test.ts +0 -410
  2663. package/src/query-filter/change-set-element-in-symmetric-difference.ts +0 -53
  2664. package/src/query-filter/change-set-element-is-leaf-of.test.ts +0 -564
  2665. package/src/query-filter/change-set-element-is-leaf-of.ts +0 -110
  2666. package/src/query-filter/change-set-has-label.test.ts +0 -42
  2667. package/src/query-filter/change-set-has-label.ts +0 -50
  2668. package/src/query-filter/change-set-is-ancestor-of.test.ts +0 -178
  2669. package/src/query-filter/change-set-is-ancestor-of.ts +0 -77
  2670. package/src/query-filter/change-set-is-descendant-of.test.ts +0 -169
  2671. package/src/query-filter/change-set-is-descendant-of.ts +0 -70
  2672. package/src/state/create-changeset-for-transaction.ts +0 -321
  2673. package/src/state/get-version-record-by-id-or-throw.ts +0 -51
  2674. package/src/state/handle-state-mutation.test.ts +0 -761
  2675. package/src/state/handle-state-mutation.ts +0 -418
  2676. package/src/state/schema.test.ts +0 -2416
  2677. package/src/state/validate-state-mutation.test.ts +0 -2353
  2678. package/src/state/validate-state-mutation.ts +0 -664
  2679. package/src/stored-schema/schema.ts +0 -67
  2680. package/src/thread/create-thread-comment.test.ts +0 -63
  2681. package/src/thread/create-thread-comment.ts +0 -56
  2682. package/src/thread/create-thread.test.ts +0 -32
  2683. package/src/thread/create-thread.ts +0 -83
  2684. package/src/thread/index.ts +0 -8
  2685. package/src/thread/schema.test.ts +0 -76
  2686. package/src/thread/schema.ts +0 -85
  2687. /package/dist/{file → change-proposal}/schema.test.d.ts +0 -0
  2688. /package/dist/{state → commit}/schema.test.d.ts +0 -0
  2689. /package/dist/database/{kysely-plugin → kysely/plugins}/view-insert-returning-error-plugin.d.ts +0 -0
  2690. /package/dist/database/{kysely-plugin → kysely/plugins}/view-insert-returning-error-plugin.js +0 -0
  2691. /package/dist/database/{kysely-plugin → kysely/plugins}/view-insert-returning-error-plugin.test.d.ts +0 -0
  2692. /package/dist/{zettel-ast → dependency/zettel-ast}/index.d.ts +0 -0
  2693. /package/dist/{zettel-ast → dependency/zettel-ast}/index.js +0 -0
  2694. /package/dist/{entity-views → engine/entity-views}/index.d.ts +0 -0
  2695. /package/dist/{entity-views → engine/entity-views}/index.js +0 -0
  2696. /package/dist/{change-schema → engine/entity-views}/types.js +0 -0
  2697. /package/dist/{entity-views → engine/entity-views}/types.test.d.ts +0 -0
  2698. /package/dist/{database → engine}/execute-sync.test.d.ts +0 -0
  2699. /package/dist/{entity-views → engine/preprocessor}/types.js +0 -0
  2700. /package/dist/{thread → entity/conversation}/schema.test.d.ts +0 -0
  2701. /package/dist/{lix/storage → environment}/in-memory.test.d.ts +0 -0
  2702. /package/dist/{file → filesystem/file}/file-handlers.test.d.ts +0 -0
  2703. /package/dist/{file → filesystem/file}/materialize-file-data.test.d.ts +0 -0
  2704. /package/dist/{file → filesystem/file}/store-detected-change-schema.test.d.ts +0 -0
  2705. /package/dist/{file → filesystem/file}/unknown-file-fallback-plugin.test.d.ts +0 -0
  2706. /package/dist/{change-set → state}/create-checkpoint.test.d.ts +0 -0
  2707. /package/dist/state/{validate-state-mutation.test.d.ts → vtable/validate-state-mutation.test.d.ts} +0 -0
  2708. /package/src/database/{kysely-plugin → kysely/plugins}/view-insert-returning-error-plugin.ts +0 -0
  2709. /package/src/{zettel-ast → dependency/zettel-ast}/index.ts +0 -0
  2710. /package/src/{entity-views → engine/entity-views}/index.ts +0 -0
@@ -0,0 +1,4265 @@
1
+ import { test, expect } from "vitest";
2
+ import { openLix } from "../../lix/open-lix.js";
3
+ import { validateStateMutation } from "./validate-state-mutation.js";
4
+ import type { LixSchemaDefinition } from "../../schema-definition/definition.js";
5
+ import { Kysely, sql } from "kysely";
6
+ import { createVersion } from "../../version/create-version.js";
7
+ import type { LixInternalDatabaseSchema } from "../../database/schema.js";
8
+
9
+ test("throws if the schema is not a valid lix schema", async () => {
10
+ const lix = await openLix({});
11
+
12
+ const schema = {
13
+ type: "object",
14
+ "x-lix-version": "1.0",
15
+ properties: {
16
+ name: { type: "string" },
17
+ },
18
+ required: ["name"],
19
+ additionalProperties: false,
20
+ // @ts-expect-error - x-version is missing
21
+ } as const satisfies LixSchemaDefinition;
22
+
23
+ const activeVersion = await lix.db
24
+ .selectFrom("active_version")
25
+ .select("version_id")
26
+ .executeTakeFirstOrThrow();
27
+
28
+ expect(() =>
29
+ validateStateMutation({
30
+ engine: lix.engine!,
31
+ // @ts-expect-error - x-key is missing
32
+ schema,
33
+ snapshot_content: {},
34
+ operation: "insert",
35
+ version_id: activeVersion.version_id,
36
+ })
37
+ ).toThrowError();
38
+ });
39
+
40
+ test("inserts the version and active version schemas to enable validation", async () => {
41
+ const lix = await openLix({
42
+ keyValues: [
43
+ {
44
+ key: "lix_deterministic_mode",
45
+ value: { enabled: true },
46
+ lixcol_version_id: "global",
47
+ },
48
+ ],
49
+ });
50
+
51
+ const result = await lix.db
52
+ .selectFrom("stored_schema")
53
+ .select("value")
54
+ .where(sql`json_extract("stored_schema"."value", '$."x-lix-key"')`, "in", [
55
+ "lix_version_tip",
56
+ "lix_active_version",
57
+ "lix_version_descriptor",
58
+ ])
59
+ .execute();
60
+
61
+ expect(result.length).toBe(3);
62
+ });
63
+
64
+ test("valid lix schema with a valid snapshot passes", async () => {
65
+ const lix = await openLix({});
66
+
67
+ const schema = {
68
+ type: "object",
69
+ "x-lix-version": "1.0",
70
+ "x-lix-key": "mock",
71
+ properties: {
72
+ name: { type: "string" },
73
+ },
74
+ required: ["name"],
75
+ additionalProperties: false,
76
+ } as const satisfies LixSchemaDefinition;
77
+
78
+ const snapshot = {
79
+ content: {
80
+ name: "John",
81
+ },
82
+ };
83
+
84
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
85
+
86
+ const activeVersion = await lix.db
87
+ .selectFrom("active_version")
88
+ .select("version_id")
89
+ .executeTakeFirstOrThrow();
90
+
91
+ expect(() =>
92
+ validateStateMutation({
93
+ engine: lix.engine!,
94
+ schema,
95
+ snapshot_content: snapshot.content,
96
+ operation: "insert",
97
+ version_id: activeVersion.version_id,
98
+ })
99
+ ).not.toThrowError();
100
+ });
101
+
102
+ test("an invalid snapshot fails", async () => {
103
+ const lix = await openLix({});
104
+
105
+ const schema = {
106
+ type: "object",
107
+ "x-lix-version": "1.0",
108
+ "x-lix-key": "mock",
109
+ properties: {
110
+ name: { type: "string" },
111
+ },
112
+ required: ["name"],
113
+ additionalProperties: false,
114
+ } as const satisfies LixSchemaDefinition;
115
+
116
+ const snapshot = {
117
+ content: {
118
+ foo: "John",
119
+ },
120
+ };
121
+
122
+ const activeVersion = await lix.db
123
+ .selectFrom("active_version")
124
+ .select("version_id")
125
+ .executeTakeFirstOrThrow();
126
+
127
+ expect(() =>
128
+ validateStateMutation({
129
+ engine: lix.engine!,
130
+ schema,
131
+ snapshot_content: snapshot.content,
132
+ operation: "insert",
133
+ version_id: activeVersion.version_id,
134
+ })
135
+ ).toThrowError();
136
+ });
137
+
138
+ test("throws when stored schema is missing", async () => {
139
+ const lix = await openLix({});
140
+
141
+ const schema = {
142
+ type: "object",
143
+ "x-lix-version": "1.0",
144
+ "x-lix-key": "missing_stored_schema_test",
145
+ properties: {
146
+ id: { type: "string" },
147
+ },
148
+ required: ["id"],
149
+ additionalProperties: false,
150
+ } as const satisfies LixSchemaDefinition;
151
+
152
+ const activeVersion = await lix.db
153
+ .selectFrom("active_version")
154
+ .select("version_id")
155
+ .executeTakeFirstOrThrow();
156
+
157
+ expect(() =>
158
+ validateStateMutation({
159
+ engine: lix.engine!,
160
+ schema,
161
+ snapshot_content: { id: "1" },
162
+ operation: "insert",
163
+ version_id: activeVersion.version_id,
164
+ })
165
+ ).toThrowError(/is not stored/i);
166
+ });
167
+
168
+ test("passes when primary key is unique", async () => {
169
+ const lix = await openLix({});
170
+
171
+ const schema = {
172
+ type: "object",
173
+ "x-lix-version": "1.0",
174
+ "x-lix-key": "user",
175
+ "x-lix-primary-key": ["/id"],
176
+ properties: {
177
+ id: { type: "string" },
178
+ name: { type: "string" },
179
+ },
180
+ required: ["id", "name"],
181
+ additionalProperties: false,
182
+ } as const satisfies LixSchemaDefinition;
183
+
184
+ const snapshot = {
185
+ content: {
186
+ id: "user1",
187
+ name: "John",
188
+ },
189
+ };
190
+
191
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
192
+
193
+ const activeVersion = await lix.db
194
+ .selectFrom("active_version")
195
+ .select("version_id")
196
+ .executeTakeFirstOrThrow();
197
+
198
+ expect(() =>
199
+ validateStateMutation({
200
+ engine: lix.engine!,
201
+ schema,
202
+ snapshot_content: snapshot.content,
203
+ operation: "insert",
204
+ version_id: activeVersion.version_id,
205
+ })
206
+ ).not.toThrowError();
207
+ });
208
+
209
+ test("throws when primary key violates uniqueness constraint", async () => {
210
+ const lix = await openLix({});
211
+
212
+ const schema = {
213
+ type: "object",
214
+ "x-lix-version": "1.0",
215
+ "x-lix-key": "user",
216
+ "x-lix-primary-key": ["/id"],
217
+ properties: {
218
+ id: { type: "string" },
219
+ name: { type: "string" },
220
+ },
221
+ required: ["id", "name"],
222
+ additionalProperties: false,
223
+ } as const satisfies LixSchemaDefinition;
224
+
225
+ // Store the schema first
226
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
227
+
228
+ // Insert first user into state
229
+ await lix.db
230
+ .insertInto("state_by_version")
231
+ .values({
232
+ entity_id: "user1",
233
+ file_id: "file1",
234
+ schema_key: "user",
235
+ plugin_key: "test_plugin",
236
+ version_id: lix.db.selectFrom("active_version").select("version_id"),
237
+ snapshot_content: { id: "user1", name: "John" },
238
+ schema_version: "1.0",
239
+ })
240
+ .execute();
241
+
242
+ // Try to insert another user with same primary key
243
+ const duplicateSnapshot = {
244
+ content: {
245
+ id: "user1",
246
+ name: "Jane",
247
+ },
248
+ };
249
+
250
+ const activeVersion = await lix.db
251
+ .selectFrom("active_version")
252
+ .select("version_id")
253
+ .executeTakeFirstOrThrow();
254
+
255
+ expect(() =>
256
+ validateStateMutation({
257
+ engine: lix.engine!,
258
+ schema,
259
+ snapshot_content: duplicateSnapshot.content,
260
+ operation: "insert",
261
+ version_id: activeVersion.version_id,
262
+ })
263
+ ).toThrowError("Primary key constraint violation");
264
+ });
265
+
266
+ test("primary key validation ignores inherited entities", async () => {
267
+ const lix = await openLix({
268
+ keyValues: [
269
+ {
270
+ key: "lix_deterministic_mode",
271
+ value: { enabled: true },
272
+ lixcol_version_id: "global",
273
+ },
274
+ ],
275
+ });
276
+
277
+ const schema = {
278
+ type: "object",
279
+ "x-lix-version": "1.0",
280
+ "x-lix-key": "pk_local_only",
281
+ "x-lix-primary-key": ["/key"],
282
+ properties: {
283
+ key: { type: "string" },
284
+ value: { type: "string" },
285
+ },
286
+ required: ["key", "value"],
287
+ additionalProperties: false,
288
+ } as const satisfies LixSchemaDefinition;
289
+
290
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
291
+
292
+ const parentVersion = await createVersion({ lix, id: "parent-version" });
293
+ const childVersion = await createVersion({
294
+ lix,
295
+ id: "child-version",
296
+ inheritsFrom: { id: parentVersion.id },
297
+ });
298
+
299
+ await lix.db
300
+ .insertInto("state_by_version")
301
+ .values({
302
+ entity_id: "entity-to-override",
303
+ schema_key: schema["x-lix-key"],
304
+ file_id: "lix",
305
+ plugin_key: "lix_sdk",
306
+ version_id: parentVersion.id,
307
+ snapshot_content: {
308
+ key: "entity-to-override",
309
+ value: "parent-value",
310
+ },
311
+ schema_version: schema["x-lix-version"],
312
+ untracked: false,
313
+ })
314
+ .execute();
315
+
316
+ expect(() =>
317
+ validateStateMutation({
318
+ engine: lix.engine!,
319
+ schema,
320
+ snapshot_content: {
321
+ key: "entity-to-override",
322
+ value: "child-value",
323
+ },
324
+ operation: "insert",
325
+ version_id: childVersion.id,
326
+ })
327
+ ).not.toThrow();
328
+ });
329
+
330
+ test("primary key validation is scoped per file", async () => {
331
+ const lix = await openLix({});
332
+
333
+ const schema = {
334
+ type: "object",
335
+ "x-lix-version": "1.0",
336
+ "x-lix-key": "pk_file_scope",
337
+ "x-lix-primary-key": ["/id"],
338
+ properties: {
339
+ id: { type: "string" },
340
+ name: { type: "string" },
341
+ },
342
+ required: ["id", "name"],
343
+ additionalProperties: false,
344
+ } as const satisfies LixSchemaDefinition;
345
+
346
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
347
+
348
+ const activeVersion = await lix.db
349
+ .selectFrom("active_version")
350
+ .select("version_id")
351
+ .executeTakeFirstOrThrow();
352
+
353
+ const fileAlpha = "alpha.md";
354
+ const fileBeta = "beta.md";
355
+
356
+ await lix.db
357
+ .insertInto("state_by_version")
358
+ .values({
359
+ entity_id: "duplicate-user",
360
+ schema_key: schema["x-lix-key"],
361
+ file_id: fileAlpha,
362
+ plugin_key: "test_plugin",
363
+ version_id: activeVersion.version_id,
364
+ snapshot_content: { id: "same-id", name: "Existing" },
365
+ schema_version: schema["x-lix-version"],
366
+ })
367
+ .execute();
368
+
369
+ const baseArgs = {
370
+ engine: lix.engine!,
371
+ schema,
372
+ snapshot_content: { id: "same-id", name: "New" },
373
+ operation: "insert" as const,
374
+ version_id: activeVersion.version_id,
375
+ };
376
+
377
+ expect(() =>
378
+ validateStateMutation({
379
+ ...baseArgs,
380
+ file_id: fileBeta,
381
+ })
382
+ ).not.toThrow();
383
+
384
+ expect(() =>
385
+ validateStateMutation({
386
+ ...baseArgs,
387
+ file_id: fileAlpha,
388
+ })
389
+ ).toThrowError("Primary key constraint violation");
390
+ });
391
+
392
+ test("unique validation ignores inherited entities", async () => {
393
+ const lix = await openLix({
394
+ keyValues: [
395
+ {
396
+ key: "lix_deterministic_mode",
397
+ value: { enabled: true },
398
+ lixcol_version_id: "global",
399
+ },
400
+ ],
401
+ });
402
+
403
+ const schema = {
404
+ type: "object",
405
+ "x-lix-version": "1.0",
406
+ "x-lix-key": "unique_local_only",
407
+ "x-lix-unique": [["/slug"]],
408
+ properties: {
409
+ id: { type: "string" },
410
+ slug: { type: "string" },
411
+ value: { type: "string" },
412
+ },
413
+ required: ["id", "slug", "value"],
414
+ additionalProperties: false,
415
+ } as const satisfies LixSchemaDefinition;
416
+
417
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
418
+
419
+ const parentVersion = await createVersion({ lix, id: "unique-parent" });
420
+ const childVersion = await createVersion({
421
+ lix,
422
+ id: "unique-child",
423
+ inheritsFrom: { id: parentVersion.id },
424
+ });
425
+
426
+ await lix.db
427
+ .insertInto("state_by_version")
428
+ .values({
429
+ entity_id: "unique-parent-entity",
430
+ schema_key: schema["x-lix-key"],
431
+ file_id: "lix",
432
+ plugin_key: "lix_own_entity",
433
+ version_id: parentVersion.id,
434
+ snapshot_content: {
435
+ id: "unique-parent-entity",
436
+ slug: "conflicting-slug",
437
+ value: "parent",
438
+ },
439
+ schema_version: schema["x-lix-version"],
440
+ untracked: false,
441
+ })
442
+ .execute();
443
+
444
+ expect(() =>
445
+ validateStateMutation({
446
+ engine: lix.engine!,
447
+ schema,
448
+ snapshot_content: {
449
+ id: "unique-child-entity",
450
+ slug: "conflicting-slug",
451
+ value: "child",
452
+ },
453
+ operation: "insert",
454
+ version_id: childVersion.id,
455
+ })
456
+ ).not.toThrow();
457
+ });
458
+
459
+ test("unique validation is scoped per file", async () => {
460
+ const lix = await openLix({});
461
+
462
+ const schema = {
463
+ type: "object",
464
+ "x-lix-version": "1.0",
465
+ "x-lix-key": "unique_file_scope",
466
+ "x-lix-unique": [["/slug"]],
467
+ properties: {
468
+ id: { type: "string" },
469
+ slug: { type: "string" },
470
+ value: { type: "string" },
471
+ },
472
+ required: ["id", "slug", "value"],
473
+ additionalProperties: false,
474
+ } as const satisfies LixSchemaDefinition;
475
+
476
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
477
+
478
+ const activeVersion = await lix.db
479
+ .selectFrom("active_version")
480
+ .select("version_id")
481
+ .executeTakeFirstOrThrow();
482
+
483
+ const fileAlpha = "alpha-file.md";
484
+ const fileBeta = "beta-file.md";
485
+
486
+ await lix.db
487
+ .insertInto("state_by_version")
488
+ .values({
489
+ entity_id: "unique-entity",
490
+ schema_key: schema["x-lix-key"],
491
+ file_id: fileAlpha,
492
+ plugin_key: "test_plugin",
493
+ version_id: activeVersion.version_id,
494
+ snapshot_content: {
495
+ id: "unique-entity",
496
+ slug: "shared-slug",
497
+ value: "existing",
498
+ },
499
+ schema_version: schema["x-lix-version"],
500
+ })
501
+ .execute();
502
+
503
+ const baseArgs = {
504
+ engine: lix.engine!,
505
+ schema,
506
+ snapshot_content: {
507
+ id: "other-entity",
508
+ slug: "shared-slug",
509
+ value: "new",
510
+ },
511
+ operation: "insert" as const,
512
+ version_id: activeVersion.version_id,
513
+ };
514
+
515
+ expect(() =>
516
+ validateStateMutation({
517
+ ...baseArgs,
518
+ file_id: fileBeta,
519
+ })
520
+ ).not.toThrow();
521
+
522
+ expect(() =>
523
+ validateStateMutation({
524
+ ...baseArgs,
525
+ file_id: fileAlpha,
526
+ })
527
+ ).toThrowError("Unique constraint violation");
528
+ });
529
+
530
+ test("immutable schemas reject repeated inserts", async () => {
531
+ const lix = await openLix({});
532
+
533
+ const schema: LixSchemaDefinition = {
534
+ "x-lix-key": "immutable_schema_test",
535
+ "x-lix-version": "1.0",
536
+ "x-lix-primary-key": ["/id"],
537
+ "x-lix-immutable": true,
538
+ type: "object",
539
+ properties: {
540
+ id: { type: "string" },
541
+ name: { type: "string" },
542
+ },
543
+ required: ["id", "name"],
544
+ additionalProperties: false,
545
+ } as const;
546
+
547
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
548
+
549
+ const activeVersion = await lix.db
550
+ .selectFrom("active_version")
551
+ .select("version_id")
552
+ .executeTakeFirstOrThrow();
553
+
554
+ expect(() =>
555
+ validateStateMutation({
556
+ engine: lix.engine!,
557
+ schema,
558
+ snapshot_content: { id: "1", name: "first" },
559
+ operation: "insert",
560
+ version_id: activeVersion.version_id,
561
+ })
562
+ ).not.toThrow();
563
+
564
+ await lix.db
565
+ .insertInto("state_by_version")
566
+ .values({
567
+ entity_id: "1",
568
+ schema_key: schema["x-lix-key"],
569
+ file_id: "lix",
570
+ plugin_key: "lix_sdk",
571
+ version_id: activeVersion.version_id,
572
+ snapshot_content: { id: "1", name: "first" },
573
+ schema_version: schema["x-lix-version"],
574
+ untracked: false,
575
+ })
576
+ .execute();
577
+
578
+ expect(() =>
579
+ validateStateMutation({
580
+ engine: lix.engine!,
581
+ schema,
582
+ snapshot_content: { id: "1", name: "second" },
583
+ operation: "insert",
584
+ version_id: activeVersion.version_id,
585
+ })
586
+ ).toThrow(/Primary key constraint violation/);
587
+
588
+ await lix.close();
589
+ });
590
+
591
+ test("state_by_version: inserting same PK twice in one transaction rejects duplicate", async () => {
592
+ const lix = await openLix({});
593
+
594
+ // Define a mock schema with PK on 'key'
595
+ const schema = {
596
+ type: "object",
597
+ "x-lix-version": "1.0",
598
+ "x-lix-key": "kv_mock_vtab",
599
+ "x-lix-primary-key": ["/key"],
600
+ properties: {
601
+ key: { type: "string" },
602
+ value: { type: "string" },
603
+ },
604
+ required: ["key", "value"],
605
+ additionalProperties: false,
606
+ } as const satisfies LixSchemaDefinition;
607
+
608
+ // Register schema
609
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
610
+
611
+ // Execute both inserts in a single DB transaction so that the duplicate PK is detected
612
+ await expect(
613
+ lix.db.transaction().execute(async (trx) => {
614
+ await trx
615
+ .insertInto("state_by_version")
616
+ .values({
617
+ entity_id: "kv_vtab1",
618
+ file_id: "lix",
619
+ schema_key: "kv_mock_vtab",
620
+ plugin_key: "lix_own_entity",
621
+ version_id: sql`(SELECT version_id FROM active_version)`,
622
+ snapshot_content: { key: "test", value: "A" },
623
+ schema_version: "1.0",
624
+ })
625
+ .execute();
626
+
627
+ await trx
628
+ .insertInto("state_by_version")
629
+ .values({
630
+ entity_id: "kv_vtab1",
631
+ file_id: "lix",
632
+ schema_key: "kv_mock_vtab",
633
+ plugin_key: "lix_own_entity",
634
+ version_id: sql`(SELECT version_id FROM active_version)`,
635
+ snapshot_content: { key: "test", value: "B" },
636
+ schema_version: "1.0",
637
+ })
638
+ .execute();
639
+ })
640
+ ).rejects.toThrow(/Primary key constraint violation/);
641
+
642
+ await lix.close();
643
+ });
644
+
645
+ test("handles composite primary keys", async () => {
646
+ const lix = await openLix({});
647
+
648
+ const schema = {
649
+ type: "object",
650
+ "x-lix-version": "1.0",
651
+ "x-lix-key": "user_role",
652
+ "x-lix-primary-key": ["/user_id", "/role_id"],
653
+ properties: {
654
+ user_id: { type: "string" },
655
+ role_id: { type: "string" },
656
+ assigned_date: { type: "string" },
657
+ },
658
+ required: ["user_id", "role_id", "assigned_date"],
659
+ additionalProperties: false,
660
+ } as const satisfies LixSchemaDefinition;
661
+
662
+ // Store the schema first
663
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
664
+
665
+ // Insert first user-role into state
666
+ await lix.db
667
+ .insertInto("state_by_version")
668
+ .values({
669
+ entity_id: "user_role1",
670
+ file_id: "file1",
671
+ schema_key: "user_role",
672
+ plugin_key: "test_plugin",
673
+ version_id: lix.db.selectFrom("active_version").select("version_id"),
674
+ snapshot_content: {
675
+ user_id: "user1",
676
+ role_id: "admin",
677
+ assigned_date: "2024-01-01",
678
+ },
679
+ schema_version: "1.0",
680
+ })
681
+ .execute();
682
+
683
+ const activeVersion = await lix.db
684
+ .selectFrom("active_version")
685
+ .select("version_id")
686
+ .executeTakeFirstOrThrow();
687
+
688
+ // This should pass (different composite key)
689
+ expect(() =>
690
+ validateStateMutation({
691
+ engine: lix.engine!,
692
+ schema,
693
+ snapshot_content: {
694
+ user_id: "user1",
695
+ role_id: "editor",
696
+ assigned_date: "2024-01-02",
697
+ },
698
+ operation: "insert",
699
+ version_id: activeVersion.version_id,
700
+ })
701
+ ).not.toThrowError();
702
+
703
+ // This should fail (same composite key)
704
+ expect(() =>
705
+ validateStateMutation({
706
+ engine: lix.engine!,
707
+ schema,
708
+ snapshot_content: {
709
+ user_id: "user1",
710
+ role_id: "admin",
711
+ assigned_date: "2024-01-03",
712
+ },
713
+ operation: "insert",
714
+ version_id: activeVersion.version_id,
715
+ })
716
+ ).toThrowError("Primary key constraint violation");
717
+ });
718
+
719
+ test("passes when unique constraint is satisfied", async () => {
720
+ const lix = await openLix({});
721
+
722
+ const activeVersion = await lix.db
723
+ .selectFrom("active_version")
724
+ .select("version_id")
725
+ .executeTakeFirstOrThrow();
726
+
727
+ const schema = {
728
+ type: "object",
729
+ "x-lix-version": "1.0",
730
+ "x-lix-key": "user",
731
+ "x-lix-primary-key": ["/id"],
732
+ "x-lix-unique": [["/email"], ["/username"]],
733
+ properties: {
734
+ id: { type: "string" },
735
+ email: { type: "string" },
736
+ username: { type: "string" },
737
+ name: { type: "string" },
738
+ },
739
+ required: ["id", "email", "username", "name"],
740
+ additionalProperties: false,
741
+ } as const satisfies LixSchemaDefinition;
742
+
743
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
744
+
745
+ const snapshot = {
746
+ content: {
747
+ id: "user1",
748
+ email: "john@example.com",
749
+ username: "john_doe",
750
+ name: "John Doe",
751
+ },
752
+ };
753
+
754
+ expect(() =>
755
+ validateStateMutation({
756
+ engine: lix.engine!,
757
+ schema,
758
+ snapshot_content: snapshot.content,
759
+ version_id: activeVersion.version_id,
760
+ operation: "insert",
761
+ })
762
+ ).not.toThrowError();
763
+ });
764
+
765
+ test("throws when single field unique constraint is violated", async () => {
766
+ const lix = await openLix({});
767
+
768
+ const schema = {
769
+ type: "object",
770
+ "x-lix-version": "1.0",
771
+ "x-lix-key": "user",
772
+ "x-lix-primary-key": ["/id"],
773
+ "x-lix-unique": [["/email"], ["/username"]],
774
+ properties: {
775
+ id: { type: "string" },
776
+ email: { type: "string" },
777
+ username: { type: "string" },
778
+ name: { type: "string" },
779
+ },
780
+ required: ["id", "email", "username", "name"],
781
+ additionalProperties: false,
782
+ } as const satisfies LixSchemaDefinition;
783
+
784
+ // Store the schema first
785
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
786
+
787
+ // Insert first user into state
788
+ await lix.db
789
+ .insertInto("state_by_version")
790
+ .values({
791
+ entity_id: "user1",
792
+ file_id: "file1",
793
+ schema_key: "user",
794
+ plugin_key: "test_plugin",
795
+ version_id: lix.db.selectFrom("active_version").select("version_id"),
796
+ snapshot_content: {
797
+ id: "user1",
798
+ email: "john@example.com",
799
+ username: "john_doe",
800
+ name: "John Doe",
801
+ },
802
+ schema_version: "1.0",
803
+ })
804
+ .execute();
805
+
806
+ // Try to insert another user with same email (unique constraint violation)
807
+ const duplicateEmailSnapshot = {
808
+ content: {
809
+ id: "user2",
810
+ email: "john@example.com", // Same email
811
+ username: "jane_doe",
812
+ name: "Jane Doe",
813
+ },
814
+ };
815
+
816
+ const activeVersion = await lix.db
817
+ .selectFrom("active_version")
818
+ .select("version_id")
819
+ .executeTakeFirstOrThrow();
820
+
821
+ expect(() =>
822
+ validateStateMutation({
823
+ engine: lix.engine!,
824
+ schema,
825
+ snapshot_content: duplicateEmailSnapshot.content,
826
+ operation: "insert",
827
+ version_id: activeVersion.version_id,
828
+ })
829
+ ).toThrowError("Unique constraint violation");
830
+
831
+ // Try to insert another user with same username (unique constraint violation)
832
+ const duplicateUsernameSnapshot = {
833
+ content: {
834
+ id: "user3",
835
+ email: "jane@example.com",
836
+ username: "john_doe", // Same username
837
+ name: "Jane Smith",
838
+ },
839
+ };
840
+
841
+ expect(() =>
842
+ validateStateMutation({
843
+ engine: lix.engine!,
844
+ schema,
845
+ snapshot_content: duplicateUsernameSnapshot.content,
846
+ operation: "insert",
847
+ version_id: activeVersion.version_id,
848
+ })
849
+ ).toThrowError("Unique constraint violation");
850
+ });
851
+
852
+ test("handles composite unique constraints", async () => {
853
+ const lix = await openLix({});
854
+
855
+ const schema = {
856
+ type: "object",
857
+ "x-lix-version": "1.0",
858
+ "x-lix-key": "product",
859
+ "x-lix-primary-key": ["/id"],
860
+ "x-lix-unique": [
861
+ ["/category", "/name"], // Composite unique constraint
862
+ ["/sku"], // Single field unique constraint
863
+ ],
864
+ properties: {
865
+ id: { type: "string" },
866
+ category: { type: "string" },
867
+ name: { type: "string" },
868
+ sku: { type: "string" },
869
+ price: { type: "number" },
870
+ },
871
+ required: ["id", "category", "name", "sku", "price"],
872
+ additionalProperties: false,
873
+ } as const satisfies LixSchemaDefinition;
874
+
875
+ // Store the schema first
876
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
877
+
878
+ // Insert first product into state
879
+ await lix.db
880
+ .insertInto("state_by_version")
881
+ .values({
882
+ entity_id: "product1",
883
+ file_id: "file1",
884
+ schema_key: "product",
885
+ plugin_key: "test_plugin",
886
+ version_id: lix.db.selectFrom("active_version").select("version_id"),
887
+ snapshot_content: {
888
+ id: "product1",
889
+ category: "electronics",
890
+ name: "Laptop",
891
+ sku: "ELEC-LAP-001",
892
+ price: 999.99,
893
+ },
894
+ schema_version: "1.0",
895
+ })
896
+ .execute();
897
+
898
+ const activeVersion = await lix.db
899
+ .selectFrom("active_version")
900
+ .select("version_id")
901
+ .executeTakeFirstOrThrow();
902
+
903
+ // This should pass (different composite unique key)
904
+ expect(() =>
905
+ validateStateMutation({
906
+ engine: lix.engine!,
907
+ schema,
908
+ snapshot_content: {
909
+ id: "product2",
910
+ category: "electronics",
911
+ name: "Desktop", // Different name in same category
912
+ sku: "ELEC-DES-001",
913
+ price: 1299.99,
914
+ },
915
+ operation: "insert",
916
+ version_id: activeVersion.version_id,
917
+ })
918
+ ).not.toThrowError();
919
+
920
+ // This should pass (same name in different category)
921
+ expect(() =>
922
+ validateStateMutation({
923
+ engine: lix.engine!,
924
+ schema,
925
+ snapshot_content: {
926
+ id: "product3",
927
+ category: "furniture", // Different category
928
+ name: "Laptop", // Same name but different category
929
+ sku: "FURN-LAP-001",
930
+ price: 599.99,
931
+ },
932
+ operation: "insert",
933
+ version_id: activeVersion.version_id,
934
+ })
935
+ ).not.toThrowError();
936
+
937
+ // This should fail (same composite unique key: category + name)
938
+ expect(() =>
939
+ validateStateMutation({
940
+ engine: lix.engine!,
941
+ schema,
942
+ snapshot_content: {
943
+ id: "product4",
944
+ category: "electronics",
945
+ name: "Laptop", // Same category + name combination
946
+ sku: "ELEC-LAP-002",
947
+ price: 899.99,
948
+ },
949
+ operation: "insert",
950
+ version_id: activeVersion.version_id,
951
+ })
952
+ ).toThrowError("Unique constraint violation");
953
+
954
+ // This should fail (same SKU)
955
+ expect(() =>
956
+ validateStateMutation({
957
+ engine: lix.engine!,
958
+ schema,
959
+ snapshot_content: {
960
+ id: "product5",
961
+ category: "accessories",
962
+ name: "Mouse",
963
+ sku: "ELEC-LAP-001", // Same SKU
964
+ price: 29.99,
965
+ },
966
+ operation: "insert",
967
+ version_id: activeVersion.version_id,
968
+ })
969
+ ).toThrowError("Unique constraint violation");
970
+ });
971
+
972
+ test("passes when foreign key references exist", async () => {
973
+ const lix = await openLix({});
974
+
975
+ const userSchema = {
976
+ type: "object",
977
+ "x-lix-version": "1.0",
978
+ "x-lix-key": "user",
979
+ "x-lix-primary-key": ["/id"],
980
+ properties: {
981
+ id: { type: "string" },
982
+ name: { type: "string" },
983
+ },
984
+ required: ["id", "name"],
985
+ additionalProperties: false,
986
+ } as const satisfies LixSchemaDefinition;
987
+
988
+ const postSchema = {
989
+ type: "object",
990
+ "x-lix-version": "1.0",
991
+ "x-lix-key": "post",
992
+ "x-lix-primary-key": ["/id"],
993
+ "x-lix-foreign-keys": [
994
+ {
995
+ properties: ["/author_id"],
996
+ references: {
997
+ schemaKey: "user",
998
+ properties: ["/id"],
999
+ },
1000
+ },
1001
+ ],
1002
+ properties: {
1003
+ id: { type: "string" },
1004
+ author_id: { type: "string" },
1005
+ title: { type: "string" },
1006
+ },
1007
+ required: ["id", "author_id", "title"],
1008
+ additionalProperties: false,
1009
+ } as const satisfies LixSchemaDefinition;
1010
+
1011
+ // Store schemas
1012
+ await lix.db
1013
+ .insertInto("stored_schema")
1014
+ .values([{ value: userSchema }, { value: postSchema }])
1015
+ .execute();
1016
+
1017
+ // Insert a user that will be referenced
1018
+ await lix.db
1019
+ .insertInto("state_by_version")
1020
+ .values({
1021
+ entity_id: "user1",
1022
+ file_id: "file1",
1023
+ schema_key: "user",
1024
+ plugin_key: "test_plugin",
1025
+ version_id: lix.db.selectFrom("active_version").select("version_id"),
1026
+ snapshot_content: {
1027
+ id: "user1",
1028
+ name: "John Doe",
1029
+ },
1030
+ schema_version: "1.0",
1031
+ })
1032
+ .execute();
1033
+
1034
+ const activeVersion = await lix.db
1035
+ .selectFrom("active_version")
1036
+ .select("version_id")
1037
+ .executeTakeFirstOrThrow();
1038
+
1039
+ // This should pass - foreign key reference exists
1040
+ expect(() =>
1041
+ validateStateMutation({
1042
+ engine: lix.engine!,
1043
+ schema: postSchema,
1044
+ snapshot_content: {
1045
+ id: "post1",
1046
+ author_id: "user1",
1047
+ title: "My First Post",
1048
+ },
1049
+ operation: "insert",
1050
+ version_id: activeVersion.version_id,
1051
+ })
1052
+ ).not.toThrowError();
1053
+ });
1054
+
1055
+ test("foreign key validation is scoped per file", async () => {
1056
+ const lix = await openLix({});
1057
+
1058
+ const fileSchema = {
1059
+ type: "object",
1060
+ "x-lix-version": "1.0",
1061
+ "x-lix-key": "file_record",
1062
+ "x-lix-primary-key": ["/id"],
1063
+ properties: {
1064
+ id: { type: "string" },
1065
+ path: { type: "string" },
1066
+ },
1067
+ required: ["id", "path"],
1068
+ additionalProperties: false,
1069
+ } as const satisfies LixSchemaDefinition;
1070
+
1071
+ const annotationSchema = {
1072
+ type: "object",
1073
+ "x-lix-version": "1.0",
1074
+ "x-lix-key": "file_annotation",
1075
+ "x-lix-primary-key": ["/id"],
1076
+ "x-lix-foreign-keys": [
1077
+ {
1078
+ properties: ["/file_ref"],
1079
+ references: {
1080
+ schemaKey: fileSchema["x-lix-key"],
1081
+ properties: ["/id"],
1082
+ },
1083
+ },
1084
+ ],
1085
+ properties: {
1086
+ id: { type: "string" },
1087
+ file_ref: { type: "string" },
1088
+ body: { type: "string" },
1089
+ },
1090
+ required: ["id", "file_ref", "body"],
1091
+ additionalProperties: false,
1092
+ } as const satisfies LixSchemaDefinition;
1093
+
1094
+ await lix.db
1095
+ .insertInto("stored_schema")
1096
+ .values([{ value: fileSchema }, { value: annotationSchema }])
1097
+ .execute();
1098
+
1099
+ const activeVersion = await lix.db
1100
+ .selectFrom("active_version")
1101
+ .select("version_id")
1102
+ .executeTakeFirstOrThrow();
1103
+
1104
+ const fileAlpha = "alpha.md";
1105
+ const fileBeta = "beta.md";
1106
+
1107
+ await lix.db
1108
+ .insertInto("state_by_version")
1109
+ .values({
1110
+ entity_id: "file-alpha",
1111
+ schema_key: fileSchema["x-lix-key"],
1112
+ file_id: fileAlpha,
1113
+ plugin_key: "test_plugin",
1114
+ version_id: activeVersion.version_id,
1115
+ snapshot_content: { id: "file-alpha", path: fileAlpha },
1116
+ schema_version: fileSchema["x-lix-version"],
1117
+ })
1118
+ .execute();
1119
+
1120
+ const baseArgs = {
1121
+ engine: lix.engine!,
1122
+ schema: annotationSchema,
1123
+ snapshot_content: {
1124
+ id: "annotation-alpha",
1125
+ file_ref: "file-alpha",
1126
+ body: "Scoped reference",
1127
+ },
1128
+ operation: "insert" as const,
1129
+ version_id: activeVersion.version_id,
1130
+ };
1131
+
1132
+ expect(() =>
1133
+ validateStateMutation({
1134
+ ...baseArgs,
1135
+ file_id: fileAlpha,
1136
+ })
1137
+ ).not.toThrow();
1138
+
1139
+ expect(() =>
1140
+ validateStateMutation({
1141
+ ...baseArgs,
1142
+ file_id: fileBeta,
1143
+ })
1144
+ ).toThrowError("Foreign key constraint violation");
1145
+ });
1146
+
1147
+ test("throws when foreign key reference does not exist", async () => {
1148
+ const lix = await openLix({});
1149
+
1150
+ const userSchema = {
1151
+ type: "object",
1152
+ "x-lix-version": "1.0",
1153
+ "x-lix-key": "user",
1154
+ "x-lix-primary-key": ["/id"],
1155
+ properties: {
1156
+ id: { type: "string" },
1157
+ name: { type: "string" },
1158
+ },
1159
+ required: ["id", "name"],
1160
+ additionalProperties: false,
1161
+ } as const satisfies LixSchemaDefinition;
1162
+
1163
+ const postSchema = {
1164
+ type: "object",
1165
+ "x-lix-version": "1.0",
1166
+ "x-lix-key": "post",
1167
+ "x-lix-primary-key": ["/id"],
1168
+ "x-lix-foreign-keys": [
1169
+ {
1170
+ properties: ["/author_id"],
1171
+ references: {
1172
+ schemaKey: "user",
1173
+ properties: ["/id"],
1174
+ },
1175
+ },
1176
+ ],
1177
+ properties: {
1178
+ id: { type: "string" },
1179
+ author_id: { type: "string" },
1180
+ title: { type: "string" },
1181
+ },
1182
+ required: ["id", "author_id", "title"],
1183
+ additionalProperties: false,
1184
+ } as const satisfies LixSchemaDefinition;
1185
+
1186
+ // Store schemas
1187
+ await lix.db
1188
+ .insertInto("stored_schema")
1189
+ .values([{ value: userSchema }, { value: postSchema }])
1190
+ .execute();
1191
+
1192
+ const activeVersion = await lix.db
1193
+ .selectFrom("active_version")
1194
+ .select("version_id")
1195
+ .executeTakeFirstOrThrow();
1196
+
1197
+ // This should fail - foreign key reference does not exist
1198
+ expect(() =>
1199
+ validateStateMutation({
1200
+ engine: lix.engine!,
1201
+ schema: postSchema,
1202
+ snapshot_content: {
1203
+ id: "post1",
1204
+ author_id: "nonexistent_user",
1205
+ title: "My First Post",
1206
+ },
1207
+ operation: "insert",
1208
+ version_id: activeVersion.version_id,
1209
+ })
1210
+ ).toThrowError("Foreign key constraint violation");
1211
+ });
1212
+
1213
+ test("handles multiple foreign keys", async () => {
1214
+ const lix = await openLix({});
1215
+
1216
+ const userSchema = {
1217
+ type: "object",
1218
+ "x-lix-version": "1.0",
1219
+ "x-lix-key": "user",
1220
+ "x-lix-primary-key": ["/id"],
1221
+ properties: {
1222
+ id: { type: "string" },
1223
+ name: { type: "string" },
1224
+ },
1225
+ required: ["id", "name"],
1226
+ additionalProperties: false,
1227
+ } as const satisfies LixSchemaDefinition;
1228
+
1229
+ const categorySchema = {
1230
+ type: "object",
1231
+ "x-lix-version": "1.0",
1232
+ "x-lix-key": "category",
1233
+ "x-lix-primary-key": ["/id"],
1234
+ properties: {
1235
+ id: { type: "string" },
1236
+ name: { type: "string" },
1237
+ },
1238
+ required: ["id", "name"],
1239
+ additionalProperties: false,
1240
+ } as const satisfies LixSchemaDefinition;
1241
+
1242
+ const postSchema = {
1243
+ type: "object",
1244
+ "x-lix-version": "1.0",
1245
+ "x-lix-key": "post",
1246
+ "x-lix-primary-key": ["/id"],
1247
+ "x-lix-foreign-keys": [
1248
+ {
1249
+ properties: ["/author_id"],
1250
+ references: {
1251
+ schemaKey: "user",
1252
+ properties: ["/id"],
1253
+ },
1254
+ },
1255
+ {
1256
+ properties: ["/category_id"],
1257
+ references: {
1258
+ schemaKey: "category",
1259
+ properties: ["/id"],
1260
+ },
1261
+ },
1262
+ ],
1263
+ properties: {
1264
+ id: { type: "string" },
1265
+ author_id: { type: "string" },
1266
+ category_id: { type: "string" },
1267
+ title: { type: "string" },
1268
+ },
1269
+ required: ["id", "author_id", "category_id", "title"],
1270
+ additionalProperties: false,
1271
+ } as const satisfies LixSchemaDefinition;
1272
+
1273
+ // Store schemas
1274
+ await lix.db
1275
+ .insertInto("stored_schema")
1276
+ .values([
1277
+ { value: userSchema },
1278
+ { value: categorySchema },
1279
+ { value: postSchema },
1280
+ ])
1281
+ .execute();
1282
+
1283
+ // Insert referenced entities
1284
+ await lix.db
1285
+ .insertInto("state_by_version")
1286
+ .values([
1287
+ {
1288
+ entity_id: "user1",
1289
+ file_id: "file1",
1290
+ schema_key: "user",
1291
+ plugin_key: "test_plugin",
1292
+ version_id: lix.db.selectFrom("active_version").select("version_id"),
1293
+ snapshot_content: {
1294
+ id: "user1",
1295
+ name: "John Doe",
1296
+ },
1297
+ schema_version: "1.0",
1298
+ },
1299
+ {
1300
+ entity_id: "category1",
1301
+ file_id: "file1",
1302
+ schema_key: "category",
1303
+ plugin_key: "test_plugin",
1304
+ version_id: lix.db.selectFrom("active_version").select("version_id"),
1305
+ snapshot_content: {
1306
+ id: "category1",
1307
+ name: "Technology",
1308
+ },
1309
+ schema_version: "1.0",
1310
+ },
1311
+ ])
1312
+ .execute();
1313
+
1314
+ const activeVersion = await lix.db
1315
+ .selectFrom("active_version")
1316
+ .select("version_id")
1317
+ .executeTakeFirstOrThrow();
1318
+
1319
+ // This should pass - all foreign key references exist
1320
+ expect(() =>
1321
+ validateStateMutation({
1322
+ engine: lix.engine!,
1323
+ schema: postSchema,
1324
+ snapshot_content: {
1325
+ id: "post1",
1326
+ author_id: "user1",
1327
+ category_id: "category1",
1328
+ title: "My Tech Post",
1329
+ },
1330
+ operation: "insert",
1331
+ version_id: activeVersion.version_id,
1332
+ })
1333
+ ).not.toThrowError();
1334
+
1335
+ // This should fail - category reference does not exist
1336
+ expect(() =>
1337
+ validateStateMutation({
1338
+ engine: lix.engine!,
1339
+ schema: postSchema,
1340
+ snapshot_content: {
1341
+ id: "post2",
1342
+ author_id: "user1",
1343
+ category_id: "nonexistent_category",
1344
+ title: "Another Post",
1345
+ },
1346
+ operation: "insert",
1347
+ version_id: activeVersion.version_id,
1348
+ })
1349
+ ).toThrowError("Foreign key constraint violation");
1350
+ });
1351
+
1352
+ test("allows null foreign key values", async () => {
1353
+ const lix = await openLix({});
1354
+
1355
+ const userSchema = {
1356
+ type: "object",
1357
+ "x-lix-version": "1.0",
1358
+ "x-lix-key": "user",
1359
+ "x-lix-primary-key": ["/id"],
1360
+ properties: {
1361
+ id: { type: "string" },
1362
+ name: { type: "string" },
1363
+ },
1364
+ required: ["id", "name"],
1365
+ additionalProperties: false,
1366
+ } as const satisfies LixSchemaDefinition;
1367
+
1368
+ const postSchema = {
1369
+ type: "object",
1370
+ "x-lix-version": "1.0",
1371
+ "x-lix-key": "post",
1372
+ "x-lix-primary-key": ["/id"],
1373
+ "x-lix-foreign-keys": [
1374
+ {
1375
+ properties: ["/author_id"],
1376
+ references: {
1377
+ schemaKey: "user",
1378
+ properties: ["/id"],
1379
+ },
1380
+ },
1381
+ ],
1382
+ properties: {
1383
+ id: { type: "string" },
1384
+ author_id: { type: ["string", "null"] },
1385
+ title: { type: "string" },
1386
+ },
1387
+ required: ["id", "title"],
1388
+ additionalProperties: false,
1389
+ } as const satisfies LixSchemaDefinition;
1390
+
1391
+ // Store schemas
1392
+ await lix.db
1393
+ .insertInto("stored_schema")
1394
+ .values([{ value: userSchema }, { value: postSchema }])
1395
+ .execute();
1396
+
1397
+ const activeVersion = await lix.db
1398
+ .selectFrom("active_version")
1399
+ .select("version_id")
1400
+ .executeTakeFirstOrThrow();
1401
+
1402
+ // This should pass - null foreign key is allowed
1403
+ expect(() =>
1404
+ validateStateMutation({
1405
+ engine: lix.engine!,
1406
+ schema: postSchema,
1407
+ snapshot_content: {
1408
+ id: "post1",
1409
+ author_id: null,
1410
+ title: "Anonymous Post",
1411
+ },
1412
+ operation: "insert",
1413
+ version_id: activeVersion.version_id,
1414
+ })
1415
+ ).not.toThrowError();
1416
+
1417
+ // This should also pass - undefined foreign key (when not required)
1418
+ expect(() =>
1419
+ validateStateMutation({
1420
+ engine: lix.engine!,
1421
+ schema: postSchema,
1422
+ snapshot_content: {
1423
+ id: "post2",
1424
+ title: "Another Anonymous Post",
1425
+ },
1426
+ operation: "insert",
1427
+ version_id: activeVersion.version_id,
1428
+ })
1429
+ ).not.toThrowError();
1430
+ });
1431
+
1432
+ test("handles composite foreign keys", async () => {
1433
+ const lix = await openLix({});
1434
+
1435
+ // Create a schema that uses composite primary key
1436
+ const addressSchema = {
1437
+ type: "object",
1438
+ "x-lix-version": "1.0",
1439
+ "x-lix-key": "address",
1440
+ "x-lix-primary-key": ["/country", "/postal_code", "/street"],
1441
+ properties: {
1442
+ country: { type: "string" },
1443
+ postal_code: { type: "string" },
1444
+ street: { type: "string" },
1445
+ city: { type: "string" },
1446
+ },
1447
+ required: ["country", "postal_code", "street", "city"],
1448
+ additionalProperties: false,
1449
+ } as const satisfies LixSchemaDefinition;
1450
+
1451
+ // Create a schema that references the composite key
1452
+ const deliverySchema = {
1453
+ type: "object",
1454
+ "x-lix-version": "1.0",
1455
+ "x-lix-key": "delivery",
1456
+ "x-lix-primary-key": ["/id"],
1457
+ "x-lix-foreign-keys": [
1458
+ {
1459
+ properties: ["/address_country", "/address_postal", "/address_street"],
1460
+ references: {
1461
+ schemaKey: "address",
1462
+ properties: ["/country", "/postal_code", "/street"],
1463
+ },
1464
+ },
1465
+ ],
1466
+ properties: {
1467
+ id: { type: "string" },
1468
+ address_country: { type: "string" },
1469
+ address_postal: { type: "string" },
1470
+ address_street: { type: "string" },
1471
+ package_id: { type: "string" },
1472
+ },
1473
+ required: [
1474
+ "id",
1475
+ "address_country",
1476
+ "address_postal",
1477
+ "address_street",
1478
+ "package_id",
1479
+ ],
1480
+ additionalProperties: false,
1481
+ } as const satisfies LixSchemaDefinition;
1482
+
1483
+ // Store schemas
1484
+ await lix.db
1485
+ .insertInto("stored_schema")
1486
+ .values([{ value: addressSchema }, { value: deliverySchema }])
1487
+ .execute();
1488
+
1489
+ // Insert an address that will be referenced
1490
+ await lix.db
1491
+ .insertInto("state_by_version")
1492
+ .values({
1493
+ entity_id: "addr1",
1494
+ file_id: "file1",
1495
+ schema_key: "address",
1496
+ plugin_key: "test_plugin",
1497
+ version_id: lix.db.selectFrom("active_version").select("version_id"),
1498
+ snapshot_content: {
1499
+ country: "USA",
1500
+ postal_code: "12345",
1501
+ street: "123 Main St",
1502
+ city: "Springfield",
1503
+ },
1504
+ schema_version: "1.0",
1505
+ })
1506
+ .execute();
1507
+
1508
+ const activeVersion = await lix.db
1509
+ .selectFrom("active_version")
1510
+ .select("version_id")
1511
+ .executeTakeFirstOrThrow();
1512
+
1513
+ // This should pass - composite foreign key reference exists
1514
+ expect(() =>
1515
+ validateStateMutation({
1516
+ engine: lix.engine!,
1517
+ schema: deliverySchema,
1518
+ snapshot_content: {
1519
+ id: "delivery1",
1520
+ address_country: "USA",
1521
+ address_postal: "12345",
1522
+ address_street: "123 Main St",
1523
+ package_id: "pkg123",
1524
+ },
1525
+ operation: "insert",
1526
+ version_id: activeVersion.version_id,
1527
+ })
1528
+ ).not.toThrowError();
1529
+
1530
+ // This should fail - composite foreign key reference doesn't exist (wrong postal code)
1531
+ expect(() =>
1532
+ validateStateMutation({
1533
+ engine: lix.engine!,
1534
+ schema: deliverySchema,
1535
+ snapshot_content: {
1536
+ id: "delivery2",
1537
+ address_country: "USA",
1538
+ address_postal: "54321", // Wrong postal code
1539
+ address_street: "123 Main St",
1540
+ package_id: "pkg456",
1541
+ },
1542
+ operation: "insert",
1543
+ version_id: activeVersion.version_id,
1544
+ })
1545
+ ).toThrowError(
1546
+ /Foreign key constraint violation.*\/address_country, \/address_postal, \/address_street.*referencing.*address.*\/country, \/postal_code, \/street/
1547
+ );
1548
+ });
1549
+
1550
+ test("foreign key referencing real SQL table (change.id)", async () => {
1551
+ const lix = await openLix({});
1552
+
1553
+ // Insert a real change record into the change table
1554
+ await lix.db
1555
+ // @ts-expect-error - lix_internal_snapshot is not a public table
1556
+ .insertInto("lix_internal_snapshot")
1557
+ .values({
1558
+ id: "snap1",
1559
+ content: sql`jsonb(${JSON.stringify({ id: "entity1" })})`,
1560
+ })
1561
+ .execute();
1562
+
1563
+ await lix.db
1564
+ // @ts-expect-error - lix_internal_change is not a public table
1565
+ .insertInto("lix_internal_change")
1566
+ .values({
1567
+ id: "change1",
1568
+ entity_id: "entity1",
1569
+ plugin_key: "test_plugin",
1570
+ schema_key: "test_schema",
1571
+ schema_version: "1.0",
1572
+ file_id: "file1",
1573
+ snapshot_id: "snap1",
1574
+ })
1575
+ .execute();
1576
+
1577
+ const changeSetElementSchema = {
1578
+ type: "object",
1579
+ "x-lix-version": "1.0",
1580
+ "x-lix-key": "change_set_element_test",
1581
+ "x-lix-foreign-keys": [
1582
+ {
1583
+ properties: ["/change_id"],
1584
+ references: {
1585
+ schemaKey: "lix_change",
1586
+ properties: ["/id"],
1587
+ },
1588
+ },
1589
+ ],
1590
+ properties: {
1591
+ id: { type: "string" },
1592
+ change_id: { type: "string" },
1593
+ },
1594
+ required: ["id", "change_id"],
1595
+ additionalProperties: false,
1596
+ } as const satisfies LixSchemaDefinition;
1597
+
1598
+ await lix.db
1599
+ .insertInto("stored_schema")
1600
+ .values({ value: changeSetElementSchema })
1601
+ .execute();
1602
+
1603
+ const activeVersion = await lix.db
1604
+ .selectFrom("active_version")
1605
+ .select("version_id")
1606
+ .executeTakeFirstOrThrow();
1607
+
1608
+ // This should pass - foreign key references existing change record
1609
+ expect(() =>
1610
+ validateStateMutation({
1611
+ engine: lix.engine!,
1612
+ schema: changeSetElementSchema,
1613
+ snapshot_content: {
1614
+ id: "element1",
1615
+ change_id: "change1",
1616
+ },
1617
+ operation: "insert",
1618
+ version_id: activeVersion.version_id,
1619
+ })
1620
+ ).not.toThrowError();
1621
+
1622
+ // This should fail - foreign key references non-existent change
1623
+ expect(() =>
1624
+ validateStateMutation({
1625
+ engine: lix.engine!,
1626
+ schema: changeSetElementSchema,
1627
+ snapshot_content: {
1628
+ id: "element2",
1629
+ change_id: "nonexistent_change",
1630
+ },
1631
+ operation: "insert",
1632
+ version_id: activeVersion.version_id,
1633
+ })
1634
+ ).toThrowError("Foreign key constraint violation");
1635
+ });
1636
+
1637
+ test("allows updates with same primary key", async () => {
1638
+ const lix = await openLix({});
1639
+
1640
+ const activeVersion = await lix.db
1641
+ .selectFrom("active_version")
1642
+ .select("version_id")
1643
+ .executeTakeFirstOrThrow();
1644
+
1645
+ const schema = {
1646
+ type: "object",
1647
+ "x-lix-version": "1.0",
1648
+ "x-lix-key": "user",
1649
+ "x-lix-primary-key": ["/id"],
1650
+ properties: {
1651
+ id: { type: "string" },
1652
+ name: { type: "string" },
1653
+ },
1654
+ required: ["id", "name"],
1655
+ additionalProperties: false,
1656
+ } as const satisfies LixSchemaDefinition;
1657
+
1658
+ // Store the schema first
1659
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
1660
+
1661
+ // Insert initial user
1662
+ await lix.db
1663
+ .insertInto("state_by_version")
1664
+ .values({
1665
+ entity_id: "user1",
1666
+ file_id: "file1",
1667
+ schema_key: "user",
1668
+ plugin_key: "test_plugin",
1669
+ version_id: lix.db.selectFrom("active_version").select("version_id"),
1670
+ snapshot_content: { id: "user1", name: "John Doe" },
1671
+ schema_version: "1.0",
1672
+ })
1673
+ .execute();
1674
+
1675
+ // This should pass - updating existing record with same primary key
1676
+ expect(() =>
1677
+ validateStateMutation({
1678
+ engine: lix.engine!,
1679
+ schema,
1680
+ snapshot_content: {
1681
+ id: "user1", // Same primary key
1682
+ name: "John Smith", // Different data
1683
+ },
1684
+ operation: "update",
1685
+ entity_id: "user1",
1686
+ version_id: activeVersion.version_id,
1687
+ })
1688
+ ).not.toThrowError();
1689
+ });
1690
+
1691
+ test("unique constraints are validated per version, not globally", async () => {
1692
+ const lix = await openLix({});
1693
+
1694
+ const schema = {
1695
+ type: "object",
1696
+ "x-lix-version": "1.0",
1697
+ "x-lix-key": "file",
1698
+ "x-lix-primary-key": ["/id"],
1699
+ "x-lix-unique": [["/path"]], // Unique path constraint
1700
+ properties: {
1701
+ id: { type: "string" },
1702
+ path: { type: "string" },
1703
+ content: { type: "string" },
1704
+ },
1705
+ required: ["id", "path", "content"],
1706
+ additionalProperties: false,
1707
+ } as const satisfies LixSchemaDefinition;
1708
+
1709
+ // Store the schema first
1710
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
1711
+
1712
+ // Create two different versions
1713
+ await createVersion({
1714
+ lix,
1715
+ id: "version0",
1716
+ });
1717
+
1718
+ await createVersion({
1719
+ lix,
1720
+ id: "version1",
1721
+ });
1722
+ // Insert file with path "/app.js" in version1
1723
+ await lix.db
1724
+ .insertInto("state_by_version")
1725
+ .values({
1726
+ entity_id: "file1",
1727
+ file_id: "file1",
1728
+ schema_key: "file",
1729
+ plugin_key: "test_plugin",
1730
+ version_id: "version0",
1731
+ snapshot_content: {
1732
+ id: "file1",
1733
+ path: "/app.js",
1734
+ content: "console.log('version 0');",
1735
+ },
1736
+ schema_version: "1.0",
1737
+ })
1738
+ .execute();
1739
+
1740
+ // This should pass - same path in different version should be allowed
1741
+ expect(() =>
1742
+ validateStateMutation({
1743
+ engine: lix.engine!,
1744
+ schema,
1745
+ snapshot_content: {
1746
+ id: "file2",
1747
+ path: "/app.js", // Same path but different version
1748
+ content: "console.log('version 1');",
1749
+ },
1750
+ operation: "insert",
1751
+ version_id: "version1",
1752
+ })
1753
+ ).not.toThrowError();
1754
+
1755
+ // This should fail - same path in same version
1756
+ expect(() =>
1757
+ validateStateMutation({
1758
+ engine: lix.engine!,
1759
+ schema,
1760
+ snapshot_content: {
1761
+ id: "file3",
1762
+ path: "/app.js", // Same path and same version
1763
+ content: "console.log('duplicate');",
1764
+ },
1765
+ operation: "insert",
1766
+ version_id: "version0",
1767
+ })
1768
+ ).toThrowError("Unique constraint violation");
1769
+ });
1770
+
1771
+ test("throws when version_id is not provided", async () => {
1772
+ const lix = await openLix({});
1773
+
1774
+ const schema = {
1775
+ type: "object",
1776
+ "x-lix-version": "1.0",
1777
+ "x-lix-key": "user",
1778
+ "x-lix-primary-key": ["/id"],
1779
+ properties: {
1780
+ id: { type: "string" },
1781
+ name: { type: "string" },
1782
+ },
1783
+ required: ["id", "name"],
1784
+ additionalProperties: false,
1785
+ } as const satisfies LixSchemaDefinition;
1786
+
1787
+ expect(() =>
1788
+ validateStateMutation({
1789
+ engine: lix.engine!,
1790
+ schema,
1791
+ snapshot_content: { id: "user1", name: "John" },
1792
+ operation: "insert",
1793
+ // @ts-expect-error - version_id is required but missing
1794
+ version_id: undefined,
1795
+ })
1796
+ ).toThrowError("version_id is required");
1797
+ });
1798
+
1799
+ test("throws when referenced version does not exist", async () => {
1800
+ const lix = await openLix({});
1801
+
1802
+ const schema = {
1803
+ type: "object",
1804
+ "x-lix-version": "1.0",
1805
+ "x-lix-key": "user",
1806
+ "x-lix-primary-key": ["/id"],
1807
+ properties: {
1808
+ id: { type: "string" },
1809
+ name: { type: "string" },
1810
+ },
1811
+ required: ["id", "name"],
1812
+ additionalProperties: false,
1813
+ } as const satisfies LixSchemaDefinition;
1814
+
1815
+ expect(() =>
1816
+ validateStateMutation({
1817
+ engine: lix.engine!,
1818
+ schema,
1819
+ snapshot_content: { id: "user1", name: "John" },
1820
+ operation: "insert",
1821
+ version_id: "nonexistent_version",
1822
+ })
1823
+ ).toThrowError("Version with id 'nonexistent_version' does not exist");
1824
+ });
1825
+
1826
+ test("passes when version_id is provided and version exists", async () => {
1827
+ const lix = await openLix({});
1828
+
1829
+ const schema = {
1830
+ type: "object",
1831
+ "x-lix-version": "1.0",
1832
+ "x-lix-key": "user",
1833
+ "x-lix-primary-key": ["/id"],
1834
+ properties: {
1835
+ id: { type: "string" },
1836
+ name: { type: "string" },
1837
+ },
1838
+ required: ["id", "name"],
1839
+ additionalProperties: false,
1840
+ } as const satisfies LixSchemaDefinition;
1841
+
1842
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
1843
+
1844
+ const activeVersion = await lix.db
1845
+ .selectFrom("active_version")
1846
+ .select("version_id")
1847
+ .executeTakeFirstOrThrow();
1848
+
1849
+ expect(() =>
1850
+ validateStateMutation({
1851
+ engine: lix.engine!,
1852
+ schema,
1853
+ snapshot_content: { id: "user1", name: "John" },
1854
+ operation: "insert",
1855
+ version_id: activeVersion.version_id,
1856
+ })
1857
+ ).not.toThrowError();
1858
+ });
1859
+
1860
+ test("should prevent deletion when foreign keys reference the entity", async () => {
1861
+ const lix = await openLix({});
1862
+
1863
+ const userSchema = {
1864
+ type: "object",
1865
+ "x-lix-version": "1.0",
1866
+ "x-lix-key": "user",
1867
+ "x-lix-primary-key": ["/id"],
1868
+ properties: {
1869
+ id: { type: "string" },
1870
+ name: { type: "string" },
1871
+ },
1872
+ required: ["id", "name"],
1873
+ additionalProperties: false,
1874
+ } as const satisfies LixSchemaDefinition;
1875
+
1876
+ const postSchema = {
1877
+ type: "object",
1878
+ "x-lix-version": "1.0",
1879
+ "x-lix-key": "post",
1880
+ "x-lix-primary-key": ["/id"],
1881
+ "x-lix-foreign-keys": [
1882
+ {
1883
+ properties: ["/author_id"],
1884
+ references: {
1885
+ schemaKey: "user",
1886
+ properties: ["/id"],
1887
+ },
1888
+ },
1889
+ ],
1890
+ properties: {
1891
+ id: { type: "string" },
1892
+ author_id: { type: "string" },
1893
+ title: { type: "string" },
1894
+ },
1895
+ required: ["id", "author_id", "title"],
1896
+ additionalProperties: false,
1897
+ } as const satisfies LixSchemaDefinition;
1898
+
1899
+ // Store schemas
1900
+ await lix.db
1901
+ .insertInto("stored_schema")
1902
+ .values([{ value: userSchema }, { value: postSchema }])
1903
+ .execute();
1904
+
1905
+ const activeVersion = await lix.db
1906
+ .selectFrom("active_version")
1907
+ .select("version_id")
1908
+ .executeTakeFirstOrThrow();
1909
+
1910
+ // Insert a user that will be referenced
1911
+ await lix.db
1912
+ .insertInto("state_by_version")
1913
+ .values({
1914
+ entity_id: "user1",
1915
+ file_id: "file1",
1916
+ schema_key: "user",
1917
+ plugin_key: "test_plugin",
1918
+ version_id: activeVersion.version_id,
1919
+ snapshot_content: {
1920
+ id: "user1",
1921
+ name: "John Doe",
1922
+ },
1923
+ schema_version: "1.0",
1924
+ })
1925
+ .execute();
1926
+
1927
+ // Insert a post that references the user
1928
+ await lix.db
1929
+ .insertInto("state_by_version")
1930
+ .values({
1931
+ entity_id: "post1",
1932
+ file_id: "file1",
1933
+ schema_key: "post",
1934
+ plugin_key: "test_plugin",
1935
+ version_id: activeVersion.version_id,
1936
+ snapshot_content: {
1937
+ id: "post1",
1938
+ author_id: "user1",
1939
+ title: "My First Post",
1940
+ },
1941
+ schema_version: "1.0",
1942
+ })
1943
+ .execute();
1944
+
1945
+ // This should fail - cannot delete user because post references it
1946
+ expect(() =>
1947
+ validateStateMutation({
1948
+ engine: lix.engine!,
1949
+ schema: userSchema,
1950
+ snapshot_content: {}, // Not used for delete operations
1951
+ operation: "delete",
1952
+ entity_id: "user1",
1953
+ file_id: "file1",
1954
+ version_id: activeVersion.version_id,
1955
+ })
1956
+ ).toThrowError(
1957
+ /Foreign key constraint violation.*referenced by.*post.*author_id/i
1958
+ );
1959
+ });
1960
+
1961
+ test("should allow deletion when no foreign keys reference the entity", async () => {
1962
+ const lix = await openLix({});
1963
+
1964
+ const userSchema = {
1965
+ type: "object",
1966
+ "x-lix-version": "1.0",
1967
+ "x-lix-key": "user",
1968
+ "x-lix-primary-key": ["/id"],
1969
+ properties: {
1970
+ id: { type: "string" },
1971
+ name: { type: "string" },
1972
+ },
1973
+ required: ["id", "name"],
1974
+ additionalProperties: false,
1975
+ } as const satisfies LixSchemaDefinition;
1976
+
1977
+ // Store schema
1978
+ await lix.db
1979
+ .insertInto("stored_schema")
1980
+ .values({ value: userSchema })
1981
+ .execute();
1982
+
1983
+ const activeVersion = await lix.db
1984
+ .selectFrom("active_version")
1985
+ .select("version_id")
1986
+ .executeTakeFirstOrThrow();
1987
+
1988
+ // Insert a user with no references
1989
+ await lix.db
1990
+ .insertInto("state_by_version")
1991
+ .values({
1992
+ entity_id: "user1",
1993
+ file_id: "file1",
1994
+ schema_key: "user",
1995
+ plugin_key: "test_plugin",
1996
+ version_id: activeVersion.version_id,
1997
+ snapshot_content: {
1998
+ id: "user1",
1999
+ name: "John Doe",
2000
+ },
2001
+ schema_version: "1.0",
2002
+ })
2003
+ .execute();
2004
+
2005
+ // This should pass - no foreign keys reference this user
2006
+ expect(() =>
2007
+ validateStateMutation({
2008
+ engine: lix.engine!,
2009
+ schema: userSchema,
2010
+ snapshot_content: {}, // Not used for delete operations
2011
+ operation: "delete",
2012
+ entity_id: "user1",
2013
+ file_id: "file1",
2014
+ version_id: activeVersion.version_id,
2015
+ })
2016
+ ).not.toThrowError();
2017
+ });
2018
+
2019
+ test("materialized FK: insert allowed without referenced; delete restricts", async () => {
2020
+ const lix = await openLix({});
2021
+
2022
+ // Define a simple parent/child with materialized FK on child.parent_id -> parent.id
2023
+ const parentSchema = {
2024
+ type: "object",
2025
+ "x-lix-version": "1.0",
2026
+ "x-lix-key": "mfk_parent",
2027
+ "x-lix-primary-key": ["/id"],
2028
+ properties: {
2029
+ id: { type: "string" },
2030
+ name: { type: "string" },
2031
+ },
2032
+ required: ["id", "name"],
2033
+ additionalProperties: false,
2034
+ } as const satisfies LixSchemaDefinition;
2035
+
2036
+ const childSchema = {
2037
+ type: "object",
2038
+ "x-lix-version": "1.0",
2039
+ "x-lix-key": "mfk_child",
2040
+ "x-lix-primary-key": ["/id"],
2041
+ "x-lix-foreign-keys": [
2042
+ {
2043
+ properties: ["/parent_id"],
2044
+ references: {
2045
+ schemaKey: "mfk_parent",
2046
+ properties: ["/id"],
2047
+ },
2048
+ mode: "materialized",
2049
+ },
2050
+ ],
2051
+ properties: {
2052
+ id: { type: "string" },
2053
+ parent_id: { type: "string" },
2054
+ title: { type: "string" },
2055
+ },
2056
+ required: ["id", "parent_id", "title"],
2057
+ additionalProperties: false,
2058
+ } as const satisfies LixSchemaDefinition;
2059
+
2060
+ // Store schemas
2061
+ await lix.db
2062
+ .insertInto("stored_schema")
2063
+ .values([{ value: parentSchema }, { value: childSchema }])
2064
+ .execute();
2065
+
2066
+ const activeVersion = await lix.db
2067
+ .selectFrom("active_version")
2068
+ .select("version_id")
2069
+ .executeTakeFirstOrThrow();
2070
+
2071
+ // Insert child referencing a not-yet-existing parent: should NOT throw (materialized mode skips insert-time check)
2072
+ expect(() =>
2073
+ validateStateMutation({
2074
+ engine: lix.engine!,
2075
+ schema: childSchema,
2076
+ snapshot_content: { id: "c1", parent_id: "p1", title: "hello" },
2077
+ operation: "insert",
2078
+ version_id: activeVersion.version_id,
2079
+ })
2080
+ ).not.toThrowError();
2081
+
2082
+ // Materialize the child row so delete-time reverse FK check sees it
2083
+ await lix.db
2084
+ .insertInto("state_by_version")
2085
+ .values({
2086
+ entity_id: "c1",
2087
+ file_id: "file1",
2088
+ schema_key: "mfk_child",
2089
+ plugin_key: "test_plugin",
2090
+ version_id: activeVersion.version_id,
2091
+ snapshot_content: { id: "c1", parent_id: "p1", title: "hello" },
2092
+ schema_version: "1.0",
2093
+ })
2094
+ .execute();
2095
+
2096
+ // Insert the parent rows
2097
+ await lix.db
2098
+ .insertInto("state_by_version")
2099
+ .values([
2100
+ {
2101
+ entity_id: "p1",
2102
+ file_id: "file1",
2103
+ schema_key: "mfk_parent",
2104
+ plugin_key: "test_plugin",
2105
+ version_id: activeVersion.version_id,
2106
+ snapshot_content: { id: "p1", name: "parent one" },
2107
+ schema_version: "1.0",
2108
+ },
2109
+ {
2110
+ entity_id: "p2",
2111
+ file_id: "file1",
2112
+ schema_key: "mfk_parent",
2113
+ plugin_key: "test_plugin",
2114
+ version_id: activeVersion.version_id,
2115
+ snapshot_content: { id: "p2", name: "parent two" },
2116
+ schema_version: "1.0",
2117
+ },
2118
+ ])
2119
+ .execute();
2120
+
2121
+ // Delete-time: p1 is referenced by child → should throw
2122
+ expect(() =>
2123
+ validateStateMutation({
2124
+ engine: lix.engine!,
2125
+ schema: parentSchema,
2126
+ snapshot_content: {},
2127
+ operation: "delete",
2128
+ entity_id: "p1",
2129
+ file_id: "file1",
2130
+ version_id: activeVersion.version_id,
2131
+ })
2132
+ ).toThrowError(
2133
+ /Foreign key constraint violation.*referenced by.*mfk_child.*parent_id/i
2134
+ );
2135
+
2136
+ // Delete-time: p2 has no references → should not throw
2137
+ expect(() =>
2138
+ validateStateMutation({
2139
+ engine: lix.engine!,
2140
+ schema: parentSchema,
2141
+ snapshot_content: {},
2142
+ operation: "delete",
2143
+ entity_id: "p2",
2144
+ file_id: "file1",
2145
+ version_id: activeVersion.version_id,
2146
+ })
2147
+ ).not.toThrowError();
2148
+ });
2149
+
2150
+ test("should throw when deleting non-existent entity", async () => {
2151
+ const lix = await openLix({});
2152
+
2153
+ const userSchema = {
2154
+ type: "object",
2155
+ "x-lix-version": "1.0",
2156
+ "x-lix-key": "user",
2157
+ "x-lix-primary-key": ["/id"],
2158
+ properties: {
2159
+ id: { type: "string" },
2160
+ name: { type: "string" },
2161
+ },
2162
+ required: ["id", "name"],
2163
+ additionalProperties: false,
2164
+ } as const satisfies LixSchemaDefinition;
2165
+
2166
+ await lix.db
2167
+ .insertInto("stored_schema")
2168
+ .values({ value: userSchema })
2169
+ .execute();
2170
+
2171
+ const activeVersion = await lix.db
2172
+ .selectFrom("active_version")
2173
+ .select("version_id")
2174
+ .executeTakeFirstOrThrow();
2175
+
2176
+ // This should fail - entity does not exist
2177
+ expect(() =>
2178
+ validateStateMutation({
2179
+ engine: lix.engine!,
2180
+ schema: userSchema,
2181
+ snapshot_content: {},
2182
+ operation: "delete",
2183
+ entity_id: "nonexistent_user",
2184
+ file_id: "file1",
2185
+ version_id: activeVersion.version_id,
2186
+ })
2187
+ ).toThrowError(
2188
+ /Cannot delete entity 'nonexistent_user' in version '.+' because it does not exist in this version\./
2189
+ );
2190
+ });
2191
+
2192
+ test("should throw when entity_id is missing for delete operations", async () => {
2193
+ const lix = await openLix({});
2194
+
2195
+ const userSchema = {
2196
+ type: "object",
2197
+ "x-lix-version": "1.0",
2198
+ "x-lix-key": "user",
2199
+ "x-lix-primary-key": ["/id"],
2200
+ properties: {
2201
+ id: { type: "string" },
2202
+ name: { type: "string" },
2203
+ },
2204
+ required: ["id", "name"],
2205
+ additionalProperties: false,
2206
+ } as const satisfies LixSchemaDefinition;
2207
+
2208
+ await lix.db
2209
+ .insertInto("stored_schema")
2210
+ .values({ value: userSchema })
2211
+ .execute();
2212
+
2213
+ const activeVersion = await lix.db
2214
+ .selectFrom("active_version")
2215
+ .select("version_id")
2216
+ .executeTakeFirstOrThrow();
2217
+
2218
+ // This should fail - entity_id is required for delete
2219
+ expect(() =>
2220
+ validateStateMutation({
2221
+ engine: lix.engine!,
2222
+ schema: userSchema,
2223
+ snapshot_content: {},
2224
+ operation: "delete",
2225
+ // entity_id is missing
2226
+ file_id: "file1",
2227
+ version_id: activeVersion.version_id,
2228
+ })
2229
+ ).toThrowError("entity_id is required for delete operations");
2230
+ });
2231
+
2232
+ test("should handle deletion validation for change sets referenced by versions", async () => {
2233
+ const lix = await openLix({});
2234
+
2235
+ // Create change sets
2236
+ await lix.db
2237
+ .insertInto("change_set_by_version")
2238
+ .values([
2239
+ { id: "cs_referenced", lixcol_version_id: "global" },
2240
+ { id: "cs_working", lixcol_version_id: "global" },
2241
+ ])
2242
+ .execute();
2243
+
2244
+ // Create commits that reference the change sets
2245
+ await lix.db
2246
+ .insertInto("commit_by_version")
2247
+ .values([
2248
+ {
2249
+ id: "commit_1",
2250
+ change_set_id: "cs_referenced",
2251
+ lixcol_version_id: "global",
2252
+ },
2253
+ {
2254
+ id: "working_commit_1",
2255
+ change_set_id: "cs_working",
2256
+ lixcol_version_id: "global",
2257
+ },
2258
+ ])
2259
+ .execute();
2260
+
2261
+ // Create a version that references the commits
2262
+ await lix.db
2263
+ .insertInto("version")
2264
+ .values({
2265
+ id: "v1",
2266
+ name: "test_version",
2267
+ commit_id: "commit_1",
2268
+ working_commit_id: "working_commit_1",
2269
+ })
2270
+ .execute();
2271
+
2272
+ // const activeVersion = await lix.db
2273
+ // .selectFrom("active_version")
2274
+ // .select("version_id")
2275
+ // .executeTakeFirstOrThrow();
2276
+
2277
+ // Get the change set schema
2278
+ const changeSetSchema = await lix.db
2279
+ .selectFrom("stored_schema")
2280
+ .select("value")
2281
+ .where(
2282
+ sql`json_extract("stored_schema"."value", '$."x-lix-key"')`,
2283
+ "=",
2284
+ "lix_change_set"
2285
+ )
2286
+ .executeTakeFirstOrThrow();
2287
+
2288
+ // This should fail - cannot delete change set because version references it
2289
+ expect(() =>
2290
+ validateStateMutation({
2291
+ engine: lix.engine!,
2292
+ schema: changeSetSchema.value as LixSchemaDefinition,
2293
+ snapshot_content: {},
2294
+ operation: "delete",
2295
+ entity_id: "cs_referenced",
2296
+ file_id: "lix",
2297
+ version_id: "global",
2298
+ })
2299
+ ).toThrowError(
2300
+ /Foreign key constraint violation.*Cannot delete entity.*referenced by.*lix_commit/i
2301
+ );
2302
+ });
2303
+
2304
+ test("should parse JSON object properties before validation", async () => {
2305
+ const lix = await openLix({});
2306
+
2307
+ // Define a schema with an object property
2308
+ const documentSchema = {
2309
+ type: "object",
2310
+ "x-lix-version": "1.0",
2311
+ "x-lix-key": "test_document",
2312
+ "x-lix-primary-key": ["/id"],
2313
+ properties: {
2314
+ id: { type: "string" },
2315
+ title: { type: "string" },
2316
+ body: {
2317
+ type: "object",
2318
+ properties: {
2319
+ type: { type: "string" },
2320
+ content: { type: "array" },
2321
+ },
2322
+ required: ["type", "content"],
2323
+ },
2324
+ },
2325
+ required: ["id", "title", "body"],
2326
+ additionalProperties: false,
2327
+ } as const satisfies LixSchemaDefinition;
2328
+
2329
+ // Store the schema
2330
+ await lix.db
2331
+ .insertInto("stored_schema")
2332
+ .values({ value: documentSchema })
2333
+ .execute();
2334
+
2335
+ const activeVersion = await lix.db
2336
+ .selectFrom("active_version")
2337
+ .select("version_id")
2338
+ .executeTakeFirstOrThrow();
2339
+
2340
+ // Test with valid JSON object - this should pass
2341
+ const validSnapshotContent = {
2342
+ id: "doc1",
2343
+ title: "Test Document",
2344
+ body: JSON.stringify({
2345
+ type: "zettel_doc",
2346
+ content: [
2347
+ {
2348
+ type: "zettel_text_block",
2349
+ zettel_key: "test_key",
2350
+ style: "zettel_normal",
2351
+ children: [],
2352
+ },
2353
+ ],
2354
+ }),
2355
+ };
2356
+
2357
+ expect(() =>
2358
+ validateStateMutation({
2359
+ engine: lix.engine!,
2360
+ schema: documentSchema,
2361
+ snapshot_content: validSnapshotContent,
2362
+ operation: "insert",
2363
+ version_id: activeVersion.version_id,
2364
+ })
2365
+ ).not.toThrowError();
2366
+
2367
+ // Test with invalid JSON object - this should fail
2368
+ const invalidSnapshotContent = {
2369
+ id: "doc2",
2370
+ title: "Invalid Document",
2371
+ body: JSON.stringify({
2372
+ type: "invalid_type", // Missing required 'content' property
2373
+ }),
2374
+ };
2375
+
2376
+ expect(() =>
2377
+ validateStateMutation({
2378
+ engine: lix.engine!,
2379
+ schema: documentSchema,
2380
+ snapshot_content: invalidSnapshotContent,
2381
+ operation: "insert",
2382
+ version_id: activeVersion.version_id,
2383
+ })
2384
+ ).toThrowError(/body.*must have required property.*content/);
2385
+
2386
+ // Test with malformed JSON string - this should fail
2387
+ const malformedSnapshotContent = {
2388
+ id: "doc3",
2389
+ title: "Malformed Document",
2390
+ body: "{ invalid json",
2391
+ };
2392
+
2393
+ expect(() =>
2394
+ validateStateMutation({
2395
+ engine: lix.engine!,
2396
+ schema: documentSchema,
2397
+ snapshot_content: malformedSnapshotContent,
2398
+ operation: "insert",
2399
+ version_id: activeVersion.version_id,
2400
+ })
2401
+ ).toThrowError(/Invalid JSON in property 'body'/);
2402
+ });
2403
+
2404
+ test("foreign key validation should fail when referenced entity exists in different non-inheriting version", async () => {
2405
+ const lix = await openLix({});
2406
+
2407
+ // Mock schema for a "User" entity
2408
+ const userSchema = {
2409
+ "x-lix-key": "mock_user",
2410
+ "x-lix-version": "1.0",
2411
+ "x-lix-primary-key": ["/id"],
2412
+ type: "object",
2413
+ properties: {
2414
+ id: { type: "string" },
2415
+ name: { type: "string" },
2416
+ },
2417
+ required: ["id", "name"],
2418
+ additionalProperties: false,
2419
+ } as const satisfies LixSchemaDefinition;
2420
+
2421
+ // Mock schema for a "Post" entity that references User
2422
+ const postSchema = {
2423
+ "x-lix-key": "mock_post",
2424
+ "x-lix-version": "1.0",
2425
+ "x-lix-primary-key": ["/id"],
2426
+ "x-lix-foreign-keys": [
2427
+ {
2428
+ properties: ["/author_id"],
2429
+ references: {
2430
+ schemaKey: "mock_user",
2431
+ properties: ["/id"],
2432
+ },
2433
+ },
2434
+ ],
2435
+ type: "object",
2436
+ properties: {
2437
+ id: { type: "string" },
2438
+ title: { type: "string" },
2439
+ author_id: { type: "string" },
2440
+ },
2441
+ required: ["id", "title", "author_id"],
2442
+ additionalProperties: false,
2443
+ } as const satisfies LixSchemaDefinition;
2444
+
2445
+ // Register our mock schemas
2446
+ await lix.db
2447
+ .insertInto("stored_schema")
2448
+ .values([{ value: userSchema }, { value: postSchema }])
2449
+ .execute();
2450
+
2451
+ // Create two separate versions that don't inherit from each other
2452
+ const versionA = await createVersion({
2453
+ lix,
2454
+ name: "version-a",
2455
+ });
2456
+
2457
+ const versionB = await createVersion({
2458
+ lix,
2459
+ name: "version-b",
2460
+ });
2461
+
2462
+ // Verify they don't inherit from each other
2463
+ // Both should inherit from global, but not from each other
2464
+ expect(versionA.inherits_from_version_id).toBe("global");
2465
+ expect(versionB.inherits_from_version_id).toBe("global");
2466
+
2467
+ // Create a user in version A
2468
+ await lix.db
2469
+ .insertInto("state_by_version")
2470
+ .values({
2471
+ entity_id: "user-1",
2472
+ schema_key: "mock_user",
2473
+ file_id: "test",
2474
+ plugin_key: "test_plugin",
2475
+ snapshot_content: {
2476
+ id: "user-1",
2477
+ name: "Alice",
2478
+ },
2479
+ schema_version: "1.0",
2480
+ version_id: versionA.id,
2481
+ })
2482
+ .execute();
2483
+
2484
+ // BUG: This should FAIL because user-1 doesn't exist in version B's context
2485
+ // but the current foreign key validation logic will find user-1 in version A
2486
+ // and incorrectly allow this validation to succeed
2487
+ expect(() =>
2488
+ validateStateMutation({
2489
+ engine: lix.engine!,
2490
+ schema: postSchema,
2491
+ snapshot_content: {
2492
+ id: "post-1",
2493
+ title: "My Post",
2494
+ author_id: "user-1", // References user-1 which only exists in version A
2495
+ },
2496
+ operation: "insert",
2497
+ version_id: versionB.id,
2498
+ })
2499
+ ).toThrow(/Foreign key constraint violation.*mock_user.*user-1/);
2500
+
2501
+ // Verify that user-1 indeed doesn't exist in version B's context
2502
+ const userInVersionB = await lix.db
2503
+ .selectFrom("state_by_version")
2504
+ .where("entity_id", "=", "user-1")
2505
+ .where("schema_key", "=", "mock_user")
2506
+ .where("version_id", "=", versionB.id)
2507
+ .selectAll()
2508
+ .execute();
2509
+
2510
+ expect(userInVersionB).toHaveLength(0);
2511
+
2512
+ // But verify it does exist in version A
2513
+ const userInVersionA = await lix.db
2514
+ .selectFrom("state_by_version")
2515
+ .where("entity_id", "=", "user-1")
2516
+ .where("schema_key", "=", "mock_user")
2517
+ .where("version_id", "=", versionA.id)
2518
+ .selectAll()
2519
+ .execute();
2520
+
2521
+ expect(userInVersionA).toHaveLength(1);
2522
+ });
2523
+
2524
+ test("should allow self-referential foreign keys", async () => {
2525
+ const lix = await openLix({});
2526
+
2527
+ // Define a schema with self-referential foreign key (like version inheritance)
2528
+ const versionSchema = {
2529
+ type: "object",
2530
+ "x-lix-version": "1.0",
2531
+ "x-lix-key": "mock_version",
2532
+ "x-lix-primary-key": ["/id"],
2533
+ "x-lix-foreign-keys": [
2534
+ {
2535
+ properties: ["/inherits_from_version_id"],
2536
+ references: {
2537
+ schemaKey: "mock_version", // Self-referential foreign key
2538
+ properties: ["/id"],
2539
+ },
2540
+ },
2541
+ ],
2542
+ properties: {
2543
+ id: { type: "string" },
2544
+ name: { type: "string" },
2545
+ inherits_from_version_id: { type: ["string", "null"] },
2546
+ },
2547
+ required: ["id", "name"],
2548
+ additionalProperties: false,
2549
+ } as const satisfies LixSchemaDefinition;
2550
+
2551
+ // Store the schema
2552
+ await lix.db
2553
+ .insertInto("stored_schema")
2554
+ .values({ value: versionSchema })
2555
+ .execute();
2556
+
2557
+ const activeVersion = await lix.db
2558
+ .selectFrom("active_version")
2559
+ .select("version_id")
2560
+ .executeTakeFirstOrThrow();
2561
+
2562
+ // Insert a parent version first (with null inheritance)
2563
+ await lix.db
2564
+ .insertInto("state_by_version")
2565
+ .values({
2566
+ entity_id: "version0",
2567
+ file_id: "file1",
2568
+ schema_key: "mock_version",
2569
+ plugin_key: "test_plugin",
2570
+ version_id: activeVersion.version_id,
2571
+ snapshot_content: {
2572
+ id: "version0",
2573
+ name: "version0",
2574
+ inherits_from_version_id: null,
2575
+ },
2576
+ schema_version: "1.0",
2577
+ })
2578
+ .execute();
2579
+
2580
+ // This should pass - child version referencing parent version (valid self-referential FK)
2581
+ expect(() =>
2582
+ validateStateMutation({
2583
+ engine: lix.engine!,
2584
+ schema: versionSchema,
2585
+ snapshot_content: {
2586
+ id: "version1",
2587
+ name: "version1",
2588
+ inherits_from_version_id: "version0", // References another entity in same schema
2589
+ },
2590
+ operation: "insert",
2591
+ version_id: activeVersion.version_id,
2592
+ })
2593
+ ).not.toThrowError();
2594
+
2595
+ // This should also pass - version with null inheritance (no foreign key constraint)
2596
+ expect(() =>
2597
+ validateStateMutation({
2598
+ engine: lix.engine!,
2599
+ schema: versionSchema,
2600
+ snapshot_content: {
2601
+ id: "version2",
2602
+ name: "version2",
2603
+ inherits_from_version_id: null, // No foreign key reference
2604
+ },
2605
+ operation: "insert",
2606
+ version_id: activeVersion.version_id,
2607
+ })
2608
+ ).not.toThrowError();
2609
+
2610
+ // This should fail - referencing non-existent version
2611
+ expect(() =>
2612
+ validateStateMutation({
2613
+ engine: lix.engine!,
2614
+ schema: versionSchema,
2615
+ snapshot_content: {
2616
+ id: "version3",
2617
+ name: "version3",
2618
+ inherits_from_version_id: "nonexistent_version",
2619
+ },
2620
+ operation: "insert",
2621
+ version_id: activeVersion.version_id,
2622
+ })
2623
+ ).toThrowError("Foreign key constraint violation");
2624
+ });
2625
+
2626
+ test("should allow self-referential foreign keys for update operations", async () => {
2627
+ const lix = await openLix({});
2628
+
2629
+ // Define a schema with self-referential foreign key
2630
+ const versionSchema = {
2631
+ type: "object",
2632
+ "x-lix-version": "1.0",
2633
+ "x-lix-key": "mock_version",
2634
+ "x-lix-primary-key": ["/id"],
2635
+ "x-lix-foreign-keys": [
2636
+ {
2637
+ properties: ["/inherits_from_version_id"],
2638
+ references: {
2639
+ schemaKey: "mock_version",
2640
+ properties: ["/id"],
2641
+ },
2642
+ },
2643
+ ],
2644
+ properties: {
2645
+ id: { type: "string" },
2646
+ name: { type: "string" },
2647
+ inherits_from_version_id: { type: ["string", "null"] },
2648
+ },
2649
+ required: ["id", "name"],
2650
+ additionalProperties: false,
2651
+ } as const satisfies LixSchemaDefinition;
2652
+
2653
+ // Store the schema
2654
+ await lix.db
2655
+ .insertInto("stored_schema")
2656
+ .values({ value: versionSchema })
2657
+ .execute();
2658
+
2659
+ const activeVersion = await lix.db
2660
+ .selectFrom("active_version")
2661
+ .select("version_id")
2662
+ .executeTakeFirstOrThrow();
2663
+
2664
+ // Insert initial versions
2665
+ await lix.db
2666
+ .insertInto("state_by_version")
2667
+ .values([
2668
+ {
2669
+ entity_id: "version0",
2670
+ file_id: "file1",
2671
+ schema_key: "mock_version",
2672
+ plugin_key: "test_plugin",
2673
+ version_id: activeVersion.version_id,
2674
+ snapshot_content: {
2675
+ id: "version0",
2676
+ name: "version0",
2677
+ inherits_from_version_id: null,
2678
+ },
2679
+ schema_version: "1.0",
2680
+ },
2681
+ {
2682
+ entity_id: "version1",
2683
+ file_id: "file1",
2684
+ schema_key: "mock_version",
2685
+ plugin_key: "test_plugin",
2686
+ version_id: activeVersion.version_id,
2687
+ snapshot_content: {
2688
+ id: "version1",
2689
+ name: "version1",
2690
+ inherits_from_version_id: "version0",
2691
+ },
2692
+ schema_version: "1.0",
2693
+ },
2694
+ ])
2695
+ .execute();
2696
+
2697
+ // This should pass - updating to reference a different valid version
2698
+ expect(() =>
2699
+ validateStateMutation({
2700
+ engine: lix.engine!,
2701
+ schema: versionSchema,
2702
+ snapshot_content: {
2703
+ id: "version1",
2704
+ name: "version1_updated",
2705
+ inherits_from_version_id: null, // Change from version0 to null
2706
+ },
2707
+ operation: "update",
2708
+ entity_id: "version1",
2709
+ version_id: activeVersion.version_id,
2710
+ })
2711
+ ).not.toThrowError();
2712
+
2713
+ // This should fail - updating to reference non-existent version
2714
+ expect(() =>
2715
+ validateStateMutation({
2716
+ engine: lix.engine!,
2717
+ schema: versionSchema,
2718
+ snapshot_content: {
2719
+ id: "version1",
2720
+ name: "version1_updated",
2721
+ inherits_from_version_id: "nonexistent_version",
2722
+ },
2723
+ operation: "update",
2724
+ entity_id: "version1",
2725
+ version_id: activeVersion.version_id,
2726
+ })
2727
+ ).toThrowError("Foreign key constraint violation");
2728
+ });
2729
+
2730
+ test("should prevent deletion when self-referential foreign keys reference the entity", async () => {
2731
+ const lix = await openLix({});
2732
+
2733
+ // Define a schema with self-referential foreign key
2734
+ const versionSchema = {
2735
+ type: "object",
2736
+ "x-lix-version": "1.0",
2737
+ "x-lix-key": "mock_version",
2738
+ "x-lix-primary-key": ["/id"],
2739
+ "x-lix-foreign-keys": [
2740
+ {
2741
+ properties: ["/inherits_from_version_id"],
2742
+ references: {
2743
+ schemaKey: "mock_version",
2744
+ properties: ["/id"],
2745
+ },
2746
+ },
2747
+ ],
2748
+ properties: {
2749
+ id: { type: "string" },
2750
+ name: { type: "string" },
2751
+ inherits_from_version_id: { type: ["string", "null"] },
2752
+ },
2753
+ required: ["id", "name"],
2754
+ additionalProperties: false,
2755
+ } as const satisfies LixSchemaDefinition;
2756
+
2757
+ // Store the schema
2758
+ await lix.db
2759
+ .insertInto("stored_schema")
2760
+ .values({ value: versionSchema })
2761
+ .execute();
2762
+
2763
+ const activeVersion = await lix.db
2764
+ .selectFrom("active_version")
2765
+ .select("version_id")
2766
+ .executeTakeFirstOrThrow();
2767
+
2768
+ // Insert parent and child versions
2769
+ await lix.db
2770
+ .insertInto("state_by_version")
2771
+ .values([
2772
+ {
2773
+ entity_id: "version0",
2774
+ file_id: "file1",
2775
+ schema_key: "mock_version",
2776
+ plugin_key: "test_plugin",
2777
+ version_id: activeVersion.version_id,
2778
+ snapshot_content: {
2779
+ id: "version0",
2780
+ name: "version0",
2781
+ inherits_from_version_id: null,
2782
+ },
2783
+ schema_version: "1.0",
2784
+ },
2785
+ {
2786
+ entity_id: "version1",
2787
+ file_id: "file1",
2788
+ schema_key: "mock_version",
2789
+ plugin_key: "test_plugin",
2790
+ version_id: activeVersion.version_id,
2791
+ snapshot_content: {
2792
+ id: "version1",
2793
+ name: "version1",
2794
+ inherits_from_version_id: "version0", // References version0
2795
+ },
2796
+ schema_version: "1.0",
2797
+ },
2798
+ ])
2799
+ .execute();
2800
+
2801
+ // This should fail - cannot delete version0 because version1 references it
2802
+ expect(() =>
2803
+ validateStateMutation({
2804
+ engine: lix.engine!,
2805
+ schema: versionSchema,
2806
+ snapshot_content: {},
2807
+ operation: "delete",
2808
+ entity_id: "version0",
2809
+ file_id: "file1",
2810
+ version_id: activeVersion.version_id,
2811
+ })
2812
+ ).toThrowError(
2813
+ /Foreign key constraint violation.*referenced by.*mock_version.*inherits_from_version_id/
2814
+ );
2815
+
2816
+ // This should pass - can delete version1 (no other versions reference it)
2817
+ expect(() =>
2818
+ validateStateMutation({
2819
+ engine: lix.engine!,
2820
+ schema: versionSchema,
2821
+ snapshot_content: {},
2822
+ operation: "delete",
2823
+ entity_id: "version1",
2824
+ file_id: "file1",
2825
+ version_id: activeVersion.version_id,
2826
+ })
2827
+ ).not.toThrowError();
2828
+ });
2829
+
2830
+ // Foreign keys are restricted to the current version context to maintain data integrity
2831
+ // and prevent confusing dependency relationships across version boundaries. While entities
2832
+ // can be inherited from parent versions through the copy-on-write system, foreign key
2833
+ // constraints require explicit, direct relationships within the same version scope.
2834
+ // This design choice ensures that:
2835
+ // 1. FK constraints are predictable and version-scoped
2836
+ // 2. No hidden dependencies exist across version boundaries
2837
+ // 3. Copy-on-write semantics remain clear and isolated
2838
+ // 4. Data integrity is maintained within each version context
2839
+ test("should prevent foreign key references to inherited entities from different version contexts", async () => {
2840
+ const lix = await openLix({});
2841
+
2842
+ const parentSchema: LixSchemaDefinition = {
2843
+ type: "object",
2844
+ "x-lix-version": "1.0",
2845
+ "x-lix-key": "fk_version_parent",
2846
+ "x-lix-primary-key": ["/id"],
2847
+ properties: {
2848
+ id: { type: "string" },
2849
+ },
2850
+ required: ["id"],
2851
+ additionalProperties: false,
2852
+ };
2853
+
2854
+ const childSchema: LixSchemaDefinition = {
2855
+ type: "object",
2856
+ "x-lix-version": "1.0",
2857
+ "x-lix-key": "fk_version_child",
2858
+ "x-lix-primary-key": ["/id"],
2859
+ "x-lix-foreign-keys": [
2860
+ {
2861
+ properties: ["/parent_id"],
2862
+ references: {
2863
+ schemaKey: parentSchema["x-lix-key"],
2864
+ properties: ["/id"],
2865
+ },
2866
+ },
2867
+ ],
2868
+ properties: {
2869
+ id: { type: "string" },
2870
+ parent_id: { type: "string" },
2871
+ },
2872
+ required: ["id", "parent_id"],
2873
+ additionalProperties: false,
2874
+ };
2875
+
2876
+ await lix.db
2877
+ .insertInto("stored_schema")
2878
+ .values([{ value: parentSchema }, { value: childSchema }])
2879
+ .execute();
2880
+
2881
+ await lix.db
2882
+ .insertInto("state_by_version")
2883
+ .values({
2884
+ entity_id: "parent-1",
2885
+ schema_key: parentSchema["x-lix-key"],
2886
+ file_id: "parent.json",
2887
+ plugin_key: "test_plugin",
2888
+ version_id: "global",
2889
+ snapshot_content: { id: "parent-1" },
2890
+ schema_version: parentSchema["x-lix-version"],
2891
+ })
2892
+ .execute();
2893
+
2894
+ const activeVersion = await lix.db
2895
+ .selectFrom("active_version")
2896
+ .select("version_id")
2897
+ .executeTakeFirstOrThrow();
2898
+
2899
+ expect(() =>
2900
+ validateStateMutation({
2901
+ engine: lix.engine!,
2902
+ schema: childSchema,
2903
+ snapshot_content: { id: "child-1", parent_id: "parent-1" },
2904
+ operation: "insert",
2905
+ version_id: activeVersion.version_id,
2906
+ file_id: "child.json",
2907
+ })
2908
+ ).toThrow(/Foreign key constraint violation.*fk_version_parent/i);
2909
+ });
2910
+
2911
+ test("should prevent change set elements from referencing change sets defined in global context", async () => {
2912
+ const lix = await openLix({});
2913
+
2914
+ await lix.db
2915
+ .insertInto("change_set_by_version")
2916
+ .values({
2917
+ id: "global_change_set",
2918
+ lixcol_version_id: "global",
2919
+ })
2920
+ .execute();
2921
+
2922
+ const childVersion = await createVersion({
2923
+ lix,
2924
+ id: "change-set-child",
2925
+ inheritsFrom: { id: "global" },
2926
+ });
2927
+
2928
+ await lix.db
2929
+ .insertInto("change")
2930
+ .values({
2931
+ id: "existing_change",
2932
+ entity_id: "dummy_entity_id",
2933
+ schema_key: "dummy_schema_key",
2934
+ schema_version: "1.0",
2935
+ file_id: "dummy_file_id",
2936
+ plugin_key: "test_plugin",
2937
+ snapshot_content: null,
2938
+ metadata: null,
2939
+ created_at: new Date().toISOString(),
2940
+ })
2941
+ .execute();
2942
+
2943
+ await lix.db
2944
+ .insertInto("stored_schema")
2945
+ .values({
2946
+ value: {
2947
+ type: "object",
2948
+ "x-lix-version": "1.0",
2949
+ "x-lix-key": "dummy_schema_key",
2950
+ properties: { id: { type: "string" } },
2951
+ required: ["id"],
2952
+ additionalProperties: false,
2953
+ },
2954
+ })
2955
+ .execute();
2956
+
2957
+ const changeSetElementSchema = await lix.db
2958
+ .selectFrom("stored_schema")
2959
+ .select("value")
2960
+ .where(
2961
+ sql`json_extract("stored_schema"."value", '$."x-lix-key"')`,
2962
+ "=",
2963
+ "lix_change_set_element"
2964
+ )
2965
+ .executeTakeFirstOrThrow();
2966
+
2967
+ expect(() =>
2968
+ validateStateMutation({
2969
+ engine: lix.engine!,
2970
+ schema: changeSetElementSchema.value as LixSchemaDefinition,
2971
+ snapshot_content: {
2972
+ change_set_id: "global_change_set",
2973
+ change_id: "existing_change",
2974
+ entity_id: "dummy_entity_id",
2975
+ file_id: "dummy_file_id",
2976
+ schema_key: "dummy_schema_key",
2977
+ },
2978
+ operation: "insert",
2979
+ version_id: childVersion.id,
2980
+ })
2981
+ ).toThrow(
2982
+ /Foreign key constraint violation.*lix_change_set.*global_change_set/
2983
+ );
2984
+ });
2985
+
2986
+ // Untracked state foreign key tests
2987
+ // SCENARIO: Tracked → Untracked Foreign Key Reference
2988
+ // WHY THIS TEST EXISTS: Untracked entities are local-only and won't be synced to remote.
2989
+ // If a tracked entity references an untracked entity, it would create broken references
2990
+ // when synced because the untracked entity doesn't exist on the remote.
2991
+ // BEHAVIOR: DISALLOWED - This would break data integrity during sync operations.
2992
+ test("should prevent tracked entities from referencing untracked entities", async () => {
2993
+ const lix = await openLix({});
2994
+
2995
+ const userSchema = {
2996
+ type: "object",
2997
+ "x-lix-version": "1.0",
2998
+ "x-lix-key": "user",
2999
+ "x-lix-primary-key": ["/id"],
3000
+ properties: {
3001
+ id: { type: "string" },
3002
+ name: { type: "string" },
3003
+ },
3004
+ required: ["id", "name"],
3005
+ additionalProperties: false,
3006
+ } as const satisfies LixSchemaDefinition;
3007
+
3008
+ const postSchema = {
3009
+ type: "object",
3010
+ "x-lix-version": "1.0",
3011
+ "x-lix-key": "post",
3012
+ "x-lix-primary-key": ["/id"],
3013
+ "x-lix-foreign-keys": [
3014
+ {
3015
+ properties: ["/author_id"],
3016
+ references: {
3017
+ schemaKey: "user",
3018
+ properties: ["/id"],
3019
+ },
3020
+ },
3021
+ ],
3022
+ properties: {
3023
+ id: { type: "string" },
3024
+ author_id: { type: "string" },
3025
+ title: { type: "string" },
3026
+ },
3027
+ required: ["id", "author_id", "title"],
3028
+ additionalProperties: false,
3029
+ } as const satisfies LixSchemaDefinition;
3030
+
3031
+ // Store schemas
3032
+ await lix.db
3033
+ .insertInto("stored_schema")
3034
+ .values([{ value: userSchema }, { value: postSchema }])
3035
+ .execute();
3036
+
3037
+ const activeVersion = await lix.db
3038
+ .selectFrom("active_version")
3039
+ .select("version_id")
3040
+ .executeTakeFirstOrThrow();
3041
+
3042
+ // Insert an untracked user
3043
+ await lix.db
3044
+ .insertInto("state_by_version")
3045
+ .values({
3046
+ entity_id: "untracked_user",
3047
+ file_id: "file1",
3048
+ schema_key: "user",
3049
+ plugin_key: "test_plugin",
3050
+ version_id: activeVersion.version_id,
3051
+ snapshot_content: {
3052
+ id: "untracked_user",
3053
+ name: "Untracked User",
3054
+ },
3055
+ schema_version: "1.0",
3056
+ untracked: true,
3057
+ })
3058
+ .execute();
3059
+
3060
+ // This should FAIL - tracked entity cannot reference untracked entity
3061
+ expect(() =>
3062
+ validateStateMutation({
3063
+ engine: lix.engine!,
3064
+ schema: postSchema,
3065
+ snapshot_content: {
3066
+ id: "post1",
3067
+ author_id: "untracked_user", // References untracked user
3068
+ title: "My Post",
3069
+ },
3070
+ operation: "insert",
3071
+ version_id: activeVersion.version_id,
3072
+ })
3073
+ ).toThrow(
3074
+ /Foreign key constraint violation.*tracked entities cannot reference untracked entities.*This would create broken references during sync/
3075
+ );
3076
+ });
3077
+
3078
+ // SCENARIO: Untracked → Tracked Foreign Key Reference
3079
+ // WHY THIS TEST EXISTS: Untracked entities are local-only and won't be synced.
3080
+ // Since they remain local, they can safely reference tracked entities without
3081
+ // breaking data integrity. The untracked entity simply won't exist on remote.
3082
+ // BEHAVIOR: ALLOWED - Safe because untracked entities don't participate in sync.
3083
+ test("should allow untracked entities to reference tracked entities", async () => {
3084
+ const lix = await openLix({});
3085
+
3086
+ const userSchema = {
3087
+ type: "object",
3088
+ "x-lix-version": "1.0",
3089
+ "x-lix-key": "user",
3090
+ "x-lix-primary-key": ["/id"],
3091
+ properties: {
3092
+ id: { type: "string" },
3093
+ name: { type: "string" },
3094
+ },
3095
+ required: ["id", "name"],
3096
+ additionalProperties: false,
3097
+ } as const satisfies LixSchemaDefinition;
3098
+
3099
+ const postSchema = {
3100
+ type: "object",
3101
+ "x-lix-version": "1.0",
3102
+ "x-lix-key": "post",
3103
+ "x-lix-primary-key": ["/id"],
3104
+ "x-lix-foreign-keys": [
3105
+ {
3106
+ properties: ["/author_id"],
3107
+ references: {
3108
+ schemaKey: "user",
3109
+ properties: ["/id"],
3110
+ },
3111
+ },
3112
+ ],
3113
+ properties: {
3114
+ id: { type: "string" },
3115
+ author_id: { type: "string" },
3116
+ title: { type: "string" },
3117
+ },
3118
+ required: ["id", "author_id", "title"],
3119
+ additionalProperties: false,
3120
+ } as const satisfies LixSchemaDefinition;
3121
+
3122
+ // Store schemas
3123
+ await lix.db
3124
+ .insertInto("stored_schema")
3125
+ .values([{ value: userSchema }, { value: postSchema }])
3126
+ .execute();
3127
+
3128
+ const activeVersion = await lix.db
3129
+ .selectFrom("active_version")
3130
+ .select("version_id")
3131
+ .executeTakeFirstOrThrow();
3132
+
3133
+ // Insert a tracked user
3134
+ await lix.db
3135
+ .insertInto("state_by_version")
3136
+ .values({
3137
+ entity_id: "tracked_user",
3138
+ file_id: "file1",
3139
+ schema_key: "user",
3140
+ plugin_key: "test_plugin",
3141
+ version_id: activeVersion.version_id,
3142
+ snapshot_content: {
3143
+ id: "tracked_user",
3144
+ name: "Tracked User",
3145
+ },
3146
+ schema_version: "1.0",
3147
+ untracked: false,
3148
+ })
3149
+ .execute();
3150
+
3151
+ // Create validation arguments for untracked post
3152
+ const validationArgs = {
3153
+ engine: lix.engine!,
3154
+ schema: postSchema,
3155
+ snapshot_content: {
3156
+ id: "untracked_post",
3157
+ author_id: "tracked_user", // References tracked user
3158
+ title: "My Untracked Post",
3159
+ },
3160
+ operation: "insert" as const,
3161
+ version_id: activeVersion.version_id,
3162
+ untracked: true, // Mark as untracked
3163
+ };
3164
+
3165
+ // This should PASS - untracked entity can reference tracked entity
3166
+ expect(() => validateStateMutation(validationArgs)).not.toThrow();
3167
+ });
3168
+
3169
+ // SCENARIO: Untracked → Untracked Foreign Key Reference
3170
+ // WHY THIS TEST EXISTS: Both entities are local-only and won't be synced.
3171
+ // They exist in the same local scope, so references between them are valid
3172
+ // and won't cause any sync issues since neither entity leaves the local system.
3173
+ // BEHAVIOR: ALLOWED - Both entities remain local, maintaining referential integrity.
3174
+ test("should allow untracked entities to reference other untracked entities", async () => {
3175
+ const lix = await openLix({});
3176
+
3177
+ const userSchema = {
3178
+ type: "object",
3179
+ "x-lix-version": "1.0",
3180
+ "x-lix-key": "user",
3181
+ "x-lix-primary-key": ["/id"],
3182
+ properties: {
3183
+ id: { type: "string" },
3184
+ name: { type: "string" },
3185
+ },
3186
+ required: ["id", "name"],
3187
+ additionalProperties: false,
3188
+ } as const satisfies LixSchemaDefinition;
3189
+
3190
+ const postSchema = {
3191
+ type: "object",
3192
+ "x-lix-version": "1.0",
3193
+ "x-lix-key": "post",
3194
+ "x-lix-primary-key": ["/id"],
3195
+ "x-lix-foreign-keys": [
3196
+ {
3197
+ properties: ["/author_id"],
3198
+ references: {
3199
+ schemaKey: "user",
3200
+ properties: ["/id"],
3201
+ },
3202
+ },
3203
+ ],
3204
+ properties: {
3205
+ id: { type: "string" },
3206
+ author_id: { type: "string" },
3207
+ title: { type: "string" },
3208
+ },
3209
+ required: ["id", "author_id", "title"],
3210
+ additionalProperties: false,
3211
+ } as const satisfies LixSchemaDefinition;
3212
+
3213
+ // Store schemas
3214
+ await lix.db
3215
+ .insertInto("stored_schema")
3216
+ .values([{ value: userSchema }, { value: postSchema }])
3217
+ .execute();
3218
+
3219
+ const activeVersion = await lix.db
3220
+ .selectFrom("active_version")
3221
+ .select("version_id")
3222
+ .executeTakeFirstOrThrow();
3223
+
3224
+ // Insert an untracked user
3225
+ await lix.db
3226
+ .insertInto("state_by_version")
3227
+ .values({
3228
+ entity_id: "untracked_user",
3229
+ file_id: "file1",
3230
+ schema_key: "user",
3231
+ plugin_key: "test_plugin",
3232
+ version_id: activeVersion.version_id,
3233
+ snapshot_content: {
3234
+ id: "untracked_user",
3235
+ name: "Untracked User",
3236
+ },
3237
+ schema_version: "1.0",
3238
+ untracked: true,
3239
+ })
3240
+ .execute();
3241
+
3242
+ // Create validation arguments for untracked post
3243
+ const validationArgs = {
3244
+ engine: lix.engine!,
3245
+ schema: postSchema,
3246
+ snapshot_content: {
3247
+ id: "untracked_post",
3248
+ author_id: "untracked_user", // References untracked user
3249
+ title: "My Untracked Post",
3250
+ },
3251
+ operation: "insert" as const,
3252
+ version_id: activeVersion.version_id,
3253
+ untracked: true, // Mark as untracked
3254
+ };
3255
+
3256
+ // This should PASS - untracked entity can reference another untracked entity
3257
+ expect(() => validateStateMutation(validationArgs)).not.toThrow();
3258
+ });
3259
+
3260
+ test("should detect and prevent cycles in commit graph when lix_debug is enabled", async () => {
3261
+ const lix = await openLix({
3262
+ keyValues: [{ key: "lix_debug", value: "true" }],
3263
+ });
3264
+
3265
+ // Get the commit edge schema
3266
+ const commitEdgeSchema = await lix.db
3267
+ .selectFrom("stored_schema")
3268
+ .select("value")
3269
+ .where(
3270
+ sql`json_extract("stored_schema"."value", '$."x-lix-key"')`,
3271
+ "=",
3272
+ "lix_commit_edge"
3273
+ )
3274
+ .executeTakeFirstOrThrow();
3275
+
3276
+ // Create a few change sets and commits
3277
+ await lix.db
3278
+ .insertInto("change_set_by_version")
3279
+ .values([
3280
+ { id: "cs1", lixcol_version_id: "global" },
3281
+ { id: "cs2", lixcol_version_id: "global" },
3282
+ { id: "cs3", lixcol_version_id: "global" },
3283
+ ])
3284
+ .execute();
3285
+
3286
+ await lix.db
3287
+ .insertInto("commit_by_version")
3288
+ .values([
3289
+ { id: "commit1", change_set_id: "cs1", lixcol_version_id: "global" },
3290
+ { id: "commit2", change_set_id: "cs2", lixcol_version_id: "global" },
3291
+ { id: "commit3", change_set_id: "cs3", lixcol_version_id: "global" },
3292
+ ])
3293
+ .execute();
3294
+
3295
+ // Create edges via parent_commit_ids: commit1 -> commit2 -> commit3
3296
+ await lix.db
3297
+ .updateTable("commit_by_version")
3298
+ .set({
3299
+ parent_commit_ids: sql<any>`json(${JSON.stringify(["commit1"])})`,
3300
+ })
3301
+ .where("id", "=", "commit2")
3302
+ .where("lixcol_version_id", "=", "global")
3303
+ .execute();
3304
+
3305
+ await lix.db
3306
+ .updateTable("commit_by_version")
3307
+ .set({
3308
+ parent_commit_ids: sql<any>`json(${JSON.stringify(["commit2"])})`,
3309
+ })
3310
+ .where("id", "=", "commit3")
3311
+ .where("lixcol_version_id", "=", "global")
3312
+ .execute();
3313
+
3314
+ // This should fail - creating commit3 -> commit1 would create a cycle
3315
+ expect(() =>
3316
+ validateStateMutation({
3317
+ engine: lix.engine!,
3318
+ schema: commitEdgeSchema.value as LixSchemaDefinition,
3319
+ snapshot_content: {
3320
+ parent_id: "commit3",
3321
+ child_id: "commit1", // This would complete the cycle
3322
+ },
3323
+ operation: "insert",
3324
+ version_id: "global",
3325
+ })
3326
+ ).toThrowError(
3327
+ /Cycle detected in commit graph.*New edge: commit3 -> commit1.*Cycle path: commit1 -> commit2 -> commit3 -> commit1/s
3328
+ );
3329
+
3330
+ // This should also fail - self-loop
3331
+ expect(() =>
3332
+ validateStateMutation({
3333
+ engine: lix.engine!,
3334
+ schema: commitEdgeSchema.value as LixSchemaDefinition,
3335
+ snapshot_content: {
3336
+ parent_id: "commit1",
3337
+ child_id: "commit1", // Self-referencing edge
3338
+ },
3339
+ operation: "insert",
3340
+ version_id: "global",
3341
+ })
3342
+ ).toThrowError(/Self-referencing edges are not allowed/);
3343
+ });
3344
+
3345
+ test("should not check for cycles when lix_debug is disabled", async () => {
3346
+ const lix = await openLix({
3347
+ keyValues: [{ key: "lix_debug", value: "false" }],
3348
+ });
3349
+
3350
+ // Get the commit edge schema
3351
+ const commitEdgeSchema = await lix.db
3352
+ .selectFrom("stored_schema")
3353
+ .select("value")
3354
+ .where(
3355
+ sql`json_extract("stored_schema"."value", '$."x-lix-key"')`,
3356
+ "=",
3357
+ "lix_commit_edge"
3358
+ )
3359
+ .executeTakeFirstOrThrow();
3360
+
3361
+ // Create a few change sets and commits
3362
+ await lix.db
3363
+ .insertInto("change_set_by_version")
3364
+ .values([
3365
+ { id: "cs1", lixcol_version_id: "global" },
3366
+ { id: "cs2", lixcol_version_id: "global" },
3367
+ { id: "cs3", lixcol_version_id: "global" },
3368
+ ])
3369
+ .execute();
3370
+
3371
+ await lix.db
3372
+ .insertInto("commit_by_version")
3373
+ .values([
3374
+ { id: "commit1", change_set_id: "cs1", lixcol_version_id: "global" },
3375
+ { id: "commit2", change_set_id: "cs2", lixcol_version_id: "global" },
3376
+ { id: "commit3", change_set_id: "cs3", lixcol_version_id: "global" },
3377
+ ])
3378
+ .execute();
3379
+
3380
+ // Create edges via parent_commit_ids: commit1 -> commit2 -> commit3
3381
+ await lix.db
3382
+ .updateTable("commit_by_version")
3383
+ .set({
3384
+ parent_commit_ids: sql<any>`json(${JSON.stringify(["commit1"])})`,
3385
+ })
3386
+ .where("id", "=", "commit2")
3387
+ .where("lixcol_version_id", "=", "global")
3388
+ .execute();
3389
+
3390
+ await lix.db
3391
+ .updateTable("commit_by_version")
3392
+ .set({
3393
+ parent_commit_ids: sql<any>`json(${JSON.stringify(["commit2"])})`,
3394
+ })
3395
+ .where("id", "=", "commit3")
3396
+ .where("lixcol_version_id", "=", "global")
3397
+ .execute();
3398
+
3399
+ // This would create a cycle, but with lix_debug=false it won't be detected
3400
+ // (This is intentional for performance - cycle detection is expensive)
3401
+ expect(() =>
3402
+ validateStateMutation({
3403
+ engine: lix.engine!,
3404
+ schema: commitEdgeSchema.value as LixSchemaDefinition,
3405
+ snapshot_content: {
3406
+ parent_id: "commit3",
3407
+ child_id: "commit1", // This would complete the cycle
3408
+ },
3409
+ operation: "insert",
3410
+ version_id: "global",
3411
+ })
3412
+ ).not.toThrowError();
3413
+ });
3414
+
3415
+ test("should validate foreign keys that reference changes in lix_internal_transaction_state during transaction", async () => {
3416
+ const lix = await openLix({});
3417
+
3418
+ // Create a simple mock schema that references a change
3419
+ const mockChangeReferencingSchema = {
3420
+ type: "object",
3421
+ "x-lix-version": "1.0",
3422
+ "x-lix-key": "mock_change_reference",
3423
+ "x-lix-primary-key": ["/change_id"],
3424
+ "x-lix-foreign-keys": [
3425
+ {
3426
+ properties: ["/change_id"],
3427
+ references: {
3428
+ schemaKey: "lix_change",
3429
+ properties: ["/id"],
3430
+ },
3431
+ },
3432
+ ],
3433
+ properties: {
3434
+ change_id: { type: "string" },
3435
+ },
3436
+ required: ["change_id"],
3437
+ additionalProperties: false,
3438
+ } as const satisfies LixSchemaDefinition;
3439
+
3440
+ // Store the mock schema
3441
+ await lix.db
3442
+ .insertInto("stored_schema")
3443
+ .values({ value: mockChangeReferencingSchema })
3444
+ .execute();
3445
+
3446
+ // Get active version
3447
+ const activeVersion = await lix.db
3448
+ .selectFrom("active_version")
3449
+ .select("version_id")
3450
+ .executeTakeFirstOrThrow();
3451
+
3452
+ await lix.db.transaction().execute(async (trx) => {
3453
+ // Insert a key-value entity which creates a change in lix_internal_transaction_state
3454
+ await trx
3455
+ .insertInto("key_value")
3456
+ .values({
3457
+ key: "test_key_for_change_reference",
3458
+ value: "test_value",
3459
+ })
3460
+ .execute();
3461
+
3462
+ // Get the change ID that was just created in lix_internal_transaction_state
3463
+ const changes = await (trx as unknown as Kysely<LixInternalDatabaseSchema>)
3464
+ .selectFrom("lix_internal_transaction_state")
3465
+ .select("id")
3466
+ .where("entity_id", "=", "test_key_for_change_reference")
3467
+ .where("schema_key", "=", "lix_key_value")
3468
+ .execute();
3469
+
3470
+ expect(changes).toHaveLength(1);
3471
+ const changeId = changes[0]!.id;
3472
+
3473
+ // This should NOT throw an error because the change exists in lix_internal_transaction_state
3474
+ // But currently it will throw because validation only checks the "change" table (lix_internal_change)
3475
+ // which doesn't include lix_internal_transaction_state
3476
+ expect(() =>
3477
+ validateStateMutation({
3478
+ engine: lix.engine!,
3479
+ schema: mockChangeReferencingSchema,
3480
+ snapshot_content: {
3481
+ change_id: changeId,
3482
+ },
3483
+ operation: "insert",
3484
+ version_id: activeVersion.version_id,
3485
+ })
3486
+ ).not.toThrowError();
3487
+ });
3488
+ });
3489
+
3490
+ /**
3491
+ * 🧪 Regression-guard for “versionless change FKs”
3492
+ *
3493
+ * Context from architecture discussion:
3494
+ * ─────────────────────────────────────
3495
+ * • `lix_change` rows are **version-agnostic** (no `version_id` column) and
3496
+ * append-only. They form the immutable source-of-truth that every branch
3497
+ * materialises state from.
3498
+ *
3499
+ * • Therefore **any** version-scoped table is allowed to carry a foreign key
3500
+ * that points at `lix_change.id`, because the target row can never disappear
3501
+ * or mutate in a way that would break the reference.
3502
+ *
3503
+ * • The validator treats these targets specially: if the referenced schema’s
3504
+ * scope is `versionless`, it skips the usual “same version” check.
3505
+ *
3506
+ * What this test proves:
3507
+ * ──────────────────────
3508
+ * 1. A table that references `lix_change.id` can be inserted **in the global
3509
+ * context**.
3510
+ * 2. The **same row** can also be inserted in an arbitrary branch
3511
+ * (`activeVersion.version_id`) without triggering a
3512
+ * “foreign-key constraint violation”.
3513
+ *
3514
+ * If either expectation starts failing, it means the validator has regressed
3515
+ * and is once again enforcing version isolation for versionless targets—
3516
+ * something we explicitly decided against.
3517
+ */
3518
+ test("should allow foreign keys to changes from any version context", async () => {
3519
+ const lix = await openLix({});
3520
+
3521
+ // Create a schema that references change.id (like change_author does)
3522
+ const mockSchema = {
3523
+ type: "object",
3524
+ "x-lix-version": "1.0",
3525
+ "x-lix-key": "mock_schema",
3526
+ "x-lix-primary-key": ["/change_id"],
3527
+ "x-lix-foreign-keys": [
3528
+ {
3529
+ properties: ["/change_id"],
3530
+ references: {
3531
+ schemaKey: "lix_change",
3532
+ properties: ["/id"],
3533
+ },
3534
+ },
3535
+ ],
3536
+ properties: {
3537
+ change_id: { type: "string" },
3538
+ },
3539
+ required: ["change_id"],
3540
+ additionalProperties: false,
3541
+ } as const satisfies LixSchemaDefinition;
3542
+
3543
+ // Store the schema
3544
+ await lix.db
3545
+ .insertInto("stored_schema")
3546
+ .values({ value: mockSchema })
3547
+ .execute();
3548
+
3549
+ const activeVersion = await lix.db
3550
+ .selectFrom("active_version")
3551
+ .select("version_id")
3552
+ .executeTakeFirstOrThrow();
3553
+
3554
+ // First create a key-value entity to generate a real change
3555
+ await lix.db
3556
+ .insertInto("key_value")
3557
+ .values({
3558
+ key: "test_key_for_change_ref",
3559
+ value: "test_value",
3560
+ })
3561
+ .execute();
3562
+
3563
+ // Get the change that was created
3564
+ const changes = await lix.db
3565
+ .selectFrom("change")
3566
+ .where("entity_id", "=", "test_key_for_change_ref")
3567
+ .where("schema_key", "=", "lix_key_value")
3568
+ .selectAll()
3569
+ .execute();
3570
+
3571
+ expect(changes).toHaveLength(1);
3572
+ const realChangeId = changes[0]!.id;
3573
+
3574
+ // This should PASS because changes are versionless and can be referenced from global version
3575
+ expect(() =>
3576
+ validateStateMutation({
3577
+ engine: lix.engine!,
3578
+ schema: mockSchema,
3579
+ snapshot_content: {
3580
+ change_id: realChangeId,
3581
+ },
3582
+ operation: "insert",
3583
+ version_id: "global",
3584
+ })
3585
+ ).not.toThrowError();
3586
+
3587
+ // This should ALSO PASS because changes are versionless and can be referenced from any version
3588
+ expect(() =>
3589
+ validateStateMutation({
3590
+ engine: lix.engine!,
3591
+ schema: mockSchema,
3592
+ snapshot_content: {
3593
+ change_id: realChangeId,
3594
+ },
3595
+ operation: "insert",
3596
+ version_id: activeVersion.version_id,
3597
+ })
3598
+ ).not.toThrowError();
3599
+ });
3600
+
3601
+ // State table foreign key tests
3602
+ test("should validate composite foreign keys referencing state table", async () => {
3603
+ const lix = await openLix({});
3604
+
3605
+ // Create a schema that references state table with composite key (like entity_label does)
3606
+ const mockStateReferenceSchema = {
3607
+ type: "object",
3608
+ "x-lix-version": "1.0",
3609
+ "x-lix-key": "mock_state_reference",
3610
+ "x-lix-primary-key": ["/entity_id", "/schema_key", "/file_id", "/tag"],
3611
+ "x-lix-foreign-keys": [
3612
+ {
3613
+ properties: ["/entity_id", "/schema_key", "/file_id"],
3614
+ references: {
3615
+ schemaKey: "state",
3616
+ properties: ["/entity_id", "/schema_key", "/file_id"],
3617
+ },
3618
+ scope: ["version_id"],
3619
+ },
3620
+ ],
3621
+ properties: {
3622
+ entity_id: { type: "string" },
3623
+ schema_key: { type: "string" },
3624
+ file_id: { type: "string" },
3625
+ tag: { type: "string" },
3626
+ },
3627
+ required: ["entity_id", "schema_key", "file_id", "tag"],
3628
+ additionalProperties: false,
3629
+ } as const satisfies LixSchemaDefinition;
3630
+
3631
+ const referencedStateSchema = {
3632
+ type: "object",
3633
+ "x-lix-version": "1.0",
3634
+ "x-lix-key": "test_schema",
3635
+ properties: {
3636
+ id: { type: "string" },
3637
+ value: { type: "string" },
3638
+ },
3639
+ required: ["id"],
3640
+ additionalProperties: false,
3641
+ } as const satisfies LixSchemaDefinition;
3642
+
3643
+ await lix.db
3644
+ .insertInto("stored_schema")
3645
+ .values({ value: referencedStateSchema })
3646
+ .execute();
3647
+
3648
+ // Store the schema
3649
+ await lix.db
3650
+ .insertInto("stored_schema")
3651
+ .values({ value: mockStateReferenceSchema })
3652
+ .execute();
3653
+
3654
+ const activeVersion = await lix.db
3655
+ .selectFrom("active_version")
3656
+ .select("version_id")
3657
+ .executeTakeFirstOrThrow();
3658
+
3659
+ // First create a state entity that can be referenced
3660
+ await lix.db
3661
+ .insertInto("state_by_version")
3662
+ .values({
3663
+ entity_id: "test_entity",
3664
+ schema_key: "test_schema",
3665
+ file_id: "test_file.json",
3666
+ plugin_key: "test_plugin",
3667
+ version_id: activeVersion.version_id,
3668
+ snapshot_content: { id: "test_entity" },
3669
+ schema_version: "1.0",
3670
+ })
3671
+ .execute();
3672
+
3673
+ // This should PASS - entity exists in state table
3674
+ expect(() =>
3675
+ validateStateMutation({
3676
+ engine: lix.engine!,
3677
+ schema: mockStateReferenceSchema,
3678
+ snapshot_content: {
3679
+ entity_id: "test_entity",
3680
+ schema_key: "test_schema",
3681
+ file_id: "test_file.json",
3682
+ tag: "important",
3683
+ },
3684
+ operation: "insert",
3685
+ version_id: activeVersion.version_id,
3686
+ })
3687
+ ).not.toThrowError();
3688
+
3689
+ // This should FAIL - entity doesn't exist in state table
3690
+ expect(() =>
3691
+ validateStateMutation({
3692
+ engine: lix.engine!,
3693
+ schema: mockStateReferenceSchema,
3694
+ snapshot_content: {
3695
+ entity_id: "nonexistent_entity",
3696
+ schema_key: "test_schema",
3697
+ file_id: "test_file.json",
3698
+ tag: "important",
3699
+ },
3700
+ operation: "insert",
3701
+ version_id: activeVersion.version_id,
3702
+ })
3703
+ ).toThrow(
3704
+ /Foreign key constraint violation.*mock_state_reference.*\(\/entity_id, \/schema_key, \/file_id\).*state\.\(\/entity_id, \/schema_key, \/file_id\).*no matching record exists/
3705
+ );
3706
+ });
3707
+
3708
+ test("state foreign key references should respect version context", async () => {
3709
+ const lix = await openLix({});
3710
+
3711
+ // Create a schema that references state table
3712
+ const mockStateReferenceSchema = {
3713
+ type: "object",
3714
+ "x-lix-version": "1.0",
3715
+ "x-lix-key": "mock_state_reference",
3716
+ "x-lix-primary-key": ["/entity_id", "/schema_key", "/file_id", "/tag"],
3717
+ "x-lix-foreign-keys": [
3718
+ {
3719
+ properties: ["/entity_id", "/schema_key", "/file_id"],
3720
+ references: {
3721
+ schemaKey: "state",
3722
+ properties: ["/entity_id", "/schema_key", "/file_id"],
3723
+ },
3724
+ scope: ["version_id"],
3725
+ },
3726
+ ],
3727
+ properties: {
3728
+ entity_id: { type: "string" },
3729
+ schema_key: { type: "string" },
3730
+ file_id: { type: "string" },
3731
+ tag: { type: "string" },
3732
+ },
3733
+ required: ["entity_id", "schema_key", "file_id", "tag"],
3734
+ additionalProperties: false,
3735
+ } as const satisfies LixSchemaDefinition;
3736
+
3737
+ const referencedStateSchema = {
3738
+ type: "object",
3739
+ "x-lix-version": "1.0",
3740
+ "x-lix-key": "test_schema",
3741
+ properties: {
3742
+ id: { type: "string" },
3743
+ },
3744
+ required: ["id"],
3745
+ additionalProperties: false,
3746
+ } as const satisfies LixSchemaDefinition;
3747
+
3748
+ await lix.db
3749
+ .insertInto("stored_schema")
3750
+ .values({ value: referencedStateSchema })
3751
+ .execute();
3752
+
3753
+ // Store the schema
3754
+ await lix.db
3755
+ .insertInto("stored_schema")
3756
+ .values({ value: mockStateReferenceSchema })
3757
+ .execute();
3758
+
3759
+ // Create a second version
3760
+ const version2 = await createVersion({
3761
+ lix,
3762
+ name: "version2",
3763
+ });
3764
+
3765
+ // Get the main version
3766
+ const mainVersion = await lix.db
3767
+ .selectFrom("version")
3768
+ .select("id")
3769
+ .where("name", "=", "main")
3770
+ .executeTakeFirstOrThrow();
3771
+
3772
+ // Create state entity in main version only
3773
+ await lix.db
3774
+ .insertInto("state_by_version")
3775
+ .values({
3776
+ entity_id: "main_only_entity",
3777
+ schema_key: "test_schema",
3778
+ file_id: "test.json",
3779
+ plugin_key: "test_plugin",
3780
+ version_id: mainVersion.id,
3781
+ snapshot_content: { id: "main_only_entity" },
3782
+ schema_version: "1.0",
3783
+ })
3784
+ .execute();
3785
+
3786
+ // Create state entity in version2 only
3787
+ await lix.db
3788
+ .insertInto("state_by_version")
3789
+ .values({
3790
+ entity_id: "version2_only_entity",
3791
+ schema_key: "test_schema",
3792
+ file_id: "test.json",
3793
+ plugin_key: "test_plugin",
3794
+ version_id: version2.id,
3795
+ snapshot_content: { id: "version2_only_entity" },
3796
+ schema_version: "1.0",
3797
+ })
3798
+ .execute();
3799
+
3800
+ // Reference from main version should only see main entities
3801
+ expect(() =>
3802
+ validateStateMutation({
3803
+ engine: lix.engine!,
3804
+ schema: mockStateReferenceSchema,
3805
+ snapshot_content: {
3806
+ entity_id: "main_only_entity",
3807
+ schema_key: "test_schema",
3808
+ file_id: "test.json",
3809
+ tag: "tag1",
3810
+ },
3811
+ operation: "insert",
3812
+ version_id: mainVersion.id,
3813
+ })
3814
+ ).not.toThrowError();
3815
+
3816
+ // Reference from main version to version2 entity should fail
3817
+ expect(() =>
3818
+ validateStateMutation({
3819
+ engine: lix.engine!,
3820
+ schema: mockStateReferenceSchema,
3821
+ snapshot_content: {
3822
+ entity_id: "version2_only_entity",
3823
+ schema_key: "test_schema",
3824
+ file_id: "test.json",
3825
+ tag: "tag2",
3826
+ },
3827
+ operation: "insert",
3828
+ version_id: mainVersion.id,
3829
+ })
3830
+ ).toThrow(/Foreign key constraint violation/);
3831
+
3832
+ // Reference from version2 should only see version2 entities
3833
+ expect(() =>
3834
+ validateStateMutation({
3835
+ engine: lix.engine!,
3836
+ schema: mockStateReferenceSchema,
3837
+ snapshot_content: {
3838
+ entity_id: "version2_only_entity",
3839
+ schema_key: "test_schema",
3840
+ file_id: "test.json",
3841
+ tag: "tag3",
3842
+ },
3843
+ operation: "insert",
3844
+ version_id: version2.id,
3845
+ })
3846
+ ).not.toThrowError();
3847
+
3848
+ // Reference from version2 to main entity should fail
3849
+ expect(() =>
3850
+ validateStateMutation({
3851
+ engine: lix.engine!,
3852
+ schema: mockStateReferenceSchema,
3853
+ snapshot_content: {
3854
+ entity_id: "main_only_entity",
3855
+ schema_key: "test_schema",
3856
+ file_id: "test.json",
3857
+ tag: "tag4",
3858
+ },
3859
+ operation: "insert",
3860
+ version_id: version2.id,
3861
+ })
3862
+ ).toThrow(/Foreign key constraint violation/);
3863
+ });
3864
+
3865
+ test("state foreign keys reject inherited entities", async () => {
3866
+ const lix = await openLix({
3867
+ keyValues: [
3868
+ {
3869
+ key: "lix_deterministic_mode",
3870
+ value: { enabled: true },
3871
+ lixcol_version_id: "global",
3872
+ },
3873
+ ],
3874
+ });
3875
+
3876
+ // Create a schema that references state table
3877
+ const mockStateReferenceSchema = {
3878
+ type: "object",
3879
+ "x-lix-version": "1.0",
3880
+ "x-lix-key": "mock_state_reference",
3881
+ "x-lix-primary-key": ["/entity_id", "/schema_key", "/file_id", "/tag"],
3882
+ "x-lix-foreign-keys": [
3883
+ {
3884
+ properties: ["/entity_id", "/schema_key", "/file_id"],
3885
+ references: {
3886
+ schemaKey: "state",
3887
+ properties: ["/entity_id", "/schema_key", "/file_id"],
3888
+ },
3889
+ scope: ["version_id"],
3890
+ },
3891
+ ],
3892
+ properties: {
3893
+ entity_id: { type: "string" },
3894
+ schema_key: { type: "string" },
3895
+ file_id: { type: "string" },
3896
+ tag: { type: "string" },
3897
+ },
3898
+ required: ["entity_id", "schema_key", "file_id", "tag"],
3899
+ additionalProperties: false,
3900
+ } as const satisfies LixSchemaDefinition;
3901
+
3902
+ const referencedStateSchema = {
3903
+ type: "object",
3904
+ "x-lix-version": "1.0",
3905
+ "x-lix-key": "test_schema",
3906
+ properties: {
3907
+ id: { type: "string" },
3908
+ value: { type: "string" },
3909
+ },
3910
+ required: ["id"],
3911
+ additionalProperties: false,
3912
+ } as const satisfies LixSchemaDefinition;
3913
+
3914
+ await lix.db
3915
+ .insertInto("stored_schema")
3916
+ .values([
3917
+ { value: referencedStateSchema },
3918
+ { value: mockStateReferenceSchema },
3919
+ ])
3920
+ .execute();
3921
+
3922
+ // Seed state in the global version so it appears as inherited elsewhere
3923
+ await lix.db
3924
+ .insertInto("state_by_version")
3925
+ .values({
3926
+ entity_id: "shared_entity",
3927
+ schema_key: "test_schema",
3928
+ file_id: "test.json",
3929
+ plugin_key: "test_plugin",
3930
+ version_id: "global",
3931
+ snapshot_content: { id: "shared_entity", value: "original" },
3932
+ schema_version: "1.0",
3933
+ })
3934
+ .execute();
3935
+
3936
+ const activeVersion = await lix.db
3937
+ .selectFrom("active_version")
3938
+ .innerJoin("version", "version.id", "active_version.version_id")
3939
+ .selectAll("version")
3940
+ .executeTakeFirstOrThrow();
3941
+
3942
+ // The inherited entity should NOT be visible for foreign key validation
3943
+ // because foreign keys only validate entities in the same version (not inherited)
3944
+ expect(() =>
3945
+ validateStateMutation({
3946
+ engine: lix.engine!,
3947
+ schema: mockStateReferenceSchema,
3948
+ snapshot_content: {
3949
+ entity_id: "shared_entity",
3950
+ schema_key: "test_schema",
3951
+ file_id: "test.json",
3952
+ tag: "from_child",
3953
+ },
3954
+ operation: "insert",
3955
+ version_id: activeVersion.id,
3956
+ })
3957
+ ).toThrow(
3958
+ /Foreign key constraint violation.*no matching record exists.*Note: Foreign key constraints only validate entities that exist in the version context/s
3959
+ );
3960
+ });
3961
+
3962
+ test("state foreign key with mixed single and composite properties", async () => {
3963
+ const lix = await openLix({});
3964
+
3965
+ // Create a complex schema with multiple foreign keys
3966
+ const complexSchema = {
3967
+ type: "object",
3968
+ "x-lix-version": "1.0",
3969
+ "x-lix-key": "complex_reference",
3970
+ "x-lix-primary-key": ["/id"],
3971
+ "x-lix-foreign-keys": [
3972
+ {
3973
+ // Composite foreign key to state
3974
+ properties: ["/entity_id", "/schema_key", "/file_id"],
3975
+ references: {
3976
+ schemaKey: "state",
3977
+ properties: ["/entity_id", "/schema_key", "/file_id"],
3978
+ },
3979
+ },
3980
+ {
3981
+ // Single property foreign key to change
3982
+ properties: ["/change_id"],
3983
+ references: {
3984
+ schemaKey: "lix_change",
3985
+ properties: ["/id"],
3986
+ },
3987
+ },
3988
+ ],
3989
+ properties: {
3990
+ id: { type: "string" },
3991
+ entity_id: { type: "string" },
3992
+ schema_key: { type: "string" },
3993
+ file_id: { type: "string" },
3994
+ change_id: { type: "string" },
3995
+ },
3996
+ required: ["id", "entity_id", "schema_key", "file_id", "change_id"],
3997
+ additionalProperties: false,
3998
+ } as const satisfies LixSchemaDefinition;
3999
+
4000
+ const referencedStateSchema = {
4001
+ type: "object",
4002
+ "x-lix-version": "1.0",
4003
+ "x-lix-key": "test_schema",
4004
+ properties: {
4005
+ id: { type: "string" },
4006
+ },
4007
+ required: ["id"],
4008
+ additionalProperties: false,
4009
+ } as const satisfies LixSchemaDefinition;
4010
+
4011
+ await lix.db
4012
+ .insertInto("stored_schema")
4013
+ .values({ value: referencedStateSchema })
4014
+ .execute();
4015
+
4016
+ // Store the schema
4017
+ await lix.db
4018
+ .insertInto("stored_schema")
4019
+ .values({ value: complexSchema })
4020
+ .execute();
4021
+
4022
+ const activeVersion = await lix.db
4023
+ .selectFrom("active_version")
4024
+ .select("version_id")
4025
+ .executeTakeFirstOrThrow();
4026
+
4027
+ // Create a state entity
4028
+ await lix.db
4029
+ .insertInto("state_by_version")
4030
+ .values({
4031
+ entity_id: "test_entity",
4032
+ schema_key: "test_schema",
4033
+ file_id: "test.json",
4034
+ plugin_key: "test_plugin",
4035
+ version_id: activeVersion.version_id,
4036
+ snapshot_content: { id: "test_entity" },
4037
+ schema_version: "1.0",
4038
+ })
4039
+ .execute();
4040
+
4041
+ // Create a key-value to generate a change
4042
+ await lix.db
4043
+ .insertInto("key_value")
4044
+ .values({
4045
+ key: "test_key",
4046
+ value: "test_value",
4047
+ })
4048
+ .execute();
4049
+
4050
+ // Get the created change
4051
+ const changes = await lix.db
4052
+ .selectFrom("change")
4053
+ .select("id")
4054
+ .where("entity_id", "=", "test_key")
4055
+ .execute();
4056
+
4057
+ expect(changes).toHaveLength(1);
4058
+ const changeId = changes[0]!.id;
4059
+
4060
+ // This should PASS - both foreign keys are satisfied
4061
+ expect(() =>
4062
+ validateStateMutation({
4063
+ engine: lix.engine!,
4064
+ schema: complexSchema,
4065
+ snapshot_content: {
4066
+ id: "complex1",
4067
+ entity_id: "test_entity",
4068
+ schema_key: "test_schema",
4069
+ file_id: "test.json",
4070
+ change_id: changeId,
4071
+ },
4072
+ operation: "insert",
4073
+ version_id: activeVersion.version_id,
4074
+ })
4075
+ ).not.toThrowError();
4076
+
4077
+ // This should FAIL - state foreign key not satisfied
4078
+ expect(() =>
4079
+ validateStateMutation({
4080
+ engine: lix.engine!,
4081
+ schema: complexSchema,
4082
+ snapshot_content: {
4083
+ id: "complex2",
4084
+ entity_id: "nonexistent",
4085
+ schema_key: "test_schema",
4086
+ file_id: "test.json",
4087
+ change_id: changeId,
4088
+ },
4089
+ operation: "insert",
4090
+ version_id: activeVersion.version_id,
4091
+ })
4092
+ ).toThrow(/Foreign key constraint violation.*state/);
4093
+
4094
+ // This should FAIL - change foreign key not satisfied
4095
+ expect(() =>
4096
+ validateStateMutation({
4097
+ engine: lix.engine!,
4098
+ schema: complexSchema,
4099
+ snapshot_content: {
4100
+ id: "complex3",
4101
+ entity_id: "test_entity",
4102
+ schema_key: "test_schema",
4103
+ file_id: "test.json",
4104
+ change_id: "nonexistent_change",
4105
+ },
4106
+ operation: "insert",
4107
+ version_id: activeVersion.version_id,
4108
+ })
4109
+ ).toThrow(/Foreign key constraint violation.*lix_change/);
4110
+ });
4111
+
4112
+ test("rejects mutating inherited state", async () => {
4113
+ const lix = await openLix({
4114
+ keyValues: [
4115
+ {
4116
+ key: "lix_deterministic_mode",
4117
+ value: { enabled: true },
4118
+ lixcol_version_id: "global",
4119
+ },
4120
+ ],
4121
+ });
4122
+
4123
+ const schema = {
4124
+ type: "object",
4125
+ "x-lix-version": "1.0",
4126
+ "x-lix-key": "mock_inherited_entity",
4127
+ properties: {
4128
+ value: { type: "string" },
4129
+ },
4130
+ required: ["value"],
4131
+ additionalProperties: false,
4132
+ } as const satisfies LixSchemaDefinition;
4133
+
4134
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
4135
+
4136
+ await lix.db
4137
+ .insertInto("state_by_version")
4138
+ .values({
4139
+ entity_id: "inherited-entity",
4140
+ file_id: "test-file",
4141
+ schema_key: schema["x-lix-key"],
4142
+ plugin_key: "test_plugin",
4143
+ version_id: "global",
4144
+ schema_version: schema["x-lix-version"],
4145
+ snapshot_content: {
4146
+ value: "global seed",
4147
+ },
4148
+ })
4149
+ .execute();
4150
+
4151
+ const activeVersion = await lix.db
4152
+ .selectFrom("active_version")
4153
+ .select("version_id")
4154
+ .executeTakeFirstOrThrow();
4155
+
4156
+ const resolved = await lix.db
4157
+ .selectFrom("state_by_version")
4158
+ .select(["inherited_from_version_id"])
4159
+ .where("entity_id", "=", "inherited-entity")
4160
+ .where("schema_key", "=", schema["x-lix-key"])
4161
+ .where("version_id", "=", activeVersion.version_id)
4162
+ .executeTakeFirstOrThrow();
4163
+
4164
+ expect(resolved.inherited_from_version_id).toBe("global");
4165
+
4166
+ expect(() =>
4167
+ validateStateMutation({
4168
+ engine: lix.engine!,
4169
+ schema,
4170
+ snapshot_content: { value: "child update" },
4171
+ operation: "update",
4172
+ entity_id: "inherited-entity",
4173
+ version_id: activeVersion.version_id,
4174
+ })
4175
+ ).toThrow(/inherited/i);
4176
+
4177
+ expect(() =>
4178
+ validateStateMutation({
4179
+ engine: lix.engine!,
4180
+ schema,
4181
+ snapshot_content: { value: "global seed" },
4182
+ operation: "delete",
4183
+ entity_id: "inherited-entity",
4184
+ file_id: "test-file",
4185
+ version_id: activeVersion.version_id,
4186
+ })
4187
+ ).toThrow(/inherited/i);
4188
+ });
4189
+
4190
+ test("rejects mutating inherited_from_version_id", async () => {
4191
+ const lix = await openLix({
4192
+ keyValues: [
4193
+ {
4194
+ key: "lix_deterministic_mode",
4195
+ value: { enabled: true },
4196
+ lixcol_version_id: "global",
4197
+ },
4198
+ ],
4199
+ });
4200
+
4201
+ const schema = {
4202
+ type: "object",
4203
+ "x-lix-version": "1.0",
4204
+ "x-lix-key": "mock_local_entity",
4205
+ properties: {
4206
+ value: { type: "string" },
4207
+ },
4208
+ required: ["value"],
4209
+ additionalProperties: false,
4210
+ } as const satisfies LixSchemaDefinition;
4211
+
4212
+ await lix.db.insertInto("stored_schema").values({ value: schema }).execute();
4213
+
4214
+ const activeVersion = await lix.db
4215
+ .selectFrom("active_version")
4216
+ .select("version_id")
4217
+ .executeTakeFirstOrThrow();
4218
+
4219
+ await lix.db
4220
+ .insertInto("state_by_version")
4221
+ .values({
4222
+ entity_id: "local-entity",
4223
+ file_id: "test-file",
4224
+ schema_key: schema["x-lix-key"],
4225
+ plugin_key: "test_plugin",
4226
+ version_id: activeVersion.version_id,
4227
+ schema_version: schema["x-lix-version"],
4228
+ snapshot_content: {
4229
+ value: "local seed",
4230
+ },
4231
+ })
4232
+ .execute();
4233
+
4234
+ const before = await lix.db
4235
+ .selectFrom("state_by_version")
4236
+ .select(["inherited_from_version_id"])
4237
+ .where("entity_id", "=", "local-entity")
4238
+ .where("schema_key", "=", schema["x-lix-key"])
4239
+ .where("version_id", "=", activeVersion.version_id)
4240
+ .executeTakeFirstOrThrow();
4241
+
4242
+ expect(before.inherited_from_version_id).toBeNull();
4243
+
4244
+ expect(() =>
4245
+ validateStateMutation({
4246
+ engine: lix.engine!,
4247
+ schema,
4248
+ snapshot_content: { value: "local seed" },
4249
+ operation: "update",
4250
+ entity_id: "local-entity",
4251
+ version_id: activeVersion.version_id,
4252
+ inherited_from_version_id: "global",
4253
+ })
4254
+ ).toThrow(/inherited_from_version_id/i);
4255
+
4256
+ const after = await lix.db
4257
+ .selectFrom("state_by_version")
4258
+ .select(["inherited_from_version_id"])
4259
+ .where("entity_id", "=", "local-entity")
4260
+ .where("schema_key", "=", schema["x-lix-key"])
4261
+ .where("version_id", "=", activeVersion.version_id)
4262
+ .executeTakeFirstOrThrow();
4263
+
4264
+ expect(after.inherited_from_version_id).toBeNull();
4265
+ });