From a58ed537b5068ce7bcc3f73a14933e5c4661aca0 Mon Sep 17 00:00:00 2001 From: Jytesh <44925963+Jytesh@users.noreply.github.com> Date: Thu, 20 May 2021 19:13:10 +0530 Subject: [PATCH 1/4] Feat: has Signed-off-by: Jytesh <44925963+Jytesh@users.noreply.github.com> --- packages/keyv/src/index.js | 50 ++++++++++++++++---------------------- 1 file changed, 21 insertions(+), 29 deletions(-) diff --git a/packages/keyv/src/index.js b/packages/keyv/src/index.js index 66cd2ea8..63e1b9ab 100644 --- a/packages/keyv/src/index.js +++ b/packages/keyv/src/index.js @@ -3,24 +3,6 @@ const EventEmitter = require('events'); const JSONB = require('json-buffer'); -const loadStore = options => { - const adapters = { - redis: '@keyvhq/keyv-redis', - mongodb: '@keyvhq/keyv-mongo', - mongo: '@keyvhq/keyv-mongo', - sqlite: '@keyvhq/keyv-sqlite', - postgresql: '@keyvhq/keyv-postgres', - postgres: '@keyvhq/keyv-postgres', - mysql: '@keyvhq/keyv-mysql' - }; - if (options.adapter || options.uri) { - const adapter = options.adapter || /^[^:]*/.exec(options.uri)[0]; - return new (require(adapters[adapter]))(options); - } - - return new Map(); -}; - class Keyv extends EventEmitter { constructor(uri, options) { super(); @@ -34,16 +16,13 @@ class Keyv extends EventEmitter { options ); - if (!this.options.store) { - const adapteroptions = Object.assign({}, this.options); - this.options.store = loadStore(adapteroptions); - } + this.store = this.options.store || new Map(); - if (typeof this.options.store.on === 'function') { - this.options.store.on('error', error => this.emit('error', error)); + if (typeof this.store.on === 'function') { + this.store.on('error', error => this.emit('error', error)); } - this.options.store.namespace = this.options.namespace; + this.store.namespace = this.options.namespace; } _getKeyPrefix(key) { @@ -52,7 +31,7 @@ class Keyv extends EventEmitter { get(key, options) { const keyPrefixed = this._getKeyPrefix(key); - const { store } = this.options; + const store = this.store; return Promise.resolve() .then(() => store.get(keyPrefixed)) .then(data => { @@ -72,6 +51,19 @@ class Keyv extends EventEmitter { }); } + has(key) { + const keyPrefixed = this._getKeyPrefix(key); + const store = this.store; + if (typeof store.has === 'function') { + return Promise.resolve() + .then(() => store.has(keyPrefixed)); + } + + return Promise.resolve() + .then(() => store.get(keyPrefixed)) + .then(data => data !== undefined); + } + set(key, value, ttl) { const keyPrefixed = this._getKeyPrefix(key); if (typeof ttl === 'undefined') { @@ -82,7 +74,7 @@ class Keyv extends EventEmitter { ttl = undefined; } - const { store } = this.options; + const store = this.store; return Promise.resolve() .then(() => { @@ -96,13 +88,13 @@ class Keyv extends EventEmitter { delete(key) { const keyPrefixed = this._getKeyPrefix(key); - const { store } = this.options; + const store = this.store; return Promise.resolve() .then(() => store.delete(keyPrefixed)); } clear() { - const { store } = this.options; + const store = this.store; return Promise.resolve() .then(() => store.clear()); } From a25c89852714c0691148a6632f70ed5159da7836 Mon Sep 17 00:00:00 2001 From: Jytesh <44925963+Jytesh@users.noreply.github.com> Date: Tue, 25 May 2021 18:00:28 +0530 Subject: [PATCH 2/4] Tests: Added api tests for .has(key) Signed-off-by: Jytesh <44925963+Jytesh@users.noreply.github.com> --- packages/keyv-test-suite/src/api.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/packages/keyv-test-suite/src/api.js b/packages/keyv-test-suite/src/api.js index 715ddbbc..5f978691 100644 --- a/packages/keyv-test-suite/src/api.js +++ b/packages/keyv-test-suite/src/api.js @@ -100,6 +100,22 @@ const keyvApiTests = (test, Keyv, store) => { t.is(await keyv.get('fizz'), undefined); }); + test.serial('.has(key) returns a Promise', t => { + const keyv = new Keyv({ store: store() }); + t.true(keyv.has('foo') instanceof Promise); + }); + + test.serial('.has(key) resolves to true', async t => { + const keyv = new Keyv({ store: store() }); + await keyv.set('foo', 'bar'); + t.is(await keyv.has('foo'), true); + }); + + test.serial('.has(key) with nonexistent key resolves to false', async t => { + const keyv = new Keyv({ store: store() }); + t.is(await keyv.get('foo'), false); + }); + test.after.always(async () => { const keyv = new Keyv({ store: store() }); await keyv.clear(); From cda660ee2ade9562d9689624622d6455388b37c4 Mon Sep 17 00:00:00 2001 From: Kiko Beats Date: Sat, 19 Jun 2021 16:37:28 +0200 Subject: [PATCH 3/4] ci: use node16 --- .github/workflows/test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index fc70983f..935a6bf9 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -13,7 +13,7 @@ jobs: strategy: matrix: - node-version: [12.x, 14.x, 15.x] + node-version: [12.x, 14.x, 16.x] # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ env: MYSQL_DB_DATABASE: keyv_test From 78d448a3c1a1d1a513529bffd737caafcfe71e46 Mon Sep 17 00:00:00 2001 From: Jytesh <44925963+Jytesh@users.noreply.github.com> Date: Sat, 19 Jun 2021 22:25:15 +0530 Subject: [PATCH 4/4] Tests: Fixed has() tests Signed-off-by: Jytesh <44925963+Jytesh@users.noreply.github.com> --- packages/keyv-test-suite/src/api.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/keyv-test-suite/src/api.js b/packages/keyv-test-suite/src/api.js index f02f0725..014c823c 100644 --- a/packages/keyv-test-suite/src/api.js +++ b/packages/keyv-test-suite/src/api.js @@ -114,7 +114,7 @@ const keyvApiTests = (test, Keyv, store) => { test.serial('.has(key) with nonexistent key resolves to false', async t => { const keyv = new Keyv({ store: store() }); - t.is(await keyv.get('foo'), false); + t.is(await keyv.has('foo'), false); }); test.after.always(async () => {