@lix-js/sdk 0.4.7 → 0.5.0-preview.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 (1106) hide show
  1. package/dist/account/create-account.d.ts +17 -3
  2. package/dist/account/create-account.d.ts.map +1 -1
  3. package/dist/account/create-account.js +27 -3
  4. package/dist/account/create-account.js.map +1 -1
  5. package/dist/account/create-account.test.js +42 -4
  6. package/dist/account/create-account.test.js.map +1 -1
  7. package/dist/account/index.d.ts +1 -1
  8. package/dist/account/index.d.ts.map +1 -1
  9. package/dist/account/index.js +1 -1
  10. package/dist/account/index.js.map +1 -1
  11. package/dist/account/schema.d.ts +28 -0
  12. package/dist/account/schema.d.ts.map +1 -0
  13. package/dist/account/schema.js +55 -0
  14. package/dist/account/schema.js.map +1 -0
  15. package/dist/account/schema.test.d.ts +2 -0
  16. package/dist/account/schema.test.d.ts.map +1 -0
  17. package/dist/account/schema.test.js +306 -0
  18. package/dist/account/schema.test.js.map +1 -0
  19. package/dist/account/switch-account.d.ts +2 -2
  20. package/dist/account/switch-account.d.ts.map +1 -1
  21. package/dist/account/switch-account.js +8 -1
  22. package/dist/account/switch-account.js.map +1 -1
  23. package/dist/account/switch-account.test.js +27 -6
  24. package/dist/account/switch-account.test.js.map +1 -1
  25. package/dist/change/create-change.d.ts +11 -22
  26. package/dist/change/create-change.d.ts.map +1 -1
  27. package/dist/change/create-change.js +29 -83
  28. package/dist/change/create-change.js.map +1 -1
  29. package/dist/change/create-change.test.js +129 -176
  30. package/dist/change/create-change.test.js.map +1 -1
  31. package/dist/change/index.d.ts +1 -2
  32. package/dist/change/index.d.ts.map +1 -1
  33. package/dist/change/index.js +1 -2
  34. package/dist/change/index.js.map +1 -1
  35. package/dist/change/mock-change.d.ts +1 -1
  36. package/dist/change/mock-change.d.ts.map +1 -1
  37. package/dist/change/mock-change.js +1 -0
  38. package/dist/change/mock-change.js.map +1 -1
  39. package/dist/change/schema.d.ts +28 -0
  40. package/dist/change/schema.d.ts.map +1 -0
  41. package/dist/change/schema.js +62 -0
  42. package/dist/change/schema.js.map +1 -0
  43. package/dist/change/schema.test.d.ts +2 -0
  44. package/dist/change/schema.test.d.ts.map +1 -0
  45. package/dist/change/schema.test.js +235 -0
  46. package/dist/change/schema.test.js.map +1 -0
  47. package/dist/change-author/index.d.ts +2 -0
  48. package/dist/change-author/index.d.ts.map +1 -0
  49. package/dist/change-author/index.js +2 -0
  50. package/dist/change-author/index.js.map +1 -0
  51. package/dist/change-author/schema.d.ts +31 -0
  52. package/dist/change-author/schema.d.ts.map +1 -0
  53. package/dist/change-author/schema.js +35 -0
  54. package/dist/change-author/schema.js.map +1 -0
  55. package/dist/change-author/schema.test.d.ts +2 -0
  56. package/dist/change-author/schema.test.d.ts.map +1 -0
  57. package/dist/change-author/schema.test.js +256 -0
  58. package/dist/change-author/schema.test.js.map +1 -0
  59. package/dist/change-conflict/create-change-conflict.d.ts.map +1 -1
  60. package/dist/change-conflict/create-change-conflict.js +24 -6
  61. package/dist/change-conflict/create-change-conflict.js.map +1 -1
  62. package/dist/change-conflict/create-change-conflict.test.js +13 -11
  63. package/dist/change-conflict/create-change-conflict.test.js.map +1 -1
  64. package/dist/change-conflict/detect-change-conflicts.d.ts.map +1 -1
  65. package/dist/change-conflict/detect-change-conflicts.js +2 -0
  66. package/dist/change-conflict/detect-change-conflicts.js.map +1 -1
  67. package/dist/change-conflict/detect-change-conflicts.test.js +17 -13
  68. package/dist/change-conflict/detect-change-conflicts.test.js.map +1 -1
  69. package/dist/change-conflict/detect-diverging-entity-conflict.d.ts.map +1 -1
  70. package/dist/change-conflict/detect-diverging-entity-conflict.js +3 -1
  71. package/dist/change-conflict/detect-diverging-entity-conflict.js.map +1 -1
  72. package/dist/change-conflict/detect-diverging-entity-conflict.test.js +23 -21
  73. package/dist/change-conflict/detect-diverging-entity-conflict.test.js.map +1 -1
  74. package/dist/change-conflict/garbage-collect-change-conflicts.d.ts.map +1 -1
  75. package/dist/change-conflict/garbage-collect-change-conflicts.js +2 -0
  76. package/dist/change-conflict/garbage-collect-change-conflicts.js.map +1 -1
  77. package/dist/change-conflict/garbage-collect-change-conflicts.test.js +15 -15
  78. package/dist/change-conflict/garbage-collect-change-conflicts.test.js.map +1 -1
  79. package/dist/change-conflict/resolve-conflict-by-selecting.d.ts.map +1 -1
  80. package/dist/change-conflict/resolve-conflict-by-selecting.js +2 -2
  81. package/dist/change-conflict/resolve-conflict-by-selecting.js.map +1 -1
  82. package/dist/change-conflict/resolve-conflict-by-selecting.test.js +17 -8
  83. package/dist/change-conflict/resolve-conflict-by-selecting.test.js.map +1 -1
  84. package/dist/change-proposal/create-change-proposal.d.ts +16 -0
  85. package/dist/change-proposal/create-change-proposal.d.ts.map +1 -0
  86. package/dist/change-proposal/create-change-proposal.js +52 -0
  87. package/dist/change-proposal/create-change-proposal.js.map +1 -0
  88. package/dist/change-proposal/create-change-proposal.test.d.ts +2 -0
  89. package/dist/change-proposal/create-change-proposal.test.d.ts.map +1 -0
  90. package/dist/change-proposal/create-change-proposal.test.js +91 -0
  91. package/dist/change-proposal/create-change-proposal.test.js.map +1 -0
  92. package/dist/change-proposal/database-schema.d.ts +13 -0
  93. package/dist/change-proposal/database-schema.d.ts.map +1 -0
  94. package/dist/change-proposal/database-schema.js +17 -0
  95. package/dist/change-proposal/database-schema.js.map +1 -0
  96. package/dist/change-proposal/database-schema.test.d.ts +2 -0
  97. package/dist/change-proposal/database-schema.test.d.ts.map +1 -0
  98. package/dist/change-proposal/database-schema.test.js +159 -0
  99. package/dist/change-proposal/database-schema.test.js.map +1 -0
  100. package/dist/change-proposal/index.d.ts +3 -0
  101. package/dist/change-proposal/index.d.ts.map +1 -0
  102. package/dist/change-proposal/index.js +3 -0
  103. package/dist/change-proposal/index.js.map +1 -0
  104. package/dist/change-set/apply-change-set.d.ts +10 -0
  105. package/dist/change-set/apply-change-set.d.ts.map +1 -0
  106. package/dist/change-set/apply-change-set.js +150 -0
  107. package/dist/change-set/apply-change-set.js.map +1 -0
  108. package/dist/change-set/apply-change-set.test.d.ts +2 -0
  109. package/dist/change-set/apply-change-set.test.d.ts.map +1 -0
  110. package/dist/change-set/apply-change-set.test.js +390 -0
  111. package/dist/change-set/apply-change-set.test.js.map +1 -0
  112. package/dist/change-set/change-set-element-in-symmetric-difference.d.ts.map +1 -1
  113. package/dist/change-set/create-change-set.d.ts +19 -18
  114. package/dist/change-set/create-change-set.d.ts.map +1 -1
  115. package/dist/change-set/create-change-set.js +95 -34
  116. package/dist/change-set/create-change-set.js.map +1 -1
  117. package/dist/change-set/create-change-set.test.js +109 -27
  118. package/dist/change-set/create-change-set.test.js.map +1 -1
  119. package/dist/change-set/create-checkpoint.d.ts +19 -0
  120. package/dist/change-set/create-checkpoint.d.ts.map +1 -0
  121. package/dist/change-set/create-checkpoint.js +86 -0
  122. package/dist/change-set/create-checkpoint.js.map +1 -0
  123. package/dist/change-set/create-checkpoint.test.d.ts +2 -0
  124. package/dist/change-set/create-checkpoint.test.d.ts.map +1 -0
  125. package/dist/change-set/create-checkpoint.test.js +294 -0
  126. package/dist/change-set/create-checkpoint.test.js.map +1 -0
  127. package/dist/change-set/create-merge-change-set.d.ts +23 -0
  128. package/dist/change-set/create-merge-change-set.d.ts.map +1 -0
  129. package/dist/change-set/create-merge-change-set.js +68 -0
  130. package/dist/change-set/create-merge-change-set.js.map +1 -0
  131. package/dist/change-set/create-merge-change-set.test.d.ts +2 -0
  132. package/dist/change-set/create-merge-change-set.test.d.ts.map +1 -0
  133. package/dist/change-set/create-merge-change-set.test.js +211 -0
  134. package/dist/change-set/create-merge-change-set.test.js.map +1 -0
  135. package/dist/change-set/create-transition-change-set.d.ts +18 -0
  136. package/dist/change-set/create-transition-change-set.d.ts.map +1 -0
  137. package/dist/change-set/create-transition-change-set.js +102 -0
  138. package/dist/change-set/create-transition-change-set.js.map +1 -0
  139. package/dist/change-set/create-transition-change-set.test.d.ts +2 -0
  140. package/dist/change-set/create-transition-change-set.test.d.ts.map +1 -0
  141. package/dist/change-set/create-transition-change-set.test.js +211 -0
  142. package/dist/change-set/create-transition-change-set.test.js.map +1 -0
  143. package/dist/change-set/create-undo-change-set.d.ts +27 -0
  144. package/dist/change-set/create-undo-change-set.d.ts.map +1 -0
  145. package/dist/change-set/create-undo-change-set.js +121 -0
  146. package/dist/change-set/create-undo-change-set.js.map +1 -0
  147. package/dist/change-set/create-undo-change-set.test.d.ts +2 -0
  148. package/dist/change-set/create-undo-change-set.test.d.ts.map +1 -0
  149. package/dist/change-set/create-undo-change-set.test.js +273 -0
  150. package/dist/change-set/create-undo-change-set.test.js.map +1 -0
  151. package/dist/change-set/index.d.ts +6 -1
  152. package/dist/change-set/index.d.ts.map +1 -1
  153. package/dist/change-set/index.js +6 -1
  154. package/dist/change-set/index.js.map +1 -1
  155. package/dist/change-set/schema.d.ts +149 -0
  156. package/dist/change-set/schema.d.ts.map +1 -0
  157. package/dist/change-set/schema.js +169 -0
  158. package/dist/change-set/schema.js.map +1 -0
  159. package/dist/change-set/schema.test.d.ts +2 -0
  160. package/dist/change-set/schema.test.d.ts.map +1 -0
  161. package/dist/change-set/schema.test.js +821 -0
  162. package/dist/change-set/schema.test.js.map +1 -0
  163. package/dist/database/execute-sync.d.ts +12 -6
  164. package/dist/database/execute-sync.d.ts.map +1 -1
  165. package/dist/database/execute-sync.js +25 -24
  166. package/dist/database/execute-sync.js.map +1 -1
  167. package/dist/database/execute-sync.test.js +53 -60
  168. package/dist/database/execute-sync.test.js.map +1 -1
  169. package/dist/database/graph-traversal-mode.d.ts +72 -0
  170. package/dist/database/graph-traversal-mode.d.ts.map +1 -0
  171. package/dist/database/graph-traversal-mode.js +2 -0
  172. package/dist/database/graph-traversal-mode.js.map +1 -0
  173. package/dist/database/index.d.ts +3 -2
  174. package/dist/database/index.d.ts.map +1 -1
  175. package/dist/database/index.js +3 -2
  176. package/dist/database/index.js.map +1 -1
  177. package/dist/database/init-db.d.ts +2 -0
  178. package/dist/database/init-db.d.ts.map +1 -1
  179. package/dist/database/init-db.js +69 -56
  180. package/dist/database/init-db.js.map +1 -1
  181. package/dist/database/kysely-plugin/json-column-plugin.d.ts +3 -0
  182. package/dist/database/kysely-plugin/json-column-plugin.d.ts.map +1 -0
  183. package/dist/database/kysely-plugin/json-column-plugin.js +168 -0
  184. package/dist/database/kysely-plugin/json-column-plugin.js.map +1 -0
  185. package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.d.ts.map +1 -1
  186. package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.js +5 -10
  187. package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.js.map +1 -1
  188. package/dist/database/kysely-plugin/parse-jsonb-plugin-v2.js +1 -1
  189. package/dist/database/kysely-plugin/parse-jsonb-plugin-v2.js.map +1 -1
  190. package/dist/database/kysely-plugin/serialize-jsonb-plugin.d.ts +14 -2
  191. package/dist/database/kysely-plugin/serialize-jsonb-plugin.d.ts.map +1 -1
  192. package/dist/database/kysely-plugin/serialize-jsonb-plugin.js +145 -74
  193. package/dist/database/kysely-plugin/serialize-jsonb-plugin.js.map +1 -1
  194. package/dist/database/kysely-plugin/serialize-jsonb-plugin.test.js +145 -1
  195. package/dist/database/kysely-plugin/serialize-jsonb-plugin.test.js.map +1 -1
  196. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.d.ts +15 -0
  197. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.d.ts.map +1 -0
  198. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.js +31 -0
  199. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.js.map +1 -0
  200. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.test.d.ts +2 -0
  201. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.test.d.ts.map +1 -0
  202. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.test.js +51 -0
  203. package/dist/database/kysely-plugin/view-insert-returning-error-plugin.test.js.map +1 -0
  204. package/dist/database/schema.d.ts +42 -208
  205. package/dist/database/schema.d.ts.map +1 -1
  206. package/dist/database/schema.js +35 -1
  207. package/dist/database/schema.js.map +1 -1
  208. package/dist/entity-views/entity-state-all.d.ts +217 -0
  209. package/dist/entity-views/entity-state-all.d.ts.map +1 -0
  210. package/dist/entity-views/entity-state-all.js +246 -0
  211. package/dist/entity-views/entity-state-all.js.map +1 -0
  212. package/dist/entity-views/entity-state-all.test.d.ts +2 -0
  213. package/dist/entity-views/entity-state-all.test.d.ts.map +1 -0
  214. package/dist/entity-views/entity-state-all.test.js +371 -0
  215. package/dist/entity-views/entity-state-all.test.js.map +1 -0
  216. package/dist/entity-views/entity-state-history.d.ts +178 -0
  217. package/dist/entity-views/entity-state-history.d.ts.map +1 -0
  218. package/dist/entity-views/entity-state-history.js +58 -0
  219. package/dist/entity-views/entity-state-history.js.map +1 -0
  220. package/dist/entity-views/entity-state-history.test.d.ts +2 -0
  221. package/dist/entity-views/entity-state-history.test.d.ts.map +1 -0
  222. package/dist/entity-views/entity-state-history.test.js +274 -0
  223. package/dist/entity-views/entity-state-history.test.js.map +1 -0
  224. package/dist/entity-views/entity-state.d.ts +217 -0
  225. package/dist/entity-views/entity-state.d.ts.map +1 -0
  226. package/dist/entity-views/entity-state.js +243 -0
  227. package/dist/entity-views/entity-state.js.map +1 -0
  228. package/dist/entity-views/entity-state.test.d.ts +2 -0
  229. package/dist/entity-views/entity-state.test.d.ts.map +1 -0
  230. package/dist/entity-views/entity-state.test.js +497 -0
  231. package/dist/entity-views/entity-state.test.js.map +1 -0
  232. package/dist/entity-views/entity-state_history.d.ts +67 -0
  233. package/dist/entity-views/entity-state_history.d.ts.map +1 -0
  234. package/dist/entity-views/entity-state_history.js +58 -0
  235. package/dist/entity-views/entity-state_history.js.map +1 -0
  236. package/dist/entity-views/entity-view-builder.d.ts +92 -0
  237. package/dist/entity-views/entity-view-builder.d.ts.map +1 -0
  238. package/dist/entity-views/entity-view-builder.js +63 -0
  239. package/dist/entity-views/entity-view-builder.js.map +1 -0
  240. package/dist/entity-views/entity-view-builder.test.d.ts +2 -0
  241. package/dist/entity-views/entity-view-builder.test.d.ts.map +1 -0
  242. package/dist/entity-views/entity-view-builder.test.js +247 -0
  243. package/dist/entity-views/entity-view-builder.test.js.map +1 -0
  244. package/dist/entity-views/generic-types.d.ts +128 -0
  245. package/dist/entity-views/generic-types.d.ts.map +1 -0
  246. package/dist/entity-views/generic-types.js +2 -0
  247. package/dist/entity-views/generic-types.js.map +1 -0
  248. package/dist/entity-views/generic-types.test.d.ts +2 -0
  249. package/dist/entity-views/generic-types.test.d.ts.map +1 -0
  250. package/dist/entity-views/generic-types.test.js +99 -0
  251. package/dist/entity-views/generic-types.test.js.map +1 -0
  252. package/dist/entity-views/index.d.ts +2 -0
  253. package/dist/entity-views/index.d.ts.map +1 -0
  254. package/dist/entity-views/index.js +2 -0
  255. package/dist/entity-views/index.js.map +1 -0
  256. package/dist/entity-views/types.d.ts +309 -0
  257. package/dist/entity-views/types.d.ts.map +1 -0
  258. package/dist/entity-views/types.js +2 -0
  259. package/dist/entity-views/types.js.map +1 -0
  260. package/dist/entity-views/types.test.d.ts +2 -0
  261. package/dist/entity-views/types.test.d.ts.map +1 -0
  262. package/dist/entity-views/types.test.js +62 -0
  263. package/dist/entity-views/types.test.js.map +1 -0
  264. package/dist/file/file-handlers.d.ts +15 -0
  265. package/dist/file/file-handlers.d.ts.map +1 -0
  266. package/dist/file/file-handlers.js +318 -0
  267. package/dist/file/file-handlers.js.map +1 -0
  268. package/dist/file/file-handlers.test.d.ts +2 -0
  269. package/dist/file/file-handlers.test.d.ts.map +1 -0
  270. package/dist/file/file-handlers.test.js +151 -0
  271. package/dist/file/file-handlers.test.js.map +1 -0
  272. package/dist/file/index.d.ts +1 -1
  273. package/dist/file/index.d.ts.map +1 -1
  274. package/dist/file/index.js +1 -1
  275. package/dist/file/index.js.map +1 -1
  276. package/dist/file/materialize-file-data-at-changeset.d.ts +9 -0
  277. package/dist/file/materialize-file-data-at-changeset.d.ts.map +1 -0
  278. package/dist/file/materialize-file-data-at-changeset.js +93 -0
  279. package/dist/file/materialize-file-data-at-changeset.js.map +1 -0
  280. package/dist/file/materialize-file-data.d.ts +8 -0
  281. package/dist/file/materialize-file-data.d.ts.map +1 -0
  282. package/dist/file/materialize-file-data.js +91 -0
  283. package/dist/file/materialize-file-data.js.map +1 -0
  284. package/dist/file/materialize-file-data.test.d.ts +2 -0
  285. package/dist/file/materialize-file-data.test.d.ts.map +1 -0
  286. package/dist/file/materialize-file-data.test.js +90 -0
  287. package/dist/file/materialize-file-data.test.js.map +1 -0
  288. package/dist/file/schema.d.ts +46 -0
  289. package/dist/file/schema.d.ts.map +1 -0
  290. package/dist/file/schema.js +265 -0
  291. package/dist/file/schema.js.map +1 -0
  292. package/dist/file/schema.test.d.ts +2 -0
  293. package/dist/file/schema.test.d.ts.map +1 -0
  294. package/dist/file/schema.test.js +805 -0
  295. package/dist/file/schema.test.js.map +1 -0
  296. package/dist/file/store-detected-change-schema.d.ts +8 -0
  297. package/dist/file/store-detected-change-schema.d.ts.map +1 -0
  298. package/dist/file/store-detected-change-schema.js +41 -0
  299. package/dist/file/store-detected-change-schema.js.map +1 -0
  300. package/dist/file/store-detected-change-schema.test.d.ts +2 -0
  301. package/dist/file/store-detected-change-schema.test.d.ts.map +1 -0
  302. package/dist/file/store-detected-change-schema.test.js +211 -0
  303. package/dist/file/store-detected-change-schema.test.js.map +1 -0
  304. package/dist/file/unknown-file-fallback-plugin.d.ts +22 -0
  305. package/dist/file/unknown-file-fallback-plugin.d.ts.map +1 -0
  306. package/dist/file/unknown-file-fallback-plugin.js +73 -0
  307. package/dist/file/unknown-file-fallback-plugin.js.map +1 -0
  308. package/dist/file/unknown-file-fallback-plugin.test.d.ts +2 -0
  309. package/dist/file/unknown-file-fallback-plugin.test.d.ts.map +1 -0
  310. package/dist/file/unknown-file-fallback-plugin.test.js +305 -0
  311. package/dist/file/unknown-file-fallback-plugin.test.js.map +1 -0
  312. package/dist/hooks/create-hooks.d.ts +72 -0
  313. package/dist/hooks/create-hooks.d.ts.map +1 -0
  314. package/dist/hooks/create-hooks.js +29 -0
  315. package/dist/hooks/create-hooks.js.map +1 -0
  316. package/dist/hooks/create-hooks.test.d.ts +2 -0
  317. package/dist/hooks/create-hooks.test.d.ts.map +1 -0
  318. package/dist/hooks/create-hooks.test.js +98 -0
  319. package/dist/hooks/create-hooks.test.js.map +1 -0
  320. package/dist/hooks/index.d.ts +2 -0
  321. package/dist/hooks/index.d.ts.map +1 -0
  322. package/dist/hooks/index.js +2 -0
  323. package/dist/hooks/index.js.map +1 -0
  324. package/dist/index.d.ts +10 -6
  325. package/dist/index.d.ts.map +1 -1
  326. package/dist/index.js +10 -6
  327. package/dist/index.js.map +1 -1
  328. package/dist/key-value/index.d.ts +2 -0
  329. package/dist/key-value/index.d.ts.map +1 -0
  330. package/dist/key-value/index.js +2 -0
  331. package/dist/key-value/index.js.map +1 -0
  332. package/dist/key-value/schema.d.ts +21 -0
  333. package/dist/key-value/schema.d.ts.map +1 -0
  334. package/dist/key-value/schema.js +25 -0
  335. package/dist/key-value/schema.js.map +1 -0
  336. package/dist/key-value/schema.test.d.ts +2 -0
  337. package/dist/key-value/schema.test.d.ts.map +1 -0
  338. package/dist/key-value/schema.test.js +148 -0
  339. package/dist/key-value/schema.test.js.map +1 -0
  340. package/dist/label/create-label.d.ts +20 -0
  341. package/dist/label/create-label.d.ts.map +1 -0
  342. package/dist/label/create-label.js +45 -0
  343. package/dist/label/create-label.js.map +1 -0
  344. package/dist/label/create-label.test.d.ts +2 -0
  345. package/dist/label/create-label.test.d.ts.map +1 -0
  346. package/dist/label/create-label.test.js +191 -0
  347. package/dist/label/create-label.test.js.map +1 -0
  348. package/dist/label/index.d.ts +3 -0
  349. package/dist/label/index.d.ts.map +1 -0
  350. package/dist/label/index.js +3 -0
  351. package/dist/label/index.js.map +1 -0
  352. package/dist/label/schema.d.ts +22 -0
  353. package/dist/label/schema.d.ts.map +1 -0
  354. package/dist/label/schema.js +28 -0
  355. package/dist/label/schema.js.map +1 -0
  356. package/dist/label/schema.test.d.ts +2 -0
  357. package/dist/label/schema.test.d.ts.map +1 -0
  358. package/dist/label/schema.test.js +76 -0
  359. package/dist/label/schema.test.js.map +1 -0
  360. package/dist/lix/close-lix.d.ts +10 -1
  361. package/dist/lix/close-lix.d.ts.map +1 -1
  362. package/dist/lix/close-lix.js +10 -1
  363. package/dist/lix/close-lix.js.map +1 -1
  364. package/dist/lix/index.d.ts +3 -3
  365. package/dist/lix/index.d.ts.map +1 -1
  366. package/dist/lix/index.js +3 -6
  367. package/dist/lix/index.js.map +1 -1
  368. package/dist/lix/new-lix.d.ts +77 -4
  369. package/dist/lix/new-lix.d.ts.map +1 -1
  370. package/dist/lix/new-lix.js +303 -8
  371. package/dist/lix/new-lix.js.map +1 -1
  372. package/dist/lix/new-lix.test.js +171 -16
  373. package/dist/lix/new-lix.test.js.map +1 -1
  374. package/dist/lix/open-lix-in-memory.d.ts +9 -1
  375. package/dist/lix/open-lix-in-memory.d.ts.map +1 -1
  376. package/dist/lix/open-lix-in-memory.js +15 -7
  377. package/dist/lix/open-lix-in-memory.js.map +1 -1
  378. package/dist/lix/open-lix-in-memory.test.js +0 -6
  379. package/dist/lix/open-lix-in-memory.test.js.map +1 -1
  380. package/dist/lix/open-lix.d.ts +68 -6
  381. package/dist/lix/open-lix.d.ts.map +1 -1
  382. package/dist/lix/open-lix.js +80 -14
  383. package/dist/lix/open-lix.js.map +1 -1
  384. package/dist/lix/open-lix.test.js +54 -22
  385. package/dist/lix/open-lix.test.js.map +1 -1
  386. package/dist/lix/storage/in-memory.d.ts +34 -0
  387. package/dist/lix/storage/in-memory.d.ts.map +1 -0
  388. package/dist/lix/storage/in-memory.js +57 -0
  389. package/dist/lix/storage/in-memory.js.map +1 -0
  390. package/dist/lix/storage/in-memory.test.d.ts +2 -0
  391. package/dist/lix/storage/in-memory.test.d.ts.map +1 -0
  392. package/dist/lix/storage/in-memory.test.js +146 -0
  393. package/dist/lix/storage/in-memory.test.js.map +1 -0
  394. package/dist/lix/storage/lix-storage-adapter.d.ts +16 -0
  395. package/dist/lix/storage/lix-storage-adapter.d.ts.map +1 -0
  396. package/dist/lix/storage/lix-storage-adapter.js +2 -0
  397. package/dist/lix/storage/lix-storage-adapter.js.map +1 -0
  398. package/dist/lix/storage/opfs.d.ts +66 -0
  399. package/dist/lix/storage/opfs.d.ts.map +1 -0
  400. package/dist/lix/storage/opfs.js +152 -0
  401. package/dist/lix/storage/opfs.js.map +1 -0
  402. package/dist/lix/storage/opfs.test.d.ts +2 -0
  403. package/dist/lix/storage/opfs.test.d.ts.map +1 -0
  404. package/dist/lix/storage/opfs.test.js +171 -0
  405. package/dist/lix/storage/opfs.test.js.map +1 -0
  406. package/dist/lix/to-blob.d.ts +9 -2
  407. package/dist/lix/to-blob.d.ts.map +1 -1
  408. package/dist/lix/to-blob.js +9 -2
  409. package/dist/lix/to-blob.js.map +1 -1
  410. package/dist/lix/to-blob.test.d.ts +2 -0
  411. package/dist/lix/to-blob.test.d.ts.map +1 -0
  412. package/dist/lix/to-blob.test.js +18 -0
  413. package/dist/lix/to-blob.test.js.map +1 -0
  414. package/dist/log/create-lix-own-log.d.ts +66 -0
  415. package/dist/log/create-lix-own-log.d.ts.map +1 -0
  416. package/dist/log/create-lix-own-log.js +103 -0
  417. package/dist/log/create-lix-own-log.js.map +1 -0
  418. package/dist/log/create-lix-own-log.test.d.ts +2 -0
  419. package/dist/log/create-lix-own-log.test.d.ts.map +1 -0
  420. package/dist/log/create-lix-own-log.test.js +81 -0
  421. package/dist/log/create-lix-own-log.test.js.map +1 -0
  422. package/dist/log/create-log.d.ts +32 -0
  423. package/dist/log/create-log.d.ts.map +1 -0
  424. package/dist/log/create-log.js +43 -0
  425. package/dist/log/create-log.js.map +1 -0
  426. package/dist/log/index.d.ts +3 -0
  427. package/dist/log/index.d.ts.map +1 -0
  428. package/dist/log/index.js +3 -0
  429. package/dist/log/index.js.map +1 -0
  430. package/dist/log/schema.d.ts +32 -0
  431. package/dist/log/schema.d.ts.map +1 -0
  432. package/dist/log/schema.js +43 -0
  433. package/dist/log/schema.js.map +1 -0
  434. package/dist/log/schema.test.d.ts +2 -0
  435. package/dist/log/schema.test.d.ts.map +1 -0
  436. package/dist/log/schema.test.js +119 -0
  437. package/dist/log/schema.test.js.map +1 -0
  438. package/dist/observe/create-observe.d.ts +17 -0
  439. package/dist/observe/create-observe.d.ts.map +1 -0
  440. package/dist/observe/create-observe.js +118 -0
  441. package/dist/observe/create-observe.js.map +1 -0
  442. package/dist/observe/create-observe.test.d.ts +2 -0
  443. package/dist/observe/create-observe.test.d.ts.map +1 -0
  444. package/dist/observe/create-observe.test.js +384 -0
  445. package/dist/observe/create-observe.test.js.map +1 -0
  446. package/dist/observe/index.d.ts +2 -0
  447. package/dist/observe/index.d.ts.map +1 -0
  448. package/dist/observe/index.js +2 -0
  449. package/dist/observe/index.js.map +1 -0
  450. package/dist/observe/lix-observable.d.ts +31 -0
  451. package/dist/observe/lix-observable.d.ts.map +1 -0
  452. package/dist/observe/lix-observable.js +65 -0
  453. package/dist/observe/lix-observable.js.map +1 -0
  454. package/dist/observe/lix-observable.test.d.ts +2 -0
  455. package/dist/observe/lix-observable.test.d.ts.map +1 -0
  456. package/dist/observe/lix-observable.test.js +187 -0
  457. package/dist/observe/lix-observable.test.js.map +1 -0
  458. package/dist/plugin/index.d.ts +2 -1
  459. package/dist/plugin/index.d.ts.map +1 -1
  460. package/dist/plugin/index.js +1 -1
  461. package/dist/plugin/index.js.map +1 -1
  462. package/dist/plugin/lix-plugin.d.ts +24 -45
  463. package/dist/plugin/lix-plugin.d.ts.map +1 -1
  464. package/dist/plugin/lix-plugin.js +1 -1
  465. package/dist/plugin/lix-plugin.js.map +1 -1
  466. package/dist/plugin/lix-plugin.test-d.js +17 -11
  467. package/dist/plugin/lix-plugin.test-d.js.map +1 -1
  468. package/dist/plugin/mock-json-plugin.d.ts +17 -0
  469. package/dist/plugin/mock-json-plugin.d.ts.map +1 -0
  470. package/dist/plugin/mock-json-plugin.flatten.d.ts +3 -0
  471. package/dist/plugin/mock-json-plugin.flatten.d.ts.map +1 -0
  472. package/dist/plugin/mock-json-plugin.flatten.js +124 -0
  473. package/dist/plugin/mock-json-plugin.flatten.js.map +1 -0
  474. package/dist/plugin/mock-json-plugin.js +101 -0
  475. package/dist/plugin/mock-json-plugin.js.map +1 -0
  476. package/dist/plugin/mock-json-plugin.test.d.ts +2 -0
  477. package/dist/plugin/mock-json-plugin.test.d.ts.map +1 -0
  478. package/dist/plugin/mock-json-plugin.test.js +164 -0
  479. package/dist/plugin/mock-json-plugin.test.js.map +1 -0
  480. package/dist/query-filter/change-conflict-in-version.d.ts.map +1 -1
  481. package/dist/query-filter/change-has-label.d.ts +9 -3
  482. package/dist/query-filter/change-has-label.d.ts.map +1 -1
  483. package/dist/query-filter/change-has-label.js +7 -4
  484. package/dist/query-filter/change-has-label.js.map +1 -1
  485. package/dist/query-filter/change-has-label.test.js +36 -11
  486. package/dist/query-filter/change-has-label.test.js.map +1 -1
  487. package/dist/query-filter/change-is-leaf.d.ts.map +1 -1
  488. package/dist/query-filter/change-set-element-in-ancestry-of.d.ts +30 -0
  489. package/dist/query-filter/change-set-element-in-ancestry-of.d.ts.map +1 -0
  490. package/dist/query-filter/change-set-element-in-ancestry-of.js +46 -0
  491. package/dist/query-filter/change-set-element-in-ancestry-of.js.map +1 -0
  492. package/dist/query-filter/change-set-element-in-ancestry-of.test.d.ts +2 -0
  493. package/dist/query-filter/change-set-element-in-ancestry-of.test.d.ts.map +1 -0
  494. package/dist/query-filter/change-set-element-in-ancestry-of.test.js +323 -0
  495. package/dist/query-filter/change-set-element-in-ancestry-of.test.js.map +1 -0
  496. package/dist/query-filter/change-set-element-in-symmetric-difference.d.ts +20 -0
  497. package/dist/query-filter/change-set-element-in-symmetric-difference.d.ts.map +1 -0
  498. package/dist/query-filter/change-set-element-in-symmetric-difference.js +36 -0
  499. package/dist/query-filter/change-set-element-in-symmetric-difference.js.map +1 -0
  500. package/dist/query-filter/change-set-element-in-symmetric-difference.test.d.ts +2 -0
  501. package/dist/query-filter/change-set-element-in-symmetric-difference.test.d.ts.map +1 -0
  502. package/dist/query-filter/change-set-element-in-symmetric-difference.test.js +369 -0
  503. package/dist/query-filter/change-set-element-in-symmetric-difference.test.js.map +1 -0
  504. package/dist/query-filter/change-set-element-is-leaf-of.d.ts +29 -0
  505. package/dist/query-filter/change-set-element-is-leaf-of.d.ts.map +1 -0
  506. package/dist/query-filter/change-set-element-is-leaf-of.js +91 -0
  507. package/dist/query-filter/change-set-element-is-leaf-of.js.map +1 -0
  508. package/dist/query-filter/change-set-element-is-leaf-of.test.d.ts +2 -0
  509. package/dist/query-filter/change-set-element-is-leaf-of.test.d.ts.map +1 -0
  510. package/dist/query-filter/change-set-element-is-leaf-of.test.js +515 -0
  511. package/dist/query-filter/change-set-element-is-leaf-of.test.js.map +1 -0
  512. package/dist/query-filter/change-set-has-label.d.ts +19 -3
  513. package/dist/query-filter/change-set-has-label.d.ts.map +1 -1
  514. package/dist/query-filter/change-set-has-label.js +17 -4
  515. package/dist/query-filter/change-set-has-label.js.map +1 -1
  516. package/dist/query-filter/change-set-has-label.test.js +13 -20
  517. package/dist/query-filter/change-set-has-label.test.js.map +1 -1
  518. package/dist/query-filter/change-set-is-ancestor-of.d.ts +51 -0
  519. package/dist/query-filter/change-set-is-ancestor-of.d.ts.map +1 -0
  520. package/dist/query-filter/change-set-is-ancestor-of.js +63 -0
  521. package/dist/query-filter/change-set-is-ancestor-of.js.map +1 -0
  522. package/dist/query-filter/change-set-is-ancestor-of.test.d.ts +2 -0
  523. package/dist/query-filter/change-set-is-ancestor-of.test.d.ts.map +1 -0
  524. package/dist/query-filter/change-set-is-ancestor-of.test.js +153 -0
  525. package/dist/query-filter/change-set-is-ancestor-of.test.js.map +1 -0
  526. package/dist/query-filter/change-set-is-descendant-of.d.ts +44 -0
  527. package/dist/query-filter/change-set-is-descendant-of.d.ts.map +1 -0
  528. package/dist/query-filter/change-set-is-descendant-of.js +56 -0
  529. package/dist/query-filter/change-set-is-descendant-of.js.map +1 -0
  530. package/dist/query-filter/change-set-is-descendant-of.test.d.ts +2 -0
  531. package/dist/query-filter/change-set-is-descendant-of.test.d.ts.map +1 -0
  532. package/dist/query-filter/change-set-is-descendant-of.test.js +137 -0
  533. package/dist/query-filter/change-set-is-descendant-of.test.js.map +1 -0
  534. package/dist/query-filter/index.d.ts +5 -6
  535. package/dist/query-filter/index.d.ts.map +1 -1
  536. package/dist/query-filter/index.js +5 -6
  537. package/dist/query-filter/index.js.map +1 -1
  538. package/dist/query-filter/version-change-in-difference.d.ts.map +1 -1
  539. package/dist/query-filter/version-change-in-symmetric-difference.d.ts.map +1 -1
  540. package/dist/repository/comparison-example.js +173 -0
  541. package/dist/repository/comparison-example.js.map +1 -0
  542. package/dist/repository/entity-repository.d.ts +53 -0
  543. package/dist/repository/entity-repository.d.ts.map +1 -0
  544. package/dist/repository/entity-repository.js +187 -0
  545. package/dist/repository/entity-repository.js.map +1 -0
  546. package/dist/repository/entity-repository.test.d.ts +2 -0
  547. package/dist/repository/entity-repository.test.d.ts.map +1 -0
  548. package/dist/repository/entity-repository.test.js +94 -0
  549. package/dist/repository/entity-repository.test.js.map +1 -0
  550. package/dist/repository/example.d.ts +6 -0
  551. package/dist/repository/example.d.ts.map +1 -0
  552. package/dist/repository/example.js +87 -0
  553. package/dist/repository/example.js.map +1 -0
  554. package/dist/repository/file-repository.d.ts +39 -0
  555. package/dist/repository/file-repository.d.ts.map +1 -0
  556. package/dist/repository/file-repository.js +93 -0
  557. package/dist/repository/file-repository.js.map +1 -0
  558. package/dist/repository/file-repository.test.d.ts +2 -0
  559. package/dist/repository/file-repository.test.d.ts.map +1 -0
  560. package/dist/repository/file-repository.test.js +165 -0
  561. package/dist/repository/file-repository.test.js.map +1 -0
  562. package/dist/repository/index.d.ts +6 -0
  563. package/dist/repository/index.d.ts.map +1 -0
  564. package/dist/repository/index.js +6 -0
  565. package/dist/repository/index.js.map +1 -0
  566. package/dist/repository/integration.test.d.ts +2 -0
  567. package/dist/repository/integration.test.d.ts.map +1 -0
  568. package/dist/repository/integration.test.js +136 -0
  569. package/dist/repository/integration.test.js.map +1 -0
  570. package/dist/repository/key-value-repository.d.ts +30 -0
  571. package/dist/repository/key-value-repository.d.ts.map +1 -0
  572. package/dist/repository/key-value-repository.js +60 -0
  573. package/dist/repository/key-value-repository.js.map +1 -0
  574. package/dist/repository/key-value-repository.test.d.ts +2 -0
  575. package/dist/repository/key-value-repository.test.d.ts.map +1 -0
  576. package/dist/repository/key-value-repository.test.js +122 -0
  577. package/dist/repository/key-value-repository.test.js.map +1 -0
  578. package/dist/repository/markdown-plugin-example.js +118 -0
  579. package/dist/repository/markdown-plugin-example.js.map +1 -0
  580. package/dist/repository/query-builder.d.ts +69 -0
  581. package/dist/repository/query-builder.d.ts.map +1 -0
  582. package/dist/repository/query-builder.js +155 -0
  583. package/dist/repository/query-builder.js.map +1 -0
  584. package/dist/repository/query-builder.test.d.ts +2 -0
  585. package/dist/repository/query-builder.test.d.ts.map +1 -0
  586. package/dist/repository/query-builder.test.js +244 -0
  587. package/dist/repository/query-builder.test.js.map +1 -0
  588. package/dist/repository/repository-manager.d.ts +27 -0
  589. package/dist/repository/repository-manager.d.ts.map +1 -0
  590. package/dist/repository/repository-manager.js +19 -0
  591. package/dist/repository/repository-manager.js.map +1 -0
  592. package/dist/repository/repository-manager.test.d.ts +2 -0
  593. package/dist/repository/repository-manager.test.d.ts.map +1 -0
  594. package/dist/repository/repository-manager.test.js +65 -0
  595. package/dist/repository/repository-manager.test.js.map +1 -0
  596. package/dist/repository/test-helpers.js +402 -0
  597. package/dist/repository/test-helpers.js.map +1 -0
  598. package/dist/schema-definition/definition.d.ts +406 -0
  599. package/dist/schema-definition/definition.d.ts.map +1 -0
  600. package/dist/schema-definition/definition.js +82 -0
  601. package/dist/schema-definition/definition.js.map +1 -0
  602. package/dist/schema-definition/definition.test-d.d.ts +2 -0
  603. package/dist/schema-definition/definition.test-d.d.ts.map +1 -0
  604. package/dist/schema-definition/definition.test-d.js +177 -0
  605. package/dist/schema-definition/definition.test-d.js.map +1 -0
  606. package/dist/schema-definition/definition.test.d.ts +2 -0
  607. package/dist/schema-definition/definition.test.d.ts.map +1 -0
  608. package/dist/schema-definition/definition.test.js +324 -0
  609. package/dist/schema-definition/definition.test.js.map +1 -0
  610. package/dist/schema-definition/index.d.ts +4 -0
  611. package/dist/schema-definition/index.d.ts.map +1 -0
  612. package/dist/schema-definition/index.js +4 -0
  613. package/dist/schema-definition/index.js.map +1 -0
  614. package/dist/schema-definition/json-type.d.ts +24 -0
  615. package/dist/schema-definition/json-type.d.ts.map +1 -0
  616. package/dist/schema-definition/json-type.js +42 -0
  617. package/dist/schema-definition/json-type.js.map +1 -0
  618. package/dist/schema-definition/json-type.test.d.ts +2 -0
  619. package/dist/schema-definition/json-type.test.d.ts.map +1 -0
  620. package/dist/schema-definition/json-type.test.js +21 -0
  621. package/dist/schema-definition/json-type.test.js.map +1 -0
  622. package/dist/schema-definition/lix-generated.test.d.ts +2 -0
  623. package/dist/schema-definition/lix-generated.test.d.ts.map +1 -0
  624. package/dist/schema-definition/lix-generated.test.js +127 -0
  625. package/dist/schema-definition/lix-generated.test.js.map +1 -0
  626. package/dist/schema-definition/validate-lix-schema.d.ts +65 -0
  627. package/dist/schema-definition/validate-lix-schema.d.ts.map +1 -0
  628. package/dist/schema-definition/validate-lix-schema.js +93 -0
  629. package/dist/schema-definition/validate-lix-schema.js.map +1 -0
  630. package/dist/schema-definition/validate-lix-schema.test.d.ts +2 -0
  631. package/dist/schema-definition/validate-lix-schema.test.d.ts.map +1 -0
  632. package/dist/schema-definition/validate-lix-schema.test.js +73 -0
  633. package/dist/schema-definition/validate-lix-schema.test.js.map +1 -0
  634. package/dist/server-protocol-handler/create-server-protocol-handler.d.ts +0 -1
  635. package/dist/server-protocol-handler/create-server-protocol-handler.d.ts.map +1 -1
  636. package/dist/server-protocol-handler/create-server-protocol-handler.js +0 -2
  637. package/dist/server-protocol-handler/create-server-protocol-handler.js.map +1 -1
  638. package/dist/server-protocol-handler/environment/create-in-memory-environment.d.ts.map +1 -1
  639. package/dist/server-protocol-handler/environment/create-in-memory-environment.js +5 -20
  640. package/dist/server-protocol-handler/environment/create-in-memory-environment.js.map +1 -1
  641. package/dist/server-protocol-handler/environment/create-in-memory-environment.test.js +13 -14
  642. package/dist/server-protocol-handler/environment/create-in-memory-environment.test.js.map +1 -1
  643. package/dist/server-protocol-handler/environment/environment.d.ts +0 -4
  644. package/dist/server-protocol-handler/environment/environment.d.ts.map +1 -1
  645. package/dist/server-protocol-handler/routes/get-v1.d.ts.map +1 -1
  646. package/dist/server-protocol-handler/routes/get-v1.js +1 -1
  647. package/dist/server-protocol-handler/routes/get-v1.js.map +1 -1
  648. package/dist/server-protocol-handler/routes/get-v1.test.js +11 -12
  649. package/dist/server-protocol-handler/routes/get-v1.test.js.map +1 -1
  650. package/dist/server-protocol-handler/routes/new-v1.d.ts.map +1 -1
  651. package/dist/server-protocol-handler/routes/new-v1.js +3 -5
  652. package/dist/server-protocol-handler/routes/new-v1.js.map +1 -1
  653. package/dist/server-protocol-handler/routes/new-v1.test.js +7 -8
  654. package/dist/server-protocol-handler/routes/new-v1.test.js.map +1 -1
  655. package/dist/server-protocol-handler/routes/pull-v1.test.js +48 -32
  656. package/dist/server-protocol-handler/routes/pull-v1.test.js.map +1 -1
  657. package/dist/server-protocol-handler/routes/push-v1.d.ts.map +1 -1
  658. package/dist/server-protocol-handler/routes/push-v1.js +2 -0
  659. package/dist/server-protocol-handler/routes/push-v1.js.map +1 -1
  660. package/dist/server-protocol-handler/routes/push-v1.test.js +22 -26
  661. package/dist/server-protocol-handler/routes/push-v1.test.js.map +1 -1
  662. package/dist/services/env-variables/index.d.ts +1 -1
  663. package/dist/services/env-variables/index.js +1 -1
  664. package/dist/services/env-variables/index.js.map +1 -1
  665. package/dist/services/telemetry/capture.d.ts.map +1 -1
  666. package/dist/snapshot/create-snapshot.d.ts +3 -14
  667. package/dist/snapshot/create-snapshot.d.ts.map +1 -1
  668. package/dist/snapshot/create-snapshot.js +14 -19
  669. package/dist/snapshot/create-snapshot.js.map +1 -1
  670. package/dist/snapshot/create-snapshot.test.js +49 -20
  671. package/dist/snapshot/create-snapshot.test.js.map +1 -1
  672. package/dist/snapshot/index.d.ts +1 -0
  673. package/dist/snapshot/index.d.ts.map +1 -1
  674. package/dist/snapshot/index.js +1 -0
  675. package/dist/snapshot/index.js.map +1 -1
  676. package/dist/snapshot/json-sha-256.d.ts +2 -1
  677. package/dist/snapshot/json-sha-256.d.ts.map +1 -1
  678. package/dist/snapshot/json-sha-256.js +1 -3
  679. package/dist/snapshot/json-sha-256.js.map +1 -1
  680. package/dist/snapshot/json-sha-256.test.js +40 -2
  681. package/dist/snapshot/json-sha-256.test.js.map +1 -1
  682. package/dist/snapshot/mock-json-snapshot.d.ts +1 -1
  683. package/dist/snapshot/mock-json-snapshot.d.ts.map +1 -1
  684. package/dist/snapshot/schema.d.ts +8 -0
  685. package/dist/snapshot/schema.d.ts.map +1 -0
  686. package/dist/snapshot/schema.js +12 -0
  687. package/dist/snapshot/schema.js.map +1 -0
  688. package/dist/snapshot/schema.test.d.ts +2 -0
  689. package/dist/snapshot/schema.test.d.ts.map +1 -0
  690. package/dist/snapshot/schema.test.js +116 -0
  691. package/dist/snapshot/schema.test.js.map +1 -0
  692. package/dist/state/create-changeset-for-transaction.d.ts +15 -0
  693. package/dist/state/create-changeset-for-transaction.d.ts.map +1 -0
  694. package/dist/state/create-changeset-for-transaction.js +237 -0
  695. package/dist/state/create-changeset-for-transaction.js.map +1 -0
  696. package/dist/state/entity-view-builder.d.ts +145 -0
  697. package/dist/state/entity-view-builder.d.ts.map +1 -0
  698. package/dist/state/entity-view-builder.js +280 -0
  699. package/dist/state/entity-view-builder.js.map +1 -0
  700. package/dist/state/entity-view-builder.test.d.ts +2 -0
  701. package/dist/state/entity-view-builder.test.d.ts.map +1 -0
  702. package/dist/state/entity-view-builder.test.js +523 -0
  703. package/dist/state/entity-view-builder.test.js.map +1 -0
  704. package/dist/state/get-version-record-by-id-or-throw.d.ts +6 -0
  705. package/dist/state/get-version-record-by-id-or-throw.d.ts.map +1 -0
  706. package/dist/state/get-version-record-by-id-or-throw.js +36 -0
  707. package/dist/state/get-version-record-by-id-or-throw.js.map +1 -0
  708. package/dist/state/handle-state-mutation.d.ts +18 -0
  709. package/dist/state/handle-state-mutation.d.ts.map +1 -0
  710. package/dist/state/handle-state-mutation.js +352 -0
  711. package/dist/state/handle-state-mutation.js.map +1 -0
  712. package/dist/state/handle-state-mutation.test.d.ts +2 -0
  713. package/dist/state/handle-state-mutation.test.d.ts.map +1 -0
  714. package/dist/state/handle-state-mutation.test.js +632 -0
  715. package/dist/state/handle-state-mutation.test.js.map +1 -0
  716. package/dist/state/schema.bench.d.ts +2 -0
  717. package/dist/state/schema.bench.d.ts.map +1 -0
  718. package/dist/state/schema.bench.js +36 -0
  719. package/dist/state/schema.bench.js.map +1 -0
  720. package/dist/state/schema.d.ts +56 -0
  721. package/dist/state/schema.d.ts.map +1 -0
  722. package/dist/state/schema.js +1052 -0
  723. package/dist/state/schema.js.map +1 -0
  724. package/dist/state/schema.test.d.ts +2 -0
  725. package/dist/state/schema.test.d.ts.map +1 -0
  726. package/dist/state/schema.test.js +2030 -0
  727. package/dist/state/schema.test.js.map +1 -0
  728. package/dist/state/validate-state-mutation.d.ts +13 -0
  729. package/dist/state/validate-state-mutation.d.ts.map +1 -0
  730. package/dist/state/validate-state-mutation.js +485 -0
  731. package/dist/state/validate-state-mutation.js.map +1 -0
  732. package/dist/state/validate-state-mutation.test.d.ts +2 -0
  733. package/dist/state/validate-state-mutation.test.d.ts.map +1 -0
  734. package/dist/state/validate-state-mutation.test.js +2024 -0
  735. package/dist/state/validate-state-mutation.test.js.map +1 -0
  736. package/dist/state-history/schema.d.ts +58 -0
  737. package/dist/state-history/schema.d.ts.map +1 -0
  738. package/dist/state-history/schema.js +104 -0
  739. package/dist/state-history/schema.js.map +1 -0
  740. package/dist/state-history/schema.test.d.ts +2 -0
  741. package/dist/state-history/schema.test.d.ts.map +1 -0
  742. package/dist/state-history/schema.test.js +701 -0
  743. package/dist/state-history/schema.test.js.map +1 -0
  744. package/dist/stored-schema/index.d.ts +2 -0
  745. package/dist/stored-schema/index.d.ts.map +1 -0
  746. package/dist/stored-schema/index.js +2 -0
  747. package/dist/stored-schema/index.js.map +1 -0
  748. package/dist/stored-schema/schema.d.ts +25 -0
  749. package/dist/stored-schema/schema.d.ts.map +1 -0
  750. package/dist/stored-schema/schema.js +48 -0
  751. package/dist/stored-schema/schema.js.map +1 -0
  752. package/dist/stored-schema/schema.test.d.ts +2 -0
  753. package/dist/stored-schema/schema.test.d.ts.map +1 -0
  754. package/dist/stored-schema/schema.test.js +192 -0
  755. package/dist/stored-schema/schema.test.js.map +1 -0
  756. package/dist/sync/get-diffing-rows.d.ts +12 -0
  757. package/dist/sync/get-diffing-rows.d.ts.map +1 -1
  758. package/dist/sync/get-diffing-rows.js +14 -0
  759. package/dist/sync/get-diffing-rows.js.map +1 -1
  760. package/dist/sync/merge-state.d.ts.map +1 -1
  761. package/dist/sync/merge-state.js +2 -1
  762. package/dist/sync/merge-state.js.map +1 -1
  763. package/dist/sync/pull-from-server.d.ts.map +1 -1
  764. package/dist/sync/pull-from-server.js +2 -1
  765. package/dist/sync/pull-from-server.js.map +1 -1
  766. package/dist/sync/pull-from-server.test.js +32 -28
  767. package/dist/sync/pull-from-server.test.js.map +1 -1
  768. package/dist/sync/push-to-server.d.ts +10 -1
  769. package/dist/sync/push-to-server.d.ts.map +1 -1
  770. package/dist/sync/push-to-server.js +10 -1
  771. package/dist/sync/push-to-server.js.map +1 -1
  772. package/dist/sync/push-to-server.test.js +62 -63
  773. package/dist/sync/push-to-server.test.js.map +1 -1
  774. package/dist/sync/sync-process.d.ts +1 -1
  775. package/dist/sync/sync-process.d.ts.map +1 -1
  776. package/dist/sync/sync-process.js +1 -2
  777. package/dist/sync/sync-process.js.map +1 -1
  778. package/dist/sync/sync-process.test.js +20 -17
  779. package/dist/sync/sync-process.test.js.map +1 -1
  780. package/dist/thread/create-thread-comment.d.ts +18 -0
  781. package/dist/thread/create-thread-comment.d.ts.map +1 -0
  782. package/dist/thread/create-thread-comment.js +47 -0
  783. package/dist/thread/create-thread-comment.js.map +1 -0
  784. package/dist/thread/create-thread-comment.test.d.ts +2 -0
  785. package/dist/thread/create-thread-comment.test.d.ts.map +1 -0
  786. package/dist/thread/create-thread-comment.test.js +51 -0
  787. package/dist/thread/create-thread-comment.test.js.map +1 -0
  788. package/dist/thread/create-thread.d.ts +28 -0
  789. package/dist/thread/create-thread.d.ts.map +1 -0
  790. package/dist/thread/create-thread.js +58 -0
  791. package/dist/thread/create-thread.js.map +1 -0
  792. package/dist/thread/create-thread.test.d.ts +2 -0
  793. package/dist/thread/create-thread.test.d.ts.map +1 -0
  794. package/dist/thread/create-thread.test.js +26 -0
  795. package/dist/thread/create-thread.test.js.map +1 -0
  796. package/dist/thread/index.d.ts +4 -0
  797. package/dist/thread/index.d.ts.map +1 -0
  798. package/dist/thread/index.js +4 -0
  799. package/dist/thread/index.js.map +1 -0
  800. package/dist/thread/schema.d.ts +59 -0
  801. package/dist/thread/schema.d.ts.map +1 -0
  802. package/dist/thread/schema.js +66 -0
  803. package/dist/thread/schema.js.map +1 -0
  804. package/dist/thread/schema.test.d.ts +2 -0
  805. package/dist/thread/schema.test.d.ts.map +1 -0
  806. package/dist/thread/schema.test.js +60 -0
  807. package/dist/thread/schema.test.js.map +1 -0
  808. package/dist/version/create-version.d.ts +9 -17
  809. package/dist/version/create-version.d.ts.map +1 -1
  810. package/dist/version/create-version.js +30 -57
  811. package/dist/version/create-version.js.map +1 -1
  812. package/dist/version/create-version.test.js +70 -113
  813. package/dist/version/create-version.test.js.map +1 -1
  814. package/dist/version/index.d.ts +1 -5
  815. package/dist/version/index.d.ts.map +1 -1
  816. package/dist/version/index.js +1 -5
  817. package/dist/version/index.js.map +1 -1
  818. package/dist/version/schema.d.ts +73 -0
  819. package/dist/version/schema.d.ts.map +1 -0
  820. package/dist/version/schema.js +135 -0
  821. package/dist/version/schema.js.map +1 -0
  822. package/dist/version/schema.test.d.ts +2 -0
  823. package/dist/version/schema.test.d.ts.map +1 -0
  824. package/dist/version/schema.test.js +661 -0
  825. package/dist/version/schema.test.js.map +1 -0
  826. package/dist/version/switch-version.d.ts +4 -4
  827. package/dist/version/switch-version.d.ts.map +1 -1
  828. package/dist/version/switch-version.js +6 -62
  829. package/dist/version/switch-version.js.map +1 -1
  830. package/dist/version/switch-version.test.js +14 -214
  831. package/dist/version/switch-version.test.js.map +1 -1
  832. package/dist/zettel-ast/index.d.ts +11 -0
  833. package/dist/zettel-ast/index.d.ts.map +1 -0
  834. package/dist/zettel-ast/index.js +11 -0
  835. package/dist/zettel-ast/index.js.map +1 -0
  836. package/package.json +10 -9
  837. package/src/account/create-account.test.ts +49 -4
  838. package/src/account/create-account.ts +36 -6
  839. package/src/account/index.ts +5 -1
  840. package/src/account/schema.test.ts +370 -0
  841. package/src/account/schema.ts +76 -0
  842. package/src/account/switch-account.test.ts +29 -6
  843. package/src/account/switch-account.ts +12 -3
  844. package/src/change/index.ts +1 -2
  845. package/src/change/schema.test.ts +284 -0
  846. package/src/change/schema.ts +93 -0
  847. package/src/change-author/index.ts +1 -0
  848. package/src/change-author/schema.test.ts +300 -0
  849. package/src/change-author/schema.ts +48 -0
  850. package/src/change-conflict/create-change-conflict.test.ts +14 -11
  851. package/src/change-conflict/create-change-conflict.ts +29 -6
  852. package/src/change-conflict/detect-change-conflicts.test.ts +18 -15
  853. package/src/change-conflict/detect-change-conflicts.ts +3 -0
  854. package/src/change-conflict/detect-diverging-entity-conflict.test.ts +24 -21
  855. package/src/change-conflict/detect-diverging-entity-conflict.ts +4 -1
  856. package/src/change-conflict/garbage-collect-change-conflicts.test.ts +16 -15
  857. package/src/change-conflict/garbage-collect-change-conflicts.ts +3 -0
  858. package/src/change-conflict/resolve-conflict-by-selecting.test.ts +18 -8
  859. package/src/change-conflict/resolve-conflict-by-selecting.ts +3 -2
  860. package/src/change-proposal/create-change-proposal.test.ts +106 -0
  861. package/src/change-proposal/create-change-proposal.ts +71 -0
  862. package/src/change-proposal/database-schema.test.ts +180 -0
  863. package/src/change-proposal/database-schema.ts +32 -0
  864. package/src/change-proposal/index.ts +2 -0
  865. package/src/change-set/apply-change-set.test.ts +469 -0
  866. package/src/change-set/apply-change-set.ts +186 -0
  867. package/src/change-set/create-change-set.test.ts +126 -27
  868. package/src/change-set/create-change-set.ts +117 -41
  869. package/src/change-set/create-checkpoint.test.ts +387 -0
  870. package/src/change-set/create-checkpoint.ts +101 -0
  871. package/src/change-set/create-merge-change-set.test.ts +237 -0
  872. package/src/change-set/create-merge-change-set.ts +99 -0
  873. package/src/change-set/create-transition-change-set.test.ts +245 -0
  874. package/src/change-set/create-transition-change-set.ts +149 -0
  875. package/src/change-set/create-undo-change-set.test.ts +329 -0
  876. package/src/change-set/create-undo-change-set.ts +147 -0
  877. package/src/change-set/index.ts +17 -1
  878. package/src/change-set/schema.test.ts +981 -0
  879. package/src/change-set/schema.ts +207 -0
  880. package/src/database/execute-sync.test.ts +60 -72
  881. package/src/database/execute-sync.ts +26 -27
  882. package/src/database/graph-traversal-mode.ts +75 -0
  883. package/src/database/index.ts +3 -2
  884. package/src/database/init-db.ts +82 -66
  885. package/src/database/kysely-plugin/json-column-plugin.ts +215 -0
  886. package/src/database/kysely-plugin/parse-jsonb-plugin-v1.ts +5 -10
  887. package/src/database/kysely-plugin/parse-jsonb-plugin-v2.ts +1 -1
  888. package/src/database/kysely-plugin/serialize-jsonb-plugin.test.ts +177 -2
  889. package/src/database/kysely-plugin/serialize-jsonb-plugin.ts +186 -87
  890. package/src/database/kysely-plugin/view-insert-returning-error-plugin.test.ts +62 -0
  891. package/src/database/kysely-plugin/view-insert-returning-error-plugin.ts +49 -0
  892. package/src/database/schema.ts +100 -267
  893. package/src/entity-views/entity-state-all.test.ts +445 -0
  894. package/src/entity-views/entity-state-all.ts +506 -0
  895. package/src/entity-views/entity-state-history.test.ts +325 -0
  896. package/src/entity-views/entity-state-history.ts +226 -0
  897. package/src/entity-views/entity-state.test.ts +592 -0
  898. package/src/entity-views/entity-state.ts +502 -0
  899. package/src/entity-views/entity-view-builder.test.ts +293 -0
  900. package/src/entity-views/entity-view-builder.ts +148 -0
  901. package/src/entity-views/index.ts +1 -0
  902. package/src/entity-views/types.test.ts +99 -0
  903. package/src/entity-views/types.ts +328 -0
  904. package/src/file/file-handlers.test.ts +174 -0
  905. package/src/file/file-handlers.ts +364 -0
  906. package/src/file/index.ts +5 -1
  907. package/src/file/materialize-file-data-at-changeset.ts +123 -0
  908. package/src/file/materialize-file-data.test.ts +107 -0
  909. package/src/file/materialize-file-data.ts +120 -0
  910. package/src/file/schema.test.ts +990 -0
  911. package/src/file/schema.ts +300 -0
  912. package/src/file/store-detected-change-schema.test.ts +248 -0
  913. package/src/file/store-detected-change-schema.ts +52 -0
  914. package/src/file/unknown-file-fallback-plugin.test.ts +368 -0
  915. package/src/file/unknown-file-fallback-plugin.ts +95 -0
  916. package/src/hooks/create-hooks.test.ts +125 -0
  917. package/src/hooks/create-hooks.ts +101 -0
  918. package/src/hooks/index.ts +1 -0
  919. package/src/index.ts +10 -6
  920. package/src/key-value/index.ts +1 -0
  921. package/src/key-value/schema.test.ts +179 -0
  922. package/src/key-value/schema.ts +37 -0
  923. package/src/label/create-label.test.ts +234 -0
  924. package/src/label/create-label.ts +61 -0
  925. package/src/label/index.ts +2 -0
  926. package/src/label/schema.test.ts +92 -0
  927. package/src/label/schema.ts +40 -0
  928. package/src/lix/index.ts +3 -6
  929. package/src/lix/new-lix.test.ts +213 -17
  930. package/src/lix/new-lix.ts +395 -8
  931. package/src/lix/open-lix.test.ts +65 -26
  932. package/src/lix/open-lix.ts +131 -22
  933. package/src/lix/storage/in-memory.test.ts +180 -0
  934. package/src/lix/storage/in-memory.ts +69 -0
  935. package/src/lix/storage/lix-storage-adapter.ts +16 -0
  936. package/src/lix/storage/opfs.test.ts +215 -0
  937. package/src/lix/storage/opfs.ts +175 -0
  938. package/src/log/create-lix-own-log.test.ts +119 -0
  939. package/src/log/create-lix-own-log.ts +124 -0
  940. package/src/log/create-log.ts +52 -0
  941. package/src/log/index.ts +2 -0
  942. package/src/log/schema.test.ts +140 -0
  943. package/src/log/schema.ts +55 -0
  944. package/src/observe/create-observe.test.ts +501 -0
  945. package/src/observe/create-observe.ts +146 -0
  946. package/src/observe/index.ts +1 -0
  947. package/src/observe/lix-observable.test.ts +247 -0
  948. package/src/observe/lix-observable.ts +92 -0
  949. package/src/plugin/index.ts +2 -2
  950. package/src/plugin/lix-plugin.test-d.ts +26 -15
  951. package/src/plugin/lix-plugin.ts +41 -50
  952. package/src/plugin/mock-json-plugin.flatten.ts +161 -0
  953. package/src/plugin/mock-json-plugin.test.ts +214 -0
  954. package/src/plugin/mock-json-plugin.ts +113 -0
  955. package/src/query-filter/change-has-label.test.ts +38 -11
  956. package/src/query-filter/change-has-label.ts +8 -4
  957. package/src/query-filter/change-set-element-in-ancestry-of.test.ts +354 -0
  958. package/src/query-filter/change-set-element-in-ancestry-of.ts +64 -0
  959. package/src/query-filter/change-set-element-in-symmetric-difference.test.ts +410 -0
  960. package/src/{change-set → query-filter}/change-set-element-in-symmetric-difference.ts +2 -1
  961. package/src/query-filter/change-set-element-is-leaf-of.test.ts +564 -0
  962. package/src/query-filter/change-set-element-is-leaf-of.ts +110 -0
  963. package/src/query-filter/change-set-has-label.test.ts +13 -21
  964. package/src/query-filter/change-set-has-label.ts +18 -4
  965. package/src/query-filter/change-set-is-ancestor-of.test.ts +178 -0
  966. package/src/query-filter/change-set-is-ancestor-of.ts +77 -0
  967. package/src/query-filter/change-set-is-descendant-of.test.ts +169 -0
  968. package/src/query-filter/change-set-is-descendant-of.ts +70 -0
  969. package/src/query-filter/index.ts +5 -6
  970. package/src/schema-definition/definition.test-d.ts +253 -0
  971. package/src/schema-definition/definition.test.ts +377 -0
  972. package/src/schema-definition/definition.ts +445 -0
  973. package/src/schema-definition/index.ts +13 -0
  974. package/src/schema-definition/json-type.test.ts +30 -0
  975. package/src/schema-definition/json-type.ts +53 -0
  976. package/src/schema-definition/validate-lix-schema.test.ts +85 -0
  977. package/src/schema-definition/validate-lix-schema.ts +108 -0
  978. package/src/server-protocol-handler/create-server-protocol-handler.ts +0 -4
  979. package/src/server-protocol-handler/environment/create-in-memory-environment.test.ts +13 -14
  980. package/src/server-protocol-handler/environment/create-in-memory-environment.ts +5 -24
  981. package/src/server-protocol-handler/environment/environment.ts +0 -5
  982. package/src/server-protocol-handler/routes/get-v1.test.ts +11 -12
  983. package/src/server-protocol-handler/routes/get-v1.ts +3 -1
  984. package/src/server-protocol-handler/routes/new-v1.test.ts +7 -8
  985. package/src/server-protocol-handler/routes/new-v1.ts +3 -5
  986. package/src/server-protocol-handler/routes/pull-v1.test.ts +49 -33
  987. package/src/server-protocol-handler/routes/pull-v1.ts +1 -1
  988. package/src/server-protocol-handler/routes/push-v1.test.ts +26 -27
  989. package/src/server-protocol-handler/routes/push-v1.ts +4 -1
  990. package/src/snapshot/schema.test.ts +155 -0
  991. package/src/snapshot/schema.ts +21 -0
  992. package/src/state/create-changeset-for-transaction.ts +321 -0
  993. package/src/state/get-version-record-by-id-or-throw.ts +51 -0
  994. package/src/state/handle-state-mutation.test.ts +761 -0
  995. package/src/state/handle-state-mutation.ts +418 -0
  996. package/src/state/schema.bench.ts +43 -0
  997. package/src/state/schema.test.ts +2416 -0
  998. package/src/state/schema.ts +1288 -0
  999. package/src/state/validate-state-mutation.test.ts +2353 -0
  1000. package/src/state/validate-state-mutation.ts +664 -0
  1001. package/src/state-history/schema.test.ts +827 -0
  1002. package/src/state-history/schema.ts +198 -0
  1003. package/src/stored-schema/index.ts +1 -0
  1004. package/src/stored-schema/schema.test.ts +240 -0
  1005. package/src/stored-schema/schema.ts +67 -0
  1006. package/src/sync/get-diffing-rows.ts +16 -0
  1007. package/src/sync/merge-state.ts +7 -4
  1008. package/src/sync/pull-from-server.test.ts +33 -28
  1009. package/src/sync/pull-from-server.ts +4 -2
  1010. package/src/sync/push-to-server.test.ts +77 -81
  1011. package/src/sync/push-to-server.ts +11 -2
  1012. package/src/sync/sync-process.test.ts +21 -18
  1013. package/src/sync/sync-process.ts +2 -3
  1014. package/src/thread/create-thread-comment.test.ts +63 -0
  1015. package/src/thread/create-thread-comment.ts +56 -0
  1016. package/src/thread/create-thread.test.ts +32 -0
  1017. package/src/thread/create-thread.ts +83 -0
  1018. package/src/thread/index.ts +8 -0
  1019. package/src/thread/schema.test.ts +76 -0
  1020. package/src/thread/schema.ts +85 -0
  1021. package/src/version/create-version.test.ts +78 -125
  1022. package/src/version/create-version.ts +37 -64
  1023. package/src/version/index.ts +5 -6
  1024. package/src/version/schema.test.ts +794 -0
  1025. package/src/version/schema.ts +149 -0
  1026. package/src/version/switch-version.test.ts +14 -275
  1027. package/src/version/switch-version.ts +8 -78
  1028. package/src/zettel-ast/index.ts +10 -0
  1029. package/src/account/database-schema.test.ts +0 -184
  1030. package/src/account/database-schema.ts +0 -54
  1031. package/src/change/apply-changes.test.ts +0 -268
  1032. package/src/change/apply-changes.ts +0 -114
  1033. package/src/change/create-change.test.ts +0 -296
  1034. package/src/change/create-change.ts +0 -129
  1035. package/src/change/mock-change.ts +0 -21
  1036. package/src/change-schema/README.md +0 -3
  1037. package/src/change-schema/index.ts +0 -4
  1038. package/src/change-schema/types.test-d.ts +0 -52
  1039. package/src/change-schema/types.ts +0 -53
  1040. package/src/change-set/change-set-element-in-symmetric-difference.test.ts +0 -128
  1041. package/src/database/apply-schema.ts +0 -272
  1042. package/src/database/init-db.test.ts +0 -626
  1043. package/src/database/mutation-log/database-schema.ts +0 -128
  1044. package/src/database/mutation-log/lix-session.ts +0 -19
  1045. package/src/discussion/create-comment.ts +0 -18
  1046. package/src/discussion/create-discussion.test.ts +0 -45
  1047. package/src/discussion/create-discussion.ts +0 -48
  1048. package/src/discussion/index.ts +0 -2
  1049. package/src/file/validate-file-path.test.ts +0 -44
  1050. package/src/file/validate-file-path.ts +0 -60
  1051. package/src/file-queue/file-handlers.ts +0 -267
  1052. package/src/file-queue/file-queue-process.test.ts +0 -456
  1053. package/src/file-queue/file-queue-process.ts +0 -108
  1054. package/src/file-queue/file-queue-settled.test.ts +0 -56
  1055. package/src/file-queue/file-queue-settled.ts +0 -31
  1056. package/src/file-queue/index.ts +0 -1
  1057. package/src/file-queue/with-skip-file-queue.test.ts +0 -158
  1058. package/src/file-queue/with-skip-file-queue.ts +0 -33
  1059. package/src/key-value/database-schema.test.ts +0 -140
  1060. package/src/key-value/database-schema.ts +0 -66
  1061. package/src/lix/close-lix.ts +0 -8
  1062. package/src/lix/merge.get-leaf-changes-only-in-source.test.ts +0 -143
  1063. package/src/lix/merge.get-leaf-changes-only-in-source.ts +0 -46
  1064. package/src/lix/merge.test.ts +0 -858
  1065. package/src/lix/merge.ts +0 -244
  1066. package/src/lix/open-lix-in-memory.test.ts +0 -34
  1067. package/src/lix/open-lix-in-memory.ts +0 -28
  1068. package/src/lix/to-blob.ts +0 -14
  1069. package/src/own-change-control/apply-own-change.test.ts +0 -361
  1070. package/src/own-change-control/apply-own-change.ts +0 -110
  1071. package/src/own-change-control/change-controlled-tables.test.ts +0 -69
  1072. package/src/own-change-control/change-controlled-tables.ts +0 -102
  1073. package/src/own-change-control/database-triggers.test.ts +0 -259
  1074. package/src/own-change-control/database-triggers.ts +0 -189
  1075. package/src/own-change-control/index.ts +0 -1
  1076. package/src/own-change-control/with-skip-own-change-control.test.ts +0 -57
  1077. package/src/own-change-control/with-skip-own-change-control.ts +0 -34
  1078. package/src/plugin/load-plugin.ts +0 -37
  1079. package/src/plugin/with-transaction.ts +0 -22
  1080. package/src/query-filter/change-conflict-in-version.test.ts +0 -62
  1081. package/src/query-filter/change-conflict-in-version.ts +0 -25
  1082. package/src/query-filter/change-in-version.test.ts +0 -82
  1083. package/src/query-filter/change-in-version.ts +0 -31
  1084. package/src/query-filter/change-is-leaf-in-version.test.ts +0 -77
  1085. package/src/query-filter/change-is-leaf-in-version.ts +0 -36
  1086. package/src/query-filter/change-is-leaf-of.bench.ts +0 -175
  1087. package/src/query-filter/change-is-leaf-of.test.ts +0 -84
  1088. package/src/query-filter/change-is-leaf-of.ts +0 -46
  1089. package/src/query-filter/change-is-leaf.test.ts +0 -140
  1090. package/src/query-filter/change-is-leaf.ts +0 -25
  1091. package/src/query-filter/change-is-lowest-common-ancestor-of.test.ts +0 -173
  1092. package/src/query-filter/change-is-lowest-common-ancestor-of.ts +0 -57
  1093. package/src/query-filter/version-change-in-difference.test.ts +0 -105
  1094. package/src/query-filter/version-change-in-difference.ts +0 -37
  1095. package/src/query-filter/version-change-in-symmetric-difference.test.ts +0 -104
  1096. package/src/query-filter/version-change-in-symmetric-difference.ts +0 -52
  1097. package/src/snapshot/create-snapshot.test.ts +0 -68
  1098. package/src/snapshot/create-snapshot.ts +0 -40
  1099. package/src/snapshot/index.ts +0 -2
  1100. package/src/snapshot/json-sha-256.test.ts +0 -12
  1101. package/src/snapshot/json-sha-256.ts +0 -35
  1102. package/src/snapshot/mock-json-snapshot.ts +0 -14
  1103. package/src/version/merge-version.test.ts +0 -530
  1104. package/src/version/merge-version.ts +0 -88
  1105. package/src/version/update-changes-in-version.test.ts +0 -371
  1106. package/src/version/update-changes-in-version.ts +0 -47
@@ -0,0 +1,1288 @@
1
+ import type { Generated, Insertable, Selectable, Updateable } from "kysely";
2
+ import type { SqliteWasmDatabase } from "sqlite-wasm-kysely";
3
+ import { validateStateMutation } from "./validate-state-mutation.js";
4
+ import type { LixInternalDatabaseSchema } from "../database/schema.js";
5
+ import type { Kysely } from "kysely";
6
+ import { handleStateMutation } from "./handle-state-mutation.js";
7
+ import { createLixOwnLogSync } from "../log/create-lix-own-log.js";
8
+ import { createChangesetForTransaction } from "./create-changeset-for-transaction.js";
9
+ import type { LixHooks } from "../hooks/create-hooks.js";
10
+
11
+ export function applyStateDatabaseSchema(
12
+ sqlite: SqliteWasmDatabase,
13
+ db: Kysely<LixInternalDatabaseSchema>,
14
+ hooks: LixHooks
15
+ ): SqliteWasmDatabase {
16
+ sqlite.createFunction({
17
+ name: "validate_snapshot_content",
18
+ deterministic: true,
19
+ arity: 5,
20
+ // @ts-expect-error - type mismatch
21
+ xFunc: (_ctxPtr: number, ...args: any[]) => {
22
+ return validateStateMutation({
23
+ lix: { sqlite, db: db as any },
24
+ schema: args[0] ? JSON.parse(args[0]) : null,
25
+ snapshot_content: JSON.parse(args[1]),
26
+ operation: args[2] || undefined,
27
+ entity_id: args[3] || undefined,
28
+ version_id: args[4],
29
+ });
30
+ },
31
+ });
32
+
33
+ // Create virtual table using the proper SQLite WASM API (following vtab-experiment pattern)
34
+ const capi = sqlite.sqlite3.capi;
35
+ const module = new capi.sqlite3_module();
36
+
37
+ // Store cursor state
38
+ const cursorStates = new Map();
39
+
40
+ // Cache initialization state to avoid repeated table existence checks
41
+ let loggingInitialized: boolean | null = null;
42
+
43
+ const canLog = () => {
44
+ if (loggingInitialized === null) {
45
+ try {
46
+ const tableExists = sqlite.exec({
47
+ sql: "SELECT 1 FROM sqlite_master WHERE type='table' AND name='key_value'",
48
+ returnValue: "resultRows",
49
+ });
50
+ loggingInitialized = tableExists && tableExists.length > 0;
51
+ } catch {
52
+ loggingInitialized = false;
53
+ }
54
+ }
55
+ return loggingInitialized;
56
+ };
57
+
58
+ const create_temp_change_table_sql = `
59
+ -- add a table we use within the transaction
60
+ CREATE TEMP TABLE IF NOT EXISTS internal_change_in_transaction (
61
+ id TEXT PRIMARY KEY DEFAULT (uuid_v7()),
62
+ entity_id TEXT NOT NULL,
63
+ schema_key TEXT NOT NULL,
64
+ schema_version TEXT NOT NULL,
65
+ file_id TEXT NOT NULL,
66
+ plugin_key TEXT NOT NULL,
67
+ version_id TEXT NOT NULL,
68
+ snapshot_content BLOB,
69
+ created_at TEXT DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')) NOT NULL CHECK (created_at LIKE '%Z'),
70
+ --- NOTE schena_key must be unique per entity_id and file_id
71
+ UNIQUE(entity_id, file_id, schema_key, version_id)
72
+ ) STRICT;
73
+
74
+ `;
75
+
76
+ sqlite.exec(create_temp_change_table_sql);
77
+
78
+ module.installMethods(
79
+ {
80
+ xCreate: (db: any, _pAux: any, _argc: number, _argv: any, pVTab: any) => {
81
+ const sql = `CREATE TABLE x(
82
+ entity_id TEXT,
83
+ schema_key TEXT,
84
+ file_id TEXT,
85
+ version_id TEXT,
86
+ plugin_key TEXT,
87
+ snapshot_content TEXT,
88
+ schema_version TEXT,
89
+ created_at TEXT,
90
+ updated_at TEXT,
91
+ inherited_from_version_id TEXT,
92
+ change_id TEXT,
93
+ untracked INTEGER
94
+ )`;
95
+
96
+ const result = capi.sqlite3_declare_vtab(db, sql);
97
+ if (result !== capi.SQLITE_OK) {
98
+ return result;
99
+ }
100
+
101
+ sqlite.sqlite3.vtab.xVtab.create(pVTab);
102
+ return capi.SQLITE_OK;
103
+ },
104
+
105
+ xConnect: (
106
+ db: any,
107
+ _pAux: any,
108
+ _argc: number,
109
+ _argv: any,
110
+ pVTab: any
111
+ ) => {
112
+ const sql = `CREATE TABLE x(
113
+ entity_id TEXT,
114
+ schema_key TEXT,
115
+ file_id TEXT,
116
+ version_id TEXT,
117
+ plugin_key TEXT,
118
+ snapshot_content TEXT,
119
+ schema_version TEXT,
120
+ created_at TEXT,
121
+ updated_at TEXT,
122
+ inherited_from_version_id TEXT,
123
+ change_id TEXT,
124
+ untracked INTEGER
125
+ )`;
126
+
127
+ const result = capi.sqlite3_declare_vtab(db, sql);
128
+ if (result !== capi.SQLITE_OK) {
129
+ return result;
130
+ }
131
+
132
+ sqlite.sqlite3.vtab.xVtab.create(pVTab);
133
+ return capi.SQLITE_OK;
134
+ },
135
+
136
+ xBegin: () => {
137
+ // assert that we are not already in a transaction (the internal_change_in_transaction table is empty)
138
+ if (
139
+ sqlite.exec({
140
+ sql: "SELECT * FROM internal_change_in_transaction",
141
+ returnValue: "resultRows",
142
+ }).length > 0
143
+ ) {
144
+ const errorMessage = "Transaction already in progress";
145
+ if (canLog()) {
146
+ createLixOwnLogSync({
147
+ lix: { sqlite, db: db as any },
148
+ key: "lix_state_xbegin_error",
149
+ level: "error",
150
+ message: `xBegin error: ${errorMessage}`,
151
+ });
152
+ }
153
+ throw new Error(errorMessage);
154
+ }
155
+ },
156
+
157
+ xCommit: () => {
158
+ const currentTime = new Date().toISOString();
159
+
160
+ // Insert each row from internal_change_in_transaction into internal_snapshot and internal_change,
161
+ // using the same id for snapshot_id in internal_change as in internal_snapshot.
162
+ const changesWithoutChangeSets = sqlite.exec({
163
+ sql: `
164
+ SELECT
165
+ id,
166
+ entity_id,
167
+ schema_key,
168
+ schema_version,
169
+ file_id,
170
+ plugin_key,
171
+ version_id,
172
+ CASE
173
+ WHEN snapshot_content IS NOT NULL THEN json(snapshot_content)
174
+ ELSE NULL
175
+ END as snapshot_content,
176
+ created_at
177
+ FROM internal_change_in_transaction
178
+ ORDER BY version_id
179
+ `,
180
+ returnValue: "resultRows",
181
+ });
182
+
183
+ // Group changes by version_id
184
+ const changesByVersion = new Map<
185
+ string,
186
+ {
187
+ id: string;
188
+ entity_id: string;
189
+ schema_key: string;
190
+ schema_version: string;
191
+ file_id: string;
192
+ plugin_key: string;
193
+ created_at: string;
194
+ snapshot_content: string | null;
195
+ }[]
196
+ >();
197
+ for (const changeWithoutChangeset of changesWithoutChangeSets) {
198
+ const version_id = changeWithoutChangeset[6] as string;
199
+ if (!changesByVersion.has(version_id)) {
200
+ changesByVersion.set(version_id, []);
201
+ }
202
+ changesByVersion.get(version_id)!.push({
203
+ id: changeWithoutChangeset[0] as string,
204
+ entity_id: changeWithoutChangeset[1] as string,
205
+ schema_key: changeWithoutChangeset[2] as string,
206
+ schema_version: changeWithoutChangeset[3] as string,
207
+ file_id: changeWithoutChangeset[4] as string,
208
+ plugin_key: changeWithoutChangeset[5] as string,
209
+ snapshot_content: changeWithoutChangeset[7] as string,
210
+ created_at: changeWithoutChangeset[8] as string,
211
+ });
212
+ }
213
+
214
+ // Process each version's changes to create changesets
215
+ for (const [version_id, versionChanges] of changesByVersion) {
216
+ // Create changeset and edges for this version's transaction
217
+ createChangesetForTransaction(
218
+ sqlite,
219
+ db as any,
220
+ currentTime,
221
+ version_id,
222
+ versionChanges
223
+ );
224
+ }
225
+
226
+ const changesToRealize = sqlite.exec({
227
+ sql: "SELECT id, entity_id, schema_key, schema_version, file_id, plugin_key, version_id, snapshot_content, created_at FROM internal_change_in_transaction ORDER BY version_id",
228
+ returnValue: "resultRows",
229
+ });
230
+
231
+ for (const changeToRealize of changesToRealize) {
232
+ const [
233
+ id,
234
+ entity_id,
235
+ schema_key,
236
+ schema_version,
237
+ file_id,
238
+ plugin_key,
239
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
240
+ version_id,
241
+ snapshot_content,
242
+ created_at,
243
+ ] = changeToRealize;
244
+
245
+ let snapshot_id = "no-content";
246
+
247
+ if (snapshot_content) {
248
+ // Insert into internal_snapshot
249
+ const result = sqlite.exec({
250
+ sql: `INSERT OR IGNORE INTO internal_snapshot (content) VALUES (?) RETURNING id`,
251
+ bind: [snapshot_content],
252
+ returnValue: "resultRows",
253
+ });
254
+ // Get the 'id' column of the newly created row
255
+ if (result && result.length > 0) {
256
+ snapshot_id = result[0]![0] as string; // assuming 'id' is the first column
257
+ }
258
+ }
259
+
260
+ // Insert into internal_change
261
+ sqlite.exec({
262
+ sql: `INSERT INTO internal_change (id, entity_id, schema_key, schema_version, file_id, plugin_key, snapshot_id, created_at)
263
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
264
+ bind: [
265
+ id,
266
+ entity_id,
267
+ schema_key,
268
+ schema_version,
269
+ file_id,
270
+ plugin_key,
271
+ snapshot_id,
272
+ created_at,
273
+ ],
274
+ returnValue: "resultRows",
275
+ });
276
+ }
277
+
278
+ sqlite.exec({
279
+ sql: "DELETE FROM internal_change_in_transaction",
280
+ returnValue: "resultRows",
281
+ });
282
+
283
+ // Emit state commit hook after transaction is successfully committed
284
+ hooks._emit("state_commit");
285
+
286
+ return capi.SQLITE_OK;
287
+ },
288
+
289
+ xRollback: () => {
290
+ sqlite.exec({
291
+ sql: "DELETE FROM internal_change_in_transaction",
292
+ returnValue: "resultRows",
293
+ });
294
+ },
295
+
296
+ xBestIndex: () => {
297
+ return capi.SQLITE_OK;
298
+ },
299
+
300
+ xDisconnect: () => {
301
+ return capi.SQLITE_OK;
302
+ },
303
+
304
+ xDestroy: () => {
305
+ return capi.SQLITE_OK;
306
+ },
307
+
308
+ xOpen: (_pVTab: any, pCursor: any) => {
309
+ const cursor = sqlite.sqlite3.vtab.xCursor.create(pCursor);
310
+ cursorStates.set(cursor.pointer, {
311
+ results: [],
312
+ rowIndex: 0,
313
+ });
314
+ return capi.SQLITE_OK;
315
+ },
316
+
317
+ xClose: (pCursor: any) => {
318
+ cursorStates.delete(pCursor);
319
+ return capi.SQLITE_OK;
320
+ },
321
+
322
+ xFilter: (pCursor: any) => {
323
+ const cursorState = cursorStates.get(pCursor);
324
+
325
+ // Try cache first - UNION with priority: untracked > tracked > inherited
326
+ const cacheResults = sqlite.exec({
327
+ sql: `
328
+ -- 1. Untracked state (highest priority)
329
+ SELECT entity_id, schema_key, file_id, version_id, plugin_key,
330
+ snapshot_content, schema_version, created_at, updated_at,
331
+ NULL as inherited_from_version_id, 'untracked' as change_id, 1 as untracked
332
+ FROM internal_state_all_untracked
333
+
334
+ UNION ALL
335
+
336
+ -- 2. Tracked state (second priority) - only if no untracked exists
337
+ SELECT entity_id, schema_key, file_id, version_id, plugin_key,
338
+ snapshot_content, schema_version, created_at, updated_at,
339
+ inherited_from_version_id, change_id, 0 as untracked
340
+ FROM internal_state_cache
341
+ WHERE inheritance_delete_marker = 0 -- Hide copy-on-write deletions
342
+ AND NOT EXISTS (
343
+ SELECT 1 FROM internal_state_all_untracked unt
344
+ WHERE unt.entity_id = internal_state_cache.entity_id
345
+ AND unt.schema_key = internal_state_cache.schema_key
346
+ AND unt.file_id = internal_state_cache.file_id
347
+ AND unt.version_id = internal_state_cache.version_id
348
+ )
349
+
350
+ UNION ALL
351
+
352
+ -- 3. Inherited state (lowest priority) - only if no untracked or tracked exists
353
+ SELECT isc.entity_id, isc.schema_key, isc.file_id,
354
+ vi.version_id, -- Return child version_id
355
+ isc.plugin_key, isc.snapshot_content, isc.schema_version,
356
+ isc.created_at, isc.updated_at,
357
+ vi.parent_version_id as inherited_from_version_id, isc.change_id, 0 as untracked
358
+ FROM (
359
+ -- Get version inheritance relationships from cache
360
+ SELECT
361
+ json_extract(isc_v.snapshot_content, '$.id') AS version_id,
362
+ json_extract(isc_v.snapshot_content, '$.inherits_from_version_id') AS parent_version_id
363
+ FROM internal_state_cache isc_v
364
+ WHERE isc_v.schema_key = 'lix_version'
365
+ ) vi
366
+ JOIN internal_state_cache isc ON isc.version_id = vi.parent_version_id
367
+ WHERE vi.parent_version_id IS NOT NULL
368
+ -- Only inherit entities that exist (not deleted) in parent
369
+ AND isc.inheritance_delete_marker = 0
370
+ -- Don't inherit if child has tracked state
371
+ AND NOT EXISTS (
372
+ SELECT 1 FROM internal_state_cache child_isc
373
+ WHERE child_isc.version_id = vi.version_id
374
+ AND child_isc.entity_id = isc.entity_id
375
+ AND child_isc.schema_key = isc.schema_key
376
+ AND child_isc.file_id = isc.file_id
377
+ )
378
+ -- Don't inherit if child has untracked state
379
+ AND NOT EXISTS (
380
+ SELECT 1 FROM internal_state_all_untracked unt
381
+ WHERE unt.version_id = vi.version_id
382
+ AND unt.entity_id = isc.entity_id
383
+ AND unt.schema_key = isc.schema_key
384
+ AND unt.file_id = isc.file_id
385
+ )
386
+ `,
387
+ returnValue: "resultRows",
388
+ });
389
+
390
+ cursorState.results = cacheResults || [];
391
+ cursorState.rowIndex = 0;
392
+
393
+ // Cache miss - populate cache with actual recursive state query
394
+ if (cursorState.results.length === 0) {
395
+ if (canLog()) {
396
+ createLixOwnLogSync({
397
+ lix: { sqlite, db: db as any },
398
+ key: "lix_state_cache_miss",
399
+ level: "debug",
400
+ message: `Cache miss detected - materializing state from CTE`,
401
+ });
402
+ }
403
+
404
+ // Run the expensive recursive CTE to materialize state
405
+ // Include deletions when populating cache so inheritance blocking works
406
+ const stateResults = selectStateViaCTE(sqlite, {}, true);
407
+
408
+ // Populate cache with materialized state results
409
+ if (stateResults && stateResults.length > 0) {
410
+ let cachePopulated = false;
411
+ for (const row of stateResults) {
412
+ // CTE returns rows as arrays, so access by index
413
+ const entity_id = Array.isArray(row) ? row[0] : row.entity_id;
414
+ const schema_key = Array.isArray(row) ? row[1] : row.schema_key;
415
+ const file_id = Array.isArray(row) ? row[2] : row.file_id;
416
+ const plugin_key = Array.isArray(row) ? row[3] : row.plugin_key;
417
+ const snapshot_content = Array.isArray(row)
418
+ ? row[4]
419
+ : row.snapshot_content;
420
+ const schema_version = Array.isArray(row)
421
+ ? row[5]
422
+ : row.schema_version;
423
+ const version_id = Array.isArray(row) ? row[6] : row.version_id;
424
+ const created_at = Array.isArray(row) ? row[7] : row.created_at;
425
+ const updated_at = Array.isArray(row) ? row[8] : row.updated_at;
426
+ const inherited_from_version_id = Array.isArray(row)
427
+ ? row[9]
428
+ : row.inherited_from_version_id;
429
+ const change_id = Array.isArray(row) ? row[10] : row.change_id;
430
+
431
+ // Skip rows with null entity_id (no actual state data found)
432
+ if (!entity_id) {
433
+ continue;
434
+ }
435
+
436
+ const isDeletion = snapshot_content === null;
437
+
438
+ // TODO the CTE should not return inherited entities (optimization for later)
439
+ // Skip inherited entities - they should be resolved via inheritance logic, not stored as duplicates
440
+ if (
441
+ inherited_from_version_id !== null &&
442
+ inherited_from_version_id !== undefined
443
+ ) {
444
+ continue;
445
+ }
446
+
447
+ sqlite.exec({
448
+ sql: `INSERT OR REPLACE INTO internal_state_cache
449
+ (entity_id, schema_key, file_id, version_id, plugin_key, snapshot_content, schema_version, created_at, updated_at, inherited_from_version_id, inheritance_delete_marker, change_id)
450
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,
451
+ bind: [
452
+ entity_id,
453
+ schema_key,
454
+ file_id,
455
+ version_id,
456
+ plugin_key,
457
+ isDeletion
458
+ ? null
459
+ : typeof snapshot_content === "string"
460
+ ? snapshot_content
461
+ : JSON.stringify(snapshot_content),
462
+ schema_version,
463
+ created_at,
464
+ updated_at,
465
+ inherited_from_version_id === null ||
466
+ inherited_from_version_id === undefined
467
+ ? null
468
+ : inherited_from_version_id,
469
+ isDeletion ? 1 : 0,
470
+ change_id || "unknown-change-id",
471
+ ],
472
+ });
473
+ cachePopulated = true;
474
+ }
475
+ if (cachePopulated && canLog()) {
476
+ createLixOwnLogSync({
477
+ lix: { sqlite, db: db as any },
478
+ key: "lix_state_cache_populated",
479
+ level: "debug",
480
+ message: `Cache populated with ${stateResults?.length || 0} rows from CTE`,
481
+ });
482
+ }
483
+ }
484
+
485
+ // Re-query cache after population
486
+
487
+ // Re-query after population with priority: untracked > tracked > inherited
488
+ const newResults = sqlite.exec({
489
+ sql: `
490
+ -- 1. Untracked state (highest priority)
491
+ SELECT entity_id, schema_key, file_id, version_id, plugin_key,
492
+ snapshot_content, schema_version, created_at, updated_at,
493
+ NULL as inherited_from_version_id, 'untracked' as change_id, 1 as untracked
494
+ FROM internal_state_all_untracked
495
+
496
+ UNION ALL
497
+
498
+ -- 2. Tracked state (second priority) - only if no untracked exists
499
+ SELECT entity_id, schema_key, file_id, version_id, plugin_key,
500
+ snapshot_content, schema_version, created_at, updated_at,
501
+ inherited_from_version_id, change_id, 0 as untracked
502
+ FROM internal_state_cache
503
+ WHERE inheritance_delete_marker = 0 -- Hide copy-on-write deletions
504
+ AND NOT EXISTS (
505
+ SELECT 1 FROM internal_state_all_untracked unt
506
+ WHERE unt.entity_id = internal_state_cache.entity_id
507
+ AND unt.schema_key = internal_state_cache.schema_key
508
+ AND unt.file_id = internal_state_cache.file_id
509
+ AND unt.version_id = internal_state_cache.version_id
510
+ )
511
+
512
+ UNION ALL
513
+
514
+ -- 3. Inherited state (lowest priority) - only if no untracked or tracked exists
515
+ SELECT isc.entity_id, isc.schema_key, isc.file_id,
516
+ vi.version_id, -- Return child version_id
517
+ isc.plugin_key, isc.snapshot_content, isc.schema_version,
518
+ isc.created_at, isc.updated_at,
519
+ vi.parent_version_id as inherited_from_version_id, isc.change_id, 0 as untracked
520
+ FROM (
521
+ -- Get version inheritance relationships from cache
522
+ SELECT
523
+ json_extract(isc_v.snapshot_content, '$.id') AS version_id,
524
+ json_extract(isc_v.snapshot_content, '$.inherits_from_version_id') AS parent_version_id
525
+ FROM internal_state_cache isc_v
526
+ WHERE isc_v.schema_key = 'lix_version'
527
+ ) vi
528
+ JOIN internal_state_cache isc ON isc.version_id = vi.parent_version_id
529
+ WHERE vi.parent_version_id IS NOT NULL
530
+ -- Only inherit entities that exist (not deleted) in parent
531
+ AND isc.inheritance_delete_marker = 0
532
+ -- Don't inherit if child has tracked state
533
+ AND NOT EXISTS (
534
+ SELECT 1 FROM internal_state_cache child_isc
535
+ WHERE child_isc.version_id = vi.version_id
536
+ AND child_isc.entity_id = isc.entity_id
537
+ AND child_isc.schema_key = isc.schema_key
538
+ AND child_isc.file_id = isc.file_id
539
+ )
540
+ -- Don't inherit if child has untracked state
541
+ AND NOT EXISTS (
542
+ SELECT 1 FROM internal_state_all_untracked unt
543
+ WHERE unt.version_id = vi.version_id
544
+ AND unt.entity_id = isc.entity_id
545
+ AND unt.schema_key = isc.schema_key
546
+ AND unt.file_id = isc.file_id
547
+ )
548
+ `,
549
+ returnValue: "resultRows",
550
+ });
551
+ cursorState.results = newResults || [];
552
+ } else {
553
+ if (canLog()) {
554
+ createLixOwnLogSync({
555
+ lix: { sqlite, db: db as any },
556
+ key: "lix_state_cache_hit",
557
+ level: "debug",
558
+ message: `Cache hit - returning ${cursorState.results.length} cached rows`,
559
+ });
560
+ }
561
+ }
562
+
563
+ return capi.SQLITE_OK;
564
+ },
565
+
566
+ xNext: (pCursor: any) => {
567
+ const cursorState = cursorStates.get(pCursor);
568
+ cursorState.rowIndex++;
569
+ return capi.SQLITE_OK;
570
+ },
571
+
572
+ xEof: (pCursor: any) => {
573
+ const cursorState = cursorStates.get(pCursor);
574
+ return cursorState.rowIndex >= cursorState.results.length ? 1 : 0;
575
+ },
576
+
577
+ xColumn: (pCursor: any, pContext: any, iCol: number) => {
578
+ const cursorState = cursorStates.get(pCursor);
579
+ const row = cursorState.results[cursorState.rowIndex];
580
+
581
+ if (!row) {
582
+ capi.sqlite3_result_null(pContext);
583
+ return capi.SQLITE_OK;
584
+ }
585
+
586
+ // Handle array-style results from SQLite exec
587
+ let value;
588
+ if (Array.isArray(row)) {
589
+ value = row[iCol];
590
+ } else {
591
+ const columnName = getColumnName(iCol);
592
+ value = row[columnName];
593
+ }
594
+
595
+ // Handle special cases for null values that might be stored as strings
596
+ if (
597
+ value === "null" &&
598
+ getColumnName(iCol) === "inherited_from_version_id"
599
+ ) {
600
+ capi.sqlite3_result_null(pContext);
601
+ return capi.SQLITE_OK;
602
+ }
603
+
604
+ if (value === null || value === undefined) {
605
+ capi.sqlite3_result_null(pContext);
606
+ } else if (typeof value === "object") {
607
+ capi.sqlite3_result_js(pContext, JSON.stringify(value));
608
+ } else {
609
+ capi.sqlite3_result_js(pContext, value);
610
+ }
611
+
612
+ return capi.SQLITE_OK;
613
+ },
614
+
615
+ xRowid: (pCursor: any, pRowid: any) => {
616
+ const cursorState = cursorStates.get(pCursor);
617
+ sqlite.sqlite3.vtab.xRowid(pRowid, cursorState.rowIndex);
618
+ return capi.SQLITE_OK;
619
+ },
620
+
621
+ xUpdate: (_pVTab: number, nArg: number, ppArgv: any) => {
622
+ try {
623
+ // Extract arguments using the proper SQLite WASM API
624
+ const args = sqlite.sqlite3.capi.sqlite3_values_to_js(nArg, ppArgv);
625
+
626
+ // DELETE operation: nArg = 1, args[0] = old rowid
627
+ if (nArg === 1) {
628
+ // For DELETE, we need the old row data to pass to handleStateMutation
629
+ // We can't get this from the virtual table directly, so we'll need to
630
+ // handle DELETE differently:
631
+ // we query the row by rowid and pass it to handleStateMutation
632
+
633
+ handleStateDelete(sqlite, args[0]! as number, db);
634
+
635
+ return capi.SQLITE_OK;
636
+ }
637
+
638
+ // INSERT operation: nArg = N+2, args[0] = NULL, args[1] = new rowid
639
+ // UPDATE operation: nArg = N+2, args[0] = old rowid, args[1] = new rowid
640
+ const isInsert = args[0] === null || args[0] === undefined;
641
+ const isUpdate = args[0] !== null && args[0] !== undefined;
642
+
643
+ if (!isInsert && !isUpdate) {
644
+ throw new Error("Invalid xUpdate operation");
645
+ }
646
+
647
+ // Extract column values (args[2] through args[N+1])
648
+ // Column order: entity_id, schema_key, file_id, version_id, plugin_key,
649
+ // snapshot_content, schema_version, created_at, updated_at, inherited_from_version_id, change_id, untracked
650
+ const entity_id = args[2];
651
+ const schema_key = args[3];
652
+ const file_id = args[4];
653
+ const version_id = args[5];
654
+ const plugin_key = args[6];
655
+ const snapshot_content = args[7];
656
+ const schema_version = args[8];
657
+ // Skip created_at (args[9]), updated_at (args[10]), inherited_from_version_id (args[11]), change_id (args[12])
658
+ const untracked = args[13] ?? false;
659
+
660
+ // assert required fields
661
+ if (!entity_id || !schema_key || !file_id || !plugin_key) {
662
+ throw new Error("Missing required fields for state mutation");
663
+ }
664
+
665
+ if (!version_id) {
666
+ throw new Error("version_id is required for state mutation");
667
+ }
668
+
669
+ // Ensure snapshot_content is a string
670
+ const snapshotStr =
671
+ typeof snapshot_content === "string"
672
+ ? snapshot_content
673
+ : JSON.stringify(snapshot_content);
674
+
675
+ // Call validation function (same logic as triggers)
676
+ const storedSchemaResult = sqlite.exec({
677
+ sql: "SELECT value FROM stored_schema WHERE key = ?",
678
+ bind: [String(schema_key)],
679
+ returnValue: "resultRows",
680
+ });
681
+
682
+ const storedSchema =
683
+ storedSchemaResult && storedSchemaResult.length > 0
684
+ ? storedSchemaResult[0]![0]
685
+ : null;
686
+
687
+ validateStateMutation({
688
+ lix: { sqlite, db: db as any },
689
+ schema: storedSchema ? JSON.parse(storedSchema as string) : null,
690
+ snapshot_content: JSON.parse(snapshotStr),
691
+ operation: isInsert ? "insert" : "update",
692
+ entity_id: String(entity_id),
693
+ version_id: String(version_id),
694
+ untracked: Boolean(untracked),
695
+ });
696
+
697
+ // Route based on untracked flag
698
+ if (untracked) {
699
+ // Handle untracked mutation - write directly to untracked table
700
+ sqlite.exec({
701
+ sql: `INSERT OR REPLACE INTO internal_state_all_untracked
702
+ (entity_id, schema_key, file_id, version_id, plugin_key, snapshot_content, schema_version)
703
+ VALUES (?, ?, ?, ?, ?, ?, ?)`,
704
+ bind: [
705
+ String(entity_id),
706
+ String(schema_key),
707
+ String(file_id),
708
+ String(version_id),
709
+ String(plugin_key),
710
+ snapshotStr,
711
+ String(schema_version),
712
+ ],
713
+ });
714
+ } else {
715
+ // Handle tracked mutation - normal change control
716
+ // If there's existing untracked state, delete it first (tracked overrides untracked)
717
+ sqlite.exec({
718
+ sql: `DELETE FROM internal_state_all_untracked
719
+ WHERE entity_id = ? AND schema_key = ? AND file_id = ? AND version_id = ?`,
720
+ bind: [
721
+ String(entity_id),
722
+ String(schema_key),
723
+ String(file_id),
724
+ String(version_id),
725
+ ],
726
+ });
727
+
728
+ // Call handleStateMutation (same logic as triggers)
729
+ handleStateMutation(
730
+ sqlite,
731
+ db,
732
+ String(entity_id),
733
+ String(schema_key),
734
+ String(file_id),
735
+ String(plugin_key),
736
+ snapshotStr,
737
+ String(version_id),
738
+ String(schema_version)
739
+ );
740
+ }
741
+
742
+ // TODO: This cache copying logic is a temporary workaround for shared change sets.
743
+ // The proper solution requires improving cache miss logic to handle change set sharing
744
+ // without duplicating entries. See: https://github.com/opral/lix-sdk/issues/309
745
+ //
746
+ // Handle cache copying for new versions that share change sets
747
+ if (isInsert && String(schema_key) === "lix_version") {
748
+ const versionData = JSON.parse(snapshotStr);
749
+ const newVersionId = versionData.id;
750
+ const changeSetId = versionData.change_set_id;
751
+
752
+ if (newVersionId && changeSetId) {
753
+ // Find other versions that already use this change set
754
+ const existingVersionsWithSameChangeSet = sqlite.exec({
755
+ sql: `
756
+ SELECT json_extract(snapshot_content, '$.id') as version_id
757
+ FROM internal_state_cache
758
+ WHERE schema_key = 'lix_version'
759
+ AND json_extract(snapshot_content, '$.change_set_id') = ?
760
+ AND json_extract(snapshot_content, '$.id') != ?
761
+ `,
762
+ bind: [changeSetId, newVersionId],
763
+ returnValue: "resultRows",
764
+ });
765
+
766
+ // If there are existing versions with the same change set, copy their cache entries
767
+ if (
768
+ existingVersionsWithSameChangeSet &&
769
+ existingVersionsWithSameChangeSet.length > 0
770
+ ) {
771
+ const sourceVersionId =
772
+ existingVersionsWithSameChangeSet[0]![0]; // Take first existing version
773
+
774
+ // Copy cache entries from source version to new version
775
+ sqlite.exec({
776
+ sql: `
777
+ INSERT OR IGNORE INTO internal_state_cache
778
+ (entity_id, schema_key, file_id, version_id, plugin_key, snapshot_content, schema_version, created_at, updated_at, inherited_from_version_id, inheritance_delete_marker, change_id)
779
+ SELECT
780
+ entity_id, schema_key, file_id, ?, plugin_key, snapshot_content, schema_version, created_at, updated_at, inherited_from_version_id, inheritance_delete_marker, change_id
781
+ FROM internal_state_cache
782
+ WHERE version_id = ? AND schema_key != 'lix_version'
783
+ `,
784
+ bind: [newVersionId, sourceVersionId],
785
+ });
786
+ }
787
+ }
788
+ }
789
+
790
+ return capi.SQLITE_OK;
791
+ } catch (error) {
792
+ const errorMessage =
793
+ error instanceof Error ? error.message : String(error);
794
+
795
+ // Log error for debugging
796
+ if (canLog()) {
797
+ createLixOwnLogSync({
798
+ lix: { sqlite, db: db as any },
799
+ key: "lix_state_xupdate_error",
800
+ level: "error",
801
+ message: `xUpdate error: ${errorMessage}`,
802
+ });
803
+ }
804
+
805
+ throw error; //new Error("test");
806
+
807
+ // const vtab = sqlite.sqlite3.vtab.xVtab.get(_pVTab);
808
+
809
+ // // Set proper error message on the virtual table
810
+ // if (vtab) {
811
+ // // Free any existing error message first
812
+ // if (vtab.zErrMsg) {
813
+ // capi.sqlite3_free(vtab.zErrMsg);
814
+ // }
815
+ // // Allocate new error message using sqlite3_malloc
816
+ // const errorBytes = new TextEncoder().encode(errorMessage + "\0");
817
+ // const errorPtr = capi.sqlite3_malloc(errorBytes.length);
818
+ // if (errorPtr) {
819
+ // sqlite.sqlite3.wasm.heap8u().set(errorBytes, errorPtr);
820
+ // vtab.zErrMsg = errorPtr;
821
+ // }
822
+ // }
823
+
824
+ // return capi.SQLITE_ERROR;
825
+ }
826
+ },
827
+ },
828
+ false
829
+ );
830
+
831
+ capi.sqlite3_create_module(sqlite.pointer!, "state_vtab", module, 0);
832
+
833
+ // Create the virtual table as 'state' directly (no more _impl suffix or view layer)
834
+ sqlite.exec(
835
+ `CREATE VIRTUAL TABLE IF NOT EXISTS state_all USING state_vtab();`
836
+ );
837
+
838
+ // Create state view that filters to active version only
839
+ sqlite.exec(`
840
+ CREATE VIEW IF NOT EXISTS state AS
841
+ SELECT *
842
+ FROM state_all
843
+ WHERE version_id IN (SELECT version_id FROM active_version);
844
+
845
+ -- Add INSTEAD OF triggers for state that forward to state virtual table
846
+ CREATE TRIGGER IF NOT EXISTS state_insert
847
+ INSTEAD OF INSERT ON state
848
+ BEGIN
849
+ INSERT INTO state_all (
850
+ entity_id, schema_key, file_id, version_id, plugin_key,
851
+ snapshot_content, schema_version, created_at, updated_at, inherited_from_version_id, change_id, untracked
852
+ ) VALUES (
853
+ NEW.entity_id, NEW.schema_key, NEW.file_id, NEW.version_id, NEW.plugin_key,
854
+ NEW.snapshot_content, NEW.schema_version, NEW.created_at, NEW.updated_at, NEW.inherited_from_version_id, NEW.change_id, NEW.untracked
855
+ );
856
+ END;
857
+
858
+ CREATE TRIGGER IF NOT EXISTS state_update
859
+ INSTEAD OF UPDATE ON state
860
+ BEGIN
861
+ UPDATE state_all
862
+ SET
863
+ entity_id = NEW.entity_id,
864
+ schema_key = NEW.schema_key,
865
+ file_id = NEW.file_id,
866
+ version_id = NEW.version_id,
867
+ plugin_key = NEW.plugin_key,
868
+ snapshot_content = NEW.snapshot_content,
869
+ schema_version = NEW.schema_version,
870
+ created_at = NEW.created_at,
871
+ updated_at = NEW.updated_at,
872
+ inherited_from_version_id = NEW.inherited_from_version_id,
873
+ change_id = NEW.change_id,
874
+ untracked = NEW.untracked
875
+ WHERE
876
+ entity_id = OLD.entity_id
877
+ AND schema_key = OLD.schema_key
878
+ AND file_id = OLD.file_id
879
+ AND version_id = OLD.version_id;
880
+ END;
881
+
882
+ CREATE TRIGGER IF NOT EXISTS state_delete
883
+ INSTEAD OF DELETE ON state
884
+ BEGIN
885
+ DELETE FROM state_all
886
+ WHERE entity_id = OLD.entity_id
887
+ AND schema_key = OLD.schema_key
888
+ AND file_id = OLD.file_id
889
+ AND version_id = OLD.version_id;
890
+ END;
891
+ `);
892
+
893
+ // Create the cache table for performance optimization and the untracked state table
894
+ const sql = `
895
+ CREATE TABLE IF NOT EXISTS internal_state_cache (
896
+ entity_id TEXT NOT NULL,
897
+ schema_key TEXT NOT NULL,
898
+ file_id TEXT NOT NULL,
899
+ version_id TEXT NOT NULL,
900
+ plugin_key TEXT NOT NULL,
901
+ snapshot_content TEXT, -- Allow NULL for deletions
902
+ schema_version TEXT NOT NULL,
903
+ created_at TEXT NOT NULL,
904
+ updated_at TEXT NOT NULL,
905
+ inherited_from_version_id TEXT,
906
+ inheritance_delete_marker INTEGER DEFAULT 0, -- Flag for copy-on-write deletion markers
907
+ change_id TEXT, -- Allow NULL during migration and for deletion markers
908
+ PRIMARY KEY (entity_id, schema_key, file_id, version_id)
909
+ );
910
+
911
+ -- Table for untracked state that bypasses change control
912
+ CREATE TABLE IF NOT EXISTS internal_state_all_untracked (
913
+ entity_id TEXT NOT NULL,
914
+ schema_key TEXT NOT NULL,
915
+ file_id TEXT NOT NULL,
916
+ version_id TEXT NOT NULL,
917
+ plugin_key TEXT NOT NULL,
918
+ snapshot_content TEXT NOT NULL, -- JSON content
919
+ schema_version TEXT NOT NULL,
920
+ created_at TEXT DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')) NOT NULL CHECK (created_at LIKE '%Z'),
921
+ updated_at TEXT DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now')) NOT NULL CHECK (updated_at LIKE '%Z'),
922
+ PRIMARY KEY (entity_id, schema_key, file_id, version_id)
923
+ ) STRICT;
924
+
925
+ -- Trigger to update updated_at on untracked state changes
926
+ CREATE TRIGGER IF NOT EXISTS internal_state_all_untracked_update_timestamp
927
+ AFTER UPDATE ON internal_state_all_untracked
928
+ BEGIN
929
+ UPDATE internal_state_all_untracked
930
+ SET updated_at = strftime('%Y-%m-%dT%H:%M:%fZ', 'now')
931
+ WHERE entity_id = NEW.entity_id
932
+ AND schema_key = NEW.schema_key
933
+ AND file_id = NEW.file_id
934
+ AND version_id = NEW.version_id;
935
+ END;
936
+ `;
937
+
938
+ return sqlite.exec(sql);
939
+ }
940
+
941
+ export function handleStateDelete(
942
+ sqlite: SqliteWasmDatabase,
943
+ rowId: number,
944
+ db: Kysely<LixInternalDatabaseSchema>
945
+ ): void {
946
+ const rowToDelete = sqlite.exec({
947
+ sql: "SELECT * FROM state_all WHERE rowid = ?",
948
+ bind: [rowId],
949
+ returnValue: "resultRows",
950
+ })[0]!;
951
+
952
+ const entity_id = rowToDelete[0];
953
+ const schema_key = rowToDelete[1];
954
+ const file_id = rowToDelete[2];
955
+ const version_id = rowToDelete[3];
956
+ const plugin_key = rowToDelete[4];
957
+ const snapshot_content = rowToDelete[5];
958
+ const schema_version = rowToDelete[6];
959
+ // Column indices: created_at[7], updated_at[8], inherited_from_version_id[9], change_id[10], untracked[11]
960
+ const untracked = rowToDelete[11];
961
+
962
+ // If entity is untracked, just delete it without creating changes
963
+ if (untracked) {
964
+ // Delete from untracked table
965
+ sqlite.exec({
966
+ sql: `DELETE FROM internal_state_all_untracked
967
+ WHERE entity_id = ? AND schema_key = ? AND file_id = ? AND version_id = ?`,
968
+ bind: [
969
+ String(entity_id),
970
+ String(schema_key),
971
+ String(file_id),
972
+ String(version_id),
973
+ ],
974
+ });
975
+ return;
976
+ }
977
+
978
+ const storedSchemaResult = sqlite.exec({
979
+ sql: "SELECT value FROM stored_schema WHERE key = ?",
980
+ bind: [String(schema_key)],
981
+ returnValue: "resultRows",
982
+ });
983
+
984
+ const storedSchema =
985
+ storedSchemaResult && storedSchemaResult.length > 0
986
+ ? storedSchemaResult[0]![0]
987
+ : null;
988
+
989
+ validateStateMutation({
990
+ lix: { sqlite, db: db as any },
991
+ schema: storedSchema ? JSON.parse(storedSchema as string) : null,
992
+ snapshot_content: JSON.parse(snapshot_content as string),
993
+ operation: "delete",
994
+ entity_id: String(entity_id),
995
+ version_id: String(version_id),
996
+ });
997
+
998
+ handleStateMutation(
999
+ sqlite,
1000
+ db,
1001
+ String(entity_id),
1002
+ String(schema_key),
1003
+ String(file_id),
1004
+ String(plugin_key),
1005
+ null, // No snapshot content for DELETE
1006
+ String(version_id),
1007
+ String(schema_version)
1008
+ );
1009
+ }
1010
+
1011
+ // Helper functions for the virtual table
1012
+
1013
+ function getColumnName(columnIndex: number): string {
1014
+ const columns = [
1015
+ "entity_id",
1016
+ "schema_key",
1017
+ "file_id",
1018
+ "version_id",
1019
+ "plugin_key",
1020
+ "snapshot_content",
1021
+ "schema_version",
1022
+ "created_at",
1023
+ "updated_at",
1024
+ "inherited_from_version_id",
1025
+ "change_id",
1026
+ "untracked",
1027
+ ];
1028
+ return columns[columnIndex] || "unknown";
1029
+ }
1030
+
1031
+ function selectStateViaCTE(
1032
+ sqlite: SqliteWasmDatabase,
1033
+ filters: Record<string, string>,
1034
+ includeDeletions: boolean = false
1035
+ ): any[] {
1036
+ let sql = `
1037
+ WITH
1038
+ all_changes_with_snapshots AS (
1039
+ -- Include committed changes
1040
+ SELECT ic.id, ic.entity_id, ic.schema_key, ic.file_id, ic.plugin_key,
1041
+ ic.schema_version,
1042
+ CASE
1043
+ WHEN ic.snapshot_id = 'no-content' THEN NULL
1044
+ ELSE json(s.content)
1045
+ END AS snapshot_content
1046
+ FROM internal_change ic
1047
+ LEFT JOIN internal_snapshot s ON ic.snapshot_id = s.id
1048
+
1049
+ UNION ALL
1050
+
1051
+ -- Include changes from current transaction
1052
+ SELECT ict.id, ict.entity_id, ict.schema_key, ict.file_id, ict.plugin_key,
1053
+ ict.schema_version, ict.snapshot_content
1054
+ FROM internal_change_in_transaction ict
1055
+
1056
+ UNION ALL
1057
+
1058
+ -- Include untracked state (pseudo-changes with special change_id)
1059
+ SELECT 'untracked-' || unt.entity_id || '-' || unt.schema_key AS id,
1060
+ unt.entity_id, unt.schema_key, unt.file_id, unt.plugin_key,
1061
+ unt.schema_version, json(unt.snapshot_content) AS snapshot_content
1062
+ FROM internal_state_all_untracked unt
1063
+ ),
1064
+ root_cs_of_all_versions AS (
1065
+ SELECT json_extract(v.snapshot_content, '$.change_set_id') AS version_change_set_id,
1066
+ v.entity_id AS version_id
1067
+ FROM all_changes_with_snapshots v
1068
+ WHERE v.schema_key = 'lix_version'
1069
+ ),
1070
+ reachable_cs_from_roots(id, version_id) AS (
1071
+ SELECT version_change_set_id, version_id FROM root_cs_of_all_versions
1072
+ UNION
1073
+ SELECT json_extract(e.snapshot_content, '$.parent_id'), r.version_id
1074
+ FROM all_changes_with_snapshots e
1075
+ JOIN reachable_cs_from_roots r ON json_extract(e.snapshot_content, '$.child_id') = r.id
1076
+ WHERE e.schema_key = 'lix_change_set_edge'
1077
+ ),
1078
+ cse_in_reachable_cs AS (
1079
+ SELECT json_extract(ias.snapshot_content, '$.entity_id') AS target_entity_id,
1080
+ json_extract(ias.snapshot_content, '$.file_id') AS target_file_id,
1081
+ json_extract(ias.snapshot_content, '$.schema_key') AS target_schema_key,
1082
+ json_extract(ias.snapshot_content, '$.change_id') AS target_change_id,
1083
+ json_extract(ias.snapshot_content, '$.change_set_id') AS cse_origin_change_set_id,
1084
+ rcs.version_id
1085
+ FROM all_changes_with_snapshots ias
1086
+ JOIN reachable_cs_from_roots rcs ON json_extract(ias.snapshot_content, '$.change_set_id') = rcs.id
1087
+ WHERE ias.schema_key = 'lix_change_set_element'
1088
+ ),
1089
+ leaf_target_snapshots AS (
1090
+ SELECT target_change.entity_id, target_change.schema_key, target_change.file_id,
1091
+ target_change.plugin_key, target_change.snapshot_content AS snapshot_content,
1092
+ target_change.schema_version, r.version_id, target_change.id as change_id
1093
+ FROM cse_in_reachable_cs r
1094
+ INNER JOIN all_changes_with_snapshots target_change ON r.target_change_id = target_change.id
1095
+ WHERE NOT EXISTS (
1096
+ WITH RECURSIVE descendants_of_current_cs(id) AS (
1097
+ SELECT r.cse_origin_change_set_id
1098
+ UNION
1099
+ SELECT json_extract(edge.snapshot_content, '$.child_id')
1100
+ FROM all_changes_with_snapshots edge
1101
+ JOIN descendants_of_current_cs d ON json_extract(edge.snapshot_content, '$.parent_id') = d.id
1102
+ WHERE edge.schema_key = 'lix_change_set_edge'
1103
+ AND json_extract(edge.snapshot_content, '$.child_id') IN (
1104
+ SELECT id FROM reachable_cs_from_roots WHERE version_id = r.version_id
1105
+ )
1106
+ )
1107
+ SELECT 1 FROM cse_in_reachable_cs newer_r
1108
+ WHERE newer_r.target_entity_id = r.target_entity_id
1109
+ AND newer_r.target_file_id = r.target_file_id
1110
+ AND newer_r.target_schema_key = r.target_schema_key
1111
+ AND newer_r.version_id = r.version_id
1112
+ AND (newer_r.cse_origin_change_set_id != r.cse_origin_change_set_id OR newer_r.target_change_id != r.target_change_id)
1113
+ AND newer_r.cse_origin_change_set_id IN descendants_of_current_cs
1114
+ )
1115
+ ),
1116
+ -- Get version inheritance relationships
1117
+ version_inheritance AS (
1118
+ SELECT DISTINCT
1119
+ v.entity_id AS version_id,
1120
+ json_extract(v.snapshot_content, '$.inherits_from_version_id') AS parent_version_id
1121
+ FROM all_changes_with_snapshots v
1122
+ WHERE v.schema_key = 'lix_version'
1123
+ ),
1124
+ -- Combine direct entities with inherited entities
1125
+ all_entities AS (
1126
+ -- Direct entities from leaf_target_snapshots
1127
+ SELECT
1128
+ entity_id, schema_key, file_id, plugin_key, snapshot_content, schema_version,
1129
+ version_id, version_id as visible_in_version, NULL as inherited_from_version_id, change_id
1130
+ FROM leaf_target_snapshots
1131
+
1132
+ UNION ALL
1133
+
1134
+ -- Inherited entities from parent versions
1135
+ SELECT
1136
+ ls.entity_id, ls.schema_key, ls.file_id, ls.plugin_key, ls.snapshot_content, ls.schema_version,
1137
+ vi.version_id, -- Use child version_id for testing
1138
+ vi.version_id as visible_in_version, -- Make visible in child version
1139
+ vi.parent_version_id as inherited_from_version_id, ls.change_id
1140
+ FROM version_inheritance vi
1141
+ JOIN leaf_target_snapshots ls ON ls.version_id = vi.parent_version_id
1142
+ WHERE vi.parent_version_id IS NOT NULL
1143
+ AND ls.snapshot_content IS NOT NULL -- Don't inherit deleted entities
1144
+ -- Don't inherit if child already has this entity (including deletion markers)
1145
+ -- Use a more comprehensive check that includes both leaf snapshots and direct inheritance blocking
1146
+ AND NOT EXISTS (
1147
+ -- Check if there's ANY change for this entity in the child version
1148
+ -- This includes creation, update, AND deletion changes
1149
+ SELECT 1 FROM leaf_target_snapshots child_ls
1150
+ WHERE child_ls.version_id = vi.version_id
1151
+ AND child_ls.entity_id = ls.entity_id
1152
+ AND child_ls.schema_key = ls.schema_key
1153
+ AND child_ls.file_id = ls.file_id
1154
+ )
1155
+ -- Additional safeguard: check that no change set element exists for this entity in child
1156
+ AND NOT EXISTS (
1157
+ SELECT 1 FROM cse_in_reachable_cs cse
1158
+ JOIN all_changes_with_snapshots target_change ON cse.target_change_id = target_change.id
1159
+ WHERE cse.version_id = vi.version_id
1160
+ AND target_change.entity_id = ls.entity_id
1161
+ AND target_change.schema_key = ls.schema_key
1162
+ AND target_change.file_id = ls.file_id
1163
+ )
1164
+ ),
1165
+ -- Prioritize direct entities over inherited ones, then deduplicate
1166
+ prioritized_entities AS (
1167
+ SELECT *,
1168
+ -- Priority: direct entities (inherited_from_version_id IS NULL) over inherited
1169
+ CASE WHEN inherited_from_version_id IS NULL THEN 1 ELSE 2 END as priority,
1170
+ -- Row number for deduplication within same priority
1171
+ ROW_NUMBER() OVER (
1172
+ PARTITION BY entity_id, schema_key, file_id, visible_in_version
1173
+ ORDER BY CASE WHEN inherited_from_version_id IS NULL THEN 1 ELSE 2 END,
1174
+ -- Among inherited entities, prefer those with earlier timestamps
1175
+ version_id
1176
+ ) as rn
1177
+ FROM all_entities ae
1178
+ -- Don't filter out entities with null snapshot_content here
1179
+ -- We need deletion markers to be included for proper inheritance blocking
1180
+ )
1181
+ SELECT DISTINCT
1182
+ pe.entity_id,
1183
+ pe.schema_key,
1184
+ pe.file_id,
1185
+ pe.plugin_key,
1186
+ pe.snapshot_content,
1187
+ pe.schema_version,
1188
+ pe.version_id,
1189
+ (SELECT MIN(ic.created_at) FROM internal_change ic
1190
+ WHERE ic.entity_id = pe.entity_id AND ic.schema_key = pe.schema_key AND ic.file_id = pe.file_id) AS created_at,
1191
+ COALESCE(
1192
+ (SELECT MAX(ic.created_at) FROM internal_change ic
1193
+ WHERE ic.entity_id = pe.entity_id AND ic.schema_key = pe.schema_key AND ic.file_id = pe.file_id
1194
+ AND ic.id IN (SELECT cse.target_change_id FROM cse_in_reachable_cs cse WHERE cse.version_id = pe.version_id)),
1195
+ (SELECT MIN(ic.created_at) FROM internal_change ic
1196
+ WHERE ic.entity_id = pe.entity_id AND ic.schema_key = pe.schema_key AND ic.file_id = pe.file_id)
1197
+ ) AS updated_at,
1198
+ pe.inherited_from_version_id,
1199
+ pe.change_id
1200
+ FROM prioritized_entities pe
1201
+ WHERE pe.rn = 1
1202
+ ${includeDeletions ? "" : "-- Filter out deletion markers from final results\n AND pe.snapshot_content IS NOT NULL"}
1203
+ `;
1204
+
1205
+ const bindings: string[] = [];
1206
+ const conditions: string[] = [];
1207
+
1208
+ Object.entries(filters).forEach(([key, value]) => {
1209
+ if (key === "version_id") {
1210
+ // For version_id filter, use visible_in_version
1211
+ conditions.push(`ae.visible_in_version = ?`);
1212
+ } else {
1213
+ conditions.push(`ae.${key} = ?`);
1214
+ }
1215
+ bindings.push(value);
1216
+ });
1217
+
1218
+ if (conditions.length > 0) {
1219
+ sql += " AND " + conditions.join(" AND ");
1220
+ }
1221
+
1222
+ const result = sqlite.exec({
1223
+ sql,
1224
+ bind: bindings,
1225
+ returnValue: "resultRows",
1226
+ });
1227
+
1228
+ return result || [];
1229
+ }
1230
+
1231
+ export type StateView = Omit<StateAllView, "version_id">;
1232
+
1233
+ export type StateAllView = {
1234
+ entity_id: string;
1235
+ schema_key: string;
1236
+ file_id: string;
1237
+ plugin_key: string;
1238
+ snapshot_content: Record<string, any>;
1239
+ schema_version: string;
1240
+ version_id: string;
1241
+ created_at: Generated<string>;
1242
+ updated_at: Generated<string>;
1243
+ inherited_from_version_id: string | null;
1244
+ change_id: Generated<string>;
1245
+ untracked: Generated<boolean>;
1246
+ };
1247
+
1248
+ // Cache table type (internal table for state materialization)
1249
+ export type InternalStateCacheTable = {
1250
+ entity_id: string;
1251
+ schema_key: string;
1252
+ file_id: string;
1253
+ version_id: string;
1254
+ plugin_key: string;
1255
+ snapshot_content: string | null; // JSON string, NULL for deletions
1256
+ schema_version: string;
1257
+ created_at: string;
1258
+ updated_at: string;
1259
+ inherited_from_version_id: string | null;
1260
+ inheritance_delete_marker: number; // 1 for copy-on-write deletion markers, 0 otherwise
1261
+ change_id: string;
1262
+ };
1263
+
1264
+ // Kysely operation types
1265
+ export type StateRow = Selectable<StateView>;
1266
+ export type NewStateRow = Insertable<StateView>;
1267
+ export type StateRowUpdate = Updateable<StateView>;
1268
+
1269
+ export type StateCacheRow = Selectable<InternalStateCacheTable>;
1270
+ export type NewStateCacheRow = Insertable<InternalStateCacheTable>;
1271
+ export type StateCacheRowUpdate = Updateable<InternalStateCacheTable>;
1272
+
1273
+ // Types for the internal_change TABLE
1274
+ export type InternalChangeInTransaction =
1275
+ Selectable<InternalChangeInTransactionTable>;
1276
+ export type NewInternalChangeInTransaction =
1277
+ Insertable<InternalChangeInTransactionTable>;
1278
+ export type InternalChangeInTransactionTable = {
1279
+ id: Generated<string>;
1280
+ entity_id: string;
1281
+ schema_key: string;
1282
+ schema_version: string;
1283
+ file_id: string;
1284
+ plugin_key: string;
1285
+ version_id: string;
1286
+ snapshot_content: Record<string, any> | null;
1287
+ created_at: Generated<string>;
1288
+ };