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

chore: switch to ESM #87

Merged
merged 2 commits into from
Sep 8, 2021
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
14 changes: 12 additions & 2 deletions .aegir.js → .aegir.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,17 @@ const path = require('path')

/** @type {import('aegir').Options["build"]["config"]} */
const esbuild = {
inject: [path.join(__dirname, './scripts/node-globals.js')]
inject: [path.join(__dirname, './scripts/node-globals.js')],
plugins: [
{
name: 'node built ins',
setup (build) {
build.onResolve({ filter: /^immediate$/ }, () => {
return { path: path.join(__dirname, './scripts/immediate.js') }
})
}
}
]
}

/** @type {import('aegir').PartialOptions} */
Expand All @@ -19,4 +29,4 @@ module.exports = {
}
}
}
}
}
6 changes: 4 additions & 2 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,11 +57,13 @@ jobs:
steps:
- uses: actions/checkout@v2
- run: npm install
- run: npx xvfb-maybe aegir test -t electron-main --bail
- run: npm run pretest
- run: npx xvfb-maybe aegir test -t electron-main --bail -f dist/cjs/node-test/*js
test-electron-renderer:
needs: check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- run: npm install
- run: npx xvfb-maybe aegir test -t electron-renderer --bail
- run: npm run pretest
- run: npx xvfb-maybe aegir test -t electron-renderer --bail -f dist/cjs/browser-test/*js
3 changes: 2 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -40,4 +40,5 @@ dist
test/test-repo/datastore
init-default
datastore-test
.vscode
.vscode
types
31 changes: 14 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# js-datastore-level
# js-datastore-level <!-- omit in toc -->

[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg?style=flat-square)](http://ipn.io)
[![](https://img.shields.io/badge/project-IPFS-blue.svg?style=flat-square)](http://ipfs.io/)
Expand All @@ -14,21 +14,18 @@

> Datastore implementation with [levelup](https://github.com/level/levelup) backend.

## Lead Maintainer
## Lead Maintainer <!-- omit in toc -->

[Alex Potsides](https://github.com/achingbrain)

## Table of Contents
## Table of Contents <!-- omit in toc -->

- [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)
- [Install](#install)
- [Usage](#usage)
- [Browser Shimming Leveldown](#browser-shimming-leveldown)
- [Database names](#database-names)
- [Contribute](#contribute)
- [License](#license)

## Install

Expand All @@ -39,13 +36,13 @@ $ npm install datastore-level
## Usage

```js
const LevelStore = require('datastore-level')
import { LevelDatastore } from 'datastore-level'

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

// another leveldown compliant backend like memdown
const memStore = new LevelStore('my/mem/store', {
const memStore = new LevelDatastore('my/mem/store', {
db: require('level-mem')
})
```
Expand All @@ -61,8 +58,8 @@ If you are using a bundler that does not support `pkg.browser`, you will need to
`level-js@3` changed the database prefix from `IDBWrapper-` to `level-js-`, so please specify the old prefix if you wish to continue using databases created using `datastore-level` prior to `v0.12.0`. E.g.

```javascript
const leveljs = require('level-js')
const browserStore = new LevelStore('my/db/name', {
import leveljs from 'level-js'
import browserStore = new LevelDatastore('my/db/name', {
db: (path) => leveljs(path, {
prefix: 'IDBWrapper-'
})
Expand Down
47 changes: 29 additions & 18 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,28 @@
"description": "Datastore implementation with level(up|down) backend",
"leadMaintainer": "Pedro Teixeira <[email protected]>",
"main": "src/index.js",
"types": "dist/src/index.d.ts",
"type": "module",
"types": "types/index.d.ts",
"files": [
"src",
"dist"
"*",
"!**/*.tsbuildinfo"
],
"exports": {
".": {
"import": "./src/index.js"
}
},
"scripts": {
"test": "aegir test",
"test:node": "aegir test -t node",
"test:browser": "aegir test -t browser",
"test:webworker": "aegir test -t webworker",
"prepare": "aegir build --no-bundle",
"clean": "rimraf dist types",
"prepare": "aegir build --no-bundle && cp -R types dist",
"lint": "aegir ts -p check && aegir lint",
"release": "aegir release",
"release-minor": "aegir release --type minor",
"release-major": "aegir release --type major",
"coverage": "nyc -s npm run test:node && nyc report --reporter=html",
"dep-check": "aegir dep-check"
"build": "aegir build",
"release": "aegir release --target node",
"release-minor": "aegir release --type minor --target node",
"release-major": "aegir release --type major --target node",
"pretest": "aegir build --esm-tests",
"test": "aegir test",
"dep-check": "aegir dep-check -i rimraf"
},
"repository": {
"type": "git",
Expand All @@ -42,26 +47,32 @@
},
"homepage": "https://github.com/ipfs/js-datastore-level#readme",
"dependencies": {
"datastore-core": "^5.0.0",
"interface-datastore": "^5.1.1",
"datastore-core": "^6.0.5",
"interface-datastore": "^6.0.2",
"it-filter": "^1.0.2",
"it-map": "^1.0.5",
"it-sort": "^1.0.0",
"it-take": "^1.0.1",
"level": "^7.0.0"
},
"devDependencies": {
"@ipld/dag-cbor": "^6.0.5",
"aegir": "^33.2.4",
"@types/rimraf": "^3.0.2",
"aegir": "^35.0.3",
"assert": "^2.0.0",
"buffer": "^6.0.3",
"interface-datastore-tests": "^1.0.0",
"interface-datastore-tests": "^2.0.3",
"ipfs-utils": "^8.1.6",
"level-mem": "^5.0.1",
"multiformats": "^9.2.0",
"rimraf": "^3.0.0",
"util": "^0.12.3"
},
"eslintConfig": {
"extends": "ipfs"
"extends": "ipfs",
"parserOptions": {
"sourceType": "module"
}
},
"contributors": [
"achingbrain <[email protected]>",
Expand Down
1 change: 1 addition & 0 deletions scripts/immediate.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
module.exports = setTimeout
3 changes: 2 additions & 1 deletion scripts/node-globals.js
Original file line number Diff line number Diff line change
@@ -1,2 +1,3 @@
// @ts-nocheck
export const { Buffer } = require('buffer')
export const { Buffer } = require('buffer')
export const setImmediate = global.setImmediate
29 changes: 12 additions & 17 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,14 +1,11 @@
'use strict'

const {
Key, Errors, Adapter,
utils: {
sortAll
}
} = require('interface-datastore')
const filter = require('it-filter')
const map = require('it-map')
const take = require('it-take')
import { Key } from 'interface-datastore'
import { BaseDatastore, Errors } from 'datastore-core'
import filter from 'it-filter'
import map from 'it-map'
import take from 'it-take'
import sort from 'it-sort'
// @ts-ignore no types
import Level from 'level'

/**
* @typedef {import('interface-datastore').Datastore} Datastore
Expand All @@ -24,7 +21,7 @@ const take = require('it-take')
*
* @implements {Datastore}
*/
class LevelDatastore extends Adapter {
export class LevelDatastore extends BaseDatastore {
/**
* @param {any} path
* @param {Object} [opts]
Expand All @@ -50,7 +47,7 @@ class LevelDatastore extends Adapter {
delete opts.db
} else {
// @ts-ignore
this.database = require('level')
this.database = Level
}
}

Expand Down Expand Up @@ -183,7 +180,7 @@ class LevelDatastore extends Adapter {
}

if (Array.isArray(q.orders)) {
it = q.orders.reduce((it, f) => sortAll(it, f), it)
it = q.orders.reduce((it, f) => sort(it, f), it)
}

const { offset, limit } = q
Expand Down Expand Up @@ -213,7 +210,7 @@ class LevelDatastore extends Adapter {
}

if (Array.isArray(q.orders)) {
it = q.orders.reduce((it, f) => sortAll(it, f), it)
it = q.orders.reduce((it, f) => sort(it, f), it)
}

const { offset, limit } = q
Expand Down Expand Up @@ -293,5 +290,3 @@ function levelIteratorToIterator (li) {
}
}
}

module.exports = LevelDatastore
24 changes: 11 additions & 13 deletions test/browser.js
Original file line number Diff line number Diff line change
@@ -1,17 +1,16 @@
/* eslint-env mocha */
'use strict'

const { MountDatastore } = require('datastore-core')
const { Key } = require('interface-datastore')
import { MountDatastore } from 'datastore-core'
import { Key } from 'interface-datastore/key'
// @ts-ignore
const leveljs = require('level')
const LevelStore = require('../src')
import leveljs from 'level'
import { LevelDatastore } from '../src/index.js'
import { interfaceDatastoreTests } from 'interface-datastore-tests'

describe('LevelDatastore', () => {
describe('interface-datastore (leveljs)', () => {
// @ts-ignore
require('interface-datastore-tests')({
setup: () => new LevelStore('hello', { db: leveljs }),
interfaceDatastoreTests({
setup: () => new LevelDatastore('hello', { db: leveljs }),
teardown: () => new Promise((resolve, reject) => {
// @ts-ignore
leveljs.destroy('hello', err => {
Expand All @@ -23,18 +22,17 @@ describe('LevelDatastore', () => {
})

describe('interface-datastore (mount(leveljs, leveljs, leveljs))', () => {
// @ts-ignore
require('interface-datastore-tests')({
interfaceDatastoreTests({
setup () {
return new MountDatastore([{
prefix: new Key('/a'),
datastore: new LevelStore('one', { db: leveljs })
datastore: new LevelDatastore('one', { db: leveljs })
}, {
prefix: new Key('/q'),
datastore: new LevelStore('two', { db: leveljs })
datastore: new LevelDatastore('two', { db: leveljs })
}, {
prefix: new Key('/z'),
datastore: new LevelStore('three', { db: leveljs })
datastore: new LevelDatastore('three', { db: leveljs })
}])
},
teardown () {
Expand Down
13 changes: 7 additions & 6 deletions test/fixtures/test-level-iterator-destroy.js
Original file line number Diff line number Diff line change
@@ -1,13 +1,14 @@
'use strict'

const { utils, Key } = require('interface-datastore')
const LevelStore = require('../../src')
import { Key } from 'interface-datastore/key'
import { LevelDatastore } from '../../src/index.js'
import tempdir from 'ipfs-utils/src/temp-dir.js'
// @ts-ignore no types
import Level from 'level'

async function testLevelIteratorDestroy () {
// @ts-ignore
const store = new LevelStore(utils.tmpdir(), { db: require('level') })
const store = new LevelDatastore(tempdir(), { db: Level })
await store.open()
await store.put(new Key(`/test/key${Date.now()}`), Buffer.from(`TESTDATA${Date.now()}`))
await store.put(new Key(`/test/key${Date.now()}`), new TextEncoder().encode(`TESTDATA${Date.now()}`))
for await (const d of store.query({})) {
console.log(d) // eslint-disable-line no-console
}
Expand Down
21 changes: 10 additions & 11 deletions test/index.spec.js
Original file line number Diff line number Diff line change
@@ -1,18 +1,18 @@
/* eslint-env mocha */
'use strict'

const { expect } = require('aegir/utils/chai')
import { expect } from 'aegir/utils/chai.js'
// @ts-ignore
const levelmem = require('level-mem')
import levelmem from 'level-mem'
// @ts-ignore
const level = require('level')
const LevelStore = require('../src')
const { utils } = require('interface-datastore')
import level from 'level'
import { LevelDatastore } from '../src/index.js'
import tempdir from 'ipfs-utils/src/temp-dir.js'
import { interfaceDatastoreTests } from 'interface-datastore-tests'

describe('LevelDatastore', () => {
describe('initialization', () => {
it('should default to a leveldown database', async () => {
const levelStore = new LevelStore('init-default')
const levelStore = new LevelDatastore('init-default')
await levelStore.open()

expect(levelStore.db.options).to.include({
Expand All @@ -25,7 +25,7 @@ describe('LevelDatastore', () => {
})

it('should be able to override the database', async () => {
const levelStore = new LevelStore('init-default', {
const levelStore = new LevelDatastore('init-default', {
db: levelmem,
createIfMissing: true,
errorIfExists: true
Expand All @@ -42,9 +42,8 @@ describe('LevelDatastore', () => {

;[levelmem, level].forEach(database => {
describe(`interface-datastore ${database.name}`, () => {
// @ts-ignore
require('interface-datastore-tests')({
setup: () => new LevelStore(utils.tmpdir(), { db: database }),
interfaceDatastoreTests({
setup: () => new LevelDatastore(tempdir(), { db: database }),
teardown () {}
})
})
Expand Down
Loading