diff --git a/.gitignore b/.gitignore index 5148e52..fdf16c1 100644 --- a/.gitignore +++ b/.gitignore @@ -35,3 +35,7 @@ jspm_packages # Optional REPL history .node_repl_history + +# Omit tests +dist/sqlite-async-test.js +dist/sqlite-async-test.d.ts diff --git a/.mocharc.json b/.mocharc.json new file mode 100644 index 0000000..152c79e --- /dev/null +++ b/.mocharc.json @@ -0,0 +1,5 @@ +{ + "extension": ["ts"], + "spec": "src/**/*-test.ts", + "require": "ts-node/register" +} diff --git a/README.md b/README.md index 2b78b40..9945619 100644 --- a/README.md +++ b/README.md @@ -103,6 +103,11 @@ Equivalent to the sqlite3 `Statement#all` method. Returns a promise that is reso Equivalent to the sqlite3 `Statement#each` method. The per-row callback function is requied. Returns a promise that is resolved with the Statement instance. +## Contributors + +- [Frank Hellwig](https://github.com/fhellwig) -- Author +- [Andy Peterson](https://github.com/ndp) -- Typescript + ## License MIT License diff --git a/configs/tsconfig.base.json b/configs/tsconfig.base.json new file mode 100644 index 0000000..6c17ca1 --- /dev/null +++ b/configs/tsconfig.base.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "declaration": true, + "declarationMap": true, + "allowSyntheticDefaultImports": true, + "types": [ + "mocha", + "node" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + }, + "include": [ + "../src/**/*.ts" + ], + "exclude": [ + "../node_modules" + ] +} diff --git a/configs/tsconfig.cjs.json b/configs/tsconfig.cjs.json new file mode 100644 index 0000000..603dfec --- /dev/null +++ b/configs/tsconfig.cjs.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "lib": ["ES6"], + "target": "ES6", + "module": "CommonJS", + "moduleResolution": "Node", + "outDir": "../dist/cjs", + "declarationDir": "../dist/cjs/types" + } +} diff --git a/configs/tsconfig.esm.json b/configs/tsconfig.esm.json new file mode 100644 index 0000000..e3ce461 --- /dev/null +++ b/configs/tsconfig.esm.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "lib": ["ES2022"], + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "NodeNext", + "outDir": "../dist/esm", + "declarationDir": "../dist/esm/types", + } +} diff --git a/dist/cjs/sqlite-async-test.js b/dist/cjs/sqlite-async-test.js new file mode 100644 index 0000000..1097d11 --- /dev/null +++ b/dist/cjs/sqlite-async-test.js @@ -0,0 +1,221 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const assert_1 = __importDefault(require("assert")); +const fs_1 = require("fs"); +const sqlite_async_1 = require("./sqlite-async"); +require("mocha"); +let db; +let statement; +describe('Module', function () { + describe('Database', function () { + describe('SQLITE3_VERSION', function () { + it('should log the version number', function () { + return console.log(' sqlite3 version: ' + sqlite_async_1.Database.SQLITE3_VERSION); + }); + }); + describe('open', function () { + it('should open the database', function () { + return sqlite_async_1.Database.open('test.db').then((_db) => { + db = _db; + }); + }); + }); + describe('exec', function () { + it('should create a table', function () { + return db.exec(`CREATE TABLE test ( + id INT PRIMARY KEY, + name TEXT NOT NULL + )`); + }); + }); + describe('run (insert)', function () { + it('should insert a row', function () { + return db.run('INSERT INTO test VALUES (1, "inserted")'); + }); + }); + describe('run (update)', function () { + it('should update a value', function () { + return db + .run('UPDATE test SET name = "test" WHERE id = 1') + .then((result) => { + assert_1.default.strictEqual(result.changes, 1, 'Expected one change in the database'); + }); + }); + }); + describe('run (delete)', function () { + it('should delete a row', function () { + return db.run('INSERT INTO test VALUES (2, "test")').then((_) => { + return db.run('DELETE FROM test WHERE id = 2').then((result) => { + assert_1.default.strictEqual(result.changes, 1, 'Expected one change in the database'); + }); + }); + }); + }); + describe('get', function () { + it('should select one row', function () { + return db.get('SELECT * FROM test').then((row) => { + assert_1.default.deepStrictEqual(row, { + id: 1, + name: 'test' + }); + }); + }); + }); + describe('all', function () { + it('should select all rows', function () { + return db.all('SELECT * FROM test').then((rows) => { + assert_1.default.deepStrictEqual(rows, [ + { + id: 1, + name: 'test' + } + ]); + }); + }); + }); + describe('each', function () { + it('should select rows and pass each to a callback', function () { + return db.each('SELECT * FROM test WHERE id = 1', (_err, row) => { + assert_1.default.deepStrictEqual(row, { + id: 1, + name: 'test' + }); + }); + }); + }); + describe('transaction (success)', function () { + it('should execute and rollback a failed transaction', function () { + return db + .transaction((db) => { + return Promise.all([ + db.run('INSERT INTO test VALUES (2, "two")'), + db.run('INSERT INTO test VALUES (3, NULL)') + ]); + }) + .then((_) => { + throw new Error('The transaction should not have succeeded.'); + }, (err) => { + assert_1.default.strictEqual(err.code, 'SQLITE_CONSTRAINT'); + }); + }); + it('should leave the database unchanged', function () { + return db.all('SELECT * FROM test').then((rows) => { + assert_1.default.strictEqual(rows.length, 1, 'Expected only one row in the database.'); + }); + }); + }); + describe('transaction (success)', function () { + it('should execute and commit a successful transaction', function () { + return db.transaction((db) => { + return Promise.all([ + db.run('INSERT INTO test VALUES (2, "two")'), + db.run('INSERT INTO test VALUES (3, "three")') + ]); + }); + }); + it('should have added two rows to the database', function () { + return db.all('SELECT * FROM test').then((rows) => { + assert_1.default.strictEqual(rows.length, 3, 'Expected three rows in the database.'); + }); + }); + }); + describe('prepare', function () { + it('should prepare a statement', function () { + return db + .prepare('SELECT * FROM test WHERE id = ?') + .then((_statement) => { + statement = _statement; + }); + }); + }); + }); + describe('Statement', function () { + describe('bind', function () { + it('should bind a value to the statement', function () { + return statement.bind(1); + }); + }); + describe('get', function () { + it('should select one row', function () { + return statement.get().then((row) => { + assert_1.default.deepStrictEqual(row, { + id: 1, + name: 'test' + }); + }); + }); + }); + describe('all', function () { + it('should select all rows', function () { + return statement.all().then((rows) => { + assert_1.default.deepStrictEqual(rows, [ + { + id: 1, + name: 'test' + } + ]); + }); + }); + }); + describe('each', function () { + it('should select rows and pass each to a callback', function () { + return statement.each((err, row) => { + assert_1.default.deepStrictEqual(row, { + id: 1, + name: 'test' + }); + }); + }); + }); + describe('run', function () { + it('should delete all rows from the database', function () { + return db.prepare('DELETE FROM test').then((statement) => { + return statement.run().then((result) => { + assert_1.default.strictEqual(result.changes, 3, 'Expected three changes in the database'); + return statement.finalize(); + }); + }); + }); + }); + describe('finalize', function () { + it('should finalize the statement', function () { + return statement.finalize(); + }); + }); + }); + describe('Database', function () { + describe('close', function () { + it('should close database', function () { + return db.close(); + }); + }); + describe('open', function () { + it('should open the database again', function () { + return sqlite_async_1.Database.open('test.db').then((_db) => { + db = _db; + }); + }); + }); + describe('close', function () { + it('should close database after executing the promise', function () { + return db + .close((arg) => { + (0, assert_1.default)(arg === db); + return Promise.resolve('success'); + }) + .then((result) => { + assert_1.default.strictEqual(result, 'success'); + }); + }); + it('should no longer be able to use the database', function () { + (0, assert_1.default)(db.db === null); + }); + }); + }); + after(function (done) { + (0, fs_1.unlink)('test.db', done); + }); +}); diff --git a/dist/cjs/sqlite-async.js b/dist/cjs/sqlite-async.js new file mode 100644 index 0000000..0e94a7b --- /dev/null +++ b/dist/cjs/sqlite-async.js @@ -0,0 +1,346 @@ +"use strict"; +/** + * This module provides a promise interface to the sqlite3 database module. + */ +var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + var desc = Object.getOwnPropertyDescriptor(m, k); + if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { + desc = { enumerable: true, get: function() { return m[k]; } }; + } + Object.defineProperty(o, k2, desc); +}) : (function(o, m, k, k2) { + if (k2 === undefined) k2 = k; + o[k2] = m[k]; +})); +var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { + Object.defineProperty(o, "default", { enumerable: true, value: v }); +}) : function(o, v) { + o["default"] = v; +}); +var __importStar = (this && this.__importStar) || function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); + __setModuleDefault(result, mod); + return result; +}; +var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { + function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } + return new (P || (P = Promise))(function (resolve, reject) { + function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } + function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } + function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } + step((generator = generator.apply(thisArg, _arguments || [])).next()); + }); +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Statement = exports.Database = void 0; +const sqlite = __importStar(require("sqlite3")); +//----------------------------------------------------------------------------- +// The Database class +//----------------------------------------------------------------------------- +class Database { + static get OPEN_READONLY() { + return sqlite.OPEN_READONLY; + } + static get OPEN_READWRITE() { + return sqlite.OPEN_READWRITE; + } + static get OPEN_CREATE() { + return sqlite.OPEN_CREATE; + } + static get SQLITE3_VERSION() { + return '5.0.11'; + } + static open(filename, mode) { + let db = new Database(); + return db.open(filename, mode); + } + open(filename, mode) { + if (typeof mode === 'undefined') { + mode = Database.OPEN_READWRITE | Database.OPEN_CREATE; + } + else if (typeof mode !== 'number') { + throw new TypeError('Database.open: mode is not a number'); + } + return new Promise((resolve, reject) => { + if (this.db) { + return reject(new Error('Database.open: database is already open')); + } + let db = new sqlite.Database(filename, mode, (err) => { + if (err) { + reject(err); + } + else { + this.db = db; + this.filename = filename; + resolve(this); + } + }); + }); + } + on(evt, cb) { + return this.db.on(evt, cb); + } + close(fn) { + if (!this.db) { + return Promise.reject(new Error('Database.close: database is not open')); + } + if (fn) { + return fn(this) + .then((result) => { + return this.close().then((_) => { + return result; + }); + }) + .catch((err) => { + return this.close().then((_) => { + return Promise.reject(err); + }); + }); + } + return new Promise((resolve, reject) => { + this.db.close((err) => { + if (err) { + reject(err); + } + else { + this.db = null; + resolve(this); + } + }); + }); + } + run(...args) { + return new Promise((resolve, reject) => { + if (!this.db) { + return reject(new Error('Database.run: database is not open')); + } + // Need a real function because 'this' is used. + const callback = function (err) { + if (err) { + reject(err); + } + else { + resolve({ + lastID: this.lastID, + changes: this.changes + }); + } + }; + args.push(callback); + this.db.run.apply(this.db, args); + }); + } + get(...args) { + return new Promise((resolve, reject) => { + if (!this.db) { + return reject(new Error('Database.get: database is not open')); + } + const callback = (err, row) => { + if (err) { + reject(err); + } + else { + resolve(row); + } + }; + args.push(callback); + this.db.get.apply(this.db, args); + }); + } + all(...args) { + return new Promise((resolve, reject) => { + if (!this.db) { + return reject(new Error('Database.all: database is not open')); + } + const callback = (err, rows) => { + if (err) { + reject(err); + } + else { + resolve(rows); + } + }; + args.push(callback); + this.db.all.apply(this.db, args); + }); + } + each(...args) { + if (args.length === 0 || typeof args[args.length - 1] !== 'function') { + throw TypeError('Database.each: last arg is not a function'); + } + return new Promise((resolve, reject) => { + if (!this.db) { + return reject(new Error('Database.each: database is not open')); + } + const completeCallback = (err, nrows) => { + if (err) { + reject(err); + } + else { + resolve(nrows); + } + }; + args.push(completeCallback); + this.db.each.apply(this.db, args); + }); + } + exec(sql) { + return new Promise((resolve, reject) => { + if (!this.db) { + return reject(new Error('Database.exec: database is not open')); + } + this.db.exec(sql, (err) => { + if (err) { + reject(err); + } + else { + resolve(this); + } + }); + }); + } + transaction(fn) { + return __awaiter(this, void 0, void 0, function* () { + yield this.exec('BEGIN TRANSACTION'); + try { + const result = yield fn(this); + yield this.exec('END TRANSACTION'); + return result; + } + catch (e) { + yield this.exec('ROLLBACK TRANSACTION'); + throw e; + } + }); + } + prepare(...args) { + return new Promise((resolve, reject) => { + if (!this.db) { + return reject(new Error('Database.prepare: database is not open')); + } + let statement; + const callback = (err) => { + if (err) { + reject(err); + } + else { + resolve(new Statement(statement)); + } + }; + args.push(callback); + statement = this.db.prepare.apply(this.db, args); + }); + } +} +exports.Database = Database; +//----------------------------------------------------------------------------- +// The Statement class +//----------------------------------------------------------------------------- +class Statement { + constructor(statement) { + if (!(statement instanceof sqlite.Statement)) { + throw new TypeError(`Statement: 'statement' is not a statement instance`); + } + this.statement = statement; + } + bind(...args) { + return new Promise((resolve, reject) => { + const callback = (err) => { + if (err) { + reject(err); + } + else { + resolve(this); + } + }; + args.push(callback); + this.statement.bind.apply(this.statement, args); + }); + } + reset() { + return new Promise((resolve, reject) => { + this.statement.reset((_) => { + resolve(this); + }); + }); + } + finalize() { + return new Promise((resolve, reject) => { + this.statement.finalize((err) => { + if (err) { + reject(err); + } + else { + resolve(); // can't use it anymore + } + }); + }); + } + run(...args) { + return new Promise((resolve, reject) => { + // Need a real function because 'this' is used. + const callback = function (err) { + if (err) { + reject(err); + } + else { + resolve({ + lastID: this.lastID, + changes: this.changes + }); + } + }; + args.push(callback); + this.statement.run.apply(this.statement, args); + }); + } + get(...args) { + return new Promise((resolve, reject) => { + const callback = (err, row) => { + if (err) { + reject(err); + } + else { + resolve(row); + } + }; + args.push(callback); + this.statement.get.apply(this.statement, args); + }); + } + all(...args) { + return new Promise((resolve, reject) => { + const callback = (err, rows) => { + if (err) { + reject(err); + } + else { + resolve(rows); + } + }; + args.push(callback); + this.statement.all.apply(this.statement, args); + }); + } + each(...args) { + if (args.length === 0 || typeof args[args.length - 1] !== 'function') { + throw TypeError('Statement.each: last arg is not a function'); + } + return new Promise((resolve, reject) => { + const callback = (err, nrows) => { + if (err) { + reject(err); + } + else { + resolve(nrows); + } + }; + args.push(callback); + this.statement.each.apply(this.statement, args); + }); + } +} +exports.Statement = Statement; diff --git a/dist/cjs/types/sqlite-async-test.d.ts b/dist/cjs/types/sqlite-async-test.d.ts new file mode 100644 index 0000000..84096ac --- /dev/null +++ b/dist/cjs/types/sqlite-async-test.d.ts @@ -0,0 +1,2 @@ +import 'mocha'; +//# sourceMappingURL=sqlite-async-test.d.ts.map \ No newline at end of file diff --git a/dist/cjs/types/sqlite-async-test.d.ts.map b/dist/cjs/types/sqlite-async-test.d.ts.map new file mode 100644 index 0000000..73d46f4 --- /dev/null +++ b/dist/cjs/types/sqlite-async-test.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"sqlite-async-test.d.ts","sourceRoot":"","sources":["../../../src/sqlite-async-test.ts"],"names":[],"mappings":"AAGA,OAAO,OAAO,CAAC"} \ No newline at end of file diff --git a/dist/cjs/types/sqlite-async.d.ts b/dist/cjs/types/sqlite-async.d.ts new file mode 100644 index 0000000..722c826 --- /dev/null +++ b/dist/cjs/types/sqlite-async.d.ts @@ -0,0 +1,40 @@ +/** + * This module provides a promise interface to the sqlite3 database module. + */ +import * as sqlite from 'sqlite3'; +export type OpenMode = typeof sqlite.OPEN_READONLY | typeof sqlite.OPEN_READWRITE | typeof sqlite.OPEN_CREATE; +export interface RunResult { + lastID: number; + changes: number; +} +export declare class Database { + db?: sqlite.Database | null; + filename?: string; + static get OPEN_READONLY(): number; + static get OPEN_READWRITE(): number; + static get OPEN_CREATE(): number; + static get SQLITE3_VERSION(): string; + static open(filename: string, mode?: OpenMode): Promise; + open(filename: string, mode?: OpenMode): Promise; + on(evt: string, cb: (...args: unknown[]) => void): sqlite.Database; + close(fn?: (db: this) => Promise): Promise; + run(...args: unknown[]): Promise; + get(...args: unknown[]): Promise; + all(...args: unknown[]): Promise; + each(...args: unknown[]): Promise; + exec(sql: string): Promise; + transaction(fn: (db: this) => T): Promise; + prepare(...args: unknown[]): Promise; +} +export declare class Statement { + statement: sqlite.Statement; + constructor(statement: sqlite.Statement); + bind(...args: unknown[]): Promise; + reset(): Promise; + finalize(): Promise; + run(...args: unknown[]): Promise; + get(...args: unknown[]): Promise; + all(...args: unknown[]): Promise; + each(...args: unknown[]): Promise; +} +//# sourceMappingURL=sqlite-async.d.ts.map \ No newline at end of file diff --git a/dist/cjs/types/sqlite-async.d.ts.map b/dist/cjs/types/sqlite-async.d.ts.map new file mode 100644 index 0000000..2018485 --- /dev/null +++ b/dist/cjs/types/sqlite-async.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"sqlite-async.d.ts","sourceRoot":"","sources":["../../../src/sqlite-async.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAElC,MAAM,MAAM,QAAQ,GAAG,OAAO,MAAM,CAAC,aAAa,GAC9C,OAAO,MAAM,CAAC,cAAc,GAC9B,OAAO,MAAM,CAAC,WAAW,CAAC;AAE5B,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,qBAAa,QAAQ;IAEnB,EAAE,CAAC,EAAE,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB,MAAM,KAAK,aAAa,WAEvB;IAED,MAAM,KAAK,cAAc,WAExB;IAED,MAAM,KAAK,WAAW,WAErB;IAED,MAAM,KAAK,eAAe,WAEzB;IAED,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAKjE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAsB1D,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI;IAIhD,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAC,IAAI,CAAC;IA6BvE,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAqB3C,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAiB7C,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAiB/C,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBzC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe1B,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAYrD,OAAO,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;CAiBhD;AAMD,qBAAa,SAAS;IAEpB,SAAS,EAAE,MAAM,CAAC,SAAS,CAAA;gBAEf,SAAS,EAAE,MAAM,CAAC,SAAS;IAOvC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE;IAcvB,KAAK;IAQL,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAYzB,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAkB3C,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAczC,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAc3C,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAgB1C"} \ No newline at end of file diff --git a/dist/esm/sqlite-async-test.js b/dist/esm/sqlite-async-test.js new file mode 100644 index 0000000..0d762dd --- /dev/null +++ b/dist/esm/sqlite-async-test.js @@ -0,0 +1,216 @@ +import assert from 'assert'; +import { unlink } from 'fs'; +import { Database } from './sqlite-async'; +import 'mocha'; +let db; +let statement; +describe('Module', function () { + describe('Database', function () { + describe('SQLITE3_VERSION', function () { + it('should log the version number', function () { + return console.log(' sqlite3 version: ' + Database.SQLITE3_VERSION); + }); + }); + describe('open', function () { + it('should open the database', function () { + return Database.open('test.db').then((_db) => { + db = _db; + }); + }); + }); + describe('exec', function () { + it('should create a table', function () { + return db.exec(`CREATE TABLE test ( + id INT PRIMARY KEY, + name TEXT NOT NULL + )`); + }); + }); + describe('run (insert)', function () { + it('should insert a row', function () { + return db.run('INSERT INTO test VALUES (1, "inserted")'); + }); + }); + describe('run (update)', function () { + it('should update a value', function () { + return db + .run('UPDATE test SET name = "test" WHERE id = 1') + .then((result) => { + assert.strictEqual(result.changes, 1, 'Expected one change in the database'); + }); + }); + }); + describe('run (delete)', function () { + it('should delete a row', function () { + return db.run('INSERT INTO test VALUES (2, "test")').then((_) => { + return db.run('DELETE FROM test WHERE id = 2').then((result) => { + assert.strictEqual(result.changes, 1, 'Expected one change in the database'); + }); + }); + }); + }); + describe('get', function () { + it('should select one row', function () { + return db.get('SELECT * FROM test').then((row) => { + assert.deepStrictEqual(row, { + id: 1, + name: 'test' + }); + }); + }); + }); + describe('all', function () { + it('should select all rows', function () { + return db.all('SELECT * FROM test').then((rows) => { + assert.deepStrictEqual(rows, [ + { + id: 1, + name: 'test' + } + ]); + }); + }); + }); + describe('each', function () { + it('should select rows and pass each to a callback', function () { + return db.each('SELECT * FROM test WHERE id = 1', (_err, row) => { + assert.deepStrictEqual(row, { + id: 1, + name: 'test' + }); + }); + }); + }); + describe('transaction (success)', function () { + it('should execute and rollback a failed transaction', function () { + return db + .transaction((db) => { + return Promise.all([ + db.run('INSERT INTO test VALUES (2, "two")'), + db.run('INSERT INTO test VALUES (3, NULL)') + ]); + }) + .then((_) => { + throw new Error('The transaction should not have succeeded.'); + }, (err) => { + assert.strictEqual(err.code, 'SQLITE_CONSTRAINT'); + }); + }); + it('should leave the database unchanged', function () { + return db.all('SELECT * FROM test').then((rows) => { + assert.strictEqual(rows.length, 1, 'Expected only one row in the database.'); + }); + }); + }); + describe('transaction (success)', function () { + it('should execute and commit a successful transaction', function () { + return db.transaction((db) => { + return Promise.all([ + db.run('INSERT INTO test VALUES (2, "two")'), + db.run('INSERT INTO test VALUES (3, "three")') + ]); + }); + }); + it('should have added two rows to the database', function () { + return db.all('SELECT * FROM test').then((rows) => { + assert.strictEqual(rows.length, 3, 'Expected three rows in the database.'); + }); + }); + }); + describe('prepare', function () { + it('should prepare a statement', function () { + return db + .prepare('SELECT * FROM test WHERE id = ?') + .then((_statement) => { + statement = _statement; + }); + }); + }); + }); + describe('Statement', function () { + describe('bind', function () { + it('should bind a value to the statement', function () { + return statement.bind(1); + }); + }); + describe('get', function () { + it('should select one row', function () { + return statement.get().then((row) => { + assert.deepStrictEqual(row, { + id: 1, + name: 'test' + }); + }); + }); + }); + describe('all', function () { + it('should select all rows', function () { + return statement.all().then((rows) => { + assert.deepStrictEqual(rows, [ + { + id: 1, + name: 'test' + } + ]); + }); + }); + }); + describe('each', function () { + it('should select rows and pass each to a callback', function () { + return statement.each((err, row) => { + assert.deepStrictEqual(row, { + id: 1, + name: 'test' + }); + }); + }); + }); + describe('run', function () { + it('should delete all rows from the database', function () { + return db.prepare('DELETE FROM test').then((statement) => { + return statement.run().then((result) => { + assert.strictEqual(result.changes, 3, 'Expected three changes in the database'); + return statement.finalize(); + }); + }); + }); + }); + describe('finalize', function () { + it('should finalize the statement', function () { + return statement.finalize(); + }); + }); + }); + describe('Database', function () { + describe('close', function () { + it('should close database', function () { + return db.close(); + }); + }); + describe('open', function () { + it('should open the database again', function () { + return Database.open('test.db').then((_db) => { + db = _db; + }); + }); + }); + describe('close', function () { + it('should close database after executing the promise', function () { + return db + .close((arg) => { + assert(arg === db); + return Promise.resolve('success'); + }) + .then((result) => { + assert.strictEqual(result, 'success'); + }); + }); + it('should no longer be able to use the database', function () { + assert(db.db === null); + }); + }); + }); + after(function (done) { + unlink('test.db', done); + }); +}); diff --git a/dist/esm/sqlite-async.mjs b/dist/esm/sqlite-async.mjs new file mode 100644 index 0000000..d522f90 --- /dev/null +++ b/dist/esm/sqlite-async.mjs @@ -0,0 +1,310 @@ +/** + * This module provides a promise interface to the sqlite3 database module. + */ +import * as sqlite from 'sqlite3'; +//----------------------------------------------------------------------------- +// The Database class +//----------------------------------------------------------------------------- +export class Database { + db; + filename; + static get OPEN_READONLY() { + return sqlite.OPEN_READONLY; + } + static get OPEN_READWRITE() { + return sqlite.OPEN_READWRITE; + } + static get OPEN_CREATE() { + return sqlite.OPEN_CREATE; + } + static get SQLITE3_VERSION() { + return '5.0.11'; + } + static open(filename, mode) { + let db = new Database(); + return db.open(filename, mode); + } + open(filename, mode) { + if (typeof mode === 'undefined') { + mode = Database.OPEN_READWRITE | Database.OPEN_CREATE; + } + else if (typeof mode !== 'number') { + throw new TypeError('Database.open: mode is not a number'); + } + return new Promise((resolve, reject) => { + if (this.db) { + return reject(new Error('Database.open: database is already open')); + } + let db = new sqlite.Database(filename, mode, (err) => { + if (err) { + reject(err); + } + else { + this.db = db; + this.filename = filename; + resolve(this); + } + }); + }); + } + on(evt, cb) { + return this.db.on(evt, cb); + } + close(fn) { + if (!this.db) { + return Promise.reject(new Error('Database.close: database is not open')); + } + if (fn) { + return fn(this) + .then((result) => { + return this.close().then((_) => { + return result; + }); + }) + .catch((err) => { + return this.close().then((_) => { + return Promise.reject(err); + }); + }); + } + return new Promise((resolve, reject) => { + this.db.close((err) => { + if (err) { + reject(err); + } + else { + this.db = null; + resolve(this); + } + }); + }); + } + run(...args) { + return new Promise((resolve, reject) => { + if (!this.db) { + return reject(new Error('Database.run: database is not open')); + } + // Need a real function because 'this' is used. + const callback = function (err) { + if (err) { + reject(err); + } + else { + resolve({ + lastID: this.lastID, + changes: this.changes + }); + } + }; + args.push(callback); + this.db.run.apply(this.db, args); + }); + } + get(...args) { + return new Promise((resolve, reject) => { + if (!this.db) { + return reject(new Error('Database.get: database is not open')); + } + const callback = (err, row) => { + if (err) { + reject(err); + } + else { + resolve(row); + } + }; + args.push(callback); + this.db.get.apply(this.db, args); + }); + } + all(...args) { + return new Promise((resolve, reject) => { + if (!this.db) { + return reject(new Error('Database.all: database is not open')); + } + const callback = (err, rows) => { + if (err) { + reject(err); + } + else { + resolve(rows); + } + }; + args.push(callback); + this.db.all.apply(this.db, args); + }); + } + each(...args) { + if (args.length === 0 || typeof args[args.length - 1] !== 'function') { + throw TypeError('Database.each: last arg is not a function'); + } + return new Promise((resolve, reject) => { + if (!this.db) { + return reject(new Error('Database.each: database is not open')); + } + const completeCallback = (err, nrows) => { + if (err) { + reject(err); + } + else { + resolve(nrows); + } + }; + args.push(completeCallback); + this.db.each.apply(this.db, args); + }); + } + exec(sql) { + return new Promise((resolve, reject) => { + if (!this.db) { + return reject(new Error('Database.exec: database is not open')); + } + this.db.exec(sql, (err) => { + if (err) { + reject(err); + } + else { + resolve(this); + } + }); + }); + } + async transaction(fn) { + await this.exec('BEGIN TRANSACTION'); + try { + const result = await fn(this); + await this.exec('END TRANSACTION'); + return result; + } + catch (e) { + await this.exec('ROLLBACK TRANSACTION'); + throw e; + } + } + prepare(...args) { + return new Promise((resolve, reject) => { + if (!this.db) { + return reject(new Error('Database.prepare: database is not open')); + } + let statement; + const callback = (err) => { + if (err) { + reject(err); + } + else { + resolve(new Statement(statement)); + } + }; + args.push(callback); + statement = this.db.prepare.apply(this.db, args); + }); + } +} +//----------------------------------------------------------------------------- +// The Statement class +//----------------------------------------------------------------------------- +export class Statement { + statement; + constructor(statement) { + if (!(statement instanceof sqlite.Statement)) { + throw new TypeError(`Statement: 'statement' is not a statement instance`); + } + this.statement = statement; + } + bind(...args) { + return new Promise((resolve, reject) => { + const callback = (err) => { + if (err) { + reject(err); + } + else { + resolve(this); + } + }; + args.push(callback); + this.statement.bind.apply(this.statement, args); + }); + } + reset() { + return new Promise((resolve, reject) => { + this.statement.reset((_) => { + resolve(this); + }); + }); + } + finalize() { + return new Promise((resolve, reject) => { + this.statement.finalize((err) => { + if (err) { + reject(err); + } + else { + resolve(); // can't use it anymore + } + }); + }); + } + run(...args) { + return new Promise((resolve, reject) => { + // Need a real function because 'this' is used. + const callback = function (err) { + if (err) { + reject(err); + } + else { + resolve({ + lastID: this.lastID, + changes: this.changes + }); + } + }; + args.push(callback); + this.statement.run.apply(this.statement, args); + }); + } + get(...args) { + return new Promise((resolve, reject) => { + const callback = (err, row) => { + if (err) { + reject(err); + } + else { + resolve(row); + } + }; + args.push(callback); + this.statement.get.apply(this.statement, args); + }); + } + all(...args) { + return new Promise((resolve, reject) => { + const callback = (err, rows) => { + if (err) { + reject(err); + } + else { + resolve(rows); + } + }; + args.push(callback); + this.statement.all.apply(this.statement, args); + }); + } + each(...args) { + if (args.length === 0 || typeof args[args.length - 1] !== 'function') { + throw TypeError('Statement.each: last arg is not a function'); + } + return new Promise((resolve, reject) => { + const callback = (err, nrows) => { + if (err) { + reject(err); + } + else { + resolve(nrows); + } + }; + args.push(callback); + this.statement.each.apply(this.statement, args); + }); + } +} diff --git a/dist/esm/types/sqlite-async-test.d.ts b/dist/esm/types/sqlite-async-test.d.ts new file mode 100644 index 0000000..84096ac --- /dev/null +++ b/dist/esm/types/sqlite-async-test.d.ts @@ -0,0 +1,2 @@ +import 'mocha'; +//# sourceMappingURL=sqlite-async-test.d.ts.map \ No newline at end of file diff --git a/dist/esm/types/sqlite-async-test.d.ts.map b/dist/esm/types/sqlite-async-test.d.ts.map new file mode 100644 index 0000000..73d46f4 --- /dev/null +++ b/dist/esm/types/sqlite-async-test.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"sqlite-async-test.d.ts","sourceRoot":"","sources":["../../../src/sqlite-async-test.ts"],"names":[],"mappings":"AAGA,OAAO,OAAO,CAAC"} \ No newline at end of file diff --git a/dist/esm/types/sqlite-async.d.ts b/dist/esm/types/sqlite-async.d.ts new file mode 100644 index 0000000..722c826 --- /dev/null +++ b/dist/esm/types/sqlite-async.d.ts @@ -0,0 +1,40 @@ +/** + * This module provides a promise interface to the sqlite3 database module. + */ +import * as sqlite from 'sqlite3'; +export type OpenMode = typeof sqlite.OPEN_READONLY | typeof sqlite.OPEN_READWRITE | typeof sqlite.OPEN_CREATE; +export interface RunResult { + lastID: number; + changes: number; +} +export declare class Database { + db?: sqlite.Database | null; + filename?: string; + static get OPEN_READONLY(): number; + static get OPEN_READWRITE(): number; + static get OPEN_CREATE(): number; + static get SQLITE3_VERSION(): string; + static open(filename: string, mode?: OpenMode): Promise; + open(filename: string, mode?: OpenMode): Promise; + on(evt: string, cb: (...args: unknown[]) => void): sqlite.Database; + close(fn?: (db: this) => Promise): Promise; + run(...args: unknown[]): Promise; + get(...args: unknown[]): Promise; + all(...args: unknown[]): Promise; + each(...args: unknown[]): Promise; + exec(sql: string): Promise; + transaction(fn: (db: this) => T): Promise; + prepare(...args: unknown[]): Promise; +} +export declare class Statement { + statement: sqlite.Statement; + constructor(statement: sqlite.Statement); + bind(...args: unknown[]): Promise; + reset(): Promise; + finalize(): Promise; + run(...args: unknown[]): Promise; + get(...args: unknown[]): Promise; + all(...args: unknown[]): Promise; + each(...args: unknown[]): Promise; +} +//# sourceMappingURL=sqlite-async.d.ts.map \ No newline at end of file diff --git a/dist/esm/types/sqlite-async.d.ts.map b/dist/esm/types/sqlite-async.d.ts.map new file mode 100644 index 0000000..2018485 --- /dev/null +++ b/dist/esm/types/sqlite-async.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"sqlite-async.d.ts","sourceRoot":"","sources":["../../../src/sqlite-async.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,MAAM,MAAM,SAAS,CAAC;AAElC,MAAM,MAAM,QAAQ,GAAG,OAAO,MAAM,CAAC,aAAa,GAC9C,OAAO,MAAM,CAAC,cAAc,GAC9B,OAAO,MAAM,CAAC,WAAW,CAAC;AAE5B,MAAM,WAAW,SAAS;IACxB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD,qBAAa,QAAQ;IAEnB,EAAE,CAAC,EAAE,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,CAAA;IAEjB,MAAM,KAAK,aAAa,WAEvB;IAED,MAAM,KAAK,cAAc,WAExB;IAED,MAAM,KAAK,WAAW,WAErB;IAED,MAAM,KAAK,eAAe,WAEzB;IAED,MAAM,CAAC,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAKjE,IAAI,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC;IAsB1D,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI;IAIhD,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE,IAAI,KAAK,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,GAAC,IAAI,CAAC;IA6BvE,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAqB3C,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC;IAiB7C,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;IAiB/C,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAoBzC,IAAI,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAe1B,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,KAAK,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAYrD,OAAO,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;CAiBhD;AAMD,qBAAa,SAAS;IAEpB,SAAS,EAAE,MAAM,CAAC,SAAS,CAAA;gBAEf,SAAS,EAAE,MAAM,CAAC,SAAS;IAOvC,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE;IAcvB,KAAK;IAQL,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;IAYzB,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC;IAkB3C,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,CAAC;IAczC,GAAG,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAc3C,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;CAgB1C"} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2673a8e..2489d20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,142 @@ { "name": "sqlite-async", - "version": "1.1.5", + "version": "1.2.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "sqlite-async", - "version": "1.1.5", + "version": "1.2.0", "license": "MIT", "dependencies": { - "sqlite3": "^5.0.11" + "sqlite3": "^5.1.2" }, "devDependencies": { - "mocha": "^10.0.0" + "@types/expect": "*", + "@types/mocha": "*", + "@types/node": "*", + "@types/sqlite3": "*", + "mocha": "^10.1.0", + "ts-node": "*", + "typescript": "*" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "0.3.9" + }, + "engines": { + "node": ">=12" } }, "node_modules/@gar/promisify": { @@ -21,6 +145,72 @@ "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "optional": true }, + "node_modules/@jest/expect-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", + "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "dev": true, + "dependencies": { + "jest-get-type": "^29.2.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.24.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "node_modules/@mapbox/node-pre-gyp": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", @@ -63,6 +253,12 @@ "node": ">=10" } }, + "node_modules/@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, "node_modules/@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", @@ -72,10 +268,104 @@ "node": ">= 6" } }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "node_modules/@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "node_modules/@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "node_modules/@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "node_modules/@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "node_modules/@types/expect": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-24.3.0.tgz", + "integrity": "sha512-aq5Z+YFBz5o2b6Sp1jigx5nsmoZMK5Ceurjwy6PZmRv7dEi1jLtkARfvB1ME+OXJUG+7TZUDcv3WoCr/aor6dQ==", + "deprecated": "This is a stub types definition. expect provides its own type definitions, so you do not need this installed.", + "dev": true, + "dependencies": { + "expect": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/mocha": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "node_modules/@types/sqlite3": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/sqlite3/-/sqlite3-3.1.8.tgz", + "integrity": "sha512-sQMt/qnyUWnqiTcJXm5ZfNPIBeJ/DVvJDwxw+0tAxPJvadzfiP1QhryO1JOR6t1yfb8NpzQb/Rud06mob5laIA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "node_modules/@types/yargs": { + "version": "17.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.14.tgz", + "integrity": "sha512-9Pj7abXoW1RSTcZaL2Hk6G2XyLMlp5ECdVC/Zf2p/KBjC3srijLGgRAXOBjtFrJoIrvxdTKyKDA14bEcbxBaWw==", + "dev": true, + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "node_modules/abbrev": { @@ -83,6 +373,27 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -183,6 +494,12 @@ "node": ">=10" } }, + "node_modules/arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "node_modules/argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -334,6 +651,15 @@ "node": ">=10" } }, + "node_modules/ci-info": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", + "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -390,6 +716,12 @@ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, + "node_modules/create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -454,6 +786,15 @@ "node": ">=0.3.1" } }, + "node_modules/diff-sequences": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -504,6 +845,22 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", + "dev": true, + "dependencies": { + "@jest/expect-utils": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -634,7 +991,7 @@ "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "optional": true + "devOptional": true }, "node_modules/has-flag": { "version": "4.0.0", @@ -839,6 +1196,88 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "optional": true }, + "node_modules/jest-diff": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "dev": true, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-matcher-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", + "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "dev": true, + "dependencies": { + "chalk": "^4.0.0", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-message-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", + "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.3.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "dependencies": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, "node_modules/js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -915,6 +1354,12 @@ "semver": "bin/semver.js" } }, + "node_modules/make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "node_modules/make-fetch-happen": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", @@ -942,6 +1387,19 @@ "node": ">= 10" } }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -1053,12 +1511,11 @@ } }, "node_modules/mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", + "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", "dev": true, "dependencies": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", @@ -1360,6 +1817,32 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/pretty-format/node_modules/ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -1388,6 +1871,12 @@ "safe-buffer": "^5.1.0" } }, + "node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -1503,6 +1992,15 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -1542,9 +2040,9 @@ } }, "node_modules/sqlite3": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.11.tgz", - "integrity": "sha512-4akFOr7u9lJEeAWLJxmwiV43DJcGV7w3ab7SjQFAFaTVyknY3rZjvXTKIVtWqUoY4xwhjwoHKYs2HDW2SoHVsA==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.4.tgz", + "integrity": "sha512-i0UlWAzPlzX3B5XP2cYuhWQJsTtlMD6obOa1PgeEQ4DHEXUuyJkgv50I3isqZAP5oFc2T8OFvakmDh2W6I+YpA==", "hasInstallScript": true, "dependencies": { "@mapbox/node-pre-gyp": "^1.0.0", @@ -1575,6 +2073,27 @@ "node": ">= 8" } }, + "node_modules/stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stack-utils/node_modules/escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -1667,6 +2186,71 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "node_modules/ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "dependencies": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "bin": { + "ts-node": "dist/bin.js", + "ts-node-cwd": "dist/bin-cwd.js", + "ts-node-esm": "dist/bin-esm.js", + "ts-node-script": "dist/bin-script.js", + "ts-node-transpile-only": "dist/bin-transpile.js", + "ts-script": "dist/bin-script-deprecated.js" + }, + "peerDependencies": { + "@swc/core": ">=1.2.50", + "@swc/wasm": ">=1.2.50", + "@types/node": "*", + "typescript": ">=2.7" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "@swc/wasm": { + "optional": true + } + } + }, + "node_modules/ts-node/node_modules/diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, + "engines": { + "node": ">=0.3.1" + } + }, + "node_modules/typescript": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, "node_modules/unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -1690,6 +2274,12 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "node_modules/v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -1811,6 +2401,15 @@ "node": ">=10" } }, + "node_modules/yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -1825,12 +2424,159 @@ } }, "dependencies": { + "@babel/code-frame": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz", + "integrity": "sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==", + "dev": true, + "requires": { + "@babel/highlight": "^7.18.6" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "dev": true + }, + "@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dev": true, + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dev": true, + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "dev": true + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@cspotcode/source-map-support": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", + "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, + "requires": { + "@jridgewell/trace-mapping": "0.3.9" + } + }, "@gar/promisify": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", "optional": true }, + "@jest/expect-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.3.1.tgz", + "integrity": "sha512-wlrznINZI5sMjwvUoLVk617ll/UYfGIZNxmbU+Pa7wmkL4vYzhV9R2pwVqUh4NWWuLQWkI8+8mOkxs//prKQ3g==", + "dev": true, + "requires": { + "jest-get-type": "^29.2.0" + } + }, + "@jest/schemas": { + "version": "29.0.0", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.0.0.tgz", + "integrity": "sha512-3Ab5HgYIIAnS0HjqJHQYZS+zXc4tUmTmBH3z83ajI6afXp8X3ZtdLX+nXx+I7LNkJD7uN9LAVhgnjDgZa2z0kA==", + "dev": true, + "requires": { + "@sinclair/typebox": "^0.24.1" + } + }, + "@jest/types": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.3.1.tgz", + "integrity": "sha512-d0S0jmmTpjnhCmNpApgX3jrUZgZ22ivKJRvL2lli5hpCRoNnp1f85r2/wpKfXuYu8E7Jjh1hGfhPyup1NM5AmA==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", + "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, "@mapbox/node-pre-gyp": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@mapbox/node-pre-gyp/-/node-pre-gyp-1.0.9.tgz", @@ -1867,16 +2613,115 @@ "rimraf": "^3.0.2" } }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==", + "dev": true + }, "@tootallnate/once": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "optional": true }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", + "@tsconfig/node10": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true + }, + "@tsconfig/node12": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true + }, + "@tsconfig/node14": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true + }, + "@tsconfig/node16": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", + "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", + "dev": true + }, + "@types/expect": { + "version": "24.3.0", + "resolved": "https://registry.npmjs.org/@types/expect/-/expect-24.3.0.tgz", + "integrity": "sha512-aq5Z+YFBz5o2b6Sp1jigx5nsmoZMK5Ceurjwy6PZmRv7dEi1jLtkARfvB1ME+OXJUG+7TZUDcv3WoCr/aor6dQ==", + "dev": true, + "requires": { + "expect": "*" + } + }, + "@types/istanbul-lib-coverage": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", + "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "dev": true + }, + "@types/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "dev": true, + "requires": { + "@types/istanbul-lib-coverage": "*" + } + }, + "@types/istanbul-reports": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "dev": true, + "requires": { + "@types/istanbul-lib-report": "*" + } + }, + "@types/mocha": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", + "dev": true + }, + "@types/node": { + "version": "18.11.9", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.9.tgz", + "integrity": "sha512-CRpX21/kGdzjOpFsZSkcrXMGIBWMGNIHXXBVFSH+ggkftxg+XYP20TESbh+zFvFj3EQOl5byk0HTRn1IL6hbqg==", + "dev": true + }, + "@types/sqlite3": { + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/@types/sqlite3/-/sqlite3-3.1.8.tgz", + "integrity": "sha512-sQMt/qnyUWnqiTcJXm5ZfNPIBeJ/DVvJDwxw+0tAxPJvadzfiP1QhryO1JOR6t1yfb8NpzQb/Rud06mob5laIA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/stack-utils": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", + "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "dev": true + }, + "@types/yargs": { + "version": "17.0.14", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.14.tgz", + "integrity": "sha512-9Pj7abXoW1RSTcZaL2Hk6G2XyLMlp5ECdVC/Zf2p/KBjC3srijLGgRAXOBjtFrJoIrvxdTKyKDA14bEcbxBaWw==", + "dev": true, + "requires": { + "@types/yargs-parser": "*" + } + }, + "@types/yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, "abbrev": { @@ -1884,6 +2729,18 @@ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true + }, + "acorn-walk": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", + "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", + "dev": true + }, "agent-base": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", @@ -1957,6 +2814,12 @@ "readable-stream": "^3.6.0" } }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true + }, "argparse": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", @@ -2072,6 +2935,12 @@ "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" }, + "ci-info": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.7.0.tgz", + "integrity": "sha512-2CpRNYmImPx+RXKLq6jko/L07phmS9I02TyqkcNU20GCF/GgaWvc58hPtjxDX8lPpkdwc9sNh72V9k00S7ezog==", + "dev": true + }, "clean-stack": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", @@ -2119,6 +2988,12 @@ "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", "integrity": "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==" }, + "create-require": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -2162,6 +3037,12 @@ "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", "dev": true }, + "diff-sequences": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.3.1.tgz", + "integrity": "sha512-hlM3QR272NXCi4pq+N4Kok4kOp6EsgOM3ZSpJI7Da3UAs+Ttsi8MRmB6trM/lhyzUxGfOgnpkHtgqm5Q/CTcfQ==", + "dev": true + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -2200,6 +3081,19 @@ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true }, + "expect": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/expect/-/expect-29.3.1.tgz", + "integrity": "sha512-gGb1yTgU30Q0O/tQq+z30KBWv24ApkMgFUpvKBkyLUBL68Wv8dHdJxTBZFl/iT8K/bqDHvUYRH6IIN3rToopPA==", + "dev": true, + "requires": { + "@jest/expect-utils": "^29.3.1", + "jest-get-type": "^29.2.0", + "jest-matcher-utils": "^29.3.1", + "jest-message-util": "^29.3.1", + "jest-util": "^29.3.1" + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -2293,7 +3187,7 @@ "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "optional": true + "devOptional": true }, "has-flag": { "version": "4.0.0", @@ -2453,6 +3347,73 @@ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "optional": true }, + "jest-diff": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.3.1.tgz", + "integrity": "sha512-vU8vyiO7568tmin2lA3r2DP8oRvzhvRcD4DjpXc6uGveQodyk7CKLhQlCSiwgx3g0pFaE88/KLZ0yaTWMc4Uiw==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "diff-sequences": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + } + }, + "jest-get-type": { + "version": "29.2.0", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.2.0.tgz", + "integrity": "sha512-uXNJlg8hKFEnDgFsrCjznB+sTxdkuqiCL6zMgA75qEbAJjJYTs9XPrvDctrEig2GDow22T/LvHgO57iJhXB/UA==", + "dev": true + }, + "jest-matcher-utils": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.3.1.tgz", + "integrity": "sha512-fkRMZUAScup3txIKfMe3AIZZmPEjWEdsPJFK3AIy5qRohWqQFg1qrmKfYXR9qEkNc7OdAu2N4KPHibEmy4HPeQ==", + "dev": true, + "requires": { + "chalk": "^4.0.0", + "jest-diff": "^29.3.1", + "jest-get-type": "^29.2.0", + "pretty-format": "^29.3.1" + } + }, + "jest-message-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.3.1.tgz", + "integrity": "sha512-lMJTbgNcDm5z+6KDxWtqOFWlGQxD6XaYwBqHR8kmpkP+WWWG90I35kdtQHY67Ay5CSuydkTBbJG+tH9JShFCyA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.13", + "@jest/types": "^29.3.1", + "@types/stack-utils": "^2.0.0", + "chalk": "^4.0.0", + "graceful-fs": "^4.2.9", + "micromatch": "^4.0.4", + "pretty-format": "^29.3.1", + "slash": "^3.0.0", + "stack-utils": "^2.0.3" + } + }, + "jest-util": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.3.1.tgz", + "integrity": "sha512-7YOVZaiX7RJLv76ZfHt4nbNEzzTRiMW/IiOG7ZOKmTXmoGBxUDefgMAxQubu6WPVqP5zSzAdZG0FfLcC7HOIFQ==", + "dev": true, + "requires": { + "@jest/types": "^29.3.1", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + } + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, "js-yaml": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", @@ -2504,6 +3465,12 @@ } } }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true + }, "make-fetch-happen": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", @@ -2528,6 +3495,16 @@ "ssri": "^8.0.0" } }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + } + }, "minimatch": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", @@ -2607,12 +3584,11 @@ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, "mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", + "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", "dev": true, "requires": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", @@ -2827,6 +3803,25 @@ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, + "pretty-format": { + "version": "29.3.1", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.3.1.tgz", + "integrity": "sha512-FyLnmb1cYJV8biEIiRyzRFvs2lry7PPIvOqKVe1GCUEYg4YGmlx1qG9EJNMxArYm7piII4qb8UV1Pncq5dxmcg==", + "dev": true, + "requires": { + "@jest/schemas": "^29.0.0", + "ansi-styles": "^5.0.0", + "react-is": "^18.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", + "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", + "dev": true + } + } + }, "promise-inflight": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", @@ -2852,6 +3847,12 @@ "safe-buffer": "^5.1.0" } }, + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "dev": true + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -2929,6 +3930,12 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, "smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -2957,9 +3964,9 @@ } }, "sqlite3": { - "version": "5.0.11", - "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.11.tgz", - "integrity": "sha512-4akFOr7u9lJEeAWLJxmwiV43DJcGV7w3ab7SjQFAFaTVyknY3rZjvXTKIVtWqUoY4xwhjwoHKYs2HDW2SoHVsA==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.4.tgz", + "integrity": "sha512-i0UlWAzPlzX3B5XP2cYuhWQJsTtlMD6obOa1PgeEQ4DHEXUuyJkgv50I3isqZAP5oFc2T8OFvakmDh2W6I+YpA==", "requires": { "@mapbox/node-pre-gyp": "^1.0.0", "node-addon-api": "^4.2.0", @@ -2976,6 +3983,23 @@ "minipass": "^3.1.1" } }, + "stack-utils": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", + "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", + "dev": true, + "requires": { + "escape-string-regexp": "^2.0.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", + "dev": true + } + } + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -3044,6 +4068,41 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, + "ts-node": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", + "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", + "dev": true, + "requires": { + "@cspotcode/source-map-support": "^0.8.0", + "@tsconfig/node10": "^1.0.7", + "@tsconfig/node12": "^1.0.7", + "@tsconfig/node14": "^1.0.0", + "@tsconfig/node16": "^1.0.2", + "acorn": "^8.4.1", + "acorn-walk": "^8.1.1", + "arg": "^4.1.0", + "create-require": "^1.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "v8-compile-cache-lib": "^3.0.1", + "yn": "3.1.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true + } + } + }, + "typescript": { + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.3.tgz", + "integrity": "sha512-CIfGzTelbKNEnLpLdGFgdyKhG23CKdKgQPOBc+OUNrkJ2vr+KSzsSV5kq5iWhEQbok+quxgGzrAtGWCyU7tHnA==", + "dev": true + }, "unique-filename": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", @@ -3067,6 +4126,12 @@ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, + "v8-compile-cache-lib": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true + }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -3164,6 +4229,12 @@ "is-plain-obj": "^2.1.0" } }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index 7cc2d18..fce9e86 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,29 @@ { "name": "sqlite-async", - "version": "1.1.5", + "version": "1.2.0", "description": "ES6 Promise-based interface to the sqlite3 module.", - "main": "sqlite-async.js", - "type": "module", - "directories": { - "test": "mocha" + "exports": { + ".": { + "import": { + "types": "./dist/esm/types/sqlite-async.d.ts", + "default": "./dist/esm/sqlite-async.mjs" + }, + "require": { + "types": "./dist/cjs/types/sqlite-async.d.ts", + "default": "./dist/cjs/sqlite-async.js" + } + } }, + "types": "./dist/cjs/types/sqlite-async.d.ts", + "main": "./dist/cjs/sqlite-async.js", + "files": [ + "dist/**/*" + ], "scripts": { + "clean": "rm -fr dist/*", + "build": "npm run clean && npm run build:esm && npm run build:cjs", + "build:esm": "tsc -p ./configs/tsconfig.esm.json && mv dist/esm/sqlite-async.js dist/esm/sqlite-async.mjs", + "build:cjs": "tsc -p ./configs/tsconfig.cjs.json", "test": "mocha" }, "repository": { @@ -25,9 +41,15 @@ }, "homepage": "https://github.com/fhellwig/sqlite-async#readme", "dependencies": { - "sqlite3": "^5.0.11" + "sqlite3": "^5.1.2" }, "devDependencies": { - "mocha": "^10.0.0" + "@types/expect": "*", + "@types/mocha": "*", + "@types/node": "*", + "@types/sqlite3": "*", + "mocha": "^10.1.0", + "ts-node": "*", + "typescript": "*" } } diff --git a/test/sqlite-async-test.js b/src/sqlite-async-test.ts similarity index 95% rename from test/sqlite-async-test.js rename to src/sqlite-async-test.ts index e591361..7d3b30c 100644 --- a/test/sqlite-async-test.js +++ b/src/sqlite-async-test.ts @@ -1,9 +1,10 @@ import assert from 'assert'; import { unlink } from 'fs'; -import { Database } from '../sqlite-async.js'; +import { Database, Statement } from './sqlite-async' +import 'mocha'; -let db; -let statement; +let db: Database; +let statement: Statement; describe('Module', function () { describe('Database', function () { @@ -86,7 +87,7 @@ describe('Module', function () { }); describe('each', function () { it('should select rows and pass each to a callback', function () { - return db.each('SELECT * FROM test WHERE id = 1', (err, row) => { + return db.each('SELECT * FROM test WHERE id = 1', (_err: Error, row: any) => { assert.deepStrictEqual(row, { id: 1, name: 'test' @@ -114,7 +115,7 @@ describe('Module', function () { ); }); it('should leave the database unchanged', function () { - return db.all('SELECT * FROM test').then((rows) => { + return db.all('SELECT * FROM test').then((rows: any[]) => { assert.strictEqual( rows.length, 1, @@ -183,7 +184,7 @@ describe('Module', function () { }); describe('each', function () { it('should select rows and pass each to a callback', function () { - return statement.each((err, row) => { + return statement.each((err: Error, row: any) => { assert.deepStrictEqual(row, { id: 1, name: 'test' diff --git a/sqlite-async.js b/src/sqlite-async.ts similarity index 72% rename from sqlite-async.js rename to src/sqlite-async.ts index 8da3658..8962364 100644 --- a/sqlite-async.js +++ b/src/sqlite-async.ts @@ -2,13 +2,26 @@ * This module provides a promise interface to the sqlite3 database module. */ -import sqlite from 'sqlite3'; +import * as sqlite from 'sqlite3'; + +export type OpenMode = typeof sqlite.OPEN_READONLY + | typeof sqlite.OPEN_READWRITE +| typeof sqlite.OPEN_CREATE; + +export interface RunResult { + lastID: number; + changes: number; +} //----------------------------------------------------------------------------- // The Database class //----------------------------------------------------------------------------- export class Database { + + db?: sqlite.Database | null + filename?: string + static get OPEN_READONLY() { return sqlite.OPEN_READONLY; } @@ -25,12 +38,12 @@ export class Database { return '5.0.11'; } - static open(filename, mode) { + static open(filename: string, mode?: OpenMode): Promise { let db = new Database(); return db.open(filename, mode); } - open(filename, mode) { + open(filename: string, mode?: OpenMode): Promise { if (typeof mode === 'undefined') { mode = Database.OPEN_READWRITE | Database.OPEN_CREATE; } else if (typeof mode !== 'number') { @@ -52,11 +65,11 @@ export class Database { }); } - on(evt, cb) { - return this.db.on(evt, cb); + on(evt: string, cb: (...args: unknown[]) => void) { + return this.db!.on(evt, cb); } - close(fn) { + close(fn?: (db: this) => Promise): Promise { if (!this.db) { return Promise.reject(new Error('Database.close: database is not open')); } @@ -74,7 +87,7 @@ export class Database { }); } return new Promise((resolve, reject) => { - this.db.close((err) => { + this.db!.close((err) => { if (err) { reject(err); } else { @@ -85,13 +98,13 @@ export class Database { }); } - run(...args) { + run(...args: unknown[]): Promise { return new Promise((resolve, reject) => { if (!this.db) { return reject(new Error('Database.run: database is not open')); } // Need a real function because 'this' is used. - let callback = function (err) { + const callback = function (this: RunResult, err: Error | null) { if (err) { reject(err); } else { @@ -102,33 +115,33 @@ export class Database { } }; args.push(callback); - this.db.run.apply(this.db, args); + this.db.run.apply(this.db, args as [sql: string, ... params: unknown[]]); }); } - get(...args) { + get(...args: unknown[]): Promise { return new Promise((resolve, reject) => { if (!this.db) { return reject(new Error('Database.get: database is not open')); } - let callback = (err, row) => { + const callback = (err: Error | null, row: unknown) => { if (err) { reject(err); } else { - resolve(row); + resolve(row as T); } }; args.push(callback); - this.db.get.apply(this.db, args); + this.db.get.apply(this.db, args as [sql: string, ...params: unknown[]]); }); } - all(...args) { + all(...args: unknown[]): Promise { return new Promise((resolve, reject) => { if (!this.db) { return reject(new Error('Database.all: database is not open')); } - let callback = (err, rows) => { + const callback = (err: Error | null, rows: T[]) => { if (err) { reject(err); } else { @@ -136,11 +149,11 @@ export class Database { } }; args.push(callback); - this.db.all.apply(this.db, args); + this.db.all.apply(this.db, args as [sql: string, ...params: unknown[]]); }); } - each(...args) { + each(...args: unknown[]): Promise { if (args.length === 0 || typeof args[args.length - 1] !== 'function') { throw TypeError('Database.each: last arg is not a function'); } @@ -148,19 +161,19 @@ export class Database { if (!this.db) { return reject(new Error('Database.each: database is not open')); } - let callback = (err, nrows) => { + const completeCallback = (err: Error | null, nrows: number) => { if (err) { reject(err); } else { resolve(nrows); } }; - args.push(callback); - this.db.each.apply(this.db, args); + args.push(completeCallback); + this.db.each.apply(this.db, args as [sql: string, ...params: unknown[]]); }); } - exec(sql) { + exec(sql: string): Promise { return new Promise((resolve, reject) => { if (!this.db) { return reject(new Error('Database.exec: database is not open')); @@ -175,7 +188,7 @@ export class Database { }); } - async transaction(fn) { + async transaction(fn: (db: this) => T): Promise { await this.exec('BEGIN TRANSACTION'); try { const result = await fn(this); @@ -187,13 +200,13 @@ export class Database { } } - prepare(...args) { + prepare(...args: unknown[]): Promise { return new Promise((resolve, reject) => { if (!this.db) { return reject(new Error('Database.prepare: database is not open')); } - let statement; - let callback = (err) => { + let statement: sqlite.Statement; + const callback = (err: Error | null) => { if (err) { reject(err); } else { @@ -201,7 +214,7 @@ export class Database { } }; args.push(callback); - statement = this.db.prepare.apply(this.db, args); + statement = this.db.prepare.apply(this.db, args as [sql: string, ...params: unknown[]]); }); } } @@ -210,17 +223,20 @@ export class Database { // The Statement class //----------------------------------------------------------------------------- -class Statement { - constructor(statement) { +export class Statement { + + statement: sqlite.Statement + + constructor(statement: sqlite.Statement) { if (!(statement instanceof sqlite.Statement)) { throw new TypeError(`Statement: 'statement' is not a statement instance`); } this.statement = statement; } - bind(...args) { + bind(...args: unknown[]) { return new Promise((resolve, reject) => { - let callback = (err) => { + const callback = (err: Error|null) => { if (err) { reject(err); } else { @@ -240,7 +256,7 @@ class Statement { }); } - finalize() { + finalize(): Promise { return new Promise((resolve, reject) => { this.statement.finalize((err) => { if (err) { @@ -252,10 +268,10 @@ class Statement { }); } - run(...args) { + run(...args: unknown[]): Promise { return new Promise((resolve, reject) => { // Need a real function because 'this' is used. - let callback = function (err) { + const callback = function (this: RunResult, err: Error|null) { if (err) { reject(err); } else { @@ -270,9 +286,9 @@ class Statement { }); } - get(...args) { + get(...args: unknown[]): Promise { return new Promise((resolve, reject) => { - let callback = (err, row) => { + const callback = (err: Error|null, row: unknown) => { if (err) { reject(err); } else { @@ -284,9 +300,9 @@ class Statement { }); } - all(...args) { + all(...args: unknown[]): Promise { return new Promise((resolve, reject) => { - let callback = (err, rows) => { + const callback = (err: Error|null, rows: unknown[]) => { if (err) { reject(err); } else { @@ -298,12 +314,12 @@ class Statement { }); } - each(...args) { + each(...args: unknown[]): Promise { if (args.length === 0 || typeof args[args.length - 1] !== 'function') { throw TypeError('Statement.each: last arg is not a function'); } return new Promise((resolve, reject) => { - let callback = (err, nrows) => { + const callback = (err: Error|null, nrows: number) => { if (err) { reject(err); } else {