commit 74724178d53be1b41e768772e3de8c6ad56cdc78
parent eda73e896e354f1ce8a0dea9b4a6e04d6c810704
Author: Florian Dold <dold@taler.net>
Date: Sun, 13 Sep 2026 16:16:35 +0200
idb-bridge: respect open lower bounds in range deletes
Start range deletion after an open lower bound so the boundary record is
retained, matching the existing handling of open upper bounds.
Diffstat:
2 files changed, 33 insertions(+), 1 deletion(-)
diff --git a/packages/idb-bridge/src/SqliteBackend.ts b/packages/idb-bridge/src/SqliteBackend.ts
@@ -2187,7 +2187,7 @@ export class SqliteBackend implements Backend {
objectStoreId: objectStoreId,
currentKey: null,
forward: true,
- inclusive: true,
+ inclusive: !range.lowerOpen,
targetKey,
});
} else {
diff --git a/packages/idb-bridge/src/backends.test.ts b/packages/idb-bridge/src/backends.test.ts
@@ -42,6 +42,38 @@ import { initTestIndexedDB, useTestIndexedDb } from "./testingdb.js";
before(initTestIndexedDB);
+test("range deletion respects both open endpoints", async () => {
+ for (const lowerOpen of [false, true]) {
+ for (const upperOpen of [false, true]) {
+ for (const bounded of [false, true]) {
+ const open = useTestIndexedDb().open(`delete-range-${Math.random()}`);
+ open.onupgradeneeded = () => {
+ const store = open.result.createObjectStore("rows");
+ for (let key = 1; key <= 5; key++) store.put(key, key);
+ };
+ const db = await promiseFromRequest(open);
+ try {
+ const tx = db.transaction("rows", "readwrite");
+ const range = bounded
+ ? BridgeIDBKeyRange.bound(2, 4, lowerOpen, upperOpen)
+ : BridgeIDBKeyRange.lowerBound(2, lowerOpen);
+ tx.objectStore("rows").delete(range);
+ await promiseFromTransaction(tx);
+ const remaining = await promiseFromRequest(
+ db.transaction("rows").objectStore("rows").getAll(),
+ );
+ assert.deepStrictEqual(
+ remaining,
+ [1, 2, 3, 4, 5].filter((k) => !range.includes(k)),
+ );
+ } finally {
+ db.close();
+ }
+ }
+ }
+ }
+});
+
test("Spec: Example 1 Part 1", async (t) => {
const idb = useTestIndexedDb();