Skip to content

Commit 640afb1

Browse files
Add delMany (#130)
1 parent 1e0eb5c commit 640afb1

File tree

3 files changed

+106
-0
lines changed

3 files changed

+106
-0
lines changed

‎README.md

+20
Original file line numberDiff line numberDiff line change
@@ -166,6 +166,26 @@ import { del } from 'idb-keyval';
166166
del('hello');
167167
```
168168

169+
### delMany:
170+
171+
Delete many keys at once. This is faster than calling `del` multiple times.
172+
173+
```js
174+
import { del, delMany } from 'idb-keyval';
175+
176+
// Instead of:
177+
Promise.all([del(123), del('hello')])
178+
.then(() => console.log('It worked!'))
179+
.catch((err) => console.log('It failed!', err));
180+
181+
// It's faster to do:
182+
delMany([
183+
123, 'hello'
184+
])
185+
.then(() => console.log('It worked!'))
186+
.catch((err) => console.log('It failed!', err));
187+
```
188+
169189
### clear:
170190

171191
Clear all values in the store.

‎src/index.ts

+16
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,22 @@ export function del(
148148
});
149149
}
150150

151+
/**
152+
* Delete multiple keys at once.
153+
*
154+
* @param keys List of keys to delete.
155+
* @param customStore Method to get a custom store. Use with caution (see the docs).
156+
*/
157+
export function delMany(
158+
keys: IDBValidKey[],
159+
customStore = defaultGetStore(),
160+
): Promise<void> {
161+
return customStore('readwrite', (store: IDBObjectStore) => {
162+
keys.forEach((key: IDBValidKey) => store.delete(key));
163+
return promisifyRequest(store.transaction);
164+
});
165+
}
166+
151167
/**
152168
* Clear all values in the store.
153169
*

‎test/index.ts

+70
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
setMany,
1414
update,
1515
getMany,
16+
delMany
1617
} from '../src';
1718
import { assert as typeAssert, IsExact } from 'conditional-type-checks';
1819

@@ -481,5 +482,74 @@ mocha.setup('tdd');
481482
});
482483
});
483484

485+
suite('delMany', () => {
486+
setup(() => Promise.all([clear(), clear(customStore)]));
487+
488+
test('basics', async () => {
489+
await setMany([
490+
['foo', 'bar'],
491+
[123, '456'],
492+
['hello', 'world'],
493+
]);
494+
495+
await delMany(['foo', 123, 'hello']);
496+
497+
assert.deepEqual(
498+
await getMany(['foo', 123, 'hello']),
499+
[undefined, undefined, undefined],
500+
`Keys have been deleted`,
501+
);
502+
});
503+
504+
test('delete selected keys', async () => {
505+
await setMany([
506+
['foo', 'bar'],
507+
[123, '456'],
508+
['hello', 'world'],
509+
]);
510+
511+
await delMany(['foo', 123, 'does-not-exist']);
512+
513+
assert.deepEqual(
514+
await getMany(['foo', 123, 'hello']),
515+
[undefined, undefined, 'world'],
516+
`Selected keys appear to have been deleted`,
517+
);
518+
});
519+
520+
test('custom store', async () => {
521+
await setMany([
522+
['foo', 'bar'],
523+
[123, '456'],
524+
]);
525+
await setMany(
526+
[
527+
['hello', 'world'],
528+
[456, '789'],
529+
[1122, '3344']
530+
],
531+
customStore,
532+
);
533+
534+
await delMany(['hello', 456], customStore)
535+
536+
assert.deepEqual(
537+
await entries(),
538+
[
539+
[123, '456'],
540+
['foo', 'bar'],
541+
],
542+
`Still got entries`,
543+
);
544+
assert.deepEqual(
545+
await entries(customStore),
546+
[
547+
[1122, '3344']
548+
],
549+
`Selected custom store keys have been deleted`,
550+
);
551+
});
552+
});
553+
484554
mocha.run();
485555
})();

0 commit comments

Comments
 (0)