From 78d2e13a1627c32a88511e53914ae0b6fa76d826 Mon Sep 17 00:00:00 2001 From: Andy Peterson Date: Mon, 28 Nov 2022 13:53:40 -0800 Subject: [PATCH 1/7] Convert to typescript implementation --- .gitignore | 4 + .mocharc.json | 4 + README.md | 5 + dist/sqlite-async.d.ts | 39 + dist/sqlite-async.js | 318 +++++ package-lock.json | 1095 ++++++++++++++++- package.json | 20 +- .../sqlite-async-test.ts | 12 +- sqlite-async.js => src/sqlite-async.ts | 82 +- tsconfig.json | 24 + 10 files changed, 1552 insertions(+), 51 deletions(-) create mode 100644 .mocharc.json create mode 100644 dist/sqlite-async.d.ts create mode 100644 dist/sqlite-async.js rename test/sqlite-async-test.js => src/sqlite-async-test.ts (95%) rename sqlite-async.js => src/sqlite-async.ts (78%) create mode 100644 tsconfig.json 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..06ce777 --- /dev/null +++ b/.mocharc.json @@ -0,0 +1,4 @@ +{ + "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/dist/sqlite-async.d.ts b/dist/sqlite-async.d.ts new file mode 100644 index 0000000..689b3eb --- /dev/null +++ b/dist/sqlite-async.d.ts @@ -0,0 +1,39 @@ +/** + * This module provides a promise interface to the sqlite3 database module. + */ +import 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: any[]) => void): sqlite.Database; + close(fn?: (db: this) => Promise): Promise; + run(...args: any[]): Promise; + get(...args: any[]): Promise; + all(...args: any[]): Promise; + each(...args: any[]): Promise; + exec(sql: string): Promise; + transaction(fn: (db: this) => T): Promise; + prepare(...args: any[]): Promise; +} +export declare class Statement { + statement: sqlite.Statement; + constructor(statement: sqlite.Statement); + bind(...args: any[]): Promise; + reset(): Promise; + finalize(): Promise; + run(...args: any[]): Promise; + get(...args: any[]): Promise; + all(...args: any[]): Promise; + each(...args: any[]): Promise; +} diff --git a/dist/sqlite-async.js b/dist/sqlite-async.js new file mode 100644 index 0000000..5691031 --- /dev/null +++ b/dist/sqlite-async.js @@ -0,0 +1,318 @@ +"use strict"; +/** + * This module provides a promise interface to the sqlite3 database module. + */ +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Statement = exports.Database = void 0; +const sqlite3_1 = __importDefault(require("sqlite3")); +//----------------------------------------------------------------------------- +// The Database class +//----------------------------------------------------------------------------- +class Database { + db; + filename; + static get OPEN_READONLY() { + return sqlite3_1.default.OPEN_READONLY; + } + static get OPEN_READWRITE() { + return sqlite3_1.default.OPEN_READWRITE; + } + static get OPEN_CREATE() { + return sqlite3_1.default.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 sqlite3_1.default.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); + }); + } +} +exports.Database = Database; +//----------------------------------------------------------------------------- +// The Statement class +//----------------------------------------------------------------------------- +class Statement { + statement; + constructor(statement) { + if (!(statement instanceof sqlite3_1.default.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/package-lock.json b/package-lock.json index 2673a8e..431865d 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" }, "devDependencies": { - "mocha": "^10.0.0" + "@types/expect": "^24.3.0", + "@types/mocha": "^10.0.0", + "@types/node": "*", + "@types/sqlite3": "*", + "mocha": "^10.0.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,6 +268,106 @@ "node": ">= 6" } }, + "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.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg==", + "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/@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -83,6 +379,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 +500,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 +657,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 +722,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 +792,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 +851,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 +997,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 +1202,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 +1360,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 +1393,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", @@ -1360,6 +1824,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 +1878,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 +1999,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", @@ -1575,6 +2080,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 +2193,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 +2281,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 +2408,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 +2431,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,12 +2620,117 @@ "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 }, + "@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.0", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.0.tgz", + "integrity": "sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg==", + "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 + }, "@ungap/promise-all-settled": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", @@ -1884,6 +2742,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 +2827,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 +2948,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 +3001,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 +3050,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 +3094,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 +3200,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 +3360,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 +3478,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 +3508,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", @@ -2827,6 +3817,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 +3861,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 +3944,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", @@ -2976,6 +3997,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 +4082,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 +4140,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 +4243,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..ef2946a 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,13 @@ { "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" - }, + "main": "./dist/sqlite-async.js", + "types": "./dist/sqlite-async.d.ts", + "type": "commonjs", "scripts": { + "build": "npm run clean && tsc", + "clean": "rm dist/*", "test": "mocha" }, "repository": { @@ -28,6 +28,12 @@ "sqlite3": "^5.0.11" }, "devDependencies": { - "mocha": "^10.0.0" + "@types/expect": "^24.3.0", + "@types/mocha": "^10.0.0", + "@types/node": "*", + "@types/sqlite3": "*", + "mocha": "^10.0.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..6f20c46 100644 --- a/test/sqlite-async-test.js +++ b/src/sqlite-async-test.ts @@ -1,9 +1,9 @@ import assert from 'assert'; import { unlink } from 'fs'; -import { Database } from '../sqlite-async.js'; +import { Database, Statement } from './sqlite-async' -let db; -let statement; +let db: Database; +let statement: Statement; describe('Module', function () { describe('Database', function () { @@ -86,7 +86,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 +114,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 +183,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 78% rename from sqlite-async.js rename to src/sqlite-async.ts index 8da3658..7f1b150 100644 --- a/sqlite-async.js +++ b/src/sqlite-async.ts @@ -4,11 +4,24 @@ import 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: any[]) => 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: any[]): 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 { @@ -106,12 +119,12 @@ export class Database { }); } - get(...args) { + get(...args: any[]) { 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: any) => { if (err) { reject(err); } else { @@ -123,12 +136,12 @@ export class Database { }); } - all(...args) { + all(...args: any[]): 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: any[]) => { if (err) { reject(err); } else { @@ -140,7 +153,7 @@ export class Database { }); } - each(...args) { + each(...args: any[]): 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); + args.push(completeCallback); this.db.each.apply(this.db, args); }); } - 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: any[]): 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 { @@ -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: any[]) { 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: any[]): 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: any[]): Promise { return new Promise((resolve, reject) => { - let callback = (err, row) => { + const callback = (err: Error|null, row: any) => { if (err) { reject(err); } else { @@ -284,9 +300,9 @@ class Statement { }); } - all(...args) { + all(...args: any[]): Promise { return new Promise((resolve, reject) => { - let callback = (err, rows) => { + const callback = (err: Error|null, rows: any[]) => { if (err) { reject(err); } else { @@ -298,12 +314,12 @@ class Statement { }); } - each(...args) { + each(...args: any[]): 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 { diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..6b20cee --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,24 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "moduleResolution": "node", + "target": "es2022", + "module": "commonjs", + "lib": [ + "es6" + ], + "noImplicitAny": true, + "noImplicitThis": true, + "strictNullChecks": true, + "strictFunctionTypes": true, + "forceConsistentCasingInFileNames": true, + "outDir": "./dist", + "declaration": true + }, + "include": [ + "src/**/*.ts" + ], + "exclude": [ + "node_modules" + ] +} From fea4ba219c1b2e19aa9f65e03995d295222673d8 Mon Sep 17 00:00:00 2001 From: Andy Peterson Date: Fri, 30 Dec 2022 21:05:22 -0800 Subject: [PATCH 2/7] support esm and cjs --- .mocharc.json | 1 + tsconfig.json => configs/tsconfig.base.json | 10 +- configs/tsconfig.cjs.json | 11 + configs/tsconfig.esm.json | 11 + dist/sqlite-async.d.ts | 39 --- dist/sqlite-async.js | 318 -------------------- package-lock.json | 18 +- package.json | 29 +- src/sqlite-async-test.ts | 1 + src/sqlite-async.ts | 22 +- 10 files changed, 73 insertions(+), 387 deletions(-) rename tsconfig.json => configs/tsconfig.base.json (77%) create mode 100644 configs/tsconfig.cjs.json create mode 100644 configs/tsconfig.esm.json delete mode 100644 dist/sqlite-async.d.ts delete mode 100644 dist/sqlite-async.js diff --git a/.mocharc.json b/.mocharc.json index 06ce777..152c79e 100644 --- a/.mocharc.json +++ b/.mocharc.json @@ -1,4 +1,5 @@ { + "extension": ["ts"], "spec": "src/**/*-test.ts", "require": "ts-node/register" } diff --git a/tsconfig.json b/configs/tsconfig.base.json similarity index 77% rename from tsconfig.json rename to configs/tsconfig.base.json index 6b20cee..66cd374 100644 --- a/tsconfig.json +++ b/configs/tsconfig.base.json @@ -7,18 +7,22 @@ "lib": [ "es6" ], + "types": [ + "mocha", + "node" + ], "noImplicitAny": true, "noImplicitThis": true, "strictNullChecks": true, "strictFunctionTypes": true, "forceConsistentCasingInFileNames": true, - "outDir": "./dist", + "outDir": "../dist", "declaration": true }, "include": [ - "src/**/*.ts" + "../src/**/*.ts" ], "exclude": [ - "node_modules" + "../node_modules" ] } diff --git a/configs/tsconfig.cjs.json b/configs/tsconfig.cjs.json new file mode 100644 index 0000000..1b6a1d3 --- /dev/null +++ b/configs/tsconfig.cjs.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "lib": ["ES6", "DOM"], + "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..d38f9b6 --- /dev/null +++ b/configs/tsconfig.esm.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.base.json", + "compilerOptions": { + "lib": ["ES2022", "DOM"], + "target": "ES2022", + "module": "ESNext", + "moduleResolution": "NodeNext", + "outDir": "../dist/esm", + "declarationDir": "../dist/esm/types" + } +} diff --git a/dist/sqlite-async.d.ts b/dist/sqlite-async.d.ts deleted file mode 100644 index 689b3eb..0000000 --- a/dist/sqlite-async.d.ts +++ /dev/null @@ -1,39 +0,0 @@ -/** - * This module provides a promise interface to the sqlite3 database module. - */ -import 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: any[]) => void): sqlite.Database; - close(fn?: (db: this) => Promise): Promise; - run(...args: any[]): Promise; - get(...args: any[]): Promise; - all(...args: any[]): Promise; - each(...args: any[]): Promise; - exec(sql: string): Promise; - transaction(fn: (db: this) => T): Promise; - prepare(...args: any[]): Promise; -} -export declare class Statement { - statement: sqlite.Statement; - constructor(statement: sqlite.Statement); - bind(...args: any[]): Promise; - reset(): Promise; - finalize(): Promise; - run(...args: any[]): Promise; - get(...args: any[]): Promise; - all(...args: any[]): Promise; - each(...args: any[]): Promise; -} diff --git a/dist/sqlite-async.js b/dist/sqlite-async.js deleted file mode 100644 index 5691031..0000000 --- a/dist/sqlite-async.js +++ /dev/null @@ -1,318 +0,0 @@ -"use strict"; -/** - * This module provides a promise interface to the sqlite3 database module. - */ -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Statement = exports.Database = void 0; -const sqlite3_1 = __importDefault(require("sqlite3")); -//----------------------------------------------------------------------------- -// The Database class -//----------------------------------------------------------------------------- -class Database { - db; - filename; - static get OPEN_READONLY() { - return sqlite3_1.default.OPEN_READONLY; - } - static get OPEN_READWRITE() { - return sqlite3_1.default.OPEN_READWRITE; - } - static get OPEN_CREATE() { - return sqlite3_1.default.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 sqlite3_1.default.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); - }); - } -} -exports.Database = Database; -//----------------------------------------------------------------------------- -// The Statement class -//----------------------------------------------------------------------------- -class Statement { - statement; - constructor(statement) { - if (!(statement instanceof sqlite3_1.default.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/package-lock.json b/package-lock.json index 431865d..1f5857c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,11 +12,11 @@ "sqlite3": "^5.0.11" }, "devDependencies": { - "@types/expect": "^24.3.0", - "@types/mocha": "^10.0.0", + "@types/expect": "*", + "@types/mocha": "*", "@types/node": "*", "@types/sqlite3": "*", - "mocha": "^10.0.0", + "mocha": "*", "ts-node": "*", "typescript": "*" } @@ -327,9 +327,9 @@ } }, "node_modules/@types/mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg==", + "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": { @@ -2690,9 +2690,9 @@ } }, "@types/mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-rADY+HtTOA52l9VZWtgQfn4p+UDVM2eDVkMZT1I6syp0YKxW2F9v+0pbRZLsvskhQv/vMb6ZfCay81GHbz5SHg==", + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", + "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", "dev": true }, "@types/node": { diff --git a/package.json b/package.json index ef2946a..b3cbdc9 100644 --- a/package.json +++ b/package.json @@ -2,12 +2,27 @@ "name": "sqlite-async", "version": "1.2.0", "description": "ES6 Promise-based interface to the sqlite3 module.", - "main": "./dist/sqlite-async.js", - "types": "./dist/sqlite-async.d.ts", + "files": "dist/**", "type": "commonjs", + "main": "./dist/cjs/sqlite-async.js", + "types": "./dist/cjs/sqlite-async.d.ts", + "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" + } + } + }, "scripts": { - "build": "npm run clean && tsc", - "clean": "rm dist/*", + "clean": "rm dist/* || echo 'already clean'", + "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": { @@ -28,11 +43,11 @@ "sqlite3": "^5.0.11" }, "devDependencies": { - "@types/expect": "^24.3.0", - "@types/mocha": "^10.0.0", + "@types/expect": "*", + "@types/mocha": "*", "@types/node": "*", "@types/sqlite3": "*", - "mocha": "^10.0.0", + "mocha": "*", "ts-node": "*", "typescript": "*" } diff --git a/src/sqlite-async-test.ts b/src/sqlite-async-test.ts index 6f20c46..7d3b30c 100644 --- a/src/sqlite-async-test.ts +++ b/src/sqlite-async-test.ts @@ -1,6 +1,7 @@ import assert from 'assert'; import { unlink } from 'fs'; import { Database, Statement } from './sqlite-async' +import 'mocha'; let db: Database; let statement: Statement; diff --git a/src/sqlite-async.ts b/src/sqlite-async.ts index 7f1b150..cd6b098 100644 --- a/src/sqlite-async.ts +++ b/src/sqlite-async.ts @@ -2,7 +2,7 @@ * 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 @@ -19,8 +19,8 @@ export interface RunResult { export class Database { - db: sqlite.Database | null - filename: string + db?: sqlite.Database | null + filename?: string static get OPEN_READONLY() { return sqlite.OPEN_READONLY; @@ -115,11 +115,11 @@ export class Database { } }; args.push(callback); - this.db.run.apply(this.db, args); + this.db.run.apply(this.db, args as [sql: string, ... params: any[]]); }); } - get(...args: any[]) { + get(...args: any[]): Promise { return new Promise((resolve, reject) => { if (!this.db) { return reject(new Error('Database.get: database is not open')); @@ -132,16 +132,16 @@ export class Database { } }; args.push(callback); - this.db.get.apply(this.db, args); + this.db.get.apply(this.db, args as [sql: string, ...params: any[]]); }); } - all(...args: any[]): Promise { + all(...args: any[]): Promise { return new Promise((resolve, reject) => { if (!this.db) { return reject(new Error('Database.all: database is not open')); } - const callback = (err: Error | null, rows: any[]) => { + const callback = (err: Error | null, rows: T[]) => { if (err) { reject(err); } else { @@ -149,7 +149,7 @@ export class Database { } }; args.push(callback); - this.db.all.apply(this.db, args); + this.db.all.apply(this.db, args as [sql: string, ...params: any[]]); }); } @@ -169,7 +169,7 @@ export class Database { } }; args.push(completeCallback); - this.db.each.apply(this.db, args); + this.db.each.apply(this.db, args as [sql: string, ...params: any[]]); }); } @@ -214,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: any[]]); }); } } From ec2671ccdebb0b31f6091d5b693cb8a224eaa6e2 Mon Sep 17 00:00:00 2001 From: Andy Peterson Date: Fri, 30 Dec 2022 21:05:40 -0800 Subject: [PATCH 3/7] add dist to checkin --- dist/cjs/sqlite-async-test.js | 220 +++++++++++++++++ dist/cjs/sqlite-async.js | 326 ++++++++++++++++++++++++++ dist/cjs/types/sqlite-async-test.d.ts | 1 + dist/cjs/types/sqlite-async.d.ts | 39 +++ dist/esm/sqlite-async-test.js | 215 +++++++++++++++++ dist/esm/sqlite-async.mjs | 310 ++++++++++++++++++++++++ dist/esm/types/sqlite-async-test.d.ts | 1 + dist/esm/types/sqlite-async.d.ts | 39 +++ 8 files changed, 1151 insertions(+) create mode 100644 dist/cjs/sqlite-async-test.js create mode 100644 dist/cjs/sqlite-async.js create mode 100644 dist/cjs/types/sqlite-async-test.d.ts create mode 100644 dist/cjs/types/sqlite-async.d.ts create mode 100644 dist/esm/sqlite-async-test.js create mode 100644 dist/esm/sqlite-async.mjs create mode 100644 dist/esm/types/sqlite-async-test.d.ts create mode 100644 dist/esm/types/sqlite-async.d.ts diff --git a/dist/cjs/sqlite-async-test.js b/dist/cjs/sqlite-async-test.js new file mode 100644 index 0000000..1a09f26 --- /dev/null +++ b/dist/cjs/sqlite-async-test.js @@ -0,0 +1,220 @@ +"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"); +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..7c6a122 --- /dev/null +++ b/dist/cjs/sqlite-async.js @@ -0,0 +1,326 @@ +"use strict"; +/** + * This module provides a promise interface to the sqlite3 database module. + */ +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()); + }); +}; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.Statement = exports.Database = void 0; +const sqlite3_1 = __importDefault(require("sqlite3")); +//----------------------------------------------------------------------------- +// The Database class +//----------------------------------------------------------------------------- +class Database { + static get OPEN_READONLY() { + return sqlite3_1.default.OPEN_READONLY; + } + static get OPEN_READWRITE() { + return sqlite3_1.default.OPEN_READWRITE; + } + static get OPEN_CREATE() { + return sqlite3_1.default.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 sqlite3_1.default.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 sqlite3_1.default.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..cb0ff5c --- /dev/null +++ b/dist/cjs/types/sqlite-async-test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/dist/cjs/types/sqlite-async.d.ts b/dist/cjs/types/sqlite-async.d.ts new file mode 100644 index 0000000..fdaa13c --- /dev/null +++ b/dist/cjs/types/sqlite-async.d.ts @@ -0,0 +1,39 @@ +/** + * This module provides a promise interface to the sqlite3 database module. + */ +import 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: any[]) => void): sqlite.Database; + close(fn?: (db: this) => Promise): Promise; + run(...args: any[]): Promise; + get(...args: any[]): Promise; + all(...args: any[]): Promise; + each(...args: any[]): Promise; + exec(sql: string): Promise; + transaction(fn: (db: this) => T): Promise; + prepare(...args: any[]): Promise; +} +export declare class Statement { + statement: sqlite.Statement; + constructor(statement: sqlite.Statement); + bind(...args: any[]): Promise; + reset(): Promise; + finalize(): Promise; + run(...args: any[]): Promise; + get(...args: any[]): Promise; + all(...args: any[]): Promise; + each(...args: any[]): Promise; +} diff --git a/dist/esm/sqlite-async-test.js b/dist/esm/sqlite-async-test.js new file mode 100644 index 0000000..39edaea --- /dev/null +++ b/dist/esm/sqlite-async-test.js @@ -0,0 +1,215 @@ +import assert from 'assert'; +import { unlink } from 'fs'; +import { Database } from './sqlite-async'; +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..07fec72 --- /dev/null +++ b/dist/esm/sqlite-async.mjs @@ -0,0 +1,310 @@ +/** + * This module provides a promise interface to the sqlite3 database module. + */ +import 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..cb0ff5c --- /dev/null +++ b/dist/esm/types/sqlite-async-test.d.ts @@ -0,0 +1 @@ +export {}; diff --git a/dist/esm/types/sqlite-async.d.ts b/dist/esm/types/sqlite-async.d.ts new file mode 100644 index 0000000..fdaa13c --- /dev/null +++ b/dist/esm/types/sqlite-async.d.ts @@ -0,0 +1,39 @@ +/** + * This module provides a promise interface to the sqlite3 database module. + */ +import 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: any[]) => void): sqlite.Database; + close(fn?: (db: this) => Promise): Promise; + run(...args: any[]): Promise; + get(...args: any[]): Promise; + all(...args: any[]): Promise; + each(...args: any[]): Promise; + exec(sql: string): Promise; + transaction(fn: (db: this) => T): Promise; + prepare(...args: any[]): Promise; +} +export declare class Statement { + statement: sqlite.Statement; + constructor(statement: sqlite.Statement); + bind(...args: any[]): Promise; + reset(): Promise; + finalize(): Promise; + run(...args: any[]): Promise; + get(...args: any[]): Promise; + all(...args: any[]): Promise; + each(...args: any[]): Promise; +} From e6d14e631d4fab7e2f22afc90a583a0628e496a9 Mon Sep 17 00:00:00 2001 From: Andy Peterson Date: Fri, 30 Dec 2022 21:09:08 -0800 Subject: [PATCH 4/7] Updated to latest sqlite3 --- package-lock.json | 14 +++++++------- package.json | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1f5857c..1facb7d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,7 +9,7 @@ "version": "1.2.0", "license": "MIT", "dependencies": { - "sqlite3": "^5.0.11" + "sqlite3": "^5.1.2" }, "devDependencies": { "@types/expect": "*", @@ -2047,9 +2047,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", @@ -3978,9 +3978,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", diff --git a/package.json b/package.json index b3cbdc9..50885cd 100644 --- a/package.json +++ b/package.json @@ -40,7 +40,7 @@ }, "homepage": "https://github.com/fhellwig/sqlite-async#readme", "dependencies": { - "sqlite3": "^5.0.11" + "sqlite3": "^5.1.2" }, "devDependencies": { "@types/expect": "*", From a8aa540b27d58bca693754d56518d9cb46f67f6d Mon Sep 17 00:00:00 2001 From: Andy Peterson Date: Fri, 30 Dec 2022 21:24:32 -0800 Subject: [PATCH 5/7] put version of mocha back to hard-code version --- package-lock.json | 28 +++++++--------------------- package.json | 2 +- 2 files changed, 8 insertions(+), 22 deletions(-) diff --git a/package-lock.json b/package-lock.json index 1facb7d..2489d20 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,7 +16,7 @@ "@types/mocha": "*", "@types/node": "*", "@types/sqlite3": "*", - "mocha": "*", + "mocha": "^10.1.0", "ts-node": "*", "typescript": "*" } @@ -368,12 +368,6 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, - "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==", - "dev": true - }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -1517,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", @@ -2731,12 +2724,6 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": 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==", - "dev": true - }, "abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -3597,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", diff --git a/package.json b/package.json index 50885cd..e21c9b4 100644 --- a/package.json +++ b/package.json @@ -47,7 +47,7 @@ "@types/mocha": "*", "@types/node": "*", "@types/sqlite3": "*", - "mocha": "*", + "mocha": "^10.1.0", "ts-node": "*", "typescript": "*" } From 9cad01b352fd093307bcb24451edbe79d74c9d90 Mon Sep 17 00:00:00 2001 From: Andy Peterson Date: Fri, 30 Dec 2022 21:57:41 -0800 Subject: [PATCH 6/7] re-build --- dist/cjs/sqlite-async-test.js | 1 + dist/cjs/sqlite-async.js | 38 ++++++++++++++++++++------- dist/cjs/types/sqlite-async-test.d.ts | 2 +- dist/cjs/types/sqlite-async.d.ts | 6 ++--- dist/esm/sqlite-async-test.js | 1 + dist/esm/sqlite-async.mjs | 2 +- dist/esm/types/sqlite-async-test.d.ts | 2 +- dist/esm/types/sqlite-async.d.ts | 6 ++--- 8 files changed, 40 insertions(+), 18 deletions(-) diff --git a/dist/cjs/sqlite-async-test.js b/dist/cjs/sqlite-async-test.js index 1a09f26..1097d11 100644 --- a/dist/cjs/sqlite-async-test.js +++ b/dist/cjs/sqlite-async-test.js @@ -6,6 +6,7 @@ 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 () { diff --git a/dist/cjs/sqlite-async.js b/dist/cjs/sqlite-async.js index 7c6a122..0e94a7b 100644 --- a/dist/cjs/sqlite-async.js +++ b/dist/cjs/sqlite-async.js @@ -2,6 +2,29 @@ /** * 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) { @@ -11,24 +34,21 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; Object.defineProperty(exports, "__esModule", { value: true }); exports.Statement = exports.Database = void 0; -const sqlite3_1 = __importDefault(require("sqlite3")); +const sqlite = __importStar(require("sqlite3")); //----------------------------------------------------------------------------- // The Database class //----------------------------------------------------------------------------- class Database { static get OPEN_READONLY() { - return sqlite3_1.default.OPEN_READONLY; + return sqlite.OPEN_READONLY; } static get OPEN_READWRITE() { - return sqlite3_1.default.OPEN_READWRITE; + return sqlite.OPEN_READWRITE; } static get OPEN_CREATE() { - return sqlite3_1.default.OPEN_CREATE; + return sqlite.OPEN_CREATE; } static get SQLITE3_VERSION() { return '5.0.11'; @@ -48,7 +68,7 @@ class Database { if (this.db) { return reject(new Error('Database.open: database is already open')); } - let db = new sqlite3_1.default.Database(filename, mode, (err) => { + let db = new sqlite.Database(filename, mode, (err) => { if (err) { reject(err); } @@ -221,7 +241,7 @@ exports.Database = Database; //----------------------------------------------------------------------------- class Statement { constructor(statement) { - if (!(statement instanceof sqlite3_1.default.Statement)) { + if (!(statement instanceof sqlite.Statement)) { throw new TypeError(`Statement: 'statement' is not a statement instance`); } this.statement = statement; diff --git a/dist/cjs/types/sqlite-async-test.d.ts b/dist/cjs/types/sqlite-async-test.d.ts index cb0ff5c..53eb506 100644 --- a/dist/cjs/types/sqlite-async-test.d.ts +++ b/dist/cjs/types/sqlite-async-test.d.ts @@ -1 +1 @@ -export {}; +import 'mocha'; diff --git a/dist/cjs/types/sqlite-async.d.ts b/dist/cjs/types/sqlite-async.d.ts index fdaa13c..37ec4e8 100644 --- a/dist/cjs/types/sqlite-async.d.ts +++ b/dist/cjs/types/sqlite-async.d.ts @@ -1,15 +1,15 @@ /** * 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; } export declare class Database { - db: sqlite.Database | null; - filename: string; + db?: sqlite.Database | null; + filename?: string; static get OPEN_READONLY(): number; static get OPEN_READWRITE(): number; static get OPEN_CREATE(): number; diff --git a/dist/esm/sqlite-async-test.js b/dist/esm/sqlite-async-test.js index 39edaea..0d762dd 100644 --- a/dist/esm/sqlite-async-test.js +++ b/dist/esm/sqlite-async-test.js @@ -1,6 +1,7 @@ import assert from 'assert'; import { unlink } from 'fs'; import { Database } from './sqlite-async'; +import 'mocha'; let db; let statement; describe('Module', function () { diff --git a/dist/esm/sqlite-async.mjs b/dist/esm/sqlite-async.mjs index 07fec72..d522f90 100644 --- a/dist/esm/sqlite-async.mjs +++ b/dist/esm/sqlite-async.mjs @@ -1,7 +1,7 @@ /** * This module provides a promise interface to the sqlite3 database module. */ -import sqlite from 'sqlite3'; +import * as sqlite from 'sqlite3'; //----------------------------------------------------------------------------- // The Database class //----------------------------------------------------------------------------- diff --git a/dist/esm/types/sqlite-async-test.d.ts b/dist/esm/types/sqlite-async-test.d.ts index cb0ff5c..53eb506 100644 --- a/dist/esm/types/sqlite-async-test.d.ts +++ b/dist/esm/types/sqlite-async-test.d.ts @@ -1 +1 @@ -export {}; +import 'mocha'; diff --git a/dist/esm/types/sqlite-async.d.ts b/dist/esm/types/sqlite-async.d.ts index fdaa13c..37ec4e8 100644 --- a/dist/esm/types/sqlite-async.d.ts +++ b/dist/esm/types/sqlite-async.d.ts @@ -1,15 +1,15 @@ /** * 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; } export declare class Database { - db: sqlite.Database | null; - filename: string; + db?: sqlite.Database | null; + filename?: string; static get OPEN_READONLY(): number; static get OPEN_READWRITE(): number; static get OPEN_CREATE(): number; From 8d4dfa58e2a823b6242ed6f05c8ce35ed077e842 Mon Sep 17 00:00:00 2001 From: Andy Peterson Date: Tue, 3 Jan 2023 12:10:03 -0800 Subject: [PATCH 7/7] use unknown instead of any, wher epossible --- configs/tsconfig.base.json | 14 +++----- configs/tsconfig.cjs.json | 2 +- configs/tsconfig.esm.json | 4 +-- dist/cjs/types/sqlite-async-test.d.ts | 1 + dist/cjs/types/sqlite-async-test.d.ts.map | 1 + dist/cjs/types/sqlite-async.d.ts | 23 ++++++------- dist/cjs/types/sqlite-async.d.ts.map | 1 + dist/esm/types/sqlite-async-test.d.ts | 1 + dist/esm/types/sqlite-async-test.d.ts.map | 1 + dist/esm/types/sqlite-async.d.ts | 23 ++++++------- dist/esm/types/sqlite-async.d.ts.map | 1 + package.json | 11 ++++--- src/sqlite-async.ts | 40 +++++++++++------------ 13 files changed, 64 insertions(+), 59 deletions(-) create mode 100644 dist/cjs/types/sqlite-async-test.d.ts.map create mode 100644 dist/cjs/types/sqlite-async.d.ts.map create mode 100644 dist/esm/types/sqlite-async-test.d.ts.map create mode 100644 dist/esm/types/sqlite-async.d.ts.map diff --git a/configs/tsconfig.base.json b/configs/tsconfig.base.json index 66cd374..6c17ca1 100644 --- a/configs/tsconfig.base.json +++ b/configs/tsconfig.base.json @@ -1,12 +1,11 @@ { "compilerOptions": { "esModuleInterop": true, - "moduleResolution": "node", - "target": "es2022", - "module": "commonjs", - "lib": [ - "es6" - ], + "forceConsistentCasingInFileNames": true, + "skipLibCheck": true, + "declaration": true, + "declarationMap": true, + "allowSyntheticDefaultImports": true, "types": [ "mocha", "node" @@ -15,9 +14,6 @@ "noImplicitThis": true, "strictNullChecks": true, "strictFunctionTypes": true, - "forceConsistentCasingInFileNames": true, - "outDir": "../dist", - "declaration": true }, "include": [ "../src/**/*.ts" diff --git a/configs/tsconfig.cjs.json b/configs/tsconfig.cjs.json index 1b6a1d3..603dfec 100644 --- a/configs/tsconfig.cjs.json +++ b/configs/tsconfig.cjs.json @@ -1,7 +1,7 @@ { "extends": "./tsconfig.base.json", "compilerOptions": { - "lib": ["ES6", "DOM"], + "lib": ["ES6"], "target": "ES6", "module": "CommonJS", "moduleResolution": "Node", diff --git a/configs/tsconfig.esm.json b/configs/tsconfig.esm.json index d38f9b6..e3ce461 100644 --- a/configs/tsconfig.esm.json +++ b/configs/tsconfig.esm.json @@ -1,11 +1,11 @@ { "extends": "./tsconfig.base.json", "compilerOptions": { - "lib": ["ES2022", "DOM"], + "lib": ["ES2022"], "target": "ES2022", "module": "ESNext", "moduleResolution": "NodeNext", "outDir": "../dist/esm", - "declarationDir": "../dist/esm/types" + "declarationDir": "../dist/esm/types", } } diff --git a/dist/cjs/types/sqlite-async-test.d.ts b/dist/cjs/types/sqlite-async-test.d.ts index 53eb506..84096ac 100644 --- a/dist/cjs/types/sqlite-async-test.d.ts +++ b/dist/cjs/types/sqlite-async-test.d.ts @@ -1 +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 index 37ec4e8..722c826 100644 --- a/dist/cjs/types/sqlite-async.d.ts +++ b/dist/cjs/types/sqlite-async.d.ts @@ -16,24 +16,25 @@ export declare class Database { static get SQLITE3_VERSION(): string; static open(filename: string, mode?: OpenMode): Promise; open(filename: string, mode?: OpenMode): Promise; - on(evt: string, cb: (...args: any[]) => void): sqlite.Database; + on(evt: string, cb: (...args: unknown[]) => void): sqlite.Database; close(fn?: (db: this) => Promise): Promise; - run(...args: any[]): Promise; - get(...args: any[]): Promise; - all(...args: any[]): Promise; - each(...args: any[]): 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: any[]): Promise; + prepare(...args: unknown[]): Promise; } export declare class Statement { statement: sqlite.Statement; constructor(statement: sqlite.Statement); - bind(...args: any[]): Promise; + bind(...args: unknown[]): Promise; reset(): Promise; finalize(): Promise; - run(...args: any[]): Promise; - get(...args: any[]): Promise; - all(...args: any[]): Promise; - each(...args: any[]): 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/types/sqlite-async-test.d.ts b/dist/esm/types/sqlite-async-test.d.ts index 53eb506..84096ac 100644 --- a/dist/esm/types/sqlite-async-test.d.ts +++ b/dist/esm/types/sqlite-async-test.d.ts @@ -1 +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 index 37ec4e8..722c826 100644 --- a/dist/esm/types/sqlite-async.d.ts +++ b/dist/esm/types/sqlite-async.d.ts @@ -16,24 +16,25 @@ export declare class Database { static get SQLITE3_VERSION(): string; static open(filename: string, mode?: OpenMode): Promise; open(filename: string, mode?: OpenMode): Promise; - on(evt: string, cb: (...args: any[]) => void): sqlite.Database; + on(evt: string, cb: (...args: unknown[]) => void): sqlite.Database; close(fn?: (db: this) => Promise): Promise; - run(...args: any[]): Promise; - get(...args: any[]): Promise; - all(...args: any[]): Promise; - each(...args: any[]): 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: any[]): Promise; + prepare(...args: unknown[]): Promise; } export declare class Statement { statement: sqlite.Statement; constructor(statement: sqlite.Statement); - bind(...args: any[]): Promise; + bind(...args: unknown[]): Promise; reset(): Promise; finalize(): Promise; - run(...args: any[]): Promise; - get(...args: any[]): Promise; - all(...args: any[]): Promise; - each(...args: any[]): 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.json b/package.json index e21c9b4..fce9e86 100644 --- a/package.json +++ b/package.json @@ -2,10 +2,6 @@ "name": "sqlite-async", "version": "1.2.0", "description": "ES6 Promise-based interface to the sqlite3 module.", - "files": "dist/**", - "type": "commonjs", - "main": "./dist/cjs/sqlite-async.js", - "types": "./dist/cjs/sqlite-async.d.ts", "exports": { ".": { "import": { @@ -18,8 +14,13 @@ } } }, + "types": "./dist/cjs/types/sqlite-async.d.ts", + "main": "./dist/cjs/sqlite-async.js", + "files": [ + "dist/**/*" + ], "scripts": { - "clean": "rm dist/* || echo 'already clean'", + "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", diff --git a/src/sqlite-async.ts b/src/sqlite-async.ts index cd6b098..8962364 100644 --- a/src/sqlite-async.ts +++ b/src/sqlite-async.ts @@ -65,7 +65,7 @@ export class Database { }); } - on(evt: string, cb: (...args: any[]) => void) { + on(evt: string, cb: (...args: unknown[]) => void) { return this.db!.on(evt, cb); } @@ -98,7 +98,7 @@ export class Database { }); } - run(...args: any[]): Promise { + run(...args: unknown[]): Promise { return new Promise((resolve, reject) => { if (!this.db) { return reject(new Error('Database.run: database is not open')); @@ -115,28 +115,28 @@ export class Database { } }; args.push(callback); - this.db.run.apply(this.db, args as [sql: string, ... params: any[]]); + this.db.run.apply(this.db, args as [sql: string, ... params: unknown[]]); }); } - get(...args: any[]): Promise { + get(...args: unknown[]): Promise { return new Promise((resolve, reject) => { if (!this.db) { return reject(new Error('Database.get: database is not open')); } - const callback = (err: Error | null, row: any) => { + 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 as [sql: string, ...params: any[]]); + this.db.get.apply(this.db, args as [sql: string, ...params: unknown[]]); }); } - all(...args: any[]): Promise { + all(...args: unknown[]): Promise { return new Promise((resolve, reject) => { if (!this.db) { return reject(new Error('Database.all: database is not open')); @@ -149,11 +149,11 @@ export class Database { } }; args.push(callback); - this.db.all.apply(this.db, args as [sql: string, ...params: any[]]); + this.db.all.apply(this.db, args as [sql: string, ...params: unknown[]]); }); } - each(...args: any[]): Promise { + each(...args: unknown[]): Promise { if (args.length === 0 || typeof args[args.length - 1] !== 'function') { throw TypeError('Database.each: last arg is not a function'); } @@ -169,7 +169,7 @@ export class Database { } }; args.push(completeCallback); - this.db.each.apply(this.db, args as [sql: string, ...params: any[]]); + this.db.each.apply(this.db, args as [sql: string, ...params: unknown[]]); }); } @@ -200,7 +200,7 @@ export class Database { } } - prepare(...args: any[]): Promise { + prepare(...args: unknown[]): Promise { return new Promise((resolve, reject) => { if (!this.db) { return reject(new Error('Database.prepare: database is not open')); @@ -214,7 +214,7 @@ export class Database { } }; args.push(callback); - statement = this.db.prepare.apply(this.db, args as [sql: string, ...params: any[]]); + statement = this.db.prepare.apply(this.db, args as [sql: string, ...params: unknown[]]); }); } } @@ -234,7 +234,7 @@ export class Statement { this.statement = statement; } - bind(...args: any[]) { + bind(...args: unknown[]) { return new Promise((resolve, reject) => { const callback = (err: Error|null) => { if (err) { @@ -268,7 +268,7 @@ export class Statement { }); } - run(...args: any[]): Promise { + run(...args: unknown[]): Promise { return new Promise((resolve, reject) => { // Need a real function because 'this' is used. const callback = function (this: RunResult, err: Error|null) { @@ -286,9 +286,9 @@ export class Statement { }); } - get(...args: any[]): Promise { + get(...args: unknown[]): Promise { return new Promise((resolve, reject) => { - const callback = (err: Error|null, row: any) => { + const callback = (err: Error|null, row: unknown) => { if (err) { reject(err); } else { @@ -300,9 +300,9 @@ export class Statement { }); } - all(...args: any[]): Promise { + all(...args: unknown[]): Promise { return new Promise((resolve, reject) => { - const callback = (err: Error|null, rows: any[]) => { + const callback = (err: Error|null, rows: unknown[]) => { if (err) { reject(err); } else { @@ -314,7 +314,7 @@ export class Statement { }); } - each(...args: any[]): Promise { + each(...args: unknown[]): Promise { if (args.length === 0 || typeof args[args.length - 1] !== 'function') { throw TypeError('Statement.each: last arg is not a function'); }