diff --git a/sql.js/sql.js-tests.ts b/sql.js/sql.js-tests.ts
new file mode 100644
index 0000000000..40fceb8fbd
--- /dev/null
+++ b/sql.js/sql.js-tests.ts
@@ -0,0 +1,81 @@
+///
+///
+
+import fs = require("fs");
+import SQL = require("sql.js");
+
+var DB_PATH = "data.db";
+
+function createFile(path: string): void {
+ var fd = fs.openSync(path, "a");
+ fs.closeSync(fd);
+}
+
+// Open the database file. If it does not exist, create a blank database in memory.
+var databaseData: Buffer;
+databaseData = fs.existsSync(DB_PATH) ? fs.readFileSync(DB_PATH) : null;
+var db = new SQL.Database(databaseData);
+
+// Create a new table 'test_table' in the database in memory.
+var createTableStatement =
+ "DROP TABLE IF EXISTS test_table;" +
+ "CREATE TABLE test_table (id INTEGER PRIMARY KEY, content TEXT);";
+db.run(createTableStatement);
+
+// Insert 2 records for testing.
+var insertRecordStatement =
+ "INSERT INTO test_table (id, content) VALUES (@id, @content);";
+db.run(insertRecordStatement, {
+ "@id": 1,
+ "@content": "Content 1"
+});
+db.run(insertRecordStatement, {
+ "@id": 2,
+ "@content": "Content 2"
+});
+
+try {
+ // This query will throw exception: primary key constraint failed.
+ db.run(insertRecordStatement, {
+ "@id": 1,
+ "@content": "Content 3"
+ });
+} catch (ex) {
+ console.warn(ex);
+}
+
+// A simple SELECT query.
+var selectRecordStatement =
+ "SELECT * FROM test_table WHERE id = @id;"
+var selectStatementObject = db.prepare(selectRecordStatement);
+var results = selectStatementObject.get({
+ "@id": 1
+});
+console.log(results);
+selectStatementObject.free();
+
+// Access the results one by one, asynchronously.
+var selectRecordsStatement =
+ "SELECT * FROM test_table;";
+db.each(
+ selectRecordsStatement,
+ (obj: { [columnName: string]: number | string | Uint8Array }): void => {
+ console.log(obj);
+ },
+ (): void => {
+ console.info("Iteration done.");
+ dbAccessDone();
+ });
+
+
+function dbAccessDone(): void {
+ // Save the database into SQLite version 3 format.
+ if (!fs.existsSync(DB_PATH)) {
+ createFile(DB_PATH);
+ }
+ var exportedData = db.export();
+ fs.writeFileSync(DB_PATH, exportedData);
+
+ // Finally, close the database connection and release the resources in memory.
+ db.close();
+}
diff --git a/sql.js/sql.js.d.ts b/sql.js/sql.js.d.ts
new file mode 100644
index 0000000000..d3f22afc1f
--- /dev/null
+++ b/sql.js/sql.js.d.ts
@@ -0,0 +1,67 @@
+// Type definitions for sql.js
+// Project: https://github.com/kripken/sql.js
+// Definitions by: George Wu
+// Definitions: https://github.com/borisyankov/DefinitelyTyped
+
+///
+
+declare module "sql.js" {
+
+ class Database {
+ constructor(data: Buffer);
+ constructor(data: Uint8Array);
+ constructor(data: number[]);
+
+ run(sql: string): Database;
+ run(sql: string, params: { [key: string]: number | string | Uint8Array }): Database;
+ run(sql: string, params: (number | string | Uint8Array)[]): Database;
+
+ exec(sql: string): QueryResults[];
+
+ each(sql: string, callback: (obj: { [columnName: string]: number | string | Uint8Array }) => void, done: () => void): void;
+ each(sql: string, params: { [key: string]: number | string | Uint8Array }, callback: (obj: { [columnName: string]: number | string | Uint8Array }) => void, done: () => void): void;
+ each(sql: string, params: (number | string | Uint8Array)[], callback: (obj: { [columnName: string]: number | string | Uint8Array }) => void, done: () => void): void;
+
+ prepare(sql: string): Statement;
+ prepare(sql: string, params: { [key: string]: number | string | Uint8Array }): Statement;
+ prepare(sql: string, params: (number | string | Uint8Array)[]): Statement;
+
+ export(): Uint8Array;
+
+ close(): void;
+ }
+
+ class Statement {
+ bind(): boolean;
+ bind(values: { [key: string]: number | string | Uint8Array }): boolean;
+ bind(values: (number | string | Uint8Array)[]): boolean;
+
+ step(): boolean;
+
+ get(): (number | string | Uint8Array)[];
+ get(params: { [key: string]: number | string | Uint8Array }): (number | string | Uint8Array)[];
+ get(params: (number | string | Uint8Array)[]): (number | string | Uint8Array)[];
+
+ getColumnNames(): string[];
+
+ getAsObject(): { [columnName: string]: number | string | Uint8Array };
+ getAsObject(params: { [key: string]: number | string | Uint8Array }): { [columnName: string]: number | string | Uint8Array };
+ getAsObject(params: (number | string | Uint8Array)[]): { [columnName: string]: number | string | Uint8Array };
+
+ run(): void;
+ run(values: { [key: string]: number | string | Uint8Array }): void;
+ run(values: (number | string | Uint8Array)[]): void;
+
+ reset(): void;
+
+ freemem(): void;
+
+ free(): boolean;
+ }
+
+ interface QueryResults {
+ columns: string[];
+ values: (number | string | Uint8Array)[][];
+ }
+
+}