Skip to content
This repository has been archived by the owner on Mar 23, 2023. It is now read-only.

fix: swap leveldown/level.js for level #20

Merged
merged 4 commits into from
Jun 26, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
30 changes: 16 additions & 14 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,14 @@
## Table of Contents

- [js-datastore-level](#js-datastore-level)
- [Lead Maintainer](#lead-maintainer)
- [Table of Contents](#table-of-contents)
- [Install](#install)
- [Usage](#usage)
- [Browser Shimming Leveldown](#browser-shimming-leveldown)
- [Database names](#database-names)
- [Contribute](#contribute)
- [License](#license)
- [Lead Maintainer](#Lead-Maintainer)
- [Table of Contents](#Table-of-Contents)
- [Install](#Install)
- [Usage](#Usage)
- [Browser Shimming Leveldown](#Browser-Shimming-Leveldown)
- [Database names](#Database-names)
- [Contribute](#Contribute)
- [License](#License)

## Install

Expand All @@ -41,18 +41,20 @@ $ npm install datastore-level
```js
const LevelStore = require('datastore-level')

// Default using leveldown as backend
// Default using level as backend for node or the browser
const store = new LevelStore('path/to/store')

// use in the browser with level.js
const browserStore = new LevelStore('my/db/name', {db: require('level-js')})

// another leveldown compliant backend like memdown
const memStore = new LevelStore('my/mem/store', {db: require('memdown')})
const memStore = new LevelStore('my/mem/store', {
db: require('level-mem')
})
```

### Browser Shimming Leveldown
As `leveldown` does not work in the browser, `LevelStore` takes advantage of the browser property in package.json to shim `level-js` in its place. Most modern bundlers such as webpack, will see the shim and replace it for use in the browser. If you are using a bundler that does not support pkg.browser, you will need to handle the shimming yourself, as was the case with versions of `LevelStore` 0.7.0 and earlier.

`LevelStore` uses the `level` module to automatically use `level.js` if a modern bundler is used which can detect bundle targets based on the `pkg.browser` property in your `package.json`.

If you are using a bundler that does not support `pkg.browser`, you will need to handle the shimming yourself, as was the case with versions of `LevelStore` 0.7.0 and earlier.

### Database names

Expand Down
10 changes: 2 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@
"description": "Datastore implementation with level(up|down) backend",
"leadMaintainer": "Pedro Teixeira <pedro@protocol.ai>",
"main": "src/index.js",
"browser": {
"leveldown": "level-js"
},
"scripts": {
"test": "aegir test",
"test:node": "aegir test -t node",
Expand Down Expand Up @@ -41,18 +38,15 @@
"homepage": "https://github.com/ipfs/js-datastore-level#readme",
"dependencies": {
"datastore-core": "~0.7.0",
"encoding-down": "^6.0.2",
"interface-datastore": "~0.7.0",
"level-js": "^4.0.1",
"leveldown": "^5.0.0",
"levelup": "^4.0.1"
"level": "^5.0.1"
},
"devDependencies": {
"aegir": "^19.0.3",
"chai": "^4.2.0",
"cids": "~0.7.1",
"dirty-chai": "^2.0.1",
"memdown": "^4.0.0",
"level-mem": "^4.0.0",
"rimraf": "^2.6.2"
},
"contributors": [
Expand Down
23 changes: 6 additions & 17 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,6 @@
'use strict'

const levelup = require('levelup')
const { Key, Errors, utils } = require('interface-datastore')
const encode = require('encoding-down')

const { filter, map, take, sortAll } = utils

/**
Expand All @@ -17,22 +14,14 @@ class LevelDatastore {
database = opts.db
delete opts.db
} else {
// Default to leveldown db
database = require('leveldown')
database = require('level')
}

this.db = levelup(
encode(database(path), { valueEncoding: 'binary' }),
Object.assign({}, opts, {
compression: false // same default as go
}),
(err) => {
// Prevent an uncaught exception error on duplicate locks
if (err) {
throw err
}
}
)
this.db = database(path, {
...opts,
valueEncoding: 'binary',
compression: false // same default as go
})
}

async open () {
Expand Down
5 changes: 1 addition & 4 deletions test/browser.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,7 @@

const { MountDatastore } = require('datastore-core')
const { Key } = require('interface-datastore')

// leveldown will be swapped for level-js
const leveljs = require('leveldown')

const leveljs = require('level')
const LevelStore = require('../src')

describe('LevelDatastore', () => {
Expand Down
10 changes: 4 additions & 6 deletions test/index.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
const chai = require('chai')
chai.use(require('dirty-chai'))
const expect = chai.expect
const memdown = require('memdown')
const LevelDown = require('leveldown')
const levelmem = require('level-mem')
const level = require('level')
const os = require('os')
const LevelStore = require('../src')

Expand All @@ -15,7 +15,6 @@ describe('LevelDatastore', () => {
const levelStore = new LevelStore('init-default')
await levelStore.open()

expect(levelStore.db.db.db instanceof LevelDown).to.equal(true)
expect(levelStore.db.options).to.include({
createIfMissing: true,
errorIfExists: false
Expand All @@ -27,22 +26,21 @@ describe('LevelDatastore', () => {

it('should be able to override the database', async () => {
const levelStore = new LevelStore('init-default', {
db: memdown,
db: levelmem,
createIfMissing: true,
errorIfExists: true
})

await levelStore.open()

expect(levelStore.db.db.db instanceof memdown).to.equal(true)
expect(levelStore.db.options).to.include({
createIfMissing: true,
errorIfExists: true
})
})
})

;[memdown, LevelDown].forEach(database => {
;[levelmem, level].forEach(database => {
describe(`interface-datastore ${database.name}`, () => {
require('interface-datastore/src/tests')({
setup: () => new LevelStore(`${os.tmpdir()}/datastore-level-test-${Math.random()}`, { db: database }),
Expand Down
10 changes: 5 additions & 5 deletions test/node.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ describe('LevelDatastore', () => {
describe('interface-datastore (leveldown)', () => {
const dir = utils.tmpdir()
require('interface-datastore/src/tests')({
setup: () => new LevelStore(dir, { db: require('leveldown') }),
setup: () => new LevelStore(dir, { db: require('level') }),
teardown: () => promisify(rimraf)(dir)
})
})
Expand All @@ -34,17 +34,17 @@ describe('LevelDatastore', () => {
return new MountDatastore([{
prefix: new Key('/a'),
datastore: new LevelStore(dirs[0], {
db: require('leveldown')
db: require('level')
})
}, {
prefix: new Key('/q'),
datastore: new LevelStore(dirs[1], {
db: require('leveldown')
db: require('level')
})
}, {
prefix: new Key('/z'),
datastore: new LevelStore(dirs[2], {
db: require('leveldown')
db: require('level')
})
}])
},
Expand All @@ -56,7 +56,7 @@ describe('LevelDatastore', () => {

it.skip('interop with go', async () => {
const store = new LevelStore(path.join(__dirname, 'test-repo', 'datastore'), {
db: require('leveldown')
db: require('level')
})

let cids = []
Expand Down