remove async dependency

pull/11/head
Timothée Rebours 3 years ago
parent 97908a4195
commit 2ad5759d7e
  1. 9
      benchmarks/ensureIndex.js
  2. 10
      benchmarks/find.js
  3. 10
      benchmarks/findOne.js
  4. 10
      benchmarks/findWithIn.js
  5. 8
      benchmarks/insert.js
  6. 10
      benchmarks/loadDatabase.js
  7. 1
      benchmarks/profiler.js
  8. 14
      benchmarks/remove.js
  9. 14
      benchmarks/update.js
  10. 2
      karma.conf.template.js
  11. 4
      package-lock.json
  12. 1
      package.json
  13. 68
      test/browser/load.spec.js
  14. 36
      test/cursor.test.js
  15. 36
      test/db.test.js
  16. 4
      test/executor.test.js
  17. 10
      test/persistence.test.js
  18. 33
      test/utils.test.js
  19. 10
      test_lac/openFds.test.js
  20. 5
      webpack.config.js

@ -1,5 +1,5 @@
const async = require('async')
const program = require('commander') const program = require('commander')
const { apply, waterfall } = require('../test/utils.test.js')
const Datastore = require('../lib/datastore') const Datastore = require('../lib/datastore')
const commonUtilities = require('./commonUtilities') const commonUtilities = require('./commonUtilities')
const Profiler = require('./profiler') const Profiler = require('./profiler')
@ -19,8 +19,8 @@ console.log('----------------------------')
console.log('Test with ' + n + ' documents') console.log('Test with ' + n + ' documents')
console.log('----------------------------') console.log('----------------------------')
async.waterfall([ waterfall([
async.apply(commonUtilities.prepareDb, benchDb), apply(commonUtilities.prepareDb, benchDb),
function (cb) { function (cb) {
d.loadDatabase(function (err) { d.loadDatabase(function (err) {
if (err) { return cb(err) } if (err) { return cb(err) }
@ -28,7 +28,7 @@ async.waterfall([
}) })
}, },
function (cb) { profiler.beginProfiling(); return cb() }, function (cb) { profiler.beginProfiling(); return cb() },
async.apply(commonUtilities.insertDocs, d, n, profiler), apply(commonUtilities.insertDocs, d, n, profiler),
function (cb) { function (cb) {
let i let i
@ -41,6 +41,7 @@ async.waterfall([
console.log('Average time for one ensureIndex: ' + (profiler.elapsedSinceLastStep() / n) + 'ms') console.log('Average time for one ensureIndex: ' + (profiler.elapsedSinceLastStep() / n) + 'ms')
profiler.step('Finished calling ensureIndex ' + n + ' times') profiler.step('Finished calling ensureIndex ' + n + ' times')
cb()
} }
], function (err) { ], function (err) {
profiler.step('Benchmark finished') profiler.step('Benchmark finished')

@ -1,4 +1,4 @@
const async = require('async') const { apply, waterfall } = require('../test/utils.test.js')
const commonUtilities = require('./commonUtilities') const commonUtilities = require('./commonUtilities')
const Profiler = require('./profiler') const Profiler = require('./profiler')
@ -8,8 +8,8 @@ const config = commonUtilities.getConfiguration(benchDb)
const d = config.d const d = config.d
const n = config.n const n = config.n
async.waterfall([ waterfall([
async.apply(commonUtilities.prepareDb, benchDb), apply(commonUtilities.prepareDb, benchDb),
function (cb) { function (cb) {
d.loadDatabase(function (err) { d.loadDatabase(function (err) {
if (err) { return cb(err) } if (err) { return cb(err) }
@ -18,8 +18,8 @@ async.waterfall([
}) })
}, },
function (cb) { profiler.beginProfiling(); return cb() }, function (cb) { profiler.beginProfiling(); return cb() },
async.apply(commonUtilities.insertDocs, d, n, profiler), apply(commonUtilities.insertDocs, d, n, profiler),
async.apply(commonUtilities.findDocs, d, n, profiler) apply(commonUtilities.findDocs, d, n, profiler)
], function (err) { ], function (err) {
profiler.step('Benchmark finished') profiler.step('Benchmark finished')

@ -1,4 +1,4 @@
const async = require('async') const { apply, waterfall } = require('../test/utils.test.js')
const commonUtilities = require('./commonUtilities') const commonUtilities = require('./commonUtilities')
const Profiler = require('./profiler') const Profiler = require('./profiler')
@ -8,8 +8,8 @@ const config = commonUtilities.getConfiguration(benchDb)
const d = config.d const d = config.d
const n = config.n const n = config.n
async.waterfall([ waterfall([
async.apply(commonUtilities.prepareDb, benchDb), apply(commonUtilities.prepareDb, benchDb),
function (cb) { function (cb) {
d.loadDatabase(function (err) { d.loadDatabase(function (err) {
if (err) { return cb(err) } if (err) { return cb(err) }
@ -18,9 +18,9 @@ async.waterfall([
}) })
}, },
function (cb) { profiler.beginProfiling(); return cb() }, function (cb) { profiler.beginProfiling(); return cb() },
async.apply(commonUtilities.insertDocs, d, n, profiler), apply(commonUtilities.insertDocs, d, n, profiler),
function (cb) { setTimeout(function () { cb() }, 500) }, function (cb) { setTimeout(function () { cb() }, 500) },
async.apply(commonUtilities.findOneDocs, d, n, profiler) apply(commonUtilities.findOneDocs, d, n, profiler)
], function (err) { ], function (err) {
profiler.step('Benchmark finished') profiler.step('Benchmark finished')

@ -1,4 +1,4 @@
const async = require('async') const { apply, waterfall } = require('../test/utils.test.js')
const commonUtilities = require('./commonUtilities') const commonUtilities = require('./commonUtilities')
const Profiler = require('./profiler') const Profiler = require('./profiler')
@ -8,8 +8,8 @@ const config = commonUtilities.getConfiguration(benchDb)
const d = config.d const d = config.d
const n = config.n const n = config.n
async.waterfall([ waterfall([
async.apply(commonUtilities.prepareDb, benchDb), apply(commonUtilities.prepareDb, benchDb),
function (cb) { function (cb) {
d.loadDatabase(function (err) { d.loadDatabase(function (err) {
if (err) { return cb(err) } if (err) { return cb(err) }
@ -18,8 +18,8 @@ async.waterfall([
}) })
}, },
function (cb) { profiler.beginProfiling(); return cb() }, function (cb) { profiler.beginProfiling(); return cb() },
async.apply(commonUtilities.insertDocs, d, n, profiler), apply(commonUtilities.insertDocs, d, n, profiler),
async.apply(commonUtilities.findDocsWithIn, d, n, profiler) apply(commonUtilities.findDocsWithIn, d, n, profiler)
], function (err) { ], function (err) {
profiler.step('Benchmark finished') profiler.step('Benchmark finished')

@ -1,4 +1,4 @@
const async = require('async') const { apply, waterfall } = require('../test/utils.test.js')
const commonUtilities = require('./commonUtilities') const commonUtilities = require('./commonUtilities')
const Profiler = require('./profiler') const Profiler = require('./profiler')
@ -8,8 +8,8 @@ const config = commonUtilities.getConfiguration(benchDb)
const d = config.d const d = config.d
let n = config.n let n = config.n
async.waterfall([ waterfall([
async.apply(commonUtilities.prepareDb, benchDb), apply(commonUtilities.prepareDb, benchDb),
function (cb) { function (cb) {
d.loadDatabase(function (err) { d.loadDatabase(function (err) {
if (err) { return cb(err) } if (err) { return cb(err) }
@ -24,7 +24,7 @@ async.waterfall([
}) })
}, },
function (cb) { profiler.beginProfiling(); return cb() }, function (cb) { profiler.beginProfiling(); return cb() },
async.apply(commonUtilities.insertDocs, d, n, profiler) apply(commonUtilities.insertDocs, d, n, profiler)
], function (err) { ], function (err) {
profiler.step('Benchmark finished') profiler.step('Benchmark finished')

@ -1,4 +1,4 @@
const async = require('async') const { apply, waterfall } = require('../test/utils.test.js')
const program = require('commander') const program = require('commander')
const Datastore = require('../lib/datastore') const Datastore = require('../lib/datastore')
const commonUtilities = require('./commonUtilities') const commonUtilities = require('./commonUtilities')
@ -20,14 +20,14 @@ console.log('Test with ' + n + ' documents')
console.log(program.withIndex ? 'Use an index' : "Don't use an index") console.log(program.withIndex ? 'Use an index' : "Don't use an index")
console.log('----------------------------') console.log('----------------------------')
async.waterfall([ waterfall([
async.apply(commonUtilities.prepareDb, benchDb), apply(commonUtilities.prepareDb, benchDb),
function (cb) { function (cb) {
d.loadDatabase(cb) d.loadDatabase(cb)
}, },
function (cb) { profiler.beginProfiling(); return cb() }, function (cb) { profiler.beginProfiling(); return cb() },
async.apply(commonUtilities.insertDocs, d, n, profiler), apply(commonUtilities.insertDocs, d, n, profiler),
async.apply(commonUtilities.loadDatabase, d, n, profiler) apply(commonUtilities.loadDatabase, d, n, profiler)
], function (err) { ], function (err) {
profiler.step('Benchmark finished') profiler.step('Benchmark finished')

@ -1,3 +1,4 @@
const { apply, waterfall } = require('../test/utils.test.js')
const util = require('util') const util = require('util')
function formatTime (time, precision) { function formatTime (time, precision) {

@ -1,4 +1,4 @@
const async = require('async') const { apply, waterfall } = require('../test/utils.test.js')
const commonUtilities = require('./commonUtilities') const commonUtilities = require('./commonUtilities')
const Profiler = require('./profiler') const Profiler = require('./profiler')
@ -8,8 +8,8 @@ const config = commonUtilities.getConfiguration(benchDb)
const d = config.d const d = config.d
const n = config.n const n = config.n
async.waterfall([ waterfall([
async.apply(commonUtilities.prepareDb, benchDb), apply(commonUtilities.prepareDb, benchDb),
function (cb) { function (cb) {
d.loadDatabase(function (err) { d.loadDatabase(function (err) {
if (err) { return cb(err) } if (err) { return cb(err) }
@ -18,16 +18,16 @@ async.waterfall([
}) })
}, },
function (cb) { profiler.beginProfiling(); return cb() }, function (cb) { profiler.beginProfiling(); return cb() },
async.apply(commonUtilities.insertDocs, d, n, profiler), apply(commonUtilities.insertDocs, d, n, profiler),
// Test with remove only one document // Test with remove only one document
function (cb) { profiler.step('MULTI: FALSE'); return cb() }, function (cb) { profiler.step('MULTI: FALSE'); return cb() },
async.apply(commonUtilities.removeDocs, { multi: false }, d, n, profiler), apply(commonUtilities.removeDocs, { multi: false }, d, n, profiler),
// Test with multiple documents // Test with multiple documents
function (cb) { d.remove({}, { multi: true }, function () { return cb() }) }, function (cb) { d.remove({}, { multi: true }, function () { return cb() }) },
async.apply(commonUtilities.insertDocs, d, n, profiler), apply(commonUtilities.insertDocs, d, n, profiler),
function (cb) { profiler.step('MULTI: TRUE'); return cb() }, function (cb) { profiler.step('MULTI: TRUE'); return cb() },
async.apply(commonUtilities.removeDocs, { multi: true }, d, n, profiler) apply(commonUtilities.removeDocs, { multi: true }, d, n, profiler)
], function (err) { ], function (err) {
profiler.step('Benchmark finished') profiler.step('Benchmark finished')

@ -1,4 +1,4 @@
const async = require('async') const { apply, waterfall } = require('../test/utils.test.js')
const commonUtilities = require('./commonUtilities') const commonUtilities = require('./commonUtilities')
const Profiler = require('./profiler') const Profiler = require('./profiler')
@ -8,8 +8,8 @@ const config = commonUtilities.getConfiguration(benchDb)
const d = config.d const d = config.d
const n = config.n const n = config.n
async.waterfall([ waterfall([
async.apply(commonUtilities.prepareDb, benchDb), apply(commonUtilities.prepareDb, benchDb),
function (cb) { function (cb) {
d.loadDatabase(function (err) { d.loadDatabase(function (err) {
if (err) { return cb(err) } if (err) { return cb(err) }
@ -18,18 +18,18 @@ async.waterfall([
}) })
}, },
function (cb) { profiler.beginProfiling(); return cb() }, function (cb) { profiler.beginProfiling(); return cb() },
async.apply(commonUtilities.insertDocs, d, n, profiler), apply(commonUtilities.insertDocs, d, n, profiler),
// Test with update only one document // Test with update only one document
function (cb) { profiler.step('MULTI: FALSE'); return cb() }, function (cb) { profiler.step('MULTI: FALSE'); return cb() },
async.apply(commonUtilities.updateDocs, { multi: false }, d, n, profiler), apply(commonUtilities.updateDocs, { multi: false }, d, n, profiler),
// Test with multiple documents // Test with multiple documents
// eslint-disable-next-line node/handle-callback-err // eslint-disable-next-line node/handle-callback-err
function (cb) { d.remove({}, { multi: true }, function (err) { return cb() }) }, function (cb) { d.remove({}, { multi: true }, function (err) { return cb() }) },
async.apply(commonUtilities.insertDocs, d, n, profiler), apply(commonUtilities.insertDocs, d, n, profiler),
function (cb) { profiler.step('MULTI: TRUE'); return cb() }, function (cb) { profiler.step('MULTI: TRUE'); return cb() },
async.apply(commonUtilities.updateDocs, { multi: true }, d, n, profiler) apply(commonUtilities.updateDocs, { multi: true }, d, n, profiler)
], function (err) { ], function (err) {
profiler.step('Benchmark finished') profiler.step('Benchmark finished')

@ -14,7 +14,7 @@ module.exports = (config) => ({
// list of files / patterns to load in the browser // list of files / patterns to load in the browser
files: [ files: [
'node_modules/localforage/dist/localforage.min.js', 'node_modules/localforage/dist/localforage.min.js',
'node_modules/async/lib/async.js', 'browser-version/out/testUtils.min.js',
'browser-version/out/nedb.min.js', 'browser-version/out/nedb.min.js',
'test/browser/nedb-browser.spec.js', 'test/browser/nedb-browser.spec.js',
'test/browser/load.spec.js' 'test/browser/load.spec.js'

4
package-lock.json generated

@ -15,7 +15,6 @@
"devDependencies": { "devDependencies": {
"@react-native-async-storage/async-storage": "^1.15.9", "@react-native-async-storage/async-storage": "^1.15.9",
"@types/jest": "^27.0.2", "@types/jest": "^27.0.2",
"async": "0.2.10",
"browser-resolve": "^2.0.0", "browser-resolve": "^2.0.0",
"chai": "^4.3.4", "chai": "^4.3.4",
"commander": "^7.2.0", "commander": "^7.2.0",
@ -20073,8 +20072,7 @@
"dev": true "dev": true
}, },
"async": { "async": {
"version": "0.2.10", "version": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
"resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz",
"integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=",
"dev": true "dev": true
}, },

@ -48,7 +48,6 @@
"@react-native-async-storage/async-storage": "^1.15.9", "@react-native-async-storage/async-storage": "^1.15.9",
"@types/jest": "^27.0.2", "@types/jest": "^27.0.2",
"browser-resolve": "^2.0.0", "browser-resolve": "^2.0.0",
"async": "0.2.10",
"chai": "^4.3.4", "chai": "^4.3.4",
"commander": "^7.2.0", "commander": "^7.2.0",
"events": "^3.3.0", "events": "^3.3.0",

@ -1,5 +1,5 @@
/* eslint-env mocha, browser */ /* eslint-env mocha, browser */
/* global async, Nedb, localforage */ /* global Nedb, localforage, testUtils */
const N = 5000 const N = 5000
const db = new Nedb({ filename: 'loadTest', autoload: true }) const db = new Nedb({ filename: 'loadTest', autoload: true })
@ -9,7 +9,7 @@ const sample = JSON.stringify({ data: Math.random(), _id: Math.random() })
const someInserts = (sn, N, callback) => { const someInserts = (sn, N, callback) => {
const beg = Date.now() const beg = Date.now()
let i = 0 let i = 0
async.whilst(() => i < N, _cb => { testUtils.whilst(() => i < N, _cb => {
db.insert({ data: Math.random() }, err => { i += 1; return _cb(err) }) db.insert({ data: Math.random() }, err => { i += 1; return _cb(err) })
}, err => { }, err => {
console.log('Inserts, series ' + sn + ' ' + (Date.now() - beg)) console.log('Inserts, series ' + sn + ' ' + (Date.now() - beg))
@ -41,7 +41,7 @@ const someLSDiff = (sn, N, callback) => {
function someLF (sn, N, callback) { function someLF (sn, N, callback) {
const beg = Date.now() const beg = Date.now()
let i = 0 let i = 0
async.whilst(() => i < N, _cb => { testUtils.whilst(() => i < N, _cb => {
localforage.getItem('loadTestLF', (err, value) => { localforage.getItem('loadTestLF', (err, value) => {
if (err) return _cb(err) if (err) return _cb(err)
localforage.setItem('loadTestLF', value + sample, err => { i += 1; return _cb(err) }) localforage.setItem('loadTestLF', value + sample, err => { i += 1; return _cb(err) })
@ -56,7 +56,7 @@ function someLF (sn, N, callback) {
const someLFDiff = (sn, N, callback) => { const someLFDiff = (sn, N, callback) => {
const beg = Date.now() const beg = Date.now()
let i = 0 let i = 0
async.whilst(() => i < N, _cb => { testUtils.whilst(() => i < N, _cb => {
localforage.setItem('loadTestLF-' + i, sample, err => { i += 1; return _cb(err) }) localforage.setItem('loadTestLF-' + i, sample, err => { i += 1; return _cb(err) })
}, err => { }, err => {
console.log('localForage/IDB, series ' + sn + ' ' + (Date.now() - beg)) console.log('localForage/IDB, series ' + sn + ' ' + (Date.now() - beg))
@ -72,54 +72,54 @@ describe.skip('Load tests', function () {
db.remove({}, { multi: true }, err => done(err)) db.remove({}, { multi: true }, err => done(err))
}) })
it.skip('Inserts', function (done) { it('Inserts', function (done) {
async.waterfall([ testUtils.waterfall([
// Slow and gets slower with database size // Slow and gets slower with database size
async.apply(someInserts, '#1', N), // N=5000, 141s testUtils.apply(someInserts, '#1', N), // N=5000, 141s
async.apply(someInserts, '#2', N), // N=5000, 208s testUtils.apply(someInserts, '#2', N), // N=5000, 208s
async.apply(someInserts, '#3', N), // N=5000, 281s testUtils.apply(someInserts, '#3', N), // N=5000, 281s
async.apply(someInserts, '#4', N) // N=5000, 350s testUtils.apply(someInserts, '#4', N) // N=5000, 350s
], done) ], done)
}) })
it.skip('Localstorage', function (done) { it('Localstorage', function (done) {
async.waterfall([ testUtils.waterfall([
// Slow and gets slower really fast with database size, then outright crashes // Slow and gets slower really fast with database size, then outright crashes
async.apply(someLS, '#1', N), // N=4000, 2.5s testUtils.apply(someLS, '#1', N), // N=4000, 2.5s
async.apply(someLS, '#2', N), // N=4000, 8.0s testUtils.apply(someLS, '#2', N), // N=4000, 8.0s
async.apply(someLS, '#3', N), // N=4000, 26.5s testUtils.apply(someLS, '#3', N), // N=4000, 26.5s
async.apply(someLS, '#4', N) // N=4000, 47.8s then crash, can't get string (with N=5000 crash happens on second pass) testUtils.apply(someLS, '#4', N) // N=4000, 47.8s then crash, can't get string (with N=5000 crash happens on second pass)
], done) ], done)
}) })
it.skip('Localstorage Diff', function (done) { it('Localstorage Diff', function (done) {
async.waterfall([ testUtils.waterfall([
// Much faster and more consistent // Much faster and more consistent
async.apply(someLSDiff, '#1', N), // N=50000, 0.7s testUtils.apply(someLSDiff, '#1', N), // N=50000, 0.7s
async.apply(someLSDiff, '#2', N), // N=50000, 0.5s testUtils.apply(someLSDiff, '#2', N), // N=50000, 0.5s
async.apply(someLSDiff, '#3', N), // N=50000, 0.5s testUtils.apply(someLSDiff, '#3', N), // N=50000, 0.5s
async.apply(someLSDiff, '#4', N) // N=50000, 0.5s testUtils.apply(someLSDiff, '#4', N) // N=50000, 0.5s
], done) ], done)
}) })
it.skip('LocalForage', function (done) { it('LocalForage', function (done) {
async.waterfall([ testUtils.waterfall([
// Slow and gets slower with database size // Slow and gets slower with database size
cb => { localforage.setItem('loadTestLF', '', err => cb(err)) }, cb => { localforage.setItem('loadTestLF', '', err => cb(err)) },
async.apply(someLF, '#1', N), // N=5000, 69s testUtils.apply(someLF, '#1', N), // N=5000, 69s
async.apply(someLF, '#2', N), // N=5000, 108s testUtils.apply(someLF, '#2', N), // N=5000, 108s
async.apply(someLF, '#3', N), // N=5000, 137s testUtils.apply(someLF, '#3', N), // N=5000, 137s
async.apply(someLF, '#4', N) // N=5000, 169s testUtils.apply(someLF, '#4', N) // N=5000, 169s
], done) ], done)
}) })
it.skip('LocalForage diff', function (done) { it('LocalForage diff', function (done) {
async.waterfall([ testUtils.waterfall([
// Quite fast and speed doesn't change with database size (tested with N=10000 and N=50000, still no slow-down) // Quite fast and speed doesn't change with database size (tested with N=10000 and N=50000, still no slow-down)
async.apply(someLFDiff, '#1', N), // N=5000, 18s testUtils.apply(someLFDiff, '#1', N), // N=5000, 18s
async.apply(someLFDiff, '#2', N), // N=5000, 18s testUtils.apply(someLFDiff, '#2', N), // N=5000, 18s
async.apply(someLFDiff, '#3', N), // N=5000, 18s testUtils.apply(someLFDiff, '#3', N), // N=5000, 18s
async.apply(someLFDiff, '#4', N) // N=5000, 18s testUtils.apply(someLFDiff, '#4', N) // N=5000, 18s
], done) ], done)
}) })
}) })

@ -3,7 +3,7 @@ const chai = require('chai')
const testDb = 'workspace/test.db' const testDb = 'workspace/test.db'
const fs = require('fs') const fs = require('fs')
const path = require('path') const path = require('path')
const async = require('async') const { each, waterfall } = require('./utils.test.js')
const Datastore = require('../lib/datastore') const Datastore = require('../lib/datastore')
const Persistence = require('../lib/persistence') const Persistence = require('../lib/persistence')
const Cursor = require('../lib/cursor') const Cursor = require('../lib/cursor')
@ -19,7 +19,7 @@ describe('Cursor', function () {
d.filename.should.equal(testDb) d.filename.should.equal(testDb)
d.inMemoryOnly.should.equal(false) d.inMemoryOnly.should.equal(false)
async.waterfall([ waterfall([
function (cb) { function (cb) {
Persistence.ensureDirectoryExists(path.dirname(testDb), function () { Persistence.ensureDirectoryExists(path.dirname(testDb), function () {
fs.access(testDb, fs.constants.F_OK, function (err) { fs.access(testDb, fs.constants.F_OK, function (err) {
@ -58,7 +58,7 @@ describe('Cursor', function () {
}) })
it('Without query, an empty query or a simple query and no skip or limit', function (done) { it('Without query, an empty query or a simple query and no skip or limit', function (done) {
async.waterfall([ waterfall([
function (cb) { function (cb) {
const cursor = new Cursor(d) const cursor = new Cursor(d)
cursor.exec(function (err, docs) { cursor.exec(function (err, docs) {
@ -100,7 +100,7 @@ describe('Cursor', function () {
}) })
it('With an empty collection', function (done) { it('With an empty collection', function (done) {
async.waterfall([ waterfall([
function (cb) { function (cb) {
d.remove({}, { multi: true }, function (err) { return cb(err) }) d.remove({}, { multi: true }, function (err) { return cb(err) })
}, },
@ -222,7 +222,7 @@ describe('Cursor', function () {
}) })
it('With an empty collection', function (done) { it('With an empty collection', function (done) {
async.waterfall([ waterfall([
function (cb) { function (cb) {
d.remove({}, { multi: true }, function (err) { return cb(err) }) d.remove({}, { multi: true }, function (err) { return cb(err) })
}, },
@ -240,7 +240,7 @@ describe('Cursor', function () {
it('Ability to chain sorting and exec', function (done) { it('Ability to chain sorting and exec', function (done) {
let i let i
async.waterfall([ waterfall([
function (cb) { function (cb) {
const cursor = new Cursor(d) const cursor = new Cursor(d)
cursor.sort({ age: 1 }).exec(function (err, docs) { cursor.sort({ age: 1 }).exec(function (err, docs) {
@ -267,7 +267,7 @@ describe('Cursor', function () {
}) })
it('Using limit and sort', function (done) { it('Using limit and sort', function (done) {
async.waterfall([ waterfall([
function (cb) { function (cb) {
const cursor = new Cursor(d) const cursor = new Cursor(d)
cursor.sort({ age: 1 }).limit(3).exec(function (err, docs) { cursor.sort({ age: 1 }).limit(3).exec(function (err, docs) {
@ -293,7 +293,7 @@ describe('Cursor', function () {
}) })
it('Using a limit higher than total number of docs shouldnt cause an error', function (done) { it('Using a limit higher than total number of docs shouldnt cause an error', function (done) {
async.waterfall([ waterfall([
function (cb) { function (cb) {
const cursor = new Cursor(d) const cursor = new Cursor(d)
cursor.sort({ age: 1 }).limit(7).exec(function (err, docs) { cursor.sort({ age: 1 }).limit(7).exec(function (err, docs) {
@ -311,7 +311,7 @@ describe('Cursor', function () {
}) })
it('Using limit and skip with sort', function (done) { it('Using limit and skip with sort', function (done) {
async.waterfall([ waterfall([
function (cb) { function (cb) {
const cursor = new Cursor(d) const cursor = new Cursor(d)
cursor.sort({ age: 1 }).limit(1).skip(2).exec(function (err, docs) { cursor.sort({ age: 1 }).limit(1).skip(2).exec(function (err, docs) {
@ -346,7 +346,7 @@ describe('Cursor', function () {
}) })
it('Using too big a limit and a skip with sort', function (done) { it('Using too big a limit and a skip with sort', function (done) {
async.waterfall([ waterfall([
function (cb) { function (cb) {
const cursor = new Cursor(d) const cursor = new Cursor(d)
cursor.sort({ age: 1 }).limit(8).skip(2).exec(function (err, docs) { cursor.sort({ age: 1 }).limit(8).skip(2).exec(function (err, docs) {
@ -362,7 +362,7 @@ describe('Cursor', function () {
}) })
it('Using too big a skip with sort should return no result', function (done) { it('Using too big a skip with sort should return no result', function (done) {
async.waterfall([ waterfall([
function (cb) { function (cb) {
const cursor = new Cursor(d) const cursor = new Cursor(d)
cursor.sort({ age: 1 }).skip(5).exec(function (err, docs) { cursor.sort({ age: 1 }).skip(5).exec(function (err, docs) {
@ -399,7 +399,7 @@ describe('Cursor', function () {
}) })
it('Sorting strings', function (done) { it('Sorting strings', function (done) {
async.waterfall([ waterfall([
function (cb) { function (cb) {
d.remove({}, { multi: true }, function (err) { d.remove({}, { multi: true }, function (err) {
if (err) { return cb(err) } if (err) { return cb(err) }
@ -443,7 +443,7 @@ describe('Cursor', function () {
let doc2 let doc2
let doc3 let doc3
async.waterfall([ waterfall([
function (cb) { function (cb) {
d.remove({}, { multi: true }, function (err) { d.remove({}, { multi: true }, function (err) {
if (err) { return cb(err) } if (err) { return cb(err) }
@ -489,7 +489,7 @@ describe('Cursor', function () {
}) })
it('Sorting when some fields are undefined', function (done) { it('Sorting when some fields are undefined', function (done) {
async.waterfall([ waterfall([
function (cb) { function (cb) {
d.remove({}, { multi: true }, function (err) { d.remove({}, { multi: true }, function (err) {
if (err) { return cb(err) } if (err) { return cb(err) }
@ -537,7 +537,7 @@ describe('Cursor', function () {
}) })
it('Sorting when all fields are undefined', function (done) { it('Sorting when all fields are undefined', function (done) {
async.waterfall([ waterfall([
function (cb) { function (cb) {
d.remove({}, { multi: true }, function (err) { d.remove({}, { multi: true }, function (err) {
if (err) { return cb(err) } if (err) { return cb(err) }
@ -571,7 +571,7 @@ describe('Cursor', function () {
}) })
it('Multiple consecutive sorts', function (done) { it('Multiple consecutive sorts', function (done) {
async.waterfall([ waterfall([
function (cb) { function (cb) {
d.remove({}, { multi: true }, function (err) { d.remove({}, { multi: true }, function (err) {
if (err) { return cb(err) } if (err) { return cb(err) }
@ -655,7 +655,7 @@ describe('Cursor', function () {
const companies = ['acme', 'milkman', 'zoinks'] const companies = ['acme', 'milkman', 'zoinks']
const entities = [] const entities = []
async.waterfall([ waterfall([
function (cb) { function (cb) {
d.remove({}, { multi: true }, function (err) { d.remove({}, { multi: true }, function (err) {
if (err) { return cb(err) } if (err) { return cb(err) }
@ -672,7 +672,7 @@ describe('Cursor', function () {
} }
} }
async.each(entities, function (entity, callback) { each(entities, function (entity, callback) {
d.insert(entity, function () { d.insert(entity, function () {
callback() callback()
}) })

@ -3,7 +3,7 @@ const chai = require('chai')
const testDb = 'workspace/test.db' const testDb = 'workspace/test.db'
const fs = require('fs') const fs = require('fs')
const path = require('path') const path = require('path')
const async = require('async') const { apply, each, waterfall } = require('./utils.test.js')
const model = require('../lib/model') const model = require('../lib/model')
const Datastore = require('../lib/datastore') const Datastore = require('../lib/datastore')
const Persistence = require('../lib/persistence') const Persistence = require('../lib/persistence')
@ -20,7 +20,7 @@ describe('Database', function () {
d.filename.should.equal(testDb) d.filename.should.equal(testDb)
d.inMemoryOnly.should.equal(false) d.inMemoryOnly.should.equal(false)
async.waterfall([ waterfall([
function (cb) { function (cb) {
Persistence.ensureDirectoryExists(path.dirname(testDb), function () { Persistence.ensureDirectoryExists(path.dirname(testDb), function () {
fs.access(testDb, fs.constants.FS_OK, function (err) { fs.access(testDb, fs.constants.FS_OK, function (err) {
@ -697,7 +697,7 @@ describe('Database', function () {
describe('Find', function () { describe('Find', function () {
it('Can find all documents if an empty query is used', function (done) { it('Can find all documents if an empty query is used', function (done) {
async.waterfall([ waterfall([
function (cb) { function (cb) {
// eslint-disable-next-line node/handle-callback-err // eslint-disable-next-line node/handle-callback-err
d.insert({ somedata: 'ok' }, function (err) { d.insert({ somedata: 'ok' }, function (err) {
@ -722,7 +722,7 @@ describe('Database', function () {
}) })
it('Can find all documents matching a basic query', function (done) { it('Can find all documents matching a basic query', function (done) {
async.waterfall([ waterfall([
function (cb) { function (cb) {
// eslint-disable-next-line node/handle-callback-err // eslint-disable-next-line node/handle-callback-err
d.insert({ somedata: 'ok' }, function (err) { d.insert({ somedata: 'ok' }, function (err) {
@ -751,7 +751,7 @@ describe('Database', function () {
}) })
it('Can find one document matching a basic query and return null if none is found', function (done) { it('Can find one document matching a basic query and return null if none is found', function (done) {
async.waterfall([ waterfall([
function (cb) { function (cb) {
// eslint-disable-next-line node/handle-callback-err // eslint-disable-next-line node/handle-callback-err
d.insert({ somedata: 'ok' }, function (err) { d.insert({ somedata: 'ok' }, function (err) {
@ -1025,7 +1025,7 @@ describe('Database', function () {
describe('Count', function () { describe('Count', function () {
it('Count all documents if an empty query is used', function (done) { it('Count all documents if an empty query is used', function (done) {
async.waterfall([ waterfall([
function (cb) { function (cb) {
// eslint-disable-next-line node/handle-callback-err // eslint-disable-next-line node/handle-callback-err
d.insert({ somedata: 'ok' }, function (err) { d.insert({ somedata: 'ok' }, function (err) {
@ -1046,7 +1046,7 @@ describe('Database', function () {
}) })
it('Count all documents matching a basic query', function (done) { it('Count all documents matching a basic query', function (done) {
async.waterfall([ waterfall([
function (cb) { function (cb) {
// eslint-disable-next-line node/handle-callback-err // eslint-disable-next-line node/handle-callback-err
d.insert({ somedata: 'ok' }, function (err) { d.insert({ somedata: 'ok' }, function (err) {
@ -1115,7 +1115,7 @@ describe('Database', function () {
describe('Update', function () { describe('Update', function () {
it('If the query doesn\'t match anything, database is not modified', function (done) { it('If the query doesn\'t match anything, database is not modified', function (done) {
async.waterfall([ waterfall([
function (cb) { function (cb) {
// eslint-disable-next-line node/handle-callback-err // eslint-disable-next-line node/handle-callback-err
d.insert({ somedata: 'ok' }, function (err) { d.insert({ somedata: 'ok' }, function (err) {
@ -1212,7 +1212,7 @@ describe('Database', function () {
} }
// Actually launch the tests // Actually launch the tests
async.waterfall([ waterfall([
function (cb) { function (cb) {
// eslint-disable-next-line node/handle-callback-err // eslint-disable-next-line node/handle-callback-err
d.insert({ somedata: 'ok' }, function (err, doc1) { d.insert({ somedata: 'ok' }, function (err, doc1) {
@ -1234,11 +1234,11 @@ describe('Database', function () {
return cb() return cb()
}) })
}, },
async.apply(testPostUpdateState), apply(testPostUpdateState),
function (cb) { function (cb) {
d.loadDatabase(function (err) { cb(err) }) d.loadDatabase(function (err) { cb(err) })
}, },
async.apply(testPostUpdateState) apply(testPostUpdateState)
], done) ], done)
}) })
@ -1274,7 +1274,7 @@ describe('Database', function () {
} }
// Actually launch the test // Actually launch the test
async.waterfall([ waterfall([
function (cb) { function (cb) {
// eslint-disable-next-line node/handle-callback-err // eslint-disable-next-line node/handle-callback-err
d.insert({ somedata: 'ok' }, function (err, doc1) { d.insert({ somedata: 'ok' }, function (err, doc1) {
@ -1296,11 +1296,11 @@ describe('Database', function () {
return cb() return cb()
}) })
}, },
async.apply(testPostUpdateState), apply(testPostUpdateState),
function (cb) { function (cb) {
d.loadDatabase(function (err) { return cb(err) }) d.loadDatabase(function (err) { return cb(err) })
}, },
async.apply(testPostUpdateState) // The persisted state has been updated apply(testPostUpdateState) // The persisted state has been updated
], done) ], done)
}) })
@ -1895,7 +1895,7 @@ describe('Database', function () {
} }
// Actually launch the test // Actually launch the test
async.waterfall([ waterfall([
function (cb) { function (cb) {
// eslint-disable-next-line node/handle-callback-err // eslint-disable-next-line node/handle-callback-err
d.insert({ somedata: 'ok' }, function (err, doc1) { d.insert({ somedata: 'ok' }, function (err, doc1) {
@ -1915,11 +1915,11 @@ describe('Database', function () {
return cb() return cb()
}) })
}, },
async.apply(testPostUpdateState), apply(testPostUpdateState),
function (cb) { function (cb) {
d.loadDatabase(function (err) { return cb(err) }) d.loadDatabase(function (err) { return cb(err) })
}, },
async.apply(testPostUpdateState) apply(testPostUpdateState)
], done) ], done)
}) })
@ -1934,7 +1934,7 @@ describe('Database', function () {
// Remove two docs simultaneously // Remove two docs simultaneously
const toRemove = ['Mars', 'Saturn'] const toRemove = ['Mars', 'Saturn']
async.each(toRemove, function (planet, cb) { each(toRemove, function (planet, cb) {
d.remove({ planet: planet }, function (err) { return cb(err) }) d.remove({ planet: planet }, function (err) { return cb(err) })
// eslint-disable-next-line node/handle-callback-err // eslint-disable-next-line node/handle-callback-err
}, function (err) { }, function (err) {

@ -3,7 +3,7 @@ const chai = require('chai')
const testDb = 'workspace/test.db' const testDb = 'workspace/test.db'
const fs = require('fs') const fs = require('fs')
const path = require('path') const path = require('path')
const async = require('async') const { waterfall } = require('./utils.test.js')
const Datastore = require('../lib/datastore') const Datastore = require('../lib/datastore')
const Persistence = require('../lib/persistence') const Persistence = require('../lib/persistence')
@ -151,7 +151,7 @@ describe('Executor', function () {
d.filename.should.equal(testDb) d.filename.should.equal(testDb)
d.inMemoryOnly.should.equal(false) d.inMemoryOnly.should.equal(false)
async.waterfall([ waterfall([
function (cb) { function (cb) {
Persistence.ensureDirectoryExists(path.dirname(testDb), function () { Persistence.ensureDirectoryExists(path.dirname(testDb), function () {
fs.access(testDb, fs.constants.F_OK, function (err) { fs.access(testDb, fs.constants.F_OK, function (err) {

@ -3,7 +3,7 @@ const chai = require('chai')
const testDb = 'workspace/test.db' const testDb = 'workspace/test.db'
const fs = require('fs') const fs = require('fs')
const path = require('path') const path = require('path')
const async = require('async') const { apply, waterfall } = require('./utils.test.js')
const model = require('../lib/model') const model = require('../lib/model')
const Datastore = require('../lib/datastore') const Datastore = require('../lib/datastore')
const Persistence = require('../lib/persistence') const Persistence = require('../lib/persistence')
@ -22,7 +22,7 @@ describe('Persistence', function () {
d.filename.should.equal(testDb) d.filename.should.equal(testDb)
d.inMemoryOnly.should.equal(false) d.inMemoryOnly.should.equal(false)
async.waterfall([ waterfall([
function (cb) { function (cb) {
Persistence.ensureDirectoryExists(path.dirname(testDb), function () { Persistence.ensureDirectoryExists(path.dirname(testDb), function () {
fs.access(testDb, fs.constants.FS_OK, function (err) { fs.access(testDb, fs.constants.FS_OK, function (err) {
@ -911,9 +911,9 @@ describe('Persistence', function () {
const dbFile = 'workspace/test2.db' const dbFile = 'workspace/test2.db'
let theDb, theDb2, doc1, doc2 let theDb, theDb2, doc1, doc2
async.waterfall([ waterfall([
async.apply(storage.ensureFileDoesntExist, dbFile), apply(storage.ensureFileDoesntExist, dbFile),
async.apply(storage.ensureFileDoesntExist, dbFile + '~'), apply(storage.ensureFileDoesntExist, dbFile + '~'),
function (cb) { function (cb) {
theDb = new Datastore({ filename: dbFile }) theDb = new Datastore({ filename: dbFile })
theDb.loadDatabase(cb) theDb.loadDatabase(cb)

@ -0,0 +1,33 @@
const { callbackify, promisify } = require('util')
const waterfallAsync = async tasks => {
for (const task of tasks) {
await promisify(task)()
}
}
const waterfall = callbackify(waterfallAsync)
const eachAsync = async (arr, iterator) => Promise.all(arr.map(el => promisify(iterator)(el)))
const each = callbackify(eachAsync)
const apply = function (fn) {
const args = Array.prototype.slice.call(arguments, 1)
return function () {
return fn.apply(
null, args.concat(Array.prototype.slice.call(arguments))
)
}
}
const whilstAsync = async (test, fn) => {
while (test()) await promisify(fn)()
}
const whilst = callbackify(whilstAsync)
module.exports.whilst = whilst
module.exports.apply = apply
module.exports.waterfall = waterfall
module.exports.each = each

@ -1,5 +1,5 @@
const fs = require('fs') const fs = require('fs')
const async = require('async') const { waterfall, whilst } = require('../test/utils.test.js')
const Nedb = require('../lib/datastore') const Nedb = require('../lib/datastore')
const db = new Nedb({ filename: './workspace/openfds.db', autoload: true }) const db = new Nedb({ filename: './workspace/openfds.db', autoload: true })
const N = 64 const N = 64
@ -7,7 +7,7 @@ let i
let fds let fds
function multipleOpen (filename, N, callback) { function multipleOpen (filename, N, callback) {
async.whilst(function () { return i < N } whilst(function () { return i < N }
, function (cb) { , function (cb) {
fs.open(filename, 'r', function (err, fd) { fs.open(filename, 'r', function (err, fd) {
i += 1 i += 1
@ -18,7 +18,7 @@ function multipleOpen (filename, N, callback) {
, callback) , callback)
} }
async.waterfall([ waterfall([
// Check that ulimit has been set to the correct value // Check that ulimit has been set to the correct value
function (cb) { function (cb) {
i = 0 i = 0
@ -46,7 +46,7 @@ async.waterfall([
if (err) { console.log(err) } if (err) { console.log(err) }
i = 0 i = 0
async.whilst(function () { return i < 2 * N + 1 } whilst(function () { return i < 2 * N + 1 }
, function (cb) { , function (cb) {
db.persistence.persistCachedDatabase(function (err) { db.persistence.persistCachedDatabase(function (err) {
if (err) { return cb(err) } if (err) { return cb(err) }
@ -61,4 +61,4 @@ async.waterfall([
}) })
}) })
} }
]) ], () => {})

@ -37,11 +37,12 @@ module.exports = (env, argv) => {
}) })
], ],
entry: { entry: {
Nedb: path.join(__dirname, 'lib', 'datastore.js') Nedb: path.join(__dirname, 'lib', 'datastore.js'),
testUtils: path.join(__dirname, 'test', 'utils.test.js')
}, },
output: { output: {
path: path.join(__dirname, 'browser-version/out'), path: path.join(__dirname, 'browser-version/out'),
filename: minimize ? 'nedb.min.js' : 'nedb.js', filename: `[name]${minimize ? '.min' : ''}.js`,
libraryTarget: 'window', libraryTarget: 'window',
library: '[name]' library: '[name]'
} }

Loading…
Cancel
Save