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