diff --git a/.github/workflows/nodejs.yml b/.github/workflows/nodejs.yml index cfc289f..13e8d39 100644 --- a/.github/workflows/nodejs.yml +++ b/.github/workflows/nodejs.yml @@ -15,7 +15,7 @@ jobs: strategy: matrix: - node-version: [16.x, 18.x] + node-version: [18.x, 20.x, 22.x] steps: - uses: actions/checkout@v2 diff --git a/package-lock.json b/package-lock.json index 11f36e5..73c8cc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -21,7 +21,7 @@ "@grpc/grpc-js": "^1.6.10", "@grpc/proto-loader": "^0.7.0", "async": "^3.2.4", - "ava": "^3.15.0", + "ava": "^5.3.1", "benchmarkify": "^3.0.0", "google-protobuf": "^3.21.0", "highland": "3.0.0-beta.10", @@ -353,27 +353,6 @@ "to-fast-properties": "^2.0.0" } }, - "node_modules/@concordance/react": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@concordance/react/-/react-2.0.0.tgz", - "integrity": "sha512-huLSkUuM2/P+U0uy2WwlKuixMsTODD8p4JVQBI4VKeopkiN0C7M3N9XYVawb4M+4spN5RrO/eLhk7KoQX6nsfA==", - "dev": true, - "dependencies": { - "arrify": "^1.0.1" - }, - "engines": { - "node": ">=6.12.3 <7 || >=8.9.4 <9 || >=10.0.0" - } - }, - "node_modules/@concordance/react/node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/@eslint/eslintrc": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz", @@ -400,23 +379,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/@eslint/eslintrc/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/@eslint/eslintrc/node_modules/globals": { "version": "13.13.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", @@ -565,12 +527,12 @@ "integrity": "sha512-yQwAWHDq14uN95QIViP5WY0kMpiGv6nj5+HpJkjz9Um84FeGQYT3VonFVFsuAnBvGrhAFl0IiKKgpFk+hP/tQw==" }, "node_modules/@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "dependencies": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" }, "engines": { @@ -578,21 +540,21 @@ } }, "node_modules/@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "engines": { "node": ">= 8" } }, "node_modules/@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "dependencies": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" }, "engines": { @@ -663,27 +625,6 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "dev": true }, - "node_modules/@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "dependencies": { - "defer-to-connect": "^1.0.1" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -724,16 +665,10 @@ "integrity": "sha512-lg55ArB+ZiHHbBBttLpzD07akz0QPrZgUODNakeC09i62dnrywr9mFErHuaPlB6I7z+sEbK+IYmplahvplCj2g==", "dev": true }, - "node_modules/@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, "node_modules/acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -752,9 +687,9 @@ } }, "node_modules/acorn-walk": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.0.2.tgz", - "integrity": "sha512-+bpA9MJsHdZ4bgfDcpk0ozQyhhVct7rzOmO0s1IIr0AGGgKBljss8n2zp11rRP2wid5VGeh04CgeKzgat5/25A==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true, "engines": { "node": ">=0.4.0" @@ -789,15 +724,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "dependencies": { - "string-width": "^4.1.0" - } - }, "node_modules/ansi-escape-sequences": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.1.0.tgz", @@ -829,21 +755,21 @@ } }, "node_modules/ansi-styles": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.1.0.tgz", - "integrity": "sha512-osxifZo3ar56+e8tdYreU6p8FZGciBHo5O0JoDAxMUqZuyNUb+yHEwYtJZ+Z32R459jEgtwVf1u8D7qYwU0l6w==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, "node_modules/anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "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", @@ -917,15 +843,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/array.prototype.flat": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", @@ -972,21 +889,15 @@ } }, "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", + "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/async": { @@ -996,73 +907,194 @@ "dev": true }, "node_modules/ava": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/ava/-/ava-3.15.0.tgz", - "integrity": "sha512-HGAnk1SHPk4Sx6plFAUkzV/XC1j9+iQhOzt4vBly18/yo0AV8Oytx7mtJd/CR8igCJ5p160N/Oo/cNJi2uSeWA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ava/-/ava-5.3.1.tgz", + "integrity": "sha512-Scv9a4gMOXB6+ni4toLuhAm9KYWEjsgBglJl+kMGI5+IVDt120CCDZyB5HNU9DjmLI2t4I0GbnxGLmmRfGTJGg==", "dev": true, "dependencies": { - "@concordance/react": "^2.0.0", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "ansi-styles": "^5.0.0", + "acorn": "^8.8.2", + "acorn-walk": "^8.2.0", + "ansi-styles": "^6.2.1", "arrgv": "^1.0.2", - "arrify": "^2.0.1", - "callsites": "^3.1.0", - "chalk": "^4.1.0", - "chokidar": "^3.4.3", + "arrify": "^3.0.0", + "callsites": "^4.0.0", + "cbor": "^8.1.0", + "chalk": "^5.2.0", + "chokidar": "^3.5.3", "chunkd": "^2.0.1", - "ci-info": "^2.0.0", + "ci-info": "^3.8.0", "ci-parallel-vars": "^1.0.1", "clean-yaml-object": "^0.1.0", - "cli-cursor": "^3.1.0", - "cli-truncate": "^2.1.0", - "code-excerpt": "^3.0.0", + "cli-truncate": "^3.1.0", + "code-excerpt": "^4.0.0", "common-path-prefix": "^3.0.0", - "concordance": "^5.0.1", - "convert-source-map": "^1.7.0", + "concordance": "^5.0.4", "currently-unhandled": "^0.4.1", - "debug": "^4.3.1", - "del": "^6.0.0", - "emittery": "^0.8.0", - "equal-length": "^1.0.0", - "figures": "^3.2.0", - "globby": "^11.0.1", - "ignore-by-default": "^2.0.0", - "import-local": "^3.0.2", - "indent-string": "^4.0.0", + "debug": "^4.3.4", + "emittery": "^1.0.1", + "figures": "^5.0.0", + "globby": "^13.1.4", + "ignore-by-default": "^2.1.0", + "indent-string": "^5.0.0", "is-error": "^2.2.2", "is-plain-object": "^5.0.0", "is-promise": "^4.0.0", - "lodash": "^4.17.20", - "matcher": "^3.0.0", - "md5-hex": "^3.0.1", - "mem": "^8.0.0", + "matcher": "^5.0.0", + "mem": "^9.0.2", "ms": "^2.1.3", - "ora": "^5.2.0", - "p-event": "^4.2.0", - "p-map": "^4.0.0", - "picomatch": "^2.2.2", - "pkg-conf": "^3.1.0", - "plur": "^4.0.0", - "pretty-ms": "^7.0.1", - "read-pkg": "^5.2.0", + "p-event": "^5.0.1", + "p-map": "^5.5.0", + "picomatch": "^2.3.1", + "pkg-conf": "^4.0.0", + "plur": "^5.1.0", + "pretty-ms": "^8.0.0", "resolve-cwd": "^3.0.0", - "slash": "^3.0.0", - "source-map-support": "^0.5.19", - "stack-utils": "^2.0.3", - "strip-ansi": "^6.0.0", - "supertap": "^2.0.0", - "temp-dir": "^2.0.0", - "trim-off-newlines": "^1.0.1", - "update-notifier": "^5.0.1", - "write-file-atomic": "^3.0.3", - "yargs": "^16.2.0" + "stack-utils": "^2.0.6", + "strip-ansi": "^7.0.1", + "supertap": "^3.0.1", + "temp-dir": "^3.0.0", + "write-file-atomic": "^5.0.1", + "yargs": "^17.7.2" }, "bin": { - "ava": "cli.js" + "ava": "entrypoints/cli.mjs" + }, + "engines": { + "node": ">=14.19 <15 || >=16.15 <17 || >=18" + }, + "peerDependencies": { + "@ava/typescript": "*" + }, + "peerDependenciesMeta": { + "@ava/typescript": { + "optional": true + } + } + }, + "node_modules/ava/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/ava/node_modules/callsites": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.1.0.tgz", + "integrity": "sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ava/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ava/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ava/node_modules/cliui/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/ava/node_modules/cliui/node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ava/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ava/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, "engines": { - "node": ">=10.18.0 <11 || >=12.14.0 <12.17.0 || >=12.17.0 <13 || >=14.0.0 <15 || >=15" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ava/node_modules/load-json-file": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", + "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ava/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/ava/node_modules/ms": { @@ -1071,6 +1103,128 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, + "node_modules/ava/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/ava/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ava/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/ava/node_modules/pkg-conf": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz", + "integrity": "sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==", + "dev": true, + "dependencies": { + "find-up": "^6.0.0", + "load-json-file": "^7.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ava/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/ava/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/ava/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/ava/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/ava/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", @@ -1113,12 +1267,15 @@ } }, "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==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/bl": { @@ -1139,45 +1296,11 @@ "dev": true }, "node_modules/blueimp-md5": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.18.0.tgz", - "integrity": "sha512-vE52okJvzsVWhcgUHOv+69OG3Mdg151xyn41aVQN/5W5S+S43qZhxECtYLAEHMSFWX6Mv5IZrzj3T5+JqXfj5Q==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", + "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", "dev": true }, - "node_modules/boxen": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.0.tgz", - "integrity": "sha512-5bvsqw+hhgUi3oYGK0Vf4WpIkyemp60WBInn7+WNfoISzAqk/HX4L7WNROq38E6UR/y3YADpv6pEm4BfkeEAdA==", - "dev": true, - "dependencies": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.0", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/boxen/node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -1277,48 +1400,6 @@ "node": ">=8" } }, - "node_modules/cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "dependencies": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cacheable-request/node_modules/get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/cacheable-request/node_modules/lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", @@ -1356,18 +1437,6 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/catharsis": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", @@ -1380,6 +1449,18 @@ "node": ">= 10" } }, + "node_modules/cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "dependencies": { + "nofilter": "^3.1.0" + }, + "engines": { + "node": ">=12.19" + } + }, "node_modules/chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -1412,24 +1493,27 @@ } }, "node_modules/chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "dependencies": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "glob-parent": "~5.1.0", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" }, "engines": { "node": ">= 8.10.0" }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, "optionalDependencies": { - "fsevents": "~2.3.1" + "fsevents": "~2.3.2" } }, "node_modules/chunkd": { @@ -1439,10 +1523,19 @@ "dev": true }, "node_modules/ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", - "dev": true + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "engines": { + "node": ">=8" + } }, "node_modules/ci-parallel-vars": { "version": "1.0.1", @@ -1468,10 +1561,22 @@ "node": ">=0.10.0" } }, - "node_modules/cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", + "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", "dev": true, "engines": { "node": ">=6" @@ -1480,44 +1585,70 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-cursor": { + "node_modules/cli-truncate": { "version": "3.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", - "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, "dependencies": { - "restore-cursor": "^3.1.0" + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-truncate/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/cli-spinners": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.5.0.tgz", - "integrity": "sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==", + "node_modules/cli-truncate/node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "node_modules/cli-truncate/node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", "dev": true, + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, "engines": { - "node": ">=6" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "node_modules/cli-truncate/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/cliui": { @@ -1540,25 +1671,16 @@ "node": ">=0.8" } }, - "node_modules/clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - } - }, "node_modules/code-excerpt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-3.0.0.tgz", - "integrity": "sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", "dev": true, "dependencies": { - "convert-to-spaces": "^1.0.1" + "convert-to-spaces": "^2.0.1" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/collect-all": { @@ -1723,9 +1845,9 @@ } }, "node_modules/concordance": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.2.tgz", - "integrity": "sha512-hC63FKdGM9tBcd4VQIa+LQjmrgorrnxESb8B3J21Qe/FzL0blBv0pb8iNyymt+bmsvGSUqO0uhPi2ZSLgLtLdg==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", + "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", "dev": true, "dependencies": { "date-time": "^3.1.0", @@ -1742,13 +1864,10 @@ } }, "node_modules/concordance/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", + "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -1774,23 +1893,6 @@ "node": ">=0.10.0" } }, - "node_modules/configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "dependencies": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -1807,12 +1909,12 @@ "dev": true }, "node_modules/convert-to-spaces": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz", - "integrity": "sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", "dev": true, "engines": { - "node": ">= 4" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } }, "node_modules/cross-spawn": { @@ -1829,15 +1931,6 @@ "node": ">= 8" } }, - "node_modules/crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -1863,9 +1956,9 @@ } }, "node_modules/debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "dependencies": { "ms": "2.1.2" @@ -1888,18 +1981,6 @@ "node": ">=0.10.0" } }, - "node_modules/decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "dependencies": { - "mimic-response": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -1945,12 +2026,6 @@ "clone": "^1.0.2" } }, - "node_modules/defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, "node_modules/define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -1967,28 +2042,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "dev": true, - "dependencies": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -2059,22 +2112,10 @@ "node": ">=6.0.0" } }, - "node_modules/dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "dependencies": { - "is-obj": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, "node_modules/ee-first": { @@ -2083,12 +2124,12 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "node_modules/emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.0.3.tgz", + "integrity": "sha512-tJdCJitoy2lrC2ldJcqN4vkqJ00lT+tOWNT1hBJjO/3FDMJa5TTIiYGCKGkn/WfCyOzUMObeohbVTj00fhiLiA==", "dev": true, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sindresorhus/emittery?sponsor=1" @@ -2100,15 +2141,6 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "node_modules/end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "dependencies": { - "once": "^1.4.0" - } - }, "node_modules/entities": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", @@ -2118,15 +2150,6 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, - "node_modules/equal-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/equal-length/-/equal-length-1.0.1.tgz", - "integrity": "sha1-IcoRLUirJLTh5//A5TOdMf38J0w=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -2211,15 +2234,6 @@ "node": ">=6" } }, - "node_modules/escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -2698,23 +2712,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/eslint/node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -2866,26 +2863,25 @@ "dev": true }, "node_modules/fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, "node_modules/fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" }, "engines": { - "node": ">=8" + "node": ">=8.6.0" } }, "node_modules/fast-json-stable-stringify": { @@ -2901,24 +2897,49 @@ "dev": true }, "node_modules/fastq": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz", - "integrity": "sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "dependencies": { "reusify": "^1.0.4" } }, "node_modules/figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", "dev": true, "dependencies": { - "escape-string-regexp": "^1.0.5" + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" }, "engines": { - "node": ">=8" + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/figures/node_modules/is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true, + "engines": { + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3089,9 +3110,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -3176,18 +3197,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "dependencies": { - "pump": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, "node_modules/get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -3236,21 +3245,6 @@ "node": ">= 6" } }, - "node_modules/global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "dependencies": { - "ini": "2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -3261,20 +3255,19 @@ } }, "node_modules/globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "dependencies": { - "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -3286,28 +3279,6 @@ "integrity": "sha512-byR7MBTK4tZ5PZEb+u5ZTzpt4SfrTxv5682MjPlHN16XeqgZE2/8HOIWeiXe8JKnT9OVbtBGhbq8mtvkK8cd5g==", "dev": true }, - "node_modules/got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "dependencies": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - }, - "engines": { - "node": ">=8.6" - } - }, "node_modules/graceful-fs": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", @@ -3404,15 +3375,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", @@ -3444,24 +3406,12 @@ "integrity": "sha512-fBxAarP4g0AFWRKd+SJBWsKmkyw1WZdQZ1jjFSAVrxLXIhEo5NnEBy+rDEM695Z/i4/tP2lMYW6iuotStDFHYw==", "dev": true }, - "node_modules/hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "node_modules/http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, "node_modules/ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -3483,18 +3433,18 @@ ] }, "node_modules/ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true, "engines": { "node": ">= 4" } }, "node_modules/ignore-by-default": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.0.0.tgz", - "integrity": "sha512-+mQSgMRiFD3L3AOxLYOCxjIq4OnAmo5CIuC+lj5ehCJcPtV++QacEV7FdpzvYxH6DaOySWzQU6RR0lPLy37ckA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz", + "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==", "dev": true, "engines": { "node": ">=10 <11 || >=12 <13 || >=14" @@ -3525,31 +3475,6 @@ "node": ">=4" } }, - "node_modules/import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -3584,15 +3509,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, "node_modules/internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -3608,9 +3524,9 @@ } }, "node_modules/irregular-plurals": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.2.0.tgz", - "integrity": "sha512-YqTdPLfwP7YFN0SsD3QUVCkm9ZG2VzOXv3DOrw5G5mkMbVwptTwVcFv7/C0vOpBmgTxAeTG19XpUs1E522LW9Q==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", + "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", "dev": true, "engines": { "node": ">=8" @@ -3686,12 +3602,6 @@ "is-ci": "bin.js" } }, - "node_modules/is-ci/node_modules/ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "dev": true - }, "node_modules/is-core-module": { "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", @@ -3755,22 +3665,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "dependencies": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -3792,18 +3686,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -3820,39 +3702,12 @@ "dev": true, "dependencies": { "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", - "dev": true, + }, "engines": { - "node": ">=8" + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/is-plain-object": { @@ -3976,12 +3831,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -4098,7 +3947,7 @@ "node_modules/js-string-escape": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", "dev": true, "engines": { "node": ">= 0.8" @@ -4252,24 +4101,12 @@ "node": ">=4" } }, - "node_modules/json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4310,15 +4147,6 @@ "node": ">=4.0" } }, - "node_modules/keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "dependencies": { - "json-buffer": "3.0.0" - } - }, "node_modules/klaw": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.0.1.tgz", @@ -4337,18 +4165,6 @@ "node": ">=6" } }, - "node_modules/latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "dependencies": { - "package-json": "^6.3.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -4362,12 +4178,6 @@ "node": ">= 0.8.0" } }, - "node_modules/lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, "node_modules/linkify-it": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", @@ -4485,15 +4295,6 @@ "loose-envify": "cli.js" } }, - "node_modules/lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -4578,24 +4379,27 @@ } }, "node_modules/matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz", + "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", "dev": true, "dependencies": { - "escape-string-regexp": "^4.0.0" + "escape-string-regexp": "^5.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/matcher/node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -4620,28 +4424,31 @@ "dev": true }, "node_modules/mem": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-8.0.0.tgz", - "integrity": "sha512-qrcJOe6uD+EW8Wrci1Vdiua/15Xw3n/QnaNXE7varnB6InxSk7nu3/i5jfy3S6kWxr8WYJ6R1o0afMUtvorTsA==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz", + "integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==", "dev": true, "dependencies": { "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.1.0" + "mimic-fn": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=12.20" }, "funding": { "url": "https://github.com/sindresorhus/mem?sponsor=1" } }, "node_modules/mem/node_modules/mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/merge2": { @@ -4654,16 +4461,16 @@ } }, "node_modules/micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "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.1", - "picomatch": "^2.0.5" + "braces": "^3.0.2", + "picomatch": "^2.3.1" }, "engines": { - "node": ">=8" + "node": ">=8.6" } }, "node_modules/mimic-fn": { @@ -4675,15 +4482,6 @@ "node": ">=6" } }, - "node_modules/mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4750,25 +4548,13 @@ "node": ">=8" } }, - "node_modules/normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "dependencies": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, - "node_modules/normalize-package-data/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "node_modules/nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", "dev": true, - "bin": { - "semver": "bin/semver" + "engines": { + "node": ">=12.19" } }, "node_modules/normalize-path": { @@ -4780,15 +4566,6 @@ "node": ">=0.10.0" } }, - "node_modules/normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/nyc": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", @@ -5117,48 +4894,30 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", "dev": true, "engines": { "node": ">=4" } }, "node_modules/p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", + "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", "dev": true, "dependencies": { - "p-timeout": "^3.1.0" + "p-timeout": "^5.0.2" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -5187,30 +4946,85 @@ } }, "node_modules/p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", "dev": true, "dependencies": { - "aggregate-error": "^3.0.0" + "aggregate-error": "^4.0.0" }, "engines": { - "node": ">=10" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", + "node_modules/p-map/node_modules/aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", "dev": true, "dependencies": { - "p-finally": "^1.0.0" + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map/node_modules/clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "5.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map/node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-timeout": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/p-try": { @@ -5237,21 +5051,6 @@ "node": ">=8" } }, - "node_modules/package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "dependencies": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -5278,12 +5077,15 @@ } }, "node_modules/parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", + "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", "dev": true, "engines": { - "node": ">=6" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/path-exists": { @@ -5329,9 +5131,9 @@ } }, "node_modules/picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true, "engines": { "node": ">=8.6" @@ -5421,15 +5223,15 @@ } }, "node_modules/plur": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", - "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", + "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", "dev": true, "dependencies": { - "irregular-plurals": "^3.2.0" + "irregular-plurals": "^3.3.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5444,25 +5246,16 @@ "node": ">= 0.8.0" } }, - "node_modules/prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/pretty-ms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", + "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", "dev": true, "dependencies": { - "parse-ms": "^2.1.0" + "parse-ms": "^3.0.0" }, "engines": { - "node": ">=10" + "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" @@ -5522,16 +5315,6 @@ "integrity": "sha512-9RTUNjK60eJbx3uz+TEGF7fUr29ZDxR5QzXcyDpeSfeH28S9ycINflOgOlppit5U+4kNTe83KQnMEerw7GmE8w==", "dev": true }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "node_modules/punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", @@ -5541,22 +5324,10 @@ "node": ">=6" } }, - "node_modules/pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "dependencies": { - "escape-goat": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/queue-microtask": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz", - "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true, "funding": [ { @@ -5573,75 +5344,12 @@ } ] }, - "node_modules/rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "dependencies": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "bin": { - "rc": "cli.js" - } - }, - "node_modules/rc/node_modules/ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, - "node_modules/read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "dependencies": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/read-pkg/node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/read-pkg/node_modules/type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -5657,9 +5365,9 @@ } }, "node_modules/readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "dependencies": { "picomatch": "^2.2.1" @@ -5789,30 +5497,6 @@ "url": "https://github.com/sponsors/mysticatea" } }, - "node_modules/registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "dependencies": { - "rc": "^1.2.8" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -5883,15 +5567,6 @@ "node": ">=8" } }, - "node_modules/responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "dependencies": { - "lowercase-keys": "^1.0.0" - } - }, "node_modules/restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -5976,22 +5651,10 @@ "node_modules/semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true, - "dependencies": { - "semver": "^6.3.0" - }, - "engines": { - "node": ">=8" + "bin": { + "semver": "bin/semver.js" } }, "node_modules/serialize-error": { @@ -6063,47 +5726,49 @@ } }, "node_modules/signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "engines": { - "node": ">=8" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" } }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, "engines": { - "node": ">=8" + "node": ">=12" }, "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/snazzy": { @@ -6178,16 +5843,6 @@ "node": ">=0.10.0" } }, - "node_modules/source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "node_modules/spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", @@ -6205,38 +5860,6 @@ "node": ">=8" } }, - "node_modules/spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "dependencies": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "node_modules/spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "dependencies": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "node_modules/spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -6244,9 +5867,9 @@ "dev": true }, "node_modules/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "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" @@ -6463,29 +6086,58 @@ "node": ">=4" } }, - "node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "node_modules/supertap": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", + "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", + "dev": true, + "dependencies": { + "indent-string": "^5.0.0", + "js-yaml": "^3.14.1", + "serialize-error": "^7.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/supertap/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", "dev": true, "engines": { - "node": ">=0.10.0" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" } }, - "node_modules/supertap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supertap/-/supertap-2.0.0.tgz", - "integrity": "sha512-jRzcXlCeDYvKoZGA5oRhYyR3jUIYu0enkSxtmAgHRlD7HwrovTpH4bDSi0py9FtuA8si9cW/fKommJHuaoDHJA==", + "node_modules/supertap/node_modules/indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/supertap/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { - "arrify": "^2.0.1", - "indent-string": "^4.0.0", - "js-yaml": "^3.14.0", - "serialize-error": "^7.0.1", - "strip-ansi": "^6.0.0" + "ansi-regex": "^6.0.1" }, "engines": { - "node": ">=10" + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" } }, "node_modules/supports-color": { @@ -6547,12 +6199,12 @@ "dev": true }, "node_modules/temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=14.16" } }, "node_modules/temp-path": { @@ -6615,7 +6267,7 @@ "node_modules/time-zone": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", - "integrity": "sha1-mcW/VZWJZq9tBtg73zgA3IL67F0=", + "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", "dev": true, "engines": { "node": ">=4" @@ -6639,15 +6291,6 @@ "node": ">=4" } }, - "node_modules/to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -6660,15 +6303,6 @@ "node": ">=8.0" } }, - "node_modules/trim-off-newlines": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.3.tgz", - "integrity": "sha512-kh6Tu6GbeSNMGfrrZh6Bb/4ZEHV1QlB4xNDBeog8Y9/QwFlKTRyWvY3Fs9tRDAMZliVUwieMgEdIeL/FtqjkJg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -6775,73 +6409,6 @@ "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==", "dev": true }, - "node_modules/unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "dependencies": { - "crypto-random-string": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "dependencies": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/yeoman/update-notifier?sponsor=1" - } - }, - "node_modules/update-notifier/node_modules/is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "dependencies": { - "ci-info": "^2.0.0" - }, - "bin": { - "is-ci": "bin.js" - } - }, - "node_modules/update-notifier/node_modules/semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -6851,18 +6418,6 @@ "punycode": "^2.1.0" } }, - "node_modules/url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "dependencies": { - "prepend-http": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -6885,16 +6440,6 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "node_modules/validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "dependencies": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "node_modules/walk-back": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-5.1.0.tgz", @@ -6959,18 +6504,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "node_modules/widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "dependencies": { - "string-width": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -7105,6 +6638,18 @@ "engines": { "node": ">=10" } + }, + "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" + } } }, "dependencies": { @@ -7392,23 +6937,6 @@ "to-fast-properties": "^2.0.0" } }, - "@concordance/react": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@concordance/react/-/react-2.0.0.tgz", - "integrity": "sha512-huLSkUuM2/P+U0uy2WwlKuixMsTODD8p4JVQBI4VKeopkiN0C7M3N9XYVawb4M+4spN5RrO/eLhk7KoQX6nsfA==", - "dev": true, - "requires": { - "arrify": "^1.0.1" - }, - "dependencies": { - "arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", - "dev": true - } - } - }, "@eslint/eslintrc": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.2.2.tgz", @@ -7432,15 +6960,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, "globals": { "version": "13.13.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.13.0.tgz", @@ -7551,28 +7070,28 @@ "integrity": "sha512-yQwAWHDq14uN95QIViP5WY0kMpiGv6nj5+HpJkjz9Um84FeGQYT3VonFVFsuAnBvGrhAFl0IiKKgpFk+hP/tQw==" }, "@nodelib/fs.scandir": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", - "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "requires": { - "@nodelib/fs.stat": "2.0.4", + "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "@nodelib/fs.stat": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", - "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true }, "@nodelib/fs.walk": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", - "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "requires": { - "@nodelib/fs.scandir": "2.1.4", + "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, @@ -7640,21 +7159,6 @@ "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==", "dev": true }, - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", - "dev": true - }, - "@szmarczak/http-timer": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", - "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", - "dev": true, - "requires": { - "defer-to-connect": "^1.0.1" - } - }, "@types/json5": { "version": "0.0.29", "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", @@ -7695,16 +7199,10 @@ "integrity": "sha512-lg55ArB+ZiHHbBBttLpzD07akz0QPrZgUODNakeC09i62dnrywr9mFErHuaPlB6I7z+sEbK+IYmplahvplCj2g==", "dev": true }, - "@types/normalize-package-data": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz", - "integrity": "sha512-f5j5b/Gf71L+dbqxIpQ4Z2WlmI/mPJ0fOkGGmFgtb6sAu97EPczzbS3/tJKxmcYDj55OX6ssqwDAWOHIYDRDGA==", - "dev": true - }, "acorn": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", - "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", "dev": true }, "acorn-jsx": { @@ -7715,9 +7213,9 @@ "requires": {} }, "acorn-walk": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.0.2.tgz", - "integrity": "sha512-+bpA9MJsHdZ4bgfDcpk0ozQyhhVct7rzOmO0s1IIr0AGGgKBljss8n2zp11rRP2wid5VGeh04CgeKzgat5/25A==", + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz", + "integrity": "sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==", "dev": true }, "aggregate-error": { @@ -7742,15 +7240,6 @@ "uri-js": "^4.2.2" } }, - "ansi-align": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", - "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", - "dev": true, - "requires": { - "string-width": "^4.1.0" - } - }, "ansi-escape-sequences": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-4.1.0.tgz", @@ -7775,15 +7264,15 @@ "dev": true }, "ansi-styles": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.1.0.tgz", - "integrity": "sha512-osxifZo3ar56+e8tdYreU6p8FZGciBHo5O0JoDAxMUqZuyNUb+yHEwYtJZ+Z32R459jEgtwVf1u8D7qYwU0l6w==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", "dev": true }, "anymatch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", - "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", "dev": true, "requires": { "normalize-path": "^3.0.0", @@ -7839,12 +7328,6 @@ "is-string": "^1.0.7" } }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true - }, "array.prototype.flat": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz", @@ -7876,15 +7359,9 @@ "dev": true }, "arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true - }, - "astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-3.0.0.tgz", + "integrity": "sha512-tLkvA81vQG/XqE2mjDkGQHoOINtMHtysSnemrmoGe6PydDPMRbVugqyk4A6V/WDWEfm3l+0d8anA9r8cv/5Jaw==", "dev": true }, "async": { @@ -7894,74 +7371,218 @@ "dev": true }, "ava": { - "version": "3.15.0", - "resolved": "https://registry.npmjs.org/ava/-/ava-3.15.0.tgz", - "integrity": "sha512-HGAnk1SHPk4Sx6plFAUkzV/XC1j9+iQhOzt4vBly18/yo0AV8Oytx7mtJd/CR8igCJ5p160N/Oo/cNJi2uSeWA==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ava/-/ava-5.3.1.tgz", + "integrity": "sha512-Scv9a4gMOXB6+ni4toLuhAm9KYWEjsgBglJl+kMGI5+IVDt120CCDZyB5HNU9DjmLI2t4I0GbnxGLmmRfGTJGg==", "dev": true, "requires": { - "@concordance/react": "^2.0.0", - "acorn": "^8.0.4", - "acorn-walk": "^8.0.0", - "ansi-styles": "^5.0.0", + "acorn": "^8.8.2", + "acorn-walk": "^8.2.0", + "ansi-styles": "^6.2.1", "arrgv": "^1.0.2", - "arrify": "^2.0.1", - "callsites": "^3.1.0", - "chalk": "^4.1.0", - "chokidar": "^3.4.3", + "arrify": "^3.0.0", + "callsites": "^4.0.0", + "cbor": "^8.1.0", + "chalk": "^5.2.0", + "chokidar": "^3.5.3", "chunkd": "^2.0.1", - "ci-info": "^2.0.0", + "ci-info": "^3.8.0", "ci-parallel-vars": "^1.0.1", "clean-yaml-object": "^0.1.0", - "cli-cursor": "^3.1.0", - "cli-truncate": "^2.1.0", - "code-excerpt": "^3.0.0", + "cli-truncate": "^3.1.0", + "code-excerpt": "^4.0.0", "common-path-prefix": "^3.0.0", - "concordance": "^5.0.1", - "convert-source-map": "^1.7.0", + "concordance": "^5.0.4", "currently-unhandled": "^0.4.1", - "debug": "^4.3.1", - "del": "^6.0.0", - "emittery": "^0.8.0", - "equal-length": "^1.0.0", - "figures": "^3.2.0", - "globby": "^11.0.1", - "ignore-by-default": "^2.0.0", - "import-local": "^3.0.2", - "indent-string": "^4.0.0", + "debug": "^4.3.4", + "emittery": "^1.0.1", + "figures": "^5.0.0", + "globby": "^13.1.4", + "ignore-by-default": "^2.1.0", + "indent-string": "^5.0.0", "is-error": "^2.2.2", "is-plain-object": "^5.0.0", "is-promise": "^4.0.0", - "lodash": "^4.17.20", - "matcher": "^3.0.0", - "md5-hex": "^3.0.1", - "mem": "^8.0.0", + "matcher": "^5.0.0", + "mem": "^9.0.2", "ms": "^2.1.3", - "ora": "^5.2.0", - "p-event": "^4.2.0", - "p-map": "^4.0.0", - "picomatch": "^2.2.2", - "pkg-conf": "^3.1.0", - "plur": "^4.0.0", - "pretty-ms": "^7.0.1", - "read-pkg": "^5.2.0", + "p-event": "^5.0.1", + "p-map": "^5.5.0", + "picomatch": "^2.3.1", + "pkg-conf": "^4.0.0", + "plur": "^5.1.0", + "pretty-ms": "^8.0.0", "resolve-cwd": "^3.0.0", - "slash": "^3.0.0", - "source-map-support": "^0.5.19", - "stack-utils": "^2.0.3", - "strip-ansi": "^6.0.0", - "supertap": "^2.0.0", - "temp-dir": "^2.0.0", - "trim-off-newlines": "^1.0.1", - "update-notifier": "^5.0.1", - "write-file-atomic": "^3.0.3", - "yargs": "^16.2.0" + "stack-utils": "^2.0.6", + "strip-ansi": "^7.0.1", + "supertap": "^3.0.1", + "temp-dir": "^3.0.0", + "write-file-atomic": "^5.0.1", + "yargs": "^17.7.2" }, "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "callsites": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-4.1.0.tgz", + "integrity": "sha512-aBMbD1Xxay75ViYezwT40aQONfr+pSXTHwNKvIXhXD6+LY3F1dLIcceoC5OZKBVHbXcysz1hL9D2w0JJIMXpUw==", + "dev": true + }, + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + } + } + }, + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, + "indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true + }, + "load-json-file": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-7.0.1.tgz", + "integrity": "sha512-Gnxj3ev3mB5TkVBGad0JM6dmLiQL+o0t23JPBZ9sd+yvSLk05mFoqKBw5N8gbbkU4TNXyqCgIrl/VM17OgUIgQ==", + "dev": true + }, + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true + }, + "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, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "pkg-conf": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-4.0.0.tgz", + "integrity": "sha512-7dmgi4UY4qk+4mj5Cd8v/GExPo0K+SlY+hulOSdfZ/T6jVH6//y7NtzZo5WrfhDBxuQ0jCa7fLZmNaNh7EWL/w==", + "dev": true, + "requires": { + "find-up": "^6.0.0", + "load-json-file": "^7.0.0" + } + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + }, + "write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + } + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true } } }, @@ -7990,9 +7611,9 @@ } }, "binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", "dev": true }, "bl": { @@ -8013,35 +7634,11 @@ "dev": true }, "blueimp-md5": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.18.0.tgz", - "integrity": "sha512-vE52okJvzsVWhcgUHOv+69OG3Mdg151xyn41aVQN/5W5S+S43qZhxECtYLAEHMSFWX6Mv5IZrzj3T5+JqXfj5Q==", + "version": "2.19.0", + "resolved": "https://registry.npmjs.org/blueimp-md5/-/blueimp-md5-2.19.0.tgz", + "integrity": "sha512-DRQrD6gJyy8FbiE4s+bDoXS9hiW3Vbx5uCdwvcCf3zLHL+Iv7LtGHLpr+GZV8rHG8tK766FGYBwRbu8pELTt+w==", "dev": true }, - "boxen": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.0.tgz", - "integrity": "sha512-5bvsqw+hhgUi3oYGK0Vf4WpIkyemp60WBInn7+WNfoISzAqk/HX4L7WNROq38E6UR/y3YADpv6pEm4BfkeEAdA==", - "dev": true, - "requires": { - "ansi-align": "^3.0.0", - "camelcase": "^6.2.0", - "chalk": "^4.1.0", - "cli-boxes": "^2.2.1", - "string-width": "^4.2.0", - "type-fest": "^0.20.2", - "widest-line": "^3.1.0", - "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true - } - } - }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -8116,38 +7713,6 @@ } } }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "dev": true, - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", - "dev": true - } - } - }, "caching-transform": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-4.0.0.tgz", @@ -8176,12 +7741,6 @@ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==", - "dev": true - }, "catharsis": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/catharsis/-/catharsis-0.9.0.tgz", @@ -8191,6 +7750,15 @@ "lodash": "^4.17.15" } }, + "cbor": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/cbor/-/cbor-8.1.0.tgz", + "integrity": "sha512-DwGjNW9omn6EwP70aXsn7FQJx5kO12tX0bZkaTjzdVFM6/7nhA4t0EENocKGx6D2Bch9PE2KzCUf5SceBdeijg==", + "dev": true, + "requires": { + "nofilter": "^3.1.0" + } + }, "chalk": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz", @@ -8213,19 +7781,19 @@ } }, "chokidar": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz", - "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", "dev": true, "requires": { - "anymatch": "~3.1.1", + "anymatch": "~3.1.2", "braces": "~3.0.2", - "fsevents": "~2.3.1", - "glob-parent": "~5.1.0", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", - "readdirp": "~3.5.0" + "readdirp": "~3.6.0" } }, "chunkd": { @@ -8235,9 +7803,9 @@ "dev": true }, "ci-info": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", - "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true }, "ci-parallel-vars": { @@ -8258,12 +7826,6 @@ "integrity": "sha1-Y/sRDcLOGoTcIfbZM0h20BCui2g=", "dev": true }, - "cli-boxes": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", - "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", - "dev": true - }, "cli-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", @@ -8280,13 +7842,47 @@ "dev": true }, "cli-truncate": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", - "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-3.1.0.tgz", + "integrity": "sha512-wfOBkjXteqSnI59oPcJkcPl/ZmwvMMOj340qUIY1SKZCv0B9Cf4D4fAucRkIKQmsIuYK3x1rrgU7MeGRruiuiA==", "dev": true, "requires": { - "slice-ansi": "^3.0.0", - "string-width": "^4.2.0" + "slice-ansi": "^5.0.0", + "string-width": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", + "dev": true + }, + "string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dev": true, + "requires": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + } + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } } }, "cliui": { @@ -8306,22 +7902,13 @@ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", "dev": true }, - "clone-response": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", - "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "code-excerpt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-3.0.0.tgz", - "integrity": "sha512-VHNTVhd7KsLGOqfX3SyeO8RyYPMp1GJOg194VITk04WMYCv4plV68YWe6TJZxd9MhobjtpMRnVky01gqZsalaw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/code-excerpt/-/code-excerpt-4.0.0.tgz", + "integrity": "sha512-xxodCmBen3iy2i0WtAK8FlFNrRzjUqjRsMfho58xT/wvZU1YTM3fCnRjcy1gJPMepaRlgm/0e6w8SpWHpn3/cA==", "dev": true, "requires": { - "convert-to-spaces": "^1.0.1" + "convert-to-spaces": "^2.0.1" } }, "collect-all": { @@ -8459,9 +8046,9 @@ } }, "concordance": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.2.tgz", - "integrity": "sha512-hC63FKdGM9tBcd4VQIa+LQjmrgorrnxESb8B3J21Qe/FzL0blBv0pb8iNyymt+bmsvGSUqO0uhPi2ZSLgLtLdg==", + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/concordance/-/concordance-5.0.4.tgz", + "integrity": "sha512-OAcsnTEYu1ARJqWVGwf4zh4JDfHZEaSNlNccFmt8YjB2l/n19/PF2viLINHc57vO4FKIAFl2FWASIGZZWZ2Kxw==", "dev": true, "requires": { "date-time": "^3.1.0", @@ -8475,13 +8062,10 @@ }, "dependencies": { "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.1.tgz", + "integrity": "sha512-f/vbBsu+fOiYt+lmwZV0rVwJScl46HppnOA1ZvIuBWKOTlllpyJ3bfVax76/OrhCH38dyxoDIA8K7uB963IYgA==", + "dev": true } } }, @@ -8502,20 +8086,6 @@ } } }, - "configstore": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", - "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", - "dev": true, - "requires": { - "dot-prop": "^5.2.0", - "graceful-fs": "^4.1.2", - "make-dir": "^3.0.0", - "unique-string": "^2.0.0", - "write-file-atomic": "^3.0.0", - "xdg-basedir": "^4.0.0" - } - }, "convert-source-map": { "version": "1.7.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", @@ -8534,9 +8104,9 @@ } }, "convert-to-spaces": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-1.0.2.tgz", - "integrity": "sha1-fj5Iu+bZl7FBfdyihoIEtNPYVxU=", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/convert-to-spaces/-/convert-to-spaces-2.0.1.tgz", + "integrity": "sha512-rcQ1bsQO9799wq24uE5AM2tAILy4gXGIK/njFWcVQkGNZ96edlpY+A7bjwvzjYvLDyzmG1MmMLZhpcsb+klNMQ==", "dev": true }, "cross-spawn": { @@ -8550,12 +8120,6 @@ "which": "^2.0.1" } }, - "crypto-random-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", - "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", - "dev": true - }, "currently-unhandled": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", @@ -8575,9 +8139,9 @@ } }, "debug": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", - "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", "dev": true, "requires": { "ms": "2.1.2" @@ -8589,15 +8153,6 @@ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, - "decompress-response": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", - "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", - "dev": true, - "requires": { - "mimic-response": "^1.0.0" - } - }, "deep-extend": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", @@ -8636,12 +8191,6 @@ "clone": "^1.0.2" } }, - "defer-to-connect": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", - "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==", - "dev": true - }, "define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", @@ -8652,22 +8201,6 @@ "object-keys": "^1.1.1" } }, - "del": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", - "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", - "dev": true, - "requires": { - "globby": "^11.0.1", - "graceful-fs": "^4.2.4", - "is-glob": "^4.0.1", - "is-path-cwd": "^2.2.0", - "is-path-inside": "^3.0.2", - "p-map": "^4.0.0", - "rimraf": "^3.0.2", - "slash": "^3.0.0" - } - }, "delegates": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", @@ -8724,19 +8257,10 @@ "esutils": "^2.0.2" } }, - "dot-prop": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", - "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", - "dev": true, - "requires": { - "is-obj": "^2.0.0" - } - }, - "duplexer3": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", - "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", "dev": true }, "ee-first": { @@ -8745,9 +8269,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "emittery": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.8.1.tgz", - "integrity": "sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/emittery/-/emittery-1.0.3.tgz", + "integrity": "sha512-tJdCJitoy2lrC2ldJcqN4vkqJ00lT+tOWNT1hBJjO/3FDMJa5TTIiYGCKGkn/WfCyOzUMObeohbVTj00fhiLiA==", "dev": true }, "emoji-regex": { @@ -8756,27 +8280,12 @@ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "dev": true }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "dev": true, - "requires": { - "once": "^1.4.0" - } - }, "entities": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", "dev": true }, - "equal-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/equal-length/-/equal-length-1.0.1.tgz", - "integrity": "sha1-IcoRLUirJLTh5//A5TOdMf38J0w=", - "dev": true - }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", @@ -8846,12 +8355,6 @@ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, - "escape-goat": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", - "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", - "dev": true - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -8907,15 +8410,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -9306,23 +8800,22 @@ "dev": true }, "fast-diff": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.2.0.tgz", - "integrity": "sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz", + "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==", "dev": true }, "fast-glob": { - "version": "3.2.5", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz", - "integrity": "sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.0", + "glob-parent": "^5.1.2", "merge2": "^1.3.0", - "micromatch": "^4.0.2", - "picomatch": "^2.2.1" + "micromatch": "^4.0.4" } }, "fast-json-stable-stringify": { @@ -9338,21 +8831,36 @@ "dev": true }, "fastq": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.1.tgz", - "integrity": "sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA==", + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", "dev": true, "requires": { "reusify": "^1.0.4" } }, "figures": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", - "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-5.0.0.tgz", + "integrity": "sha512-ej8ksPF4x6e5wvK9yevct0UCXh8TTFlWGVLlgjZuoBH1HwjIfKE/IdL5mq89sFA7zELi1VhKpmtDnrs7zWyeyg==", "dev": true, "requires": { - "escape-string-regexp": "^1.0.5" + "escape-string-regexp": "^5.0.0", + "is-unicode-supported": "^1.2.0" + }, + "dependencies": { + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true + }, + "is-unicode-supported": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-1.3.0.tgz", + "integrity": "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==", + "dev": true + } } }, "file-entry-cache": { @@ -9474,9 +8982,9 @@ "dev": true }, "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "optional": true }, @@ -9533,15 +9041,6 @@ "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", "dev": true }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "dev": true, - "requires": { - "pump": "^3.0.0" - } - }, "get-symbol-description": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", @@ -9575,15 +9074,6 @@ "is-glob": "^4.0.1" } }, - "global-dirs": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", - "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", - "dev": true, - "requires": { - "ini": "2.0.0" - } - }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -9591,17 +9081,16 @@ "dev": true }, "globby": { - "version": "11.0.2", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", - "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "version": "13.2.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-13.2.2.tgz", + "integrity": "sha512-Y1zNGV+pzQdh7H39l9zgB4PJqjRNqydvdYCDG4HFXM4XuvSaQQlEc91IU1yALL8gUTDomgBAfz3XJdmUS+oo0w==", "dev": true, "requires": { - "array-union": "^2.1.0", "dir-glob": "^3.0.1", - "fast-glob": "^3.1.1", - "ignore": "^5.1.4", - "merge2": "^1.3.0", - "slash": "^3.0.0" + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" } }, "google-protobuf": { @@ -9610,25 +9099,6 @@ "integrity": "sha512-byR7MBTK4tZ5PZEb+u5ZTzpt4SfrTxv5682MjPlHN16XeqgZE2/8HOIWeiXe8JKnT9OVbtBGhbq8mtvkK8cd5g==", "dev": true }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "dev": true, - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, "graceful-fs": { "version": "4.2.6", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz", @@ -9693,12 +9163,6 @@ "has-symbols": "^1.0.2" } }, - "has-yarn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", - "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", - "dev": true - }, "hasha": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/hasha/-/hasha-5.2.2.tgz", @@ -9723,24 +9187,12 @@ "integrity": "sha512-fBxAarP4g0AFWRKd+SJBWsKmkyw1WZdQZ1jjFSAVrxLXIhEo5NnEBy+rDEM695Z/i4/tP2lMYW6iuotStDFHYw==", "dev": true }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==", - "dev": true - }, "html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true - }, "ieee754": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", @@ -9748,15 +9200,15 @@ "dev": true }, "ignore": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", - "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", "dev": true }, "ignore-by-default": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.0.0.tgz", - "integrity": "sha512-+mQSgMRiFD3L3AOxLYOCxjIq4OnAmo5CIuC+lj5ehCJcPtV++QacEV7FdpzvYxH6DaOySWzQU6RR0lPLy37ckA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-2.1.0.tgz", + "integrity": "sha512-yiWd4GVmJp0Q6ghmM2B/V3oZGRmjrKLXvHR3TE1nfoXsmoggllfZUQe74EN0fJdPFZu2NIvNdrMMLm3OsV7Ohw==", "dev": true }, "import-fresh": { @@ -9777,22 +9229,6 @@ } } }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", - "dev": true - }, - "import-local": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz", - "integrity": "sha512-vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -9821,12 +9257,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", - "dev": true - }, "internal-slot": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz", @@ -9839,9 +9269,9 @@ } }, "irregular-plurals": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.2.0.tgz", - "integrity": "sha512-YqTdPLfwP7YFN0SsD3QUVCkm9ZG2VzOXv3DOrw5G5mkMbVwptTwVcFv7/C0vOpBmgTxAeTG19XpUs1E522LW9Q==", + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz", + "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==", "dev": true }, "is-arrayish": { @@ -9891,14 +9321,6 @@ "dev": true, "requires": { "ci-info": "^3.2.0" - }, - "dependencies": { - "ci-info": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.2.0.tgz", - "integrity": "sha512-dVqRX7fLUm8J6FgHJ418XuIgDLZDkYcDFTeL6TA2gt5WlIZUQrrH6EZrNClwT/H0FateUsZkGIOPRrLbP+PR9A==", - "dev": true - } } }, "is-core-module": { @@ -9946,16 +9368,6 @@ "is-extglob": "^2.1.1" } }, - "is-installed-globally": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", - "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", - "dev": true, - "requires": { - "global-dirs": "^3.0.0", - "is-path-inside": "^3.0.2" - } - }, "is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -9968,12 +9380,6 @@ "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", "dev": true }, - "is-npm": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", - "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -9989,24 +9395,6 @@ "has-tostringtag": "^1.0.0" } }, - "is-obj": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", - "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", - "dev": true - }, - "is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.2.tgz", - "integrity": "sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==", - "dev": true - }, "is-plain-object": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz", @@ -10089,12 +9477,6 @@ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", "dev": true }, - "is-yarn-global": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", - "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==", - "dev": true - }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -10189,7 +9571,7 @@ "js-string-escape": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz", - "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8=", + "integrity": "sha512-Smw4xcfIQ5LVjAOuJCvN/zIodzA/BBSsluuoSykP+lUvScIi4U6RJLfwHet5cxFnCswUjISV8oAXaqaJDY3chg==", "dev": true }, "js-tokens": { @@ -10306,24 +9688,12 @@ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "dev": true }, - "json-buffer": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", - "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=", - "dev": true - }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", "dev": true }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -10355,15 +9725,6 @@ "object.assign": "^4.1.2" } }, - "keyv": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", - "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", - "dev": true, - "requires": { - "json-buffer": "3.0.0" - } - }, "klaw": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/klaw/-/klaw-4.0.1.tgz", @@ -10376,15 +9737,6 @@ "integrity": "sha512-8QADVssbrFjivHWQU7KkMgptGTl6WAcSdlbBPY4uNF+mWr6DGcKrvY2w4FQJoXch7+fKMjj0dRrL75vk3k23OA==", "dev": true }, - "latest-version": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", - "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", - "dev": true, - "requires": { - "package-json": "^6.3.0" - } - }, "levn": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", @@ -10395,12 +9747,6 @@ "type-check": "~0.4.0" } }, - "lines-and-columns": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", - "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=", - "dev": true - }, "linkify-it": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz", @@ -10503,12 +9849,6 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, - "lowercase-keys": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", - "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", - "dev": true - }, "lru-cache": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", @@ -10571,18 +9911,18 @@ "dev": true }, "matcher": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/matcher/-/matcher-3.0.0.tgz", - "integrity": "sha512-OkeDaAZ/bQCxeFAozM55PKcKU0yJMPGifLwV4Qgjitu+5MoAfSQN4lsLJeXZ1b8w0x+/Emda6MZgXS1jvsapng==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/matcher/-/matcher-5.0.0.tgz", + "integrity": "sha512-s2EMBOWtXFc8dgqvoAzKJXxNHibcdJMV0gwqKUaw9E2JBJuGUK7DrNKrA6g/i+v72TT16+6sVm5mS3thaMLQUw==", "dev": true, "requires": { - "escape-string-regexp": "^4.0.0" + "escape-string-regexp": "^5.0.0" }, "dependencies": { "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", "dev": true } } @@ -10603,19 +9943,19 @@ "dev": true }, "mem": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/mem/-/mem-8.0.0.tgz", - "integrity": "sha512-qrcJOe6uD+EW8Wrci1Vdiua/15Xw3n/QnaNXE7varnB6InxSk7nu3/i5jfy3S6kWxr8WYJ6R1o0afMUtvorTsA==", + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/mem/-/mem-9.0.2.tgz", + "integrity": "sha512-F2t4YIv9XQUBHt6AOJ0y7lSmP1+cY7Fm1DRh9GClTGzKST7UWLMx6ly9WZdLH/G/ppM5RL4MlQfRT71ri9t19A==", "dev": true, "requires": { "map-age-cleaner": "^0.1.3", - "mimic-fn": "^3.1.0" + "mimic-fn": "^4.0.0" }, "dependencies": { "mimic-fn": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", - "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", "dev": true } } @@ -10627,13 +9967,13 @@ "dev": true }, "micromatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", - "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "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.1", - "picomatch": "^2.0.5" + "braces": "^3.0.2", + "picomatch": "^2.3.1" } }, "mimic-fn": { @@ -10642,12 +9982,6 @@ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true }, - "mimic-response": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true - }, "minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -10702,25 +10036,11 @@ "process-on-spawn": "^1.0.0" } }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "dev": true, - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true - } - } + "nofilter": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/nofilter/-/nofilter-3.1.0.tgz", + "integrity": "sha512-l2NNj07e9afPnhAhvgVrCD/oy2Ai1yfLpuo3EpiO1jFTsB4sFz6oIfAfSZyQzVpkZQ9xS8ZS5g1jCBgq4Hwo0g==", + "dev": true }, "normalize-path": { "version": "3.0.0", @@ -10728,12 +10048,6 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "dev": true }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", - "dev": true - }, "nyc": { "version": "15.1.0", "resolved": "https://registry.npmjs.org/nyc/-/nyc-15.1.0.tgz", @@ -10986,33 +10300,21 @@ "wcwidth": "^1.0.1" } }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", - "dev": true - }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", + "integrity": "sha512-wB3wfAxZpk2AzOfUMJNL+d36xothRSyj8EXOa4f6GMqYDN9BJaaSISbsk+wS9abmnebVw95C2Kb5t85UmpCxuw==", "dev": true }, "p-event": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/p-event/-/p-event-4.2.0.tgz", - "integrity": "sha512-KXatOjCRXXkSePPb1Nbi0p0m+gQAwdlbhi4wQKJPI1HsMQS9g+Sqp2o+QHziPr7eYJyOZet836KoHEVM1mwOrQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-5.0.1.tgz", + "integrity": "sha512-dd589iCQ7m1L0bmC5NLlVYfy3TbBEsMUfWx9PyAgPeIcFZ/E2yaTZ4Rz4MiBmmJShviiftHVXOqfnfzJ6kyMrQ==", "dev": true, "requires": { - "p-timeout": "^3.1.0" + "p-timeout": "^5.0.2" } }, - "p-finally": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", - "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", - "dev": true - }, "p-limit": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", @@ -11032,22 +10334,52 @@ } }, "p-map": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", - "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-5.5.0.tgz", + "integrity": "sha512-VFqfGDHlx87K66yZrNdI4YGtD70IRyd+zSvgks6mzHPRNkoKy+9EKP4SFC77/vTTQYmRmti7dvqC+m5jBrBAcg==", "dev": true, "requires": { - "aggregate-error": "^3.0.0" + "aggregate-error": "^4.0.0" + }, + "dependencies": { + "aggregate-error": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-4.0.1.tgz", + "integrity": "sha512-0poP0T7el6Vq3rstR8Mn4V/IQrpBLO6POkUSrN7RhyY+GF/InCFShQzsQ39T25gkHhLgSLByyAz+Kjb+c2L98w==", + "dev": true, + "requires": { + "clean-stack": "^4.0.0", + "indent-string": "^5.0.0" + } + }, + "clean-stack": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-4.2.0.tgz", + "integrity": "sha512-LYv6XPxoyODi36Dp976riBtSY27VmFo+MKqEU9QCCWyTrdEPDog+RWA7xQWHi6Vbp61j5c4cdzzX1NidnwtUWg==", + "dev": true, + "requires": { + "escape-string-regexp": "5.0.0" + } + }, + "escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true + }, + "indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true + } } }, "p-timeout": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-3.2.0.tgz", - "integrity": "sha512-rhIwUycgwwKcP9yTOOFK/AKsAopjjCakVqLHePO3CC6Mir1Z99xT+R63jZxAT5lFZLa2inS5h+ZS2GvR99/FBg==", - "dev": true, - "requires": { - "p-finally": "^1.0.0" - } + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-5.1.0.tgz", + "integrity": "sha512-auFDyzzzGZZZdHz3BtET9VEz0SE/uMEAx7uWfGPucfzEwwe/xH0iVeZibQmANYE/hp9T2+UUZT5m+BKyrDp3Ew==", + "dev": true }, "p-try": { "version": "2.2.0", @@ -11067,18 +10399,6 @@ "release-zalgo": "^1.0.0" } }, - "package-json": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", - "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", - "dev": true, - "requires": { - "got": "^9.6.0", - "registry-auth-token": "^4.0.0", - "registry-url": "^5.0.0", - "semver": "^6.2.0" - } - }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", @@ -11099,9 +10419,9 @@ } }, "parse-ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-2.1.0.tgz", - "integrity": "sha512-kHt7kzLoS9VBZfUsiKjv43mr91ea+U05EyKkEtqp7vNbHxmaVuEqN7XxeEVnGrMtYOAxGrDElSi96K7EgO1zCA==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/parse-ms/-/parse-ms-3.0.0.tgz", + "integrity": "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw==", "dev": true }, "path-exists": { @@ -11135,9 +10455,9 @@ "dev": true }, "picomatch": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", - "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", "dev": true }, "pify": { @@ -11202,12 +10522,12 @@ } }, "plur": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz", - "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/plur/-/plur-5.1.0.tgz", + "integrity": "sha512-VP/72JeXqak2KiOzjgKtQen5y3IZHn+9GOuLDafPv0eXa47xq0At93XahYBs26MsifCQ4enGKwbjBTKgb9QJXg==", "dev": true, "requires": { - "irregular-plurals": "^3.2.0" + "irregular-plurals": "^3.3.0" } }, "prelude-ls": { @@ -11216,19 +10536,13 @@ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", "dev": true }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", - "dev": true - }, "pretty-ms": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-7.0.1.tgz", - "integrity": "sha512-973driJZvxiGOQ5ONsFhOF/DtzPMOMtgC11kCpUrPGMTgqp2q/1gwzCquocrN33is0VZ5GFHXZYMM9l6h67v2Q==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/pretty-ms/-/pretty-ms-8.0.0.tgz", + "integrity": "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q==", "dev": true, "requires": { - "parse-ms": "^2.1.0" + "parse-ms": "^3.0.0" } }, "process-on-spawn": { @@ -11280,95 +10594,24 @@ } } }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "dev": true, - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, - "pupa": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", - "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", - "dev": true, - "requires": { - "escape-goat": "^2.0.0" - } - }, "queue-microtask": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.2.tgz", - "integrity": "sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, - "rc": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", - "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "dev": true, - "requires": { - "deep-extend": "^0.6.0", - "ini": "~1.3.0", - "minimist": "^1.2.0", - "strip-json-comments": "~2.0.1" - }, - "dependencies": { - "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true - } - } - }, "react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, - "read-pkg": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", - "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", - "dev": true, - "requires": { - "@types/normalize-package-data": "^2.4.0", - "normalize-package-data": "^2.5.0", - "parse-json": "^5.0.0", - "type-fest": "^0.6.0" - }, - "dependencies": { - "parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - } - }, - "type-fest": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", - "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", - "dev": true - } - } - }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -11381,9 +10624,9 @@ } }, "readdirp": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", - "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", "dev": true, "requires": { "picomatch": "^2.2.1" @@ -11478,24 +10721,6 @@ "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", "dev": true }, - "registry-auth-token": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", - "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, - "registry-url": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", - "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", - "dev": true, - "requires": { - "rc": "^1.2.8" - } - }, "release-zalgo": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz", @@ -11551,15 +10776,6 @@ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true }, - "responselike": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", - "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", - "dev": true, - "requires": { - "lowercase-keys": "^1.0.0" - } - }, "restore-cursor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", @@ -11606,15 +10822,6 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, - "semver-diff": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", - "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", - "dev": true, - "requires": { - "semver": "^6.3.0" - } - }, "serialize-error": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-7.0.1.tgz", @@ -11665,36 +10872,32 @@ } }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", "dev": true }, "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", "dev": true }, "slice-ansi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", - "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", + "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", "dev": true, "requires": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" + "ansi-styles": "^6.0.0", + "is-fullwidth-code-point": "^4.0.0" }, "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "requires": { - "color-convert": "^2.0.1" - } + "is-fullwidth-code-point": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", + "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", + "dev": true } } }, @@ -11743,16 +10946,6 @@ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true }, - "source-map-support": { - "version": "0.5.19", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", - "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", - "dev": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, "spawn-wrap": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-2.0.0.tgz", @@ -11767,38 +10960,6 @@ "which": "^2.0.1" } }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "dev": true, - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==", - "dev": true - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "dev": true, - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==", - "dev": true - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -11806,9 +10967,9 @@ "dev": true }, "stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-gL//fkxfWUsIlFL2Tl42Cl6+HFALEaB1FU76I/Fy+oZjRreP7OPMXFlGbxM7NQsI0ZpUfw76sHnv0WNYuTb7Iw==", + "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" @@ -11956,23 +11117,39 @@ "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, - "strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", - "dev": true - }, "supertap": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supertap/-/supertap-2.0.0.tgz", - "integrity": "sha512-jRzcXlCeDYvKoZGA5oRhYyR3jUIYu0enkSxtmAgHRlD7HwrovTpH4bDSi0py9FtuA8si9cW/fKommJHuaoDHJA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/supertap/-/supertap-3.0.1.tgz", + "integrity": "sha512-u1ZpIBCawJnO+0QePsEiOknOfCRq0yERxiAchT0i4li0WHNUJbf0evXXSXOcCAR4M8iMDoajXYmstm/qO81Isw==", "dev": true, "requires": { - "arrify": "^2.0.1", - "indent-string": "^4.0.0", - "js-yaml": "^3.14.0", + "indent-string": "^5.0.0", + "js-yaml": "^3.14.1", "serialize-error": "^7.0.1", - "strip-ansi": "^6.0.0" + "strip-ansi": "^7.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "indent-string": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-5.0.0.tgz", + "integrity": "sha512-m6FAo/spmsW2Ab2fU35JTYwtOKa2yAwXSwgjSv1TJzh4Mh7mC3lzAOVLBprb72XsTrgkEIsl7YrFNAiDiRhIGg==", + "dev": true + }, + "strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } } }, "supports-color": { @@ -12021,9 +11198,9 @@ "dev": true }, "temp-dir": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-2.0.0.tgz", - "integrity": "sha512-aoBAniQmmwtcKp/7BzsH8Cxzv8OL736p7v1ihGb5e9DJ9kTwGWHrQrVB5+lfVDzfGrdRzXch+ig7LHaY1JTOrg==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-3.0.0.tgz", + "integrity": "sha512-nHc6S/bwIilKHNRgK/3jlhDoIHcp45YgyiwcAk46Tr0LfEqGBVpmiAyuiuxeVE44m3mXnEeVhaipLOEWmH+Njw==", "dev": true }, "temp-path": { @@ -12079,7 +11256,7 @@ "time-zone": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/time-zone/-/time-zone-1.0.0.tgz", - "integrity": "sha1-mcW/VZWJZq9tBtg73zgA3IL67F0=", + "integrity": "sha512-TIsDdtKo6+XrPtiTm1ssmMngN1sAhyKnTO2kunQWqNPWIVvCm15Wmw4SWInwTVgJ5u/Tr04+8Ei9TNcw4x4ONA==", "dev": true }, "tiny-human-time": { @@ -12094,12 +11271,6 @@ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", "dev": true }, - "to-readable-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", - "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -12109,12 +11280,6 @@ "is-number": "^7.0.0" } }, - "trim-off-newlines": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.3.tgz", - "integrity": "sha512-kh6Tu6GbeSNMGfrrZh6Bb/4ZEHV1QlB4xNDBeog8Y9/QwFlKTRyWvY3Fs9tRDAMZliVUwieMgEdIeL/FtqjkJg==", - "dev": true - }, "tsconfig-paths": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", @@ -12205,57 +11370,6 @@ "integrity": "sha512-ekY1NhRzq0B08g4bGuX4wd2jZx5GnKz6mKSqFL4nqBlfyMGiG10gDFhDTMEfYmDL6Jy0FUIZp7wiRB+0BP7J2g==", "dev": true }, - "unique-string": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", - "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", - "dev": true, - "requires": { - "crypto-random-string": "^2.0.0" - } - }, - "update-notifier": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", - "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", - "dev": true, - "requires": { - "boxen": "^5.0.0", - "chalk": "^4.1.0", - "configstore": "^5.0.1", - "has-yarn": "^2.1.0", - "import-lazy": "^2.1.0", - "is-ci": "^2.0.0", - "is-installed-globally": "^0.4.0", - "is-npm": "^5.0.0", - "is-yarn-global": "^0.3.0", - "latest-version": "^5.1.0", - "pupa": "^2.1.1", - "semver": "^7.3.4", - "semver-diff": "^3.1.1", - "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "is-ci": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", - "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", - "dev": true, - "requires": { - "ci-info": "^2.0.0" - } - }, - "semver": { - "version": "7.3.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", - "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - } - } - }, "uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -12265,15 +11379,6 @@ "punycode": "^2.1.0" } }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "dev": true, - "requires": { - "prepend-http": "^2.0.0" - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -12292,16 +11397,6 @@ "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", "dev": true }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "dev": true, - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "walk-back": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/walk-back/-/walk-back-5.1.0.tgz", @@ -12351,15 +11446,6 @@ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, - "widest-line": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", - "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", - "dev": true, - "requires": { - "string-width": "^4.0.0" - } - }, "word-wrap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", @@ -12466,6 +11552,12 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.5.tgz", "integrity": "sha512-jYRGS3zWy20NtDtK2kBgo/TlAoy5YUuhD9/LZ7z7W4j1Fdw2cqD0xEEclf8fxc8xjD6X5Qr+qQQwCEsP8iRiYg==", "dev": true + }, + "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 } } } diff --git a/package.json b/package.json index f10bef0..761927a 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "@grpc/grpc-js": "^1.6.10", "@grpc/proto-loader": "^0.7.0", "async": "^3.2.4", - "ava": "^3.15.0", + "ava": "^5.3.1", "benchmarkify": "^3.0.0", "google-protobuf": "^3.21.0", "highland": "3.0.0-beta.10", @@ -86,7 +86,9 @@ "ava": { "files": [ "test/*.test.js" - ] + ], + "concurrency": 1, + "serial": true }, "types": "index.d.ts", "nyc": { @@ -98,4 +100,4 @@ "access": "public", "tag": "latest" } -} \ No newline at end of file +} diff --git a/test/app.context.test.js b/test/app.context.test.js index 7e03e3d..64e6e24 100644 --- a/test/app.context.test.js +++ b/test/app.context.test.js @@ -1,5 +1,6 @@ const test = require('ava') const path = require('path') +const { finished } = require('stream/promises') const grpc = require('@grpc/grpc-js') const CallType = require('@malijs/call-types') const hl = require('highland') @@ -52,37 +53,47 @@ test.before('should merge properties', async t => { t.truthy(server2) }) -test.cb('should merge properties', t => { - t.plan(4) +test('should merge properties', async t => { + t.plan(3) const pd = pl.loadSync(PROTO_PATH) const helloproto = grpc.loadPackageDefinition(pd).helloworld const client = new helloproto.Greeter(APP1_HOST, grpc.credentials.createInsecure()) - client.sayHello({ name: 'Bob' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.truthy(response.message) - t.is(response.message, 'app1 msg') - t.end() + const response = await new Promise((resolve, reject) => { + client.sayHello({ name: 'Bob' }, (err, response) => { + if (err) { + return reject(err) + } + + resolve(response) + }) }) + t.truthy(response) + t.truthy(response.message) + t.is(response.message, 'app1 msg') }) -test.cb('should not affect the original prototype', t => { - t.plan(3) +test('should not affect the original prototype', async t => { + t.plan(2) const pd = pl.loadSync(PROTO_PATH) const helloproto = grpc.loadPackageDefinition(pd).helloworld const client = new helloproto.Greeter(APP2_HOST, grpc.credentials.createInsecure()) - client.sayHello({ name: 'Bob' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.falsy(response.message) - t.end() + const response = await new Promise((resolve, reject) => { + client.sayHello({ name: 'Bob' }, (err, response) => { + if (err) { + return reject(err) + } + + resolve(response) + }) }) + t.truthy(response) + t.falsy(response.message) }) -test.cb('should have correct properties for req / res', t => { - t.plan(20) +test('should have correct properties for req / res', async t => { + t.plan(19) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/helloworld.proto') @@ -108,23 +119,29 @@ test.cb('should have correct properties for req / res', t => { const app = new Mali(PROTO_PATH, 'Greeter') t.truthy(app) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = app.start(APP_HOST) + t.truthy(server) - const pd = pl.loadSync(PROTO_PATH) - const helloproto = grpc.loadPackageDefinition(pd).helloworld - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const pd = pl.loadSync(PROTO_PATH) + const helloproto = grpc.loadPackageDefinition(pd).helloworld + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => { client.sayHello({ name: 'Bob' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Bob') - app.close().then(() => t.end()) + if (err) { + return reject(err) + } + + resolve(response) }) }) + t.truthy(response) + t.is(response.message, 'Hello Bob') + + await app.close() }) -test.cb('should have correct properties for req / res with proto', t => { - t.plan(20) +test('should have correct properties for req / res with proto', async t => { + t.plan(19) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/helloworld.proto') @@ -155,22 +172,28 @@ test.cb('should have correct properties for req / res with proto', t => { const app = new Mali(services) t.truthy(app) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = app.start(APP_HOST) + t.truthy(server) - const pd = pl.loadSync(PROTO_PATH) - const helloproto = grpc.loadPackageDefinition(pd).helloworld - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const pd = pl.loadSync(PROTO_PATH) + const helloproto = grpc.loadPackageDefinition(pd).helloworld + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => { client.sayHello({ name: 'Bob' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Bob') - app.close().then(() => t.end()) + if (err) { + return reject(err) + } + + resolve(response) }) }) + t.truthy(response) + t.is(response.message, 'Hello Bob') + + await app.close() }) -test.cb('should have correct properties res stream request', t => { +test('should have correct properties res stream request', async t => { t.plan(18) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/resstream.proto') @@ -202,34 +225,28 @@ test.cb('should have correct properties res stream request', t => { const app = new Mali(PROTO_PATH, 'ArgService') t.truthy(app) app.use({ listStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = app.start(APP_HOST) + t.truthy(server) + + const pd = pl.loadSync(PROTO_PATH) + const proto = grpc.loadPackageDefinition(pd).argservice + const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.listStuff({ message: 'Hello' }) - const pd = pl.loadSync(PROTO_PATH) - const proto = grpc.loadPackageDefinition(pd).argservice - const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.listStuff({ message: 'Hello' }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + await finished(call) - call.on('end', () => { - _.delay(() => { - endTest() - }, 200) - }) + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - app.close().then(() => t.end()) - } - }) + await app.close() }) -test.cb('should have correct properties for req stream', t => { - t.plan(21) +test('should have correct properties for req stream', async t => { + t.plan(20) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/reqstream.proto') @@ -272,18 +289,21 @@ test.cb('should have correct properties for req stream', t => { const app = new Mali(PROTO_PATH, 'ArgService') t.truthy(app) app.use({ writeStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - const pd = pl.loadSync(PROTO_PATH) - const proto = grpc.loadPackageDefinition(pd).argservice - const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.writeStuff((err, res) => { - t.falsy(err) - t.truthy(res) - t.truthy(res.message) - t.is(res.message, '1 FOO:2 BAR:3 ASD:4 QWE:5 RTY:6 ZXC') - app.close().then(() => t.end()) + const server = app.start(APP_HOST) + t.truthy(server) + + const pd = pl.loadSync(PROTO_PATH) + const proto = grpc.loadPackageDefinition(pd).argservice + + let call + const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const res = await new Promise((resolve, reject) => { + call = client.writeStuff((err, res) => { + if (err) { + return reject(err) + } + + resolve(res) }) async.eachSeries(ARRAY_DATA, (d, asfn) => { @@ -293,9 +313,17 @@ test.cb('should have correct properties for req stream', t => { call.end() }) }) + + await finished(call) + + t.truthy(res) + t.truthy(res.message) + t.is(res.message, '1 FOO:2 BAR:3 ASD:4 QWE:5 RTY:6 ZXC') + + await app.close() }) -test.cb('should have correct properties for duplex call', t => { +test('should have correct properties for duplex call', async t => { t.plan(19) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/duplex.proto') @@ -340,39 +368,35 @@ test.cb('should have correct properties for duplex call', t => { t.truthy(app) app.use({ processStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = app.start(APP_HOST) + t.truthy(server) - const pd = pl.loadSync(PROTO_PATH) - const proto = grpc.loadPackageDefinition(pd).argservice - const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.processStuff() + const pd = pl.loadSync(PROTO_PATH) + const proto = grpc.loadPackageDefinition(pd).argservice + const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.processStuff() - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('end', () => { - endTest() - }) + async.eachSeries(ARRAY_DATA, (d, asfn) => { + call.write(d) + _.delay(asfn, _.random(10, 50)) + }, () => { + call.end() + }) - async.eachSeries(ARRAY_DATA, (d, asfn) => { - call.write(d) - _.delay(asfn, _.random(10, 50)) - }, () => { - call.end() - }) + await finished(call) - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - app.close().then(() => t.end()) - } - }) + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + + await app.close() }) -test.cb('should reset locals in context req / res', t => { - t.plan(14) +test('should reset locals in context req / res', async t => { + t.plan(12) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/helloworld.proto') @@ -389,26 +413,37 @@ test.cb('should reset locals in context req / res', t => { const app = new Mali(PROTO_PATH, 'Greeter') t.truthy(app) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = app.start(APP_HOST) + t.truthy(server) - const pd = pl.loadSync(PROTO_PATH) - const helloproto = grpc.loadPackageDefinition(pd).helloworld - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const pd = pl.loadSync(PROTO_PATH) + const helloproto = grpc.loadPackageDefinition(pd).helloworld + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const response1 = await new Promise((resolve, reject) => { client.sayHello({ name: 'Bob' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Bob') + if (err) { + return reject(err) + } - client.sayHello({ name: 'Kate' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Kate') + resolve(response) + }) + }) + t.truthy(response1) + t.is(response1.message, 'Hello Bob') - app.close().then(() => t.end()) - }) + const response2 = await new Promise((resolve, reject) => { + client.sayHello({ name: 'Kate' }, (err, response) => { + if (err) { + return reject(err) + } + + resolve(response) }) }) + t.truthy(response2) + t.is(response2.message, 'Hello Kate') + + await app.close() }) test.after.always('cleanup', async t => { diff --git a/test/app.test.js b/test/app.test.js index 268b211..6a730fd 100644 --- a/test/app.test.js +++ b/test/app.test.js @@ -1,5 +1,7 @@ const test = require('ava') const path = require('path') +const { setTimeout: sleep } = require('timers/promises') +const { finished } = require('stream/promises') const grpc = require('@grpc/grpc-js') const hl = require('highland') const async = require('async') @@ -24,7 +26,7 @@ function getArrayData () { return _.cloneDeep(ARRAY_DATA) } -test('should set development env when NODE_ENV missing', t => { +test('should set development env when NODE_ENV missing', async t => { const PROTO_PATH = path.resolve(__dirname, './protos/helloworld.proto') const NODE_ENV = process.env.NODE_ENV process.env.NODE_ENV = '' @@ -35,7 +37,7 @@ test('should set development env when NODE_ENV missing', t => { t.is(app.env, 'development') }) -test('app.inspect should return app properties', t => { +test('app.inspect should return app properties', async t => { const util = require('util') const NODE_ENV = process.env.NODE_ENV process.env.NODE_ENV = '' @@ -190,11 +192,10 @@ test('app.start() with port param and invalid creds', async t => { await app.close() }) -test.cb('app.start() should throw when binding to taken port', t => { +test('app.start() should throw when binding to taken port', async t => { // workround for https://github.com/travis-ci/travis-ci/issues/9918 if (isCI) { t.pass() - t.end() return } @@ -207,23 +208,24 @@ test.cb('app.start() should throw when binding to taken port', t => { const port = tu.getHost() app.use({ sayHello }) - app.start(port).then(server => { - t.truthy(server) + const server = await app.start(port) + t.truthy(server) - const app2 = new Mali({ file: 'protos/multipkg.proto', root: __dirname }) - app2.use({ sayHello }) + const app2 = new Mali({ file: 'protos/multipkg.proto', root: __dirname }) + app2.use({ sayHello }) - app2.start(`0.0.0.0:${app.ports[0]}`).catch(error => { - console.log(error) - t.true(error instanceof Error) - t.is(error.message, 'No address added out of total 1 resolved') - app.close().then(() => t.end()) - }) - }) + try { + await app2.start(`0.0.0.0:${app.ports[0]}`) + } catch (error) { + console.log(error) + t.true(error instanceof Error) + t.is(error.message, 'No address added out of total 1 resolved') + } + await app.close() }) -test.cb('should handle req/res request', t => { - t.plan(5) +test('should handle req/res request', async t => { + t.plan(4) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/helloworld.proto') @@ -234,23 +236,27 @@ test.cb('should handle req/res request', t => { const app = new Mali(PROTO_PATH, 'Greeter') t.truthy(app) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - const pd = pl.loadSync(PROTO_PATH) - const helloproto = grpc.loadPackageDefinition(pd).helloworld - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const pd = pl.loadSync(PROTO_PATH) + const helloproto = grpc.loadPackageDefinition(pd).helloworld + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => client.sayHello({ name: 'Bob' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Bob') - app.close().then(() => t.end()) + if (err) { + return reject(err) + } + resolve(response) }) - }) + ) + t.truthy(response) + t.is(response.message, 'Hello Bob') + await app.close() }) -test.cb('should handle multiple protos request', t => { - t.plan(5) +test('should handle multiple protos request', async t => { + t.plan(4) const APP_HOST = tu.getHost() const PROTO_ROOT_FOLDER = path.resolve(__dirname, './protos') const PROTO_ROOT_MULTIPLE = path.resolve(__dirname, './protosmultiple') @@ -264,23 +270,27 @@ test.cb('should handle multiple protos request', t => { t.truthy(app) app.addService({ root: [PROTO_ROOT_MULTIPLE, PROTO_ROOT_FOLDER], file: 'helloworld.proto' }, 'helloworld.Greeter') app.use('helloworld.Greeter', 'SayHello', sayHello) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - const pd = pl.loadSync(PROTO_PATH) - const helloproto = grpc.loadPackageDefinition(pd).helloworld - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const pd = pl.loadSync(PROTO_PATH) + const helloproto = grpc.loadPackageDefinition(pd).helloworld + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => client.sayHello({ name: 'Bob' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Bob') - app.close().then(() => t.end()) + if (err) { + return reject(err) + } + resolve(response) }) - }) + ) + t.truthy(response) + t.is(response.message, 'Hello Bob') + await app.close() }) -test.cb('should handle multiple protos with second folder definitions request', t => { - t.plan(5) +test('should handle multiple protos with second folder definitions request', async t => { + t.plan(4) const APP_HOST = tu.getHost() const PROTO_ROOT_FOLDER = path.resolve(__dirname, './protos') const PROTO_ROOT_MULTIPLE = path.resolve(__dirname, './protosmultiple') @@ -294,23 +304,27 @@ test.cb('should handle multiple protos with second folder definitions request', t.truthy(app) app.addService({ root: [PROTO_ROOT_MULTIPLE, PROTO_ROOT_FOLDER], file: 'hellomultiple.proto' }, 'multiple.hello.GreeterMultiple') app.use('multiple.hello.GreeterMultiple', 'SayMultiple', sayMultiple) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - const pd = pl.loadSync(PROTO_PATH) - const helloproto = grpc.loadPackageDefinition(pd).multiple.hello - const client = new helloproto.GreeterMultiple(APP_HOST, grpc.credentials.createInsecure()) + const pd = pl.loadSync(PROTO_PATH) + const helloproto = grpc.loadPackageDefinition(pd).multiple.hello + const client = new helloproto.GreeterMultiple(APP_HOST, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => client.sayMultiple({ name: 'Bob' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Multiple Bob') - app.close().then(() => t.end()) + if (err) { + return reject(err) + } + resolve(response) }) - }) + ) + t.truthy(response) + t.is(response.message, 'Hello Multiple Bob') + await app.close() }) -test.cb('should handle req/res request where res is a promise', t => { - t.plan(5) +test('should handle req/res request where res is a promise', async t => { + t.plan(4) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/helloworld.proto') @@ -325,22 +339,26 @@ test.cb('should handle req/res request where res is a promise', t => { const app = new Mali(PROTO_PATH, 'Greeter') t.truthy(app) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - const pd = pl.loadSync(PROTO_PATH) - const helloproto = grpc.loadPackageDefinition(pd).helloworld - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const pd = pl.loadSync(PROTO_PATH) + const helloproto = grpc.loadPackageDefinition(pd).helloworld + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => client.sayHello({ name: 'Jim' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Jim') - app.close().then(() => t.end()) + if (err) { + return reject(err) + } + resolve(response) }) - }) + ) + t.truthy(response) + t.is(response.message, 'Hello Jim') + await app.close() }) -test.cb('should handle res stream request', t => { +test('should handle res stream request', async t => { t.plan(3) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/resstream.proto') @@ -356,34 +374,27 @@ test.cb('should handle res stream request', t => { const app = new Mali(PROTO_PATH, 'ArgService') t.truthy(app) app.use({ listStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - const pd = pl.loadSync(PROTO_PATH) - const proto = grpc.loadPackageDefinition(pd).argservice - const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.listStuff({ message: 'Hello' }) + const pd = pl.loadSync(PROTO_PATH) + const proto = grpc.loadPackageDefinition(pd).argservice + const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.listStuff({ message: 'Hello' }) - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('end', () => { - _.delay(() => { - endTest() - }, 200) - }) + await finished(call) - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - app.close().then(() => t.end()) - } - }) + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + await app.close() }) -test.cb('should handle req stream app', t => { - t.plan(6) +test('should handle req stream app', async t => { + t.plan(5) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/reqstream.proto') @@ -413,18 +424,20 @@ test.cb('should handle req stream app', t => { const app = new Mali(PROTO_PATH, 'ArgService') t.truthy(app) app.use({ writeStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - const pd = pl.loadSync(PROTO_PATH) - const proto = grpc.loadPackageDefinition(pd).argservice - const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.writeStuff((err, res) => { - t.falsy(err) - t.truthy(res) - t.truthy(res.message) - t.is(res.message, '1 FOO:2 BAR:3 ASD:4 QWE:5 RTY:6 ZXC') - app.close().then(() => t.end()) + const server = await app.start(APP_HOST) + t.truthy(server) + + const pd = pl.loadSync(PROTO_PATH) + const proto = grpc.loadPackageDefinition(pd).argservice + const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + let call + const res = await new Promise((resolve, reject) => { + call = client.writeStuff((err, response) => { + if (err) { + return reject(err) + } + + resolve(response) }) async.eachSeries(getArrayData(), (d, asfn) => { @@ -434,9 +447,17 @@ test.cb('should handle req stream app', t => { call.end() }) }) + + await finished(call) + + t.truthy(res) + t.truthy(res.message) + t.is(res.message, '1 FOO:2 BAR:3 ASD:4 QWE:5 RTY:6 ZXC') + + await app.close() }) -test.cb('should handle duplex call', t => { +test('should handle duplex call', async t => { t.plan(3) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/duplex.proto') @@ -463,39 +484,32 @@ test.cb('should handle duplex call', t => { t.truthy(app) app.use({ processStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - const pd = pl.loadSync(PROTO_PATH) - const proto = grpc.loadPackageDefinition(pd).argservice - const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.processStuff() + const server = await app.start(APP_HOST) + t.truthy(server) - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + const pd = pl.loadSync(PROTO_PATH) + const proto = grpc.loadPackageDefinition(pd).argservice + const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.processStuff() - call.on('end', () => { - endTest() - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - async.eachSeries(getArrayData(), (d, asfn) => { - call.write(d) - _.delay(asfn, _.random(10, 50)) - }, () => { - call.end() - }) + for await (const d of getArrayData()) { + await sleep(_.random(10, 50)) + call.write(d) + } + call.end() + await finished(call) - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - app.close().then(() => t.end()) - } - }) + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + await app.close() }) -test.cb('should start multipe servers from same application and handle requests', t => { - t.plan(11) +test('should start multipe servers from same application and handle requests', async t => { + t.plan(10) const APP_HOST1 = tu.getHost() const APP_HOST2 = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/helloworld.proto') @@ -507,36 +521,34 @@ test.cb('should start multipe servers from same application and handle requests' const app = new Mali(PROTO_PATH, 'Greeter') t.truthy(app) app.use({ sayHello }) - app.start(APP_HOST1).then(server1 => { - app.start(APP_HOST2).then(server2 => { - t.truthy(server1) - t.truthy(server2) - t.truthy(Array.isArray(app.servers)) - t.is(app.servers.length, 2) - t.is(app.ports.length, 2) - - const pd = pl.loadSync(PROTO_PATH) - const helloproto = grpc.loadPackageDefinition(pd).helloworld - const client = new helloproto.Greeter(APP_HOST1, grpc.credentials.createInsecure()) - const client2 = new helloproto.Greeter(APP_HOST2, grpc.credentials.createInsecure()) - - async.parallel({ - req1: aecb => client.sayHello({ name: 'Bob' }, aecb), - req2: aecb => client2.sayHello({ name: 'Kate' }, aecb) - }, (err, results) => { - t.falsy(err) - t.truthy(results.req1) - t.is(results.req1.message, 'Hello Bob') - t.truthy(results.req2) - t.is(results.req2.message, 'Hello Kate') - app.close().then(() => t.end()) - }) - }) + const server1 = await app.start(APP_HOST1) + const server2 = await app.start(APP_HOST2) + t.truthy(server1) + t.truthy(server2) + t.truthy(Array.isArray(app.servers)) + t.is(app.servers.length, 2) + t.is(app.ports.length, 2) + + const pd = pl.loadSync(PROTO_PATH) + const helloproto = grpc.loadPackageDefinition(pd).helloworld + const client = new helloproto.Greeter(APP_HOST1, grpc.credentials.createInsecure()) + const client2 = new helloproto.Greeter(APP_HOST2, grpc.credentials.createInsecure()) + + const results = await async.parallel({ + req1: aecb => client.sayHello({ name: 'Bob' }, aecb), + req2: aecb => client2.sayHello({ name: 'Kate' }, aecb) }) + + t.truthy(results.req1) + t.is(results.req1.message, 'Hello Bob') + t.truthy(results.req2) + t.is(results.req2.message, 'Hello Kate') + + await app.close() }) -test.cb('should work with multi package proto', t => { - t.plan(4) +test('should work with multi package proto', async t => { + t.plan(3) function sayHello (ctx) { ctx.res = { message: `Hello ${ctx.req.name}!` } } @@ -545,17 +557,21 @@ test.cb('should work with multi package proto', t => { const port = tu.getHost() app.use({ sayHello }) - app.start(port).then(server => { - t.truthy(server) + const server = await app.start(port) + t.truthy(server) - const pd = pl.loadSync('protos/multipkg.proto', { includeDirs: [__dirname] }) - const greet = grpc.loadPackageDefinition(pd).greet - const client = new greet.Greeter(port, grpc.credentials.createInsecure()) + const pd = pl.loadSync('protos/multipkg.proto', { includeDirs: [__dirname] }) + const greet = grpc.loadPackageDefinition(pd).greet + const client = new greet.Greeter(port, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => client.sayHello({ name: 'Kate' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Kate!') - app.close().then(() => t.end()) + if (err) { + return reject(err) + } + resolve(response) }) - }) + ) + t.truthy(response) + t.is(response.message, 'Hello Kate!') + await app.close() }) diff --git a/test/errors.test.js b/test/errors.test.js index 6894582..9d519f5 100644 --- a/test/errors.test.js +++ b/test/errors.test.js @@ -1,5 +1,6 @@ const test = require('ava') const path = require('path') +const { finished } = require('stream/promises') const grpc = require('@grpc/grpc-js') const hl = require('highland') const async = require('async') @@ -38,8 +39,8 @@ function crashMapper (d) { } } -test.cb('should handle an error in the handler in req/res app', t => { - t.plan(11) +test('should handle an error in the handler in req/res app', async t => { + t.plan(10) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/helloworld.proto') @@ -58,29 +59,40 @@ test.cb('should handle an error in the handler in req/res app', t => { }) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - const pd = pl.loadSync(PROTO_PATH) - const helloproto = grpc.loadPackageDefinition(pd).helloworld - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) - client.sayHello({ name: 'Bob' }, (err, response) => { - t.truthy(err) - t.true(err.message.indexOf('boom') >= 0) - t.falsy(response) - t.is(errMsg, 'boom') - t.truthy(errCtx) - t.truthy(errCtx.call) - t.truthy(errCtx.req) - t.is(errCtx.name, 'SayHello') - t.is(errCtx.type, CallType.UNARY) - app.close().then(() => t.end()) + const server = await app.start(APP_HOST) + t.truthy(server) + + const pd = pl.loadSync(PROTO_PATH) + const helloproto = grpc.loadPackageDefinition(pd).helloworld + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + let error + try { + await new Promise((resolve, reject) => { + client.sayHello({ name: 'Bob' }, (err, response) => { + if (err) { + return reject(err) + } + + resolve(response) + }) }) - }) + } catch (err) { + error = err + } + t.truthy(error) + t.true(error.message.indexOf('boom') >= 0) + t.is(errMsg, 'boom') + t.truthy(errCtx) + t.truthy(errCtx.call) + t.truthy(errCtx.req) + t.is(errCtx.name, 'SayHello') + t.is(errCtx.type, CallType.UNARY) + + await app.close() }) -test.cb('should handle an error in the handler in req/res app where ctx.res is a promise that rejects', t => { - t.plan(11) +test('should handle an error in the handler in req/res app where ctx.res is a promise that rejects', async t => { + t.plan(10) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/helloworld.proto') @@ -103,29 +115,40 @@ test.cb('should handle an error in the handler in req/res app where ctx.res is a }) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - const pd = pl.loadSync(PROTO_PATH) - const helloproto = grpc.loadPackageDefinition(pd).helloworld - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) - client.sayHello({ name: 'Bob' }, (err, response) => { - t.truthy(err) - t.true(err.message.indexOf('boom') >= 0) - t.falsy(response) - t.is(errMsg, 'boom') - t.truthy(errCtx) - t.truthy(errCtx.call) - t.truthy(errCtx.req) - t.is(errCtx.name, 'SayHello') - t.is(errCtx.type, CallType.UNARY) - app.close().then(() => t.end()) + const server = await app.start(APP_HOST) + t.truthy(server) + + const pd = pl.loadSync(PROTO_PATH) + const helloproto = grpc.loadPackageDefinition(pd).helloworld + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + let error + try { + await new Promise((resolve, reject) => { + client.sayHello({ name: 'Bob' }, (err, response) => { + if (err) { + return reject(err) + } + + resolve(response) + }) }) - }) + } catch (err) { + error = err + } + t.truthy(error) + t.true(error.message.indexOf('boom') >= 0) + t.is(errMsg, 'boom') + t.truthy(errCtx) + t.truthy(errCtx.call) + t.truthy(errCtx.req) + t.is(errCtx.name, 'SayHello') + t.is(errCtx.type, CallType.UNARY) + + await app.close() }) -test.cb('should return error when we set response to error explicitely', t => { - t.plan(6) +test('should return error when we set response to error explicitely', async t => { + t.plan(5) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/helloworld.proto') @@ -142,24 +165,36 @@ test.cb('should return error when we set response to error explicitely', t => { }) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - const pd = pl.loadSync(PROTO_PATH) - const helloproto = grpc.loadPackageDefinition(pd).helloworld - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) - client.sayHello({ name: 'Bob' }, (err, response) => { - t.truthy(err) - t.true(err.message.indexOf('boom') >= 0) - t.falsy(response) - t.falsy(errCtx) - app.close().then(() => t.end()) + const server = await app.start(APP_HOST) + t.truthy(server) + + const pd = pl.loadSync(PROTO_PATH) + const helloproto = grpc.loadPackageDefinition(pd).helloworld + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + let error + try { + await new Promise((resolve, reject) => { + client.sayHello({ name: 'Bob' }, (err, response) => { + if (err) { + return reject(err) + } + + resolve(response) + }) }) - }) + } catch (err) { + error = err + } + + t.truthy(error) + t.true(error.message.indexOf('boom') >= 0) + t.falsy(errCtx) + + await app.close() }) -test.cb('should handle an error with code in the handler in req/res app', t => { - t.plan(13) +test('should handle an error with code in the handler in req/res app', async t => { + t.plan(12) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/helloworld.proto') @@ -182,31 +217,42 @@ test.cb('should handle an error with code in the handler in req/res app', t => { }) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - const pd = pl.loadSync(PROTO_PATH) - const helloproto = grpc.loadPackageDefinition(pd).helloworld - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) - client.sayHello({ name: 'Bob' }, (err, response) => { - t.truthy(err) - t.true(err.message.indexOf('details') >= 0) - t.is(err.code, grpc.status.INVALID_ARGUMENT) - t.falsy(response) - t.is(errMsg, 'crash') - t.is(err.details, 'details') - t.truthy(errCtx) - t.truthy(errCtx.call) - t.truthy(errCtx.req) - t.is(errCtx.name, 'SayHello') - t.is(errCtx.type, CallType.UNARY) - app.close().then(() => t.end()) + const server = await app.start(APP_HOST) + t.truthy(server) + + const pd = pl.loadSync(PROTO_PATH) + const helloproto = grpc.loadPackageDefinition(pd).helloworld + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + let error + try { + await new Promise((resolve, reject) => { + client.sayHello({ name: 'Bob' }, (err, response) => { + if (err) { + return reject(err) + } + + resolve(response) + }) }) - }) + } catch (err) { + error = err + } + t.truthy(error) + t.true(error.message.indexOf('details') >= 0) + t.is(error.code, grpc.status.INVALID_ARGUMENT) + t.is(errMsg, 'crash') + t.is(error.details, 'details') + t.truthy(errCtx) + t.truthy(errCtx.call) + t.truthy(errCtx.req) + t.is(errCtx.name, 'SayHello') + t.is(errCtx.type, CallType.UNARY) + + await app.close() }) -test.cb('should handle an error without code and with details in the handler in req/res app', t => { - t.plan(13) +test('should handle an error without code and with details in the handler in req/res app', async t => { + t.plan(12) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/helloworld.proto') @@ -228,30 +274,41 @@ test.cb('should handle an error without code and with details in the handler in }) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - const pd = pl.loadSync(PROTO_PATH) - const helloproto = grpc.loadPackageDefinition(pd).helloworld - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) - client.sayHello({ name: 'Bob' }, (err, response) => { - t.truthy(err) - t.true(err.message.indexOf('crash') >= 0) - t.is(err.code, grpc.status.UNKNOWN) - t.falsy(response) - t.is(errMsg, 'crash') - t.is(err.details, 'crash') - t.truthy(errCtx) - t.truthy(errCtx.call) - t.truthy(errCtx.req) - t.is(errCtx.name, 'SayHello') - t.is(errCtx.type, CallType.UNARY) - app.close().then(() => t.end()) + const server = await app.start(APP_HOST) + t.truthy(server) + + const pd = pl.loadSync(PROTO_PATH) + const helloproto = grpc.loadPackageDefinition(pd).helloworld + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + let error + try { + await new Promise((resolve, reject) => { + client.sayHello({ name: 'Bob' }, (err, response) => { + if (err) { + return reject(err) + } + + resolve(response) + }) }) - }) + } catch (err) { + error = err + } + t.truthy(error) + t.true(error.message.indexOf('crash') >= 0) + t.is(error.code, grpc.status.UNKNOWN) + t.is(errMsg, 'crash') + t.is(error.details, 'crash') + t.truthy(errCtx) + t.truthy(errCtx.call) + t.truthy(errCtx.req) + t.is(errCtx.name, 'SayHello') + t.is(errCtx.type, CallType.UNARY) + + await app.close() }) -test.cb('should handle custom error in the handler in req/res app', t => { +test('should handle custom error in the handler in req/res app', async t => { class MyCustomError extends Error { constructor (message, code) { super(message) @@ -259,7 +316,7 @@ test.cb('should handle custom error in the handler in req/res app', t => { } } - t.plan(12) + t.plan(11) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/helloworld.proto') @@ -278,29 +335,40 @@ test.cb('should handle custom error in the handler in req/res app', t => { }) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - const pd = pl.loadSync(PROTO_PATH) - const helloproto = grpc.loadPackageDefinition(pd).helloworld - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) - client.sayHello({ name: 'Bob' }, (err, response) => { - t.truthy(err) - t.true(err.message.indexOf('burn') >= 0) - t.is(err.code, grpc.status.FAILED_PRECONDITION) - t.falsy(response) - t.is(errMsg, 'burn') - t.truthy(errCtx) - t.truthy(errCtx.call) - t.truthy(errCtx.req) - t.is(errCtx.name, 'SayHello') - t.is(errCtx.type, CallType.UNARY) - app.close().then(() => t.end()) + const server = await app.start(APP_HOST) + t.truthy(server) + + const pd = pl.loadSync(PROTO_PATH) + const helloproto = grpc.loadPackageDefinition(pd).helloworld + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + let error + try { + await new Promise((resolve, reject) => { + client.sayHello({ name: 'Bob' }, (err, response) => { + if (err) { + return reject(err) + } + + resolve(response) + }) }) - }) + } catch (err) { + error = err + } + t.truthy(error) + t.true(error.message.indexOf('burn') >= 0) + t.is(error.code, grpc.status.FAILED_PRECONDITION) + t.is(errMsg, 'burn') + t.truthy(errCtx) + t.truthy(errCtx.call) + t.truthy(errCtx.req) + t.is(errCtx.name, 'SayHello') + t.is(errCtx.type, CallType.UNARY) + + await app.close() }) -test.cb('should handle an error in the handler in res stream app', t => { +test('should handle an error in the handler in res stream app', async t => { t.plan(13) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/resstream.proto') @@ -324,59 +392,53 @@ test.cb('should handle an error in the handler in res stream app', t => { }) app.use({ listStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - const pd = pl.loadSync(PROTO_PATH) - const proto = grpc.loadPackageDefinition(pd).argservice - const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.listStuff({ message: 'Hello' }) - - let dataCounter = 0 - call.on('data', msg => { - dataCounter++ - }) + const pd = pl.loadSync(PROTO_PATH) + const proto = grpc.loadPackageDefinition(pd).argservice + const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.listStuff({ message: 'Hello' }) - let errMsg2 - call.on('error', err => { - errMsg2 = err ? err.message : '' - if (!endCalled) { - endCalled = true - _.delay(() => { - endTest() - }, 200) - } - }) + let dataCounter = 0 + call.on('data', msg => { + dataCounter++ + }) - let endCalled = false - call.on('end', () => { - if (!endCalled) { - endCalled = true - _.delay(() => { - endTest() - }, 200) - } - }) + let endCalled = false + let errMsg2 + call.on('error', err => { + errMsg2 = err ? err.message : '' + if (!endCalled) { + endCalled = true + } + }) - function endTest () { - t.true(dataCounter >= 1) - t.truthy(errMsg1) - t.truthy(errMsg2) - t.true(endCalled) - t.true(errMsg1.indexOf('Unexpected token') >= 0) - t.true(errMsg2.indexOf('Unexpected token') >= 0) - t.truthy(errCtx) - t.truthy(errCtx.call) - t.truthy(errCtx.req) - t.is(errCtx.name, 'ListStuff') - t.is(errCtx.type, CallType.RESPONSE_STREAM) - app.close().then(() => t.end()) + call.on('end', () => { + if (!endCalled) { + endCalled = true } }) + + await finished(call, { error: false }) + + t.true(dataCounter >= 1) + t.truthy(errMsg1) + t.truthy(errMsg2) + t.true(endCalled) + t.true(/Unexpected.+JSON at position/.test(errMsg1)) + t.true(/Unexpected.+JSON at position/.test(errMsg2)) + t.truthy(errCtx) + t.truthy(errCtx.call) + t.truthy(errCtx.req) + t.is(errCtx.name, 'ListStuff') + t.is(errCtx.type, CallType.RESPONSE_STREAM) + + await app.close() }) -test.cb('should handle an error in the handler in req stream app', t => { - t.plan(12) +test('should handle an error in the handler in req stream app', async t => { + t.plan(11) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/reqstream.proto') @@ -409,53 +471,67 @@ test.cb('should handle an error in the handler in req stream app', t => { }) app.use({ writeStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - let w = true - let ended = false - const pd = pl.loadSync(PROTO_PATH) - const proto = grpc.loadPackageDefinition(pd).argservice - const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.writeStuff((err, res) => { - w = false - ended = true - t.truthy(err) - t.truthy(err.message) - t.true(errMsg1.indexOf('Unexpected token') >= 0) - t.true(err.message.indexOf('Unexpected token') >= 0) - t.falsy(res) - t.truthy(errCtx) - t.truthy(errCtx.call) - t.truthy(errCtx.req) - t.is(errCtx.name, 'WriteStuff') - t.is(errCtx.type, CallType.REQUEST_STREAM) - app.close().then(() => t.end()) - }) + const server = await app.start(APP_HOST) + t.truthy(server) - call.on('error', () => { - w = false - }) + const pd = pl.loadSync(PROTO_PATH) + const proto = grpc.loadPackageDefinition(pd).argservice + const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + let call + let error + try { + await new Promise((resolve, reject) => { + call = client.writeStuff((err, res) => { + if (err) { + return reject(err) + } - call.on('close', () => { - w = false - }) + resolve(res) + }) - call.on('finish', () => { - w = false - }) + let w = true + const ended = false + + call.on('error', () => { + w = false + }) - async.eachSeries(getArrayData(), (d, asfn) => { - if (w) { - call.write(d) - } - _.delay(asfn, _.random(10, 50)) - }, () => { - if (!ended) { - call.end() - } + call.on('close', () => { + w = false + }) + + call.on('finish', () => { + w = false + }) + + async.eachSeries(getArrayData(), (d, asfn) => { + if (w) { + call.write(d) + } + _.delay(asfn, _.random(10, 50)) + }, () => { + if (!ended) { + call.end() + } + }) }) - }) + } catch (err) { + error = err + } + + await finished(call, { error: false }) + + t.truthy(error) + t.truthy(error.message) + t.true(/Unexpected.+JSON at position/.test(errMsg1)) + t.true(/Unexpected.+JSON at position/.test(error.message)) + t.truthy(errCtx) + t.truthy(errCtx.call) + t.truthy(errCtx.req) + t.is(errCtx.name, 'WriteStuff') + t.is(errCtx.type, CallType.REQUEST_STREAM) + + await app.close() }) test('should handle error in response stream', async t => { @@ -526,7 +602,7 @@ test('should handle error in response stream', async t => { t.true(err.message.indexOf('stream error') >= 0) }) -test.cb('should handle an error in the handler of duplex call', t => { +test('should handle an error in the handler of duplex call', async t => { t.plan(13) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/duplex.proto') @@ -564,64 +640,57 @@ test.cb('should handle an error in the handler of duplex call', t => { }) app.use({ processStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - const pd = pl.loadSync(PROTO_PATH) - const proto = grpc.loadPackageDefinition(pd).argservice - const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.processStuff() - - let dataCounter = 0 - call.on('data', d => { - dataCounter++ - }) - - let errMsg2 = '' - call.on('error', err2 => { - errMsg2 = err2 ? err2.message : '' - if (!endCalled) { - endCalled = true - _.delay(() => { - endTest() - }, 200) - } - }) + const server = await app.start(APP_HOST) + t.truthy(server) + const pd = pl.loadSync(PROTO_PATH) + const proto = grpc.loadPackageDefinition(pd).argservice + const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.processStuff() - let endCalled = false - call.on('end', () => { - if (!endCalled) { - endCalled = true - _.delay(() => { - endTest() - }, 200) - } - }) + let dataCounter = 0 + call.on('data', d => { + dataCounter++ + }) - async.eachSeries(getArrayData(), (d, asfn) => { - call.write(d) - _.delay(asfn, _.random(10, 50)) - }, () => { - call.end() - }) + let errMsg2 = '' + let endCalled = false + call.on('error', err2 => { + errMsg2 = err2 ? err2.message : '' + if (!endCalled) { + endCalled = true + } + }) - function endTest () { - t.is(dataCounter, 2) - t.truthy(errMsg1) - t.truthy(errMsg2) - t.true(endCalled) - t.true(errMsg1.indexOf('Unexpected token') >= 0) - t.true(errMsg2.indexOf('Unexpected token') >= 0) - t.truthy(errCtx) - t.truthy(errCtx.call) - t.truthy(errCtx.req) - t.is(errCtx.name, 'ProcessStuff') - t.is(errCtx.type, CallType.DUPLEX) - app.close().then(() => t.end()) + call.on('end', () => { + if (!endCalled) { + endCalled = true } }) + + async.eachSeries(getArrayData(), (d, asfn) => { + call.write(d) + _.delay(asfn, _.random(10, 50)) + }, () => { + call.end() + }) + + await finished(call, { error: false }) + + t.is(dataCounter, 2) + t.truthy(errMsg1) + t.truthy(errMsg2) + t.true(endCalled) + t.true(/Unexpected.+JSON at position/.test(errMsg1)) + t.true(/Unexpected.+JSON at position/.test(errMsg2)) + t.truthy(errCtx) + t.truthy(errCtx.call) + t.truthy(errCtx.req) + t.is(errCtx.name, 'ProcessStuff') + t.is(errCtx.type, CallType.DUPLEX) + await app.close() }) -test.cb('should handle an error in the handler of duplex call that returns a promise', t => { +test('should handle an error in the handler of duplex call that returns a promise', async t => { t.plan(13) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/duplex.proto') @@ -663,59 +732,53 @@ test.cb('should handle an error in the handler of duplex call that returns a pro }) app.use({ processStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - const pd = pl.loadSync(PROTO_PATH) - const proto = grpc.loadPackageDefinition(pd).argservice - const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.processStuff() - - let dataCounter = 0 - call.on('data', d => { - dataCounter++ - }) - - let errMsg2 = '' - call.on('error', err2 => { - errMsg2 = err2 ? err2.message : '' - if (!endCalled) { - endCalled = true - _.delay(() => { - endTest() - }, 200) - } - }) + const server = await app.start(APP_HOST) + t.truthy(server) + const pd = pl.loadSync(PROTO_PATH) + const proto = grpc.loadPackageDefinition(pd).argservice + const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.processStuff() - let endCalled = false - call.on('end', () => { - if (!endCalled) { - endCalled = true - _.delay(() => { - endTest() - }, 200) - } - }) + let dataCounter = 0 + call.on('data', d => { + dataCounter++ + }) - async.eachSeries(getArrayData(), (d, asfn) => { - call.write(d) - _.delay(asfn, _.random(10, 50)) - }, () => { - call.end() - }) + let errMsg2 = '' + call.on('error', err2 => { + errMsg2 = err2 ? err2.message : '' + if (!endCalled) { + endCalled = true + } + }) - function endTest () { - t.is(dataCounter, 2) - t.truthy(errMsg1) - t.truthy(errMsg2) - t.true(endCalled) - t.true(errMsg1.indexOf('Unexpected token') >= 0) - t.true(errMsg2.indexOf('Unexpected token') >= 0) - t.truthy(errCtx) - t.truthy(errCtx.call) - t.truthy(errCtx.req) - t.is(errCtx.name, 'ProcessStuff') - t.is(errCtx.type, CallType.DUPLEX) - app.close().then(() => t.end()) + let endCalled = false + call.on('end', () => { + if (!endCalled) { + endCalled = true } }) + + async.eachSeries(getArrayData(), (d, asfn) => { + call.write(d) + _.delay(asfn, _.random(10, 50)) + }, () => { + call.end() + }) + + await finished(call, { error: false }) + + t.is(dataCounter, 2) + t.truthy(errMsg1) + t.truthy(errMsg2) + t.true(endCalled) + t.true(/Unexpected.+JSON at position/.test(errMsg1)) + t.true(/Unexpected.+JSON at position/.test(errMsg2)) + t.truthy(errCtx) + t.truthy(errCtx.call) + t.truthy(errCtx.req) + t.is(errCtx.name, 'ProcessStuff') + t.is(errCtx.type, CallType.DUPLEX) + + await app.close() }) diff --git a/test/metadata.test.js b/test/metadata.test.js index e997296..41a4e8d 100644 --- a/test/metadata.test.js +++ b/test/metadata.test.js @@ -1,5 +1,6 @@ const test = require('ava') const path = require('path') +const { finished } = require('stream/promises') const grpc = require('@grpc/grpc-js') const hl = require('highland') const async = require('async') @@ -36,8 +37,8 @@ const DUPLEX_PROTO_PATH = path.resolve(__dirname, './protos/duplex.proto') const dpd = pl.loadSync(DUPLEX_PROTO_PATH) const duplexproto = grpc.loadPackageDefinition(dpd).argservice -test.cb('req/res: no metadata', t => { - t.plan(14) +test('req/res: no metadata', async t => { + t.plan(13) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/helloworld.proto') @@ -48,31 +49,20 @@ test.cb('req/res: no metadata', t => { const app = new Mali(PROTO_PATH, 'Greeter') t.truthy(app) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - let metadata - let status + let metadata + let status - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => { const call = client.sayHello({ name: 'Bob' }, (err, response) => { - setTimeout(() => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Bob') - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, {}) - app.close().then(() => t.end()) - }, 250) + if (err) { + return reject(err) + } + + resolve(response) }) call.on('metadata', md => { @@ -83,10 +73,26 @@ test.cb('req/res: no metadata', t => { status = s }) }) + + t.truthy(response) + t.is(response.message, 'Hello Bob') + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, {}) + + await app.close() }) -test.cb('req/res: header metadata set', t => { - t.plan(15) +test('req/res: header metadata set', async t => { + t.plan(14) const APP_HOST = tu.getHost() function sayHello (ctx) { @@ -97,32 +103,20 @@ test.cb('req/res: header metadata set', t => { const app = new Mali(PROTO_PATH, 'Greeter') t.truthy(app) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - let metadata - let status + let metadata + let status - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => { const call = client.sayHello({ name: 'Bob' }, (err, response) => { - setTimeout(() => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Bob') - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header.foo, 'bar') - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, {}) - app.close().then(() => t.end()) - }, 250) + if (err) { + return reject(err) + } + + resolve(response) }) call.on('metadata', md => { @@ -133,10 +127,27 @@ test.cb('req/res: header metadata set', t => { status = s }) }) + + t.truthy(response) + t.is(response.message, 'Hello Bob') + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header.foo, 'bar') + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, {}) + + await app.close() }) -test.cb('req/res: header metadata set even if error occurred', t => { - t.plan(16) +test('req/res: header metadata set even if error occurred', async t => { + t.plan(15) const APP_HOST = tu.getHost() function sayHello (ctx) { @@ -152,46 +163,56 @@ test.cb('req/res: header metadata set even if error occurred', t => { }) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - let metadata - let status + let metadata + let status + let error - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) - const call = client.sayHello({ name: 'Bob' }, (err, response) => { - setTimeout(() => { - t.truthy(err) - t.true(err.message.indexOf('boom') >= 0) - t.falsy(response) - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header.foo, 'bar') - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, {}) - app.close().then(() => t.end()) - }, 250) - }) + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + try { + await new Promise((resolve, reject) => { + const call = client.sayHello({ name: 'Bob' }, (err, response) => { + if (err) { + return reject(err) + } - call.on('metadata', md => { - metadata = md - }) + resolve(response) + }) - call.on('status', s => { - status = s + call.on('metadata', md => { + metadata = md + }) + + call.on('status', s => { + status = s + }) }) - }) + } catch (err) { + error = err + } + + t.truthy(error) + t.true(error.message.indexOf('boom') >= 0) + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header.foo, 'bar') + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, {}) + + await app.close() }) -test.cb('req/res: header metadata sent using ctx.sendMetadata', t => { - t.plan(15) +test('req/res: header metadata sent using ctx.sendMetadata', async t => { + t.plan(14) const APP_HOST = tu.getHost() function sayHello (ctx) { @@ -202,31 +223,20 @@ test.cb('req/res: header metadata sent using ctx.sendMetadata', t => { const app = new Mali(PROTO_PATH, 'Greeter') t.truthy(app) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - let metadata - let status - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + let metadata + let status + + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => { const call = client.sayHello({ name: 'Bob' }, (err, response) => { - setTimeout(() => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Bob') - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header.baz, 'foo') - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, {}) - app.close().then(() => t.end()) - }, 250) + if (err) { + return reject(err) + } + + resolve(response) }) call.on('metadata', md => { @@ -237,10 +247,27 @@ test.cb('req/res: header metadata sent using ctx.sendMetadata', t => { status = s }) }) + + t.truthy(response) + t.is(response.message, 'Hello Bob') + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header.baz, 'foo') + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, {}) + + await app.close() }) -test.cb('req/res: header metadata sent using ctx.sendMetadata(Metadata)', t => { - t.plan(15) +test('req/res: header metadata sent using ctx.sendMetadata(Metadata)', async t => { + t.plan(14) const APP_HOST = tu.getHost() function sayHello (ctx) { @@ -253,31 +280,19 @@ test.cb('req/res: header metadata sent using ctx.sendMetadata(Metadata)', t => { const app = new Mali(PROTO_PATH, 'Greeter') t.truthy(app) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - let metadata - let status - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + let metadata + let status + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => { const call = client.sayHello({ name: 'Bob' }, (err, response) => { - setTimeout(() => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Bob') - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header.foo, 'bar') - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, {}) - app.close().then(() => t.end()) - }, 250) + if (err) { + return reject(err) + } + + resolve(response) }) call.on('metadata', md => { @@ -288,10 +303,27 @@ test.cb('req/res: header metadata sent using ctx.sendMetadata(Metadata)', t => { status = s }) }) + + t.truthy(response) + t.is(response.message, 'Hello Bob') + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header.foo, 'bar') + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, {}) + + await app.close() }) -test.cb('req/res: header metadata set and sent using ctx.sendMetadata', t => { - t.plan(15) +test('req/res: header metadata set and sent using ctx.sendMetadata', async t => { + t.plan(14) const APP_HOST = tu.getHost() function sayHello (ctx) { @@ -303,31 +335,19 @@ test.cb('req/res: header metadata set and sent using ctx.sendMetadata', t => { const app = new Mali(PROTO_PATH, 'Greeter') t.truthy(app) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - let metadata - let status - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + let metadata + let status + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => { const call = client.sayHello({ name: 'Bob' }, (err, response) => { - setTimeout(() => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Bob') - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header.foo, 'bar') - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, {}) - app.close().then(() => t.end()) - }, 250) + if (err) { + return reject(err) + } + + resolve(response) }) call.on('metadata', md => { @@ -338,10 +358,27 @@ test.cb('req/res: header metadata set and sent using ctx.sendMetadata', t => { status = s }) }) + + t.truthy(response) + t.is(response.message, 'Hello Bob') + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header.foo, 'bar') + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, {}) + + await app.close() }) -test.cb('req/res: header metadata set and then new metadata sent using ctx.sendMetadata', t => { - t.plan(16) +test('req/res: header metadata set and then new metadata sent using ctx.sendMetadata', async t => { + t.plan(15) const APP_HOST = tu.getHost() function sayHello (ctx) { @@ -353,32 +390,19 @@ test.cb('req/res: header metadata set and then new metadata sent using ctx.sendM const app = new Mali(PROTO_PATH, 'Greeter') t.truthy(app) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - let metadata - let status - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + let metadata + let status + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => { const call = client.sayHello({ name: 'Bob' }, (err, response) => { - setTimeout(() => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Bob') - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header.biz, 'baz') - t.is(header.foo, undefined) - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, {}) - app.close().then(() => t.end()) - }, 250) + if (err) { + return reject(err) + } + + resolve(response) }) call.on('metadata', md => { @@ -389,12 +413,30 @@ test.cb('req/res: header metadata set and then new metadata sent using ctx.sendM status = s }) }) + + t.truthy(response) + t.is(response.message, 'Hello Bob') + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header.biz, 'baz') + t.is(header.foo, undefined) + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, {}) + + await app.close() }) -test.cb( +test( 'req/res: header metadata ctx.sendMetadata and then set new metadata, should get first', - t => { - t.plan(16) + async t => { + t.plan(15) const APP_HOST = tu.getHost() function sayHello (ctx) { @@ -406,32 +448,19 @@ test.cb( const app = new Mali(PROTO_PATH, 'Greeter') t.truthy(app) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - let metadata - let status - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + let metadata + let status + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => { const call = client.sayHello({ name: 'Bob' }, (err, response) => { - setTimeout(() => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Bob') - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header.foo, undefined) - t.is(header.biz, 'baz') - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, {}) - app.close().then(() => t.end()) - }, 250) + if (err) { + return reject(err) + } + + resolve(response) }) call.on('metadata', md => { @@ -442,13 +471,31 @@ test.cb( status = s }) }) + + t.truthy(response) + t.is(response.message, 'Hello Bob') + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header.foo, undefined) + t.is(header.biz, 'baz') + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, {}) + + await app.close() } ) -test.cb( +test( 'req/res: header metadata send invalid param usingctx.sendMetadata and then set new metadata, should get 2nd', - t => { - t.plan(15) + async t => { + t.plan(14) const APP_HOST = tu.getHost() function sayHello (ctx) { @@ -460,31 +507,19 @@ test.cb( const app = new Mali(PROTO_PATH, 'Greeter') t.truthy(app) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - let metadata - let status - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + let metadata + let status + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => { const call = client.sayHello({ name: 'Bob' }, (err, response) => { - setTimeout(() => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Bob') - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header.foo, 'bar') - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, {}) - app.close().then(() => t.end()) - }, 250) + if (err) { + return reject(err) + } + + resolve(response) }) call.on('metadata', md => { @@ -495,11 +530,28 @@ test.cb( status = s }) }) + + t.truthy(response) + t.is(response.message, 'Hello Bob') + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header.foo, 'bar') + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, {}) + + await app.close() } ) -test.cb('req/res: trailer metadata set', t => { - t.plan(14) +test('req/res: trailer metadata set', async t => { + t.plan(13) const APP_HOST = tu.getHost() function sayHello (ctx) { @@ -510,32 +562,19 @@ test.cb('req/res: trailer metadata set', t => { const app = new Mali(PROTO_PATH, 'Greeter') t.truthy(app) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - let metadata - let status - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + let metadata + let status + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => { const call = client.sayHello({ name: 'Bob' }, (err, response) => { - setTimeout(() => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Bob') - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, { - foo: 'bar' - }) - app.close().then(() => t.end()) - }, 250) + if (err) { + return reject(err) + } + + resolve(response) }) call.on('metadata', md => { @@ -546,10 +585,28 @@ test.cb('req/res: trailer metadata set', t => { status = s }) }) + + t.truthy(response) + t.is(response.message, 'Hello Bob') + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, { + foo: 'bar' + }) + + await app.close() }) -test.cb('req/res: header and trailer metadata set', t => { - t.plan(15) +test('req/res: header and trailer metadata set', async t => { + t.plan(14) const APP_HOST = tu.getHost() function sayHello (ctx) { @@ -561,33 +618,19 @@ test.cb('req/res: header and trailer metadata set', t => { const app = new Mali(PROTO_PATH, 'Greeter') t.truthy(app) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - let metadata - let status - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + let metadata + let status + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => { const call = client.sayHello({ name: 'Bob' }, (err, response) => { - setTimeout(() => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Bob') - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header.asdf, 'qwerty') - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, { - foo: 'bar' - }) - app.close().then(() => t.end()) - }, 250) + if (err) { + return reject(err) + } + + resolve(response) }) call.on('metadata', md => { @@ -598,9 +641,28 @@ test.cb('req/res: header and trailer metadata set', t => { status = s }) }) + + t.truthy(response) + t.is(response.message, 'Hello Bob') + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header.asdf, 'qwerty') + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, { + foo: 'bar' + }) + + await app.close() }) -test.cb('res stream: no metadata', t => { +test('res stream: no metadata', async t => { t.plan(12) const APP_HOST = tu.getHost() @@ -614,52 +676,46 @@ test.cb('res stream: no metadata', t => { const app = new Mali(ARG_PROTO_PATH, 'ArgService') t.truthy(app) app.use({ listStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - let metadata - let status - const client = new argproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.listStuff({ message: 'Hello' }) - - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + const server = await app.start(APP_HOST) + t.truthy(server) - call.on('end', () => { - _.delay(() => { - endTest() - }, 200) - }) + let metadata + let status + const client = new argproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.listStuff({ message: 'Hello' }) - call.on('metadata', md => { - metadata = md - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('status', s => { - status = s - }) + call.on('metadata', md => { + metadata = md + }) - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, {}) - app.close().then(() => t.end()) - } + call.on('status', s => { + status = s }) + + await finished(call) + + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, {}) + + await app.close() }) -test.cb('res stream: header metadata set', t => { +test('res stream: header metadata set', async t => { t.plan(13) const APP_HOST = tu.getHost() @@ -674,53 +730,47 @@ test.cb('res stream: header metadata set', t => { const app = new Mali(ARG_PROTO_PATH, 'ArgService') t.truthy(app) app.use({ listStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - let metadata - let status - const client = new argproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.listStuff({ message: 'Hello' }) - - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + const server = await app.start(APP_HOST) + t.truthy(server) - call.on('end', () => { - _.delay(() => { - endTest() - }, 200) - }) + let metadata + let status + const client = new argproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.listStuff({ message: 'Hello' }) - call.on('metadata', md => { - metadata = md - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('status', s => { - status = s - }) + call.on('metadata', md => { + metadata = md + }) - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header.foo, 'bar') - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, {}) - app.close().then(() => t.end()) - } + call.on('status', s => { + status = s }) + + await finished(call) + + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header.foo, 'bar') + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, {}) + + await app.close() }) -test.cb('res stream: header metadata sendMetadata(object)', t => { +test('res stream: header metadata sendMetadata(object)', async t => { t.plan(13) const APP_HOST = tu.getHost() @@ -735,55 +785,49 @@ test.cb('res stream: header metadata sendMetadata(object)', t => { const app = new Mali(ARG_PROTO_PATH, 'ArgService') t.truthy(app) app.use({ listStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - let metadata - let status - const client = new argproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.listStuff({ message: 'Hello' }) - - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + const server = await app.start(APP_HOST) + t.truthy(server) - call.on('end', () => { - _.delay(() => { - endTest() - }, 200) - }) + let metadata + let status + const client = new argproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.listStuff({ message: 'Hello' }) - call.on('metadata', md => { - metadata = md - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('status', s => { - status = s - }) + call.on('metadata', md => { + metadata = md + }) - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header.foo, 'bar') - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, {}) - app.close().then(() => t.end()) - } + call.on('status', s => { + status = s }) + + await finished(call) + + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header.foo, 'bar') + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, {}) + + await app.close() }) -test.cb( +test( 'res stream: header metadata sendMetadata(object) with set after, set should not be sent', - t => { + async t => { t.plan(13) const APP_HOST = tu.getHost() @@ -799,54 +843,48 @@ test.cb( const app = new Mali(ARG_PROTO_PATH, 'ArgService') t.truthy(app) app.use({ listStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - let metadata - let status - const client = new argproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.listStuff({ message: 'Hello' }) + let metadata + let status + const client = new argproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.listStuff({ message: 'Hello' }) - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('end', () => { - _.delay(() => { - endTest() - }, 200) - }) + call.on('metadata', md => { + metadata = md + }) - call.on('metadata', md => { - metadata = md - }) + call.on('status', s => { + status = s + }) - call.on('status', s => { - status = s - }) + await finished(call) - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header.asdf, 'qwerty') - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, {}) - app.close().then(() => t.end()) - } - }) + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header.asdf, 'qwerty') + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, {}) + + await app.close() } ) -test.cb('res stream: trailer metadata set', t => { +test('res stream: trailer metadata set', async t => { t.plan(12) const APP_HOST = tu.getHost() @@ -861,54 +899,48 @@ test.cb('res stream: trailer metadata set', t => { const app = new Mali(ARG_PROTO_PATH, 'ArgService') t.truthy(app) app.use({ listStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - let metadata - let status - const client = new argproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.listStuff({ message: 'Hello' }) + const server = await app.start(APP_HOST) + t.truthy(server) - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + let metadata + let status + const client = new argproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.listStuff({ message: 'Hello' }) - call.on('end', () => { - _.delay(() => { - endTest() - }, 200) - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('metadata', md => { - metadata = md - }) + call.on('metadata', md => { + metadata = md + }) - call.on('status', s => { - status = s - }) + call.on('status', s => { + status = s + }) - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, { - foo: 'bar' - }) - app.close().then(() => t.end()) - } + await finished(call) + + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, { + foo: 'bar' }) + + await app.close() }) -test.cb('res stream: trailer metadata set and also sent using res.end() should get 2nd', t => { +test('res stream: trailer metadata set and also sent using res.end() should get 2nd', async t => { t.plan(12) const APP_HOST = tu.getHost() @@ -927,54 +959,48 @@ test.cb('res stream: trailer metadata set and also sent using res.end() should g const app = new Mali(ARG_PROTO_PATH, 'ArgService') t.truthy(app) app.use({ listStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - let metadata - let status - const client = new argproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.listStuff({ message: 'Hello' }) + let metadata + let status + const client = new argproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.listStuff({ message: 'Hello' }) - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) - - call.on('end', () => { - _.delay(() => { - endTest() - }, 200) - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('metadata', md => { - metadata = md - }) + call.on('metadata', md => { + metadata = md + }) - call.on('status', s => { - status = s - }) + call.on('status', s => { + status = s + }) - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, { - bar: 'biz' - }) - app.close().then(() => t.end()) - } + await finished(call) + + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, { + bar: 'biz' }) + + await app.close() }) -test.cb('res stream: trailer metadata set and also use empty res.end() should get 1st', t => { +test('res stream: trailer metadata set and also use empty res.end() should get 1st', async t => { t.plan(12) const APP_HOST = tu.getHost() @@ -993,54 +1019,48 @@ test.cb('res stream: trailer metadata set and also use empty res.end() should ge const app = new Mali(ARG_PROTO_PATH, 'ArgService') t.truthy(app) app.use({ listStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - let metadata - let status - const client = new argproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.listStuff({ message: 'Hello' }) + const server = await app.start(APP_HOST) + t.truthy(server) - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + let metadata + let status + const client = new argproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.listStuff({ message: 'Hello' }) - call.on('end', () => { - _.delay(() => { - endTest() - }, 200) - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('metadata', md => { - metadata = md - }) + call.on('metadata', md => { + metadata = md + }) - call.on('status', s => { - status = s - }) + call.on('status', s => { + status = s + }) - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, { - foo: 'bar' - }) - app.close().then(() => t.end()) - } + await finished(call) + + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, { + foo: 'bar' }) + + await app.close() }) -test.cb('res stream: trailer metadata set and also use invalid res.end() should get 1st', t => { +test('res stream: trailer metadata set and also use invalid res.end() should get 1st', async t => { t.plan(12) const APP_HOST = tu.getHost() @@ -1059,54 +1079,48 @@ test.cb('res stream: trailer metadata set and also use invalid res.end() should const app = new Mali(ARG_PROTO_PATH, 'ArgService') t.truthy(app) app.use({ listStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - let metadata - let status - const client = new argproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.listStuff({ message: 'Hello' }) + const server = await app.start(APP_HOST) + t.truthy(server) - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + let metadata + let status + const client = new argproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.listStuff({ message: 'Hello' }) - call.on('end', () => { - _.delay(() => { - endTest() - }, 200) - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('metadata', md => { - metadata = md - }) + call.on('metadata', md => { + metadata = md + }) - call.on('status', s => { - status = s - }) + call.on('status', s => { + status = s + }) - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, { - foo: 'bar' - }) - app.close().then(() => t.end()) - } + await finished(call) + + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, { + foo: 'bar' }) + + await app.close() }) -test.cb('res stream: header and trailer metadata set', t => { +test('res stream: header and trailer metadata set', async t => { t.plan(13) const APP_HOST = tu.getHost() @@ -1122,55 +1136,49 @@ test.cb('res stream: header and trailer metadata set', t => { const app = new Mali(ARG_PROTO_PATH, 'ArgService') t.truthy(app) app.use({ listStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - let metadata - let status - const client = new argproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.listStuff({ message: 'Hello' }) + const server = await app.start(APP_HOST) + t.truthy(server) - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + let metadata + let status + const client = new argproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.listStuff({ message: 'Hello' }) - call.on('end', () => { - _.delay(() => { - endTest() - }, 200) - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('metadata', md => { - metadata = md - }) + call.on('metadata', md => { + metadata = md + }) - call.on('status', s => { - status = s - }) + call.on('status', s => { + status = s + }) - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header.asdf, 'qwerty') - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, { - foo: 'bar' - }) - app.close().then(() => t.end()) - } + await finished(call) + + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header.asdf, 'qwerty') + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, { + foo: 'bar' }) + + await app.close() }) -test.cb('duplex: no metadata', t => { +test('duplex: no metadata', async t => { t.plan(12) const APP_HOST = tu.getHost() @@ -1197,61 +1205,57 @@ test.cb('duplex: no metadata', t => { t.truthy(app) app.use({ processStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - let metadata - let status - const client = new duplexproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.processStuff() + const server = await app.start(APP_HOST) + t.truthy(server) - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + let metadata + let status + const client = new duplexproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.processStuff() - call.on('end', () => { - endTest() - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('metadata', md => { - metadata = md - }) + call.on('metadata', md => { + metadata = md + }) - call.on('status', s => { - status = s - }) + call.on('status', s => { + status = s + }) - async.eachSeries( - getArrayData(), - (d, asfn) => { - call.write(d) - _.delay(asfn, _.random(10, 50)) - }, - () => { - call.end() - } - ) - - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, {}) - app.close().then(() => t.end()) + async.eachSeries( + getArrayData(), + (d, asfn) => { + call.write(d) + _.delay(asfn, _.random(10, 50)) + }, + () => { + call.end() } - }) + ) + + await finished(call) + + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, {}) + + await app.close() }) -test.cb('duplex: header metadata set', t => { +test('duplex: header metadata set', async t => { t.plan(13) const APP_HOST = tu.getHost() @@ -1279,62 +1283,58 @@ test.cb('duplex: header metadata set', t => { t.truthy(app) app.use({ processStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - let metadata - let status - const client = new duplexproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.processStuff() + const server = await app.start(APP_HOST) + t.truthy(server) - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + let metadata + let status + const client = new duplexproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.processStuff() - call.on('end', () => { - endTest() - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('metadata', md => { - metadata = md - }) + call.on('metadata', md => { + metadata = md + }) - call.on('status', s => { - status = s - }) + call.on('status', s => { + status = s + }) - async.eachSeries( - getArrayData(), - (d, asfn) => { - call.write(d) - _.delay(asfn, _.random(10, 50)) - }, - () => { - call.end() - } - ) - - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header.foo, 'bar') - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, {}) - app.close().then(() => t.end()) + async.eachSeries( + getArrayData(), + (d, asfn) => { + call.write(d) + _.delay(asfn, _.random(10, 50)) + }, + () => { + call.end() } - }) + ) + + await finished(call) + + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header.foo, 'bar') + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, {}) + + await app.close() }) -test.cb('duplex: header metadata sendMetadata(object)', t => { +test('duplex: header metadata sendMetadata(object)', async t => { t.plan(13) const APP_HOST = tu.getHost() async function processStuff (ctx) { @@ -1361,62 +1361,58 @@ test.cb('duplex: header metadata sendMetadata(object)', t => { t.truthy(app) app.use({ processStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - let metadata - let status - const client = new duplexproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.processStuff() + const server = await app.start(APP_HOST) + t.truthy(server) - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + let metadata + let status + const client = new duplexproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.processStuff() - call.on('end', () => { - endTest() - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('metadata', md => { - metadata = md - }) + call.on('metadata', md => { + metadata = md + }) - call.on('status', s => { - status = s - }) + call.on('status', s => { + status = s + }) - async.eachSeries( - getArrayData(), - (d, asfn) => { - call.write(d) - _.delay(asfn, _.random(10, 50)) - }, - () => { - call.end() - } - ) - - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header.foo, 'bar') - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, {}) - app.close().then(() => t.end()) + async.eachSeries( + getArrayData(), + (d, asfn) => { + call.write(d) + _.delay(asfn, _.random(10, 50)) + }, + () => { + call.end() } - }) + ) + + await finished(call) + + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header.foo, 'bar') + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, {}) + + await app.close() }) -test.cb('duplex: header metadata sendMetadata(object) with set after, set no effect', t => { +test('duplex: header metadata sendMetadata(object) with set after, set no effect', async t => { t.plan(13) const APP_HOST = tu.getHost() async function processStuff (ctx) { @@ -1444,62 +1440,58 @@ test.cb('duplex: header metadata sendMetadata(object) with set after, set no eff t.truthy(app) app.use({ processStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - let metadata - let status - const client = new duplexproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.processStuff() + const server = await app.start(APP_HOST) + t.truthy(server) - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + let metadata + let status + const client = new duplexproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.processStuff() - call.on('end', () => { - endTest() - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('metadata', md => { - metadata = md - }) + call.on('metadata', md => { + metadata = md + }) - call.on('status', s => { - status = s - }) + call.on('status', s => { + status = s + }) - async.eachSeries( - getArrayData(), - (d, asfn) => { - call.write(d) - _.delay(asfn, _.random(10, 50)) - }, - () => { - call.end() - } - ) - - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header.asdf, 'qwerty') - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, {}) - app.close().then(() => t.end()) + async.eachSeries( + getArrayData(), + (d, asfn) => { + call.write(d) + _.delay(asfn, _.random(10, 50)) + }, + () => { + call.end() } - }) + ) + + await finished(call) + + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header.asdf, 'qwerty') + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, {}) + + await app.close() }) -test.cb('duplex: trailer metadata', t => { +test('duplex: trailer metadata', async t => { t.plan(12) const APP_HOST = tu.getHost() @@ -1527,63 +1519,59 @@ test.cb('duplex: trailer metadata', t => { t.truthy(app) app.use({ processStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - let metadata - let status - const client = new duplexproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.processStuff() + const server = await app.start(APP_HOST) + t.truthy(server) - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + let metadata + let status + const client = new duplexproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.processStuff() - call.on('end', () => { - endTest() - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('metadata', md => { - metadata = md - }) + call.on('metadata', md => { + metadata = md + }) - call.on('status', s => { - status = s - }) + call.on('status', s => { + status = s + }) - async.eachSeries( - getArrayData(), - (d, asfn) => { - call.write(d) - _.delay(asfn, _.random(10, 50)) - }, - () => { - call.end() - } - ) - - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, { - foo: 'bar' - }) - app.close().then(() => t.end()) + async.eachSeries( + getArrayData(), + (d, asfn) => { + call.write(d) + _.delay(asfn, _.random(10, 50)) + }, + () => { + call.end() } + ) + + await finished(call) + + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, { + foo: 'bar' }) + + await app.close() }) -test.cb('duplex: trailer metadata using end()', t => { +test('duplex: trailer metadata using end()', async t => { t.plan(12) const APP_HOST = tu.getHost() @@ -1610,63 +1598,59 @@ test.cb('duplex: trailer metadata using end()', t => { t.truthy(app) app.use({ processStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - let metadata - let status - const client = new duplexproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.processStuff() + const server = await app.start(APP_HOST) + t.truthy(server) - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + let metadata + let status + const client = new duplexproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.processStuff() - call.on('end', () => { - endTest() - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('metadata', md => { - metadata = md - }) + call.on('metadata', md => { + metadata = md + }) - call.on('status', s => { - status = s - }) + call.on('status', s => { + status = s + }) - async.eachSeries( - getArrayData(), - (d, asfn) => { - call.write(d) - _.delay(asfn, _.random(10, 50)) - }, - () => { - call.end() - } - ) - - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, { - foo: 'bar' - }) - app.close().then(() => t.end()) + async.eachSeries( + getArrayData(), + (d, asfn) => { + call.write(d) + _.delay(asfn, _.random(10, 50)) + }, + () => { + call.end() } + ) + + await finished(call) + + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, { + foo: 'bar' }) + + await app.close() }) -test.cb('duplex: trailer metadata valid setStatus() and invalid end()', t => { +test('duplex: trailer metadata valid setStatus() and invalid end()', async t => { t.plan(12) const APP_HOST = tu.getHost() @@ -1694,63 +1678,59 @@ test.cb('duplex: trailer metadata valid setStatus() and invalid end()', t => { t.truthy(app) app.use({ processStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - let metadata - let status - const client = new duplexproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.processStuff() + const server = await app.start(APP_HOST) + t.truthy(server) - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + let metadata + let status + const client = new duplexproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.processStuff() - call.on('end', () => { - endTest() - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('metadata', md => { - metadata = md - }) + call.on('metadata', md => { + metadata = md + }) - call.on('status', s => { - status = s - }) + call.on('status', s => { + status = s + }) - async.eachSeries( - getArrayData(), - (d, asfn) => { - call.write(d) - _.delay(asfn, _.random(10, 50)) - }, - () => { - call.end() - } - ) - - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, { - foo: 'bar' - }) - app.close().then(() => t.end()) + async.eachSeries( + getArrayData(), + (d, asfn) => { + call.write(d) + _.delay(asfn, _.random(10, 50)) + }, + () => { + call.end() } + ) + + await finished(call) + + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, { + foo: 'bar' }) + + await app.close() }) -test.cb('duplex: header and trailer metadata', t => { +test('duplex: header and trailer metadata', async t => { t.plan(13) const APP_HOST = tu.getHost() async function processStuff (ctx) { @@ -1778,59 +1758,55 @@ test.cb('duplex: header and trailer metadata', t => { t.truthy(app) app.use({ processStuff }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - let metadata - let status - const client = new duplexproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.processStuff() - - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + let metadata + let status + const client = new duplexproto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.processStuff() - call.on('end', () => { - endTest() - }) + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('metadata', md => { - metadata = md - }) + call.on('metadata', md => { + metadata = md + }) - call.on('status', s => { - status = s - }) + call.on('status', s => { + status = s + }) - async.eachSeries( - getArrayData(), - (d, asfn) => { - call.write(d) - _.delay(asfn, _.random(10, 50)) - }, - () => { - call.end() - } - ) - - function endTest () { - t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) - t.truthy(metadata) - t.true(metadata instanceof grpc.Metadata) - const header = metadata.getMap() - t.is(header.asdf, 'qwerty') - t.is(header['content-type'], 'application/grpc+proto') - t.truthy(header.date) - t.truthy(status) - t.true(typeof status.code === 'number') - t.truthy(status.metadata) - t.true(status.metadata instanceof grpc.Metadata) - const trailer = status.metadata.getMap() - t.deepEqual(trailer, { - foo: 'bar' - }) - app.close().then(() => t.end()) + async.eachSeries( + getArrayData(), + (d, asfn) => { + call.write(d) + _.delay(asfn, _.random(10, 50)) + }, + () => { + call.end() } + ) + + await finished(call) + + t.deepEqual(resData, ['1 FOO', '2 BAR', '3 ASD', '4 QWE', '5 RTY', '6 ZXC']) + t.truthy(metadata) + t.true(metadata instanceof grpc.Metadata) + const header = metadata.getMap() + t.is(header.asdf, 'qwerty') + t.is(header['content-type'], 'application/grpc+proto') + t.truthy(header.date) + t.truthy(status) + t.true(typeof status.code === 'number') + t.truthy(status.metadata) + t.true(status.metadata instanceof grpc.Metadata) + const trailer = status.metadata.getMap() + t.deepEqual(trailer, { + foo: 'bar' }) + + await app.close() }) diff --git a/test/middleware.test.js b/test/middleware.test.js index 45f7e74..d5ea9bd 100644 --- a/test/middleware.test.js +++ b/test/middleware.test.js @@ -144,103 +144,128 @@ test.before('should dynamically create service', async t => { t.truthy(server) }) -test.cb('single sync middleware', t => { - t.plan(8) +test('single sync middleware', async t => { + t.plan(7) const pd = pl.loadSync(PROTO_PATH) const ts = grpc.loadPackageDefinition(pd).Transform const client = new ts.TransformService(DYNAMIC_HOST, grpc.credentials.createInsecure()) const id = _.random(10, 10000).toString() - client.upper({ id, message: 'hello world' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.truthy(response.message) - t.is(response.message, 'HELLO WORLD') - t.truthy(response.value) - t.is(response.value, 'MW1') - t.is(response.mw, 'gmw1:mw1') - t.is(gmwcalled[id], ':gmw1') - t.end() + const response = await new Promise((resolve, reject) => { + client.upper({ id, message: 'hello world' }, (err, response) => { + if (err) { + return reject(err) + } + + resolve(response) + }) }) + t.truthy(response) + t.truthy(response.message) + t.is(response.message, 'HELLO WORLD') + t.truthy(response.value) + t.is(response.value, 'MW1') + t.is(response.mw, 'gmw1:mw1') + t.is(gmwcalled[id], ':gmw1') }) -test.cb('single async middleware', t => { - t.plan(8) +test('single async middleware', async t => { + t.plan(7) const pd = pl.loadSync(PROTO_PATH) const ts = grpc.loadPackageDefinition(pd).Transform const client = new ts.TransformService(DYNAMIC_HOST, grpc.credentials.createInsecure()) const id = _.random(10, 10000).toString() - client.lower({ id, message: 'HELLO WORLD' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.truthy(response.message) - t.is(response.message, 'hello world') - t.truthy(response.value) - t.is(response.value, 'MW2') - t.is(response.mw, 'gmw1:mw2') - t.is(gmwcalled[id], ':gmw1') - t.end() + const response = await new Promise((resolve, reject) => { + client.lower({ id, message: 'HELLO WORLD' }, (err, response) => { + if (err) { + return reject(err) + } + + resolve(response) + }) }) + t.truthy(response) + t.truthy(response.message) + t.is(response.message, 'hello world') + t.truthy(response.value) + t.is(response.value, 'MW2') + t.is(response.mw, 'gmw1:mw2') + t.is(gmwcalled[id], ':gmw1') }) -test.cb('sync + async middleware', t => { - t.plan(8) +test('sync + async middleware', async t => { + t.plan(7) const pd = pl.loadSync(PROTO_PATH) const ts = grpc.loadPackageDefinition(pd).Transform const client = new ts.TransformService(DYNAMIC_HOST, grpc.credentials.createInsecure()) const id = _.random(10, 10000).toString() - client.reverse({ id, message: 'Hello WORLD' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.truthy(response.message) - t.is(response.message, 'DLROW olleH') - t.truthy(response.value) - t.is(response.value, 'MW2') - t.is(response.mw, 'gmw1:mw1:mw2') - t.is(gmwcalled[id], ':gmw1') - t.end() + const response = await new Promise((resolve, reject) => { + client.reverse({ id, message: 'Hello WORLD' }, (err, response) => { + if (err) { + return reject(err) + } + + resolve(response) + }) }) + t.truthy(response) + t.truthy(response.message) + t.is(response.message, 'DLROW olleH') + t.truthy(response.value) + t.is(response.value, 'MW2') + t.is(response.mw, 'gmw1:mw1:mw2') + t.is(gmwcalled[id], ':gmw1') }) -test.cb('multiple sync + async middleware', t => { - t.plan(8) +test('multiple sync + async middleware', async t => { + t.plan(7) const pd = pl.loadSync(PROTO_PATH) const ts = grpc.loadPackageDefinition(pd).Transform const client = new ts.TransformService(DYNAMIC_HOST, grpc.credentials.createInsecure()) const id = _.random(10, 10000).toString() - client.rot13({ id, message: 'HELLO world' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.truthy(response.message) - t.is(response.message, 'URYYB jbeyq') - t.truthy(response.value) - t.is(response.value, 'mw3') - t.is(response.mw, 'gmw1:gmw2:mw1:mw2:mw3') - t.is(gmwcalled[id], ':gmw2:gmw1') - t.end() + const response = await new Promise((resolve, reject) => { + client.rot13({ id, message: 'HELLO world' }, (err, response) => { + if (err) { + return reject(err) + } + + resolve(response) + }) }) + t.truthy(response) + t.truthy(response.message) + t.is(response.message, 'URYYB jbeyq') + t.truthy(response.value) + t.is(response.value, 'mw3') + t.is(response.mw, 'gmw1:gmw2:mw1:mw2:mw3') + t.is(gmwcalled[id], ':gmw2:gmw1') }) -test.cb('mutate + payload middleware', t => { - t.plan(8) +test('mutate + payload middleware', async t => { + t.plan(7) const pd = pl.loadSync(PROTO_PATH) const ts = grpc.loadPackageDefinition(pd).Transform const client = new ts.TransformService(DYNAMIC_HOST, grpc.credentials.createInsecure()) const id = _.random(10, 10000).toString() - client.reverseRot13({ id, message: 'hello WORLD' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.truthy(response.message) - t.is(response.message, 'QYEBJ byyru') - t.truthy(response.value) - t.is(response.value, 'MW2') - t.is(response.mw, 'gmw1:gmw2:reverse:mw2:rot13') - t.is(gmwcalled[id], ':gmw2:gmw1') - t.end() + const response = await new Promise((resolve, reject) => { + client.reverseRot13({ id, message: 'hello WORLD' }, (err, response) => { + if (err) { + return reject(err) + } + + resolve(response) + }) }) + t.truthy(response) + t.truthy(response.message) + t.is(response.message, 'QYEBJ byyru') + t.truthy(response.value) + t.is(response.value, 'MW2') + t.is(response.mw, 'gmw1:gmw2:reverse:mw2:rot13') + t.is(gmwcalled[id], ':gmw2:gmw1') }) -test.cb('should compose middleware w/ async functions', t => { - t.plan(6) +test('should compose middleware w/ async functions', async t => { + t.plan(5) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/helloworld.proto') const calls = [] @@ -271,24 +296,29 @@ test.cb('should compose middleware w/ async functions', t => { }) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - const pd = pl.loadSync(PROTO_PATH) - const helloproto = grpc.loadPackageDefinition(pd).helloworld - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const pd = pl.loadSync(PROTO_PATH) + const helloproto = grpc.loadPackageDefinition(pd).helloworld + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => { client.sayHello({ name: 'Bob' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Bob') - t.deepEqual(calls, [1, 2, 3, 4, 5, 6]) - app.close().then(() => t.end()) + if (err) { + return reject(err) + } + + resolve(response) }) }) + t.truthy(response) + t.is(response.message, 'Hello Bob') + t.deepEqual(calls, [1, 2, 3, 4, 5, 6]) + await app.close() }) -test.cb('should not call middleware downstream of one that does not call next', t => { - t.plan(6) +test('should not call middleware downstream of one that does not call next', async t => { + t.plan(5) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/helloworld.proto') const calls = [] @@ -315,23 +345,28 @@ test.cb('should not call middleware downstream of one that does not call next', } app.use('sayHello', fn1, fn2, fn3) - app.start(APP_HOST).then(server => { - t.truthy(server) + const server = await app.start(APP_HOST) + t.truthy(server) - const pd = pl.loadSync(PROTO_PATH) - const helloproto = grpc.loadPackageDefinition(pd).helloworld - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const pd = pl.loadSync(PROTO_PATH) + const helloproto = grpc.loadPackageDefinition(pd).helloworld + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const response = await new Promise((resolve, reject) => { client.sayHello({ name: 'Bob' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.is(response.message, 'Hello Bob') - t.deepEqual(calls, [1, 2, 5, 6]) - app.close().then(() => t.end()) + if (err) { + return reject(err) + } + + resolve(response) }) }) + t.truthy(response) + t.is(response.message, 'Hello Bob') + t.deepEqual(calls, [1, 2, 5, 6]) + await app.close() }) -test.cb('multi: call multiple services with middleware', t => { +test('multi: call multiple services with middleware', async t => { const PROTO_PATH = path.resolve(__dirname, './protos/multi.proto') function hello (ctx) { @@ -362,32 +397,50 @@ test.cb('multi: call multiple services with middleware', t => { }) const host = tu.getHost() - app.start(host).then(server => { - t.truthy(server) + const server = await app.start(host) + t.truthy(server) - const pd = pl.loadSync(PROTO_PATH) - const proto = grpc.loadPackageDefinition(pd).helloworld - const client2 = new proto.Greeter2(host, grpc.credentials.createInsecure()) - const client4 = new proto.Greeter4(host, grpc.credentials.createInsecure()) + const pd = pl.loadSync(PROTO_PATH) + const proto = grpc.loadPackageDefinition(pd).helloworld + const client2 = new proto.Greeter2(host, grpc.credentials.createInsecure()) + const client4 = new proto.Greeter4(host, grpc.credentials.createInsecure()) + const response1 = await new Promise((resolve, reject) => { client2.sayHello({ name: 'Bob' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.is(response.message, ':mw1:Hello Bob') - - client4.sayHello({ name: 'Jane' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.is(response.message, ':mw1:Hello Jane') - - client4.sayGoodbye({ name: 'Bill' }, (err, response) => { - t.falsy(err) - t.truthy(response) - t.is(response.message, ':Goodbye Bill') - app.close().then(() => t.end()) - }) - }) + if (err) { + return reject(err) + } + + resolve(response) + }) + }) + t.truthy(response1) + t.is(response1.message, ':mw1:Hello Bob') + + const response2 = await new Promise((resolve, reject) => { + client4.sayHello({ name: 'Jane' }, (err, response) => { + if (err) { + return reject(err) + } + + resolve(response) }) }) + t.truthy(response2) + t.is(response2.message, ':mw1:Hello Jane') + + const response3 = await new Promise((resolve, reject) => { + client4.sayGoodbye({ name: 'Bill' }, (err, response) => { + if (err) { + return reject(err) + } + + resolve(response) + }) + }) + t.truthy(response3) + t.is(response3.message, ':Goodbye Bill') + + await app.close() }) test.after.always('cleanup', async t => { diff --git a/test/onerror.test.js b/test/onerror.test.js index 1c03b73..7d06d7b 100644 --- a/test/onerror.test.js +++ b/test/onerror.test.js @@ -57,8 +57,8 @@ test('should use err.toString() instad of err.stack', t => { t.deepEqual(output, ['\n', ' Error: mock stack null\n', '\n']) }) -test.cb('should log an error in the handler in req/res app', t => { - t.plan(7) +test('should log an error in the handler in req/res app', async t => { + t.plan(6) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/helloworld.proto') @@ -69,22 +69,33 @@ test.cb('should log an error in the handler in req/res app', t => { const app = new Mali(PROTO_PATH, 'Greeter') t.truthy(app) app.use({ sayHello }) - app.start(APP_HOST).then(server => { - t.truthy(server) - - const pd = pl.loadSync(PROTO_PATH) - const helloproto = grpc.loadPackageDefinition(pd).helloworld - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) - const inspect = stderr.inspect() - client.sayHello({ name: 'Bob' }, (err, response) => { - t.truthy(err) - t.true(err.message.indexOf('boom') >= 0) - t.falsy(response) - inspect.restore() - const output = Array.isArray(inspect.output) ? inspect.output.join() : inspect.output - t.true(output.indexOf('Error: boom') > 0) - t.true(output.indexOf('at sayHello') > 0) - app.close().then(() => t.end()) + const server = await app.start(APP_HOST) + t.truthy(server) + + const pd = pl.loadSync(PROTO_PATH) + const helloproto = grpc.loadPackageDefinition(pd).helloworld + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + const inspect = stderr.inspect() + let error + try { + await new Promise((resolve, reject) => { + client.sayHello({ name: 'Bob' }, (err, response) => { + if (err) { + return reject(err) + } + + resolve(response) + }) }) - }) + } catch (err) { + error = err + } + t.truthy(error) + t.true(error.message.indexOf('boom') >= 0) + inspect.restore() + const output = Array.isArray(inspect.output) ? inspect.output.join() : inspect.output + t.true(output.indexOf('Error: boom') > 0) + t.true(output.indexOf('at sayHello') > 0) + + await app.close() }) diff --git a/test/utils.test.js b/test/utils.test.js index ed75821..8e2e4b1 100644 --- a/test/utils.test.js +++ b/test/utils.test.js @@ -1,5 +1,6 @@ const test = require('ava') const path = require('path') +const { finished } = require('stream/promises') const grpc = require('@grpc/grpc-js') const CallType = require('@malijs/call-types') const hl = require('highland') @@ -25,7 +26,7 @@ function getArrayData () { return _.cloneDeep(ARRAY_DATA) } -test('getCallTypeFromDescriptor() should get call type from UNARY call', t => { +test('getCallTypeFromDescriptor() should get call type from UNARY call', async t => { const desc = { requestStream: false, responseStream: false, @@ -41,7 +42,7 @@ test('getCallTypeFromDescriptor() should get call type from UNARY call', t => { t.is(v, CallType.UNARY) }) -test('getCallTypeFromDescriptor() should get call type from REQUEST_STREAM call', t => { +test('getCallTypeFromDescriptor() should get call type from REQUEST_STREAM call', async t => { const desc = { requestStream: true, responseStream: false, @@ -57,7 +58,7 @@ test('getCallTypeFromDescriptor() should get call type from REQUEST_STREAM call' t.is(v, CallType.REQUEST_STREAM) }) -test('getCallTypeFromDescriptor() should get call type from RESPONSE_STREAM call', t => { +test('getCallTypeFromDescriptor() should get call type from RESPONSE_STREAM call', async t => { const desc = { requestStream: false, responseStream: true, @@ -73,7 +74,7 @@ test('getCallTypeFromDescriptor() should get call type from RESPONSE_STREAM call t.is(v, CallType.RESPONSE_STREAM) }) -test('getCallTypeFromDescriptor() should get call type from DUPLEX call', t => { +test('getCallTypeFromDescriptor() should get call type from DUPLEX call', async t => { const desc = { requestStream: true, responseStream: true, @@ -89,7 +90,7 @@ test('getCallTypeFromDescriptor() should get call type from DUPLEX call', t => { t.is(v, CallType.DUPLEX) }) -test.cb('getCallTypeFromCall() should get call type from UNARY call', t => { +test('getCallTypeFromCall() should get call type from UNARY call', async t => { t.plan(1) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/helloworld.proto') @@ -103,18 +104,25 @@ test.cb('getCallTypeFromCall() should get call type from UNARY call', t => { const app = new Mali(PROTO_PATH, 'Greeter') app.use({ sayHello }) - app.start(APP_HOST).then(server => { - const pd = pl.loadSync(PROTO_PATH) - const helloproto = grpc.loadPackageDefinition(pd).helloworld - const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) - client.sayHello({ name: 'Bob' }, (e_, response) => { - t.is(callType, CallType.UNARY) - app.close().then(() => t.end()) + await app.start(APP_HOST) + const pd = pl.loadSync(PROTO_PATH) + const helloproto = grpc.loadPackageDefinition(pd).helloworld + const client = new helloproto.Greeter(APP_HOST, grpc.credentials.createInsecure()) + await new Promise((resolve, reject) => { + client.sayHello({ name: 'Bob' }, (err, response) => { + if (err) { + return reject(err) + } + + resolve(response) }) }) + t.is(callType, CallType.UNARY) + + await app.close() }) -test.cb('getCallTypeFromCall() should get call type from RESPONSE_STREAM call', t => { +test('getCallTypeFromCall() should get call type from RESPONSE_STREAM call', async t => { t.plan(1) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/resstream.proto') @@ -132,32 +140,26 @@ test.cb('getCallTypeFromCall() should get call type from RESPONSE_STREAM call', const app = new Mali(PROTO_PATH, 'ArgService') app.use({ listStuff }) - app.start(APP_HOST).then(server => { - const pd = pl.loadSync(PROTO_PATH) - const proto = grpc.loadPackageDefinition(pd).argservice - const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.listStuff({ message: 'Hello' }) - - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + await app.start(APP_HOST) + const pd = pl.loadSync(PROTO_PATH) + const proto = grpc.loadPackageDefinition(pd).argservice + const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.listStuff({ message: 'Hello' }) + + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('end', () => { - _.delay(() => { - endTest() - }, 200) - }) + await finished(call) - function endTest () { - t.is(callType, CallType.RESPONSE_STREAM) - app.close().then(() => t.end()) - } - }) + t.is(callType, CallType.RESPONSE_STREAM) + + await app.close() }) -test.cb('getCallTypeFromCall() should get call type from REQUEST_STREAM call', t => { - t.plan(2) +test('getCallTypeFromCall() should get call type from REQUEST_STREAM call', async t => { + t.plan(1) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/reqstream.proto') @@ -188,14 +190,18 @@ test.cb('getCallTypeFromCall() should get call type from REQUEST_STREAM call', t const app = new Mali(PROTO_PATH, 'ArgService') app.use({ writeStuff }) - app.start(APP_HOST).then(server => { - const pd = pl.loadSync(PROTO_PATH) - const proto = grpc.loadPackageDefinition(pd).argservice - const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.writeStuff((err, res) => { - t.falsy(err) - t.is(callType, CallType.REQUEST_STREAM) - app.close().then(() => t.end()) + await app.start(APP_HOST) + const pd = pl.loadSync(PROTO_PATH) + const proto = grpc.loadPackageDefinition(pd).argservice + const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + let call + await new Promise((resolve, reject) => { + call = client.writeStuff((err, response) => { + if (err) { + return reject(err) + } + + resolve(response) }) async.eachSeries(getArrayData(), (d, asfn) => { @@ -205,9 +211,15 @@ test.cb('getCallTypeFromCall() should get call type from REQUEST_STREAM call', t call.end() }) }) + + await finished(call) + + t.is(callType, CallType.REQUEST_STREAM) + + await app.close() }) -test.cb('getCallTypeFromCall() should get call type from DUPLEX call', t => { +test('getCallTypeFromCall() should get call type from DUPLEX call', async t => { t.plan(1) const APP_HOST = tu.getHost() const PROTO_PATH = path.resolve(__dirname, './protos/duplex.proto') @@ -235,36 +247,32 @@ test.cb('getCallTypeFromCall() should get call type from DUPLEX call', t => { const app = new Mali(PROTO_PATH, 'ArgService') app.use({ processStuff }) - app.start(APP_HOST).then(() => { - const pd = pl.loadSync(PROTO_PATH) - const proto = grpc.loadPackageDefinition(pd).argservice - const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) - const call = client.processStuff() - - const resData = [] - call.on('data', d => { - resData.push(d.message) - }) + await app.start(APP_HOST) + const pd = pl.loadSync(PROTO_PATH) + const proto = grpc.loadPackageDefinition(pd).argservice + const client = new proto.ArgService(APP_HOST, grpc.credentials.createInsecure()) + const call = client.processStuff() + + const resData = [] + call.on('data', d => { + resData.push(d.message) + }) - call.on('end', () => { - endTest() - }) + async.eachSeries(getArrayData(), (d, asfn) => { + call.write(d) + _.delay(asfn, _.random(10, 50)) + }, () => { + call.end() + }) - async.eachSeries(getArrayData(), (d, asfn) => { - call.write(d) - _.delay(asfn, _.random(10, 50)) - }, () => { - call.end() - }) + await finished(call) - function endTest () { - t.is(callType, CallType.DUPLEX) - app.close().then(() => t.end()) - } - }) + t.is(callType, CallType.DUPLEX) + + await app.close() }) -test('getPackageNameFromPath() should get the package name', t => { +test('getPackageNameFromPath() should get the package name', async t => { const testData = [{ input: '/helloworld.Greeter/SayHello', expected: 'helloworld' @@ -280,7 +288,7 @@ test('getPackageNameFromPath() should get the package name', t => { }) }) -test('getShortServiceNameFromPath() should get the short service name name', t => { +test('getShortServiceNameFromPath() should get the short service name name', async t => { const testData = [{ input: '/helloworld.Greeter/SayHello', expected: 'Greeter'