Browse Source

chore: lint

master
Kiko Beats 3 years ago
parent
commit
2ee6507021
No known key found for this signature in database GPG Key ID: 8FA93B22CCF04B96
  1. 2
      .github/workflows/test.yml
  2. 85
      packages/keyv-mongo/src/index.js
  3. 8
      packages/keyv-mongo/test/test.js
  4. 2
      packages/keyv-mysql/package.json
  5. 13
      packages/keyv-mysql/src/index.js
  6. 7
      packages/keyv-mysql/test/test.js
  7. 1
      packages/keyv-postgres/package.json
  8. 14
      packages/keyv-postgres/src/index.js
  9. 13
      packages/keyv-postgres/test/test.js
  10. 7
      packages/keyv-redis/test/test.js
  11. 21
      packages/keyv-sql/test/test.js
  12. 2
      packages/keyv-sqlite/package.json
  13. 13
      packages/keyv-sqlite/src/index.js
  14. 10
      packages/keyv-sqlite/test/test.js
  15. 16
      packages/keyv-test-suite/src/api.js
  16. 10
      packages/keyv-test-suite/src/index.js
  17. 8
      packages/keyv-test-suite/src/iteration.js
  18. 13
      packages/keyv-test-suite/src/namespace.js
  19. 2
      packages/keyv-test-suite/src/values.js
  20. 42
      packages/keyv/src/index.js
  21. 30
      packages/keyv/test/keyv.js
  22. 7
      packages/keyv/test/storage-adapters/mongodb.js
  23. 7
      packages/keyv/test/storage-adapters/mysql.js
  24. 10
      packages/keyv/test/storage-adapters/postgresql.js
  25. 7
      packages/keyv/test/storage-adapters/redis.js
  26. 7
      packages/keyv/test/storage-adapters/sqlite.js

2
.github/workflows/test.yml

@ -62,7 +62,7 @@ jobs:
- run: npm install --no-package-lock - run: npm install --no-package-lock
- run: npm test - run: npm test
- name: Report - name: Report
run: mkdir -p coverage && yarn run nyc report --reporter=text-lcov > coverage/lcov.info run: mkdir -p coverage && npx nyc report --reporter=text-lcov > coverage/lcov.info
- name: Coverage - name: Coverage
uses: coverallsapp/github-action@master uses: coverallsapp/github-action@master
with: with:

85
packages/keyv-mongo/src/index.js

@ -17,18 +17,28 @@ class KeyvMongo extends EventEmitter {
url = Object.assign({ url: url.uri }, url) url = Object.assign({ url: url.uri }, url)
} }
this.options = Object.assign({ this.options = Object.assign(
{
url: 'mongodb://127.0.0.1:27017', url: 'mongodb://127.0.0.1:27017',
collection: 'keyv' collection: 'keyv'
}, url, options) },
url,
options
)
this.options.mongoOptions = Object.assign({ this.options.mongoOptions = Object.assign(
{
useNewUrlParser: true, useNewUrlParser: true,
useUnifiedTopology: true useUnifiedTopology: true
}, this.options.mongoOptions) },
this.options.mongoOptions
)
try { try {
this.client = new mongodb.MongoClient(this.options.url, this.options.mongoOptions) this.client = new mongodb.MongoClient(
this.options.url,
this.options.mongoOptions
)
} catch (error) { } catch (error) {
this.emit('error', error) this.emit('error', error)
} }
@ -37,19 +47,31 @@ class KeyvMongo extends EventEmitter {
let listeningEvents = false let listeningEvents = false
// Implementation from sql by lukechilds, // Implementation from sql by lukechilds,
this.connect = new Promise(resolve => { this.connect = new Promise(resolve => {
this.client.connect() this.client
.connect()
.then(client => { .then(client => {
this.db = client.db(this.options.db) this.db = client.db(this.options.db)
this.store = this.db.collection(this.options.collection) this.store = this.db.collection(this.options.collection)
this.store.createIndex({ key: 1 }, { this.store.createIndex(
{ key: 1 },
{
unique: true, unique: true,
background: true background: true
}) }
this.store.createIndex({ expiresAt: 1 }, { )
this.store.createIndex(
{ expiresAt: 1 },
{
expireAfterSeconds: 0, expireAfterSeconds: 0,
background: true background: true
}) }
for (const method of ['updateOne', 'findOne', 'deleteOne', 'deleteMany']) { )
for (const method of [
'updateOne',
'findOne',
'deleteOne',
'deleteMany'
]) {
this.store[method] = pify(this.store[method].bind(this.store)) this.store[method] = pify(this.store[method].bind(this.store))
} }
@ -65,9 +87,8 @@ class KeyvMongo extends EventEmitter {
} }
get (key) { get (key) {
return this.connect return this.connect.then(store =>
.then(store => store.findOne({ key: { $eq: key } }) store.findOne({ key: { $eq: key } }).then(doc => {
.then(doc => {
if (doc === null) { if (doc === null) {
return undefined return undefined
} }
@ -78,9 +99,15 @@ class KeyvMongo extends EventEmitter {
} }
set (key, value, ttl) { set (key, value, ttl) {
const expiresAt = (typeof ttl === 'number') ? new Date(Date.now() + ttl) : null const expiresAt =
return this.connect typeof ttl === 'number' ? new Date(Date.now() + ttl) : null
.then(store => store.updateOne({ key: { $eq: key } }, { $set: { key, value, expiresAt } }, { upsert: true })) return this.connect.then(store =>
store.updateOne(
{ key: { $eq: key } },
{ $set: { key, value, expiresAt } },
{ upsert: true }
)
)
} }
delete (key) { delete (key) {
@ -88,23 +115,31 @@ class KeyvMongo extends EventEmitter {
return Promise.resolve(false) return Promise.resolve(false)
} }
return this.connect return this.connect.then(store =>
.then(store => store.deleteOne({ key: { $eq: key } }) store
.deleteOne({ key: { $eq: key } })
.then(object => object.deletedCount > 0) .then(object => object.deletedCount > 0)
) )
} }
clear () { clear () {
return this.connect return this.connect.then(store =>
.then(store => store.deleteMany({ key: new RegExp(`^${this.namespace + ':'}`) }) store
.then(() => undefined)) .deleteMany({ key: new RegExp(`^${this.namespace + ':'}`) })
.then(() => undefined)
)
} }
async * iterator () { async * iterator () {
const iterator = await this.connect const iterator = await this.connect.then(store =>
.then(store => store.find({ key: new RegExp(`^${this.namespace ? this.namespace + ':' : '.*'}`) }).map(x => { store
.find({
key: new RegExp(`^${this.namespace ? this.namespace + ':' : '.*'}`)
})
.map(x => {
return [x.key, x.value] return [x.key, x.value]
})) })
)
yield * iterator yield * iterator
} }
} }

8
packages/keyv-mongo/test/test.js

@ -1,11 +1,15 @@
const test = require('ava') 'use strict'
const keyvTestSuite = require('@keyvhq/keyv-test-suite') const keyvTestSuite = require('@keyvhq/keyv-test-suite')
const Keyv = require('@keyvhq/keyv') const Keyv = require('@keyvhq/keyv')
const KeyvMongo = require('../') const test = require('ava')
const KeyvMongo = require('..')
const mongoURL = process.env.MONGO_URL || 'mongodb://127.0.0.1:27017' const mongoURL = process.env.MONGO_URL || 'mongodb://127.0.0.1:27017'
const store = () => new KeyvMongo(mongoURL) const store = () => new KeyvMongo(mongoURL)
keyvTestSuite(test, Keyv, store) keyvTestSuite(test, Keyv, store)
test('Collection option merges into default options', t => { test('Collection option merges into default options', t => {
const store = new KeyvMongo({ collection: 'foo' }) const store = new KeyvMongo({ collection: 'foo' })
t.deepEqual(store.options, { t.deepEqual(store.options, {

2
packages/keyv-mysql/package.json

@ -30,6 +30,8 @@
"mysql2": "2.2.5" "mysql2": "2.2.5"
}, },
"devDependencies": { "devDependencies": {
"@keyvhq/keyv-test-suite": "latest",
"@keyvhq/keyv": "latest",
"ava": "latest", "ava": "latest",
"nyc": "latest" "nyc": "latest"
}, },

13
packages/keyv-mysql/src/index.js

@ -9,16 +9,19 @@ class KeyvMysql extends KeyvSql {
options = { uri: options } options = { uri: options }
} }
options = Object.assign({ options = Object.assign(
{
dialect: 'mysql', dialect: 'mysql',
uri: 'mysql://localhost' uri: 'mysql://localhost'
}, options) },
options
)
options.connect = () => Promise.resolve() options.connect = () =>
Promise.resolve()
.then(() => mysql.createConnection(options.uri)) .then(() => mysql.createConnection(options.uri))
.then(connection => { .then(connection => {
return sql => connection.execute(sql) return sql => connection.execute(sql).then(data => data[0])
.then(data => data[0])
}) })
super(options) super(options)

7
packages/keyv-mysql/test/test.js

@ -1,7 +1,10 @@
const test = require('ava') 'use strict'
const keyvTestSuite = require('@keyvhq/keyv-test-suite') const keyvTestSuite = require('@keyvhq/keyv-test-suite')
const Keyv = require('@keyvhq/keyv') const Keyv = require('@keyvhq/keyv')
const KeyvMysql = require('../') const test = require('ava')
const KeyvMysql = require('..')
const dbUrl = process.env.MYSQL_URL || 'mysql://root:root@localhost/keyv_test' const dbUrl = process.env.MYSQL_URL || 'mysql://root:root@localhost/keyv_test'
const store = () => new KeyvMysql(dbUrl) const store = () => new KeyvMysql(dbUrl)

1
packages/keyv-postgres/package.json

@ -31,6 +31,7 @@
}, },
"devDependencies": { "devDependencies": {
"@keyvhq/keyv-test-suite": "latest", "@keyvhq/keyv-test-suite": "latest",
"@keyvhq/keyv": "latest",
"ava": "latest", "ava": "latest",
"nyc": "latest" "nyc": "latest"
}, },

14
packages/keyv-postgres/src/index.js

@ -5,19 +5,21 @@ const Pool = require('pg').Pool
class KeyvPostgres extends KeyvSql { class KeyvPostgres extends KeyvSql {
constructor (options) { constructor (options) {
options = Object.assign({ options = Object.assign(
{
dialect: 'postgres', dialect: 'postgres',
uri: 'postgresql://localhost:5432' uri: 'postgresql://localhost:5432'
}, options) },
options
)
options.connect = () => Promise.resolve() options.connect = () =>
.then(() => { Promise.resolve().then(() => {
const pool = new Pool({ const pool = new Pool({
connectionString: options.uri, connectionString: options.uri,
ssl: options.ssl ssl: options.ssl
}) })
return sql => pool.query(sql) return sql => pool.query(sql).then(data => data.rows)
.then(data => data.rows)
}) })
super(options) super(options)

13
packages/keyv-postgres/test/test.js

@ -1,7 +1,14 @@
const test = require('ava') 'use strict'
const keyvTestSuite = require('@keyvhq/keyv-test-suite') const keyvTestSuite = require('@keyvhq/keyv-test-suite')
const Keyv = require('@keyvhq/keyv') const Keyv = require('@keyvhq/keyv')
const KeyvPostgres = require('../') const test = require('ava')
const KeyvPostgres = require('..')
const store = () =>
new KeyvPostgres({
uri: 'postgresql://postgres:postgres@localhost:5432/keyv_test'
})
const store = () => new KeyvPostgres({ uri: 'postgresql://postgres:postgres@localhost:5432/keyv_test' })
keyvTestSuite(test, Keyv, store) keyvTestSuite(test, Keyv, store)

7
packages/keyv-redis/test/test.js

@ -1,8 +1,11 @@
const test = require('ava') 'use strict'
const keyvTestSuite = require('@keyvhq/keyv-test-suite') const keyvTestSuite = require('@keyvhq/keyv-test-suite')
const Keyv = require('@keyvhq/keyv') const Keyv = require('@keyvhq/keyv')
const KeyvRedis = require('../')
const Redis = require('ioredis') const Redis = require('ioredis')
const test = require('ava')
const KeyvRedis = require('..')
const { REDIS_HOST = 'localhost' } = process.env const { REDIS_HOST = 'localhost' } = process.env
const redisURI = `redis://${REDIS_HOST}` const redisURI = `redis://${REDIS_HOST}`

21
packages/keyv-sql/test/test.js

@ -1,19 +1,25 @@
const test = require('ava') 'use strict'
const keyvTestSuite = require('@keyvhq/keyv-test-suite') const keyvTestSuite = require('@keyvhq/keyv-test-suite')
const Keyv = require('@keyvhq/keyv') const Keyv = require('@keyvhq/keyv')
const KeyvSql = require('../')
const sqlite3 = require('sqlite3') const sqlite3 = require('sqlite3')
const pify = require('pify') const pify = require('pify')
const test = require('ava')
const KeyvSql = require('..')
class TestSqlite extends KeyvSql { class TestSqlite extends KeyvSql {
constructor (options) { constructor (options) {
options = Object.assign({ options = Object.assign(
{
dialect: 'sqlite', dialect: 'sqlite',
db: 'test/testdb.sqlite' db: 'test/testdb.sqlite'
}, options) },
options
)
options.connect = () => new Promise((resolve, reject) => { options.connect = () =>
new Promise((resolve, reject) => {
const db = new sqlite3.Database(options.db, error => { const db = new sqlite3.Database(options.db, error => {
if (error) { if (error) {
reject(error) reject(error)
@ -22,8 +28,7 @@ class TestSqlite extends KeyvSql {
resolve(db) resolve(db)
} }
}) })
}) }).then(db => pify(db.all).bind(db))
.then(db => pify(db.all).bind(db))
super(options) super(options)
} }

2
packages/keyv-sqlite/package.json

@ -30,6 +30,8 @@
"sqlite3": "^5.0.2" "sqlite3": "^5.0.2"
}, },
"devDependencies": { "devDependencies": {
"@keyvhq/keyv-test-suite": "latest",
"@keyvhq/keyv": "latest",
"ava": "latest", "ava": "latest",
"nyc": "latest" "nyc": "latest"
}, },

13
packages/keyv-sqlite/src/index.js

@ -6,13 +6,17 @@ const pify = require('pify')
class KeyvSqlite extends KeyvSql { class KeyvSqlite extends KeyvSql {
constructor (options) { constructor (options) {
options = Object.assign({ options = Object.assign(
{
dialect: 'sqlite', dialect: 'sqlite',
uri: 'sqlite://:memory:' uri: 'sqlite://:memory:'
}, options) },
options
)
options.db = options.uri.replace(/^sqlite:\/\//, '') options.db = options.uri.replace(/^sqlite:\/\//, '')
options.connect = () => new Promise((resolve, reject) => { options.connect = () =>
new Promise((resolve, reject) => {
const db = new sqlite3.Database(options.db, error => { const db = new sqlite3.Database(options.db, error => {
if (error) { if (error) {
reject(error) reject(error)
@ -24,8 +28,7 @@ class KeyvSqlite extends KeyvSql {
resolve(db) resolve(db)
} }
}) })
}) }).then(db => pify(db.all).bind(db))
.then(db => pify(db.all).bind(db))
super(options) super(options)
} }

10
packages/keyv-sqlite/test/test.js

@ -1,7 +1,11 @@
const test = require('ava') 'use strict'
const keyvTestSuite = require('@keyvhq/keyv-test-suite') const keyvTestSuite = require('@keyvhq/keyv-test-suite')
const Keyv = require('@keyvhq/keyv') const Keyv = require('@keyvhq/keyv')
const KeyvSqlite = require('../') const test = require('ava')
const KeyvSqlite = require('..')
const store = () => new KeyvSqlite({ uri: 'sqlite://test/testdb.sqlite', busyTimeout: 30000 }) const store = () =>
new KeyvSqlite({ uri: 'sqlite://test/testdb.sqlite', busyTimeout: 30000 })
keyvTestSuite(test, Keyv, store) keyvTestSuite(test, Keyv, store)

16
packages/keyv-test-suite/src/api.js

@ -1,3 +1,5 @@
'use strict'
const tk = require('timekeeper') const tk = require('timekeeper')
const delay = require('delay') const delay = require('delay')
@ -49,10 +51,13 @@ const keyvApiTests = (test, Keyv, store) => {
t.is(await keyv.get('foo'), 'bar') t.is(await keyv.get('foo'), 'bar')
}) })
test.serial('.get(key) with nonexistent key resolves to undefined', async t => { test.serial(
'.get(key) with nonexistent key resolves to undefined',
async t => {
const keyv = new Keyv({ store: store() }) const keyv = new Keyv({ store: store() })
t.is(await keyv.get('foo'), undefined) t.is(await keyv.get('foo'), undefined)
}) }
)
test.serial('.delete(key) returns a Promise', t => { test.serial('.delete(key) returns a Promise', t => {
const keyv = new Keyv({ store: store() }) const keyv = new Keyv({ store: store() })
@ -65,11 +70,14 @@ const keyvApiTests = (test, Keyv, store) => {
t.is(await keyv.delete('foo'), true) t.is(await keyv.delete('foo'), true)
}) })
test.serial('.delete(key) with nonexistent key resolves to false', async t => { test.serial(
'.delete(key) with nonexistent key resolves to false',
async t => {
const keyv = new Keyv({ store: store() }) const keyv = new Keyv({ store: store() })
t.is(await keyv.delete(), false) t.is(await keyv.delete(), false)
t.is(await keyv.delete('foo'), false) t.is(await keyv.delete('foo'), false)
}) }
)
test.serial('.delete(key) deletes a key', async t => { test.serial('.delete(key) deletes a key', async t => {
const keyv = new Keyv({ store: store() }) const keyv = new Keyv({ store: store() })

10
packages/keyv-test-suite/src/index.js

@ -1,7 +1,9 @@
const keyvApiTests = require('./api.js') 'use strict'
const keyvValueTests = require('./values.js')
const keyvNamespaceTests = require('./namespace.js') const keyvNamespaceTests = require('./namespace')
const keyvIteratorTests = require('./iteration.js') const keyvIteratorTests = require('./iteration')
const keyvValueTests = require('./values')
const keyvApiTests = require('./api')
const keyvTestSuite = (test, Keyv, store) => { const keyvTestSuite = (test, Keyv, store) => {
keyvIteratorTests(test, Keyv, store) keyvIteratorTests(test, Keyv, store)

8
packages/keyv-test-suite/src/iteration.js

@ -1,3 +1,5 @@
'use strict'
const keyvIteratorTests = (test, Keyv, store) => { const keyvIteratorTests = (test, Keyv, store) => {
test.beforeEach(async () => { test.beforeEach(async () => {
const keyv = new Keyv({ store: store() }) const keyv = new Keyv({ store: store() })
@ -11,7 +13,11 @@ const keyvIteratorTests = (test, Keyv, store) => {
test.serial('iterator() iterates over all values', async t => { test.serial('iterator() iterates over all values', async t => {
const keyv = new Keyv({ store: store() }) const keyv = new Keyv({ store: store() })
const map = new Map(Array.from({ length: 5 }).fill(0).map((x, i) => [String(i), String(i + 10)])) const map = new Map(
Array.from({ length: 5 })
.fill(0)
.map((x, i) => [String(i), String(i + 10)])
)
const toResolve = [] const toResolve = []
for (const [key, value] of map) { for (const [key, value] of map) {
toResolve.push(keyv.set(key, value)) toResolve.push(keyv.set(key, value))

13
packages/keyv-test-suite/src/namespace.js

@ -1,3 +1,5 @@
'use strict'
const keyvNamepsaceTests = (test, Keyv, store) => { const keyvNamepsaceTests = (test, Keyv, store) => {
test.beforeEach(async () => { test.beforeEach(async () => {
const keyv1 = new Keyv({ store: store(), namespace: 'keyv1' }) const keyv1 = new Keyv({ store: store(), namespace: 'keyv1' })
@ -6,7 +8,7 @@ const keyvNamepsaceTests = (test, Keyv, store) => {
await keyv2.clear() await keyv2.clear()
}) })
test.serial('namespaced set/get don\'t collide', async t => { test.serial("namespaced set/get don't collide", async t => {
const keyv1 = new Keyv({ store: store(), namespace: 'keyv1' }) const keyv1 = new Keyv({ store: store(), namespace: 'keyv1' })
const keyv2 = new Keyv({ store: store(), namespace: 'keyv2' }) const keyv2 = new Keyv({ store: store(), namespace: 'keyv2' })
await keyv1.set('foo', 'keyv1') await keyv1.set('foo', 'keyv1')
@ -15,7 +17,9 @@ const keyvNamepsaceTests = (test, Keyv, store) => {
t.is(await keyv2.get('foo'), 'keyv2') t.is(await keyv2.get('foo'), 'keyv2')
}) })
test.serial('namespaced delete only deletes from current namespace', async t => { test.serial(
'namespaced delete only deletes from current namespace',
async t => {
const keyv1 = new Keyv({ store: store(), namespace: 'keyv1' }) const keyv1 = new Keyv({ store: store(), namespace: 'keyv1' })
const keyv2 = new Keyv({ store: store(), namespace: 'keyv2' }) const keyv2 = new Keyv({ store: store(), namespace: 'keyv2' })
await keyv1.set('foo', 'keyv1') await keyv1.set('foo', 'keyv1')
@ -23,7 +27,8 @@ const keyvNamepsaceTests = (test, Keyv, store) => {
t.is(await keyv1.delete('foo'), true) t.is(await keyv1.delete('foo'), true)
t.is(await keyv1.get('foo'), undefined) t.is(await keyv1.get('foo'), undefined)
t.is(await keyv2.get('foo'), 'keyv2') t.is(await keyv2.get('foo'), 'keyv2')
}) }
)
test.serial('namespaced clear only clears current namespace', async t => { test.serial('namespaced clear only clears current namespace', async t => {
const keyv1 = new Keyv({ store: store(), namespace: 'keyv1' }) const keyv1 = new Keyv({ store: store(), namespace: 'keyv1' })
@ -39,7 +44,7 @@ const keyvNamepsaceTests = (test, Keyv, store) => {
t.is(await keyv2.get('bar'), 'keyv2') t.is(await keyv2.get('bar'), 'keyv2')
}) })
test.serial('no namespaced clear doesn\'t clears all stores', async t => { test.serial("no namespaced clear doesn't clears all stores", async t => {
const keyv1 = new Keyv({ store: store(), namespace: false }) const keyv1 = new Keyv({ store: store(), namespace: false })
const keyv2 = new Keyv({ store: store(), namespace: 'keyv2' }) const keyv2 = new Keyv({ store: store(), namespace: 'keyv2' })
await keyv1.set('foo', 'keyv1') await keyv1.set('foo', 'keyv1')

2
packages/keyv-test-suite/src/values.js

@ -1,3 +1,5 @@
'use strict'
const keyvValueTests = (test, Keyv, store) => { const keyvValueTests = (test, Keyv, store) => {
test.beforeEach(async () => { test.beforeEach(async () => {
const keyv = new Keyv({ store: store() }) const keyv = new Keyv({ store: store() })

42
packages/keyv/src/index.js

@ -23,10 +23,17 @@ class Keyv extends EventEmitter {
this.store.on('error', error => this.emit('error', error)) this.store.on('error', error => this.emit('error', error))
} }
const generateIterator = iterator => async function * () { const generateIterator = iterator =>
for await (const [key, raw] of (typeof iterator === 'function' ? iterator() : iterator)) { async function * () {
const data = (typeof raw === 'string') ? this.options.deserialize(raw) : raw for await (const [key, raw] of typeof iterator === 'function'
if (!key.includes(this.options.namespace) || typeof data !== 'object') { ? iterator()
: iterator) {
const data =
typeof raw === 'string' ? this.options.deserialize(raw) : raw
if (
!key.includes(this.options.namespace) ||
typeof data !== 'object'
) {
continue continue
} }
@ -40,7 +47,10 @@ class Keyv extends EventEmitter {
} }
// Attach iterators // Attach iterators
if (typeof this.store[Symbol.iterator] === 'function' && this.store instanceof Map) { if (
typeof this.store[Symbol.iterator] === 'function' &&
this.store instanceof Map
) {
this.iterator = generateIterator(this.store) this.iterator = generateIterator(this.store)
} else if (typeof this.store.iterator === 'function') { } else if (typeof this.store.iterator === 'function') {
this.iterator = generateIterator(this.store.iterator.bind(this.store)) this.iterator = generateIterator(this.store.iterator.bind(this.store))
@ -54,7 +64,12 @@ class Keyv extends EventEmitter {
} }
_getKeyUnprefix (key) { _getKeyUnprefix (key) {
return this.options.namespace ? key.split(':').splice(1).join(':') : key return this.options.namespace
? key
.split(':')
.splice(1)
.join(':')
: key
} }
get (key, options) { get (key, options) {
@ -63,7 +78,7 @@ class Keyv extends EventEmitter {
return Promise.resolve() return Promise.resolve()
.then(() => store.get(keyPrefixed)) .then(() => store.get(keyPrefixed))
.then(data => { .then(data => {
return (typeof data === 'string') ? this.options.deserialize(data) : data return typeof data === 'string' ? this.options.deserialize(data) : data
}) })
.then(data => { .then(data => {
if (data === undefined) { if (data === undefined) {
@ -75,7 +90,7 @@ class Keyv extends EventEmitter {
return undefined return undefined
} }
return (options && options.raw) ? data : data.value return options && options.raw ? data : data.value
}) })
} }
@ -83,8 +98,7 @@ class Keyv extends EventEmitter {
const keyPrefixed = this._getKeyPrefix(key) const keyPrefixed = this._getKeyPrefix(key)
const store = this.store const store = this.store
if (typeof store.has === 'function') { if (typeof store.has === 'function') {
return Promise.resolve() return Promise.resolve().then(() => store.has(keyPrefixed))
.then(() => store.has(keyPrefixed))
} }
return Promise.resolve() return Promise.resolve()
@ -105,7 +119,7 @@ class Keyv extends EventEmitter {
const store = this.store const store = this.store
return Promise.resolve() return Promise.resolve()
.then(() => { .then(() => {
const expires = (typeof ttl === 'number') ? (Date.now() + ttl) : null const expires = typeof ttl === 'number' ? Date.now() + ttl : null
value = { value, expires } value = { value, expires }
return this.options.serialize(value) return this.options.serialize(value)
}) })
@ -116,8 +130,7 @@ class Keyv extends EventEmitter {
delete (key) { delete (key) {
const keyPrefixed = this._getKeyPrefix(key) const keyPrefixed = this._getKeyPrefix(key)
const store = this.store const store = this.store
return Promise.resolve() return Promise.resolve().then(() => store.delete(keyPrefixed))
.then(() => store.delete(keyPrefixed))
} }
clear () { clear () {
@ -126,8 +139,7 @@ class Keyv extends EventEmitter {
} }
const store = this.store const store = this.store
return Promise.resolve() return Promise.resolve().then(() => store.clear())
.then(() => store.clear())
} }
} }
module.exports = Keyv module.exports = Keyv

30
packages/keyv/test/keyv.js

@ -1,7 +1,10 @@
const test = require('ava') 'use strict'
const tk = require('timekeeper')
const keyvTestSuite = require('@keyvhq/keyv-test-suite') const keyvTestSuite = require('@keyvhq/keyv-test-suite')
const Keyv = require('../') const tk = require('timekeeper')
const test = require('ava')
const Keyv = require('..')
test.serial('Keyv is a class', t => { test.serial('Keyv is a class', t => {
t.is(typeof Keyv, 'function') t.is(typeof Keyv, 'function')
@ -65,7 +68,9 @@ test.serial('.set(key, value, ttl) overwrites default tll option', async t => {
tk.reset() tk.reset()
}) })
test.serial('.set(key, value, ttl) where ttl is "0" overwrites default tll option and sets key to never expire', async t => { test.serial(
'.set(key, value, ttl) where ttl is "0" overwrites default tll option and sets key to never expire',
async t => {
const startTime = Date.now() const startTime = Date.now()
tk.freeze(startTime) tk.freeze(startTime)
const store = new Map() const store = new Map()
@ -75,9 +80,12 @@ test.serial('.set(key, value, ttl) where ttl is "0" overwrites default tll optio
tk.freeze(startTime + 250) tk.freeze(startTime + 250)
t.is(await keyv.get('foo'), 'bar') t.is(await keyv.get('foo'), 'bar')
tk.reset() tk.reset()
}) }
)
test.serial('.get(key, {raw: true}) returns the raw object instead of the value', async t => { test.serial(
'.get(key, {raw: true}) returns the raw object instead of the value',
async t => {
const store = new Map() const store = new Map()
const keyv = new Keyv({ store }) const keyv = new Keyv({ store })
await keyv.set('foo', 'bar') await keyv.set('foo', 'bar')
@ -85,9 +93,12 @@ test.serial('.get(key, {raw: true}) returns the raw object instead of the value'
const rawObject = await keyv.get('foo', { raw: true }) const rawObject = await keyv.get('foo', { raw: true })
t.is(value, 'bar') t.is(value, 'bar')
t.is(rawObject.value, 'bar') t.is(rawObject.value, 'bar')
}) }
)
test.serial('Keyv uses custom serializer when provided instead of json-buffer', async t => { test.serial(
'Keyv uses custom serializer when provided instead of json-buffer',
async t => {
t.plan(3) t.plan(3)
const store = new Map() const store = new Map()
const serialize = data => { const serialize = data => {
@ -103,7 +114,8 @@ test.serial('Keyv uses custom serializer when provided instead of json-buffer',
const keyv = new Keyv({ store, serialize, deserialize }) const keyv = new Keyv({ store, serialize, deserialize })
await keyv.set('foo', 'bar') await keyv.set('foo', 'bar')
t.is(await keyv.get('foo'), 'bar') t.is(await keyv.get('foo'), 'bar')
}) }
)
test.serial('Keyv supports async serializer/deserializer', async t => { test.serial('Keyv supports async serializer/deserializer', async t => {
t.plan(3) t.plan(3)

7
packages/keyv/test/storage-adapters/mongodb.js

@ -1,7 +1,10 @@
const test = require('ava') 'use strict'
const keyvTestSuite = require('@keyvhq/keyv-test-suite') const keyvTestSuite = require('@keyvhq/keyv-test-suite')
const Keyv = require('../../')
const KeyvMongo = require('@keyvhq/keyv-mongo') const KeyvMongo = require('@keyvhq/keyv-mongo')
const test = require('ava')
const Keyv = require('../..')
const store = () => new KeyvMongo('mongodb://127.0.0.1:27017') const store = () => new KeyvMongo('mongodb://127.0.0.1:27017')
keyvTestSuite(test, Keyv, store) keyvTestSuite(test, Keyv, store)

7
packages/keyv/test/storage-adapters/mysql.js

@ -1,7 +1,10 @@
const test = require('ava') 'use strict'
const keyvTestSuite = require('@keyvhq/keyv-test-suite') const keyvTestSuite = require('@keyvhq/keyv-test-suite')
const Keyv = require('../../')
const KeyvMysql = require('@keyvhq/keyv-mysql') const KeyvMysql = require('@keyvhq/keyv-mysql')
const test = require('ava')
const Keyv = require('../..')
const store = () => new KeyvMysql('mysql://mysql@localhost/keyv_test') const store = () => new KeyvMysql('mysql://mysql@localhost/keyv_test')
keyvTestSuite(test, Keyv, store) keyvTestSuite(test, Keyv, store)

10
packages/keyv/test/storage-adapters/postgresql.js

@ -1,7 +1,11 @@
const test = require('ava') 'use strict'
const keyvTestSuite = require('@keyvhq/keyv-test-suite') const keyvTestSuite = require('@keyvhq/keyv-test-suite')
const Keyv = require('../../')
const KeyvPostgres = require('postgres') const KeyvPostgres = require('postgres')
const test = require('ava')
const Keyv = require('../..')
const store = () => new KeyvPostgres('postgresql://postgres@localhost:5432/keyv_test') const store = () =>
new KeyvPostgres('postgresql://postgres@localhost:5432/keyv_test')
keyvTestSuite(test, Keyv, store) keyvTestSuite(test, Keyv, store)

7
packages/keyv/test/storage-adapters/redis.js

@ -1,7 +1,10 @@
const test = require('ava') 'use strict'
const keyvTestSuite = require('@keyvhq/keyv-test-suite') const keyvTestSuite = require('@keyvhq/keyv-test-suite')
const Keyv = require('../../')
const KeyvRedis = require('redis') const KeyvRedis = require('redis')
const test = require('ava')
const Keyv = require('../..')
const store = () => new KeyvRedis('redis://localhost') const store = () => new KeyvRedis('redis://localhost')
keyvTestSuite(test, Keyv, store) keyvTestSuite(test, Keyv, store)

7
packages/keyv/test/storage-adapters/sqlite.js

@ -1,7 +1,10 @@
const test = require('ava') 'use strict'
const keyvTestSuite = require('@keyvhq/keyv-test-suite') const keyvTestSuite = require('@keyvhq/keyv-test-suite')
const Keyv = require('../../')
const KeyvSqlite = require('sqlite') const KeyvSqlite = require('sqlite')
const test = require('ava')
const Keyv = require('../..')
const store = () => new KeyvSqlite('sqlite://test/testdb.sqlite') const store = () => new KeyvSqlite('sqlite://test/testdb.sqlite')
keyvTestSuite(test, Keyv, store) keyvTestSuite(test, Keyv, store)

Loading…
Cancel
Save