@lix-js/sdk 0.0.1 → 0.1.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 (278) hide show
  1. package/LICENSE +21 -0
  2. package/dist/change/apply-changes.js +9 -9
  3. package/dist/change/apply-changes.js.map +1 -1
  4. package/dist/change/apply-changes.test.js +5 -5
  5. package/dist/change/apply-changes.test.js.map +1 -1
  6. package/dist/database/apply-schema.d.ts.map +1 -1
  7. package/dist/database/apply-schema.js +20 -72
  8. package/dist/database/apply-schema.js.map +1 -1
  9. package/dist/database/execute-sync.test.js +3 -3
  10. package/dist/database/execute-sync.test.js.map +1 -1
  11. package/dist/database/init-db.d.ts.map +1 -1
  12. package/dist/database/init-db.js +18 -3
  13. package/dist/database/init-db.js.map +1 -1
  14. package/dist/database/init-db.test.js +128 -17
  15. package/dist/database/init-db.test.js.map +1 -1
  16. package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.d.ts.map +1 -1
  17. package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.js +5 -2
  18. package/dist/database/kysely-plugin/parse-jsonb-plugin-v1.js.map +1 -1
  19. package/dist/database/mutation-log/database-schema.d.ts.map +1 -1
  20. package/dist/database/mutation-log/database-schema.js +1 -3
  21. package/dist/database/mutation-log/database-schema.js.map +1 -1
  22. package/dist/database/nano-id.d.ts +21 -0
  23. package/dist/database/nano-id.d.ts.map +1 -0
  24. package/dist/database/nano-id.js +58 -0
  25. package/dist/database/nano-id.js.map +1 -0
  26. package/dist/database/nano-id.test.d.ts +2 -0
  27. package/dist/database/nano-id.test.d.ts.map +1 -0
  28. package/dist/database/nano-id.test.js +13 -0
  29. package/dist/database/nano-id.test.js.map +1 -0
  30. package/dist/database/schema.d.ts +15 -23
  31. package/dist/database/schema.d.ts.map +1 -1
  32. package/dist/discussion/create-comment.d.ts +0 -2
  33. package/dist/discussion/create-comment.d.ts.map +1 -1
  34. package/dist/discussion/create-comment.js +0 -1
  35. package/dist/discussion/create-comment.js.map +1 -1
  36. package/dist/discussion/create-discussion.d.ts +3 -5
  37. package/dist/discussion/create-discussion.d.ts.map +1 -1
  38. package/dist/discussion/create-discussion.js +4 -5
  39. package/dist/discussion/create-discussion.js.map +1 -1
  40. package/dist/discussion/create-discussion.test.js +8 -34
  41. package/dist/discussion/create-discussion.test.js.map +1 -1
  42. package/dist/file-queue/file-handlers.d.ts +24 -0
  43. package/dist/file-queue/file-handlers.d.ts.map +1 -0
  44. package/dist/file-queue/file-handlers.js +209 -0
  45. package/dist/file-queue/file-handlers.js.map +1 -0
  46. package/dist/file-queue/file-queue-process.d.ts +5 -0
  47. package/dist/file-queue/file-queue-process.d.ts.map +1 -0
  48. package/dist/file-queue/file-queue-process.js +85 -0
  49. package/dist/file-queue/file-queue-process.js.map +1 -0
  50. package/dist/file-queue/file-queue-process.test.d.ts +2 -0
  51. package/dist/file-queue/file-queue-process.test.d.ts.map +1 -0
  52. package/dist/file-queue/file-queue-process.test.js +373 -0
  53. package/dist/file-queue/file-queue-process.test.js.map +1 -0
  54. package/dist/file-queue/file-queue-settled.d.ts +13 -0
  55. package/dist/file-queue/file-queue-settled.d.ts.map +1 -0
  56. package/dist/file-queue/file-queue-settled.js +25 -0
  57. package/dist/file-queue/file-queue-settled.js.map +1 -0
  58. package/dist/file-queue/file-queue-settled.test.d.ts +2 -0
  59. package/dist/file-queue/file-queue-settled.test.d.ts.map +1 -0
  60. package/dist/file-queue/file-queue-settled.test.js +47 -0
  61. package/dist/file-queue/file-queue-settled.test.js.map +1 -0
  62. package/dist/file-queue/index.d.ts +2 -0
  63. package/dist/file-queue/index.d.ts.map +1 -0
  64. package/dist/file-queue/index.js +2 -0
  65. package/dist/file-queue/index.js.map +1 -0
  66. package/dist/file-queue/with-skip-file-queue.d.ts +3 -0
  67. package/dist/file-queue/with-skip-file-queue.d.ts.map +1 -0
  68. package/dist/file-queue/with-skip-file-queue.js +26 -0
  69. package/dist/file-queue/with-skip-file-queue.js.map +1 -0
  70. package/dist/file-queue/with-skip-file-queue.test.d.ts +2 -0
  71. package/dist/file-queue/with-skip-file-queue.test.d.ts.map +1 -0
  72. package/dist/file-queue/with-skip-file-queue.test.js +138 -0
  73. package/dist/file-queue/with-skip-file-queue.test.js.map +1 -0
  74. package/dist/index.d.ts +2 -2
  75. package/dist/index.d.ts.map +1 -1
  76. package/dist/index.js +2 -2
  77. package/dist/index.js.map +1 -1
  78. package/dist/key-value/database-schema.d.ts +11 -2
  79. package/dist/key-value/database-schema.d.ts.map +1 -1
  80. package/dist/key-value/database-schema.js +7 -4
  81. package/dist/key-value/database-schema.js.map +1 -1
  82. package/dist/key-value/database-schema.test.js +21 -5
  83. package/dist/key-value/database-schema.test.js.map +1 -1
  84. package/dist/lix/close-lix.d.ts +8 -0
  85. package/dist/lix/close-lix.d.ts.map +1 -0
  86. package/dist/lix/close-lix.js +7 -0
  87. package/dist/lix/close-lix.js.map +1 -0
  88. package/dist/lix/index.d.ts +1 -0
  89. package/dist/lix/index.d.ts.map +1 -1
  90. package/dist/lix/index.js +1 -0
  91. package/dist/lix/index.js.map +1 -1
  92. package/dist/lix/merge.js +3 -3
  93. package/dist/lix/merge.js.map +1 -1
  94. package/dist/lix/merge.test.js +7 -18
  95. package/dist/lix/merge.test.js.map +1 -1
  96. package/dist/lix/new-lix.d.ts.map +1 -1
  97. package/dist/lix/new-lix.js +2 -3
  98. package/dist/lix/new-lix.js.map +1 -1
  99. package/dist/lix/open-lix-in-memory.test.js +2 -1
  100. package/dist/lix/open-lix-in-memory.test.js.map +1 -1
  101. package/dist/lix/open-lix.d.ts +3 -5
  102. package/dist/lix/open-lix.d.ts.map +1 -1
  103. package/dist/lix/open-lix.js +4 -18
  104. package/dist/lix/open-lix.js.map +1 -1
  105. package/dist/lix/open-lix.test.js +16 -7
  106. package/dist/lix/open-lix.test.js.map +1 -1
  107. package/dist/lix/to-blob.d.ts +11 -0
  108. package/dist/lix/to-blob.d.ts.map +1 -0
  109. package/dist/lix/to-blob.js +11 -0
  110. package/dist/lix/to-blob.js.map +1 -0
  111. package/dist/own-change-control/apply-own-change.d.ts +10 -0
  112. package/dist/own-change-control/apply-own-change.d.ts.map +1 -0
  113. package/dist/own-change-control/apply-own-change.js +69 -0
  114. package/dist/own-change-control/apply-own-change.js.map +1 -0
  115. package/dist/own-change-control/apply-own-change.test.d.ts +2 -0
  116. package/dist/own-change-control/apply-own-change.test.d.ts.map +1 -0
  117. package/dist/own-change-control/apply-own-change.test.js +297 -0
  118. package/dist/own-change-control/apply-own-change.test.js.map +1 -0
  119. package/dist/own-change-control/change-controlled-tables.d.ts +60 -0
  120. package/dist/own-change-control/change-controlled-tables.d.ts.map +1 -0
  121. package/dist/own-change-control/change-controlled-tables.js +70 -0
  122. package/dist/own-change-control/change-controlled-tables.js.map +1 -0
  123. package/dist/own-change-control/change-controlled-tables.test.d.ts +2 -0
  124. package/dist/own-change-control/change-controlled-tables.test.d.ts.map +1 -0
  125. package/dist/own-change-control/change-controlled-tables.test.js +48 -0
  126. package/dist/own-change-control/change-controlled-tables.test.js.map +1 -0
  127. package/dist/own-change-control/database-triggers.d.ts +5 -0
  128. package/dist/own-change-control/database-triggers.d.ts.map +1 -0
  129. package/dist/own-change-control/database-triggers.js +135 -0
  130. package/dist/own-change-control/database-triggers.js.map +1 -0
  131. package/dist/own-change-control/database-triggers.test.d.ts +2 -0
  132. package/dist/own-change-control/database-triggers.test.d.ts.map +1 -0
  133. package/dist/own-change-control/database-triggers.test.js +214 -0
  134. package/dist/own-change-control/database-triggers.test.js.map +1 -0
  135. package/dist/own-change-control/index.d.ts +2 -0
  136. package/dist/own-change-control/index.d.ts.map +1 -0
  137. package/dist/own-change-control/index.js +2 -0
  138. package/dist/own-change-control/index.js.map +1 -0
  139. package/dist/own-change-control/with-skip-own-change-control.d.ts +3 -0
  140. package/dist/own-change-control/with-skip-own-change-control.d.ts.map +1 -0
  141. package/dist/own-change-control/with-skip-own-change-control.js +28 -0
  142. package/dist/own-change-control/with-skip-own-change-control.js.map +1 -0
  143. package/dist/own-change-control/with-skip-own-change-control.test.d.ts +2 -0
  144. package/dist/own-change-control/with-skip-own-change-control.test.d.ts.map +1 -0
  145. package/dist/own-change-control/with-skip-own-change-control.test.js +49 -0
  146. package/dist/own-change-control/with-skip-own-change-control.test.js.map +1 -0
  147. package/dist/own-entity-change-control/apply-own-entity-change.js +2 -2
  148. package/dist/own-entity-change-control/apply-own-entity-change.js.map +1 -1
  149. package/dist/own-entity-change-control/apply-own-entity-change.test.js +9 -9
  150. package/dist/own-entity-change-control/apply-own-entity-change.test.js.map +1 -1
  151. package/dist/own-entity-change-control/database-triggers.js +6 -6
  152. package/dist/own-entity-change-control/database-triggers.js.map +1 -1
  153. package/dist/own-entity-change-control/database-triggers.test.js +1 -1
  154. package/dist/own-entity-change-control/database-triggers.test.js.map +1 -1
  155. package/dist/query-filter/version-change-in-difference.test.js +37 -29
  156. package/dist/query-filter/version-change-in-difference.test.js.map +1 -1
  157. package/dist/query-filter/version-change-in-symmetric-difference.test.js +37 -39
  158. package/dist/query-filter/version-change-in-symmetric-difference.test.js.map +1 -1
  159. package/dist/server-api-handler/environment/create-in-memory-environment.d.ts.map +1 -1
  160. package/dist/server-api-handler/environment/create-in-memory-environment.js +7 -3
  161. package/dist/server-api-handler/environment/create-in-memory-environment.js.map +1 -1
  162. package/dist/server-api-handler/environment/create-in-memory-environment.test.js +8 -7
  163. package/dist/server-api-handler/environment/create-in-memory-environment.test.js.map +1 -1
  164. package/dist/server-api-handler/routes/get-v1.d.ts.map +1 -1
  165. package/dist/server-api-handler/routes/get-v1.js +1 -2
  166. package/dist/server-api-handler/routes/get-v1.js.map +1 -1
  167. package/dist/server-api-handler/routes/get-v1.test.js +6 -5
  168. package/dist/server-api-handler/routes/get-v1.test.js.map +1 -1
  169. package/dist/server-api-handler/routes/new-v1.d.ts.map +1 -1
  170. package/dist/server-api-handler/routes/new-v1.js +3 -1
  171. package/dist/server-api-handler/routes/new-v1.js.map +1 -1
  172. package/dist/server-api-handler/routes/new-v1.test.js +2 -1
  173. package/dist/server-api-handler/routes/new-v1.test.js.map +1 -1
  174. package/dist/server-api-handler/routes/pull-v1.test.js +4 -3
  175. package/dist/server-api-handler/routes/pull-v1.test.js.map +1 -1
  176. package/dist/server-api-handler/routes/push-v1.test.js +5 -4
  177. package/dist/server-api-handler/routes/push-v1.test.js.map +1 -1
  178. package/dist/sync/pull-from-server.d.ts.map +1 -1
  179. package/dist/sync/pull-from-server.js +0 -2
  180. package/dist/sync/pull-from-server.js.map +1 -1
  181. package/dist/sync/pull-from-server.test.js +29 -14
  182. package/dist/sync/pull-from-server.test.js.map +1 -1
  183. package/dist/sync/push-to-server.test.js +17 -13
  184. package/dist/sync/push-to-server.test.js.map +1 -1
  185. package/dist/sync/sync-process.d.ts +2 -4
  186. package/dist/sync/sync-process.d.ts.map +1 -1
  187. package/dist/sync/sync-process.js +4 -9
  188. package/dist/sync/sync-process.js.map +1 -1
  189. package/dist/sync/sync-process.test.js +26 -38
  190. package/dist/sync/sync-process.test.js.map +1 -1
  191. package/dist/version/create-version.d.ts +5 -5
  192. package/dist/version/create-version.d.ts.map +1 -1
  193. package/dist/version/create-version.js +23 -11
  194. package/dist/version/create-version.js.map +1 -1
  195. package/dist/version/create-version.test.js +2 -2
  196. package/dist/version/create-version.test.js.map +1 -1
  197. package/dist/version/merge-version.d.ts.map +1 -1
  198. package/dist/version/merge-version.js +16 -26
  199. package/dist/version/merge-version.js.map +1 -1
  200. package/dist/version/switch-version.js +3 -3
  201. package/dist/version/switch-version.js.map +1 -1
  202. package/dist/version/switch-version.test.js +12 -15
  203. package/dist/version/switch-version.test.js.map +1 -1
  204. package/dist/version/update-changes-in-version.d.ts.map +1 -1
  205. package/dist/version/update-changes-in-version.js +11 -31
  206. package/dist/version/update-changes-in-version.js.map +1 -1
  207. package/node_modules/@lix-js/server-api-schema/CHANGELOG.md +9 -0
  208. package/node_modules/@lix-js/server-api-schema/LICENSE +21 -0
  209. package/node_modules/@lix-js/server-api-schema/dist/schema.js +0 -0
  210. package/node_modules/@lix-js/server-api-schema/package.json +2 -2
  211. package/node_modules/sqlite-wasm-kysely/LICENSE +21 -0
  212. package/package.json +4 -4
  213. package/src/change/apply-changes.test.ts +7 -7
  214. package/src/change/apply-changes.ts +9 -9
  215. package/src/database/apply-schema.ts +20 -73
  216. package/src/database/execute-sync.test.ts +3 -3
  217. package/src/database/init-db.test.ts +163 -19
  218. package/src/database/init-db.ts +20 -3
  219. package/src/database/kysely-plugin/parse-jsonb-plugin-v1.ts +9 -2
  220. package/src/database/mutation-log/database-schema.ts +1 -3
  221. package/src/database/nano-id.test.ts +15 -0
  222. package/src/database/nano-id.ts +72 -0
  223. package/src/database/schema.ts +15 -24
  224. package/src/discussion/create-comment.ts +0 -3
  225. package/src/discussion/create-discussion.test.ts +8 -39
  226. package/src/discussion/create-discussion.ts +6 -9
  227. package/src/{change-queue → file-queue}/file-handlers.ts +27 -27
  228. package/src/{change-queue/init-change-queue.test.ts → file-queue/file-queue-process.test.ts} +24 -24
  229. package/src/{change-queue/init-change-queue.ts → file-queue/file-queue-process.ts} +18 -16
  230. package/src/{change-queue/change-queue-settled.test.ts → file-queue/file-queue-settled.test.ts} +12 -12
  231. package/src/{change-queue/change-queue-settled.ts → file-queue/file-queue-settled.ts} +4 -4
  232. package/src/file-queue/index.ts +1 -0
  233. package/src/{change-queue/with-skip-change-queue.test.ts → file-queue/with-skip-file-queue.test.ts} +9 -9
  234. package/src/{change-queue/with-skip-change-queue.ts → file-queue/with-skip-file-queue.ts} +3 -3
  235. package/src/index.ts +2 -2
  236. package/src/key-value/database-schema.test.ts +26 -5
  237. package/src/key-value/database-schema.ts +18 -6
  238. package/src/lix/close-lix.ts +8 -0
  239. package/src/lix/index.ts +1 -0
  240. package/src/lix/merge.test.ts +7 -19
  241. package/src/lix/merge.ts +4 -4
  242. package/src/lix/new-lix.ts +2 -3
  243. package/src/lix/open-lix-in-memory.test.ts +5 -1
  244. package/src/lix/open-lix.test.ts +19 -7
  245. package/src/lix/open-lix.ts +7 -24
  246. package/src/lix/to-blob.ts +14 -0
  247. package/src/{own-entity-change-control/apply-own-entity-change.test.ts → own-change-control/apply-own-change.test.ts} +27 -31
  248. package/src/{own-entity-change-control/apply-own-entity-change.ts → own-change-control/apply-own-change.ts} +3 -3
  249. package/src/{own-entity-change-control → own-change-control}/change-controlled-tables.ts +0 -1
  250. package/src/{own-entity-change-control → own-change-control}/database-triggers.test.ts +7 -7
  251. package/src/{own-entity-change-control → own-change-control}/database-triggers.ts +11 -11
  252. package/src/{own-entity-change-control → own-change-control}/with-skip-own-change-control.ts +6 -2
  253. package/src/query-filter/version-change-in-difference.test.ts +41 -32
  254. package/src/query-filter/version-change-in-symmetric-difference.test.ts +41 -42
  255. package/src/server-api-handler/environment/create-in-memory-environment.test.ts +8 -7
  256. package/src/server-api-handler/environment/create-in-memory-environment.ts +7 -3
  257. package/src/server-api-handler/routes/get-v1.test.ts +6 -5
  258. package/src/server-api-handler/routes/get-v1.ts +1 -3
  259. package/src/server-api-handler/routes/new-v1.test.ts +2 -1
  260. package/src/server-api-handler/routes/new-v1.ts +3 -1
  261. package/src/server-api-handler/routes/pull-v1.test.ts +4 -3
  262. package/src/server-api-handler/routes/push-v1.test.ts +5 -4
  263. package/src/sync/pull-from-server.test.ts +29 -14
  264. package/src/sync/pull-from-server.ts +0 -2
  265. package/src/sync/push-to-server.test.ts +19 -15
  266. package/src/sync/sync-process.test.ts +37 -43
  267. package/src/sync/sync-process.ts +6 -18
  268. package/src/version/create-version.test.ts +2 -2
  269. package/src/version/create-version.ts +24 -12
  270. package/src/version/merge-version.ts +18 -26
  271. package/src/version/switch-version.test.ts +12 -15
  272. package/src/version/switch-version.ts +3 -3
  273. package/src/version/update-changes-in-version.ts +11 -30
  274. package/node_modules/@lix-js/server-api-schema/dist/schema.d.ts +0 -384
  275. package/src/change-queue/index.ts +0 -1
  276. /package/src/{own-entity-change-control → own-change-control}/change-controlled-tables.test.ts +0 -0
  277. /package/src/{own-entity-change-control → own-change-control}/index.ts +0 -0
  278. /package/src/{own-entity-change-control → own-change-control}/with-skip-own-change-control.test.ts +0 -0
@@ -0,0 +1,60 @@
1
+ export declare const changeControlledTableIds: {
2
+ readonly account: readonly ["id"];
3
+ readonly comment: readonly ["id"];
4
+ readonly change_set: readonly ["id"];
5
+ readonly change_author: readonly ["change_id", "account_id"];
6
+ readonly change_set_element: readonly ["change_set_id", "change_id"];
7
+ readonly change_set_label: readonly ["label_id", "change_set_id"];
8
+ readonly discussion: readonly ["id"];
9
+ readonly file: readonly ["id"];
10
+ readonly key_value: readonly ["key"];
11
+ readonly version: readonly ["id"];
12
+ readonly version_change: readonly ["version_id", "change_id"];
13
+ };
14
+ /**
15
+ * The result of a PRAGMA table_info call.
16
+ *
17
+ * @example
18
+ * const tableInfo = sqlite.exec({
19
+ * sql: `PRAGMA table_info(change_author);`,
20
+ * returnValue: "resultRows",
21
+ * rowMode: "object",
22
+ * }) as PragmaTableInfo;
23
+ */
24
+ export type PragmaTableInfo = Array<{
25
+ /**
26
+ * The column name
27
+ */
28
+ name: string;
29
+ /**
30
+ * 0 if not a primary key
31
+ * 1 if primary key
32
+ * 2... if part of a multi-column primary key
33
+ */
34
+ pk: number;
35
+ }>;
36
+ /**
37
+ * Returns the entity id for a row in a change controlled table.
38
+ */
39
+ export declare function entityIdForRow(
40
+ /**
41
+ * The name of the table.
42
+ */
43
+ tableName: keyof typeof changeControlledTableIds,
44
+ /**
45
+ * The values of the row.
46
+ */
47
+ ...values: any[]): string;
48
+ /**
49
+ * Returns the primary keys for a row in a change controlled table.
50
+ */
51
+ export declare function primaryKeysForEntityId(
52
+ /**
53
+ * The name of the table.
54
+ */
55
+ tableName: keyof typeof changeControlledTableIds,
56
+ /**
57
+ * The values of the row.
58
+ */
59
+ entitiyId: string): [string, any][];
60
+ //# sourceMappingURL=change-controlled-tables.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-controlled-tables.d.ts","sourceRoot":"","sources":["../../src/own-change-control/change-controlled-tables.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,wBAAwB;;;;;;;;;;;;CAY3B,CAAC;AAKX;;;;;;;;;GASG;AACH,MAAM,MAAM,eAAe,GAAG,KAAK,CAAC;IACnC;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,EAAE,EAAE,MAAM,CAAC;CACX,CAAC,CAAC;AAEH;;GAEG;AACH,wBAAgB,cAAc;AAC7B;;GAEG;AACH,SAAS,EAAE,MAAM,OAAO,wBAAwB;AAChD;;GAEG;AACH,GAAG,MAAM,EAAE,GAAG,EAAE,GACd,MAAM,CA2BR;AAED;;GAEG;AACH,wBAAgB,sBAAsB;AACrC;;GAEG;AACH,SAAS,EAAE,MAAM,OAAO,wBAAwB;AAChD;;GAEG;AACH,SAAS,EAAE,MAAM,GACf,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAQjB"}
@@ -0,0 +1,70 @@
1
+ export const changeControlledTableIds = {
2
+ account: ["id"],
3
+ comment: ["id"],
4
+ change_set: ["id"],
5
+ change_author: ["change_id", "account_id"],
6
+ change_set_element: ["change_set_id", "change_id"],
7
+ change_set_label: ["label_id", "change_set_id"],
8
+ discussion: ["id"],
9
+ file: ["id"],
10
+ key_value: ["key"],
11
+ version: ["id"],
12
+ version_change: ["version_id", "change_id"],
13
+ };
14
+ /**
15
+ * Returns the entity id for a row in a change controlled table.
16
+ */
17
+ export function entityIdForRow(
18
+ /**
19
+ * The name of the table.
20
+ */
21
+ tableName,
22
+ /**
23
+ * The values of the row.
24
+ */
25
+ ...values) {
26
+ let entityId = "";
27
+ // only has one primary key
28
+ if (changeControlledTableIds[tableName].length === 1) {
29
+ const index = changeControlledTableIds[tableName].indexOf(
30
+ // @ts-expect-error - no clue why
31
+ changeControlledTableIds[tableName][0]);
32
+ entityId = values[index];
33
+ }
34
+ // has compound primary key that are joined with a comma.
35
+ else {
36
+ for (const column of changeControlledTableIds[tableName]) {
37
+ const index = changeControlledTableIds[tableName].indexOf(
38
+ // @ts-expect-error - no clue why
39
+ column);
40
+ if (entityId === "") {
41
+ entityId = values[index];
42
+ }
43
+ else {
44
+ entityId = [entityId, values[index]].join(",");
45
+ }
46
+ }
47
+ }
48
+ return entityId;
49
+ }
50
+ /**
51
+ * Returns the primary keys for a row in a change controlled table.
52
+ */
53
+ export function primaryKeysForEntityId(
54
+ /**
55
+ * The name of the table.
56
+ */
57
+ tableName,
58
+ /**
59
+ * The values of the row.
60
+ */
61
+ entitiyId) {
62
+ const primaryKeys = changeControlledTableIds[tableName];
63
+ if (primaryKeys.length === 1) {
64
+ return [[primaryKeys[0], entitiyId]];
65
+ }
66
+ else {
67
+ return entitiyId.split(",").map((id, index) => [primaryKeys[index], id]);
68
+ }
69
+ }
70
+ //# sourceMappingURL=change-controlled-tables.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-controlled-tables.js","sourceRoot":"","sources":["../../src/own-change-control/change-controlled-tables.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACvC,OAAO,EAAE,CAAC,IAAI,CAAC;IACf,OAAO,EAAE,CAAC,IAAI,CAAC;IACf,UAAU,EAAE,CAAC,IAAI,CAAC;IAClB,aAAa,EAAE,CAAC,WAAW,EAAE,YAAY,CAAC;IAC1C,kBAAkB,EAAE,CAAC,eAAe,EAAE,WAAW,CAAC;IAClD,gBAAgB,EAAE,CAAC,UAAU,EAAE,eAAe,CAAC;IAC/C,UAAU,EAAE,CAAC,IAAI,CAAC;IAClB,IAAI,EAAE,CAAC,IAAI,CAAC;IACZ,SAAS,EAAE,CAAC,KAAK,CAAC;IAClB,OAAO,EAAE,CAAC,IAAI,CAAC;IACf,cAAc,EAAE,CAAC,YAAY,EAAE,WAAW,CAAC;CAClC,CAAC;AA4BX;;GAEG;AACH,MAAM,UAAU,cAAc;AAC7B;;GAEG;AACH,SAAgD;AAChD;;GAEG;AACH,GAAG,MAAa;IAEhB,IAAI,QAAQ,GAAG,EAAE,CAAC;IAElB,2BAA2B;IAC3B,IAAI,wBAAwB,CAAC,SAAS,CAAE,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACvD,MAAM,KAAK,GAAG,wBAAwB,CAAC,SAAS,CAAE,CAAC,OAAO;QACzD,iCAAiC;QACjC,wBAAwB,CAAC,SAAS,CAAE,CAAC,CAAC,CAAC,CACvC,CAAC;QACF,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC;IACD,yDAAyD;SACpD,CAAC;QACL,KAAK,MAAM,MAAM,IAAI,wBAAwB,CAAC,SAAS,CAAE,EAAE,CAAC;YAC3D,MAAM,KAAK,GAAG,wBAAwB,CAAC,SAAS,CAAE,CAAC,OAAO;YACzD,iCAAiC;YACjC,MAAM,CACN,CAAC;YACF,IAAI,QAAQ,KAAK,EAAE,EAAE,CAAC;gBACrB,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YAC1B,CAAC;iBAAM,CAAC;gBACP,QAAQ,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChD,CAAC;QACF,CAAC;IACF,CAAC;IAED,OAAO,QAAQ,CAAC;AACjB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,sBAAsB;AACrC;;GAEG;AACH,SAAgD;AAChD;;GAEG;AACH,SAAiB;IAEjB,MAAM,WAAW,GAAG,wBAAwB,CAAC,SAAS,CAAE,CAAC;IAEzD,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAE,EAAE,SAAS,CAAC,CAAC,CAAC;IACvC,CAAC;SAAM,CAAC;QACP,OAAO,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,KAAK,CAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC3E,CAAC;AACF,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=change-controlled-tables.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-controlled-tables.test.d.ts","sourceRoot":"","sources":["../../src/own-change-control/change-controlled-tables.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ import { test, expect } from "vitest";
2
+ import { changeControlledTableIds, entityIdForRow, primaryKeysForEntityId, } from "./change-controlled-tables.js";
3
+ import { loadDatabaseInMemory } from "sqlite-wasm-kysely";
4
+ import { newLixFile } from "../lix/new-lix.js";
5
+ test("roundtrip entity_id test for single primary key", () => {
6
+ const tableName = "key_value";
7
+ const row = ["lix_mock_key", "value1"];
8
+ const entityId = entityIdForRow(tableName, ...row);
9
+ const primaryKeys = primaryKeysForEntityId(tableName, entityId);
10
+ expect(entityId).toBe("lix_mock_key");
11
+ expect(primaryKeys).toEqual([["key", "lix_mock_key"]]);
12
+ });
13
+ test("roundtrip entity_id test for compound primary keys", () => {
14
+ const tableName = "change_author";
15
+ const row = ["294u-2345", "0128-34928"];
16
+ const entityId = entityIdForRow(tableName, ...row);
17
+ const primaryKeys = primaryKeysForEntityId(tableName, entityId);
18
+ expect(entityId).toBe("294u-2345,0128-34928");
19
+ expect(primaryKeys).toEqual([
20
+ ["change_id", "294u-2345"],
21
+ ["account_id", "0128-34928"],
22
+ ]);
23
+ });
24
+ // otherwise the change controlled entity_id will be wrong.
25
+ //* if this tests fails, someone did a db schema change
26
+ //* on the primary key order that should not have been done.
27
+ test("the primary key order matches the order the primary keys in the database schema", async () => {
28
+ const sqlite = await loadDatabaseInMemory(await (await newLixFile()).arrayBuffer());
29
+ const tableInfos = {};
30
+ for (const table of Object.keys(changeControlledTableIds)) {
31
+ tableInfos[table] = sqlite.exec({
32
+ sql: `PRAGMA table_info(${table});`,
33
+ returnValue: "resultRows",
34
+ rowMode: "object",
35
+ });
36
+ }
37
+ for (const table of Object.keys(changeControlledTableIds)) {
38
+ const tableInfo = tableInfos[table];
39
+ const primaryKeys = tableInfo
40
+ .filter((column) => column.pk)
41
+ .sort((a, b) => a.pk - b.pk)
42
+ .map((c) => c.name);
43
+ expect(primaryKeys).toEqual(
44
+ // @ts-expect-error - some type narrowing problem. not important
45
+ changeControlledTableIds[table]);
46
+ }
47
+ });
48
+ //# sourceMappingURL=change-controlled-tables.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-controlled-tables.test.js","sourceRoot":"","sources":["../../src/own-change-control/change-controlled-tables.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEtC,OAAO,EACN,wBAAwB,EACxB,cAAc,EACd,sBAAsB,GAEtB,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC1D,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,IAAI,CAAC,iDAAiD,EAAE,GAAG,EAAE;IAC5D,MAAM,SAAS,GAA4B,WAAW,CAAC;IACvD,MAAM,GAAG,GAAG,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;IAEvC,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,EAAE,GAAG,GAAG,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,sBAAsB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhE,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACtC,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,oDAAoD,EAAE,GAAG,EAAE;IAC/D,MAAM,SAAS,GAA4B,eAAe,CAAC;IAE3D,MAAM,GAAG,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;IAExC,MAAM,QAAQ,GAAG,cAAc,CAAC,SAAS,EAAE,GAAG,GAAG,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,sBAAsB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEhE,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IAC9C,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC;QAC3B,CAAC,WAAW,EAAE,WAAW,CAAC;QAC1B,CAAC,YAAY,EAAE,YAAY,CAAC;KAC5B,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,2DAA2D;AAC3D,uDAAuD;AACvD,4DAA4D;AAC5D,IAAI,CAAC,iFAAiF,EAAE,KAAK,IAAI,EAAE;IAClG,MAAM,MAAM,GAAG,MAAM,oBAAoB,CACxC,MAAM,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC,WAAW,EAAE,CACxC,CAAC;IAEF,MAAM,UAAU,GAAoC,EAAE,CAAC;IAEvD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC;QAC3D,UAAU,CAAC,KAAK,CAAC,GAAG,MAAM,CAAC,IAAI,CAAC;YAC/B,GAAG,EAAE,qBAAqB,KAAK,IAAI;YACnC,WAAW,EAAE,YAAY;YACzB,OAAO,EAAE,QAAQ;SACjB,CAAoB,CAAC;IACvB,CAAC;IAED,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,IAAI,CAAC,wBAAwB,CAAC,EAAE,CAAC;QAC3D,MAAM,SAAS,GAAG,UAAU,CAAC,KAAK,CAAE,CAAC;QAErC,MAAM,WAAW,GAAG,SAAS;aAC3B,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;aAC7B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,CAAC;aAC3B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAErB,MAAM,CAAC,WAAW,CAAC,CAAC,OAAO;QAC1B,gEAAgE;QAChE,wBAAwB,CAAC,KAAK,CAAC,CAC/B,CAAC;IACH,CAAC;AACF,CAAC,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ import type { SqliteDatabase } from "sqlite-wasm-kysely";
2
+ import type { LixDatabaseSchema } from "../database/schema.js";
3
+ import type { Kysely } from "kysely";
4
+ export declare function applyOwnChangeControlTriggers(sqlite: SqliteDatabase, db: Kysely<LixDatabaseSchema>): void;
5
+ //# sourceMappingURL=database-triggers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-triggers.d.ts","sourceRoot":"","sources":["../../src/own-change-control/database-triggers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,KAAK,EAAE,iBAAiB,EAAY,MAAM,uBAAuB,CAAC;AACzE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AASrC,wBAAgB,6BAA6B,CAC5C,MAAM,EAAE,cAAc,EACtB,EAAE,EAAE,MAAM,CAAC,iBAAiB,CAAC,GAC3B,IAAI,CAqEN"}
@@ -0,0 +1,135 @@
1
+ import { changeControlledTableIds, entityIdForRow, } from "./change-controlled-tables.js";
2
+ import { createChange } from "../change/create-change.js";
3
+ import { executeSync } from "../database/execute-sync.js";
4
+ export function applyOwnChangeControlTriggers(sqlite, db) {
5
+ const tableInfos = {};
6
+ for (const table of Object.keys(changeControlledTableIds)) {
7
+ tableInfos[table] = sqlite.exec({
8
+ sql: `PRAGMA table_info(${table});`,
9
+ returnValue: "resultRows",
10
+ rowMode: "object",
11
+ });
12
+ }
13
+ sqlite.createFunction({
14
+ name: "handle_lix_own_change_control",
15
+ arity: -1,
16
+ // @ts-expect-error - dynamic function
17
+ xFunc: (_ctx, tableName, operation, ...value) => {
18
+ return handleLixOwnEntityChange(db, sqlite, tableName, tableInfos, operation, ...value);
19
+ },
20
+ });
21
+ for (const table of Object.keys(changeControlledTableIds)) {
22
+ const tableInfo = tableInfos[table];
23
+ const sql = `
24
+ CREATE TEMP TRIGGER IF NOT EXISTS ${table}_change_control_insert
25
+ AFTER INSERT ON ${table}
26
+ BEGIN
27
+ SELECT handle_lix_own_change_control('${table}', 'insert', ${tableInfo.map((c) => "NEW." + c.name).join(", ")});
28
+ END;
29
+
30
+ CREATE TEMP TRIGGER IF NOT EXISTS ${table}_change_control_update
31
+ AFTER UPDATE ON ${table}
32
+ ${
33
+ // ignore update trigger if the change controlled properties
34
+ // did not change (a plugin likely called apply changes on the file.data)
35
+ table === "file"
36
+ ? `
37
+ WHEN (
38
+ OLD.id IS NOT NEW.id OR
39
+ OLD.path IS NOT NEW.path OR
40
+ OLD.metadata IS NOT NEW.metadata
41
+ )`
42
+ : ""}
43
+ BEGIN
44
+ SELECT handle_lix_own_change_control('${table}', 'update', ${tableInfo.map((c) => "NEW." + c.name).join(", ")});
45
+ END;
46
+
47
+ CREATE TEMP TRIGGER IF NOT EXISTS ${table}_change_control_delete
48
+ AFTER DELETE ON ${table}
49
+ BEGIN
50
+ SELECT handle_lix_own_change_control('${table}', 'delete', ${tableInfo.map((c) => "OLD." + c.name).join(", ")});
51
+ END;
52
+ `;
53
+ sqlite.exec(sql);
54
+ }
55
+ }
56
+ function handleLixOwnEntityChange(db, sqlite, tableName, tableInfos, operation, ...values) {
57
+ const lix = { db, sqlite };
58
+ // key values that have skip_change_control set to true should not be change controlled
59
+ if (tableName === "key_value" && values[2]) {
60
+ return;
61
+ }
62
+ const shouldSkip = executeSync({
63
+ lix,
64
+ query: db
65
+ .selectFrom("key_value")
66
+ .where("key", "=", "lix_skip_own_change_control")
67
+ .select("value"),
68
+ })[0]?.value === "true";
69
+ if (shouldSkip) {
70
+ return;
71
+ }
72
+ // need to break the loop if own changes are detected
73
+ const change = executeSync({
74
+ lix,
75
+ query: db
76
+ .selectFrom("change")
77
+ .where("id", "=", values[0])
78
+ .select("plugin_key"),
79
+ })[0];
80
+ if (change?.plugin_key === "lix_own_change_control") {
81
+ return;
82
+ }
83
+ const currentVersion = executeSync({
84
+ lix,
85
+ query: db
86
+ .selectFrom("current_version")
87
+ .innerJoin("version", "current_version.id", "version.id")
88
+ .selectAll("version"),
89
+ })[0];
90
+ const authors = executeSync({
91
+ lix,
92
+ query: db.selectFrom("active_account").selectAll(),
93
+ });
94
+ if (authors.length === 0) {
95
+ console.error(tableName, change);
96
+ throw new Error("At least one author is required");
97
+ }
98
+ let snapshotContent;
99
+ if (operation === "delete") {
100
+ snapshotContent = null;
101
+ }
102
+ else {
103
+ snapshotContent = {};
104
+ // construct the values as json for the snapshot
105
+ for (const [index, column] of tableInfos[tableName].entries()) {
106
+ snapshotContent[column.name] = values[index];
107
+ }
108
+ }
109
+ if (tableName === "file" && snapshotContent) {
110
+ // sqlite has it's own jsonb format
111
+ // hence, need to query sqlite to convert
112
+ // to json
113
+ const json = sqlite.exec("SELECT json(?)", {
114
+ bind: [snapshotContent.metadata],
115
+ returnValue: "resultRows",
116
+ })[0][0];
117
+ snapshotContent["metadata"] = JSON.parse(json);
118
+ // remove the data field which is change controlled by plugins, not lix itself
119
+ delete snapshotContent.data;
120
+ }
121
+ const entityId = entityIdForRow(tableName, ...values);
122
+ createChange({
123
+ lix,
124
+ authors: authors,
125
+ version: currentVersion,
126
+ entityId,
127
+ fileId: "lix_own_change_control",
128
+ pluginKey: "lix_own_change_control",
129
+ schemaKey: `lix_${tableName}_table`,
130
+ snapshotContent,
131
+ }, {
132
+ updateVersionChanges: tableName === "version_change" ? false : true,
133
+ });
134
+ }
135
+ //# sourceMappingURL=database-triggers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-triggers.js","sourceRoot":"","sources":["../../src/own-change-control/database-triggers.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=database-triggers.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-triggers.test.d.ts","sourceRoot":"","sources":["../../src/own-change-control/database-triggers.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,214 @@
1
+ import { expect, test } from "vitest";
2
+ import { openLixInMemory } from "../lix/open-lix-in-memory.js";
3
+ import { createAccount } from "../account/create-account.js";
4
+ import { createChange } from "../change/create-change.js";
5
+ test("it works for inserts, updates and deletions", async () => {
6
+ const lix = await openLixInMemory({});
7
+ // insert
8
+ await lix.db
9
+ .insertInto("key_value")
10
+ .values({ key: "key1", value: "value1" })
11
+ .execute();
12
+ // update
13
+ await lix.db
14
+ .updateTable("key_value")
15
+ .set("value", "value2")
16
+ .where("key", "=", "key1")
17
+ .execute();
18
+ // delete
19
+ await lix.db.deleteFrom("key_value").where("key", "=", "key1").execute();
20
+ const changes = await lix.db
21
+ .selectFrom("change")
22
+ .innerJoin("snapshot", "snapshot.id", "change.snapshot_id")
23
+ .where("schema_key", "=", "lix_key_value_table")
24
+ .selectAll()
25
+ .execute();
26
+ const snapshots = changes.map((change) => change.content);
27
+ expect(changes.length).toBe(3);
28
+ for (const change of changes) {
29
+ expect(change.entity_id).toBe("key1");
30
+ expect(change.file_id).toBe("lix_own_change_control");
31
+ expect(change.plugin_key).toBe("lix_own_change_control");
32
+ expect(change.schema_key).toBe("lix_key_value_table");
33
+ }
34
+ expect(snapshots).toMatchObject([
35
+ // insert
36
+ { key: "key1", value: "value1" },
37
+ // update
38
+ { key: "key1", value: "value2" },
39
+ // delete
40
+ null,
41
+ ]);
42
+ });
43
+ test("it works for compound entity ids like change_author", async () => {
44
+ const lix = await openLixInMemory({});
45
+ const account1 = await createAccount({ lix, name: "account1" });
46
+ const currentVersion = await lix.db
47
+ .selectFrom("current_version")
48
+ .selectAll()
49
+ .executeTakeFirstOrThrow();
50
+ await createChange({
51
+ lix,
52
+ version: currentVersion,
53
+ authors: [account1],
54
+ pluginKey: "mock-plugin",
55
+ schemaKey: "mock",
56
+ fileId: "mock",
57
+ entityId: "mock",
58
+ snapshotContent: null,
59
+ });
60
+ const changes = await lix.db
61
+ .selectFrom("change")
62
+ .where("schema_key", "=", "lix_change_author_table")
63
+ .innerJoin("snapshot", "snapshot.id", "change.snapshot_id")
64
+ .selectAll()
65
+ .execute();
66
+ expect(changes.length).toBe(1);
67
+ });
68
+ test("if the trigger throws, the transaction is rolled back", async () => {
69
+ const lix = await openLixInMemory({});
70
+ const account1 = await createAccount({ lix, name: "account1" });
71
+ const insertChange = await lix.db
72
+ .selectFrom("change")
73
+ .where("schema_key", "=", "lix_account_table")
74
+ .where("entity_id", "=", account1.id)
75
+ .selectAll()
76
+ .executeTakeFirstOrThrow();
77
+ expect(insertChange).toBeDefined();
78
+ // deleting the active accounts aka there will be no change author
79
+ // which will lead to a throw in the trigger
80
+ await lix.db.deleteFrom("active_account").execute();
81
+ // now we are deleting the account we just created
82
+ try {
83
+ await lix.db.deleteFrom("account").where("id", "=", account1.id).execute();
84
+ }
85
+ catch (e) {
86
+ expect(e).toBeDefined();
87
+ }
88
+ const account1AfterFailedDeleted = await lix.db
89
+ .selectFrom("account")
90
+ .where("id", "=", account1.id)
91
+ .selectAll()
92
+ .executeTakeFirst();
93
+ const deleteChange = await lix.db
94
+ .selectFrom("change")
95
+ .where("schema_key", "=", "lix_account_table")
96
+ .where("entity_id", "=", account1.id)
97
+ .where("snapshot_id", "=", "no-content")
98
+ .selectAll()
99
+ .executeTakeFirst();
100
+ expect(account1AfterFailedDeleted).toBeDefined();
101
+ expect(account1AfterFailedDeleted).toStrictEqual(account1);
102
+ expect(deleteChange).toBeUndefined();
103
+ });
104
+ test("skips change control of key values if `skip_change_control` is set to true", async () => {
105
+ const lix = await openLixInMemory({});
106
+ await lix.db
107
+ .insertInto("key_value")
108
+ .values({ key: "key1", value: "value1", skip_change_control: true })
109
+ .execute();
110
+ const key1 = await lix.db
111
+ .selectFrom("key_value")
112
+ .where("key", "=", "key1")
113
+ .selectAll()
114
+ .executeTakeFirst();
115
+ const key1Change = await lix.db
116
+ .selectFrom("change")
117
+ .where("entity_id", "=", "key1")
118
+ .selectAll()
119
+ .executeTakeFirst();
120
+ expect(key1).toBeDefined();
121
+ expect(key1Change).toBeUndefined();
122
+ });
123
+ // the sqlite jsonb representation should not be used externally
124
+ // hence, we need to store the metadata as string in the snapshot
125
+ test("file.metadata is tracked as json string, not binary.", async () => {
126
+ const lix = await openLixInMemory({});
127
+ const file = await lix.db
128
+ .insertInto("file")
129
+ .values({
130
+ data: new Uint8Array(),
131
+ path: "/mock.txt",
132
+ metadata: { key: "value" },
133
+ })
134
+ .returningAll()
135
+ .executeTakeFirstOrThrow();
136
+ const change = await lix.db
137
+ .selectFrom("change")
138
+ .innerJoin("snapshot", "snapshot.id", "change.snapshot_id")
139
+ .where("schema_key", "=", "lix_file_table")
140
+ .where("entity_id", "=", file.id)
141
+ .selectAll()
142
+ .executeTakeFirstOrThrow();
143
+ expect(change.content?.metadata).toStrictEqual({
144
+ key: "value",
145
+ });
146
+ });
147
+ test("file.data is not own change controlled as plugins handle the change control of file data", async () => {
148
+ const lix = await openLixInMemory({});
149
+ const file = await lix.db
150
+ .insertInto("file")
151
+ .values({
152
+ path: "/mock.txt",
153
+ data: new TextEncoder().encode("hello world"),
154
+ })
155
+ .returningAll()
156
+ .executeTakeFirstOrThrow();
157
+ const change = await lix.db
158
+ .selectFrom("change")
159
+ .innerJoin("snapshot", "snapshot.id", "change.snapshot_id")
160
+ .where("schema_key", "=", "lix_file_table")
161
+ .where("entity_id", "=", file.id)
162
+ .selectAll()
163
+ .executeTakeFirstOrThrow();
164
+ expect(change.content?.data).toBe(undefined);
165
+ });
166
+ test("updating file.data does not trigger own change control", async () => {
167
+ const lix = await openLixInMemory({});
168
+ const file = await lix.db
169
+ .insertInto("file")
170
+ .values({
171
+ id: "file1",
172
+ data: new TextEncoder().encode("hello world"),
173
+ path: "/mock.txt",
174
+ metadata: null,
175
+ })
176
+ .returningAll()
177
+ .executeTakeFirstOrThrow();
178
+ let changes = await lix.db
179
+ .selectFrom("change")
180
+ .where("schema_key", "=", "lix_file_table")
181
+ .where("entity_id", "=", file.id)
182
+ .selectAll()
183
+ .execute();
184
+ expect(changes.length).toBe(1);
185
+ await lix.db
186
+ .updateTable("file")
187
+ .set({ data: new TextEncoder().encode("hello world 2") })
188
+ .where("id", "=", file.id)
189
+ .execute();
190
+ changes = await lix.db
191
+ .selectFrom("change")
192
+ .where("schema_key", "=", "lix_file_table")
193
+ .where("entity_id", "=", file.id)
194
+ .selectAll()
195
+ .execute();
196
+ expect(changes.length).toBe(1);
197
+ // the metadata should be change controlled
198
+ // hence, this should trigger a change
199
+ await lix.db
200
+ .updateTable("file")
201
+ .set({
202
+ data: new TextEncoder().encode("hello world 3"),
203
+ metadata: { key: "value" },
204
+ })
205
+ .execute();
206
+ changes = await lix.db
207
+ .selectFrom("change")
208
+ .where("schema_key", "=", "lix_file_table")
209
+ .where("entity_id", "=", file.id)
210
+ .selectAll()
211
+ .execute();
212
+ expect(changes.length).toBe(2);
213
+ });
214
+ //# sourceMappingURL=database-triggers.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"database-triggers.test.js","sourceRoot":"","sources":["../../src/own-change-control/database-triggers.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAE1D,IAAI,CAAC,6CAA6C,EAAE,KAAK,IAAI,EAAE;IAC9D,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,CAAC;IAEtC,SAAS;IACT,MAAM,GAAG,CAAC,EAAE;SACV,UAAU,CAAC,WAAW,CAAC;SACvB,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;SACxC,OAAO,EAAE,CAAC;IAEZ,SAAS;IACT,MAAM,GAAG,CAAC,EAAE;SACV,WAAW,CAAC,WAAW,CAAC;SACxB,GAAG,CAAC,OAAO,EAAE,QAAQ,CAAC;SACtB,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC;SACzB,OAAO,EAAE,CAAC;IAEZ,SAAS;IACT,MAAM,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,OAAO,EAAE,CAAC;IAEzE,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE;SAC1B,UAAU,CAAC,QAAQ,CAAC;SACpB,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,oBAAoB,CAAC;SAC1D,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,qBAAqB,CAAC;SAC/C,SAAS,EAAE;SACX,OAAO,EAAE,CAAC;IAEZ,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAE1D,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE/B,KAAK,MAAM,MAAM,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACtD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACzD,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,CAAC,aAAa,CAAC;QAC/B,SAAS;QACT,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;QAChC,SAAS;QACT,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE;QAChC,SAAS;QACT,IAAI;KACJ,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;IACtE,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAEhE,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,EAAE;SACjC,UAAU,CAAC,iBAAiB,CAAC;SAC7B,SAAS,EAAE;SACX,uBAAuB,EAAE,CAAC;IAE5B,MAAM,YAAY,CAAC;QAClB,GAAG;QACH,OAAO,EAAE,cAAc;QACvB,OAAO,EAAE,CAAC,QAAQ,CAAC;QACnB,SAAS,EAAE,aAAa;QACxB,SAAS,EAAE,MAAM;QACjB,MAAM,EAAE,MAAM;QACd,QAAQ,EAAE,MAAM;QAChB,eAAe,EAAE,IAAI;KACrB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE;SAC1B,UAAU,CAAC,QAAQ,CAAC;SACpB,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,yBAAyB,CAAC;SACnD,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,oBAAoB,CAAC;SAC1D,SAAS,EAAE;SACX,OAAO,EAAE,CAAC;IAEZ,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,uDAAuD,EAAE,KAAK,IAAI,EAAE;IACxE,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,CAAC;IAEtC,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,CAAC;IAEhE,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,EAAE;SAC/B,UAAU,CAAC,QAAQ,CAAC;SACpB,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,mBAAmB,CAAC;SAC7C,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC;SACpC,SAAS,EAAE;SACX,uBAAuB,EAAE,CAAC;IAE5B,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,EAAE,CAAC;IAEnC,kEAAkE;IAClE,4CAA4C;IAC5C,MAAM,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC,OAAO,EAAE,CAAC;IAEpD,kDAAkD;IAClD,IAAI,CAAC;QACJ,MAAM,GAAG,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAC5E,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACzB,CAAC;IAED,MAAM,0BAA0B,GAAG,MAAM,GAAG,CAAC,EAAE;SAC7C,UAAU,CAAC,SAAS,CAAC;SACrB,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC;SAC7B,SAAS,EAAE;SACX,gBAAgB,EAAE,CAAC;IAErB,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,EAAE;SAC/B,UAAU,CAAC,QAAQ,CAAC;SACpB,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,mBAAmB,CAAC;SAC7C,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,QAAQ,CAAC,EAAE,CAAC;SACpC,KAAK,CAAC,aAAa,EAAE,GAAG,EAAE,YAAY,CAAC;SACvC,SAAS,EAAE;SACX,gBAAgB,EAAE,CAAC;IAErB,MAAM,CAAC,0BAA0B,CAAC,CAAC,WAAW,EAAE,CAAC;IACjD,MAAM,CAAC,0BAA0B,CAAC,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;IAC3D,MAAM,CAAC,YAAY,CAAC,CAAC,aAAa,EAAE,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,4EAA4E,EAAE,KAAK,IAAI,EAAE;IAC7F,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,CAAC;IAEtC,MAAM,GAAG,CAAC,EAAE;SACV,UAAU,CAAC,WAAW,CAAC;SACvB,MAAM,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,mBAAmB,EAAE,IAAI,EAAE,CAAC;SACnE,OAAO,EAAE,CAAC;IAEZ,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE;SACvB,UAAU,CAAC,WAAW,CAAC;SACvB,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,CAAC;SACzB,SAAS,EAAE;SACX,gBAAgB,EAAE,CAAC;IAErB,MAAM,UAAU,GAAG,MAAM,GAAG,CAAC,EAAE;SAC7B,UAAU,CAAC,QAAQ,CAAC;SACpB,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,MAAM,CAAC;SAC/B,SAAS,EAAE;SACX,gBAAgB,EAAE,CAAC;IAErB,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3B,MAAM,CAAC,UAAU,CAAC,CAAC,aAAa,EAAE,CAAC;AACpC,CAAC,CAAC,CAAC;AAEH,gEAAgE;AAChE,iEAAiE;AACjE,IAAI,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;IACvE,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,CAAC;IAEtC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE;SACvB,UAAU,CAAC,MAAM,CAAC;SAClB,MAAM,CAAC;QACP,IAAI,EAAE,IAAI,UAAU,EAAE;QACtB,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;KAC1B,CAAC;SACD,YAAY,EAAE;SACd,uBAAuB,EAAE,CAAC;IAE5B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;SACzB,UAAU,CAAC,QAAQ,CAAC;SACpB,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,oBAAoB,CAAC;SAC1D,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,gBAAgB,CAAC;SAC1C,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;SAChC,SAAS,EAAE;SACX,uBAAuB,EAAE,CAAC;IAE5B,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,aAAa,CAAC;QAC9C,GAAG,EAAE,OAAO;KACZ,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;IAC3G,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,CAAC;IAEtC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE;SACvB,UAAU,CAAC,MAAM,CAAC;SAClB,MAAM,CAAC;QACP,IAAI,EAAE,WAAW;QACjB,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC;KAC7C,CAAC;SACD,YAAY,EAAE;SACd,uBAAuB,EAAE,CAAC;IAE5B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE;SACzB,UAAU,CAAC,QAAQ,CAAC;SACpB,SAAS,CAAC,UAAU,EAAE,aAAa,EAAE,oBAAoB,CAAC;SAC1D,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,gBAAgB,CAAC;SAC1C,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;SAChC,SAAS,EAAE;SACX,uBAAuB,EAAE,CAAC;IAE5B,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;IACzE,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,EAAE,CAAC,CAAC;IAEtC,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,EAAE;SACvB,UAAU,CAAC,MAAM,CAAC;SAClB,MAAM,CAAC;QACP,EAAE,EAAE,OAAO;QACX,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC;QAC7C,IAAI,EAAE,WAAW;QACjB,QAAQ,EAAE,IAAI;KACd,CAAC;SACD,YAAY,EAAE;SACd,uBAAuB,EAAE,CAAC;IAE5B,IAAI,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE;SACxB,UAAU,CAAC,QAAQ,CAAC;SACpB,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,gBAAgB,CAAC;SAC1C,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;SAChC,SAAS,EAAE;SACX,OAAO,EAAE,CAAC;IAEZ,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE/B,MAAM,GAAG,CAAC,EAAE;SACV,WAAW,CAAC,MAAM,CAAC;SACnB,GAAG,CAAC,EAAE,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC,EAAE,CAAC;SACxD,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;SACzB,OAAO,EAAE,CAAC;IAEZ,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE;SACpB,UAAU,CAAC,QAAQ,CAAC;SACpB,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,gBAAgB,CAAC;SAC1C,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;SAChC,SAAS,EAAE;SACX,OAAO,EAAE,CAAC;IAEZ,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE/B,2CAA2C;IAC3C,sCAAsC;IACtC,MAAM,GAAG,CAAC,EAAE;SACV,WAAW,CAAC,MAAM,CAAC;SACnB,GAAG,CAAC;QACJ,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,eAAe,CAAC;QAC/C,QAAQ,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE;KAC1B,CAAC;SACD,OAAO,EAAE,CAAC;IAEZ,OAAO,GAAG,MAAM,GAAG,CAAC,EAAE;SACpB,UAAU,CAAC,QAAQ,CAAC;SACpB,KAAK,CAAC,YAAY,EAAE,GAAG,EAAE,gBAAgB,CAAC;SAC1C,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;SAChC,SAAS,EAAE;SACX,OAAO,EAAE,CAAC;IAEZ,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAChC,CAAC,CAAC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { withSkipOwnChangeControl } from "./with-skip-own-change-control.js";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/own-change-control/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC"}
@@ -0,0 +1,2 @@
1
+ export { withSkipOwnChangeControl } from "./with-skip-own-change-control.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/own-change-control/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Lix } from "../lix/open-lix.js";
2
+ export declare function withSkipOwnChangeControl<T>(db: Lix["db"], operation: (trx: Lix["db"]) => Promise<T>): Promise<T>;
3
+ //# sourceMappingURL=with-skip-own-change-control.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-skip-own-change-control.d.ts","sourceRoot":"","sources":["../../src/own-change-control/with-skip-own-change-control.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AAE9C,wBAAsB,wBAAwB,CAAC,CAAC,EAC/C,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,EACb,SAAS,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,GACvC,OAAO,CAAC,CAAC,CAAC,CA4BZ"}
@@ -0,0 +1,28 @@
1
+ export async function withSkipOwnChangeControl(db, operation) {
2
+ const executeInTransaction = async (trx) => {
3
+ await trx
4
+ .insertInto("key_value")
5
+ .values({
6
+ key: "lix_skip_own_change_control",
7
+ value: "true",
8
+ skip_change_control: true,
9
+ })
10
+ .onConflict((oc) => oc.doUpdateSet({ value: "true" }))
11
+ .execute();
12
+ // Perform the user's operation
13
+ const result = await operation(trx);
14
+ await trx
15
+ .deleteFrom("key_value")
16
+ .where("key", "=", "lix_skip_own_change_control")
17
+ .execute();
18
+ // Return the result of the operation
19
+ return result;
20
+ };
21
+ if (db.isTransaction) {
22
+ return executeInTransaction(db);
23
+ }
24
+ else {
25
+ return db.transaction().execute(executeInTransaction);
26
+ }
27
+ }
28
+ //# sourceMappingURL=with-skip-own-change-control.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"with-skip-own-change-control.js","sourceRoot":"","sources":["../../src/own-change-control/with-skip-own-change-control.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC7C,EAAa,EACb,SAAyC;IAEzC,MAAM,oBAAoB,GAAG,KAAK,EAAE,GAAc,EAAE,EAAE;QACrD,MAAM,GAAG;aACP,UAAU,CAAC,WAAW,CAAC;aACvB,MAAM,CAAC;YACP,GAAG,EAAE,6BAA6B;YAClC,KAAK,EAAE,MAAM;YACb,mBAAmB,EAAE,IAAI;SACzB,CAAC;aACD,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,WAAW,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC;aACrD,OAAO,EAAE,CAAC;QAEZ,+BAA+B;QAC/B,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;QAEpC,MAAM,GAAG;aACP,UAAU,CAAC,WAAW,CAAC;aACvB,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,6BAA6B,CAAC;aAChD,OAAO,EAAE,CAAC;QAEZ,qCAAqC;QACrC,OAAO,MAAM,CAAC;IACf,CAAC,CAAC;IACF,IAAI,EAAE,CAAC,aAAa,EAAE,CAAC;QACtB,OAAO,oBAAoB,CAAC,EAAE,CAAC,CAAC;IACjC,CAAC;SAAM,CAAC;QACP,OAAO,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;IACvD,CAAC;AACF,CAAC"}