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

Commit 798e995

Browse files
authored
chore: switch to ESM (#87)
BREAKING CHANGE: deep imports/requires are no longer possible
1 parent 28e7588 commit 798e995

13 files changed

+131
-117
lines changed

.aegir.js renamed to .aegir.cjs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,17 @@ const path = require('path')
44

55
/** @type {import('aegir').Options["build"]["config"]} */
66
const esbuild = {
7-
inject: [path.join(__dirname, './scripts/node-globals.js')]
7+
inject: [path.join(__dirname, './scripts/node-globals.js')],
8+
plugins: [
9+
{
10+
name: 'node built ins',
11+
setup (build) {
12+
build.onResolve({ filter: /^immediate$/ }, () => {
13+
return { path: path.join(__dirname, './scripts/immediate.js') }
14+
})
15+
}
16+
}
17+
]
818
}
919

1020
/** @type {import('aegir').PartialOptions} */
@@ -19,4 +29,4 @@ module.exports = {
1929
}
2030
}
2131
}
22-
}
32+
}

.github/workflows/main.yml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,13 @@ jobs:
5757
steps:
5858
- uses: actions/checkout@v2
5959
- run: npm install
60-
- run: npx xvfb-maybe aegir test -t electron-main --bail
60+
- run: npm run pretest
61+
- run: npx xvfb-maybe aegir test -t electron-main --bail -f dist/cjs/node-test/*js
6162
test-electron-renderer:
6263
needs: check
6364
runs-on: ubuntu-latest
6465
steps:
6566
- uses: actions/checkout@v2
6667
- run: npm install
67-
- run: npx xvfb-maybe aegir test -t electron-renderer --bail
68+
- run: npm run pretest
69+
- run: npx xvfb-maybe aegir test -t electron-renderer --bail -f dist/cjs/browser-test/*js

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,4 +40,5 @@ dist
4040
test/test-repo/datastore
4141
init-default
4242
datastore-test
43-
.vscode
43+
.vscode
44+
types

README.md

Lines changed: 14 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
# js-datastore-level
1+
# js-datastore-level <!-- omit in toc -->
22

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

1515
> Datastore implementation with [levelup](https://github.com/level/levelup) backend.
1616
17-
## Lead Maintainer
17+
## Lead Maintainer <!-- omit in toc -->
1818

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

21-
## Table of Contents
21+
## Table of Contents <!-- omit in toc -->
2222

23-
- [js-datastore-level](#js-datastore-level)
24-
- [Lead Maintainer](#Lead-Maintainer)
25-
- [Table of Contents](#Table-of-Contents)
26-
- [Install](#Install)
27-
- [Usage](#Usage)
28-
- [Browser Shimming Leveldown](#Browser-Shimming-Leveldown)
29-
- [Database names](#Database-names)
30-
- [Contribute](#Contribute)
31-
- [License](#License)
23+
- [Install](#install)
24+
- [Usage](#usage)
25+
- [Browser Shimming Leveldown](#browser-shimming-leveldown)
26+
- [Database names](#database-names)
27+
- [Contribute](#contribute)
28+
- [License](#license)
3229

3330
## Install
3431

@@ -39,13 +36,13 @@ $ npm install datastore-level
3936
## Usage
4037

4138
```js
42-
const LevelStore = require('datastore-level')
39+
import { LevelDatastore } from 'datastore-level'
4340

4441
// Default using level as backend for node or the browser
45-
const store = new LevelStore('path/to/store')
42+
const store = new LevelDatastore('path/to/store')
4643

4744
// another leveldown compliant backend like memdown
48-
const memStore = new LevelStore('my/mem/store', {
45+
const memStore = new LevelDatastore('my/mem/store', {
4946
db: require('level-mem')
5047
})
5148
```
@@ -61,8 +58,8 @@ If you are using a bundler that does not support `pkg.browser`, you will need to
6158
`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.
6259

6360
```javascript
64-
const leveljs = require('level-js')
65-
const browserStore = new LevelStore('my/db/name', {
61+
import leveljs from 'level-js'
62+
import browserStore = new LevelDatastore('my/db/name', {
6663
db: (path) => leveljs(path, {
6764
prefix: 'IDBWrapper-'
6865
})

package.json

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,23 +4,28 @@
44
"description": "Datastore implementation with level(up|down) backend",
55
"leadMaintainer": "Pedro Teixeira <[email protected]>",
66
"main": "src/index.js",
7-
"types": "dist/src/index.d.ts",
7+
"type": "module",
8+
"types": "types/index.d.ts",
89
"files": [
9-
"src",
10-
"dist"
10+
"*",
11+
"!**/*.tsbuildinfo"
1112
],
13+
"exports": {
14+
".": {
15+
"import": "./src/index.js"
16+
}
17+
},
1218
"scripts": {
13-
"test": "aegir test",
14-
"test:node": "aegir test -t node",
15-
"test:browser": "aegir test -t browser",
16-
"test:webworker": "aegir test -t webworker",
17-
"prepare": "aegir build --no-bundle",
19+
"clean": "rimraf dist types",
20+
"prepare": "aegir build --no-bundle && cp -R types dist",
1821
"lint": "aegir ts -p check && aegir lint",
19-
"release": "aegir release",
20-
"release-minor": "aegir release --type minor",
21-
"release-major": "aegir release --type major",
22-
"coverage": "nyc -s npm run test:node && nyc report --reporter=html",
23-
"dep-check": "aegir dep-check"
22+
"build": "aegir build",
23+
"release": "aegir release --target node",
24+
"release-minor": "aegir release --type minor --target node",
25+
"release-major": "aegir release --type major --target node",
26+
"pretest": "aegir build --esm-tests",
27+
"test": "aegir test",
28+
"dep-check": "aegir dep-check -i rimraf"
2429
},
2530
"repository": {
2631
"type": "git",
@@ -42,26 +47,32 @@
4247
},
4348
"homepage": "https://github.com/ipfs/js-datastore-level#readme",
4449
"dependencies": {
45-
"datastore-core": "^5.0.0",
46-
"interface-datastore": "^5.1.1",
50+
"datastore-core": "^6.0.5",
51+
"interface-datastore": "^6.0.2",
4752
"it-filter": "^1.0.2",
4853
"it-map": "^1.0.5",
54+
"it-sort": "^1.0.0",
4955
"it-take": "^1.0.1",
5056
"level": "^7.0.0"
5157
},
5258
"devDependencies": {
5359
"@ipld/dag-cbor": "^6.0.5",
54-
"aegir": "^33.2.4",
60+
"@types/rimraf": "^3.0.2",
61+
"aegir": "^35.0.3",
5562
"assert": "^2.0.0",
5663
"buffer": "^6.0.3",
57-
"interface-datastore-tests": "^1.0.0",
64+
"interface-datastore-tests": "^2.0.3",
65+
"ipfs-utils": "^8.1.6",
5866
"level-mem": "^5.0.1",
5967
"multiformats": "^9.2.0",
6068
"rimraf": "^3.0.0",
6169
"util": "^0.12.3"
6270
},
6371
"eslintConfig": {
64-
"extends": "ipfs"
72+
"extends": "ipfs",
73+
"parserOptions": {
74+
"sourceType": "module"
75+
}
6576
},
6677
"contributors": [
6778
"achingbrain <[email protected]>",

scripts/immediate.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
module.exports = setTimeout

scripts/node-globals.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
// @ts-nocheck
2-
export const { Buffer } = require('buffer')
2+
export const { Buffer } = require('buffer')
3+
export const setImmediate = global.setImmediate

src/index.js

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
'use strict'
2-
3-
const {
4-
Key, Errors, Adapter,
5-
utils: {
6-
sortAll
7-
}
8-
} = require('interface-datastore')
9-
const filter = require('it-filter')
10-
const map = require('it-map')
11-
const take = require('it-take')
1+
import { Key } from 'interface-datastore'
2+
import { BaseDatastore, Errors } from 'datastore-core'
3+
import filter from 'it-filter'
4+
import map from 'it-map'
5+
import take from 'it-take'
6+
import sort from 'it-sort'
7+
// @ts-ignore no types
8+
import Level from 'level'
129

1310
/**
1411
* @typedef {import('interface-datastore').Datastore} Datastore
@@ -24,7 +21,7 @@ const take = require('it-take')
2421
*
2522
* @implements {Datastore}
2623
*/
27-
class LevelDatastore extends Adapter {
24+
export class LevelDatastore extends BaseDatastore {
2825
/**
2926
* @param {any} path
3027
* @param {Object} [opts]
@@ -50,7 +47,7 @@ class LevelDatastore extends Adapter {
5047
delete opts.db
5148
} else {
5249
// @ts-ignore
53-
this.database = require('level')
50+
this.database = Level
5451
}
5552
}
5653

@@ -183,7 +180,7 @@ class LevelDatastore extends Adapter {
183180
}
184181

185182
if (Array.isArray(q.orders)) {
186-
it = q.orders.reduce((it, f) => sortAll(it, f), it)
183+
it = q.orders.reduce((it, f) => sort(it, f), it)
187184
}
188185

189186
const { offset, limit } = q
@@ -213,7 +210,7 @@ class LevelDatastore extends Adapter {
213210
}
214211

215212
if (Array.isArray(q.orders)) {
216-
it = q.orders.reduce((it, f) => sortAll(it, f), it)
213+
it = q.orders.reduce((it, f) => sort(it, f), it)
217214
}
218215

219216
const { offset, limit } = q
@@ -293,5 +290,3 @@ function levelIteratorToIterator (li) {
293290
}
294291
}
295292
}
296-
297-
module.exports = LevelDatastore

test/browser.js

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,16 @@
11
/* eslint-env mocha */
2-
'use strict'
32

4-
const { MountDatastore } = require('datastore-core')
5-
const { Key } = require('interface-datastore')
3+
import { MountDatastore } from 'datastore-core'
4+
import { Key } from 'interface-datastore/key'
65
// @ts-ignore
7-
const leveljs = require('level')
8-
const LevelStore = require('../src')
6+
import leveljs from 'level'
7+
import { LevelDatastore } from '../src/index.js'
8+
import { interfaceDatastoreTests } from 'interface-datastore-tests'
99

1010
describe('LevelDatastore', () => {
1111
describe('interface-datastore (leveljs)', () => {
12-
// @ts-ignore
13-
require('interface-datastore-tests')({
14-
setup: () => new LevelStore('hello', { db: leveljs }),
12+
interfaceDatastoreTests({
13+
setup: () => new LevelDatastore('hello', { db: leveljs }),
1514
teardown: () => new Promise((resolve, reject) => {
1615
// @ts-ignore
1716
leveljs.destroy('hello', err => {
@@ -23,18 +22,17 @@ describe('LevelDatastore', () => {
2322
})
2423

2524
describe('interface-datastore (mount(leveljs, leveljs, leveljs))', () => {
26-
// @ts-ignore
27-
require('interface-datastore-tests')({
25+
interfaceDatastoreTests({
2826
setup () {
2927
return new MountDatastore([{
3028
prefix: new Key('/a'),
31-
datastore: new LevelStore('one', { db: leveljs })
29+
datastore: new LevelDatastore('one', { db: leveljs })
3230
}, {
3331
prefix: new Key('/q'),
34-
datastore: new LevelStore('two', { db: leveljs })
32+
datastore: new LevelDatastore('two', { db: leveljs })
3533
}, {
3634
prefix: new Key('/z'),
37-
datastore: new LevelStore('three', { db: leveljs })
35+
datastore: new LevelDatastore('three', { db: leveljs })
3836
}])
3937
},
4038
teardown () {

test/fixtures/test-level-iterator-destroy.js

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1-
'use strict'
2-
3-
const { utils, Key } = require('interface-datastore')
4-
const LevelStore = require('../../src')
1+
import { Key } from 'interface-datastore/key'
2+
import { LevelDatastore } from '../../src/index.js'
3+
import tempdir from 'ipfs-utils/src/temp-dir.js'
4+
// @ts-ignore no types
5+
import Level from 'level'
56

67
async function testLevelIteratorDestroy () {
78
// @ts-ignore
8-
const store = new LevelStore(utils.tmpdir(), { db: require('level') })
9+
const store = new LevelDatastore(tempdir(), { db: Level })
910
await store.open()
10-
await store.put(new Key(`/test/key${Date.now()}`), Buffer.from(`TESTDATA${Date.now()}`))
11+
await store.put(new Key(`/test/key${Date.now()}`), new TextEncoder().encode(`TESTDATA${Date.now()}`))
1112
for await (const d of store.query({})) {
1213
console.log(d) // eslint-disable-line no-console
1314
}

test/index.spec.js

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,18 @@
11
/* eslint-env mocha */
2-
'use strict'
32

4-
const { expect } = require('aegir/utils/chai')
3+
import { expect } from 'aegir/utils/chai.js'
54
// @ts-ignore
6-
const levelmem = require('level-mem')
5+
import levelmem from 'level-mem'
76
// @ts-ignore
8-
const level = require('level')
9-
const LevelStore = require('../src')
10-
const { utils } = require('interface-datastore')
7+
import level from 'level'
8+
import { LevelDatastore } from '../src/index.js'
9+
import tempdir from 'ipfs-utils/src/temp-dir.js'
10+
import { interfaceDatastoreTests } from 'interface-datastore-tests'
1111

1212
describe('LevelDatastore', () => {
1313
describe('initialization', () => {
1414
it('should default to a leveldown database', async () => {
15-
const levelStore = new LevelStore('init-default')
15+
const levelStore = new LevelDatastore('init-default')
1616
await levelStore.open()
1717

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

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

4343
;[levelmem, level].forEach(database => {
4444
describe(`interface-datastore ${database.name}`, () => {
45-
// @ts-ignore
46-
require('interface-datastore-tests')({
47-
setup: () => new LevelStore(utils.tmpdir(), { db: database }),
45+
interfaceDatastoreTests({
46+
setup: () => new LevelDatastore(tempdir(), { db: database }),
4847
teardown () {}
4948
})
5049
})

0 commit comments

Comments
 (0)