@lix-js/sdk 0.5.0-preview.0 → 0.5.0-preview.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/account/create-account.d.ts +5 -5
- package/dist/account/create-account.d.ts.map +1 -1
- package/dist/account/create-account.js +2 -2
- package/dist/account/create-account.js.map +1 -1
- package/dist/account/index.d.ts +1 -1
- package/dist/account/index.d.ts.map +1 -1
- package/dist/account/schema.d.ts +23 -7
- package/dist/account/schema.d.ts.map +1 -1
- package/dist/account/schema.js +84 -27
- package/dist/account/schema.js.map +1 -1
- package/dist/account/schema.test.js +87 -83
- package/dist/account/schema.test.js.map +1 -1
- package/dist/account/switch-account.d.ts +2 -2
- package/dist/account/switch-account.d.ts.map +1 -1
- package/dist/account/switch-account.js +3 -4
- package/dist/account/switch-account.js.map +1 -1
- package/dist/account/switch-account.test.js +4 -4
- package/dist/account/switch-account.test.js.map +1 -1
- package/dist/change/apply-changes.d.ts +13 -0
- package/dist/change/apply-changes.d.ts.map +1 -1
- package/dist/change/apply-changes.js +14 -4
- package/dist/change/apply-changes.js.map +1 -1
- package/dist/change/apply-changes.test.js +91 -1
- package/dist/change/apply-changes.test.js.map +1 -1
- package/dist/change/create-change-v2.d.ts +11 -0
- package/dist/change/create-change-v2.d.ts.map +1 -0
- package/dist/change/create-change-v2.js +31 -0
- package/dist/change/create-change-v2.js.map +1 -0
- package/dist/change/create-change-v2.test.d.ts +2 -0
- package/dist/change/create-change-v2.test.d.ts.map +1 -0
- package/dist/change/create-change-v2.test.js +39 -0
- package/dist/change/create-change-v2.test.js.map +1 -0
- package/dist/change/create-change.d.ts +2 -2
- package/dist/change/create-change.d.ts.map +1 -1
- package/dist/change/create-change.js +3 -1
- package/dist/change/create-change.js.map +1 -1
- package/dist/change/create-change.test.js +4 -6
- package/dist/change/create-change.test.js.map +1 -1
- package/dist/change/index.d.ts +1 -1
- package/dist/change/index.d.ts.map +1 -1
- package/dist/change/index.js.map +1 -1
- package/dist/change/schema.d.ts +40 -2
- package/dist/change/schema.d.ts.map +1 -1
- package/dist/change/schema.js +50 -9
- package/dist/change/schema.js.map +1 -1
- package/dist/change/schema.test.js +33 -0
- package/dist/change/schema.test.js.map +1 -1
- package/dist/change-author/index.d.ts +1 -1
- package/dist/change-author/index.d.ts.map +1 -1
- package/dist/change-author/index.js +1 -1
- package/dist/change-author/index.js.map +1 -1
- package/dist/change-author/schema.d.ts +12 -9
- package/dist/change-author/schema.d.ts.map +1 -1
- package/dist/change-author/schema.js +16 -10
- package/dist/change-author/schema.js.map +1 -1
- package/dist/change-author/schema.test.js +283 -229
- package/dist/change-author/schema.test.js.map +1 -1
- package/dist/change-proposal/create-change-proposal.d.ts +3 -3
- package/dist/change-proposal/create-change-proposal.d.ts.map +1 -1
- package/dist/change-proposal/database-schema.js +1 -1
- package/dist/change-set/apply-change-set.d.ts +2 -2
- package/dist/change-set/apply-change-set.d.ts.map +1 -1
- package/dist/change-set/apply-change-set.js +40 -51
- package/dist/change-set/apply-change-set.js.map +1 -1
- package/dist/change-set/apply-change-set.test.js +6 -3
- package/dist/change-set/apply-change-set.test.js.map +1 -1
- package/dist/change-set/before-after-of-file.d.ts +31 -0
- package/dist/change-set/before-after-of-file.d.ts.map +1 -0
- package/dist/change-set/before-after-of-file.js +191 -0
- package/dist/change-set/before-after-of-file.js.map +1 -0
- package/dist/change-set/before-after-of-file.test.d.ts +2 -0
- package/dist/change-set/before-after-of-file.test.d.ts.map +1 -0
- package/dist/change-set/before-after-of-file.test.js +221 -0
- package/dist/change-set/before-after-of-file.test.js.map +1 -0
- package/dist/change-set/change-set-element-in-symmetric-difference.d.ts +2 -1
- package/dist/change-set/change-set-element-in-symmetric-difference.d.ts.map +1 -1
- package/dist/change-set/change-set-element-in-symmetric-difference.js.map +1 -1
- package/dist/change-set/change-set-element-in-symmetric-difference.test.js +204 -34
- package/dist/change-set/change-set-element-in-symmetric-difference.test.js.map +1 -1
- package/dist/change-set/checkout-change-set.d.ts +15 -0
- package/dist/change-set/checkout-change-set.d.ts.map +1 -0
- package/dist/change-set/checkout-change-set.js +64 -0
- package/dist/change-set/checkout-change-set.js.map +1 -0
- package/dist/change-set/checkout-change-set.test.d.ts +2 -0
- package/dist/change-set/checkout-change-set.test.d.ts.map +1 -0
- package/dist/change-set/checkout-change-set.test.js +127 -0
- package/dist/change-set/checkout-change-set.test.js.map +1 -0
- package/dist/change-set/create-change-set.d.ts +7 -9
- package/dist/change-set/create-change-set.d.ts.map +1 -1
- package/dist/change-set/create-change-set.js +3 -25
- package/dist/change-set/create-change-set.js.map +1 -1
- package/dist/change-set/create-change-set.test.js +0 -31
- package/dist/change-set/create-change-set.test.js.map +1 -1
- package/dist/change-set/create-checkpoint.d.ts.map +1 -1
- package/dist/change-set/create-checkpoint.js +11 -2
- package/dist/change-set/create-checkpoint.js.map +1 -1
- package/dist/change-set/create-checkpoint.test.js +53 -0
- package/dist/change-set/create-checkpoint.test.js.map +1 -1
- package/dist/change-set/create-merge-change-set.d.ts +4 -4
- package/dist/change-set/create-merge-change-set.d.ts.map +1 -1
- package/dist/change-set/create-transition-change-set.d.ts +4 -4
- package/dist/change-set/create-transition-change-set.d.ts.map +1 -1
- package/dist/change-set/create-undo-change-set.d.ts +5 -5
- package/dist/change-set/create-undo-change-set.d.ts.map +1 -1
- package/dist/change-set/create-undo-change-set.js +4 -3
- package/dist/change-set/create-undo-change-set.js.map +1 -1
- package/dist/change-set/database-schema.d.ts +39 -0
- package/dist/change-set/database-schema.d.ts.map +1 -0
- package/dist/change-set/database-schema.js +86 -0
- package/dist/change-set/database-schema.js.map +1 -0
- package/dist/change-set/database-schema.test.d.ts +2 -0
- package/dist/change-set/database-schema.test.d.ts.map +1 -0
- package/dist/change-set/database-schema.test.js +547 -0
- package/dist/change-set/database-schema.test.js.map +1 -0
- package/dist/change-set/diff-for-file.d.ts +29 -0
- package/dist/change-set/diff-for-file.d.ts.map +1 -0
- package/dist/change-set/diff-for-file.js +19 -0
- package/dist/change-set/diff-for-file.js.map +1 -0
- package/dist/change-set/get-before-after-of-file.d.ts +31 -0
- package/dist/change-set/get-before-after-of-file.d.ts.map +1 -0
- package/dist/change-set/get-before-after-of-file.js +189 -0
- package/dist/change-set/get-before-after-of-file.js.map +1 -0
- package/dist/change-set/get-before-after-of-file.test.d.ts +2 -0
- package/dist/change-set/get-before-after-of-file.test.d.ts.map +1 -0
- package/dist/change-set/get-before-after-of-file.test.js +220 -0
- package/dist/change-set/get-before-after-of-file.test.js.map +1 -0
- package/dist/change-set/index.d.ts +1 -5
- package/dist/change-set/index.d.ts.map +1 -1
- package/dist/change-set/index.js +1 -5
- package/dist/change-set/index.js.map +1 -1
- package/dist/change-set/merge-change-sets.d.ts +23 -0
- package/dist/change-set/merge-change-sets.d.ts.map +1 -0
- package/dist/change-set/merge-change-sets.js +69 -0
- package/dist/change-set/merge-change-sets.js.map +1 -0
- package/dist/change-set/merge-change-sets.test.d.ts +2 -0
- package/dist/change-set/merge-change-sets.test.d.ts.map +1 -0
- package/dist/change-set/merge-change-sets.test.js +184 -0
- package/dist/change-set/merge-change-sets.test.js.map +1 -0
- package/dist/change-set/restore-change-set.d.ts +14 -0
- package/dist/change-set/restore-change-set.d.ts.map +1 -0
- package/dist/change-set/restore-change-set.js +98 -0
- package/dist/change-set/restore-change-set.js.map +1 -0
- package/dist/change-set/restore-change-set.test.d.ts +2 -0
- package/dist/change-set/restore-change-set.test.d.ts.map +1 -0
- package/dist/change-set/restore-change-set.test.js +238 -0
- package/dist/change-set/restore-change-set.test.js.map +1 -0
- package/dist/change-set/schema.d.ts +28 -72
- package/dist/change-set/schema.d.ts.map +1 -1
- package/dist/change-set/schema.js +37 -84
- package/dist/change-set/schema.js.map +1 -1
- package/dist/change-set/schema.test.js +0 -247
- package/dist/change-set/schema.test.js.map +1 -1
- package/dist/change-set-edge/database-schema.d.ts +11 -0
- package/dist/change-set-edge/database-schema.d.ts.map +1 -0
- package/dist/change-set-edge/database-schema.js +29 -0
- package/dist/change-set-edge/database-schema.js.map +1 -0
- package/dist/change-set-edge/database-schema.test.d.ts +2 -0
- package/dist/change-set-edge/database-schema.test.d.ts.map +1 -0
- package/dist/change-set-edge/database-schema.test.js +166 -0
- package/dist/change-set-edge/database-schema.test.js.map +1 -0
- package/dist/change-set-edge/index.d.ts +2 -0
- package/dist/change-set-edge/index.d.ts.map +1 -0
- package/dist/change-set-edge/index.js +2 -0
- package/dist/change-set-edge/index.js.map +1 -0
- package/dist/change-set-v2/apply-change-set.d.ts +10 -0
- package/dist/change-set-v2/apply-change-set.d.ts.map +1 -0
- package/dist/change-set-v2/apply-change-set.js +147 -0
- package/dist/change-set-v2/apply-change-set.js.map +1 -0
- package/dist/change-set-v2/apply-change-set.test.d.ts +2 -0
- package/dist/change-set-v2/apply-change-set.test.d.ts.map +1 -0
- package/dist/change-set-v2/apply-change-set.test.js +270 -0
- package/dist/change-set-v2/apply-change-set.test.js.map +1 -0
- package/dist/change-set-v2/create-change-set.d.ts +10 -0
- package/dist/change-set-v2/create-change-set.d.ts.map +1 -0
- package/dist/change-set-v2/create-change-set.js +57 -0
- package/dist/change-set-v2/create-change-set.js.map +1 -0
- package/dist/change-set-v2/create-change-set.test.d.ts +2 -0
- package/dist/change-set-v2/create-change-set.test.d.ts.map +1 -0
- package/dist/change-set-v2/create-change-set.test.js +59 -0
- package/dist/change-set-v2/create-change-set.test.js.map +1 -0
- package/dist/change-set-v2/create-checkpoint.d.ts +7 -0
- package/dist/change-set-v2/create-checkpoint.d.ts.map +1 -0
- package/dist/change-set-v2/create-checkpoint.js +79 -0
- package/dist/change-set-v2/create-checkpoint.js.map +1 -0
- package/dist/change-set-v2/create-checkpoint.test.d.ts +2 -0
- package/dist/change-set-v2/create-checkpoint.test.d.ts.map +1 -0
- package/dist/change-set-v2/create-checkpoint.test.js +289 -0
- package/dist/change-set-v2/create-checkpoint.test.js.map +1 -0
- package/dist/change-set-v2/create-merge-change-set.d.ts +23 -0
- package/dist/change-set-v2/create-merge-change-set.d.ts.map +1 -0
- package/dist/change-set-v2/create-merge-change-set.js +68 -0
- package/dist/change-set-v2/create-merge-change-set.js.map +1 -0
- package/dist/change-set-v2/create-merge-change-set.test.d.ts +2 -0
- package/dist/change-set-v2/create-merge-change-set.test.d.ts.map +1 -0
- package/dist/change-set-v2/create-merge-change-set.test.js +223 -0
- package/dist/change-set-v2/create-merge-change-set.test.js.map +1 -0
- package/dist/change-set-v2/index.d.ts +5 -0
- package/dist/change-set-v2/index.d.ts.map +1 -0
- package/dist/change-set-v2/index.js +5 -0
- package/dist/change-set-v2/index.js.map +1 -0
- package/dist/change-set-v2/schema.d.ts +50 -0
- package/dist/change-set-v2/schema.d.ts.map +1 -0
- package/dist/change-set-v2/schema.js +347 -0
- package/dist/change-set-v2/schema.js.map +1 -0
- package/dist/change-set-v2/schema.test.d.ts +2 -0
- package/dist/change-set-v2/schema.test.d.ts.map +1 -0
- package/dist/change-set-v2/schema.test.js +713 -0
- package/dist/change-set-v2/schema.test.js.map +1 -0
- package/dist/commit/apply-commit.d.ts +32 -0
- package/dist/commit/apply-commit.d.ts.map +1 -0
- package/dist/commit/apply-commit.js +63 -0
- package/dist/commit/apply-commit.js.map +1 -0
- package/dist/commit/apply-commit.test.d.ts +2 -0
- package/dist/commit/apply-commit.test.d.ts.map +1 -0
- package/dist/commit/apply-commit.test.js +367 -0
- package/dist/commit/apply-commit.test.js.map +1 -0
- package/dist/commit/create-checkpoint.d.ts +19 -0
- package/dist/commit/create-checkpoint.d.ts.map +1 -0
- package/dist/commit/create-checkpoint.js +118 -0
- package/dist/commit/create-checkpoint.js.map +1 -0
- package/dist/commit/create-checkpoint.test.d.ts +2 -0
- package/dist/commit/create-checkpoint.test.d.ts.map +1 -0
- package/dist/commit/create-checkpoint.test.js +472 -0
- package/dist/commit/create-checkpoint.test.js.map +1 -0
- package/dist/commit/create-commit.d.ts +38 -0
- package/dist/commit/create-commit.d.ts.map +1 -0
- package/dist/commit/create-commit.js +68 -0
- package/dist/commit/create-commit.js.map +1 -0
- package/dist/commit/create-merge-commit.d.ts +24 -0
- package/dist/commit/create-merge-commit.d.ts.map +1 -0
- package/dist/commit/create-merge-commit.js +103 -0
- package/dist/commit/create-merge-commit.js.map +1 -0
- package/dist/commit/create-merge-commit.test.d.ts +2 -0
- package/dist/commit/create-merge-commit.test.d.ts.map +1 -0
- package/dist/commit/create-merge-commit.test.js +242 -0
- package/dist/commit/create-merge-commit.test.js.map +1 -0
- package/dist/commit/create-transition-commit.d.ts +18 -0
- package/dist/commit/create-transition-commit.d.ts.map +1 -0
- package/dist/commit/create-transition-commit.js +136 -0
- package/dist/commit/create-transition-commit.js.map +1 -0
- package/dist/commit/create-transition-commit.test.d.ts +2 -0
- package/dist/commit/create-transition-commit.test.d.ts.map +1 -0
- package/dist/commit/create-transition-commit.test.js +221 -0
- package/dist/commit/create-transition-commit.test.js.map +1 -0
- package/dist/commit/create-undo-commit.d.ts +27 -0
- package/dist/commit/create-undo-commit.d.ts.map +1 -0
- package/dist/commit/create-undo-commit.js +143 -0
- package/dist/commit/create-undo-commit.js.map +1 -0
- package/dist/commit/create-undo-commit.test.d.ts +2 -0
- package/dist/commit/create-undo-commit.test.d.ts.map +1 -0
- package/dist/commit/create-undo-commit.test.js +298 -0
- package/dist/commit/create-undo-commit.test.js.map +1 -0
- package/dist/commit/index.d.ts +6 -0
- package/dist/commit/index.d.ts.map +1 -0
- package/dist/commit/index.js +6 -0
- package/dist/commit/index.js.map +1 -0
- package/dist/commit/schema.d.ts +73 -0
- package/dist/commit/schema.d.ts.map +1 -0
- package/dist/commit/schema.js +90 -0
- package/dist/commit/schema.js.map +1 -0
- package/dist/commit/schema.test.d.ts +2 -0
- package/dist/commit/schema.test.d.ts.map +1 -0
- package/dist/commit/schema.test.js +216 -0
- package/dist/commit/schema.test.js.map +1 -0
- package/dist/database/apply-schema.d.ts +3 -0
- package/dist/database/apply-schema.d.ts.map +1 -1
- package/dist/database/apply-schema.js +91 -258
- package/dist/database/apply-schema.js.map +1 -1
- package/dist/database/index.d.ts +0 -2
- package/dist/database/index.d.ts.map +1 -1
- package/dist/database/index.js +0 -2
- package/dist/database/index.js.map +1 -1
- package/dist/database/init-db.d.ts.map +1 -1
- package/dist/database/init-db.js +83 -44
- package/dist/database/init-db.js.map +1 -1
- package/dist/database/init-db.test.js +2 -480
- package/dist/database/init-db.test.js.map +1 -1
- package/dist/database/kysely-plugin/json-column-plugin.d.ts +5 -1
- package/dist/database/kysely-plugin/json-column-plugin.d.ts.map +1 -1
- package/dist/database/kysely-plugin/json-column-plugin.js +52 -10
- package/dist/database/kysely-plugin/json-column-plugin.js.map +1 -1
- package/dist/database/kysely-plugin/json-column-plugin.test.d.ts +2 -0
- package/dist/database/kysely-plugin/json-column-plugin.test.d.ts.map +1 -0
- package/dist/database/kysely-plugin/json-column-plugin.test.js +329 -0
- package/dist/database/kysely-plugin/json-column-plugin.test.js.map +1 -0
- package/dist/database/mutation-log/database-schema.d.ts.map +1 -1
- package/dist/database/mutation-log/database-schema.js +0 -4
- package/dist/database/mutation-log/database-schema.js.map +1 -1
- package/dist/database/nano-id.d.ts +4 -1
- package/dist/database/nano-id.d.ts.map +1 -1
- package/dist/database/nano-id.js +4 -1
- package/dist/database/nano-id.js.map +1 -1
- package/dist/database/nano-id.test.js +3 -3
- package/dist/database/nano-id.test.js.map +1 -1
- package/dist/database/schema.d.ts +21 -14
- package/dist/database/schema.d.ts.map +1 -1
- package/dist/database/schema.js +9 -5
- package/dist/database/schema.js.map +1 -1
- package/dist/deterministic/generate-human-id.d.ts +20 -0
- package/dist/deterministic/generate-human-id.d.ts.map +1 -0
- package/dist/deterministic/generate-human-id.js +86 -0
- package/dist/deterministic/generate-human-id.js.map +1 -0
- package/dist/deterministic/generate-human-id.test.d.ts +2 -0
- package/dist/deterministic/generate-human-id.test.d.ts.map +1 -0
- package/dist/deterministic/generate-human-id.test.js +123 -0
- package/dist/deterministic/generate-human-id.test.js.map +1 -0
- package/dist/deterministic/index.d.ts +8 -0
- package/dist/deterministic/index.d.ts.map +1 -0
- package/dist/deterministic/index.js +8 -0
- package/dist/deterministic/index.js.map +1 -0
- package/dist/deterministic/is-deterministic-mode.d.ts +14 -0
- package/dist/deterministic/is-deterministic-mode.d.ts.map +1 -0
- package/dist/deterministic/is-deterministic-mode.js +25 -0
- package/dist/deterministic/is-deterministic-mode.js.map +1 -0
- package/dist/deterministic/is-deterministic-mode.test.d.ts +2 -0
- package/dist/deterministic/is-deterministic-mode.test.d.ts.map +1 -0
- package/dist/deterministic/is-deterministic-mode.test.js +103 -0
- package/dist/deterministic/is-deterministic-mode.test.js.map +1 -0
- package/dist/deterministic/nano-id.d.ts +61 -0
- package/dist/deterministic/nano-id.d.ts.map +1 -0
- package/dist/deterministic/nano-id.js +161 -0
- package/dist/deterministic/nano-id.js.map +1 -0
- package/dist/deterministic/nano-id.test.d.ts +2 -0
- package/dist/deterministic/nano-id.test.d.ts.map +1 -0
- package/dist/deterministic/nano-id.test.js +163 -0
- package/dist/deterministic/nano-id.test.js.map +1 -0
- package/dist/deterministic/options.d.ts +53 -0
- package/dist/deterministic/options.d.ts.map +1 -0
- package/dist/deterministic/options.js +52 -0
- package/dist/deterministic/options.js.map +1 -0
- package/dist/deterministic/options.test.d.ts +2 -0
- package/dist/deterministic/options.test.d.ts.map +1 -0
- package/dist/deterministic/options.test.js +111 -0
- package/dist/deterministic/options.test.js.map +1 -0
- package/dist/deterministic/random.d.ts +68 -0
- package/dist/deterministic/random.d.ts.map +1 -0
- package/dist/deterministic/random.js +225 -0
- package/dist/deterministic/random.js.map +1 -0
- package/dist/deterministic/random.test.d.ts +2 -0
- package/dist/deterministic/random.test.d.ts.map +1 -0
- package/dist/deterministic/random.test.js +244 -0
- package/dist/deterministic/random.test.js.map +1 -0
- package/dist/deterministic/sequence.d.ts +56 -0
- package/dist/deterministic/sequence.d.ts.map +1 -0
- package/dist/deterministic/sequence.js +107 -0
- package/dist/deterministic/sequence.js.map +1 -0
- package/dist/deterministic/sequence.test.d.ts +2 -0
- package/dist/deterministic/sequence.test.d.ts.map +1 -0
- package/dist/deterministic/sequence.test.js +71 -0
- package/dist/deterministic/sequence.test.js.map +1 -0
- package/dist/deterministic/timestamp.d.ts +47 -0
- package/dist/deterministic/timestamp.d.ts.map +1 -0
- package/dist/deterministic/timestamp.js +74 -0
- package/dist/deterministic/timestamp.js.map +1 -0
- package/dist/deterministic/timestamp.test.d.ts +2 -0
- package/dist/deterministic/timestamp.test.d.ts.map +1 -0
- package/dist/deterministic/timestamp.test.js +145 -0
- package/dist/deterministic/timestamp.test.js.map +1 -0
- package/dist/deterministic/uuid-v7.d.ts +49 -0
- package/dist/deterministic/uuid-v7.d.ts.map +1 -0
- package/dist/deterministic/uuid-v7.js +75 -0
- package/dist/deterministic/uuid-v7.js.map +1 -0
- package/dist/deterministic/uuid-v7.test.d.ts +2 -0
- package/dist/deterministic/uuid-v7.test.d.ts.map +1 -0
- package/dist/deterministic/uuid-v7.test.js +114 -0
- package/dist/deterministic/uuid-v7.test.js.map +1 -0
- package/dist/discussion/create-discussion.d.ts +2 -1
- package/dist/discussion/create-discussion.d.ts.map +1 -1
- package/dist/discussion/create-discussion.js.map +1 -1
- package/dist/discussion/create-discussion.test.js +13 -2
- package/dist/discussion/create-discussion.test.js.map +1 -1
- package/dist/entity/eb-entity.d.ts +76 -0
- package/dist/entity/eb-entity.d.ts.map +1 -0
- package/dist/entity/eb-entity.js +156 -0
- package/dist/entity/eb-entity.js.map +1 -0
- package/dist/entity/eb-entity.test.d.ts +2 -0
- package/dist/entity/eb-entity.test.d.ts.map +1 -0
- package/dist/entity/eb-entity.test.js +573 -0
- package/dist/entity/eb-entity.test.js.map +1 -0
- package/dist/entity/index.d.ts +7 -0
- package/dist/entity/index.d.ts.map +1 -0
- package/dist/entity/index.js +4 -0
- package/dist/entity/index.js.map +1 -0
- package/dist/entity/label/create-entity-label.d.ts +61 -0
- package/dist/entity/label/create-entity-label.d.ts.map +1 -0
- package/dist/entity/label/create-entity-label.js +92 -0
- package/dist/entity/label/create-entity-label.js.map +1 -0
- package/dist/entity/label/create-entity-label.test.d.ts +2 -0
- package/dist/entity/label/create-entity-label.test.d.ts.map +1 -0
- package/dist/entity/label/create-entity-label.test.js +261 -0
- package/dist/entity/label/create-entity-label.test.js.map +1 -0
- package/dist/entity/label/schema.d.ts +40 -0
- package/dist/entity/label/schema.d.ts.map +1 -0
- package/dist/entity/label/schema.js +42 -0
- package/dist/entity/label/schema.js.map +1 -0
- package/dist/entity/label/schema.test.d.ts +2 -0
- package/dist/entity/label/schema.test.d.ts.map +1 -0
- package/dist/entity/label/schema.test.js +596 -0
- package/dist/entity/label/schema.test.js.map +1 -0
- package/dist/entity/schema.d.ts +13 -0
- package/dist/entity/schema.d.ts.map +1 -0
- package/dist/entity/schema.js +5 -0
- package/dist/entity/schema.js.map +1 -0
- package/dist/entity/thread/create-entity-thread.d.ts +75 -0
- package/dist/entity/thread/create-entity-thread.d.ts.map +1 -0
- package/dist/entity/thread/create-entity-thread.js +109 -0
- package/dist/entity/thread/create-entity-thread.js.map +1 -0
- package/dist/entity/thread/create-entity-thread.test.d.ts +2 -0
- package/dist/entity/thread/create-entity-thread.test.d.ts.map +1 -0
- package/dist/entity/thread/create-entity-thread.test.js +240 -0
- package/dist/entity/thread/create-entity-thread.test.js.map +1 -0
- package/dist/entity/thread/query-threads.test.d.ts +2 -0
- package/dist/entity/thread/query-threads.test.d.ts.map +1 -0
- package/dist/entity/thread/query-threads.test.js +330 -0
- package/dist/entity/thread/query-threads.test.js.map +1 -0
- package/dist/entity/thread/schema.d.ts +40 -0
- package/dist/entity/thread/schema.d.ts.map +1 -0
- package/dist/entity/thread/schema.js +42 -0
- package/dist/entity/thread/schema.js.map +1 -0
- package/dist/entity/thread/schema.test.d.ts +2 -0
- package/dist/entity/thread/schema.test.d.ts.map +1 -0
- package/dist/entity/thread/schema.test.js +144 -0
- package/dist/entity/thread/schema.test.js.map +1 -0
- package/dist/entity-views/entity-state-all.d.ts +52 -0
- package/dist/entity-views/entity-state-all.d.ts.map +1 -1
- package/dist/entity-views/entity-state-all.js +19 -11
- package/dist/entity-views/entity-state-all.js.map +1 -1
- package/dist/entity-views/entity-state-all.test.js +173 -0
- package/dist/entity-views/entity-state-all.test.js.map +1 -1
- package/dist/entity-views/entity-state-history.d.ts +55 -15
- package/dist/entity-views/entity-state-history.d.ts.map +1 -1
- package/dist/entity-views/entity-state-history.js +7 -4
- package/dist/entity-views/entity-state-history.js.map +1 -1
- package/dist/entity-views/entity-state-history.test.js +70 -15
- package/dist/entity-views/entity-state-history.test.js.map +1 -1
- package/dist/entity-views/entity-state.d.ts +52 -0
- package/dist/entity-views/entity-state.d.ts.map +1 -1
- package/dist/entity-views/entity-state.js +18 -10
- package/dist/entity-views/entity-state.js.map +1 -1
- package/dist/entity-views/entity-state.test.js +120 -1
- package/dist/entity-views/entity-state.test.js.map +1 -1
- package/dist/entity-views/entity-view-builder.test.js +6 -6
- package/dist/entity-views/entity-view-builder.test.js.map +1 -1
- package/dist/entity-views/types.d.ts +2 -2
- package/dist/file/database-schema.d.ts +25 -0
- package/dist/file/database-schema.d.ts.map +1 -0
- package/dist/file/database-schema.js +26 -0
- package/dist/file/database-schema.js.map +1 -0
- package/dist/file/database-schema.test.d.ts +2 -0
- package/dist/file/database-schema.test.d.ts.map +1 -0
- package/dist/file/database-schema.test.js +60 -0
- package/dist/file/database-schema.test.js.map +1 -0
- package/dist/file/file-handlers.d.ts.map +1 -1
- package/dist/file/file-handlers.js +36 -0
- package/dist/file/file-handlers.js.map +1 -1
- package/dist/file/file-handlers.test.js +4 -4
- package/dist/file/file-handlers.test.js.map +1 -1
- package/dist/file/materialize-file-data-at-changeset.d.ts +1 -1
- package/dist/file/materialize-file-data-at-changeset.d.ts.map +1 -1
- package/dist/file/materialize-file-data-at-changeset.js +55 -29
- package/dist/file/materialize-file-data-at-changeset.js.map +1 -1
- package/dist/file/materialize-file-data-at-commit.d.ts +9 -0
- package/dist/file/materialize-file-data-at-commit.d.ts.map +1 -0
- package/dist/file/materialize-file-data-at-commit.js +119 -0
- package/dist/file/materialize-file-data-at-commit.js.map +1 -0
- package/dist/file/schema.d.ts +68 -5
- package/dist/file/schema.d.ts.map +1 -1
- package/dist/file/schema.js +118 -50
- package/dist/file/schema.js.map +1 -1
- package/dist/file/schema.test.js +543 -35
- package/dist/file/schema.test.js.map +1 -1
- package/dist/file-queue/database-schema.d.ts +17 -0
- package/dist/file-queue/database-schema.d.ts.map +1 -0
- package/dist/file-queue/database-schema.js +53 -0
- package/dist/file-queue/database-schema.js.map +1 -0
- package/dist/file-queue/file-handlers.d.ts +1 -1
- package/dist/file-queue/file-handlers.d.ts.map +1 -1
- package/dist/file-queue/file-handlers.js +60 -29
- package/dist/file-queue/file-handlers.js.map +1 -1
- package/dist/file-queue/file-queue-process.d.ts.map +1 -1
- package/dist/file-queue/file-queue-process.js +26 -17
- package/dist/file-queue/file-queue-process.js.map +1 -1
- package/dist/file-queue/file-queue-process.test.js +133 -43
- package/dist/file-queue/file-queue-process.test.js.map +1 -1
- package/dist/file-queue/with-skip-file-queue.d.ts +18 -0
- package/dist/file-queue/with-skip-file-queue.d.ts.map +1 -1
- package/dist/file-queue/with-skip-file-queue.js +56 -10
- package/dist/file-queue/with-skip-file-queue.js.map +1 -1
- package/dist/file-queue/with-skip-file-queue.test.js +28 -12
- package/dist/file-queue/with-skip-file-queue.test.js.map +1 -1
- package/dist/hooks/create-hooks.d.ts +4 -26
- package/dist/hooks/create-hooks.d.ts.map +1 -1
- package/dist/hooks/create-hooks.js +3 -7
- package/dist/hooks/create-hooks.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/key-value/database-schema.d.ts +3 -2
- package/dist/key-value/database-schema.d.ts.map +1 -1
- package/dist/key-value/database-schema.js +3 -3
- package/dist/key-value/database-schema.test.js +13 -4
- package/dist/key-value/database-schema.test.js.map +1 -1
- package/dist/key-value/index.d.ts +1 -1
- package/dist/key-value/index.d.ts.map +1 -1
- package/dist/key-value/index.js.map +1 -1
- package/dist/key-value/schema.d.ts +63 -3
- package/dist/key-value/schema.d.ts.map +1 -1
- package/dist/key-value/schema.js +8 -2
- package/dist/key-value/schema.js.map +1 -1
- package/dist/key-value/schema.test.js +91 -2
- package/dist/key-value/schema.test.js.map +1 -1
- package/dist/key-value-v2/schema.d.ts +27 -0
- package/dist/key-value-v2/schema.d.ts.map +1 -0
- package/dist/key-value-v2/schema.js +73 -0
- package/dist/key-value-v2/schema.js.map +1 -0
- package/dist/key-value-v2/schema.test.d.ts +2 -0
- package/dist/key-value-v2/schema.test.d.ts.map +1 -0
- package/dist/key-value-v2/schema.test.js +144 -0
- package/dist/key-value-v2/schema.test.js.map +1 -0
- package/dist/label/create-label.d.ts +5 -5
- package/dist/label/create-label.d.ts.map +1 -1
- package/dist/label/create-label.js +2 -2
- package/dist/label/create-label.js.map +1 -1
- package/dist/label/index.d.ts +1 -1
- package/dist/label/index.d.ts.map +1 -1
- package/dist/label/index.js.map +1 -1
- package/dist/label/schema.d.ts +3 -3
- package/dist/label/schema.d.ts.map +1 -1
- package/dist/label/schema.js +4 -6
- package/dist/label/schema.js.map +1 -1
- package/dist/lix/close-lix.d.ts +1 -10
- package/dist/lix/close-lix.d.ts.map +1 -1
- package/dist/lix/close-lix.js +1 -10
- package/dist/lix/close-lix.js.map +1 -1
- package/dist/lix/merge.test.js +4 -1
- package/dist/lix/merge.test.js.map +1 -1
- package/dist/lix/new-lix.d.ts +4 -2
- package/dist/lix/new-lix.d.ts.map +1 -1
- package/dist/lix/new-lix.js +244 -60
- package/dist/lix/new-lix.js.map +1 -1
- package/dist/lix/new-lix.test.js +175 -1
- package/dist/lix/new-lix.test.js.map +1 -1
- package/dist/lix/open-lix-in-memory.d.ts +1 -9
- package/dist/lix/open-lix-in-memory.d.ts.map +1 -1
- package/dist/lix/open-lix-in-memory.js +7 -15
- package/dist/lix/open-lix-in-memory.js.map +1 -1
- package/dist/lix/open-lix-in-memory.test.js +2 -1
- package/dist/lix/open-lix-in-memory.test.js.map +1 -1
- package/dist/lix/open-lix.d.ts +12 -13
- package/dist/lix/open-lix.d.ts.map +1 -1
- package/dist/lix/open-lix.js +147 -55
- package/dist/lix/open-lix.js.map +1 -1
- package/dist/lix/open-lix.test.js +242 -3
- package/dist/lix/open-lix.test.js.map +1 -1
- package/dist/lix/storage/in-memory.d.ts +7 -6
- package/dist/lix/storage/in-memory.d.ts.map +1 -1
- package/dist/lix/storage/in-memory.js +10 -17
- package/dist/lix/storage/in-memory.js.map +1 -1
- package/dist/lix/storage/in-memory.test.js +7 -68
- package/dist/lix/storage/in-memory.test.js.map +1 -1
- package/dist/lix/storage/lix-storage-adapter.d.ts +35 -5
- package/dist/lix/storage/lix-storage-adapter.d.ts.map +1 -1
- package/dist/lix/storage/opfs.d.ts +39 -10
- package/dist/lix/storage/opfs.d.ts.map +1 -1
- package/dist/lix/storage/opfs.js +148 -37
- package/dist/lix/storage/opfs.js.map +1 -1
- package/dist/lix/storage/opfs.test.js +203 -24
- package/dist/lix/storage/opfs.test.js.map +1 -1
- package/dist/lix/to-blob.d.ts +2 -9
- package/dist/lix/to-blob.d.ts.map +1 -1
- package/dist/lix/to-blob.js +2 -9
- package/dist/lix/to-blob.js.map +1 -1
- package/dist/log/create-lix-own-log.d.ts +9 -1
- package/dist/log/create-lix-own-log.d.ts.map +1 -1
- package/dist/log/create-lix-own-log.js +14 -25
- package/dist/log/create-lix-own-log.js.map +1 -1
- package/dist/log/create-lix-own-log.test.js +9 -5
- package/dist/log/create-lix-own-log.test.js.map +1 -1
- package/dist/log/create-log.d.ts +2 -2
- package/dist/log/create-log.d.ts.map +1 -1
- package/dist/log/create-log.js +2 -2
- package/dist/log/create-log.js.map +1 -1
- package/dist/log/database-schema.d.ts +33 -0
- package/dist/log/database-schema.d.ts.map +1 -0
- package/dist/log/database-schema.js +14 -0
- package/dist/log/database-schema.js.map +1 -0
- package/dist/log/database-schema.test.d.ts +2 -0
- package/dist/log/database-schema.test.d.ts.map +1 -0
- package/dist/log/database-schema.test.js +22 -0
- package/dist/log/database-schema.test.js.map +1 -0
- package/dist/log/index.d.ts +1 -1
- package/dist/log/index.d.ts.map +1 -1
- package/dist/log/index.js.map +1 -1
- package/dist/log/schema.d.ts +3 -3
- package/dist/log/schema.d.ts.map +1 -1
- package/dist/log/schema.js +4 -5
- package/dist/log/schema.js.map +1 -1
- package/dist/observe/create-observe.d.ts.map +1 -1
- package/dist/observe/create-observe.js +32 -3
- package/dist/observe/create-observe.js.map +1 -1
- package/dist/observe/create-observe.test.js +298 -44
- package/dist/observe/create-observe.test.js.map +1 -1
- package/dist/observe/determine-schema-keys.d.ts +6 -0
- package/dist/observe/determine-schema-keys.d.ts.map +1 -0
- package/dist/observe/determine-schema-keys.js +145 -0
- package/dist/observe/determine-schema-keys.js.map +1 -0
- package/dist/observe/determine-schema-keys.test.d.ts +2 -0
- package/dist/observe/determine-schema-keys.test.d.ts.map +1 -0
- package/dist/observe/determine-schema-keys.test.js +266 -0
- package/dist/observe/determine-schema-keys.test.js.map +1 -0
- package/dist/own-change-control/apply-own-change.d.ts +5 -1
- package/dist/own-change-control/apply-own-change.d.ts.map +1 -1
- package/dist/own-change-control/apply-own-change.js +26 -12
- package/dist/own-change-control/apply-own-change.js.map +1 -1
- package/dist/own-change-control/apply-own-change.test.js +86 -48
- package/dist/own-change-control/apply-own-change.test.js.map +1 -1
- package/dist/own-change-control/change-controlled-tables.d.ts +5 -7
- package/dist/own-change-control/change-controlled-tables.d.ts.map +1 -1
- package/dist/own-change-control/change-controlled-tables.js +27 -21
- package/dist/own-change-control/change-controlled-tables.js.map +1 -1
- package/dist/own-change-control/change-controlled-tables.test.js +35 -5
- package/dist/own-change-control/change-controlled-tables.test.js.map +1 -1
- package/dist/own-change-control/database-triggers.d.ts +2 -1
- package/dist/own-change-control/database-triggers.d.ts.map +1 -1
- package/dist/own-change-control/database-triggers.js +209 -67
- package/dist/own-change-control/database-triggers.js.map +1 -1
- package/dist/own-change-control/database-triggers.test.js +139 -8
- package/dist/own-change-control/database-triggers.test.js.map +1 -1
- package/dist/own-change-control/with-skip-own-change-control.d.ts.map +1 -1
- package/dist/own-change-control/with-skip-own-change-control.js +28 -6
- package/dist/own-change-control/with-skip-own-change-control.js.map +1 -1
- package/dist/own-change-control/with-skip-own-change-control.test.js +38 -1
- package/dist/own-change-control/with-skip-own-change-control.test.js.map +1 -1
- package/dist/plugin/lix-plugin.d.ts +3 -3
- package/dist/plugin/lix-plugin.d.ts.map +1 -1
- package/dist/plugin/load-plugin.d.ts.map +1 -1
- package/dist/plugin/load-plugin.js.map +1 -1
- package/dist/prototype/database-schema.d.ts +43 -0
- package/dist/prototype/database-schema.d.ts.map +1 -0
- package/dist/prototype/database-schema.js +72 -0
- package/dist/prototype/database-schema.js.map +1 -0
- package/dist/prototype/file-handlers.d.ts +24 -0
- package/dist/prototype/file-handlers.d.ts.map +1 -0
- package/dist/prototype/file-handlers.js +129 -0
- package/dist/prototype/file-handlers.js.map +1 -0
- package/dist/prototype/file-schema.d.ts +47 -0
- package/dist/prototype/file-schema.d.ts.map +1 -0
- package/dist/prototype/file-schema.js +135 -0
- package/dist/prototype/file-schema.js.map +1 -0
- package/dist/prototype/file-schema.test.d.ts +2 -0
- package/dist/prototype/file-schema.test.d.ts.map +1 -0
- package/dist/prototype/file-schema.test.js +146 -0
- package/dist/prototype/file-schema.test.js.map +1 -0
- package/dist/prototype/get-and-materialize-row.d.ts +5 -0
- package/dist/prototype/get-and-materialize-row.d.ts.map +1 -0
- package/dist/prototype/get-and-materialize-row.js +99 -0
- package/dist/prototype/get-and-materialize-row.js.map +1 -0
- package/dist/prototype/json-plugin.d.ts +49 -0
- package/dist/prototype/json-plugin.d.ts.map +1 -0
- package/dist/prototype/json-plugin.js +104 -0
- package/dist/prototype/json-plugin.js.map +1 -0
- package/dist/prototype/validate-file-path.d.ts +16 -0
- package/dist/prototype/validate-file-path.d.ts.map +1 -0
- package/dist/prototype/validate-file-path.js +44 -0
- package/dist/prototype/validate-file-path.js.map +1 -0
- package/dist/prototype/validate-file-path.test.d.ts +2 -0
- package/dist/prototype/validate-file-path.test.d.ts.map +1 -0
- package/dist/prototype/validate-file-path.test.js +36 -0
- package/dist/prototype/validate-file-path.test.js.map +1 -0
- package/dist/prototype/version-schema.d.ts +34 -0
- package/dist/prototype/version-schema.d.ts.map +1 -0
- package/dist/prototype/version-schema.js +86 -0
- package/dist/prototype/version-schema.js.map +1 -0
- package/dist/prototype/version-schema.test.d.ts +2 -0
- package/dist/prototype/version-schema.test.d.ts.map +1 -0
- package/dist/prototype/version-schema.test.js +114 -0
- package/dist/prototype/version-schema.test.js.map +1 -0
- package/dist/query-filter/change-conflict-in-version.d.ts +2 -0
- package/dist/query-filter/change-conflict-in-version.d.ts.map +1 -1
- package/dist/query-filter/change-conflict-in-version.js +2 -0
- package/dist/query-filter/change-conflict-in-version.js.map +1 -1
- package/dist/query-filter/change-in-version.d.ts +2 -0
- package/dist/query-filter/change-in-version.d.ts.map +1 -1
- package/dist/query-filter/change-in-version.js +2 -0
- package/dist/query-filter/change-in-version.js.map +1 -1
- package/dist/query-filter/change-is-leaf-in-version.d.ts +1 -0
- package/dist/query-filter/change-is-leaf-in-version.d.ts.map +1 -1
- package/dist/query-filter/change-is-leaf-in-version.js +1 -0
- package/dist/query-filter/change-is-leaf-in-version.js.map +1 -1
- package/dist/query-filter/change-is-leaf-of.d.ts +2 -0
- package/dist/query-filter/change-is-leaf-of.d.ts.map +1 -1
- package/dist/query-filter/change-is-leaf-of.js +2 -0
- package/dist/query-filter/change-is-leaf-of.js.map +1 -1
- package/dist/query-filter/change-is-leaf-v2.d.ts +69 -0
- package/dist/query-filter/change-is-leaf-v2.d.ts.map +1 -0
- package/dist/query-filter/change-is-leaf-v2.js +116 -0
- package/dist/query-filter/change-is-leaf-v2.js.map +1 -0
- package/dist/query-filter/change-is-leaf-v2.test.d.ts +2 -0
- package/dist/query-filter/change-is-leaf-v2.test.d.ts.map +1 -0
- package/dist/query-filter/change-is-leaf-v2.test.js +237 -0
- package/dist/query-filter/change-is-leaf-v2.test.js.map +1 -0
- package/dist/query-filter/change-is-leaf.d.ts +2 -0
- package/dist/query-filter/change-is-leaf.d.ts.map +1 -1
- package/dist/query-filter/change-is-leaf.js +2 -0
- package/dist/query-filter/change-is-leaf.js.map +1 -1
- package/dist/query-filter/change-is-lowest-common-ancestor-of.d.ts +2 -0
- package/dist/query-filter/change-is-lowest-common-ancestor-of.d.ts.map +1 -1
- package/dist/query-filter/change-is-lowest-common-ancestor-of.js +4 -0
- package/dist/query-filter/change-is-lowest-common-ancestor-of.js.map +1 -1
- package/dist/query-filter/change-is-lowest-common-ancestor-of.test.js +5 -3
- package/dist/query-filter/change-is-lowest-common-ancestor-of.test.js.map +1 -1
- package/dist/query-filter/change-set-element-in-ancestry-of.d.ts +10 -10
- package/dist/query-filter/change-set-element-in-ancestry-of.d.ts.map +1 -1
- package/dist/query-filter/change-set-element-in-ancestry-of.js +22 -17
- package/dist/query-filter/change-set-element-in-ancestry-of.js.map +1 -1
- package/dist/query-filter/change-set-element-in-ancestry-of.test.js +99 -26
- package/dist/query-filter/change-set-element-in-ancestry-of.test.js.map +1 -1
- package/dist/query-filter/change-set-element-in-symmetric-difference-of.d.ts +21 -0
- package/dist/query-filter/change-set-element-in-symmetric-difference-of.d.ts.map +1 -0
- package/dist/query-filter/change-set-element-in-symmetric-difference-of.js +37 -0
- package/dist/query-filter/change-set-element-in-symmetric-difference-of.js.map +1 -0
- package/dist/query-filter/change-set-element-in-symmetric-difference-of.test.d.ts +2 -0
- package/dist/query-filter/change-set-element-in-symmetric-difference-of.test.d.ts.map +1 -0
- package/dist/query-filter/change-set-element-in-symmetric-difference-of.test.js +276 -0
- package/dist/query-filter/change-set-element-in-symmetric-difference-of.test.js.map +1 -0
- package/dist/query-filter/change-set-element-in-symmetric-difference.d.ts +2 -2
- package/dist/query-filter/change-set-element-in-symmetric-difference.d.ts.map +1 -1
- package/dist/query-filter/change-set-element-in-symmetric-difference.js.map +1 -1
- package/dist/query-filter/change-set-element-in-symmetric-difference.test.js.map +1 -1
- package/dist/query-filter/change-set-element-is-leaf-of.d.ts +11 -11
- package/dist/query-filter/change-set-element-is-leaf-of.d.ts.map +1 -1
- package/dist/query-filter/change-set-element-is-leaf-of.js +58 -36
- package/dist/query-filter/change-set-element-is-leaf-of.js.map +1 -1
- package/dist/query-filter/change-set-element-is-leaf-of.test.js +83 -24
- package/dist/query-filter/change-set-element-is-leaf-of.test.js.map +1 -1
- package/dist/query-filter/change-set-is-ancestor-of.d.ts +2 -2
- package/dist/query-filter/change-set-is-ancestor-of.d.ts.map +1 -1
- package/dist/query-filter/change-set-is-ancestor-of.js.map +1 -1
- package/dist/query-filter/change-set-is-descendant-of.d.ts +2 -2
- package/dist/query-filter/change-set-is-descendant-of.d.ts.map +1 -1
- package/dist/query-filter/change-set-is-descendant-of.js.map +1 -1
- package/dist/query-filter/commit-is-ancestor-of.d.ts +51 -0
- package/dist/query-filter/commit-is-ancestor-of.d.ts.map +1 -0
- package/dist/query-filter/commit-is-ancestor-of.js +63 -0
- package/dist/query-filter/commit-is-ancestor-of.js.map +1 -0
- package/dist/query-filter/commit-is-ancestor-of.test.d.ts +2 -0
- package/dist/query-filter/commit-is-ancestor-of.test.d.ts.map +1 -0
- package/dist/query-filter/commit-is-ancestor-of.test.js +292 -0
- package/dist/query-filter/commit-is-ancestor-of.test.js.map +1 -0
- package/dist/query-filter/commit-is-descendant-of.d.ts +44 -0
- package/dist/query-filter/commit-is-descendant-of.d.ts.map +1 -0
- package/dist/query-filter/commit-is-descendant-of.js +56 -0
- package/dist/query-filter/commit-is-descendant-of.js.map +1 -0
- package/dist/query-filter/commit-is-descendant-of.test.d.ts +2 -0
- package/dist/query-filter/commit-is-descendant-of.test.d.ts.map +1 -0
- package/dist/query-filter/commit-is-descendant-of.test.js +325 -0
- package/dist/query-filter/commit-is-descendant-of.test.js.map +1 -0
- package/dist/query-filter/index.d.ts +2 -4
- package/dist/query-filter/index.d.ts.map +1 -1
- package/dist/query-filter/index.js +2 -4
- package/dist/query-filter/index.js.map +1 -1
- package/dist/query-filter/version-change-in-difference.d.ts +2 -0
- package/dist/query-filter/version-change-in-difference.d.ts.map +1 -1
- package/dist/query-filter/version-change-in-difference.js +2 -0
- package/dist/query-filter/version-change-in-difference.js.map +1 -1
- package/dist/query-filter/version-change-in-symmetric-difference.d.ts +2 -0
- package/dist/query-filter/version-change-in-symmetric-difference.d.ts.map +1 -1
- package/dist/query-filter/version-change-in-symmetric-difference.js +2 -0
- package/dist/query-filter/version-change-in-symmetric-difference.js.map +1 -1
- package/dist/schema-definition/definition.d.ts +73 -30
- package/dist/schema-definition/definition.d.ts.map +1 -1
- package/dist/schema-definition/definition.js +38 -14
- package/dist/schema-definition/definition.js.map +1 -1
- package/dist/schema-definition/definition.test.js +70 -25
- package/dist/schema-definition/definition.test.js.map +1 -1
- package/dist/schema-definition/validate-lix-schema.d.ts.map +1 -1
- package/dist/schema-definition/validate-lix-schema.js.map +1 -1
- package/dist/schema-definition/validate-lix-schema.test.js +1 -1
- package/dist/schema-definition/validate-lix-schema.test.js.map +1 -1
- package/dist/server-protocol-handler/environment/create-in-memory-environment.test.js +2 -2
- package/dist/server-protocol-handler/environment/create-in-memory-environment.test.js.map +1 -1
- package/dist/server-protocol-handler/routes/push-v1.test.js +1 -1
- package/dist/server-protocol-handler/routes/push-v1.test.js.map +1 -1
- package/dist/services/env-variables/index.js +1 -1
- package/dist/services/env-variables/index.js.map +1 -1
- package/dist/snapshot/create-snapshot.d.ts +2 -2
- package/dist/snapshot/create-snapshot.d.ts.map +1 -1
- package/dist/snapshot/create-snapshot.test.js +3 -3
- package/dist/snapshot/create-snapshot.test.js.map +1 -1
- package/dist/snapshot/database-schema.d.ts +19 -0
- package/dist/snapshot/database-schema.d.ts.map +1 -0
- package/dist/snapshot/database-schema.js +33 -0
- package/dist/snapshot/database-schema.js.map +1 -0
- package/dist/snapshot/database-schema.test.d.ts +2 -0
- package/dist/snapshot/database-schema.test.d.ts.map +1 -0
- package/dist/snapshot/database-schema.test.js +58 -0
- package/dist/snapshot/database-schema.test.js.map +1 -0
- package/dist/snapshot/schema.d.ts.map +1 -1
- package/dist/snapshot/schema.js +10 -2
- package/dist/snapshot/schema.js.map +1 -1
- package/dist/snapshot/schema.test.js +86 -0
- package/dist/snapshot/schema.test.js.map +1 -1
- package/dist/state/cache/clear-state-cache.d.ts +8 -0
- package/dist/state/cache/clear-state-cache.d.ts.map +1 -0
- package/dist/state/cache/clear-state-cache.js +14 -0
- package/dist/state/cache/clear-state-cache.js.map +1 -0
- package/dist/state/cache/clear-state-cache.test.d.ts +2 -0
- package/dist/state/cache/clear-state-cache.test.d.ts.map +1 -0
- package/dist/state/cache/clear-state-cache.test.js +34 -0
- package/dist/state/cache/clear-state-cache.test.js.map +1 -0
- package/dist/state/cache/is-stale-state-cache.d.ts +5 -0
- package/dist/state/cache/is-stale-state-cache.d.ts.map +1 -0
- package/dist/state/cache/is-stale-state-cache.js +22 -0
- package/dist/state/cache/is-stale-state-cache.js.map +1 -0
- package/dist/state/cache/is-stale-state-cache.test.d.ts +2 -0
- package/dist/state/cache/is-stale-state-cache.test.d.ts.map +1 -0
- package/dist/state/cache/is-stale-state-cache.test.js +27 -0
- package/dist/state/cache/is-stale-state-cache.test.js.map +1 -0
- package/dist/state/cache/mark-state-cache-as-stale.d.ts +10 -0
- package/dist/state/cache/mark-state-cache-as-stale.d.ts.map +1 -0
- package/dist/state/cache/mark-state-cache-as-stale.js +42 -0
- package/dist/state/cache/mark-state-cache-as-stale.js.map +1 -0
- package/dist/state/cache/populate-state-cache.d.ts +9 -0
- package/dist/state/cache/populate-state-cache.d.ts.map +1 -0
- package/dist/state/cache/populate-state-cache.js +106 -0
- package/dist/state/cache/populate-state-cache.js.map +1 -0
- package/dist/state/cache/populate-state-cache.test.d.ts +2 -0
- package/dist/state/cache/populate-state-cache.test.d.ts.map +1 -0
- package/dist/state/cache/populate-state-cache.test.js +204 -0
- package/dist/state/cache/populate-state-cache.test.js.map +1 -0
- package/dist/state/cache/schema.d.ts +20 -0
- package/dist/state/cache/schema.d.ts.map +1 -0
- package/dist/state/cache/schema.js +21 -0
- package/dist/state/cache/schema.js.map +1 -0
- package/dist/state/cache/update-state-cache.d.ts +21 -0
- package/dist/state/cache/update-state-cache.d.ts.map +1 -0
- package/dist/state/cache/update-state-cache.js +294 -0
- package/dist/state/cache/update-state-cache.js.map +1 -0
- package/dist/state/cache/update-state-cache.test.d.ts +2 -0
- package/dist/state/cache/update-state-cache.test.d.ts.map +1 -0
- package/dist/state/cache/update-state-cache.test.js +440 -0
- package/dist/state/cache/update-state-cache.test.js.map +1 -0
- package/dist/state/commit.d.ts +18 -0
- package/dist/state/commit.d.ts.map +1 -0
- package/dist/state/commit.js +457 -0
- package/dist/state/commit.js.map +1 -0
- package/dist/state/commit.test.d.ts +2 -0
- package/dist/state/commit.test.d.ts.map +1 -0
- package/dist/state/commit.test.js +1173 -0
- package/dist/state/commit.test.js.map +1 -0
- package/dist/state/get-version-record-by-id-or-throw.d.ts +2 -2
- package/dist/state/get-version-record-by-id-or-throw.d.ts.map +1 -1
- package/dist/state/get-version-record-by-id-or-throw.js.map +1 -1
- package/dist/state/handle-state-mutation.d.ts +0 -12
- package/dist/state/handle-state-mutation.d.ts.map +1 -1
- package/dist/state/handle-state-mutation.js +11 -206
- package/dist/state/handle-state-mutation.js.map +1 -1
- package/dist/state/handle-state-mutation.test.js +213 -159
- package/dist/state/handle-state-mutation.test.js.map +1 -1
- package/dist/state/insert-transaction-state.d.ts +71 -0
- package/dist/state/insert-transaction-state.d.ts.map +1 -0
- package/dist/state/insert-transaction-state.js +272 -0
- package/dist/state/insert-transaction-state.js.map +1 -0
- package/dist/state/insert-transaction-state.test.d.ts +2 -0
- package/dist/state/insert-transaction-state.test.d.ts.map +1 -0
- package/dist/state/insert-transaction-state.test.js +789 -0
- package/dist/state/insert-transaction-state.test.js.map +1 -0
- package/dist/state/materialize-state.d.ts +3 -0
- package/dist/state/materialize-state.d.ts.map +1 -0
- package/dist/state/materialize-state.js +230 -0
- package/dist/state/materialize-state.js.map +1 -0
- package/dist/state/materialize-state.test.d.ts +2 -0
- package/dist/state/materialize-state.test.d.ts.map +1 -0
- package/dist/state/materialize-state.test.js +1934 -0
- package/dist/state/materialize-state.test.js.map +1 -0
- package/dist/state/primary-key.d.ts +39 -0
- package/dist/state/primary-key.d.ts.map +1 -0
- package/dist/state/primary-key.js +62 -0
- package/dist/state/primary-key.js.map +1 -0
- package/dist/state/primary-key.test.d.ts +2 -0
- package/dist/state/primary-key.test.d.ts.map +1 -0
- package/dist/state/primary-key.test.js +114 -0
- package/dist/state/primary-key.test.js.map +1 -0
- package/dist/state/resolved-state-view.d.ts +33 -0
- package/dist/state/resolved-state-view.d.ts.map +1 -0
- package/dist/state/resolved-state-view.js +182 -0
- package/dist/state/resolved-state-view.js.map +1 -0
- package/dist/state/resolved-state-view.test.d.ts +2 -0
- package/dist/state/resolved-state-view.test.d.ts.map +1 -0
- package/dist/state/resolved-state-view.test.js +433 -0
- package/dist/state/resolved-state-view.test.js.map +1 -0
- package/dist/state/schema.d.ts +6 -19
- package/dist/state/schema.d.ts.map +1 -1
- package/dist/state/schema.js +533 -796
- package/dist/state/schema.js.map +1 -1
- package/dist/state/schema.test.js +1684 -1013
- package/dist/state/schema.test.js.map +1 -1
- package/dist/state/untracked/schema.d.ts +25 -0
- package/dist/state/untracked/schema.d.ts.map +1 -0
- package/dist/state/untracked/schema.js +38 -0
- package/dist/state/untracked/schema.js.map +1 -0
- package/dist/state/untracked/schema.test.d.ts +2 -0
- package/dist/state/untracked/schema.test.d.ts.map +1 -0
- package/dist/state/untracked/schema.test.js +275 -0
- package/dist/state/untracked/schema.test.js.map +1 -0
- package/dist/state/untracked/update-untracked-state.d.ts +36 -0
- package/dist/state/untracked/update-untracked-state.d.ts.map +1 -0
- package/dist/state/untracked/update-untracked-state.js +113 -0
- package/dist/state/untracked/update-untracked-state.js.map +1 -0
- package/dist/state/untracked/update-untracked-state.test.d.ts +2 -0
- package/dist/state/untracked/update-untracked-state.test.d.ts.map +1 -0
- package/dist/state/untracked/update-untracked-state.test.js +417 -0
- package/dist/state/untracked/update-untracked-state.test.js.map +1 -0
- package/dist/state/validate-snapshot-content.d.ts +9 -0
- package/dist/state/validate-snapshot-content.d.ts.map +1 -0
- package/dist/state/validate-snapshot-content.js +42 -0
- package/dist/state/validate-snapshot-content.js.map +1 -0
- package/dist/state/validate-snapshot-content.test.d.ts +2 -0
- package/dist/state/validate-snapshot-content.test.d.ts.map +1 -0
- package/dist/state/validate-snapshot-content.test.js +67 -0
- package/dist/state/validate-snapshot-content.test.js.map +1 -0
- package/dist/state/validate-state-mutation.d.ts +2 -2
- package/dist/state/validate-state-mutation.d.ts.map +1 -1
- package/dist/state/validate-state-mutation.js +211 -51
- package/dist/state/validate-state-mutation.js.map +1 -1
- package/dist/state/validate-state-mutation.test.js +910 -75
- package/dist/state/validate-state-mutation.test.js.map +1 -1
- package/dist/state-history/schema.d.ts +29 -19
- package/dist/state-history/schema.d.ts.map +1 -1
- package/dist/state-history/schema.js +49 -37
- package/dist/state-history/schema.js.map +1 -1
- package/dist/state-history/schema.test.js +221 -67
- package/dist/state-history/schema.test.js.map +1 -1
- package/dist/stored-schema/index.d.ts +1 -1
- package/dist/stored-schema/index.d.ts.map +1 -1
- package/dist/stored-schema/index.js +1 -1
- package/dist/stored-schema/index.js.map +1 -1
- package/dist/stored-schema/schema.d.ts +1 -1
- package/dist/stored-schema/schema.d.ts.map +1 -1
- package/dist/stored-schema/schema.test.js.map +1 -1
- package/dist/sync/push-to-server.test.js.map +1 -1
- package/dist/test-utilities/simulation-test/cache-miss-simulation.d.ts +8 -0
- package/dist/test-utilities/simulation-test/cache-miss-simulation.d.ts.map +1 -0
- package/dist/test-utilities/simulation-test/cache-miss-simulation.js +79 -0
- package/dist/test-utilities/simulation-test/cache-miss-simulation.js.map +1 -0
- package/dist/test-utilities/simulation-test/cache-miss-simulation.test.d.ts +2 -0
- package/dist/test-utilities/simulation-test/cache-miss-simulation.test.d.ts.map +1 -0
- package/dist/test-utilities/simulation-test/cache-miss-simulation.test.js +127 -0
- package/dist/test-utilities/simulation-test/cache-miss-simulation.test.js.map +1 -0
- package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.d.ts +2 -0
- package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.d.ts.map +1 -0
- package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.js +2 -0
- package/dist/test-utilities/simulation-test/chaotic-timestamp-simulation.js.map +1 -0
- package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.d.ts +10 -0
- package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.d.ts.map +1 -0
- package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.js +52 -0
- package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.js.map +1 -0
- package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.d.ts +2 -0
- package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.d.ts.map +1 -0
- package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.js +71 -0
- package/dist/test-utilities/simulation-test/out-of-order-sequence-simulation.test.js.map +1 -0
- package/dist/test-utilities/simulation-test/simulation-test.d.ts +82 -0
- package/dist/test-utilities/simulation-test/simulation-test.d.ts.map +1 -0
- package/dist/test-utilities/simulation-test/simulation-test.js +85 -0
- package/dist/test-utilities/simulation-test/simulation-test.js.map +1 -0
- package/dist/test-utilities/simulation-test/simulation-test.test.d.ts +2 -0
- package/dist/test-utilities/simulation-test/simulation-test.test.d.ts.map +1 -0
- package/dist/test-utilities/simulation-test/simulation-test.test.js +310 -0
- package/dist/test-utilities/simulation-test/simulation-test.test.js.map +1 -0
- package/dist/thread/comment-utils.d.ts +2 -0
- package/dist/thread/comment-utils.d.ts.map +1 -0
- package/dist/thread/comment-utils.js +2 -0
- package/dist/thread/comment-utils.js.map +1 -0
- package/dist/thread/comment.d.ts +24 -0
- package/dist/thread/comment.d.ts.map +1 -0
- package/dist/thread/comment.js +43 -0
- package/dist/thread/comment.js.map +1 -0
- package/dist/thread/create-thread-comment.d.ts +2 -2
- package/dist/thread/create-thread-comment.d.ts.map +1 -1
- package/dist/thread/create-thread-comment.js +20 -3
- package/dist/thread/create-thread-comment.js.map +1 -1
- package/dist/thread/create-thread-comment.test.js +49 -3
- package/dist/thread/create-thread-comment.test.js.map +1 -1
- package/dist/thread/create-thread.d.ts +18 -4
- package/dist/thread/create-thread.d.ts.map +1 -1
- package/dist/thread/create-thread.js +24 -3
- package/dist/thread/create-thread.js.map +1 -1
- package/dist/thread/create-thread.test.js +149 -0
- package/dist/thread/create-thread.test.js.map +1 -1
- package/dist/thread/database-schema.d.ts +20 -0
- package/dist/thread/database-schema.d.ts.map +1 -0
- package/dist/thread/database-schema.js +57 -0
- package/dist/thread/database-schema.js.map +1 -0
- package/dist/thread/database-schema.test.d.ts +2 -0
- package/dist/thread/database-schema.test.d.ts.map +1 -0
- package/dist/thread/database-schema.test.js +59 -0
- package/dist/thread/database-schema.test.js.map +1 -0
- package/dist/thread/index.d.ts +2 -1
- package/dist/thread/index.d.ts.map +1 -1
- package/dist/thread/schema.d.ts +13 -10
- package/dist/thread/schema.d.ts.map +1 -1
- package/dist/thread/schema.js +20 -14
- package/dist/thread/schema.js.map +1 -1
- package/dist/thread/schema.test.js +65 -0
- package/dist/thread/schema.test.js.map +1 -1
- package/dist/version/create-version.d.ts +14 -9
- package/dist/version/create-version.d.ts.map +1 -1
- package/dist/version/create-version.js +40 -12
- package/dist/version/create-version.js.map +1 -1
- package/dist/version/create-version.test.js +80 -25
- package/dist/version/create-version.test.js.map +1 -1
- package/dist/version/database-schema.d.ts +21 -0
- package/dist/version/database-schema.d.ts.map +1 -0
- package/dist/version/database-schema.js +169 -0
- package/dist/version/database-schema.js.map +1 -0
- package/dist/version/database-schema.test.d.ts +2 -0
- package/dist/version/database-schema.test.d.ts.map +1 -0
- package/dist/version/database-schema.test.js +625 -0
- package/dist/version/database-schema.test.js.map +1 -0
- package/dist/version/index.d.ts +1 -1
- package/dist/version/index.d.ts.map +1 -1
- package/dist/version/merge-version.d.ts +3 -0
- package/dist/version/merge-version.d.ts.map +1 -1
- package/dist/version/merge-version.js +3 -0
- package/dist/version/merge-version.js.map +1 -1
- package/dist/version/merge-version.test.js +10 -5
- package/dist/version/merge-version.test.js.map +1 -1
- package/dist/version/schema.d.ts +28 -23
- package/dist/version/schema.d.ts.map +1 -1
- package/dist/version/schema.js +42 -30
- package/dist/version/schema.js.map +1 -1
- package/dist/version/schema.test.js +311 -88
- package/dist/version/schema.test.js.map +1 -1
- package/dist/version/select-active-version.d.ts +7 -0
- package/dist/version/select-active-version.d.ts.map +1 -0
- package/dist/version/select-active-version.js +7 -0
- package/dist/version/select-active-version.js.map +1 -0
- package/dist/version/switch-version.d.ts +3 -3
- package/dist/version/switch-version.d.ts.map +1 -1
- package/dist/version/switch-version.js +1 -1
- package/dist/version/switch-version.test.js +1 -1
- package/dist/version/switch-version.test.js.map +1 -1
- package/dist/version/update-changes-in-version.d.ts +2 -0
- package/dist/version/update-changes-in-version.d.ts.map +1 -1
- package/dist/version/update-changes-in-version.js +2 -0
- package/dist/version/update-changes-in-version.js.map +1 -1
- package/dist/version-v2/create-version.d.ts +18 -0
- package/dist/version-v2/create-version.d.ts.map +1 -0
- package/dist/version-v2/create-version.js +35 -0
- package/dist/version-v2/create-version.js.map +1 -0
- package/dist/version-v2/create-version.test.d.ts +2 -0
- package/dist/version-v2/create-version.test.d.ts.map +1 -0
- package/dist/version-v2/create-version.test.js +88 -0
- package/dist/version-v2/create-version.test.js.map +1 -0
- package/dist/version-v2/database-schema.d.ts +21 -0
- package/dist/version-v2/database-schema.d.ts.map +1 -0
- package/dist/version-v2/database-schema.js +169 -0
- package/dist/version-v2/database-schema.js.map +1 -0
- package/dist/version-v2/database-schema.test.d.ts +2 -0
- package/dist/version-v2/database-schema.test.d.ts.map +1 -0
- package/dist/version-v2/database-schema.test.js +625 -0
- package/dist/version-v2/database-schema.test.js.map +1 -0
- package/dist/version-v2/index.d.ts +2 -0
- package/dist/version-v2/index.d.ts.map +1 -0
- package/dist/version-v2/index.js +2 -0
- package/dist/version-v2/index.js.map +1 -0
- package/dist/version-v2/swich-version.d.ts +27 -0
- package/dist/version-v2/swich-version.d.ts.map +1 -0
- package/dist/version-v2/swich-version.js +46 -0
- package/dist/version-v2/swich-version.js.map +1 -0
- package/dist/version-v2/switch-version.d.ts +27 -0
- package/dist/version-v2/switch-version.d.ts.map +1 -0
- package/dist/version-v2/switch-version.js +91 -0
- package/dist/version-v2/switch-version.js.map +1 -0
- package/dist/version-v2/switch-version.test.d.ts +2 -0
- package/dist/version-v2/switch-version.test.d.ts.map +1 -0
- package/dist/version-v2/switch-version.test.js +110 -0
- package/dist/version-v2/switch-version.test.js.map +1 -0
- package/dist/version-v2/with-skip-update-working-change-set.d.ts +3 -0
- package/dist/version-v2/with-skip-update-working-change-set.d.ts.map +1 -0
- package/dist/version-v2/with-skip-update-working-change-set.js +50 -0
- package/dist/version-v2/with-skip-update-working-change-set.js.map +1 -0
- package/dist/version-v2/with-skip-update-working-change-set.test.d.ts +2 -0
- package/dist/version-v2/with-skip-update-working-change-set.test.d.ts.map +1 -0
- package/dist/version-v2/with-skip-update-working-change-set.test.js +49 -0
- package/dist/version-v2/with-skip-update-working-change-set.test.js.map +1 -0
- package/package.json +3 -3
- package/src/account/create-account.ts +7 -7
- package/src/account/index.ts +2 -2
- package/src/account/schema.test.ts +99 -99
- package/src/account/schema.ts +91 -35
- package/src/account/switch-account.test.ts +4 -4
- package/src/account/switch-account.ts +6 -6
- package/src/change/index.ts +4 -1
- package/src/change/schema.test.ts +38 -0
- package/src/change/schema.ts +91 -11
- package/src/change-author/index.ts +4 -1
- package/src/change-author/schema.test.ts +306 -242
- package/src/change-author/schema.ts +18 -12
- package/src/change-proposal/create-change-proposal.ts +3 -3
- package/src/change-proposal/database-schema.ts +1 -1
- package/src/change-set/apply-change-set.test.ts +10 -7
- package/src/change-set/apply-change-set.ts +44 -56
- package/src/change-set/create-change-set.test.ts +0 -39
- package/src/change-set/create-change-set.ts +9 -33
- package/src/change-set/index.ts +3 -11
- package/src/change-set/schema.test.ts +0 -310
- package/src/change-set/schema.ts +43 -100
- package/src/commit/apply-commit.test.ts +426 -0
- package/src/commit/apply-commit.ts +74 -0
- package/src/{change-set → commit}/create-checkpoint.test.ts +244 -26
- package/src/commit/create-checkpoint.ts +140 -0
- package/src/commit/create-commit.ts +80 -0
- package/src/{change-set/create-merge-change-set.test.ts → commit/create-merge-commit.test.ts} +50 -19
- package/src/{change-set/create-merge-change-set.ts → commit/create-merge-commit.ts} +55 -16
- package/src/{change-set/create-transition-change-set.test.ts → commit/create-transition-commit.test.ts} +43 -32
- package/src/{change-set/create-transition-change-set.ts → commit/create-transition-commit.ts} +60 -22
- package/src/{change-set/create-undo-change-set.test.ts → commit/create-undo-commit.test.ts} +52 -23
- package/src/{change-set/create-undo-change-set.ts → commit/create-undo-commit.ts} +59 -26
- package/src/commit/index.ts +11 -0
- package/src/commit/schema.test.ts +257 -0
- package/src/commit/schema.ts +104 -0
- package/src/database/index.ts +0 -2
- package/src/database/init-db.ts +113 -45
- package/src/database/kysely-plugin/json-column-plugin.test.ts +404 -0
- package/src/database/kysely-plugin/json-column-plugin.ts +80 -15
- package/src/database/nano-id.test.ts +3 -3
- package/src/database/nano-id.ts +4 -1
- package/src/database/schema.ts +26 -24
- package/src/deterministic/generate-human-id.test.ts +154 -0
- package/src/deterministic/generate-human-id.ts +94 -0
- package/src/deterministic/index.ts +7 -0
- package/src/deterministic/is-deterministic-mode.test.ts +133 -0
- package/src/deterministic/is-deterministic-mode.ts +32 -0
- package/src/deterministic/nano-id.test.ts +200 -0
- package/src/deterministic/nano-id.ts +188 -0
- package/src/deterministic/options.test.ts +157 -0
- package/src/deterministic/options.ts +62 -0
- package/src/deterministic/random.test.ts +293 -0
- package/src/deterministic/random.ts +261 -0
- package/src/deterministic/sequence.test.ts +93 -0
- package/src/deterministic/sequence.ts +132 -0
- package/src/deterministic/timestamp.test.ts +170 -0
- package/src/deterministic/timestamp.ts +83 -0
- package/src/deterministic/uuid-v7.test.ts +144 -0
- package/src/deterministic/uuid-v7.ts +82 -0
- package/src/entity/eb-entity.test.ts +687 -0
- package/src/entity/eb-entity.ts +203 -0
- package/src/entity/index.ts +12 -0
- package/src/entity/label/create-entity-label.test.ts +316 -0
- package/src/entity/label/create-entity-label.ts +113 -0
- package/src/entity/label/schema.test.ts +692 -0
- package/src/entity/label/schema.ts +55 -0
- package/src/entity/schema.ts +22 -0
- package/src/entity/thread/create-entity-thread.test.ts +282 -0
- package/src/entity/thread/create-entity-thread.ts +134 -0
- package/src/entity/thread/query-threads.test.ts +394 -0
- package/src/entity/thread/schema.test.ts +170 -0
- package/src/entity/thread/schema.ts +55 -0
- package/src/entity-views/README.md +214 -0
- package/src/entity-views/entity-state-all.test.ts +202 -0
- package/src/entity-views/entity-state-all.ts +80 -11
- package/src/entity-views/entity-state-history.test.ts +78 -16
- package/src/entity-views/entity-state-history.ts +68 -19
- package/src/entity-views/entity-state.test.ts +141 -1
- package/src/entity-views/entity-state.ts +79 -10
- package/src/entity-views/entity-view-builder.test.ts +6 -6
- package/src/entity-views/types.ts +2 -2
- package/src/file/file-handlers.test.ts +4 -4
- package/src/file/file-handlers.ts +40 -0
- package/src/file/materialize-file-data-at-commit.ts +157 -0
- package/src/file/schema.test.ts +693 -37
- package/src/file/schema.ts +183 -56
- package/src/hooks/create-hooks.ts +7 -40
- package/src/index.ts +3 -0
- package/src/key-value/index.ts +1 -1
- package/src/key-value/schema.test.ts +103 -2
- package/src/key-value/schema.ts +66 -5
- package/src/label/create-label.ts +7 -7
- package/src/label/index.ts +1 -1
- package/src/label/schema.ts +7 -10
- package/src/lix/new-lix.test.ts +202 -2
- package/src/lix/new-lix.ts +305 -81
- package/src/lix/open-lix.test.ts +308 -5
- package/src/lix/open-lix.ts +169 -68
- package/src/lix/storage/in-memory.test.ts +9 -83
- package/src/lix/storage/in-memory.ts +13 -18
- package/src/lix/storage/lix-storage-adapter.ts +41 -5
- package/src/lix/storage/opfs.test.ts +254 -31
- package/src/lix/storage/opfs.ts +178 -40
- package/src/log/create-lix-own-log.test.ts +11 -7
- package/src/log/create-lix-own-log.ts +21 -32
- package/src/log/create-log.ts +4 -4
- package/src/log/index.ts +1 -1
- package/src/log/schema.ts +6 -10
- package/src/observe/create-observe.test.ts +395 -60
- package/src/observe/create-observe.ts +41 -3
- package/src/observe/determine-schema-keys.test.ts +371 -0
- package/src/observe/determine-schema-keys.ts +165 -0
- package/src/plugin/lix-plugin.ts +3 -3
- package/src/query-filter/change-set-element-in-ancestry-of.test.ts +112 -26
- package/src/query-filter/change-set-element-in-ancestry-of.ts +25 -20
- package/src/query-filter/change-set-element-in-symmetric-difference.test.ts +6 -6
- package/src/query-filter/change-set-element-in-symmetric-difference.ts +3 -3
- package/src/query-filter/change-set-element-is-leaf-of.test.ts +83 -24
- package/src/query-filter/change-set-element-is-leaf-of.ts +61 -39
- package/src/query-filter/commit-is-ancestor-of.test.ts +333 -0
- package/src/query-filter/commit-is-ancestor-of.ts +77 -0
- package/src/query-filter/commit-is-descendant-of.test.ts +365 -0
- package/src/query-filter/commit-is-descendant-of.ts +70 -0
- package/src/query-filter/index.ts +2 -4
- package/src/schema-definition/definition.test.ts +73 -25
- package/src/schema-definition/definition.ts +87 -30
- package/src/schema-definition/index.ts +1 -1
- package/src/schema-definition/validate-lix-schema.test.ts +14 -5
- package/src/schema-definition/validate-lix-schema.ts +9 -13
- package/src/server-protocol-handler/environment/create-in-memory-environment.test.ts +2 -2
- package/src/server-protocol-handler/routes/push-v1.test.ts +1 -1
- package/src/snapshot/schema.test.ts +113 -0
- package/src/snapshot/schema.ts +10 -2
- package/src/state/README.md +95 -0
- package/src/state/cache/clear-state-cache.test.ts +43 -0
- package/src/state/cache/clear-state-cache.ts +16 -0
- package/src/state/cache/is-stale-state-cache.test.ts +35 -0
- package/src/state/cache/is-stale-state-cache.ts +29 -0
- package/src/state/cache/mark-state-cache-as-stale.ts +53 -0
- package/src/state/cache/populate-state-cache.test.ts +259 -0
- package/src/state/cache/populate-state-cache.ts +124 -0
- package/src/state/cache/schema.ts +41 -0
- package/src/state/cache/update-state-cache.test.ts +510 -0
- package/src/state/cache/update-state-cache.ts +317 -0
- package/src/state/commit.test.ts +1402 -0
- package/src/state/commit.ts +587 -0
- package/src/state/insert-transaction-state.test.ts +928 -0
- package/src/state/insert-transaction-state.ts +306 -0
- package/src/state/materialize-state.test.ts +2358 -0
- package/src/state/materialize-state.ts +235 -0
- package/src/state/primary-key.test.ts +158 -0
- package/src/state/primary-key.ts +80 -0
- package/src/state/resolved-state-view.test.ts +521 -0
- package/src/state/resolved-state-view.ts +202 -0
- package/src/state/schema.test.ts +3116 -2272
- package/src/state/schema.ts +614 -910
- package/src/state/untracked/schema.test.ts +301 -0
- package/src/state/untracked/schema.ts +55 -0
- package/src/state/untracked/update-untracked-state.test.ts +466 -0
- package/src/state/untracked/update-untracked-state.ts +133 -0
- package/src/state/validate-state-mutation.test.ts +1032 -77
- package/src/state/validate-state-mutation.ts +270 -68
- package/src/state-history/schema.test.ts +246 -71
- package/src/state-history/schema.ts +78 -55
- package/src/stored-schema/index.ts +4 -1
- package/src/stored-schema/schema.test.ts +7 -7
- package/src/stored-schema/schema.ts +1 -1
- package/src/sync/push-to-server.test.ts +6 -6
- package/src/test-utilities/simulation-test/cache-miss-simulation.test.ts +162 -0
- package/src/test-utilities/simulation-test/cache-miss-simulation.ts +99 -0
- package/src/test-utilities/simulation-test/chaotic-timestamp-simulation.ts +0 -0
- package/src/test-utilities/simulation-test/out-of-order-sequence-simulation.test.ts +88 -0
- package/src/test-utilities/simulation-test/out-of-order-sequence-simulation.ts +69 -0
- package/src/test-utilities/simulation-test/simulation-test.test.ts +400 -0
- package/src/test-utilities/simulation-test/simulation-test.ts +176 -0
- package/src/thread/create-thread-comment.test.ts +62 -3
- package/src/thread/create-thread-comment.ts +34 -6
- package/src/thread/create-thread.test.ts +180 -0
- package/src/thread/create-thread.ts +32 -7
- package/src/thread/index.ts +3 -2
- package/src/thread/schema.test.ts +81 -0
- package/src/thread/schema.ts +24 -19
- package/src/version/create-version.test.ts +92 -26
- package/src/version/create-version.ts +49 -19
- package/src/version/index.ts +2 -2
- package/src/version/schema.test.ts +328 -92
- package/src/version/schema.ts +47 -33
- package/src/version/select-active-version.ts +18 -0
- package/src/version/switch-version.test.ts +1 -1
- package/src/version/switch-version.ts +3 -3
- package/dist/entity-views/entity-state_history.d.ts +0 -67
- package/dist/entity-views/entity-state_history.d.ts.map +0 -1
- package/dist/entity-views/entity-state_history.js +0 -58
- package/dist/entity-views/entity-state_history.js.map +0 -1
- package/dist/entity-views/generic-types.d.ts +0 -128
- package/dist/entity-views/generic-types.d.ts.map +0 -1
- package/dist/entity-views/generic-types.js +0 -2
- package/dist/entity-views/generic-types.js.map +0 -1
- package/dist/entity-views/generic-types.test.d.ts +0 -2
- package/dist/entity-views/generic-types.test.d.ts.map +0 -1
- package/dist/entity-views/generic-types.test.js +0 -99
- package/dist/entity-views/generic-types.test.js.map +0 -1
- package/dist/lix/to-blob.test.d.ts +0 -2
- package/dist/lix/to-blob.test.d.ts.map +0 -1
- package/dist/lix/to-blob.test.js +0 -18
- package/dist/lix/to-blob.test.js.map +0 -1
- package/dist/repository/comparison-example.js +0 -173
- package/dist/repository/comparison-example.js.map +0 -1
- package/dist/repository/entity-repository.d.ts +0 -53
- package/dist/repository/entity-repository.d.ts.map +0 -1
- package/dist/repository/entity-repository.js +0 -187
- package/dist/repository/entity-repository.js.map +0 -1
- package/dist/repository/entity-repository.test.d.ts +0 -2
- package/dist/repository/entity-repository.test.d.ts.map +0 -1
- package/dist/repository/entity-repository.test.js +0 -94
- package/dist/repository/entity-repository.test.js.map +0 -1
- package/dist/repository/example.d.ts +0 -6
- package/dist/repository/example.d.ts.map +0 -1
- package/dist/repository/example.js +0 -87
- package/dist/repository/example.js.map +0 -1
- package/dist/repository/file-repository.d.ts +0 -39
- package/dist/repository/file-repository.d.ts.map +0 -1
- package/dist/repository/file-repository.js +0 -93
- package/dist/repository/file-repository.js.map +0 -1
- package/dist/repository/file-repository.test.d.ts +0 -2
- package/dist/repository/file-repository.test.d.ts.map +0 -1
- package/dist/repository/file-repository.test.js +0 -165
- package/dist/repository/file-repository.test.js.map +0 -1
- package/dist/repository/index.d.ts +0 -6
- package/dist/repository/index.d.ts.map +0 -1
- package/dist/repository/index.js +0 -6
- package/dist/repository/index.js.map +0 -1
- package/dist/repository/integration.test.d.ts +0 -2
- package/dist/repository/integration.test.d.ts.map +0 -1
- package/dist/repository/integration.test.js +0 -136
- package/dist/repository/integration.test.js.map +0 -1
- package/dist/repository/key-value-repository.d.ts +0 -30
- package/dist/repository/key-value-repository.d.ts.map +0 -1
- package/dist/repository/key-value-repository.js +0 -60
- package/dist/repository/key-value-repository.js.map +0 -1
- package/dist/repository/key-value-repository.test.d.ts +0 -2
- package/dist/repository/key-value-repository.test.d.ts.map +0 -1
- package/dist/repository/key-value-repository.test.js +0 -122
- package/dist/repository/key-value-repository.test.js.map +0 -1
- package/dist/repository/markdown-plugin-example.js +0 -118
- package/dist/repository/markdown-plugin-example.js.map +0 -1
- package/dist/repository/query-builder.d.ts +0 -69
- package/dist/repository/query-builder.d.ts.map +0 -1
- package/dist/repository/query-builder.js +0 -155
- package/dist/repository/query-builder.js.map +0 -1
- package/dist/repository/query-builder.test.d.ts +0 -2
- package/dist/repository/query-builder.test.d.ts.map +0 -1
- package/dist/repository/query-builder.test.js +0 -244
- package/dist/repository/query-builder.test.js.map +0 -1
- package/dist/repository/repository-manager.d.ts +0 -27
- package/dist/repository/repository-manager.d.ts.map +0 -1
- package/dist/repository/repository-manager.js +0 -19
- package/dist/repository/repository-manager.js.map +0 -1
- package/dist/repository/repository-manager.test.d.ts +0 -2
- package/dist/repository/repository-manager.test.d.ts.map +0 -1
- package/dist/repository/repository-manager.test.js +0 -65
- package/dist/repository/repository-manager.test.js.map +0 -1
- package/dist/repository/test-helpers.js +0 -402
- package/dist/repository/test-helpers.js.map +0 -1
- package/dist/schema-definition/lix-generated.test.d.ts +0 -2
- package/dist/schema-definition/lix-generated.test.d.ts.map +0 -1
- package/dist/schema-definition/lix-generated.test.js +0 -127
- package/dist/schema-definition/lix-generated.test.js.map +0 -1
- package/dist/state/entity-view-builder.d.ts +0 -145
- package/dist/state/entity-view-builder.d.ts.map +0 -1
- package/dist/state/entity-view-builder.js +0 -280
- package/dist/state/entity-view-builder.js.map +0 -1
- package/dist/state/entity-view-builder.test.d.ts +0 -2
- package/dist/state/entity-view-builder.test.d.ts.map +0 -1
- package/dist/state/entity-view-builder.test.js +0 -523
- package/dist/state/entity-view-builder.test.js.map +0 -1
- package/src/change-set/create-checkpoint.ts +0 -101
- package/src/file/materialize-file-data-at-changeset.ts +0 -123
- package/src/query-filter/change-has-label.test.ts +0 -79
- package/src/query-filter/change-has-label.ts +0 -45
- package/src/query-filter/change-set-has-label.test.ts +0 -42
- package/src/query-filter/change-set-has-label.ts +0 -50
- package/src/query-filter/change-set-is-ancestor-of.test.ts +0 -178
- package/src/query-filter/change-set-is-ancestor-of.ts +0 -77
- package/src/query-filter/change-set-is-descendant-of.test.ts +0 -169
- package/src/query-filter/change-set-is-descendant-of.ts +0 -70
- package/src/state/create-changeset-for-transaction.ts +0 -321
- package/src/state/get-version-record-by-id-or-throw.ts +0 -51
- package/src/state/handle-state-mutation.test.ts +0 -761
- package/src/state/handle-state-mutation.ts +0 -418
|
@@ -1,8 +1,10 @@
|
|
|
1
|
-
import { test, expect
|
|
1
|
+
import { test, expect } from "vitest";
|
|
2
2
|
import { openLix } from "../lix/open-lix.js";
|
|
3
3
|
import { Kysely, sql } from "kysely";
|
|
4
4
|
import { createVersion } from "../version/create-version.js";
|
|
5
|
-
|
|
5
|
+
import { simulationTest, normalSimulation, } from "../test-utilities/simulation-test/simulation-test.js";
|
|
6
|
+
test("dstest discovery", () => { });
|
|
7
|
+
simulationTest("select, insert, update, delete entity", async ({ openSimulatedLix }) => {
|
|
6
8
|
const mockSchema = {
|
|
7
9
|
"x-lix-key": "mock_schema",
|
|
8
10
|
"x-lix-version": "1.0",
|
|
@@ -14,7 +16,15 @@ test("select, insert, update, delete entity", async () => {
|
|
|
14
16
|
},
|
|
15
17
|
},
|
|
16
18
|
};
|
|
17
|
-
const lix = await
|
|
19
|
+
const lix = await openSimulatedLix({
|
|
20
|
+
keyValues: [
|
|
21
|
+
{
|
|
22
|
+
key: "lix_deterministic_mode",
|
|
23
|
+
value: { enabled: true, bootstrap: true },
|
|
24
|
+
lixcol_version_id: "global",
|
|
25
|
+
},
|
|
26
|
+
],
|
|
27
|
+
});
|
|
18
28
|
await lix.db
|
|
19
29
|
.insertInto("stored_schema")
|
|
20
30
|
.values({ value: mockSchema })
|
|
@@ -89,8 +99,16 @@ test("select, insert, update, delete entity", async () => {
|
|
|
89
99
|
.execute();
|
|
90
100
|
expect(viewAfterDelete).toHaveLength(0);
|
|
91
101
|
});
|
|
92
|
-
|
|
93
|
-
const lix = await
|
|
102
|
+
simulationTest("validates the schema on insert", async ({ openSimulatedLix }) => {
|
|
103
|
+
const lix = await openSimulatedLix({
|
|
104
|
+
keyValues: [
|
|
105
|
+
{
|
|
106
|
+
key: "lix_deterministic_mode",
|
|
107
|
+
value: { enabled: true, bootstrap: true },
|
|
108
|
+
lixcol_version_id: "global",
|
|
109
|
+
},
|
|
110
|
+
],
|
|
111
|
+
});
|
|
94
112
|
const mockSchema = {
|
|
95
113
|
"x-lix-key": "mock_schema",
|
|
96
114
|
"x-lix-version": "1.0",
|
|
@@ -121,8 +139,8 @@ test("validates the schema on insert", async () => {
|
|
|
121
139
|
})
|
|
122
140
|
.execute()).rejects.toThrow(/value must be number/);
|
|
123
141
|
});
|
|
124
|
-
|
|
125
|
-
const lix = await
|
|
142
|
+
simulationTest("validates the schema on update", async ({ openSimulatedLix }) => {
|
|
143
|
+
const lix = await openSimulatedLix({});
|
|
126
144
|
const mockSchema = {
|
|
127
145
|
"x-lix-key": "mock_schema",
|
|
128
146
|
"x-lix-version": "1.0",
|
|
@@ -180,8 +198,16 @@ test("validates the schema on update", async () => {
|
|
|
180
198
|
},
|
|
181
199
|
]);
|
|
182
200
|
});
|
|
183
|
-
|
|
184
|
-
const lix = await
|
|
201
|
+
simulationTest("state is separated by version", async ({ openSimulatedLix }) => {
|
|
202
|
+
const lix = await openSimulatedLix({
|
|
203
|
+
keyValues: [
|
|
204
|
+
{
|
|
205
|
+
key: "lix_deterministic_mode",
|
|
206
|
+
value: { enabled: true, bootstrap: true },
|
|
207
|
+
lixcol_version_id: "global",
|
|
208
|
+
},
|
|
209
|
+
],
|
|
210
|
+
});
|
|
185
211
|
await createVersion({ lix, id: "version_a" });
|
|
186
212
|
await createVersion({ lix, id: "version_b" });
|
|
187
213
|
await lix.db
|
|
@@ -246,7 +272,9 @@ test("state is separated by version", async () => {
|
|
|
246
272
|
expect(stateAfterInserts[1]?.updated_at).toBeDefined();
|
|
247
273
|
await lix.db
|
|
248
274
|
.updateTable("state_all")
|
|
249
|
-
.set({
|
|
275
|
+
.set({
|
|
276
|
+
snapshot_content: { value: "hello world from version b UPDATED" },
|
|
277
|
+
})
|
|
250
278
|
.where("entity_id", "=", "e0")
|
|
251
279
|
.where("schema_key", "=", "mock_schema")
|
|
252
280
|
.where("version_id", "=", "version_b")
|
|
@@ -303,8 +331,16 @@ test("state is separated by version", async () => {
|
|
|
303
331
|
},
|
|
304
332
|
]);
|
|
305
333
|
});
|
|
306
|
-
|
|
307
|
-
const lix = await
|
|
334
|
+
simulationTest("created_at and updated_at timestamps are computed correctly", async ({ openSimulatedLix }) => {
|
|
335
|
+
const lix = await openSimulatedLix({
|
|
336
|
+
keyValues: [
|
|
337
|
+
{
|
|
338
|
+
key: "lix_deterministic_mode",
|
|
339
|
+
value: { enabled: true, bootstrap: true },
|
|
340
|
+
lixcol_version_id: "global",
|
|
341
|
+
},
|
|
342
|
+
],
|
|
343
|
+
});
|
|
308
344
|
const mockSchema = {
|
|
309
345
|
"x-lix-key": "mock_schema",
|
|
310
346
|
"x-lix-version": "1.0",
|
|
@@ -344,8 +380,6 @@ test("created_at and updated_at timestamps are computed correctly", async () =>
|
|
|
344
380
|
expect(stateAfterInsert[0]?.created_at).toBeDefined();
|
|
345
381
|
expect(stateAfterInsert[0]?.updated_at).toBeDefined();
|
|
346
382
|
expect(stateAfterInsert[0]?.created_at).toBe(stateAfterInsert[0]?.updated_at);
|
|
347
|
-
// Wait a bit to ensure different timestamps
|
|
348
|
-
await new Promise((resolve) => setTimeout(resolve, 1));
|
|
349
383
|
// Update the entity
|
|
350
384
|
await lix.db
|
|
351
385
|
.updateTable("state_all")
|
|
@@ -369,10 +403,17 @@ test("created_at and updated_at timestamps are computed correctly", async () =>
|
|
|
369
403
|
expect(stateAfterUpdate[0]?.created_at).toBe(stateAfterInsert[0]?.created_at);
|
|
370
404
|
// updated_at should be different (newer)
|
|
371
405
|
expect(stateAfterUpdate[0]?.updated_at).not.toBe(stateAfterInsert[0]?.updated_at);
|
|
372
|
-
expect(new Date(stateAfterUpdate[0].updated_at).getTime()).toBeGreaterThan(new Date(stateAfterInsert[0].updated_at).getTime());
|
|
373
406
|
});
|
|
374
|
-
|
|
375
|
-
const lix = await
|
|
407
|
+
simulationTest("created_at and updated_at are version specific", async ({ openSimulatedLix }) => {
|
|
408
|
+
const lix = await openSimulatedLix({
|
|
409
|
+
keyValues: [
|
|
410
|
+
{
|
|
411
|
+
key: "lix_deterministic_mode",
|
|
412
|
+
value: { enabled: true, bootstrap: true },
|
|
413
|
+
lixcol_version_id: "global",
|
|
414
|
+
},
|
|
415
|
+
],
|
|
416
|
+
});
|
|
376
417
|
await createVersion({ lix, id: "version_a" });
|
|
377
418
|
await createVersion({ lix, id: "version_b" });
|
|
378
419
|
const mockSchema = {
|
|
@@ -405,8 +446,6 @@ test("created_at and updated_at are version specific", async () => {
|
|
|
405
446
|
},
|
|
406
447
|
})
|
|
407
448
|
.execute();
|
|
408
|
-
// Wait a bit to ensure different timestamps
|
|
409
|
-
await new Promise((resolve) => setTimeout(resolve, 1));
|
|
410
449
|
// Insert same entity in version B
|
|
411
450
|
await lix.db
|
|
412
451
|
.insertInto("state_all")
|
|
@@ -443,8 +482,6 @@ test("created_at and updated_at are version specific", async () => {
|
|
|
443
482
|
expect(stateVersionB[0]?.updated_at).toBeDefined();
|
|
444
483
|
// the same entity has been inserted but with different changes
|
|
445
484
|
expect(stateVersionA[0]?.created_at).not.toBe(stateVersionB[0]?.created_at);
|
|
446
|
-
// Wait and update only version B
|
|
447
|
-
await new Promise((resolve) => setTimeout(resolve, 1));
|
|
448
485
|
await lix.db
|
|
449
486
|
.updateTable("state_all")
|
|
450
487
|
.set({
|
|
@@ -471,10 +508,17 @@ test("created_at and updated_at are version specific", async () => {
|
|
|
471
508
|
expect(updatedStateVersionA[0]?.updated_at).toBe(stateVersionA[0]?.updated_at);
|
|
472
509
|
// Version B should have updated timestamp
|
|
473
510
|
expect(updatedStateVersionB[0]?.updated_at).not.toBe(stateVersionB[0]?.updated_at);
|
|
474
|
-
expect(new Date(updatedStateVersionB[0].updated_at).getTime()).toBeGreaterThan(new Date(stateVersionB[0].updated_at).getTime());
|
|
475
511
|
});
|
|
476
|
-
|
|
477
|
-
const lix = await
|
|
512
|
+
simulationTest("state appears in both versions when they share the same commit", async ({ openSimulatedLix }) => {
|
|
513
|
+
const lix = await openSimulatedLix({
|
|
514
|
+
keyValues: [
|
|
515
|
+
{
|
|
516
|
+
key: "lix_deterministic_mode",
|
|
517
|
+
value: { enabled: true, bootstrap: true },
|
|
518
|
+
lixcol_version_id: "global",
|
|
519
|
+
},
|
|
520
|
+
],
|
|
521
|
+
});
|
|
478
522
|
const versionA = await createVersion({ lix, id: "version_a" });
|
|
479
523
|
// Insert state into version A
|
|
480
524
|
await lix.db
|
|
@@ -496,12 +540,14 @@ test("state appears in both versions when they share the same change set", async
|
|
|
496
540
|
.where("id", "=", versionA.id)
|
|
497
541
|
.selectAll()
|
|
498
542
|
.executeTakeFirstOrThrow();
|
|
499
|
-
|
|
500
|
-
|
|
543
|
+
const sharedCommitId = versionAAfterInsert.commit_id;
|
|
544
|
+
// Create version B from version A
|
|
545
|
+
const versionB = await createVersion({
|
|
501
546
|
lix,
|
|
502
547
|
id: "version_b",
|
|
503
|
-
|
|
548
|
+
commit_id: sharedCommitId,
|
|
504
549
|
});
|
|
550
|
+
expect(versionB.commit_id).toBe(sharedCommitId);
|
|
505
551
|
const stateInBothVersions = await lix.db
|
|
506
552
|
.selectFrom("state_all")
|
|
507
553
|
.where("schema_key", "=", "mock_schema")
|
|
@@ -515,17 +561,27 @@ test("state appears in both versions when they share the same change set", async
|
|
|
515
561
|
schema_key: "mock_schema",
|
|
516
562
|
snapshot_content: { value: "shared state" },
|
|
517
563
|
version_id: "version_a",
|
|
564
|
+
commit_id: sharedCommitId,
|
|
518
565
|
},
|
|
519
566
|
{
|
|
520
567
|
entity_id: "e0",
|
|
521
568
|
schema_key: "mock_schema",
|
|
522
569
|
snapshot_content: { value: "shared state" },
|
|
523
570
|
version_id: "version_b",
|
|
571
|
+
commit_id: sharedCommitId,
|
|
524
572
|
},
|
|
525
573
|
]);
|
|
526
574
|
});
|
|
527
|
-
|
|
528
|
-
const lix = await
|
|
575
|
+
simulationTest("state diverges when versions have common ancestor but different changes", async ({ openSimulatedLix }) => {
|
|
576
|
+
const lix = await openSimulatedLix({
|
|
577
|
+
keyValues: [
|
|
578
|
+
{
|
|
579
|
+
key: "lix_deterministic_mode",
|
|
580
|
+
value: { enabled: true, bootstrap: true },
|
|
581
|
+
lixcol_version_id: "global",
|
|
582
|
+
},
|
|
583
|
+
],
|
|
584
|
+
});
|
|
529
585
|
// Create base version and add initial state
|
|
530
586
|
const baseVersion = await createVersion({ lix, id: "base_version" });
|
|
531
587
|
await lix.db
|
|
@@ -547,21 +603,21 @@ test("state diverges when versions have common ancestor but different changes",
|
|
|
547
603
|
.where("id", "=", baseVersion.id)
|
|
548
604
|
.selectAll()
|
|
549
605
|
.executeTakeFirstOrThrow();
|
|
550
|
-
// Create two versions from the same base
|
|
606
|
+
// Create two versions from the same base version
|
|
551
607
|
await createVersion({
|
|
552
608
|
lix,
|
|
553
609
|
id: "version_a",
|
|
554
|
-
|
|
610
|
+
commit_id: baseVersionAfterInsert.commit_id,
|
|
555
611
|
});
|
|
556
612
|
await createVersion({
|
|
557
613
|
lix,
|
|
558
614
|
id: "version_b",
|
|
559
|
-
|
|
615
|
+
commit_id: baseVersionAfterInsert.commit_id,
|
|
560
616
|
});
|
|
561
617
|
const versions = await lix.db
|
|
562
618
|
.selectFrom("version")
|
|
563
619
|
.where("id", "in", ["base_version", "version_a", "version_b"])
|
|
564
|
-
.select(["id", "
|
|
620
|
+
.select(["id", "commit_id"])
|
|
565
621
|
.execute();
|
|
566
622
|
expect(versions).toHaveLength(3);
|
|
567
623
|
// Both versions should initially see the base state
|
|
@@ -595,6 +651,7 @@ test("state diverges when versions have common ancestor but different changes",
|
|
|
595
651
|
.where("schema_key", "=", "mock_schema")
|
|
596
652
|
.where("entity_id", "=", "e0")
|
|
597
653
|
.selectAll()
|
|
654
|
+
.orderBy("version_id")
|
|
598
655
|
.execute();
|
|
599
656
|
// All three versions should have different states
|
|
600
657
|
expect(divergedState).toMatchObject([
|
|
@@ -615,112 +672,16 @@ test("state diverges when versions have common ancestor but different changes",
|
|
|
615
672
|
},
|
|
616
673
|
]);
|
|
617
674
|
});
|
|
618
|
-
|
|
619
|
-
|
|
620
|
-
|
|
621
|
-
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
await lix.db
|
|
628
|
-
.insertInto("state_all")
|
|
629
|
-
.values({
|
|
630
|
-
entity_id: "write-through-entity",
|
|
631
|
-
schema_key: "write-through-schema",
|
|
632
|
-
file_id: "write-through-file",
|
|
633
|
-
plugin_key: "write-through-plugin",
|
|
634
|
-
snapshot_content: { test: "write-through-data" },
|
|
635
|
-
schema_version: "1.0",
|
|
636
|
-
version_id: activeVersion.id,
|
|
637
|
-
})
|
|
638
|
-
.execute();
|
|
639
|
-
// Cache should be populated immediately via write-through
|
|
640
|
-
const cacheEntry = await lix.db
|
|
641
|
-
.selectFrom("internal_state_cache")
|
|
642
|
-
.where("entity_id", "=", "write-through-entity")
|
|
643
|
-
.where("schema_key", "=", "write-through-schema")
|
|
644
|
-
.where("file_id", "=", "write-through-file")
|
|
645
|
-
.where("version_id", "=", activeVersion.id)
|
|
646
|
-
.selectAll()
|
|
647
|
-
.executeTakeFirst();
|
|
648
|
-
expect(cacheEntry).toBeDefined();
|
|
649
|
-
expect(cacheEntry?.entity_id).toBe("write-through-entity");
|
|
650
|
-
expect(cacheEntry?.plugin_key).toBe("write-through-plugin");
|
|
651
|
-
expect(cacheEntry?.snapshot_content).toEqual({
|
|
652
|
-
test: "write-through-data",
|
|
653
|
-
});
|
|
654
|
-
// State view should return the same data (from cache)
|
|
655
|
-
const stateResults = await lix.db
|
|
656
|
-
.selectFrom("state_all")
|
|
657
|
-
.where("entity_id", "=", "write-through-entity")
|
|
658
|
-
.selectAll()
|
|
659
|
-
.execute();
|
|
660
|
-
expect(stateResults).toHaveLength(1);
|
|
661
|
-
expect(stateResults[0]?.entity_id).toBe("write-through-entity");
|
|
662
|
-
expect(stateResults[0]?.snapshot_content).toEqual({
|
|
663
|
-
test: "write-through-data",
|
|
664
|
-
});
|
|
665
|
-
});
|
|
666
|
-
test("write-through cache: update operations update cache immediately", async () => {
|
|
667
|
-
const lix = await openLix({});
|
|
668
|
-
const activeVersion = await lix.db
|
|
669
|
-
.selectFrom("active_version")
|
|
670
|
-
.innerJoin("version", "active_version.version_id", "version.id")
|
|
671
|
-
.selectAll("version")
|
|
672
|
-
.executeTakeFirstOrThrow();
|
|
673
|
-
// Insert initial state
|
|
674
|
-
await lix.db
|
|
675
|
-
.insertInto("state_all")
|
|
676
|
-
.values({
|
|
677
|
-
entity_id: "update-cache-entity",
|
|
678
|
-
schema_key: "update-cache-schema",
|
|
679
|
-
file_id: "update-cache-file",
|
|
680
|
-
plugin_key: "initial-plugin",
|
|
681
|
-
snapshot_content: { initial: "value" },
|
|
682
|
-
schema_version: "1.0",
|
|
683
|
-
version_id: activeVersion.id,
|
|
684
|
-
})
|
|
685
|
-
.execute();
|
|
686
|
-
// Update the state - should update cache via write-through
|
|
687
|
-
await lix.db
|
|
688
|
-
.updateTable("state_all")
|
|
689
|
-
.set({
|
|
690
|
-
snapshot_content: { updated: "value" },
|
|
691
|
-
plugin_key: "updated-plugin",
|
|
692
|
-
})
|
|
693
|
-
.where("entity_id", "=", "update-cache-entity")
|
|
694
|
-
.where("schema_key", "=", "update-cache-schema")
|
|
695
|
-
.where("file_id", "=", "update-cache-file")
|
|
696
|
-
.where("version_id", "=", activeVersion.id)
|
|
697
|
-
.execute();
|
|
698
|
-
// Cache should be immediately updated
|
|
699
|
-
const cacheEntry = await lix.db
|
|
700
|
-
.selectFrom("internal_state_cache")
|
|
701
|
-
.where("entity_id", "=", "update-cache-entity")
|
|
702
|
-
.where("schema_key", "=", "update-cache-schema")
|
|
703
|
-
.where("file_id", "=", "update-cache-file")
|
|
704
|
-
.where("version_id", "=", activeVersion.id)
|
|
705
|
-
.selectAll()
|
|
706
|
-
.executeTakeFirst();
|
|
707
|
-
expect(cacheEntry).toBeDefined();
|
|
708
|
-
expect(cacheEntry?.snapshot_content).toEqual({
|
|
709
|
-
updated: "value",
|
|
675
|
+
simulationTest("delete operations remove entries from underlying data", async ({ openSimulatedLix }) => {
|
|
676
|
+
const lix = await openSimulatedLix({
|
|
677
|
+
keyValues: [
|
|
678
|
+
{
|
|
679
|
+
key: "lix_deterministic_mode",
|
|
680
|
+
value: { enabled: true, bootstrap: true },
|
|
681
|
+
lixcol_version_id: "global",
|
|
682
|
+
},
|
|
683
|
+
],
|
|
710
684
|
});
|
|
711
|
-
expect(cacheEntry?.plugin_key).toBe("updated-plugin");
|
|
712
|
-
// State view should return updated data
|
|
713
|
-
const stateResults = await lix.db
|
|
714
|
-
.selectFrom("state_all")
|
|
715
|
-
.where("entity_id", "=", "update-cache-entity")
|
|
716
|
-
.selectAll()
|
|
717
|
-
.execute();
|
|
718
|
-
expect(stateResults).toHaveLength(1);
|
|
719
|
-
expect(stateResults[0]?.snapshot_content).toEqual({ updated: "value" });
|
|
720
|
-
expect(stateResults[0]?.plugin_key).toBe("updated-plugin");
|
|
721
|
-
});
|
|
722
|
-
test("delete operations remove entries from underlying data", async () => {
|
|
723
|
-
const lix = await openLix({});
|
|
724
685
|
const activeVersion = await lix.db
|
|
725
686
|
.selectFrom("active_version")
|
|
726
687
|
.innerJoin("version", "active_version.version_id", "version.id")
|
|
@@ -762,8 +723,16 @@ test("delete operations remove entries from underlying data", async () => {
|
|
|
762
723
|
.execute();
|
|
763
724
|
expect(afterDelete).toHaveLength(0);
|
|
764
725
|
});
|
|
765
|
-
|
|
766
|
-
const lix = await
|
|
726
|
+
simulationTest("change.created_at and state timestamps are consistent", async ({ openSimulatedLix }) => {
|
|
727
|
+
const lix = await openSimulatedLix({
|
|
728
|
+
keyValues: [
|
|
729
|
+
{
|
|
730
|
+
key: "lix_deterministic_mode",
|
|
731
|
+
value: { enabled: true, bootstrap: true },
|
|
732
|
+
lixcol_version_id: "global",
|
|
733
|
+
},
|
|
734
|
+
],
|
|
735
|
+
});
|
|
767
736
|
const mockSchema = {
|
|
768
737
|
"x-lix-key": "mock_schema",
|
|
769
738
|
"x-lix-version": "1.0",
|
|
@@ -809,9 +778,17 @@ test("change.created_at and state timestamps are consistent", async () => {
|
|
|
809
778
|
// Verify all timestamps are identical
|
|
810
779
|
expect(changeRecord.created_at).toBe(cacheRecord.created_at);
|
|
811
780
|
expect(changeRecord.created_at).toBe(cacheRecord.updated_at);
|
|
812
|
-
});
|
|
813
|
-
|
|
814
|
-
const lix = await
|
|
781
|
+
}, { simulations: [normalSimulation] });
|
|
782
|
+
simulationTest("state and state_all views expose change_id for blame and diff functionality", async ({ expectDeterministic, openSimulatedLix }) => {
|
|
783
|
+
const lix = await openSimulatedLix({
|
|
784
|
+
keyValues: [
|
|
785
|
+
{
|
|
786
|
+
key: "lix_deterministic_mode",
|
|
787
|
+
value: { enabled: true, bootstrap: true },
|
|
788
|
+
lixcol_version_id: "global",
|
|
789
|
+
},
|
|
790
|
+
],
|
|
791
|
+
});
|
|
815
792
|
const mockSchema = {
|
|
816
793
|
"x-lix-key": "mock_schema",
|
|
817
794
|
"x-lix-version": "1.0",
|
|
@@ -847,7 +824,7 @@ test("state and state_all views expose change_id for blame and diff functionalit
|
|
|
847
824
|
.where("schema_key", "=", "mock_schema")
|
|
848
825
|
.selectAll()
|
|
849
826
|
.execute();
|
|
850
|
-
|
|
827
|
+
expectDeterministic(stateAllResult).toHaveLength(1);
|
|
851
828
|
expect(stateAllResult[0]?.change_id).toBeDefined();
|
|
852
829
|
expect(typeof stateAllResult[0]?.change_id).toBe("string");
|
|
853
830
|
// Query state view (filtered by active version) to verify change_id is exposed
|
|
@@ -857,7 +834,7 @@ test("state and state_all views expose change_id for blame and diff functionalit
|
|
|
857
834
|
.where("schema_key", "=", "mock_schema")
|
|
858
835
|
.selectAll()
|
|
859
836
|
.execute();
|
|
860
|
-
|
|
837
|
+
expectDeterministic(stateResult).toHaveLength(1);
|
|
861
838
|
expect(stateResult[0]?.change_id).toBeDefined();
|
|
862
839
|
expect(typeof stateResult[0]?.change_id).toBe("string");
|
|
863
840
|
// Verify that change_id matches between state and state_all views
|
|
@@ -874,7 +851,9 @@ test("state and state_all views expose change_id for blame and diff functionalit
|
|
|
874
851
|
expect(stateAllResult[0]?.change_id).toBe(changeRecord.id);
|
|
875
852
|
// Verify that the snapshot content in the change matches the state view
|
|
876
853
|
expect(changeRecord.snapshot_content).toEqual({ value: "initial value" });
|
|
877
|
-
expect(stateResult[0]?.snapshot_content).toEqual({
|
|
854
|
+
expect(stateResult[0]?.snapshot_content).toEqual({
|
|
855
|
+
value: "initial value",
|
|
856
|
+
});
|
|
878
857
|
// Update the entity to create a new change
|
|
879
858
|
await lix.db
|
|
880
859
|
.updateTable("state_all")
|
|
@@ -895,671 +874,1165 @@ test("state and state_all views expose change_id for blame and diff functionalit
|
|
|
895
874
|
expect(updatedStateResult[0]?.change_id).toBeDefined();
|
|
896
875
|
// The change_id should be different after the update (new change created)
|
|
897
876
|
expect(updatedStateResult[0]?.change_id).not.toBe(stateResult[0]?.change_id);
|
|
898
|
-
// Get the new change record
|
|
877
|
+
// Get the new change record by matching the change_id from the updated state
|
|
899
878
|
const newChangeRecord = await lix.db
|
|
900
879
|
.selectFrom("change")
|
|
901
|
-
.where("
|
|
902
|
-
.where("schema_key", "=", "mock_schema")
|
|
903
|
-
.orderBy("created_at", "desc")
|
|
880
|
+
.where("change.id", "=", updatedStateResult[0].change_id)
|
|
904
881
|
.select(["change.id", "snapshot_content"])
|
|
905
882
|
.executeTakeFirstOrThrow();
|
|
906
883
|
// Verify the new change_id matches the latest change
|
|
907
884
|
expect(updatedStateResult[0]?.change_id).toBe(newChangeRecord.id);
|
|
908
885
|
// Verify that the updated snapshot content in the change matches the state view
|
|
909
|
-
expect(newChangeRecord.snapshot_content).toEqual({
|
|
886
|
+
expect(newChangeRecord.snapshot_content).toEqual({
|
|
887
|
+
value: "updated value",
|
|
888
|
+
});
|
|
910
889
|
expect(updatedStateResult[0]?.snapshot_content).toEqual({
|
|
911
890
|
value: "updated value",
|
|
912
891
|
});
|
|
913
892
|
});
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
918
|
-
|
|
919
|
-
|
|
920
|
-
|
|
921
|
-
|
|
922
|
-
|
|
923
|
-
.insertInto("key_value")
|
|
924
|
-
.values({
|
|
925
|
-
key: "test_cache_miss",
|
|
926
|
-
value: "initial_value",
|
|
927
|
-
})
|
|
928
|
-
.execute();
|
|
929
|
-
// Verify it's accessible through state view (should populate cache)
|
|
930
|
-
const stateBeforeCacheClear = await lix.db
|
|
931
|
-
.selectFrom("state_all")
|
|
932
|
-
.where("schema_key", "=", "lix_key_value")
|
|
933
|
-
.where("entity_id", "=", "test_cache_miss")
|
|
934
|
-
.selectAll()
|
|
935
|
-
.execute();
|
|
936
|
-
expect(stateBeforeCacheClear).toHaveLength(1);
|
|
937
|
-
expect(stateBeforeCacheClear[0]).toMatchObject({
|
|
938
|
-
entity_id: "test_cache_miss",
|
|
939
|
-
schema_key: "lix_key_value",
|
|
940
|
-
snapshot_content: {
|
|
941
|
-
key: "test_cache_miss",
|
|
942
|
-
value: "initial_value",
|
|
943
|
-
},
|
|
944
|
-
});
|
|
945
|
-
// Verify it's in the cache
|
|
946
|
-
const cacheBeforeClear = await lix.db
|
|
947
|
-
.selectFrom("internal_state_cache")
|
|
948
|
-
.where("schema_key", "=", "lix_key_value")
|
|
949
|
-
.where("entity_id", "=", "test_cache_miss")
|
|
950
|
-
.selectAll()
|
|
951
|
-
.execute();
|
|
952
|
-
expect(cacheBeforeClear).toHaveLength(1);
|
|
953
|
-
// Simulate cache invalidation (like what happens during stored_schema insertion)
|
|
954
|
-
await lix.db
|
|
955
|
-
.deleteFrom("internal_state_cache")
|
|
956
|
-
.execute();
|
|
957
|
-
// Verify cache is empty
|
|
958
|
-
const cacheAfterClear = await lix.db
|
|
959
|
-
.selectFrom("internal_state_cache")
|
|
960
|
-
.selectAll()
|
|
961
|
-
.execute();
|
|
962
|
-
expect(cacheAfterClear).toHaveLength(0);
|
|
963
|
-
// Try to access the same data through state view again
|
|
964
|
-
// This should trigger cache miss logic and repopulate from CTE
|
|
965
|
-
const stateAfterCacheClear = await lix.db
|
|
966
|
-
.selectFrom("state_all")
|
|
967
|
-
.where("schema_key", "=", "lix_key_value")
|
|
968
|
-
.where("entity_id", "=", "test_cache_miss")
|
|
969
|
-
.selectAll()
|
|
970
|
-
.execute();
|
|
971
|
-
// This should work - if cache miss logic is working correctly
|
|
972
|
-
expect(stateAfterCacheClear).toHaveLength(1);
|
|
973
|
-
expect(stateAfterCacheClear[0]).toMatchObject({
|
|
974
|
-
entity_id: "test_cache_miss",
|
|
975
|
-
schema_key: "lix_key_value",
|
|
976
|
-
snapshot_content: {
|
|
977
|
-
key: "test_cache_miss",
|
|
978
|
-
value: "initial_value",
|
|
979
|
-
},
|
|
893
|
+
simulationTest("state and state_all views expose commit_id for history queries", async ({ expectDeterministic, openSimulatedLix }) => {
|
|
894
|
+
const lix = await openSimulatedLix({
|
|
895
|
+
keyValues: [
|
|
896
|
+
{
|
|
897
|
+
key: "lix_deterministic_mode",
|
|
898
|
+
value: { enabled: true, bootstrap: true },
|
|
899
|
+
lixcol_version_id: "global",
|
|
900
|
+
},
|
|
901
|
+
],
|
|
980
902
|
});
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
.selectFrom("internal_state_cache")
|
|
984
|
-
.where("schema_key", "=", "lix_key_value")
|
|
985
|
-
.where("entity_id", "=", "test_cache_miss")
|
|
986
|
-
.selectAll()
|
|
987
|
-
.execute();
|
|
988
|
-
expect(cacheAfterRefill).toHaveLength(1);
|
|
989
|
-
});
|
|
990
|
-
test("delete operations are validated for foreign key constraints", async () => {
|
|
991
|
-
const lix = await openLix({});
|
|
992
|
-
// Define parent schema (referenced entity)
|
|
993
|
-
const parentSchema = {
|
|
994
|
-
"x-lix-key": "parent_entity",
|
|
903
|
+
const mockSchema = {
|
|
904
|
+
"x-lix-key": "mock_schema",
|
|
995
905
|
"x-lix-version": "1.0",
|
|
996
|
-
"x-lix-primary-key": ["id"],
|
|
997
906
|
type: "object",
|
|
998
|
-
properties: {
|
|
999
|
-
id: { type: "string" },
|
|
1000
|
-
name: { type: "string" },
|
|
1001
|
-
},
|
|
1002
|
-
required: ["id", "name"],
|
|
1003
907
|
additionalProperties: false,
|
|
1004
|
-
};
|
|
1005
|
-
// Define child schema with foreign key to parent
|
|
1006
|
-
const childSchema = {
|
|
1007
|
-
"x-lix-key": "child_entity",
|
|
1008
|
-
"x-lix-version": "1.0",
|
|
1009
|
-
"x-lix-primary-key": ["id"],
|
|
1010
|
-
"x-lix-foreign-keys": {
|
|
1011
|
-
parent_id: {
|
|
1012
|
-
schemaKey: "parent_entity",
|
|
1013
|
-
property: "id",
|
|
1014
|
-
},
|
|
1015
|
-
},
|
|
1016
|
-
type: "object",
|
|
1017
908
|
properties: {
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
909
|
+
value: {
|
|
910
|
+
type: "string",
|
|
911
|
+
},
|
|
1021
912
|
},
|
|
1022
|
-
required: ["id", "parent_id", "value"],
|
|
1023
|
-
additionalProperties: false,
|
|
1024
913
|
};
|
|
1025
|
-
// Register both schemas
|
|
1026
914
|
await lix.db
|
|
1027
915
|
.insertInto("stored_schema")
|
|
1028
|
-
.values(
|
|
1029
|
-
.execute();
|
|
1030
|
-
// Insert parent entity
|
|
1031
|
-
await lix.db
|
|
1032
|
-
.insertInto("state_all")
|
|
1033
|
-
.values({
|
|
1034
|
-
entity_id: "parent-1",
|
|
1035
|
-
schema_key: "parent_entity",
|
|
1036
|
-
file_id: "test-file",
|
|
1037
|
-
plugin_key: "test-plugin",
|
|
1038
|
-
snapshot_content: {
|
|
1039
|
-
id: "parent-1",
|
|
1040
|
-
name: "Parent Entity",
|
|
1041
|
-
},
|
|
1042
|
-
schema_version: "1.0",
|
|
1043
|
-
version_id: sql `(SELECT version_id FROM active_version)`,
|
|
1044
|
-
})
|
|
916
|
+
.values({ value: mockSchema })
|
|
1045
917
|
.execute();
|
|
1046
|
-
// Insert
|
|
918
|
+
// Insert initial state using Kysely to ensure virtual table is triggered
|
|
1047
919
|
await lix.db
|
|
1048
920
|
.insertInto("state_all")
|
|
1049
921
|
.values({
|
|
1050
|
-
entity_id: "
|
|
1051
|
-
schema_key: "
|
|
1052
|
-
file_id: "test-file",
|
|
1053
|
-
plugin_key: "test-plugin",
|
|
1054
|
-
snapshot_content: {
|
|
1055
|
-
id: "child-1",
|
|
1056
|
-
parent_id: "parent-1",
|
|
1057
|
-
value: "Child Value",
|
|
1058
|
-
},
|
|
922
|
+
entity_id: "change-set-id-test-entity",
|
|
923
|
+
schema_key: "mock_schema",
|
|
924
|
+
file_id: "change-set-id-test-file",
|
|
925
|
+
plugin_key: "change-set-id-test-plugin",
|
|
926
|
+
snapshot_content: { value: "initial value" },
|
|
1059
927
|
schema_version: "1.0",
|
|
1060
928
|
version_id: sql `(SELECT version_id FROM active_version)`,
|
|
1061
929
|
})
|
|
1062
930
|
.execute();
|
|
1063
|
-
|
|
1064
|
-
|
|
931
|
+
const activeVersionAfterInsert = await lix.db
|
|
932
|
+
.selectFrom("active_version")
|
|
933
|
+
.innerJoin("version", "active_version.version_id", "version.id")
|
|
934
|
+
.selectAll("version")
|
|
935
|
+
.executeTakeFirstOrThrow();
|
|
936
|
+
// Query state_all view to verify change_set_id is exposed
|
|
937
|
+
const stateAllResult = await lix.db
|
|
1065
938
|
.selectFrom("state_all")
|
|
1066
|
-
.where("entity_id", "=", "
|
|
1067
|
-
.where("schema_key", "=", "
|
|
939
|
+
.where("entity_id", "=", "change-set-id-test-entity")
|
|
940
|
+
.where("schema_key", "=", "mock_schema")
|
|
1068
941
|
.selectAll()
|
|
1069
942
|
.execute();
|
|
1070
|
-
|
|
1071
|
-
|
|
1072
|
-
|
|
1073
|
-
|
|
943
|
+
expectDeterministic(stateAllResult).toHaveLength(1);
|
|
944
|
+
expectDeterministic(stateAllResult[0]).toHaveProperty("commit_id");
|
|
945
|
+
expectDeterministic(stateAllResult[0]?.commit_id).toBe(activeVersionAfterInsert.commit_id);
|
|
946
|
+
// Query state view (filtered by active version) to verify commit_id is exposed
|
|
947
|
+
const stateResult = await lix.db
|
|
948
|
+
.selectFrom("state")
|
|
949
|
+
.where("entity_id", "=", "change-set-id-test-entity")
|
|
950
|
+
.where("schema_key", "=", "mock_schema")
|
|
1074
951
|
.selectAll()
|
|
1075
952
|
.execute();
|
|
1076
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
//
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
1086
|
-
|
|
1087
|
-
.
|
|
1088
|
-
.where("
|
|
1089
|
-
.
|
|
1090
|
-
.
|
|
953
|
+
expectDeterministic(stateResult).toHaveLength(1);
|
|
954
|
+
expectDeterministic(stateResult[0]?.commit_id).toBeDefined();
|
|
955
|
+
expectDeterministic(stateResult[0]?.commit_id).toBe(activeVersionAfterInsert.commit_id);
|
|
956
|
+
// Verify that commit_id matches between state and state_all views
|
|
957
|
+
expectDeterministic(stateResult[0]?.commit_id).toBe(stateAllResult[0]?.commit_id);
|
|
958
|
+
// Get the change_set_element records - there should be two:
|
|
959
|
+
// 1. One in the working change set
|
|
960
|
+
// 2. One in the version's current change set (after commit)
|
|
961
|
+
const changeSetElements = await lix.db
|
|
962
|
+
.selectFrom("change_set_element")
|
|
963
|
+
.where("entity_id", "=", "change-set-id-test-entity")
|
|
964
|
+
.where("schema_key", "=", "mock_schema")
|
|
965
|
+
.where("file_id", "=", "change-set-id-test-file")
|
|
966
|
+
.select(["change_set_id", "change_id"])
|
|
967
|
+
.orderBy("change_set_id")
|
|
1091
968
|
.execute();
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
|
|
1097
|
-
|
|
1098
|
-
|
|
1099
|
-
|
|
1100
|
-
|
|
1101
|
-
|
|
1102
|
-
|
|
1103
|
-
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1107
|
-
|
|
1108
|
-
|
|
1109
|
-
|
|
1110
|
-
|
|
1111
|
-
|
|
1112
|
-
|
|
1113
|
-
|
|
1114
|
-
|
|
1115
|
-
|
|
1116
|
-
|
|
1117
|
-
|
|
1118
|
-
|
|
1119
|
-
|
|
1120
|
-
|
|
1121
|
-
|
|
1122
|
-
|
|
1123
|
-
|
|
1124
|
-
|
|
1125
|
-
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1130
|
-
|
|
1131
|
-
|
|
1132
|
-
|
|
1133
|
-
|
|
1134
|
-
|
|
1135
|
-
|
|
1136
|
-
|
|
1137
|
-
|
|
1138
|
-
|
|
1139
|
-
|
|
1140
|
-
|
|
969
|
+
expectDeterministic(changeSetElements).toHaveLength(2);
|
|
970
|
+
// Get the version to understand which change sets we're dealing with
|
|
971
|
+
const version = await lix.db
|
|
972
|
+
.selectFrom("version")
|
|
973
|
+
.where("id", "=", activeVersionAfterInsert.id)
|
|
974
|
+
.select(["id", "commit_id", "working_commit_id"])
|
|
975
|
+
.executeTakeFirstOrThrow();
|
|
976
|
+
// Get the change set ID from the version's commit
|
|
977
|
+
const versionCommit = await lix.db
|
|
978
|
+
.selectFrom("commit")
|
|
979
|
+
.where("id", "=", version.commit_id)
|
|
980
|
+
.selectAll()
|
|
981
|
+
.executeTakeFirstOrThrow();
|
|
982
|
+
// Get the change set ID from the working commit
|
|
983
|
+
const workingCommit = await lix.db
|
|
984
|
+
.selectFrom("commit")
|
|
985
|
+
.where("id", "=", version.working_commit_id)
|
|
986
|
+
.selectAll()
|
|
987
|
+
.executeTakeFirstOrThrow();
|
|
988
|
+
// Find which change_set_element is in the version's change set (not working)
|
|
989
|
+
const versionChangeSetElement = changeSetElements.find((el) => el.change_set_id === versionCommit.change_set_id);
|
|
990
|
+
const workingChangeSetElement = changeSetElements.find((el) => el.change_set_id === workingCommit.change_set_id);
|
|
991
|
+
expectDeterministic(versionChangeSetElement).toBeDefined();
|
|
992
|
+
expectDeterministic(workingChangeSetElement).toBeDefined();
|
|
993
|
+
// The state view should show the commit_id from the version,
|
|
994
|
+
// not related to the working change set (which is temporary and not part of the graph)
|
|
995
|
+
expectDeterministic(stateResult[0]?.commit_id).toBe(version.commit_id);
|
|
996
|
+
expectDeterministic(stateAllResult[0]?.commit_id).toBe(version.commit_id);
|
|
997
|
+
// Verify that the change_id also matches for consistency
|
|
998
|
+
expectDeterministic(stateResult[0]?.change_id).toBe(versionChangeSetElement.change_id);
|
|
999
|
+
expectDeterministic(stateAllResult[0]?.change_id).toBe(versionChangeSetElement.change_id);
|
|
1000
|
+
});
|
|
1001
|
+
// Write-through cache behavior tests
|
|
1002
|
+
simulationTest("write-through cache: insert operations populate cache immediately", async ({ openSimulatedLix }) => {
|
|
1003
|
+
const lix = await openSimulatedLix({
|
|
1004
|
+
keyValues: [
|
|
1005
|
+
{
|
|
1006
|
+
key: "lix_deterministic_mode",
|
|
1007
|
+
value: { enabled: true, bootstrap: true },
|
|
1008
|
+
lixcol_version_id: "global",
|
|
1009
|
+
},
|
|
1010
|
+
],
|
|
1011
|
+
});
|
|
1012
|
+
const activeVersion = await lix.db
|
|
1013
|
+
.selectFrom("active_version")
|
|
1014
|
+
.innerJoin("version", "active_version.version_id", "version.id")
|
|
1015
|
+
.selectAll("version")
|
|
1016
|
+
.executeTakeFirstOrThrow();
|
|
1017
|
+
// Insert state data - should populate cache via write-through
|
|
1018
|
+
await lix.db
|
|
1019
|
+
.insertInto("state_all")
|
|
1020
|
+
.values({
|
|
1021
|
+
entity_id: "write-through-entity",
|
|
1022
|
+
schema_key: "write-through-schema",
|
|
1023
|
+
file_id: "write-through-file",
|
|
1024
|
+
plugin_key: "write-through-plugin",
|
|
1025
|
+
snapshot_content: { test: "write-through-data" },
|
|
1026
|
+
schema_version: "1.0",
|
|
1027
|
+
version_id: activeVersion.id,
|
|
1028
|
+
})
|
|
1029
|
+
.execute();
|
|
1030
|
+
// Cache should be populated immediately via write-through
|
|
1031
|
+
const cacheEntry = await lix.db
|
|
1032
|
+
.selectFrom("internal_state_cache")
|
|
1033
|
+
.where("entity_id", "=", "write-through-entity")
|
|
1034
|
+
.where("schema_key", "=", "write-through-schema")
|
|
1035
|
+
.where("file_id", "=", "write-through-file")
|
|
1036
|
+
.where("version_id", "=", activeVersion.id)
|
|
1037
|
+
.selectAll()
|
|
1038
|
+
.executeTakeFirst();
|
|
1039
|
+
expect(cacheEntry).toBeDefined();
|
|
1040
|
+
expect(cacheEntry?.entity_id).toBe("write-through-entity");
|
|
1041
|
+
expect(cacheEntry?.plugin_key).toBe("write-through-plugin");
|
|
1042
|
+
expect(cacheEntry?.snapshot_content).toEqual({
|
|
1043
|
+
test: "write-through-data",
|
|
1044
|
+
});
|
|
1045
|
+
// State view should return the same data (from cache)
|
|
1046
|
+
const stateResults = await lix.db
|
|
1047
|
+
.selectFrom("state_all")
|
|
1048
|
+
.where("entity_id", "=", "write-through-entity")
|
|
1049
|
+
.selectAll()
|
|
1050
|
+
.execute();
|
|
1051
|
+
expect(stateResults).toHaveLength(1);
|
|
1052
|
+
expect(stateResults[0]?.entity_id).toBe("write-through-entity");
|
|
1053
|
+
expect(stateResults[0]?.snapshot_content).toEqual({
|
|
1054
|
+
test: "write-through-data",
|
|
1055
|
+
});
|
|
1056
|
+
}, { simulations: [normalSimulation] });
|
|
1057
|
+
simulationTest("write-through cache: update operations update cache immediately", async ({ openSimulatedLix }) => {
|
|
1058
|
+
const lix = await openSimulatedLix({
|
|
1059
|
+
keyValues: [
|
|
1060
|
+
{
|
|
1061
|
+
key: "lix_deterministic_mode",
|
|
1062
|
+
value: { enabled: true, bootstrap: true },
|
|
1063
|
+
lixcol_version_id: "global",
|
|
1064
|
+
},
|
|
1065
|
+
],
|
|
1066
|
+
});
|
|
1067
|
+
const activeVersion = await lix.db
|
|
1068
|
+
.selectFrom("active_version")
|
|
1069
|
+
.innerJoin("version", "active_version.version_id", "version.id")
|
|
1070
|
+
.selectAll("version")
|
|
1071
|
+
.executeTakeFirstOrThrow();
|
|
1072
|
+
// Insert initial state
|
|
1073
|
+
await lix.db
|
|
1074
|
+
.insertInto("state_all")
|
|
1075
|
+
.values({
|
|
1076
|
+
entity_id: "update-cache-entity",
|
|
1077
|
+
schema_key: "update-cache-schema",
|
|
1078
|
+
file_id: "update-cache-file",
|
|
1079
|
+
plugin_key: "initial-plugin",
|
|
1080
|
+
snapshot_content: { initial: "value" },
|
|
1081
|
+
schema_version: "1.0",
|
|
1082
|
+
version_id: activeVersion.id,
|
|
1083
|
+
})
|
|
1084
|
+
.execute();
|
|
1085
|
+
// Update the state - should update cache via write-through
|
|
1086
|
+
await lix.db
|
|
1087
|
+
.updateTable("state_all")
|
|
1088
|
+
.set({
|
|
1089
|
+
snapshot_content: { updated: "value" },
|
|
1090
|
+
plugin_key: "updated-plugin",
|
|
1091
|
+
})
|
|
1092
|
+
.where("entity_id", "=", "update-cache-entity")
|
|
1093
|
+
.where("schema_key", "=", "update-cache-schema")
|
|
1094
|
+
.where("file_id", "=", "update-cache-file")
|
|
1095
|
+
.where("version_id", "=", activeVersion.id)
|
|
1096
|
+
.execute();
|
|
1097
|
+
// Cache should be immediately updated
|
|
1098
|
+
const cacheEntry = await lix.db
|
|
1099
|
+
.selectFrom("internal_state_cache")
|
|
1100
|
+
.where("entity_id", "=", "update-cache-entity")
|
|
1101
|
+
.where("schema_key", "=", "update-cache-schema")
|
|
1102
|
+
.where("file_id", "=", "update-cache-file")
|
|
1103
|
+
.where("version_id", "=", activeVersion.id)
|
|
1104
|
+
.selectAll()
|
|
1105
|
+
.executeTakeFirst();
|
|
1106
|
+
expect(cacheEntry).toBeDefined();
|
|
1107
|
+
expect(cacheEntry?.snapshot_content).toEqual({
|
|
1108
|
+
updated: "value",
|
|
1109
|
+
});
|
|
1110
|
+
expect(cacheEntry?.plugin_key).toBe("updated-plugin");
|
|
1111
|
+
// State view should return updated data
|
|
1112
|
+
const stateResults = await lix.db
|
|
1113
|
+
.selectFrom("state_all")
|
|
1114
|
+
.where("entity_id", "=", "update-cache-entity")
|
|
1115
|
+
.selectAll()
|
|
1116
|
+
.execute();
|
|
1117
|
+
expect(stateResults).toHaveLength(1);
|
|
1118
|
+
expect(stateResults[0]?.snapshot_content).toEqual({ updated: "value" });
|
|
1119
|
+
expect(stateResults[0]?.plugin_key).toBe("updated-plugin");
|
|
1120
|
+
}, { simulations: [normalSimulation] });
|
|
1121
|
+
simulationTest("delete operations are validated for foreign key constraints", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
1122
|
+
const lix = await openSimulatedLix({
|
|
1123
|
+
keyValues: [
|
|
1124
|
+
{
|
|
1125
|
+
key: "lix_deterministic_mode",
|
|
1126
|
+
value: { enabled: true, bootstrap: true },
|
|
1127
|
+
lixcol_version_id: "global",
|
|
1128
|
+
},
|
|
1129
|
+
],
|
|
1130
|
+
});
|
|
1131
|
+
// Define parent schema (referenced entity)
|
|
1132
|
+
const parentSchema = {
|
|
1133
|
+
"x-lix-key": "parent_entity",
|
|
1134
|
+
"x-lix-version": "1.0",
|
|
1135
|
+
"x-lix-primary-key": ["id"],
|
|
1136
|
+
type: "object",
|
|
1137
|
+
properties: {
|
|
1138
|
+
id: { type: "string" },
|
|
1139
|
+
name: { type: "string" },
|
|
1140
|
+
},
|
|
1141
|
+
required: ["id", "name"],
|
|
1142
|
+
additionalProperties: false,
|
|
1143
|
+
};
|
|
1144
|
+
// Define child schema with foreign key to parent
|
|
1145
|
+
const childSchema = {
|
|
1146
|
+
"x-lix-key": "child_entity",
|
|
1147
|
+
"x-lix-version": "1.0",
|
|
1148
|
+
"x-lix-primary-key": ["id"],
|
|
1149
|
+
"x-lix-foreign-keys": [
|
|
1150
|
+
{
|
|
1151
|
+
properties: ["parent_id"],
|
|
1152
|
+
references: {
|
|
1153
|
+
schemaKey: "parent_entity",
|
|
1154
|
+
properties: ["id"],
|
|
1155
|
+
},
|
|
1156
|
+
},
|
|
1157
|
+
],
|
|
1158
|
+
type: "object",
|
|
1159
|
+
properties: {
|
|
1160
|
+
id: { type: "string" },
|
|
1161
|
+
parent_id: { type: "string" },
|
|
1162
|
+
value: { type: "string" },
|
|
1163
|
+
},
|
|
1164
|
+
required: ["id", "parent_id", "value"],
|
|
1165
|
+
additionalProperties: false,
|
|
1166
|
+
};
|
|
1167
|
+
// Register both schemas
|
|
1168
|
+
await lix.db
|
|
1169
|
+
.insertInto("stored_schema")
|
|
1170
|
+
.values([{ value: parentSchema }, { value: childSchema }])
|
|
1171
|
+
.execute();
|
|
1172
|
+
// Insert parent entity
|
|
1173
|
+
await lix.db
|
|
1174
|
+
.insertInto("state_all")
|
|
1175
|
+
.values({
|
|
1176
|
+
entity_id: "parent-1",
|
|
1177
|
+
schema_key: "parent_entity",
|
|
1178
|
+
file_id: "test-file",
|
|
1179
|
+
plugin_key: "test-plugin",
|
|
1180
|
+
snapshot_content: {
|
|
1181
|
+
id: "parent-1",
|
|
1182
|
+
name: "Parent Entity",
|
|
1183
|
+
},
|
|
1184
|
+
schema_version: "1.0",
|
|
1185
|
+
version_id: sql `(SELECT version_id FROM active_version)`,
|
|
1186
|
+
})
|
|
1187
|
+
.execute();
|
|
1188
|
+
// Insert child entity that references the parent
|
|
1189
|
+
await lix.db
|
|
1190
|
+
.insertInto("state_all")
|
|
1191
|
+
.values({
|
|
1192
|
+
entity_id: "child-1",
|
|
1193
|
+
schema_key: "child_entity",
|
|
1194
|
+
file_id: "test-file",
|
|
1195
|
+
plugin_key: "test-plugin",
|
|
1196
|
+
snapshot_content: {
|
|
1197
|
+
id: "child-1",
|
|
1198
|
+
parent_id: "parent-1",
|
|
1199
|
+
value: "Child Value",
|
|
1200
|
+
},
|
|
1201
|
+
schema_version: "1.0",
|
|
1202
|
+
version_id: sql `(SELECT version_id FROM active_version)`,
|
|
1203
|
+
})
|
|
1204
|
+
.execute();
|
|
1205
|
+
// Verify both entities exist
|
|
1206
|
+
const parentBefore = await lix.db
|
|
1207
|
+
.selectFrom("state_all")
|
|
1208
|
+
.where("entity_id", "=", "parent-1")
|
|
1209
|
+
.where("schema_key", "=", "parent_entity")
|
|
1210
|
+
.selectAll()
|
|
1211
|
+
.execute();
|
|
1212
|
+
const childBefore = await lix.db
|
|
1213
|
+
.selectFrom("state_all")
|
|
1214
|
+
.where("entity_id", "=", "child-1")
|
|
1215
|
+
.where("schema_key", "=", "child_entity")
|
|
1216
|
+
.selectAll()
|
|
1217
|
+
.execute();
|
|
1218
|
+
expectDeterministic(parentBefore).toHaveLength(1);
|
|
1219
|
+
expectDeterministic(childBefore).toHaveLength(1);
|
|
1220
|
+
// Attempting to delete the parent entity should fail due to foreign key constraint
|
|
1221
|
+
// because there's a child entity that references it
|
|
1222
|
+
await expect(lix.db
|
|
1223
|
+
.deleteFrom("state_all")
|
|
1224
|
+
.where("entity_id", "=", "parent-1")
|
|
1225
|
+
.where("schema_key", "=", "parent_entity")
|
|
1226
|
+
.execute()).rejects.toThrow(/foreign key/i);
|
|
1227
|
+
// Verify the parent still exists after failed deletion attempt
|
|
1228
|
+
const parentAfter = await lix.db
|
|
1229
|
+
.selectFrom("state_all")
|
|
1230
|
+
.where("entity_id", "=", "parent-1")
|
|
1231
|
+
.where("schema_key", "=", "parent_entity")
|
|
1232
|
+
.selectAll()
|
|
1233
|
+
.execute();
|
|
1234
|
+
expectDeterministic(parentAfter).toHaveLength(1);
|
|
1235
|
+
});
|
|
1236
|
+
simulationTest("child version inherits entities from parent version", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
1237
|
+
const lix = await openSimulatedLix({
|
|
1238
|
+
keyValues: [
|
|
1239
|
+
{
|
|
1240
|
+
key: "lix_deterministic_mode",
|
|
1241
|
+
value: { enabled: true, bootstrap: true },
|
|
1242
|
+
lixcol_version_id: "global",
|
|
1243
|
+
},
|
|
1244
|
+
],
|
|
1245
|
+
});
|
|
1246
|
+
// Insert an entity into global version
|
|
1247
|
+
await lix.db
|
|
1248
|
+
.insertInto("state_all")
|
|
1249
|
+
.values({
|
|
1250
|
+
entity_id: "global-entity-1",
|
|
1251
|
+
file_id: "test-file",
|
|
1252
|
+
schema_key: "test_schema",
|
|
1253
|
+
plugin_key: "test_plugin",
|
|
1254
|
+
version_id: "global",
|
|
1255
|
+
snapshot_content: {
|
|
1141
1256
|
id: "global-entity-1",
|
|
1142
1257
|
name: "Global Entity",
|
|
1143
|
-
}
|
|
1144
|
-
|
|
1145
|
-
|
|
1146
|
-
|
|
1147
|
-
|
|
1148
|
-
|
|
1149
|
-
|
|
1150
|
-
|
|
1151
|
-
|
|
1152
|
-
|
|
1153
|
-
|
|
1154
|
-
|
|
1155
|
-
|
|
1156
|
-
|
|
1157
|
-
|
|
1158
|
-
|
|
1159
|
-
|
|
1160
|
-
|
|
1161
|
-
|
|
1162
|
-
|
|
1163
|
-
|
|
1164
|
-
|
|
1165
|
-
|
|
1166
|
-
|
|
1167
|
-
|
|
1168
|
-
|
|
1169
|
-
.where("version_id", "=", "global")
|
|
1170
|
-
.selectAll()
|
|
1171
|
-
.executeTakeFirst();
|
|
1172
|
-
console.log("🌍 Global version after mutation:", {
|
|
1173
|
-
change_set_id: globalVersionAfterMutation?.snapshot_content
|
|
1174
|
-
?.change_set_id,
|
|
1175
|
-
original: originalChangeSetId,
|
|
1176
|
-
});
|
|
1177
|
-
if (clearCache) {
|
|
1178
|
-
// Clear the cache to force a rebuild from CTE
|
|
1179
|
-
await lix.db
|
|
1180
|
-
.deleteFrom("internal_state_cache")
|
|
1181
|
-
.execute();
|
|
1182
|
-
}
|
|
1183
|
-
const state = await lix.db
|
|
1184
|
-
.selectFrom("state_all")
|
|
1185
|
-
.where("schema_key", "=", "lix_version")
|
|
1186
|
-
.where("entity_id", "=", mainVersion.id)
|
|
1187
|
-
.selectAll()
|
|
1188
|
-
.execute();
|
|
1189
|
-
console.log("🔍 State query result:", state.map((s) => ({
|
|
1190
|
-
entity_id: s.entity_id,
|
|
1191
|
-
version_id: s.version_id,
|
|
1192
|
-
change_set_id: s.snapshot_content.change_set_id,
|
|
1193
|
-
inherited_from_version_id: s.inherited_from_version_id,
|
|
1194
|
-
})));
|
|
1195
|
-
// testing for cached contents first to make a cache miss test fail faster
|
|
1196
|
-
const cacheContents = await lix.db
|
|
1197
|
-
.selectFrom("internal_state_cache")
|
|
1198
|
-
.where("schema_key", "=", "lix_version")
|
|
1199
|
-
.where("entity_id", "=", mainVersion.id)
|
|
1200
|
-
.selectAll()
|
|
1201
|
-
.execute();
|
|
1202
|
-
// Both version entries should have the same updated change_set_id
|
|
1203
|
-
const cachedInheritedMainVersion = cacheContents.find((entry) => entry.version_id === mainVersion.id);
|
|
1204
|
-
const cachedMainVersionGlobal = cacheContents.find((entry) => entry.version_id === "global");
|
|
1205
|
-
// we have copy on write deletion in place, so the cache should not contain the inherited version
|
|
1206
|
-
expect(cachedInheritedMainVersion).toBeUndefined();
|
|
1207
|
-
expect(cachedMainVersionGlobal).toBeDefined();
|
|
1208
|
-
// Both version entries should have the same updated change_set_id
|
|
1209
|
-
const inheritedMainVersion = state.find((entry) => entry.version_id === mainVersion.id);
|
|
1210
|
-
const mainVersionGlobal = state.find((entry) => entry.version_id === "global");
|
|
1211
|
-
expect(inheritedMainVersion).toBeDefined();
|
|
1212
|
-
expect(mainVersionGlobal).toBeDefined();
|
|
1213
|
-
// Both should have the same change_set_id
|
|
1214
|
-
expect((inheritedMainVersion?.snapshot_content).change_set_id).toEqual((mainVersionGlobal?.snapshot_content).change_set_id);
|
|
1215
|
-
// The change_set_id should be different from the original change_set_Id
|
|
1216
|
-
expect((inheritedMainVersion?.snapshot_content).change_set_id).not.toEqual(originalChangeSetId);
|
|
1217
|
-
expect((mainVersionGlobal?.snapshot_content).change_set_id).not.toEqual(originalChangeSetId);
|
|
1218
|
-
expect((cachedMainVersionGlobal?.snapshot_content).change_set_id).toEqual(mainVersionGlobal?.snapshot_content.change_set_id);
|
|
1258
|
+
},
|
|
1259
|
+
schema_version: "1.0",
|
|
1260
|
+
})
|
|
1261
|
+
.execute();
|
|
1262
|
+
// Create a child version that inherits from global
|
|
1263
|
+
const childVersion = await createVersion({
|
|
1264
|
+
lix,
|
|
1265
|
+
name: "child-version",
|
|
1266
|
+
});
|
|
1267
|
+
// Verify inheritance was set up correctly
|
|
1268
|
+
expectDeterministic(childVersion.inherits_from_version_id).toBe("global");
|
|
1269
|
+
// The child version should inherit the entity from global
|
|
1270
|
+
const inheritedEntity = await lix.db
|
|
1271
|
+
.selectFrom("state_all")
|
|
1272
|
+
.where("entity_id", "=", "global-entity-1")
|
|
1273
|
+
.where("version_id", "=", childVersion.id)
|
|
1274
|
+
.selectAll()
|
|
1275
|
+
.execute();
|
|
1276
|
+
// This should pass - the entity should be visible in the child version via inheritance
|
|
1277
|
+
expectDeterministic(inheritedEntity).toHaveLength(1);
|
|
1278
|
+
expectDeterministic(inheritedEntity[0]?.entity_id).toBe("global-entity-1");
|
|
1279
|
+
expectDeterministic(inheritedEntity[0]?.version_id).toBe(childVersion.id); // Should return child version ID
|
|
1280
|
+
expectDeterministic(inheritedEntity[0]?.inherited_from_version_id).toBe("global"); // Should track inheritance source
|
|
1281
|
+
expectDeterministic(inheritedEntity[0]?.snapshot_content).toEqual({
|
|
1282
|
+
id: "global-entity-1",
|
|
1283
|
+
name: "Global Entity",
|
|
1219
1284
|
});
|
|
1220
1285
|
});
|
|
1221
|
-
|
|
1222
|
-
|
|
1223
|
-
|
|
1224
|
-
|
|
1225
|
-
|
|
1226
|
-
|
|
1227
|
-
|
|
1228
|
-
// Insert an entity into global version
|
|
1229
|
-
await lix.db
|
|
1230
|
-
.insertInto("state_all")
|
|
1231
|
-
.values({
|
|
1232
|
-
entity_id: "shared-entity",
|
|
1233
|
-
file_id: "test-file",
|
|
1234
|
-
schema_key: "test_schema",
|
|
1235
|
-
plugin_key: "test_plugin",
|
|
1236
|
-
version_id: "global",
|
|
1237
|
-
snapshot_content: {
|
|
1238
|
-
id: "shared-entity",
|
|
1239
|
-
name: "Original Global Value",
|
|
1240
|
-
count: 1,
|
|
1286
|
+
simulationTest("child version inherits then overrides with own entity", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
1287
|
+
const lix = await openSimulatedLix({
|
|
1288
|
+
keyValues: [
|
|
1289
|
+
{
|
|
1290
|
+
key: "lix_deterministic_mode",
|
|
1291
|
+
value: { enabled: true, bootstrap: true },
|
|
1292
|
+
lixcol_version_id: "global",
|
|
1241
1293
|
},
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
|
|
1245
|
-
|
|
1246
|
-
|
|
1247
|
-
|
|
1248
|
-
|
|
1249
|
-
|
|
1250
|
-
|
|
1251
|
-
|
|
1252
|
-
|
|
1253
|
-
|
|
1254
|
-
.where("entity_id", "=", "shared-entity")
|
|
1255
|
-
.where("version_id", "=", childVersion.id)
|
|
1256
|
-
.selectAll()
|
|
1257
|
-
.execute();
|
|
1258
|
-
expect(inheritedEntity).toHaveLength(1);
|
|
1259
|
-
expect(inheritedEntity[0]?.version_id).toBe(childVersion.id);
|
|
1260
|
-
expect(inheritedEntity[0]?.inherited_from_version_id).toBe("global");
|
|
1261
|
-
expect(inheritedEntity[0]?.snapshot_content).toEqual({
|
|
1262
|
-
id: "shared-entity",
|
|
1263
|
-
name: "Original Global Value",
|
|
1264
|
-
count: 1,
|
|
1265
|
-
});
|
|
1266
|
-
// Now modify the entity in the child version (copy-on-write)
|
|
1267
|
-
await lix.db
|
|
1268
|
-
.updateTable("state_all")
|
|
1269
|
-
.set({
|
|
1270
|
-
snapshot_content: {
|
|
1271
|
-
id: "shared-entity",
|
|
1272
|
-
name: "Modified in Child Version",
|
|
1273
|
-
count: 2,
|
|
1274
|
-
},
|
|
1275
|
-
})
|
|
1276
|
-
.where("entity_id", "=", "shared-entity")
|
|
1277
|
-
.where("version_id", "=", childVersion.id)
|
|
1278
|
-
.execute();
|
|
1279
|
-
// Clear cache after update to test cache miss scenario
|
|
1280
|
-
// if (clearCache) {
|
|
1281
|
-
// lix.sqlite.exec("DELETE FROM internal_state_cache");
|
|
1282
|
-
// }
|
|
1283
|
-
// Verify the child now has its own version of the entity
|
|
1284
|
-
const childEntity = await lix.db
|
|
1285
|
-
.selectFrom("state_all")
|
|
1286
|
-
.where("entity_id", "=", "shared-entity")
|
|
1287
|
-
.where("version_id", "=", childVersion.id)
|
|
1288
|
-
.selectAll()
|
|
1289
|
-
.execute();
|
|
1290
|
-
expect(childEntity).toHaveLength(1);
|
|
1291
|
-
expect(childEntity[0]?.version_id).toBe(childVersion.id);
|
|
1292
|
-
expect(childEntity[0]?.inherited_from_version_id).toBe(null); // No longer inherited
|
|
1293
|
-
expect(childEntity[0]?.snapshot_content).toEqual({
|
|
1294
|
-
id: "shared-entity",
|
|
1295
|
-
name: "Modified in Child Version",
|
|
1296
|
-
count: 2,
|
|
1297
|
-
});
|
|
1298
|
-
// Verify the global version still has the original value
|
|
1299
|
-
const globalEntity = await lix.db
|
|
1300
|
-
.selectFrom("state_all")
|
|
1301
|
-
.where("entity_id", "=", "shared-entity")
|
|
1302
|
-
.where("version_id", "=", "global")
|
|
1303
|
-
.selectAll()
|
|
1304
|
-
.execute();
|
|
1305
|
-
expect(globalEntity).toHaveLength(1);
|
|
1306
|
-
expect(globalEntity[0]?.version_id).toBe("global");
|
|
1307
|
-
expect(globalEntity[0]?.inherited_from_version_id).toBe(null);
|
|
1308
|
-
expect(globalEntity[0]?.snapshot_content).toEqual({
|
|
1294
|
+
],
|
|
1295
|
+
});
|
|
1296
|
+
// Insert an entity into global version
|
|
1297
|
+
await lix.db
|
|
1298
|
+
.insertInto("state_all")
|
|
1299
|
+
.values({
|
|
1300
|
+
entity_id: "shared-entity",
|
|
1301
|
+
file_id: "test-file",
|
|
1302
|
+
schema_key: "test_schema",
|
|
1303
|
+
plugin_key: "test_plugin",
|
|
1304
|
+
version_id: "global",
|
|
1305
|
+
snapshot_content: {
|
|
1309
1306
|
id: "shared-entity",
|
|
1310
1307
|
name: "Original Global Value",
|
|
1311
1308
|
count: 1,
|
|
1312
|
-
}
|
|
1313
|
-
|
|
1314
|
-
|
|
1315
|
-
|
|
1316
|
-
|
|
1317
|
-
|
|
1318
|
-
|
|
1319
|
-
|
|
1320
|
-
|
|
1321
|
-
|
|
1322
|
-
|
|
1323
|
-
|
|
1324
|
-
|
|
1325
|
-
|
|
1326
|
-
|
|
1327
|
-
|
|
1328
|
-
|
|
1329
|
-
|
|
1330
|
-
|
|
1331
|
-
|
|
1332
|
-
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1309
|
+
},
|
|
1310
|
+
schema_version: "1.0",
|
|
1311
|
+
})
|
|
1312
|
+
.execute();
|
|
1313
|
+
// Create a child version that inherits from global
|
|
1314
|
+
const childVersion = await createVersion({
|
|
1315
|
+
lix,
|
|
1316
|
+
id: "child-version",
|
|
1317
|
+
inherits_from_version_id: "global",
|
|
1318
|
+
});
|
|
1319
|
+
// Verify the child initially sees the inherited entity
|
|
1320
|
+
const inheritedEntity = await lix.db
|
|
1321
|
+
.selectFrom("state_all")
|
|
1322
|
+
.where("entity_id", "=", "shared-entity")
|
|
1323
|
+
.where("version_id", "=", childVersion.id)
|
|
1324
|
+
.selectAll()
|
|
1325
|
+
.execute();
|
|
1326
|
+
expectDeterministic(inheritedEntity).toHaveLength(1);
|
|
1327
|
+
expectDeterministic(inheritedEntity[0]?.version_id).toBe(childVersion.id);
|
|
1328
|
+
expectDeterministic(inheritedEntity[0]?.inherited_from_version_id).toBe("global");
|
|
1329
|
+
expectDeterministic(inheritedEntity[0]?.snapshot_content).toEqual({
|
|
1330
|
+
id: "shared-entity",
|
|
1331
|
+
name: "Original Global Value",
|
|
1332
|
+
count: 1,
|
|
1333
|
+
});
|
|
1334
|
+
// Now modify the entity in the child version (copy-on-write)
|
|
1335
|
+
await lix.db
|
|
1336
|
+
.updateTable("state_all")
|
|
1337
|
+
.set({
|
|
1338
|
+
snapshot_content: {
|
|
1339
|
+
id: "shared-entity",
|
|
1340
|
+
name: "Modified in Child Version",
|
|
1341
|
+
count: 2,
|
|
1342
|
+
},
|
|
1343
|
+
})
|
|
1344
|
+
.where("entity_id", "=", "shared-entity")
|
|
1345
|
+
.where("version_id", "=", childVersion.id)
|
|
1346
|
+
.execute();
|
|
1347
|
+
// Verify the child now has its own version of the entity
|
|
1348
|
+
const childEntity = await lix.db
|
|
1349
|
+
.selectFrom("state_all")
|
|
1350
|
+
.where("entity_id", "=", "shared-entity")
|
|
1351
|
+
.where("version_id", "=", childVersion.id)
|
|
1352
|
+
.selectAll()
|
|
1353
|
+
.execute();
|
|
1354
|
+
expectDeterministic(childEntity).toHaveLength(1);
|
|
1355
|
+
expectDeterministic(childEntity[0]?.version_id).toBe(childVersion.id);
|
|
1356
|
+
expectDeterministic(childEntity[0]?.inherited_from_version_id).toBe(null); // No longer inherited
|
|
1357
|
+
expectDeterministic(childEntity[0]?.snapshot_content).toEqual({
|
|
1358
|
+
id: "shared-entity",
|
|
1359
|
+
name: "Modified in Child Version",
|
|
1360
|
+
count: 2,
|
|
1361
|
+
});
|
|
1362
|
+
// Verify the global version still has the original value
|
|
1363
|
+
const globalEntity = await lix.db
|
|
1364
|
+
.selectFrom("state_all")
|
|
1365
|
+
.where("entity_id", "=", "shared-entity")
|
|
1366
|
+
.where("version_id", "=", "global")
|
|
1367
|
+
.selectAll()
|
|
1368
|
+
.execute();
|
|
1369
|
+
expectDeterministic(globalEntity).toHaveLength(1);
|
|
1370
|
+
expectDeterministic(globalEntity[0]?.version_id).toBe("global");
|
|
1371
|
+
expectDeterministic(globalEntity[0]?.inherited_from_version_id).toBe(null);
|
|
1372
|
+
expectDeterministic(globalEntity[0]?.snapshot_content).toEqual({
|
|
1373
|
+
id: "shared-entity",
|
|
1374
|
+
name: "Original Global Value",
|
|
1375
|
+
count: 1,
|
|
1376
|
+
});
|
|
1377
|
+
// Verify we now have 2 separate entities (one in global, one in child)
|
|
1378
|
+
const allEntities = await lix.db
|
|
1379
|
+
.selectFrom("state_all")
|
|
1380
|
+
.where("entity_id", "=", "shared-entity")
|
|
1381
|
+
.where("version_id", "in", ["global", childVersion.id])
|
|
1382
|
+
.orderBy("version_id", "asc")
|
|
1383
|
+
.selectAll()
|
|
1384
|
+
.execute();
|
|
1385
|
+
expectDeterministic(allEntities).toHaveLength(2);
|
|
1386
|
+
// Child version entity (modified)
|
|
1387
|
+
expectDeterministic(allEntities[0]?.version_id).toBe(childVersion.id);
|
|
1388
|
+
expectDeterministic(allEntities[0]?.inherited_from_version_id).toBe(null);
|
|
1389
|
+
expectDeterministic(allEntities[0]?.snapshot_content).toEqual({
|
|
1390
|
+
id: "shared-entity",
|
|
1391
|
+
name: "Modified in Child Version",
|
|
1392
|
+
count: 2,
|
|
1393
|
+
});
|
|
1394
|
+
// Global version entity (original)
|
|
1395
|
+
expectDeterministic(allEntities[1]?.version_id).toBe("global");
|
|
1396
|
+
expectDeterministic(allEntities[1]?.inherited_from_version_id).toBe(null);
|
|
1397
|
+
expectDeterministic(allEntities[1]?.snapshot_content).toEqual({
|
|
1398
|
+
id: "shared-entity",
|
|
1399
|
+
name: "Original Global Value",
|
|
1400
|
+
count: 1,
|
|
1401
|
+
});
|
|
1402
|
+
});
|
|
1403
|
+
simulationTest("child version deletes inherited entity via copy-on-write", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
1404
|
+
const mockSchema = {
|
|
1405
|
+
"x-lix-key": "test_schema",
|
|
1406
|
+
"x-lix-version": "1.0",
|
|
1407
|
+
type: "object",
|
|
1408
|
+
additionalProperties: false,
|
|
1409
|
+
properties: {
|
|
1410
|
+
id: { type: "string" },
|
|
1411
|
+
name: { type: "string" },
|
|
1412
|
+
},
|
|
1413
|
+
};
|
|
1414
|
+
const lix = await openSimulatedLix({
|
|
1415
|
+
keyValues: [
|
|
1416
|
+
{
|
|
1417
|
+
key: "lix_deterministic_mode",
|
|
1418
|
+
value: { enabled: true, bootstrap: true },
|
|
1419
|
+
lixcol_version_id: "global",
|
|
1420
|
+
},
|
|
1421
|
+
],
|
|
1338
1422
|
});
|
|
1423
|
+
const activeVersion = await lix.db
|
|
1424
|
+
.selectFrom("active_version")
|
|
1425
|
+
.innerJoin("version", "active_version.version_id", "version.id")
|
|
1426
|
+
.selectAll("version")
|
|
1427
|
+
.executeTakeFirstOrThrow();
|
|
1428
|
+
// Insert schema
|
|
1429
|
+
await lix.db
|
|
1430
|
+
.insertInto("stored_schema")
|
|
1431
|
+
.values({ value: mockSchema })
|
|
1432
|
+
.execute();
|
|
1433
|
+
// Insert an entity into global version
|
|
1434
|
+
await lix.db
|
|
1435
|
+
.insertInto("state_all")
|
|
1436
|
+
.values({
|
|
1437
|
+
entity_id: "shared-entity",
|
|
1438
|
+
file_id: "test-file",
|
|
1439
|
+
schema_key: "test_schema",
|
|
1440
|
+
plugin_key: "test_plugin",
|
|
1441
|
+
version_id: "global",
|
|
1442
|
+
snapshot_content: {
|
|
1443
|
+
id: "shared-entity",
|
|
1444
|
+
name: "shared Entity",
|
|
1445
|
+
},
|
|
1446
|
+
schema_version: "1.0",
|
|
1447
|
+
})
|
|
1448
|
+
.execute();
|
|
1449
|
+
// Verify the child initially sees the inherited entity
|
|
1450
|
+
const inheritedEntity = await lix.db
|
|
1451
|
+
.selectFrom("state_all")
|
|
1452
|
+
.where("entity_id", "=", "shared-entity")
|
|
1453
|
+
.where("version_id", "=", activeVersion.id)
|
|
1454
|
+
.selectAll()
|
|
1455
|
+
.execute();
|
|
1456
|
+
expectDeterministic(inheritedEntity).toHaveLength(1);
|
|
1457
|
+
expectDeterministic(inheritedEntity[0]?.version_id).toBe(activeVersion.id);
|
|
1458
|
+
expectDeterministic(inheritedEntity[0]?.inherited_from_version_id).toBe("global");
|
|
1459
|
+
// Delete the inherited entity in child version (should create copy-on-write deletion)
|
|
1460
|
+
await lix.db
|
|
1461
|
+
.deleteFrom("state_all")
|
|
1462
|
+
.where("entity_id", "=", "shared-entity")
|
|
1463
|
+
.where("version_id", "=", activeVersion.id)
|
|
1464
|
+
.execute();
|
|
1465
|
+
// Verify the entity is deleted in child version
|
|
1466
|
+
const childEntityAfterDelete = await lix.db
|
|
1467
|
+
.selectFrom("state_all")
|
|
1468
|
+
.where("entity_id", "=", "shared-entity")
|
|
1469
|
+
.where("version_id", "=", activeVersion.id)
|
|
1470
|
+
.selectAll()
|
|
1471
|
+
.execute();
|
|
1472
|
+
// Entity should be deleted in child version (copy-on-write deletion)
|
|
1473
|
+
expectDeterministic(childEntityAfterDelete).toHaveLength(0);
|
|
1474
|
+
// Verify the entity still exists in global version (not affected by child deletion)
|
|
1475
|
+
const inheritedEntityAfterDelete = await lix.db
|
|
1476
|
+
.selectFrom("state_all")
|
|
1477
|
+
.where("entity_id", "=", "shared-entity")
|
|
1478
|
+
.where("version_id", "=", "global")
|
|
1479
|
+
.selectAll()
|
|
1480
|
+
.execute();
|
|
1481
|
+
expectDeterministic(inheritedEntityAfterDelete).toHaveLength(1);
|
|
1482
|
+
expectDeterministic(inheritedEntityAfterDelete[0]?.snapshot_content).toEqual({
|
|
1483
|
+
id: "shared-entity",
|
|
1484
|
+
name: "shared Entity",
|
|
1485
|
+
});
|
|
1486
|
+
// Verify we now only see the global entity through the state view (deletion marker is hidden)
|
|
1487
|
+
const allEntities = await lix.db
|
|
1488
|
+
.selectFrom("state_all")
|
|
1489
|
+
.where("entity_id", "=", "shared-entity")
|
|
1490
|
+
.selectAll()
|
|
1491
|
+
.execute();
|
|
1492
|
+
// Both cache hit and cache miss scenarios should behave identically:
|
|
1493
|
+
// copy-on-write deletion hides the entity from child but preserves it in parent
|
|
1494
|
+
expectDeterministic(allEntities).toHaveLength(1);
|
|
1495
|
+
expectDeterministic(allEntities[0]?.version_id).toBe("global");
|
|
1496
|
+
expectDeterministic(allEntities[0]?.inherited_from_version_id).toBe(null); // It's the original global entity
|
|
1339
1497
|
});
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
"x-lix-version": "1.0",
|
|
1348
|
-
type: "object",
|
|
1349
|
-
additionalProperties: false,
|
|
1350
|
-
properties: {
|
|
1351
|
-
id: { type: "string" },
|
|
1352
|
-
name: { type: "string" },
|
|
1498
|
+
simulationTest("deleting without filtering for the version_id deletes the entity from all versions", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
1499
|
+
const lix = await openSimulatedLix({
|
|
1500
|
+
keyValues: [
|
|
1501
|
+
{
|
|
1502
|
+
key: "lix_deterministic_mode",
|
|
1503
|
+
value: { enabled: true, bootstrap: true },
|
|
1504
|
+
lixcol_version_id: "global",
|
|
1353
1505
|
},
|
|
1354
|
-
|
|
1355
|
-
|
|
1356
|
-
|
|
1357
|
-
|
|
1358
|
-
|
|
1359
|
-
|
|
1360
|
-
|
|
1361
|
-
|
|
1362
|
-
|
|
1363
|
-
|
|
1364
|
-
|
|
1365
|
-
|
|
1366
|
-
|
|
1367
|
-
|
|
1368
|
-
|
|
1369
|
-
|
|
1506
|
+
],
|
|
1507
|
+
});
|
|
1508
|
+
// Insert an entity into global version
|
|
1509
|
+
await lix.db
|
|
1510
|
+
.insertInto("state_all")
|
|
1511
|
+
.values({
|
|
1512
|
+
entity_id: "shared-entity",
|
|
1513
|
+
file_id: "test-file",
|
|
1514
|
+
schema_key: "test_schema",
|
|
1515
|
+
plugin_key: "test_plugin",
|
|
1516
|
+
version_id: "global",
|
|
1517
|
+
snapshot_content: {
|
|
1518
|
+
id: "shared-entity",
|
|
1519
|
+
name: "Global Entity",
|
|
1520
|
+
},
|
|
1521
|
+
schema_version: "1.0",
|
|
1522
|
+
})
|
|
1523
|
+
.execute();
|
|
1524
|
+
// Create a child version that inherits from global
|
|
1525
|
+
const childVersion = await createVersion({
|
|
1526
|
+
lix,
|
|
1527
|
+
name: "child-version",
|
|
1528
|
+
inherits_from_version_id: "global",
|
|
1529
|
+
});
|
|
1530
|
+
// Verify inheritance - both global and child should see the entity
|
|
1531
|
+
const beforeDelete = await lix.db
|
|
1532
|
+
.selectFrom("state_all")
|
|
1533
|
+
.where("entity_id", "=", "shared-entity")
|
|
1534
|
+
.where("version_id", "in", ["global", childVersion.id])
|
|
1535
|
+
.selectAll()
|
|
1536
|
+
.execute();
|
|
1537
|
+
expectDeterministic(beforeDelete).toHaveLength(2); // One in global, one inherited in child
|
|
1538
|
+
expectDeterministic(beforeDelete).toMatchObject([
|
|
1539
|
+
{
|
|
1370
1540
|
entity_id: "shared-entity",
|
|
1371
|
-
file_id: "test-file",
|
|
1372
|
-
schema_key: "test_schema",
|
|
1373
|
-
plugin_key: "test_plugin",
|
|
1374
1541
|
version_id: "global",
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1542
|
+
inherited_from_version_id: null,
|
|
1543
|
+
snapshot_content: { id: "shared-entity", name: "Global Entity" },
|
|
1544
|
+
},
|
|
1545
|
+
{
|
|
1546
|
+
entity_id: "shared-entity",
|
|
1547
|
+
version_id: childVersion.id,
|
|
1548
|
+
inherited_from_version_id: "global",
|
|
1549
|
+
snapshot_content: { id: "shared-entity", name: "Global Entity" },
|
|
1550
|
+
},
|
|
1551
|
+
]);
|
|
1552
|
+
await lix.db
|
|
1553
|
+
.deleteFrom("state_all")
|
|
1554
|
+
.where("entity_id", "=", "shared-entity")
|
|
1555
|
+
.where("schema_key", "=", "test_schema")
|
|
1556
|
+
.execute();
|
|
1557
|
+
const afterDelete = await lix.db
|
|
1558
|
+
.selectFrom("state_all")
|
|
1559
|
+
.where("entity_id", "=", "shared-entity")
|
|
1560
|
+
.selectAll()
|
|
1561
|
+
.execute();
|
|
1562
|
+
// Should be deleted from every version
|
|
1563
|
+
expectDeterministic(afterDelete).toHaveLength(0);
|
|
1564
|
+
});
|
|
1565
|
+
simulationTest("untracked mutations don't trigger change control", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
1566
|
+
const lix = await openSimulatedLix({
|
|
1567
|
+
keyValues: [
|
|
1568
|
+
{
|
|
1569
|
+
key: "lix_deterministic_mode",
|
|
1570
|
+
value: { enabled: true, bootstrap: true },
|
|
1571
|
+
lixcol_version_id: "global",
|
|
1572
|
+
},
|
|
1573
|
+
],
|
|
1574
|
+
});
|
|
1575
|
+
const mockSchema = {
|
|
1576
|
+
"x-lix-key": "mock_schema",
|
|
1577
|
+
"x-lix-version": "1.0",
|
|
1578
|
+
type: "object",
|
|
1579
|
+
additionalProperties: false,
|
|
1580
|
+
properties: {
|
|
1581
|
+
value: {
|
|
1582
|
+
type: "string",
|
|
1583
|
+
},
|
|
1584
|
+
},
|
|
1585
|
+
};
|
|
1586
|
+
await lix.db
|
|
1587
|
+
.insertInto("stored_schema")
|
|
1588
|
+
.values({ value: mockSchema })
|
|
1589
|
+
.execute();
|
|
1590
|
+
// Count changes before any untracked mutations
|
|
1591
|
+
const changesInitial = await lix.db
|
|
1592
|
+
.selectFrom("change")
|
|
1593
|
+
.selectAll()
|
|
1594
|
+
.execute();
|
|
1595
|
+
// 1. INSERT untracked state
|
|
1596
|
+
await lix.db
|
|
1597
|
+
.insertInto("state_all")
|
|
1598
|
+
.values({
|
|
1599
|
+
entity_id: "untracked-entity",
|
|
1600
|
+
file_id: "test-file",
|
|
1601
|
+
schema_key: "mock_schema",
|
|
1602
|
+
plugin_key: "test_plugin",
|
|
1603
|
+
schema_version: "1.0",
|
|
1604
|
+
version_id: sql `(SELECT version_id FROM active_version)`,
|
|
1605
|
+
snapshot_content: {
|
|
1606
|
+
value: "untracked value",
|
|
1607
|
+
},
|
|
1608
|
+
untracked: true,
|
|
1609
|
+
})
|
|
1610
|
+
.execute();
|
|
1611
|
+
// Count changes after untracked insert
|
|
1612
|
+
const changesAfterInsert = await lix.db
|
|
1613
|
+
.selectFrom("change")
|
|
1614
|
+
.selectAll()
|
|
1615
|
+
.execute();
|
|
1616
|
+
// Number of changes should be identical (no change control for untracked)
|
|
1617
|
+
expectDeterministic(changesAfterInsert.length).toBe(changesInitial.length);
|
|
1618
|
+
// Verify the untracked entity exists in state view
|
|
1619
|
+
const untrackedState = await lix.db
|
|
1620
|
+
.selectFrom("state_all")
|
|
1621
|
+
.where("entity_id", "=", "untracked-entity")
|
|
1622
|
+
.selectAll()
|
|
1623
|
+
.execute();
|
|
1624
|
+
expectDeterministic(untrackedState).toHaveLength(1);
|
|
1625
|
+
expectDeterministic(untrackedState[0]?.snapshot_content).toEqual({
|
|
1626
|
+
value: "untracked value",
|
|
1627
|
+
});
|
|
1628
|
+
expectDeterministic(untrackedState[0]?.untracked).toBe(1);
|
|
1629
|
+
// 2. UPDATE untracked state
|
|
1630
|
+
await lix.db
|
|
1631
|
+
.updateTable("state_all")
|
|
1632
|
+
.where("entity_id", "=", "untracked-entity")
|
|
1633
|
+
.set({
|
|
1634
|
+
snapshot_content: {
|
|
1635
|
+
value: "untracked value updated",
|
|
1636
|
+
},
|
|
1637
|
+
untracked: true,
|
|
1638
|
+
})
|
|
1639
|
+
.execute();
|
|
1640
|
+
// Count changes after untracked update
|
|
1641
|
+
const changesAfterUpdate = await lix.db
|
|
1642
|
+
.selectFrom("change")
|
|
1643
|
+
.selectAll()
|
|
1644
|
+
.execute();
|
|
1645
|
+
// Number of changes should still be identical (no change control for untracked)
|
|
1646
|
+
expectDeterministic(changesAfterUpdate.length).toBe(changesInitial.length);
|
|
1647
|
+
// Verify the untracked entity was updated
|
|
1648
|
+
const updatedState = await lix.db
|
|
1649
|
+
.selectFrom("state_all")
|
|
1650
|
+
.where("entity_id", "=", "untracked-entity")
|
|
1651
|
+
.selectAll()
|
|
1652
|
+
.execute();
|
|
1653
|
+
expectDeterministic(updatedState).toHaveLength(1);
|
|
1654
|
+
expectDeterministic(updatedState[0]?.snapshot_content).toEqual({
|
|
1655
|
+
value: "untracked value updated",
|
|
1656
|
+
});
|
|
1657
|
+
expectDeterministic(updatedState[0]?.untracked).toBe(1);
|
|
1658
|
+
// 3. DELETE untracked state
|
|
1659
|
+
await lix.db
|
|
1660
|
+
.deleteFrom("state_all")
|
|
1661
|
+
.where("entity_id", "=", "untracked-entity")
|
|
1662
|
+
.execute();
|
|
1663
|
+
// Count changes after untracked delete
|
|
1664
|
+
const changesAfterDelete = await lix.db
|
|
1665
|
+
.selectFrom("change")
|
|
1666
|
+
.selectAll()
|
|
1667
|
+
.execute();
|
|
1668
|
+
// Number of changes should still be identical (no change control for untracked)
|
|
1669
|
+
expectDeterministic(changesAfterDelete.length).toBe(changesInitial.length);
|
|
1670
|
+
// Verify the untracked entity was deleted
|
|
1671
|
+
const deletedState = await lix.db
|
|
1672
|
+
.selectFrom("state_all")
|
|
1673
|
+
.where("entity_id", "=", "untracked-entity")
|
|
1674
|
+
.selectAll()
|
|
1675
|
+
.execute();
|
|
1676
|
+
expectDeterministic(deletedState).toHaveLength(0);
|
|
1677
|
+
});
|
|
1678
|
+
simulationTest("tracked update to previously untracked entity deletes untracked state", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
1679
|
+
const lix = await openSimulatedLix({
|
|
1680
|
+
keyValues: [
|
|
1681
|
+
{
|
|
1682
|
+
key: "lix_deterministic_mode",
|
|
1683
|
+
value: { enabled: true, bootstrap: true },
|
|
1684
|
+
lixcol_version_id: "global",
|
|
1685
|
+
},
|
|
1686
|
+
],
|
|
1687
|
+
});
|
|
1688
|
+
const mockSchema = {
|
|
1689
|
+
"x-lix-key": "mock_schema",
|
|
1690
|
+
"x-lix-version": "1.0",
|
|
1691
|
+
type: "object",
|
|
1692
|
+
additionalProperties: false,
|
|
1693
|
+
properties: {
|
|
1694
|
+
value: {
|
|
1695
|
+
type: "string",
|
|
1696
|
+
},
|
|
1697
|
+
},
|
|
1698
|
+
};
|
|
1699
|
+
await lix.db
|
|
1700
|
+
.insertInto("stored_schema")
|
|
1701
|
+
.values({ value: mockSchema })
|
|
1702
|
+
.execute();
|
|
1703
|
+
// Insert untracked state
|
|
1704
|
+
await lix.db
|
|
1705
|
+
.insertInto("state_all")
|
|
1706
|
+
.values({
|
|
1707
|
+
entity_id: "override-entity",
|
|
1708
|
+
file_id: "test-file",
|
|
1709
|
+
schema_key: "mock_schema",
|
|
1710
|
+
plugin_key: "test_plugin",
|
|
1711
|
+
schema_version: "1.0",
|
|
1712
|
+
version_id: sql `(SELECT version_id FROM active_version)`,
|
|
1713
|
+
snapshot_content: {
|
|
1714
|
+
value: "untracked value",
|
|
1715
|
+
},
|
|
1716
|
+
untracked: true,
|
|
1717
|
+
})
|
|
1718
|
+
.execute();
|
|
1719
|
+
// Verify untracked state exists
|
|
1720
|
+
const untrackedState = await lix.db
|
|
1721
|
+
.selectFrom("state_all")
|
|
1722
|
+
.where("entity_id", "=", "override-entity")
|
|
1723
|
+
.selectAll()
|
|
1724
|
+
.execute();
|
|
1725
|
+
expectDeterministic(untrackedState).toHaveLength(1);
|
|
1726
|
+
expectDeterministic(untrackedState[0]?.snapshot_content).toEqual({
|
|
1727
|
+
value: "untracked value",
|
|
1728
|
+
});
|
|
1729
|
+
// Now update the untracked entity to make it tracked (should delete from untracked table)
|
|
1730
|
+
await lix.db
|
|
1731
|
+
.updateTable("state_all")
|
|
1732
|
+
.set({
|
|
1733
|
+
snapshot_content: {
|
|
1734
|
+
value: "tracked value",
|
|
1735
|
+
},
|
|
1736
|
+
untracked: false,
|
|
1737
|
+
})
|
|
1738
|
+
.where("entity_id", "=", "override-entity")
|
|
1739
|
+
.where("schema_key", "=", "mock_schema")
|
|
1740
|
+
.execute();
|
|
1741
|
+
// Verify tracked state has overridden untracked state
|
|
1742
|
+
const finalState = await lix.db
|
|
1743
|
+
.selectFrom("state_all")
|
|
1744
|
+
.where("entity_id", "=", "override-entity")
|
|
1745
|
+
.selectAll()
|
|
1746
|
+
.execute();
|
|
1747
|
+
expectDeterministic(finalState).toHaveLength(1);
|
|
1748
|
+
expectDeterministic(finalState[0]?.snapshot_content).toEqual({
|
|
1749
|
+
value: "tracked value",
|
|
1750
|
+
});
|
|
1751
|
+
// Verify a change was created for the tracked mutation
|
|
1752
|
+
const changes = await lix.db
|
|
1753
|
+
.selectFrom("change")
|
|
1754
|
+
.where("entity_id", "=", "override-entity")
|
|
1755
|
+
.where("schema_key", "=", "mock_schema")
|
|
1756
|
+
.selectAll()
|
|
1757
|
+
.execute();
|
|
1758
|
+
expectDeterministic(changes.length).toBeGreaterThan(0);
|
|
1759
|
+
});
|
|
1760
|
+
simulationTest("untracked state is persisted across lix sessions", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
1761
|
+
const mockSchema = {
|
|
1762
|
+
"x-lix-key": "mock_schema",
|
|
1763
|
+
"x-lix-version": "1.0",
|
|
1764
|
+
type: "object",
|
|
1765
|
+
additionalProperties: false,
|
|
1766
|
+
properties: {
|
|
1767
|
+
value: {
|
|
1768
|
+
type: "string",
|
|
1769
|
+
},
|
|
1770
|
+
},
|
|
1771
|
+
};
|
|
1772
|
+
// First session - create and insert untracked state
|
|
1773
|
+
const lix1 = await openSimulatedLix({
|
|
1774
|
+
keyValues: [
|
|
1775
|
+
{
|
|
1776
|
+
key: "lix_deterministic_mode",
|
|
1777
|
+
value: { enabled: true, bootstrap: true },
|
|
1778
|
+
lixcol_version_id: "global",
|
|
1779
|
+
},
|
|
1780
|
+
],
|
|
1781
|
+
});
|
|
1782
|
+
await lix1.db
|
|
1783
|
+
.insertInto("stored_schema")
|
|
1784
|
+
.values({ value: mockSchema })
|
|
1785
|
+
.execute();
|
|
1786
|
+
await lix1.db
|
|
1787
|
+
.insertInto("state_all")
|
|
1788
|
+
.values({
|
|
1789
|
+
entity_id: "persistent-entity",
|
|
1790
|
+
file_id: "test-file",
|
|
1791
|
+
schema_key: "mock_schema",
|
|
1792
|
+
plugin_key: "test_plugin",
|
|
1793
|
+
schema_version: "1.0",
|
|
1794
|
+
version_id: sql `(SELECT version_id FROM active_version)`,
|
|
1795
|
+
snapshot_content: {
|
|
1796
|
+
value: "persistent untracked value",
|
|
1797
|
+
},
|
|
1798
|
+
untracked: true,
|
|
1799
|
+
})
|
|
1800
|
+
.execute();
|
|
1801
|
+
// Second session - verify untracked state persists
|
|
1802
|
+
const lix2 = await openLix({ blob: await lix1.toBlob() });
|
|
1803
|
+
const persistedState = await lix2.db
|
|
1804
|
+
.selectFrom("state_all")
|
|
1805
|
+
.where("entity_id", "=", "persistent-entity")
|
|
1806
|
+
.selectAll()
|
|
1807
|
+
.execute();
|
|
1808
|
+
expectDeterministic(persistedState).toHaveLength(1);
|
|
1809
|
+
expectDeterministic(persistedState[0]?.snapshot_content).toEqual({
|
|
1810
|
+
value: "persistent untracked value",
|
|
1811
|
+
});
|
|
1812
|
+
await lix2.close();
|
|
1813
|
+
});
|
|
1814
|
+
simulationTest("untracked state has highest priority in UNION (untracked > tracked > inherited)", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
1815
|
+
const lix = await openSimulatedLix({
|
|
1816
|
+
keyValues: [
|
|
1817
|
+
{
|
|
1818
|
+
key: "lix_deterministic_mode",
|
|
1819
|
+
value: { enabled: true, bootstrap: true },
|
|
1820
|
+
lixcol_version_id: "global",
|
|
1821
|
+
},
|
|
1822
|
+
],
|
|
1823
|
+
});
|
|
1824
|
+
const mockSchema = {
|
|
1825
|
+
"x-lix-key": "mock_schema",
|
|
1826
|
+
"x-lix-version": "1.0",
|
|
1827
|
+
type: "object",
|
|
1828
|
+
additionalProperties: false,
|
|
1829
|
+
properties: {
|
|
1830
|
+
value: {
|
|
1831
|
+
type: "string",
|
|
1832
|
+
},
|
|
1833
|
+
},
|
|
1834
|
+
};
|
|
1835
|
+
await lix.db
|
|
1836
|
+
.insertInto("stored_schema")
|
|
1837
|
+
.values({ value: mockSchema })
|
|
1838
|
+
.execute();
|
|
1839
|
+
// Step 1: Insert tracked state with "init"
|
|
1840
|
+
await lix.db
|
|
1841
|
+
.insertInto("state_all")
|
|
1842
|
+
.values({
|
|
1843
|
+
entity_id: "entity0",
|
|
1844
|
+
file_id: "test-file",
|
|
1845
|
+
schema_key: "mock_schema",
|
|
1846
|
+
plugin_key: "test_plugin",
|
|
1847
|
+
schema_version: "1.0",
|
|
1848
|
+
version_id: sql `(SELECT version_id FROM active_version)`,
|
|
1849
|
+
snapshot_content: {
|
|
1850
|
+
value: "init",
|
|
1851
|
+
},
|
|
1852
|
+
untracked: false,
|
|
1853
|
+
})
|
|
1854
|
+
.execute();
|
|
1855
|
+
// Verify tracked state exists
|
|
1856
|
+
const afterInit = await lix.db
|
|
1857
|
+
.selectFrom("state_all")
|
|
1858
|
+
.where("entity_id", "=", "entity0")
|
|
1859
|
+
.selectAll()
|
|
1860
|
+
.execute();
|
|
1861
|
+
expectDeterministic(afterInit).toHaveLength(1);
|
|
1862
|
+
expectDeterministic(afterInit[0]?.snapshot_content).toEqual({
|
|
1863
|
+
value: "init",
|
|
1864
|
+
});
|
|
1865
|
+
// Step 2: Update to untracked state with "update" (should NOT delete tracked state)
|
|
1866
|
+
await lix.db
|
|
1867
|
+
.updateTable("state_all")
|
|
1868
|
+
.set({
|
|
1869
|
+
snapshot_content: {
|
|
1870
|
+
value: "update",
|
|
1871
|
+
},
|
|
1872
|
+
untracked: true,
|
|
1873
|
+
})
|
|
1874
|
+
.where("entity_id", "=", "entity0")
|
|
1875
|
+
.where("schema_key", "=", "mock_schema")
|
|
1876
|
+
.execute();
|
|
1877
|
+
// Step 3: Query should return untracked state "update" (highest priority)
|
|
1878
|
+
const afterUntrackedUpdate = await lix.db
|
|
1879
|
+
.selectFrom("state_all")
|
|
1880
|
+
.where("entity_id", "=", "entity0")
|
|
1881
|
+
.selectAll()
|
|
1882
|
+
.execute();
|
|
1883
|
+
expectDeterministic(afterUntrackedUpdate).toHaveLength(1);
|
|
1884
|
+
expectDeterministic(afterUntrackedUpdate[0]?.snapshot_content).toEqual({
|
|
1885
|
+
value: "update",
|
|
1886
|
+
});
|
|
1887
|
+
// Step 4: Update back to tracked state with "update2" (should delete untracked state)
|
|
1888
|
+
await lix.db
|
|
1889
|
+
.updateTable("state_all")
|
|
1890
|
+
.set({
|
|
1891
|
+
snapshot_content: {
|
|
1892
|
+
value: "update2",
|
|
1893
|
+
},
|
|
1894
|
+
untracked: false,
|
|
1895
|
+
})
|
|
1896
|
+
.where("entity_id", "=", "entity0")
|
|
1897
|
+
.where("schema_key", "=", "mock_schema")
|
|
1898
|
+
.execute();
|
|
1899
|
+
// Step 5: Query should return tracked state "update2"
|
|
1900
|
+
const afterTrackedUpdate = await lix.db
|
|
1901
|
+
.selectFrom("state_all")
|
|
1902
|
+
.where("entity_id", "=", "entity0")
|
|
1903
|
+
.selectAll()
|
|
1904
|
+
.execute();
|
|
1905
|
+
expectDeterministic(afterTrackedUpdate).toHaveLength(1);
|
|
1906
|
+
expectDeterministic(afterTrackedUpdate[0]?.snapshot_content).toEqual({
|
|
1907
|
+
value: "update2",
|
|
1908
|
+
});
|
|
1909
|
+
// Verify that a change was created for the final tracked mutation
|
|
1910
|
+
const changes = await lix.db
|
|
1911
|
+
.selectFrom("change")
|
|
1912
|
+
.where("entity_id", "=", "entity0")
|
|
1913
|
+
.where("schema_key", "=", "mock_schema")
|
|
1914
|
+
.selectAll()
|
|
1915
|
+
.execute();
|
|
1916
|
+
expectDeterministic(changes.length).toBeGreaterThan(0);
|
|
1917
|
+
});
|
|
1918
|
+
simulationTest("untracked state overrides inherited state (untracked > inherited)", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
1919
|
+
const lix = await openSimulatedLix({
|
|
1920
|
+
keyValues: [
|
|
1921
|
+
{
|
|
1922
|
+
key: "lix_deterministic_mode",
|
|
1923
|
+
value: { enabled: true, bootstrap: true },
|
|
1924
|
+
lixcol_version_id: "global",
|
|
1378
1925
|
},
|
|
1379
|
-
|
|
1380
|
-
})
|
|
1381
|
-
.execute();
|
|
1382
|
-
if (clearCache) {
|
|
1383
|
-
// Clear the state cache to force re-materialization with inheritance (CTE path)
|
|
1384
|
-
lix.sqlite.exec("DELETE FROM internal_state_cache");
|
|
1385
|
-
}
|
|
1386
|
-
// If clearCache is false, we test the cache hit path
|
|
1387
|
-
// Verify the child initially sees the inherited entity
|
|
1388
|
-
const inheritedEntity = await lix.db
|
|
1389
|
-
.selectFrom("state_all")
|
|
1390
|
-
.where("entity_id", "=", "shared-entity")
|
|
1391
|
-
.where("version_id", "=", activeVersion.id)
|
|
1392
|
-
.selectAll()
|
|
1393
|
-
.execute();
|
|
1394
|
-
expect(inheritedEntity).toHaveLength(1);
|
|
1395
|
-
expect(inheritedEntity[0]?.version_id).toBe(activeVersion.id);
|
|
1396
|
-
expect(inheritedEntity[0]?.inherited_from_version_id).toBe("global");
|
|
1397
|
-
// Delete the inherited entity in child version (should create copy-on-write deletion)
|
|
1398
|
-
await lix.db
|
|
1399
|
-
.deleteFrom("state_all")
|
|
1400
|
-
.where("entity_id", "=", "shared-entity")
|
|
1401
|
-
.where("version_id", "=", activeVersion.id)
|
|
1402
|
-
.execute();
|
|
1403
|
-
if (clearCache) {
|
|
1404
|
-
// Clear cache after deletion to test CTE path for subsequent queries
|
|
1405
|
-
lix.sqlite.exec("DELETE FROM internal_state_cache");
|
|
1406
|
-
}
|
|
1407
|
-
// Verify the entity is deleted in child version
|
|
1408
|
-
const childEntityAfterDelete = await lix.db
|
|
1409
|
-
.selectFrom("state_all")
|
|
1410
|
-
.where("entity_id", "=", "shared-entity")
|
|
1411
|
-
.where("version_id", "=", activeVersion.id)
|
|
1412
|
-
.selectAll()
|
|
1413
|
-
.execute();
|
|
1414
|
-
// Entity should be deleted in child version (copy-on-write deletion)
|
|
1415
|
-
expect(childEntityAfterDelete).toHaveLength(0);
|
|
1416
|
-
// Verify the entity still exists in global version (not affected by child deletion)
|
|
1417
|
-
const inheritedEntityAfterDelete = await lix.db
|
|
1418
|
-
.selectFrom("state_all")
|
|
1419
|
-
.where("entity_id", "=", "shared-entity")
|
|
1420
|
-
.where("version_id", "=", "global")
|
|
1421
|
-
.selectAll()
|
|
1422
|
-
.execute();
|
|
1423
|
-
expect(inheritedEntityAfterDelete).toHaveLength(1);
|
|
1424
|
-
expect(inheritedEntityAfterDelete[0]?.snapshot_content).toEqual({
|
|
1425
|
-
id: "shared-entity",
|
|
1426
|
-
name: "shared Entity",
|
|
1427
|
-
});
|
|
1428
|
-
// Verify we now only see the global entity through the state view (deletion marker is hidden)
|
|
1429
|
-
const allEntities = await lix.db
|
|
1430
|
-
.selectFrom("state_all")
|
|
1431
|
-
.where("entity_id", "=", "shared-entity")
|
|
1432
|
-
.selectAll()
|
|
1433
|
-
.execute();
|
|
1434
|
-
// Debug: Log what entities we actually got in cache miss scenario
|
|
1435
|
-
if (clearCache && allEntities.length !== 1) {
|
|
1436
|
-
console.log(`Cache miss scenario returned ${allEntities.length} entities:`, allEntities.map((e) => ({
|
|
1437
|
-
version_id: e.version_id,
|
|
1438
|
-
inherited_from_version_id: e.inherited_from_version_id,
|
|
1439
|
-
snapshot_content: e.snapshot_content,
|
|
1440
|
-
})));
|
|
1441
|
-
}
|
|
1442
|
-
// Both cache hit and cache miss scenarios should behave identically:
|
|
1443
|
-
// copy-on-write deletion hides the entity from child but preserves it in parent
|
|
1444
|
-
expect(allEntities).toHaveLength(1);
|
|
1445
|
-
expect(allEntities[0]?.version_id).toBe("global");
|
|
1446
|
-
expect(allEntities[0]?.inherited_from_version_id).toBe(null); // It's the original global entity
|
|
1926
|
+
],
|
|
1447
1927
|
});
|
|
1448
|
-
|
|
1449
|
-
|
|
1450
|
-
|
|
1451
|
-
|
|
1452
|
-
|
|
1928
|
+
const mockSchema = {
|
|
1929
|
+
"x-lix-key": "mock_schema",
|
|
1930
|
+
"x-lix-version": "1.0",
|
|
1931
|
+
type: "object",
|
|
1932
|
+
additionalProperties: false,
|
|
1933
|
+
properties: {
|
|
1934
|
+
value: {
|
|
1935
|
+
type: "string",
|
|
1936
|
+
},
|
|
1937
|
+
},
|
|
1938
|
+
};
|
|
1939
|
+
await lix.db
|
|
1940
|
+
.insertInto("stored_schema")
|
|
1941
|
+
.values({ value: mockSchema })
|
|
1942
|
+
.execute();
|
|
1943
|
+
// Step 1: Insert entity in global version (will be inherited by child)
|
|
1453
1944
|
await lix.db
|
|
1454
1945
|
.insertInto("state_all")
|
|
1455
1946
|
.values({
|
|
1456
|
-
entity_id: "
|
|
1947
|
+
entity_id: "inherited-entity",
|
|
1457
1948
|
file_id: "test-file",
|
|
1458
|
-
schema_key: "
|
|
1949
|
+
schema_key: "mock_schema",
|
|
1459
1950
|
plugin_key: "test_plugin",
|
|
1951
|
+
schema_version: "1.0",
|
|
1460
1952
|
version_id: "global",
|
|
1461
1953
|
snapshot_content: {
|
|
1462
|
-
|
|
1463
|
-
name: "Global Entity",
|
|
1954
|
+
value: "inherited value",
|
|
1464
1955
|
},
|
|
1465
|
-
|
|
1956
|
+
untracked: false,
|
|
1466
1957
|
})
|
|
1467
1958
|
.execute();
|
|
1468
|
-
// Create a child version that inherits from global
|
|
1469
|
-
const childVersion = await createVersion({
|
|
1470
|
-
|
|
1471
|
-
|
|
1472
|
-
|
|
1473
|
-
|
|
1474
|
-
// Verify inheritance - both global and child should see the entity
|
|
1475
|
-
const beforeDelete = await lix.db
|
|
1476
|
-
.selectFrom("state_all")
|
|
1477
|
-
.where("entity_id", "=", "shared-entity")
|
|
1478
|
-
.where("version_id", "in", ["global", childVersion.id])
|
|
1479
|
-
.selectAll()
|
|
1480
|
-
.execute();
|
|
1481
|
-
expect(beforeDelete).toHaveLength(2); // One in global, one inherited in child
|
|
1482
|
-
expect(beforeDelete).toMatchObject([
|
|
1483
|
-
{
|
|
1484
|
-
entity_id: "shared-entity",
|
|
1485
|
-
version_id: "global",
|
|
1486
|
-
inherited_from_version_id: null,
|
|
1487
|
-
snapshot_content: { id: "shared-entity", name: "Global Entity" },
|
|
1488
|
-
},
|
|
1489
|
-
{
|
|
1490
|
-
entity_id: "shared-entity",
|
|
1491
|
-
version_id: childVersion.id,
|
|
1492
|
-
inherited_from_version_id: "global",
|
|
1493
|
-
snapshot_content: { id: "shared-entity", name: "Global Entity" },
|
|
1494
|
-
},
|
|
1495
|
-
]);
|
|
1496
|
-
await lix.db
|
|
1497
|
-
.deleteFrom("state_all")
|
|
1498
|
-
.where("entity_id", "=", "shared-entity")
|
|
1499
|
-
.where("schema_key", "=", "test_schema")
|
|
1500
|
-
.execute();
|
|
1501
|
-
const afterDelete = await lix.db
|
|
1959
|
+
// Step 2: Create a child version that inherits from global
|
|
1960
|
+
const childVersion = await createVersion({ lix, name: "child-version" });
|
|
1961
|
+
// Verify inheritance is set up correctly
|
|
1962
|
+
expectDeterministic(childVersion.inherits_from_version_id).toBe("global");
|
|
1963
|
+
// Step 3: Verify child initially sees inherited entity
|
|
1964
|
+
const inheritedState = await lix.db
|
|
1502
1965
|
.selectFrom("state_all")
|
|
1503
|
-
.where("entity_id", "=", "
|
|
1966
|
+
.where("entity_id", "=", "inherited-entity")
|
|
1967
|
+
.where("version_id", "=", childVersion.id)
|
|
1504
1968
|
.selectAll()
|
|
1505
1969
|
.execute();
|
|
1506
|
-
|
|
1507
|
-
|
|
1508
|
-
|
|
1509
|
-
|
|
1510
|
-
|
|
1511
|
-
|
|
1512
|
-
const lix = await openLix({});
|
|
1513
|
-
// First, insert a record successfully
|
|
1970
|
+
expectDeterministic(inheritedState).toHaveLength(1);
|
|
1971
|
+
expectDeterministic(inheritedState[0]?.snapshot_content).toEqual({
|
|
1972
|
+
value: "inherited value",
|
|
1973
|
+
});
|
|
1974
|
+
expectDeterministic(inheritedState[0]?.inherited_from_version_id).toBe("global");
|
|
1975
|
+
// Step 4: Add untracked state for same entity in child version
|
|
1514
1976
|
await lix.db
|
|
1515
1977
|
.insertInto("state_all")
|
|
1516
1978
|
.values({
|
|
1517
|
-
entity_id: "
|
|
1518
|
-
|
|
1519
|
-
|
|
1979
|
+
entity_id: "inherited-entity",
|
|
1980
|
+
file_id: "test-file",
|
|
1981
|
+
schema_key: "mock_schema",
|
|
1520
1982
|
plugin_key: "test_plugin",
|
|
1521
|
-
snapshot_content: { id: "test-duplicate-entity", name: "Original" },
|
|
1522
1983
|
schema_version: "1.0",
|
|
1523
|
-
version_id:
|
|
1984
|
+
version_id: childVersion.id,
|
|
1985
|
+
snapshot_content: {
|
|
1986
|
+
value: "untracked override",
|
|
1987
|
+
},
|
|
1988
|
+
untracked: true,
|
|
1524
1989
|
})
|
|
1525
1990
|
.execute();
|
|
1526
|
-
//
|
|
1527
|
-
const
|
|
1991
|
+
// Step 5: Query should return untracked state (higher priority than inherited)
|
|
1992
|
+
const finalState = await lix.db
|
|
1528
1993
|
.selectFrom("state_all")
|
|
1529
|
-
.where("entity_id", "=", "
|
|
1994
|
+
.where("entity_id", "=", "inherited-entity")
|
|
1995
|
+
.where("version_id", "=", childVersion.id)
|
|
1530
1996
|
.selectAll()
|
|
1531
|
-
.
|
|
1532
|
-
|
|
1533
|
-
|
|
1534
|
-
|
|
1535
|
-
|
|
1536
|
-
|
|
1537
|
-
|
|
1538
|
-
//
|
|
1539
|
-
|
|
1540
|
-
lix.sqlite.exec(`
|
|
1541
|
-
INSERT OR IGNORE INTO state (
|
|
1542
|
-
entity_id, schema_key, file_id, plugin_key,
|
|
1543
|
-
snapshot_content, schema_version, version_id
|
|
1544
|
-
) VALUES (
|
|
1545
|
-
'test-duplicate-entity', 'test_schema', 'test', 'test_plugin',
|
|
1546
|
-
'{"id":"test-duplicate-entity","name":"Duplicate"}', '1.0', 'global'
|
|
1547
|
-
)
|
|
1548
|
-
`);
|
|
1549
|
-
}).not.toThrow(); // This should not throw, but currently does
|
|
1550
|
-
// Verify the original record is unchanged (OR IGNORE should have ignored the duplicate)
|
|
1551
|
-
const afterIgnore = await lix.db
|
|
1997
|
+
.execute();
|
|
1998
|
+
expectDeterministic(finalState).toHaveLength(1);
|
|
1999
|
+
expectDeterministic(finalState[0]?.snapshot_content).toEqual({
|
|
2000
|
+
value: "untracked override",
|
|
2001
|
+
});
|
|
2002
|
+
expectDeterministic(finalState[0]?.inherited_from_version_id).toBe(null); // Should not be inherited anymore
|
|
2003
|
+
expectDeterministic(finalState[0]?.version_id).toBe(childVersion.id);
|
|
2004
|
+
// Step 6: Verify the inherited entity still exists in global version (unchanged)
|
|
2005
|
+
const globalState = await lix.db
|
|
1552
2006
|
.selectFrom("state_all")
|
|
1553
|
-
.where("entity_id", "=", "
|
|
2007
|
+
.where("entity_id", "=", "inherited-entity")
|
|
2008
|
+
.where("version_id", "=", "global")
|
|
1554
2009
|
.selectAll()
|
|
1555
|
-
.
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
2010
|
+
.execute();
|
|
2011
|
+
expectDeterministic(globalState).toHaveLength(1);
|
|
2012
|
+
expectDeterministic(globalState[0]?.snapshot_content).toEqual({
|
|
2013
|
+
value: "inherited value",
|
|
1559
2014
|
});
|
|
2015
|
+
expectDeterministic(globalState[0]?.inherited_from_version_id).toBe(null);
|
|
2016
|
+
// Step 7: No changes should be created for untracked mutations
|
|
2017
|
+
const changes = await lix.db
|
|
2018
|
+
.selectFrom("change")
|
|
2019
|
+
.where("entity_id", "=", "inherited-entity")
|
|
2020
|
+
.where("schema_key", "=", "mock_schema")
|
|
2021
|
+
.selectAll()
|
|
2022
|
+
.execute();
|
|
2023
|
+
// Should only have the original change from global version, not the untracked one
|
|
2024
|
+
expectDeterministic(changes).toHaveLength(1);
|
|
1560
2025
|
});
|
|
1561
|
-
|
|
1562
|
-
const lix = await
|
|
2026
|
+
simulationTest("untracked state inheritance", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
2027
|
+
const lix = await openSimulatedLix({
|
|
2028
|
+
keyValues: [
|
|
2029
|
+
{
|
|
2030
|
+
key: "lix_deterministic_mode",
|
|
2031
|
+
value: { enabled: true, bootstrap: true },
|
|
2032
|
+
lixcol_version_id: "global",
|
|
2033
|
+
},
|
|
2034
|
+
],
|
|
2035
|
+
});
|
|
1563
2036
|
const mockSchema = {
|
|
1564
2037
|
"x-lix-key": "mock_schema",
|
|
1565
2038
|
"x-lix-version": "1.0",
|
|
@@ -1572,46 +2045,56 @@ test("should emit state_commit hook when database transaction commits", async ()
|
|
|
1572
2045
|
},
|
|
1573
2046
|
};
|
|
1574
2047
|
await lix.db
|
|
1575
|
-
.insertInto("
|
|
1576
|
-
.values({ value: mockSchema })
|
|
2048
|
+
.insertInto("stored_schema_all")
|
|
2049
|
+
.values({ value: mockSchema, lixcol_version_id: "global" })
|
|
1577
2050
|
.execute();
|
|
1578
|
-
|
|
1579
|
-
|
|
1580
|
-
|
|
1581
|
-
|
|
1582
|
-
|
|
1583
|
-
//
|
|
2051
|
+
const activeVersion = await lix.db
|
|
2052
|
+
.selectFrom("active_version")
|
|
2053
|
+
.innerJoin("version", "active_version.version_id", "version.id")
|
|
2054
|
+
.selectAll("version")
|
|
2055
|
+
.executeTakeFirstOrThrow();
|
|
2056
|
+
// inserting into the global version
|
|
1584
2057
|
await lix.db
|
|
1585
2058
|
.insertInto("state_all")
|
|
1586
2059
|
.values({
|
|
1587
|
-
entity_id: "test-entity",
|
|
1588
2060
|
file_id: "test-file",
|
|
1589
2061
|
schema_key: "mock_schema",
|
|
1590
2062
|
plugin_key: "test_plugin",
|
|
1591
2063
|
schema_version: "1.0",
|
|
1592
|
-
|
|
1593
|
-
snapshot_content: {
|
|
1594
|
-
value: "test value",
|
|
1595
|
-
},
|
|
1596
|
-
})
|
|
1597
|
-
.execute();
|
|
1598
|
-
// Hook should have been called once
|
|
1599
|
-
expect(hookCallCount).toBe(1);
|
|
1600
|
-
// Perform another operation
|
|
1601
|
-
await lix.db
|
|
1602
|
-
.updateTable("state_all")
|
|
1603
|
-
.set({
|
|
2064
|
+
entity_id: "test_key",
|
|
1604
2065
|
snapshot_content: {
|
|
1605
|
-
value: "
|
|
2066
|
+
value: "test_value",
|
|
1606
2067
|
},
|
|
2068
|
+
version_id: "global",
|
|
2069
|
+
untracked: true,
|
|
1607
2070
|
})
|
|
1608
|
-
.where("entity_id", "=", "test-entity")
|
|
1609
2071
|
.execute();
|
|
1610
|
-
|
|
1611
|
-
|
|
2072
|
+
const globalState = await lix.db
|
|
2073
|
+
.selectFrom("state_all")
|
|
2074
|
+
.where("entity_id", "=", "test_key")
|
|
2075
|
+
.where("version_id", "=", "global")
|
|
2076
|
+
.select("snapshot_content")
|
|
2077
|
+
.executeTakeFirstOrThrow();
|
|
2078
|
+
expectDeterministic(globalState).toBeDefined();
|
|
2079
|
+
const versionState = await lix.db
|
|
2080
|
+
.selectFrom("state_all")
|
|
2081
|
+
.where("entity_id", "=", "test_key")
|
|
2082
|
+
.where("version_id", "=", activeVersion.id)
|
|
2083
|
+
.select("snapshot_content")
|
|
2084
|
+
.executeTakeFirstOrThrow();
|
|
2085
|
+
expectDeterministic(versionState).toBeDefined();
|
|
2086
|
+
expectDeterministic(versionState).toEqual(globalState);
|
|
1612
2087
|
});
|
|
1613
|
-
|
|
1614
|
-
const lix = await
|
|
2088
|
+
simulationTest("tracked state in child overrides inherited untracked state", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
2089
|
+
const lix = await openSimulatedLix({
|
|
2090
|
+
keyValues: [
|
|
2091
|
+
{
|
|
2092
|
+
key: "lix_deterministic_mode",
|
|
2093
|
+
value: { enabled: true, bootstrap: true },
|
|
2094
|
+
lixcol_version_id: "global",
|
|
2095
|
+
},
|
|
2096
|
+
],
|
|
2097
|
+
});
|
|
1615
2098
|
const mockSchema = {
|
|
1616
2099
|
"x-lix-key": "mock_schema",
|
|
1617
2100
|
"x-lix-version": "1.0",
|
|
@@ -1624,99 +2107,73 @@ test("untracked mutations don't trigger change control", async () => {
|
|
|
1624
2107
|
},
|
|
1625
2108
|
};
|
|
1626
2109
|
await lix.db
|
|
1627
|
-
.insertInto("stored_schema")
|
|
2110
|
+
.insertInto("stored_schema") // Use stored_schema, not stored_schema_all
|
|
1628
2111
|
.values({ value: mockSchema })
|
|
1629
2112
|
.execute();
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
.selectFrom("change")
|
|
1633
|
-
.selectAll()
|
|
1634
|
-
.execute();
|
|
1635
|
-
// 1. INSERT untracked state
|
|
2113
|
+
const childVersion = await createVersion({ lix, name: "child" });
|
|
2114
|
+
// 1. Insert untracked state in global version
|
|
1636
2115
|
await lix.db
|
|
1637
2116
|
.insertInto("state_all")
|
|
1638
2117
|
.values({
|
|
1639
|
-
entity_id: "
|
|
1640
|
-
file_id: "
|
|
2118
|
+
entity_id: "override_test",
|
|
2119
|
+
file_id: "f1",
|
|
1641
2120
|
schema_key: "mock_schema",
|
|
1642
|
-
plugin_key: "
|
|
2121
|
+
plugin_key: "p1",
|
|
1643
2122
|
schema_version: "1.0",
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
value: "untracked value",
|
|
1647
|
-
},
|
|
2123
|
+
snapshot_content: { value: "global untracked" },
|
|
2124
|
+
version_id: "global",
|
|
1648
2125
|
untracked: true,
|
|
1649
2126
|
})
|
|
1650
2127
|
.execute();
|
|
1651
|
-
//
|
|
1652
|
-
const
|
|
1653
|
-
.selectFrom("change")
|
|
1654
|
-
.selectAll()
|
|
1655
|
-
.execute();
|
|
1656
|
-
// Number of changes should be identical (no change control for untracked)
|
|
1657
|
-
expect(changesAfterInsert.length).toBe(changesInitial.length);
|
|
1658
|
-
// Verify the untracked entity exists in state view
|
|
1659
|
-
const untrackedState = await lix.db
|
|
2128
|
+
// 2. Verify child inherits untracked state
|
|
2129
|
+
const inheritedState = await lix.db
|
|
1660
2130
|
.selectFrom("state_all")
|
|
1661
|
-
.where("entity_id", "=", "
|
|
2131
|
+
.where("entity_id", "=", "override_test")
|
|
2132
|
+
.where("version_id", "=", childVersion.id)
|
|
1662
2133
|
.selectAll()
|
|
1663
2134
|
.execute();
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
value: "untracked
|
|
2135
|
+
expectDeterministic(inheritedState).toHaveLength(1);
|
|
2136
|
+
expectDeterministic(inheritedState[0]?.snapshot_content).toEqual({
|
|
2137
|
+
value: "global untracked",
|
|
1667
2138
|
});
|
|
1668
|
-
|
|
1669
|
-
//
|
|
2139
|
+
expectDeterministic(inheritedState[0]?.untracked).toBe(1);
|
|
2140
|
+
// 3. Insert tracked state in child version for same entity
|
|
1670
2141
|
await lix.db
|
|
1671
|
-
.
|
|
1672
|
-
.
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
2142
|
+
.insertInto("state_all")
|
|
2143
|
+
.values({
|
|
2144
|
+
entity_id: "override_test",
|
|
2145
|
+
file_id: "f1",
|
|
2146
|
+
schema_key: "mock_schema",
|
|
2147
|
+
plugin_key: "p1",
|
|
2148
|
+
schema_version: "1.0",
|
|
2149
|
+
snapshot_content: { value: "child tracked" },
|
|
2150
|
+
version_id: childVersion.id,
|
|
2151
|
+
untracked: false, // Important: this is tracked state
|
|
1678
2152
|
})
|
|
1679
2153
|
.execute();
|
|
1680
|
-
//
|
|
1681
|
-
const
|
|
1682
|
-
.selectFrom("change")
|
|
1683
|
-
.selectAll()
|
|
1684
|
-
.execute();
|
|
1685
|
-
// Number of changes should still be identical (no change control for untracked)
|
|
1686
|
-
expect(changesAfterUpdate.length).toBe(changesInitial.length);
|
|
1687
|
-
// Verify the untracked entity was updated
|
|
1688
|
-
const updatedState = await lix.db
|
|
2154
|
+
// 4. Verify child now sees tracked state, not inherited untracked
|
|
2155
|
+
const finalState = await lix.db
|
|
1689
2156
|
.selectFrom("state_all")
|
|
1690
|
-
.where("entity_id", "=", "
|
|
2157
|
+
.where("entity_id", "=", "override_test")
|
|
2158
|
+
.where("version_id", "=", childVersion.id)
|
|
1691
2159
|
.selectAll()
|
|
1692
2160
|
.execute();
|
|
1693
|
-
|
|
1694
|
-
|
|
1695
|
-
value: "
|
|
2161
|
+
expectDeterministic(finalState).toHaveLength(1);
|
|
2162
|
+
expectDeterministic(finalState[0]?.snapshot_content).toEqual({
|
|
2163
|
+
value: "child tracked",
|
|
1696
2164
|
});
|
|
1697
|
-
|
|
1698
|
-
// 3. DELETE untracked state
|
|
1699
|
-
await lix.db
|
|
1700
|
-
.deleteFrom("state_all")
|
|
1701
|
-
.where("entity_id", "=", "untracked-entity")
|
|
1702
|
-
.execute();
|
|
1703
|
-
// Count changes after untracked delete
|
|
1704
|
-
const changesAfterDelete = await lix.db
|
|
1705
|
-
.selectFrom("change")
|
|
1706
|
-
.selectAll()
|
|
1707
|
-
.execute();
|
|
1708
|
-
// Number of changes should still be identical (no change control for untracked)
|
|
1709
|
-
expect(changesAfterDelete.length).toBe(changesInitial.length);
|
|
1710
|
-
// Verify the untracked entity was deleted
|
|
1711
|
-
const deletedState = await lix.db
|
|
1712
|
-
.selectFrom("state_all")
|
|
1713
|
-
.where("entity_id", "=", "untracked-entity")
|
|
1714
|
-
.selectAll()
|
|
1715
|
-
.execute();
|
|
1716
|
-
expect(deletedState).toHaveLength(0);
|
|
2165
|
+
expectDeterministic(finalState[0]?.untracked).toBe(0); // Should be tracked
|
|
1717
2166
|
});
|
|
1718
|
-
|
|
1719
|
-
const lix = await
|
|
2167
|
+
simulationTest("untracked state in child overrides inherited untracked state", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
2168
|
+
const lix = await openSimulatedLix({
|
|
2169
|
+
keyValues: [
|
|
2170
|
+
{
|
|
2171
|
+
key: "lix_deterministic_mode",
|
|
2172
|
+
value: { enabled: true, bootstrap: true },
|
|
2173
|
+
lixcol_version_id: "global",
|
|
2174
|
+
},
|
|
2175
|
+
],
|
|
2176
|
+
});
|
|
1720
2177
|
const mockSchema = {
|
|
1721
2178
|
"x-lix-key": "mock_schema",
|
|
1722
2179
|
"x-lix-version": "1.0",
|
|
@@ -1729,67 +2186,73 @@ test("tracked update to previously untracked entity deletes untracked state", as
|
|
|
1729
2186
|
},
|
|
1730
2187
|
};
|
|
1731
2188
|
await lix.db
|
|
1732
|
-
.insertInto("stored_schema")
|
|
2189
|
+
.insertInto("stored_schema") // Use stored_schema
|
|
1733
2190
|
.values({ value: mockSchema })
|
|
1734
2191
|
.execute();
|
|
1735
|
-
|
|
2192
|
+
const childVersion = await createVersion({ lix, name: "child" });
|
|
2193
|
+
// 1. Insert untracked state in global version
|
|
1736
2194
|
await lix.db
|
|
1737
2195
|
.insertInto("state_all")
|
|
1738
2196
|
.values({
|
|
1739
|
-
entity_id: "
|
|
1740
|
-
file_id: "
|
|
2197
|
+
entity_id: "untracked_override_test",
|
|
2198
|
+
file_id: "f1",
|
|
1741
2199
|
schema_key: "mock_schema",
|
|
1742
|
-
plugin_key: "
|
|
2200
|
+
plugin_key: "p1",
|
|
1743
2201
|
schema_version: "1.0",
|
|
1744
|
-
|
|
1745
|
-
|
|
1746
|
-
value: "untracked value",
|
|
1747
|
-
},
|
|
2202
|
+
snapshot_content: { value: "global untracked" },
|
|
2203
|
+
version_id: "global",
|
|
1748
2204
|
untracked: true,
|
|
1749
2205
|
})
|
|
1750
2206
|
.execute();
|
|
1751
|
-
// Verify untracked state
|
|
1752
|
-
const
|
|
2207
|
+
// 2. Verify child inherits untracked state
|
|
2208
|
+
const inheritedState = await lix.db
|
|
1753
2209
|
.selectFrom("state_all")
|
|
1754
|
-
.where("entity_id", "=", "
|
|
2210
|
+
.where("entity_id", "=", "untracked_override_test")
|
|
2211
|
+
.where("version_id", "=", childVersion.id)
|
|
1755
2212
|
.selectAll()
|
|
1756
2213
|
.execute();
|
|
1757
|
-
|
|
1758
|
-
|
|
1759
|
-
value: "untracked
|
|
2214
|
+
expectDeterministic(inheritedState).toHaveLength(1);
|
|
2215
|
+
expectDeterministic(inheritedState[0]?.snapshot_content).toEqual({
|
|
2216
|
+
value: "global untracked",
|
|
1760
2217
|
});
|
|
1761
|
-
|
|
2218
|
+
expectDeterministic(inheritedState[0]?.untracked).toBe(1);
|
|
2219
|
+
// 3. Insert untracked state in child version for same entity
|
|
1762
2220
|
await lix.db
|
|
1763
|
-
.
|
|
1764
|
-
.
|
|
1765
|
-
|
|
1766
|
-
|
|
1767
|
-
|
|
1768
|
-
|
|
2221
|
+
.insertInto("state_all")
|
|
2222
|
+
.values({
|
|
2223
|
+
entity_id: "untracked_override_test",
|
|
2224
|
+
file_id: "f1",
|
|
2225
|
+
schema_key: "mock_schema",
|
|
2226
|
+
plugin_key: "p1",
|
|
2227
|
+
schema_version: "1.0",
|
|
2228
|
+
snapshot_content: { value: "child untracked" },
|
|
2229
|
+
version_id: childVersion.id,
|
|
2230
|
+
untracked: true,
|
|
1769
2231
|
})
|
|
1770
|
-
.where("entity_id", "=", "override-entity")
|
|
1771
|
-
.where("schema_key", "=", "mock_schema")
|
|
1772
2232
|
.execute();
|
|
1773
|
-
// Verify
|
|
2233
|
+
// 4. Verify child now sees its own untracked state
|
|
1774
2234
|
const finalState = await lix.db
|
|
1775
|
-
.selectFrom("state_all")
|
|
1776
|
-
.where("entity_id", "=", "
|
|
1777
|
-
.
|
|
1778
|
-
.execute();
|
|
1779
|
-
expect(finalState).toHaveLength(1);
|
|
1780
|
-
expect(finalState[0]?.snapshot_content).toEqual({
|
|
1781
|
-
value: "tracked value",
|
|
1782
|
-
});
|
|
1783
|
-
// Verify a change was created for the tracked mutation
|
|
1784
|
-
const changes = await lix.db
|
|
1785
|
-
.selectFrom("change")
|
|
1786
|
-
.where("entity_id", "=", "override-entity")
|
|
1787
|
-
.where("schema_key", "=", "mock_schema")
|
|
2235
|
+
.selectFrom("state_all")
|
|
2236
|
+
.where("entity_id", "=", "untracked_override_test")
|
|
2237
|
+
.where("version_id", "=", childVersion.id)
|
|
1788
2238
|
.selectAll()
|
|
1789
2239
|
.execute();
|
|
1790
|
-
|
|
2240
|
+
expectDeterministic(finalState).toHaveLength(1);
|
|
2241
|
+
expectDeterministic(finalState[0]?.snapshot_content).toEqual({
|
|
2242
|
+
value: "child untracked",
|
|
2243
|
+
});
|
|
2244
|
+
expectDeterministic(finalState[0]?.untracked).toBe(1);
|
|
1791
2245
|
});
|
|
1792
|
-
|
|
2246
|
+
simulationTest("untracked state has untracked change_id for both inherited and non-inherited entities", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
2247
|
+
const lix = await openSimulatedLix({
|
|
2248
|
+
keyValues: [
|
|
2249
|
+
{
|
|
2250
|
+
key: "lix_deterministic_mode",
|
|
2251
|
+
value: { enabled: true, bootstrap: true },
|
|
2252
|
+
lixcol_version_id: "global",
|
|
2253
|
+
},
|
|
2254
|
+
],
|
|
2255
|
+
});
|
|
1793
2256
|
const mockSchema = {
|
|
1794
2257
|
"x-lix-key": "mock_schema",
|
|
1795
2258
|
"x-lix-version": "1.0",
|
|
@@ -1801,42 +2264,62 @@ test("untracked state is persisted across lix sessions", async () => {
|
|
|
1801
2264
|
},
|
|
1802
2265
|
},
|
|
1803
2266
|
};
|
|
1804
|
-
|
|
1805
|
-
const lix1 = await openLix({});
|
|
1806
|
-
await lix1.db
|
|
2267
|
+
await lix.db
|
|
1807
2268
|
.insertInto("stored_schema")
|
|
1808
2269
|
.values({ value: mockSchema })
|
|
1809
2270
|
.execute();
|
|
1810
|
-
await
|
|
2271
|
+
const childVersion = await createVersion({ lix, name: "child" });
|
|
2272
|
+
// 1. Insert untracked state in global version (will be inherited by child)
|
|
2273
|
+
await lix.db
|
|
1811
2274
|
.insertInto("state_all")
|
|
1812
2275
|
.values({
|
|
1813
|
-
entity_id: "
|
|
2276
|
+
entity_id: "inherited-entity",
|
|
1814
2277
|
file_id: "test-file",
|
|
1815
2278
|
schema_key: "mock_schema",
|
|
1816
2279
|
plugin_key: "test_plugin",
|
|
1817
2280
|
schema_version: "1.0",
|
|
1818
|
-
|
|
1819
|
-
|
|
1820
|
-
value: "persistent untracked value",
|
|
1821
|
-
},
|
|
2281
|
+
snapshot_content: { value: "global untracked" },
|
|
2282
|
+
version_id: "global",
|
|
1822
2283
|
untracked: true,
|
|
1823
2284
|
})
|
|
1824
2285
|
.execute();
|
|
1825
|
-
//
|
|
1826
|
-
|
|
1827
|
-
|
|
2286
|
+
// 2. Insert untracked state directly in child version (non-inherited)
|
|
2287
|
+
await lix.db
|
|
2288
|
+
.insertInto("state_all")
|
|
2289
|
+
.values({
|
|
2290
|
+
entity_id: "non-inherited-entity",
|
|
2291
|
+
file_id: "test-file",
|
|
2292
|
+
schema_key: "mock_schema",
|
|
2293
|
+
plugin_key: "test_plugin",
|
|
2294
|
+
schema_version: "1.0",
|
|
2295
|
+
snapshot_content: { value: "child untracked" },
|
|
2296
|
+
version_id: childVersion.id,
|
|
2297
|
+
untracked: true,
|
|
2298
|
+
})
|
|
2299
|
+
.execute();
|
|
2300
|
+
// 3. Query all untracked entities in child version
|
|
2301
|
+
const untrackedEntities = await lix.db
|
|
1828
2302
|
.selectFrom("state_all")
|
|
1829
|
-
.where("
|
|
2303
|
+
.where("version_id", "=", childVersion.id)
|
|
2304
|
+
.where("entity_id", "in", ["inherited-entity", "non-inherited-entity"])
|
|
2305
|
+
.where("untracked", "=", true)
|
|
1830
2306
|
.selectAll()
|
|
1831
2307
|
.execute();
|
|
1832
|
-
|
|
1833
|
-
|
|
1834
|
-
|
|
1835
|
-
|
|
1836
|
-
|
|
2308
|
+
expectDeterministic(untrackedEntities).toHaveLength(2);
|
|
2309
|
+
// 4. Check that both entities have untracked change_id
|
|
2310
|
+
for (const entity of untrackedEntities) {
|
|
2311
|
+
expectDeterministic(entity.change_id).toBe("untracked");
|
|
2312
|
+
}
|
|
2313
|
+
// 5. Verify specific entities
|
|
2314
|
+
const inheritedEntity = untrackedEntities.find((e) => e.entity_id === "inherited-entity");
|
|
2315
|
+
const nonInheritedEntity = untrackedEntities.find((e) => e.entity_id === "non-inherited-entity");
|
|
2316
|
+
expectDeterministic(inheritedEntity).toBeDefined();
|
|
2317
|
+
expectDeterministic(nonInheritedEntity).toBeDefined();
|
|
2318
|
+
// Both inherited and non-inherited untracked entities should have change_id = "untracked"
|
|
2319
|
+
expectDeterministic(inheritedEntity?.change_id).toBe("untracked");
|
|
2320
|
+
expectDeterministic(nonInheritedEntity?.change_id).toBe("untracked");
|
|
1837
2321
|
});
|
|
1838
|
-
|
|
1839
|
-
const lix = await openLix({});
|
|
2322
|
+
simulationTest("state version_id defaults active version", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
1840
2323
|
const mockSchema = {
|
|
1841
2324
|
"x-lix-key": "mock_schema",
|
|
1842
2325
|
"x-lix-version": "1.0",
|
|
@@ -1848,183 +2331,371 @@ test("untracked state has highest priority in UNION (untracked > tracked > inher
|
|
|
1848
2331
|
},
|
|
1849
2332
|
},
|
|
1850
2333
|
};
|
|
2334
|
+
const lix = await openSimulatedLix({
|
|
2335
|
+
keyValues: [
|
|
2336
|
+
{
|
|
2337
|
+
key: "lix_deterministic_mode",
|
|
2338
|
+
value: { enabled: true, bootstrap: true },
|
|
2339
|
+
lixcol_version_id: "global",
|
|
2340
|
+
},
|
|
2341
|
+
],
|
|
2342
|
+
});
|
|
1851
2343
|
await lix.db
|
|
1852
2344
|
.insertInto("stored_schema")
|
|
1853
2345
|
.values({ value: mockSchema })
|
|
1854
2346
|
.execute();
|
|
1855
|
-
//
|
|
2347
|
+
// Get the active version ID to verify it gets auto-filled
|
|
2348
|
+
const activeVersion = await lix.db
|
|
2349
|
+
.selectFrom("active_version")
|
|
2350
|
+
.select("version_id")
|
|
2351
|
+
.executeTakeFirstOrThrow();
|
|
2352
|
+
// Insert into state view without specifying version_id
|
|
2353
|
+
// This should auto-fill with the active version
|
|
1856
2354
|
await lix.db
|
|
1857
|
-
.insertInto("
|
|
2355
|
+
.insertInto("state")
|
|
1858
2356
|
.values({
|
|
1859
2357
|
entity_id: "entity0",
|
|
1860
|
-
file_id: "
|
|
2358
|
+
file_id: "f0",
|
|
1861
2359
|
schema_key: "mock_schema",
|
|
1862
|
-
plugin_key: "
|
|
2360
|
+
plugin_key: "lix_own_entity",
|
|
1863
2361
|
schema_version: "1.0",
|
|
1864
|
-
|
|
1865
|
-
snapshot_content: {
|
|
1866
|
-
value: "init",
|
|
1867
|
-
},
|
|
1868
|
-
untracked: false,
|
|
2362
|
+
snapshot_content: { value: "initial content" },
|
|
1869
2363
|
})
|
|
1870
2364
|
.execute();
|
|
1871
|
-
// Verify
|
|
1872
|
-
const
|
|
1873
|
-
.selectFrom("
|
|
2365
|
+
// Verify the entity was inserted with the correct version_id
|
|
2366
|
+
const insertedEntity = await lix.db
|
|
2367
|
+
.selectFrom("state")
|
|
1874
2368
|
.where("entity_id", "=", "entity0")
|
|
1875
2369
|
.selectAll()
|
|
1876
2370
|
.execute();
|
|
1877
|
-
|
|
1878
|
-
|
|
1879
|
-
|
|
2371
|
+
expectDeterministic(insertedEntity).toHaveLength(1);
|
|
2372
|
+
expectDeterministic(insertedEntity[0]).toMatchObject({
|
|
2373
|
+
entity_id: "entity0",
|
|
2374
|
+
file_id: "f0",
|
|
2375
|
+
schema_key: "mock_schema",
|
|
2376
|
+
plugin_key: "lix_own_entity",
|
|
2377
|
+
schema_version: "1.0",
|
|
2378
|
+
snapshot_content: { value: "initial content" },
|
|
2379
|
+
});
|
|
2380
|
+
// Verify the version_id was auto-filled with the active version
|
|
2381
|
+
const entityInStateAll = await lix.db
|
|
2382
|
+
.selectFrom("state_all")
|
|
2383
|
+
.where("entity_id", "=", "entity0")
|
|
2384
|
+
.select("version_id")
|
|
2385
|
+
.executeTakeFirstOrThrow();
|
|
2386
|
+
expectDeterministic(entityInStateAll.version_id).toBe(activeVersion.version_id);
|
|
2387
|
+
// Test update operation
|
|
1880
2388
|
await lix.db
|
|
1881
|
-
.updateTable("
|
|
2389
|
+
.updateTable("state")
|
|
2390
|
+
.where("entity_id", "=", "entity0")
|
|
1882
2391
|
.set({
|
|
1883
|
-
snapshot_content: {
|
|
1884
|
-
value: "update",
|
|
1885
|
-
},
|
|
1886
|
-
untracked: true,
|
|
2392
|
+
snapshot_content: { value: "updated content" },
|
|
1887
2393
|
})
|
|
1888
|
-
.where("entity_id", "=", "entity0")
|
|
1889
|
-
.where("schema_key", "=", "mock_schema")
|
|
1890
2394
|
.execute();
|
|
1891
|
-
//
|
|
1892
|
-
const
|
|
1893
|
-
.selectFrom("
|
|
2395
|
+
// Verify update worked
|
|
2396
|
+
const updatedEntity = await lix.db
|
|
2397
|
+
.selectFrom("state")
|
|
1894
2398
|
.where("entity_id", "=", "entity0")
|
|
1895
2399
|
.selectAll()
|
|
1896
2400
|
.execute();
|
|
1897
|
-
|
|
1898
|
-
|
|
1899
|
-
value: "update",
|
|
2401
|
+
expectDeterministic(updatedEntity[0]?.snapshot_content).toEqual({
|
|
2402
|
+
value: "updated content",
|
|
1900
2403
|
});
|
|
1901
|
-
//
|
|
2404
|
+
// Test delete operation
|
|
1902
2405
|
await lix.db
|
|
1903
|
-
.
|
|
1904
|
-
.set({
|
|
1905
|
-
snapshot_content: {
|
|
1906
|
-
value: "update2",
|
|
1907
|
-
},
|
|
1908
|
-
untracked: false,
|
|
1909
|
-
})
|
|
2406
|
+
.deleteFrom("state")
|
|
1910
2407
|
.where("entity_id", "=", "entity0")
|
|
1911
|
-
.where("schema_key", "=", "mock_schema")
|
|
1912
2408
|
.execute();
|
|
1913
|
-
//
|
|
1914
|
-
const
|
|
1915
|
-
.selectFrom("
|
|
2409
|
+
// Verify delete worked
|
|
2410
|
+
const deletedEntity = await lix.db
|
|
2411
|
+
.selectFrom("state")
|
|
1916
2412
|
.where("entity_id", "=", "entity0")
|
|
1917
2413
|
.selectAll()
|
|
1918
2414
|
.execute();
|
|
1919
|
-
|
|
1920
|
-
|
|
1921
|
-
|
|
1922
|
-
|
|
1923
|
-
|
|
1924
|
-
|
|
1925
|
-
|
|
2415
|
+
expectDeterministic(deletedEntity).toHaveLength(0);
|
|
2416
|
+
});
|
|
2417
|
+
// https://github.com/opral/lix-sdk/issues/344
|
|
2418
|
+
simulationTest("deleting key_value entities from state should not cause infinite loop", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
2419
|
+
const lix = await openSimulatedLix({
|
|
2420
|
+
keyValues: [
|
|
2421
|
+
{
|
|
2422
|
+
key: "lix_deterministic_mode",
|
|
2423
|
+
value: { enabled: true, bootstrap: true },
|
|
2424
|
+
lixcol_version_id: "global",
|
|
2425
|
+
},
|
|
2426
|
+
],
|
|
2427
|
+
});
|
|
2428
|
+
// 1. Insert key_value in global version (tracked)
|
|
2429
|
+
await lix.db
|
|
2430
|
+
.insertInto("key_value_all")
|
|
2431
|
+
.values({
|
|
2432
|
+
key: "test-key-global",
|
|
2433
|
+
value: "global-tracked-value",
|
|
2434
|
+
lixcol_version_id: "global",
|
|
2435
|
+
})
|
|
2436
|
+
.execute();
|
|
2437
|
+
// 2. Insert key_value in global version (untracked)
|
|
2438
|
+
await lix.db
|
|
2439
|
+
.insertInto("key_value_all")
|
|
2440
|
+
.values({
|
|
2441
|
+
key: "test-key-global-untracked",
|
|
2442
|
+
value: "global-untracked-value",
|
|
2443
|
+
lixcol_version_id: "global",
|
|
2444
|
+
lixcol_untracked: true,
|
|
2445
|
+
})
|
|
2446
|
+
.execute();
|
|
2447
|
+
// 3. Insert key_value in active version (tracked)
|
|
2448
|
+
await lix.db
|
|
2449
|
+
.insertInto("key_value")
|
|
2450
|
+
.values({
|
|
2451
|
+
key: "test-key-active",
|
|
2452
|
+
value: "active-tracked-value",
|
|
2453
|
+
})
|
|
2454
|
+
.execute();
|
|
2455
|
+
// 4. Insert key_value in active version (untracked)
|
|
2456
|
+
await lix.db
|
|
2457
|
+
.insertInto("key_value")
|
|
2458
|
+
.values({
|
|
2459
|
+
key: "test-key-active-untracked",
|
|
2460
|
+
value: "active-untracked-value",
|
|
2461
|
+
lixcol_untracked: true,
|
|
2462
|
+
})
|
|
2463
|
+
.execute();
|
|
2464
|
+
// Verify all entities exist before deletion (including inherited)
|
|
2465
|
+
const entitiesBeforeDelete = await lix.db
|
|
2466
|
+
.selectFrom("state")
|
|
2467
|
+
.where("schema_key", "=", "lix_key_value")
|
|
2468
|
+
.where("entity_id", "like", "test-key-%")
|
|
1926
2469
|
.selectAll()
|
|
1927
2470
|
.execute();
|
|
1928
|
-
|
|
2471
|
+
// state view shows active version entities + inherited from global
|
|
2472
|
+
expectDeterministic(entitiesBeforeDelete).toHaveLength(4);
|
|
2473
|
+
// Delete all key_value entities
|
|
2474
|
+
// this is the reproduction of the infinite loop issue
|
|
2475
|
+
await lix.db
|
|
2476
|
+
.deleteFrom("state")
|
|
2477
|
+
.where("schema_key", "=", "lix_key_value")
|
|
2478
|
+
.execute();
|
|
2479
|
+
// Verify all entities are deleted
|
|
2480
|
+
const keyValueAfterDelete = await lix.db
|
|
2481
|
+
.selectFrom("state")
|
|
2482
|
+
.where("schema_key", "=", "lix_key_value")
|
|
2483
|
+
.where("entity_id", "like", "test-key-%")
|
|
2484
|
+
.selectAll()
|
|
2485
|
+
.execute();
|
|
2486
|
+
expectDeterministic(keyValueAfterDelete).toHaveLength(0);
|
|
1929
2487
|
});
|
|
1930
|
-
|
|
1931
|
-
|
|
1932
|
-
const
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
value: {
|
|
1939
|
-
type: "string",
|
|
2488
|
+
// see https://github.com/opral/lix-sdk/issues/359
|
|
2489
|
+
simulationTest("commit_id in state should be from the real auto-commit, not the working commit", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
2490
|
+
const lix = await openSimulatedLix({
|
|
2491
|
+
keyValues: [
|
|
2492
|
+
{
|
|
2493
|
+
key: "lix_deterministic_mode",
|
|
2494
|
+
value: { enabled: true, bootstrap: true },
|
|
2495
|
+
lixcol_version_id: "global",
|
|
1940
2496
|
},
|
|
1941
|
-
|
|
1942
|
-
};
|
|
2497
|
+
],
|
|
2498
|
+
});
|
|
2499
|
+
// Get the active version with its commit_id and working_commit_id
|
|
2500
|
+
const activeVersion = await lix.db
|
|
2501
|
+
.selectFrom("active_version")
|
|
2502
|
+
.innerJoin("version", "version.id", "active_version.version_id")
|
|
2503
|
+
.selectAll("version")
|
|
2504
|
+
.executeTakeFirstOrThrow();
|
|
2505
|
+
// Verify we have both commit_id and working_commit_id
|
|
2506
|
+
expectDeterministic(activeVersion.commit_id).toBeTruthy();
|
|
2507
|
+
expectDeterministic(activeVersion.working_commit_id).toBeTruthy();
|
|
2508
|
+
expectDeterministic(activeVersion.commit_id).not.toBe(activeVersion.working_commit_id);
|
|
2509
|
+
const commitsBeforeInsert = await lix.db
|
|
2510
|
+
.selectFrom("commit")
|
|
2511
|
+
.select("id")
|
|
2512
|
+
.execute();
|
|
2513
|
+
// Insert some state data
|
|
1943
2514
|
await lix.db
|
|
1944
|
-
.insertInto("
|
|
1945
|
-
.values({
|
|
2515
|
+
.insertInto("state")
|
|
2516
|
+
.values({
|
|
2517
|
+
entity_id: "test-entity-1",
|
|
2518
|
+
schema_key: "test_schema",
|
|
2519
|
+
file_id: "test-file",
|
|
2520
|
+
plugin_key: "test-plugin",
|
|
2521
|
+
schema_version: "1.0",
|
|
2522
|
+
snapshot_content: { value: "initial value" },
|
|
2523
|
+
})
|
|
1946
2524
|
.execute();
|
|
1947
|
-
|
|
2525
|
+
const commitsAfterInsert = await lix.db
|
|
2526
|
+
.selectFrom("commit")
|
|
2527
|
+
.select("id")
|
|
2528
|
+
.execute();
|
|
2529
|
+
// two commits for the global and active version
|
|
2530
|
+
expectDeterministic(commitsAfterInsert.length).toBe(commitsBeforeInsert.length + 2);
|
|
2531
|
+
const activeVersionAfterInsert = await lix.db
|
|
2532
|
+
.selectFrom("active_version")
|
|
2533
|
+
.innerJoin("version", "active_version.version_id", "version.id")
|
|
2534
|
+
.selectAll("version")
|
|
2535
|
+
.executeTakeFirstOrThrow();
|
|
2536
|
+
// Query the state to check the commit_id
|
|
2537
|
+
const stateAfterInsert = await lix.db
|
|
2538
|
+
.selectFrom("state")
|
|
2539
|
+
.where("entity_id", "=", "test-entity-1")
|
|
2540
|
+
.select(["entity_id", "commit_id"])
|
|
2541
|
+
.executeTakeFirstOrThrow();
|
|
2542
|
+
// The commit_id should NOT be the working_commit_id
|
|
2543
|
+
expectDeterministic(stateAfterInsert.commit_id).not.toBe(activeVersionAfterInsert.working_commit_id);
|
|
2544
|
+
// The commit_id should be the auto-commit ID (not the working commit)
|
|
2545
|
+
expectDeterministic(stateAfterInsert.commit_id).toBe(activeVersionAfterInsert.commit_id);
|
|
2546
|
+
// Update the state to trigger another auto-commit
|
|
1948
2547
|
await lix.db
|
|
1949
|
-
.
|
|
2548
|
+
.updateTable("state")
|
|
2549
|
+
.where("entity_id", "=", "test-entity-1")
|
|
2550
|
+
.set({ snapshot_content: { value: "updated value" } })
|
|
2551
|
+
.execute();
|
|
2552
|
+
// Check the state again
|
|
2553
|
+
const stateAfterUpdate = await lix.db
|
|
2554
|
+
.selectFrom("state")
|
|
2555
|
+
.where("entity_id", "=", "test-entity-1")
|
|
2556
|
+
.select(["entity_id", "commit_id"])
|
|
2557
|
+
.executeTakeFirstOrThrow();
|
|
2558
|
+
const activeVersionAfterUpdate = await lix.db
|
|
2559
|
+
.selectFrom("active_version")
|
|
2560
|
+
.innerJoin("version", "active_version.version_id", "version.id")
|
|
2561
|
+
.selectAll("version")
|
|
2562
|
+
.executeTakeFirstOrThrow();
|
|
2563
|
+
// The commit_id should now be the new auto-commit ID
|
|
2564
|
+
expectDeterministic(stateAfterUpdate.commit_id).toBe(activeVersionAfterUpdate.commit_id);
|
|
2565
|
+
expectDeterministic(stateAfterUpdate.commit_id).not.toBe(activeVersion.working_commit_id);
|
|
2566
|
+
});
|
|
2567
|
+
simulationTest("delete ALL from state view should delete untracked entities", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
2568
|
+
const lix = await openSimulatedLix({
|
|
2569
|
+
keyValues: [
|
|
2570
|
+
{
|
|
2571
|
+
key: "lix_deterministic_mode",
|
|
2572
|
+
value: { enabled: true, bootstrap: true },
|
|
2573
|
+
lixcol_version_id: "global",
|
|
2574
|
+
},
|
|
2575
|
+
],
|
|
2576
|
+
});
|
|
2577
|
+
// Create a tracked entity in state
|
|
2578
|
+
await lix.db
|
|
2579
|
+
.insertInto("state")
|
|
1950
2580
|
.values({
|
|
1951
|
-
entity_id: "
|
|
2581
|
+
entity_id: "tracked-entity",
|
|
2582
|
+
schema_key: "mock_test_schema",
|
|
1952
2583
|
file_id: "test-file",
|
|
1953
|
-
schema_key: "mock_schema",
|
|
1954
2584
|
plugin_key: "test_plugin",
|
|
2585
|
+
snapshot_content: { value: "tracked" },
|
|
1955
2586
|
schema_version: "1.0",
|
|
1956
|
-
version_id: "global",
|
|
1957
|
-
snapshot_content: {
|
|
1958
|
-
value: "inherited value",
|
|
1959
|
-
},
|
|
1960
|
-
untracked: false,
|
|
1961
2587
|
})
|
|
1962
2588
|
.execute();
|
|
1963
|
-
//
|
|
1964
|
-
|
|
1965
|
-
|
|
1966
|
-
|
|
1967
|
-
|
|
1968
|
-
|
|
2589
|
+
// Create an untracked entity in state_all directly with the active version
|
|
2590
|
+
await lix.db
|
|
2591
|
+
.insertInto("state")
|
|
2592
|
+
.values({
|
|
2593
|
+
entity_id: "untracked-entity",
|
|
2594
|
+
schema_key: "mock_test_schema",
|
|
2595
|
+
file_id: "test-file",
|
|
2596
|
+
plugin_key: "test_plugin",
|
|
2597
|
+
snapshot_content: { value: "untracked" },
|
|
2598
|
+
schema_version: "1.0",
|
|
2599
|
+
untracked: true,
|
|
2600
|
+
})
|
|
2601
|
+
.execute();
|
|
2602
|
+
// Verify we have both entities in state view
|
|
2603
|
+
const beforeDelete = await lix.db
|
|
2604
|
+
.selectFrom("state")
|
|
2605
|
+
.where("schema_key", "=", "mock_test_schema")
|
|
2606
|
+
.selectAll()
|
|
2607
|
+
.execute();
|
|
2608
|
+
expectDeterministic(beforeDelete).toHaveLength(2);
|
|
2609
|
+
expectDeterministic(beforeDelete.some((e) => e.entity_id === "tracked-entity")).toBe(true);
|
|
2610
|
+
expectDeterministic(beforeDelete.some((e) => e.entity_id === "untracked-entity")).toBe(true);
|
|
2611
|
+
// Delete ALL from the state view (no WHERE clause)
|
|
2612
|
+
await lix.db
|
|
2613
|
+
.deleteFrom("state")
|
|
2614
|
+
.where("schema_key", "=", "mock_test_schema")
|
|
2615
|
+
.execute();
|
|
2616
|
+
// Check if ALL entries were deleted including untracked
|
|
2617
|
+
const afterDelete = await lix.db
|
|
2618
|
+
.selectFrom("state")
|
|
2619
|
+
.where("schema_key", "=", "mock_test_schema")
|
|
2620
|
+
.selectAll()
|
|
2621
|
+
.execute();
|
|
2622
|
+
// This should be 0 - all entries including untracked should be deleted
|
|
2623
|
+
expectDeterministic(afterDelete).toHaveLength(0);
|
|
2624
|
+
// Also check the underlying state_all table
|
|
2625
|
+
const stateAfterDelete = await lix.db
|
|
1969
2626
|
.selectFrom("state_all")
|
|
1970
|
-
.where("
|
|
1971
|
-
.where("version_id", "=", childVersion.id)
|
|
2627
|
+
.where("schema_key", "=", "mock_test_schema")
|
|
1972
2628
|
.selectAll()
|
|
1973
2629
|
.execute();
|
|
1974
|
-
|
|
1975
|
-
|
|
1976
|
-
|
|
2630
|
+
// All entities should be gone from state_all
|
|
2631
|
+
expectDeterministic(stateAfterDelete).toHaveLength(0);
|
|
2632
|
+
});
|
|
2633
|
+
simulationTest("delete from state view with WHERE should delete untracked entities", async ({ openSimulatedLix, expectDeterministic }) => {
|
|
2634
|
+
const lix = await openSimulatedLix({
|
|
2635
|
+
keyValues: [
|
|
2636
|
+
{
|
|
2637
|
+
key: "lix_deterministic_mode",
|
|
2638
|
+
value: { enabled: true, bootstrap: true },
|
|
2639
|
+
lixcol_version_id: "global",
|
|
2640
|
+
},
|
|
2641
|
+
],
|
|
1977
2642
|
});
|
|
1978
|
-
|
|
1979
|
-
// Step 4: Add untracked state for same entity in child version
|
|
2643
|
+
// Create a tracked entity in state
|
|
1980
2644
|
await lix.db
|
|
1981
|
-
.insertInto("
|
|
2645
|
+
.insertInto("state")
|
|
1982
2646
|
.values({
|
|
1983
|
-
entity_id: "
|
|
2647
|
+
entity_id: "tracked-entity",
|
|
2648
|
+
schema_key: "mock_test_schema",
|
|
1984
2649
|
file_id: "test-file",
|
|
1985
|
-
schema_key: "mock_schema",
|
|
1986
2650
|
plugin_key: "test_plugin",
|
|
2651
|
+
snapshot_content: { value: "tracked" },
|
|
2652
|
+
schema_version: "1.0",
|
|
2653
|
+
})
|
|
2654
|
+
.execute();
|
|
2655
|
+
// Create an untracked entity in state_all directly with the active version
|
|
2656
|
+
await lix.db
|
|
2657
|
+
.insertInto("state")
|
|
2658
|
+
.values({
|
|
2659
|
+
entity_id: "untracked-entity",
|
|
2660
|
+
schema_key: "mock_test_schema",
|
|
2661
|
+
file_id: "test-file",
|
|
2662
|
+
plugin_key: "test_plugin",
|
|
2663
|
+
snapshot_content: { value: "untracked" },
|
|
1987
2664
|
schema_version: "1.0",
|
|
1988
|
-
version_id: childVersion.id,
|
|
1989
|
-
snapshot_content: {
|
|
1990
|
-
value: "untracked override",
|
|
1991
|
-
},
|
|
1992
2665
|
untracked: true,
|
|
1993
2666
|
})
|
|
1994
2667
|
.execute();
|
|
1995
|
-
//
|
|
1996
|
-
const
|
|
1997
|
-
.selectFrom("
|
|
1998
|
-
.where("
|
|
1999
|
-
.where("version_id", "=", childVersion.id)
|
|
2668
|
+
// Verify both entities exist in the state view
|
|
2669
|
+
const beforeDelete = await lix.db
|
|
2670
|
+
.selectFrom("state")
|
|
2671
|
+
.where("schema_key", "=", "mock_test_schema")
|
|
2000
2672
|
.selectAll()
|
|
2001
2673
|
.execute();
|
|
2002
|
-
|
|
2003
|
-
|
|
2004
|
-
|
|
2005
|
-
|
|
2006
|
-
|
|
2007
|
-
|
|
2008
|
-
|
|
2009
|
-
|
|
2010
|
-
|
|
2011
|
-
|
|
2012
|
-
.
|
|
2674
|
+
expectDeterministic(beforeDelete).toHaveLength(2);
|
|
2675
|
+
expectDeterministic(beforeDelete.some((e) => e.entity_id === "tracked-entity")).toBe(true);
|
|
2676
|
+
expectDeterministic(beforeDelete.some((e) => e.entity_id === "untracked-entity")).toBe(true);
|
|
2677
|
+
// Delete the untracked entity from the state view with WHERE clause
|
|
2678
|
+
await lix.db
|
|
2679
|
+
.deleteFrom("state")
|
|
2680
|
+
.where("entity_id", "=", "untracked-entity")
|
|
2681
|
+
.execute();
|
|
2682
|
+
// Check if the untracked entry was deleted
|
|
2683
|
+
const afterDelete = await lix.db
|
|
2684
|
+
.selectFrom("state")
|
|
2685
|
+
.where("schema_key", "=", "mock_test_schema")
|
|
2013
2686
|
.selectAll()
|
|
2014
2687
|
.execute();
|
|
2015
|
-
|
|
2016
|
-
|
|
2017
|
-
|
|
2018
|
-
|
|
2019
|
-
|
|
2020
|
-
|
|
2021
|
-
|
|
2022
|
-
.
|
|
2023
|
-
.where("entity_id", "=", "inherited-entity")
|
|
2024
|
-
.where("schema_key", "=", "mock_schema")
|
|
2688
|
+
// Should only have the tracked entity remaining
|
|
2689
|
+
expectDeterministic(afterDelete).toHaveLength(1);
|
|
2690
|
+
expectDeterministic(afterDelete[0]?.entity_id).toBe("tracked-entity");
|
|
2691
|
+
// Also check the underlying state_all table to confirm deletion
|
|
2692
|
+
const stateAfterDelete = await lix.db
|
|
2693
|
+
.selectFrom("state_all")
|
|
2694
|
+
.where("entity_id", "=", "untracked-entity")
|
|
2695
|
+
.where("schema_key", "=", "mock_test_schema")
|
|
2025
2696
|
.selectAll()
|
|
2026
2697
|
.execute();
|
|
2027
|
-
//
|
|
2028
|
-
|
|
2698
|
+
// The untracked entry should be gone from state_all too
|
|
2699
|
+
expectDeterministic(stateAfterDelete).toHaveLength(0);
|
|
2029
2700
|
});
|
|
2030
2701
|
//# sourceMappingURL=schema.test.js.map
|