diff --git a/packages/keyv/README.md b/packages/keyv/README.md index 0cc239a5b..6eb63655c 100644 --- a/packages/keyv/README.md +++ b/packages/keyv/README.md @@ -53,14 +53,6 @@ There are a few existing modules similar to Keyv, however Keyv is different beca - [.deleteMany(keys)](#deletemanykeys) - [.clear()](#clear) - [.iterator()](#iterator) -- [API - Properties](#api---properties) - - [.namespace](#namespace-1) - - [.ttl](#ttl-1) - - [.store](#store-1) - - [.serialize](#serialize-1) - - [.deserialize](#deserialize-1) - - [.compression](#compression-1) - - [.useKeyPrefix](#usekeyprefix-1) - [How to Contribute](#how-to-contribute) - [License](#license) @@ -623,6 +615,22 @@ keyv.useKeyPrefix = true; console.log(keyv.useKeyPrefix); // true ``` +With many of the storage adapters you will also need to set the `namespace` option to `undefined` to have it work correctly. This is because in `v5` we started the transition to having the storage adapter handle the namespacing and `Keyv` will no longer handle it internally via KeyPrefixing. Here is an example of doing ith with `KeyvSqlite`: + +```js +import Keyv from 'keyv'; +import KeyvSqlite from '@keyv/sqlite'; + +const store = new KeyvSqlite('sqlite://path/to/database.sqlite'); +const keyv = new Keyv({ store }); +keyv.useKeyPrefix = false; // disable key prefixing +store.namespace = undefined; // disable namespacing in the storage adapter + +await keyv.set('foo', 'bar'); // true +await keyv.get('foo'); // 'bar' +await keyv.clear(); +``` + # How to Contribute We welcome contributions to Keyv! 🎉 Here are some guides to get you started with contributing: diff --git a/packages/sqlite/package.json b/packages/sqlite/package.json index 44d1aa210..f5cd02a5e 100644 --- a/packages/sqlite/package.json +++ b/packages/sqlite/package.json @@ -66,6 +66,7 @@ "keyv": "workspace:^" }, "devDependencies": { + "@faker-js/faker": "^9.8.0", "@keyv/test-suite": "workspace:^", "@vitest/coverage-v8": "^3.2.4", "rimraf": "^6.0.1", diff --git a/packages/sqlite/test/iterator.test.ts b/packages/sqlite/test/iterator.test.ts new file mode 100644 index 000000000..093546845 --- /dev/null +++ b/packages/sqlite/test/iterator.test.ts @@ -0,0 +1,68 @@ +import * as test from 'vitest'; +import {faker} from '@faker-js/faker'; +import Keyv from 'keyv'; +import KeyvSqlite from '../src/index.js'; + +test.it('Async Iterator with Keyv and useKeyPrefix true', async t => { + const store = new KeyvSqlite({uri: 'sqlite://test/testdb2.sqlite', busyTimeout: 3000}); + const keyv = new Keyv({store, useKeyPrefix: true}); + await keyv.clear(); + // Test with Keyv instance + const keyvData = { + key: faker.string.alphanumeric(10), + value: faker.string.alphanumeric(10), + }; + await keyv.set(keyvData.key, keyvData.value); + const keyvResult = await keyv.get(keyvData.key); + t.expect(keyvResult).toBe(keyvData.value); + // Ensure the Keyv instance can still use the iterator + t.expect(keyv.iterator).toBeDefined(); + if (typeof keyv.iterator === 'function') { + const keyvIterator = keyv.iterator({}); + let keyvDataFound = false; + for await (const [key, raw] of keyvIterator) { + t.expect(key).toBe(keyvData.key); + t.expect(raw).toBe(keyvData.value); + keyvDataFound = true; + } + + if (!keyvDataFound) { + t.expect.fail('Keyv iterator did not find the expected data'); + } + } else { + t.expect.fail('Keyv iterator is not a function'); + } +}); + +test.it('Async Iterator with Keyv and useKeyPrefix false', async t => { + const store = new KeyvSqlite({uri: 'sqlite://test/testdb2.sqlite', busyTimeout: 3000}); + const keyv = new Keyv({store}); + keyv.namespace = undefined; + keyv.useKeyPrefix = false; + await keyv.clear(); + // Test with Keyv instance + const keyvData = { + key: faker.string.alphanumeric(10), + value: faker.string.alphanumeric(10), + }; + await keyv.set(keyvData.key, keyvData.value); + const keyvResult = await keyv.get(keyvData.key); + t.expect(keyvResult).toBe(keyvData.value); + // Ensure the Keyv instance can still use the iterator + t.expect(keyv.iterator).toBeDefined(); + if (typeof keyv.iterator === 'function') { + const keyvIterator = keyv.iterator({}); + let keyvDataFound = false; + for await (const [key, raw] of keyvIterator) { + t.expect(key).toBe(keyvData.key); + t.expect(raw).toBe(keyvData.value); + keyvDataFound = true; + } + + if (!keyvDataFound) { + t.expect.fail('Keyv iterator did not find the expected data'); + } + } else { + t.expect.fail('Keyv iterator is not a function'); + } +}); diff --git a/packages/sqlite/vitest.config.ts b/packages/sqlite/vitest.config.ts index a0e8834af..4c8afcc66 100644 --- a/packages/sqlite/vitest.config.ts +++ b/packages/sqlite/vitest.config.ts @@ -6,6 +6,11 @@ export default defineConfig({ coverage: { reporter: ['json', 'lcov', 'text'], reportOnFailure: true, + exclude: [ + 'dist', + 'src/types.ts', + 'vitest.config.ts', + ], }, }, });