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

Commit

Permalink
chore: switch to ESM (#87)
Browse files Browse the repository at this point in the history
BREAKING CHANGE: deep imports/requires are no longer possible
  • Loading branch information
achingbrain authored Sep 8, 2021
1 parent 28e7588 commit 798e995
Show file tree
Hide file tree
Showing 13 changed files with 131 additions and 117 deletions.
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 <pedro@protocol.ai>",
"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 <alex@achingbrain.net>",
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

0 comments on commit 798e995

Please sign in to comment.