diff --git a/README.md b/README.md index 7192b4a9..68d1c2ef 100644 --- a/README.md +++ b/README.md @@ -19,6 +19,7 @@ * Events * Extending LevelUP * Multi-process access + * TypeScript * Getting support * Contributing * Licence & copyright @@ -475,6 +476,15 @@ Stores like LevelDB are thread-safe but they are **not** suitable for accessing See the wiki for some LevelUP extensions, including [multilevel](https://github.com/juliangruber/multilevel), that may help if you require a single store to be shared across processes. + +TypeScript +---------- + +LevelUP comes with TypeScript definitions that can automatically infer options from a typed `abstract-leveldown` implementation. + +See the wiki for more information. + + Getting support --------------- diff --git a/lib/levelup.d.ts b/lib/levelup.d.ts new file mode 100644 index 00000000..183c7545 --- /dev/null +++ b/lib/levelup.d.ts @@ -0,0 +1,96 @@ +import { EventEmitter } from 'events'; +import * as levelerrors from 'level-errors'; +import { AbstractLevelDOWN, AbstractIteratorOptions, Batch } from 'abstract-leveldown'; + +declare global { + namespace Level { + export interface UP { + } + } +} + +export interface LevelUp> + extends Level.UP, + EventEmitter { + + open(): Promise; + open(callback?: (err: any) => any): void; + close(): Promise; + close(callback?: (err: any) => any): void; + + put(key: K, value: V, options?: PO): Promise; + put(key: K, value: V, options: PO, callback: (err: any) => any): void; + put(key: K, value: V, callback: (err: any) => any): void; + + get(key: K, options?: GO): Promise; + get(key: K, options: GO, callback: (err: any, value: any) => any): void; + get(key: K, callback: (err: any, value: any) => any): void; + + del(key: K, options?: DO): Promise + del(key: K, options: DO, callback: (err: any) => any): void; + del(key: K, callback: (err: any) => any): void; + + batch(array: TB[], options?: BO): Promise; + batch(array: TB[], options: BO, callback: (err?: any) => any): void; + batch(array: TB[], callback: (err?: any) => any): void; + + batch(): LevelUpChain; + + isOpen(): boolean; + isClosed(): boolean; + + createReadStream(options?: IO & AbstractIteratorOptions): NodeJS.ReadableStream; + createKeyStream(options?: IO & AbstractIteratorOptions): NodeJS.ReadableStream; + createValueStream(options?: IO & AbstractIteratorOptions): NodeJS.ReadableStream; + + /**emitted when a new value is 'put' */ + on(event: 'put', cb: (key: K, value: V) => void): this + /**emitted when a value is deleted*/ + on(event: 'del', cb: (key: K) => void) + /**emitted when a batch operation has executed */ + on(event: 'batch', cb: (ary: any[]) => void) + /**emitted when the database has opened ('open' is synonym) */ + on(event: 'ready', cb: () => void) + /**emitted when the database has opened */ + on(event: 'open', cb: () => void) + /** emitted when the database has closed*/ + on(event: 'closed', cb: () => void) + /** emitted when the database is opening */ + on(event: 'opening', cb: () => void) + /** emitted when the database is closing */ + on(event: 'closing', cb: () => void) +} + +interface LevelUpConstructor { + >( + db: AbstractLevelDOWN, + options: O, + cb?: (err: Error) => void): LevelUp; + >( + db: AbstractLevelDOWN, + cb?: (err: Error) => void): LevelUp; + + new >( + db: AbstractLevelDOWN, + options: O, + cb?: (err?: Error) => void): LevelUp; + new >( + db: AbstractLevelDOWN, + cb?: (err?: Error) => void): LevelUp; + + errors: typeof levelerrors; +} + +export interface LevelUpChain { + readonly length: number; + put(key: K, value: V): this; + del(key: K): this; + clear(): this; + write(callback: (err?: any) => any): this; + write(): Promise; +} + +export var errors: typeof levelerrors; + +declare const LevelUp: LevelUpConstructor; +export default LevelUp \ No newline at end of file diff --git a/package.json b/package.json index c826be2f..d4b2cf73 100644 --- a/package.json +++ b/package.json @@ -34,6 +34,7 @@ "json" ], "main": "lib/levelup.js", + "typings": "lib/levelup.d.ts", "dependencies": { "deferred-leveldown": "~2.0.2", "level-errors": "~1.1.0", @@ -41,30 +42,34 @@ "xtend": "~4.0.0" }, "devDependencies": { - "abstract-leveldown": "^2.7.0", + "@types/node": "^8.0.31", + "abstract-leveldown": "^2.7.1", "after": "^0.8.2", "async": "^2.5.0", "bl": "^1.2.1", "browserify": "^14.3.0", "bustermove": "~1.0.0", "delayed": "~1.0.1", - "encoding-down": "^2.2.0", + "encoding-down": "^2.3.1", "faucet": "~0.0.1", "leveldown": "^2.0.0", - "memdown": "^1.2.4", + "memdown": "^1.4.1", "msgpack-js": "~0.3.0", "referee": "~1.2.0", "rimraf": "^2.6.1", "safe-buffer": "^5.1.0", "slow-stream": "0.0.4", "standard": "^10.0.2", - "tape": "^4.7.0" + "tape": "^4.7.0", + "ts-node": "^3.3.0", + "typescript": "^2.5.2" }, "scripts": { - "test": "standard && node test | faucet" + "test": "standard && node test | faucet && npm run ts-test", + "ts-test": "ts-node --no-cache test | faucet" }, "engines": { "node": ">=6.0.0" }, "license": "MIT" -} +} \ No newline at end of file diff --git a/test/common.js b/test/common.js index 029ef49a..81fa75ff 100644 --- a/test/common.js +++ b/test/common.js @@ -12,11 +12,12 @@ var rimraf = require('rimraf') var fs = require('fs') var path = require('path') var delayed = require('delayed').delayed -var levelup = require('../lib/levelup.js') + +var levelup = require('../lib/levelup.js').default var errors = require('level-errors') var dbidx = 0 -var leveldown = require('leveldown') -var encDown = require('encoding-down') +var leveldown = require('leveldown').default +var encDown = require('encoding-down').default assert(levelup.errors === errors) diff --git a/test/create-stream-vs-put-racecondition.js b/test/create-stream-vs-put-racecondition.js index 8bd75b37..dc5ad4a6 100644 --- a/test/create-stream-vs-put-racecondition.js +++ b/test/create-stream-vs-put-racecondition.js @@ -3,7 +3,7 @@ * MIT License */ -var levelup = require('../lib/levelup.js') +var levelup = require('../lib/levelup.js').default var common = require('./common') var assert = require('referee').assert var buster = require('bustermove') diff --git a/test/deferred-open-test.js b/test/deferred-open-test.js index 1e1bcf8a..f0c1db54 100644 --- a/test/deferred-open-test.js +++ b/test/deferred-open-test.js @@ -3,9 +3,9 @@ * MIT License */ -var levelup = require('../lib/levelup.js') -var leveldown = require('leveldown') -var encDown = require('encoding-down') +var levelup = require('../lib/levelup.js').default +var leveldown = require('leveldown').default +var encDown = require('encoding-down').default var async = require('async') var common = require('./common') var assert = require('referee').assert diff --git a/test/idempotent-test.js b/test/idempotent-test.js index 14499332..70bfa077 100644 --- a/test/idempotent-test.js +++ b/test/idempotent-test.js @@ -3,8 +3,8 @@ * MIT License */ -var levelup = require('../lib/levelup.js') -var leveldown = require('leveldown') +var levelup = require('../lib/levelup.js').default +var leveldown = require('leveldown').default var common = require('./common') var assert = require('referee').assert var buster = require('bustermove') diff --git a/test/init-test.js b/test/init-test.js index 4f17d320..389582be 100644 --- a/test/init-test.js +++ b/test/init-test.js @@ -3,8 +3,8 @@ * MIT License */ -var levelup = require('../lib/levelup.js') -var leveldown = require('leveldown') +var levelup = require('../lib/levelup.js').default +var leveldown = require('leveldown').default var common = require('./common') var assert = require('referee').assert var refute = require('referee').refute diff --git a/test/inject-encoding-test.js b/test/inject-encoding-test.js index cb0ccfd9..e9ff3910 100644 --- a/test/inject-encoding-test.js +++ b/test/inject-encoding-test.js @@ -3,9 +3,9 @@ * MIT License */ -var levelup = require('../lib/levelup.js') -var leveldown = require('leveldown') -var encDown = require('encoding-down') +var levelup = require('../lib/levelup.js').default +var leveldown = require('leveldown').default +var encDown = require('encoding-down').default var async = require('async') var common = require('./common') var msgpack = require('msgpack-js') diff --git a/test/json-test.js b/test/json-test.js index 4ab58b49..2f7abe90 100644 --- a/test/json-test.js +++ b/test/json-test.js @@ -3,9 +3,9 @@ * MIT License */ -var levelup = require('../lib/levelup.js') -var leveldown = require('leveldown') -var encDown = require('encoding-down') +var levelup = require('../lib/levelup.js').default +var leveldown = require('leveldown').default +var encDown = require('encoding-down').default var async = require('async') var common = require('./common') var assert = require('referee').assert diff --git a/test/leveldown-substitution-test.js b/test/leveldown-substitution-test.js index e3cfb452..a0b19709 100644 --- a/test/leveldown-substitution-test.js +++ b/test/leveldown-substitution-test.js @@ -3,12 +3,12 @@ * MIT License */ -var levelup = require('../lib/levelup.js') +var levelup = require('../lib/levelup.js').default var assert = require('referee').assert var refute = require('referee').refute var buster = require('bustermove') -var memdown = require('memdown') -var encDown = require('encoding-down') +var memdown = require('memdown').default +var encDown = require('encoding-down').default require('./common') diff --git a/test/null-and-undefined-test.js b/test/null-and-undefined-test.js index c8cf9cc8..41fd66bb 100644 --- a/test/null-and-undefined-test.js +++ b/test/null-and-undefined-test.js @@ -3,9 +3,9 @@ * MIT License */ -var levelup = require('../lib/levelup.js') -var leveldown = require('leveldown') -var errors = levelup.errors +var levelup = require('../lib/levelup.js').default +var leveldown = require('leveldown').default +var errors = require('../lib/levelup.js').errors var common = require('./common') var assert = require('referee').assert var refute = require('referee').refute diff --git a/test/open-patchsafe-test.js b/test/open-patchsafe-test.js index 46dcf329..30e6bc2e 100644 --- a/test/open-patchsafe-test.js +++ b/test/open-patchsafe-test.js @@ -3,8 +3,8 @@ * MIT License */ -var levelup = require('../lib/levelup.js') -var leveldown = require('leveldown') +var levelup = require('../lib/levelup.js').default +var leveldown = require('leveldown').default var common = require('./common') var assert = require('referee').assert var refute = require('referee').refute diff --git a/test/read-stream-test.js b/test/read-stream-test.js index 3b336674..78c88830 100644 --- a/test/read-stream-test.js +++ b/test/read-stream-test.js @@ -3,9 +3,9 @@ * MIT License */ -var levelup = require('../lib/levelup.js') -var leveldown = require('leveldown') -var encDown = require('encoding-down') +var levelup = require('../lib/levelup.js').default +var leveldown = require('leveldown').default +var encDown = require('encoding-down').default var common = require('./common') var SlowStream = require('slow-stream') var delayed = require('delayed') diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 00000000..2988034d --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "target": "es2015", + "moduleResolution": "node", + "checkJs": true, + "allowJs": true + } +} \ No newline at end of file