diff --git a/databases/mock_db.ts b/databases/mock_db.ts index ccfea971..571bcf46 100644 --- a/databases/mock_db.ts +++ b/databases/mock_db.ts @@ -4,6 +4,7 @@ import events from 'events'; export const Database = class extends events.EventEmitter { private settings: Settings; + public mock: any; constructor(settings:Settings) { super(); this.settings = { @@ -11,6 +12,8 @@ export const Database = class extends events.EventEmitter { ...settings, }; settings.mock = this; + this.settings = settings; + console.log("Initialized") } close(cb: ()=>{}) { @@ -29,8 +32,8 @@ export const Database = class extends events.EventEmitter { this.emit('get', key, cb); } - init(cb:()=>{}) { - this.emit('init', cb); + async init(cb:()=>{}) { + this.emit('init', cb()); } remove(key:string, cb:()=>{}) { diff --git a/databases/mongodb_db.ts b/databases/mongodb_db.ts index e048330e..80603c80 100644 --- a/databases/mongodb_db.ts +++ b/databases/mongodb_db.ts @@ -37,7 +37,7 @@ export const Database = class extends AbstractDatabase { clearPing() { if (this.interval) { - clearInterval(this.interval); + clearInterval(this.interval[Symbol.toPrimitive]()); } } diff --git a/databases/mysql_db.ts b/databases/mysql_db.ts index d916ca28..978fbe06 100644 --- a/databases/mysql_db.ts +++ b/databases/mysql_db.ts @@ -20,7 +20,7 @@ import util from 'util'; import {BulkObject} from './cassandra_db'; export const Database = class extends AbstractDatabase { - private _mysqlSettings: Settings; + private readonly _mysqlSettings: Settings; private _pool: any; constructor(settings:Settings) { super(); @@ -45,8 +45,7 @@ export const Database = class extends AbstractDatabase { try { return await new Promise((resolve, reject) => { options = {timeout: this.settings.queryTimeout, ...options}; - // @ts-ignore - this._pool && this._pool.query(options, (err, ...args) => err != null ? reject(err) : resolve(args)); + this._pool && this._pool.query(options, (err:Error, ...args:string[]) => err != null ? reject(err) : resolve(args)); }); } catch (err:any) { this.logger.error(`${err.fatal ? 'Fatal ' : ''}MySQL error: ${err.stack || err}`); diff --git a/index.ts b/index.ts index f379d552..157386cc 100644 --- a/index.ts +++ b/index.ts @@ -44,12 +44,12 @@ const makeDoneCallback = (callback: (err?:any)=>{}, deprecated:(err:any)=>{}) => }; export const Database = class { - private type: any; + private readonly type: any; private dbModule: any; private readonly dbSettings: any; private readonly wrapperSettings: any | {}; private readonly logger: Function | null; - private readonly db: any; + private db: any; private metrics: any; /** * @param type The type of the database @@ -60,7 +60,7 @@ export const Database = class { * from another logging library should also work, but performance may be reduced if the logger * object does not have is${Level}Enabled() methods (isDebugEnabled(), etc.). */ - constructor(type: undefined | string, dbSettings: Settings | null | string, wrapperSettings?: null | {}, logger:any = null) { + constructor(type: undefined | string, dbSettings: Settings | null | string, wrapperSettings?: null | {}, logger: any = null) { if (!type) { type = 'sqlite'; dbSettings = null; @@ -69,25 +69,21 @@ export const Database = class { // saves all settings and require the db module this.type = type; - this.dbModule = require(`./databases/${type}_db`); this.dbSettings = dbSettings; this.wrapperSettings = wrapperSettings; this.logger = normalizeLogger(logger); - const db = new this.dbModule.Database(this.dbSettings); - db.logger = this.logger; - this.db = new DatabaseCache(db, this.wrapperSettings, this.logger); - // Expose the cache wrapper's metrics to the user. See lib/CacheAndBufferLayer.js for details. - // - // WARNING: This feature is EXPERIMENTAL -- do not assume it will continue to exist in its - // current form in a future version. - this.metrics = this.db.metrics; } /** * @param callback - Deprecated. Node-style callback. If null, a Promise is returned. */ - init(callback = null) { + async init(callback = null) { + this.dbModule = await import(`./databases/${this.type}_db`); + const db = new this.dbModule.Database(this.dbSettings); + db.logger = this.logger; + this.db = new DatabaseCache(db, this.wrapperSettings, this.logger); + this.metrics = this.db.metrics; if (callback != null) { return cbDb.init.call(this.db); } diff --git a/package-lock.json b/package-lock.json index c0b3f924..0aad29a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,21 +26,20 @@ "devDependencies": { "@rollup/plugin-node-resolve": "^15.2.1", "@types/async": "^3.2.20", - "@types/mocha": "^10.0.1", "@types/mssql": "^8.1.2", "@types/mysql": "^2.15.21", - "@types/node": "^20.4.9", + "@types/node": "^20.5.7", "@types/pg": "^8.10.2", "@types/rethinkdb": "^2.3.17", "cli-table": "^0.3.11", "eslint": "^8.47.0", "eslint-config-etherpad": "^3.0.22", "glob": "^10.3.3", - "mocha": "^10.2.0", - "randexp": "^0.5.3", + "randexp-ts": "^1.0.5", "rollup": "^3.28.1", "rollup-plugin-typescript2": "^0.35.0", "typescript": "^4.9.5", + "vitest": "^0.34.3", "wtfnode": "^0.9.1" }, "engines": { @@ -1030,6 +1029,358 @@ "node": ">=14" } }, + "node_modules/@esbuild/android-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.20.tgz", + "integrity": "sha512-fyi7TDI/ijKKNZTUJAQqiG5T7YjJXgnzkURqmGj13C6dCqckZBLdl4h7bkhHt/t0WP+zO9/zwroDvANaOqO5Sw==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.20.tgz", + "integrity": "sha512-Nz4rJcchGDtENV0eMKUNa6L12zz2zBDXuhj/Vjh18zGqB44Bi7MBMSXjgunJgjRhCmKOjnPuZp4Mb6OKqtMHLQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.20.tgz", + "integrity": "sha512-8GDdlePJA8D6zlZYJV/jnrRAi6rOiNaCC/JclcXpB+KIuvfBN4owLtgzY2bsxnx666XjJx2kDPUmnTtR8qKQUg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.20.tgz", + "integrity": "sha512-bxRHW5kHU38zS2lPTPOyuyTm+S+eobPUnTNkdJEfAddYgEcll4xkT8DB9d2008DtTbl7uJag2HuE5NZAZgnNEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.20.tgz", + "integrity": "sha512-pc5gxlMDxzm513qPGbCbDukOdsGtKhfxD1zJKXjCCcU7ju50O7MeAZ8c4krSJcOIJGFR+qx21yMMVYwiQvyTyQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.20.tgz", + "integrity": "sha512-yqDQHy4QHevpMAaxhhIwYPMv1NECwOvIpGCZkECn8w2WFHXjEwrBn3CeNIYsibZ/iZEUemj++M26W3cNR5h+Tw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.20.tgz", + "integrity": "sha512-tgWRPPuQsd3RmBZwarGVHZQvtzfEBOreNuxEMKFcd5DaDn2PbBxfwLcj4+aenoh7ctXcbXmOQIn8HI6mCSw5MQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.20.tgz", + "integrity": "sha512-/5bHkMWnq1EgKr1V+Ybz3s1hWXok7mDFUMQ4cG10AfW3wL02PSZi5kFpYKrptDsgb2WAJIvRcDm+qIvXf/apvg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.20.tgz", + "integrity": "sha512-2YbscF+UL7SQAVIpnWvYwM+3LskyDmPhe31pE7/aoTMFKKzIc9lLbyGUpmmb8a8AixOL61sQ/mFh3jEjHYFvdA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.20.tgz", + "integrity": "sha512-P4etWwq6IsReT0E1KHU40bOnzMHoH73aXp96Fs8TIT6z9Hu8G6+0SHSw9i2isWrD2nbx2qo5yUqACgdfVGx7TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.20.tgz", + "integrity": "sha512-nXW8nqBTrOpDLPgPY9uV+/1DjxoQ7DoB2N8eocyq8I9XuqJ7BiAMDMf9n1xZM9TgW0J8zrquIb/A7s3BJv7rjg==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.20.tgz", + "integrity": "sha512-d5NeaXZcHp8PzYy5VnXV3VSd2D328Zb+9dEq5HE6bw6+N86JVPExrA6O68OPwobntbNJ0pzCpUFZTo3w0GyetQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.20.tgz", + "integrity": "sha512-WHPyeScRNcmANnLQkq6AfyXRFr5D6N2sKgkFo2FqguP44Nw2eyDlbTdZwd9GYk98DZG9QItIiTlFLHJHjxP3FA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.20.tgz", + "integrity": "sha512-WSxo6h5ecI5XH34KC7w5veNnKkju3zBRLEQNY7mv5mtBmrP/MjNBCAlsM2u5hDBlS3NGcTQpoBvRzqBcRtpq1A==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.20.tgz", + "integrity": "sha512-+8231GMs3mAEth6Ja1iK0a1sQ3ohfcpzpRLH8uuc5/KVDFneH6jtAJLFGafpzpMRO6DzJ6AvXKze9LfFMrIHVQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz", + "integrity": "sha512-UYqiqemphJcNsFEskc73jQ7B9jgwjWrSayxawS6UVFZGWrAAtkzjxSqnoclCXxWtfwLdzU+vTpcNYhpn43uP1w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.20.tgz", + "integrity": "sha512-iO1c++VP6xUBUmltHZoMtCUdPlnPGdBom6IrO4gyKPFFVBKioIImVooR5I83nTew5UOYrk3gIJhbZh8X44y06A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.20.tgz", + "integrity": "sha512-e5e4YSsuQfX4cxcygw/UCPIEP6wbIL+se3sxPdCiMbFLBWu0eiZOJ7WoD+ptCLrmjZBK1Wk7I6D/I3NglUGOxg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.20.tgz", + "integrity": "sha512-kDbFRFp0YpTQVVrqUd5FTYmWo45zGaXe0X8E1G/LKFC0v8x0vWrhOWSLITcCn63lmZIxfOMXtCfti/RxN/0wnQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.20.tgz", + "integrity": "sha512-ddYFR6ItYgoaq4v4JmQQaAI5s7npztfV4Ag6NrhiaW0RrnOXqBkgwZLofVTlq1daVTQNhtI5oieTvkRPfZrePg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.20.tgz", + "integrity": "sha512-Wv7QBi3ID/rROT08SABTS7eV4hX26sVduqDOTe1MvGMjNd3EjOz4b7zeexIR62GTIEKrfJXKL9LFxTYgkyeu7g==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.20.tgz", + "integrity": "sha512-kTdfRcSiDfQca/y9QIkng02avJ+NCaQvrMejlsB3RRv5sE9rRoeBPISaZpKxHELzRxZyLvNts1P27W3wV+8geQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", @@ -1214,6 +1565,24 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz", + "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==", + "dev": true, + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "dev": true + }, "node_modules/@js-joda/core": { "version": "5.5.3", "resolved": "https://registry.npmjs.org/@js-joda/core/-/core-5.5.3.tgz", @@ -1452,6 +1821,12 @@ "integrity": "sha512-0xd7qez0AQ+MbHatZTlI1gu5vkG8r7MYRUJAHPAHJBmGLs16zpkrpAVLvjQKQOqaXPDUBwOiJzNc00znHSCVBw==", "dev": true }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "dev": true + }, "node_modules/@smithy/abort-controller": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-1.0.2.tgz", @@ -2024,6 +2399,21 @@ "integrity": "sha512-6jSBQQugzyX1aWto0CbvOnmxrU9tMoXfA9gc4IrLEtvr3dTwSg5GLGoWiZnGLI6UG/kqpB3JOQKQrqnhUWGKQA==", "dev": true }, + "node_modules/@types/chai": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.5.tgz", + "integrity": "sha512-mEo1sAde+UCE6b2hxn332f1g1E8WfYRu6p5SvTKr2ZKC1f7gFJXk4h5PyGP9Dt6gCaG8y8XhwnXWC6Iy2cmBng==", + "dev": true + }, + "node_modules/@types/chai-subset": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/chai-subset/-/chai-subset-1.3.3.tgz", + "integrity": "sha512-frBecisrNGz+F4T6bcc+NLeolfiojh5FxW2klu669+8BARtyQv2C/GkNW6FUodVe4BroGMP/wER/YDGc7rEllw==", + "dev": true, + "dependencies": { + "@types/chai": "*" + } + }, "node_modules/@types/estree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", @@ -2046,12 +2436,6 @@ "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" }, - "node_modules/@types/mocha": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-10.0.1.tgz", - "integrity": "sha512-/fvYntiO1GeICvqbQ3doGDIP97vWmvFt83GKguJ6prmQM2iXZfFcq6YE8KteFyRtX2/h5Hf91BYvPodJKFYv5Q==", - "dev": true - }, "node_modules/@types/mssql": { "version": "8.1.2", "resolved": "https://registry.npmjs.org/@types/mssql/-/mssql-8.1.2.tgz", @@ -2073,9 +2457,9 @@ } }, "node_modules/@types/node": { - "version": "20.4.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.4.9.tgz", - "integrity": "sha512-8e2HYcg7ohnTUbHk8focoklEQYvemQmu9M/f43DZVx43kHn0tE3BY/6gSDxS7k0SprtS0NHvj+L80cGLnoOUcQ==" + "version": "20.5.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.5.7.tgz", + "integrity": "sha512-dP7f3LdZIysZnmvP3ANJYTSwg+wLLl8p7RqniVlV7j+oXSXAbt9h0WIBFmJy5inWZoX9wZN6eXx+YXd9Rh3RBA==" }, "node_modules/@types/pg": { "version": "8.10.2", @@ -2399,6 +2783,101 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vitest/expect": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-0.34.3.tgz", + "integrity": "sha512-F8MTXZUYRBVsYL1uoIft1HHWhwDbSzwAU9Zgh8S6WFC3YgVb4AnFV2GXO3P5Em8FjEYaZtTnQYoNwwBrlOMXgg==", + "dev": true, + "dependencies": { + "@vitest/spy": "0.34.3", + "@vitest/utils": "0.34.3", + "chai": "^4.3.7" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-0.34.3.tgz", + "integrity": "sha512-lYNq7N3vR57VMKMPLVvmJoiN4bqwzZ1euTW+XXYH5kzr3W/+xQG3b41xJn9ChJ3AhYOSoweu974S1V3qDcFESA==", + "dev": true, + "dependencies": { + "@vitest/utils": "0.34.3", + "p-limit": "^4.0.0", + "pathe": "^1.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/runner/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/runner/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@vitest/snapshot": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-0.34.3.tgz", + "integrity": "sha512-QyPaE15DQwbnIBp/yNJ8lbvXTZxS00kRly0kfFgAD5EYmCbYcA+1EEyRalc93M0gosL/xHeg3lKAClIXYpmUiQ==", + "dev": true, + "dependencies": { + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/spy": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-0.34.3.tgz", + "integrity": "sha512-N1V0RFQ6AI7CPgzBq9kzjRdPIgThC340DGjdKdPSE8r86aUSmeliTUgkTqLSgtEwWWsGfBQ+UetZWhK0BgJmkQ==", + "dev": true, + "dependencies": { + "tinyspy": "^2.1.1" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/@vitest/utils": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-0.34.3.tgz", + "integrity": "sha512-kiSnzLG6m/tiT0XEl4U2H8JDBjFtwVlaE8I3QfGiMFR0QvnRDfYfdP3YvTBWM/6iJDAyaPY6yVQiCTUc7ZzTHA==", + "dev": true, + "dependencies": { + "diff-sequences": "^29.4.3", + "loupe": "^2.3.6", + "pretty-format": "^29.5.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, "node_modules/abbrev": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", @@ -2424,6 +2903,15 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.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/adm-zip": { "version": "0.5.10", "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz", @@ -2479,19 +2967,10 @@ "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/ansi-regex": { @@ -2516,19 +2995,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/aproba": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", @@ -2658,6 +3124,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/async": { "version": "3.2.4", "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", @@ -2730,15 +3205,6 @@ "node": "*" } }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/bluebird": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", @@ -2784,12 +3250,6 @@ "node": ">=8" } }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, "node_modules/bson": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/bson/-/bson-6.0.0.tgz", @@ -2881,6 +3341,15 @@ "node": ">=10.16.0" } }, + "node_modules/cac": { + "version": "6.7.14", + "resolved": "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz", + "integrity": "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/cacache": { "version": "15.3.0", "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", @@ -2950,18 +3419,6 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/cassandra-driver": { "version": "4.6.4", "resolved": "https://registry.npmjs.org/cassandra-driver/-/cassandra-driver-4.6.4.tgz", @@ -2976,6 +3433,24 @@ "node": ">=8" } }, + "node_modules/chai": { + "version": "4.3.8", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz", + "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==", + "dev": true, + "dependencies": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^4.1.2", + "get-func-name": "^2.0.0", + "loupe": "^2.3.1", + "pathval": "^1.1.1", + "type-detect": "^4.0.5" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", @@ -2991,43 +3466,13 @@ "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "node_modules/check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, "engines": { - "node": ">= 6" + "node": "*" } }, "node_modules/chownr": { @@ -3060,17 +3505,6 @@ "node": ">= 0.2.0" } }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, "node_modules/cluster-key-slot": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", @@ -3188,16 +3622,16 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", + "node_modules/deep-eql": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", + "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", "dev": true, - "engines": { - "node": ">=10" + "dependencies": { + "type-detect": "^4.0.0" }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "engines": { + "node": ">=6" } }, "node_modules/deep-is": { @@ -3307,13 +3741,13 @@ "node": ">=8" } }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", + "node_modules/diff-sequences": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz", + "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==", "dev": true, "engines": { - "node": ">=0.3.1" + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, "node_modules/dir-glob": { @@ -3347,15 +3781,6 @@ "node": ">=6.0.0" } }, - "node_modules/drange": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/drange/-/drange-1.1.1.tgz", - "integrity": "sha512-pYxfDYpued//QpnLIm4Avk7rsNtAtQkUES2cwAYSvD/wd2pKD71gN2Ebj3e7klzXwjocvE8c5vx/1fxwpqmSxA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -3530,13 +3955,41 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "node_modules/esbuild": { + "version": "0.18.20", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.20.tgz", + "integrity": "sha512-ceqxoedUrcayh7Y7ZX6NdbbDzGROiyVBgC4PriJThBKSVPWnnFHZAkfI1lJT8QFkOwH4qOS2SJkS4wvpGl8BpA==", "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, "engines": { - "node": ">=6" + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/android-arm": "0.18.20", + "@esbuild/android-arm64": "0.18.20", + "@esbuild/android-x64": "0.18.20", + "@esbuild/darwin-arm64": "0.18.20", + "@esbuild/darwin-x64": "0.18.20", + "@esbuild/freebsd-arm64": "0.18.20", + "@esbuild/freebsd-x64": "0.18.20", + "@esbuild/linux-arm": "0.18.20", + "@esbuild/linux-arm64": "0.18.20", + "@esbuild/linux-ia32": "0.18.20", + "@esbuild/linux-loong64": "0.18.20", + "@esbuild/linux-mips64el": "0.18.20", + "@esbuild/linux-ppc64": "0.18.20", + "@esbuild/linux-riscv64": "0.18.20", + "@esbuild/linux-s390x": "0.18.20", + "@esbuild/linux-x64": "0.18.20", + "@esbuild/netbsd-x64": "0.18.20", + "@esbuild/openbsd-x64": "0.18.20", + "@esbuild/sunos-x64": "0.18.20", + "@esbuild/win32-arm64": "0.18.20", + "@esbuild/win32-ia32": "0.18.20", + "@esbuild/win32-x64": "0.18.20" } }, "node_modules/escape-string-regexp": { @@ -4175,15 +4628,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -4372,13 +4816,13 @@ "node": ">= 4" } }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "node_modules/get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", "dev": true, "engines": { - "node": "6.* || 8.* || >= 10.*" + "node": "*" } }, "node_modules/get-intrinsic": { @@ -4650,15 +5094,6 @@ "integrity": "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==", "optional": true }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, "node_modules/http-cache-semantics": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz", @@ -4842,18 +5277,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/is-boolean-object": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", @@ -5035,15 +5458,6 @@ "node": ">=8" } }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -5128,18 +5542,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -5246,6 +5648,12 @@ "json5": "lib/cli.js" } }, + "node_modules/jsonc-parser": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz", + "integrity": "sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==", + "dev": true + }, "node_modules/jsonfile": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", @@ -5329,6 +5737,18 @@ "node": ">= 0.8.0" } }, + "node_modules/local-pkg": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz", + "integrity": "sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -5353,22 +5773,6 @@ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/long": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/long/-/long-2.4.0.tgz", @@ -5377,6 +5781,15 @@ "node": ">=0.6" } }, + "node_modules/loupe": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", + "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", + "dev": true, + "dependencies": { + "get-func-name": "^2.0.0" + } + }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -5388,6 +5801,18 @@ "node": ">=10" } }, + "node_modules/magic-string": { + "version": "0.30.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.3.tgz", + "integrity": "sha512-B7xGbll2fG/VjP+SWg4sX3JynwIU0mjoTc6MPpKNuIvftk6u6vqhDnk1R80b8C2GBR6ywqy+1DcKBrevBg+bmw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + }, + "engines": { + "node": ">=12" + } + }, "node_modules/make-dir": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", @@ -5624,122 +6049,16 @@ "node": ">=10" } }, - "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/mocha/node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/mocha/node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "node_modules/mlly": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.4.1.tgz", + "integrity": "sha512-SCDs78Q2o09jiZiE2WziwVBEqXQ02XkGdUy45cbJf+BpYRIjArXRJ1Wbowxkb+NaM9DWvS3UC9GiO/6eqvQ/pg==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" + "acorn": "^8.10.0", + "pathe": "^1.1.1", + "pkg-types": "^1.0.3", + "ufo": "^1.3.0" } }, "node_modules/mongodb": { @@ -5897,18 +6216,6 @@ "node": ">=14" } }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, "node_modules/native-duplexpair": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/native-duplexpair/-/native-duplexpair-1.0.0.tgz", @@ -6085,15 +6392,6 @@ "node": ">=6" } }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/npm-run-path": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz", @@ -6418,7 +6716,22 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz", + "integrity": "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q==", + "dev": true + }, + "node_modules/pathval": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", + "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", + "dev": true, + "engines": { + "node": "*" } }, "node_modules/pg": { @@ -6531,6 +6844,63 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, + "node_modules/pkg-types": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.0.3.tgz", + "integrity": "sha512-nN7pYi0AQqJnoLPC9eHFQ8AcyaixBUOwvqc5TDnIKCMEE6I0y8P7OKA7fPexsXGCGxQDl/cmrLAp26LhcwxZ4A==", + "dev": true, + "dependencies": { + "jsonc-parser": "^3.2.0", + "mlly": "^1.2.0", + "pathe": "^1.1.0" + } + }, + "node_modules/postcss": { + "version": "8.4.29", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz", + "integrity": "sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss/node_modules/nanoid": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, "node_modules/postgres-array": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", @@ -6580,6 +6950,32 @@ "node": ">= 0.8.0" } }, + "node_modules/pretty-format": { + "version": "29.6.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz", + "integrity": "sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw==", + "dev": true, + "dependencies": { + "@jest/schemas": "^29.6.3", + "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/process-nextick-args": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", @@ -6656,40 +7052,43 @@ "integrity": "sha512-y/M9weqWAH4iopRd7EHDEQQvpFPHj1AA3oHozE9tfITHUtTR7Z9PSlIRRG2l1GuW7sefC1cXFfIcF+cgnShdBA==", "dev": true }, - "node_modules/randexp": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/randexp/-/randexp-0.5.3.tgz", - "integrity": "sha512-U+5l2KrcMNOUPYvazA3h5ekF80FHTUG+87SEAmHZmolh1M+i/WyTCxVzmi+tidIa1tM4BSe8g2Y/D3loWDjj+w==", + "node_modules/randexp-ts": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/randexp-ts/-/randexp-ts-1.0.5.tgz", + "integrity": "sha512-CF3FnKsif/tG3rnI5IqYYoLKm/evj8B67WDlfZLRNYucIo5fuzMLC4IscKNvWiW5LDGg/u9wKdj29ME/KsMzMg==", "dev": true, "dependencies": { - "drange": "^1.0.2", - "ret": "^0.2.0" + "drange": "^2.0.1", + "ret": "^0.5.0" }, "engines": { - "node": ">=4" + "node": ">=8" } }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "node_modules/randexp-ts/node_modules/drange": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/drange/-/drange-2.0.1.tgz", + "integrity": "sha512-s/Gs2VG0zdUXxWz4cK3vcwniF914RKWLNYY6YAVTTLo2HjqsynfUzUcSvNFEdktQXKDbJMKF9wmg67Rv32VhEQ==", "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" + "engines": { + "node": ">=6" } }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "node_modules/randexp-ts/node_modules/ret": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.5.0.tgz", + "integrity": "sha512-I1XxrZSQ+oErkRR4jYbAyEEu2I0avBvvMM5JN+6EBprOGRCs63ENqZ3vjavq8fBw2+62G5LF5XelKwuJpcvcxw==", "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, "engines": { - "node": ">=8.10.0" + "node": ">=10" } }, + "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/redis": { "version": "4.6.7", "resolved": "https://registry.npmjs.org/redis/-/redis-4.6.7.tgz", @@ -6719,15 +7118,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/resolve": { "version": "1.22.3", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.3.tgz", @@ -6761,15 +7151,6 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/ret": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", - "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/rethinkdb": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/rethinkdb/-/rethinkdb-2.4.2.tgz", @@ -7146,15 +7527,6 @@ "node": ">=10" } }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -7193,6 +7565,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/siginfo": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", + "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", + "dev": true + }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -7260,6 +7638,15 @@ "node": ">= 10" } }, + "node_modules/source-map-js": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/sparse-bitfield": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/sparse-bitfield/-/sparse-bitfield-3.0.3.tgz", @@ -7324,6 +7711,18 @@ "node": ">= 8" } }, + "node_modules/stackback": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", + "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", + "dev": true + }, + "node_modules/std-env": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.4.3.tgz", + "integrity": "sha512-f9aPhy8fYBuMN+sNfakZV18U39PbalgjXG3lLB9WkaYTxijru61wb57V9wxxNthXM5Sd88ETBWi29qLAsHO52Q==", + "dev": true + }, "node_modules/stoppable": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/stoppable/-/stoppable-1.1.0.tgz", @@ -7480,6 +7879,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strip-literal": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-1.3.0.tgz", + "integrity": "sha512-PugKzOsyXpArk0yWmUwqOZecSO0GH0bPoctLcqNDH9J04pVW3lflYE0ujElBGTloevcxF5MofAOZ7C5l2b+wLg==", + "dev": true, + "dependencies": { + "acorn": "^8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, "node_modules/strnum": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz", @@ -7618,6 +8029,30 @@ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, + "node_modules/tinybench": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-2.5.0.tgz", + "integrity": "sha512-kRwSG8Zx4tjF9ZiyH4bhaebu+EDz1BOx9hOigYHlUW4xxI/wKIUQUqo018UlU4ar6ATPBsaMrdbKZ+tmPdohFA==", + "dev": true + }, + "node_modules/tinypool": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.7.0.tgz", + "integrity": "sha512-zSYNUlYSMhJ6Zdou4cJwo/p7w5nmAH17GRfU/ui3ctvjXFErXXkruT4MWW6poDeXgCaIBlGLrfU6TbTXxyGMww==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tinyspy": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tinyspy/-/tinyspy-2.1.1.tgz", + "integrity": "sha512-XPJL2uSzcOyBMky6OFrusqWlzfFrXtE0hPuMgW8A2HmaqrPo4ZQHRN/V0QXN3FSjKxpsbRrFc5LI7KOwBsT1/w==", + "dev": true, + "engines": { + "node": ">=14.0.0" + } + }, "node_modules/titleize": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz", @@ -7696,6 +8131,15 @@ "node": ">= 0.8.0" } }, + "node_modules/type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/type-fest": { "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", @@ -7733,6 +8177,12 @@ "node": ">=4.2.0" } }, + "node_modules/ufo": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.3.0.tgz", + "integrity": "sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==", + "dev": true + }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -7815,6 +8265,161 @@ "uuid": "dist/bin/uuid" } }, + "node_modules/vite": { + "version": "4.4.9", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz", + "integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vite-node": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-0.34.3.tgz", + "integrity": "sha512-+0TzJf1g0tYXj6tR2vEyiA42OPq68QkRZCu/ERSo2PtsDJfBpDyEfuKbRvLmZqi/CgC7SCBtyC+WjTGNMRIaig==", + "dev": true, + "dependencies": { + "cac": "^6.7.14", + "debug": "^4.3.4", + "mlly": "^1.4.0", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "vite": "^3.0.0 || ^4.0.0" + }, + "bin": { + "vite-node": "vite-node.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + } + }, + "node_modules/vitest": { + "version": "0.34.3", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-0.34.3.tgz", + "integrity": "sha512-7+VA5Iw4S3USYk+qwPxHl8plCMhA5rtfwMjgoQXMT7rO5ldWcdsdo3U1QD289JgglGK4WeOzgoLTsGFu6VISyQ==", + "dev": true, + "dependencies": { + "@types/chai": "^4.3.5", + "@types/chai-subset": "^1.3.3", + "@types/node": "*", + "@vitest/expect": "0.34.3", + "@vitest/runner": "0.34.3", + "@vitest/snapshot": "0.34.3", + "@vitest/spy": "0.34.3", + "@vitest/utils": "0.34.3", + "acorn": "^8.9.0", + "acorn-walk": "^8.2.0", + "cac": "^6.7.14", + "chai": "^4.3.7", + "debug": "^4.3.4", + "local-pkg": "^0.4.3", + "magic-string": "^0.30.1", + "pathe": "^1.1.1", + "picocolors": "^1.0.0", + "std-env": "^3.3.3", + "strip-literal": "^1.0.1", + "tinybench": "^2.5.0", + "tinypool": "^0.7.0", + "vite": "^3.0.0 || ^4.0.0", + "vite-node": "0.34.3", + "why-is-node-running": "^2.2.2" + }, + "bin": { + "vitest": "vitest.mjs" + }, + "engines": { + "node": ">=v14.18.0" + }, + "funding": { + "url": "https://opencollective.com/vitest" + }, + "peerDependencies": { + "@edge-runtime/vm": "*", + "@vitest/browser": "*", + "@vitest/ui": "*", + "happy-dom": "*", + "jsdom": "*", + "playwright": "*", + "safaridriver": "*", + "webdriverio": "*" + }, + "peerDependenciesMeta": { + "@edge-runtime/vm": { + "optional": true + }, + "@vitest/browser": { + "optional": true + }, + "@vitest/ui": { + "optional": true + }, + "happy-dom": { + "optional": true + }, + "jsdom": { + "optional": true + }, + "playwright": { + "optional": true + }, + "safaridriver": { + "optional": true + }, + "webdriverio": { + "optional": true + } + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -7879,6 +8484,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/why-is-node-running": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.2.2.tgz", + "integrity": "sha512-6tSwToZxTOcotxHeA+qGCq1mVzKR3CwcJGmVcY+QE8SHy6TnpFnh8PAvPNHYr7EcuVeG0QSMxtYCuO1ta/G/oA==", + "dev": true, + "dependencies": { + "siginfo": "^2.0.0", + "stackback": "0.0.2" + }, + "bin": { + "why-is-node-running": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -7888,29 +8509,6 @@ "string-width": "^1.0.2 || 2 || 3 || 4" } }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, "node_modules/wrap-ansi-cjs": { "name": "wrap-ansi", "version": "7.0.0", @@ -7951,62 +8549,11 @@ "node": ">=0.4" } }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/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 c18d45a7..2fd35701 100644 --- a/package.json +++ b/package.json @@ -42,17 +42,16 @@ }, "devDependencies": { "@types/async": "^3.2.20", - "@types/mocha": "^10.0.1", "@types/mssql": "^8.1.2", "@types/mysql": "^2.15.21", - "@types/node": "^20.4.9", + "@types/node": "^20.5.7", "@types/pg": "^8.10.2", "@types/rethinkdb": "^2.3.17", "cli-table": "^0.3.11", "eslint": "^8.47.0", "eslint-config-etherpad": "^3.0.22", - "mocha": "^10.2.0", - "randexp": "^0.5.3", + "randexp-ts": "^1.0.5", + "vitest": "^0.34.3", "typescript": "^4.9.5", "wtfnode": "^0.9.1", "rollup": "^3.28.1", @@ -78,10 +77,8 @@ "scripts": { "lint": "eslint .", "lint:fix": "eslint --fix .", - "test": "mocha ./dist/test/test*.js", - "test:watch": "mocha ./dist/test/test*.js --watch", - "test-debug": "npx rollup -c rollup.config.cjs && mocha --inspect-brk ./dist/test/test*.js", - "build": "npx rollup -c rollup.config.cjs" + "build": "npx rollup -c rollup.config.cjs", + "test": "vitest" }, "_npmUser": { "name": "johnyma22", diff --git a/rollup.config.cjs b/rollup.config.cjs index f7886c74..d6878df6 100644 --- a/rollup.config.cjs +++ b/rollup.config.cjs @@ -4,7 +4,7 @@ const typescript = require('rollup-plugin-typescript2'); const glob = require('glob'); module.exports = { - input: ['./index.ts'].concat(glob.sync('./databases/*.ts')).concat(glob.sync('./test/*.ts')), // Matches all TypeScript files in the 'src' directory and its subdirectories + input: ['./index.ts'].concat(glob.sync('./databases/*.ts')), // Matches all TypeScript files in the 'src' directory and its subdirectories plugins: [ typescript({ tsconfig: 'tsconfig.json', diff --git a/test/test.ts b/test/test.spec.ts similarity index 69% rename from test/test.ts rename to test/test.spec.ts index 5e02b56b..91479dea 100644 --- a/test/test.ts +++ b/test/test.spec.ts @@ -2,20 +2,20 @@ import wtfnode from 'wtfnode'; // @ts-expect-error TS(7016): Could not find a declaration file for module 'cli-... Remove this comment to see the full error message import Clitable from 'cli-table'; -// @ts-ignore -import Randexp from 'randexp'; +import Randexp from 'randexp-ts'; import {databases} from './lib/databases'; import {promises} from 'fs'; import {ConsoleLogger} from '../lib/logging'; import * as ueberdb from '../index'; -'use strict'; -import {deepEqual, equal, rejects} from 'assert' +import {afterAll, describe, it, afterEach, beforeEach, beforeAll, expect} from 'vitest' +import {rejects} from "assert"; + const fs = {promises}.promises; const maxKeyLength = 100; const randomString = (length = maxKeyLength) => new Randexp(new RegExp(`.{${length}}`)).gen().replace("_",""); // eslint-disable-next-line mocha/no-top-level-hooks -after(async () => { +afterAll(async () => { // Add a timeout to forcibly exit if something is keeping node from exiting cleanly. // The timeout is unref()ed so that it doesn't prevent node from exiting when done. setTimeout(() => { @@ -29,7 +29,7 @@ after(async () => { describe(__filename, () => { let speedTable: any; let db: any; - before(async () => { + beforeAll(async () => { speedTable = new Clitable({ head: [ 'Database', @@ -46,7 +46,7 @@ describe(__filename, () => { colWidths: [15, 15, 15, 8, 13, 13, 13, 13, 13, 13], }); }); - after(async () => { + afterAll(async () => { console.log(speedTable.toString()); }); Object.keys(databases) @@ -57,41 +57,46 @@ describe(__filename, () => { describe(`${readCache ? '' : 'no '}read cache`, () => { for (const writeBuffer of [false, true]) { describe(`${writeBuffer ? '' : 'no '}write buffer`, function (this: any) { - this.timeout(5000); - before(async () => { - if (dbSettings.filename) { await fs.unlink(dbSettings.filename).catch(() => { }); } + beforeEach(async () => { + if (dbSettings.filename) { + await fs.unlink(dbSettings.filename).catch(() => { + }); + } db = new ueberdb.Database(database, dbSettings, { ...(readCache ? {} : {cache: 0}), ...(writeBuffer ? {} : {writeInterval: 0}), }, new ConsoleLogger()); await db.init(); }); - after(async () => { + afterEach(async () => { await db.close(); - if (dbSettings.filename) { await fs.unlink(dbSettings.filename).catch(() => { }); } + if (dbSettings.filename) { + await fs.unlink(dbSettings.filename).catch(() => { + }); + } }); describe('white space in key is not ignored', () => { for (const space of [false, true]) { describe(`key ${space ? 'has' : 'does not have'} a trailing space`, () => { let input: any; let key: any; - before(async () => { + beforeEach(async () => { input = {a: 1, b: new Randexp(/.+/).gen()}; key = randomString(maxKeyLength - 1) + (space ? ' ' : ''); await db.set(key, input); }); it('get(key) -> record', async () => { const output = await db.get(key); - equal(JSON.stringify(output), JSON.stringify(input)); + expect(JSON.stringify(output)).toBe(JSON.stringify(input)); }); it('get(`${key} `) -> nullish', async () => { const output = await db.get(`${key} `); - equal(output == null,true); + expect(output == null).toBeTruthy(); }); if (space) { it('get(key.slice(0, -1)) -> nullish', async () => { const output = await db.get(key.slice(0, -1)); - equal(output == null,true); + expect(output == null).toBeTruthy(); }); } }); @@ -99,24 +104,26 @@ describe(__filename, () => { }); it('get of unknown key -> nullish', async () => { const key = randomString(); - equal((await db.get(key)) == null,true); + expect((await db.get(key)) == null).toBeTruthy(); }); it('set+get works', async () => { const input = {a: 1, b: new Randexp(/.+/).gen()}; const key = randomString(); await db.set(key, input); const output = await db.get(key); - equal(JSON.stringify(output), JSON.stringify(input)); + expect(JSON.stringify(output)).toBe(JSON.stringify(input)); }); it('set+get with random key/value works', async () => { const input = {testLongString: new Randexp(/[a-f0-9]{50000}/).gen()}; const key = randomString(); await db.set(key, input); const output = await db.get(key); - equal(JSON.stringify(output), JSON.stringify(input)); + expect(JSON.stringify(output)).toBe(JSON.stringify(input)); }); - it('findKeys works', async function (this: any) { - if (database === 'mongodb') { this.skip(); } // TODO: Fix mongodb. + it('findKeys works', async function (context) { + if (database === 'mongodb') { + context.skip() + } // TODO: Fix mongodb. // TODO setting a key with non ascii chars const key = new Randexp(/([a-z]\w{0,20})foo\1/).gen(); await Promise.all([ @@ -125,10 +132,12 @@ describe(__filename, () => { db.set(`nonmatching_${key}`, false), ]); const keys = await db.findKeys(`${key}*`, null); - deepEqual(keys.sort(), [key, `${key}a`]); + expect(keys.sort()).toStrictEqual([key, `${key}a`]); }); - it('findKeys with exclusion works', async function (this: any) { - if (database === 'mongodb') { this.skip(); } // TODO: Fix mongodb. + it('findKeys with exclusion works', async function (context) { + if (database === 'mongodb') { + context.skip(); + } // TODO: Fix mongodb. const key = new Randexp(/([a-z]\w{0,20})foo\1/).gen(); await Promise.all([ db.set(key, true), @@ -138,65 +147,65 @@ describe(__filename, () => { db.set(`nonmatching_${key}`, false), ]); const keys = await db.findKeys(`${key}*`, `${key}b*`); - deepEqual(keys.sort(), [key, `${key}a`].sort()); + expect(keys.sort()).toStrictEqual([key, `${key}a`]); }); it('findKeys with no matches works', async () => { const key = new Randexp(/([a-z]\w{0,20})foo\1/).gen(); await db.set(key, true); const keys = await db.findKeys(`${key}_nomatch_*`, null); - deepEqual(keys, []); + expect(keys).toStrictEqual([]); }); it('findKeys with no wildcard works', async () => { const key = new Randexp(/([a-z]\w{0,20})foo\1/).gen(); await db.set(key, true); const keys = await db.findKeys(key, null); - deepEqual(keys, [key]); + expect(keys).toStrictEqual([key]); }); it('remove works', async () => { const input = {a: 1, b: new Randexp(/.+/)}; const key = randomString(); await db.set(key, input); - equal(JSON.stringify(await db.get(key)), JSON.stringify(input)); + expect(JSON.stringify(await db.get(key))).toStrictEqual(JSON.stringify(input)); await db.remove(key); - equal((await db.get(key)) == null,true); + expect((await db.get(key)) == null).toBeTruthy(); }); it('getSub of existing property works', async () => { await db.set('k', {sub1: {sub2: 'v'}}); - equal(await db.getSub('k', ['sub1', 'sub2']), 'v'); - deepEqual(await db.getSub('k', ['sub1']), {sub2: 'v'}); - deepEqual(await db.getSub('k', []), {sub1: {sub2: 'v'}}); + expect(await db.getSub('k', ['sub1', 'sub2'])).toBe('v'); + expect(await db.getSub('k', ['sub1'])).toStrictEqual({sub2: 'v'}); + expect(await db.getSub('k', [])).toStrictEqual({sub1: {sub2: 'v'}}); }); it('getSub of missing property returns nullish', async () => { await db.set('k', {sub1: {}}); - equal((await db.getSub('k', ['sub1', 'sub2'])) == null,true); + expect((await db.getSub('k', ['sub1', 'sub2'])) == null).toBeTruthy(); await db.set('k', {}); - equal((await db.getSub('k', ['sub1', 'sub2'])) == null,true); - equal((await db.getSub('k', ['sub1'])) == null,true); + expect((await db.getSub('k', ['sub1', 'sub2'])) == null).toBeTruthy(); + expect((await db.getSub('k', ['sub1']))).toBeNull(); await db.remove('k'); - equal((await db.getSub('k', ['sub1', 'sub2'])) == null,true); - equal((await db.getSub('k', ['sub1'])) == null,true); - equal((await db.getSub('k', [])) == null,true); + expect((await db.getSub('k', ['sub1', 'sub2'])) == null).toBeTruthy(); + expect((await db.getSub('k', ['sub1'])) == null).toBeTruthy(); + expect(await db.getSub('k', []) == null).toBeTruthy(); }); it('setSub can modify an existing property', async () => { await db.set('k', {sub1: {sub2: 'v'}}); await db.setSub('k', ['sub1', 'sub2'], 'v2'); - deepEqual(await db.get('k'), {sub1: {sub2: 'v2'}}); + expect(await db.get('k')).toStrictEqual({sub1: {sub2: 'v2'}}); await db.setSub('k', ['sub1'], 'v2'); - deepEqual(await db.get('k'), {sub1: 'v2'}); + expect(await db.get('k')).toStrictEqual({sub1: 'v2'}); await db.setSub('k', [], 'v3'); - equal(await db.get('k'), 'v3'); + expect(await db.get('k')).toStrictEqual('v3'); }); it('setSub can add a new property', async () => { await db.remove('k'); await db.setSub('k', [], {}); - deepEqual(await db.get('k'), {}); + expect(await db.get('k')).toStrictEqual({}); await db.setSub('k', ['sub1'], {}); - deepEqual(await db.get('k'), {sub1: {}}); + expect(await db.get('k')).toStrictEqual({sub1: {}}); await db.setSub('k', ['sub1', 'sub2'], 'v'); - deepEqual(await db.get('k'), {sub1: {sub2: 'v'}}); + expect(await db.get('k')).toStrictEqual({sub1: {sub2: 'v'}}); await db.remove('k'); await db.setSub('k', ['sub1', 'sub2'], 'v'); - deepEqual(await db.get('k'), {sub1: {sub2: 'v'}}); + expect(await db.get('k')).toStrictEqual({sub1: {sub2: 'v'}}); }); it('setSub rejects attempts to set properties on primitives', async () => { for (const v of ['hello world', 42, true]) { @@ -205,11 +214,10 @@ describe(__filename, () => { name: 'TypeError', message: /property "sub" on non-object/, }); - deepEqual(await db.get('k'), v); + expect(await db.get('k')).toBe(v); } }); - it('speed is acceptable', async function (this: any) { - + it('speed is acceptable', async function (context) { type TimeSettings = { remove?: string | number; findKeys?: number; @@ -219,7 +227,7 @@ describe(__filename, () => { } type Speeds = { - speeds:{ + speeds: { count?: number; setMax?: number; getMax?: number; @@ -228,26 +236,41 @@ describe(__filename, () => { } } - this.timeout(180000); - const {speeds: {count = 1000, setMax = 3, getMax = 0.1, findKeysMax = 3, removeMax = 1} = {}}:Speeds = dbSettings || {}; + const { + speeds: { + count = 1000, + setMax = 3, + getMax = 0.1, + findKeysMax = 3, + removeMax = 1 + } = {} + }: Speeds = dbSettings || {}; const input = {a: 1, b: new Randexp(/.+/).gen()}; // TODO setting a key with non ascii chars const key = new Randexp(/([a-z]\w{0,20})foo\1/).gen(); // Pre-allocate an array before starting the timer so that time spent growing the // array doesn't throw off the benchmarks. const promises = [...Array(count + 1)].map(() => null); - const timers:TimeSettings = {start: Date.now()}; - for (let i = 0; i < count; ++i) { promises[i] = db.set(key + i, input); } + const timers: TimeSettings = {start: Date.now()}; + for (let i = 0; i < count; ++i) { + promises[i] = db.set(key + i, input); + } promises[count] = db.flush(); await Promise.all(promises); timers.set = Date.now(); - for (let i = 0; i < count; ++i) { promises[i] = db.get(key + i); } + for (let i = 0; i < count; ++i) { + promises[i] = db.get(key + i); + } await Promise.all(promises); timers.get = Date.now(); - for (let i = 0; i < count; ++i) { promises[i] = db.findKeys(key + i, null); } + for (let i = 0; i < count; ++i) { + promises[i] = db.findKeys(key + i, null); + } await Promise.all(promises); timers.findKeys = Date.now(); - for (let i = 0; i < count; ++i) { promises[i] = db.remove(key + i); } + for (let i = 0; i < count; ++i) { + promises[i] = db.remove(key + i); + } promises[count] = db.flush(); await Promise.all(promises); timers.remove = Date.now(); @@ -271,7 +294,9 @@ describe(__filename, () => { ]); // Removes the "Acceptable ms/op" column if there is no enforced limit. const filterColumn = (row: any) => { - if (readCache && writeBuffer) { return row; } + if (readCache && writeBuffer) { + return row; + } row.splice(1, 1); return row; }; @@ -287,16 +312,17 @@ describe(__filename, () => { ].map(filterColumn)); console.log(acceptableTable.toString()); if (readCache && writeBuffer) { - equal(setMax >= timePerOp.set,true); - equal(getMax >= timePerOp.get,true); - equal(findKeysMax >= timePerOp.findKeys,true); - equal(removeMax >= timePerOp.remove,true); + expect(setMax >= timePerOp.set).toBeTruthy(); + expect(getMax >= timePerOp.get).toBeTruthy(); + expect(findKeysMax >= timePerOp.findKeys).toBeTruthy(); + expect(removeMax >= timePerOp.remove).toBeTruthy(); } - }); + }, + { + timeout: 60000 + }); }); } }); } - }); - }); -}); + })})}); diff --git a/test/test_bulk.ts b/test/test_bulk.spec.ts similarity index 82% rename from test/test_bulk.ts rename to test/test_bulk.spec.ts index b32bc060..ab844ee0 100644 --- a/test/test_bulk.ts +++ b/test/test_bulk.spec.ts @@ -1,19 +1,25 @@ import {strict} from 'assert'; import {Database} from '../index'; import util from 'util'; -'use strict'; const assert = strict const range = (N: any) => [...Array(N).keys()]; + +import {describe, it, afterEach, expect} from 'vitest' + +type MockSettings = { + mock?: any; +} + describe(__filename, () => { let db: any = null; let mock: any = null; const createDb = async (wrapperSettings: any) => { - const settings = {}; + const settings:MockSettings = {}; db = new Database('mock', settings, wrapperSettings); - // @ts-expect-error TS(2339): Property 'mock' does not exist on type '{}'. + await db.init(); mock = settings.mock; mock.once('init', (cb: any) => cb()); - await db.init(); + }; afterEach(async () => { if (mock != null) { @@ -36,11 +42,9 @@ describe(__filename, () => { mock.on('doBulk', util.callbackify(async (ops: any) => gotWrites.push(ops.length))); const N = 10; await Promise.all(range(N).map((i) => db.set(`key${i}`, `val${i}`))); - const wantLimit = bulkLimit || N; - // @ts-expect-error TS(2363): The right-hand side of an arithmetic operation mus... Remove this comment to see the full error message + const wantLimit:any = bulkLimit || N; const wantWrites = range(N / wantLimit).map((i) => wantLimit); - // @ts-expect-error TS(2775): Assertions require every name in the call target t... Remove this comment to see the full error message - assert.deepEqual(gotWrites, wantWrites); + expect(gotWrites).toStrictEqual(wantWrites); }); } }); diff --git a/test/test_elasticsearch.ts b/test/test_elasticsearch.spec.ts similarity index 98% rename from test/test_elasticsearch.ts rename to test/test_elasticsearch.spec.ts index 3785ec7b..7dbe6d69 100644 --- a/test/test_elasticsearch.ts +++ b/test/test_elasticsearch.spec.ts @@ -9,9 +9,9 @@ const logger = new class extends ConsoleLogger { info() { } isInfoEnabled() { return false; } }(); +import {afterAll, describe, it, afterEach, beforeEach, beforeAll, expect} from 'vitest' describe(__filename, function (this: any) { - this.timeout(60000); const {base_index = 'ueberdb_test'} = cfg; let client: any; let db: any; diff --git a/test/test_findKeys.ts b/test/test_findKeys.spec.ts similarity index 89% rename from test/test_findKeys.ts rename to test/test_findKeys.spec.ts index cef752b3..9c2061aa 100644 --- a/test/test_findKeys.ts +++ b/test/test_findKeys.spec.ts @@ -4,16 +4,22 @@ import * as ueberdb from '../index'; 'use strict'; const assert = assert$0.strict; const logger = new ConsoleLogger(); +import {afterAll, describe, it, afterEach, beforeEach, beforeAll, expect} from 'vitest' + +type MockSettings = { + mock?: any; +} + describe(__filename, () => { let db: any = null; let mock: any = null; const createDb = async (wrapperSettings = {}) => { - const settings = {}; + const settings:MockSettings = {}; db = new ueberdb.Database('mock', settings, {json: false, ...wrapperSettings}, logger); - // @ts-expect-error TS(2339): Property 'mock' does not exist on type '{}'. + await db.init(); mock = settings.mock; mock.once('init', (cb: any) => cb()); - await db.init(); + }; afterEach(async () => { if (mock != null) { diff --git a/test/test_flush.ts b/test/test_flush.spec.ts similarity index 91% rename from test/test_flush.ts rename to test/test_flush.spec.ts index 3a582b23..1df88478 100644 --- a/test/test_flush.ts +++ b/test/test_flush.spec.ts @@ -1,17 +1,23 @@ import {ConsoleLogger} from '../lib/logging'; import * as ueberdb from '../index'; -'use strict'; +import {afterAll, describe, it, afterEach, beforeEach, beforeAll, expect} from 'vitest' const logger = new ConsoleLogger(); + + +type MockSettings = { + mock?: any; +} + + describe(__filename, () => { let db: any = null; let mock: any = null; const createDb = async (wrapperSettings = {}) => { - const settings = {}; + const settings:MockSettings = {}; db = new ueberdb.Database('mock', settings, {json: false, ...wrapperSettings}, logger); - // @ts-expect-error TS(2339): Property 'mock' does not exist on type '{}'. + await db.init(); mock = settings.mock; mock.once('init', (cb: any) => cb()); - await db.init(); }; afterEach(async () => { if (mock != null) { diff --git a/test/test_getSub.ts b/test/test_getSub.spec.ts similarity index 92% rename from test/test_getSub.ts rename to test/test_getSub.spec.ts index 07368f18..5d9586f0 100644 --- a/test/test_getSub.ts +++ b/test/test_getSub.spec.ts @@ -1,6 +1,6 @@ import assert$0 from 'assert'; import * as ueberdb from '../index'; -'use strict'; +import {afterAll, describe, it, afterEach, beforeEach, beforeAll, expect} from 'vitest' const assert = assert$0.strict; describe(__filename, () => { let db: any; diff --git a/test/test_lru.ts b/test/test_lru.spec.ts similarity index 98% rename from test/test_lru.ts rename to test/test_lru.spec.ts index 46e8b42a..7cda00fc 100644 --- a/test/test_lru.ts +++ b/test/test_lru.spec.ts @@ -1,6 +1,6 @@ import {exportedForTesting} from '../lib/CacheAndBufferLayer'; import assert$0 from 'assert'; -'use strict'; +import {afterAll, describe, it, afterEach, beforeEach, beforeAll, expect} from 'vitest' const LRU = {exportedForTesting}.exportedForTesting.LRU; const assert = assert$0.strict; describe(__filename, () => { diff --git a/test/test_memory.ts b/test/test_memory.spec.ts similarity index 93% rename from test/test_memory.ts rename to test/test_memory.spec.ts index 002e1553..9f4f15d0 100644 --- a/test/test_memory.ts +++ b/test/test_memory.spec.ts @@ -1,6 +1,6 @@ import assert$0 from 'assert'; import * as memory from '../databases/memory_db'; -'use strict'; +import {afterAll, describe, it, afterEach, beforeEach, beforeAll, expect} from 'vitest' const assert = assert$0.strict; describe(__filename, () => { diff --git a/test/test_metrics.ts b/test/test_metrics.spec.ts similarity index 96% rename from test/test_metrics.ts rename to test/test_metrics.spec.ts index dda8015b..8cf8c3d8 100644 --- a/test/test_metrics.ts +++ b/test/test_metrics.spec.ts @@ -1,6 +1,6 @@ import assert$0 from 'assert'; import * as ueberdb from '../index'; -'use strict'; +import {afterAll, describe, it, afterEach, beforeEach, beforeAll, expect} from 'vitest' const assert = assert$0.strict; // Gate is a normal Promise that resolves when its open() method is called. // @ts-expect-error TS(2508): No base constructor has the specified number of ty... Remove this comment to see the full error message @@ -42,24 +42,28 @@ const assertMetricsDelta = (before: any, after: any, wantDelta: any) => { // @ts-expect-error TS(2775): Assertions require every name in the call target t... Remove this comment to see the full error message assert.deepEqual(diffMetrics(before, after), wantDelta); }; + +type MockSettings = { + mock?: any; +} + describe(__filename, () => { let db: any; let key: any; let mock: any; - before(async () => { - const settings = {}; + beforeEach(async () => { + const settings:MockSettings = {}; db = new ueberdb.Database('mock', settings); - // @ts-expect-error TS(2339): Property 'mock' does not exist on type '{}'. - mock = settings.mock; - mock.once('init', (cb: any) => cb()); await db.init(); + mock = settings.mock + mock.once('init', (cb: any) => cb()); }); - after(async () => { + afterAll(async () => { mock.once('close', (cb: any) => cb()); await db.close(); }); - beforeEach(async function (this: any) { - key = this.currentTest.fullTitle(); // Use test title to avoid collisions with other tests. + beforeEach(async function (context) { + key = expect.getState().currentTestName }); afterEach(async () => { mock.removeAllListeners(); @@ -123,11 +127,9 @@ describe(__filename, () => { await tc.f(key); } let finishDbRead; - const dbReadStarted = new Promise((resolve) => { + const dbReadStarted = new Promise((resolve) => { mock.once('get', (key: any, cb: any) => { - // @ts-expect-error TS(2775): Assertions require every name in the call target t... Remove this comment to see the full error message - assert(!subtc.cacheHit, 'value should have been cached'); - // @ts-expect-error TS(2794): Expected 1 arguments, but got 0. Did you forget to... Remove this comment to see the full error message + expect(!subtc.cacheHit).toBeTruthy //('value should have been cached'); resolve(); new Promise((resolve) => { finishDbRead = resolve; }) .then(() => cb(subtc.err, subtc.val)); @@ -174,7 +176,7 @@ describe(__filename, () => { readsFinished: 1, readsFromCache: 1, }); - // @ts-expect-error TS(2722): Cannot invoke an object which is possibly 'undefin... Remove this comment to see the full error message + // @ts-ignore finishWrite(); await writeFinished; await flushed; diff --git a/test/test_mysql.ts b/test/test_mysql.spec.ts similarity index 97% rename from test/test_mysql.ts rename to test/test_mysql.spec.ts index f4925c3a..013b06cc 100644 --- a/test/test_mysql.ts +++ b/test/test_mysql.spec.ts @@ -1,7 +1,8 @@ import assert$0 from 'assert'; import {databases} from './lib/databases'; import * as mysql from '../databases/mysql_db'; -'use strict'; +import {afterAll, describe, it, afterEach, beforeEach, beforeAll, expect} from 'vitest' + const assert = assert$0.strict; describe(__filename, () => { beforeEach(async function (this: any) { diff --git a/test/test_postgres.ts b/test/test_postgres.spec.ts similarity index 87% rename from test/test_postgres.ts rename to test/test_postgres.spec.ts index cea5f12b..00682d77 100644 --- a/test/test_postgres.ts +++ b/test/test_postgres.spec.ts @@ -2,6 +2,7 @@ import {databases} from './lib/databases'; import * as ueberdb from '../index'; 'use strict'; import {equal} from 'assert'; +import {afterAll, describe, it, afterEach, beforeEach, beforeAll, expect} from 'vitest' describe(__filename, () => { it('connection string instead of settings object', async () => { diff --git a/test/test_setSub.ts b/test/test_setSub.spec.ts similarity index 84% rename from test/test_setSub.ts rename to test/test_setSub.spec.ts index 1e7bd509..1a90ac06 100644 --- a/test/test_setSub.ts +++ b/test/test_setSub.spec.ts @@ -1,6 +1,7 @@ import assert$0 from 'assert'; import * as ueberdb from '../index'; -'use strict'; +import {afterAll, describe, it, afterEach, beforeEach, beforeAll, expect} from 'vitest' + const assert = assert$0.strict; describe(__filename, () => { let db: any; diff --git a/test/test_tojson.ts b/test/test_tojson.spec.ts similarity index 91% rename from test/test_tojson.ts rename to test/test_tojson.spec.ts index 9d3bb59b..e8ec01f7 100644 --- a/test/test_tojson.ts +++ b/test/test_tojson.spec.ts @@ -1,14 +1,15 @@ import assert$0 from 'assert'; import * as ueberdb from '../index'; -'use strict'; +import {afterAll, describe, it, afterEach, beforeEach, beforeAll, expect} from 'vitest' + const assert = assert$0.strict; describe(__filename, () => { let db: any = null; - before(async () => { + beforeAll(async () => { db = new ueberdb.Database('memory', {}, {}); await db.init(); }); - after(async () => { + afterAll(async () => { await db.close(); }); it('no .toJSON method', async () => {